2

我正在尝试录制赛车的声音并使用 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; 
    }
}

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

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

我如何将录制和保存的音频数据加载到 Audacity 中?(我为原始数据尝试了不同的导入设置,但它似乎不起作用) 这是一个示例文件

我实现了一个巴特沃斯滤波器,如果我做对了,应该在 FFT 之前应用滤波器吗?

4

1 回答 1

0

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

如果您需要一个滤波器,并且无论如何都要进行 FFT,那么您最好通过卷积和卷积定理来实现 FIR 滤波器,而不是使用巴特沃斯或其他 s/z 域滤波器。

于 2013-01-05T07:11:52.527 回答