我正在使用机器学习进行时间序列分类。我正在尝试从幅度谱中提取特征。
我目前担心的是我无法提前知道信号的长度。这是一个示例信号观察,对应于大约 2 秒的数据收集:
我没有信号长度的上限,尽管超过 1,000 次观察通常表明我有异常值。
我的方法是采用输入信号然后从它的 N 点 DFT 中找到单边幅度谱:
- )
鉴于我的采样率约为,我想我会将单边幅度谱内插到 51 个点。(PS: 我这里写错了,请看下面的说明。)
这个过程给了我一个 192 点的 DFT 和一个具有 97 个系数的单边幅度谱,我将其插值到 51(线性插值)。为了比较,这是原始幅度谱及其插值。水平轴以赫兹为单位。
它们看起来并没有太大的不同。但是,我从频谱中获取的特征是短期能量、方差、标准偏差、峰值数量和第一个峰值的位置,以及特定系数的大小(我说得对吗?在那些垃圾箱里?)。因此,寻找这 51 个系数的不同方法可能会导致完全不同的结果。
另外,我的印象是对幅度谱进行插值是完全错误的。看图,似乎很明显,插值让我在 0-5 Hz 附近的范围内损失了很多能量。
为了披露,我在写我的时候确实检查了 Stack Overflow 建议的每个相关问题。与我最相似的问题似乎是“如何组合我的 DFT 的箱”,但是我相信我还有几个额外的疑问——首先,我渴望批评我是否采取了正确的方法傅里叶系数的绝对值,然后尝试减少箱的数量,或者我是否应该将我的信号零填充到 50 倍数的观察值(从而希望避免泄漏?我不知道,我真的很难理解这个主题,我可能在这里遇到了几个误解;任何更正都会受到重视)
PS:我的假设是错误的。我错误地假设 Matlab 的interp1
函数在一组查询点上进行插值,并对中间的值进行平均。它实际上在做的是下采样。
PPS:这是降低系数的代码:
qp = (0:50) * (numel(X) - 1) / (50) + 1;
X50 = interp1(X, qp);