[英]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.