基于MATLAB的数字信号处理.docx
《基于MATLAB的数字信号处理.docx》由会员分享,可在线阅读,更多相关《基于MATLAB的数字信号处理.docx(41页珍藏版)》请在冰豆网上搜索。
![基于MATLAB的数字信号处理.docx](https://file1.bdocx.com/fileroot1/2023-1/9/e20fd256-f0c3-4f69-9e9b-e8432fd647ae/e20fd256-f0c3-4f69-9e9b-e8432fd647ae1.gif)
基于MATLAB的数字信号处理
MATLAB的综合实验
一、实验目的及要求
培养学生利用Matlab解决专业问题的能力。
二、实验设备(环境)及要求
1.计算机
2.Matlab软件编程实验平台
三、实验内容
1、编程实现一个数字信号处理的仿真系统。
要求具有界面并实现以下功能:
1)能产生(得到)并选择各种数字信号(sin、方波、三角波、语音、噪声及其叠加);
2)具有DFT、DCT和DWT变换功能,并对各种信号进行变换;
3)设计滤波器实现低通、高通、带通滤波,得到输出信号的频域特性和时间序列;
4)输入一段叠加了噪声的语音信号,显示其频谱特性,通过变换或滤波对其降噪,得到输出信号的频域特性和时间序列。
四、设计思想
本系统包含有三个主要部分:
信号产生与变换模块,滤波器模块和语音噪声处理。
信号产生与变换通过输入信号频率和采样频率实现正弦、方波、三角波、语音信号的产生以及噪声的叠加,系统设定信号持续时间为0.05s,语音信号为截取了一段2s的声音信号。
同时对各个信号进行DFT,DCT和DWT变换,且变换点数N=256,同时设定DWT变换时的小波类型为db1。
滤波器模块设计了四个IIR滤波器(巴特沃斯、切比雪夫Ⅰ型,切比雪夫Ⅱ型和椭圆滤波器),并分别实现低通,高通和带通。
界面设计了各种滤波器所需参数的输入模块。
系统设定待滤波信号持续时间为0.05s,包含有3个频率成分,S=sin(2*pi*f*t)+sin(2*pi*5*f*t)+sin(2*pi*8*f*t),其中f为输入信号频率,S通过低通、带通、高通滤波器之后,分别得到频率为f,5f和8f的正弦信号,实现信号滤波。
语音噪声处理部分是一个复选框按钮,通过巴特沃斯低通滤波器对其进行降噪,设计中通过观察噪声语音信号的频谱得到低通滤波器的截止频率和阻带起始频率,并合理输入通带衰减与阻带衰减,最终得到理想的降噪结果。
数字滤波器设计过程中用到了如下的一些matlab设计函数:
buttord、butter,cheb1ord、cheby1,cheb2ord、cheby2,ellipord、ellip。
五、程序代码(界面除外)及注释
functionvarargout=zuoye(varargin)
gui_Singleton=1;
gui_State=struct('gui_Name',mfilename,...
'gui_Singleton',gui_Singleton,...
'gui_OpeningFcn',@zuoye_OpeningFcn,...
'gui_OutputFcn',@zuoye_OutputFcn,...
'gui_LayoutFcn',[],...
'gui_Callback',[]);
ifnargin&&ischar(varargin{1})
gui_State.gui_Callback=str2func(varargin{1});
end
ifnargout
[varargout{1:
nargout}]=gui_mainfcn(gui_State,varargin{:
});
else
gui_mainfcn(gui_State,varargin{:
});
end
functionzuoye_OpeningFcn(hObject,eventdata,handles,varargin)
handles.output=hObject;
guidata(hObject,handles);
functionvarargout=zuoye_OutputFcn(hObject,eventdata,handles)
varargout{1}=handles.output;
functionedit1_show_Callback(hObject,eventdata,handles)
functionedit1_show_CreateFcn(hObject,eventdata,handles)
ifispc&&isequal(get(hObject,'BackgroundColor'),get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
functionedit2_show_Callback(hObject,eventdata,handles)
functionedit2_show_CreateFcn(hObject,eventdata,handles)
ifispc&&isequal(get(hObject,'BackgroundColor'),get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
functionnoise_radiobutton_Callback(hObject,eventdata,handles)
%------------信号产生部分--------------
functionsignal_popupmenu_Callback(hObject,eventdata,handles)
val=get(hObject,'value');
globalf;
globalfs;
globalsin_1;
globalnoise_sin;
globalsquare_1;
globalnoise_square;
globalsawtooth_1;
globalnoise_sawtooth;
globalsound_1;
globalnoise_sound;
globaln;
n=0:
1/fs:
0.05;%设定信号持续时间为0.05s
switchval
case1
ifget(handles.noise_radiobutton,'value')==get(handles.noise_radiobutton,'max')
set(handles.edit2_show,'string','叠加噪声的正弦波','FontSize',12);
y=sin(2*pi*f*n);
noise_sin=y+rand(size(n));
axes(handles.axes2);
plot(n,noise_sin,'linewidth',1.5);
xlabel('t/s');
gridon;
else
set(handles.edit1_show,'string','正弦波波形','FontSize',12);
sin_1=sin(2*pi*f*n);
axes(handles.axes1);
plot(n,sin_1,'linewidth',2);
xlabel('t/s');
gridon;
end
case2
ifget(handles.noise_radiobutton,'value')==get(handles.noise_radiobutton,'max')
set(handles.edit2_show,'string','叠加噪声的方波','FontSize',12);
y=square(2*pi*f*n,50);
noise_square=y+rand(size(n));
axes(handles.axes2);
plot(n,noise_square,'linewidth',1.5);
xlabel('t/s');
gridon;
else
set(handles.edit1_show,'string','方波波形','FontSize',12);
square_1=square(2*pi*f*n,50);
axes(handles.axes1);
plot(n,square_1,'linewidth',2);
xlabel('t/s');
set(handles.axes1,'Ylim',[-1.5,1.5]);
gridon;
end
case3
ifget(handles.noise_radiobutton,'value')==get(handles.noise_radiobutton,'max')
set(handles.edit2_show,'string','叠加噪声的三角波','FontSize',12);
y=sawtooth(2*pi*f*n);
noise_sawtooth=y+rand(size(n));
axes(handles.axes2);
plot(n,noise_sawtooth,'linewidth',1.5);
xlabel('t/s');
gridon;
else
set(handles.edit1_show,'string','三角波波形','FontSize',12);
sawtooth_1=sawtooth(2*pi*f*n);
axes(handles.axes1);
plot(n,sawtooth_1,'linewidth',2);
xlabel('t/s');
gridon;
end
case4
ifget(handles.noise_radiobutton,'value')==get(handles.noise_radiobutton,'max')
set(handles.edit2_show,'string','叠加噪声的语音信号','FontSize',12);
[y,fs1,bit]=wavread('vo.wav');
y1=y(:
1);%单声道处理
noise_sound=y1+rand(length(y1),1);
sound(noise_sound,fs1,bit);
axes(handles.axes2);
N1=length(y1);
ts=(0:
N1-1)/fs1;
plot(ts,noise_sound);
xlabel('t/s');
gridon;
else
set(handles.edit1_show,'string','语音信号','FontSize',12);
[y,fs1,bit]=wavread('vo.wav');
sound_1=y(:
1);%单声道处理
sound(sound_1,fs1,bit);
axes(handles.axes1);
N1=length(sound_1);
ts=(0:
N1-1)/fs1;
plot(ts,sound_1);
xlabel('t/s');
gridon;
end
end
functionsignal_popupmenu_CreateFcn(hObject,eventdata,handles)
ifispc&&isequal(get(hObject,'BackgroundColor'),get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
%----------信号变换-------------------
functiontransform_popupmenu_Callback(hObject,eventdata,handles)
globalsin_1;
globalnoise_sin;
globalsquare_1;
globalnoise_square;
globalsawtooth_1;
globalnoise_sawtooth;
globalsound_1;
globalnoise_sound;
globaln;
globalfs;
globalN;
N=256;%DFT,DCT变换的点数
k1=(1:
N).*fs/N;
val=get(hObject,'value');
val_signal=get(handles.signal_popupmenu,'value');
switchval_signal
case1
switchval
case1
ifget(handles.noise_radiobutton,'value')==get(handles.noise_radiobutton,'max')
set(handles.edit1_show,'string','叠加噪声的正弦信号DFT','FontSize',12);
ifN>length(noise_sin)
n=0:
N-1;
noise_sin=[noise_sin,zeros(1,N-length(noise_sin))];
end
k=0:
N-1;
WN=exp(-j*2*pi/N);
nk=n'*k;
WNnk=WN.^nk;
Xk=noise_sin*WNnk;
axes(handles.axes1);
stem(k1,abs(Xk));
xlabel('f/Hz');
gridon;
else
set(handles.edit2_show,'string','正弦信号的DFT','FontSize',12);
ifN>length(sin_1)
n=0:
N-1;
sin_1=[sin_1,zeros(1,N-length(sin_1))];
end
k=0:
N-1;
WN=exp(-j*2*pi/N);
nk=n'*k;
WNnk=WN.^nk;
Xk=sin_1*WNnk;
axes(handles.axes2);
stem(k1,abs(Xk));
xlabel('f/Hz');
gridon;
end
case2
ifget(handles.noise_radiobutton,'value')==get(handles.noise_radiobutton,'max')
set(handles.edit1_show,'string','叠加噪声的正弦信号DCT','FontSize',12);
Xk=dct(noise_sin);
axes(handles.axes1);
stem(abs(Xk));
gridon;
else
set(handles.edit2_show,'string','正弦信号的DCT','FontSize',12);
Xk=dct(sin_1);
axes(handles.axes2);
stem(abs(Xk));
gridon;
end
case3
ifget(handles.noise_radiobutton,'value')==get(handles.noise_radiobutton,'max')
set(handles.edit1_show,'string','叠加噪声正弦信号的DWT','FontSize',12);
[Xk1,Xk2]=dwt(noise_sin,'db1');
axes(handles.axes1);
plot(Xk1,'--r','linewidth',2);
holdon;
gridon;
plot(Xk2,'linewidth',2);
legend('近似分量','细节分量');
holdoff
else
set(handles.edit2_show,'string','正弦信号的DWT','FontSize',12);
[Xk1,Xk2]=dwt(sin_1,'db1');
axes(handles.axes2);
plot(Xk1,'--r','linewidth',2);
gridon;
holdon;
plot(Xk2,'linewidth',2);
legend('近似分量','细节分量');
holdoff
end
end
case2
switchval
case1
ifget(handles.noise_radiobutton,'value')==get(handles.noise_radiobutton,'max')
set(handles.edit1_show,'string','叠加噪声的方波信号DFT','FontSize',12);
ifN>length(noise_square)
n=0:
N-1;
noise_square=[noise_square,zeros(1,N-length(noise_square))];
end
k=0:
N-1;
WN=exp(-j*2*pi/N);
nk=n'*k;
WNnk=WN.^nk;
Xk=noise_square*WNnk;
axes(handles.axes1);
stem(k1,abs(Xk));
xlabel('f/Hz');
gridon;
else
set(handles.edit2_show,'string','方波信号的DFT','FontSize',12);
ifN>length(square_1)
n=0:
N-1;
square_1=[square_1,zeros(1,N-length(square_1))];
end
k=0:
N-1;
WN=exp(-j*2*pi/N);
nk=n'*k;
WNnk=WN.^nk;
Xk=square_1*WNnk;
axes(handles.axes2);
stem(k1,abs(Xk));
xlabel('f/Hz');
gridon;
end
case2
ifget(handles.noise_radiobutton,'value')==get(handles.noise_radiobutton,'max')
set(handles.edit1_show,'string','叠加噪声的方波信号DCT','FontSize',12);
Xk=dct(noise_square);
axes(handles.axes1);
stem(abs(Xk));
gridon;
else
set(handles.edit2_show,'string','方波信号的DCT','FontSize',12);
Xk=dct(square_1);
axes(handles.axes2);
stem(abs(Xk));
gridon;
end
case3
ifget(handles.noise_radiobutton,'value')==get(handles.noise_radiobutton,'max')
set(handles.edit1_show,'string','叠加噪声的方波信号DWT','FontSize',12);
[Xk1,Xk2]=dwt(noise_square,'db1');
axes(handles.axes1);
plot(Xk1,'--r','linewidth',2);
holdon;
gridon;
plot(Xk2,'linewidth',2);
legend('近似分量','细节分量');
holdoff
else
set(handles.edit2_show,'string','方波信号的DWT','FontSize',12);
[Xk1,Xk2]=dwt(square_1,'db1');
axes(handles.axes2);
plot(Xk1,'--r','linewidth',2);
gridon;
holdon;
plot(Xk2,'linewidth',2);
legend('近似分量','细节分量');
holdoff
end
end
case3
switchval
case1
ifget(handles.noise_radiobutton,'value')==get(handles.noise_radiobutton,'max')
set(handles.edit1_show,'string','叠加噪声的三角波DFT','FontSize',12);
ifN>length(noise_sawtooth)
n=0:
N-1;
noise_sawtooth=[noise_sawtooth,zeros(1,N-length(noise_sawtooth))];
end
k=0:
N-1;
WN=exp(-j*2*pi/N);
nk=n'*k;
WNnk=WN.^nk;
Xk=noise_sawtooth*WNnk;
axes(handles.axes1);
stem(k1,abs(Xk));
xlabel('f/Hz');
gridon;
else
set(handles.edit2_show,'string','三角波信号的DFT','FontSize',12);
ifN>length(sawtooth_1)
n=0:
N-1;
sawtooth_1=[sawtooth_1,zeros(1,N-length(sawtooth_1))];
end
k=0:
N-1;
WN=exp(-j*2*pi/N);
nk=n'*k;
WNnk=WN.^nk;
Xk=sawtooth_1*WNnk;
axes(handles.axes2);
stem(k1,abs(Xk));
xlabel('f/Hz');
gridon;
end
case2
ifget(handles.noise_radiobutton,'value')==get(handles.noise_radiobutton,'max')
set(handles.edit1_show,'string','叠加噪声的三角波DCT','FontSize',12);
Xk=dct(noise_sawtooth);
axes(handles.axes1);
stem(abs(Xk));
gridon;
else
set(handles.edit2_show,'string','三角波信号的DCT','FontSize',12);
Xk=dct(sawtooth_1);
axes(handles.axes2);
stem(abs(Xk));
gridon;
end
case3
ifget(handles.noise_radiobutton,'value')==get(handles.noise_radiobu