[an error occurred while processing this directive]
|
1) Считать честный синус для каждого сампла, например разложив функцию sin в какой-нибудь ряд, например Тейлора. Проблемы с несколько большим объемом вычислений.
2) Сделать осцилятор с обратной связью, обычно второго порядка.
Проблемы стабильности амплитуды, особенно на fixed-point изза всевозможных округлений.
3) Look-up table. Есть таблица из N, например 256, значений синуса. Практически любую частоту можно получить путем нехитрых вычислений. Наверное, это самый популярный способ.
Пример чатота 1000Hz на дискретизации 64000s/sec:
extern int SineTable256[];
int OutputBuffer[256];
unsigned int CurrentPhase=0; //0=0*pi, 32768=pi, 0=2*pi
unsigned int PhaseIncrement=1024 //int(1000*0x1000/64000)
for(Cnt=0; Cnt<256; ++Cnt)
{
OutputBuffer[Cnt]=SineTable256[CurrentPhase>>8];
CurrentPhase += PhaseIncrement; //modulo 65536 addition
}
Никаких попыток оптимизации не делалось
E-mail: info@telesys.ru