Двухмерное преобразование Фурье
От: ktn-lamer  
Дата: 21.11.05 08:56
Оценка:
Подскажиет плс как сделать
Есть изображение представленное ввиде двухмерного массива X(i,j) надосделать двухмерное преобразование Фурье
данного массива, а затем сделать обратное. Но при обратном преобразовании надо востанавливать только ограниченное число гармоник, как это сделать?

Я нашел функцию в Инете, работает но я незнаю как ее доработать чтоб можно было ограничивать число гармоник при обратном преобразовании
procedure TMainForm.SquareFDFT(Re, Im: PReal; height, width: Word; Direct: ShortInt);
var
   i, j: Word;
   size: LongInt;
   HBufRe, HBufIm: THandle;
   pRe, pIm,
   BufRe, pBufRe, BufIm, pBufIm: PReal;
begin
   size := height*SizeOfReal + 1;
   {Выделяем память для столбцов}
   HBufRe := GlobalAlloc(GMEM_FIXED, size);
   HBufIm := GlobalAlloc(GMEM_FIXED, size);
   {Фиксируем память}
   BufRe := GlobalLock(HBufRe); BufIm := GlobalLock(HBufIm);

   {Преобразуем столбцы}
   for i := 1 to width do
   begin
      {Считываем столбец}
      pRe := Re; Inc(pRe, i - 1); pBufRe := BufRe;
      pIm := Im; Inc(pIm, i - 1); pBufIm := BufIm;
      for j := 1 to height do
      begin
         pBufRe^ := pRe^; Inc(pBufRe); Inc(pRe, width);
         pBufIm^ := pIm^; Inc(pBufIm); Inc(pIm, width);
      end;
      {Преобразуем столбец}
      LinearFDFT(BufRe, BufIm, height, Direct);
      {Записываем столбец}
      pRe := Re; Inc(pRe, i - 1); pBufRe := BufRe;
      pIm := Im; Inc(pIm, i - 1); pBufIm := BufIm;
      for j := 1 to height do
      begin
         pRe^ := pBufRe^; Inc(pRe, width); Inc(pBufRe);
         pIm^ := pBufIm^; Inc(pIm, width); Inc(pBufIm);
      end;
   end;
   {Расфиксируем память}
   GlobalUnlock(HBufRe); GlobalUnlock(HBufIm);
   {Освобождаем память для столбцов}
   GlobalFree(HBufRe); GlobalFree(HBufIm);

   size := width*SizeOfReal + 1;
   {Выделяем память для строк}
   HBufRe := GlobalAlloc(GMEM_FIXED, size);
   HBufIm := GlobalAlloc(GMEM_FIXED, size);
   {Фиксируем память}
   BufRe := GlobalLock(HBufRe); BufIm := GlobalLock(HBufIm);

   pRe := Re;
   pIm := Im;
   {Преобразуем строки}
   for j := 1 to height do
   begin
      pBufRe := BufRe; pBufIm := BufIm;
      {Считываем строку}
      for i := 1 to width do
      begin
         pBufRe^ := pRe^; Inc(pBufRe); Inc(pRe);
         pBufIm^ := pIm^; Inc(pBufIm); Inc(pIm);
      end;
      {Преобразуем строку}
      LinearFDFT(BufRe, BufIm, width, Direct);
      {Записываем строку}
      Dec(pRe, width); pBufRe := BufRe;
      Dec(pIm, width); pBufIm := BufIm;
      for i := 1 to width do
      begin
         pRe^ := pBufRe^; Inc(pRe); Inc(pBufRe);
         pIm^ := pBufIm^; Inc(pIm); Inc(pBufIm);
      end;
   end;
   {Расфиксируем память}
   GlobalUnlock(HBufRe); GlobalUnlock(HBufIm);
   {Освобождаем память для строк}
   GlobalFree(HBufRe); GlobalFree(HBufIm);
end;
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.