Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как реализовать генератор квадратуры
Форум разработчиков электроники ELECTRONIX.ru > Цифровая обработка сигналов - ЦОС (DSP) > Алгоритмы ЦОС (DSP)
Страницы: 1, 2
_pv
Цитата(thermit @ Dec 16 2014, 19:05) *
Да. у вас крутой генератор.
Снимаю чепчик...

и как же тогда должно быть при 8ми разрядных коэффициентах и частоте в 0.1 от тактовой, взятых просто для примера?
или кто-то мешает разрядность увеличить так, чтобы ошибка квантования стала меньше допустимой?
andyp
Цитата(Russky @ Dec 16 2014, 15:22) *
Нет. Не придется вычислять каждый раз.
Вы немного не поняли принцып.


Откройте для себя наконец как работает табличный DDS с интерполяцией. Заодно сможете любую частоту генерить из одной таблицы разумного размера. Вычислений там - пара умножений и сложений на отсчет.
mihalevski
Цитата(Russky @ Dec 10 2014, 22:43) *
Всем привет!
Вот есть задача - генерировать квадратурный сигнал для DDC. DDC сам реализован внутри DSP, поэтому надо алгоритм чтобы его можно было-бы реализвать потом на аасемблере.
Используется плавующая точка.
В идеальном случае ф-я должна выглядеть так:
result = GenSinCos(float freq); где result это структура содержащая Cos и Sin, т.е. сигналы сдвинуты на 90 градусов.
freq - 0...1.
Ф-я вызывается для каждого отсчета. Начальная фаза в общем не очень важна. Главное чтобы 90 градусов было. По идее это даже не ф-я а макрос.
Как-то так.
Может кто уже встречал подобное? Или может уже есть готовые решения?

Особенность в том, что наверняка есть решение которое не вызывает ф-ю sin и cos каждый раз. sm.gif

Спасибо!

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



Функция из работающей программы писал для 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()



Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.