Всем привет!
Имеется некий девайс, который с частотой дисретизации 1 кГц соответственно каждую миллисекунду производит измерение напряжения сети на одном из своих входов. Напряжение это почти синусоидальное (промышленная электросеть), частота примерно 50 Гц (вообще-то может быть 40-70 Гц). Измеренные отсчеты складываются в кольцевой буфер на 1000 значений (т.е. за последнюю секунду). Задача состоит в вычислении на каждом такте нескольких значений, сдвинутых на 1/6 периода, 1/3, 2/3, 5/6 и т.д. (нужно сделать трехфазное напряжение из однофазного с заданным сдвигом, причем, именно повторить форму.) Частоту напряжения измеряю довольно точно (сотые доли Гц). Короче, требуется вычислить значение, задержанное относительно текущего момента на некое t (не целое в тактах). Попробовал линейно интерполировать - получается не очень красиво, порядка 2% погрешности. Попробовал кубическую сплайн-интерполяцию - очень понравилось, однако, вычислять сплайн методом прогонки по нескольким точкам каждый раз - мягко говоря, неоптимально. Пробовал вообще без сплайна обойтись, а приближать синусоидой с заданной фазой и тем же действующим значением - совсем не понравилось, гармоник в сети оказалось изрядно.
Вопрос состоит в том, каким образом можно было бы вычислять коэффициенты для сплайна по одному за такт? Или кто может подсказать какое-то другое решение этой задачи?
Для справки: памяти много, поэтому можно хранить несколько массивов, если идти по пути оптимизации "обмен памяти на время". Увеличить частоту дискретизации не могу.
С уважением,
Виталий Насенник