Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: "враг" в DDC
Форум разработчиков электроники ELECTRONIX.ru > Цифровая обработка сигналов - ЦОС (DSP) > Алгоритмы ЦОС (DSP)
pirri
Помогите, пожалуйста, разобраться:
Необходимо перенести сигнал с IF=15MГц в baseband. Переношу с помощью смесителя на основе алгоритма CORDIC. Сама написать VHDL-код для него я не осилила, поэтому использую чужой, успешно опробованный в других проектах. Код работает, сигнал смещается, но на графике FFT смещенного сигнала в матлабе на частоте -15МГц присутствует пик, точно на частоте осциллятора.
Что это такое? Как этого избежать?
Oldring
Цитата(pirri @ Nov 11 2009, 22:48) *
Помогите, пожалуйста, разобраться:
Необходимо перенести сигнал с IF=15MГц в baseband. Переношу с помощью смесителя на основе алгоритма CORDIC. Сама написать VHDL-код для него я не осилила, поэтому использую чужой, успешно опробованный в других проектах. Код работает, сигнал смещается, но на графике FFT смещенного сигнала в матлабе на частоте -15МГц присутствует пик, точно на частоте осциллятора.
Что это такое? Как этого избежать?


Перенесенная постоянная составляющая вхордного сигнала. Отфильтровать.
Михаил_K
Цитата(Oldring @ Nov 12 2009, 06:32) *
Перенесенная постоянная составляющая вхордного сигнала. Отфильтровать.


Возможно будет не понятно, что имел ввиду Oldring. Поясню. Фильтровать нужно постоянную составляющую до того, как подаете сигнал на смеситель.
Как это сделать, посмотреть можно здесь
http://electronix.ru/forum/index.php?act=S...f=2&t=54351
pirri
Спасибо.
Если это часть входного, почему ее нет на FFT сигнала, перенесенного в Матлабе умножением на синус (signal*e^(-jwt))?
bahurin
Цитата(pirri @ Nov 12 2009, 10:24) *
Спасибо.
Если это часть входного, почему ее нет на FFT сигнала, перенесенного в Матлабе умножением на синус (signal*e^(-jwt))?

добавьте в матлабе постоянную составляющую к исходному сигналу и она будет
pirri
Простите, но не понимаю я: на вход Сordic смесителя я подаю сигнал из Матлаб программы, сигнал, в котором нет этой составляющей (на спектре ее нет). Она появляется только после смещения на VHDL.
Занимаюсь ЦОС только 4 месяца, не судите строго unsure.gif
diwil
Цитата(pirri @ Nov 12 2009, 13:41) *
Простите, но не понимаю я: на вход Сordic смесителя я подаю сигнал из Матлаб программы, сигнал, в котором нет этой составляющей (на спектре ее нет). Она появляется только после смещения на VHDL.
Занимаюсь ЦОС только 4 месяца, не судите строго unsure.gif


А вычисления потом целочисленные или в плавающей точке?

Если целочисленные, ибо кордик, то тогда так (наверное smile.gif ) :

- при преобразовании float -> int делают так:
1. int = ( (1<<(N-1)) - 1 )*float, где N - число бит всего в целочисленном представлении сигнала.
2. Иногда еще к этому произведению добавляют 0.5 для округления обрезанием smile.gif
3. в том и другом случае int_max + int_min == -1, т.е. сумма отсчетов синусоиды за период может быть не равна нулю.
Причем чем меньше амплитуда сигнала, равно как и маленькая разрядность числа (N) , тем больше может быть уровень постоянной составляющей.

Значит, на входе может быть постоянная составляющая, котороая, будучи умноженной на синус даст синус.

Далее... кордик... тоже вестч в себе:
- Операция x <= x - (y>>>n); (n - номер шага кордика) на каждом шаге дает ошибку, равно как и умножение на 0.60725... В самом простом случае вылезут спуры и их будет тем больше, чем меньше разрядность. Причем это не те спуры, которые получаются при табличной реализации синуса. Следовательно надо сначала проверить какие они и посмотреть какие комбинаторные составляющие они могут дать.
- Несколько помогает округление: xx <= x - ( (y + (1<<(n-1))) >>> n);
- dithering помогает хорошо, но надо хорошо посмотреть на выход. У меня, на первой реализации кордика получился плохой дизер и поползла постоянная составляющая. А она, умножаясь на синус сигнала дает палку в спектре выходного сигнала.


В плавающей точке, наверное, могут наблюдаться те же эффекты...

Только вопрос - ну видна палка на частоте гетеродина, ну и что? Если сигнал переносится в частоту ноль (или около того), то точно совершенно его полоса меньше частоты IF. На выходе уже перенесенный сигнал отфильтровать в своей полосе и счастье будет рядом smile.gif

Из опыта лишь могу добавить, что в случае большого усиления после смесителя, мне пришлось для избавления от постоянной составляющей (-120дБ от уровня сигнала... я, типа, извращенец) всякими хитрыми способами переделывать округления промежуточных результатов, использовать округление в кордике и делать смещенное округление в первом фильтре как:
Код
assign out_i = (x3_i[DON-1-COMB_RID_3] == 1'b0) ?  (x3_i[DON-1-COMB_RID_3 : DON-COMB_RID_3-DDA] + x3_i[DON-COMB_RID_3-DDA-1]) : (x3_i[DON-1-COMB_RID_3 : DON-COMB_RID_3-DDA]);// - x3_i[DON-COMB_RID_3-DDA-1]);
assign out_q = (x3_q[DON-1-COMB_RID_3] == 1'b0) ?  (x3_q[DON-1-COMB_RID_3 : DON-COMB_RID_3-DDA] + x3_q[DON-COMB_RID_3-DDA-1]) : (x3_q[DON-1-COMB_RID_3 : DON-COMB_RID_3-DDA]);// - x3_q[DON-COMB_RID_3-DDA-1]);

т.е. отрицательные числа округлять, а положительные не трогать.
Михаил_K
Какой уровень этой палки?
pirri
Спасибо всем за скорую помощь, я - бестолочь. =)
Я симулировала 1 мкс, а входных данных хватало на 300 нс. Поэтому в оставшееся время смеситель обрабатывал нули, генерируя на выходе синусоиду. Отсюда и "палка".
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.