[英]JTransform / MATLAB results
我為Android編寫了一個測試程序,錄制了麥克風中的音頻,並使用JTransform lib來計算fft。 我與matlab進行了比較,但沒有得到相同的結果。 例如 :
JTransform:
real: 0.035003662109375 imag: 0.036529541015625
real: 0.036712646484375 imag: 0.0355224609375
real: 0.033966064453125 imag: 0.033111572265625
real: 0.034149169921875 imag: 0.035858154296875
real: 0.036712646484375 imag: 0.0360107421875
MATLAB:
4.1469
1.6639 + 0.6458i
5.1224 +17.1221i
-4.3110 - 1.8984i
9.3352 + 4.8483i
錄音機:
DoubleFFT_1D fft1d = new DoubleFFT_1D(bufferSize / 2);
short[] sourceBuffer = new short[bufferSize];
double[] fftBuffer = new double[bufferSize];
FFT fft = new FFT();
recorder.startRecording();
isRecording.set(true);
while(isRecording.get())
{
int read = recorder.read(sourceBuffer, 0, bufferSize);
//Log.e(LOG_TAG, "read: " + read + " bufferSize: " + bufferSize);
if(read != AudioRecord.ERROR_INVALID_OPERATION)
{
for(int i = 0; i < bufferSize && i < read; ++i)
{
// signed int16 to double (2^15 = 32768)
fftBuffer[i] = (double) (sourceBuffer[i] / 32768.0);
try
{
// for matlab
soundFile.write(fftBuffer[i] + "\n");
}
catch (IOException e)
{
Log.e(LOG_TAG, e.getMessage());
}
}
}
}
fft1d.realForward(fftBuffer);
我幾乎肯定這是您的問題:
// signed int16 to double (2^15 = 32768)
fftBuffer[i] = (double) (sourceBuffer[i] / 32768.0);
JTransform確實有一個雙緩沖區,但是據我所知它並不限於-1/1。 我已經將其用於音高識別,並且從未像這樣對它進行細分。 只需將其轉換為兩倍,就可以了。
不過,老實說,我最終使用了libGdx的FFT類,因為它為我提供了更快的基准測試。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.