реклама на сайте
подробности

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> Квадратурный смеситель и постоянная составляющая
qwa
сообщение Jul 5 2015, 13:15
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 80
Регистрация: 8-02-15
Из: Санкт-Петербург
Пользователь №: 85 020



Всем привет.

Реализовал на ПЛИС квадратурный смеситель. Дальнейшую обработку упоминать не буду,ибо она вся многократно проверена и точно работает корректно. Поэтому соль в том,что при просмотре спектра выходного сигнала со смесителя я вижу в спектре гармонику на нулевой частоте (которой быть не должно,поскольку на входе,по сути,просто шум). Таким образом, где-то в моем смесителе возникла постоянная составляющая. У кого есть идеи,откуда она могла взяться?

Подробности:

Входной сигнал 16 бит поступает на умножители. Умножается он там на синус/косинус разрядностью 26 бит. Выходные сигналы с умножителей - 18 бит.

Эти 18 бит подаются на вход КИХ фильтра,который понижает частоту дискретизации. Выход фильтра - 16 бит (2 сигнала),которые потом записываются в сигнал 64 бита.

ПЛИС: Xilinx Virtex 5

Ядра, которые я использовал:
-DDS Compiler (синтезатор частоты);
-FIR Compiler (КИХ фильтр);
-Multiplier (умножитель).
Go to the top of the page
 
+Quote Post
rloc
сообщение Jul 5 2015, 13:39
Сообщение #2


Узкополосный широкополосник
******

Группа: Свой
Сообщений: 2 316
Регистрация: 13-12-04
Из: Moscow
Пользователь №: 1 462



После DDS или умножителя, например, нет округления.
Go to the top of the page
 
+Quote Post
qwa
сообщение Jul 5 2015, 14:49
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 80
Регистрация: 8-02-15
Из: Санкт-Петербург
Пользователь №: 85 020



Цитата(rloc @ Jul 5 2015, 16:39) *
После DDS или умножителя, например, нет округления.

Есть понижение разрядности,что эквивалентно делению.
Как я понимаю,это не то что вы имеете в виду.
Я знаю несколько способов округления. Какой наиболее предпочтителен для ПЛИС?
Go to the top of the page
 
+Quote Post
rloc
сообщение Jul 5 2015, 15:11
Сообщение #4


Узкополосный широкополосник
******

Группа: Свой
Сообщений: 2 316
Регистрация: 13-12-04
Из: Moscow
Пользователь №: 1 462



Предпочтения должны определяться задачей.

https://en.wikipedia.org/wiki/Rounding

В стандарте IEEE 754 по умолчанию принят метод "Round half to even", как симметричный. Часто хватает и "Round Up".
Go to the top of the page
 
+Quote Post
qwa
сообщение Jul 5 2015, 18:20
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 80
Регистрация: 8-02-15
Из: Санкт-Петербург
Пользователь №: 85 020



Округляю так:

Код
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.numeric_std.all;




ENTITY rounding_mixer_1 IS
   PORT(
      arst   : IN     std_logic;
      clk    : IN     std_logic;
      dout_i : OUT    std_logic_vector (17 DOWNTO 0);
      i_in   : IN     std_logic_vector (41 DOWNTO 0)
   );

-- Declarations

END rounding_mixer_1;

--
ARCHITECTURE rounding_ach OF rounding_mixer_1 IS
  signal prev : std_logic_vector (17 downto 0) := (others=>'0');
BEGIN
  process(clk,arst,i_in)
  begin
  if arst='1' then
    prev <= (others => '0');
  elsif rising_edge(clk) then
    if i_in(23)='1' then
      prev <= std_logic_vector(signed(i_in(41 downto 24)) + 1);
    else
      prev <= i_in(41 downto 24);
      end if;
      end if;
      end process;
      dout_i <= prev;
END ARCHITECTURE rounding_ach;


Все равно вижу постоянную составляющую в спектре.

Не правильно округляю или какие еще могут быть варианты?

Сообщение отредактировал qwa - Jul 5 2015, 18:22
Go to the top of the page
 
+Quote Post
Fat Robot
сообщение Jul 5 2015, 19:30
Сообщение #6


ʕʘ̅͜ʘ̅ʔ
*****

Группа: Свой
Сообщений: 1 008
Регистрация: 3-05-05
Пользователь №: 4 691



Округляете вы правильно, но описываете это коряво. Достаточно без всяких условий к разряду, предшествующему младшему для выхода, прибавить 1.

Насчет вашей угадайки: показывайте спектры
Входной сигнал
Гетеродин
Смеситель

