Android 有源噪声抵消

Android 有源噪声抵消,android,audio,signal-processing,audiorecord,noise-reduction,Android,Audio,Signal Processing,Audiorecord,Noise Reduction,我正在做一个有点雄心勃勃的项目,在安卓系统上使用耳塞或耳机实现主动降噪 我的目标是用android手机麦克风记录环境噪声,反转相位(从音频记录中提取的短值上的简单*1?),并通过耳机播放反转的波形。如果延迟和振幅接近正确,则应消除环境中大量的机械结构噪声 以下是到目前为止我得到的信息: @Override public void run() { Log.i("Audio", "Running Audio Thread"); AudioRecord

我正在做一个有点雄心勃勃的项目,在安卓系统上使用耳塞或耳机实现主动降噪

我的目标是用android手机麦克风记录环境噪声,反转相位(从音频记录中提取的短值上的简单*1?),并通过耳机播放反转的波形。如果延迟和振幅接近正确,则应消除环境中大量的机械结构噪声

以下是到目前为止我得到的信息:

@Override
    public void run()
    {
        Log.i("Audio", "Running Audio Thread");
        AudioRecord recorder = null;
        AudioTrack track = null;
        short[][] buffers  = new short[256][160];
        int ix = 0;

    /*
     * Initialize buffer to hold continuously recorded audio data, start recording, and start
     * playback.
     */
        try
        {
            int N = AudioRecord.getMinBufferSize(8000,AudioFormat.CHANNEL_IN_MONO,AudioFormat.ENCODING_PCM_16BIT);
            recorder = new AudioRecord(MediaRecorder.AudioSource.MIC, 8000, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, N*10);
            //NoiseSuppressor ns = NoiseSuppressor.create(recorder.getAudioSessionId());
            //ns.setEnabled(true);

            track = new AudioTrack(AudioManager.STREAM_MUSIC, 8000,
                    AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT, N*10, AudioTrack.MODE_STREAM);
            recorder.startRecording();
            track.play();
        /*
         * Loops until something outside of this thread stops it.
         * Reads the data from the recorder and writes it to the audio track for playback.
         */
            while(!stopped)
            {                    
                short[] buffer = buffers[ix++ % buffers.length];
                N = recorder.read(buffer,0,buffer.length);

                for(int iii = 0;iii<buffer.length;iii++){
                    //Log.i("Data","Value: "+buffer[iii]);
                    buffer[iii] = buffer[iii] *= -1;                        
                }                    
                track.write(buffer, 0, buffer.length);
            }
        }
        catch(Throwable x)
        {
            Log.w("Audio", "Error reading voice audio", x);
        }
    /*
     * Frees the thread's resources after the loop completes so that it can be run again
     */
        finally
        {
            recorder.stop();
            recorder.release();
            track.stop();
            track.release();
        }
    }
@覆盖
公开募捐
{
Log.i(“音频”,“运行音频线程”);
录音机=空;
AudioTrack track=null;
short[][]缓冲区=新的short[256][160];
int ix=0;
/*
*初始化缓冲区以保存连续录制的音频数据、开始录制和启动
*播放。
*/
尝试
{
int N=AudioRecord.getMinBufferSize(8000,AudioFormat.CHANNEL,单声道,AudioFormat.ENCODING,PCM,16位);
记录器=新的音频记录(MediaRecorder.AudioSource.MIC,8000,AudioFormat.CHANNEL,单声道,AudioFormat.ENCODING,PCM,16位,N*10);
//NoiseSuppressor ns=NoiseSuppressor.create(recorder.getAudioSessionId());
//ns.setEnabled(true);
曲目=新的音频曲目(AudioManager.STREAM_MUSIC,8000,
AudioFormat.CHANNEL\u OUT\u MONO、AudioFormat.ENCODING\u PCM\u 16位、N*10、AudioTrack.MODE\u STREAM);
记录器。开始记录();
track.play();
/*
*循环,直到线程外的某个对象停止它。
*从录音机读取数据并将其写入音频曲目进行播放。
*/
当(!停止)
{                    
short[]buffer=buffers[ix++%buffers.length];
N=记录器读取(缓冲区,0,缓冲区长度);

对于(int iii=0;iii即使您能够对延迟做些什么,这也是一个难题,因为您不知道手机与耳朵的距离,加上距离不是固定的(用户将移动手机),再加上您没有为每只耳朵配备麦克风(因此,即使延迟为零,你也无法知道一只耳朵上的电波在到达那里之前会是什么样子)


话虽如此,您也许可以做一些可以消除高周期波形的事情。但您所能做的只是允许用户手动调整每只耳朵的延时-因为耳朵附近没有麦克风,您无法在代码中知道您是在改善还是恶化问题。

理论上,你可能可以在极低频下做一些事情,但即使这样也不现实。你的项目进展如何?遗憾的是,没有。我在得出结论后搁置了它。我无法补偿从手机麦克风到用户耳朵的可变距离。我很想再次拿起它,但不清楚从哪里开始一部智能手机不足以完成这样的项目:你需要两部智能手机,或者一部智能手机和一个蓝牙耳机,离用户几米远,它可以捕捉声音并以光速而不是音速发送给用户。当然远的麦克风应该靠近噪声源。我讨厌这可能是真的,因为我不喜欢e接受某些事情是不可能的。即使解决方案不是完美的,我也必须相信有一种方法可以建立一个校准方案或机制来动态补偿。不过,我很感谢反馈和投票结果:)我看不出你能做任何校准或补偿,除非你让用户参与进来,而且这个过程对他们来说可能比噪音本身更烦人,特别是如果他们有一些紧密贴合的耳塞,可以阻挡很多噪音!而且它只对非常周期性或可预测的噪音有帮助。现实世界环境ntal噪声不是那样的,所以你进入了必须预测未来的领域……不过,尝试一些校准方法来处理非常周期性的外部噪声(可能是低频,正如比约恩·罗奇所说)可能会很有趣索尼Xperia Z2似乎对此进行了尝试。请查看。正如您正确指出的,用户在一定程度上参与了噪声消除方案的确定。从外观上看,您需要使用的特殊耳机在其中一个耳机的外部安装了麦克风,这将解决一些与距离相关的问题。