ZED 0 22 марта, 2009 Опубликовано 22 марта, 2009 · Жалоба Все вроде понял, т.е. мы сразу после АЦП добавляем знаковыми разрядами до 17 разрядов и гоним в паямть с 17 разрядными словами и уже работаем с 17 разрядными данными. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Sefo 0 22 марта, 2009 Опубликовано 22 марта, 2009 · Жалоба Да. :cheers: Ура! Ттеперь можно перейти к умножителям. :) Вы хотели на коэффициенты заложить 12 разрядов. У коэффициентов БПФ диапазон Re и Im частей от -1.0 до +1.0. Как Вы думаете, какое 12-ти разрядное число лучше поставить в соответствовие -1.0 и какое в соответствие +1.0? И почему? Опыт бабочки должен Вам помочь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ZED 0 22 марта, 2009 Опубликовано 22 марта, 2009 · Жалоба 1.0 это 2047 -1.0 это -2047 Чтобы не увеличивать разрядность: Забегая вперед, кроме бабочки, в умножителе, когда -32768 Вы умножите на -1.0, то получите +32768 - это число для представления требует опять таки 17 разрядов (как видите, даже если убрать округление в бабочке, то нам все равно не избежать этой проблемы в умножителях). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Sefo 0 23 марта, 2009 Опубликовано 23 марта, 2009 · Жалоба Давайте пока так начнем. Впроцессе реализации сами догадаетесь, почему это не самый лучший вариант. Хотя так тоже можно. Кстати, надеюсь, что написав Чтобы не увеличивать разрядность Вы имели ввиду разрядность коэффициентов. Все данные с бабочки мы направим на блок комплексных умножителей. В этом блоке будет 4 умножителя, один из которых всегда умножает на (1.0 + j0). Такой подход удобен т.к. все данные (все 4 точки) идут единым путем и каждый блок нашего БПФ сам заботится о том, чтобы одни данные не "отстали"/"опередили" другие. Итак: 1) жду от Вас код блока комплексных умножителей 2) код самого комплексного умножителя. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ZED 0 24 марта, 2009 Опубликовано 24 марта, 2009 · Жалоба Вот комплексный перемножитель, не знаю правильно ли я все сделал, но вроде умножает=)) complex_multiplier.rar Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Sefo 0 24 марта, 2009 Опубликовано 24 марта, 2009 · Жалоба Хорошо. Код внимательно посмотрю завтра - навскидку, вместо 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 ? Где блок умножителей согласно блоксхеме? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Sefo 0 25 марта, 2009 Опубликовано 25 марта, 2009 · Жалоба вроде умножает=)) Я Вас попрошу серьезнее относиться к результатам симуляции. Ни черта он у Вас не умножает. Результат должен был быть 58593 + j 0, а у Вас в 2 раза меньше. Вопрос на засыпку - Вы уже на нем засыпались :), но теперь, надеюсь, ответите правильно: Чему равна разрядность произведения двух знаковых чисел, если разрядость одного числа n, а другого k? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ZED 0 25 марта, 2009 Опубликовано 25 марта, 2009 · Жалоба Чему равна разрядность произведения двух знаковых чисел, если разрядость одного числа n, а другого k? n+k Вот, теперь выдает то, что нужно... Блок умножителей я так понимаю лучше сделать компонентами... А вот вроде как блок, не знаю то или не то, голова уже не работает, вроде по RTL 4 комплексных перемножителя в одном блоке... complex_multiplier.rar block_multipliers.rar Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Sefo 0 25 марта, 2009 Опубликовано 25 марта, 2009 · Жалоба n+k Не угадали. :) n+k это для беззнаковых операндов. А для знаковых чуть-чуть иначе. Ну, подумайте же как следует! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ZED 0 25 марта, 2009 Опубликовано 25 марта, 2009 · Жалоба По-моему что для знаковых, что для беззнаковых произведение будет размерности n+k, только для знаковых старшие два разряда знаковые. Если вы это имеете ввиду, то можно сказать, что для знаковых размерность будет n + k -1. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Sefo 0 26 марта, 2009 Опубликовано 26 марта, 2009 (изменено) · Жалоба только для знаковых старшие два разряда знаковые Не стоит так интерпретировать. Дополнительный код подразумевает только один знаковый разрад. Да и то, знаковым его называют только для удобства. Формат числа с разрядами от 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) и проанализируйте, что же получается не совсем честно и какую интерпретацию это имеет с точки зрения БПФ? Изменено 26 марта, 2009 пользователем Sefo Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ZED 0 28 марта, 2009 Опубликовано 28 марта, 2009 (изменено) · Жалоба Честно говоря я не совсем понял, в дополнительном коде для числа с разрядностью 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) инвертируются и к получившемуся числу прибавляют один. Изменено 28 марта, 2009 пользователем ZED Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Джеймс 3 28 марта, 2009 Опубликовано 28 марта, 2009 · Жалоба 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Sefo 0 28 марта, 2009 Опубликовано 28 марта, 2009 · Жалоба Сорри, я всю ветку не читал, но это место бросилось в глаза. Диапазон -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 (только именно эту статью на английском - аналогичная на русском языке полная фигня) Вечером постараюсь прокомментировать все ваши заблуждения относительно двух знаковых разрядов и пр. Любопытно стало где Вы учитесь и на какую специальность? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ZED 0 28 марта, 2009 Опубликовано 28 марта, 2009 · Жалоба Я учусь в МЭИ на радиотехника, с вычислилкой туговато, дают общее представление а так вертись как хочешь. Вот так учили, все приходится осваивать самому. я понимаю, со мной очень трудно, но у меня есть желание учиться и спасибо таким людям, как вы, которые помогают разобраться с реальными проблемами на практике... Этого очень не хватает, когда учишься все просто, но кода дело доходит до реализации тут то все и начинается. Я понимаю, что у меня специальность не вычислительная техника или что-то подобное, но мне очень хочется разобраться, для меня это важно... Не сердитесь, просто нам так преподносили материал и мы так привыкли его воспринимать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться