У меня есть некоторый вопрос о FFT (на самом деле я верю, что это больше о FFT-выходе Android от Visualizer.getFFT ()).
Я создал Music-Player с собственной библиотечной функцией для Android, включаямного материала (например, жанры, динамические списки воспроизведения и визуализации).В настоящее время у меня есть некоторые проблемы с визуализациями, которые я создаю, когда дело доходит до рендеринга Спектра текущего AudioStream.
Я уже прочитал следующие Вопросы (и Ответы), чтобы получить идею БПФ для Android:
Какой вывод я должен увидеть из getFft?
Визуализатор Android 2.3 - Устранение неполадок 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;
}
В приведенном выше коде ImRawSpecData является результатом функции getFFT () в Visualisers.Длина захваченных данных составляет 1024. В настоящее время наклон начинается с 1, поскольку mRawSpecData [0] содержит DC, а mRawSpecData [1] содержит n / 2.
Чтобы решить мою проблему, я также попытался поиграться сDC и фаза частотного бина.Подумал, может быть, мне пришлось применить некоторые вычисления по величинам, чтобы «очистить» график.Но мне это не удалось (возможно, потому, что я вообще не понимал, что происходит с DC / phase!).
Я провел две недели в поисках Google по вечерам и пробовал разные вычисления, но ничего не помогло..
Так в чем же дело?Я что-то делаю не так или что-то упускаю?После этого другой вопрос, который беспокоит меня, - как правильно масштабировать величины.Моя цель - получить значения от 0f до 1f.
Большое спасибо
rampage
PS: скриншоты, сделанные с помощью затмения с телефона под управлением Android 2.3.
PPS: Я также проверил звуки с другими игроками (например, winamp), и там я вижу правильное поведение спектра.