我创建了一个音频缓冲区,想要在播放此声音之前编辑它。 我的问题是,当数字超过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);
}
}
答案 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,你就越少。