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 は float 値です。t が 1 に近づくと歪みが大きくなり、0 に近づくと歪みが小さくなります。

于 2012-06-13T14:59:57.870 に答える