Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: БПФ
Форум разработчиков электроники ELECTRONIX.ru > Цифровая обработка сигналов - ЦОС (DSP) > Алгоритмы ЦОС (DSP)
Страницы: 1, 2
Dmitriyspb
Приветствую Вас, уважаемые знатоки! biggrin.gif

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

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

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

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

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

P.S. Возможно подобный вопрос уже не раз поднимался....хотя я тут толком для себя полезного не нашел.
Lmx2315
http://electronix.ru/forum/index.php?showtopic=58026
Реализация БПФ на ПЛИС, Тудности, встречаемые при реализации

з.ы.
может будет полезно
Dmitriyspb
Цитата(Lmx2315 @ Apr 20 2015, 10:15) *
http://electronix.ru/forum/index.php?showtopic=58026
Реализация БПФ на ПЛИС, Тудности, встречаемые при реализации

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


спасибо
bogaev_roman
to Dmitriyspb что мешает взять готовую корку и настроить ее под свои нужды (для начала просто поточное, где не нужно самому хранить отсчеты)?
Dmitriyspb
Цитата(bogaev_roman @ Apr 20 2015, 10:34) *
to Dmitriyspb что мешает взять готовую корку и настроить ее под свои нужды (для начала просто поточное, где не нужно самому хранить отсчеты)?


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

В итоге цель реализовать анализатор спектра до 1 МГц. аппаратная платформа имеется. С дисплеем разберусь в конце. А сейчас нужно разобраться с БПФ.
Время позволяет реализовать это самостоятельно.
Skryppy
Советую почитать Р. Лайонса "Цифровая обработка сигналов", там много интересного найдете.
Dmitriyspb
Цитата(Skryppy @ Apr 20 2015, 12:06) *
Советую почитать Р. Лайонса "Цифровая обработка сигналов", там много интересного найдете.
благодарю. пошел читать smile3046.gif
Dmitriyspb
Итак, я для себя составил ТХ к БПФ по основанию 2

1. Разрешение - 2,5 кГц
2. Число точек 2048
3. Частота дискретизации 5 МГц
4. Полоса для анализа 1 МГц

Читаю дальше....
Dr.Alex
Цитата(Dmitriyspb @ Apr 20 2015, 13:38) *
Итак, я для себя составил ТХ


Сначала надо написать БПФ на том языке, который вы знаете лучше всего, скорее всего это С. И убедиться что работает.
А потом уж на плисине делать.
Dmitriyspb
Цитата(Dr.Alex @ Apr 20 2015, 13:51) *
Сначала надо написать БПФ на том языке, который вы знаете лучше всего, скорее всего это С. И убедиться что работает.
А потом уж на плисине делать.


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

На картинке 1 показано как высчитывается каждая переменная. А на рисунке 2 показано когда и что подставлять в качестве коэффициента.
Где взять коэффициенты?
serjj
Вот отсюда, например. Коэффициенты Фурье считаются как exp(i*2*pi*k*n/N). N - размер Фурье, k - индекс по частоте 0...N-1, n - индекс по времени 0...N-1. Коэффициенты соответственно комплексные нормированные к 1 и вещественные. Нормируйте их к разрядной сетке, округлите и сохраните их в ROM с коэффициентами. Разные реализации Фурье в разном порядке читают эту память. Есть реализации где коэффициенты считаются налету (при очень большом N)
serjj
UPD. Перепутал с коэффициентами DFT общего вида, пардон rolleyes.gif . Вот здесь хорошо расписано как считать поворотные коэффициенты для FFT. Фактически поворотные коэффициенты для FFT можно представить как вектор матрицы коэффициентов DFT соответствующий n=1. Таким образом для N точечного FFT потребуется N поворотных коэффициентов часть из которых тривиальная (1, -j), что упрощает алгоритм.
Kapsik
Я сейчас решаю похожую задачу, предлагаю объединить наши усилия =)
Набросал код в матлабе, для примера на 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 сошелся.
Dmitriyspb
Цитата(serjj @ Apr 20 2015, 16:55) *
Вот отсюда, например. Коэффициенты Фурье считаются как exp(i*2*pi*k*n/N). N - размер Фурье, k - индекс по частоте 0...N-1, n - индекс по времени 0...N-1. Коэффициенты соответственно комплексные нормированные к 1 и вещественные. Нормируйте их к разрядной сетке, округлите и сохраните их в ROM с коэффициентами. Разные реализации Фурье в разном порядке читают эту память. Есть реализации где коэффициенты считаются налету (при очень большом N)



