从音频信号中删除噪声



下面的人是我的代码。我想从我自己使用随机函数中添加的音频信号中删除噪声。以下代码以某种方式消除了噪音,但我听不到声音仍然太吵了。我还想为此代码添加音频文件,但是在发布问题时我没有找到任何选项,因此您可以添加任何两个通道.wav声音文件。任何评论或提示都会有所帮助。

close all
clear 
clc 

[x,fs] = audioread('cello.wav');             
whos x;                                         
 pOrig = audioplayer(x,fs);                %Signal Play
 pOrig.play;
N = size(x,1);                            
figure;
subplot(2,1,1);
stem(1:N, x(:,1));
title('Left Channel of Origional signal');
subplot(2,1,2);
stem(1:N, x(:,2));
title('Right Channel of origional signal');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 df = fs/N;
 w = (-(N/2):(N/2)-1)*df;
 y1= fft(x(:,1),N)/N;
 y2 = fftshift(y1);
 figure;
 plot(w,abs(y2));
title('Fast Fourier Transform of Origional Signal')
   %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
pause
 y=x;
 y = y + randn(size(y));
 pOrig = audioplayer(y,fs);
 pOrig.play;
figure;
subplot(2,1,1);
stem(1:N, y(:,1));
title('Left Channel with Noise');  
subplot(2,1,2);
stem(1:N, y(:,2));
title('Right Channel with Noise');                     


 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 df = fs/N;
 w = (-(N/2):(N/2)-1)*df;
 y1= fft(y(:,1),N)/N;
 y2 = fftshift(y1);
 figure;
 plot(w,abs(y2));
 title('Fast Fourier Transform of Noisy Signal')
 pause  
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% filter design 
 n = 10;
beginFreq = 100 / (fs/2);
endFreq =  2000  / (fs/2);
%[b,a] = butter(n,  endFreq, 'low');
%fout = filter(b,a,y);                         % input y(noisy signal)
[b,a] = butter(n,  endFreq, 'low');
fout = filter(b,a,y);                         % input y(noisy signal)

figure;
subplot(2,1,1);
stem(1:N, fout(:,1));
title('Left channel after filtering');  
 subplot(2,1,2);
 stem(1:N, fout(:,2));
 title(' Right channel after filtering');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%plot(fout); 
 df = fs/N;
 w = (-(N/2):(N/2)-1)*df;
 y1= fft(fout(:,1),N)/N; 
 y2 = fftshift(y1);
 figure;
 plot(w,abs(y2));
title('Fast Fourier Transform  after filtering');
 pOrig = audioplayer(fout,fs);
 pOrig.play;

您正在使用 randn((函数添加噪声,从而产生高斯噪声,即白色噪声。白噪声在频谱上具有恒定的功率,这意味着您添加0至20kHz的噪声(仅考虑音频频谱(。

您的过滤器是0.1-2 kHz之间的带通滤波器,因此根据我上面指出的内容,在这些频带中您仍然具有噪声组件。从理论上讲,不可能过滤所有噪声组件,但是您可能需要检查Wiener过滤器以获得更好的结果。实际上,如果您知道高斯噪声参数,这是最佳过滤器,这只是噪声的差异。

如果您想查看一个示例来消除所有噪音,则可以在原始信号中添加带外噪声。通过RAND((生成随机序列并使用过滤器使其限制序列,这是可能的。例如,用3-10kHz带通滤波器过滤生成的噪声序列,然后添加到原始音频序列中。最后,在脚本中应用相同的黄油过滤器,以查看所有噪声已被删除。

最新更新