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

ДПФ на ПЛИС

Хочу написать ДПФ. Чтобы оно выполнялось как можно быстрее. Определяться частоты будут например, от 0 до 100 МГц. Частота дискретизации 230 МГц. Количество определяемых частот 500, отсчётов сигнала 2000. Самое простое мне видится это параллельно определять несколько частот. Например, написать модуль, который возвращает сумму перемножений выборок сигнала с соответствующими коэффициентами. Запускать таких модулей одновременно столько штук, сколько позволяют ресурсы ПЛИС. Подавать им на вход отсчёты и коэффициенты пока не будет выполнено для всех частот. Например одновременно можно запустить 100 модулей, значит такую операцию надо повторить 5 раз. (Следующая операция запускается после выполнения предыдущей)

Главная проблема для меня это коэффициенты. Хранить для каждой частоты свои коэффициенты? Или сделать таблицу синусов/косинусов и из неё брать? Т.е. для каждого модуля своя таблица (Нпример для 100 модулей 100 одинаковых таблиц (будет храниться в rom ПЛИС), чтобы можно было одновременно считывать 100 значений) А может есть нечто более простое? В общем как-то так)

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


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

Хочу написать ДПФ. Чтобы оно выполнялось как можно быстрее. Определяться частоты будут например, от 0 до 100 МГц. Частота дискретизации 230 МГц.

Количество определяемых частот 500, отсчётов сигнала 2000.

Какой темп выдачи Вы ожидаете на выходе при таком подходе? Какой кристалл?

Т.е. для каждого модуля своя таблица (Нпример для 100 модулей 100 одинаковых таблиц (будет храниться в rom ПЛИС), чтобы можно было одновременно считывать 100 значений)

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

Какая задача перед Вами стоит, почему именно ДПФ?

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


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

Задача: определить частоту сигнала в диапазоне 0 до 100 МГц за время <10 мкс (в идеале, но пока что хоть за какое-нибудь время)

ДПФ это я сам так взял. ПЛИС 5csema5f31c6 (Cyclone V). Насчёт определения частоты я так понял есть 2 основных алгоритма: в лоб (ДПФ) и оптимизированное (БПФ и все его разновидности (по онованию 2,4, алгоритм Винограда и т.д.))

ДПФ потому что нет ограничения что-то вроде на количество выборок сигнала (Например для БПФ по основанию 2 можно рассчитать накопления на частотах в количестве 2,4,8,16,32 ... и отсчётов должно быть столько же, а в ДПФ можно взять для примера 321 частоту и 1567 отсчётов для каждой частоты. Как-то так)

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