А может для этого существует какая-то программка специализированная, которая умеет считать коэффициенты? Никто не знает?

Цитата(Kapsik @ Apr 21 2015, 09:25) *
Я сейчас решаю похожую задачу, предлагаю объединить наши усилия =)
Набросал код в матлабе, для примера на 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.gif Напишите поподробнее пожалуйста как вы считаете коэффициенты? Wn = exp(-i*2*pi/n), n - размер фурье (число точек), i = [0 ..(n/2)-1] - номер коэффициента. А у Вас еще какой-то "k2" в формуле??????????
serjj
Цитата
А может для этого существует какая-то программка специализированная, которая умеет считать коэффициенты? Никто не знает?

Matlab rolleyes.gif Считаем по формуле: w_sin(k) = imag(exp(-1i*2*pi*k/N)), w_cos(k) = real(exp(-1i*2*pi*k/N)), k=0...N-1
Kapsik
Цитата(Dmitriyspb @ Apr 21 2015, 10:43) *
Хорошо. biggrin.gif Напишите поподробнее пожалуйста как вы считаете коэффициенты? Wn = exp(-i*2*pi/n), n - размер фурье (число точек), i = [0 ..(n/2)-1] - номер коэффициента. А у Вас еще какой-то "k2" в формуле??????????

Вы в #11 привели картинку. Там есть поворачивающие множители W. Их коэффициенты 0,1,2,3. Они рассчитываются у меня как W2, коэффициенты 0,1,2,3 записаны в k2. Получается вектор коэффициентов W с картинки из #11.
Dmitriyspb
Цитата(serjj @ Apr 21 2015, 10:06) *
Matlab rolleyes.gif


Ах... простите=))) глупый вопрос

Цитата(Kapsik @ Apr 21 2015, 10:06) *
Вы в #11 привели картинку. Там есть поворачивающие множители W. Их коэффициенты 0,1,2,3. Они рассчитываются у меня как W2, коэффициенты 0,1,2,3 записаны в k2. Получается вектор коэффициентов W с картинки из #11.


Тогда вроде все укладывается. Даже понятно.
_________________________________________________
Тут другой вопросик. Если в бабочку грузить отсчеты по порядку 0,1,2,3... и.т.д. ны выходе получаем кашу. Для того, чтобы этой каши не было используют при загрузки бит-реверсивную перестановку отсчетов. Я правильно понял? Т.е. перемешиваем на входе и имеем по порядку на выходе ИЛИ имеем по порядку на входе, тогда перемешиваем на выходе, чтобы упорядочить?

to Kapsik
Я на verilog это все дело планирую транслировать.
Вы в matlab будете коэффициенты считать?
serjj
Цитата
Если в бабочку грузить отсчеты по порядку 0,1,2,3... и.т.д. ны выходе получаем кашу. Для того, чтобы этой каши не было используют при загрузки бит-реверсивную перестановку отсчетов. Я правильно понял? Т.е. перемешиваем на входе и имеем по порядку на выходе ИЛИ имеем по порядку на входе, тогда перемешиваем на выходе, чтобы упорядочить?


Ну да. Прореживание по времени / прореживание по частоте. На dsplib эти техники как раз и разобраны.
Dmitriyspb
Цитата(serjj @ Apr 21 2015, 10:37) *
Ну да. Прореживание по времени / прореживание по частоте. На dsplib эти техники как раз и разобраны.


Хорошо. Т.е.
1. Я складываю N (2048) отсчетов от АЦП в память.
2. После заполнения памяти начинаю вычитывать эти значения, НО вычитываю не по порядку а использую бит-реверсивный преобразователь адреса для памяти.

на этом этапе у меня есть корректные отсчеты в нужном порядке.

3. Теперь я прохожу необходимое кол-во ступеней преобразования отсчетов из временной области в частотную (БАБОЧКА)
3.1. Тут использую ROM с отсчетами Wk, которые использую при вычислениях.

