如何编辑音频缓冲区

时间:2012-06-13 11:12:28

标签: java android audio audio-recording audioeffect

我创建了一个音频缓冲区,想要在播放此声音之前编辑它。 我的问题是,当数字超过1时,我会发出很大的噪音。这意味着我只能这样做 当我不编辑缓冲区(数据)时播放没有噪音的缓冲区。 背景信息: data是一个audiorecord缓冲区,包含以下信息:

private static final String TAG = "Aufnahme";
private AudioRecord recorder = null;
private boolean isRecording = false;
private int SAMPLERATE = 44100;
private int CHANNELS = AudioFormat.CHANNEL_CONFIGURATION_MONO;
private int AUDIO_FORMAT = AudioFormat.ENCODING_PCM_16BIT;
private int bufferSize = AudioRecord.getMinBufferSize(SAMPLERATE, CHANNELS,
        AUDIO_FORMAT);
private Thread recordingThread = null;

我的效果课:

public class verzerrer {    
    public void distortion(short[] data) {      
        output out = new output();
        long[] y = new long[data.length];
        int number =1000;

        for(int i=1;i<data.length;i++){
            y[i]=(data[i]/number)*number;       
        }   

        for(int i=0;i<data.length;i++){
            data[i]=(short) y[i];
        }
        out.send(data);
    }   
}

1 个答案:

答案 0 :(得分:0)

你说&#34;我的问题是当数字超过1时我会发出很大的噪音。&#34;但它看起来像是一个&#34;大噪音&#34;正是你想要创造的东西:你的效果被称为&#34;扭曲&#34;并且当数字&gt;您正在执行整数除法1,这将产生非常大量的IM失真。

你创造的效果在我看来类似于压榨&#34;效果:丢掉最不重要的数据。如果你想创造一种更传统的失真(比如吉他放大器失真),你需要执行&#34;剪裁&#34;而不是&#34; bit crushing&#34;。像这样:

for(int i=1;i<data.length;i++){
    if( data[i] > number )
        y[i]=number;
    else if( data[i] < - number )
        y[i]=-number;       
}

这会产生谐波失真。数字越小,您获得的失真就越多。在这里,&#34;数字&#34;被称为&#34;阈值&#34;。你可能想要使用像

这样的东西
number=(Short) ( Short.MAX_VALUE * ( 1-t ) ) ;

来定义它。这里,t是浮点值。如果t越接近1,你就会得到更多的失真,越接近0,你就越少。