реклама на сайте
подробности

 
 
> Два действительных БПФ за один комплексный..., ... или один действительный двойной длины.
Task Solver
сообщение Jan 17 2014, 19:07
Сообщение #1





Группа: Участник
Сообщений: 14
Регистрация: 17-01-14
Пользователь №: 80 083



Есть функция делающая БПФ (FFT) для комплексного float входа (для длин степени двойки).

У меня есть два вопроса. Искал ответы в интернете, но не нашёл. Нашёл только те же упоминания возможности. Особенно интересует второй вопрос.

1) Как можно сделать за один её вызов два БПФ для действительного входа той же длины?
Знаю что один вход надо записать в действительную часть, а второй в мнимую. Но что делать после вызова? Как разделить результаты?
(Кое что было написано тут, но непонятно: http://electronix.ru/forum/index.php?showtopic=71731)

2) Как можно сделать за один её вызов один БПФ для действительного входа двойной длины?
Этот вопрос важнее, чем первый.

Если можно напишите формулы.

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


Сообщение отредактировал Task Solver - Jan 17 2014, 18:53
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Xenia
сообщение Jan 18 2014, 05:11
Сообщение #2


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Цитата(Task Solver @ Jan 17 2014, 23:07) *
1) Как можно сделать за один её вызов два БПФ для действительного входа той же длины?
Знаю что один вход надо записать в действительную часть, а второй в мнимую. Но что делать после вызова? Как разделить результаты?
(Кое что было написано тут, но непонятно: http://electronix.ru/forum/index.php?showtopic=71731)
2) Как можно сделать за один её вызов один БПФ для действительного входа двойной длины?
Этот вопрос важнее, чем первый.


FFT в своем алгоритмическом воплощении оставляет "мусор" из-за того, что в нем используются преобразования типа "бабочка". Поэтому в старшей части массива мы имеем второе крыло, зеркально отраженное от первого. Вот оно и сослужит нам добрую службу.

Рассмотрим самый примитивный пример (N=8), когда мы преобразуем комплексную функцию, разложенную на два массива:
double Re[8]; // это действительная часть исходной функции
double Im[8]; // это мнимая часть исходной функции
В том случае, когда преобразуется действительная функция, массив мнимых частей Im[] забит нулями. Но это не значит, что он не нужен, т.к. в нем мы получим амплитуды синусов.

После FFT-преобразования результат получится в той же паре массивов, а исходные значения испортятся. Получится вот что:
Re[0] - постоянная составляющая, Im[0] - обычно остается нулем.
Re[1] и Im[1] - амплитуды сos и sin 1-ой гармоники.
Re[2] и Im[2] - амплитуды сos и sin 2-ой гармоники.
Re[3] и Im[3] - амплитуды сos и sin 3-ей гармоники.
Re[4] - амплитуда сos 4-ой гармоники. Это частота Найквиста, т.к. более высокие таблично не представимы. Im[4] - равна нулю, т.к. у частоты Найквиста не может быть sin-составляющей.
Re[5] и Im[5] - мусор, копия Re[3] и -Im[3], соответственно.
Re[6] и Im[6] - мусор, копия Re[2] и -Im[2], соответственно.
Re[7] и Im[7] - мусор, копия Re[1] и -Im[1], соответственно.

Т.е. мусор обладает той особенностью, что амплитуда cos-гармоник отражается зеркально, сохраняя свою амплитуду. А амплитуды sin-гармоник при отражении изменяют свои знаки. Это происходит потому, что функция cos четная (симметричная относительно вертикальной оси), а функция sin нечетная (симметричная относительно точки).

Если у нас есть две действительные функции, то мы можем преобразовать их вдвоем сразу, за один прогон алгоритма FFT. Для этого надо первую действительную функцию запихнуть в Re[], как это и было раньше, а вторую записать в Im[], который раньше был обнулен.

После преобразования получим результат преобразования, соответствующий входной функции F1+i*F2 (множитель i из-за того, что F2 в мнимую часть была записана).
Однако, используя свойство зеркальности, можем выделить из суммы результаты, относящиеся в F1 и F2 по отдельности. Делается это так:

Re[0] – постоянная составляющая F1.
Im[0] – постоянная составляющая F2.

