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]
文章评论(0条评论)
登录后参与讨论