簡體   English   中英

如何使用FFT從PCM獲取頻率數據

[英]How can I get frequency data from PCM using FFT

我有一個傳遞給讀者的音頻數據:

 recorder.read(audioData,0,bufferSize); 

實例化如下:

AudioRecord recorder;
short[] audioData;
int bufferSize;
int samplerate = 8000;

//get the buffer size to use with this audio record
bufferSize = AudioRecord.getMinBufferSize(samplerate, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT)*3;

//instantiate the AudioRecorder
recorder = new AudioRecord(AudioSource.MIC,samplerate, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT,bufferSize); 

recording = true; //variable to use start or stop recording
audioData = new short [bufferSize]; //short array that pcm data is put into.

我有一個我在網上找到的FFT課程和一個復雜的課程。 我已經嘗試了兩天在線查看,但audioData如何循環存儲在audioData的值並將其傳遞給FFT。

這是我正在使用的FFT類: http//www.cs.princeton.edu/introcs/97data/FFT.java ,這是一個復雜的類: http//introcs.cs.princeton.edu /java/97data/Complex.java.html

假設audioData數組包含原始音頻數據,則需要從audioData數組創建一個Complex[]對象:

Complex[] complexData = new Complex[audioData.length];
for (int i = 0; i < complexData.length; i++) {
    complextData[i] = new Complex(audioData[i], 0);
}

現在,您可以將complexData對象作為參數傳遞給FFT函數:

Complex[] fftResult = FFT.fft(complexData);

一些細節將取決於您的FFT的目的。

所需的FFT長度取決於您在分析中所希望的頻率分辨率和時間精度(它們是反向相關的),這可能是也可能不是音頻輸入緩沖器長度附近的任何位置。 鑒於長度差異,您可能需要組合多個緩沖區,分割單個緩沖區或兩者的某種組合,以獲得滿足分析要求的FFT窗口長度。

PCM是編碼數據的技術。 與使用FFT獲取音頻數據的頻率分析無關。 如果使用Java解碼PCM編碼數據,您將獲得原始音頻數據,然后可以將其傳遞到FFT庫。

暫無
暫無

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

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