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

yun*_*una 2 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)
Run Code Online (Sandbox Code Playgroud)

abc*_*bcd 18

说信号中有噪音是非常模糊的,根本不会传达太多信息.一些问题是:

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

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

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

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

一个简单的例子:

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

在此输入图像描述

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

在此输入图像描述

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

编辑

@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')
Run Code Online (Sandbox Code Playgroud)