4. Через постоянное времени моей цифровой системы начнут выскакивать отсчеты в правильном порядке.

5. Эти отсчеты уже можно перенести на плоскость с заданным шагом (Частота дискретизации/ число точек)?????
serjj
Цитата
5. Эти отсчеты уже можно перенести на плоскость с заданным шагом (Частота дискретизации/ число точек)?????

Если в вашем преобразовании есть восстановление порядка следования, то да. При этом смотрим например альтеровскую корку. Там есть опции прямого и обратного следования. В кастомизируемых корках еще может быть опция центрирования, когда 0 стоит не в начале выборки а в 1, что удобно в некоторых приложениях спектрального анализа.

Подумайте сразу еще и о скалирование результатов умножения. Чтобы потом не было сюрпризов. Это нужно делать на каждом этапе при целочисленной реализации. Очень важный и тонкий момент реализации. При этом FFT может выступать в качестве некоторого АРУ. Исходный масштаб можно восстановить, если вы будете накапливать информацию о скалировании с каждого шага.
Dmitriyspb
Цитата(serjj @ Apr 21 2015, 11:11) *
Если в вашем преобразовании есть восстановление порядка следования, то да.


Если я их загружаю в БАБОЧКУ в бит-реверсивном порядке, тогда у меня на выходе все должно быть упорядочено. Верно понимаю?

На счет скалирования (по просту говоря масштабирования) еще не думал. Ткните пожалуйста где почитать можно.
serjj
Цитата
Если я их загружаю в БАБОЧКУ в бит-реверсивном порядке, тогда у меня на выходе все должно быть упорядочено. Верно понимаю?

Это от алгоритма будет зависить. Можно сделать 1001 способом. Логичнее все манипуляции с перестановками делать отдельно а бабочку отдельно и кормить ее всегда данными, вычитываемыми по порядку. На dsplib объясняются 2 самых основных подхода к мультиплексированию, но наверное есть еще всякие частные решения, заточенные под конкретное железо.

Хы, какой я раритет нашёл, очень винтажно rolleyes.gif
Нажмите для просмотра прикрепленного файла
Хоть самому читай. Ну а вообще поиск по scaling during fft stages можно смотреть.
Dmitriyspb
А что по этому поводу думает уважаемый Kapsik? Как он все это дело планирует в verilog описывать. Можно функционально рассказать

Цитата(serjj @ Apr 21 2015, 11:37) *
Это от алгоритма будет зависить. Можно сделать 1001 способом. Логичнее все манипуляции с перестановками делать отдельно а бабочку отдельно и кормить ее всегда данными, вычитываемыми по порядку. На dsplib объясняются 2 самых основных подхода к мультиплексированию, но наверное есть еще всякие частные решения, заточенные под конкретное железо.

Хы, какой я раритет нашёл, очень винтажно rolleyes.gif
Нажмите для просмотра прикрепленного файла
Хоть самому читай. Ну а вообще поиск по scaling during fft stages можно смотреть.


спасибо
Kapsik
Цитата(Dmitriyspb @ Apr 21 2015, 12:50) *
А что по этому поводу думает уважаемый Kapsik?

Хех, уважаемый, приятно, но боюсь пока не заслуженно ;-)

Набросал вот такую блочную схему. Коротенько описание. ser2par сдвиговый регистр, в нем копятся 16 отсчетов. Lat_data защелкивает эти отсчеты одновременно совершая перестановку. Далее идет мультиплексор который коммутирует отсчеты по нужным бабочкам, на выходе бабочек умножение и все по новой. Интересно, что скажут остальные по поводу такой реализации

.Нажмите для просмотра прикрепленного файла
Dmitriyspb
Цитата(Kapsik @ Apr 21 2015, 12:13) *
Интересно, что скажут остальные по поводу такой реализации

Остальные пока молчат.
Вот моя версия. Думаю что-то очень похожее.

А дальше что вы планируете с этими отсчетами делать?
Kapsik
Цитата(Dmitriyspb @ Apr 21 2015, 14:02) *
Остальные пока молчат.
Вот моя версия. Думаю что-то очень похожее.

А дальше что вы планируете с этими отсчетами делать?

