2010-10-21 172 views
2

我的目標信號是產生正弦正方形三角形鋸齒信號與Android的AudioTrack類。生成正弦波,方波,三角波,鋸齒波的音頻使用Android的AudioTrack類

我已經根據tutorial進行了嘗試。雖然我並不總能確定所產生的頻率與目標頻率的相符程度,但它工作得相當好。

我想做正方形,三角形等功能。該教程僅實現正弦。因此,我的問題是:

究竟怎麼樣工作

new Thread(new Runnable() 
    { 
    public void run() 
    {     
     final float frequency = 440; 
     float increment = (float)(2*Math.PI) * frequency/44100; // angular increment for each sample 
     float angle = 0; 
     AudioDevice device = new AndroidAudioDevice(); 
     float samples[] = new float[1024]; 

     while(true) 
     { 
      for(int i = 0; i < samples.length; i++) 
      { 
       samples[i] = (float)Math.sin(angle); 
       angle += increment; 
      } 

      device.writeSamples(samples); 
     }    
    } 
    }).start(); 

我可以做正弦到像如下方(用符號函數)?

samples[i] = (float)Math.signum(Math.sin(angle)); 

基本上,我想從根本上理解被寫入的樣品,這樣我就可以產生各種信號,也最終疊加他們。

謝謝你的時間!

回答

3

我知道這是一歲但是...是的,signum應該可以正常工作。拋棄角度並增加業務。

該代碼疊加兩個信號 - 一個正方形和一個三角形,頻率不同。

int rate = 44100; 
AudioDevice device = new AndroidAudioDevice(); 
float samples[] = new float[1024]; 

while(true) 
{ 
    for(int i = 0; i < samples.length; i++) 
    { 
     samples[i] = (float)(0.5*Math.signum(Math.sin(550*2*Math.PI*i/rate))+0.5*Math.asin(Math.sin(450*2*Math.PI*i/rate))); 
    } 
    device.writeSamples(samples); 
} 

順便說一句,一個更好的方式做平方大概是:((550.0*2*i/rate)%2<0?-1:1)