2013-02-14 270 views
1

我想播放保存在字節數組上的信號,使用javax.sound.sampled.SourceDataLine。 我想開始玩一個簡單的正弦波。 對於某些頻率(例如1000Hz,400Hz),它可以很好地工作,但對於其他頻率(1001,440) 我只能聽到幾乎沒有任何意義的嗡嗡聲。 採樣率明確足夠高以防止混疊(16Khz)。 任何想法? 乾杯。java DSP合成器奇怪的行爲

import javax.sound.sampled.AudioFormat; 
import javax.sound.sampled.AudioSystem; 
import javax.sound.sampled.SourceDataLine; 

public class Player 
{ 

    private static float SAMPLE_RATE = 16000; 

    public static void main(String[] args) 
    { 
     playSound(); 
    } 


    private static void playSound() 
    { 
     try 
     { 
      final AudioFormat audioFormat = new AudioFormat(SAMPLE_RATE, 8, 1, true, true); 
      SourceDataLine line = AudioSystem.getSourceDataLine(audioFormat); 
      line.open(audioFormat); 
      line.start(); 
     /* the last argument here is the frequency in Hz. works well with 1000, but with 1001 I get week and pitchless clicking sound sound*/ 
      byte[] signal = smpSin(1, 1, 1000); 
      play(line, signal); 
      line.drain(); 
      line.close(); 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 
    } 


    private static byte[] smpSin(double lenInSec, double amp, double signalFreq) 
    { 
     int len = (int)(SAMPLE_RATE * lenInSec); 
     byte[] out = new byte[len]; 
     for (int i = 0; i < out.length; i++) 
     { 
      out[i] = (byte)(amp * Math.sin(((2.0 * Math.PI * signalFreq) * ((double)i))/SAMPLE_RATE)); 
     } 
     return out; 
    } 

    private static void play(SourceDataLine line, byte[] array) 
    { 
     line.write(array, 0, array.length); 
    } 

}

+0

一個想法是你可以發佈一些代碼。 – 2013-02-14 15:21:03

+0

一些代碼,一些數據,澄清什麼*沒有爭議的嗡嗡聲*的意思,並改變*它的作品很好* *它運作良好*。 – thang 2013-02-14 18:01:08

+0

添加了代碼。我以爲'好'是其中一個副詞。幸運的是,你仍然可以瞭解我的英語不好...... – 2013-02-15 07:09:46

回答

0

你是不是保存緩衝器調用之間的正弦波的相位。因此,任何相位不連續性都會導致遊戲速度()被調用。沒有嗡嗡聲的頻率恰好在您的默認開始階段結束。

+0

嗨,感謝您的回覆,但我不確定我是否明白。我正在緩衝一次。 – 2013-02-20 10:38:05