我创建了一个音频缓冲区,并想在播放此声音之前对其进行编辑。
我的问题是,当数字大于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);
}
}
最佳答案
您说“我的问题是,当数字大于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时,失真会更少。