dima_spb 0 20 апреля, 2015 Опубликовано 20 апреля, 2015 · Жалоба Приветствую Вас, уважаемые знатоки! Вступление. Появилось время и решил разобраться с тем каким образом я могу перенести сигнал из временной области в частотную при помощи ПЛИС. В этом мне может помочь БПФ (FFT). Стал разбираться с математическим фундаментом этого преобразования и в общем и целом представление появилось (что-то вспомнилось из института), НО никак не могу разобраться каким образом эту теорию (математическую) мне перенести в железо. Все красиво говорят, но дальше формул дело не доходит. Вопрос. Прошу мне помочь разобраться с алгоритмом БПФ (его прикрепляю к посту). Никак не могу разобраться с тем, что значат эти линии и точки их пересечений. Для себя я уяснил, что входные отсчеты в нужном количестве я возьму с АЦП и запишу их в ОЗУ. Допустим 2048 отсчетов я записал в ОЗУ и что мне дальше с ними делать? Уточните пожалуйста....куда мне двигаться с этими отсчетами? Может примеры наглядные есть у кого. Я сам интернет копаю, но ответов на свои вопросы не нахожу. Возможно я что-то сильно недопонимаю. P.S. Возможно подобный вопрос уже не раз поднимался....хотя я тут толком для себя полезного не нашел. _________FFT_2048.pdf Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lmx2315 5 20 апреля, 2015 Опубликовано 20 апреля, 2015 · Жалоба http://electronix.ru/forum/index.php?showtopic=58026 Реализация БПФ на ПЛИС, Тудности, встречаемые при реализации з.ы. может будет полезно Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dima_spb 0 20 апреля, 2015 Опубликовано 20 апреля, 2015 · Жалоба http://electronix.ru/forum/index.php?showtopic=58026 Реализация БПФ на ПЛИС, Тудности, встречаемые при реализации з.ы. может будет полезно спасибо Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bogaev_roman 0 20 апреля, 2015 Опубликовано 20 апреля, 2015 · Жалоба to Dmitriyspb что мешает взять готовую корку и настроить ее под свои нужды (для начала просто поточное, где не нужно самому хранить отсчеты)? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dima_spb 0 20 апреля, 2015 Опубликовано 20 апреля, 2015 · Жалоба to Dmitriyspb что мешает взять готовую корку и настроить ее под свои нужды (для начала просто поточное, где не нужно самому хранить отсчеты)? Да, у Xilinx есть готовые корки и можно их взять и не париться. Но я преследую учебные цели. Нужно разобраться пусть в самом простом БПФ. В итоге цель реализовать анализатор спектра до 1 МГц. аппаратная платформа имеется. С дисплеем разберусь в конце. А сейчас нужно разобраться с БПФ. Время позволяет реализовать это самостоятельно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Skryppy 1 20 апреля, 2015 Опубликовано 20 апреля, 2015 · Жалоба Советую почитать Р. Лайонса "Цифровая обработка сигналов", там много интересного найдете. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dima_spb 0 20 апреля, 2015 Опубликовано 20 апреля, 2015 · Жалоба Советую почитать Р. Лайонса "Цифровая обработка сигналов", там много интересного найдете.благодарю. пошел читать :smile3046: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dima_spb 0 20 апреля, 2015 Опубликовано 20 апреля, 2015 · Жалоба Итак, я для себя составил ТХ к БПФ по основанию 2 1. Разрешение - 2,5 кГц 2. Число точек 2048 3. Частота дискретизации 5 МГц 4. Полоса для анализа 1 МГц Читаю дальше.... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dr.Alex 0 20 апреля, 2015 Опубликовано 20 апреля, 2015 · Жалоба Итак, я для себя составил ТХ Сначала надо написать БПФ на том языке, который вы знаете лучше всего, скорее всего это С. И убедиться что работает. А потом уж на плисине делать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dima_spb 0 20 апреля, 2015 Опубликовано 20 апреля, 2015 · Жалоба Сначала надо написать БПФ на том языке, который вы знаете лучше всего, скорее всего это С. И убедиться что работает. А потом уж на плисине делать. Спасибо написать я уже решу на чем и когда. Я сейчас для себя пытаюсь нарисовать структуру. И понять алгоритм БПФ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dima_spb 0 20 апреля, 2015 Опубликовано 20 апреля, 2015 · Жалоба Итак. Стало яснее, но вопросы остаются. Общий принцип понятен. Стал углубляться, а именно рассматривать алгоритм "бабочка" и не могу понять откуда мне взять коэффициенты? Как они считаются? На картинке 1 показано как высчитывается каждая переменная. А на рисунке 2 показано когда и что подставлять в качестве коэффициента. Где взять коэффициенты? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
serjj1333 0 20 апреля, 2015 Опубликовано 20 апреля, 2015 · Жалоба Вот отсюда, например. Коэффициенты Фурье считаются как exp(i*2*pi*k*n/N). N - размер Фурье, k - индекс по частоте 0...N-1, n - индекс по времени 0...N-1. Коэффициенты соответственно комплексные нормированные к 1 и вещественные. Нормируйте их к разрядной сетке, округлите и сохраните их в ROM с коэффициентами. Разные реализации Фурье в разном порядке читают эту память. Есть реализации где коэффициенты считаются налету (при очень большом N) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
serjj1333 0 21 апреля, 2015 Опубликовано 21 апреля, 2015 · Жалоба UPD. Перепутал с коэффициентами DFT общего вида, пардон :rolleyes: . Вот здесь хорошо расписано как считать поворотные коэффициенты для FFT. Фактически поворотные коэффициенты для FFT можно представить как вектор матрицы коэффициентов DFT соответствующий n=1. Таким образом для N точечного FFT потребуется N поворотных коэффициентов часть из которых тривиальная (1, -j), что упрощает алгоритм. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kapsik 0 21 апреля, 2015 Опубликовано 21 апреля, 2015 (изменено) · Жалоба Я сейчас решаю похожую задачу, предлагаю объединить наши усилия =) Набросал код в матлабе, для примера на 16 точек. Понимаю, что профи матлаба меня сейчас наверное закидают тухлыми помидорами, но я написал "чтобы было наглядно, сюда смотреть буду и на verilog кодить" ss = [0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15]; k2 = [0:7]; W2 = exp( -j*2*pi.*k2/16 ); 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); Результат с матлабовской fft сошелся. Изменено 21 апреля, 2015 пользователем Kapsik Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dima_spb 0 21 апреля, 2015 Опубликовано 21 апреля, 2015 · Жалоба Вот отсюда, например. Коэффициенты Фурье считаются как exp(i*2*pi*k*n/N). N - размер Фурье, k - индекс по частоте 0...N-1, n - индекс по времени 0...N-1. Коэффициенты соответственно комплексные нормированные к 1 и вещественные. Нормируйте их к разрядной сетке, округлите и сохраните их в ROM с коэффициентами. Разные реализации Фурье в разном порядке читают эту память. Есть реализации где коэффициенты считаются налету (при очень большом N) А может для этого существует какая-то программка специализированная, которая умеет считать коэффициенты? Никто не знает? Я сейчас решаю похожую задачу, предлагаю объединить наши усилия =) Набросал код в матлабе, для примера на 16 точек. Понимаю, что профи матлаба меня сейчас наверное закидают тухлыми помидорами, но я написал "чтобы было наглядно, сюда смотреть буду и на verilog кодить" ss = [0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15]; k2 = [0:7]; W2 = exp( -j*2*pi.*k2/16 ); 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); Результат с матлабовской fft сошелся. Хорошо. Напишите поподробнее пожалуйста как вы считаете коэффициенты? Wn = exp(-i*2*pi/n), n - размер фурье (число точек), i = [0 ..(n/2)-1] - номер коэффициента. А у Вас еще какой-то "k2" в формуле?????????? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться