Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: БПФ
Форум разработчиков электроники ELECTRONIX.ru > Цифровая обработка сигналов - ЦОС (DSP) > Алгоритмы ЦОС (DSP)
Страницы: 1, 2
Dmitriyspb
Цитата(serjj @ Apr 23 2015, 11:34) *
Вы определенно на пути к истине. Осталось подумать что же неверно в "Участок 4" yeah.gif
После Фурье вы получили комлексный частотный образ входного комплексного сигнала. Если вы возьмёте модуль комплексного числа, то получите АЧХ, если аргумент - то ФЧХ, если квадрат модуля, то спектральную плотность мощности.


Спасибо за пояснения=)
Продолжим!
ФЧХ и АЧХ меня не интересуют. Меня интересует спектр сигнала, поэтому беру квадрат модуля комплексного сигнала.
Нажмите для просмотра прикрепленного файла
На деле же, моя структура будет иметь вид
Нажмите для просмотра прикрепленного файла

правильно понял?
serjj
Да. Формально в схему еще нужно добавить RAM для Re и Im на выходе БПФ. И я подозреваю, что на 2-м участке у вас после ФНЧ должна стоять децимация. Если же Фурье делается на символьной частоте АЦП, то ФНЧ и перенос частоты не нужны, т.к. само Фурье обеспечивает фильтрацию, а зная полосу сигнала, который вы анализируете, вы просто берёте отсчёты частотного образа, которые попадают в эту полосу и работаете только с ними (это встречается например в приложениях с низкочастотной обработкой в акустике). Ну а так вроде всё норм.
Swup
Спектр Фурье это разложение сигнала на сумму комплексных экспонент. т.е. то что у вас есть на выходе БПФ - это спектр вашего сигнала.
Далее вы берете и из каждой комплексной экспоненты представленной в виде re+j*im выделяете амплитуду по формуле Эйлера. И получаете... Амплитудный спектр, т.е. распределение амплитуд по частоте или попросту говоря амплитудно-частотную характеристику. Ну а есть брать квадрат амплитуд то будет спектр мощности.
Dmitriyspb
Цитата(serjj @ Apr 23 2015, 13:05) *
Да. Формально в схему еще нужно добавить RAM для Re и Im на выходе БПФ.


Да, вы правы. Добавлю.

Цитата(serjj @ Apr 23 2015, 13:05) *
Если же Фурье делается на символьной частоте АЦП, то ФНЧ и перенос частоты не нужны, т.к. само Фурье обеспечивает фильтрацию, а зная полосу сигнала, который вы анализируете, вы просто берёте отсчёты частотного образа, которые попадают в эту полосу и работаете только с ними (это встречается например в приложениях с низкочастотной обработкой в акустике).


На мой взгляд это проще. Думаю так и поступить.
Частота дискретизации АЦП 5 МГц.
Полоса анализа (ширина полосы сигнала) 1 МГц.
Частота обработки БПФ тоже 5 МГц

учитывая эту информацию
Цитата(Xenia @ Apr 22 2015, 16:54) *
Если входные данные вещественные, то вам придется их дополнить нулевой мнимой частью, и только после этого запустить на этом месте БПФ. Уже после первого шага алгоритма ненулевые числа появятся и в мнимой части тоже.

Тогда структура принимает вид?
Нажмите для просмотра прикрепленного файла

Или так не стоит дополнять нулевой мнимой частью?
serjj
Цитата
Тогда структура принимает вид
...
Или так не стоит дополнять нулевой мнимой частью?

Вроде бы нормально все. Да, делайте преобразование в общем виде (как для комплексного сигнала по алгоритму) и на вход Im просто нули подавайте.
Dmitriyspb
Цитата(serjj @ Apr 23 2015, 13:58) *
Вроде бы нормально все. Да, делайте преобразование в общем виде (как для комплексного сигнала по алгоритму) и на вход Im просто нули подавайте.


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

тогда приступим к детальному рассмотрению БПФ. smile3046.gif

Ту мне кажется для меня все понятнее, но все же постараюсь сформулировать. rolleyes.gif

Частота дискретизации для АЦП 5 МГц
БПФ будет производиться на этих же 5 МГц
Планирую для простоты для начала реализовать 128 точек.
________________________________________________________
Для полного объединения спектра размерностью 128 отсчетов требуется выполнить log2 128 циклов операций "бабочка".
Итого log2 128 =7 циклов
при этом каждый цикл состоит из 64 операций, т.к. при основании 2 в одной базовой операции БПФ задействовано 2 входных отсчета.
_________________________________________________________

