七、源程序
Fir低通滤波器: 主函数:
//***************************************************************************** // Filename: fir2_t.c // Version: 0.01
// Description: test for fir2 routine
//***************************************************************************** #include \#include \#include \#include \short i;
short eflag1= PASS; short eflag2= PASS; DATA r[NX];
DATA *dbptr = &db[0]; void main() {
int i;
short x[NX];
for(i=0;i { x[i]=(short)(((1+sin(PI*3000*i/12000))*sin(PI*4000*i/12000)*32768/3)) ; } // clear for (i=0; i 6 // compute fir2(x, h, r, dbptr, NX, NH);//双MAC运算,速度快 // fir(x, h, r, dbptr, NX, NH);//单MAC运算,速度相对双MAC要慢一些 while(1); } cmd文件: MEMORY { PAGE 0: MMR : origin = 0000000h, length = 00000c0h SPRAM : origin = 00000c0h, length = 0000040 DARAM0 : origin = 0000100h, length = 0003F00h DARAM1 : origin = 0004000h, length = 0004000h DARAM2 : origin = 0008000h, length = 0004000h DARAM3 : origin = 000c000h, length = 0004000h SARAM0 : origin = 0010000h, length = 0004000h SARAM1 : origin = 0014000h, length = 0004000h SARAM2 : origin = 0018000h, length = 0004000h SARAM3 : origin = 001c000h, length = 0004000h SARAM4 : origin = 0020000h, length = 0004000h SARAM5 : origin = 0024000h, length = 0004000h SARAM6 : origin = 0028000h, length = 0004000h SARAM7 : origin = 002c000h, length = 0004000h SARAM8 : origin = 0030000h, length = 0004000h SARAM9 : origin = 0034000h, length = 0004000h SARAM10 : origin = 0038000h, length = 0004000h SARAM11 : origin = 003c000h, length = 0004000h SARAM12 : origin = 0040000h, length = 0004000h SARAM13 : origin = 0044000h, length = 0004000h SARAM14 : origin = 0048000h, length = 0004000h SARAM15 : origin = 004c000h, length = 0004000h CE0 : origin = 0050000h, length = 03b0000h CE1 : origin = 0400000h, length = 0400000h CE2 : origin = 0800000h, length = 0400000h CE3 : origin = 0c00000h, length = 03f8000h PDROM : origin = 0ff8000h, length = 07f00h VECS : origin = 0ffff00h, length = 00100h /* reset vector */ } SECTIONS { vectors : {} > VECS PAGE 0 /* interrupt vector table */ .cinit : {} > SARAM0 PAGE 0 .text : {} > SARAM1 PAGE 0 7 isrs : {} > SARAM2 PAGE 0 .stack : {} > DARAM0 PAGE 0 .sysstack: {} > DARAM0 PAGE 0 .sysmem : {} > DARAM1 PAGE 0 .data : {} > DARAM1 PAGE 0 .bss : {} > DARAM1 PAGE 0 .const : {} > DARAM1 PAGE 0 .coeffs : {} > DARAM2 PAGE 0 .dbuffer : {} > DARAM3 PAGE 0 files : {} > DARAM2 PAGE 0 /* User-defined sections */ statvar : {} > DARAM2 PAGE 0 statarry : {} > DARAM2 PAGE 0 tempvar : {} > DARAM2 PAGE 0 temparry : {} > DARAM2 PAGE 0 } Include: Dsplib.h: /***********************************************************/ /* Version 2.20.02 */ /***********************************************************/ #ifndef _DSPLIB #define _DSPLIB #include \/* 32-bit fft */ void cfft32_SCALE(LDATA *x, ushort nx); void cfft32_NOSCALE(LDATA *x, ushort nx); void cifft32_SCALE (LDATA *x, ushort nx); void cifft32_NOSCALE (LDATA *x, ushort nx); /* 16-bit fft */ void cfft_SCALE(DATA *x, ushort nx); void cfft_NOSCALE(DATA *x, ushort nx); void cifft_SCALE (DATA *x, ushort nx); void cifft_NOSCALE (DATA *x, ushort nx); short* cfft_offplace_SCALE(DATA *x, DATA *y, ushort nx); short* cfft_offplace_NOSCALE(DATA *x, DATA *y, ushort nx); short* cifft_offplace_SCALE (DATA *x, DATA *y, ushort nx); short* cifft_offplace_NOSCALE (DATA *x, DATA *y, ushort nx); void unpack(DATA *x, ushort nx); void unpacki(DATA *x, ushort nx); /* void rfft(DATA *x, ushort nx, ushort scale); */ /* void rifft(DATA *x, ushort nx, ushort scale); */ /* 16-bit bit reversal */ void cbrev (DATA *x, DATA *y, ushort n); 8 /* correlations */ ushort acorr_raw(DATA *x, DATA *r, ushort nx, ushort nr); ushort acorr_bias(DATA *x, DATA *r, ushort nx, ushort nr); ushort acorr_unbias(DATA *x, DATA *r, ushort nx, ushort nr); ushort corr_raw (DATA *x, DATA *y, DATA *r, ushort nx, ushort ny); ushort corr_bias (DATA *x, DATA *y, DATA *r, ushort nx, ushort ny); ushort corr_unbias (DATA *x, DATA *y, DATA *r, ushort nx, ushort ny); /* filtering and convolution */ ushort convol(DATA *x, DATA *h, DATA *r, ushort nr, ushort nh); ushort convol1(DATA *x, DATA *h, DATA *r, ushort nr, ushort nh); ushort convol2(DATA *x, DATA *h, DATA *r, ushort nr, ushort nh); ushort fir(DATA *x, DATA *h, DATA *r, DATA *dbuffer, ushort nx, ushort nh); ushort fir2(DATA *x, DATA *h, DATA *r, DATA *dbuffer, ushort nx, ushort nh); ushort firs(DATA *x, DATA *h, DATA *r, DATA *dbuffer, ushort nx, ushort nh2); ushort cfir(DATA *x, DATA *h, DATA *r, DATA *dbuffer, ushort nx, ushort nh); ushort iircas4(DATA *x, DATA *h, DATA *r, DATA *dbuffer, ushort nbiq, ushort nx); ushort iircas5(DATA *x, DATA *h, DATA *r, DATA *dbuffer, ushort nbiq, ushort nx); ushort iircas51(DATA *x, DATA *h, DATA *r, DATA *dbuffer, ushort nbiq, ushort nx); ushort firlat (DATA *x, DATA *h, DATA *r, DATA *pbuffer, int nx, int nh); ushort iirlat (DATA *x, DATA *h, DATA *r, DATA *pbuffer, int nx, int nh); ushort hilb16(DATA *x, DATA *h, DATA*r, DATA *dbuffer, ushort nx, ushort nh); ushort firdec(DATA *x, DATA *h, DATA *r, DATA *dbuffer, ushort nh, ushort nx, ushort D); ushort firinterp(DATA *x, DATA *h, DATA *r, DATA *dbuffer, ushort nh, ushort nx, ushort I); ushort iir32(DATA *x,LDATA *h,DATA *r,LDATA *d, ushort nbiq, ushort nx); /* adaptive filtering */ ushort dlms(DATA *x, DATA *h, DATA *r, DATA *des, DATA *dbuffer, DATA step, ushort nh, ushort nx); ushort dlmsfast(DATA *x, DATA *h, DATA *r, DATA *des, DATA *dbuffer, DATA step, ushort nh, ushort nx); /* math */ ushort add(DATA *x, DATA *y, DATA *r, ushort nx, ushort scale); ushort sub(DATA *x, DATA *y, DATA *r, ushort nx, ushort scale); ushort neg (DATA *x, DATA *r, ushort nx); ushort neg32 (LDATA *x, LDATA *r, ushort nx); ushort power (DATA *x, LDATA *r, ushort nx); ushort sqrt_16(DATA *x, DATA *r, short nx); void ldiv16(LDATA *x, DATA *y,DATA *r, DATA *rexp, ushort nx); void recip16(DATA *x, DATA *r, DATA *rexp, ushort nx); ushort mul32(LDATA *x, LDATA *y, LDATA *r, ushort nx); ushort expn(DATA *x, DATA *r, ushort nx); ushort logn(DATA *x, LDATA *r, ushort nx); ushort log_2(DATA *x, LDATA *r, ushort nx); ushort log_10(DATA *x, LDATA *r, ushort nx); short bexp (DATA *x, ushort nx); 9 short maxidx (DATA *x, ushort ng, ushort ng_size); short maxidx34 (DATA *x, ushort nx); short maxval (DATA *x, ushort nx); short minidx (DATA *x, ushort ng, ushort ng_size); short minval (DATA *x, ushort nx); void maxvec (DATA *x, ushort nx, DATA *val, DATA *idx); void minvec (DATA *x, ushort nx, DATA *val, DATA *idx); /* matrix */ ushort mmul(DATA *x1,short row1,short col1,DATA *x2,short row2,short col2,DATA *r); ushort mtrans(DATA *x, short row, short col, DATA *r); /* trigonometric */ ushort atan16(DATA *x, DATA *r, ushort nx); ushort atan2_16(DATA *i, DATA *q, DATA *r, ushort nx); ushort sine(DATA *x, DATA *r, ushort nx); /* miscellaneous */ ushort fltoq15(float *x, DATA *r, ushort nx); ushort q15tofl(DATA *x, float *r, ushort nx); ushort rand16(DATA *r, ushort nr); void rand16init(void); /* macro definition */ #define SCALE 1 #define NOSCALE 0 #define cfft(x,nx, type) cfft_##type(x,nx) #define cifft(x,nx, type) cifft_##type(x,nx) #define cfft_offplace(x,nx,ny, type) cfft_offplace_##type(x,nx, ny) #define cifft_offplace(x,nx,ny, type) cifft_offplace_##type(x,nx, ny) #define acorr(n1, n2, n3, n4, type) acorr_##type(n1, n2, n3, n4) #define corr(n1, n2, n3, n4, n5, type) corr_##type(n1, n2, n3, n4, n5) #define rfft(x,nx,type)\\ (\\ cfft_##type(x,nx/2),\\ cbrev(x,x,nx/2),\\ unpack(x,nx)\\ ) #define rifft(x,nx,type)\\ (\\ unpacki(x, nx),\\ cifft_##type(x,nx/2),\\ cbrev(x,x,nx/2)\\ ) #endif 10