(Re[1]+Re[7])/2 - cos-амплитуда F1 для 1-ой гармоники, т.е. средняя арифметическая результата и зеркального мусора.
Почему так? А потому что cos-амплитуда F1 симметрична и от этой операции и останется прежней. Этой операцией она очистится от вклада sin-амплитуды F2, которая имеет противоположные по знаку амплитуды в Re[1] и Re[7].
(Re[1]-Re[7])/2 - sin-амплитуда F1 для 1-ой гармоники, тут уже симметричные косинусы взаимно уничтожились, а синусы остались живы.

Точно так же обрабатываем зеркальные пары:
(Re[2]+Re[6])/2 - cos-амплитуда F1 для 2-ой гармоники.
(Re[2]-Re[6])/2 - sin-амплитуда F1 для 2-ой гармоники.

(Re[3]+Re[5])/2 - cos-амплитуда F1 для 3-ой гармоники.
(Re[3]-Re[5])/2 - sin-амплитуда F1 для 4-ой гармоники.

Частоты Найквиста зеркального отражения не имеет, с ней проще:
Re[4] - cos-амплитуда F1 для частоты Найквиста.
Im[4] - cos-амплитуда F2 для частоты Найквиста.

В расчетах необходимо только уметь вычислять среднее арифметическое, и более никаких трудностей тут нет.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Task Solver   Два действительных БПФ за один комплексный...   Jan 17 2014, 19:07
- - thermit   Цитата(Task Solver @ Jan 17 2014, 22:07) ...   Jan 17 2014, 19:58
|- - Task Solver   Цитата(thermit @ Jan 17 2014, 23:58) Что ...   Jan 17 2014, 20:21
- - ViKo   В книжке Р. Лайонс "Цифровая обработка сигнал...   Jan 17 2014, 20:04
- - thermit   ЦитатаTask Solver: Это не на Си, и не математическ...   Jan 17 2014, 20:24
- - Task Solver   Спасибо. Буду разбираться, пока до конца всё равно...   Jan 17 2014, 20:36
- - V_G   До применения математики важно понять принцип. ДПФ...   Jan 18 2014, 00:43
- - Task Solver   Про зеркальный спектр от действительных данных я з...   Jan 18 2014, 07:32
|- - Xenia   Цитата(Task Solver @ Jan 18 2014, 11:32) ...   Jan 18 2014, 08:08
- - thermit   RE: Два действительных БПФ за один комплексный...   Jan 18 2014, 09:35
|- - Task Solver   Цитата(thermit @ Jan 18 2014, 13:35) А е...   Jan 20 2014, 21:26
||- - thermit   Цитата(Task Solver @ Jan 21 2014, 00:26) ...   Jan 21 2014, 13:01
|- - Task Solver   Цитата(thermit @ Jan 18 2014, 13:35) Всё...   Apr 6 2014, 05:28
- - Task Solver   Какие хорошие формулы. Теперь всё понятно.   Jan 18 2014, 12:27
- - ViKo   Странно, что люди изобрели БПФ, который делает вдв...   Jan 18 2014, 12:34
|- - V_G   Цитата(ViKo @ Jan 18 2014, 22:34) Странно...   Jan 20 2014, 02:11
- - Task Solver   Наверно с комплексными числами формулы были проще....   Jan 18 2014, 12:59
|- - utherVV   Numerical Recipes in C http://apps.nrbook.com/c/in...   Jan 20 2014, 01:49
- - Task Solver   Цитата(utherVV @ Jan 20 2014, 05:49) Nume...   Jan 20 2014, 09:06
|- - ViKo   Цитата(Task Solver @ Jan 20 2014, 12:06) ...   Jan 20 2014, 10:34
|- - V_G   Цитата(Task Solver @ Jan 20 2014, 19:06) ...   Jan 20 2014, 11:05
|- - Task Solver   Цитата(V_G @ Jan 20 2014, 15:05) Это стан...   Jan 20 2014, 12:30
- - thermit   ЦитатаTask Solver: Всё же почему в конце действите...   Apr 6 2014, 06:55
- - Task Solver   Цитата(thermit @ Apr 6 2014, 10:55) Не по...   Apr 6 2014, 11:46


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st August 2025 - 06:56
Рейтинг@Mail.ru


Страница сгенерированна за 0.01375 секунд с 7
ELECTRONIX ©2004-2016