我正在玩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后跟声波。
答案 0 :(得分:0)
你看到的是麦克风录制的内容。标准麦克风过滤非常低的频率,即低于20赫兹,声卡也可能过滤低频。
每秒钟打勾并不意味着你会在FFT上看到1Hz的巨大峰值。如果你想在1hz看到那个巨大的峰值,记录一个1Hz的正弦信号。但是,正如我上面所说,小心低频。音响系统测试的常用频率为1000 Hz。
以下是信号clock.wav的缩放时间视图。我们可以看到它由许多谐波组成,我们可以清楚地看到1Hz处的正弦波远远不够。
然后我用低通二阶型butterworth滤波信号,截止频率为100Hz。
请在过滤前以黄色显示黄色,过滤后请以蓝色显示。
所以,我相信你的matlab代码中没有大问题。
答案 1 :(得分:0)
请注意,在时域中,峰值之间会有很多噪音。它似乎很少,但在频域中非常重要。也许噪声主频大约是1000+ Hz。
尝试再次录制,没有时钟滴答声(只有“静音”),并从原始信号中减去...我怀疑它是否会起作用,但你可以试试......
您也可以通过简单的阈值从信号中选择峰值,然后您将保持时钟滴答声。
编辑:另一个建议是在低通滤波器中传递信号,以滤除高频噪声。
答案 2 :(得分:0)
由于您正在寻找声音片段的振幅包络中的低频周期性,而不是音调波形或音高,您可以在应用fft之前尝试平方或取信号的绝对值,然后忽略更高结果中的频率区间。