【问题标题】:Generating sine, square, triangle, sawtooth audio signals using Android's AudioTrack Class使用 Android 的 AudioTrack 类生成正弦、正方形、三角形、锯齿音频信号
【发布时间】:2011-04-28 12:37:53
【问题描述】:

我的目标是使用 Android 的 AudioTrack 生成 sinesquaretrianglesawtooth 信号 类。

我已根据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 ));

基本上,我想从根本上了解正在编写的样本,这样我就可以生成各种信号并最终叠加它们。

感谢您的宝贵时间!

【问题讨论】:

    标签: java android generator frequency


    【解决方案1】:

    我知道这是一岁了,但是...是的,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&lt;0?-1:1)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-10
      • 2019-08-13
      • 2021-12-23
      相关资源
      最近更新 更多