powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Обратное преобразование Фурье (IFFT)
21 сообщений из 21, страница 1 из 1
Обратное преобразование Фурье (IFFT)
    #39550239
ershovser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток. Разбираюсь с FFT и IFFT. Уже какой день парюсь над обратным преобразованием Фурье. Добрые люди, может объясните в чем может быть проблема?

Звуковой сигнал 2 кГц, который имитирует программка справа, поступает на микрофон. Данные заносятся в массив и рисуется входной сигнал - верхняя диаграмма.

Этот массив с данными раскладываю в FFT, получаю массив fft и рисую диаграмму - второй график сверху. Проверял на разных частотах, все здесь правильно.

И наконец, я делаю обратное FFT, взяв массив fft. В итоге, 3-й график, вроде и частота сигнала та же, что и на входе, но почему-то блин амплитуда сигнала падает. И видно,что на стыке двух спектров (основного и зеркального) амплитуда минимальна.

Делал эксперимент, если в спектре четко только одна гармоника, то при IFFT все нормально, амплитуда сигнала равномерна по всей длине, как на входном графике.
Как только в спектре есть две гармоники и более, то сразу же график как на картинке. Как будто перемножение что ли где-то, или что может быть?

Буду благодарен знатокам!

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
procedure TFFTBase.InitMem(WindowSize: Integer);
begin
 fWindowSize:=WindowSize;
 tTlbSize:=(2*fWindowSize+1)*SizeOf(Single);
 fSinTbl:=AllocMem(tTlbSize);
 fCosTbl:=AllocMem(tTlbSize);
end;
 
procedure TFFTBase.InitSinCosTbl;
var i :integer;
begin
 for i :=1 to 2*fWindowSize do begin
  fSinTbl[i] := (-1)*Sin(PI/i);
  fCosTbl[i] := Cos(PI/i);
 end;
end;
 
 NV2 :=N shr 1;
 NM1 :=N-1;
 J   :=1;
 if Inverse then
  for i :=0 to N-1 do
   TComplexArray(F^)[i].Im :=-TComplexArray(F^)[i].Im;
 
 for I :=1 to NM1 do begin
  if I<J then begin
   T      :=TComplexArray(F^)[J-1];
   TComplexArray(F^)[J-1] :=TComplexArray(F^)[I-1];
   TComplexArray(F^)[I-1] :=T;
  end;
  K :=NV2;
  while K < J do begin
   J :=J - K;
   K :=K shr 1;
  end;
  J :=J + K;
 end;
 for L :=1 to M do begin
  LE   :=2 shl (L-1);
  LE1  :=LE shr 1;
  U.Re :=1.0; U.Im :=0.0;
  W.Re :=fCosTbl[LE1];
  W.Im :=fSinTbl[LE1];
  for J :=1 to LE1 do begin
   I :=J;
   while I <= N do begin
    IP :=I + LE1;
    T.Re    :=TComplexArray(F^)[IP-1].Re * U.Re - TComplexArray(F^)[IP-1].Im * U.Im;
    T.Im    :=TComplexArray(F^)[IP-1].Re * U.Im + TComplexArray(F^)[IP-1].Im * U.Re;
    TComplexArray(F^)[IP-1].Re :=TComplexArray(F^)[I-1].Re - T.Re;
    TComplexArray(F^)[IP-1].Im :=TComplexArray(F^)[I-1].Im - T.Im;
    TComplexArray(F^)[I-1].Re:=TComplexArray(F^)[I-1].Re+T.Re;
    TComplexArray(F^)[I-1].Im:=TComplexArray(F^)[I-1].Im+T.Im;
    Inc(I,LE);
   end;
   Uo :=U;
   U.Re :=(Uo.Re * W.Re) - (Uo.Im * W.Im);
   U.Im :=(Uo.Re * W.Im) + (Uo.Im * W.Re);
  end;
 end;
 
 ImDummy :=1/Sqrt(N);
 if Inverse then ImDummy :=-ImDummy;
 ReDummy :=Abs(ImDummy);
 for I :=1 to N do
  begin
   TComplexArray(F^)[i-1].Re :=TComplexArray(F^)[i-1].Re*ReDummy;
   TComplexArray(F^)[i-1].Im :=TComplexArray(F^)[i-1].Im*ImDummy;
  end;
 
 DelMem; 
end;

...
Рейтинг: 0 / 0
Обратное преобразование Фурье (IFFT)
    #39550247
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ershovserДобрые люди, может объясните в чем может быть проблема? (не глядя) На 2Pi забыл поделить.
Найди готовый код, чего мучатся.
...
Рейтинг: 0 / 0
Обратное преобразование Фурье (IFFT)
    #39550255
DesWind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ershovser,
Дык, все правильно
У тя на нижней диаграмме сумма двух частот 100Гц и 1кГц. На этом принципе постороена амплитудная модуляция.
...
Рейтинг: 0 / 0
Обратное преобразование Фурье (IFFT)
    #39550268
ershovser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DesWind,

Прошу прощения, шкалы графиков не отрегулированы. На втором графике показан спектр сигнала 2 кГц, а в правой части его зеркальная часть.
...
Рейтинг: 0 / 0
Обратное преобразование Фурье (IFFT)
    #39550269
