无限脉冲响应数字滤波器(IIR)设计
所谓的数字滤波,指的是输入、输出均为数字信号,通过一定运算关系改变输入信号所含频率成分的相对比例或者滤除某些频率成分。数字滤波可分为无限脉冲响应(IIR)滤波和有限脉冲响应(FIR)滤波。本次试验利用VISUAL DSP++ 软环境SIMULATOR模拟实现无限脉冲响应(IIR)数字信号处理。
无限脉冲响应(IIR)的系统函数为:
H(Z)br0Nk1Mrzrk1akz 公式1
即如果输入为X(Z),输出为Y(N),则:Y(Z)= X(Z)×H(Z),即
Y(Z)X(Z)bzrr0Nk1Mr 公式2
1akzk本试验中利用的公式是对上面的公式2对了相应的形式变化,利用中间变
量W(Z)X(Z)11akzkk1N 公式3
那么
Y(Z)W(N)brzr 公式4
r0M因此,本次试验设计了一个4阶IIR滤波,其对应的公式3和公式4的时域公式如下:
W(n)=x(n)*scale+w(n-1)*a1+w(n-2)*a2+w(n-3)*a3+w(n-4)*a4;公式5
y(n)=w(n)+w(n-1)*b1+w(n-2)*b2+w(n-3)*b3+w(n-4)*b4;公式6
在本次设计中由于系数a4,a3,a2,a1,b4,b3,b2,b1都是用户自己初始化的时候给定的且均为常数,所以公式5和公式6也相应可以变为公式7和公式8:
W(n)=x(n)*scale+w(n-1)*a4+w(n-2)*a3+w(n-3)*a2+w(n-4)*a1 公式7 y(n)=w(n)+w(n-1)*b4+w(n-2)*b3+w(n-3)*b2+w(n-4)*b1 公式8
其中x(n)是输入的数字序列。
1
-
从公式5和公式6可知:只要我们设定设计需要的a4,a3,a2,a1,b4,b3,b2,b1,以及初始化w(n-1), w(n-2), w(n-3), w(n-4),就可以得到我们所需要的滤波器了。 通过本练习使学生加深对IIR的理解,加深对数字信号处理理论的理解。输入数据放在直接在数组inputs[N]中给出,滤波器系数a4,a3,a2,a1,b4,b3,b2,b1按顺序a2,a4,b2,b4,a1,a3,b1,b3存放在系数缓冲区coeffs[2*SECTIONS]中,w(n-1), w(n-2), w(n-3), w(n-4)初始化存放在delayline[SECTIONS](此处滤波器设计为因果滤波器,n<0时w(n)全为0),程序编译运行时对其进行IIR运算,计算结果存放于输出缓冲区output[N]中。
参考程序如下:
************************************************************************/
#define N_MAX 100
#define N 30 Y(Z)X(Z)bzrr0Nk1Mr的K= scale。
1akzk/************************************************************************/ .section data1; .align 4;
.var inputs[N] = , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ;
.var cycle_count; lign 4; .var expected_output[N] =
, , , , , , , , , , , , , , , , , , , , , , , , , , , , , ;
.align 4;
.var output[N];
.section data2; .align 4; 2
-
ar coeffs[2*SECTIONS]= , , 4., 4., , , 1., 6.; .var delayline[SECTIONS]=, , , ; ection program; .global _main;
/**************************************Power up code **********************/ powerup:
#ifdef __ADSPTS201__
/*in the case of TS201, at the beginning of the program the cache must be enabled. The procedure is contained in the
cache_enable macro that uses the refresh rate as input parameter -if CCLK=500MHz, refresh_rate=750 -if CCLK=400MHz, refresh_rate=600 -if CCLK=300MHz, refresh_rate=450 -if CCLK=250MHz, refresh_rate=375 */
cache_enable(750); lign_code 4; ini_cache:
xr3:0 = q[j0+=0];; .align_code 4;
if NLC0E, jump ini_cache; q[j0+=4] = xr3:0;;
j2 = j31 + output;; .align_code 4; iir_loop:
yr8 = [j1+=1];; Save y(n) into the output buffer .align_code 4;
if NLC0E, jump iir_loop; [j2+=1] = xr4;; :
___lib_prog_term: nop;nop;nop;nop;; 2. 实验步骤 1) 调入程序
启动运行VisualDSP++,建立新工程,将位于将\2\\IIR目录下的源文件和添加到工程中。
2)编译程序
分析、理解源程序,在此基础上编译运行程序。可通过点击按钮命令或选择菜单命令 \\Project\\Build Project来完成编译,sessions为ADSP-TS201 ADSP-TS201 Rev. Single Processor Simulator。 4) 观察结果
查看inputs[]和output[]的时域图和频谱图,并把output[]的时域图和频谱图与expected_output[] 的时域图和频谱图。也可以通过存储空间直接比较output[]和expected_output[]的值。(参数的设定过程如练习一中所示)
3
-
Data Sets inputs output
3.实验结果
Name inputs output Memory TigerSharcMemory TigerSharcMemory Address inputs output Count 30 30 Stride 1 1 Data float float
Input
output
图 输入数据和输出数据的时域图
Input
output
图 输入数据和输出数据的频谱图
4. 实验要求
在实验报告中记录IIR输入和输出数据及其波形,并利用数字信号处理课程所学知识分析结果。
4
因篇幅问题不能全部显示,请点此查看更多更全内容