本人对FIR滤波是小白一个,现求一个完整的STM32运算FIR滤波程序
信号来源:
1)AD数据16-24位,精度要求较高,需要采用浮点数运算;
2)AD速率10~500次/秒;
输出要求:
1)输出速率跟随输入同步变化,输入一个新数据,经过滤波输出一个同步数据(时间上因滤波肯定滞后,这个正常,无须理会);
2)输出滤波深度可设置(FIR滤波好像是叫滤波阶数);
代码要求:STM32工程,使用ST的外设库,但是FIR滤波代码,特别是输入输出部分要带详细中文注释,方便实际调用。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
自带AD,定时器触发DMA踩数,使用DSP库,arm_fir_f32.c
32位浮点开FPU,127阶带通,1ms大概能算两百来点
#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)
{
}
}
一周热门 更多>