2

私の目的は、Android のAudioTrackクラスを使用して、 sinesquaretrianglesawtooth信号を生成することです。

私はチュートリアルに基づいて試みました。生成された周波数が目的の周波数にどれだけ正確に対応するかは常にわかりませんが、比較的うまく機能します。

四角、三角などの関数を作りたいです。チュートリアルでは正弦波のみを実装しています。したがって、私の質問は次のとおりです。

サンプルはどのように機能しますか

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

基本的には、書かれているサンプルを根本的に理解したいので、さまざまな信号を生成し、最終的にそれらを重ねることもできます。

お時間をいただきありがとうございます!

4

1 に答える 1

3

私はこれが 1 年前のものであることを知っていますが... はい、signum は正常に動作するはずです。角度と増加するビジネスを捨てます。

このコードは、異なる周波数の正方形と三角形の 2 つの信号を重ね合わせます。

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)

于 2011-10-15T02:58:52.790 に答える