|
目前工程中要用到FIR 滤波,先验证一下该函数的正确性。我自己生成一个正弦波,调用STM32 DSP函数库中的FIR 滤波函数fir_16by16_stm32,进行8阶滤波 发现该函数的输出数组与输入数组 值相差很大,有100多倍,与matlab仿真结果也相差很大。不知什么原因,有没有人用过或验证过这个滤波函数啊?
现粘贴部分代码,麻烦大家帮我看看啊!
#define M 9 /*number of coefficients*/
#define N NPT+1-M /*number of output samples*/
int out[NPT+1-M];/*filter output vector*/
short fY[NPT];/*filter input vector*/
float freq;
float fFs=100;//生成的正弦波100个点 一个周期
u16 hx[9]={16,47,124,205,240,205,124,47,16};/*filter coefficients vector*/;
//FIR滤波系数由matlab 生成,由于系数要求是unsigned shor型的,所以系数都乘以了1024
for (freq=0,i=0; freq <1024; freq++,i++)
{
fY=2048+(short)1024*sin(PI2*((float)freq/(float)fFs));//生成正弦波
}
fir_coefs.nh = M; /* Number of Coefficients for FIR*/
fir_coefs.h = hx; /*Pointer on FIR coefficient vector*/
fir_16by16_stm32(out,fY,&fir_coefs,NPT+1-M);/*performs the FIR filtering*/
//由于系数乘以了1024,所以我们将结果 除以1024,这点已在matlab上验证过了
for(i=0;i<NPT+1-M;i++)
{
out=out/1024;
}
通过设断点 ,查看watch对比fY和out 数组中的内容发现值相差很大,有100多倍。而用matlab 则不会现张贴 matlab m文件的内容
clear
%编写
fs=5000
N=1024
n=0:N-1;
t=n/fs;
t=0:1:1024;
x=2048+1024*sin(2*pi*t/100);
figure;
plot(x);
%得出滤波器的阶数n=8,beta=3.4
fc1=200
w1=2*fc1/fs; %将模拟滤波器的技术指标转换为数字滤波器的技术指标
%b=fir1(8,w1); %使用标准频率响应的加窗设计函数fir1
%b=b*1024 %滤波系数的生产,现已注释掉了
b=[16,47,124,205,240,205,124,47,16];
x = filter(b,1,x);%对信号s进行滤波
x=x/1024
figure;
plot(x);
title('f1(100Hz)\f2(300Hz)的正弦信号,初相0')
xlabel('序列(n)')
grid on |
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|