AD转换程序如何与FIR程序接口实现DSP的实时滤波?
现在的教科书上的DSP的数字滤波器例子程序都只给出了FIR算法实现的程序,输入波形数据要在电脑中做成数据文件注入,这不符合实际。本人编写了一个通过TLC320AD50C采样后输入FIR程序进行滤波的汇编语言程序,但可能是AD转换程序与FIR程序的接口部分程序没有写好,滤波器没有成功。我把程序写在这里,请大虾指教!<br />;*********************** On Line FIR Filter ************************** <br /><br />STACK_ADDR .set 0x0500<br />SIZE .set 10<br /> <br /> .bss Buffer_new, 16 ;(10 for circular buffer)<br /> .bss Buffer_old, 16 ;(10 for circular buffer)<br /> .bss Input, 1<br /> .bss Output, 1<br /> .include MMRegs.h<br /><br /> .global main<br /> <br /> .text<br /><br />main:<br />;******************InitC5402***************************************<br /> <br /> NOP<br /> LD #0, DP ; reset data–page pointer<br /> STM #0, CLKMD ; software setting of DSP clock<br /> STM #0, CLKMD ; (to divider mode before setting)<br />TstStatu1:<br /> LDM CLKMD, A<br /> AND #01b, A ;poll STATUS bit<br /> BC TstStatu1, ANEQ <br /> STM #0xF7FF, CLKMD ; set C5402 DSP clock to 10MHzv <br />******* Configure C5402 System Registers *******<br /> STM #0x7fff, SWWSR ; 2 wait cycle for IO space & 0 wait cycle ; for data&prog spaces<br /> STM #0x0000,BSCR ; set wait states for bank switch:<br /> ; 64k mem bank, extra 0 cycle between<br /> ; consecutive prog/data read<br /> stm #STACK_ADDR, SP<br /> <br />******* Set up Timer Control Registers *******<br /> STM #0x0010, TCR ; stop on–chip timer0<br /> STM #0x0010, TCR1 ; stop on–chip timer1<br />; Timer0 is used as main loop timer<br />; STM #2499, PRD ; timer0 rate=CPUCLK/1/(PRD+1)<br />; =40M/2500=16KHz<br />* STM #6249, PRD ; if CPU at 100M/6250=16KHz <br /><br /> <br />******* Initialize McBSP1 Registers *******<br /> STM SPCR1, McBSP1_SPSA ; register subaddr of SPCR1<br /> STM #0000h, McBSP1_SPSD ; McBSP1 recv = left–justify<br />; RINT generated by frame sync<br /> STM SPCR2, McBSP1_SPSA ; register subaddr for SPCR2<br />; XINT generated by frame sync<br /> STM #0000h, McBSP1_SPSD ; McBSP1 Tx = FREE(clock stops<br />; to run after SW breakpoint<br /> STM RCR1, McBSP1_SPSA ; register subaddr of RCR1<br /> STM #0040h, McBSP1_SPSD ; recv frame1 Dlength = 16 bits<br /> STM RCR2, McBSP1_SPSA ; register subaddr of RCR2 <br /> STM #0040h, McBSP1_SPSD ; recv Phase = 1<br />; ret frame2 Dlength = 16bits<br /> STM XCR1, McBSP1_SPSA ; register subaddr of XCR1<br /> STM #0040h, McBSP1_SPSD ; set the same as recv<br /> STM XCR2, McBSP1_SPSA ; register subaddr of XCR2<br /> STM #0040h, McBSP1_SPSD ; set the same as recv<br /> STM PCR, McBSP1_SPSA ; register subaddress of PCR<br /> STM #000eh, McBSP1_SPSD ; clk and frame from external (slave)<br />; FS at pulse–mode(00)<br />******* Finish DSP Initialization *******<br /> STM #0x0000, IMR ; disable peripheral interrupts<br /> STM #0xFFFF, IFR ; clear the intrupts’ flags<br /> NOP<br /> NOP <br /> <br /><br />******************************************<br />******************************************<br />_OpenMcBSP:<br /><br /> stm 1000h,ar0<br /> st 00,*ar0<br /> portw *ar0,8001h ;reset AD50 XF=0<br /> NOP<br /> NOP<br /> NOP<br /> NOP<br /> STM SPCR1, McBSP1_SPSA ; enable McBSP1 RX for ADC data in<br /> LDM McBSP1_SPSD,A<br /> OR #0x0001, A<br /> STLM A, McBSP1_SPSD<br /> STM SPCR2, McBSP1_SPSA ; enable McBSP1 TX for DTMF out<br /> LDM McBSP1_SPSD,A<br /> OR #0x0001, A<br /> STLM A, McBSP1_SPSD<br /> LD #0h, DP ; load data page 0<br /> RPT #23<br /> NOP <br /> STM 1000h, AR0<br /> ST 0xff, *AR0<br /> PORTW *AR0,8001h ;out reset aD50 XF=1<br /> NOP<br /> NOP<br /><br /> CALL IfTxRDY1<br /> STM #0x0001, McBSP1_DXR1 ;request secondary communication<br /> NOP<br /> CALL IfTxRDY1 <br /> STM #0100h, McBSP1_DXR1 ;write 00h to register 1<br /><br /> CALL IfTxRDY1<br /> STM #0000h, McBSP1_DXR1 <br /> <br /> NOP<br /> NOP<br /> RPT #20h<br /> NOP<br /> <br /> CALL IfTxRDY1<br /> STM #0x0001, McBSP1_DXR1 ;request secondary communication<br /> CALL IfTxRDY1 <br /> STM #0200h, McBSP1_DXR1 ;write 00h to register 2 <br /> <br /> CALL IfTxRDY1<br /> STM #0000h, McBSP1_DXR1 <br /> <br /> CALL IfTxRDY1<br /> STM #0x0001, McBSP1_DXR1 ;request secondary communication<br /> CALL IfTxRDY1 <br /> STM #0300h, McBSP1_DXR1 ;write 00h to register 3<br /><br /> CALL IfTxRDY1<br /> STM #0000h, McBSP1_DXR1 <br /><br /> CALL IfTxRDY1<br /> STM #0x0001, McBSP1_DXR1 ;request secondary communication<br /> CALL IfTxRDY1 <br /> STM #0490h, McBSP1_DXR1 ;write 00h to register 4<br /> ;bypass internal DPLL<br /> ;and select the Sample Frequency <br /><br /> CALL IfTxRDY1<br /> STM #0000h, McBSP1_DXR1 <br /> <br />; CALL IfTxRDY1<br />; STM #0x0001, McBSP1_DXR1<br />; CALL IfTxRDY1<br />; STM #0102h, McBSP1_DXR1 ;enable digital loopback <br /> <br />; CALL IfTxRDY1<br />; STM #0x0001, McBSP1_DXR1<br />; CALL IfTxRDY1<br />; STM #0208h, McBSP1_DXR1 ;enable analog loopback<br /><br /> NOP<br /> NOP<br /><br /><br />_READAD50:<br /> CALL IfRxRDY1<br /> NOP<br /> NOP<br /> ldm McBSP1_DRR1,b<br /> stl b, *(Input)<br /> <br /> nop<br /> nop <br /> <br />;------------------------------------------------------------------------------<br /><br /> ;clear buffer<br /> stm #Buffer_new, AR2<br /> rptz A, #SIZE-1<br /> stl A, *AR2+<br /><br /> stm #Buffer_old, AR3<br /> rptz A, #SIZE-1<br /> stl A, *AR3+<br /><br /> ;add last half coefficients for FFT display<br /> stm #FIR_Coeff, AR4<br /> stm #FIR_Coeff+2*SIZE-1, AR2<br /> rpt #SIZE-1<br /> mvdd *AR4+, *AR2-<br /><br /> stm #Buffer_new, AR2<br /> stm #Buffer_old, AR3<br /> stm #SIZE, BK<br /> stm #-1, AR0<br />fir_loop:<br /> ;read input<br /> ld *(Input), A<br /> stl A, *AR2<br /><br /> ;filtering<br /> add *AR2+0%, *AR3+0%, A<br /> rptz B, #SIZE-1<br /> firs *AR2+0%, *AR3+0%, FIR_Coeff<br /> sth B, *(Output) ;store output<br /> call IfTxRDY1 <br /> ldu *(Output), B<br /> and #0fffeh, B ;mask the LSB<br /> stlm B, McBSP1_DXR1<br /> NOP<br /> mar *+AR2(2)%<br /> mar *AR3+%<br /> mvdd *AR2, *AR3+0% ;update buffer<br /> b fir_loop<br /> nop<br /> nop<br /><br /><br />;------------------------------------------------------------------------------<br /> .data<br />FIR_Coeff:<br /> .word 53, 190, -364, -277, 152<br /> .word -124, 3789, -2052, -8950, 7631<br />;------------------------------------------------------------------------------<br /><br /><br />;******* Waiting for McBSP0 RX Finished *******<br />IfRxRDY1:<br /> NOP<br /> STM SPCR1, McBSP1_SPSA ; enable McBSP1 Rx<br /> LDM McBSP1_SPSD, A<br /> AND #0002h, A ; mask RRDY bit<br /> BC IfRxRDY1, AEQ ; keep checking<br /> NOP<br /> NOP<br /> RET ; return<br /> NOP<br /> NOP<br /><br />******* Waiting for McBSP0 TX Finished *******<br />IfTxRDY1:<br /> NOP<br /> STM SPCR2, McBSP1_SPSA ; enable McBSP1 Tx<br /> LDM McBSP1_SPSD, A<br /> AND #0002h, A ; mask TRDY bit<br /> BC IfTxRDY1, AEQ ; keep checking <br /> NOP<br /> NOP<br /> RET ; return<br /> NOP<br /> NOP<br /><br />;-------------------------------------------------------------------------------------------<br />dead_loop:<br /> nop<br /> nop<br /> nop<br /> nop<br /> b dead_loop<br /><br />;------------------------------------------------------------------------------<br /> .sect "vectors"<br />int_RESET:<br /> b main<br /> nop<br /> nop<br /><br /> .space 124*16<br /> <br /> .end<br />*********************************************************************<br />** End of File –– InitC5402.asm<br />*********************************************************************<br /><br /><br />AD转换程序如何与FIR程序接口实现DSP的实时滤波?
原来的DSP初始化程序及AD数据采样程序是这样的:<br /> .global _InitC5402 <br /> .global _OpenMcBSP<br /> .global _CloseMcBSP <br /> .global _READAD50 <br /> .global _WRITEAD50<br /> .include MMRegs.h<br />_InitC5402:<br /> NOP<br /> LD #0, DP ; reset data–page pointer<br /> STM #0, CLKMD ; software setting of DSP clock<br /> STM #0, CLKMD ; (to divider mode before setting)<br />TstStatu1:<br /> LDM CLKMD, A<br /> AND #01b, A ;poll STATUS bit<br /> BC TstStatu1, ANEQ <br /> STM #0xF7FF, CLKMD ; set C5402 DSP clock to 10MHzv <br />* STM #0x4007, CLKMD ; set C5402 DSP clock to 100MHz<br />; (based on DSK crystal at 20MHz)<br />******* Configure C5402 System Registers *******<br /> STM #0x7fff, SWWSR ; 2 wait cycle for IO space &<br />; 0 wait cycle for data&prog spaces<br /> STM #0x0000,BSCR ; set wait states for bank switch:<br />; 64k mem bank, extra 0 cycle between<br />; consecutive prog/data read<br />; STM #0x1800,ST0 ; ST0 at default setting<br />; STM #0x2900,ST1 ; ST1 at default setting(note:INTX=1)<br />; STM #0x00A0,PMST ; MC mode & OVLY=1, vectors at 0080h<br />******* Set up Timer Control Registers *******<br /> STM #0x0010, TCR ; stop on–chip timer0<br /> STM #0x0010, TCR1 ; stop on–chip timer1<br />; Timer0 is used as main loop timer<br />; STM #2499, PRD ; timer0 rate=CPUCLK/1/(PRD+1)<br />; =40M/2500=16KHz<br />* STM #6249, PRD ; if CPU at 100M/6250=16KHz <br /><br /><br /> <br />******* Initialize McBSP1 Registers *******<br /> STM SPCR1, McBSP1_SPSA ; register subaddr of SPCR1<br /> STM #0000h, McBSP1_SPSD ; McBSP1 recv = left–justify<br />; RINT generated by frame sync<br /> STM SPCR2, McBSP1_SPSA ; register subaddr for SPCR2<br />; XINT generated by frame sync<br /> STM #0000h, McBSP1_SPSD ; McBSP1 Tx = FREE(clock stops<br />; to run after SW breakpoint<br /> STM RCR1, McBSP1_SPSA ; register subaddr of RCR1<br /> STM #0040h, McBSP1_SPSD ; recv frame1 Dlength = 16 bits<br /> STM RCR2, McBSP1_SPSA ; register subaddr of RCR2 <br /> STM #0040h, McBSP1_SPSD ; recv Phase = 1<br />; ret frame2 Dlength = 16bits<br /> STM XCR1, McBSP1_SPSA ; register subaddr of XCR1<br /> STM #0040h, McBSP1_SPSD ; set the same as recv<br /> STM XCR2, McBSP1_SPSA ; register subaddr of XCR2<br /> STM #0040h, McBSP1_SPSD ; set the same as recv<br /> STM PCR, McBSP1_SPSA ; register subaddress of PCR<br /> STM #000eh, McBSP1_SPSD ; clk and frame from external (slave)<br />; FS at pulse–mode(00)<br />******* Finish DSP Initialization *******<br /> STM #0x0000, IMR ; disable peripheral interrupts<br /> STM #0xFFFF, IFR ; clear the intrupts’ flags<br /> RET ; return to main<br /> NOP<br /> NOP <br /> <br />******* Waiting for McBSP0 RX Finished *******<br />IfRxRDY1:<br /> NOP<br /> STM SPCR1, McBSP1_SPSA ; enable McBSP1 Rx<br /> LDM McBSP1_SPSD, A<br /> AND #0002h, A ; mask RRDY bit<br /> BC IfRxRDY1, AEQ ; keep checking<br /> NOP<br /> NOP<br /> RET ; return<br /> NOP<br /> NOP<br />******* Waiting for McBSP0 TX Finished *******<br />IfTxRDY1:<br /> NOP<br /> STM SPCR2, McBSP1_SPSA ; enable McBSP1 Tx<br /> LDM McBSP1_SPSD, A<br /> AND #0002h, A ; mask TRDY bit<br /> BC IfTxRDY1, AEQ ; keep checking <br /> NOP<br /> NOP<br /> RET ; return<br /> NOP<br /> NOP<br /><br />******************************************<br />******************************************<br />_OpenMcBSP:<br /><br /> stm 1000h,ar0<br /> st 00,*ar0<br /> portw *ar0,8001h ;reset AD50 XF=0<br /> NOP<br /> call wait<br /> NOP<br /> NOP<br /> NOP<br /> STM SPCR1, McBSP1_SPSA ; enable McBSP1 RX for ADC data in<br /> LDM McBSP1_SPSD,A<br /> OR #0x0001, A<br /> STLM A, McBSP1_SPSD<br /> STM SPCR2, McBSP1_SPSA ; enable McBSP1 TX for DTMF out<br /> LDM McBSP1_SPSD,A<br /> OR #0x0001, A<br /> STLM A, McBSP1_SPSD<br /> LD #0h, DP ; load data page 0<br /> rpt #23<br /> NOP <br /> stm 1000h,ar0<br /> st 0xff,*ar0<br /> portw *ar0,8001h ;out reset aD50 XF=1<br /> NOP<br /> NOP<br /> ; STM 0x4007,CLKMD <br />; CALL IfTxRDY1<br />; STM #0x0101, McBSP1_DXR1<br /> <br />; CALL IfTxRDY1<br />; STM #0x0208, McBSP1_DXR1<br /><br />;; rsbx xf<br />;; NOP<br />;;NOP <br /> CALL IfTxRDY1<br /> STM #0x0001, McBSP1_DXR1;request secondary communication<br /> NOP<br /> CALL IfTxRDY1 <br /> STM #0100h, McBSP1_DXR1;write 00h to register 1<br /><br /> CALL IfTxRDY1<br /> STM #0000h, McBSP1_DXR1 <br /> <br /> NOP<br /> NOP<br /> rpt #20h<br /> nop<br /> <br /> CALL IfTxRDY1<br /> STM #0x0001, McBSP1_DXR1;request secondary communication<br /> CALL IfTxRDY1 <br /> STM #0200h, McBSP1_DXR1;write 00h to register 2 <br /> <br /> CALL IfTxRDY1<br /> STM #0000h, McBSP1_DXR1 <br /> <br /> CALL IfTxRDY1<br /> STM #0x0001, McBSP1_DXR1;request secondary communication<br /> CALL IfTxRDY1 <br /> STM #0300h, McBSP1_DXR1;write 00h to register 3<br /><br /> CALL IfTxRDY1<br /> STM #0000h, McBSP1_DXR1 <br /><br /> CALL IfTxRDY1<br /> STM #0x0001, McBSP1_DXR1;request secondary communication<br /> CALL IfTxRDY1 <br /> STM #0490h, McBSP1_DXR1;write 00h to register 4<br /> ;bypass internal DPLL<br /> ;and select the Sample Frequency <br /><br /> CALL IfTxRDY1<br /> STM #0000h, McBSP1_DXR1 <br /> <br />; CALL IfTxRDY1<br />; STM #0x0001, McBSP1_DXR1<br />; CALL IfTxRDY1<br />; STM #0102h, McBSP1_DXR1 ;enable digital loopback <br /> <br />; CALL IfTxRDY1<br />; STM #0x0001, McBSP1_DXR1<br />; CALL IfTxRDY1<br />; STM #0208h, McBSP1_DXR1 ;enable analog loopback<br /><br /> RET<br /> NOP<br /> NOP<br /><br /> <br />*********************<br />_CloseMcBSP:<br /> STM SPCR1, McBSP1_SPSA ; disable McBSP0 RX<br /> LDM McBSP1_SPSD,A<br /> AND #0xFFFE, A<br /> STLM A, McBSP1_SPSD<br /> STM SPCR2, McBSP1_SPSA ; disable McBSP0 TX<br /> LDM McBSP1_SPSD,A<br /> AND #0xFFFE, A<br /> STLM A, McBSP1_SPSD<br /> RPT #5<br /> RET<br /> NOP<br /> NOP<br /><br /><br /><br />_READAD50:<br /> stm 0x00ff,ar3<br /> stm 0x3000,ar2<br /> <br />loopa:<br /> CALL IfRxRDY1<br /> ldm McBSP1_DRR1,b<br /> stl b,*ar2+<br /> banz loopa,*ar3- <br /> <br /> nop<br /> nop <br /> ret<br /> nop<br /> nop<br /> <br />_WRITEAD50:<br /> stm 0x00ff,ar3<br /> stm 0x3100,ar2<br />loopb:<br /> CALL IfTxRDY1 <br /> ldu *ar2+,B<br /> and #0fffeh,b ;mask the LSB<br /> stlm B, McBSP1_DXR1<br /> banz loopb,*ar3-<br /> nop<br /> nop<br /> ret<br /> nop<br /> nop <br /> <br />wait: <br /> stm 20h,ar3<br />loop1: <br /> stm 020h,ar4<br />loop2:<br /> banz loop2,*ar4-<br /> banz loop1,*ar3-<br /> ret <br /> nop<br /> nop<br /> nop<br /> nop<br /> <br /> .end<br />************************************************************************<br />** End of File –– InitC5402.asm<br />************************************************************************<br /><br /><br />而FIR程序是这样的:<br />STACK_ADDR .set 0x0500<br />SIZE .set 10<br /> .global input<br /> .bss Buffer_new, 16 ;(10 for circular buffer)<br /> .bss Buffer_old, 16 ;(10 for circular buffer)<br /> .bss Input, 1<br /> .bss Output, 1<br /><br /> .mmregs<br /> .global main<br /><br />;------------------------------------------------------------------------------<br /> .text<br />main:<br /> stm #STACK_ADDR, SP<br /> stm #0x00a8, PMST ;store IPTR<br /> stm #0x0000, SWWSR<br /><br /> ssbx FRCT<br /> ssbx OVM<br /> ssbx SXM<br /><br /> ;clear buffer<br /> stm #Buffer_new, AR2<br /> rptz A, #SIZE-1<br /> stl A, *AR2+<br /><br /> stm #Buffer_old, AR3<br /> rptz A, #SIZE-1<br /> stl A, *AR3+<br /><br /> ;add last half coefficients for FFT display<br /> stm #FIR_Coeff, AR4<br /> stm #FIR_Coeff+2*SIZE-1, AR2<br /> rpt #SIZE-1<br /> mvdd *AR4+, *AR2-<br /><br /> stm #Buffer_new, AR2<br /> stm #Buffer_old, AR3<br /> stm #SIZE, BK<br /> stm #-1, AR0<br />fir_loop:<br /> ;read input<br /> ld *(Input), A<br /> stl A, *AR2<br /><br /> ;filtering<br /> add *AR2+0%, *AR3+0%, A<br /> rptz B, #SIZE-1<br /> firs *AR2+0%, *AR3+0%, FIR_Coeff<br /> sth B, *(Output) ;store output<br /> mar *+AR2(2)%<br /> mar *AR3+%<br /> mvdd *AR2, *AR3+0% ;update buffer<br /> b fir_loop<br /><br />dead_loop:<br /> nop<br /> nop<br /> nop<br /> nop<br /> b dead_loop<br /><br />;------------------------------------------------------------------------------<br /> .sect "vectors"<br />int_RESET:<br /> b main<br /> nop<br /> nop<br /><br /> .space 124*16<br />;------------------------------------------------------------------------------<br /> .data<br />FIR_Coeff:<br /> .word 53, 190, -364, -277, 152<br /> .word -124, 3789, -2052, -8950, 7631<br />;------------------------------------------------------------------------------<br /><br />;end of lab6.s54 <br /><br />如何把这两个程序连接起来,实现实时的滤波功能?请大虾指教,最好帮助连接好,不胜感激!<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br />AD转换程序如何与FIR程序接口实现DSP的实时滤波?
怎么一个帮忙的都没有!好失望.........<br />老狼,老狼呢?晕!
1:开一个定时器,在定时器里面进行AD转化,同时设定FIR_START_LBL=0;这是为了保证每个采样点间的等间隔。采样数据存储到一个数组里面,每采集一次,counter加一,,counter=0,这个数组最好大于你的基波采样点的10倍,这样方便调程序。<br />2:FIR放到主程序,当数组的数据达到你的FIR参数长度时,FIR_START_LBL=1;开始启动一次FIR程序(只进行一次FIR,就是去掉你FIR程序外面的那个大循环),输出第一个滤波数据,AD采集一次,启动一次FIR.<br />3:当counter到数组尾的时候,停止程序,看输出波形。如果你能调到这一步,就基本上能看到实时滤波的效果了。<br />4:修改上述程序,达到真正的实时滤波。主要是AD采样数组循环存贮!这部分你动一下脑子!<br /><br />算法可以用汇编写,主程序就用C吧!看着麻烦!修改起来也不方便!<br />最近发现自己的语言表达能力真的很差!
unsigned char FIR_START_LBL=0;//FIR启动标志,当数组的数据达到你的FIR参数长度时,FIR_START_LBL=1<br />unsigned short int counter;//AD每采集一次,counter加一<br />unsigned ADInput;//假设每个波采集32点<br />unsigned char AD_NewData_Lbl;<br />Timer()<br />{<br /> ADInput=AD_Start()//采集一次,采样数据存储到一个数组里面,<br /> counter++<br /> AD_NewData_Lbl=1;//有新的数据进来<br /> if(counter>=320)<br /> {<br /> counter=0; //断点设在这里,前3步在这里调试完,第4步,需要修改这里。怎么修改?自己想!<br /> }<br />}<br /><br />main()<br />{<br />......<br /> FIR_START_LBL=0;<br /> while(1)<br /> {<br /> ......<br /> if(counter>FIRCOF)//FIRCOF FIR参数长度<br /> {<br /> FIR_START_LBL=1;<br /> }<br /><br /> if(1==FIR_START_LBL)<br /> {<br /> if(1==AD_NewData_Lbl)//采集一个点,启动一次FIR程序<br /> {<br /> AD_NewData_Lbl=0;<br /> FirOut= FIR_OnlyOne();<br /> FirOutCounter++;<br /> }<br /> }<br /> <br /> }<br /><br />}<br /><br />//基本上,就是这个逻辑了!<br /><br />通常实时滤波不是这么干的吧...
俺用的是像卷积那样的,每输入一个数据,然后移位,做乘加运算,输出一个结果。computer00
‘像卷积那样的,每输入一个数据,然后移位,做乘加运算,输出一个结果’<br />--------这部分在函数FIR_OnlyOne()中实现的。<br /><br />对于FIR,实际上,输入的缓冲区大小,对于N级的FIR滤波器,在数据存储器中开辟一个称之为滑窗的N个单元的缓冲区,滑窗中存放最新的N个输入样本。每次输入新的样本时,一新样本改写滑窗中的最老的数据,而滑窗中的其他数据不需要移动。这些在第4部进行修改,也可以不这样修改,加大输入输出缓冲区,是为了可以在Graph中,方便看到滤波的效果。而且,很多时候,需要保存原始数据和滤波后的数据。<br /><br />这里还加了一个输入缓冲区的控制FIR_START_LBL,必须先有N个数据,才能做一次FIR_OnlyOne(),输出一个数据,结果保存在FirOut[]中。也可以方便的用<br />Graph看到。AD转换程序如何与FIR程序接口实现DSP的实时滤波?
谢谢老狼,谢谢大家!<br />我再试试.滤波通常是采样一点滤波一点
滤波完事之后再扔到存储区里。 顶
页:
[1]