首页 > 解决方案 > 振动数据的 Javascript 中的 FFT 计算

问题描述

问题:- 我必须计算时间序列数据的 FFT。

时间序列数据是什么? 我有一个振动传感器,它给我 x 和 y 坐标的位移数据。

有什么问题?虽然我找到了一些,但我找不到合适的库来工作,但我不知道它是否工作正常。te 据我所知,我们需要采样率FFTsize(元素数)来计算 FFT

我使用了库https://www.npmjs.com/package/fft-js ,在其中我传递了一个一维数组,它返回一个二维数组,其中包含一些正值和一些负值。

我有问题

  1. 据我所知需要采样率,它如何在没有采样率的情况下计算 FFT
  2. 为了计算 FFT,数据频率是否需要保持不变,因为理想情况下我每秒有 170 个数据,但有时如果下降为 165 和 160
  3. 有什么方法可以验证我的 fft

Ps:-我正在尝试实时绘制fft

非常感谢帮助或资源,因为我在 javascript 中找不到任何 fft 资源

标签: javascriptsignal-processingfftdft

解决方案


检查fft-js 实现,我发现它使用的是基本的 DIT(时间抽取)基数 2 算法。此外,查看他们对复数运算的实现,我发现它使用长度为 2 的数组来表示复数。

FFT 与采样率无关,但结果的解释取决于采样率。位置处的 FFT bink具有频率min(k * N, N - k*N) * Fs / N,其中 Fs 是采样频率。

FFT 假设块内的频率恒定,如果采样率变化但所有样本的采样周期相同,则可以,您只需更改Fs公式中的 。如果采样率随机变化,那么您将在估计中添加一些噪音。如果变化是因为您无法处理所需数量的样本,则最好降低样本频率以确保样本以恒定速率出现。

假设您选择使用大小为 的 fft 2**7 = 128,那么您的频率将是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对数刻度绘制该能量。

如果要分离轴xy的振动,请分别对每个方向的振动分量进行两次 FFT。

如果您在浏览器中,则可以使用分析器节点,用于音频分析,但可以满足您的需要。在我们的例子中,您需要将数据放在音频缓冲区源节点中,然后连接到分析仪。

一些在线演示(带音频,但分析与您的振动相同)

https://p5js.org/examples/sound-frequency-spectrum.html

F音 F音

嘘声 嘘声

我最喜欢的一个 https://musiclab.chromeexperiments.com/Spectrogram/你可以在页面底部看到一些预先录制的样本,你可以使用麦克风,也可以使用鼠标绘制将要播放的东西。

在此处输入图像描述


推荐阅读