如何在node.js中进行FFT?

时间:2017-07-30 07:07:02

标签: 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的大小意味着什么)?

1 个答案:

答案 0 :(得分:1)

Parseval定理。全FFT输出数组的平方和将等于所有输入数的平方和。那么也许你的输入大于4000?也许在-32768到32767的范围内?