Я разрабатываю приложение lumiere. У меня есть несущий сигнал определенной частоты (19,2 кГц, если быть более точным), и мне нужно получить его амплитуду во время воспроизведения звука. У меня есть информация о обработке звука в Google, и выяснилось, что для получения частотного спектра вы должны использовать алгоритм FFT.Как получить амплитуду сигнала определенной частоты в реальном времени android
Я пробовал библиотеку TarsosDSP и ее класс FFT.
TarsosDSPAudioFormat format = new TarsosDSPAudioFormat((float) SAMPLE_RATE, 16, 1, true, false);
TarsosDSPAudioFloatConverter converter = TarsosDSPAudioFloatConverter.getConverter(format);
float[] buff = new float[bufferFloatSize];
final float[] amps = new float[fftSize];
converter.toFloatArray(tmpBuffer, buff);
FFT fft = new FFT(bufferFloatSize, new HannWindow());
fft.forwardTransform(buff);
fft.modulus(buff, amps);
Тогда я получаю индекс полосы частот и вычислить его амплитуду
int amp = (int) (10 * Math.log10(amps[index]);
Но я получаю неправильную амплитуду. У меня есть аудиофайл с 19,2 кГц сигналом, который имеет постоянную амплитуду 0 дБ, но значение результата амплитуды 19207 Гц варьируется от -39 дБ до -46 дБ. Я проверил соседние частоты, может быть, некоторые из них имеют 0 дБ, но нет. Я также проверил файлы с -36 дБ и -60 дБ, но результаты были от -39 до -48 дБ и от -44 до -61 дБ соответственно.
Как мы видим, для последнего файла он близок, но он не является постоянным, и я не могу предсказать, когда он прав, и когда это неправильно.
Если есть кто-нибудь, кто столкнулся с этой проблемой, пожалуйста, помогите мне. Если вы знаете, любой другой хороший FFT LIB, который работоспособным наверняка - скажите мне
UPDATE: Ok, я добавил функцию TSG и называют его перед моим fft.forwardTransform() и после того, как сравнить результаты; Результаты были: на 0 дБ 19.2kHz аудиофайла: перед: -39 дБ после - 10 дБ
на -36 дБ 19.2kHz аудиофайла: перед: -75 дБ после: -46 дБ
для -60 дБ 19.2kHz аудиофайла: перед: -97,7 дБ после: -69 дБ
Теперь результаты являются постоянными и не меняются со временем или попробовать. Мы также видим, что в результатах есть определенный шаблон. Перед fft результат отличается от правого для -39 дБ и после -10 дБ. Итак, вопрос в том, почему мы имеем эти ошибки?
Не могли бы вы объяснить, пожалуйста, зачем умножать на 20 в 20.0 * Math.log10 (значение); Потому что я видел одно и то же выражение, умноженное на десять: 10 * Math.log10 (значение); –
результаты для вашей функции на звуковом файле с напряжением 0 дБ 19,2 кГц до -39 дБ перед вызовом БПФ и -10 дБ после вызова БПФ. Log.d ("test", "before power level:" + soundPressureLevel (buff) + "dB"); fft.forwardTransform (buff); fft.modulus (бафф, усилители); Log.d ("test", "after power level:" + soundPressureLevel (buff) + "dB"); –
Я также проверил, что все три файла имеют одинаковые результаты все время, что лучше, поскольку мы имеем постоянные значения (без изменений, как и раньше), а разница между правильным результатом и неправильным значением составляет примерно 39 дБ (результат до fft) , Как и должно быть 0 дБ, и оно -39 дБ, оно должно быть -36 дБ, а оно -75 дБ, оно должно быть -60 дБ и -98 дБ. –