Android AudioRecord - 无需库即可获得 FFT 的最佳方式

Android AudioRecord - Best way to get the FFT without libraries

我正在寻找将当前麦克风输入作为 512 bin byte/short/float 数组的最快方法。由于我在 Xamarin 中开发,我不能依赖 Android 库,所以我必须自己转换原始数据。这是当前状态:

minBufferSize = AudioRecord.GetMinBufferSize(8000,ChannelIn.Mono,Encoding.Pcm16bit);
audioRecord = new AudioRecord(AudioSource.Mic,8000,ChannelIn.Mono,Encoding.Pcm16bit, minBufferSize); 
audioRecord.StartRecording();

在以 20 Hz 运行的主循环中,它读取这样的数据

short[] audiodata = new short[512];
byte[] byteAudioData = new byte[1024];
audioRecord.Read(byteAudioData, 0, 1024);

缺少的步骤是将原始字节数据转换为实际的 fft。

Edit1:在执行第一条评论的 calculateFFT(byte[] signal) 方法后,这是处理后的音频信号到目前为止的样子,似乎无法使用: Audio Data

Edit2:找到了一种通过 C# 库实现的方法,检查答案。

找到了,最简单的方法是通过 Accord library

该方法可能如下所示:

public double[] FFT(double[] data){
    double[] fft = new double[data.Length]; // this is where we will store the output (fft)
    Complex[] fftComplex = new Complex[data.Length]; // the FFT function requires complex format
    for (int i = 0; i < data.Length; i++)
        fftComplex[i] = new Complex(data[i], 0.0); // make it complex format
    Accord.Math.FourierTransform.FFT(fftComplex, Accord.Math.FourierTransform.Direction.Forward);
    for (int i = 0; i < data.Length; i++)
        fft[i] = fftComplex[i].Magnitude;
    return fft;
}