Перевести данные FFT, чтобы соответствовать выводу FFT ComputeSpectrum - PullRequest
3 голосов
/ 30 мая 2011

Я привык использовать SoundMixer.computeSpectrum, но мне нужно получить некоторые данные на лету с микрофона (и я не могу использовать SoundMixer с микрофоном).

I 'У меня возникли проблемы с переводом данных FFT (из этого класса ), как показано в этого превосходного примера спектрального анализа , для соответствия ByteArray выходных данных computeSpectrum.Мой существующий код создан для обработки данных, полученных с computeSpectrumFFT, установленным на true).

Любая помощь приветствуется!

1 Ответ

2 голосов
/ 08 августа 2011

В примере кода, который вы связали, вектор 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_RATE и N в верхней части кода на 44100 и 9 соответственно. Это будет соответствовать стандартному поведению computeSpectrum возврата 256 значений на канал с частотой дискретизации 44100 Гц.

...