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

Posted

技术标签:

【中文标题】为 android 设备开发应用程序以从 WAV 文件中获取频率值【英文标题】:developing a application for android device to get frequency values from a WAV file 【发布时间】:2014-09-29 09:17:45 【问题描述】:

对于我的项目,我需要从 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 文件中获取频率值。? 谢谢...

【问题讨论】:

我在我的项目中使用相同的计算来完成相同的任务..按照下面的答案 【参考方案1】:

基本上,你需要使用 FFT。

Here 是 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;

    

基于Here.的回答

【讨论】:

我尝试使用此方法...但我仍然无法打印值...我编写 for 循环以打印从 calculateFFt() 方法返回的数组值。它是否从 calculateFFT() 返回频率值。???如果它对你有用,你能给我android项目作为下载链接吗?我也想知道为什么mNumberofFFTPonits声明为1024以及0X FF和32768.0F是什么意思?? for(int i= 0;i

以上是关于为 android 设备开发应用程序以从 WAV 文件中获取频率值的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android 设备上将 WAV 编码为 mp3

如何在 Android 中播放附加到(IP 语音)语音邮件文件的 .wav 文件? [复制]

Android BLE 读取特性

将移动应用程序启动图标放在通知屏幕上以从锁定设备启动

安卓Android开发:使用AudioRecord录音将录音保存为wav文件使用AudioTrack保存录音

安卓Android开发:使用AudioRecord录音将录音保存为wav文件使用AudioTrack保存录音