1 简介
信号处理是现代信息处理的基本内容,数字信号的处理更是重中之重。数字信号处理的研究内容主要是语音信号和图像信号,而研究语音信号对于现代语音通信有着积极的意义。研究语音信号又分为时域和频域两个方面。
(1)语音信号的时域分析处理:一类是进行语音信号分析,另一类是生成和变换各种调制信号,对信号平均累加器的动态范围进行压缩扩张,用门限方法进行噪声的抑制等等。前一类是属于时域中信号平均累加器的线性处理,主要通过信号的加减、时移、倍乘、卷积、求相关函数等来实现。而后一类,则属于非线性的变换和处理。
(2)语音信号的频谱分析处理:信号的时域频谱分析通常是要结合在一起进行的。
在数字设计系统中,任何信号处理器件都可以看成是一个滤波器,滤波器设计是数字信号处理的重要内容。滤波器就是在对信号进行分析的基础上,设计适当的系统,提取有用的信号,抑制噪声信号干扰。滤波器的设计通常是在频率域进行的。
本设计是用MATLAB仿真软件设计滤波器对受干扰的语音信号进行滤波处理,并对各部分进行频谱分析。
1.语音信号的采集
熟悉并掌握MATLAB中有关声音(wave)录制、播放、存储和读取的函数,在MATLAB环境中,使用声音相关函数录制3秒左右自己的声音。(考虑如何解决一个实际问题:录制刚开始时,常会出现实际发出声音落后录制动作半拍的现象,如何排除对这些无效点的采样?)
2.语音信号的频谱分析
要求首先画出语音信号的时域波形;然后对语音号进行快速傅里叶变换,得到信号的频谱特性,从而加深对频谱特性的理解。
3.设计数字滤波器并画出其频率响应
给出各滤波器的性能指标:
(1)低通滤波器性能指标:fb=1000 Hz,fc=1200 Hz,As=100dB,Ap=1dB。
(2)高通滤波器性能指标:fc=4800 Hz,fb=5000 Hz As=100dB,Ap=1dB。
(3)带通滤波器性能指标:fp1=1200 Hz,fp2=3000 Hz,fsc1=1000 Hz,fsc2=3200Hz,As=100dB,Ap=1dB。
要求用窗函数法和双线性变换法设计上面要求的3种滤波器。在Matlab中,使用函数butter,cheby1等函数设计IIR滤波器;利用Matlab中的函数freqz画出各滤波器的频率响应。
4.用滤波器对信号进行滤波
要求用自己设计的各种滤波器分别对采集的信号进行滤波,在Matlab中,FIR滤波器利用函数fftfilt对信号进行滤波,IIR滤波器利用函数filter对信号进行滤波。
5.比较滤波前后语音信号的波形及频谱
要求在一个窗口同时画出滤波前后的波形及频谱。
6.回放语音信号
在Matlab中,使用相关声音函数对声音进行回放。辨别滤波前后的声音有何变化。
7.男女声语音信号频谱特点分析
换一个与你性别相异的人录制同样一段语音内容,分析两段内容相同的语音信号频谱之间有什么特点。
8. 背景噪声滤除
再录制一段同样长时间的背景噪声(频谱能量集中在某个小范围内)叠加到你的语音信号中,分析叠加前后信号频谱的变化,设计一个合适的滤波器,能够把该噪声滤除。
9.设计系统界面(用MATLAB中GUIDE工具,要求自学)
为了使编制的程序操作方便,要求有能力的同学,设计处理系统的用户界面。在所设计的系统界面上可以选择滤波器的类型,输入滤波器的参数,显示滤波器的频率响应,选择信号等。
2 部分代码
<span style="color:#333333"><span style="background-color:rgba(0, 0, 0, 0.03)"><code><span style="color:#ca7d37">function</span> varargout = cover1(varargin)</code><code>% Begin initialization code - DO NOT EDIT</code><code>gui_Singleton = 1;</code><code>gui_State = struct(<span style="color:#dd1144">'gui_Name'</span>, mfilename, ...</code><code> <span style="color:#dd1144">'gui_Singleton'</span>, gui_Singleton, ...</code><code> <span style="color:#dd1144">'gui_OpeningFcn'</span>, @cover1_OpeningFcn, ...</code><code> <span style="color:#dd1144">'gui_OutputFcn'</span>, @cover1_OutputFcn, ...</code><code> <span style="color:#dd1144">'gui_LayoutFcn'</span>, [] , ...</code><code> <span style="color:#dd1144">'gui_Callback'</span>, []);</code><code><span style="color:#ca7d37">if</span> nargin && ischar(varargin{1})</code><code> gui_State.gui_Callback = str2func(varargin{1});</code><code>end</code><code></code><code><span style="color:#ca7d37">if</span> nargout</code><code> [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});</code><code><span style="color:#ca7d37">else</span></code><code> gui_mainfcn(gui_State, varargin{:});</code><code>end</code><code>% End initialization code - DO NOT EDIT</code><code><span style="color:#ca7d37">function</span> cover1_OpeningFcn(hObject, eventdata, handles, varargin)</code><code>handles.output = hObject;</code><code></code><code>ha=axes(<span style="color:#dd1144">'units'</span>,<span style="color:#dd1144">'normalized'</span>,<span style="color:#dd1144">'position'</span>,[0 0 1 1]);</code><code>uistack(ha,<span style="color:#dd1144">'down'</span>);</code><code>II=imread(<span style="color:#dd1144">'cover1.jpg'</span>);</code><code>image(II)</code><code>colormap gray</code><code><span style="color:#ca7d37">set</span>(ha,<span style="color:#dd1144">'handlevisibility'</span>,<span style="color:#dd1144">'off'</span>,<span style="color:#dd1144">'visible'</span>,<span style="color:#dd1144">'off'</span>);</code><code></code><code>hb = axes(<span style="color:#dd1144">'unit'</span>,<span style="color:#dd1144">'normalized'</span>,<span style="color:#dd1144">'position'</span>,[0.38 0.95 0.365 0.051]);</code><code>strCell = {<span style="color:#dd1144">'语音信号的处理与滤波'</span>};%% 逐列显示文本</code><code>text(<span style="color:#dd1144">'string'</span>,strCell,<span style="color:#dd1144">'FontSize'</span>, 18, <span style="color:#dd1144">'FontWeight'</span>, <span style="color:#dd1144">'bold'</span>);</code><code><span style="color:#ca7d37">set</span>(hb,<span style="color:#dd1144">'handlevisibility'</span>,<span style="color:#dd1144">'off'</span>,<span style="color:#dd1144">'visible'</span>,<span style="color:#dd1144">'off'</span>);</code><code></code><code>hc = axes(<span style="color:#dd1144">'unit'</span>,<span style="color:#dd1144">'normalized'</span>,<span style="color:#dd1144">'position'</span>,[0.01 0.56 0.061 0.03]);</code><code>strCell = {<span style="color:#dd1144">'声音选择:'</span>};%% 逐列显示文本</code><code>text(<span style="color:#dd1144">'string'</span>,strCell,<span style="color:#dd1144">'FontSize'</span>, 14, <span style="color:#dd1144">'FontWeight'</span>, <span style="color:#dd1144">'bold'</span>);</code><code><span style="color:#ca7d37">set</span>(hc,<span style="color:#dd1144">'handlevisibility'</span>,<span style="color:#dd1144">'off'</span>,<span style="color:#dd1144">'visible'</span>,<span style="color:#dd1144">'off'</span>);</code><code></code><code></code><code>hd = axes(<span style="color:#dd1144">'unit'</span>,<span style="color:#dd1144">'normalized'</span>,<span style="color:#dd1144">'position'</span>,[0.258 0.822 0.094 0.041]);</code><code>strCell = {<span style="color:#dd1144">'滤波器设置:'</span>};%% 逐列显示文本</code><code>text(<span style="color:#dd1144">'string'</span>,strCell,<span style="color:#dd1144">'FontSize'</span>, 14, <span style="color:#dd1144">'FontWeight'</span>, <span style="color:#dd1144">'bold'</span>);</code><code><span style="color:#ca7d37">set</span>(hd,<span style="color:#dd1144">'handlevisibility'</span>,<span style="color:#dd1144">'off'</span>,<span style="color:#dd1144">'visible'</span>,<span style="color:#dd1144">'off'</span>);</code><code></code><code></code><code>he = axes(<span style="color:#dd1144">'unit'</span>,<span style="color:#dd1144">'normalized'</span>,<span style="color:#dd1144">'position'</span>,[0.258 0.738 0.074 0.037]);</code><code>strCell = {<span style="color:#dd1144">'设计方法:'</span>};%% 逐列显示文本</code><code>text(<span style="color:#dd1144">'string'</span>,strCell,<span style="color:#dd1144">'FontSize'</span>, 8);</code><code><span style="color:#ca7d37">set</span>(he,<span style="color:#dd1144">'handlevisibility'</span>,<span style="color:#dd1144">'off'</span>,<span style="color:#dd1144">'visible'</span>,<span style="color:#dd1144">'off'</span>);</code><code></code><code></code><code>hf = axes(<span style="color:#dd1144">'unit'</span>,<span style="color:#dd1144">'normalized'</span>,<span style="color:#dd1144">'position'</span>,[0.258 0.57 0.105 0.03]);</code><code>strCell = {<span style="color:#dd1144">'请输入滤波器参数:'</span>};%% 逐列显示文本</code><code>text(<span style="color:#dd1144">'string'</span>,strCell,<span style="color:#dd1144">'FontSize'</span>, 8);</code><code><span style="color:#ca7d37">set</span>(hf,<span style="color:#dd1144">'handlevisibility'</span>,<span style="color:#dd1144">'off'</span>,<span style="color:#dd1144">'visible'</span>,<span style="color:#dd1144">'off'</span>);</code><code> end</code><code> end</code><code> end</code><code> </code><code> end</code><code>end</code><code><span style="color:#ca7d37">function</span> filter_Callback(hObject, eventdata, handles)</code><code>global var</code><code>var = get(handles.filter,<span style="color:#dd1144">'value'</span>);</code><code>switch var</code><code> <span style="color:#ca7d37">case</span> 1</code><code> <span style="color:#ca7d37">set</span>(handles.lowpass,<span style="color:#dd1144">'visible'</span>,<span style="color:#dd1144">'off'</span>);</code><code> <span style="color:#ca7d37">set</span>(handles.lowstop,<span style="color:#dd1144">'visible'</span>,<span style="color:#dd1144">'off'</span>);</code><code> <span style="color:#ca7d37">set</span>(handles.lowpasstarget,<span style="color:#dd1144">'visible'</span>,<span style="color:#dd1144">'off'</span>);</code><code> <span style="color:#ca7d37">set</span>(handles.lowstoptarget,<span style="color:#dd1144">'visible'</span>,<span style="color:#dd1144">'off'</span>);</code><code> </code><code> <span style="color:#ca7d37">set</span>(handles.highpass,<span style="color:#dd1144">'visible'</span>,<span style="color:#dd1144">'off'</span>);</code><code> <span style="color:#ca7d37">set</span>(handles.highstop,<span style="color:#dd1144">'visible'</span>,<span style="color:#dd1144">'off'</span>);</code><code> <span style="color:#ca7d37">set</span>(handles.highpasstarget,<span style="color:#dd1144">'visible'</span>,<span style="color:#dd1144">'off'</span>);</code><code> <span style="color:#ca7d37">set</span>(handles.highstoptarget,<span style="color:#dd1144">'visible'</span>,<span style="color:#dd1144">'off'</span>);</code><code> </code><code> <span style="color:#ca7d37">set</span>(handles.bandfilterstop1,<span style="color:#dd1144">'visible'</span>,<span style="color:#dd1144">'off'</span>);</code><code> <span style="color:#ca7d37">set</span>(handles.bandfilterpass1,<span style="color:#dd1144">'visible'</span>,<span style="color:#dd1144">'off'</span>);</code><code> <span style="color:#ca7d37">set</span>(handles.bandfilterpass2,<span style="color:#dd1144">'visible'</span>,<span style="color:#dd1144">'off'</span>);</code><code> <span style="color:#ca7d37">set</span>(handles.bandfilterstop2,<span style="color:#dd1144">'visible'</span>,<span style="color:#dd1144">'off'</span>);</code><code> <span style="color:#ca7d37">set</span>(handles.bandfilterpasstarget,<span style="color:#dd1144">'visible'</span>,<span style="color:#dd1144">'off'</span>);</code><code> <span style="color:#ca7d37">set</span>(handles.bandfilterstoptarget,<span style="color:#dd1144">'visible'</span>,<span style="color:#dd1144">'off'</span>);</code><code> </code><code> axes(handles.FPRes1);</code><code> plot(0,0);</code><code> axes(handles.FPRes2);</code><code> plot(0,0);</code><code> <span style="color:#ca7d37">case</span> 2</code><code> <span style="color:#ca7d37">set</span>(handles.lowpass,<span style="color:#dd1144">'visible'</span>,<span style="color:#dd1144">'on'</span>);</code><code> <span style="color:#ca7d37">set</span>(handles.lowstop,<span style="color:#dd1144">'visible'</span>,<span style="color:#dd1144">'on'</span>);</code><code> <span style="color:#ca7d37">set</span>(handles.lowpasstarget,<span style="color:#dd1144">'visible'</span>,<span style="color:#dd1144">'on'</span>);</code><code> <span style="color:#ca7d37">set</span>(handles.lowstoptarget,<span style="color:#dd1144">'visible'</span>,<span style="color:#dd1144">'on'</span>);</code><code> </code><code> <span style="color:#ca7d37">set</span>(handles.highpass,<span style="color:#dd1144">'visible'</span>,<span style="color:#dd1144">'off'</span>);</code><code> 提示<span style="color:#dd1144">');</span></code><code> l(get(handles.bandfilterstop2,'</code><code> bandfilterpasstarget = <span style="color:#ca7d37">eval</span>(get(handles.bandfilterpasstarget,<span style="color:#dd1144">'String'</span>));</code><code> bandfilterstoptarget = <span style="color:#ca7d37">eval</span>(get(handles.bandfilterstoptarget,<span style="color:#dd1144">'String'</span>));</code><code> wp1 = 2*pi*bandfilterpass1*1000*(1/8000);wp2 = 2*pi*bandfilterpass2*1000*(1/8000);</code><code> ws1 = 2*pi*bandfilterstop1*1000*(1/8000);ws2 = 2*pi*bandfilterstop2*1000*(1/8000);</code><code> Rp = bandfilterpasstarget;</code><code> As = bandfilterstoptarget;</code><code> Fs=8000;T=1/Fs; %转换为模拟滤 波器的技术指标</code><code> Omgp1=(2/T)*tan(wp1/2);Omgp2=(2/T)*tan(wp2/2);</code><code> Omgp=[Omgp1,Omgp2]; Omgs1=(2/T)*tan(ws1/2);</code><code> Omgs2=(2/T)*tan(ws2/2); Omgs=[Omgs1,Omgs2];</code><code> bw=Omgp2-Omgp1;w0=sqrt(Omgp1*Omgp2);%模拟通带带宽和中心频率</code><code> [n,Omgn]=cheb1ord(Omgp,Omgs,Rp,As,<span style="color:#dd1144">'s'</span>); %计算阶数n和截止频率</code><code> [z0,p0,k0]=cheb1ap(n,Rp); % 设计归一化的模拟滤波器原型</code><code> ba1=k0*real(poly(z0)); %求原型 滤波器的系数b</code><code> aa1=real(poly(p0)); %求原型滤 波器的系数a</code><code> [ba,aa]=lp2bp(ba1,aa1,w0,bw);%变换为模拟带通滤波器</code><code> [bd,ad]=bilinear(ba,aa,Fs);</code><code> voiceandbackground = wavread(<span style="color:#dd1144">'D:\Learning Practices\software program\Matlab Program\Course Design\voice file\voiceandbanckground.wav'</span>);</code><code> voiceandbackgroundfft = fft(voiceandbackgroundfft);</code><code> f = filter(bd,ad,voiceandbackground);</code><code> f1 = fft(f);</code><code> figure(11);</code><code> <span style="color:#ca7d37">set</span>(figure(11),<span style="color:#dd1144">'Menu'</span>,<span style="color:#dd1144">'none'</span>);</code><code> <span style="color:#ca7d37">set</span>(figure(11),<span style="color:#dd1144">'NumberTitle'</span>,<span style="color:#dd1144">'off'</span>,<span style="color:#dd1144">'Name'</span>,<span style="color:#dd1144">'滤波后的信号的频谱'</span>);</code><code> <span style="color:#ca7d37">set</span>(figure(11),<span style="color:#dd1144">'Color'</span>,<span style="color:#dd1144">'w'</span>);</code><code> subplot(2,2,1);plot(voiceandbackground); %画出滤波后的时域图</code><code> xlabel(<span style="color:#dd1144">'时间'</span>); ylabel(<span style="color:#dd1144">'幅值'</span>);</code><code> title(<span style="color:#dd1144">'背景噪声滤波前的波形'</span>);</code><code> grid;</code><code> subplot(2,2,2);plot(20*log10(abs(voiceandbackgroundfft)));</code><code> xlabel(<span style="color:#dd1144">'频率'</span>); ylabel(<span style="color:#dd1144">'幅值'</span>); %加X轴说明 %加Y轴说明</code><code> title(<span style="color:#dd1144">'背景噪声滤波前的相对幅度谱'</span>);</code><code> grid;</code><code> subplot(2,2,3);plot(f1); %画出滤波后的时域图</code><code> xlabel(<span style="color:#dd1144">'时间'</span>); ylabel(<span style="color:#dd1144">'幅值'</span>);</code><code> title(<span style="color:#dd1144">'背景噪声滤波后的波形'</span>);</code><code> grid;</code><code> subplot(2,2,4);plot(20*log10(abs(f1)));</code><code> xlabel(<span style="color:#dd1144">'频率'</span>); ylabel(<span style="color:#dd1144">'幅值'</span>); %加X轴说明 %加Y轴说明</code><code> title(<span style="color:#dd1144">'背景噪声滤波后的相对幅度谱'</span>);</code><code> grid;</code><code> end</code><code> end</code><code> <span style="color:#ca7d37">if</span>(var == 4)</code><code> <span style="color:#ca7d37">if</span>(isempty(str2num(get(handles.highpass,<span style="color:#dd1144">'String'</span>))) || isempty(str2num(get(handles.highstop,<span style="color:#dd1144">'String'</span>))) || ...</code><code> isempty(str2num(get(handles.highpasstarget,<span style="color:#dd1144">'String'</span>))) || isempty(str2num(get(handles.highstoptarget,<span style="color:#dd1144">'String'</span>))))</code><code> errordlg(<span style="color:#dd1144">'请正确输入参数'</span>,<span style="color:#dd1144">'提示'</span>);</code><code> <span style="color:#ca7d37">else</span></code><code> highpass = <span style="color:#ca7d37">eval</span>(get(handles.highpass,<span style="color:#dd1144">'String'</span>));</code><code> highstop = <span style="color:#ca7d37">eval</span>(get(handles.highstop,<span style="color:#dd1144">'String'</span>));</code><code> highpasstarget = <span style="color:#ca7d37">eval</span>(get(handles.highpasstarget,<span style="color:#dd1144">'String'</span>));</code><code> highstoptarget = <span style="color:#ca7d37">eval</span>(get(handles.highstoptarget,<span style="color:#dd1144">'String'</span>));</code><code> wp = 2*pi*highpass*1000*(1/12000);</code><code> ws = 2*pi*highstop*1000*(1/12000);</code><code> Rp = highpasstarget;</code><code> As = highstoptarget;</code><code> </code><code> Fs=12000;T=1/Fs; %fs为采样频率, fp为中心频率</code><code> Omgp=(2/T)*tan(wp/2); %原型通 带频率的预修正</code><code> Omgs=(2/T)*tan(ws/2); %原型阻 带频率的预修正</code><code> [n,Omgc]=ellipord(Omgp,Omgs,Rp,As,<span style="color:#dd1144">'s'</span>); %计算阶数n和截止频率</code><code> [z0,p0,k0]=ellipap(n,Rp,As); %设计归一化的椭圆模拟滤波器原型</code><code> ba=k0*real(poly(z0)); %求原型 滤波器的系数 b</code><code> aa=real(poly(p0)); %求原型滤 波器的系数 a</code><code> [ba1,aa1]=lp2hp(ba,aa,Omgc); %变换为模拟高通滤波器</code><code> [bd,ad]=bilinear(ba1,aa1,Fs); %求数字系统的频率特性%求滤波器的分子及分母的系数矩阵</code><code> </code><code> voiceandbackground = wavread(<span style="color:#dd1144">'D:\Learning Practices\software program\Matlab Program\Course Design\voice file\voiceandbanckground.wav'</span>);</code><code> voiceandbackgroundfft = fft(voiceandbackground);</code><code> f = filter(bd,ad,voiceandbackground);</code><code> f1 = fft(f);</code><code> figure(12);</code><code> <span style="color:#ca7d37">set</span>(figure(12),<span style="color:#dd1144">'Menu'</span>,<span style="color:#dd1144">'none'</span>);</code><code> <span style="color:#ca7d37">set</span>(figure(12),<span style="color:#dd1144">'NumberTitle'</span>,<span style="color:#dd1144">'off'</span>,<span style="color:#dd1144">'Name'</span>,<span style="color:#dd1144">'滤波后的信号的频谱'</span>);</code><code> <span style="color:#ca7d37">set</span>(figure(12),<span style="color:#dd1144">'Color'</span>,<span style="color:#dd1144">'w'</span>);</code><code> subplot(2,2,1);plot(voiceandbackground); %画出滤波后的时域图</code><code> xlabel(<span style="color:#dd1144">'时间'</span>); ylabel(<span style="color:#dd1144">'幅值'</span>);</code><code> title(<span style="color:#dd1144">'背景噪声滤波前的波形'</span>);</code><code> grid;</code><code> subplot(2,2,2);plot(20*log10(abs(voiceandbackgroundfft)));</code><code> xlabel(<span style="color:#dd1144">'频率'</span>); ylabel(<span style="color:#dd1144">'幅值'</span>); %加X轴说明 %加Y轴说明</code><code> title(<span style="color:#dd1144">'背景噪声滤波前的相对幅度谱'</span>);</code><code> grid;</code><code> subplot(2,2,3);plot(f1); %画出滤波后的时域图</code><code> xlabel(<span style="color:#dd1144">'时间'</span>); ylabel(<span style="color:#dd1144">'幅值'</span>);</code><code> title(<span style="color:#dd1144">'背景噪声滤波后的波形'</span>);</code><code> grid;</code><code> subplot(2,2,4);plot(20*log10(abs(f1)));</code><code> xlabel(<span style="color:#dd1144">'频率'</span>); ylabel(<span style="color:#dd1144">'幅值'</span>); %加X轴说明 %加Y轴说明</code><code> title(<span style="color:#dd1144">'背景噪声滤波后的相对幅度谱'</span>);</code><code> grid;</code><code> end</code><code> end</code><code> flagvoice =0;</code><code> end</code><code> end</code><code> end</code><code> <span style="color:#ca7d37">if</span>(Fvar == 3)</code><code> <span style="color:#ca7d37">if</span>(var ~= 2 && var ~= 3 && var ~= 4)</code><code> errordlg(<span style="color:#dd1144">'请选择滤波器类型'</span>,<span style="color:#dd1144">'提示'</span>);</code><code> <span style="color:#ca7d37">else</span></code><code> switch flagvoice</code><code> <span style="color:#ca7d37">case</span> 1</code><code> <span style="color:#ca7d37">if</span>(var == 2)</code><code> <span style="color:#ca7d37">if</span>(isempty(str2num(get(handles.lowpass,<span style="color:#dd1144">'String'</span>))) || isempty(str2num(get(handles.lowstop,<span style="color:#dd1144">'String'</span>))) || ...</code><code> isempty(str2num(get(handles.lowpasstarget,<span style="color:#dd1144">'String'</span>))) || isempty(str2num(get(handles.lowstoptarget,<span style="color:#dd1144">'String'</span>))))</code><code> errordlg(<span style="color:#dd1144">'请正确输入参数'</span>,<span style="color:#dd1144">'提示'</span>);</code><code> <span style="color:#ca7d37">else</span></code><code> lowpass = <span style="color:#ca7d37">eval</span>(get(handles.lowpass,<span style="color:#dd1144">'String'</span>));</code><code> lowstop = <span style="color:#ca7d37">eval</span>(get(handles.lowstop,<span style="color:#dd1144">'String'</span>));</code><code> lowpasstarget = <span style="color:#ca7d37">eval</span>(get(handles.lowpasstarget,<span style="color:#dd1144">'String'</span>));</code><code> lowstoptarget = <span style="color:#ca7d37">eval</span>(get(handles.lowstoptarget,<span style="color:#dd1144">'String'</span>));</code><code> wp = 2*pi*lowpass*1000*(1/3000);</code><code> ws = 2*pi*lowstop*1000*(1/3000);</code><code> Rp = lowpasstarget;</code><code> As = lowstoptarget;</code><code> deltaw=ws-wp; %计算过渡带宽度</code><code> N0=ceil(6.6*pi/deltaw); %按汉宁窗计算滤波器长度N0</code><code> N=N0+mod(N0+1,2) ; %为实现FIR类型I偶对称滤波器,应确保N为奇数</code><code> wc=(ws+wp)/2; %截止频率取通阻带频率的平均值</code><code> [bd,ad]=fir1(N,wc/pi,hanning(N+1)); </code><code> boyvoice = wavread(<span style="color:#dd1144">'D:\Learning Practices\software program\Matlab Program\Course Design\voice file\voice source\czy_boy'</span>,[3000,18000]);</code><code> boyvoicefft = fft(boyvoice);</code><code> f = filter(bd,ad,boyvoice);</code><code> f1 = fft(f);</code><code> figure(1);</code><code> <span style="color:#ca7d37">set</span>(figure(1),<span style="color:#dd1144">'Menu'</span>,<span style="color:#dd1144">'none'</span>);</code><code> <span style="color:#ca7d37">set</span>(figure(1),<span style="color:#dd1144">'NumberTitle'</span>,<span style="color:#dd1144">'off'</span>,<span style="color:#dd1144">'Name'</span>,<span style="color:#dd1144">'滤波后的信号的频谱'</span>);</code><code> <span style="color:#ca7d37">set</span>(figure(1),<span style="color:#dd1144">'Color'</span>,<span style="color:#dd1144">'w'</span>);</code><code> subplot(2,2,1);plot(boyvoice); %画出滤波后的时域图</code><code> xlabel(<span style="color:#dd1144">'时间'</span>); ylabel(<span style="color:#dd1144">'幅值'</span>);</code><code> title(<span style="color:#dd1144">'男生滤波前的波形'</span>);</code><code> grid;</code><code> subplot(2,2,2);plot(20*log10(abs(boyvoicefft)));</code><code> xlabel(<span style="color:#dd1144">'频率'</span>); ylabel(<span style="color:#dd1144">'幅值'</span>); %加X轴说明 %加Y轴说明</code><code> title(<span style="color:#dd1144">'男生滤波前的相对幅度谱'</span>);</code><code> grid;</code><code> subplot(2,2,3);plot(f1); %画出滤波后的时域图</code><code> xlabel(<span style="color:#dd1144">'时间'</span>); ylabel(<span style="color:#dd1144">'幅值'</span>);</code><code> title(<span style="color:#dd1144">'男生滤波后的波形'</span>);</code><code> grid;</code><code> subplot(2,2,4);plot(20*log10(abs(f1)));</code><code> xlabel(<span style="color:#dd1144">'频率'</span>); ylabel(<span style="color:#dd1144">'幅值'</span>); %加X轴说明 %加Y轴说明</code><code> title(<span style="color:#dd1144">'男生滤波后的相对幅度谱'</span>);</code><code> grid;</code><code> end</code><code> end</code><code> <span style="color:#ca7d37">if</span>(var == 3)</code><code> </code><code> <span style="color:#ca7d37">if</span>(isempty(str2num(get(handles.bandfilterstop1,<span style="color:#dd1144">'String'</span>))) || isempty(str2num(get(handles.bandfilterpass1,<span style="color:#dd1144">'String'</span>))) || ...</code><code> isempty(str2num(get(handles.bandfilterpass2,<span style="color:#dd1144">'String'</span>))) || isempty(str2num(get(handles.bandfilterstop2,<span style="color:#dd1144">'String'</span>))) || ...</code><code> isempty(str2num(get(handles.bandfilterpasstarget,<span style="color:#dd1144">'String'</span>))) || isempty(str2num(get(handles.bandfilterstoptarget,<span style="color:#dd1144">'String'</span>))))</code><code> errordlg(<span style="color:#dd1144">'请正确输入参数'</span>,<span style="color:#dd1144">'提示'</span>);</code><code> <span style="color:#ca7d37">else</span></code><code> bandfilterstop1 = <span style="color:#ca7d37">eval</span>(get(handles.bandfilterstop1,<span style="color:#dd1144">'String'</span>));</code><code> bandfilterpass1 = <span style="color:#ca7d37">eval</span>(get(handles.bandfilterpass1,<span style="color:#dd1144">'String'</span>));</code><code> bandfilterpass2 = <span style="color:#ca7d37">eval</span>(get(handles.bandfilterpass2,<span style="color:#dd1144">'String'</span>));</code><code> bandfilterstop2 = <span style="color:#ca7d37">eval</span>(get(handles.bandfilterstop2,<span style="color:#dd1144">'String'</span>));</code><code> bandfilterpasstarget = <span style="color:#ca7d37">eval</span>(get(handles.bandfilterpasstarget,<span style="color:#dd1144">'String'</span>));</code><code> bandfilterstoptarget = <span style="color:#ca7d37">eval</span>(get(handles.bandfilterstoptarget,<span style="color:#dd1144">'String'</span>));</code><code> wp1 = 2*pi*bandfilterpass1*1000*(1/8000);wp2 = 2*pi*bandfilterpass2*1000*(1/8000);</code><code> ws1 = 2*pi*bandfilterstop1*1000*(1/8000);ws2 = 2*pi*bandfilterstop2*1000*(1/8000); </code><code> Rp = bandfilterpasstarget;</code><code> As = bandfilterstoptarget;</code><code> deltaw = wp1-ws1;</code><code> N0 = ceil(11*pi/deltaw);</code><code> N = N0+mod(N0+1,2);</code><code> wc1 = (ws1+wp1)/2;wc2 = (ws2+wp2)/2;</code><code> wc = [wc1 wc2];</code><code> [bd,ad]=fir1(N,wc/pi,hanning(N+1));</code><code> boyvoice = wavread(<span style="color:#dd1144">'D:\Learning Practices\software program\Matlab Program\Course Design\voice file\voice source\czy_boy'</span>,[3000,18000]);</code><code> boyvoicefft = fft(boyvoice);</code><code> f = filter(bd,ad,boyvoice);</code><code> f1 = fft(f);</code><code> figure(2);</code><code> <span style="color:#ca7d37">set</span>(figure(2),<span style="color:#dd1144">'Menu'</span>,<span style="color:#dd1144">'none'</span>);</code><code> <span style="color:#ca7d37">set</span>(figure(2),<span style="color:#dd1144">'NumberTitle'</span>,<span style="color:#dd1144">'off'</span>,<span style="color:#dd1144">'Name'</span>,<span style="color:#dd1144">'滤波后的信号的频谱'</span>);</code><code> <span style="color:#ca7d37">set</span>(figure(2),<span style="color:#dd1144">'Color'</span>,<span style="color:#dd1144">'w'</span>);</code><code> subplot(2,2,1);plot(boyvoice); %画出滤波后的时域图</code><code> xlabel(<span style="color:#dd1144">'时间'</span>); ylabel(<span style="color:#dd1144">'幅值'</span>);</code><code> title(<span style="color:#dd1144">'男生滤波前的波形'</span>);</code><code> grid;</code><code> subplot(2,2,2);plot(20*log10(abs(boyvoicefft)));</code><code> xlabel(<span style="color:#dd1144">'频率'</span>); ylabel(<span style="color:#dd1144">'幅值'</span>); %加X轴说明 %加Y轴说明</code><code> title(<span style="color:#dd1144">'男生滤波前的相对幅度谱'</span>);</code><code> grid;</code><code> subplot(2,2,3);plot(f1); %画出滤波后的时域图</code><code> xlabel(<span style="color:#dd1144">'时间'</span>); ylabel(<span style="color:#dd1144">'幅值'</span>);</code><code> title(<span style="color:#dd1144">'男生滤波后的波形'</span>);</code><code> grid;</code><code> subplot(2,2,4);plot(20*log10(abs(f1)));</code><code> xlabel(<span style="color:#dd1144">'频率'</span>); ylabel(<span style="color:#dd1144">'幅值'</span>); %加X轴说明 %加Y轴说明</code><code> title(<span style="color:#dd1144">'男生滤波后的相对幅度谱'</span>);</code><code> grid;</code><code> end</code><code> end</code><code> <span style="color:#ca7d37">if</span>(var == 4)</code><code> <span style="color:#ca7d37">if</span>(isempty(str2num(get(handles.highpass,<span style="color:#dd1144">'String'</span>))) || isempty(str2num(get(handles.highstop,<span style="color:#dd1144">'String'</span>))) || ...</code><code> isempty(str2num(get(handles.highpasstarget,<span style="color:#dd1144">'String'</span>))) || isempty(str2num(get(handles.hi</code></span></span>
3 仿真结果
4 参考文献
[1] 王一世,数字信号处理,北京理工大学出版社.
[2] 于俊凤,语音信号的识别和转换研究,学位论文,成都理工大学.
[3] 王正林,刘明.精通MATLAB 7[M].北京:电子工业出版社,2006.7
[4] 李国勇.计算机仿真技术与CAD—基于MATLAB的控制系统 电子工业出版社
博主简介:擅长智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、路径规划、无人机等多种领域的Matlab仿真,相关matlab代码问题可私信交流。
部分理论引用网络文献,若有侵权联系博主删除。