android降噪算法,Android主动降噪功能
我正在做一個(gè)有點(diǎn)雄心勃勃的項(xiàng)目,通過耳機(jī)或耳機(jī)在
Android上實(shí)現(xiàn)主動(dòng)降噪.
我的目標(biāo)是用Android手機(jī)麥克風(fēng)記錄環(huán)境噪音,反相(從音頻記錄中拉出的短值上的簡單* -1),然后通過耳機(jī)播放倒置的波形.如果延遲和幅度接近正確,則應(yīng)該使環(huán)境中的大量機(jī)械結(jié)構(gòu)噪聲無效.
這是我到目前為止所得到的:
@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
//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();
}
}
我一時(shí)興奮地發(fā)現(xiàn)Android API實(shí)際上已經(jīng)有了一個(gè)NoiseSuppression算法(你會(huì)在上面看到它注釋掉).我用它進(jìn)行了測試,發(fā)現(xiàn)NoiseSuppressor沒有做太多的事情來消除恒定音調(diào),這讓我相信它實(shí)際上只是在非人聲頻率下執(zhí)行帶通濾波器.
所以,我的問題:
1)上述代碼從麥克風(fēng)錄制到耳機(jī)播放大約需要250-500毫秒.這種延遲很糟糕,減少它會(huì)很棒.任何建議將不勝感激.
2)無論延遲有多緊,我的理解是回放波形將與實(shí)際環(huán)境噪聲波形相位偏移.這表明我需要執(zhí)行某種波形匹配來計(jì)算此偏移并進(jìn)行補(bǔ)償.關(guān)于如何計(jì)算的想法?
3)在補(bǔ)償延遲方面,這會(huì)是什么樣子?我在每個(gè)周期都有一系列短路,那么30ms或250ms的延遲是什么樣的呢?
我知道這種方法的基本問題是手機(jī)的位置不在頭部旁邊可能會(huì)引入一些錯(cuò)誤,但我希望有一些動(dòng)態(tài)或固定的延遲修正可能有可能克服它.
謝謝你的任何建議.
總結(jié)
以上是生活随笔為你收集整理的android降噪算法,Android主动降噪功能的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 小鱼生存法则
- 下一篇: Android程序员面试必须要掌握的:H