初始化 产生需要虑波信号 画出原始信号频谱图 生成fir滤波器 进行滤波 画出滤波后信号频谱图 图3-1 MATLAB程序流程图
CCS汇编程序流程图如图3-2所示。
初始化
输入原始信号
定义滤波器系数 为原始信号和系数指定寄存器 做滤波算法 本次滤波结束待滤波系数减一 是否有待滤波数据 滤波结束滤波结束 图3-2 CCS汇编流程图
第11页 共21页
第4章 滤波器的仿真
4.1滤波器参数设定
设计FIR滤波器:通带边缘频率10KHz,阻带边缘频率22KHz,阻带衰减75dB,采样频率50KHz。
窗函数选定:阻带衰减75dB,选择blackman窗 截止频率:2pi*(10+(22-10)/2)/50 = 0.64pi
窗函数长度:blackman窗的过渡带宽为5.98,单位为2pi/N,而要设计的低通滤波器的过渡带宽为2pi*12/50=0.48pi,二者相等,得N=24.9,取25。
理想滤波器脉冲响应:
h1[n] = sin(nΩ1)/n/pi = sin(0.64pi*n)/n/pi 窗函数为:
w[n] = 0.42 - 0.5cos(2pi*n/24) + 0.8cos(4pi*n/24) 则滤波器脉冲响应为: h[n] = h1*w[n] |n|<=12 h[n] = 0 |n|>12
4.2 MATLAB滤波后频谱图
MATLAB信号处理工具箱提供了各种窗函数、滤波器设计函数和滤波器实现函数。本文的FIR低通滤波器设计及主要的滤波程序如下: fs=8000;
shuru(1:256)=sin((0:255)/fs*2*pi*500)+sin((0:255)/fs*2*pi*1000)+ sin((0:255)/fs*2*pi*2500); xishu=fir1(16,1500/8000*2); shuchu=conv(shuru,xishu); t=(0:255)/fs;
w=8000*(0:127)/256; shuru1=fft(shuru,256); shuchu1=fft(shuchu,256); subplot(2,2,1)
plot(t,shuru);grid on;title('输入信号时域图');
第12页 共21页
程序执行结果得到的输入输出信号的时域频域图如图4-1所示。
图4-1 Matlab编程实现滤波前后的时域频域图形
Matlab的Signal Processing Toolbox提供一个交互式界面的滤波器设计工具FDATool,用户可以通过对话框的方式给出滤波器设计要求,然后直接进行设计,对于设计完成的滤波器,在FDATool中可以对其分析,观察幅频曲线、相位、零极点图等,可将设计结果保存为mat文件、文本文件、C语言头文件等,在安装了DSP Blockset下,可将设计出的滤波器实现为Simulink模块,并添加其它模块加以仿真。
在matlab命令提示窗口键入:FDATool,进入主界面,单击功能选择按钮“
”,
进入滤波器设计及分析界面,在设计参数指定区域中,将Filter Type设置为Lowpass;选择Design Method中的FIR,并设置为Window;选择Hamming窗,并将阶数设置为Specify oder,键入16;在Frequency中设置相应参数,Fs键入8000,Fc键入1500。至此一个数字滤波器就设计完成了。接下来把滤波器实现为Simulink模块,点击功能选项按钮“
”,进入界面后可修改模块的名字,选择要保存的路径,然后点击Realize
Model,完成模块的实现,双击该模块可以看到此滤波器是由一些列的sum模块、gain模块以及delay模块所组成的。接着启动Simulink,在命令提示窗口界面点击“
”
即可,进入Simulink Library Browser,把Signal Processing Blockset展开,选择相应的模块,托到滤波模块窗口上进行搭建,为了查看输出变量,可以添加适当模块把变量输出到工作空间中用于实时观测模拟结果,搭建完整的系统模块如图4-2所示。
第13页 共21页
图4-2 完整的FIR滤波模块系统
模型搭建完成后即可设置各个模块的参数,方法为双击该模块,选择正确的参数填入;图中的To Workspace模块可以观测和分析输出到空间的变量数据y和y1,Time Scope模块则用于观测输入信号与滤波后输出信号的时域图形;Spectrum Scope用于观察输入信号和滤波后输出信号的频域图形。模拟采用固定步长,且步长与DSP的Sine模块中的Sample time保持一致,若要修改参数,可在菜单中点击Configuration Parameters进入界面,在Solver中填入相应的参数,在参数都设置完成之后就可以进入模拟,并观测输入信号和滤波后输出信号的时域图与频域图。
仿真结果如图4-3所示:
图4-3 Simulink模块下的输入和输出信号时域频域图
4.3 利用MATLAB获取H参数
根据滤波器的脉冲响应计算出h[n],然后将脉冲响应值移位为因果序列 这里计算h[n]的值,采用Matlab计算。 代码如下:
第14页 共21页
Window=blackman(25); h=fir1(24,0.64,Window); freqz(h,1) 系数如下: h1 =
Columns 1 through 8
0.0000 -0.0000 0.0008 -0.0019 -0.0016 0.0100 -0.0087 -0.0180
Columns 9 through 16
0.0492 -0.0204 -0.1095 0.2800 0.6400 0.2800 -0.1095 -0.0204
Columns 17 through 24
0.0492 -0.0180 -0.0087 0.0100 -0.0019 -0.0016 0.0008 -0.0000
Columns 25
0.0000
第15页 共21页