本帖最后由 醉酒赋江南 于 2010-6-2 15:11 编辑
这个问题我在很多论坛上问了,都没有好的答复,说的都是很模糊,今天来到21IC 希望不要令我失望啊!知道的高手希望能伸出援助之手!
问题内容: 用430单片机设计一个 FIR滤波器的程序!
由于这个涉及到数字信号处理方面的内容,而小弟又还没学,但是这个是任务,必须完成,所以请各位大虾一定要帮帮我!
目前我知道要写这个程序的话,要先求h(n);然后代入公式。但是我存在一些疑问:
1:若要实现FIR滤波,例如,频率为80的数据,那么,采样频率至少为160.然后选取滤波器类型,通过相关软件取得该滤波器的系数,即差分方程的系数h(n).将采样数据带入差分方程.便可以实现滤波吗?
2:方程 H(z)=∑(h(n)*z)(-n次方) (n 从负无穷大到正无穷大,求和)里面的. z是什么啊?是第n次的采样值吗?
3:窗口函数怎么选取啊?是根据指标的需要,例如需要几阶的滤波器,阻带的衰减分贝来确定的吗?
4 :上面的方程用文字来描述应该是怎样的啊?
我的理解是(如果2成立的话):
本次采样经过滤波的有效值=第一次采样系数*第一采样未经滤波的值+第二次采样系数*第二次未经滤波的值+......+..+第n次采样系数*第n次采样未经滤波的值,不知道我这样理解对不对,希望各位大虾批评指导!
5:n值是怎么确定的啊?就是采样次数吗?还是其他的什么啊?
我根据一点资料自己写了一小段程序,是基于MSP430F149的,贴出来希望大家能帮忙看看...
注:IN_ADvaul[] 为存放采样值的数组, Coeff_vaul[] 为存放matlab生成的系数
long int Deal_ADvaul(void)//切比雪夫等波纹逼近低通算法
{
unsigned char i;
long int Out_ADvaul = 0;
for (i = (Num_Samp - 1);i > 0;i --)
{
IN_ADvaul = IN_ADvaul[i - 1]; /*采样值后移 */
}
IN_ADvaul[0] = ADC12MEM0; /*放入新的采样值*/
for (i = (Num_Samp - 4);i < Num_Samp;i ++)
{
Out_ADvaul += (Coeff_vaul[(Num_Samp - i)] * IN_ADvaul);
/*代入公式Y(n)=∑x(k)*h(n-k) (n=k=0~19) ,求Y(16)+Y(17)+Y(18)+Y(19)*/
}
Out_ADvaul = Out_ADvaul / 4;/*求[ Y(16)+Y(17)+Y(18)+Y(19) ]/4 用此值来代表滤波后的值*/
return Out_ADvaul;
} |