Генерация синусоидальных, квадратных, треугольных и пилообразных аудиосигналов с использованием класса Android AudioTrack - PullRequest
2 голосов
/ 21 октября 2010

Моя цель - генерировать синус , квадрат , треугольник и пилообразные сигналы с помощью 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();

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

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

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

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

1 Ответ

3 голосов
/ 15 октября 2011

Я знаю, что это год, но ... Да, 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)

...