Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: обратное преобразование Фурье
Форум разработчиков электроники ELECTRONIX.ru > Цифровая обработка сигналов - ЦОС (DSP) > Алгоритмы ЦОС (DSP)
Д.К.
Нашёл в сети исходник преобразования Фурье.
Функция производит БПФ. Функция принимает на вход следующие аргументы:

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

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

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

Почему получается как бы зеркальный сигнал?
diwil
мне кажется, что при разделении потерялся знак мнимой части.
Д.К.
разделение выглядит так

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 - длина сигнала/преобразования
diwil
цикл до N/2 вроде как должен быть, а потом, если надо в обратную сторону, то добить или нулями до полной дины re,im1, а посkе ПФ выкинуть мнимую или добить сопряженным и после ПФ получится вещественный сигнал.
Д.К.
а я сделал костыль

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

по сути переставил местами выборку и всё стало красиво
Xenia
Цитата(Д.К. @ Oct 5 2012, 14:32) *
а я сделал костыль

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

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


Может оно и красиво, но если вы считаете элементы с нуля (на что намекает i=0), но выбирать из массива элемент [N] нельзя, ибо последний в нем [N-1]. А у вас выбирается N-ый элемент на первом обороте цикла, когда i=0. Скорее всего ваши проблемы оттого, что вы запутались в индексах.
diwil
Цитата(Д.К. @ Oct 5 2012, 14:32) *
а я сделал костыль

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

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


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


Не имеет значения, ДО какого числа вы цикл крутите, если у вас "зашкал" на первом же обороте цикла! Крутите его хоть до единицы, результат будет столь же плачевный.
Входим в цикл, подставляем "i=0" в "invres[i] = re1[N-i]" :
получаем:
invres[0] = re1[N];
А где, спрашивается, re1[N], если в массиве последний элемент за номером N-1?
Ферштейн?
Д.К.
Всё исправил (вместо индекса N поставил (N-1))- результат тот же, но устраивает)
интересно было почему на выходе ОБПФ получается сигнал в другом порядке, почему переворачивать приходится?
Xenia
Цитата(Д.К. @ Oct 5 2012, 18:25) *
интересно было почему на выходе ОБПФ получается сигнал в другом порядке, почему переворачивать приходится?


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

на русском она тоже есть. В бумажном виде у меня
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.