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

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

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

 

К примеру, если у Вас на входе идеальный синус и частота оцифровки кратна частоте входного синуса, и каждый прогон Вы начинаете с одной и той же фазы входного синуса, то у Вас всегда будет одно и тоже значение мнимой и действительной части на выходе БПФ. В этом случае, Вам все равно как усреднять.

 

Теперь рассмотрим тот же случай, но только прогон Вы начинаете со случайной фазы входного синуса. В этом случае, в каждом прогоне будут разные значения мнимой и действительной части на выходе БПФ, но модуль ( sqrt( im^2 + re^2) ) будет всегда одинаковый. Усредняя модуль Вы будете получать всегда одно и то же значение среднего модуля. Если Вы будете усреднять отдельно действительную и мнимую части, то при усреднении небольшого количества прогонов получите сильно заниженное значение модуля вычисляя его по отдельно усредненным re и im. При увеличении количества прогонов модуль, вычисленный по отдельно усредненным re и im будет неуклонно стремиться к 0.

 

Так что на Ваш вопрос невозможно ответить без уточнения что из себя представляет входной сигнал, как происходит выборка отсчетов, как "организованы" прогоны и какую информацию о сигнале Вы хотите извлечь с помощью БПФ.

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


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

Так что на Ваш вопрос невозможно ответить без уточнения что из себя представляет входной сигнал, как происходит выборка отсчетов, как "организованы" прогоны и какую информацию о сигнале Вы хотите извлечь с помощью БПФ.

Входной сигнал - фактически оцифрованный радиоканал, отсчеты с АЦП, начало выборки производится без всякой синхронизации, просто в произвольные моменты времени берутся подряд 2048 отсчетов. А с помощью БПФ хочется получить спектральную панораму входного сигнала, усреднение нужно для получения более гладкой картинки.

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

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


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

Входной сигнал - фактически оцифрованный радиоканал, отсчеты с АЦП, начало выборки производится без всякой синхронизации, просто в произвольные моменты времени берутся подряд 2048 отсчетов. А с помощью БПФ хочется получить спектральную панораму входного сигнала, усреднение нужно для получения более гладкой картинки.

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

 

Да. При таком раскладе усреднять нужно модуль.

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


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

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

вот какое сравнение в слайдах нашёл

post-27784-1330595695_thumb.png

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


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

вот какое сравнение в слайдах нашёл

На мой взгляд, нет смысла вычислять FFT быстрее, чем заполняется входной буфер, а Radix-2 этому требованию, вроде как, удовлетворяет.

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


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

На мой взгляд, нет смысла вычислять FFT быстрее, чем заполняется входной буфер, а Radix-2 этому требованию, вроде как, удовлетворяет.
ну, еще есть такая штука как latency, которая м.б. критична во многих приложениях. ей и меряются наравне с ресурсами

 

 

 

а cмысл, которого хочется достичь -

1) экономия площади (поэтому сравнивается обычно количество наиболее ресурсозатратных примитивов - умножителей )

2) при фиксированном количестве точек память особо не поэкономишь, поэтому переходят на экономию обращений к памяти (уменьшение конфликтов)

 

Radix-2 этому требованию, вроде как, удовлетворяет.

в ПЛИС как раз-таки благодяря использованию сегментов блочной двухпортовой памяти снимается ограничение по обращениям (много операций чтения/записи из многих сегментов BlockRAM одновременно)

 

в VLSI же как правило имеется 1 большой кусок DualPort RAM и там уже эти обращения становятся критичными

 

 

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


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

1) экономия площади (поэтому сравнивается обычно количество наиболее ресурсозатратных примитивов - умножителей )

Так количество умножений в алгоритме FFT и количество использованных аппаратных умножителей в IP-core это не одно и тоже..

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


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

нельзя ли об этом подробнее?

почему-то тот же Xilinx CoreIP FFT wizard предлагает только варианты реализаций Radix-2 & Radix-2 Lite

да и гугл говорит что больше всего ищут "FFT radix 2" & "FFT radix 8"

 

>> 4-х точечный БПФ, где все поворачивающие множители равны либо 1, либо -1

 

означает ли это что можно вообще обойтись без умножителей?

 

Конечно нет! Речь идет только о вычислении самой бабочки. 2-х и 4-х точечные бабочки имеют тривиальные коэффициенты и поэтому для их вычисления умножителей не требуются. Для всех остальных бабочек не все коэффициенты тривиальны (для 3-х, 5-ти и т.д. точечной бабочки все не тривиальны) и для вычисления самой бабочки требуются умножители. Стоит заметить, что требуются умножители на константу и если в ПЛИС нет DSP-блоков и все реализуется на простых лог. элементах, то умножители на константу занимают меньше площади (площадь зависит от значения константы) .

 

Однако, до или после бабочки (в зависимости от схемы) нужно домножать данные на поворачивающие коэффициенты. И здесь без умножителей не обойтись.

 

вот какое сравнение в слайдах нашёл

 

Непонятно что значит "Complexity" и в каких попугаях.

 

ну, еще есть такая штука как 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 комплексных числа.

 

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


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

БПФ с бабочками не 2 в степени N. Это что то новенькое... :lol:

Так это для вас "это что-то новенькое".. :biggrin:

 

А для всех остальных это все отнюдь не ново: Radix-3,5, Radix-3,6,12.

 

Не говоря уж про классическое "БПФ с бабочками 4 и 8 в степени N": Radix-4,8.

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


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

Прошу помощи у знатоков! Возникла необходимость реализовать БПФ на плис Альтера. Сидеть разбираться и с нуля писать времени нет. Знаю про мега функцию FFT, хочу воспользоваться её. Кто пользовался, поделитесь опытом?

Может есть видео уроки или литература какая-нибудь. Блок создал, а какие сигналы и откуда их подключать не знаю. Подскажите!!! :help: :help: :help:

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


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

спасибо. а примеров случайно нет?

Я работал лишь с Xilinx FFT core, но вот сейчас открыл альтеровский UG на их FFT ядро и вижу что там исчерпывающая информация, включая тайминги диаграммы, после которых никакие примеры больше не нужны.

Есть ли конкретные вопросы? Добавить компонент ведь труда не составляет, тогда может уже есть какие-то вопросы, которые я по аналогии смогу помочь прояснить?

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


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

Я работал лишь с Xilinx FFT core, но вот сейчас открыл альтеровский UG на их FFT ядро и вижу что там исчерпывающая информация, включая тайминги диаграммы, после которых никакие примеры больше не нужны.

Есть ли конкретные вопросы? Добавить компонент ведь труда не составляет, тогда может уже есть какие-то вопросы, которые я по аналогии смогу помочь прояснить?

 

Я новичок в этом деле, писал только простые алгоритмы, поэтому не судите строго.

Создать компонент не составило труда, но какие вх/ вых.сигналы от куда и куда подать тут загвоздка.

Если не трудно объясните НУБику))

Откуда взять вещественные и мнимые значения сигнала?

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

мне бы примерную блок-схему для начала.

 

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

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


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

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

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

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

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

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

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

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

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

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