滤波器实验
实验报告
一.实验目的
1. 进一步熟悉 MATLAB 工具箱的使用;
2. 巩固数字信号的处理方法;
3. 掌握数字滤波器的设计;
二.实验内容
选择一个信号,要求:该信号至少包括 2 个或 2 个以上频段的信号;
(1) 分析 2 个不同频段信号的频谱特征;
(2) 设计滤波器,提取某个频段的信号,滤除另一个频段的信号。要求给出滤波器
的设计指标,以实现滤波器的实际技术指标,分析设计指标和实际指标之间的
差别;
(3) 给出滤波器提取某个频段的效果;
三.实验原理
MATLAB 有强大的数字信号处理能力,对信号进行采样,滤波后得某一频段的信号,
四.实验步骤
1. 新建脚本,合成一个信号 x,该信号由 50Hz,150Hz 和 600Hz 的正弦波合成;采样
频率为 2000Hz;
fs=2000;
t=(1:1000)/fs;
x=10*cos(2*pi*50*t)+cos(2*pi*150*t)+5*cos(2*pi*600*t);
2. 对 x 做快速傅里叶变换,得频谱图;
3. 设计低通,带通,高通滤波器,分别得到 50Hz,150Hz,600Hz 的信号;MATLAB
中的滤波器由函数 filter()来实现;
4. 打开 MATLAB,输入<
图 1 编辑界面
5. 保存界面,对控件进行编辑;
代码如下:
合成信号,并给出频谱图,同时发出声音;
handle to pushbutton1 (see GCBO)
reserved - to be defined in a future version of MATLAB
structure with handles and user data (see GUIDATA)
(1)function pushbutton1_Callback(hObject, eventdata, handles)
% hObject
% eventdata
% handles
fs=2000;
t=(1:1000)/fs;
x=10*cos(2*pi*30*t)+6*cos(2*pi*150*t)+5*cos(2*pi*600*t);
sound(x,fs);
L=length(x);
N=2^(nextpow2(L));
Hw=fft(x,N);
axes(handles.axes1);
plot((0:N-1)*fs/L,abs(Hw));% 查看信号频谱
grid on;
title('滤波前信号频谱图');
xlabel('频率/Hz');
ylabel('振幅|H(e^jw)|');
低通滤波,并给出频谱图,同时发出声音;
handle to pushbutton2 (see GCBO)
reserved - to be defined in a future version of MATLAB
structure with handles and user data (see GUIDATA)
(2)function pushbutton2_Callback(hObject, eventdata, handles)
% hObject
% eventdata
% handles
%% x_1=cos(2*pi*30*t)
fs=2000;
t=(1:1000)/fs;
x=10*cos(2*pi*50*t)+6*cos(2*pi*150*t)+5*cos(2*pi*600*t);
Ap=1;
As=60;% 定义通带及阻带衰减
dev=[(10^(Ap/20)-1)/(10^(Ap/20)+1),10^(-As/20)];% 计算偏移量
mags=[1,0];% 低通
fcuts=[60,100];% 边界频率
[N,Wn,beta,ftype]=kaiserord(fcuts,mags,dev,fs);% 估算 FIR 滤波器阶数
hh1=fir1(N,Wn,ftype,kaiser(N+1,beta));% FIR 滤波器设计
x_1=filter(hh1,1,x);% 滤波
x_1(1:ceil(N/2))=[];% 群延时 N/2,删除无用信号部分
L=length(x_1);
N=2^(nextpow2(L));
Hw_1=fft(x_1,N);
sound(x_1,fs);
axes(handles.axes1);
a=((0:N-1)*fs/L-0.5*N*fs/L)/10;
plot((0:N-1)*fs/L,abs(Hw_1));% 查看信号频谱
grid on;
title('滤波后信号 x_1 频谱图');
xlabel('频率/Hz');
ylabel('振幅|H(e^jw)|');
带通,并给出频谱图,同时发出声音;
handle to pushbutton3 (see GCBO)
reserved - to be defined in a future version of MATLAB
structure with handles and user data (see GUIDATA)
(3)function pushbutton3_Callback(hObject, eventdata, handles)
% hObject
% eventdata
% handles
%% x_2=cos(2*pi*150*t)
fs=2000;
t=(1:1000)/fs;
x=10*cos(2*pi*50*t)+6*cos(2*pi*150*t)+5*cos(2*pi*600*t);
Ap=1;
As=60;% 定义通带及阻带衰减
dev=[10^(-As/20),(10^(Ap/20)-1)/(10^(Ap/20)+1),10^(-As/20)];% 计算偏移量
mags=[0,1,0];% 带通
fcuts=[80,120,180,220];% 边界频率
[N,Wn,beta,ftype]=kaiserord(fcuts,mags,dev,fs);% 估算 FIR 滤波器阶数
hh2=fir1(N,Wn,ftype,kaiser(N+1,beta));% FIR 滤波器设计
x_2=filter(hh2,1,x);% 滤波
x_2(1:ceil(N/2))=[];% 群延时 N/2,删除无用信号部分
L=length(x_2);N=2^(nextpow2(L));
Hw_2=fft(x_2,N);
sound(x_2,fs);
axes(handles.axes1);
plot((0:N-1)*fs/L,abs(Hw_2));% 查看信号频谱
grid on;
title('滤波后信号 x_2 频谱图');
xlabel('频率/Hz');
ylabel('振幅|H(e^jw)|');
高通,并给出频谱图,同时发出声音;
handle to pushbutton4 (see GCBO)
reserved - to be defined in a future version of MATLAB
structure with handles and user data (see GUIDATA)
(4)function pushbutton4_Callback(hObject, eventdata, handles)
% hObject
% eventdata
% handles
%% x_3=5*cos(2*pi*600*t)
fs=2000;
t=(1:1000)/fs;
x=10*cos(2*pi*50*t)+6*cos(2*pi*150*t)+5*cos(2*pi*600*t);
Ap=1;
As=60;% 定义通带及阻带衰减
dev=[10^(-As/20),(10^(Ap/20)-1)/(10^(Ap/20)+1)];% 计算偏移量
mags=[0,1];% 高通
fcuts=[500,550];% 边界频率
[N,Wn,beta,ftype]=kaiserord(fcuts,mags,dev,fs);% 估算 FIR 滤波器阶数
hh2=fir1(N,Wn,ftype,kaiser(N+1,beta));% FIR 滤波器设计
x_3=filter(hh2,1,x);% 滤波
x_3(1:ceil(N/2))=[];% 群延时 N/2,删除无用信号部分
L=length(x_3);N=2^(nextpow2(L));
Hw_3=fft(x_3,N);
sound(x_3,fs);
axes(handles.axes1);
plot((0:N-1)*fs/L,abs(Hw_3));% 查看信号频谱
grid on;
title('滤波后信号 x_3 频谱图');
xlabel('频率/Hz');
ylabel('振幅|H(e^jw)|');
6. 保存运行。
五.实验结果
1. 运行后的界面如图 2 所示;
图 2 GUI 界面
分别点击四个按钮,得频谱图如图 3;
单击“原始”按键,听到的声音是混合音,单击“低通”“带通”“高通”,听到的声
音会依次变的尖细。由谱图可知,由 MATLAB 的 ffx()函数绘制的幅度谱是关于奈奎
斯特频率对称的,本实验中采样频率为 2000Hz,奈奎斯特频率为 1000Hz,所以得到
的频谱都是关于 1000Hz 对称的两条谱线。
原始信号谱图
50Hz 谱图
150Hz 谱图
600HZ 谱图
图 3 滤波结果
2.滤波器指标比较