2016-04-14 154 views
0

我研究了很長一段時間在Android上產生的正弦波,並且我在網上找到了一些示例代碼。但是,當我自己編碼時,我仍然困惑不解。 我使用的代碼等下列當我用Java在Android上產生正弦波時噪音很大

double[] buf = new double[(int) sampleRate]; 
byte[] buffer = new byte[(int) sampleRate]; 
double sampleInterval = sampleRate/frequency; 
for(int i=0; i<sampleRate;i++){ 
    buf[i] = (Math.sin((2.0*Math.PI*i)/sampleInterval)); 
    buffer[i] = (byte)(buf[i]*Byte.MAX_VALUE); 
} 
while(flag) { 
    audioTrack.write(buffer, 0, buffer.length); 
} 
  1. 我有太多噪聲,當我玩由式「Math.sin生成的正弦波緩衝液((2.0 * Math.PI * I)/ sampleInterval) 」。我不知道它是Android或我的編碼Java &的問題。在模擬器和我真正的索尼手機都顯示噪音。但是在我的同學的筆記本電腦上使用Matlab的相同公式可以很好地工作。 我也嘗試在桌面java代碼中使用DataSourceLine。噪音也存在。

2.產生的聲音往往是不穩定的,有時是連續的,但有時它可能是斷斷續續的,伴隨着明顯的經常起伏。

如何提高代碼的穩定性和準確性?

+0

[生成的Java正弦波時,在背景噪聲(的可能的複製http://stackoverflow.com/questions/740619/noise-in-background-when做-generating-sine-wave-in-java) –

回答

0

爲什麼兩個緩衝區?

你可以用一個

double phase = 0.0; 
amp = 10000; 
short[] buffer = new short[BUFSIZE]; // BUFSIZE should be result from audiotrack.getMinBufferSize 
double phaseIncrement = (2 * Math.PI * frequency)/sampleRate; 
for (int i = 0; i < BUFSIZE; i++) { 
    buffer[i] = (short) (amp * Math.sin(phase)); 
    phase += phaseIncrement; 
} 

audioTrack.write(buffer, 0, buffer.length); 
+0

我試圖更新我的代碼。它的工作原理和噪音減少了。但有時他們仍然存在。例如,當我將頻率設置爲21000時,它可能會發出非常尖銳的聲音。它可能是Java的不穩定性嗎? –

+0

你爲什麼需要這麼高的頻率? – Syntey

+0

來自我在Uni的研究項目。我需要產生一種人們聽不到的聲音。 –