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;
}
我正在寻找将当前麦克风输入作为 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;
}