0

我创建了一个音频缓冲区并想在播放此声音之前对其进行编辑。我的问题是当数字大于 1 时我会听到很大的噪音。这意味着当我不编辑缓冲区(数据)时,我只能播放没有噪音的缓冲区。背景信息:数据是一个录音缓冲区,包含以下信息:

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);
    }   
}
4

1 回答 1

0

你说“我的问题是当数字大于 1 时我会发出很大的噪音。” 但在我看来,“大噪音”正是你想要创造的:你的效果被称为“失真”,当数字 > 1 时,你正在执行整数除法,这将产生非常大的 IM 失真。

您创建的效果在我看来类似于“有点粉碎”效果:丢弃最不重要的数据。如果您希望创建更传统的失真(如吉他放大器失真),则需要执行“削波”,而不是“位压碎”。像这样:

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

这将产生谐波失真。数字越小,得到的失真就越大。这里,“数字”被称为“阈值”。你可能想使用类似的东西

number=(Short) ( Short.MAX_VALUE * ( 1-t ) ) ;

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

于 2012-06-13T14:59:57.870 回答