Цитата(Russky @ Dec 10 2014, 22:43)

Всем привет!
Вот есть задача - генерировать квадратурный сигнал для DDC. DDC сам реализован внутри DSP, поэтому надо алгоритм чтобы его можно было-бы реализвать потом на аасемблере.
Используется плавующая точка.
В идеальном случае ф-я должна выглядеть так:
result = GenSinCos(float freq); где result это структура содержащая Cos и Sin, т.е. сигналы сдвинуты на 90 градусов.
freq - 0...1.
Ф-я вызывается для каждого отсчета. Начальная фаза в общем не очень важна. Главное чтобы 90 градусов было. По идее это даже не ф-я а макрос.
Как-то так.
Может кто уже встречал подобное? Или может уже есть готовые решения?
Особенность в том, что наверняка есть решение которое не вызывает ф-ю sin и cos каждый раз.

Спасибо!
PS. Табличный метод не предлагать!

Функция из работающей программы писал для DSP правда на Сях далее сами разберетесь и переведете на asm:
//Генератор гармонического колебания с рекуррентным вычислением
//Возвращает значение функции cos + i * sin при каждом вызове функции
//Fs - частота генерируемого колебания, Гц
//Fd - частота дискретизации, Гц
//phase - начальная фаза в градусах
//order - изменение этого параметра используется для сброса накапливающихся
//ошибок и устанавливает процесс генерации в исходное состояние с заданной фазой
//Параметр order не должен быть равным нулю
//Значения Fs и Fd активируются только одновременно с изменением параметра order
//Параметр order может меняться в любой момент
complex_long_double generator_sin_cos(long double Fs, long double Fd, long double phase, int order)
{
static long double a, b, sin, cos;
static int i = 0;
long double c_1, s_1, pi2, radian;
complex_long_double rez;
if(i != order)//инициализация
{
pi2 = 6.28318530717; radian = 57.29577951308;
a = cosd( pi2 * Fs / Fd ); b = sind( pi2 * Fs / Fd );
sin = sind( phase / radian ); cos = cosd( phase / radian ); i = order;
}
c_1 = cos; s_1 = sin;
cos = a * c_1 - b * s_1;// cos и sin есть отсчеты взаимно ортогональных колебаний
sin = a * s_1 + b * c_1;
rez.re = cos; rez.im = sin;
return rez;
}// end generator_sin_cos()