我遇到以下问题: 我使用JavaScript和FFT分析音频数据。我可以在FFT数据已经写入到一个数组:使用JavaScript进行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);
变量“声音”是在HTML中定义一个MP3文件:
<audio id="audio" src="test.mp3"></audio>
到目前为止好。
我现在的问题是,我想检查当前数组“frequencyData”是否包含特定的频率。例如:我在mp3文件的某处放置一个1000Hz的信号,并且想要获得一个通知,如果这部分mp3文件当前在数组“frequencyData”中。
在第一步中,当mp3文件的重要部分只包含1000 Hz信号时,它将帮助我解决问题。在第二步中,如果有音乐叠加,我还想找到该部分。
我认为这只是部分真实的!我发现如果FFT大小是64,你会得到32个bin。所以阵列的大小是一半。从这一半的大小只有前半部分是相关的,因为我们听不到20000赫兹以上的频率。唯一我仍然怀念的是数组包含的数据类型。我知道它包含从0到255的数字。但是,这些数字是否指定响度? – Chrisi
响度相比阵列中的另一个数字,当然不是绝对响度! – Chrisi
如果库返回的频率数据只是您指定的FFT大小的一半,那么FFT库返回的频率数据是0Hz到Fs/2之间的频率数据,其中Fs是采样频率。如果输入到FFT功能是真实的(例如音频情况),那么可以从0Hz到Fs/2的频率数据重建全频谱,因此不需要额外的采样。注意频率箱之间的间隔仍然会按照jaket的说法是Fs /(FFT大小)。 – KillaKem