簡體   English   中英

如何實時獲取某個頻率音頻信號的幅度android

[英]How to get an amplitude of certain frequency audio signal realtime android

我正在開發 lumiere 應用程序。 我有一個特定頻率的載波信號(更准確地說是 19.2 kHz),我需要在播放音頻時獲得它的幅度。 我在谷歌上搜索了一些關於音頻處理的信息,發現為了獲得頻譜,你必須使用 FFT 算法。

我嘗試過 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 庫肯定是可行的 - 告訴我

更新:好的,我已經添加了 TSG 的函數並在我的 fft.forwardTransform() 之前和之后調用它來比較結果; 結果是:對於 0 dB 19.2kHz 音頻文件:之前:-39 dB 之后 - 10 dB

對於 -36 dB 19.2kHz 音頻文件:之前:-75 dB 之后:-46 dB

對於 -60 dB 19.2kHz 音頻文件:之前:-97.7 dB 之后:-69 dB

現在結果是恆定的,不會隨着時間或嘗試而改變。 我們也可以看到結果中有一定的規律。 在 fft 之前,-39 dBs 和 -10dBs 之后的結果與正確的結果不同。 所以問題是:為什么我們會犯這些錯誤?

    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);
    }
    });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM