|
|
  |
Реализация БПФ на ПЛИС, Тудности, встречаемые при реализации |
|
|
|
Sep 29 2011, 09:54
|
Частый гость
 
Группа: Свой
Сообщений: 199
Регистрация: 27-05-09
Из: Москва
Пользователь №: 49 648

|
Цитата(Костян @ Sep 29 2011, 12:46)  тогда какой смысл в данных с разрядностью более 12 бит ? В данных? Или в разрядности поворачивающего множителя (W)? Для примера: 1) возьмите последовательность данных с разрядностью 8 и с разрядностью поворачивающего множителя то же 8 и сделайте над ними БПФ, а потом ОБПФ. Зафиксируйте результат. 2) возьмите такую же разрядность данных, но для операций вычисления БПФ и ОБПФ возьмите разрядность поворачивающего множителя равной к примеру 6. Зафиксируйте результат. Сравните результаты в п.1 и п.2. В идеале должна получится та же последовательность данных что и была, легко догадаться где будут различия. Поэтому, если точность не особо важна, но необходимо снизить количество занимаемых ресурсов то уменьшается разрядность поворачивающего множителя.
|
|
|
|
|
Sep 29 2011, 10:50
|
Частый гость
 
Группа: Свой
Сообщений: 199
Регистрация: 27-05-09
Из: Москва
Пользователь №: 49 648

|
Цитата(Костян @ Sep 29 2011, 14:16)  К сожалению, нету fixed модели по рукой БПФ. Может кто-нибудь сможет привести подобное иследование и ответить на вопрос, какую разрядность W необходимо иметь для входных данных 16бит ? Это исследование необходимо для понимания (т.е. в образовательных целях=)) на что влияет разрядность W. Для 16 бит, чтобы вычислять БПФ с максимальной точностью, необходимо иметь поворачивающие множители с разрядностью 16 бит.
|
|
|
|
|
Oct 25 2011, 14:46
|
Местный
  
Группа: Свой
Сообщений: 429
Регистрация: 11-08-05
Из: Санкт-Петербург
Пользователь №: 7 537

|
Цитата(chirik @ Oct 9 2011, 12:40)  Я пытался создать символ файла FFT_2048.vhd в Quartus 11 он не создает, пишет что не поддерживает пользовательский тип complex_data_bus. Error (10017): Can't create symbol/include/instantiation/component file for entity "FFT_2048" because port "EXT_DATA_i" are not currently supported by the Quartus II symbol/include/instantiation/component file generator Вы, очевидно, пытаетесь вставить модуль в графическую схему. В этом случае придется написать "обертку" у которой в качестве входов и выходов будут std_logic/std_logic_vector и которая подключит эти сигналы стандартных типов к сигналам с пользовательским типом (complex_data_bus, например). Цитата(chirik @ Oct 9 2011, 12:40)  А может мне кто ни будь подсказать как этот fft модуль использовать в другом проекте ? Увы, на данный момент его еще рано использовать в другом проекте. К сожалению, пока БПФ остается не завершенным. Использовать Вы его сможете, только если доделаете его сами. Цитата(Костян @ Sep 28 2011, 16:26)  Почему для W используется разрядность всего 12 бит , тогда как данные 17 ? Из каких соображений разрядность W взята меньше, чем входных данных ? Цитата(almost @ Sep 29 2011, 11:18)  По всей видимости, чтобы за грубить результаты вычислений, при этом экономя память. Цитата(almost @ Sep 29 2011, 13:50)  Это исследование необходимо для понимания (т.е. в образовательных целях=)) на что влияет разрядность W. Для 16 бит, чтобы вычислять БПФ с максимальной точностью, необходимо иметь поворачивающие множители с разрядностью 16 бит. Если для 16-ти разрядных данных взять 16-ти разрядные коэффициенты, то это не даст максимальную точность вычислений. Разрядность данных, причем не входных, а внутренних, для хранения промежуточных результатов, должна быть больше, чем коэффициентов. Т.е. если для 16-ти разрядных коэффициентов разрядность данных взять, к примеру, 18, то точность вычислений будет выше, чем для 16-ти разрядных данных. Когда разрядность данных == разрядности коэффициентов, то при умножении на коэффициенты с малыми значениями будет "ощутимое" количество раз происходить обнуление результата. Например, возьмем 5-ти разрядные коэффициенты и данные. Тогда за 1.0 у нас будет 8 (01000b). 00001b будет соответствовать 0.125. Если 0.875 * 0.125, то в арифметике с плавающей точкой получим 0.109375, но в арифметике с фиксированной точкой получим 0: (00111b * 00001b) >> 4. Так что точность вычислений складывается из многих факторов. Потери точности также зависят и от того каким именно образом делать вычисления.
|
|
|
|
|
Oct 27 2011, 06:41
|
Группа: Участник
Сообщений: 14
Регистрация: 19-10-11
Пользователь №: 67 824

