我正在開發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之後的結果不同。 所以問題是:我們爲什麼會有這些錯誤?
請問您能解釋一下,爲什麼在20.0乘以20 * Math.log10(value);因爲我已經看到相同的表達式乘以10:10 * Math.log10(value); –
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」); –
我也檢查過,所有三個文件的結果都是一樣的,什麼更好,因爲我們有恆定的值(沒有像以前那樣的變化),正確的結果和錯誤之間的差異大約是39 dB(fft之前的結果) 。它應該是0dB,它是-39dB,它應該是-36dB,它是-75dB,它應該是-60dB,它是-98dB。 –