Без них угадывать не интересно.
Go to the top of the page
 
+Quote Post
qwa
сообщение Jul 5 2015, 19:41
Сообщение #7


Частый гость
**

Группа: Участник
Сообщений: 80
Регистрация: 8-02-15
Из: Санкт-Петербург
Пользователь №: 85 020



Цитата(Fat Robot @ Jul 5 2015, 22:30) *
Округляете вы правильно, но описываете это коряво. Достаточно без всяких условий к разряду, предшествующему младшему для выхода, прибавить 1.

Как-то так

Код
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.numeric_std.all;


ENTITY rounding_mixer_1 IS
   PORT(
      dout_i : OUT    std_logic_vector (17 DOWNTO 0);
      i_in   : IN     std_logic_vector (41 DOWNTO 0)
   );

END rounding_mixer_1;

--
ARCHITECTURE rounding_ach OF rounding_mixer_1 IS
  signal prev : std_logic_vector (17 downto 0) := (others=>'0');
BEGIN
  process(i_in)
  begin
    if i_in(23)='1' then
      prev <= std_logic_vector(signed(i_in(41 downto 24)) + 1);
    else
      prev <= i_in(41 downto 24);
      end if;
      end process;
      dout_i <= prev;
END ARCHITECTURE rounding_ach;


К сожалению,я не смогу получить спектр сигнала до понижения частоты дискретизации - сигнальный процессор просто не успеет обработать. До децимации получается поток 120 МГц по 64 бита....


Цитата(Fat Robot @ Jul 5 2015, 22:30) *
Округляете вы правильно, но описываете это коряво. Достаточно без всяких условий к разряду, предшествующему младшему для выхода, прибавить 1.

Мне просто подумалось,что раз все выполнено в синхронном дизайне, то и округление надо бы так сделать... Новичок.
Go to the top of the page
 
+Quote Post
Fat Robot
сообщение Jul 5 2015, 19:52
Сообщение #8


ʕʘ̅͜ʘ̅ʔ
*****

Группа: Свой
Сообщений: 1 008
Регистрация: 3-05-05
Пользователь №: 4 691



Я полагал, что у вас есть верификационная оснастка, в которой можно сделать dump в интересующих точках, а потом посмотреть спектр. Без проверки вашего rtl-описания в симуляторе, что-то включать и смотреть на живом сигнале смысла не имеет.

Цитата(qwa @ Jul 5 2015, 20:41) *
К сожалению,я не смогу получить спектр сигнала до понижения частоты дискретизации - сигнальный процессор просто не успеет обработать. До децимации получается поток 120 МГц по 64 бита....
Go to the top of the page
 
+Quote Post
qwa
сообщение Jul 5 2015, 21:13
Сообщение #9


Частый гость
**

Группа: Участник
Сообщений: 80
Регистрация: 8-02-15
Из: Санкт-Петербург
Пользователь №: 85 020



Итак,вот что я увидел.
На вход - синус,частота его в полосе пропускания фильтра.
Первый сигнал - клок.
Следующий - сигнал асинхронного сброса.
Далее - управляющий сигнал от процессора.
Далее - входной сигнал.
Следующие 2 сигнала - выход умножителей после умножения на син/кос с округлением.
Последние 2 сигнала - выход фильтра с округлением.

UPD : нашел косяк,исправляю

Я заметил,что синус на входе был такой частоты,что при переносе спектра он выпадал из полосы пропускания фильтра.

Сделал так,чтобы попадал - результат аналогичный представленному.

Посмотрел выход непосредственно фильтра - там нули. Загадочно.

Сообщение отредактировал qwa - Jul 5 2015, 21:05
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Jul 6 2015, 04:37
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



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

А в случае знаковых чисел не надо иногда еще и вычитать?
1.2 + 0.5 = 1.7 -> 1
1.6 + 0.5 = 2.1 -> 2
Тут все ок, но для отрицательных
-1.2 + 0.5 = -0.7 -> 0
-1.6 + 0.5 = -1.1 -> -1
Сдвиг спектра на постоянные 0.5 в итоге за счет подброса на 1 отрицательной области
-1.2 - 0.5 = -1.7 -> -1
-1.6 - 0.5 = -2.1 -> -2
С учетом знака будет равномерное округление, или я совсем не про то?
Go to the top of the page
 
+Quote Post
qwa
сообщение Jul 6 2015, 07:26
Сообщение #11


Частый гость
**

Группа: Участник
Сообщений: 80
Регистрация: 8-02-15
Из: Санкт-Петербург
Пользователь №: 85 020



Цитата(Golikov A. @ Jul 6 2015, 07:37) *
А в случае знаковых чисел не надо иногда еще и вычитать?

