Android 2.3 Visualizer - Проблемы с пониманием getFft () - PullRequest
15 голосов
/ 18 января 2011

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

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

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

"Возвращает захват частоты воспроизводимого в данный момент аудиоконтента. Захват представляет собой БПФ 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 к 0 должен выглядеть так же, как 0 к N. Но когда я смотрю на эти амплитуды, я не вижу зеркальных данных.Похоже, Google указывает, что вывод должен быть от 0 до N по обе стороны спектра.Так что я должен быть в состоянии взять данные из (output.length-1) / 2 в output.length-1.Отрицательные амплитуды движутся быстрее, чем частота дискретизации, а положительные амплитуды движутся медленнее, чем частота дискретизации.Я правильно понял?

Ответы [ 2 ]

9 голосов
/ 14 декабря 2011

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

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

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

8 голосов
/ 19 января 2011

Частота на выходе БПФ k образца определяется как:

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

, где

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

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

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

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

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

...