信号与线性系统课程设计报告

信号与线性系统课程设计报告

课题名称:数字语音信号分析系统设计

班级:

姓名:

学号:

成绩:

指导教师:王霞

日期:20##-12-27

摘要:

数字信号处理在实际生活生产中具有广泛应用,优点包括灵活性、高稳定性、可靠性、集成度高等。同时该方法在各学科领域的应用,近十几年来得到了飞速发展,形成了信息处理方面的许多高兴技术。数字信号分析相关应用同时又是目前进行语音信号分析处理的有效方法。

本次设计是关于语音信号分析系统的设计,主要包括读取原始语音信号,给原始信号加入干扰噪声,原信号及加噪信号的FFT,设计滤波器对加噪信号进行滤波,时域参数计算等功能的实现。所有功能可通过MATLAB的GUI的操作完成,其中初始信号、噪声信号、滤波器参数均为默认值,滤波器选用了巴特沃斯滤波器和切比雪夫滤波器,可以分别进行滤波并比较滤波结果。LABVIEW的仿真设计可以实现读取语音信号、加噪、计算FFT、滤波,其中原始语音信号可选,噪声的参数部分可调。

关键词:

语音信号,信号分析,FFT,滤波器

1课程设计的目的、意义

1.1课程设计的目的

本设计课题主要研究数字语音信号的初步分析方法、滤波器的设计及应用。

掌握Matlab软件的特点和使用方法;掌握利用Matlab分析信号和系统的时域、频域特性的方法;掌握数字滤波器的设计方法及应用;了解语音信号的特性及分析方法;了解LabVIEW虚拟仪器的特点,了解采用LabVIEW进行仿真的方法。

1.2 课程设计的意义

通过本课题的设计,提高运用所学知识分析和解决实际问题的能力。

2 设计任务及技术指标

利用MATLAB设计一个简单的数字语音信号分析系统,利用GUI设计友好的图形用户界面,实现数字语音信号读取,时域波形显示,频谱分析,设计数字滤波器滤除噪声,对语音型号的参数进行计算分析等功能。

具体为:对原始数字语音信号进行读取;对原始数字语音信号加入干扰噪声,画出原始信号及带噪信号的时域波形,利用FFT进行频域分析,画出相应波形;针对数字语音信号频谱及噪声频率,设计合适的数字滤波器滤除噪声;对噪声滤除前后的语音进行时频域分析;对语音信号部分时域参数进行计算;设计图形用户界面。

采用LabVIEW进行仿真设计,实现系统的功能,要求给出系统的前面板和框图,并记录仿真结果。

3 设计方案论证(附纸)

4 设计内容

利用MATLAB软件对语音信号进行分析频谱分析,对语音信号加入干扰噪声,对加入噪声的信号进行频谱分析,设计合适的滤波器滤除噪声。

根据设计要求分析系统功能,掌握设计中所需理论及设计原理(抽样频率、量化位数的概念,抽样定理;信号的FFT分析;数字滤波器设计原理和方法,各种不同类型滤波器的性能比较)。

对语音信号做FFT,进行频谱分析,画出信号的时域波形图和频谱图。

对语音信号加入干扰噪声,对语音信号进行回放(利用sound函数),感觉加噪前后声音的变化。对其做FFT,进行频谱分析,比较加噪前后语音信号的波形及频谱,对所得结果进行分析。

根据带噪语音信号的特点,设计合适的数字滤波器,绘制所设计滤波器的幅频和相频特性。用所设计的滤波器对带噪语音信号进行滤波,记录处理过程中所得各种波形及频谱图。

对语音信号进行回放,感觉滤波前后声音的变化。比较滤波前后语音信号的波形及频谱,对所得结果和滤波器性能进行分析。

语音信号部分时域参数计算。对语音信号进行分帧,分别取浊音帧和清音帧计算短时能量和短时平均过零率等参数,并对结果进行比较分析。

利用GUI设计友好的图形用户界面。要求主界面上包括语音的波形显示及播放按钮,滤波器参数设置框及滤波功能按钮;滤波前后语音信号时域波形及频谱的显示,滤波器幅频特性的显示;语音信号时域参数计算等功能。其中波形及频谱显示可包含在主界面中,也可在新建图形窗口中完成。

