Генерация синусоидальных, прямоугольных, треугольных, пилообразных звуковых сигналов с использованием Android AudioTrack Class

Моя цель — генерировать синусоидальные, квадратные, треугольные и пилообразные сигналы с помощью Android AudioTrack Класс.

Я предпринял попытку на основе учебника. Он работает относительно хорошо, хотя я не всегда уверен, насколько точно генерируемая частота соответствует заданной частоте.

Я хотел бы сделать квадратные, треугольные и т.д. функции. Учебник реализует только синус. Поэтому мой вопрос:

Как именно работает образец

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

Могу ли я преобразовать синус в квадрат следующим образом (используя сигнум-функцию)?

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

По сути, я хотел бы фундаментально понять написанные образцы, чтобы я мог генерировать различные сигналы, а также в конечном итоге накладывать их.

Спасибо за ваше время!


person Flying Swissman    schedule 21.10.2010    source источник


Ответы (1)


Я знаю, что этому уже год, но... Да, сигнум должен работать нормально. Откажитесь от угла и увеличения бизнеса.

Этот код накладывает два сигнала - квадрат и треугольник на разных частотах.

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)

person karnok    schedule 15.10.2011