簡體   English   中英

Android音頻FFT使用audiorecord檢索特定頻率幅度

[英]Android audio FFT to retrieve specific frequency magnitude using audiorecord

我目前正在嘗試使用 Android 實現一些代碼,以檢測何時通過手機的麥克風播放多個特定的音頻范圍。 我已經使用AudioRecord類設置了類:

int channel_config = AudioFormat.CHANNEL_CONFIGURATION_MONO;
int format = AudioFormat.ENCODING_PCM_16BIT;
int sampleSize = 8000;
int bufferSize = AudioRecord.getMinBufferSize(sampleSize, channel_config, format);
AudioRecord audioInput = new AudioRecord(AudioSource.MIC, sampleSize, channel_config, format, bufferSize);

然后讀入音頻:

short[] audioBuffer = new short[bufferSize];
audioInput.startRecording();
audioInput.read(audioBuffer, 0, bufferSize);

執行 FFT 是我陷入困境的地方,因為我在這方面的經驗很少。 我一直在嘗試使用這個類:

Java 中的 FFTComplex 類與之配套

然后我發送以下值:

Complex[] fftTempArray = new Complex[bufferSize];
for (int i=0; i<bufferSize; i++)
{
    fftTempArray[i] = new Complex(audio[i], 0);
}
Complex[] fftArray = fft(fftTempArray);

這很容易讓我誤解這個類是如何工作的,但是返回的值會到處跳躍,即使在沉默中也不能代表一致的頻率。 有沒有人知道執行此任務的方法,還是我嘗試僅獲取少量頻率范圍而不是將其繪制為圖形表示使問題過於復雜?

首先,您需要確保您得到的結果正確轉換為浮點數/雙精度數。 我不確定 short[] 版本是如何工作的,但 byte[] 版本只返回原始字節版本。 然后需要將此字節數組正確轉換為浮點數。 轉換代碼應如下所示:

    double[] micBufferData = new double[<insert-proper-size>];
    final int bytesPerSample = 2; // As it is 16bit PCM
    final double amplification = 100.0; // choose a number as you like
    for (int index = 0, floatIndex = 0; index < bytesRecorded - bytesPerSample + 1; index += bytesPerSample, floatIndex++) {
        double sample = 0;
        for (int b = 0; b < bytesPerSample; b++) {
            int v = bufferData[index + b];
            if (b < bytesPerSample - 1 || bytesPerSample == 1) {
                v &= 0xFF;
            }
            sample += v << (b * 8);
        }
        double sample32 = amplification * (sample / 32768.0);
        micBufferData[floatIndex] = sample32;
    }

然后您使用 micBufferData[] 創建您的輸入復雜數組。

獲得結果后,請在結果中使用復數的大小。 除了具有實際值的頻率外,大多數幅度應該接近於零。

您需要采樣頻率將數組索引轉換為這樣的幅度到頻率:

private double ComputeFrequency(int arrayIndex) {
    return ((1.0 * sampleRate) / (1.0 * fftOutWindowSize)) * arrayIndex;
}

暫無
暫無

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

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