采用LabVIEW进行仿真设计,实现系统的功能,包括语音文件的读取及播放、滤波前后语音信号时域波形及频谱的显示、滤波器幅频特性的显示等功能,要求给出系统的前面板和程序框图,并记录仿真结果。

5 实验结果与分析

MATLAB PART:

GUI程序:

function varargout = GUI(varargin)

gui_Singleton = 1;

gui_State = struct('gui_Name',       mfilename, ...

                   'gui_Singleton',  gui_Singleton, ...

                   'gui_OpeningFcn', @GUI_OpeningFcn, ...

                   'gui_OutputFcn',  @GUI_OutputFcn, ...

                   '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, varargin{:});

else

    gui_mainfcn(gui_State, varargin{:});

end

function GUI_OpeningFcn(hObject, eventdata, handles, varargin)

handles.output = hObject;

guidata(hObject, handles);

function varargout = GUI_OutputFcn(hObject, eventdata, handles)

varargout{1} = handles.output;

% --- Executes on button press in yuyinboxing.

function pushbutton1_Callback(hObject, eventdata, handles)

figure(1);

[x,fs,nbits]=wavread('G:\design\qian1.wav');

N=100;n=0:N-1;t=0.01*n;

q=n*2*pi/N;

X=fft(x,N);

subplot(1,2,1);

plot(x);

title('yuyinxinhaoboxing');

subplot(1,2,2);

plot(q,abs(X));

title('yuyinxinhaopinpu');

% --- Executes on button press in yuyinbofang.

function pushbutton2_Callback(hObject, eventdata, handles)

sound('G:\design\qian1.wav')

% --- Executes on button press in FFT.

function pushbutton3_Callback(hObject, eventdata, handles)

figure(2);

[x,fs,nbits]=wavread('G:\design\qian1.wav');

subplot(1,1,1)

N=100;n=0:N-1;t=0.01*n;

q=n*2*pi/N;

X=fft(x,N);

plot(q,abs(X));

title('FFT')

% --- Executes on button press in jiaruzaosheng.

function pushbutton4_Callback(hObject, eventdata, handles)

figure(3);

[x,fs,nbits]=wavread('G:\design\qian1.wav');

subplot(2,1,1)

N=100;n=0:N-1;t=0.01*n;

q=n*2*pi/N;

X=fft(x,N);

plot(q,abs(X));

title('FFT')

subplot(2,1,2)

N=100;n=0:N-1;t=0.01*n;

M=length(x);

k=0:M-1;

q=n*2*pi/N;

y=x+0.05*cos(1.5*pi*k)';

Y=fft(y,N);

plot(q,abs(Y));

title('FFT(with noise)')

% --- Executes on button press in Butterworth Filter.

function pushbutton7_Callback(hObject, eventdata, handles)

figure(4);

%Butterworth Filter

wp=0.25*pi;ws=0.35*pi;Rp=1;As=17;T=1;

OmegaP=wp/T;OmegaS=ws/T;

[cs,ds]=afd_butt(OmegaP,OmegaS,Rp,As);

[b,a]=imp_invr(cs,ds,T)

[db,mag,pha,w]=freqz_m(b,a);

subplot(2,1,1);

plot(w/pi,mag);

title('Magnitude Response')

axis([0,1,0,1.1])

subplot(2,1,2);

plot(w/pi,db);

title('Magnitude in DB')

axis([0,1,-40,5]);

% --- Executes on button press in Chebyshev Filter.

function pushbutton8_Callback(hObject, eventdata, handles)

figure(5);

%Chebyshev Filter       

wp=0.25*pi;ws=0.35*pi;Rp=1;As=17;T=1;

OmegaP=(2/T)*tan(wp/2);

OmegaS=(2/T)*tan(ws/2);

ep=sqrt(10^(Rp/10)-1);

Ripple=sqrt(1/(1+ep*ep));

Attn=1/(10^(As/20));

A1=1/Attn;

a1=sqrt(A1*A1-1)/ep;

a2=OmegaS/OmegaP;

N=ceil(logm(a1+sqrt(a1*a1-1))/logm(a2+sqrt(a2*a2-1)));

fprintf('\n  Chebyshev Filter Order=%2.0f\n',N)

[cs,ds]=u_chb1ap(N,Rp,OmegaP);

[B,A]=bilinear(cs,ds,T)

[db,mag,pha,w]=freqz_m(B,A);

subplot(2,1,1);plot(w/pi,mag);

title('Magnitude Response');

axis([0,1,0,1.1])

subplot(2,1,2);plot(w/pi,db);

title('Magnitude in DB');

axis([0,1,-40,5]);

% --- Executes on button press in Butterworth.

function pushbutton9_Callback(hObject, eventdata, handles)

figure(6);

[x,fs,nbits]=wavread('G:\design\qian1.wav');

subplot(3,1,1)

N=100;n=0:N-1;t=0.01*n;

q=n*2*pi/N;

X=fft(x,N);

plot(q,abs(X));

title('FFT')

subplot(3,1,2)

N=100;n=0:N-1;t=0.01*n;

M=length(x);

l=0:M-1;

q=n*2*pi/N;

y=x+0.05*cos(1.5*pi*l)';

Y=fft(y,N);

plot(q,abs(Y));

title('FFT(with noise)')

%Butterworth Filter

wp=0.25*pi;ws=0.35*pi;Rp=1;As=17;T=1;

OmegaP=wp/T;OmegaS=ws/T;

[cs,ds]=afd_butt(OmegaP,OmegaS,Rp,As);

[b,a]=imp_invr(cs,ds,T)

[db,mag,pha,w]=freqz_m(b,a);

subplot(3,1,3)

y2=filter(b,a,y)

N=100;n=0:N-1;t=0.01*n;

M=length(x);

q=n*2*pi/N;

Y2=fft(y2,N);

plot(q,abs(Y2));

% --- Executes on button press in Chebyshev.

function pushbutton10_Callback(hObject, eventdata, handles)

figure(7);

[x,fs,nbits]=wavread('G:\design\qian1.wav');

subplot(3,1,1)

N=100;n=0:N-1;t=0.01*n;

q=n*2*pi/N;

X=fft(x,N);

plot(q,abs(X));

title('FFT')

subplot(3,1,2)

N=100;n=0:N-1;t=0.01*n;

M=length(x);

l=0:M-1;

q=n*2*pi/N;

y=x+0.05*cos(1.5*pi*l)';

Y=fft(y,N);

plot(q,abs(Y));

title('FFT(with noise)')

%Chebyshev Filter

wp=0.25*pi;ws=0.35*pi;Rp=1;As=17;T=1;

OmegaP=(2/T)*tan(wp/2);

OmegaS=(2/T)*tan(ws/2);

ep=sqrt(10^(Rp/10)-1);

Ripple=sqrt(1/(1+ep*ep));

Attn=1/(10^(As/20));

A1=1/Attn;

a1=sqrt(A1*A1-1)/ep;

a2=OmegaS/OmegaP;

N=ceil(logm(a1+sqrt(a1*a1-1))/logm(a2+sqrt(a2*a2-1)));

fprintf('\n  Chebyshev Filter Order=%2.0f\n',N)

[cs,ds]=u_chb1ap(N,Rp,OmegaP);

[b,a]=bilinear(cs,ds,T)

[db,mag,pha,w]=freqz_m(b,a);

y2=filter(b,a,y)

subplot(3,1,3)

N=100;n=0:N-1;t=0.01*n;

M=length(x);

l=0:M-1;

q=n*2*pi/N;

Y2=fft(y2,N);

plot(q,abs(Y2));

% --- Executes on button press in shiyucanshujisuan.

function pushbutton14_Callback(hObject, eventdata, handles)

[x,fs,nbits]=wavread('G:\design\qian1.wav');

N=100;n=0:N-1;t=0.01*n;

M=length(x);

%duanshinenglianghanshu

a=0;

y2=0;

for i=20:50

    y=x(i);

    a=a+y2;

    y2=y^2;

    i=i+1;

end

E=a

b=0;

y3=0;

for i=20:50

    y=x(i);

    y3=abs(y);

    b=b+y3;

    i=i+1;

end

M=b

c=0;

y4=0;

yf=0;

yl=0;

sgnf=0;

sgnl=0;

for i=20:50

    yf=x(i);

    if yf>=0

        sgnf=1;

    else

        sgnf=0;

    end;

    yl=x(i-1);

    if yl>=0

        sgnl=1;

    else

        sgnl=0;

    end;

    y4=y4+abs(sgnf-sgnl);

    c=c+y4/2;

    i=i+1;

end

Z=c

set(handles.edit1,'string',E);

set(handles.edit2,'string',M);

set(handles.edit3,'string',Z);

function edit1_Callback(hObject, eventdata, handles)

function edit1_CreateFcn(hObject, eventdata, handles)

if ispc

    set(hObject,'BackgroundColor','white');

else

    set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));

