我遇到以下问题: 我使用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信号时,它将帮助我解决问题。在第二步中,如果有音乐叠加,我还想找到该部分。
答案 0 :(得分:1)
frequencyData
是一个振幅数组,阵列的每个元素基本上代表一系列频率。每个范围的大小由采样率除以FFT点的数量定义,在您的情况下为64。因此,如果您的采样率为48000且FFT大小为64,那么每个元素的覆盖范围为48000/64 = 750 Hz。这意味着frequencyData[0]
是频率0Hz-750Hz,frequencyData[1]
是750Hz-1500Hz,依此类推。在该示例中,1kHz音调的存在将被视为第一个箱中的峰值。此外,通过如此小的FFT,您可能会注意到分辨率非常粗糙。如果你想提高频率分辨率,你需要做更大的FFT。