общее число поворачивающих к-тов равно половине размерности входного сигнала 128/2 = 64 к-тов

_________________________________________________________
Верно я излагаю?
des00
ТС в форуме про плисы, есть тема про БПФ. Пишут вместе с начинающим с начала и до конца.
Dmitriyspb
Цитата(des00 @ Apr 23 2015, 17:05) *
ТС в форуме про плисы, есть тема про БПФ. Пишут вместе с начинающим с начала и до конца.


Думаю этот пост претендует на самый "ПОЛЕЗНЫЙ" biggrin.gif

Всегда особенно ценил подобные советы laughing.gif
mihalevski
удален
Krys
Цитата(Dmitriyspb @ Apr 23 2015, 17:42) *
Или так не стоит дополнять нулевой мнимой частью?
Учитывая, что сигнал чисто вещественный, то спектр в отрицательной области будет комплексно-сопряжённым, следовательно при использовании полноценного БПФ для комплексных входных сигналов половина отсчётов будет избыточна. Избыточны и ресурсы на её расчёт.
Для расчёта спектра чисто вещественных сигналов используются особые модификации БПФ. Если не путаю DCT (дискретное косинус-преобразование). Короче гуглить надо, но смысл есть. Поискал у себя - чего-то с ходу не нашёл. Кажется припоминаю, что об этом всём должно быть во многих основополагающих книжках того же Лайноса, Рабинера с Голдом, Оппенгейма и т.п. Теория то давно придумана и задокументирована в букварях, велосипед изобретать не надо. Просто почитать самые канонические буквари.


Цитата(serjj @ Apr 22 2015, 19:33) *
(a_re + j*a_im)(w_re + j*w_im) = (a_re*w_re - a_im*w_im) + j*(a_re*w_im + a_im*w_re)
Добавлю. При реализации на ПЛИС иногда удобнее пользоваться формулой с тремя умножениями и 5 сложениями, т.к. DSP-блоков меньше съедается. Сама формула есть в датащите на дсп-блок от спартана6.
Dmitriyspb
Цитата(Krys @ May 18 2015, 10:04) *
Для расчёта спектра чисто вещественных сигналов используются особые модификации БПФ. Если не путаю DCT (дискретное косинус-преобразование).


Вы в этом уверены??????????????????????????????????? wacko.gif
Мне кажется, что Вы что-то путаете. Ведь БПФ это и есть адаптация ДПФ к вычислительным мощностям маломощных ЭВМ.

А DCT используется в алгоритмах сжатия информации.

Krys
есть быстрое косинус-преобразование, по аналогии с быстрым Фурье-преобразованием. Я не то, чтобы не путаю. Я просто назвал общий класс преобразований, а быстрое или не быстрое - это уже подклассы. Главное, что это не Фурье, а косинус-преобразование, которое использует половину ресурсов.
Вы лучше взгляните главы книжек авторов, которые я назвал. Хотя бы пробегитесь по диагонали, может найдёте именно это. Я действительно уже подзабыл.
Dmitriyspb
Цитата(Krys @ May 18 2015, 13:59) *
есть быстрое косинус-преобразование, по аналогии с быстрым Фурье-преобразованием. Я не то, чтобы не путаю. Я просто назвал общий класс преобразований, а быстрое или не быстрое - это уже подклассы. Главное, что это не Фурье, а косинус-преобразование, которое использует половину ресурсов.
Вы лучше взгляните главы книжек авторов, которые я назвал. Хотя бы пробегитесь по диагонали, может найдёте именно это. Я действительно уже подзабыл.


Спасибо за советы. Обязательно взгляну и сразу дело пойдет в гору. Спасибо ещё раз.

P.S. давайте по делу больше, а не писать названия знакомых книжек.
Почитайте последние посты и поймите чего интересует автора поста и т.п.
TSerg
Цитата(Dmitriyspb @ May 18 2015, 14:12) *
P.S. давайте по делу больше, а не писать названия знакомых книжек.


Т.е. - пересказывать их? crying.gif
Dmitriyspb
Цитата(TSerg @ May 18 2015, 14:14) *
Т.е. - пересказывать их? crying.gif


