转换FFT数据以匹配ComputeSpectrum FFT输出

时间:2011-05-30 01:04:31

标签: flash actionscript-3 audio fft

我习惯使用SoundMixer.computeSpectrum,但我需要从麦克风中即时获取一些数据(我不能将SoundMixer与麦克风一起使用)。

我无法翻译FFT数据(来自this class),如this excellent spectral analysis example所示,以匹配ByteArray的{​​{1}}输出。我的现有代码用于处理从computeSpectrum收到的数据(computeSpectrum设置为FFT)。

感谢任何帮助!

1 个答案:

答案 0 :(得分:2)

在您链接的示例代码中,m_mag向量包含频谱数据本身。如果要修改它以使用旨在与computeSpectrum一起使用的现有代码,则应将此向量中的值写入ByteArray,如下所示:

import flash.utils.ByteArray;

var fftBytes:ByteArray = new ByteArray();
for(var i:uint = 0; i < N/2; i++)
{
    var re:Number = m_tempRe[i];
    var im:Number = m_tempIm[i];
    var mag:Number = re*re + im*im;
    // Old method: write to vector
    // m_mag[i] = Math.sqrt(sample);
    // New method: write to ByteArray
    fftBytes.writeFloat(mag);
}
// microphone is mono, so make a copy to match computeSpectrum's stereo output
fftBytes.writeBytes(fftBytes, 0, fftBytes.length);

然后,您现有的代码可以直接查看fftBytes,而不是调用computeSpectrum。请注意,我们会在ByteArray的末尾再次复制值,以模拟computeSpectrum始终返回立体声数据但麦克风为单声道的事实。您还可以通过调整现有代码来接受单声道数据并查看m_mag向量,而不是将其全部写入ByteArray来获得一点速度。

此外,您可能希望将代码顶部的SAMPLE_RATEN常量分别更改为441009。这将匹配每个通道返回256个值的默认computeSpectrum行为,以44100Hz采样。