logo资料库

基于MATLAB的语音信号分析及滤波.doc

第1页 / 共42页
第2页 / 共42页
第3页 / 共42页
第4页 / 共42页
第5页 / 共42页
第6页 / 共42页
第7页 / 共42页
第8页 / 共42页
资料共42页,剩余部分请下载后查看
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
课程设计说明书 唐 山 学 院 数字信号处理 课 程 设 计 题 目 基于 MATLAB 的语音信号分析及滤波 系 (部) 班 姓 学 级 名 号 指导教师 2010 年 12 月 27 日至 2011 年 1 月 7 日共 2 周 2011 年 1 月 6 日 - 1 -
课程设计说明书 1 MATLAB 简介 1.1MATLAB 的概况 MATLAB 是矩阵实验室(Matrix Laboratory)之意。除具备卓越的数值计 算能力外,它还提供了专业水平的符号计算,文字处理,可视化建模仿真和实时 控制等功能。 MATLAB 的基本数据单位是矩阵,它的指令表达式与数学,工程中常用的形式 十分相似,故用 MATLAB 来解算问题要比用 C,FORTRAN 等语言完相同的事情简捷得 多. 开放性使 MATLAB 广受用户欢迎.除内部函数外,所有 MATLAB 主包文件和各种 工具包都是可读可修改的文件,用户通过对源程序的修改或加入自己编写程序构 造新的专用工具包. 1.2MATLAB 的语言特点 一种语言之所以能如此迅速地普及,显示出如此旺盛的生命力,是由于它有 着不同于其他语言的特点,正如同 FORTRAN 和 C 等高级语言使人们摆脱了需要直 接对计算机硬件资源进行操作一样,被称作为第四代计算机语言的 MATLAB,利 用其丰富的函数资源,使编程人员从繁琐的程序代码中解放出来。MATLAB 最突 出的特点就是简洁。MATLAB 用更直观的,符合人们思维习惯的代码,代替了 C 和 FORTRAN 语言的冗长代码。MATLAB 给用户带来的是最直观,最简洁的程序开 发环境。以下简单介绍一下 MATLAB 的主要特点: (1)语言简洁紧凑,使用方便灵活,库函数极其丰富。MATLAB 程序书写形式自 由,利用起丰富的库函数避开繁杂的子程序编程任务,压缩了一切不必要的编程 工作。由于库函数都由本领域的专家编写,用户不必担心函数的可靠性。 (2)运算符丰富。由于 MATLAB 是用 C 语言编写的,MATLAB 提供了和 C 语言几 乎一样多的运算符,灵活使用 MATLAB 的运算符将使程序变得极为简短。 (3)MATLAB 既具有结构化的控制语句(如 for 循环,while 循环,break 语句 和 if 语句),又有面向对象编程的特性。 (4)程序限制不严格,程序设计自由度大。例如,在 MATLAB 里,用户无需对矩 阵预定义就可使用。 (5)程序的可移植性很好,基本上不做修改就可以在各种型号的计算机和操作 系统上运行。 (6)MATLAB 的图形功能强大。在 FORTRAN 和 C 语言里,绘图都很不容易,但在 MATLAB 里,数据的可视化非常简单。MATLAB 还具有较强的编辑图形界面的能力。 (7)MATLAB 的缺点是,它和其他高级程序相比,程序的执行速度较慢。由于 MATLAB 的程序不用编译等预处理,也不生成可执行文件,程序为解释执行,所 - 2 -
课程设计说明书 以速度较慢。 (8)功能强大的工具箱是 MATLAB 的另一特色。MATLAB 包含两个部分:核心部 分和各种可选的工具箱。核心部分中有数百个核心内部函数。其工具箱又分为两 类:功能性工具箱和学科性工具箱。功能性工具箱主要用来扩充其符号计算功能, 图示建模仿真功能,文字处理功能以及与硬件实时交互功能。功能性工具箱用于 多种学科。而学科性工具箱是专业性比较强的,如 control,toolbox,signl proceessing toolbox,commumnication toolbox 等。这些工具箱都是由该领域 内学术水平很高的专家编写的,所以用户无需编写自己学科范围内的基础程序, 而直接进行高、精、尖的研究。 (9)源程序的开放性。开放性也许是 MATLAB 最受人们欢迎的特点。除内部函数 以外,所有 MATLAB 的核心文件和工具箱文件都是可读可改的源文件,用户可通 过对源文件的修改以及加入自己的文件构成新的工具箱。 1.3MATLAB 处理音频信号的流程 分析和处理音频信号,首先要对声音信号进行采集,MATLAB 的数据采集工具 箱提供了一整套命令和函数,通过调用这些函数和命令,可以直接控制声卡进行 数据采集。windows 自带的录音机程序也可驱动声卡来采集语音信号,并能保存 为 wav 格式文件,提供 MATLAB 相关函数直接读取、写入和播放。课设以 wav 格 式音频信号作为分析处理的输入数据。用 MATLAB 处理音频信号的基本流程是: 现将 wav 格式音频信号经 wavread 函数转化成 MATLAB 列数组变量;再用 MATLAB 强大的运算能力进行数据分析和处理,如时域分析、频域分析、数字滤波、信号 合成、信号变换等等;处理后的数据如是音频数据,可用 sound、wavplay 等函 数直接回放。我们可以利用前面设计好的各种滤波器来实现对某些声音信号的滤 波,从而改变输入信号所包含的频率成分的相对比例或滤出某些频率成分。下面 介绍一下具体的操作过程。 (1)利用 wavread 函数把指定路径下的 WAV 格式的声音文件读入矢量中,采 样率是 22050Hz。 [x,fs,bits]=wavread('D:\0072.wav'); (2)利用 sound 函数以同样的码率对原声进行再现。 sound(x,22050); (3)利用 filter 函数对样本信号进行滤波处理,以设计好的 FIR 滤波器为例, z=filter(bd,ad,x); (4)利用 sound 函数对滤波之后的信号进行再现。 sound(z); (5)利用 plot 函数分别作出信号在滤波前后的时域波形图,以作对比。 plot(x(:,1)); - 3 -
课程设计说明书 plot(z(:,1)); (6)利用 fft 函数对滤波前后的信号进行 1024 点的快速傅里叶变换 FFT,采 用一次基 2 按时间抽取。 X=fft(x);Z=fft(z); (7)利用 plot 函数分别作出信号在滤波前后的频域波形图,以作对比。 plot(f,abs(X(1:n/2))); plot(f,abs(Z(1:n/2))); - 4 -
课程设计说明书 2 FIR 滤波器的分析与设计 2.1 窗函数法设计 FIR 滤波器 IIR 滤波器的最大缺点是不容易实现线性相位,但是语音、数据图像通信等系 统中普遍都要求数字滤波器具有线性相位,FIR 滤波器正是因为具有线性相位特 性,因而 FIR 滤波器在各个领域都获得了广泛的应用。除此之外,FIR 滤波器是 选择有限长度的 h(n),使其传输函数 (eH j )  d 满足要求。设计 FIR 常用的方法有 窗函数法、频率采样法等。本次课程设计采用的是窗函数法。 窗函数设计法是一种通过截短和计权的方法使无限长非因果序列成为有限长 脉冲响应序列的设计方法。通常在设计滤波器之前,应该先根据具体的工程应用 确定滤波器的技术指标。在大多数实际应用中,数字滤波器常常被用来实现选频 操作,所以指标的形式一般为在频域中以分贝值给出的相对幅度响应和相位响 应。 用窗函数法设计 FIR 滤波器的步骤如下: (1)根据过渡带宽及阻带衰减要求,选择窗函数的类型并估计窗口长度 N(或 阶数 M=N-1)。窗函数类型可根据最小阻带衰减 sA 独立选择,因为窗口长度 N 对 最小阻带衰减 AS 没有影响。在确定窗函数类型以后,可根据过渡带宽小于给定 指标确定所拟用的窗函数的窗口长度 N。设待求滤波器的过渡带宽为△ω,它与 窗口长度 N 近似成反比。窗函数类型确定后,其计算公式也确定了,不过这些公 式是近似的,得出的窗口长度还要在计算中逐步修正。原则是在保证阻带衰减满 足要求的情况下,尽量选择较小的 N。在 N 和窗函数类型确定后,即可调用 MATLAB 中的窗函数求出窗函数 (n)Wd 。 (2)根据待求滤波器的理想频率响应求出理想单位脉冲响应 (n) h d 。如果给出待 (eH j )  求滤波器的频率响应为 ,则理想的单位脉冲响应可以用傅里叶反变换式 得到,在一般情况下, (n) h d 是不能用封闭公式表示的,需要采用数值方法表示。 从ω=0 到ω=2π采样 N 点,采用离散傅里叶反变换(IDFT)即可求出。 d (3)计算滤波器的单位脉冲响应 h(n)。它是理想单位脉冲响应和窗函数的乘积, h(n) (n)w d ,在 MATLAB 中用点乘命令表示为 (n) d wh  d 。 h   h d  即 (4)验算技术指标是否满足要求。为了计算数字滤波器在频域中的特性,可调 用 freqz 子程序,如果不满足要求,可根据具体情况,调整窗函数类型或长度, 直到满足要求为止。 使用窗函数法设计时要满足以下两个条件: (1)窗谱主瓣尽可能地窄,以获得较陡的过渡带; - 5 -
课程设计说明书 (2)尽量减少窗谱的最大旁瓣的相对幅度,也就是使能量尽量集中于主瓣, 减小峰肩和纹波,进而增加阻带的衰减。 实际上,这两个要求并不能同时满足,如何设计尽量满足这两个条件的窗函 数就是用窗函数的关键所在。用窗函数设计 FIR 滤波器,需要根据给定的滤波器 指示选择适当的窗函数和窗函数的 N 值。各种窗函数的性能比较如表 2-1 所示: 表 2-1 2.2FIR 低通滤波器 2.2.1 设计过程 (1)确定 FIR 模拟低通滤波器技术指标 fb=1000;fc=1200;Fs=22050;Ap=1;As=15; (2)归一化,求得数字边缘频率 wp=2*pi*fb/Fs;ws=2*pi*fc/Fs; (3)计算过渡带宽 Wn=(wp+ws)/(2*pi); (4)计算参数 n 值 n=ceil(8*pi/(ws-wp)); (5)利用 fir1 函数确定 Hamming 窗低通滤波器的实际单位脉冲响应 b=fir1(n,Wn); (6)利用 freqz 函数求得幅频特性 [h,w]=freqz(b,1); (7)作出幅频特性曲线 - 6 -
课程设计说明书 plot(w*Fs/(2*pi),20*log10(abs(h))); 2.2.2 程序流程 Hamming 窗低通滤波器设计流程图如图 1 所示: 开始 确定模拟低通滤波器的技术指标 模拟滤波器转化成数字滤波器技术指标 计算过渡带宽及 n 值 利用 fir1 函数确定滤波器单位脉冲响应 利用 freqz 函数确定幅频响应 作出 Hamming 窗低通滤波器的幅频响应曲线 结束 图 1 Hamming 窗低通滤波器程序设计流程图 2.2.3 输出仿真结果 Hamming 窗低通滤波器的幅频特性如图 2 所示: - 7 -
课程设计说明书 图 2 Hamming 窗低通滤波器的幅频特性 滤波前和滤波后的时域波形如图 3 所示: 图 3 滤波前和滤波后的时域波形 - 8 -
分享到:
收藏