хм!? наизусть smile3009.gif
thermit
Цитата(Dmitriyspb @ May 18 2015, 14:12) *
Спасибо за советы. Обязательно взгляну и сразу дело пойдет в гору. Спасибо ещё раз.

P.S. давайте по делу больше, а не писать названия знакомых книжек.
Почитайте последние посты и поймите чего интересует автора поста и т.п.



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

http://electronix.ru/forum/index.php?showt...t&p=1227495

2-е формулы.
Dmitriyspb
Цитата(thermit @ May 18 2015, 14:43) *
Если нужно дпф над вещественными данными, можно его выполнить через комплексное половинной длины.

http://electronix.ru/forum/index.php?showt...t&p=1227495

2-е формулы.


Тогда возникает вопрос, а в чем преимущества алгоритма с полными комплексными числами перед алгоритмом, где только вещественная часть сигнала фигурирует?
thermit
Цитата(Dmitriyspb @ May 18 2015, 16:28) *
Тогда возникает вопрос, а в чем преимущества алгоритма с полными комплексными числами перед алгоритмом, где только вещественная часть сигнала фигурирует?



Выход дпф есть комплексная последовательность вне зависимости от того, какие данные на входе.
Если входные данные вещественны, есть 2 варианта вычисления дпф:

1. Представить входную последовательность как комплексную, но половинной длины и выполнить дпф половинной длины. Затем преобразовать полученную посл в дпф исходной (см формулы).
2. Выполнить над исходной последовательностью преобразование хартли полной длины. Оно чисто вещественное. Затем преобразовать полученную последовательность в дпф при помощи несложных вычислений.

оба способа практически не отличаются с точки зрения ресурсов.
Krys
Цитата(Dmitriyspb @ May 18 2015, 18:12) *
Спасибо за советы. Обязательно взгляну и сразу дело пойдет в гору. Спасибо ещё раз.

P.S. давайте по делу больше, а не писать названия знакомых книжек.
Почитайте последние посты и поймите чего интересует автора поста и т.п.
Я так понимаю, Вы обиделись на советы почитать книжки и считаете их бесполезными или малополезными в виду неопределённости границ поиска? ))) А зря. Я сам не люблю, когда мне советуют почитать книжки, подразумевая в косвенной форме идти обратно учиться 5 лет в вузе ))) В данном случае я подразумевал, что я где-то встречал конкретную информацию. Нужно открыть книжки в оглавлении, найти главу про преобразование Фурье, там либо подглава будет про преобразование над вещественными данными, либо бегло пролистать текст главы просто самому, может что-то попадётся.
Попробую найти время, сам пробегусь. Заодно освежу в памяти
Dmitriyspb
Цитата(thermit @ May 18 2015, 17:17) *
Выход дпф есть комплексная последовательность вне зависимости от того, какие данные на входе.
Если входные данные вещественны, есть 2 варианта вычисления дпф:

1. Представить входную последовательность как комплексную, но половинной длины и выполнить дпф половинной длины. Затем преобразовать полученную посл в дпф исходной (см формулы).
2. Выполнить над исходной последовательностью преобразование хартли полной длины. Оно чисто вещественное. Затем преобразовать полученную последовательность в дпф при помощи несложных вычислений.

оба способа практически не отличаются с точки зрения ресурсов.


Этот момент я усвоил. Спасибо за комментарий. Мне вот интересно: если используя два описанных Вами метода реализовывать анализатор спектра, то результат будет одинаковый, либо будет какая-то разница? Ресурсов потребуется одинаково (если я правильно понял). Хочется понять практическую ценность этих двух методов. Или они просто идентичные и какой больше нравится тем и пользуйся?

Цитата(Krys @ May 19 2015, 05:05) *
Я так понимаю, Вы обиделись на советы почитать книжки и считаете их бесполезными или малополезными в виду неопределённости границ поиска? ))) А зря. Я сам не люблю, когда мне советуют почитать книжки, подразумевая в косвенной форме идти обратно учиться 5 лет в вузе ))) В данном случае я подразумевал, что я где-то встречал конкретную информацию. Нужно открыть книжки в оглавлении, найти главу про преобразование Фурье, там либо подглава будет про преобразование над вещественными данными, либо бегло пролистать текст главы просто самому, может что-то попадётся.
Попробую найти время, сам пробегусь. Заодно освежу в памяти


