|
|
  |
Реализация БПФ на ПЛИС, Тудности, встречаемые при реализации |
|
|
|
Oct 28 2011, 15:27
|
Местный
  
Группа: Свой
Сообщений: 429
Регистрация: 11-08-05
Из: Санкт-Петербург
Пользователь №: 7 537

|
Цитата(troiden @ Oct 27 2011, 09:29)  Возникла идея сделать в ПЛИСе не только само вычисление FFT, но и усреднение результата по нескольким прогонам. Используется стандартная корка от Xilinx, на выходе она выдает действительную и мнимую части отсчетов. Как правильнее подойти к задаче - усреднять по модулю или усреднять действительную и мнимую части, а потом уже брать модуль? К примеру, если у Вас на входе идеальный синус и частота оцифровки кратна частоте входного синуса, и каждый прогон Вы начинаете с одной и той же фазы входного синуса, то у Вас всегда будет одно и тоже значение мнимой и действительной части на выходе БПФ. В этом случае, Вам все равно как усреднять. Теперь рассмотрим тот же случай, но только прогон Вы начинаете со случайной фазы входного синуса. В этом случае, в каждом прогоне будут разные значения мнимой и действительной части на выходе БПФ, но модуль ( sqrt( im^2 + re^2) ) будет всегда одинаковый. Усредняя модуль Вы будете получать всегда одно и то же значение среднего модуля. Если Вы будете усреднять отдельно действительную и мнимую части, то при усреднении небольшого количества прогонов получите сильно заниженное значение модуля вычисляя его по отдельно усредненным re и im. При увеличении количества прогонов модуль, вычисленный по отдельно усредненным re и im будет неуклонно стремиться к 0. Так что на Ваш вопрос невозможно ответить без уточнения что из себя представляет входной сигнал, как происходит выборка отсчетов, как "организованы" прогоны и какую информацию о сигнале Вы хотите извлечь с помощью БПФ.
|
|
|
|
|
Oct 28 2011, 16:28
|
Частый гость
 
Группа: Свой
Сообщений: 108
Регистрация: 19-02-09
Из: Москва
Пользователь №: 45 069

|
Цитата(Sefo @ Oct 28 2011, 19:27)  Так что на Ваш вопрос невозможно ответить без уточнения что из себя представляет входной сигнал, как происходит выборка отсчетов, как "организованы" прогоны и какую информацию о сигнале Вы хотите извлечь с помощью БПФ. Входной сигнал - фактически оцифрованный радиоканал, отсчеты с АЦП, начало выборки производится без всякой синхронизации, просто в произвольные моменты времени берутся подряд 2048 отсчетов. А с помощью БПФ хочется получить спектральную панораму входного сигнала, усреднение нужно для получения более гладкой картинки. Как я понимаю из выжеизложенного, для данных условий нужно усреднять модуль.
|
|
|
|
|
Oct 29 2011, 13:00
|
Местный
  
Группа: Свой
Сообщений: 429
Регистрация: 11-08-05
Из: Санкт-Петербург
Пользователь №: 7 537

|
Цитата(troiden @ Oct 28 2011, 19:28)  Входной сигнал - фактически оцифрованный радиоканал, отсчеты с АЦП, начало выборки производится без всякой синхронизации, просто в произвольные моменты времени берутся подряд 2048 отсчетов. А с помощью БПФ хочется получить спектральную панораму входного сигнала, усреднение нужно для получения более гладкой картинки. Как я понимаю из выжеизложенного, для данных условий нужно усреднять модуль. Да. При таком раскладе усреднять нужно модуль.
|
|
|
|
|
Mar 1 2012, 09:54
|

Местный
  
Группа: Свой
Сообщений: 337
Регистрация: 17-05-07
Пользователь №: 27 784

