去除干扰蜂鸣音信号与系统教学规划.docx
《去除干扰蜂鸣音信号与系统教学规划.docx》由会员分享,可在线阅读,更多相关《去除干扰蜂鸣音信号与系统教学规划.docx(10页珍藏版)》请在冰豆网上搜索。
去除干扰蜂鸣音信号与系统教学规划
一、课程设计题目
去除干扰蜂鸣音
1.目的:
掌握信号时频域分析方法,正确理解采样定理,准确理解滤波器的概念。
2.内容:
提供一个包含某人说话语音片段的声音文件,但该语音信号被一个包含有几个谐波分量的蜂鸣信号干扰了。
用Matlab的wavread命令读取该声音文件。
注意,该命令可以同时得到声音文件的采样率和采样位宽,请查阅Matlab的帮助文件。
(1)用快速傅立叶变换(FFT)计算并画出声音信号的频谱,列写出蜂鸣信号的谐波频率。
(2)思考如何将这些蜂鸣音去除?
将去除了蜂鸣音的语音片段播放出来,仔细聆听并写下语音片段中人物所说的话。
注意:
由于只能播放实信号,因此记得提取信号的实部。
Matlab命令:
wavread,wavplay,fft,fftshift,fir1,filter,plot,figure.
二、设计思路
用waveread()函数读取音频和其采样率和采样位宽,对读取的音频信号使用fft()函数进行快速傅立叶变换并绘出得到的频谱。
观察频谱分析噪声(蜂鸣信号)的谐波频率分布,选择合适的滤波模式将噪声信号的谐波滤去,便可以得到去除噪声后的人声。
设计滤波器的频域特性便成了除去噪声并留下原声的关键,我们注意到所学的采样定理以及一维sinc函数(辛格函数)
,然而汉宁窗可以看作是3个矩形时间窗的频谱之和,或者说是3个
型函数之和,而括号中的两项相对于第一个谱窗向左、右各移动了π/T,从而使旁瓣互相抵消,消去高频干扰和漏能。
它适用于非周期性的连续信号。
利用它的选择特性使用fir1()建立一个汉宁窗函数,并用filter()函数进行滤波,去除噪声部分。
最后用play()函数播放音频检查效果。
三、设计过程
1.音频的读取和分析
先将原始音频文件读入,
[audio0,Fs,nbits]=wavread('C:
\Users\Administrator\Desktop\signal\buzz.wav');%按路径读取音频存入audio0变量,并用Fs变量记录采样率,nbits变量记录采样位宽。
其中,
Fs=11025#采样率为11025Hz
nbits=32#采样带为32
p0=audioplayer(audio0,Fs);%将audio0载入音频播放器
play(p0);%并进行播放
subplot(2,1,1);%分屏绘图
plot(audio0);%绘制原始音频时域图,如下图所示
title('时域');%标注题目
[k]=fft(audio0,Fs);%对原始音频进行快速傅立叶变换
subplot(2,1,2);
plot(abs(k));%绘制原始音频频域图
title('频域');
频域图如图1下图所示
图1原声时域频域图像
此时,在时域中杂乱分布的声音信号变换到频域中将噪声谐波所分布的频域中显得尤为清晰简洁,这样就不难发现干扰信号主要分布在0--1000Hz以内,由于听到的噪声比人声大得多,我们又画出了,声音强度的时域和频域图像,
figure;subplot(2,1,1);
plot(audio0);
plot(20*log10(abs(audio0)/max(abs(audio0))));%绘制原始音频声音强度的频域图
ylabel('分贝/dB');
xlabel('时间/ms');
title('时域');
[k]=fft(audio0,Fs);
subplot(2,1,2);
plot(abs(k));
plot(20*log10(abs(abs(k))/max(abs(abs(k)))));%绘制原始音频声音强度的频域图
ylabel('分贝/dB');
xlabel('频率/Hz');
title('频域');
figure;
subplot(2,1,1);
plot(abs(k));
ylabel('振幅/A');
xlabel('频率/Hz');
set(gca,'XLim',[01000]);
set(gca,'XTick',[0:
20:
1000]);
得到如图2所示的声音强度的时域和频域图像
图2原声声音强度时域频域图像
从频域图中我们仍然发现了四个异常尖峰,再次明显的证实了干扰信号主要分布在0--1000Hz以内;
为了跟清晰地和观察干扰信号的频域分布情况,我们进一步绘制这一范围的图像,进行局部深入研究。
plot(abs(k));%重绘图像
set(gca,'XLim',[01000]);%更改显示范围为0-1000
set(gca,'XTick',[0:
20:
1000]);%更改坐标步长为20
图3噪声局部频域放大图
观察图像可发现,干扰信号的谐波频率为:
220Hz、440Hz、660Hz、880Hz,在放大后发现噪声信号为4个几乎对称的三角波,而非单位冲击,结合以上几个图,我们分析得到干扰信号主要分布在0--1000Hz以内,而人声是大部分分布于大于1000Hz区间的,由此我们想到了对频率具有选择特性的滤波器,且此处需要设计一个高通滤波器,以将位于0--1000Hz以内的噪声滤掉,留下大于1000Hz人声信号。
2.滤波器的设计
由于干扰信号的谐波频率为:
220Hz、440Hz、660Hz、880Hz,而人类说话的频率大概在300-3400Hz,而干扰信号非常大,需要一个滤波器来实现将大约高于1000Hz的信号保留,低于1000Hz的信号滤掉,观察分贝图,发现大部分噪声分布在40dB以内,因此阻带最小衰减不应小于40dB
根据上表显示各种窗函数的参数特点,选择hanning窗滤波,利用其可以使旁瓣互相抵消频域特性,据此可设定合适的参数设计一个hanning窗函数高通滤波器。
fp=1000;fs=900;%通带频率fp,阻带频率fs
wp=2*fp*pi/Fs;ws=2*fs*pi/Fs;%归一化边界频率
wc=(wp+ws)/2/pi;%归一化中心频率
wdp=wp-ws;#过渡带宽
N=ceil(12*pi/wdp);%由窗函数主瓣宽和过渡带宽,求得窗函数最小长度
N=N+mod(N,2);%高通滤波器N必为奇数
HPfir=fir1(N,wc,'high',hanning(N+1));%设计高通hanning窗滤波器HPfir
该滤波器的主要参数为:
通带边界为1000Hz,阻带边界为900Hz,阻带衰减不小于40dB。
接下来在时域和频域直观地展示其滤波特性,再根据滤波效果对其参数做微调,
figure;%新建图像
subplot(2,1,1);
plot(HPfir);%绘制滤波器时域图像
title('滤波器时域');
subplot(2,1,2);
plot(abs(fft(HPfir)));%绘制滤波器频域图像
title('滤波器频域');
得到图4所示的滤波器时域和频域特性图。
图4基于汉宁函数的高通滤波器时域频域图
由图4可见该滤波器的截止频率大约在900Hz--1000Hz之间,完全符合设计的目的,滤波器设计完成之后,对原始音频信号进行滤波处理:
audio1=filter(HPfir,1,audio0);%使用filter函数对原声做一维数字滤波
p1=audioplayer(audio1,Fs);
figure;%新建滤波后的图像
subplot(2,1,1);
plot(audio1);%绘制滤波后的时域图像
title('滤波后时域');
[k0]=fft(audio1,Fs);%对滤波后的信号做快速傅里叶变换
subplot(2,1,2);
plot(abs(k0));%绘制滤波后的频域图像
title('滤波后频域');
此时,我们得到了如图5所示的滤波后的时域频域图像
图5滤波后时域频域图
最后由于处理后的声音信号幅度较小,听不清晰,需要对音频信号进行增幅处理。
audio1=audio1*10;%增幅处理
p1=audioplayer(audio1,Fs);
play(p1);%播放处理后的音频
至此,设计结束,我们获得了去除噪音后较为清晰的、完整的人声信号。
四、源代码
[audio0,Fs,nbits]=wavread('C:
\Users\xufanyun\Desktop\signal\buzz.wav');
p0=audioplayer(audio0,Fs);
subplot(2,1,1);
plot(audio0);
ylabel('振幅/A');
xlabel('时间/ms');
title('时域');
[k]=fft(audio0,Fs);
subplot(2,1,2);
plot(abs(k));
ylabel('振幅/A');
xlabel('频率/Hz');
title('频域');
figure;subplot(2,1,1);
plot(audio0);
plot(20*log10(abs(audio0)/max(abs(audio0))));
ylabel('分贝/dB');
xlabel('时间/ms');
title('时域');
[k]=fft(audio0,Fs);
subplot(2,1,2);
plot(abs(k));
plot(20*log10(abs(abs(k))/max(abs(abs(k)))));
ylabel('分贝/dB');
xlabel('频率/Hz');
title('频域');
figure;
subplot(2,1,1);
plot(abs(k));
ylabel('振幅/A');
xlabel('频率/Hz');
set(gca,'XLim',[01000]);
set(gca,'XTick',[0:
20:
1000]);
fp=1000;fs=900;
wp=2*fp*pi/Fs;ws=2*fs*pi/Fs;
wc=(wp+ws)/2/pi
wdp=wp-ws;
N=ceil(8*pi/wdp)
N=N+mod(N,2);
HPfir=fir1(N,wc,'high',hanning(N+1));
figure;
subplot(2,1,1);
plot(HPfir);
title('滤波器时域');
subplot(2,1,2);
plot(abs(fft(HPfir)));
title('滤波器频域');
audio1=conv(audio0,HPfir);
audio1=filter(HPfir,1,audio0)
p1=audioplayer(audio1,Fs);
figure;
subplot(2,1,1);
plot(audio1);
title('滤波后时域');
[k0]=fft(audio1,Fs);
subplot(2,1,2);
plot(abs(k0));
title('滤波后频域');
xlabel('f(Hz)');
audio1=audio1*10;
p1=audioplayer(audio1,Fs);
wavwrite(audio1,Fs,nbits,'C:
\Users\Administrator\Desktop\signal\buzz2.wav'
五、结论
我们将包含有几个谐波分量的蜂鸣信号干扰了的人声信号读入到MATLAB当中,对读取的音频信号做出其时域图,并用使用fft()函数进行快速傅立叶变换并绘出得到的含有噪声信号的频域图,此时,我们清楚地在频谱图里面看到4个峰值,说明干扰信号的谐波频率为:
220Hz、440Hz、660Hz、880Hz。
于是我们根据所学的采样定理、辛格函数以及汉宁窗函数去除旁瓣噪声信号的特性等信号与系统和数学知识设计了汉宁高通滤波器,将频率高于1000Hz的信号保留,而将低于1000Hz全部截取,再对幅度较小的处理后的信号做增幅处理。
通过信号处理后得到的清晰的内容为:
“这里是,电子科技大学。
”
六、参考文献
[1]Yang,W.Y.等著;郑宝玉等译国外电子与通信教材系列:
《信号与系统(MATLAB版)》电子工业出版社2012;
[2][美]AlanV.Oppenheim,[美]AlanS.Willsky,[美]S.HamidNawab著;刘树棠译国外电子与通信教材系列:
《信号与系统(第二版)》电子工业出版社2014;
[3][美]艾伦·V.奥本海姆(AlanV.Oppenheim),RonaidW.Schafer著;黄建国,刘树棠,张国梅译
国外电子与通信教材系列:
《离散时间信号处理(第3版)[DiscreteTimeSignalProcessing,ThirdEdition]》电子工业出版社2015;
[4]卢特威等著国外电子与通信教材系列·信号处理滤波器设计:
《基于MATLAB和Mathematica的设计方法》电子工业出版社2012;
[5]张德丰等著《MATLAB数值分析(第2版)》机械工业出版社2012;
[6]刘廷良《数字滤波器的MATLAB与FPGA实现(第2版)》电子工业出版社2014
[7]甘俊英,胡异丁《基于MATLAB的信号与系统实验指导》清华大学出版社2007
[8](美)巴克著刘树棠译《信号与系统计算机练习:
利用MATLAB》2000。
[9]基于MATLAB的语音信号滤波尹湘翔蔡雪梅重庆邮电大学2008