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

Android 安卓:麦克风音量(可能)、自动增益、FFT、巴特沃斯、Audacity,android,filter,fft,microphone,audacity,Android,Filter,Fft,Microphone,Audacity,我试图记录一辆自行车的声音,并用FFT分析记录的音频,找到发动机的频率。 如果我只吹口哨,一切正常,我可以看到一个清晰的图表,它对应于我吹口哨的高低等等。我创建了一个不同颜色的热图,用于不同的振幅,我从FFT得到频率与时间的关系。 音频的录制方式如下: private class RecordAudio extends AsyncTask<Void, float[], Void> { @Override protected Void doInBackg

我试图记录一辆自行车的声音,并用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; 
    }
}
私有类RecordAudio扩展异步任务{
@凌驾
受保护的Void doInBackground(Void…参数){
试一试{
int bufferSize=AudioRecord.getMinBufferSize(sampleRateMain,
信道配置、音频编码);
音频记录=新的音频记录(
MediaRecorder.AudioSource.DEFAULT,sampleRateMain,
信道配置、音频编码、缓冲区大小);
short[]buffer=新的short[blockSize];
录音。开始录制();
浮动[]音频数据=新浮动[块大小];
试一试{
SimpleDataFormat sdf=新的SimpleDataFormat(“yyyyMMdd_HHmmss”);
字符串currentDateandTime=sdf.format(new Date());
缓冲写作者;
字符串pathtemp=Environment.getExternalStorageDirectory().getAbsolutePath();
字符串filename=“/”+currentDateandTime;
路径=路径温度+文件名;
writer=newbufferedwriter(newfilewriter(path,false));
int i2=0;
当(开始){
如果(i2==10){
datastructures tempdata=新的datastructures();
i2=0;
音频记录读取(缓冲区,0,块大小);
浮点数和=0;
对于(int i=0;i如果(audioData[i]我无法回答您的麦克风增益问题,但关于您的滤波器问题:这取决于您如何实现滤波器。巴特沃斯滤波器通常会实现为IIR(无限脉冲响应,即滤波器的输出取决于之前的输出)通过Z变换进行滤波。如果您以这种方式实现滤波器,那么您应该在进行FFT之前将滤波器应用于时域样本


如果你需要一个滤波器,并且你无论如何都要使用FFT,你可能最好通过卷积实现FIR滤波器,而不是使用butterworth或其他s/z域滤波器。

我不能回答你的麦克风增益问题,但关于滤波器的问题:这取决于你如何实现滤波器。butterworth滤波器不会R通常通过Z变换实现为IIR(无限脉冲响应,即滤波器的输出取决于先前的输出)滤波器。如果以这种方式实现滤波器,则应在进行FFT之前将滤波器应用于时域采样


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

只是一个想法,触发audiorecord.start audiorecord.stop in the while(start)是否足够循环以从麦克风获得增益?如果不尝试,我认为这会导致速度问题。回答我的评论:太慢,不幸的是,这只是一个想法,是否足以触发audiorecord.start audiorecord.stop in the while(已启动)循环以从麦克风获得增益?如果不尝试,我认为这会导致速度问题。回答我的评论:太慢了,真不幸