Давайте по теме и Объективно! Все хорошо biggrin.gif rolleyes.gif laughing.gif
Krys
Вот по теме нашёл для Вас: Лайонс_-_ЦОС_2е_издание_русский_перевод_2006.djvu. Страница 483. Глава 13.5. Эффективное вычисление БПФ действительных последовательностей.
Dmitriyspb
Цитата(Krys @ May 19 2015, 09:51) *
Вот по теме нашёл для Вас: Лайонс_-_ЦОС_2е_издание_русский_перевод_2006.djvu. Страница 483. Глава 13.5. Эффективное вычисление БПФ действительных последовательностей.


Спасибо Вам огромное. Ведь можем когда хотим biggrin.gif
Пошел читать smile3046.gif
______________________________________________________________________________
Сейчас ситуация следующая. Алгоритм я выбрал и разобрался с ним. Сейчас упорно ковыряю fft на verilog под fpga. По реализации вопросов не имею. Если возникнут, тогда это уже будет другая ветка по ПЛИС.

А вот для кругозора я почитаю как это можно сделать иначе.
Krys
Цитата(Dmitriyspb @ May 19 2015, 13:57) *
Спасибо Вам огромное. Ведь можем когда хотим
Ага, мы можем, когда Вы хотите ))) Пожалуйста ))

Цитата(Dmitriyspb @ May 19 2015, 13:57) *
Алгоритм я выбрал и разобрался с ним
На чём остановились?

Цитата(Dmitriyspb @ May 19 2015, 13:57) *
Если возникнут, тогда это уже будет другая ветка по ПЛИС.
Возникнут... )) С разрядностью, гейном, округлением...
thermit
Цитата
Dmitriyspb:
Этот момент я усвоил. Спасибо за комментарий. Мне вот интересно: если используя два описанных Вами метода реализовывать анализатор спектра, то результат будет одинаковый, либо будет какая-то разница? Ресурсов потребуется одинаково (если я правильно понял). Хочется понять практическую ценность этих двух методов. Или они просто идентичные и какой больше нравится тем и пользуйся?


Одинаковы с точностью до ошибок вычислений.
Dmitriyspb
Цитата(Krys @ May 19 2015, 10:46) *
Ага, мы можем, когда Вы хотите ))) Пожалуйста ))

И все равно надо что-то написать laughing.gif

Цитата(Krys @ May 19 2015, 10:46) *
На чём остановились?

Посмотрите эту ветку форума изначально. Там добрый человек меня тыкал носом в мои ошибки, а я рисовал структуры. В итоге структуру нарисовал.

Цитата(Krys @ May 19 2015, 10:46) *
Возникнут... )) С разрядностью, гейном, округлением...


Я тут покопался на форуме и нашел где объясняли как округлять (популярным языком). Ссылка есть во втором посте


Цитата(Krys @ May 19 2015, 10:46) *
Ага, мы можем, когда Вы хотите ))) Пожалуйста ))

На чём остановились?

Возникнут... )) С разрядностью, гейном, округлением...


Вот Вы человек способный, умный.... пишите без ошибок, пунктуацию соблюдаете, книжек много знаете разных, возможно их читаете. Такие люди как Вы обычно знают много....может поможете....

Меня волнует еще отвлеченный от этой темы вопрос
Krys
Цитата(Dmitriyspb @ May 19 2015, 15:58) *
И все равно надо что-то написать
А как же )) Мы, злостные флудеры, такие ))) Расслабьтесь. Мы же сюда заходим не только работать, но и отдохнуть от работы. Лёгкий флуд - терпимо.
Dmitriyspb
Цитата(Krys @ May 19 2015, 14:37) *
А как же )) Мы, злостные флудеры, такие ))) Расслабьтесь. Мы же сюда заходим не только работать, но и отдохнуть от работы. Лёгкий флуд - терпимо.


Ах...вот оно что?!
Dmitriyspb
Уважаемые форумчане biggrin.gif Возникли трудности, прошу по возможности помощи.
Речь о БПФ, если кто не в курсе.
1. Бабочка по основанию 2
2. 16 точек
3. Частота дискретизации 5 МГц
4. Прореживание во времени
5. Соответственно 8 коэффициентов
6. Реализация на ПЛИС (verilog).
7. Моделирую в Modelsim
8. Пытаюсь smile3046.gif проверить работу алгоритма в Mathlab
________________________________________________________________________________
_
Я построил свою работу следующим образом:
1. Используя описание 16-ти точечного БПФ в Матлаб рассчитал коэфициенты и подставил удобные для себя входные отсчеты. В итоге построил график Нажмите для просмотра прикрепленного файла, на котором увидел ожидаемую для себя картинку при входных отсчетах
Код
ss = [828 1515 1943 2038 1784 1225 457 -390 -1170 -1750 -2030 -1963 -1560 -890 -68 0];