Внутри ПЛИС вроде достаточно ресурсов (именно блоков памяти), чтобы организовать 100 компонентов rom размером 1024х12 слов (т.е. будет 100 компонентов rom со своими входами и выходами (100 входов тактовых, 100 входов адрес чтения, 100 выходов значения памяти по адресу). Но да в логике 100 входов адресов и 100 выходов значений по адресам займут наверно много.

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

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


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

Внутри ПЛИС вроде достаточно ресурсов (именно блоков памяти).

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

Задача: определить частоту сигнала в диапазоне 0 до 100 МГц за время <10 мкс (в идеале, но пока что хоть за какое-нибудь время)

Если использовать на практике, то можно использовать метод параллельный - например, готовую корку поточного БПФ. Тогда время на рассчет спектра составит 1/Fs(частота дискретизации)*N(кол-во точек)*(~2,5-набрать выборку+сделать вычисления+сформировать обычный порядок данных на выдачу)=(1/230000000)*2048*2,5=~22мкс.

Либо последовательный (типа ДПФ) - вставить корку NCO и перемножать с сигналом на заданном произвольном временном интервале - и так последовательно для каждого бина. В этом случае на вход NCO будет подавать разный фазовый инкремент и не потребуется хранить все коэффициенты - но расчет будет очень медленным и не поточным (хотя тут можно и конвейер написать).

PS\частота 230МГц для Вашего чипа серьезная, так что следите за выполнением временных ограничений.

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


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

Приветствую!

 

..

Внутри ПЛИС вроде достаточно ресурсов (именно блоков памяти), чтобы организовать 100 компонентов rom размером 1024х12 слов (т.е. будет 100 компонентов rom со своими входами и выходами (100 входов тактовых, 100 входов адрес чтения, 100 выходов значения памяти по адресу). Но да в логике 100 входов адресов и 100 выходов значений по адресам займут наверно много.

 

Есть жирный чип и хотите считать лоб - тогда для каждого умножителя своя отдельная таблица. Будет просто - регулярно и быстро. Да и управление будет простое - одни счетчики :)

Можно с экономит память если получать sin и cos на лету из одной таблицы и хранить только часть периода но это если таблица симметричная получится.

 

Удачи! Rob.

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


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

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

В общем набросал я схемкуpost-82609-1455604776_thumb.png вот здесь видно что можно сделать несколько блоков rom памяти с таблицей синусов, а дальше чтобы получить нужный коэффициент надо просто выбрать его из таблицы. И для каждого канала хранить такую таблицу (например 100 каналов и 100 одинаковых таблиц, чтобы за 1 такт можно было получать больше 2 значений, а если бы все каналы обращались бы к 1 таблице, то действительно за 1 такт я бы больше 2 значений из памяти не получил бы).

 

Есть жирный чип и хотите считать лоб - тогда для каждого умножителя своя отдельная таблица. Будет просто - регулярно и быстро. Да и управление будет простое - одни счетчики sm.gif

Можно с экономит память если получать sin и cos на лету из одной таблицы и хранить только часть периода но это если таблица симметричная получится.

Это то что мне первое в голову пришло. Дальше да можно уменьшить количество хранимых значений таблицы (используя свойства функций sin, cos) Но может есть ещё какие варианты? Помимо тех что выше описаны? Мне просто интересно какой вариант самый правильный ( я понимаю, что есть много вариантов, вот какой будет реализован такой и будет правильным)

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

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


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

Но может есть ещё какие варианты? Помимо тех что выше описаны? Мне просто интересно какой вариант самый правильный..

Ответ зависит от того, что вы собираетесь делать с найденной частотой:

Задача: определить частоту сигнала в диапазоне 0 до 100 МГц за время <10 мкс..

И от того, с какой точностью вам нужно "определить частоту сигнала в диапазоне 0 до 100 МГц"..

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


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

Ответ зависит от того, что вы собираетесь делать с найденной частотой:

Предполагается что в сигнале будет от 1 частоты до 7-8. Эти частоты нужны для того чтобы определять из каких сигналов состоит исходный.

И от того, с какой точностью вам нужно "определить частоту сигнала в диапазоне 0 до 100 МГц"..

Ну точность к примеру +- 200 КГц. Т.е. ответ может быть такой 5МГц +- 200 КГц. Вот как-то так.

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


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

Предполагается что в сигнале будет от 1 частоты до 7-8. Эти частоты нужны для того чтобы определять из каких сигналов состоит исходный.

 

Ну точность к примеру +- 200 КГц. Т.е. ответ может быть такой 5МГц +- 200 КГц. Вот как-то так.

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

 

PS. Тема, вообще-то, обсуждалась на форуме неоднократно. Воспользуйтесь расширенным поиском по форуму..

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


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

А может есть нечто более простое? В общем как-то так)

У вас весьма странная задача. 0-100 означает, что число октав неограничено. Какая нижняя частота?

Проще Фурье только вейвлет или Уолш. У первого коэффициентов меньше, а у второго они все равны +1 или -1.

ПС: Вейвлеты Добеши не берите. Тетка любит Голландию...

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


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

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

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

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

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

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

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

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

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

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