Вообще я делаю эквалайзер. Так что буду выводить на VGA моник.
Dmitriyspb
Цитата(Kapsik @ Apr 21 2015, 13:43) *
Вообще я делаю эквалайзер. Так что буду выводить на VGA моник.


вы в Matlab коэффициенты считать для ROM будите? или уже посчитали?
Kapsik
Цитата(Dmitriyspb @ Apr 21 2015, 14:49) *
вы в Matlab коэффициенты считать для ROM будите? или уже посчитали?

Да, в матлабе посчитаю и в mif засуну.
Dmitriyspb
Товарищи, правильно ли я считаю коэффициент для своей бабочки????????????????????????????????
В коде приведено k=2, N=2048;
Код
>> k=2;
>> N=2048;
>> W2=exp(-j*2*pi*k/N)

W2 =

   1.0000 - 0.0061i

>> W2= 1-0.0061

W2 =

    0.9939

>> % Преобразовываю в 16-ти разрядную
>> % целочисленную форму (1бит-знаковый + 15бит мантисса)
>>  L = (2^15)-1

L =

       32767

>> F = W2*L

F =

  3.2567e+004

>> round (F)

ans =

       32567;
serjj
Код
>> W2= 1-0.0061

W2 =

    0.9939

Воу воу, это что? Коэффициент комплексный и умножение должно быть комплексным, а вы зачем-то из Re Im вычитаете.
Dmitriyspb
Цитата(serjj @ Apr 22 2015, 14:24) *
Код
>> W2= 1-0.0061

W2 =

    0.9939

Воу воу, это что? Коэффициент комплексный и умножение должно быть комплексным, а вы зачем-то из Re Im вычитаете.


Вот тут, та я и больше всего не понимаю. smile3046.gif smile3046.gif smile3046.gif

Как мне комплексное число перевести в целочисленную форму????
serjj
Цитата
Как мне комплексное число перевести в целочисленную форму????

комплексное число с точки зрения обработки это 2 числа: real(a) и imag(a). Переводите их отдельно. А все рассчёты нужно привести к форме re(a_new) = f_re(re(a_old), im(a_old)), im(a_new) = f_im(re(a_old), im(a_old)), благо все основные комплексные операции, с которыми программисту приходится иметь дело, допускают такую форму записи.
Dmitriyspb
Цитата(serjj @ Apr 22 2015, 14:55) *
комплексное число с точки зрения обработки это 2 числа: real(a) и imag(a). Переводите их отдельно. А все расчёты нужно привести к форме re(a_new) = f_re(re(a_old), im(a_old)), im(a_new) = f_im(re(a_old), im(a_old)), благо все основные комплексные операции, с которыми программисту приходится иметь дело, допускают такую форму записи.


перевел, а вот как потом на них умножать отсчеты? Отсчеты имеют целочисленную форму laughing.gif
Xenia
Считали бы, как нормальные люди sm.gif, через синус и косинус. А эти комплексные экспоненты - в мусор! sm.gif Нечего человеку мозги засорять.
serjj
Цитата
Считали бы, как нормальные люди sm.gif, через синус и косинус. А эти комплексные экспоненты - в мусор! sm.gif Нечего человеку мозги засорять.

Ну без понимание формулы Эйлера нельзя браться за Фурье rolleyes.gif

Цитата
перевел, а вот как потом на них умножать отсчеты? Отсчеты имеют целочисленную форму

(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)

Цитата
можно, но функции синуса и косинуса реализовываются в ПЛИС довольно проблематично (требуется использование Cordic)

Имеется в виду табличные синус/косинус, которые потом также и умножаются на входные отчёты, но только это тоже самое получается что и комплексная экспонента, только понимания меньше. А вообще таки да слышал про Фурье на кордиках, но сам не видел rolleyes.gif
Dmitriyspb
Цитата(Xenia @ Apr 22 2015, 15:10) *
Считали бы, как нормальные люди sm.gif, через синус и косинус. А эти комплексные экспоненты - в мусор! sm.gif Нечего человеку мозги засорять.


Да уж, я вот и буксую. biggrin.gif