|
Цитата(Sefo @ Oct 25 2011, 18:46)  Если для 16-ти разрядных данных взять 16-ти разрядные коэффициенты, то это не даст максимальную точность вычислений. Разрядность данных, причем не входных, а внутренних, для хранения промежуточных результатов, должна быть больше, чем коэффициентов. Т.е. если для 16-ти разрядных коэффициентов разрядность данных взять, к примеру, 18, то точность вычислений будет выше, чем для 16-ти разрядных данных.
Когда разрядность данных == разрядности коэффициентов, то при умножении на коэффициенты с малыми значениями будет "ощутимое" количество раз происходить обнуление результата.
Например, возьмем 5-ти разрядные коэффициенты и данные. Тогда за 1.0 у нас будет 8 (01000b). 00001b будет соответствовать 0.125. Если 0.875 * 0.125, то в арифметике с плавающей точкой получим 0.109375, но в арифметике с фиксированной точкой получим 0: (00111b * 00001b) >> 4.
Так что точность вычислений складывается из многих факторов. Потери точности также зависят и от того каким именно образом делать вычисления. Согласен с Вами, но я имел в виду что при прочих равных. Так то понятно, ошибки округления никуда не деть. Цитата(troiden @ Oct 27 2011, 10:29)  Возникла идея сделать в ПЛИСе не только само вычисление FFT, но и усреднение результата по нескольким прогонам. Используется стандартная корка от Xilinx, на выходе она выдает действительную и мнимую части отсчетов. Как правильнее подойти к задаче - усреднять по модулю или усреднять действительную и мнимую части, а потом уже брать модуль? Ключевые слова для поиска: Когерентное и не когерентное накопление.
|
|
|
|
|
Oct 27 2011, 08:00
|
Группа: Участник
Сообщений: 14
Регистрация: 19-10-11
Пользователь №: 67 824

|
Цитата(ViKo @ Oct 27 2011, 11:34)  Не думаю. В данном случае оба варианта - некогерентное накопление. Если только каждые "прогоны"сигнала не набирались засинхронизированными, как в осциллографах. А будет ли раздельное усреднение мнимой и действительной части давать лучший результат? Не знаю. Наверное... Лучший результат по какому критерию? К примеру для когерентных РЛС, которые ведут единую обработку с нескольких каналов не когерентное накопление сродни чуме, т.е. там где фазовая информация важна то стопроцентно надо усреднять/накапливать когерентно. Но, к примеру в РСА иногда для избавления от "спекл шума" производят не когерентное накопление уже когерентно накопленных пачек и картинка существенно улучшается.
|
|
|
|
|
Oct 27 2011, 11:22
|
Частый гость
 
Группа: Свой
Сообщений: 199
Регистрация: 27-05-09
Из: Москва
Пользователь №: 49 648

|
Цитата(ViKo @ Oct 27 2011, 12:26)  Когерентное накопление - когда пачки (кадры, реализации) накоплены засинхронизированными по какому-то событию. Я бы немного уточнил бы, сказал что когерентные сигналы уже созданы "синхронизированными" между собой, к примеру в РЛС сигналы синтезировались от одного опорного генератора. Т.е. их и оцифровывать для сохранения когерентности надо от того же источника, что бы в дальнейшим можно было оптимально накопить (когерентно сложить). Цитата(ViKo @ Oct 27 2011, 12:26)  А что такое некогерентное усреднение когерентно накопленных пачек, мне не понятно. И обратное - когерентное усреднение некогерентно накопленных пачек - выглядит нонсенсом. Сугубо для борьбы со "спекл шумом" это делается. А вот обратное делать реально нонсенс.
|
|
|
|
|
Oct 28 2011, 05:43
|
Частый гость
 
Группа: Свой
Сообщений: 199
Регистрация: 27-05-09
Из: Москва
Пользователь №: 49 648

|
Цитата(ViKo @ Oct 27 2011, 16:08)  Не бывает когерентного или некогерентного усреднения. А бывает усреднение когерентных (собранных синхронно) или некогерентных данных. И усреднение модуля или поотдельности действительной и мнимой частей спектра к когерентности не имеют отношения. Да, согласен. Надо раздобыть схему когерентного и не когерентного накопителя и по ней понять в чем же различия, может подскажите?
|
|
|
|
|
Oct 28 2011, 07:11
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362

|
Цитата(almost @ Oct 28 2011, 08:43)  Да, согласен. Надо раздобыть схему когерентного и не когерентного накопителя и по ней понять в чем же различия, может подскажите? Ну, два варианта уже высказаны - синхронизация в осциллографе, синхронизация в РЛС. Например, микроконтроллер оцифровывает напряжение сети ~230V. Собирает некоторое количество выборок (кадр данных) для измерения, вычисления спектра. Как обнаружилось, что напряжение перешло через 0 (можно прямо по коду АЦП), отсчитываем нужное количество выборок до конца кадра. Каждый раз одно и то же. Вот и синхронность (когерентность). Из-за шума будет некоторый сдвиг по времени от кадра к кадру. И из-за несинхронности частоты сети и частоты преобразования. Но это небольшие сдвиги. А дальше вычислить спектр для каждого собранного кадра. А дальше усреднить действительные и мнимые части.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|