Android AudioRecord - 在没有库的情况下获得 FFT 的最佳方式

Posted

技术标签:

【中文标题】Android AudioRecord - 在没有库的情况下获得 FFT 的最佳方式【英文标题】:Android AudioRecord - Best way to get the FFT without libraries 【发布时间】:2018-11-23 22:31:09 【问题描述】:

我正在寻找以 512 bin 字节/短/浮点数组形式获取当前麦克风输入的最快方法。由于我在 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# 库找到了一种方法,检查答案。

【问题讨论】:

***.com/a/17564926/4984832 @SushiHangover 所以我想我重新创建了该评论中提到的 FFT java 类的 fft() 方法? 你不想使用库...... 如果有一个 c# 库,我很乐意使用它,但不能是 Java 库。 Google/Bing 搜索将为您提供许多基于 C# 的库/项目。 【参考方案1】:

找到了,最简单的方法是通过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;

【讨论】:

以上是关于Android AudioRecord - 在没有库的情况下获得 FFT 的最佳方式的主要内容,如果未能解决你的问题,请参考以下文章

蓝牙ble数据转语音实现Android AudioRecord方法推荐

增加录制 Android AudioRecord 的音量

Android:使用 audiorecord 类录制音频播放快进

无法在 Android 中使用 AudioRecord 进行录制

在 Android 上更改 AudioRecord 的比特率

Android 音频录制-AudioRecord