⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mu32c.c

📁 dsp AD公司ADSP21的代码,里面有FFT FIR IIR EQULIZER G722_21F 等可以在项目中直接应用的代码.此代码的来源是ADI公司自己出版的书籍,此书在美国购得
💻 C
字号:
#include <math.h>
#include <libap.h>
#include "song.h"        /* song[108][7] array */

/*
4 Voice Music Generator for 21K
2-30-93 PME
9-4-93  PME improved speed
1-12-94 PME changed structure to do everything inside note()
1-13-94 PME changed break point structure
5-25-94 LS  modified for AT&T DSP32c
10-31-94 CAC adapted to CAC boards
*/

/* DSP32C code assumes a 32 KHz sampling rate */

extern void int_disable();
extern void sendout();
extern void flush();

typedef struct {
    int key,t,cindex;
    float cw,a,b;
    float y1,y0;
} NOTE_STATE;

#define MAX_VOICES 4

float note();

NOTE_STATE notes[MAX_VOICES];
float trel[5] = {    0.1 ,    0.2,    0.7,  1.0, 0.0 };
float amps[5] = { 3000.0 , 5000.0, 4000.0, 10.0, 0.0 };
float rates[10];
int tbreaks[10];

void main()
{
    long int n;
    int t,told,vnum,v,key;
    float ampold;
    register long int i,endi;
    register float sig_out;

    int_disable();

    for(n = 0 ; n < SONG_LENGTH ; n++) {

/* number of samples per note */
#ifdef KHZ8
        endi = 1*song[n][0];            
#else
#ifdef KHZ16
        endi = 2*song[n][0];            
#else
        endi = 4*song[n][0];            
#endif
#endif

/* calculate the rates required to get the desired amps */
        i = 0;
        told = 0;
        ampold = 1.0;       /* always starts at unity */
        while(amps[i] > 1.0) {
            t = trel[i]*endi;
            rates[i] = exp(loge(amps[i]/ampold)/(t-told));
            ampold = amps[i];
            tbreaks[i] = told = t;
            i++;
        }

/* set the key numbers for all voices to be played (vnum is how many) */
        for(v = 0 ; v < MAX_VOICES ; v++) {
            key = song[n][v+1];
            if(!key) break;
            notes[v].key = key;
            notes[v].t = 0;
        }
        vnum = v;

        for(i = 0 ; i < endi ; i++) {

/* replace the following with in line code for speed:
            sig_out = 0.0;
            for(v = 0 ; v < vnum ; v++) {
                sig_out += note(&notes[v],tbreaks,rates);
            }
*/
            sig_out = note(&notes[0],tbreaks,rates);
            sig_out += note(&notes[1],tbreaks,rates);
            sig_out += note(&notes[2],tbreaks,rates);
            sig_out += note(&notes[3],tbreaks,rates);
            sendout(sig_out);
        }
    }
    flush();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -