Модераторы: Snowy, Alexeis, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Обратное преобразование Фурье (IFFT), Не корректно работает 
:(
    Опции темы
ershovser
Дата 9.11.2017, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 9.11.2017

Репутация: нет
Всего: нет



Доброго времени суток. Разбираюсь с FFT и IFFT. Уже какой день парюсь над обратным преобразованием Фурье. Добрые люди, может объясните в чем может быть проблема? 

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

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

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

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

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

Код

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;


Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  111.png 53,48 Kb
PM MAIL   Вверх
Google
  Дата 21.11.2017, 20:33 (ссылка)  





  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • По вопросам разработки игр стоит заглянуть сюда

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Girder, Snowy.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Звук, графика и видео | Следующая тема »


 




[ Время генерации скрипта: 0.1298 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.