使用JavaScript进行FFT分析:如何查找特定频率?

时间:2015-09-25 12:43:00

标签: javascript audio fft audiocontext

我遇到以下问题: 我使用javascript和FFT分析音频数据。我已经可以将FFT数据写入数组:

audioCtx = new AudioContext();
analyser = audioCtx.createAnalyser();
source = audioCtx.createMediaElementSource(audio);
source.connect(analyser);
analyser.connect(audioCtx.destination);
analyser.fftSize = 64;

var frequencyData = new Uint8Array(analyser.frequencyBinCount);

每当我想要新数据时,我都会打电话:

analyser.getByteFrequencyData(frequencyData);

变量" audio"是一个用HTML定义的mp3文件:

<audio id="audio" src="test.mp3"></audio>

到目前为止一切顺利。

我现在的问题是我想检查当前数组&#34; frequencyData&#34;包括特定频率。例如:我在mp3文件中的某处放置一个1000 Hz的信号,如果mp3文件的这一部分当前在数组中,则想要收到通知&#34; frequencyData&#34;。

在第一步中,当mp3文件的重要部分仅包含1000 Hz信号时,它将帮助我解决问题。在第二步中,如果有音乐叠加,我还想找到该部分。

1 个答案:

答案 0 :(得分:1)

frequencyData是一个振幅数组,阵列的每个元素基本上代表一系列频率。每个范围的大小由采样率除以FFT点的数量定义,在您的情况下为64。因此,如果您的采样率为48000且FFT大小为64,那么每个元素的覆盖范围为48000/64 = 750 Hz。这意味着frequencyData[0]是频率0Hz-750Hz,frequencyData[1]是750Hz-1500Hz,依此类推。在该示例中,1kHz音调的存在将被视为第一个箱中的峰值。此外,通过如此小的FFT,您可能会注意到分辨率非常粗糙。如果你想提高频率分辨率,你需要做更大的FFT。