2015-09-25 110 views
0

我遇到以下问题: 我使用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信号时,它将帮助我解决问题。在第二步中,如果有音乐叠加,我还想找到该部分。

回答

1

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

+0

我认为这只是部分真实的!我发现如果FFT大小是64,你会得到32个bin。所以阵列的大小是一半。从这一半的大小只有前半部分是相关的,因为我们听不到20000赫兹以上的频率。唯一我仍然怀念的是数组包含的数据类型。我知道它包含从0到255的数字。但是,这些数字是否指定响度? – Chrisi

+0

响度相比阵列中的另一个数字,当然不是绝对响度! – Chrisi

+0

如果库返回的频率数据只是您指定的FFT大小的一半,那么FFT库返回的频率数据是0Hz到Fs/2之间的频率数据,其中Fs是采样频率。如果输入到FFT功能是真实的(例如音频情况),那么可以从0Hz到Fs/2的频率数据重建全频谱,因此不需要额外的采样。注意频率箱之间的间隔仍然会按照jaket的说法是Fs /(FFT大小)。 – KillaKem