我目前正在尝试在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/