1

我有以下问题:我使用 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>

到目前为止,一切都很好。

我现在的问题是我想检查当前数组“frequencyData”是否包含特定频率。例如:我在 mp3 文件中的某处放置了一个 1000 Hz 信号,并且希望在 mp3 文件的这部分当前位于数组“frequencyData”中时得到通知。

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

4

1 回答 1

3

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

于 2015-09-26T11:31:45.943 回答