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

 
 
 
Reply to this topicStart new topic
> обратное преобразование Фурье, почему так получается?
Д.К.
сообщение Oct 5 2012, 08:29
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 29
Регистрация: 23-08-12
Пользователь №: 73 232



Нашёл в сети исходник преобразования Фурье.
Функция производит БПФ. Функция принимает на вход следующие аргументы:

реальный массив, мнимый массив, длину преобразования и флаг, который если принимает "1" - производится ОБПФ, если "0" - прямое БПФ.

Так вот, делаю прямое БПФ, вместо мнимой части подаю нули. Затем разделяю получившийся результат на четыре массива (как если бы делал БПФ двух вещественных сигналов за один проход комплексного) - получаю две реальные и две мнимые части спектра двух вещественных сигналов.
Далее, произвожу ОБПФ той же функцией, выставив флаг ОБПФ. На вход подаю действительные и мнимые массивы первого спектра.
На графиках ниже:

сверху: исходный сигнал
внизу: ОБПФ реальной части спектра этого сигнала.

Почему получается как бы зеркальный сигнал?
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
diwil
сообщение Oct 5 2012, 08:57
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 366
Регистрация: 5-09-06
Из: Санкт-Петербург
Пользователь №: 20 107



мне кажется, что при разделении потерялся знак мнимой части.
Go to the top of the page
 
+Quote Post
Д.К.
сообщение Oct 5 2012, 09:01
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 29
Регистрация: 23-08-12
Пользователь №: 73 232



разделение выглядит так

for(i=1; i<N; i++)
{
re1[i] = (xr[i]+xr[N -i])/2;
img1[i] = (xi[N -i]-xi[i])/2;
re2[i] = (xi[i]+xi[N -i])/2;
img2[i] = (xr[i]-xr[N -i])/2;
}

где xr - массив реальной части, после преобразования, xi - массив мнимой части,
N - длина сигнала/преобразования

Сообщение отредактировал Д.К. - Oct 5 2012, 09:02
Go to the top of the page
 
+Quote Post
diwil
сообщение Oct 5 2012, 09:08
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 366
Регистрация: 5-09-06
Из: Санкт-Петербург
Пользователь №: 20 107



цикл до N/2 вроде как должен быть, а потом, если надо в обратную сторону, то добить или нулями до полной дины re,im1, а посkе ПФ выкинуть мнимую или добить сопряженным и после ПФ получится вещественный сигнал.
Go to the top of the page
 
+Quote Post
Д.К.
сообщение Oct 5 2012, 10:32
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 29
Регистрация: 23-08-12
Пользователь №: 73 232



а я сделал костыль

for (i=0; i<N; i++)
{
invres[i] = re1[N-i];
}

по сути переставил местами выборку и всё стало красиво
Go to the top of the page
 
+Quote Post
Xenia
сообщение Oct 5 2012, 10:49
Сообщение #6


Гуру
******

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



Цитата(Д.К. @ Oct 5 2012, 14:32) *
а я сделал костыль

for (i=0; i<N; i++)
{
invres[i] = re1[N-i];
}

по сути переставил местами выборку и всё стало красиво


Может оно и красиво, но если вы считаете элементы с нуля (на что намекает i=0), но выбирать из массива элемент [N] нельзя, ибо последний в нем [N-1]. А у вас выбирается N-ый элемент на первом обороте цикла, когда i=0. Скорее всего ваши проблемы оттого, что вы запутались в индексах.
Go to the top of the page
 
+Quote Post
diwil
сообщение Oct 5 2012, 12:04
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 366
Регистрация: 5-09-06
Из: Санкт-Петербург
Пользователь №: 20 107



Цитата(Д.К. @ Oct 5 2012, 14:32) *
а я сделал костыль

for (i=0; i<N; i++)
{
invres[i] = re1[N-i];
}

по сути переставил местами выборку и всё стало красиво


цикл до N/2 !
Go to the top of the page
 
+Quote Post
Xenia
сообщение Oct 5 2012, 12:46
Сообщение #8


Гуру
******

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



Цитата(diwil @ Oct 5 2012, 16:04) *
цикл до N/2 !


Не имеет значения, ДО какого числа вы цикл крутите, если у вас "зашкал" на первом же обороте цикла! Крутите его хоть до единицы, результат будет столь же плачевный.
Входим в цикл, подставляем "i=0" в "invres[i] = re1[N-i]" :
получаем:
invres[0] = re1[N];
А где, спрашивается, re1[N], если в массиве последний элемент за номером N-1?
Ферштейн?
Go to the top of the page
 
+Quote Post
Д.К.
сообщение Oct 5 2012, 14:25
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 29
Регистрация: 23-08-12
Пользователь №: 73 232



Всё исправил (вместо индекса N поставил (N-1))- результат тот же, но устраивает)
интересно было почему на выходе ОБПФ получается сигнал в другом порядке, почему переворачивать приходится?
Go to the top of the page
 
+Quote Post
Xenia
сообщение Oct 5 2012, 14:32
Сообщение #10


Гуру
******

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



Цитата(Д.К. @ Oct 5 2012, 18:25) *
интересно было почему на выходе ОБПФ получается сигнал в другом порядке, почему переворачивать приходится?


А вы поделитесь исходничком Фурье (и ему обратного), который нашли в интернете. А то ведь даже Фурье и тот пишут, кто во что горазд.
Go to the top of the page
 
+Quote Post
rudy_b
сообщение Oct 5 2012, 15:48
Сообщение #11


Знающий
****

Группа: Свой
Сообщений: 888
Регистрация: 25-09-08
Из: Питер
Пользователь №: 40 458



Практически во всех программах c FFT (и в большинстве CADов) есть серьезные ошибки со знаком. Но они видны только при использовании прямого и, затем, обратного преобразования, а это не так часто делают. Например в Origin эта ошибка (прямое и обратное FFT) живет уже насколько десятилетий, несмотря на то, что их FFT фильтры работают нормально.
Советую внимательно почитать DigitalSignalProcessing,Smith. Хоть она и на аглицком, но там все очень подробно описано и приведены правильные куски программ (т.е. исходное и перегнанное туды-сюды совпадают с точностью до машинной арифметики). Правда там тоже многого не хватает, например определение частоты и фазы сигнала отсутствует, но это отдельная песня. Кстати где-то вроде видел и русский перевод, но не уверен.
Go to the top of the page
 
+Quote Post
TigerSHARC
сообщение Nov 1 2012, 05:44
Сообщение #12


Знающий
****

Группа: Свой
Сообщений: 688
Регистрация: 4-09-09
Пользователь №: 52 195



Цитата(rudy_b @ Oct 5 2012, 19:48) *
Советую внимательно почитать DigitalSignalProcessing,Smith. Хоть она и на аглицком, но там все очень подробно описано и приведены правильные куски программ (т.е. исходное и перегнанное туды-сюды совпадают с точностью до машинной арифметики). Правда там тоже многого не хватает, например определение частоты и фазы сигнала отсутствует, но это отдельная песня. Кстати где-то вроде видел и русский перевод, но не уверен.

на русском она тоже есть. В бумажном виде у меня
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 1st July 2025 - 07:50
Рейтинг@Mail.ru


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