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

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

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

тогда какой смысл в данных с разрядностью более 12 бит ?

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


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

тогда какой смысл в данных с разрядностью более 12 бит ?

 

В данных? Или в разрядности поворачивающего множителя (W)?

Для примера:

1) возьмите последовательность данных с разрядностью 8 и с разрядностью поворачивающего множителя то же 8 и сделайте над ними БПФ, а потом ОБПФ. Зафиксируйте результат.

2) возьмите такую же разрядность данных, но для операций вычисления БПФ и ОБПФ возьмите разрядность поворачивающего множителя равной к примеру 6. Зафиксируйте результат.

Сравните результаты в п.1 и п.2. В идеале должна получится та же последовательность данных что и была, легко догадаться где будут различия.

 

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

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


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

1) возьмите последовательность данных с разрядностью 8 и с разрядностью поворачивающего множителя то же 8 и сделайте над ними БПФ, а потом ОБПФ. Зафиксируйте результат.

2) возьмите такую же разрядность данных, но для операций вычисления БПФ и ОБПФ возьмите разрядность поворачивающего множителя равной к примеру 6. Зафиксируйте результат.

Сравните результаты в п.1 и п.2. В идеале должна получится та же последовательность данных что и была, легко догадаться где будут различия.

К сожалению, нету fixed модели по рукой БПФ. Может кто-нибудь сможет привести подобное иследование и ответить на вопрос, какую разрядность W необходимо иметь для входных данных 16бит ?

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


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

К сожалению, нету fixed модели по рукой БПФ. Может кто-нибудь сможет привести подобное иследование и ответить на вопрос, какую разрядность W необходимо иметь для входных данных 16бит ?

 

Это исследование необходимо для понимания (т.е. в образовательных целях=)) на что влияет разрядность W.

Для 16 бит, чтобы вычислять БПФ с максимальной точностью, необходимо иметь поворачивающие множители с разрядностью 16 бит.

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


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

А может мне кто ни будь подсказать как этот fft модуль использовать в другом проекте ?

Вот например, у меня есть шина данных 16 бит (оцифрованный звук) и куда её подцепить?

Я пытался создать символ файла 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

 

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


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

Я пытался создать символ файла 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, например).

 

А может мне кто ни будь подсказать как этот fft модуль использовать в другом проекте ?

 

Увы, на данный момент его еще рано использовать в другом проекте. К сожалению, пока БПФ остается не завершенным. Использовать Вы его сможете, только если доделаете его сами.

 

Почему для W используется разрядность всего 12 бит , тогда как данные 17 ?

Из каких соображений разрядность W взята меньше, чем входных данных ?

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

Это исследование необходимо для понимания (т.е. в образовательных целях=)) на что влияет разрядность 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.

 

Так что точность вычислений складывается из многих факторов. Потери точности также зависят и от того каким именно образом делать вычисления.

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


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

Возникла идея сделать в ПЛИСе не только само вычисление FFT, но и усреднение результата по нескольким прогонам. Используется стандартная корка от Xilinx, на выходе она выдает действительную и мнимую части отсчетов. Как правильнее подойти к задаче - усреднять по модулю или усреднять действительную и мнимую части, а потом уже брать модуль?

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


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

Если для 16-ти разрядных данных взять 16-ти разрядные коэффициенты, то это не даст максимальную точность вычислений. Разрядность данных, причем не входных, а внутренних, для хранения промежуточных результатов, должна быть больше, чем коэффициентов. Т.е. если для 16-ти разрядных коэффициентов разрядность данных взять, к примеру, 18, то точность вычислений будет выше, чем для 16-ти разрядных данных.

 

Когда разрядность данных == разрядности коэффициентов, то при умножении на коэффициенты с малыми значениями будет "ощутимое" количество раз происходить обнуление результата.

 

Например, возьмем 5-ти разрядные коэффициенты и данные. Тогда за 1.0 у нас будет 8 (01000b). 00001b будет соответствовать 0.125. Если 0.875 * 0.125, то в арифметике с плавающей точкой получим 0.109375, но в арифметике с фиксированной точкой получим 0: (00111b * 00001b) >> 4.

 

Так что точность вычислений складывается из многих факторов. Потери точности также зависят и от того каким именно образом делать вычисления.

 

Согласен с Вами, но я имел в виду что при прочих равных. Так то понятно, ошибки округления никуда не деть.

 

Возникла идея сделать в ПЛИСе не только само вычисление FFT, но и усреднение результата по нескольким прогонам. Используется стандартная корка от Xilinx, на выходе она выдает действительную и мнимую части отсчетов. Как правильнее подойти к задаче - усреднять по модулю или усреднять действительную и мнимую части, а потом уже брать модуль?

 

