Как я могу редактировать аудио буфер
Я создаю аудио буфер и хочу отредактировать его, прежде чем воспроизвести этот звук. Моя проблема в том, что я получаю большой шум, когда число больше 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". Но мне кажется, что "большой шум" - это именно то, что вы пытаетесь создать: ваш эффект называется "искажение", и вы выполняете целочисленное деление, когда число> 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 вы получите меньше.