|
Цитата(soldat_shveyk @ Jan 19 2009, 00:55)  3. Если вы делаете БПФ на ПЛИС, то надо смотреть на алгоритмы по основанию 4, а не по основанию 2. Получается намного удобнее и эффективнее. Классическая бабочка - наследие от процессоров DSP, где она сделана аппаратно. Ядром алгоритма БПФ по основанию 4 является более сложный 4-х точечный БПФ, где все поворачивающие множители равны либо 1, либо -1. На ПЛИС удобно реализуется на сумматорах, можно сделать комбинаторную сехему, выполняющею этот самый 4-х точечный БПФ за один такт нельзя ли об этом подробнее? почему-то тот же Xilinx CoreIP FFT wizard предлагает только варианты реализаций Radix-2 & Radix-2 Lite да и гугл говорит что больше всего ищут "FFT radix 2" & "FFT radix 8" >> 4-х точечный БПФ, где все поворачивающие множители равны либо 1, либо -1 означает ли это что можно вообще обойтись без умножителей? ЗЫЖ как насчёт Radix-8 FFT ? ЗЫЫЖ интересуют данные алгоритмы в применении к БПФ на относительно большое число точек (2048) upd вот какое сравнение в слайдах нашёл
Эскизы прикрепленных изображений
--------------------
Чтoбы yзнaть, кaкaя дopoгa впepeди, cпpocи тex, ктo пo нeй вoзвpaщaeтcя ©
|
|
|
|
|
Mar 1 2012, 10:12
|

Местный
  
Группа: Свой
Сообщений: 337
Регистрация: 17-05-07
Пользователь №: 27 784

|
Цитата(blackfin @ Mar 1 2012, 14:03)  На мой взгляд, нет смысла вычислять FFT быстрее, чем заполняется входной буфер, а Radix-2 этому требованию, вроде как, удовлетворяет. ну, еще есть такая штука как latency, которая м.б. критична во многих приложениях. ей и меряются наравне с ресурсами а cмысл, которого хочется достичь - 1) экономия площади (поэтому сравнивается обычно количество наиболее ресурсозатратных примитивов - умножителей ) 2) при фиксированном количестве точек память особо не поэкономишь, поэтому переходят на экономию обращений к памяти (уменьшение конфликтов) Цитата(blackfin @ Mar 1 2012, 14:03)  Radix-2 этому требованию, вроде как, удовлетворяет. в ПЛИС как раз-таки благодяря использованию сегментов блочной двухпортовой памяти снимается ограничение по обращениям (много операций чтения/записи из многих сегментов BlockRAM одновременно) в VLSI же как правило имеется 1 большой кусок DualPort RAM и там уже эти обращения становятся критичными
--------------------
Чтoбы yзнaть, кaкaя дopoгa впepeди, cпpocи тex, ктo пo нeй вoзвpaщaeтcя ©
|
|
|
|
|
Mar 5 2012, 08:15
|
Местный
  
Группа: Свой
Сообщений: 429
Регистрация: 11-08-05
Из: Санкт-Петербург
Пользователь №: 7 537

