问题描述
问题:- 我必须计算时间序列数据的 FFT。
什么是时间序列数据? 我有一个振动传感器,它为我提供 x 和 y 坐标中的位移数据。
有什么问题?我找不到合适的库,虽然我找到了一些,但我不知道它是否工作正常。 特 据我所知,我们需要采样率和FFTsize(元素数)来计算FFT
我使用了图书馆 https://www.npmjs.com/package/fft-js 其中我传递了一个一维数组,它返回一个二维数组,其中包含一些正值和一些负值。
我的问题
- 据我所知,它如何在没有采样率的情况下计算 FFT
- 为了计算 FFT,数据频率是否需要保持恒定,就像理想情况下我每秒有 170 个数据,但有时如果下降为 165 和 160
- 有哪些方法可以验证我的 fft
Ps:- 我正在尝试实时绘制 fft
非常感谢帮助或资源,因为我在 javascript 中找不到任何 fft 资源
解决方法
检查 fft-js implementation 我发现它使用的是基本的 DIT(时间抽取)基数 2 算法。此外,查看他们对 complex arithmetic 的实现,我看到它使用长度为 2 的数组来表示复数。
FFT 与采样率无关,但结果的解释取决于采样率。位于 k
位置的 FFT bin 具有频率 min(k * N,N - k*N) * Fs / N
,其中 Fs 是采样频率。
FFT 假设块内的频率恒定,如果采样率变化但所有样本的采样周期相同,那么您只需更改公式中的 Fs
。如果采样率随机变化,那么您将在估计中添加一些噪音。如果变化是因为您无法处理尽可能多的样本,则最好降低样本频率以确保样本以恒定速率出现。
假设您选择使用大小为 2**7 = 128
的 fft,那么您的频率将为 freq(k) = min(k / Fs,(128 - k) / 128
并且频率 k 的能量将由 X[k][0]**2 + X[k][1]**2 + X[N-k][0]**2 + X[N-k][1]**2
给出,您可能想要以对数标度为 k=1:63
绘制此能量。
如果要在轴 x
和 y
上分离振动,请分别对每个方向上的振动分量进行两次 FFT。
如果您在浏览器中,您可以使用 analyzer node,用于音频分析,但可以满足您的需求。在我们的例子中,您需要将数据放入 audio buffer source node,然后连接到分析仪。
一些在线演示(有音频,但对你的振动的分析是一样的)
https://p5js.org/examples/sound-frequency-spectrum.html
我最喜欢的 https://musiclab.chromeexperiments.com/Spectrogram/ 您可以在页面底部看到一些预先录制的样本,您可以使用麦克风,也可以使用鼠标绘制将要播放的内容。