gpt4 book ai didi

安卓主动降噪

转载 作者:塔克拉玛干 更新时间:2023-11-02 18:56:27 48 4
gpt4 key购买 nike

我正在进行一个有点雄心勃勃的项目,目的是在 Android 上使用耳塞或耳机实现主动降噪。

我的目标是用 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();
}
}

当我发现 Android API 实际上已经有一个 NoiseSuppression 算法时,我感到非常兴奋(您会在上面看到它被注释掉了)。我用它进行了测试,发现 NoiseSuppressor 并没有做太多事情来消除恒定音调,这让我相信它实际上只是在非人声频率上执行带通滤波器。

所以,我的问题:

1) 上述代码从麦克风录音到耳机播放大约需要 250-500 毫秒。这种延迟很糟糕,减少它会很棒。如有任何建议,我们将不胜感激。

2) 无论延迟有多紧,我的理解是播放波形将与实际环境噪声波形有相位偏移。这表明我需要执行某种波形匹配来计算此偏移量并进行补偿。关于如何计算的想法?

3) 谈到延迟补偿时,它会是什么样子?我在每个周期都有一系列短路,那么 30 毫秒或 250 毫秒的延迟会是什么样子?

我知道这种方法的根本问题是手机不靠近头部的位置可能会引入一些错误,但我希望通过一些动态或固定的延迟校正,这可能是可能的克服它。

感谢您的任何建议。

最佳答案

即使您能够对延迟采取一些措施,这也是一个难题,因为您不知道手机离耳朵的距离,而且距离不是固定的(因为用户会移动耳机)电话),再加上您没有为每只耳朵配备麦克风(因此即使您的延迟为零,您也无法知道一只耳朵的波是什么,直到它到达那里)

话虽如此,您也许可以做一些可以消除高度周期性波形的事情。不过,您所能做的就是允许用户手动调整每只耳朵的时间延迟 - 因为您的耳朵本身附近没有麦克风,您无法在代码中知道您是否使问题变得更好或更糟。

关于安卓主动降噪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20153516/

48 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com