如何在MATLAB中使用fft从录制的声音中消除噪音?

时间:2011-05-04 07:16:11

标签: matlab signal-processing fft audio-recording frequency-analysis

我想从录制的声音中消除噪音并让它的fft找到那个声音的基本频率,但我不知道如何消除这些噪音。我正在录制不同高度坠落物体的声音。我想找到录制声音的高度和最大频率之间的关系。

  [y,fs]=wavread('100cmfreefall.wav');

 ch1=y(:,1);
 time=(1/44100)*length(ch1);
t=linspace(0,time,length(ch1));


L=length(ch1);
 NFFT = 2^nextpow2(L); % Next power of 2 from length of y
Y = fft(y,NFFT)/L;
Y1=log10(Y);
figure(1)

f = fs/2*linspace(0,1,NFFT/2+1);
plot(f,2*abs(Y1(1:NFFT/2+1))) ;

[b,a]=butter(10,3000/(44100/2),'high');
Y1=filtfilt(b,a,Y1);

% freqz(b,a)
figure(2)

plot(f,2*abs(Y1(1:NFFT/2+1))) ;

title('Single-Sided Amplitude Spectrum of y(t)');
xlabel('Frequency (Hz)');
ylabel('|Y(f)|')
xlim([0 50000])


% soundsc(ch1(1:100000),44100)

2 个答案:

答案 0 :(得分:18)

说你的信号中有噪音是非常模糊的,并没有传达太多信息。一些问题是:

  • 噪音是高频还是低频?
  • 它是否与信号的频段完全分开,还是混合在一起?
  • 噪音是否遵循统计模型?它可以被描述为一个固定的过程吗?
  • 噪音是另一种确定性干扰信号吗?

您采取的方法肯定取决于上述问题的答案。

然而,根据您描述的实验设置,我的猜测是您的噪音只是背景噪音,在大多数情况下,可以近似为白色。 White noise指的是在所有频率上具有恒定功率的统计噪声模型。

最简单的方法是使用低通滤波器或带通滤波器来仅保留您感兴趣的那些频率(如果您还不知道频率谱,则应快速查看此频率)。在previous answer of mine中,对于使用MATLAB进行过滤的相关问题,我提供了创建低通滤波器和常见陷阱的示例。你可以阅读它,看看它是否对你有帮助。

一个简单的例子:

考虑频率为50 Hz的正弦波,以1000 Hz采样。为此,我添加高斯白噪声,使得SNR为〜-6dB。原始信号和噪声信号可以在下图的顶行中看到(仅显示50个样本)。正如你所看到的,由于所有的结构似乎都被破坏了,所以看起来好像没有希望的嘈杂信号。然而,采用FFT,揭示了埋藏的正弦曲线(显示在底行)

enter image description here

使用48至52 Hz的窄带滤波器滤除噪声信号,为我们提供“清洁”信号。由于噪声,振幅当然会有一些损失。但是,信号最初是从看起来像丢失的原因中检索出来的。

enter image description here

如何进行取决于您的确切应用。但我希望这有助于您了解噪声过滤的一些基础知识。

修改

@Shabnam:已经有近50条评论了,我真的没有看到你付出任何努力去理解,或者至少自己尝试一下。你真的应该学习阅读文档并学习概念并尝试它而不是为每一个错误运行。无论如何,请尝试以下(从您的代码修改)并在评论中显示输出。

[y,fs]=wavread('100cmfreefall.wav');
ch1=y(:,1);
time=(1/fs)*length(ch1);
t=linspace(0,time,length(ch1));
L=length(ch1);
NFFT = 2^nextpow2(L);
f = fs/2*linspace(0,1,NFFT/2+1);

[b,a]=butter(10,3e3/(fs/2),'high'); 
y1=filtfilt(b,a,ch1);

figure(1)
subplot(2,1,1)
Y=fft(ch1,NFFT)/L;
plot(f,log10(abs(Y(1:NFFT/2+1))))
title('unfiltered')

subplot(2,1,2)
Y1=fft(y1,NFFT)/L;
plot(f,log10(abs(Y1(1:NFFT/2+1))))
title('filtered')

答案 1 :(得分:0)

你的问题的答案高度依赖于你所谓的“噪音”的特征 - 它的光谱分布,噪音是否静止,噪音的来源(它是源于环境还是录音链?)

如果噪声是静止的,即其统计特性不随时间变化,您可以尝试仅录制几秒钟(10-15是一个很好的初始猜测),预先形成FFT,然后减去该值。来自测量FFT bin n的FFT bin n中的噪声。

您可以在此处阅读一些背景信息:http://en.wikipedia.org/wiki/Noise_reduction