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

Синусоидальная волна

Частота
Частота дискретизации
Амплитуда

void sinus(short amp, float freq, float dfreq, int len, short * outbuf) // амплитуда,частота волны, частота дискретизации,
{                                                           // размер буфера, выходной буфер
  float temp = 2.0 * M_PI * freq / dfreq;
  float cos = amp; 
  float sin = 0.0; 
  outbuf[0] = sin;
    for (int i = 1; i < len; i++)
    {
      sin += temp * cos;
      cos -= temp * sin;
      outbuf[i] = int(0.5 + sin); // округление
    }
}

Пилообразная волна

Частота
Частота дискретизации
Амплитуда

void sawtooth(short amp, float freq, float dfreq, int len, short * outbuf)
{
  int tempf = int(0.5 + dfreq / freq);
  float temp = 2.0 * amp * freq / dfreq;
  float t;
  int counter = 2;
    amp = -amp;                    
    outbuf[0] = amp;
    t = amp;
    for (i = 1; i < len; i++, counter++)
    {
      t += temp;
      outbuf[i] = t;     
      if (counter > tempf)                       
      {
        outbuf[i] = amp;
        t = amp;
        counter = 0;      
      }
     }
}





Треугольная волна

Частота
Частота дискретизации
Амплитуда


void triangle(short amp, float freq, float dfreq, int len, short * outbuf)
{
	int tempf = int(0.5 + dfreq / freq);
	int tempf2 = int(0.5 + dfreq/(2 * freq));
	float tempa = 4 * amp * freq / dfreq;	
	int counter = int(0.5 + tempf / 4);
        float t;	
	amp = -amp;
    outbuf[0] = 0;
    t = 0;
    for (i = 1; i < len; i++, counter++)
    {
      if (counter < tempf2)
      {        
          t += tempa;        
          outbuf[i] = int(0.5 + t);
      }
      else
      {
        if (counter > tempf)
        {
	     counter = 0;
             t = 0;
	     outbuf[i] = amp;
        } 
	else 
        {
	     t -= tempa;
             outbuf[i] = int(0.5 + t);
        }
      }
    }
  }


Прямоугольная волна

Частота
Частота дискретизации
Амплитуда


void square(short amp, float freq, float dfreq, int len, short * outbuf)
{
  int tempf = int(0.5 + dfreq / freq);
  int tempf2 = int (0.5 + dfreq / (freq * 2);
  int counter = 2;
  outbuf[0] = amp;
  for(int i = 1; i < len; i++, counter++)
  {
    if (counter <= tempf2)
    {
      outbuf[i] = amp;        
    } 
    else
    {
      outbuf[i] = -amp;        
      if (counter > tempf)
      {
        counter = 0;
      }
    }
  }
}


По материалам статьи http://democoder.ru/article/8

Коментарии