|
Квадратурный смеситель и постоянная составляющая |
|
|
|
Jul 5 2015, 13:15
|

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

|
Всем привет.
Реализовал на ПЛИС квадратурный смеситель. Дальнейшую обработку упоминать не буду,ибо она вся многократно проверена и точно работает корректно. Поэтому соль в том,что при просмотре спектра выходного сигнала со смесителя я вижу в спектре гармонику на нулевой частоте (которой быть не должно,поскольку на входе,по сути,просто шум). Таким образом, где-то в моем смесителе возникла постоянная составляющая. У кого есть идеи,откуда она могла взяться?
Подробности:
Входной сигнал 16 бит поступает на умножители. Умножается он там на синус/косинус разрядностью 26 бит. Выходные сигналы с умножителей - 18 бит.
Эти 18 бит подаются на вход КИХ фильтра,который понижает частоту дискретизации. Выход фильтра - 16 бит (2 сигнала),которые потом записываются в сигнал 64 бита.
ПЛИС: Xilinx Virtex 5
Ядра, которые я использовал: -DDS Compiler (синтезатор частоты); -FIR Compiler (КИХ фильтр); -Multiplier (умножитель).
|
|
|
|
|
Jul 5 2015, 14:49
|

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

|
Цитата(rloc @ Jul 5 2015, 16:39)  После DDS или умножителя, например, нет округления. Есть понижение разрядности,что эквивалентно делению. Как я понимаю,это не то что вы имеете в виду. Я знаю несколько способов округления. Какой наиболее предпочтителен для ПЛИС?
|
|
|
|
|
Jul 5 2015, 18:20
|

Частый гость
 
Группа: Участник
Сообщений: 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
|
|
|
|
|
Jul 5 2015, 19:41
|

Частый гость
 
Группа: Участник
Сообщений: 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. Мне просто подумалось,что раз все выполнено в синхронном дизайне, то и округление надо бы так сделать... Новичок.
|
|
|
|
|
Jul 5 2015, 21:13
|

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

|
Итак,вот что я увидел. На вход - синус,частота его в полосе пропускания фильтра. Первый сигнал - клок. Следующий - сигнал асинхронного сброса. Далее - управляющий сигнал от процессора. Далее - входной сигнал. Следующие 2 сигнала - выход умножителей после умножения на син/кос с округлением. Последние 2 сигнала - выход фильтра с округлением. UPD : нашел косяк,исправляю Я заметил,что синус на входе был такой частоты,что при переносе спектра он выпадал из полосы пропускания фильтра. Сделал так,чтобы попадал - результат аналогичный представленному. Посмотрел выход непосредственно фильтра - там нули. Загадочно.
Сообщение отредактировал qwa - Jul 5 2015, 21:05
Эскизы прикрепленных изображений
|
|
|
|
|
Jul 6 2015, 04:37
|
Гуру
     
Группа: Свой
Сообщений: 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 С учетом знака будет равномерное округление, или я совсем не про то?
|
|
|
|
|
Jul 6 2015, 07:26
|

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

|
Цитата(Golikov A. @ Jul 6 2015, 07:37)  А в случае знаковых чисел не надо иногда еще и вычитать? Я вчера немного погуглил и нашел такую интересную статью : http://kanyevsky.kpi.ua/okruglenie.htmlДумаю,там вы найдете ответ на свой вопрос. Вчера,перед тем как лечь спать,нашел дурацкую ошибку. Потом отпишусь о результататах.
|
|
|
|
|
Jul 6 2015, 08:36
|
ʕʘ̅͜ʘ̅ʔ
    
Группа: Свой
Сообщений: 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
|
|
|
|
|
Jul 6 2015, 10:25
|
вопрошающий
    
Группа: Свой
Сообщений: 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)  ... вижу в спектре гармонику на нулевой частоте... где-то в моем смесителе возникла постоянная составляющая а дурацкий вопрос, а в Вашем белом входном шуме постоянной составляющей точно нет? Может посчитать другими средствами, на всякий случай интеграл?
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|