为android设备开发从WAV文件获取频率值的应用程序

为android设备开发从WAV文件获取频率值的应用程序,android,wav,frequency,Android,Wav,Frequency,对于我的项目,我需要计算或获得频率值形成一个wav文件。 到目前为止,我已经设法记录了一个板条箱的wav文件 private static final int RECORDER_BPP = 16; private static final String AUDIO_RECORDER_FILE_EXT_WAV = ".wav"; private static final String AUDIO_RECORDER_FOLDER = "AudioRecor

对于我的项目,我需要计算或获得频率值形成一个wav文件。 到目前为止,我已经设法记录了一个板条箱的wav文件

    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  final int RECORDER_SAMPLERATE = 44100;
         private  final int RECORDER_CHANNELS = AudioFormat.CHANNEL_IN_STEREO;
         private  final int RECORDER_AUDIO_ENCODING = AudioFormat.ENCODING_PCM_16BIT;

        bufferSize = udioRecord.getMinBufferSize(44100,AudioFormat.CHANNEL_IN_STEREO,      AudioFormat.ENCODING_PCM_16BIT);

recorder = new AudioRecord(MediaRecorder.AudioSource.MIC,
                                             RECORDER_SAMPLERATE, RECORDER_CHANNELS,RECORDER_AUDIO_ENCODING, bufferSize);
我需要获得频率值并将其保存在数组中,以便在图形上显示。。我的问题是如何从这种类型的WAV文件中获取频率值。?
谢谢…

基本上,您需要使用FFT

是FFT Java类的一个示例

下面是一个示例代码:

正在创建从音频计算数组值的方法

public double[] calculateFFT(byte[] signal)
    {           
        final int mNumberOfFFTPoints =1024;
        double mMaxFFTSample;

        double temp;
        Complex[] y;
        Complex[] complexSignal = new Complex[mNumberOfFFTPoints];
        double[] absSignal = new double[mNumberOfFFTPoints/2];

        for(int i = 0; i < mNumberOfFFTPoints; i++){
            temp = (double)((signal[2*i] & 0xFF) | (signal[2*i+1] << 8)) / 32768.0F;
            complexSignal[i] = new Complex(temp,0.0);
        }

        y = FFT.fft(complexSignal); // --> Here I use FFT class

        mMaxFFTSample = 0.0;
        mPeakPos = 0;
        for(int i = 0; i < (mNumberOfFFTPoints/2); i++)
        {
             absSignal[i] = Math.sqrt(Math.pow(y[i].re(), 2) + Math.pow(y[i].im(), 2));
             if(absSignal[i] > mMaxFFTSample)
             {
                 mMaxFFTSample = absSignal[i];
                 mPeakPos = i;
             } 
        }

        return absSignal;

    }
public double[]calculateFFT(字节[]信号)
{           
最终整数mNumberOfFFTPoints=1024;
双样本;
双温;
复合[]y;
复数[]复数信号=新复数[mNumberOfFFTPoints];
double[]absSignal=新的双精度[mNumberOfFFTPoints/2];
对于(int i=0;iMMAXFFSTAMPLE)
{
mmaxftsample=absSignal[i];
mPeakPos=i;
} 
}
返回信号;
}

根据

的答案,我在我的项目中使用了相同的计算方法来完成相同的任务。遵循下面的答案我尝试使用此方法…但仍然无法打印值…我编写for loop来打印从calculateFFt()方法返回的数组值。它是否从calculateFFt()返回频率值.???如果它对你有用,你能给我一个android项目作为下载链接吗?我也想知道为什么mNumberofFFTPonits声明为1024,以及0X FF和32768.0F对于(int i=0;i)意味着什么