Вот как сделать из вещественных входных отсчетов АЦП отсчеты I и Q я догадываюсь (I и Q - это вроде как и есть комплексное представление сигнала). Попросту говоря синус и косинус. И дальше для них будет две независимые ветки БПФ и коэффициенты БПФ (Wn) у каждого будут тоже свои. Верно понимаю?
Т.О. из комплексного выражения W1=x1+y1i
x - это мои коэффициент W1 для косинуса
y - это мои коэффициент W1 для синуса
serjj
Цитата
Вот как сделать из вещественных входных отсчетов АЦП отсчеты I и Q я догадываюсь (I и Q - это вроде как и есть комплексное представление сигнала). Попросту говоря синус и косинус. И дальше для них будет две независимые ветки БПФ и коэффициенты БПФ (Wn) у каждого будут тоже свои. Верно понимаю?
Т.О. из комплексного выражения W1=x1+y1i
x - это мои коэффициент W1 для косинуса
y - это мои коэффициент W1 для синуса

Неверно. Мнимая часть вносит вклад в рассчёт выходной действительной и наоборот. См. комплексное умножение.
Dmitriyspb
Цитата(serjj @ Apr 22 2015, 15: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)


Тут a_re - косинус, a_im - синус для входных отсчетов.
Аналогично для коэффициентов.
Вроде бы понял.

Вот только получается две ветки БПФ? для синуса и косинуса?
serjj
Цитата
Тут a_re - косинус, a_im - синус для входных отсчетов.
Аналогично для коэффициентов.
Вроде бы понял.

Вот только получается две ветки БПФ? для синуса и косинуса?


a_re - действительная часть, a_im - мнимая. Преобразование Фурье определено для множества комплексных чисел, его нельзя вот так взять и сделать отдельно для действительной и мнимой частей. Если вы подадите в Фурье действительный сигнал (мнимая часть = 0), то на выходе вы будете иметь комплексный сигнал (мнимая часть != 0). Косинус и синус хорошие примеры для комплексной синусоиды exp(1i*2*pi*f*t), но ими не исчерпываются все комплексные числа rolleyes.gif
Dmitriyspb
Цитата(serjj @ Apr 22 2015, 15:49) *
a_re - действительная часть, a_im - мнимая. Преобразование Фурье определено для множества комплексных чисел, его нельзя вот так взять и сделать отдельно для действительной и мнимой частей. Если вы подадите в Фурье действительный сигнал (мнимая часть = 0), то на выходе вы будете иметь комплексный сигнал (мнимая часть != 0). Косинус и синус хорошие примеры для комплексной синусоиды exp(1i*2*pi*f*t), но ими не исчерпываются все комплексные числа rolleyes.gif


Я запутался. smile3009.gif
Я понял, что коэффициенты я имею в комплексной форме,значит, отсчеты у меня должны быть тоже в комплексной форме. Так или снова не туда?

Но если я беру входные отсчеты в вещественной форме и сую в БПФ, тогда мне нужно брать только действительную часть от комплексной формы коэффициентов?

Меня больше всего смущает комплексное представление коэффициентов (Wn) БПФ, а отсчеты вещественные.
В итоге мне нужно сделать коэффициенты как отсчеты или отсчеты как коэффициенты?????
или можно и так и так???
Swup
Вещественные числа - подмножество комплексных числе.
Ваше вещественное число А на самом деле комплексное число А+j*0. Т.е. вещественное число это такое комплексное число у которого нулевая мнимая часть. Как вам верно заметили выше преобразование фурье -комплексная операция.

И вот вы уже умножаете два комплексных числа между собой, нет никаких в этом проблем. Только надо учитывать что амплитудный спектр будет иметь информативно только положительную часть, отрицательная будет зеркальным отражением положительной.

Можно еще представить ваш сигнал в виде аналитического ( гуглите преобразование Гилберта), считать его комплексным и делать уже бпф от него. В таком случае отрицательная часть спектра будет нулевой.

ПС Извините конечно, но лично мое мнение: выражение в виде комплексных сигналов гораздо интуитивнее и проще чем в виде косинусных и синусных составляющих. В частности если заниматься обработкой радиолокационных сигналов))
Прям здесь можно заметить как представление чисел виде косинусов и синусов путает человека)) В любом случае одно с другой настолько тесно связано, что не вызывает трудностей. Формула Эйлера все дела.
Xenia
Цитата(Dmitriyspb @ Apr 22 2015, 16:06) *
Меня больше всего смущает комплексное представление коэффициентов (Wn) БПФ, а отсчеты вещественные.
В итоге мне нужно сделать коэффициенты как отсчеты или отсчеты как коэффициенты?????


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


