Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Проблемы с коркой fft от Altera
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
novartis
Добрый день.
Вожусь с мегакоркой FFT от Altera. Создал простенький проект в квартусе 11.1 (в 9.1 такие же косяки).
Настроил мегакорку БПФ так: variable streaming, floating point, 1024 отсчета.

Подаю на вход БПФ синус, преобразованный из целого к плавающей точке.
Правильность преобразования проверял в матлабе, все правильно.
В синус ввел постоянную составляющую 512, амплитуда синуса 512, то есть отсчеты принимают значения от 0 до 1024. Частота синуса такова, что на 16 точек приходится 1 период.

На выходе БПФ имею спектр этого синуса. Сохраняю его в памяти, из памяти считываю в файл, затем в матлабе строю графики.

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

Эксперименты представлены на рисунках.

На двух графиках показал синус на входе БПФ и восстановленный путем ОБПФ из спектра из ПЛИС. Показана только малая чать сигнала.
На двух других графиках - реальные и мнимые части спектра.

Может кто нибудь наступал на подобные грабли?

Еще проблема с этим ядром:
При количестве точек кратном степени 4 я применяю процедуру Digit Reverse ReOrder, и выходные отсчеты получаются как надо. Когда же количество точек кратно степени 2 ни Digit Reverse ReOrder, ни Bit Reverse ReOrder не помогает, отсчеты отсортированы ни в том, и ни в другом порядке. Экспериментально установил, что для сигнала из 2048 точек преобразовывать надо так:
zbin(0) <= xbin(0);
zbin(1) <= xbin(2);
zbin(2) <= xbin(1);
zbin(3) <= xbin(4);
zbin(4) <= xbin(3);
zbin(5) <= xbin(6);
zbin(6) <= xbin(5);
zbin(7) <= xbin(8);
zbin(8) <= xbin(7);
zbin(9) <= xbin(9);
zbin(10) <= xbin(10);

Может кто с этим сталкивался?
almost
Цитата(novartis @ Jan 23 2012, 13:26) *
Добрый день.
Вожусь с мегакоркой FFT от Altera. Создал простенький проект в квартусе 11.1 (в 9.1 такие же косяки).
Настроил мегакорку БПФ так: variable streaming, floating point, 1024 отсчета.

Подаю на вход БПФ синус, преобразованный из целого к плавающей точке.
Правильность преобразования проверял в матлабе, все правильно.
В синус ввел постоянную составляющую 512, амплитуда синуса 512, то есть отсчеты принимают значения от 0 до 1024. Частота синуса такова, что на 16 точек приходится 1 период.

На выходе БПФ имею спектр этого синуса. Сохраняю его в памяти, из памяти считываю в файл, затем в матлабе строю графики.

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

Эксперименты представлены на рисунках.

На двух графиках показал синус на входе БПФ и восстановленный путем ОБПФ из спектра из ПЛИС. Показана только малая чать сигнала.
На двух других графиках - реальные и мнимые части спектра.

Может кто нибудь наступал на подобные грабли?


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


С 23-ей страницы почитайте.
Нажмите для просмотра прикрепленного файла
jojo
novartis, что будет, если амплитуду сигнала в 2 раза уменьшить?
Александр77
Или постараться не превышать в сигнале значение 1023.
novartis
Спасибо за помощь!

Цитата
Для информативности покажите выборки до БПФ (т.е. исходный сигнал)

Исходный сигнал показан на графиках 1 и 2 черным цветом, специально его сохраняю в памяти ПЛИС, потом скидываю в файл и считываю в матлабе.

Цитата
novartis, что будет, если амплитуду сигнала в 2 раза уменьшить?

амплитуду не уменьшал, завтра попробую, мне кажется это не поможет(

Хотелось бы еще провести такой опросик по данной теме:
кто реально использовал корку БПФ от альтеры, при каких настройках и все ли там работало?
gosu-art
http://electronix.ru/forum/index.php?showtopic=96723&hl=

bb-offtopic.gif А как как вы сохраняете значения в файл? Ниосом по JTAG-UART?
novartis
Цитата
http://electronix.ru/forum/index.php?showtopic=96723&hl=

А как как вы сохраняете значения в файл? Ниосом по JTAG-UART?


Указанную тему читал, там ядро настроено на целочисленные вычисления, автор не произвел блочное масштабирование, ему разъяснили, проблема решилась. У меня вычисления в формате с плавающей точкой, блочного масштабирования нет.

Данные я тупо записываю в однопортовую память, потом в In System Memory Conetent Editor просматриваю и экспортирую в файл.
novartis
Прошло уже полгода, а проблема у меня так и не решилась.
Может кто за эти полгода тоже столкнуся с этим.

Вот еще две картинки прикреплю.
На первой на вход коры подаю синус:
for i=1:128;
ss(i) = Amp*sin(pi/100+pi*i/4);
end.
С выхода корки снимаю результат, засовываю в матлаб, строю модуль, реальную и мнимую часть.
Нажмите для просмотра прикрепленного файла
Видим появляются существенные "пички".

На второй картинке входной синус смещен по фазе относительно первого:
for i=1:128;
ss(i) = Amp*sin(pi/10+pi*i/4);
end.
Нажмите для просмотра прикрепленного файла
Пичков уже нет, результат БПФ в ПЛИСке очень хорошо ложится на результат в матлабе.


Разные сигналы подсовывал в ПЛИС. Однозначную закономерность появления пичков не обнаружил.
Из за чего может проявляться этот эффект?

В скором времени начальство может сказать покупать корку, но не хотелось бы отдавать за ТАКОЕ 8000$.
shkal
А как насчёт умножения на оконную функцию?
Slaven
У меня возникла следующая проблема.
Мне необходимо произвести расчет FFT c N=512 с учетом того, что выход будет организован в
Natural Order, в вход Digit Reverse Order (режим работы корки выбран как Varible Streaming c Floating Point). В обратном порядке, когда выход Digit Reverse Order, а вход Natural Order все работает . Я получаю данные с корки, записываю их в 2-х портовое ОЗУ, а затем производя digit reverse с адресом для чтения данных с ОЗУ, получаю массив переложенный в Natural Order (реверс адресов выглядит следующим образом, например: 1(00000 0001)=128(01000 0000), 5(00000 0101)=160(01010 0000) и т.д.
Но , как я писал в начале мне необходим вариант вход: Digit Reverse Order, выход: Natural Order.
Я так понимаю, что в этом случае реверс адресов должен выглядеть так: 1 (00000 0001)=256(10000 0000), 5(00000 0101)=384(11000 0000) и т.д. ). Но в данном случае на выходе FFT я вижу разваленный сигнал, смещенный по частоте. Подскажите пожалуйста, все ли я делаю правильно.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.