У меня есть какой-то вопрос о БПФ (на самом деле я считаю, что это больше о БПФ-выводе Android от Visualizer.getFFT()).
Я создал музыкальный проигрыватель с собственной функцией библиотеки для Android, включая множество вещей (например, жанры, динамические плейлисты и визуализации). В настоящее время у меня есть некоторые проблемы с визуализацией, которую я создаю, когда дело доходит до рендеринга спектра текущего аудиопотока.
Я уже прочитал следующие вопросы (и ответы), чтобы получить представление о БПФ Android:
Какой вывод я должен получить от getFft?
Android 2.3 Visualizer - Проблемы с пониманием getFft()
Теперь к моей проблеме: спектр, который я получаю из коэффициентов getFFT, кажется несколько «странным». Я заметил, что спектр, который я отображаю, кажется, отображает много «шума» при воспроизведении песни, поэтому я попытался использовать несколько тестовых звуков. Одним из них является простой звук 8 кГц, который должен давать только один пик на графике. К сожалению, результат выглядит следующим образом:
http://img4.imageshack.us/img4/4181/spectrum8khz.png
Шум, появляющийся внизу, мерцает по всей ширине графика. Высокие полосы остаются на месте, лишь слегка мерцая по величине.
Когда я использую тестовый звук, медленно перемещающийся от 1 кГц до 20 кГц, он выглядит следующим образом (около 2-3 кГц):
http://img846.imageshack.us/img846/7373/spectrum3khz1khz20khz.png
Пики перемещаются слева направо, и каждый из них немного быстрее, поэтому со временем расстояние между пиками увеличивается. Чего не видно, так это того, что пики возвращаются и идут справа налево, когда покидают экран справа (но с меньшей величиной). Также все пики сливаются в один большой пик на расстоянии чуть более 0,5 экрана.
Вот код, который я использую для получения данных:
for (int i = 1; i < n / 2; i++) {
byte rfk = mRawSpecData[2*i];
byte ifk = mRawSpecData[2*i+1];
float magnitude = (float)Math.sqrt(rfk * rfk + ifk * ifk);
mFormattedSpecData[i-1] = magnitude / 128f;
}
В приведенном выше коде I mRawSpecData является результатом функции getFFT() визуализатора. Длина захваченных данных составляет 1024. В настоящее время наклон начинается с 1, поскольку mRawSpecData[0] содержит DC, а mRawSpecData[1] содержит n/2.
Чтобы решить мою проблему, я также пытался возиться с постоянным током и фазой частотного интервала. Думал, может быть, мне пришлось применить некоторые вычисления к величинам, чтобы «очистить» график. Но у меня не получилось (может быть, потому что я вообще не понял, что происходит с постоянным током/фазой!).
Я потратил две недели на поиски в гугле по вечерам и пробовал разные вычисления, но ничего не помогло.
Так в чем же дело? Я что-то делаю не так или что-то упускаю? После этого меня беспокоит еще один вопрос, как правильно масштабировать величины. Моя цель - получить значения от 0f до 1f.
Большое спасибо
неистовство
P.S.: Скриншоты сделаны через eclipse с телефона под управлением Android 2.3.
P.P.S.: Я также проверил звуки с различными другими проигрывателями (например, Winamp) и там я вижу правильное поведение спектра.