Как я могу редактировать аудио буфер

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

Другие вопросы по тегам