Перейти к содержанию
    

Реализация БПФ на ПЛИС

Все вроде понял, т.е. мы сразу после АЦП добавляем знаковыми разрядами до 17 разрядов и гоним в паямть с 17 разрядными словами и уже работаем с 17 разрядными данными.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да. :cheers:

 

Ура! Ттеперь можно перейти к умножителям. :)

 

Вы хотели на коэффициенты заложить 12 разрядов. У коэффициентов БПФ диапазон Re и Im частей от -1.0 до +1.0. Как Вы думаете, какое 12-ти разрядное число лучше поставить в соответствовие -1.0 и какое в соответствие +1.0? И почему?

 

Опыт бабочки должен Вам помочь.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1.0 это 2047

 

-1.0 это -2047

 

Чтобы не увеличивать разрядность:

 

Забегая вперед, кроме бабочки, в умножителе, когда -32768 Вы умножите на -1.0, то получите +32768 - это число для представления требует опять таки 17 разрядов (как видите, даже если убрать округление в бабочке, то нам все равно не избежать этой проблемы в умножителях).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Давайте пока так начнем. Впроцессе реализации сами догадаетесь, почему это не самый лучший вариант. Хотя так тоже можно. Кстати, надеюсь, что написав

Чтобы не увеличивать разрядность

Вы имели ввиду разрядность коэффициентов.

 

Все данные с бабочки мы направим на блок комплексных умножителей. В этом блоке будет 4 умножителя, один из которых всегда умножает на (1.0 + j0). Такой подход удобен т.к. все данные (все 4 точки) идут единым путем и каждый блок нашего БПФ сам заботится о том, чтобы одни данные не "отстали"/"опередили" другие.

 

Итак:

 

1) жду от Вас код блока комплексных умножителей

 

2) код самого комплексного умножителя.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот комплексный перемножитель, не знаю правильно ли я все сделал, но вроде умножает=))

complex_multiplier.rar

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хорошо. Код внимательно посмотрю завтра - навскидку, вместо

 

entity complex_multiplier is
generic (b_size: natural := 17;
	 w_size: natural := 12
);
port (
	y_re: in std_logic_vector(b_size downto 0);
	y_im: in std_logic_vector(b_size downto 0);
...

 

наверное должно было быть

 

entity complex_multiplier is
generic (b_size: natural := 17;
	 w_size: natural := 12
);
port (
	y_re: in std_logic_vector(b_size-1 downto 0);
	y_im: in std_logic_vector(b_size-1 downto 0);
...

 

Присланное закрывает пункт 2, а что с пунктом 1 ? Где блок умножителей согласно блоксхеме?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

вроде умножает=))

 

Я Вас попрошу серьезнее относиться к результатам симуляции. Ни черта он у Вас не умножает.

 

Результат должен был быть 58593 + j 0, а у Вас в 2 раза меньше.

 

Вопрос на засыпку - Вы уже на нем засыпались :), но теперь, надеюсь, ответите правильно:

 

Чему равна разрядность произведения двух знаковых чисел, если разрядость одного числа n, а другого k?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Чему равна разрядность произведения двух знаковых чисел, если разрядость одного числа n, а другого k?

 

n+k

 

Вот, теперь выдает то, что нужно...

Блок умножителей я так понимаю лучше сделать компонентами...

 

А вот вроде как блок, не знаю то или не то, голова уже не работает, вроде по RTL 4 комплексных перемножителя в одном блоке...

complex_multiplier.rar

block_multipliers.rar

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

n+k

 

Не угадали. :) n+k это для беззнаковых операндов. А для знаковых чуть-чуть иначе. Ну, подумайте же как следует!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

По-моему что для знаковых, что для беззнаковых произведение будет размерности n+k, только для знаковых старшие два разряда знаковые. Если вы это имеете ввиду, то можно сказать, что для знаковых размерность будет n + k -1.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

только для знаковых старшие два разряда знаковые

 

Не стоит так интерпретировать. Дополнительный код подразумевает только один знаковый разрад. Да и то, знаковым его называют только для удобства.

 

Формат числа с разрядами от X(0) до X(n-1) включительно в дополнительном коде такой

 

(-(2^(n-1))*X(n-1) + (2^(n-2))*X(n-2) + ... (2^1)*X(1) + (2^0)*X(0).

 

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

 

И "расширение знаком" это очень условное название - это не значит, что после расширения знаком у Вас в числе стало n знаковых разрядов :)

 

Если следовать вашей логике, то формат результата умножения 2-х знаковых чисел получается такой

 

