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に1回だけ記録します。アプリの次の部分では、ユーザーにオーディオデータの一部を切り取って、この部分のみをtrimmedと呼ばれるベクトルにロードさせます。次に、それらの周波数のFFTを実行します。しかし、データにはオーバードライブしかないようです。

録音中にマイクの自動ゲインをトリガーすることはできますか?

録音して保存したオーディオデータをAudacityにロードするにはどうすればよいですか?(生データのインポート設定を変えてみましたが、うまくいかないようです) ファイル例を次に示します。

バターワースフィルターを実装しました。これが正しければ、フィルターはFFTの前に適用する必要がありますか?

4

1 に答える 1

0

マイクゲインの問題にはお答えできませんが、フィルターの質問については、フィルターをどのように実現したかによって異なります。バターワース フィルターは通常、Z 変換(再帰関係)を介した IIR (無限インパルス応答、つまり、フィルターの出力は前の出力に依存する) フィルターとして実現されます。この方法でフィルタを認識した場合は、FFT を実行する前に時間領域のサンプルにフィルタを適用する必要があります。

フィルタが必要で、とにかく FFTを使用している場合は、バターワースまたは他の s/z ドメイン フィルタを使用する代わりに、畳み込みと畳み込み定理を介して FIR フィルタを実装する方がよいでしょう。

于 2013-01-05T07:11:52.527 に答える