应该使用哪些FFT描述符作为实现分类或聚类算法的特征?

时间:2014-12-18 12:19:42

标签: machine-learning fft data-mining similarity feature-extraction

我有一些地理轨迹被采样来分析,我计算了空间和时间维度的数据直方图,为每个空间元素产生了一个基于时域的特征。我想执行一个离散的FFT来将基于时域的特征转换为基于频域的特征(我认为可能更强大),然后进行一些分类或聚类算法。

但是我不确定使用什么描述符作为基于频域的特征,因为有信号的振幅频谱,功率谱和相位谱,我已经阅读了一些参考文献,但仍然对其重要性感到困惑。在基于频域的特征向量(欧氏距离?余弦距离?高斯函数?Chi-kernel或其他什么?)上执行学习算法时,应使用什么距离(相似度)函数作为度量?

希望有人给我一些线索或一些我可以参考的材料,谢谢〜

修改

感谢@DrKoch,我选择了一个具有最大L-1范数的空间元素,并在python中绘制了它的log power spectrum,它确实显示了一些突出的峰值,下面是我的代码和数字
import numpy as np
import matplotlib.pyplot as plt
sp = np.fft.fft(signal)
freq = np.fft.fftfreq(signal.shape[-1], d = 1.) # time sloth of histogram is 1 hour
plt.plot(freq, np.log10(np.abs(sp) ** 2))
plt.show()

log power spectrum

我有几个微不足道的问题要求确保我完全理解你的建议:

  • 在你的第二个建议中,你说“忽略所有这些值。”

    你的意思是水平线代表阈值,它下面的所有值应该分配给零值吗?
  • “您可以搜索两个,三个最大的峰值,并使用它们的位置和宽度作为'特征'进行进一步分类。”

    我对“位置”和“宽度”的含义有点困惑,“位置”是指功率谱的对数值(y轴),“宽度”是指频率(x轴)?如果是这样,如何将它们组合在一起作为特征向量并比较“相似频率和类似宽度”的两个特征向量

修改

我将np.fft.fft替换为np.fft.rfft以计算正部分,并绘制功率谱和对数功率谱。

码:
f, axarr = plt.subplot(2, sharex = True)
axarr[0].plot(freq, np.abs(sp) ** 2)
axarr[1].plot(freq, np.log10(np.abs(sp) ** 2))
plt.show()
数字:

power spectrum and log power spectrum 如果我错了,请纠正我:

我认为我应该使用power = np.abs(sp) ** 2power[power < threshold] = 0第一个数字中的最后四个峰值保留下来,因为对数功率谱会减少每个组件之间的差异。然后使用新功率的对数谱作为特征向量来馈送分类器。

我还看到一些参考建议在进行fft之前应用窗函数(例如汉明窗)以避免光谱泄漏。我的原始数据每5~15秒采样一次,我在采样时间上应用了直方图,该方法是否相当于应用窗口函数,还是需要将其应用于直方图数据?

1 个答案:

答案 0 :(得分:13)

一般来说,你应该只提取少量的特征&#34;超出完整的FFT频谱。

首先:使用日志电源规格。 在这些情况下,复数和阶段是无用的,因为它们取决于您开始/停止数据采集的位置(在许多其他事情中)

第二:你会看到&#34;噪音等级&#34;例如大多数值低于某个阈值,忽略所有这些值。

第三:如果你幸运,例如你的数据有一些谐波含量(周期,重复),你会看到一些突出的峰值。

如果有明显的峰值,则更容易检测到噪音:峰值之间的所有内容都应视为噪音。

现在,您可以搜索两个,三个最大的峰值,并使用它们的位置和可能的宽度作为&#34;功能&#34;进一步分类。

位置是峰值的x值,即频率&#39;。它说的是&#34;快速&#34;你的周期在输入数据中。

如果您的周期在测量间隔期间不具有恒定频率(或者您在计算FFT之前使用窗口),则峰值将比一个区域更宽。所以这个峰值的宽度说明了“稳定性”。你的周期。

基于此:如果两个模式的最大峰值具有相似的频率和相似的宽度,则两种模式相似,等等。

<小时/> 的修改

非常期待看到你的一个例子的对数功率谱。

现在很明显,您的输入包含单个谐波(周期性,振荡)分量,其频率(重复率,周期持续时间)约为f0 = 0.04。 (这是相对频率,与你的采样频率相对应,是个别测量点之间时间的倒数)

它不是一个普通的正弦波,而是一些有趣的&#34;波形。这种波形在1 * f0,2 * f0,3 * f0处产生峰值,依此类推。 (因此,使用FFT进行进一步分析,结果非常好)

此时,您应该生成多个测量的光谱,并查看进行类似测量的内容以及不同测量的差异。什么是重要的&#34;区分你的mesurements的功能?想要留意:

  • 绝对振幅:突出(最左边,最高)峰值的高度。
  • 间距(主循环速率,变化速度):这是第一个峰值的位置,连续峰值之间的距离。
  • 精确波形:前几个峰的相对振幅。

如果你最重要的特征是绝对振幅,你可以通过计算输入信号的RMS(均方根)水平来获得更好的效果。

如果音高很重要,那么通过计算输入信号的ACF(自相关函数)可以获得更好的效果。

不要专注于最左边的峰值,这些峰值来自输入中的高频成分,并且往往会与本底噪声一样多。

<强>窗

对于高质量分析,在应用FFT之前将窗口应用于输入数据是重要的。这减少了&#34;跳跃&#34;在输入矢量的结尾和输入矢量的开头之间,因为FFT将输入视为单个周期。

有几个流行的窗口标记了不可避免的权衡的不同选择:单峰的精确度与旁瓣的水平:

你选择了一个&#34;矩形窗口&#34; (相当于没有窗口,只需启动/停止测量)。这为您的峰提供了出色的精确度,现在只有一个样本的宽度。您的旁瓣(主峰的左侧和右侧的小峰值)为-21dB,根据您的输入数据非常容忍。在您的情况下,这是一个很好的选择。

Hanning窗口是单余弦波。它使你的峰值略宽,但会降低旁瓣水平。

Hammimg-Window(余弦波,略高于0.0)产生更宽的峰值,但抑制了-42 dB的旁瓣。如果您希望主峰之间存在更多弱(但重要)组件,或者通常情况下如果您有语音,音乐等复杂信号,这是一个不错的选择。

<小时/> 修改:缩放

正确缩放频谱是一件复杂的事情,因为FFT线的值取决于采样率,FFT的长度,窗口,甚至FFT算法的实现细节(存在几种不同的公认惯例)

毕竟,FFT应该显示潜在的能量守恒。输入信号的RMS应与频谱的RMS(能量)相同。

另一方面:如果用于分类,则足以维持相对振幅。只要上述参数不变,结果就可以用于分类而无需进一步缩放。