Я хочу генерировать синусоидальный сигнал в C без использования стандартной функции sin(), чтобы вызвать синусоидальные изменения яркости светодиода. Моя основная идея заключалась в том, чтобы использовать таблицу поиска с 40 точками и интерполяцию.
Вот мой первый подход:
const int sine_table[40] = {0, 5125, 10125, 14876, 19260, 23170, 26509, 29196,
31163, 32364, 32767, 32364, 31163, 29196, 26509, 23170, 19260, 14876, 10125,
5125, 0, -5126, -10126,-14877, -19261, -23171, -26510, -29197, -31164, -32365,
-32768, -32365, -31164, -29197, -26510, -23171, -19261, -14877, -10126, -5126};
int i = 0;
int x1 = 0;
int x2 = 0;
float y = 0;
float sin1(float phase)
{
x1 = (int) phase % 41;
x2 = x1 + 1;
y = (sine_table[x2] - sine_table[x1])*((float) ((int) (40*0.001*i*100) % 4100)/100 - x1) + sine_table[x1];
return y;
}
int main()
{
while(1)
{
printf("%f ", sin1(40*0.001*i)/32768);
i = i + 1;
}
}
К сожалению, эта функция иногда возвращает значения, намного превышающие 1. Кроме того, интерполяция не кажется хорошей (я использовал это для создания синусоидальных изменений яркости светодиода, но они очень немыслимы).
У кого-нибудь есть идея реализовать синусоидальный генератор в C?