(-(2^(n+k-1)))*X(n+k-1) - (2^(n+k-2))*X(n+k-2) + ... (2^1)*X(1) + (2^0)*X(0). Надеюсь очевидно, к чему это приведет :)

 

 

 

 

Опишите, пожалуйста, математическим выражением то, что делают ваши умножители. Попробуйте подставить в эту формулу значение, которое Вы выбрали в качестве 1.0 (т.е. 2047) и проанализируйте, что же получается не совсем честно и какую интерпретацию это имеет с точки зрения БПФ?

Изменено пользователем Sefo

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Честно говоря я не совсем понял, в дополнительном коде для числа с разрядностью n:

 

модуль числа:

(2^(n-2))*X(n-2) + (2^(n-3))*X(n-3) + ... +(2^1)*X(1) + (2^0)*X(0);

 

X(n-1) - знаковый разряд;

 

знак числа:

0 - если число положительное;

1- если число отрицательное.

 

Кроме того для отрицательных чисел все X(n-2) ... X(0) инвертируются и к получившемуся числу прибавляют один.

 

Расширение знаком предполагает, знак представляют два разряда, например расширим число на один знаковый разряд, тогда разрядность увеличивается на 1 и становится n+1:

 

X(n) и X(n-1) - знаковые разряды;

 

знак числа:

00 - если число положительное;

11- если число отрицательное.

Для отрицательных чисел все остается по-прежнему: все X(n-2) ... X(0) инвертируются и к получившемуся числу прибавляют один.

Изменено пользователем ZED

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Sefo

 

Как Вы думаете, какое 12-ти разрядное число лучше поставить в соответствовие -1.0 и какое в соответствие +1.0

 

ZED

 

1.0 это 2047

 

-1.0 это -2047

 

Сорри, я всю ветку не читал, но это место бросилось в глаза. Диапазон -1 ... +1 представить нельзя. Можно представить только -1 ... (1-1LSB).

-1 = 0x800

0 = 0

(1-1LSB) = 0x7FF

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сорри, я всю ветку не читал, но это место бросилось в глаза. Диапазон -1 ... +1 представить нельзя. Можно представить только -1 ... (1-1LSB).

-1 = 0x800

0 = 0

(1-1LSB) = 0x7FF

 

Тут Вы не правы. Если Вы берете 12-ти разрядное знаковое число, то Вы не сможете в -1...1 представить как -2048 ... +2048 т.к. у знакового 12-ти разрядного числа диапазон значений -2048 ... 2047, но Вам совершенно никто не мешает принять за -1 -2047, а за +1 +2047. Равно как и представить -1 ... +1 диапазоном -2000 ... +2000. Такой выбор имеет некоторые "неудобства", но он ничему не противоречит. (про неудобства мы поговорим позже - я бы предпочел, чтобы ZED сам их увидел). Вас никто не обязывает использовать весь диапазон значений 12-ти разрядного числа для представления диапазона от -1.0 до +1.0.

 

модуль числа:

(2^(n-2))*X(n-2) + (2^(n-3))*X(n-3) + ... +(2^1)*X(1) + (2^0)*X(0);

 

X(n-1) - знаковый разряд;

 

знак числа:

0 - если число положительное;

1- если число отрицательное.

 

Кроме того для отрицательных чисел все X(n-2) ... X(0) инвертируются и к получившемуся числу прибавляют один.

 

Расширение знаком предполагает, знак представляют два разряда ...

 

:( Да... Вы меня не на шутку огорчили... Придется с дополнительным кодом, да и вообще со способами представления чисел разобраться.

 

Пока почитайте вот это http://en.wikipedia.org/wiki/Two's_complement (только именно эту статью на английском - аналогичная на русском языке полная фигня) Вечером постараюсь прокомментировать все ваши заблуждения относительно двух знаковых разрядов и пр.

 

Любопытно стало где Вы учитесь и на какую специальность?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я учусь в МЭИ на радиотехника, с вычислилкой туговато, дают общее представление а так вертись как хочешь. Вот так учили, все приходится осваивать самому. я понимаю, со мной очень трудно, но у меня есть желание учиться и спасибо таким людям, как вы, которые помогают разобраться с реальными проблемами на практике... Этого очень не хватает, когда учишься все просто, но кода дело доходит до реализации тут то все и начинается. Я понимаю, что у меня специальность не вычислительная техника или что-то подобное, но мне очень хочется разобраться, для меня это важно... Не сердитесь, просто нам так преподносили материал и мы так привыкли его воспринимать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...