java - 使用 Android 的 AudioTrack 类生成正弦波、方波、三角波、锯齿波音频信号

标签 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 ));

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

感谢您的宝贵时间!

最佳答案

我知道这已经有一年了,但是...是的,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)

关于java - 使用 Android 的 AudioTrack 类生成正弦波、方波、三角波、锯齿波音频信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3986248/

相关文章:

android - 在 Android 中共享应用程序 "link"

python - Python 中生成器的使用

java.io.File.isFile() 在不同线程中返回不同的值

android - 如何通过应用内购买将付费应用转换为免费应用?

java - Android 应用程序在设备和模拟器上崩溃(线程问题?)

android - Gradle在Windows上找不到AndroidSDK路径

python - 在 python 中调用生成器时引发 Unresolved 引用错误

javascript - 在 ES6 中如何判断迭代器用于什么生成器?

java - Selenium 移动鼠标不适用于低分辨率

java - 从 Java 应用程序发送电子邮件的最佳方式