2017-02-11 2 views
0

Я разрабатываю приложение 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 дБ. Итак, вопрос в том, почему мы имеем эти ошибки?

ответ

0
In the TarsosDSP manual , the following example was given sound pressure level in db where , 

db=audioEvent.getdBSPL(); or Amplitude=audioEvent.getRMS() //root mean square of the signal. 



    float[] buffer = audioEvent.getFloatBuffer(); 



    private double soundPressureLevel(final float[] buffer) { 
    double power = 0.0D; 
    for (float element : buffer) { 
    power += element*element; 
    } 

    double value = Math.pow(power, 0.5)/ buffer.length;; 
    return 20.0*Math.log10(value); 
    } 
    }); 
+0

Не могли бы вы объяснить, пожалуйста, зачем умножать на 20 в 20.0 * Math.log10 (значение); Потому что я видел одно и то же выражение, умноженное на десять: 10 * Math.log10 (значение); –

+0

результаты для вашей функции на звуковом файле с напряжением 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"); –

+0

Я также проверил, что все три файла имеют одинаковые результаты все время, что лучше, поскольку мы имеем постоянные значения (без изменений, как и раньше), а разница между правильным результатом и неправильным значением составляет примерно 39 дБ (результат до fft) , Как и должно быть 0 дБ, и оно -39 дБ, оно должно быть -36 дБ, а оно -75 дБ, оно должно быть -60 дБ и -98 дБ. –