原创 使用MATLAB进行IIR滤波器设计

2008-9-1 10:06 3616 5 4 分类: 处理器与DSP

0.IIR滤波器的设计


上的IIR都是先说用模拟滤波器转到数字,但是现在有了MATLAB,这种方法只用了解,现在没有谁会有耐心去先查表,再搞s方程,再双线性变换,还要预畸变,这么一长串东西搞下来,不晕也要吐了。


1.MATLAB中fdatool,选择direct form II(MATLAB默认),一方面是因为direct? form I要更多的内存,另一方面是由于direct form I先和分子发生运算,而分子又很小,导致精度达不到要求。


下面的例子我们先用single section设计(Edit->Convert to single section)。设计一个最简单的二阶滤波器。即没有级联。


例:IIR低通滤波器butterworz型设计,


采样率:Fs=1kHz,低通Fpass:1Hz,截止频率Fstop:50Hz,通带内最大纹波Apass=1dB,阻带内最小纹波Astop=30dB。


可以从fdatool中看到,设计出的滤波器是一个二阶滤波器,section=1.


附:滤波器中dB的含义


设计一个巴特沃兹低通滤波器,在通带频率处要求衰减不大于1dB, 在阻带频率处衰减不小于15dB.


系统函数H=输出/输入, 这个1dB是否指: 20log (H) = -1, H = 0.89,即是说在通带内,输出相对于输入,最大的衰减也就是0.89倍.


15dB指, H="0".177, 即在阻带内,输出相对于输入,最小的衰减就是0.177倍


2.设计好后,导出系数到一个H文件(File->export to c hear file)


const real64_T NUM[3] = {
? 0.0007626824721372, 0.001525364944274,0.0007626824721372
};

const real64_T DEN[3] = {
?????????????????? 1,?? -1.920377688644,?? 0.9234284185322
};


3.将输入定为一个直流和一个100Hz的正弦波相加,把这个结果带入到滤波器程序中,可以看出滤波器的结果滤掉了100Hz的正弦波,只有直流留下来。


?


4.将浮点程序转为定点程序。


?由于IIR是由两个FIR构成,所以程序上我们看FIR。

4.1 FIR是由乘和累加构成。我们也知道,两个小于1的小数相乘还是一个小于1的小数,所以我们把输入x[n]缩成小数,实际上是不用缩放的,因为我们从AD过来的数据,都是10bit,12bit,我们都可以认为这就是小数,即输入x[n]是Q15格式。相乘我们就考虑完毕

4.2 现在我们考虑累加,因为两个小于1的数相加是可能大于1,那么我们就要对输入进行缩放,使得即使在输入x[n]最大的情况下,输出也不会溢出大于1.

FIR是x[n]和系统冲击响应h[n]的卷积。现在要求x[n]<1/h[n],.例如输入为10bit,我们认为是小数,范围就是正负0.015,现在计算出h[n]的累加和,如果这个累加和大于1,那么就要将输入缩小A,使得最后的累加和小于1.


首先要求将FIR的结果y[n]小于1,而y[n]




PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
5
关闭 站长推荐上一条 /3 下一条