1、2014 数字信号处理课程设计学号姓名分工2012019040026朱清码代码2012019040030任慧君分析题目2012019010030杨倩然负责撰写报告题目 1:设计音频降噪算法,并用 MATLAB 仿真实现。1)读入一段音频后添加噪声,必须包括两种不同的噪声,信噪比: 0dB10dB;2)分别采用滑动平均滤波器,直接频域滤波,以及谱分析后设计滤波器滤波三种方法实现,并对比效果。 3)给出各种方案的设计依据、代码、频响曲线,以及输入输出对比图。1)读入音频并添加噪声因为我使用的版本是matlab 2014,所以很多函数可能跟老师讲的和旧版的DSP 书不太一样,不过可以在2012 及其
2、以上的版本运行(我都试过)。我们选择一个时长较短的音频(梁静茹的love is everything)使用函数audioread读入。使用awgn在信号中插入高斯白噪声。同时,为了让效果明显应让信噪比尽量大一点,故使用信噪比为8DB和9DB的两种噪声。相关代码:%读入语音信号sound,fs = audioread(music.wav); sound,fs = audioread(music.wav);%play song;song = audioplayer(y, Fs); play(song);N = length(sound); df = fs/N;n = 1:N/2;fx = df*(
3、n-1);sound1 = awgn(sound,8,measured);noise = awgn(sound1,9,measured); audiowrite(noise.wav,noise,fs);%add two noises;%play noise;%noisysong = audioplayer(noise, fs);%play(noisysong); fy = fft(noise);soundfft = fft(sound); fy = fft(noise); figure(1);subplot(2,1,1),plot(fx,abs(soundfft(n),title(原始音频的频
4、域图像),xlabel( 频 率 (Hz),ylabel( 幅 度 ); subplot(2,1,2),plot(fx,abs(fy(n),title(加噪后音频的频域图像),xlabel(频率(Hz),ylabel(幅度);下图为原始音频与加噪后的声音音频的频域图像对比:原始音频的频域图像10000度5000幅0010002000300040005000600070008000频率(Hz)加噪后音频的频域图像10000度5000幅0010002000300040005000600070008000频率(Hz)2) 滑动滤波器设计从教材上我们可以知道滑动平均滤波器的表达式ynM -1xnl 0
5、l / M 经过多次试验发现三阶滑动平均滤波器在此效果最好故我们使用三阶滑动平均滤波器。相关代码:% moving-average filtermovingnoise = zeros(length(noise)-2,1); for i = 3:N,movingnoise(i-2) = (noise(i)+noise(i-1)+noise(i-2)/3;endnoisey = fft(movingnoise);n1 = 1:length(movingnoise)/2;noisex = n1*(fs/length(movingnoise); figure(2),subplot(2,1,1),plo
6、t(fx,abs(fy(n),title(噪声音频的频域图像 ),xlabel( 频 率 (Hz),ylabel( 幅 度 ); subplot(2,1,2),plot(noisex,abs(noisey(n1),title(三阶滑动平均后音频的频域图像),xlabel(频率(Hz),ylabel(幅度);% play the noisysong after moving-average filter% dnoisysong = audioplayer(dnoise);% play(dnoisysong);经过三阶滑动滤波器之后的输入输出对比图:噪声音频的频域图像10000度5000幅0010
7、002000300040005000600070008000频率(Hz)三阶滑动平均后音频的频域图像10000度5000幅0010002000300040005000600070008000频率(Hz)3) 直接频域滤波直接频域滤波即是使用理想低通滤波器,我们将截止频率设定为4000HZ,用在频域矩阵上直接取0 的方法实现。再通过IFFT 反变换得到时域。相关代码:% directly filterdirectffty = zeros(size(fy); for i = 1:length(noise),if(fx(i)4000), directffty(i) = fy(i); elsebrea
8、k; endend figure(3),subplot(2,1,1),plot(fx,abs(fy(n),title(噪声音频的频域图像),xlabel( 频 率 (Hz),ylabel( 幅 度 ); subplot(2,1,2),plot(fx,abs(directffty(n),title(直接频域滤波后音频的频域图像),xlabel(频率(Hz),ylabel(幅度);% play the noisysong after directly filted% directy = ifft(directffty);% audiodirecty = audioplayer(directy,fs
9、);% play(audiodirecty);使用直接频域滤波后音频频域的输入输出对比图:噪声音频的频域图像10000度5000幅0010002000300040005000600070008000频率(Hz)直接频域滤波后音频的频域图像10000度5000幅0010002000300040005000600070008000频率(Hz)4) 谱分析后设计滤波器滤波我们使用 MATLAB 工具 fdatool 来设计滤波器。框图如下:用 FDATOOL 设 计的 滤 波器 得 到的 参数 在 代码 开始 , 10 阶 的 KAISER 滤 波器,FS=16000,FC=4000;相关代码:%
10、design a fir window filter using fdatoolNum = -0.0298-0.03490.04180.0516-0.0669-0.09430.15790.47460.47460.1579-0.0943-0.06690.05160.0418-0.0349-0.0298;a = 1;filtednoise = filter(Num,a,noise); fftfilt = fft(filtednoise); figure(4),subplot(2,1,1),plot(fx,abs(fy(n),title(噪声音频的频域图像 ),xlabel( 频 率 (Hz),yl
11、abel( 幅 度 ); subplot(2,1,2),plot(fx,abs(fftfilt(n),title(构造滤波器滤波后音频的频域图像),xlabel(频率(Hz),ylabel(幅度);% play the audio after fir window% filtaudio = audioplayer(filtednoise,fs);% play (filtaudio)使用构造滤波器滤波后的音频频域对比图:噪声音频的频域图像10000度5000幅0010002000300040005000600070008000频率(Hz)构造滤波器滤波后音频的频域图像10000度5000幅0010002000300040005000600070008000频率(Hz)总结:我们可以通过函数 audioplay()生成播放对象再使用 play()来播放滤波后的信号从听觉上进行对比。(R2014A)1. 加入噪声后的音频播放起来会明显听到噪音。2. 滑动平均滤波器对于整个频域上的噪声都有过滤作用,但是若阶数过高容易使信号失真。3. 直接频域滤波能够使截止频率以上的噪声频率完美过滤,但是对截止频率以下的噪声频率无能为力,并且在实际中难以实现。4. FDATOOL 设计滤波器滤波与直接频域滤波有同样的缺点,但是是实际能够实现的,工程可用的。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1