Ключевые слова для поиска: Когерентное и не когерентное накопление.

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


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

Например, возьмем 5-ти разрядные коэффициенты и данные. Тогда за 1.0 у нас будет 8 (01000b). 00001b будет соответствовать 0.125. Если 0.875 * 0.125, то в арифметике с плавающей точкой получим 0.109375, но в арифметике с фиксированной точкой получим 0: (00111b * 00001b) >> 4.

Чтобы не потерять ни единого бита при перемножении чисел, разрядность результата должна быть равна сумме разрядности входных данных. А уже выходные данные после всех вычислений можно и обрезать до нужной разрядности.

 

Ключевые слова для поиска: Когерентное и не когерентное накопление.

Не думаю. В данном случае оба варианта - некогерентное накопление. Если только каждые "прогоны"сигнала не набирались засинхронизированными, как в осциллографах. А будет ли раздельное усреднение мнимой и действительной части давать лучший результат? Не знаю. Наверное...

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


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

Не думаю. В данном случае оба варианта - некогерентное накопление. Если только каждые "прогоны"сигнала не набирались засинхронизированными, как в осциллографах. А будет ли раздельное усреднение мнимой и действительной части давать лучший результат? Не знаю. Наверное...

 

Лучший результат по какому критерию? К примеру для когерентных РЛС, которые ведут единую обработку с нескольких каналов не когерентное накопление сродни чуме, т.е. там где фазовая информация важна то стопроцентно надо усреднять/накапливать когерентно. Но, к примеру в РСА иногда для избавления от "спекл шума" производят не когерентное накопление уже когерентно накопленных пачек и картинка существенно улучшается.

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


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

не когерентное накопление уже когерентно накопленных пачек

Когерентное накопление - когда пачки (кадры, реализации) накоплены засинхронизированными по какому-то событию. Скажем, в РЛС, по зондирующему импульсу. В осциллографах - по срабатыванию триггера синхронизации.

А что такое некогерентное усреднение когерентно накопленных пачек, мне не понятно. И обратное - когерентное усреднение некогерентно накопленных пачек - выглядит нонсенсом.

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


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

Когерентное накопление - когда пачки (кадры, реализации) накоплены засинхронизированными по какому-то событию.

 

Я бы немного уточнил бы, сказал что когерентные сигналы уже созданы "синхронизированными" между собой, к примеру в РЛС сигналы синтезировались от одного опорного генератора. Т.е. их и оцифровывать для сохранения когерентности надо от того же источника, что бы в дальнейшим можно было оптимально накопить (когерентно сложить).

 

А что такое некогерентное усреднение когерентно накопленных пачек, мне не понятно. И обратное - когерентное усреднение некогерентно накопленных пачек - выглядит нонсенсом.

 

Сугубо для борьбы со "спекл шумом" это делается. А вот обратное делать реально нонсенс.

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


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

А вот обратное делать реально нонсенс.

Я согласен с вами, только уточню свою мысль еще раз.

Не бывает когерентного или некогерентного усреднения. А бывает усреднение когерентных (собранных синхронно) или некогерентных данных.

И усреднение модуля или поотдельности действительной и мнимой частей спектра к когерентности не имеют отношения.

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


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

Не бывает когерентного или некогерентного усреднения. А бывает усреднение когерентных (собранных синхронно) или некогерентных данных.

И усреднение модуля или поотдельности действительной и мнимой частей спектра к когерентности не имеют отношения.

 

Да, согласен.

Надо раздобыть схему когерентного и не когерентного накопителя и по ней понять в чем же различия, может подскажите?

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


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

Да, согласен.

Надо раздобыть схему когерентного и не когерентного накопителя и по ней понять в чем же различия, может подскажите?

Ну, два варианта уже высказаны - синхронизация в осциллографе, синхронизация в РЛС.

Например, микроконтроллер оцифровывает напряжение сети ~230V. Собирает некоторое количество выборок (кадр данных) для измерения, вычисления спектра.

Как обнаружилось, что напряжение перешло через 0 (можно прямо по коду АЦП), отсчитываем нужное количество выборок до конца кадра. Каждый раз одно и то же. Вот и синхронность (когерентность). Из-за шума будет некоторый сдвиг по времени от кадра к кадру. И из-за несинхронности частоты сети и частоты преобразования. Но это небольшие сдвиги.

А дальше вычислить спектр для каждого собранного кадра. А дальше усреднить действительные и мнимые части.

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


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

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

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

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

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

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

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

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

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

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