Android audiotrack:如何消除背景噪音?
我有两个属性为44khz、立体声通道和16位的wav文件。我正试图在android中使用audiotrack将两者混合使用。我能把它们混在一起。但我玩的时候会有噪音。如何消除噪音 以下是我的代码:Android audiotrack:如何消除背景噪音?,android,audiotrack,noise-reduction,Android,Audiotrack,Noise Reduction,我有两个属性为44khz、立体声通道和16位的wav文件。我正试图在android中使用audiotrack将两者混合使用。我能把它们混在一起。但我玩的时候会有噪音。如何消除噪音 以下是我的代码: int frequency = 44100; int channelConfiguration = AudioFormat.CHANNEL_CONFIGURATION_STEREO; int audioEncoding = AudioFormat.ENC
int frequency = 44100;
int channelConfiguration = AudioFormat.CHANNEL_CONFIGURATION_STEREO;
int audioEncoding = AudioFormat.ENCODING_PCM_16BIT;
int minbufferSize = AudioTrack.getMinBufferSize(frequency, channelConfiguration,audioEncoding);
AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, frequency,
channelConfiguration, audioEncoding, minbufferSize,
AudioTrack.MODE_STREAM);
int bufferSize = 512;
int count = 0;
int count2 = 0;
byte[] data = new byte[bufferSize];
byte[] data2 = new byte[bufferSize];
byte[] data3 = new byte[bufferSize];
try{
FileInputStream fileInputStream = new FileInputStream("/sdcard/file1.wav");
DataInputStream dataInputStream = new DataInputStream(fileInputStream);
FileInputStream fileInputStream2 = new FileInputStream("/sdcard/file2.wav");
DataInputStream dataInputStream2 = new DataInputStream(fileInputStream2);
audioTrack.play();
while((count = dataInputStream.read(data, 0, bufferSize)) > -1 && (count2 = dataInputStream2.read(data2, 0, bufferSize)) > -1){
for (int i=0;i<data3.length;i++){
float samplef1 = (data[i] / 128.0f);
float samplef2 = (data2[i] / 128.0f);
float mixed = samplef1 + samplef2;
// reduce the volume a bit:
mixed *= 0.9;
// hard clipping
if (mixed > 1.0f) mixed = 1.0f;
if (mixed < -1.0f) mixed = -1.0f;
byte outputSample = (byte) (mixed * 128.0f);
data3[i] = outputSample;
}
audioTrack.write(data3, 0, count);
}
L.m("Thread completed");
audioTrack.stop();
audioTrack.release();
dataInputStream.close();
fileInputStream.close();
}
catch (FileNotFoundException e){
e.printStackTrace();
rawaudioisRunning = false;
} catch (IOException e) {
e.printStackTrace();
rawaudioisRunning = false;
}
int频率=44100;
int channelConfiguration=AudioFormat.CHANNEL\u CONFIGURATION\u立体声;
int audioEncoding=AudioFormat.ENCODING_PCM_16位;
int minbufferSize=AudioTrack.getMinBufferSize(频率、频道配置、音频编码);
AudioTrack AudioTrack=新的AudioTrack(AudioManager.STREAM_音乐、频率、,
信道配置、音频编码、最小缓冲区大小、,
音频跟踪模式(音频流);
int bufferSize=512;
整数计数=0;
int count2=0;
字节[]数据=新字节[bufferSize];
字节[]数据2=新字节[bufferSize];
字节[]数据3=新字节[bufferSize];
试一试{
FileInputStream FileInputStream=newfileinputstream(“/sdcard/file1.wav”);
DataInputStream DataInputStream=新的DataInputStream(fileInputStream);
FileInputStream fileInputStream2=新的FileInputStream(“/sdcard/file2.wav”);
DataInputStream dataInputStream2=新的DataInputStream(fileInputStream2);
音轨播放();
而((count=dataInputStream.read(data,0,bufferSize))>-1&&(count2=dataInputStream2.read(data2,0,bufferSize))>-1){
对于(inti=0;i1.0f)混合=1.0f;
如果(混合<-1.0f)混合=-1.0f;
字节输出样本=(字节)(混合*128.0f);
数据3[i]=输出样本;
}
audioTrack.write(数据3,0,计数);
}
L.m(“螺纹完成”);
audioTrack.stop();
audioTrack.release();
dataInputStream.close();
fileInputStream.close();
}
catch(filenotfounde异常){
e、 printStackTrace();
rawaudioisRunning=假;
}捕获(IOE异常){
e、 printStackTrace();
rawaudioisRunning=假;
}
采用快速傅里叶变换分析的数字信号处理。在我们看到在频域中分析的音频片段之前,不确定要过滤什么。您有任何将两个流与FFTmix两个流混合的示例吗?您只需在时域中对两个数据流求和。如果你想过滤掉噪音,你需要确定所涉及的频率。这需要快速傅立叶变换分析。这里有一个非常棒的学习方法。。。在上面的代码示例中,您直接添加(混合)file1.wav和file2.wav中的采样内容,代码行float mixed=samplef1+samplef2代码>我会说,我不明白为什么要将样本除以128,为什么要进行剪切,然后再乘以128。我猜剪辑会给你带来音质问题。。。保持简单。