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

Приветствую Вас, уважаемые знатоки! :biggrin:

 

Вступление.

Появилось время и решил разобраться с тем каким образом я могу перенести сигнал из временной области в частотную при помощи ПЛИС. В этом мне может помочь БПФ (FFT).

Стал разбираться с математическим фундаментом этого преобразования и в общем и целом представление появилось (что-то вспомнилось из института), НО никак не могу разобраться каким образом

эту теорию (математическую) мне перенести в железо. Все красиво говорят, но дальше формул дело не доходит.

 

Вопрос.

Прошу мне помочь разобраться с алгоритмом БПФ (его прикрепляю к посту). Никак не могу разобраться с тем, что значат эти линии и точки их пересечений.

 

Для себя я уяснил, что входные отсчеты в нужном количестве я возьму с АЦП и запишу их в ОЗУ. Допустим 2048 отсчетов я записал в ОЗУ и что мне дальше с ними делать?

 

Уточните пожалуйста....куда мне двигаться с этими отсчетами?

 

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

 

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

_________FFT_2048.pdf

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


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

http://electronix.ru/forum/index.php?showtopic=58026

Реализация БПФ на ПЛИС, Тудности, встречаемые при реализации

 

з.ы.

может будет полезно

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


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

http://electronix.ru/forum/index.php?showtopic=58026

Реализация БПФ на ПЛИС, Тудности, встречаемые при реализации

 

з.ы.

может будет полезно

 

спасибо

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


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

to Dmitriyspb что мешает взять готовую корку и настроить ее под свои нужды (для начала просто поточное, где не нужно самому хранить отсчеты)?

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


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

to Dmitriyspb что мешает взять готовую корку и настроить ее под свои нужды (для начала просто поточное, где не нужно самому хранить отсчеты)?

 

Да, у Xilinx есть готовые корки и можно их взять и не париться.

Но я преследую учебные цели. Нужно разобраться пусть в самом простом БПФ.

 

В итоге цель реализовать анализатор спектра до 1 МГц. аппаратная платформа имеется. С дисплеем разберусь в конце. А сейчас нужно разобраться с БПФ.

Время позволяет реализовать это самостоятельно.

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


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

Советую почитать Р. Лайонса "Цифровая обработка сигналов", там много интересного найдете.

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


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

Советую почитать Р. Лайонса "Цифровая обработка сигналов", там много интересного найдете.
благодарю. пошел читать :smile3046:

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


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

Итак, я для себя составил ТХ к БПФ по основанию 2

 

1. Разрешение - 2,5 кГц

2. Число точек 2048

3. Частота дискретизации 5 МГц

4. Полоса для анализа 1 МГц

 

Читаю дальше....

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


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

Итак, я для себя составил ТХ

 

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

А потом уж на плисине делать.

 

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


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

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

А потом уж на плисине делать.

 

Спасибо

написать я уже решу на чем и когда. Я сейчас для себя пытаюсь нарисовать структуру. И понять алгоритм БПФ

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


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

Итак.

Стало яснее, но вопросы остаются.

Общий принцип понятен. Стал углубляться, а именно рассматривать алгоритм "бабочка" и не могу понять откуда мне взять коэффициенты? Как они считаются?

 

На картинке 1 показано как высчитывается каждая переменная. А на рисунке 2 показано когда и что подставлять в качестве коэффициента.

Где взять коэффициенты?

post-74498-1429537181_thumb.png

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


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

Вот отсюда, например. Коэффициенты Фурье считаются как exp(i*2*pi*k*n/N). N - размер Фурье, k - индекс по частоте 0...N-1, n - индекс по времени 0...N-1. Коэффициенты соответственно комплексные нормированные к 1 и вещественные. Нормируйте их к разрядной сетке, округлите и сохраните их в ROM с коэффициентами. Разные реализации Фурье в разном порядке читают эту память. Есть реализации где коэффициенты считаются налету (при очень большом N)

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


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

UPD. Перепутал с коэффициентами DFT общего вида, пардон :rolleyes: . Вот здесь хорошо расписано как считать поворотные коэффициенты для FFT. Фактически поворотные коэффициенты для FFT можно представить как вектор матрицы коэффициентов DFT соответствующий n=1. Таким образом для N точечного FFT потребуется N поворотных коэффициентов часть из которых тривиальная (1, -j), что упрощает алгоритм.

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


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

Я сейчас решаю похожую задачу, предлагаю объединить наши усилия =)

Набросал код в матлабе, для примера на 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 сошелся.

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

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


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

Вот отсюда, например. Коэффициенты Фурье считаются как 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 сошелся.

 

Хорошо. :biggrin: Напишите поподробнее пожалуйста как вы считаете коэффициенты? Wn = exp(-i*2*pi/n), n - размер фурье (число точек), i = [0 ..(n/2)-1] - номер коэффициента. А у Вас еще какой-то "k2" в формуле??????????

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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