Конференция "Media" » Быстрое преобразование Фурье 2D [D7, WinXP]
 
  • MathLamer (28.04.09 10:57) [0]
    Ув. мастера. Нужна реалицация FFT 2D на Паскале. Поделитесь пожалуйста, если у кого есть.
  • MBo © (28.04.09 15:19) [1]
    двумерное фурье нетрудно сделать из одномерного - фурье по строкам, потом по столбцам.
    для практических целей я использую библиотеку с fftw.org
  • MathLamer (28.04.09 16:46) [2]
    Спасибо за подсказку, в этой библиотеке уже реализовано 2D. Хотелось бы конечно исходник на Паскале. Если не найду то возьму fftw.
  • MathLamer (28.04.09 16:49) [3]
    Спасибо за подсказку, в этой библиотеке уже реализовано 2D. Хотелось бы конечно исходник на Паскале. Если не найду то возьму fftw.
  • Pavia © (29.04.09 01:38) [4]
    Вот мой.
    procedure FFT(M:TComplexMap; inv:Boolean); Overload;
    Var i,j:Integer;
    LL,LL1,NN,MM:Integer;
    N:TComplexMap;
    p1,p2:PComplex;
    begin
    If (M<>Nil) and (M.UnitFormat=uf1Unit) then
     begin
     if (M.Height and (M.Height-1)<>0) or (M.Height=0) then exit; // Если M.Height<> 2^x то выход
     if (M.Width and (M.Width-1)<>0) or (M.Width=0) then exit; // Если M.Width<> 2^x то выход
     // Вспомогательный
     N:=TComplexMap.Create(M.UnitFormat);
     N.Fast:=True;
     N.Width:=M.Height;
     N.Height:=M.Width;

     MM:=Log2Int(M.Width);
     NN:=Log2Int(M.Height);

     //Делаем Фурье построчно
     for j:=0 to M.Height-1 do
       FFT(MM,M.ScanLine[j],inv);

     // Транспонируем
     p1:=M.Map;
     p2:=N.Map;
     LL:=M.LineLen;
     LL1:=SizeOf(Complex)-M.Width*LL ;
     for j:=0 to M.Height-1 do
      begin
      p1:=M.ScanLine[j];
      for i:= 0 to M.Width-1 do
        begin
        p2^:=p1^;
        Inc(DWord(p1),SizeOf(Complex));
        Inc(DWord(p2),LL);
        end;
        inc(DWord(p2),LL1);
      end;

     //Делаем Фурье построчно
     for j:=0 to N.Height-1 do
       FFT(NN,N.ScanLine[j],inv);

     // Транспонируем
     p1:=N.Map;
     p2:=M.Map;
     LL:=N.LineLen;
     LL1:=SizeOf(Complex)-N.Width*LL ;
     for j:=0 to N.Height-1 do
      begin
      p1:=N.ScanLine[j];
      for i:= 0 to N.Width-1 do
        begin
        p2^:=p1^;
        Inc(DWord(p1),SizeOf(Complex));
        Inc(DWord(p2),LL);
        end;
        inc(DWord(p2),LL1);
      end;

     N.Free;
     end;
    end;



    Бери лучше FFTW у него скорость в 10 а то во все 30 раз больше чем просто если реализовывать в паскале.
  • MathLamer (29.04.09 03:11) [5]
    Ухтыж ка,  всем спасибо.
 
Конференция "Media" » Быстрое преобразование Фурье 2D [D7, WinXP]
Есть новые Нет новых   [134431   +10][b:0][p:0.002]