使用Android的AudioTrack Class生成正弦,方波,三角波,锯齿波音频信号

时间:2010-10-21 09:58:05

标签: java android generator frequency

我的目标是使用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();

我可以将正弦变成如下的正方形(使用signum函数)吗?

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

基本上,我想从根本上理解正在编写的样本,因此我可以生成各种信号,并最终叠加

感谢您的时间!

1 个答案:

答案 0 :(得分: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)