|
Цитата(ClockworkOrange @ Mar 1 2012, 12:54)  нельзя ли об этом подробнее? почему-то тот же Xilinx CoreIP FFT wizard предлагает только варианты реализаций Radix-2 & Radix-2 Lite да и гугл говорит что больше всего ищут "FFT radix 2" & "FFT radix 8"
>> 4-х точечный БПФ, где все поворачивающие множители равны либо 1, либо -1
означает ли это что можно вообще обойтись без умножителей? Конечно нет! Речь идет только о вычислении самой бабочки. 2-х и 4-х точечные бабочки имеют тривиальные коэффициенты и поэтому для их вычисления умножителей не требуются. Для всех остальных бабочек не все коэффициенты тривиальны (для 3-х, 5-ти и т.д. точечной бабочки все не тривиальны) и для вычисления самой бабочки требуются умножители. Стоит заметить, что требуются умножители на константу и если в ПЛИС нет DSP-блоков и все реализуется на простых лог. элементах, то умножители на константу занимают меньше площади (площадь зависит от значения константы) . Однако, до или после бабочки (в зависимости от схемы) нужно домножать данные на поворачивающие коэффициенты. И здесь без умножителей не обойтись. Цитата(ClockworkOrange @ Mar 1 2012, 12:54)  вот какое сравнение в слайдах нашёл Непонятно что значит "Complexity" и в каких попугаях. Цитата(ClockworkOrange @ Mar 1 2012, 13:12)  ну, еще есть такая штука как latency, которая м.б. критична во многих приложениях. ей и меряются наравне с ресурсами
а cмысл, которого хочется достичь - 1) экономия площади (поэтому сравнивается обычно количество наиболее ресурсозатратных примитивов - умножителей ) 2) при фиксированном количестве точек память особо не поэкономишь, поэтому переходят на экономию обращений к памяти (уменьшение конфликтов)
в ПЛИС как раз-таки благодяря использованию сегментов блочной двухпортовой памяти снимается ограничение по обращениям (много операций чтения/записи из многих сегментов BlockRAM одновременно)
в VLSI же как правило имеется 1 большой кусок DualPort RAM и там уже эти обращения становятся критичными Как именно балансировать между скоростью вычислений и занимаемой площадью вопрос не простой, ввиду разнообразия реализаций одного и того же БПФ. Например, можно вычислять БПФ "переливая" из одного модуля памяти в другой и обратно, а можно сделать так называемое inplace БПФ и сэкономить память. Можно все вычисления выполнить одной бабочкой, а можно несколько бабочек считать в параллель. Да и саму бабочку можно вычислять параллельно, а можно последовательно. Если параллельно, то, скажем, для 4-х точечной бабочки нужно поставить параллельно 3 умножителя, а если последовательно вычислять, то 1. Если, к примеру, бабочка вычисляется последовательно, то нужно учитывать количество математических операций умножения . Скажем, 16-ти точечное БПФ при вычислении 2-х точечной бабочкой требует 4 этапа и, соответственно, нужно вычислить 4 этапа * 8 бабочек * 2 точки = 64 "точки" и произвести 4 этапа * 8 бабочек * 1 умножение = 32 операции умножения. При вычислении 4-х точечной бабочкой требует 2 этапа и, соответственно, нужно вычислить 2 этапа * 4 бабочки * 4 точки = 32 точки и произвести 2 этапа * 4 бабочки * 3 умножения = 24 операции умножения. Понятие "последовательное вычисление" бабочки тоже не однозначно т.к. надо уточнять какие именно вычисления выполняются последовательно: для вычисления одной "выходной" точки 2-х точечной бабочки нужно сложить 2 комплексных числа, а для 4-х точечной бабочки нужно сложить 4 комплексных числа.
|
|
|
|
|
Nov 11 2015, 02:48
|
Гуру
     
Группа: Свой
Сообщений: 3 106
Регистрация: 18-04-05
Пользователь №: 4 261

|
Цитата(Corner @ Nov 10 2015, 23:25)  БПФ с бабочками не 2 в степени N. Это что то новенькое...  Так это для вас "это что-то новенькое".. А для всех остальных это все отнюдь не ново: Radix-3,5, Radix-3,6,12. Не говоря уж про классическое "БПФ с бабочками 4 и 8 в степени N": Radix-4,8.
|
|
|
|
|
Apr 13 2018, 05:43
|
Группа: Участник
Сообщений: 8
Регистрация: 13-04-18
Пользователь №: 103 185

|
спасибо. а примеров случайно нет?
|
|
|
|
|
Apr 16 2018, 06:15
|
Группа: Участник
Сообщений: 8
Регистрация: 13-04-18
Пользователь №: 103 185

|
Цитата(AVR @ Apr 13 2018, 14:15)  Я работал лишь с Xilinx FFT core, но вот сейчас открыл альтеровский UG на их FFT ядро и вижу что там исчерпывающая информация, включая тайминги диаграммы, после которых никакие примеры больше не нужны. Есть ли конкретные вопросы? Добавить компонент ведь труда не составляет, тогда может уже есть какие-то вопросы, которые я по аналогии смогу помочь прояснить? Я новичок в этом деле, писал только простые алгоритмы, поэтому не судите строго. Создать компонент не составило труда, но какие вх/ вых.сигналы от куда и куда подать тут загвоздка. Если не трудно объясните НУБику)) Откуда взять вещественные и мнимые значения сигнала? Как я понимаю должна быть память, где будут храниться значения, которые будет брать компонент?! мне бы примерную блок-схему для начала.
Сообщение отредактировал DrbIn - Apr 16 2018, 06:20
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|