1)到商店买黄色牛皮纸封面(专门用于包装课程设计报告的那种黄色封面纸,上面有“课程设计”字样) 2)课程设计课题任务表,必须装订到课程设计报告书的第一页(即黄色封面纸后一页即是。)要写好自己在课题中的分工工作。
3)个别同学未能分组的可加塞到别的课题组,但要写好自身承担的任务。
4)设计体会要重点写,绝不能雷同。对于自己承担的工作可详细些。同组其他成员的可弱写。
5)设计总结,则可以同课题组的一样 目 录
一. 课程设计任务 1
1)学会使用MATLAB,掌握MATLAB的程序设计方法 2)掌握在WINDOWS环境下的语音信号采集方法
3)综合运用数字信号处理的基本理论,基本概念,基本方法进行频谱分析和滤波器设计,学会用MATLAB设计数字滤波器,学会用MATLAB分析和处理信号。
课程设计任务:
设计线性相位低通滤波器 1
2、课程设计题目:利用频率抽样法设计线性相位低通滤波器 1 二. 课程设计原理及设计方案 2 1、频率抽样设计法 2 1.1线性相位的约束 2
1.2线性相位第一种频率抽样 2 1.3 过渡带抽样的优化设计 2 1.4、设计方法 5
三. 课程设计的步骤和结果 6
1、读取病人心肺声音信号并对其进行频谱分析 6 2、设计滤波器对信号进行滤波(以凯塞窗为例) 7 2.1 低通滤波器 7 2.2带通滤波器 8 2.3带阻滤波器 10 3、GUI界面设计 11
3.1 BUTTON1 病人心肺声音信号提取 11 3.2 BUTTON2 退出系统 12 3.3 BUTTON3 运行 12 3.4文本编辑框 15 3.5 GUI整体界面 15 四. 课程设计总结 16 五. 设计体会 17
六. 参考文献 18
一. 课程设计任务
1、掌握MATLAB及其在数字信号处理中的应用
MATLAB 计算软件是一套进行科学计算的高性能软件,可以进行矩阵运算、绘制函数和数据、实现算法、创建用户界面、连接其他编程语言的程序等,主要应用于工程计算、控制设计、信号处理与通讯、图像处理、信号检测、金融建模设计与分析等领域。
Matlab语言可以很容易实现Fourier 变换和数字滤器的设计,广泛应用于数字信号处理中,给我们对数字信号的研究工作带来很大方便,同时具有功能全面的GUI程序设计,使所设计的应用程序具有图形用户界面,方便用户操 作。 2、课程设计题目:数字听诊器信号分析
目前大夫主要以听诊器倾听病人的气管、肺部区域的声音,对病人的疾病进行判断;请设计一个听诊的软件,要求如下:
1) 可记录病人的姓名、年龄、性别、病史、不同疾病部位等状况;
2) 对病人的气管、肺部等区域的声音进行采集、分析、存储(前端听诊部分不用考虑,只考虑数据采集部分)。 3) 可分析不同声音分量的大小,给出频谱图,以及主要频率的幅度,便于大夫分析和验证; 4) 由于采集到的信号经常存在某些干扰信号,比如心脏的震动,请设计低通、带通、带阻滤波器对信号处理,滤波器参数在用户界面中可以进行设置,方便医生进行使用; 5) 编制GUI用户界面。
二. 课程设计原理及设计方案 1、滤波器设计原理 1.1滤波器概述
随着信息时代和数字世界的到来,数字信号处理已成为当今一门极其重要的学科和技术领域。数字信号处理在通信、语音、图像,自动控制、雷达、军事、航空航天、医疗和家用电器等众多领域得到了广泛的应用。在数字信号处理中,数字滤波器占有极其重要的地位。现代数字滤波器可以用软件或设计专用的数字处理硬件两种方式来实现,用软件来实现数字滤波器优点是随着滤波器参数的改变,很容易改变滤波器的性能。根据数字滤波器单脉冲响应的时域特性可将数字滤波器分为两种, 即IIR (Infinite Impulse Response)无限长脉冲响应数字滤波器和FIR (Finite Impulse Response)有限长脉冲响应数字滤波器。从功能上分类, 可分为低通、高通、带通、带阻滤波器。
1.2FIR数字滤波器设计原理
FIR具有突出的优点:系统总是稳定的、易于实现线性相位、允许设计多通带(或多阻带)滤波器。但与IIR相比,在满足同样的阻带衰减的情况下需要较高的阶数。FIR的冲激响应h(k)是有限长的M 阶FIR系统函数可表示为 滤波器的输出:
它的设计问题实质上是确定能满足所要求的转移序列或脉冲响应的常数问题,给出的设计方法主要有窗函数法、频率采样法和等波纹最佳逼近法等。
在这里我们利用窗函数法设计FIR滤波器。给定所要求的滤波器的频率响应Hd ( ejw) , 要求设计一个FIR 滤波器的频率响应H( ejw) 来逼近Hd( ejw) .设计是在时域进行的, 首先由傅立叶变换导出无限长的序列hd( n) , 然后用窗函数截断hd ( n) ,即: h( n) = hd( n) w( n)。
1.3 FIR数字滤波器的特性 FIR滤波器有以下特点:
(1) 系统的单位冲激响应h(n)在有限个n值处不为零;
(2) 系统函数H(z)在|z|>0处收敛,极点全部在z = 0处(因果系统); (3) 结构上主要是非递归结构,没有输出到输入的反馈,但有些结构中(例如频率抽样结构)也包含有反馈的递归部分。
因为FIR数字滤波器的单位冲激响应是有限长的,所以它永远都是稳定的。[3]说明了达到具有线性相位这一要求,仅需要对FIR数字滤波器的冲激响应 施加一定的约束。令 ,就可由 得到FIR数字滤波器的频率响应: (1-2-1)
式中 是 的幅频特性, 是 的相频特性
(1-2-2)
由于h(n)的长度N取奇数或偶数时对H(w)的特性有影响, FIR滤波器的幅频特性可以分为以下4种情况:
(1)第Ⅰ种类型: 为偶对称,且N为奇数 根据式: 可以得到滤波器的幅频函数为:
(1-2-3) 其中 , 。幅度函数 对 呈偶对称。
(2)第Ⅱ种类型: 为偶对称,且N为偶数 根据式: 可得滤波器的幅频函数为:
(1-2-4)
其中: 。幅度函数 对于 或 呈偶对称。如果数字滤波器在 处不为零,如本文设计的高通滤波器和带阻滤波器则不能用这一类型。 (3)第Ⅲ种类型: 为奇对称,且N为奇数 根据式: 可得滤波器的幅频函数为:
(1-2-5)
其中 。数字滤波器在 =0, ,2 处不为零如低通滤波器、高通滤波器、带阻滤波器,则不适合用这类滤波器来设计。
(4)第Ⅳ种类型: 为奇对称,且N为偶数 根据式: 可得滤波器的幅频函数可表示为: (1-2-6)
其中: 。幅度函数 对于 呈偶对称。如果数字滤波器在 处不为零如低通滤波器、带阻滤波器,则不适合用这类数字滤波器来设计。
1.4窗函数的介绍
设计滤波器尽量要求窗函数满足以下两项要求: (1)窗谱主瓣尽可能地窄,以获取较陡的过渡带。
(2)尽量减少窗谱的最大旁瓣的相对幅度。也就是能量尽量集中于主瓣,这样使尖峰和波纹减小,就可增大阻带的衰减。
但是这两项要求是不能同时满足的。当选用主瓣宽度较窄时,虽然得到陡峭的过渡带,但通带和阻带的波动明显增加;当选用最小的旁瓣幅度时,虽能得到平坦的幅度响应和较小的阻带波纹,但过渡带加宽,即主瓣会加宽。因此,实际所选用的窗函数往往是它们的折中。设计FIR滤波器常用的窗函数有:矩形窗、三角窗、汉宁窗、海明窗、布拉克曼窗、凯塞窗等。
以下是几种窗函数的性能比较:
窗函数 旁瓣峰值衰减(dB) 等效凯塞尔窗( ) 主瓣过渡带宽( ) 精确过渡带宽( ) 最小阻带衰减(Db) 矩形窗 -13 0 4 1.8 -21
三角窗 -25 1.33 8 6.1 -25
汉宁窗 -31 3.86 8 6.2 -44
海明窗 -41 4.86 8 6.6 -53
布莱克曼窗 -57 7.04 12 11 -74
凯赛尔窗 -57 7.865 10 10 -80
2、设计方案
☆通过采集WAV文件读取不同病人心肺声音信号。
☆对声音信号进行时域、频谱及幅度谱分析,观察不同声音分量大小以及主要频率的幅度。 ☆设计FIR数字滤波器对声音信号进行滤波,设计不同的窗函数进行带通、带通、带阻滤波。
☆ 设计GUI界面,可进行滤波器参数设置。
三. 课程设计的步骤和结果
1、读取病人心肺声音信号并对其进行频谱分析
[x,B]=wavread(‘fb2.wav’); %读取病人心肺声音信号 F=B*(0:511)/1024; y=fft(x,1024); %频谱
fp=2*sqrt(y.*conj(y));%幅度谱 subplot(3,1,1);
plot(x); title('滤波前信号'); subplot(3,1,2);
plot(F,abs(y(1:512)));title('滤波前信号频谱'); axis([0,1000,0,inf]); subplot(3,1,3); plot(fp(1:257)); title('信号幅度谱');
2、设计滤波器对信号进行滤波(以凯塞窗为例) 2.1 低通滤波器
[x,B]=wavread('fb2.wav'); Fs=2000;%采样频率
Fp1=10;%低通通带模拟截止频率 Fs1=100;%低通阻带模拟截止频率
ws1=2*Fs1/Fs;%模拟转变为数字域的截止频率 wp1=2*Fp1/Fs;
delta_w=ws1-wp1; %过渡带宽
N=ceil(10*pi/delta_w)+1;%最小阶数N window=kaiser(N+1)';%凯塞窗
Wn=(Fp1+Fs1)/Fs;%理想LPF的截止频率 [b,a]=fir1(N,Wn,window); [H,w]=freqz(b,1,512);
db=20*log10(abs(H)); t=(0:200)/Fs; subplot(3,1,1);
plot(w*Fs/(2*pi),db);title('滤波器'); Filterx=filter(b,a,x); subplot(3,1,2);
plot(Filterx);title('滤波后信号'); F=B*(0:511)/1024; y=fft(Filterx,1024); subplot(3,1,3);
plot(F,abs(y(1:512)));title('滤波后信号频谱'); axis([0,1000,0,inf]); 如上设计采样频率为2000Hz,通带截止频率为10Hz,阻带截止频率为200Hz的低通滤波器对原声音信号进行滤波
对比滤波前后信号频谱,可观察得到该滤波器成功滤除了大于100Hz的频率,但仍与理想情况有一定差距。
2.2带通滤波器
[x,B]=wavread('fb2.wav'); Fs=2000;%采样频率
Fp1=200;%带通通带模拟截止频率
Fp2=400;
Fs1=100;%带通阻带模拟截止频率 Fs2=500;
ws1=2*Fs1/Fs;%模拟转变为数字域的截止频率 ws2=2*Fs2/Fs; wp1=2*Fp1/Fs; wp2=2*Fp2/Fs;
delta_w1=wp1-ws1; delta_w2=ws2-wp2;
delta_w=min(deltaw1,deltaw2); N=ceil(10*pi/delta_w1)+1;
window=kaiser(N+1); %凯塞窗 b=fir1(N,[wp1/pi wp2/pi],window); [H,w]=freqz(b,1,512); db=20*log(abs(H)); t=(0:200)/Fs; subplot(3,1,1);
plot(w*Fs/(2*pi),db);title('滤波器'); Filterx=filter(b,1,x); subplot(3,1,2);
plot(Filterx);title('滤波后信号'); F=B*(0:511)/1024; y=fft(Filterx,1024); subplot(3,1,3);
plot(F,abs(y(1:512)));title('滤波后信号频谱'); axis([0,1000,0,inf]);
如上设计采样频率为2000Hz,通带截止频率为200Hz、400Hz,阻带截止频率为100Hz、500Hz的带通滤波器对原声音信号进行滤波;
对比滤波前后信号频谱,可观察得到该滤波器成功滤除了除200Hz至400Hz以外的频率,但仍与理想情况有一定差距。
2.3带阻滤波器
[x,B]=wavread('fb2.wav'); Fs=2000;%采样频率
Fp1=100;%带阻通带模拟截止频率 Fp2=500;
Fs1=200;%带阻阻带模拟截止频率 Fs2=400;
ws1=2*Fs1/Fs;%模拟转变为数字域的截止频率 ws2=2*Fs2/Fs; wp1=2*Fp1/Fs; wp2=2*Fp2/Fs;
delta11=ws1-wp1; delta21=wp2-ws2;
delta_w=min(delta11,delta21); %过渡带宽 N=ceil(10*pi/delta_w2)+1;N=N+rem(N,2); window=kaiser(N+1);
b=fir1(N,[ws1/pi ws2/pi],'stop',window); [H,w]=freqz(b,1,512); db=20*log(abs(H)); t=(0:200)/Fs; subplot(3,1,1);
plot(w*Fs/(2*pi),db);title('滤波器'); Filterx=filter(b,1,x); subplot(3,1,2);
plot(Filterx);title('滤波后信号'); F=B*(0:511)/1024; y=fft(Filterx,1024); subplot(3,1,3);
plot(F,abs(y(1:512)));title('滤波后信号频谱'); axis([0,1000,0,inf]);
如上设计采样频率为2000Hz,通带截止频率为100Hz、500Hz,阻带截止频率为200Hz、400Hz的带阻滤波器对原声音信号进行滤波;
对比滤波前后信号频谱,可观察得到该滤波器成功滤除了200Hz至400Hz的频率,但仍与理想情况有一定差距。
3、GUI界面设计
3.1 BUTTON1 病人心肺声音信号提取
[FileNamePathName]=uigetfile({'*.wav','TextFiles(*.wav)';'*.*','AllFiles(*.*)'},'Choose a File'); L=length(FileName); test=FileName(1,L-3:L); if test == '.wav'
str=[PathName FileName]; set(handles.edit11,'string',str); [x,B]=wavread(str); else
errordlg('Wrong File','File Open Error!'); return; end
F=B*(0:511)/1024; y=fft(x,1024);
axes(handles.axes9);
plot(F,abs(y(1:512)));title('滤波前信号频谱'); axis([0,1000,0,inf]); axes(handles.axes8);
plot(x);title('滤波前信号');
fp=2*sqrt(y.*conj(y));%幅度谱 axes(handles.axes10); plot(fp(1:257)); title('信号幅度谱');
此按键实现功能为:
(1)选择文件路径,读取文本类文档,并将路径显示在界面上。 (2)对所选择的声音信号进行时域、频谱及幅度谱分析。 3.2 BUTTON2 退出系统 clear;
close(gcf);
此按键实现功能为:退出GUI界面。 3.3 BUTTON3 运行 此按键实现功能为:根据用户所设定的参数,选择相应的窗函数对原声音信号进行相应的滤波,并绘制滤波后的时域谱和频谱。 global x B; Nn=128;
DigitalFilter_value=get(handles.DigitalFilter,'Value'); Windows_value=get(handles.Windows,'Value'); FilterType_value=get(handles.FilterType,'Value'); Order_value=get(handles.Order,'Value');
Rp_value=str2double(get(handles.Rp,'String')); Rs_value=str2double(get(handles.Rs,'String')); Fs_value=str2double(get(handles.Fs,'String')); Fp1_value=str2double(get(handles.Fp1,'String')); Fp2_value=str2double(get(handles.Fp2,'String')); Fs1_value=str2double(get(handles.Fs1,'String')); Fs2_value=str2double(get(handles.Fs2,'String'));
wp1=2*Fp1_value/Fs_value;wp2=2*Fp2_value/Fs_value; ws1=2*Fs1_value/Fs_value;ws2=2*Fs2_value/Fs_value; wp=[wp1,wp2];ws=[ws1,ws2]; delta_w=ws1-wp1; deltaw1=wp1-ws1; deltaw2=ws2-wp2; delta11=ws1-wp1; delta21=wp2-ws2;
delta_w1=min(deltaw1,deltaw2); delta_w2=min(delta11,delta21); if(FilterType_value==1)
[n,Wn]=buttord(wp1,ws1,Rp_value,Rs_value); set(handles.MinOrderDisplay,'string',num2str(n)) else
if((FilterType_value==3)||(FilterType_value==2))
[n,Wn]=buttord(wp,ws,Rp_value,Rs_value); set(handles.MinOrderDisplay,'string',num2str(n)) end end
MinOrder_value=get(handles.MinOrder,'Value'); if(MinOrder_value==0)
n=str2double(get(handles.Order,'String')) end
switch Windows_value %FIR中的Windows选择 case 1 %选择设计kaiser滤波器
switch FilterType_value%选择滤波器类型 case 1 %低通滤波器 N=ceil(10*pi/delta_w)+1;%最小阶数N window=kaiser(N+1)';
Wn=(Fp1_value+Fs1_value)/Fs_value; %理想LPF的截止频率 [b,a]=fir1(N,Wn,window); [H,w]=freqz(b,1,512);
db=20*log10(abs(H)); %db imagine t=(0:200)/Fs_value;
axes(handles.Magnitude);
plot(w*Fs_value/(2*pi),db);title('滤波器'); Filterx=filter(b,a,x); axes(handles.axes11);
plot(Filterx);title('滤波后信号'); F=B*(0:511)/1024; y=fft(Filterx,1024); axes(handles.axes12);
plot(F,abs(y(1:512)));title('滤波后信号频谱'); axis([0,1000,0,inf]); case 2 %带通滤波器 „„
case 3 %带阻滤波器 „„
case 2 %选择设计hamming滤波器 switch FilterType_value%选择滤波器类型 ……
case 3 %选择设计hanning滤波器 switch FilterType_value%选择滤波器类型 ……
case 4 %选择设计bartlett滤波器
switch FilterType_value%选择滤波器类型 …… end end
3.4文本编辑框
参数输入时,在输入抽样频率Fs的前提下,判断滤波器通带临 (Fp1、Fp2)、滤波器阻带临界频率(Fst1、Fst2)的归一化频率wp1、 wp2、ws1、ws1是否在[0,1]之间,如不正确显示错误对话框,
Fs_value=str2double(get(handles.Fs,'String')); Fp1_value=str2double(get(handles.Fp1,'String'));
wp1=2*Fp1_value/Fs_value;%如果不在[0,1]之间,显示输入错误对话框 if(wp1>=1)
errordlg('wp1=2*Fp1/Fs,归一化频率不在【0,1】之间,请输入正确的参数','错误信息') end
3.5 GUI整体界面
四. 课程设计总结
1、GUI是实现人机交互的中介,具有强大的功能,可以完成许多复杂的程序模块。使用它,需要具有一定的知识储备和必要的经验技巧。并且要充分利用好MATLAB 的帮助文档,仔细研读HELP是最好的办法。需要了解函数句柄等必要基础知识,熟悉各控件对象的基本属性和方法操作,知晓不同控件的合适使用条件及其特有的功能,并会采用不同的使用手段来实现相同功能的设计。同时还需要详细掌握菜单和控件。菜单很简单,就是弄清除菜单之间的关系和如何调用就可以。控件的使用主要是用好CreateFcn和Callback属性。CreateFcn中的语句就是在程序运行时,就立即执行脚本。如果希望界面可控,那么最好用Callback属性。在相应控件下,添加相应的脚本就可以实现比较复杂计算绘图等功能。在设计GUI的时候,要注意一定的原则和步骤,分析界面所要求实现的主要功能,明确设计任务,构思草图,设计界面和属性,编写对象的相应代码,实现控件的交互调用。对于GUI在数字信号处理中的应用中,数字信号处理这门学科的知识是基础,要掌握数字信号处理的相关知识的原理后,并用代码来实现,才能很好地结合MATLAB进行GUI编程。
2、FIR滤波器窗函数法是从时域出发,通过一定的窗函数截取有限长的单位脉冲响应来逼近理想单位脉冲响应;各个窗函数在某些细节上有所不同,但整体滤波效果区别不大。 五. 设计体会
在为期两周的课程设计中,从刚看到题目的无从下手到整理好思路,广泛查阅资料和学习,到最后的初成规模,真的受益匪浅。虽然上学期就已经学习了数字信号处理这门课,但当将及真正运用到实际情况是还是觉得光是书本上的知识并不能解决所有问题。还需要自己去广泛查阅资料,然后融会贯通,需要自己的自学以及举一反三,很有挑战性也充分锻炼了自己的能力,对数字呢信号处理技术与MATLAB应用也有了进一步的认识。 在设计中遇到的问题有:
滤波器参数设置是这个课题的一个难点,一开始不了解如何将输入的参数读入到相应的程序中去,在查阅了相关资料后,才对get(handles.edit1,'String')这个函数有了一定的了解;此外诸如滤波器窗函数选择等问题也是靠着自己边查资料边摸索才将其各个解决。
在选择滤波器的时候,曾想过同时使用FIR和IIR滤波器,但设计出来的IIR滤波器的滤波效果很不理想,试了很多方法都不能改进,最终只能将其舍弃,选择用FIR窗函数进行滤波。
在设计GUI界面是同样遇到很多问题,各个按键功能设置好后总是提示出错,经仔细观察发现没有定义全局变量,从而意识到global的重要性,也明白了程序设计中每个细节的至关重要。另外,在编程的过程中,常常会出现一些数组长度不一致的情况,GUI中的回调函数与一般的MATLAB程序还是有一定的不同,在编写的时候尤其要注意。
通过这次理论加实践的课程设计,意识到数字信号处理在日常生活中的应用,也惊叹于MATLAB的强大功能。在设计中总会有些意想不到的小发现,希望以后多一些这样的课设机会,并适当加长时间,也许会做的更好。这次课设给了我一次锻炼自己专业知识的机会,同时对今后的毕业设计也有很大的启示和帮助。
六. 参考文献
1 董绍平.数字信号处理基础.哈尔滨工业大学出版社.1996
2 曹弋.MATLAB教程及实训[M].北京.机械工业出版社,2008.05
3 徐成波 陶红艳 杨菁 杨如明编著.数字信号处理及MATLAB实现.第二版.北京:清华大学出版社,2008.1
4 陈垚光等.精通MATLAB GUI设计.北京.电子工业出版社,2008.02
5 王宏.MATLAB6.5及其在数字信号处理中的应用.北京:清华大学出版社
课程设计成绩评定表
设计上机验收成绩表 第1章 姓名 第2章 蒋栋栋 第3章 学号 第4章 080250331 第5章 课题名称 第6章 数字听诊器信号分析 第7章 序号 第8章 验收项目 第9章 分值 第10章 得分 第11章 1 第12章 设计内容合理、目的明确 第13章 10分 第14章
第15章 2 第16章 实现了课程设计的基本要求,演示结果正确 第17章 50分 第18章
第19章 3 第20章 对课程设计中所涉及的知识理解正确 第21章 10分 第22章
第23章 4 第24章 方案正确,在基本要求基础上有改进、创新 第25章 20分 第26章
第27章 5 第28章 界面设计合理、美观 第29章 10分 第30章 第31章 总分 第32章 第33章 100分 第34章
课程设计总评分成绩表 评 定 项 目 分值 评分成绩 1 设计上机验收成绩、答辩 60%
2 设计报告的规范化、参考文献充分 30% 3 平时成绩 10% 总分
因篇幅问题不能全部显示,请点此查看更多更全内容