我目前正在尝试在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的大小意味着什么)?
答案 0 :(得分:1)
Parseval定理。全FFT输出数组的平方和将等于所有输入数的平方和。那么也许你的输入大于4000?也许在-32768到32767的范围内?