首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Android的AudioTrack类生成正弦、正方形、三角形、锯齿形音频信号

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

Stack Overflow用户
提问于 2010-10-21 09:58:05
回答 1查看 8.8K关注 0票数 2

我的目标是使用Android的AudioTrack类生成正弦square三角锯齿信号。

我做了一个基于教程的尝试。它的工作相对良好,虽然我并不总是确定产生的频率与所针对的频率对应的准确程度。

我想做正方形、三角形等功能。本教程只实现正弦。因此,我的问题是:

样本到底是如何工作的?

代码语言:javascript
复制
  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函数)?

代码语言:javascript
复制
samples[i] = (float)Math.signum(Math.sin( angle ));

基本上,我想从根本上理解正在编写的示例,这样我就可以生成各种信号并最终实现superposition

谢谢您抽时间见我!

EN

回答 1

Stack Overflow用户

发布于 2011-10-15 02:58:52

我知道这是一年前的事但是..。是的,先生应该工作得很好。抛开角度,增加生意。

这个代码叠加了两个信号--一个正方形和一个不同频率的三角形。

代码语言:javascript
复制
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)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3986248

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档