и коэффициентах
Код
w0 = (1+0i);
w1 = (0.9239-0.3827i);
w2 = (0.7071-0.7071i);
w3 = (0.3827-0.9239i);
w4 = (0-1i);
w5 = (-0.3827-0.9239i);
w6 = (-0.7071-0.7071i);
w7 = (-0.9239-0.3827i);


2. После этого зная из Матлаб результаты всех вычислений я переместился в Modelsim и начал там тестировать свой БПФ описанный на Verilog. В качестве входных значений я использовал те же, что и в Матлаб представленных в дополнительном коде. т.е. мантисса занимает биты с 0 по 10, а 11 бит знаковый в итоге диапазон входных значений от -2047 до +2047.
С коэффициентами иначе. Та как коэффициенты у меня меняются от -1 до +1, тогда я их домножил на все те же 2047 и округлил, 11 битом прикрепил знак. В итоге мои коэффициенты стали иметь вид:
Код
w0 = 2047 + 0i;
w1 = 1891-783i;
w2 = 1447-1447i;
w3 = 783-1891i;
w4 = 0-2047i;
w5 = -783-1891i;
w6 = -1447 - 1447i;
w7= -1891-783i;


3. И тут я как "умная Маша" smile3046.gif попытался засунуть округленные коэффициенты в целочисленной форме в Матлаб. В итоге у меня на выходе ерунда вместо прежней картинки.
И я не понимаю почему????
Нужно что-то менять в матлаб? Просто мне никак не проверить корректность работы БПФ описанного verilog. Хочется иметь одни и те же коэффициенты и в Матлаб и в Моделсим.

Привожу код БПФ из Матлаб


Код
ss = [828 1515 1943 2038 1784 1225 457 -390 -1170 -1750 -2030 -1963 -1560 -890 -68 0];
%k2 = [0:7];
%W2 = exp( -j*2*pi.*k2/16 );
w11 = (1+0i);
w12 = (0.9239-0.3827i);
w13 = (0.7071-0.7071i);
w14 = (0.3827-0.9239i);
w15 = (0-1i);
w16 = (-0.3827-0.9239i);
w17 = (-0.7071-0.7071i);
w18 = (-0.9239-0.3827i);

W2 = [ w11 w12 w13 w14 w15 w16 w17 w18];
s2r = [ss(1) ss(9) ss(5) ss(13) ss(3) ss(11) ss(7) ss(15) ss(2) ss(10) ss(6) ss(14) ss(4) ss(12) ss(8) ss(16)];

%первый шаг
s11 = s2r(1) + s2r(2);
s12 = s2r(1) - s2r(2);
s13 = s2r(3) + s2r(4);
s14 = s2r(3) - s2r(4);
s15 = s2r(5) + s2r(6);
s16 = s2r(5) - s2r(6);
s17 = s2r(7) + s2r(8);
s18 = s2r(7) - s2r(8);
s19 = s2r(9) + s2r(10);
s110= s2r(9) - s2r(10);
s111= s2r(11)+ s2r(12);
s112= s2r(11)- s2r(12);
s113= s2r(13)+ s2r(14);
s114= s2r(13)- s2r(14);
s115= s2r(15)+ s2r(16);
s116= s2r(15)- s2r(16);


%второй шаг

s21 = s11 + s13* W2(1);
s22 = s12 + s14* W2(5);
s23 = s11 - s13* W2(1);
s24 = s12 - s14* W2(5);

s25 = s15 + s17* W2(1);
s26 = s16 + s18* W2(5);
s27 = s15 - s17* W2(1);
s28 = s16 - s18* W2(5);

s29 = s19 + s111* W2(1);
s210 = s110 + s112*W2(5);
s211 = s19 - s111* W2(1);
s212 = s110 - s112*W2(5);

s213 = s113 + s115*W2(1);
s214 = s114 + s116*W2(5);
s215 = s113 - s115*W2(1);
s216 = s114 - s116*W2(5);

