2017-02-11 76 views
0

我正在開發lumiere應用程序。我有一個特定頻率的載波信號(如果要更精確一些,則爲19.2 kHz),我需要在播放音頻時獲得它的幅度。 我搜索了一些關於音頻處理的信息,發現爲了獲得頻譜,你必須使用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.2kHz信號的音頻文件,其幅度恆定爲0 dB,但19207 Hz幅度的結果值從-39 dB到-46 dB不等。我檢查了相鄰的頻率,可能其中一些有0 dB,但沒有。 我也檢查了-36 dB和-60 dB的文件,但結果分別是-39到-48 dB和-44到-61 dB。

正如我們可以看到的最後一個文件,它是接近的,但它並不是恆定的,我不能預測什麼時候它是正確的,什麼時候是錯誤的。

如果有人遇到此問題,請幫助我。 如果您知道任何其他好的FFT LIB是可行肯定的 - 告訴我

UPDATE: 好吧,我加入了霍芬海姆的功能,我fft.forwardTransform(之前叫)後,比較的結果; 結果爲: 0分貝爲19.2kHz的音頻文件: 前:-39分貝 後 - 10分貝

爲-36分貝爲19.2kHz的音頻文件: 前:-75分貝 後:-46分貝

爲-60分貝爲19.2kHz的音頻文件: 前:-97.7分貝 後:-69分貝

現在的結果是恆定的,不隨時間或者嘗試改變。 我們也可以看到結果中有一定的模式。在fft之前,結果與-39 dB和-10dB之後的結果不同。 所以問題是:我們爲什麼會有這些錯誤?

回答

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.0乘以20 * Math.log10(value);因爲我已經看到相同的表達式乘以10:10 * Math.log10(value); –

+0

0 dB 19.2kHz音頻文件的功能結果在調用FFT之前爲-39 dB,在調用FFT之後爲-10 dB。 Log.d(「測試」,「功率級別之前:」+ soundPressureLevel(buff)+「dB」); fft.forwardTransform(buff); fft.modulus(buff,amps); Log.d(「測試」,「功率水平之後:」+ soundPressureLevel(buff)+「dB」); –

+0

我也檢查過,所有三個文件的結果都是一樣的,什麼更好,因爲我們有恆定的值(沒有像以前那樣的變化),正確的結果和錯誤之間的差異大約是39 dB(fft之前的結果) 。它應該是0dB,它是-39dB,它應該是-36dB,它是-75dB,它應該是-60dB,它是-98dB。 –

相關問題