信号处理是现代信息处理的基本内容,数字信号的处理更是重中之重。数字信号处理的研究内容主要是语音信号和图像信号,而研究语音信号对于现代语音通信有着积极的意义。研究语音信号又分为时域和频域两个方面。
(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工具,要求自学)
为了使编制的程序操作方便,要求有能力的同学,设计处理系统的用户界面。在所设计的系统界面上可以选择滤波器的类型,输入滤波器的参数,显示滤波器的频率响应,选择信号等。
function varargout = cover1(varargin)
% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @cover1_OpeningFcn, ...
'gui_OutputFcn', @cover1_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
% End initialization code - DO NOT EDIT
function cover1_OpeningFcn(hObject, eventdata, handles, varargin)
handles.output = hObject;
ha=axes('units','normalized','position',[0 0 1 1]);
uistack(ha,'down');
II=imread('cover1.jpg');
image(II)
colormap gray
set(ha,'handlevisibility','off','visible','off');
hb = axes('unit','normalized','position',[0.38 0.95 0.365 0.051]);
strCell = {'语音信号的处理与滤波'};%% 逐列显示文本
text('string',strCell,'FontSize', 18, 'FontWeight', 'bold');
set(hb,'handlevisibility','off','visible','off');
hc = axes('unit','normalized','position',[0.01 0.56 0.061 0.03]);
strCell = {'声音选择:'};%% 逐列显示文本
text('string',strCell,'FontSize', 14, 'FontWeight', 'bold');
set(hc,'handlevisibility','off','visible','off');
hd = axes('unit','normalized','position',[0.258 0.822 0.094 0.041]);
strCell = {'滤波器设置:'};%% 逐列显示文本
text('string',strCell,'FontSize', 14, 'FontWeight', 'bold');
set(hd,'handlevisibility','off','visible','off');
he = axes('unit','normalized','position',[0.258 0.738 0.074 0.037]);
strCell = {'设计方法:'};%% 逐列显示文本
text('string',strCell,'FontSize', 8);
set(he,'handlevisibility','off','visible','off');
hf = axes('unit','normalized','position',[0.258 0.57 0.105 0.03]);
strCell = {'请输入滤波器参数:'};%% 逐列显示文本
text('string',strCell,'FontSize', 8);
set(hf,'handlevisibility','off','visible','off');
end
end
end
end
end
function filter_Callback(hObject, eventdata, handles)
global var
var = get(handles.filter,'value');
switch var
case 1
set(handles.lowpass,'visible','off');
set(handles.lowstop,'visible','off');
set(handles.lowpasstarget,'visible','off');
set(handles.lowstoptarget,'visible','off');
set(handles.highpass,'visible','off');
set(handles.highstop,'visible','off');
set(handles.highpasstarget,'visible','off');
set(handles.highstoptarget,'visible','off');
set(handles.bandfilterstop1,'visible','off');
set(handles.bandfilterpass1,'visible','off');
set(handles.bandfilterpass2,'visible','off');
set(handles.bandfilterstop2,'visible','off');
set(handles.bandfilterpasstarget,'visible','off');
set(handles.bandfilterstoptarget,'visible','off');
axes(handles.FPRes1);
plot(0,0);
axes(handles.FPRes2);
plot(0,0);
case 2
set(handles.lowpass,'visible','on');
set(handles.lowstop,'visible','on');
set(handles.lowpasstarget,'visible','on');
set(handles.lowstoptarget,'visible','on');
set(handles.highpass,'visible','off');
提示');
l(get(handles.bandfilterstop2,'
bandfilterpasstarget = eval(get(handles.bandfilterpasstarget,'String'));
bandfilterstoptarget = eval(get(handles.bandfilterstoptarget,'String'));
wp1 = 2*pi*bandfilterpass1*1000*(1/8000);wp2 = 2*pi*bandfilterpass2*1000*(1/8000);
ws1 = 2*pi*bandfilterstop1*1000*(1/8000);ws2 = 2*pi*bandfilterstop2*1000*(1/8000);
Rp = bandfilterpasstarget;
As = bandfilterstoptarget;
Fs=8000;T=1/Fs; %转换为模拟滤 波器的技术指标
Omgp1=(2/T)*tan(wp1/2);Omgp2=(2/T)*tan(wp2/2);
Omgp=[Omgp1,Omgp2]; Omgs1=(2/T)*tan(ws1/2);
Omgs2=(2/T)*tan(ws2/2); Omgs=[Omgs1,Omgs2];
bw=Omgp2-Omgp1;w0=sqrt(Omgp1*Omgp2);%模拟通带带宽和中心频率
[n,Omgn]=cheb1ord(Omgp,Omgs,Rp,As,'s'); %计算阶数n和截止频率
[z0,p0,k0]=cheb1ap(n,Rp); % 设计归一化的模拟滤波器原型
ba1=k0*real(poly(z0)); %求原型 滤波器的系数b
aa1=real(poly(p0)); %求原型滤 波器的系数a
[ba,aa]=lp2bp(ba1,aa1,w0,bw);%变换为模拟带通滤波器
[bd,ad]=bilinear(ba,aa,Fs);
voiceandbackground = wavread('D:\Learning Practices\software program\Matlab Program\Course Design\voice file\voiceandbanckground.wav');
voiceandbackgroundfft = fft(voiceandbackgroundfft);
f = filter(bd,ad,voiceandbackground);
f1 = fft(f);
figure(11);
set(figure(11),'Menu','none');
set(figure(11),'NumberTitle','off','Name','滤波后的信号的频谱');
set(figure(11),'Color','w');
subplot(2,2,1);plot(voiceandbackground); %画出滤波后的时域图
xlabel('时间'); ylabel('幅值');
title('背景噪声滤波前的波形');
grid;
subplot(2,2,2);plot(20*log10(abs(voiceandbackgroundfft)));
xlabel('频率'); ylabel('幅值'); %加X轴说明 %加Y轴说明
title('背景噪声滤波前的相对幅度谱');
grid;
subplot(2,2,3);plot(f1); %画出滤波后的时域图
xlabel('时间'); ylabel('幅值');
title('背景噪声滤波后的波形');
grid;
subplot(2,2,4);plot(20*log10(abs(f1)));
xlabel('频率'); ylabel('幅值'); %加X轴说明 %加Y轴说明
title('背景噪声滤波后的相对幅度谱');
grid;
end
end
if(var == 4)
if(isempty(str2num(get(handles.highpass,'String'))) || isempty(str2num(get(handles.highstop,'String'))) || ...
isempty(str2num(get(handles.highpasstarget,'String'))) || isempty(str2num(get(handles.highstoptarget,'String'))))
errordlg('请正确输入参数','提示');
else
highpass = eval(get(handles.highpass,'String'));
highstop = eval(get(handles.highstop,'String'));
highpasstarget = eval(get(handles.highpasstarget,'String'));
highstoptarget = eval(get(handles.highstoptarget,'String'));
wp = 2*pi*highpass*1000*(1/12000);
ws = 2*pi*highstop*1000*(1/12000);
Rp = highpasstarget;
As = highstoptarget;
Fs=12000;T=1/Fs; %fs为采样频率, fp为中心频率
Omgp=(2/T)*tan(wp/2); %原型通 带频率的预修正
Omgs=(2/T)*tan(ws/2); %原型阻 带频率的预修正
[n,Omgc]=ellipord(Omgp,Omgs,Rp,As,'s'); %计算阶数n和截止频率
[z0,p0,k0]=ellipap(n,Rp,As); %设计归一化的椭圆模拟滤波器原型
ba=k0*real(poly(z0)); %求原型 滤波器的系数 b
aa=real(poly(p0)); %求原型滤 波器的系数 a
[ba1,aa1]=lp2hp(ba,aa,Omgc); %变换为模拟高通滤波器
[bd,ad]=bilinear(ba1,aa1,Fs); %求数字系统的频率特性%求滤波器的分子及分母的系数矩阵
voiceandbackground = wavread('D:\Learning Practices\software program\Matlab Program\Course Design\voice file\voiceandbanckground.wav');
voiceandbackgroundfft = fft(voiceandbackground);
f = filter(bd,ad,voiceandbackground);
f1 = fft(f);
figure(12);
set(figure(12),'Menu','none');
set(figure(12),'NumberTitle','off','Name','滤波后的信号的频谱');
set(figure(12),'Color','w');
subplot(2,2,1);plot(voiceandbackground); %画出滤波后的时域图
xlabel('时间'); ylabel('幅值');
title('背景噪声滤波前的波形');
grid;
subplot(2,2,2);plot(20*log10(abs(voiceandbackgroundfft)));
xlabel('频率'); ylabel('幅值'); %加X轴说明 %加Y轴说明
title('背景噪声滤波前的相对幅度谱');
grid;
subplot(2,2,3);plot(f1); %画出滤波后的时域图
xlabel('时间'); ylabel('幅值');
title('背景噪声滤波后的波形');
grid;
subplot(2,2,4);plot(20*log10(abs(f1)));
xlabel('频率'); ylabel('幅值'); %加X轴说明 %加Y轴说明
title('背景噪声滤波后的相对幅度谱');
grid;
end
end
flagvoice =0;
end
end
end
if(Fvar == 3)
if(var ~= 2 && var ~= 3 && var ~= 4)
errordlg('请选择滤波器类型','提示');
else
switch flagvoice
case 1
if(var == 2)
if(isempty(str2num(get(handles.lowpass,'String'))) || isempty(str2num(get(handles.lowstop,'String'))) || ...
isempty(str2num(get(handles.lowpasstarget,'String'))) || isempty(str2num(get(handles.lowstoptarget,'String'))))
errordlg('请正确输入参数','提示');
else
lowpass = eval(get(handles.lowpass,'String'));
lowstop = eval(get(handles.lowstop,'String'));
lowpasstarget = eval(get(handles.lowpasstarget,'String'));
lowstoptarget = eval(get(handles.lowstoptarget,'String'));
wp = 2*pi*lowpass*1000*(1/3000);
ws = 2*pi*lowstop*1000*(1/3000);
Rp = lowpasstarget;
As = lowstoptarget;
deltaw=ws-wp; %计算过渡带宽度
N0=ceil(6.6*pi/deltaw); %按汉宁窗计算滤波器长度N0
N=N0+mod(N0+1,2) ; %为实现FIR类型I偶对称滤波器,应确保N为奇数
wc=(ws+wp)/2; %截止频率取通阻带频率的平均值
[bd,ad]=fir1(N,wc/pi,hanning(N+1));
boyvoice = wavread('D:\Learning Practices\software program\Matlab Program\Course Design\voice file\voice source\czy_boy',[3000,18000]);
boyvoicefft = fft(boyvoice);
f = filter(bd,ad,boyvoice);
f1 = fft(f);
figure(1);
set(figure(1),'Menu','none');
set(figure(1),'NumberTitle','off','Name','滤波后的信号的频谱');
set(figure(1),'Color','w');
subplot(2,2,1);plot(boyvoice); %画出滤波后的时域图
xlabel('时间'); ylabel('幅值');
title('男生滤波前的波形');
grid;
subplot(2,2,2);plot(20*log10(abs(boyvoicefft)));
xlabel('频率'); ylabel('幅值'); %加X轴说明 %加Y轴说明
title('男生滤波前的相对幅度谱');
grid;
subplot(2,2,3);plot(f1); %画出滤波后的时域图
xlabel('时间'); ylabel('幅值');
title('男生滤波后的波形');
grid;
subplot(2,2,4);plot(20*log10(abs(f1)));
xlabel('频率'); ylabel('幅值'); %加X轴说明 %加Y轴说明
title('男生滤波后的相对幅度谱');
grid;
end
end
if(var == 3)
if(isempty(str2num(get(handles.bandfilterstop1,'String'))) || isempty(str2num(get(handles.bandfilterpass1,'String'))) || ...
isempty(str2num(get(handles.bandfilterpass2,'String'))) || isempty(str2num(get(handles.bandfilterstop2,'String'))) || ...
isempty(str2num(get(handles.bandfilterpasstarget,'String'))) || isempty(str2num(get(handles.bandfilterstoptarget,'String'))))
errordlg('请正确输入参数','提示');
else
bandfilterstop1 = eval(get(handles.bandfilterstop1,'String'));
bandfilterpass1 = eval(get(handles.bandfilterpass1,'String'));
bandfilterpass2 = eval(get(handles.bandfilterpass2,'String'));
bandfilterstop2 = eval(get(handles.bandfilterstop2,'String'));
bandfilterpasstarget = eval(get(handles.bandfilterpasstarget,'String'));
bandfilterstoptarget = eval(get(handles.bandfilterstoptarget,'String'));
wp1 = 2*pi*bandfilterpass1*1000*(1/8000);wp2 = 2*pi*bandfilterpass2*1000*(1/8000);
ws1 = 2*pi*bandfilterstop1*1000*(1/8000);ws2 = 2*pi*bandfilterstop2*1000*(1/8000);
Rp = bandfilterpasstarget;
As = bandfilterstoptarget;
deltaw = wp1-ws1;
N0 = ceil(11*pi/deltaw);
N = N0+mod(N0+1,2);
wc1 = (ws1+wp1)/2;wc2 = (ws2+wp2)/2;
wc = [wc1 wc2];
[bd,ad]=fir1(N,wc/pi,hanning(N+1));
boyvoice = wavread('D:\Learning Practices\software program\Matlab Program\Course Design\voice file\voice source\czy_boy',[3000,18000]);
boyvoicefft = fft(boyvoice);
f = filter(bd,ad,boyvoice);
f1 = fft(f);
figure(2);
set(figure(2),'Menu','none');
set(figure(2),'NumberTitle','off','Name','滤波后的信号的频谱');
set(figure(2),'Color','w');
subplot(2,2,1);plot(boyvoice); %画出滤波后的时域图
xlabel('时间'); ylabel('幅值');
title('男生滤波前的波形');
grid;
subplot(2,2,2);plot(20*log10(abs(boyvoicefft)));
xlabel('频率'); ylabel('幅值'); %加X轴说明 %加Y轴说明
title('男生滤波前的相对幅度谱');
grid;
subplot(2,2,3);plot(f1); %画出滤波后的时域图
xlabel('时间'); ylabel('幅值');
title('男生滤波后的波形');
grid;
subplot(2,2,4);plot(20*log10(abs(f1)));
xlabel('频率'); ylabel('幅值'); %加X轴说明 %加Y轴说明
title('男生滤波后的相对幅度谱');
grid;
end
end
if(var == 4)
if(isempty(str2num(get(handles.highpass,'String'))) || isempty(str2num(get(handles.highstop,'String'))) || ...
isempty(str2num(get(handles.highpasstarget,'String'))) || isempty(str2num(get(handles.hi
[1] 王一世,数字信号处理,北京理工大学出版社.
[2] 于俊凤,语音信号的识别和转换研究,学位论文,成都理工大学.
[3] 王正林,刘明.精通MATLAB 7[M].北京:电子工业出版社,2006.7
[4] 李国勇.计算机仿真技术与CAD—基于MATLAB的控制系统 电子工业出版社
部分理论引用网络文献,若有侵权联系博主删除。