%шаг 3
s31 = s21 +  s25*W2(1);
s32 = s22 +  s26*W2(3);
s33 = s23 +  s27*W2(5);
s34 = s24 +  s28*W2(7);
s35 = s21 -  s25*W2(1);
s36 = s22 -  s26*W2(3);
s37 = s23 -  s27*W2(5);
s38 = s24 -  s28*W2(7);

s39 = s29 +  s213*W2(1);
s310= s210 + s214*W2(3);
s311= s211 + s215*W2(5);
s312= s212 + s216*W2(7);
s313 = s29 - s213*W2(1);
s314= s210 - s214*W2(3);
s315= s211 - s215*W2(5);
s316= s212 - s216*W2(7);

%шаг 4

s41 = s31 + s39*W2(1);
s42 = s32 + s310*W2(2);
s43 = s33 + s311*W2(3);
s44 = s34 + s312*W2(4);
s45 = s35 + s313*W2(5);
s46 = s36 + s314*W2(6);
s47 = s37 + s315*W2(7);
s48 = s38 + s316*W2(8);

s49 = s31 - s39*W2(1);
s410 = s32 - s310*W2(2);
s411 = s33 - s311*W2(3);
s412 = s34 - s312*W2(4);
s413 = s35 - s313*W2(5);
s414 = s36 - s314*W2(6);
s415 = s37 - s315*W2(7);
s416 = s38 - s316*W2(8);

%Строим график

x = [0 : 15];
y = [s41, s42, s43, s44, s45, s46, s47, s48, s49, s410, s411, s412, s413,s414, s415, s416];
plot (x, y)

Krys
решили проблему? В чём была ошибка?
Corner
Предполагаю, что вы напутали со знаковой математикой. Verilog, в отличие от С, считает переменные без знаковыми, покуда не укажете обратное.
Krys
К счастью, в доп.коде операции делаются идентично, поэтому указание знака необязательно. Лично я ставлю reg signed или wire signed только для того, чтобы в симуляторе наблюдать сразу знаковые значения.
Corner
Цитата(Kapsik @ Apr 21 2015, 14:59) *
Да, в матлабе посчитаю и в mif засуну.

Quartus поддерживает инструкцию $readmemh для блочного ROM в Verilog. Вообще не надо париться с написанием. Забил reg. Прописал $readmemh в initial.

Цитата(Krys @ Aug 25 2015, 09:59) *
К счастью, в доп.коде операции делаются идентично, поэтому указание знака необязательно. Лично я ставлю reg signed или wire signed только для того, чтобы в симуляторе наблюдать сразу знаковые значения.

Ничего подобного. При умножении надо указывать $signed иначе будет непредсказуемая ерунда, даже если указана знаковая переменная.
novartis
Пока тема свежая, задамка вопрос по БПФ.

Вот написал я свое ядро бпф.
Работает оно так, что подаю на вход N точек, оно N*log(N) тактов рассчитает результат.
И получается, что пока производится расчет я не могу на вход подавать следующий кадр, так как внутри задействована память на N отсчетов, умножитель, два сумматора, и во время расчета они постоянно заняты, конвеером пустить новые данные ну ни как.
А вот у альтеры и ксайлинка ip-ядра способны принимать новые кадры без пауз.
Как это у них реализовано?

Самый дубовый вариант - буферизировать входные данные. Но размер буфера будет определяться величиной log(N), а у альтеры/ксайлинкса не наблюдается, чтобы ядро требовало больше памяти, чем под один кадр.
TRILLER
Цитата(novartis @ Sep 23 2015, 09:23) *
Пока тема свежая, задамка вопрос по БПФ.

Вот написал я свое ядро бпф.
Работает оно так, что подаю на вход N точек, оно N*log(N) тактов рассчитает результат.
И получается, что пока производится расчет я не могу на вход подавать следующий кадр, так как внутри задействована память на N отсчетов, умножитель, два сумматора, и во время расчета они постоянно заняты, конвеером пустить новые данные ну ни как.
А вот у альтеры и ксайлинка ip-ядра способны принимать новые кадры без пауз.
Как это у них реализовано?

Самый дубовый вариант - буферизировать входные данные. Но размер буфера будет определяться величиной log(N), а у альтеры/ксайлинкса не наблюдается, чтобы ядро требовало больше памяти, чем под один кадр.

