求一个完整的STM32运算FIR滤波程序

2019-12-20 21:41发布

本人对FIR滤波是小白一个,现求一个完整的STM32运算FIR滤波程序



信号来源:
1)AD数据16-24位,精度要求较高,需要采用浮点数运算;
2)AD速率10~500次/秒;

输出要求:
1)输出速率跟随输入同步变化,输入一个新数据,经过滤波输出一个同步数据(时间上因滤波肯定滞后,这个正常,无须理会);
2)输出滤波深度可设置(FIR滤波好像是叫滤波阶数);


代码要求:STM32工程,使用ST的外设库,但是FIR滤波代码,特别是输入输出部分要带详细中文注释,方便实际调用。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
95条回答
mybao
2019-12-26 17:16
#include "dsp.h"
#define FIR_N 128
#define FIR_M 32


Complex signal[signal_N]; //信号
float signal1[signal_N];
float signal1_out[signal_N];
Complex signal_out[signal_N];
int16_t signal_real[signal_N];
int16_t signal_img[signal_N];
int32_t signal2[signal_N];
int32_t signal2_out[signal_N];
int32_t Y[signal_N];

int16_t FIR_in[FIR_N+FIR_M-1];
int32_t FIR_out[FIR_N];



COEFS fir_coefs;



void Signal_Init()
{
        u16 i,j;
        u16 fs=8192;
        u16 f1=100;
        u16 f2=200;
        float V1=60.0;
        float V2=20.0;
        for(i=0;i<signal_N;i++)
        {
                signal_real[i]=V1*sin((float)f1/fs*i*2.0*PI)+V2*sin((float)f2/fs*i*2.0*PI);
                signal2[i] = (((int16_t)(signal_real[i])) | ((int32_t)(signal_img[i]<<16)));
                //signal[i].img =0;
        }
        for(i=0;i<FIR_N+FIR_M-1;i++)
        {
                 FIR_in[i]=V1*sin((float)f1/fs*i*2.0*PI);//+V2*sin((float)f2/fs*i*2.0*PI);
        }
}

void Display_Dsp()
{
        u16 i,j;
        for(i=1;i<FIR_N+FIR_M-1;i++)
        {
                TFT_DrawLine(i-1,300-FIR_in[i-1],i,300-FIR_in[i],BLACK);
        }
        for(i=0;i<FIR_N;i++)
        {
                TFT_DrawLine(i-1,150-FIR_out[i-1],i,150-FIR_out[i],BLUE);
        }
}

void MY_FIR()
{
        u16 i;
        u16 h[FIR_M]={
                                        90,358,794,1138,2100,2923,3821,4762,5712,6635,
                                        7500,8274,8930,9444,9797,9977,9977,9797,9444,8930,
                                        8274,7500,6635,5712,4762,3821,2923,2100,1381,794,
                                        358,90,                         //汉宁窗
                                /*
      540,    231,    276,    323,    371,    419,    467,    513,    558,
      598,    635,    667,    694,    714,    728,    735,    735,    728,
      714,    694,    667,    635,    598,    558,    513,    467,    419,
      371,    323,    276,    231,    540 */
                                          } ;
                                        for(i=0;i<FIR_M;i++)
                                        {
                                                h[i]/=2;
                                        }
        fir_coefs.nh = FIR_M;
        fir_coefs.h = h;
           fir_16by16_stm32(FIR_out,FIR_in,&fir_coefs,FIR_N);
        for(i=0;i<FIR_N;i++)
        {
                FIR_out[i]/=160000;
        }

}
int main(void)
{

        Signal_Init() ;
        //cr4_fft_256_stm32(signal2_out, signal2, signal_N);
        MY_FIR();
        Display_Dsp();
        while(1)
        {
       
        }
}

一周热门 更多>