end

function edit2_Callback(hObject, eventdata, handles)

function edit2_CreateFcn(hObject, eventdata, handles)

if ispc

    set(hObject,'BackgroundColor','white');

else

    set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));

end

function edit3_Callback(hObject, eventdata, handles)

function edit3_CreateFcn(hObject, eventdata, handles)

if ispc

    set(hObject,'BackgroundColor','white');

else

    set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));

end

公式:

%afd_butt.m

function [b,a]=afd_butt(Wp,Ws,Rp,As)

N=ceil((log10((10^(Rp/10)-1)/(10^(As/10)-1)))/(2*log10(Wp/Ws)));

    %上条语句为求滤波器阶数:    N为整数;

    %ceil 朝正无穷大方向取整;

fprintf('\n  Butterworth Filter Order=%2.0f\n',N)

OmegaC=Wp/((10^(Rp/10)-1)^(1/(2*N)))        %求对应于N的3db截止频率;

[b,a]=u_buttap(N,OmegaC);

%freqz_m.m

function [db,mag,pha,w]=freqz_m(b,a);

[H,w]=freqz(b,a,1000,'whole');       %在0-2*pi之间选取N个点计算频率响应

H=(H(1:501))';                       %频率响应 

w=(w(1:501))';                        %频率

mag=abs(H);                           %响应幅度

