2012-06-13 155 views
0

我創建了一個音頻緩衝區,並希望在播放此聲音之前對其進行編輯。 我的問題是,當數字大於1時,我得到一個很大的噪音。這意味着當我不編輯緩衝區(數據)時,我只能用 播放沒有噪音的緩衝區。 背景信息: 數據是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

你說「我的問題是,我得到一個大噪時數大於1.」但是在我看來,像一個「大噪音」正是你想要創造的:你的效果被稱爲「失真」,並且當數字> 1時,你將執行整數除法,這將產生非常大量的IM失真。

您創建的效果在我看來與「bit crush」效果類似:丟棄最不重要的數據。如果你正在尋找創造一個更傳統的失真(如吉他放大器失真),你需要執行「剪輯」,而不是「位破碎」。像這樣:

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則會變得更少。

+0

謝謝你的回答。問題在於扭曲應該是下一步。首先,我只想編輯緩衝區,但我忘記了long不是一個浮點數(錯誤的錯誤)。萬分感謝 – anonym2048