Я вчера немного погуглил и нашел такую интересную статью : http://kanyevsky.kpi.ua/okruglenie.html
Думаю,там вы найдете ответ на свой вопрос.

Вчера,перед тем как лечь спать,нашел дурацкую ошибку. Потом отпишусь о результататах.
Go to the top of the page
 
+Quote Post
Fat Robot
сообщение Jul 6 2015, 08:36
Сообщение #12


ʕʘ̅͜ʘ̅ʔ
*****

Группа: Свой
Сообщений: 1 008
Регистрация: 3-05-05
Пользователь №: 4 691



Подтянулась тяжелая артиллерия...

-0.7 в вашем примере надо усекать, а не пытаться округлять к нулю дальше.
Усечение (оно же "округление в сторону " или "округление к меньшему") значения -0.7 до целых даст -1.

Цитата(Golikov A. @ Jul 6 2015, 05:37) *
но для отрицательных
-1.2 + 0.5 = -0.7 -> 0
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Jul 6 2015, 09:17
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Ваша правда, вот проверил на пальцах....

6 битное число, усекаем до 4 битного

3.25 == 0011 01, прибавляем 0.5 = 0000 10 и отбрасываем 2 последних бита 0011 01 + 0000 10 = 0011 11 -> 0011 = 3 - OK
3.75 == 0011 11 + 0000 10 = 0100 01 -> 0100 = 4 - 0k

-3.25 == 1100 11 по той же схеме... 1100 11 + 0000 10 = 1101 01 -> 1101 == -3 - Ok
-3.75 == 1100 01 + 0000 10 = 1100 11 -> 1100 == -4 - Ok

Всегда думал что преобразование действительного в целое в процах делается отбросом бит после учета знака, а получается они это делают до учета знака. Там обязательно учитывать знак прибавки, а то будет сдвиг, никогда не думал это проверять... вот оно как бывает.... Спасибо...
Go to the top of the page
 
+Quote Post
qwa
сообщение Jul 6 2015, 10:14
Сообщение #14


Частый гость
**

Группа: Участник
Сообщений: 80
Регистрация: 8-02-15
Из: Санкт-Петербург
Пользователь №: 85 020



В общем,я обнаружил,что умножал просто на синус, а вообще надо бы на минус синус.
К улучшению результата это не привело....
Go to the top of the page
 
+Quote Post
iiv
сообщение Jul 6 2015, 10:25
Сообщение #15


вопрошающий
*****

Группа: Свой
Сообщений: 1 726
Регистрация: 24-01-11
Пользователь №: 62 436



Цитата(qwa @ Jul 5 2015, 18:15) *
Входной сигнал 16 бит поступает на умножители. Умножается он там на синус/косинус разрядностью 26 бит. Выходные сигналы с умножителей - 18 бит.

Почему косинус и синус у Вас выбирается со значительно большей точностью, чем входные данные? Я бы взял те же 16 бит. А вот после умножения бы оставил все 32 бита и все их пользовал бы в фильтре, и только после фильтра округлял бы. При умножении 16 бит на 26 бит и последующем округлении до 18 бит Вы ни при каких обстоятельствах не будете использовать значения синусов больше 18+2 бит. В то же время, выбрасывать что-то после умножения на осциллирующую функцию, а потом усреднять (Ваш фильтр) то у Вас будут накапливаться ошибки от того, что большие и маленькие числа с разным знаком складываются.

Я не в курсе, как устроена DDS, но если ее строить на линейной аппроксимации, то для 26 бит точности она будет хотеть 2 умножителя и таблицу в 200кбит, а для большего порядка точности будет необходимо 4 умножителя и тоже десятки килобит.

Если все-таки хочется оставить синус и косинус такими точными, то и результат разумнее до фильтра тащить до 42 бит, а на самом фильтре, в зависимости от характерной длины, еще 10-20 бит накидывать, и только после получения округлять.

Хотя мне почему-то кажется, что у Вас нулевая частота из-за неправильного или неточного синуса получается.

Цитата(qwa @ Jul 5 2015, 18:15) *
... вижу в спектре гармонику на нулевой частоте... где-то в моем смесителе возникла постоянная составляющая

а дурацкий вопрос, а в Вашем белом входном шуме постоянной составляющей точно нет? Может посчитать другими средствами, на всякий случай интеграл?
Go to the top of the page
 
+Quote Post

3 страниц V   1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 15:10
Рейтинг@Mail.ru


Страница сгенерированна за 0.01527 секунд с 7
ELECTRONIX ©2004-2016