Ага, понял. Спасибо огромное.

Нашел такую инфу и стараюсь её приложить к своей практической плоскости (см. картинки).
Нажмите для просмотра прикрепленного файла

Основываясь на этом родил такую структуру (см. картинки)

Нажмите для просмотра прикрепленного файла
Верно я понял или же нет?
serjj
Цитата
Основываясь на этом родил такую структуру (см. картинки)

Как вы не хотите понять, что БПФ делается не отдельно для Re и Im каналов с Re и Im коэффициентами, а для комплексного сигнала с комлпексными коэффициентами и имеет комплексный выход. Если вы хотите дальше выход Фурье использовать для спектрального анализа, то вы можете перейти к abs(out), напряжение, или (abs(out))^2, мощность, out - комплексный.
Dmitriyspb
Цитата(serjj @ Apr 23 2015, 09:27) *
Как вы не хотите понять, что БПФ делается не отдельно для Re и Im каналов с Re и Im коэффициентами, а для комплексного сигнала с комлпексными коэффициентами и имеет комплексный выход. Если вы хотите дальше выход Фурье использовать для спектрального анализа, то вы можете перейти к abs(out), напряжение, или (abs(out))^2, мощность, out - комплексный.


Вы скажите пожалуйста как Вы представляете себе в железе комплексный сигнал
Во эта операция требует отдельное перемножение вещественной и мнимой частей между коэффициентами и отсчетами.
Нажмите для просмотра прикрепленного файла

Цитата(Kapsik @ Apr 23 2015, 08:32) *
Мне показалось, что рисовать бабочки текстом это перебор, так что прикрепляю картинку. Реальная и мнимая части отдельно, я вижу так =)
Нажмите для просмотра прикрепленного файла


Тут тоже говорят об отдельном. Где подвох?
Kapsik
Цитата(Dmitriyspb @ Apr 23 2015, 11:37) *
Вы скажите пожалуйста как Вы представляете себе в железе комплексный сигнал
Во эта операция требует отдельное перемножение вещественной и мнимой частей между коэффициентами и отсчетами.
Нажмите для просмотра прикрепленного файла



Тут тоже говорят об отдельном. Где подвох?


Дык я же и расписал по отдельности. Re и Im. Видно что результат совпал, с "прямым" расчетом...
Dmitriyspb
Цитата(Kapsik @ Apr 23 2015, 10:39) *
Дык я же и расписал по отдельности. Re и Im. Видно что результат совпал, с "прямым" расчетом...


ТОВАРИЩИ, мне кажется, что я понял=))))) 1111493779.gif 1111493779.gif smile3046.gif smile3046.gif smile3046.gif
Нажмите для просмотра прикрепленного файла

Цитата(serjj @ Apr 23 2015, 09:27) *
то вы можете перейти к abs(out), напряжение, или (abs(out))^2, мощность, out - комплексный.


Поясните пожалуйста
serjj
Цитата
Вы скажите пожалуйста как Вы представляете себе в железе комплексный сигнал

Это два логических сигнала, которые представляют собой один физический сигнал но не нужно путать это с двумя действительными каналами, т.к. в случае с каналами каждый сигнал обрабатывается независимо (ну или до какого то этапа обработки независимо, в любом случае каждый канал это отдельный физический сигнал). В случае же с комплексным числом логические сигналы Re и Im обрабатываются по правилами комплексной арифметики. Соответственно БПФ для них одно, как вы и нарисовали.
Цитата
ТОВАРИЩИ, мне кажется, что я понял=)))))
...
Поясните пожалуйста

Вы определенно на пути к истине. Осталось подумать что же неверно в "Участок 4" yeah.gif
После Фурье вы получили комлексный частотный образ входного комплексного сигнала. Если вы возьмёте модуль комплексного числа, то получите АЧХ, если аргумент - то ФЧХ, если квадрат модуля, то спектральную плотность мощности.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.