您好,欢迎访问三七文档
当前位置:首页 > 建筑/环境 > 设计及方案 > 去除干扰蜂鸣音-信号与系统课程设计
一、课程设计题目去除干扰蜂鸣音1.目的:掌握信号时频域分析方法,正确理解采样定理,准确理解滤波器的概念。2.内容:提供一个包含某人说话语音片段的声音文件,但该语音信号被一个包含有几个谐波分量的蜂鸣信号干扰了。用Matlab的wavread命令读取该声音文件。注意,该命令可以同时得到声音文件的采样率和采样位宽,请查阅Matlab的帮助文件。(1)用快速傅立叶变换(FFT)计算并画出声音信号的频谱,列写出蜂鸣信号的谐波频率。(2)思考如何将这些蜂鸣音去除?将去除了蜂鸣音的语音片段播放出来,仔细聆听并写下语音片段中人物所说的话。注意:由于只能播放实信号,因此记得提取信号的实部。Matlab命令:wavread,wavplay,fft,fftshift,fir1,filter,plot,figure.二、设计思路用waveread()函数读取音频和其采样率和采样位宽,对读取的音频信号使用fft()函数进行快速傅立叶变换并绘出得到的频谱。观察频谱分析噪声(蜂鸣信号)的谐波频率分布,选择合适的滤波模式将噪声信号的谐波滤去,便可以得到去除噪声后的人声。设计滤波器的频域特性便成了除去噪声并留下原声的关键,我们注意到所学的采样定理以及一维sinc函数(辛格函数)xxxSinc)sin()(,然而汉宁窗可以看作是3个矩形时间窗的频谱之和,或者说是3个)(xSinc型函数之和,而括号中的两项相对于第一个谱窗向左、右各移动了π/T,从而使旁瓣互相抵消,消去高频干扰和漏能。它适用于非周期性的连续信号。利用它的选择特性使用fir1()建立一个汉宁窗函数,并用filter()函数进行滤波,去除噪声部分。最后用play()函数播放音频检查效果。三、设计过程1.音频的读取和分析先将原始音频文件读入,[audio0,Fs,nbits]=wavread('C:\Users\Administrator\Desktop\signal\buzz.wav');%按路径读取音频存入audio0变量,并用Fs变量记录采样率,nbits变量记录采样位宽。其中,Fs=11025#采样率为11025Hznbits=32#采样带为32p0=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-1000set(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,阻带频率fswp=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/piwdp=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全部截取,再对幅度较小的处理后的信号做增幅处理。通过信号处理后得到的清晰的内容为:“这里是,电子科技大学。”六、参考文献
本文标题:去除干扰蜂鸣音-信号与系统课程设计
链接地址:https://www.777doc.com/doc-6024155 .html