db=20*log10((mag+eps)/max(mag));      %增益

pha=angle(H);                         %相位

%imp_invr.m

function [b,a]=imp_invr(c,d,T)

[R,p,k]=residue(c,d);     %部分分式展开

p=exp(p*T);               %从模拟到数字极点对应关系 ,部分分式系数相同

[b,a]=residuez(R,p,k);    %将部分分式的形式变换成多项式之比的形式

b=real(b');               %求出数字滤波器系数

a=real(a');

%u_buttap.m

function [b,a]=u_buttap(N,Omegac);

[z,p,k]=buttap(N);   %归一化巴特沃思模拟低通滤波器原形 

    %传输函数用极点形式表示  

p=p*Omegac;           %将 代入上式,相当于分子乘以 ,极点乘以

k=k*Omegac^N;

B=real(poly(z));     %poly为构造具有指定根的多项式  real为求实部

b=k*B;

a=real(poly(p));

%u_chb1ap.m

function [b,a]=u_chb1ap(N,Rp,Omegac)

[z,p,k]=cheb1ap(N,Rp);          %归一化切比雪夫1型模拟低通滤波器原形

a=real(poly(p));                %以下步骤实际上与求巴特沃思滤波器的原理

aNn=a(N+1);                     %一样,只是所用方法稍有不同。

p=p*Omegac;

a=real(poly(p));

aNu=a(N+1);

k=k*aNu/aNn;

B=real(poly(z));

b=k*B;

语音波形显示

原始信号FFT及加噪信号FFT

巴特沃斯滤波器幅频特性

巴特沃斯滤波器滤波前后对比

切比雪夫滤波器幅频特性

切比雪夫滤波前后对比

时域参数计算

LabVIEW PART:

前面板

程序框图

6 总结(附纸)

7 参考文献

[1] 高西全.数字信号处理(第三版).西安电子科技大学出版社,2008.8

[2] 吴大正. 信号与线性系统分析(第四版). 高等教育出版社,2005.8

[3] 陈垚光. 精通MATLAB GUI设计(第二版)电子工业出版社, 2011.1

[4] 陈后金. 信号分析与处理实验. 高等教育出版社,2006.8

[5] 赵力. 语音信号处理. 机械工业出版社,2009.7

[6] 彭勇. LabVIEW虚拟仪器设计及分析.清华大学出版社,2011.9

相关推荐