因项目需要,我需要做个FIR滤波器程序,可是根据参考程序,自己设计的还是不行,今天实在没有办法了,把程序重要部分贴上来,大家帮我解答一下吧,谢谢了!!
#include "DSP28_Device.h"
#include"math.h"
//FIR相关参数初始化
#define Pi 3.1415926 //圆周率系数
#define SampleNum 200 //AD采样个数
#define WindowNum 25 //窗函数长度为25 τ(延迟时间)=(25-1)/2
#define DelayTime WindowNum/2 //即专业术语 τ(延迟时间)
//下面这个函数就是求FIR系数的函数,我定义是25阶的滤波(WindowNum),加汉明窗了
void firdes(int DelayTime1,int WindowNum1, double npass1)
{
int n;
for (n=0; n<WindowNum1; n++)
{
H[n]= sin((n-DelayTime1)*npass1*2*Pi)*(0.54-0.46*cos(2*n*Pi/(WindowNum1-1)))
/(Pi*(n-DelayTime1));
//此处即是冲击响应函数公式,(汉明窗), npass是数字截止频率=截止频率/采样频率
if (n==WindowNum1/2) H[n]=npass1*2;
}
}
//主函数(简化后)
void main(void)
{
int i,j,p;
double fs,fstop,npass;
fs=100000; //采样频率为100KHZ
fstop=4000; //截止频率为4KHZ
npass=fstop*1.0/fs; //根据课本npass是数字截止频率=截止频率*2*Pi / 采样频率
for(;;) //这个函数是FIR滤波函数,将接收到数据与FIR低通系数相乘
{
for (i=0; i<SampleNum; i++)
{
x1 = a1; //数组a1表示从AD接收到的数据
x2 = x1*3.0/4096.0;
//此处x2为了进行滤波乘积运算,将接收数据变小(因F2812参考电压为3V,采样位数为12位,故这样处理,此处是否需要修改?有资料为x2=x1/1024)
for (p=1; p<WindowNum; p++)
{
Wind[WindowNum-p] = Wind[WindowNum-p-1];
}
Wind[0] =x2;
r1 = 0;
rm1= 0;
for (j=0; j<WindowNum; j++) //做卷积相乘
{
r1 =Wind[j] * fHn[j];
rm1 = rm1 + r1;
}
a2[i]= rm1*4096.0/3;//此数组a2里面放的是对该信号进行FIR滤波的结果
}
}
}
输入波形是经过F2812的AD进入到DSP中,然后我想通过FIR滤波程序,将输入波形4KHZ以上的噪音去掉。我设计的采样频率fs是100KHZ(就是说我控制F2812的AD,每隔1/100KHZ采集一次数据,截止频率fstop是4KHZ)。根据ccs软件自带图形显示,我做的FIR滤波图形很不稳定,低频信号有时没问题,可是高频的不但没有滤掉,还在图形上显示为前移了(即本来单独10KHZ信号,可是滤掉后10KHZ图形上没有数据,8KHZ处却有图形,实际上我觉得就是没有滤掉)
自己有很多不太懂,现在对FIR有些混淆,看书也没看出出路,下面是自己重点疑点,请大家帮我解答一下吧,谢谢啦!!
1、 项目需要滤掉4KHZ以上的波,我打算做一个低通滤波,请问首先我将滤波阶数设为多少合适? (本打算设计WindowNum=101阶,此处WindowNum=25)
2、 程序中x2那样处理合适吗?我使用F2812自带的AD接收模块(参考电压为3V,12位)
3、 滤波函数我使用的是汉明窗函数,各位感觉应该使用哪种更好?
4、采样频率100KHZ,截止频率是4KHZ,这样合适吗?是不是采样频率不能太大?我这样求出来的系数见图形(系数没有负的,全是正的,请问这是怎么回事?)
//此处是FIR参考系数 ,这个系数表没有公式,所以我不知道怎么求的,带进我的程序中也不怎么正确,不过它的系数很明显有正负
Float fHn[25]={ 0.0,0.0,0.001,-0.002,-0.002,0.01,-0.009, -0.018,0.049,-0.02,-0.11,0.28,0.64,0.28,
-0.11,-0.02,0.049,-0.018,-0.009,0.01,
-0.002,-0.002,0.001,0.0,0.0
};
Liu bingsheng:
回复 deyisupport:
好的,谢谢
因项目需要,我需要做个FIR滤波器程序,可是根据参考程序,自己设计的还是不行,今天实在没有办法了,把程序重要部分贴上来,大家帮我解答一下吧,谢谢了!!
#include "DSP28_Device.h"
#include"math.h"
//FIR相关参数初始化
#define Pi 3.1415926 //圆周率系数
#define SampleNum 200 //AD采样个数
#define WindowNum 25 //窗函数长度为25 τ(延迟时间)=(25-1)/2
#define DelayTime WindowNum/2 //即专业术语 τ(延迟时间)
//下面这个函数就是求FIR系数的函数,我定义是25阶的滤波(WindowNum),加汉明窗了
void firdes(int DelayTime1,int WindowNum1, double npass1)
{
int n;
for (n=0; n<WindowNum1; n++)
{
H[n]= sin((n-DelayTime1)*npass1*2*Pi)*(0.54-0.46*cos(2*n*Pi/(WindowNum1-1)))
/(Pi*(n-DelayTime1));
//此处即是冲击响应函数公式,(汉明窗), npass是数字截止频率=截止频率/采样频率
if (n==WindowNum1/2) H[n]=npass1*2;
}
}
//主函数(简化后)
void main(void)
{
int i,j,p;
double fs,fstop,npass;
fs=100000; //采样频率为100KHZ
fstop=4000; //截止频率为4KHZ
npass=fstop*1.0/fs; //根据课本npass是数字截止频率=截止频率*2*Pi / 采样频率
for(;;) //这个函数是FIR滤波函数,将接收到数据与FIR低通系数相乘
{
for (i=0; i<SampleNum; i++)
{
x1 = a1; //数组a1表示从AD接收到的数据
x2 = x1*3.0/4096.0;
//此处x2为了进行滤波乘积运算,将接收数据变小(因F2812参考电压为3V,采样位数为12位,故这样处理,此处是否需要修改?有资料为x2=x1/1024)
for (p=1; p<WindowNum; p++)
{
Wind[WindowNum-p] = Wind[WindowNum-p-1];
}
Wind[0] =x2;
r1 = 0;
rm1= 0;
for (j=0; j<WindowNum; j++) //做卷积相乘
{
r1 =Wind[j] * fHn[j];
rm1 = rm1 + r1;
}
a2[i]= rm1*4096.0/3;//此数组a2里面放的是对该信号进行FIR滤波的结果
}
}
}
输入波形是经过F2812的AD进入到DSP中,然后我想通过FIR滤波程序,将输入波形4KHZ以上的噪音去掉。我设计的采样频率fs是100KHZ(就是说我控制F2812的AD,每隔1/100KHZ采集一次数据,截止频率fstop是4KHZ)。根据ccs软件自带图形显示,我做的FIR滤波图形很不稳定,低频信号有时没问题,可是高频的不但没有滤掉,还在图形上显示为前移了(即本来单独10KHZ信号,可是滤掉后10KHZ图形上没有数据,8KHZ处却有图形,实际上我觉得就是没有滤掉)
自己有很多不太懂,现在对FIR有些混淆,看书也没看出出路,下面是自己重点疑点,请大家帮我解答一下吧,谢谢啦!!
1、 项目需要滤掉4KHZ以上的波,我打算做一个低通滤波,请问首先我将滤波阶数设为多少合适? (本打算设计WindowNum=101阶,此处WindowNum=25)
2、 程序中x2那样处理合适吗?我使用F2812自带的AD接收模块(参考电压为3V,12位)
3、 滤波函数我使用的是汉明窗函数,各位感觉应该使用哪种更好?
4、采样频率100KHZ,截止频率是4KHZ,这样合适吗?是不是采样频率不能太大?我这样求出来的系数见图形(系数没有负的,全是正的,请问这是怎么回事?)
//此处是FIR参考系数 ,这个系数表没有公式,所以我不知道怎么求的,带进我的程序中也不怎么正确,不过它的系数很明显有正负
Float fHn[25]={ 0.0,0.0,0.001,-0.002,-0.002,0.01,-0.009, -0.018,0.049,-0.02,-0.11,0.28,0.64,0.28,
-0.11,-0.02,0.049,-0.018,-0.009,0.01,
-0.002,-0.002,0.001,0.0,0.0
};
Liu bingsheng:
回复 deyisupport:
好的,谢谢