我有一个FFT结果.它们存储在两个double数组中:实部数组和虚部数组.如何确定与这些阵列中每个元素对应的频率?
换句话说,我想创建一个存储FFT的每个实部和虚部的频率的数组.
它被问了很多,但我仍然坚持在Android上实现FFT类我需要使用FFT处理我的音频数据...
我已经在这里阅读了几乎相同的问题如何使用FFT获取PCM的频率数据 ,这里如何从fft结果获得频率? 还有更多的问题,但即使在我尝试了答案后仍然没有找到答案......
我正在使用的FFT类:http: //www.cs.princeton.edu/introcs/97data/FFT.java
与它一起使用的复杂类:http://introcs.cs.princeton.edu/java/97data/Complex.java.html
这是我的代码
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.widget.Button;
public class Latihan extends Activity{
private static final int RECORDER_BPP = 16;
private static final String AUDIO_RECORDER_FILE_EXT_WAV = ".wav";
private static final String AUDIO_RECORDER_FOLDER = "AudioRecorder";
private static final String AUDIO_RECORDER_TEMP_FILE = "record_temp.raw";
private static …Run Code Online (Sandbox Code Playgroud) 我现在已经玩过这个了一段时间,我无法弄清楚我本来打算做什么.
我正在将PCM音频数据读入audioData数组:
recorder.read(audioData,0,bufferSize); //read the PCM audio data into the audioData array
Run Code Online (Sandbox Code Playgroud)
我想使用Piotr Wendykier的JTransform库,以便在我的PCM数据上执行FFT以获得频率.
import edu.emory.mathcs.jtransforms.fft.DoubleFFT_1D;
Run Code Online (Sandbox Code Playgroud)
目前我有这个:
DoubleFFT_1D fft = new DoubleFFT_1D(1024); // 1024 is size of array
for (int i = 0; i < 1023; i++) {
a[i]= audioData[i];
if (audioData[i] != 0)
Log.v(TAG, "audiodata=" + audioData[i] + " fft= " + a[i]);
}
fft.complexForward(a);
Run Code Online (Sandbox Code Playgroud)
我无法理解如何工作,有人可以给我一些指示吗?我必须在此之后进行任何计算吗?
我相信我已经离开了,任何事情都会非常感激!
本
我正在 android 中做声音分析器应用程序。我可以使用 AudioTrack Api 生成 18 khz 到 20 khz 的超声波。我可以使用 AudioRecord Api 录制音频。但我不知道如何计算麦克风输入数据的频率。我看到了多个问题如何从fft结果中获取频率?并使用 FFT 和 Complex 类获取频率 wav 音频它没有给出正确的频率。请帮助我。对不起,我的沟通。
这是我的频率计算代码
int bufferSizeInBytes = 1024;
short[] buffer = new short[bufferSizeInBytes];
class Recording extends Thread {
@Override
public void run() {
while (true) {
bufferReadResult = audioInput.read(buffer, 0, bufferSizeInBytes); // record data from mic into buffer
if(bufferReadResult > 0){
calculate();
}
}
}
public void calculate() {
DoubleFFT_1D fft1d = new DoubleFFT_1D(bufferSizeInBytes);//using JTransforms lib
double[] fftBuffer …Run Code Online (Sandbox Code Playgroud)