Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/212.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android audiotrack:如何消除背景噪音?_Android_Audiotrack_Noise Reduction - Fatal编程技术网

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

我有两个属性为44khz、立体声通道和16位的wav文件。我正试图在android中使用audiotrack将两者混合使用。我能把它们混在一起。但我玩的时候会有噪音。如何消除噪音

以下是我的代码:

        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。我猜剪辑会给你带来音质问题。。。保持简单。