|
|
  |
обратное преобразование Фурье, почему так получается? |
|
|
|
Oct 5 2012, 08:29
|
Участник

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

|
Нашёл в сети исходник преобразования Фурье. Функция производит БПФ. Функция принимает на вход следующие аргументы: реальный массив, мнимый массив, длину преобразования и флаг, который если принимает "1" - производится ОБПФ, если "0" - прямое БПФ. Так вот, делаю прямое БПФ, вместо мнимой части подаю нули. Затем разделяю получившийся результат на четыре массива (как если бы делал БПФ двух вещественных сигналов за один проход комплексного) - получаю две реальные и две мнимые части спектра двух вещественных сигналов. Далее, произвожу ОБПФ той же функцией, выставив флаг ОБПФ. На вход подаю действительные и мнимые массивы первого спектра. На графиках ниже: сверху: исходный сигнал внизу: ОБПФ реальной части спектра этого сигнала. Почему получается как бы зеркальный сигнал?
Эскизы прикрепленных изображений
|
|
|
|
|
Oct 5 2012, 09:01
|
Участник

Группа: Участник
Сообщений: 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
|
|
|
|
|
Oct 5 2012, 10:32
|
Участник

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

|
а я сделал костыль
for (i=0; i<N; i++) { invres[i] = re1[N-i]; }
по сути переставил местами выборку и всё стало красиво
|
|
|
|
|
Oct 5 2012, 12:04
|
Местный
  
Группа: Свой
Сообщений: 366
Регистрация: 5-09-06
Из: Санкт-Петербург
Пользователь №: 20 107

|
Цитата(Д.К. @ Oct 5 2012, 14:32)  а я сделал костыль
for (i=0; i<N; i++) { invres[i] = re1[N-i]; }
по сути переставил местами выборку и всё стало красиво цикл до N/2 !
|
|
|
|
|
Oct 5 2012, 12:46
|

Гуру
     
Группа: Модератор 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? Ферштейн?
|
|
|
|
|
Oct 5 2012, 14:25
|
Участник

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

|
Всё исправил (вместо индекса N поставил (N-1))- результат тот же, но устраивает) интересно было почему на выходе ОБПФ получается сигнал в другом порядке, почему переворачивать приходится?
|
|
|
|
|
Oct 5 2012, 15:48
|
Знающий
   
Группа: Свой
Сообщений: 888
Регистрация: 25-09-08
Из: Питер
Пользователь №: 40 458

|
Практически во всех программах c FFT (и в большинстве CADов) есть серьезные ошибки со знаком. Но они видны только при использовании прямого и, затем, обратного преобразования, а это не так часто делают. Например в Origin эта ошибка (прямое и обратное FFT) живет уже насколько десятилетий, несмотря на то, что их FFT фильтры работают нормально. Советую внимательно почитать DigitalSignalProcessing,Smith. Хоть она и на аглицком, но там все очень подробно описано и приведены правильные куски программ (т.е. исходное и перегнанное туды-сюды совпадают с точностью до машинной арифметики). Правда там тоже многого не хватает, например определение частоты и фазы сигнала отсутствует, но это отдельная песня. Кстати где-то вроде видел и русский перевод, но не уверен.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|