Вообще-то обычный Радикс-2/4 работает именно кадрами. Накапление->вычисление->выдача результата(накопление). Есть ещё по-моему потоковый алгоритм у них, но только на небольшое число точек и с большим ресурсом..
В своё время делал FFT - при разумной полосе спектра сигнала(скажем до 50 МГц) вполне хватает буфера на N точек.
1. Ядро вполне реально разогнать до максимальной частоты BRAM/DSP - смотря что меньше. Пусть будет 500. А это сразу даёт 10 тактов вычисления на 1 такт данных.
2. Первую бабочку можно сделать сразу в момент прихода второй половины входных отсчётов, так как там коэффициенты только единицы.
3. При реализации БПФ с прореживанием по частоте довольно легко при каждом следующем проходе увеличивать число ядер вдвое(в разумных пределах), так как области данных между собой больше не пересекаются и в связи с этим можно разграничить доступ к области памяти.
Всё это конечно усложняет реализацию, но бывают случаи, когда это меньшее из зол.
novartis
Погонял модель бпф от альтеры и в сигналтапе на железе посмотрел. Потоком кадры друг за дружкой засылаю, на выходе результат также потоком выходит, без разрывов. Как же они это реализовали?
Fat Robot
Бегло читаем документ.

Находим в нем "The variable streaming FFTs implement either a radix-2^2 single delay feedback FFT, ..."

Ищем гуглом "sdf fft" или "r4sdf fft", или "r2sdf fft"

Цитата(novartis @ Sep 24 2015, 16:05) *
Погонял модель бпф от альтеры и в сигналтапе на железе посмотрел. Потоком кадры друг за дружкой засылаю, на выходе результат также потоком выходит, без разрывов. Как же они это реализовали?
Corner

Цитата(novartis @ Sep 23 2015, 10:23) *
Пока тема свежая, задамка вопрос по БПФ.

Вот написал я свое ядро бпф.
Работает оно так, что подаю на вход N точек, оно N*log(N) тактов рассчитает результат.
И получается, что пока производится расчет я не могу на вход подавать следующий кадр, так как внутри задействована память на N отсчетов, умножитель, два сумматора, и во время расчета они постоянно заняты, конвеером пустить новые данные ну ни как.
А вот у альтеры и ксайлинка ip-ядра способны принимать новые кадры без пауз.
Как это у них реализовано?

Самый дубовый вариант - буферизировать входные данные. Но размер буфера будет определяться величиной log(N), а у альтеры/ксайлинкса не наблюдается, чтобы ядро требовало больше памяти, чем под один кадр.

Самый дубовый вариант, это поставить N блоков БПФ и коммутировать поотсчетно, подавая их на входы со сдвигом на отсчет. А у Altera и Xilinx используется БПФ со сдвигом не на отсчет, а на 1/2... 1/4 размера блока. По сути, имеется 2... 4 БПФ блока. В результате, на выходе почти отсутствуют разрывы фазы. Но такое преобразование годится не для всех видов модуляции. Иногда приходится делать перекрытие еще меньше 1/4.
Acvarif
Цитата(Corner @ Sep 27 2015, 23:05) *
Самый дубовый вариант, это поставить N блоков БПФ и коммутировать поотсчетно, подавая их на входы со сдвигом на отсчет. А у Altera и Xilinx используется БПФ со сдвигом не на отсчет, а на 1/2... 1/4 размера блока. По сути, имеется 2... 4 БПФ блока. В результате, на выходе почти отсутствуют разрывы фазы. Но такое преобразование годится не для всех видов модуляции. Иногда приходится делать перекрытие еще меньше 1/4.

По поводу поточного БПФ - все достаточно просто. Описано в соответствующих букварях. Небольшая заметка по этому поводу для ПЛИС http://acvarif.info/prvhdl/prvhdl25.html Такой метод довольно ресурсозатратный, но при наличии в ПЛИС аппаратных умножителей все работает неплохо.
Krys
Цитата(Corner @ Sep 22 2015, 02:27) *
Ничего подобного. При умножении надо указывать $signed иначе будет непредсказуемая ерунда, даже если указана знаковая переменная.
Для сложения - без разницы. А для умножения - согласен, могут быть нюансы. И то, у Xilinx реализован аппаратный умножитель чисел дополнительного кода, так что это для него нативно.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.