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

Проблемы с коркой fft от Altera

Добрый день.

Вожусь с мегакоркой 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);

 

Может кто с этим сталкивался?

post-52845-1327309358_thumb.jpg

post-52845-1327309404_thumb.jpg

post-52845-1327309698_thumb.jpg

post-52845-1327309742_thumb.jpg

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


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

Добрый день.

Вожусь с мегакоркой FFT от Altera. Создал простенький проект в квартусе 11.1 (в 9.1 такие же косяки).

Настроил мегакорку БПФ так: variable streaming, floating point, 1024 отсчета.

 

Подаю на вход БПФ синус, преобразованный из целого к плавающей точке.

Правильность преобразования проверял в матлабе, все правильно.

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

 

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

 

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

 

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

 

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

На двух других графиках - реальные и мнимые части спектра.

 

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

 

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

 

 

С 23-ей страницы почитайте.

______.pdf

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


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

Или постараться не превышать в сигнале значение 1023.

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


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

Спасибо за помощь!

 

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

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

 

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

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

 

Хотелось бы еще провести такой опросик по данной теме:

кто реально использовал корку БПФ от альтеры, при каких настройках и все ли там работало?

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


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

http://electronix.ru/forum/index.php?showtopic=96723&hl=

 

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

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


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

http://electronix.ru/forum/index.php?showtopic=96723&hl=

 

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

 

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

 

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

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


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

Прошло уже полгода, а проблема у меня так и не решилась.

Может кто за эти полгода тоже столкнуся с этим.

 

Вот еще две картинки прикреплю.

На первой на вход коры подаю синус:

for i=1:128;

ss(i) = Amp*sin(pi/100+pi*i/4);

end.

С выхода корки снимаю результат, засовываю в матлаб, строю модуль, реальную и мнимую часть.

post-52845-1344308599_thumb.png

Видим появляются существенные "пички".

 

На второй картинке входной синус смещен по фазе относительно первого:

for i=1:128;

ss(i) = Amp*sin(pi/10+pi*i/4);

end.

post-52845-1344308626_thumb.png

Пичков уже нет, результат БПФ в ПЛИСке очень хорошо ложится на результат в матлабе.

 

 

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

Из за чего может проявляться этот эффект?

 

В скором времени начальство может сказать покупать корку, но не хотелось бы отдавать за ТАКОЕ 8000$.

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


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

У меня возникла следующая проблема.

Мне необходимо произвести расчет 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 я вижу разваленный сигнал, смещенный по частоте. Подскажите пожалуйста, все ли я делаю правильно.

 

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


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

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

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

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

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

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

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

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

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

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