Полная версия этой страницы:
обратное преобразование Фурье
Нашёл в сети исходник преобразования Фурье.
Функция производит БПФ. Функция принимает на вход следующие аргументы:
реальный массив, мнимый массив, длину преобразования и флаг, который если принимает "1" - производится ОБПФ, если "0" - прямое БПФ.
Так вот, делаю прямое БПФ, вместо мнимой части подаю нули. Затем разделяю получившийся результат на четыре массива (как если бы делал БПФ двух вещественных сигналов за один проход комплексного) - получаю две реальные и две мнимые части спектра двух вещественных сигналов.
Далее, произвожу ОБПФ той же функцией, выставив флаг ОБПФ. На вход подаю действительные и мнимые массивы первого спектра.
На графиках ниже:
сверху: исходный сигнал
внизу: ОБПФ реальной части спектра этого сигнала.
Почему получается как бы зеркальный сигнал?
мне кажется, что при разделении потерялся знак мнимой части.
разделение выглядит так
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 - длина сигнала/преобразования
цикл до N/2 вроде как должен быть, а потом, если надо в обратную сторону, то добить или нулями до полной дины re,im1, а посkе ПФ выкинуть мнимую или добить сопряженным и после ПФ получится вещественный сигнал.
а я сделал костыль
for (i=0; i<N; i++)
{
invres[i] = re1[N-i];
}
по сути переставил местами выборку и всё стало красиво
Цитата(Д.К. @ Oct 5 2012, 14:32)

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

а я сделал костыль
for (i=0; i<N; i++)
{
invres[i] = re1[N-i];
}
по сути переставил местами выборку и всё стало красиво
цикл до N/2 !
Цитата(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))- результат тот же, но устраивает)
интересно было почему на выходе ОБПФ получается сигнал в другом порядке, почему переворачивать приходится?
Цитата(Д.К. @ Oct 5 2012, 18:25)

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

Советую внимательно почитать DigitalSignalProcessing,Smith. Хоть она и на аглицком, но там все очень подробно описано и приведены правильные куски программ (т.е. исходное и перегнанное туды-сюды совпадают с точностью до машинной арифметики). Правда там тоже многого не хватает, например определение частоты и фазы сигнала отсутствует, но это отдельная песня. Кстати где-то вроде видел и русский перевод, но не уверен.
на русском она тоже есть. В бумажном виде у меня
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.