在matlab中进行FFT,出乎意料的结果

时间:2014-02-06 10:03:21

标签: matlab audio signal-processing fft

我正在玩FFT,似乎无法获得预期的结果。我有一个声音片段,我从一个放在模拟时钟上的麦克风录制。所以它每秒都有声音。

[wave,fs]=wavread('clock.wav');
t=0:1/fs:(length(wave)-1)/fs;
plot(t,wave);
n=length(wave)-1;                                             
f=0:fs/n:fs;
wavefft=abs(fft(wave));
plot(f,wavefft);

这是我正在使用的代码。以下是结果。

我应该在1hz看到一个巨大的峰值,但我不是。

FFT后跟声波。

This is the FFT

And this is the sound wave

3 个答案:

答案 0 :(得分:0)

你看到的是麦克风录制的内容。标准麦克风过滤非常低的频率,即低于20赫兹,声卡也可能过滤低频。

每秒钟打勾并不意味着你会在FFT上看到1Hz的巨大峰值。如果你想在1hz看到那个巨大的峰值,记录一个1Hz的正弦信号。但是,正如我上面所说,小心低频。音响系统测试的常用频率为1000 Hz。

以下是信号clock.wav的缩放时间视图。我们可以看到它由许多谐波组成,我们可以清楚地看到1Hz处的正弦波远远不够。

enter image description here

然后我用低通二阶型butterworth滤波信号,截止频率为100Hz。

请在过滤前以黄色显示黄色,过滤后请以蓝色显示。

Spectrum of the signal Spectrum of the signal after low-pass

所以,我相信你的matlab代码中没有大问题。

答案 1 :(得分:0)

请注意,在时域中,峰值之间会有很多噪音。它似乎很少,但在频域中非常重要。也许噪声主频大约是1000+ Hz。

尝试再次录制,没有时钟滴答声(只有“静音”),并从原始信号中减去...我怀疑它是否会起作用,但你可以试试......

您也可以通过简单的阈值从信号中选择峰值,然后您将保持时钟滴答声。

编辑:另一个建议是在低通滤波器中传递信号,以滤除高频噪声。

答案 2 :(得分:0)

由于您正在寻找声音片段的振幅包络中的低频周期性,而不是音调波形或音高,您可以在应用fft之前尝试平方或取信号的绝对值,然后忽略更高结果中的频率区间。