У меня сейчас идея поэкстравагантнее крутится. Я пишу генерацию синуса алгоритмом Брезенхэма :)
Вид для печати
У меня сейчас идея поэкстравагантнее крутится. Я пишу генерацию синуса алгоритмом Брезенхэма :)
Не надо ничего интерполировать. Если количество периодов и длина массива данных не имеют общих делителей - то данные периодов будут дополнять друг друга. Они не будут повторяться от периода к периоду в пределах длины массива. Для окончательной обработки их придется всего лишь перетасовать.
На 29 периодах у меня отличная точность получилась после перетасовки.
Алгоритм перетасовки следующий
Код:j = 0;
for(i=0; i<256; i++)
{
y[j] = x[i];
j = (j+29) % 256;
}
Реализовал алгоритм, работающий на рекуррентном соотношении с 55 периодами и последующей перетасовкой. Число периодов и амплитуду синуса пришлось подбирать вручную: неоптимальные значения приводят к большим погрешностям. Соответственно был вычислен и жестко запрограммирован множитель k.
Вычисляется таблица синуса длиной 256 байт, 8-битные значения. Погрешность - +-8. На картинке красная линия - точные значения, синяя - вычисленные данной прогой.
58 байт.
А вот вариант на 73 периодах. Получилось даже еще лучше. Максимальная погрешность - +-5.