在凌乱的FFT中找到相关的峰值

时间:2011-04-15 03:30:02

标签: filtering signal-processing fft max

我的FFT输出如下所示:

messy fft

523 Hz是最大值。然而,作为一个混乱的FFT,在大峰附近有许多小峰。然而,它们是无关紧要的,而所示的峰则不是。是否可以使用任何算法来提取此FFT的最大值; I.E.,不仅仅是在“真正的”峰值附近出现的随机峰值?也许我可以将某种滤波器应用于此FFT输出?

编辑:这个背景是我试图采取一击声音样本(就像有人按下钢琴上的一个键)并提取最响亮的部分。在下图中,2000 Hz以上的峰值很重要,因为它们是给定声音的离散部分(恰好是一种钟声)。然而,在523附近分散的峰似乎只是人工制品,我想忽略它们。

4 个答案:

答案 0 :(得分:1)

如果峰值很宽,则可能表明峰值频率被调制(AM,FM或两者),或者实际上是几个谱峰的复合,它们各自可能被调制。

例如,钢琴音符可能是锤子击打3弦的结果,这些琴弦的调音频率只有很小的一小部分,并且它们都能调制,因为它们通过钢琴架在琴弦之间交换能量。随着拔除形状失真平滑和衰减,吉他弦可以改变频率。钟声在被击中后会改变形状,这可以调节它们的频谱。等

如果声音本身“混乱”,那么在应用任何类型的平滑或边带抑制滤波器之前,您需要对“实际”峰值的定义有一个很好的定义。例如所有这些“混乱”可能是使铃声听起来像真正的铃声而不是电子正弦波发生器的一部分。

答案 1 :(得分:0)

尝试使用矩形脉冲(pulse = ones(1:20)/20;)对FFT进行卷积(将其视为信号)。这可能会消除其中一些。您的最大值将被移动10个频率区间到右侧,以便将其考虑在内。你基本上会整合你的信号。在Pan-Tompkins算法中使用类似的技术进行心跳识别。

答案 2 :(得分:0)

我曾经遇到过类似的问题,并选择使用savitsky-golay滤波器来平滑频谱数据。我可以获得一些重要的峰值,并且它与整体光谱没有太大的差别。 但是我对hotpaw2警告你的问题有一个问题,我已经失去了重要的特征以及失去的“混乱”,所以我真的建议你听到他。但是,如果你认为你不会有这个问题,我认为savitsky-golay可以提供帮助。

答案 3 :(得分:0)

存在用于创建时域数据的频域表示的非FFT方法,其对于噪声数据集(例如Max-ent重构)更好。

对于有噪声的时间序列数据,最大重建将能够非常有效地区分真实峰值和噪声(不添加任何伪像或其他修改来抑制噪声)。

Max ent的工作原理是“猜测”时域光谱的FFT,然后进行IFT,并迭代地将结果与“实际”时间序列数据进行比较。 maxent的最终输出是频域频谱(如上所示)。

java中的实现我相信1-d光谱,但我从未使用过。