【问题标题】:What FFT descriptors should be used as feature to implement classification or clustering algorithm?应该使用哪些 FFT 描述符作为特征来实现分类或聚类算法?
【发布时间】:2015-02-17 05:37:15
【问题描述】:
我采样了一些地理轨迹进行分析,并计算了空间和时间维度的数据直方图,从而为每个空间元素生成了基于时域的特征。我想执行一个离散的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()

我有几个小问题要问,以确保我完全理解您的建议:

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

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

    我对“位置”和“宽度”的含义有点困惑,“位置”是指功率谱(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()
数字:

如果我错了,请纠正我:

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

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

【问题讨论】:

  • 为什么要对原始数据做FFT?你不能只使用原始功能吗?
  • @AbhimanuKumar 理论上是可以的,但是由于轨迹是用民用GPS设备采样的,无法保证高精度,而且我认为频域的特征比时域的特征更可靠~
  • 实数(非复数值)系列的谱总是对称的,因此您应该忽略 x 的所有结果
  • x==0 处的结果,例如fft(0) 表示直流分量。您应该删除此分量(从所有 y 值中减去平均值(x[]))或忽略 fft(0) 值。
  • @DrKoch 是的,我已经在更新部分完成了这个,我学到了很多东西,谢谢~ :)

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


【解决方案1】:

通常您应该从完整的 FFT 频谱中提取少量“特征”。

首先:使用对数功率规格。 复数和相位在这些情况下毫无用处,因为它们取决于您开始/停止数据采集的位置(以及许多其他事情)

第二:您将看到“噪音级别”,例如大多数值都低于某个阈值,忽略所有这些值。

第三:如果你很幸运,例如您的数据包含一些谐波内容(循环、重复),您会看到一些突出的峰值。

如果有清晰的峰,则更容易检测到噪声:峰之间的所有内容都应视为噪声。

现在您可以搜索两个、三个最大的峰,并将它们的位置和可能的宽度用作“特征”以进行进一步分类。

位置是峰值的 x 值,即“频率”。它说明了您的周期在输入数据中有多“快”。

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

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


编辑

很高兴看到你的一个例子的对数功率谱。

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

它不是一个普通的正弦波,而是一些“有趣”的波形。此类波形在 1*f0、2*f0、3*f0 等处产生峰值。 (因此使用 FFT 进行进一步分析是非常好的主意)

此时,您应该生成多个测量的光谱,并查看是什么构成了类似的测量以及不同的测量有何不同。区分您的测量的“重要”特征是什么?需要注意的事项:

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

如果您最重要的特征是绝对幅度,那么您最好计算输入信号的 RMS(均方根)电平。

如果音高很重要,最好计算输入信号的 ACF(自相关函数)。

不要关注最左边的峰值,它们来自输入中的高频分量,并且往往与本底噪声一样多。

Windows

对于高质量的分析,重要的是在应用 FFT 之前对输入数据应用一个窗口。这减少了输入向量结尾和输入向量开头之间“跳跃”的影响,因为 FFT 将输入视为单个循环。

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

您选择了“矩形窗口”(相当于根本没有窗口,只需开始/停止测量)。这为您的峰提供了出色的精度,现在只有一个样品的宽度。您的旁瓣(主峰左侧和右侧的小峰)为 -21dB,考虑到您的输入数据,这是可以容忍的。在你的情况下,这是一个很好的选择。

汉宁窗是一个单一的余弦波。它使您的峰值略宽,但会降低旁瓣电平。

Hammimg 窗口(余弦波,略高于 0.0)产生更宽的峰值,但将旁瓣抑制 -42 dB。如果您预计主峰之间会有更弱(但很重要)的分量,或者通常如果您有语音、音乐等复杂信号,这是一个不错的选择。


编辑:缩放

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

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

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

【讨论】:

  • 我已经编辑了问题,有几个琐碎的问题希望您能回答,谢谢~
  • 非常感谢您的详尽解释 :) 我现在对使用窗口函数的意义更加清楚了,但我不确定如何确定权重因子以恢复正确的 FFT加窗后的信号幅度水平,您能建议任何经验法则吗?
猜你喜欢
  • 2015-04-18
  • 2015-05-11
  • 2016-07-03
  • 2020-10-02
  • 2015-01-07
  • 2019-11-24
  • 2016-10-14
  • 2015-02-20
  • 2014-11-17
相关资源
最近更新 更多