Android:麦克风音量(可能),自动增益,FFT,巴特沃斯,Audacity

时间:2012-05-03 08:32:51

标签: android filter fft microphone audacity

我正在尝试记录赛车的声音,并使用FFT分析录制的音频并找到引擎频率。 如果我只吹口哨,一切正常,我可以看到一个清晰的图形,对应于我的低音和低音等等。我创建了一个不同颜色的热图,用于我从FFT获得的频率与时间的不同幅度。 音频记录如下:

private class RecordAudio extends AsyncTask<Void, float[], Void> {
        @Override
        protected Void doInBackground(Void... params) {
            try {
            int bufferSize = AudioRecord.getMinBufferSize(sampleRateMain,
                    channelConfiguration, audioEncoding);
            AudioRecord audioRecord = new AudioRecord(
                    MediaRecorder.AudioSource.DEFAULT, sampleRateMain,
                    channelConfiguration, audioEncoding, bufferSize);
            short[] buffer = new short[blockSize];
            audioRecord.startRecording();
            float[] audioData = new float[blockSize];
            try{
            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss");
            String currentDateandTime = sdf.format(new Date());

            BufferedWriter writer;
            String pathtemp = Environment.getExternalStorageDirectory().getAbsolutePath();
            String filename ="/"+currentDateandTime;
            path = pathtemp +filename;
            writer = new BufferedWriter (new FileWriter(path,false));
            int i2=0;
            while (started) {   
                if(i2==10){                 
                    datastructures tempdata = new datastructures();
                    i2=0;
                    audioRecord.read(buffer, 0, blockSize);         
                    float sum = 0;
                    for (int i = 0; i < blockSize; i++) {
                        audioData[i] = (float) ( buffer[i]);
                        writer.write(audioData[i]+" ");
                            if (audioData[i] <= 0) {
                                audioData[i] = audioData[i] * (-1);
                            }
                            sum = sum + audioData[i];
                    }   
                    writer.newLine();
                    tempdata.freqsum = sum;
                    mainData.add(tempdata);
                }
                i2++;                   
            }
            writer.close();
            }
            catch(IOException e){
                e.printStackTrace();
            }               
            audioRecord.stop();         
        } catch (Throwable t) {
            Log.e(TAG, "Audio recording Failed");
        }
        return null; 
    }
}

所以我将audiodata存储在SD卡上。为了减少数据i循环通过i2并且仅在i2 = 0 ... 10中记录一次; 在应用程序的下一部分中,我让用户剪切出一部分audiodata,并仅将此部分加载到一个名为trimmed的向量中。 然后我对这些频率进行FFT。但似乎数据中只有过载。

录制时是否可以触发麦克风的自动增益?

如何将录制和保存的audiodata加载到Audacity中? (我为原始数据尝试了不同的导入设置,但它似乎不起作用) Here is an example file

我实现了一个butterworth滤波器,如果我做对了滤波器应该在FFT之前应用?

1 个答案:

答案 0 :(得分:0)

我无法回答你的麦克风增益问题,但至于你的过滤器问题:这取决于你如何实现你的过滤器。 Butterworth滤波器通常通过Z变换(recurrence relation)实现为IIR(无限脉冲响应,即滤波器的输出取决于先前的输出)滤波器。如果您以这种方式实现了滤波器,那么您应该在进行FFT之前将滤波器应用于时域采样。

如果你需要一个滤波器,并且你正在进行FFT,你可能最好通过卷积和Convolution theorem而不是使用butterworth或其他s / z域滤波器来实现FIR滤波器。 / p>

相关问题