当 N 未知时,如何在 N 点 DFT 之后获取固定数量的 bin?

信息处理 离散信号 自由度 机器学习
2022-02-01 14:54:15

我正在使用机器学习进行时间序列分类。我正在尝试从幅度谱中提取特征。

我目前担心的是我无法提前知道信号的长度。这是一个示例信号N=192观察,对应于大约 2 秒的数据收集:

N=192 的采样信号

我没有信号长度的上限,尽管超过 1,000 次观察通常表明我有异常值。

我的方法是采用输入信号x=(x1,x2,,xN)然后从它的 N 点 DFT 中找到单边幅度谱:

  • F(x)=(X1,X2,,XN)
  • A(X)=(|X1|,|X2|,,|XN2+1|)

鉴于我的采样率约为fs=100Hz,我想我会将单边幅度谱内插到 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);
2个回答

当足够的统计量不明显时,特征向量的选择是一门艺术。如果您想要与等效固定 DFT 的带宽相对应的 bin。

我建议您在持续时间变化的信号上执行 STFT,然后在连续帧上平均幅度,或者如果您想避免平方根,则幅度平方。它将保存“能量”。这确实通过添加窗口和重叠等问题使事情复杂化,但有时需要调整更多参数提供了灵活性。

查看特征集选择的一种方法是:

PM Baggenstoss,“分类中特定于类的特征集”,载于 IEEE Transactions on Signal Processing,vol。47,没有。12, pp. 3428-3432, Dec 1999.doi: 10.1109/78.806092 关键词:{概率;信号分类;统计分析;类特定特征集;维数问题;似然比;概率分类器;信号分类;充分统计;贝叶斯方法;信号分析;状态估计;统计;训练数据;白噪声},网址: http://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=806092&isnumber= 17473

您快到了,您只需要在从插值函数计算离散数据值时保持一致。假设你有一个连续函数X(f). 假设您想要获得离散近似值N垃圾箱,和f从运行0fmax. 然后

Xk=1Δf(k1/2)Δf(k+1/2)ΔfX(f)df
你真的没有X(f)当然。但是您可以通过在插值函数上使用 Matlab 的数值积分例程之一来近似 RHS 上的积分。

这与你所做的有什么不同?好吧,正如您所提到的,在 1-2 Hz 峰值附近,只需采用下采样的 DFT 值就会错过峰值。对整个 bin 宽度进行积分确实包括这部分信号,因此您将获得较低但较宽的峰值。

最后,检查您的总信号能量。Parseval 定理指出傅里叶变换保留了总信号能量。考虑信号点xii=0N1, 并将 DFT 写为Xi. 然后

i=0N1|xi|2=1Ni=0N1|Xi|2
因此,任何一致的重采样过程都必须保持该方程的 RHS 不变。简单的插值和下采样肯定不能完成这项工作,但我建议的程序应该。