Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Генератор синусоиды на базе фильтра 2-го порядка
Форум разработчиков электроники ELECTRONIX.ru > Цифровая обработка сигналов - ЦОС (DSP) > Алгоритмы ЦОС (DSP)
hattons
Пытаюсь реализовать для учебного проекта способ генерации синусоиды на базе нестабильного звена второго порядка по следующей схеме:

Задержку и умножитель объединил в блок
, выход register первого блока заведен на in_data второго, out_data обоих блоков заведены на сумматор, результат сдвигается на один разряд влево (*2) и идет на вход in_data первого блока и на выход генератора.
Генерируется 40 отсчетов на период. Коэффициенты фильтра A=1.975 и B=-1 поделены на 2: 0x7e66 и 0xC000 (из-за этого выход суматора и сдвигается).
У меня по сигналу сброса на регистре первого блока устанавливается начальное значение 0.1409 (0x1209), а на регистре второго блока 0 (0x0000).
Делаю по аналогии с документом Texas Instruments: скачать.
В итоге у меня ничего не работает, вернее генерируется 3 положительных значения, 3 отрицательных и т.д., но ничего общего с тем, что должно быть.
Подскажите, я неправильно строю устройство, ошибка в коэффициентах или что-то еще. Код пока не выкладываю, т.к. он написан довольно сумбурно, но в компонентах я абсолютно уверен, соединения простейшие и ошибки скорее всего нет.
_Anatoliy
Цитата(hattons @ Dec 14 2008, 23:58) *


В матлабе получается,должно работать и при другой реализации.
Цитата
y1=0;
y2=sin(pi/20);
for i= 1:1:80
y0(i)=y1*1.9754 - y2;
y2=y1;
y1=y0(i);
end
plot(y0);

Нажмите для просмотра прикрепленного файла
hattons
Рискую конечно быть осмеянным за свой дурацкий подход к описанию элементов, но очень надо чтобы симуляция происходила правильно. Выложу все таки проект (ISE + Modelsim). Еще раз подчеркну, что проект учебный (т.е. это часть лабораторной работы) и умножитель (dcmul.vhd - перемножает 16-тиразрядные числа в дополнительном коде) сделан комбинационной схемой без сигналов готовности и т.д., сдвиг я делал просто переназначением разрядов. Может, кто-нибудь найдет время посмотреть... Буду очень признателен. unsure.gif
Самурай
Цитата(hattons @ Dec 15 2008, 21:21) *
Рискую конечно быть осмеянным за свой дурацкий подход к описанию элементов, но очень надо чтобы симуляция происходила правильно. Выложу все таки проект (ISE + Modelsim). Еще раз подчеркну, что проект учебный (т.е. это часть лабораторной работы) и умножитель (dcmul.vhd - перемножает 16-тиразрядные числа в дополнительном коде) сделан комбинационной схемой без сигналов готовности и т.д., сдвиг я делал просто переназначением разрядов. Может, кто-нибудь найдет время посмотреть... Буду очень признателен. unsure.gif


Сильно глубоко не копал (ибо тяжко очень), но вот что бросилось в глаза: в модуле dcmul.vhd Вы вроде как делаете умножение знаковых чисел, однако я не увидел, что бы сохранялся знак операндов перед умножением их модулейsmile.gif. Ну а после умножения модулей уже поздно пить боржомиsmile.gif.
Самурай
был глюк, убрал вторую копию постаsmile.gif
Заодно глянул повнимательнее, насчет потери знаков я похоже ошибся. Но вообще, в этом "учебном" примере ошибка может быть где угодно, проще заново написать наверноsmile.gif.
hattons
Спасибо всем, кто откликнулся -- заменил умножитель на нормальный (этот я брал из предыдущего проекта) и все шикарно заработало. laughing.gif
Stanislav
Цитата(hattons @ Dec 15 2008, 00:58) *
Пытаюсь реализовать для учебного проекта способ генерации синусоиды на базе нестабильного звена второго порядка по следующей схеме:
....................................
Подскажите, я неправильно строю устройство, ошибка в коэффициентах или что-то еще. Код пока не выкладываю, т.к. он написан довольно сумбурно, но в компонентах я абсолютно уверен, соединения простейшие и ошибки скорее всего нет.
Предлагаю начать с уяснения следующего:
синусоиду на базе нестабильного звена на практике реализовать невозможно.
Ибо ошибки вычисления имеют свойство накапливаться.

Цитата(_Anatoliy @ Dec 15 2008, 13:59) *
В матлабе получается,должно работать и при другой реализации.
Цитата
y1=0;
y2=sin(pi/20);
for i= 1:1:80
y0(i)=y1*1.9754 - y2;
y2=y1;
y1=y0(i);
end
plot(y0);


Нажмите для просмотра прикрепленного файла

У меня есть вариант попроще (пересчитывать на другую частоту лень):
Код
plot(sin(pi/20*(1:80)))
smile.gif

Нестабильная система не может выдать какие-либо стабильные параметры в принципе.
Посему, генератор лучче делать без обратных связей, хоть это и несколько труднее.
Например, путём прямого вычисления гармонической функции путём полиномиального приближения.

Или вносить в систему затухание.
,

где , подавая на неё возбуждение с нужным периодом.

Цитата(hattons @ Dec 16 2008, 02:09) *
Спасибо всем, кто откликнулся -- заменил умножитель на нормальный (этот я брал из предыдущего проекта) и все шикарно заработало. laughing.gif
Этого не может быть.

Извиняюсь, если не понял чего.
hattons
Я спорить не буду конечно, т.к. сам дилетант в этих вопросах. Но в университете нам преподают этот способ в качестве одного из основных наряду с табличным, суммы двух углов и произведения двойного угла. В изданном кафедрой пособии по DSP процессорам он приведен в примере DTMF кодера. Обычно они приводят примеры из того, что делали когда-либо "на сторону".
Вот, что получилось у меня:

Оно может и не будет работать в реальности, но моя задача заключалась лишь в получении временной диаграммы в ISE или ModelSim. Я действительно использовал тот код, что разместил, заменил лишь умножитель и, вероятно, сумматор (не уверен, т.к. у меня беспорядок в папке проектов, и я мог скопировать в новый проект другой вариант).
alex_os
Вообще, способ довольно сомнительный. Когда-то пробовал во float арифметике амплитуда синусоиды имеет тенденцию увеличиваться или уменьшаться ( в зависимости от частоты синуса и частоты дискретизации). В double работает нормально. На счет целочисленной реализации сказать ничего не могу, возможно будет достаточно стабильная амплитуда, но частоты получаются дискретные smile.gif. ИМХО любые таблицы, таблицы с интерполяцией, cordic, полиноминальная аппроксимация синуса и т.д. лучше этой хрени.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.