javascript - 如何在node.js中进行FFT?

标签 javascript node.js fft

我目前正在尝试在node.js 中进行FFT,但遇到了很多困难。我浏览并尝试了三个不同的库,但它们中的每一个充其量都没有很好的文档记录,这使得它变得非常困难。

我有一个 Float32Array,它被下采样到 44100/16,通过 websocket 发送到我的服务器,所以我有原始音频数据。下一部分是我需要具有任何 FFT node.js 包经验的人员。

我正在尝试获取频率和幅度数据,我不太关心相位,但无论如何......如何获得 npm FFT 包来为我提供有用的数据?

这就是我现在得到的,它给我的输出绝对没有意义。它没有向我显示它所获得的正弦音。

var fft = require('fft-js').fft,
    fftUtil = require('fft-js').util;

const WebSocket = require('ws');

const wss =  new WebSocket.Server({ port: 4321 });


var buffers = [];
var totalBufferSize = 0;

wss.on('connection', function connection(ws) {
    ws.on('message', function incoming(message) {


        buffers.push(message);
        totalBufferSize += message.length;




        if(totalBufferSize > 6000) {
            var signal = new Float32Array(totalBufferSize);

            var offset = 0;

            for(var i = 0; i < buffers.length; i++) {
                signal.set(buffers[i], offset)
                offset += buffers[i].length;
            }

            buffers = [];
            totalBufferSize = 0;


            // console.log(signal);

            var phasors = fft(signal);

            var frequencies = fftUtil.fftFreq(phasors, 2756), // Sample rate and coef is just used for length, and frequency step
                magnitudes = fftUtil.fftMag(phasors); 

            for(var i = 1; i < magnitudes.length; i++) {
                if(magnitudes[i] > 4000) {
                    console.log(frequencies[i], magnitudes[i]);
                }
            }
        }

    });

    ws.send('something');
});

我得到的输出是所有物体的震级都超过 4000,而且……标准震级应该是多少,我不知道。我的猜测是 0,或者像 1.5 这样的声音......老实说,我完全一无所知,没有人知道这个包或一些好的文档的链接。

无论如何,我怎样才能将我的音频数据转换成一些频率信息,这些信息意味着什么(例如,4000 的幅度意味着什么)?

最佳答案

帕塞瓦尔定理。完整 FFT 输出数组的平方和将等于所有输入数字的平方和。那么也许你的输入大于 4000?也许在 -32768 到 32767 的范围内?

关于javascript - 如何在node.js中进行FFT?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45397285/

相关文章:

javascript - 在 uiwebview 中使用 javascript 将样式应用于文本范围

javascript - 仅从 firebase 导入 auth 和 firestore

javascript - 使用 Node.js 编辑 mysql 中的现有行

javascript - 无法使用带有 javascript 和 jest 框架的 selenium 来关闭自动化中的 cdk 下拉列表

javascript - 是否有可能访问函数的闭包?

json - Node Postgres 查询 json

node.js - 如何在 Node 和 Express 中从 API 调用中获取多个参数

python-3.x - np.fft.fft 无法正常工作

iOS FFT Accerelate.framework 在回放时绘制频谱

python - 如何在numpy中向量化傅立叶级数部分和