FFT音频输入

时间:2014-06-23 15:09:26

标签: android audio fft

我想对AudioRecorder录制的信号应用FFT并保存到wav文件中。我正在使用的FFT有一个Complex []输入参数。我很困惑,从字节转换为comlex除以32768之间有什么区别,转换只是将0添加到虚部并将实部留作字节?

修改

public Complex[] convertToComplex(byte[] file)
{


    int size= file.length;
    double[]x=new double[size];
    Complex[]data= new Complex[size];
    for(int i=0;i<size;i++)
    {
        x[i]=file[i]/32768.0;
        data[i]=new Complex(x[i],0);
        //  Log.d("tag", "indice"+i+":"+data[i]);
    }
    return data;
}

2 个答案:

答案 0 :(得分:2)

广义FFT函数,如处理复杂输入和输出的数组。因此,对于输入,您可能需要创建一个符合FFT库所需的复杂数据结构的复数数组。这可能包括每个的实部和虚部。只需将虚部设置为0.实部可能是一个有符号浮点数,预计会落在-1.0..1.0之间,因此您可以使用除以整数PCM样本的正确轨迹。但是,当您编写&#34;转换字节&#34;时,会引发红旗。这些可能是带符号的小端16位整数PCM样本,因此请务必在除以32768之前对其进行相应的转换(但这是Java,因此无论如何都会强制执行类型)。

答案 1 :(得分:2)

如果你正在使用16位深度的音频(每个样本有16位),那么每个字节只有一半的样本。你需要做的是将你的字节转换为16位样本然后除以得到的数字为32768(这是2的补码16位数可以存储的最小数字的大小,即2 ^ 15),以获得实际的音频样本,该数字是介于-1和1之间的数字。然后,您将此数字转换为通过将其虚构组件设置为0来复数。

下面可以看到一个小的C#样本(指示性代码):

    byte[] myAudioBytes = readAudio();
    int numBytes = myAudioBytes.Length;

    var myAudioSamples = new List<short>();

    for( int i = 0; i < numBytes; i = i + 2)
    {
      //Cast to 16 bit audio and then add sample
       short sample = (short) ((myAudioBytes[i] << 8 | myAudioBytes[i + 1]) / 32768 ); 
       myAudioSamples.Add(sample);
    }

    //Change real audio to Complex audio

    var complexAudio = new Complex[myAudioSamples.Length];

    int i = 0;
    foreach(short sample in myAudioSamples)
       complexAudio[i++] = new Complex(){ Real = sample, Imaginary = 0 };

   //Now you can proceed to getting the FFT of your Audio here

希望代码能够指导您如何处理音频。