1 MATLAB简介
1.1MATLAB的概况
1.2MATLAB的语言特点
1.3MATLAB处理音频信号的流程
2 FIR滤波器的分析与设计
2.1窗函数法设计FIR滤波器
表 2-1
2.2FIR低通滤波器
2.2.1设计过程
2.2.2程序流程
图1 Hamming窗低通滤波器程序设计流程图
2.2.3输出仿真结果
Hamming窗低通滤波器的幅频特性如图2所示:
图2 Hamming窗低通滤波器的幅频特性
滤波前和滤波后的时域波形如图3所示:
图3滤波前和滤波后的时域波形
滤波前后频域波形图如图4所示:
图4 滤波前后频域波形图
2.3FIR高通滤波器
2.3.1详细设计过程
2.3.2程序流程
图5 Hamming窗高通滤波器程序设计流程图
2.3.3输出仿真结果
图6 Hamming窗高通滤波器的幅频特性
滤波前和滤波后的时域波形如图7所示:
图7滤波前和滤波后的时域波形
滤波前后频域波形图如图8所示:
图8 滤波前后频域波形图
2.4FIR带通滤波器
2.4.1详细设计过程
2.4.2程序流程
图9 Hamming窗带通滤波器程序设计流程图
2.4.3输出仿真结果
图10 Hamming窗带通滤波器的幅频特性
滤波前和滤波后的时域波形如图11所示:
图11滤波前和滤波后的时域波形
滤波前后频域波形图如图12所示:
图12 滤波前后频域波形图
3 IIR滤波器的分析与设计
3.1双线性变换法设计IIR滤波器
3.2IIR低通滤波器
3.2.1详细设计过程
3.2.2程序流程
图13 巴特沃兹低通滤波器程序设计流程图
3.2.3输出仿真结果
图14 巴特沃兹低通滤波器的幅频特性
滤波前和滤波后的时域波形如图15所示:
图15滤波前和滤波后的时域波形
滤波前后频域波形图如图16所示:
图16 滤波前后频域波形图
3.3IIR高通滤波器
3.3.1详细设计过程
3.3.2程序流程
图17巴特沃兹高通滤波器程序设计流程图
3.3.3输出仿真结果
图18 巴特沃兹高通滤波器的幅频特性
滤波前和滤波后的时域波形如图19所示:
图19滤波前和滤波后的时域波形
滤波前后频域波形图如图20所示:
图20 滤波前后频域波形图
3.4IIR带通滤波器
3.4.1详细设计过程
3.4.2程序流程
图21巴特沃兹带通滤波器程序设计流程图
3.4.3输出仿真结果
巴特沃兹带通滤波器的幅频特性如图22所示:
图22 巴特沃兹带通滤波器的幅频特性
滤波前和滤波后的时域波形如图23所示:
图23滤波前和滤波后的时域波形
滤波前后频域波形图如图24所示:
图24 滤波前后频域波形图
4 图形用户界面GUI
4.1GUI简介
图形用户界面(Graphical User Interfaces,GUI)是一种提供人机交互的工具和
(1)进行界面设计;
(2)设置控件属性;
(3)进行M语言编译;
4.2基于滤波器应用的GUI设计
本次课设共设计了六个滤波器,所以GUI界面共设计了六个pushButton。每一个都分别回调相应的滤
图26 运行状态下的GUI图
5总结
时间过得好快,转眼间两个星期的课程设计马上就要结束了,在这短短的几天里,我学到了很多东西。
这次课程设计的主要目的是基于MATLAB的语音信号分析及滤波。通过设计IIR和FIR的各种滤波器,并
通过这次课程设计,我认识到了MATLAB功能非常强大,使得我们在使用的时候直接调用函数并赋予实际参数
这次课设也使我对MATLAB这个软件有了新的认识。虽然平时做实验也用这个软件,但涉及到的内容只不过是
时间逐渐的减少,但自己学到的东西却越来越多,这是这次课设的主要目的。通过亲身的实践,我认识到书中的知
最后,由衷地感谢我们的指导老师董翠英和郭耀华老师,老师的认真指导使我们少走许多弯路,让我们学习了许多
function varargout = jmk(varargin)
% JMK M-file for jmk.fig
% JMK, by itself, creates a new JMK or raises
% singleton*.
%
% H = JMK returns the handle to a new JMK or
% the existing singleton*.
%
% JMK('CALLBACK',hObject,eventData,handles,..
% function named CALLBACK in JMK.M with the g
%
% JMK('Property','Value',...) creates a new J
% existing singleton*. Starting from the lef
% applied to the GUI before jmk_OpeningFuncti
% unrecognized property name or invalid value
% stop. All inputs are passed to jmk_Opening
%
% *See GUI Options on GUIDE's Tools menu. Ch
% instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES
% Edit the above text to modify the response to he
% Last Modified by GUIDE v2.5 07-Jul-2008 09:13:25
% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ..
'gui_Singleton', gui_Singleton
'gui_OpeningFcn', @jmk_OpeningF
'gui_OutputFcn', @jmk_OutputFc
'gui_LayoutFcn', [] , ...
'gui_Callback', []);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1})
end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State
else
gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT
% --- Executes just before jmk is made visible.
function jmk_OpeningFcn(hObject, eventdata, handle
% This function has no output args, see OutputFcn.
% hObject handle to figure
% eventdata reserved - to be defined in a future
% handles structure with handles and user data
% varargin command line arguments to jmk (see VA
% Choose default command line output for jmk
handles.output = hObject;
% Update handles structure
guidata(hObject, handles);
% UIWAIT makes jmk wait for user response (see UIR
% uiwait(handles.figure1);
% --- Outputs from this function are returned to t
function varargout = jmk_OutputFcn(hObject, eventd
% varargout cell array for returning output args
% hObject handle to figure
% eventdata reserved - to be defined in a future
% handles structure with handles and user data
% Get default command line output from handles str
varargout{1} = handles.output;
function pushbutton1_Callback(hObject, eventdata,
%FIR低通滤波器:
global file;
fb=1000;
fc=1200;
Fs=22050;
As=15;
Ap=1;
wp=2*pi*fb/Fs;
ws=2*pi*fc/Fs;
Wn=(wp+ws)/(2*pi);
n=ceil(8*pi/(ws-wp));
b=fir1(n,Wn);
[h,w]=freqz(b,1);
axes(handles.axes1);
plot(w*Fs/(2*pi),20*log10(abs(h)));
title('FIR低通滤波器性能分析');
ylabel('幅度/db');
xlabel('频率/Hz');
grid;
[x,fs,bits]=wavread(file);
n=length(x);
sound(x);
X=fft(x);
z=fftfilt(b,x);
Z=fft(z);
f=Fs*(0:(n/2-1))/n;
axes(handles.axes2);
plot(x(:,1));
title('原始信号波形');
ylabel('幅度');
xlabel('频率/Hz');
axes(handles.axes3);
plot(z(:,1));
title('滤波后信号波形');
ylabel('幅度');
xlabel('频率/Hz');
sound(z);
axes(handles.axes4);
plot(f,abs(X(1:n/2)));
title('原始信号频谱');
ylabel('幅度/db');
xlabel('频率/Hz');
axes(handles.axes5);
plot(f,abs(Z(1:n/2)));
title('滤波后信号频谱');
ylabel('幅度/db');
xlabel('频率/Hz');
function pushbutton2_Callback(hObject, eventdata,
%FIR高通滤波器:
global file;
fb=5000;
fs=4800;
Fs=22050;
As=15;
Ap=1;
wp=2*pi*fb/Fs;
ws=2*pi*fs/Fs;
Wn=(wp+ws)/(2*pi);
n=ceil(8*pi/(wp-ws));
b=fir1(n,Wn,'high');
[h,w]=freqz(b,1);
axes(handles.axes1);
plot(w*Fs/(2*pi),20*log10(abs(h)));
title('FIR高通滤波器性能分析');
ylabel('幅度/db');
xlabel('频率/Hz');
grid;
[x,fs,bits]=wavread(file);
n=length(x);
sound(x);
X=fft(x);
z=fftfilt(b,x);
Z=fft(z);
f=fs*(0:(n/2-1))/n;
axes(handles.axes2);
plot(x(:,1));
title('原始信号波形');
ylabel('幅度');
xlabel('频率/Hz');
axes(handles.axes2);
plot(z(:,1));
title('滤波后信号波形');
ylabel('幅度');
xlabel('频率/Hz');
sound(z);
axes(handles.axes4);
plot(f,abs(X(1:n/2)));
title('原始信号频谱');
ylabel('幅度/db');
xlabel('频率/Hz');
axes(handles.axes5);
plot(f,abs(Z(1:n/2)));
title('滤波后信号频谱');
ylabel('幅度/db');
xlabel('频率/Hz');
function pushbutton3_Callback(hObject, eventdata,
%FIR带通滤波器:
global file;
fb1=1200;
fb2=3000;
fc1=1000;
fc2=3200;
Fs=22050;
As=15;
Ap=1;
wp1=2*pi*fb1/Fs;
ws1=2*pi*fc1/Fs;
wp2=2*pi*fb2/Fs;
ws2=2*pi*fc2/Fs;
wo1=wp1-ws1;
wo2=ws2-wp2;
wo=max(wo1,wo2);
n=ceil(8*pi/wo);
Wn1=(wp1+ws1)/(2*pi);
Wn2=(wp2+ws2)/(2*pi);
Wn=[Wn1,Wn2];
b=fir1(n,Wn,'band');
[h1,w1]=freqz(b,1);
axes(handles.axes1);
plot(w1*Fs/(2*pi),20*log10(abs(h1)));
title('FIR带通滤波器性能分析');
ylabel('幅度/db');
xlabel('频率/Hz');
grid;
[x,fs,bits]=wavread(file);
n=length(x);
sound(x);
X=fft(x);
z=fftfilt(b,x);
Z=fft(z);
f=fs*(0:(n/2-1))/n;
axes(handles.axes2);
plot(x(:,1));
title('原始信号波形');
ylabel('幅度');
xlabel('频率/Hz');
axes(handles.axes3);
plot(z(:,1));
title('滤波后信号波形');
ylabel('幅度');
xlabel('频率/Hz');
sound(z);
axes(handles.axes4);
plot(f,abs(X(1:n/2)));
title('原始信号频谱');
ylabel('幅度/db');
xlabel('频率/Hz');
axes(handles.axes5);
plot(f,abs(Z(1:n/2)));
title('滤波后信号频谱');
ylabel('幅度/db');
xlabel('频率/Hz');
function pushbutton4_Callback(hObject, eventdata,
%IIR低通滤波器:
global file;
fb=1000;
fc=1200;
Fs=22050;
Ts=1/Fs;
As=15;
Ap=1;
wp=2*pi*fb/Fs;
ws=2*pi*fc/Fs;
Wp=2/Ts*tan(wp/2);
Ws=2/Ts*tan(ws/2);
[n,Wn]=buttord(Wp,Ws,Ap,As,'s');
[b,a]=butter(n,Wn,'s');
[bd,ad]=bilinear(b,a,Fs);
[h,w]=freqz(bd,ad,1024);
axes(handles.axes1);
plot(w*Fs/(2*pi),20*log10(abs(h)));
title('IIR低通滤波器性能分析');
ylabel('幅度/db');
xlabel('频率/Hz');
grid;
[x,fs,bits]=wavread(file);
n=length(x);
f=Fs*(0:(n/2-1))/n;
sound(x);
X=fft(x);
z=filter(bd,ad,x);
axes(handles.axes2);
plot(x(:,1));
ylabel('幅度');
xlabel('频率/Hz');
title('原始信号波形');
axes(handles.axes3);
plot(z(:,1));
title('滤波后信号波形');
ylabel('幅度');
xlabel('频率/Hz');
sound(z);
axes(handles.axes4);
plot(f,abs(X(1:n/2)));
ylabel('幅度/db');
xlabel('频率/Hz');
title('原始信号频谱');
Z=fft(z);
axes(handles.axes5);
plot(f,abs(Z(1:n/2)));
title('滤波后信号频谱');
ylabel('幅度/db');
xlabel('频率/Hz');
function pushbutton5_Callback(hObject, eventdata,
%IIR高通滤波器:
global file;
fb=5000;
fc=4800;
Fs=22050;
Ts=1/Fs;
As=15;
Ap=1;
wp=2*pi*fb/Fs;
ws=2*pi*fc/Fs;
Wp=2/Ts*tan(wp/2);
Ws=2/Ts*tan(ws/2);
[n,Wn]=buttord(Wp,Ws,Ap,As,'s');
[b,a]=butter(n,Wn,'high','s');
[bd,ad]=bilinear(b,a,Fs);
[h,w]=freqz(bd,ad,1024);
axes(handles.axes1);
plot(w*Fs/(2*pi),20*log10(abs(h)));
title('IIR高通滤波器性能分析');
ylabel('幅度/db');
xlabel('频率/Hz');
grid;
[x,fs,bits]=wavread(file);
n=length(x);
f=Fs*(0:(n/2-1))/n;
sound(x);
X=fft(x);
z=filter(bd,ad,x);
axes(handles.axes2);
plot(x(:,1));
ylabel('幅度');
xlabel('频率/Hz');
title('原始信号波形');
axes(handles.axes3);
plot(z(:,1));
title('滤波后信号波形');
ylabel('幅度');
xlabel('频率/Hz');
sound(z);
axes(handles.axes4);
plot(f,abs(X(1:n/2)));
title('原始信号频谱');
ylabel('幅度/db');
xlabel('频率/Hz');
Z=fft(z);
axes(handles.axes5);
plot(f,abs(Z(1:n/2)));
title('滤波后信号频谱');
ylabel('幅度/db');
xlabel('频率/Hz');
function pushbutton6_Callback(hObject, eventdata,
%IIR带通滤波器:
global file;
fb1=1200;
fc1=1000;
fb2=3000;
fc2=3200;
Fs=15000;
As=15;
Ap=1;
wp=2*pi*[fb1 fb2]/Fs;
ws=2*pi*[fc1 fc2]/Fs;
Wp=2*Fs*tan(wp/2);
Ws=2*Fs*tan(ws/2);
[n,Wn]=buttord(Wp,Ws,Ap,As,'s');
[b,a]=butter(n,Wn,'s');
[bd,ad]=bilinear(b,a,Fs);
[h,w]=freqz(bd,ad);
axes(handles.axes1);
plot(w*Fs/(2*pi),20*log10(abs(h)));
title('IIR带通滤波器性能分析');
ylabel('幅度/db');
xlabel('频率/Hz');
grid;
[x,fs,bits]=wavread(file);
n=length(x);
f=Fs*(0:(n/2-1))/n;
sound(x);
X=fft(x);
z=filter(bd,ad,x);
axes(handles.axes2);
plot(x(:,1));
ylabel('幅度');
xlabel('频率/Hz');
title('原始信号波形');
axes(handles.axes3);
plot(z(:,1));
ylabel('幅度');
xlabel('频率/Hz');
title('滤波后信号波形');
sound(z);
axes(handles.axes4);
plot(f,abs(X(1:n/2)));
title('原始信号频谱');
ylabel('幅度/db');
xlabel('频率/Hz');
Z=fft(z);
axes(handles.axes5);;
plot(f,abs(Z(1:n/2)));
title('滤波后信号频谱');
ylabel('幅度/db');
xlabel('频率/Hz');
function edit1_Callback(hObject, eventdata, handle
function edit1_CreateFcn(hObject, eventdata, handl
% Hint: edit controls usually have a white backgro
% See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'),
set(hObject,'BackgroundColor','white');
end
% --- Executes on button press in pushbutton7.
function pushbutton7_Callback(hObject, eventdata,
global file;
H={'*.wav'};
[filename,pathname]=uigetfile(H,'请选择打开文件');
file=strcat(pathname,filename);
% hObject handle to pushbutton7 (see GCBO)
% eventdata reserved - to be defined in a future
% handles structure with handles and user data
% --- Executes on button press in pushbutton8.
function pushbutton8_Callback(hObject, eventdata,
close;
% hObject handle to pushbutton8 (see GCBO)
% eventdata reserved - to be defined in a future
% handles structure with handles and user data