Java Android-AudioRecord:通过音频插孔(麦克风)检测脉冲宽度调制信号

Java Android-AudioRecord:通过音频插孔(麦克风)检测脉冲宽度调制信号,java,android,performance,android-audiorecord,Java,Android,Performance,Android Audiorecord,我尝试在近实时麦克风的音频插孔上检测方波信号。因此,我在流媒体模式下使用课堂录音。但我的问题是,我的手机麦克风总是工作不一样。有时我使用20'000的阈值,有时我必须将阈值调整为1'000以检测第一个脉冲的边缘。信号的电压范围为0至3V。我不确定我的麦克风是否工作正常,或者adc是否使用不同的参考电压 我不知道如何解决这个问题。 我真的希望你能帮助我 这里是我的源代码: 公共类ReceiveCom扩展AsyncTask实现层{ private AudioRecord audioRecord; p

我尝试在近实时麦克风的音频插孔上检测方波信号。因此,我在流媒体模式下使用课堂录音。但我的问题是,我的手机麦克风总是工作不一样。有时我使用20'000的阈值,有时我必须将阈值调整为1'000以检测第一个脉冲的边缘。信号的电压范围为0至3V。我不确定我的麦克风是否工作正常,或者adc是否使用不同的参考电压

我不知道如何解决这个问题。 我真的希望你能帮助我

这里是我的源代码:

公共类ReceiveCom扩展AsyncTask实现层{

private AudioRecord audioRecord;
private int sampleRate = 44100;

private short[] audioData;
private int sizeInShorts;

private boolean isRunning=false;
private int receiveBuffer;

private int minBuffersize;
private boolean ready=false;

private int audioResult,dataCounter=0;
private short[] dataBits = new short[8];

@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
public ReceiveCom(){
    try{
        minBuffersize = AudioRecord.getMinBufferSize(sampleRate, AudioFormat.CHANNEL_IN_MONO, 
                                                     AudioFormat.ENCODING_PCM_16BIT);


        audioRecord = new AudioRecord(AudioSource.MIC, sampleRate, AudioFormat.CHANNEL_IN_MONO, 
                                        AudioFormat.ENCODING_PCM_16BIT, minBuffersize);


        if (audioRecord.getState() != AudioRecord.STATE_INITIALIZED){   
            throw new Exception("AudioRecord init failed");
        }

        audioData = new short[2*minBuffersize];
        Log.e("ERROR", "ReceiveCom constructor: OK ");
    }
    catch(IllegalArgumentException e){
        Log.e("ERROR", "IllegalArgumentException: " + e);
    }
    catch(Exception e){
        Log.e("ERROR", "ConstructorException: " + e);           
    }
    finally{
        Log.e("ERROR", "ReceiveCom constructor: END ");
    }

    if(Build.VERSION.SDK_INT >= 17){
        if(AutomaticGainControl.isAvailable()){
            Log.e("INFO", "AGC is available");
            //AutomaticGainControl.create(audioRecord.getAudioSessionId());
        }
    }
}


protected Void doInBackground(Void... arg0) {       
    audioRecord.setPositionNotificationPeriod(minBuffersize);
    audioRecord.setRecordPositionUpdateListener( new OnRecordPositionUpdateListener(){

        @Override   
        public void onPeriodicNotification(AudioRecord myRecorder) {
            int timeCounter=0,bitCounter=0,i=0;
            boolean edgeTriggered=false, bitReady=false;
            int dB,edgeThreshold=10000,idleThreshold=edgeThreshold/5;

            for(i=2; i<audioResult; i=i+1){
                if(edgeTriggered==false &&  audioData[i-2]<=idleThreshold && audioData[i-1]>=edgeThreshold && audioData[i]>=edgeThreshold ){
                    Log.e("DEBUG","audioData["+i+"]: "+audioData[i]);
                    timeCounter++;
                    edgeTriggered=true;
                    bitReady=false;
                }   
            }
        }
        @Override
        public void onMarkerReached(AudioRecord recorder) { }
    });

    audioRecord.startRecording();
    while(isRunning){
        audioResult = audioRecord.read(audioData, 0, minBuffersize);    
    }

    audioRecord.stop();
    audioRecord.release();  
    return null;
}

有时麦克风上会有AGC或其他预处理滤波器。您可以尝试AudioSource.VOICE_识别,而不是AudioSource.MIC…

您不应该期望音频通道通过信号的直流分量,但是输入上存在的任何恒定偏移电压可能会短暂出现,然后衰减。您可能需要建立一个tracki将振幅和偏移量的ng方案输入解码器。