Android 2.3 Visualizer - понимание проблем getFft()

Впервые здесь так жаль за любое форматирование.

Поэтому я совершенно новичок в DSP, поэтому у меня есть только очень общее представление о преобразовании Фурье. Я пытаюсь создать приложение визуализатора для Android SDK 9, которое включает класс Visualizer в android.media.audiofx.Visualizer http://developer.android.com/reference/android/media/audiofx/Visualizer.html

javadoc для метода getFft(), который я использую для состояний:

"Возвращает захват частоты в настоящее время воспроизводит аудиоконтент. захват - это БПФ с 8-разрядной величиной. Заметка что размер БПФ составляет половину указанный размер захвата, но оба стороны спектра возвращаются уступая в несколько байтов, равных размер захвата."

Во-первых, что означает "обе стороны спектра"? Как этот результат отличается от стандартного FFT?

Вот пример вывода байтового массива, getFft() получил 124 балла, чтобы сохранить его простым, и я захватил первые 31 бин. Вот величины первых 31 бункера:

{123, -2, -23, -3, 6, -16, 15, -10, -8, -12, 9, -9, 17, -6, -18, -22, -8, 4, -5, -2, 10, -3, -11, 3, -4, -11, -8, 15, 16, 11, -12, 12}

Любая помощь или объяснение будут очень благодарны!

Изменить: Итак, глядя на кучу графиков, похоже, что часть моей проблемы заключается в том, что Google не указывает, какая единица используется. Почти все другие измерения выполняются в МГц, было бы справедливым предположить, что выход FTT также находится в МГц? Есть ли место, где я могу увидеть исходный код класса Visualizer, поэтому, возможно, я смогу понять, что, черт возьми, происходит под капотом?С >

Я пошел вперед и захватил весь вывод getFft()

93, -2, -28, -16, -21, 19, 44, -16, 3, 16, -9, -4, 0, -2, 21, 16, -3, 1, 2, 4, -3, 5, 5, 10, 6, 4, -9, 7, -2, -1, 2, 11, -1, 5, -8, -2, -1, 4, -5, 5, 1, 3, -6, -1, -5, 0, 0, 0, -3, 5, -4, -6, -2, -2, -1, 2, -3, 0, 1, -3, -4, -3, 1, 1, 0, -2, -1, -1, 0, -5, 0, 4, -1, 1, 1, -1, 1, -1, -3, 2, 1, 2, -2, 1, 0, -1, -2, 2, -3, 4, -2, -2, 0, 1, -4, 0, -4, 2, -1, 0, -3, -1, -1, -1, -5, 2, -2, -2, 0, -3, -2, 1, -5, -2, 0, 0, 0, -2, -2, -1, -1, -1, -2, 0, 3, -3, -1, 0

Итак, если я правильно понимаю, мой вывод здесь должен быть от -N до 0 до N. -N to 0 должен выглядеть так же, как от 0 до N. Но когда я смотрю на эти амплитуды, я не вижу никаких зеркальных данные. Google, похоже, указывает, что выход должен быть от 0 до N только по обе стороны от спектра. Поэтому я должен уметь извлекать данные из (output.length-1)/2 в output.length-1. Отрицательные амплитуды движутся быстрее, чем частота дискретизации, и положительные амплитуды движутся медленнее, чем частота дискретизации. Я правильно понял это?

Ответ 1

Частота в выходном образце FFT k определяется по формуле:

Fk = k * Fs / N,    k = 0,1,...,N-1 

где

  • Fs - частота дискретизации ввода временных рядов
  • N - количество выборок, используемых для вычисления FFT

Две стороны спектра относятся к положительной и отрицательной частоте на выходе БПФ. FFT заставляет частотный выход периодическим с периодом Fs. Если вы посмотрите на выход FFT, он охватывает частоты от 0 до Fs. Часто бывает выгодно рассматривать спектр в диапазоне от -0,5 * Fs до 0,5 * Fs, вместо этого сдвигая выход FFT от 0,5 * Fs → Fs до -0,5 * Fs → 0, так как они равны из-за периодичности.

Для вещественных сигналов, подобных тем, которые у вас есть при обработке звука, отрицательный выходной сигнал будет зеркальным отображением положительных частот. Из-за этого часто используется только одна сторона спектра при анализе реальных сигналов.

Другим важным моментом является значение 0,5 * Fs, которое известно как частота Найквиста. Сигнал может точно отображать частоты до частоты Найквиста, а что-либо выше, это будет сфальсифицировано (свернуто) обратно на спектр, вызывающий искажение.

Итак, все, о чем вы должны беспокоиться в целях визуализации, - это выходные образцы FFT, соответствующие диапазону частот от 0 до Fs/2, поскольку они являются значимыми выборками для реального сигнала с частотой дискретизации Fs.

Ответ 2

В случае, если это кому-то помогает, я создал Visualizer, который выводит результат из MediaPlayer и отображает визуализацию. Он работает как с нормальной формой сигнала, так и с данными FFT:

https://github.com/felixpalmer/android-visualizer

Он включает в себя код для преобразования вывода getFft() в нечто визуально значимое.