2014-09-12 32 views
-3

我正在編寫一個程序,我希望它能夠播放一個頻率。但我不知道在我的代碼中,我必須改變什麼。如何更改java中的音頻頻率?

try 
    { 
     byte[] buf = new byte[ 1 ];; 
     AudioFormat af = new AudioFormat((float)44100, 8, 1, true, false); 
     SourceDataLine sdl = AudioSystem.getSourceDataLine(af); 
     sdl = AudioSystem.getSourceDataLine(af); 
     sdl.open(af); 
     sdl.start(); 
     for(int i = 0; i < 1000 * (float)44100/1000; i++) { 
      double angle = i/((float)44100/440) * 2.0 * Math.PI; 
      buf[ 0 ] = (byte)(Math.sin(angle) * 100); 
      sdl.write(buf, 0, 1); 
     } 
     sdl.drain(); 
     sdl.stop(); 
     sdl.close(); 
     } 
    catch (Exception x1) 
    { 

    } 
    }  

回答

2

在下面一行:

double angle = i/((float)44100/440) * 2.0 * Math.PI; 

播放用數字440這個數字應該是赫茲頻率的。我通過消除過程知道這一點,440hz是音頻領域的「Hello,World」。

理論聽覺範圍是20hz到22000hz。 (22kHz)環繞

在大多數情況下,正常的聽力和揚聲器,你正在尋找65HZ-16000HZ

其他有些東西你看到:

44100 - 你的採樣率

1000 - 很確定這只是一秒鐘的ms。所以千分之四萬四千百從樣本/秒採樣/ MS轉換

Math.sin - 創建基於時間(你是什麼樣的,基本上)與正弦函數

如果你的y值希望在短時間內更好地理解這一點;查找採樣率和位深度的定義。

也一如既往,RTFM ...看看文檔,並檢查了被參數的參數要傳遞什麼。

AudioFormat af = new AudioFormat((float)44100, 8, 1, true, false); 

44100是採樣率,但對我來說8, 1,的確,假可能意味着什麼。 (8位可能是位深度,16位更常見,1可能意味着單聲道...)。

評論回來,如果檢查這個東西出來會帶來更多的音頻問題。

- 片商