ershovser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Соколинский Борис,

Да в том то и дело... готовый код.
...
Рейтинг: 0 / 0
Обратное преобразование Фурье (IFFT)
    #39550278
ershovser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сигнал 10 кГц. ...
...
Рейтинг: 0 / 0
Обратное преобразование Фурье (IFFT)
    #39550288
ershovser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сигнал 5 кГц.... Выделил только одну гармонику - самую мощную и после IFFT нормальный сигнал. Что за дела-то....?
...
Рейтинг: 0 / 0
Обратное преобразование Фурье (IFFT)
    #39550324
DesWind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ershovser,

http://www.pudn.com/Download/item/id/112315.html
Вот отсюда взял проверил, туда-обратно все работает корректно.
...
Рейтинг: 0 / 0
Обратное преобразование Фурье (IFFT)
    #39550345
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторСигнал 5 кГц.... Выделил только одну гармонику - самую мощную и после IFFT нормальный сигнал. Что за дела-то....?

Так а что ты хочешь? Ты вначале мешаешь две частоты (1 кГц + 100 Гц) и потом удивляешься, что на выходе получаешь смешанный график?
А потом пофитровал 5 кГц и нормально всё заработало?
Так именно так и должно всё работать. Или я что-то не так понял?
...
Рейтинг: 0 / 0
Обратное преобразование Фурье (IFFT)
    #39550371
DesWind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
makhaon,

Там получается модуляция - перемножение синусов, а не сумма.
...
Рейтинг: 0 / 0
Обратное преобразование Фурье (IFFT)
    #39550432
ershovser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
makhaon,

Смотрим 10 кГц.
Там после FFT в спектре не чисто 1 гармоника 10 кГц, а ввиду искажений появляются еще гармоники, они намного меньше по амплитуде, чем основная 10 кГц. (Т.е. на входе не чистая синусоида 10 кГц, микрофон вносит искажения). Выходит в спектре кроме основной самой большой есть и другие, совсем небольшие (3 шт на графике, правая половина второго графика - зеркальная часть левой половины). И при обратном Фурье, я по идее должен получить исходный сигнал, а получается корявый.

Если исключить эти небольшие гармонике в массиве, обнулив их, то после IFFT получаю чистую синусоиду 10 кГц. Т.е. все работает, если оставить только 1 гармонику. Не пойму где модуляция происходит.... Как просто сложить амплитуды синусоид?
...
Рейтинг: 0 / 0
Обратное преобразование Фурье (IFFT)
    #39550434
ershovser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DesWind,

Да, наверное.... Не пойму где только )
...
Рейтинг: 0 / 0
Обратное преобразование Фурье (IFFT)
    #39550437
DesWind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ershovser,

Оставь микрофон в покое. Загони туда тестовые данные Типа sin(x)+sin(2*x)
...
Рейтинг: 0 / 0
Обратное преобразование Фурье (IFFT)
    #39550451
ershovser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Причем не важно какая входная частота 1 кГц или 20 кГц, модулируется одинаково. Будто это одна и та же величина перемноженная с восстановленным сигналом.
...
Рейтинг: 0 / 0
Обратное преобразование Фурье (IFFT)
    #39550478
ershovser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DesWind,

Та же песня... Чистая синусоида разложенная в спектр, дает одну основную и рядом с ней две небольшие гармоники. Видимо это недостаток FFT, немного привносит своего.

После IFFT все та же картина.

Если эти две небольшие гармоники обнулить, оставить одну основную - все ОК.
...
Рейтинг: 0 / 0
Обратное преобразование Фурье (IFFT)
    #39550481
DesWind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ershovser,

Я выше дал ссылку, на исходники FFT, проверял - норм работает. Разве-что, открытые массивы при передаче параметров поправить на указатели.
...
Рейтинг: 0 / 0
Обратное преобразование Фурье (IFFT)
    #39550491
ershovser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DesWind,

Ладно, спасибо, видел, буду пробовать их тогда.
...
Рейтинг: 0 / 0
Обратное преобразование Фурье (IFFT)
    #39550572
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DesWindershovser,

http://www.pudn.com/Download/item/id/112315.html
Вот отсюда взял проверил, туда-обратно все работает корректно.
Вопрос только зачем кидать ссылку на китайцев с регистрацией, когда они бесплатно лежат на домашней странице без регистрации?
http://www.simdesign.nl/fft.html
...
Рейтинг: 0 / 0
Обратное преобразование Фурье (IFFT)
    #39550575
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ап, нет, поторопился, уже не лежат :(
...
Рейтинг: 0 / 0
Обратное преобразование Фурье (IFFT)
    #39550594
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
alekcvpАп, нет, поторопился, уже не лежат :(
оно тут лежит:
https://github.com/neurolabusc/MRIcron/blob/master/niftiview7/FFTs.pas
...
Рейтинг: 0 / 0
Обратное преобразование Фурье (IFFT)
    #39550599
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я так понимаю, что ошибки оцифровки (дискретизации) вылазят.
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Обратное преобразование Фурье (IFFT)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]