Подскажиет плс как сделать
Есть изображение представленное ввиде двухмерного массива 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;