Matlab의 함수 ft함수는 1차원 DFT, fft2함수는 2차원 DFT를 고속으로 행하는 함수로,
사용법이라고는 하지만 다양한 구도로 사용하고 저작권 문제로 마스웍스가 만든 코드를 공개하고,
없어 완벽한 사용법을 모르는 여러 시행착오를 기록하고자 글을 남깁니다.
이 글은 fft 또는 고속 푸리에 변환을 다루는 글이 아님을 명시합니다.
이 포스팅은 둥근 원의 이미지를 만들고 푸리에 변환하는 동안 경험한 내용을 기록한 문장으로,
matlab의 함수 fft를 사용하다가 남은 시행착오를 기록한 글입니다.
함수 적용문제의 내용은 본 교재 Matlab을 이용한 디지털 영상처리의 기초

p185의 내용으로 1과 0으로 2차원 배열을 만들고 검정과 흰색으로 둥근 원을 만드는 내용입니다.
이미지를 디스플레이하려면 기본적인 1차원 DFT에서 2차원 DFT(행과열)를 해야 합니다.
2차원 DFT의 성질은 전공서적에서 배운 1차원 DFT의 성질을 그대로 가지고 있다고 봐도 됩니다.
전공서적에서는 1차원 DFT를 수행하였으므로 2차원 데이터의 화소 또는 이미지를 다루기 위해
2차원으로 넘어가면 1차원 DFT와 구분되는 식은 다음과 같습니다.

p173 피적분 대상(피적분함수) f(x)는 기본적으로 이변수 함수가 되며, 이는 공업수학에서도 배웠다.
이 변수 함수 z=sin(ax+by)에서 공업 수학의 내용을 잘 알면 알고리즘의 변형에 어느 정도 도움이 되지 않을까 생각했다.
C. 그래도 이 변수함수를 매트랩으로 구현하기도 어려웠기 때문에 얼마나 도움이 될지는 모르겠지만
2차원 DFT식에서 Exponential 이하의 지수는 고정값에서 필터 Mask와 같은 역할을 하게 된다.
이 같은 2차원 DFT 변환 내용을 보기 위해 원소를 직접 확인하는 것은 어려운 것으로 알려졌다.
2차원 DFT 변환의 결과인 F(u,v)의 원소는 복소수이기 때문에 확인이 어렵다고 하는데,
여기서 복수함수의 개념도 조금 들어갈 것 같다.
어쨌든확인하는방법은두가지인데요.
1.F(u,v)의 원소 중 최대치를 구하고(최대치는 DC 성분이다) 이 값으로 모든 성분으로 나눈다.
그리고 imshow 함수를 취한다.
2. mat 2 gray 함수를 사용한다. mat2 gray 함수는 5장에서 설명했다.
그런데 mat2 gray처럼 자동으로 나누도록 하면 일반적으로 DC 성분이 AC 성분에 비해 너무 크다.
따라서 흑에 가까운 0의 값으로 셋팅될 수 있으므로 mat2 gray 함수보다는 아래의 스트레치 함수를
제안한다.

p179
DFT에 대한 이론적인 설명이 끝났다면
먼저, 간단한 1과 0으로 이루어진 흑백의 화상을 만들어 봅시다.

p182가 제안하는 기본함수 fftshift는 최대 Amplitude 값인 DC 성분을 행렬의 한가운데로 옮깁니다.
fft2 함수는 열끼리 덧셈을 하고 행끼리 덧셈을 해서 DC 성분과 AC 성분을 추출하는 함수인데,
매트랩 저작권으로 코드는 공개되지 않습니다. 자세한 동작원리는 맨 아래에 적혀있으니 참고해 주세요.
어쨌든 공개된 코드대로 실행하면 아래 가운데에만 흰색 도트(255에 가까운 값)가 보이고 나머지는 검은색(0)입니다.

여기서 몇 줄 추가해서 가운데에 흰색 점선을 추가하면

상기 결과, 사진을 확대하면 다음과 같다. 자세히 보면 백점의 분포가 좀 다르다.

왼쪽 사진은 log(1+abs(af))에 넣어 새로운 행렬 af1을 만든 후 이를 imshow로 출력한 것이다.
af1의 행렬은 다음과 같다.

중앙 행렬만을 제외하고 나머지는 0의 값을 갖게 되는데, 이는 중앙 행렬에 때때로 AC 성분이 보이기 때문이다.

자세한 내용은 fftshift와 fft2의 사용법을 알면 좋겠지만, 두 함수의 사용법은 이하에 기술되어 있다.
이어서 수행한 코드를 조금 수정하여 log(1+abs(af)) 함수와 fftshow의 log 스케일의 차이를 확인했다.

먼저 imshow(af1/af1(129,129)의 결과,

그 다음 fftshow(aftshow,log)

다음으로 fft show(aft show, ‘abs’)는 로그 스케일에서 단위를 환산하지 않고 절대치의 크기를 나타낸다.

마지막으로 mat2gray를 활용한 자동 스케일 조정 디스플레이 방법을 소개했으니 이 효과도 확인해본다.

fftshow 함수는 다음 포스팅에서 다루기로 하고, 우선 근간이 되는 매트랩 고유 저작권
fft 함수와 fft2 함수의 동작원리를 간단히나마 알아봅니다.
==========ft함수, fft2함수, fftshift함수의 동작원리를 대략적으로 추측할 수 있는 내용==========fft의 코드를 확인해 보면 다음과 같이 표시되는데,

번역하면 다음과 같다.
fftn은 N차원 배열 X의 n차원 이산 푸리에 변환을 복원합니다.X가 벡터라면 출력은 같은 방향을 가집니다.
FFTN은 변환을 실시하기 전에 사이즈 벡터가 SIZE가 되도록 X를 채웁니다. SIZE 요소가 X의 해당 사이즈보다 작으면 해당 사이즈에서 X가 잘립니다.
Copyright 1984-2005 the Mathworks, Inc. 내장 기능.
fft의 함수 코드는 저작권의 문제이므로 공개하지 않지만, 이하와 같은 단순한 동작으로 어느 정도 코드를 추측할 수 있다.

fft의 함수 적용 결과와 동일한 방법으로 ONES 함수를 적용(모든 원소를 1로 세트)하여 모든 원소가 1인 행렬을 만든 후
fft2를 적용해 보면 다음과 같다. ones 함수에 의한 행렬과 같이 모든 원소가 1인 행렬일 경우 fft2 함수를 적용하면
모든 AC 성분은 없다고 간주하고 DC 성분 64를 제외한 모든 원소가 0이 된다. AC 성분은 없다.

위와 같이 계산하시면 간단하고 좋겠지만,
AC 성분 계산 결과가 어떻게 나올지가 이 포스팅의 목적이자 궁금한 사안이다.
일단 알고 있는 사항은 fft는 열로만 덧셈했다면 fft2는 열, 행 모두 덧셈을 하는 과정인데 아래와 같다.

9600은 이해할 수 있으나, -3200은 AC 성분으로 덧셈 과정이 의문이지만, 본인이 추측한 계산 과정은 다음과 같다.


이번에 기록해 두는 시행착오는
fft처리와 fft2처리가 안되는 인수가 많은 경우라고 해서 안된 경우인데,
코드 흔적을 추적해 보았다. (매트랩 고유 기능입니다. 명령창을 누르고 방향키만 누르면 자동검색)
인원이 많아서 안되는건 아래로 내려가보면 알 수 있어.


그리고 meshgrid (-128:127,-128:127) 하면 -128부터 127까지 하나하나 정렬하기 때문에 모니터
한화면을 다채롭게 해도 부족한 숫자라 행렬 구조가 어떤지 보이지 않는다.
그래서 5×5 정사각 행렬을 대상으로 테스트를 시도해보면 먼저 meshgrid의 동작부터 보면 다음과 같다.

그다음에 z라는 행렬을 만드는데 이 행렬은 meshgrid한 x와 y의 값을 임의로 넣어서
원의 방정식과 같이 제곱 더하기 제곱을 하여 값을 만든다. z는 그 값의 집합체이고,
차례로 원소로 써넣다. 그 값의 행렬이라고 생각하면 된다

그리고 마지막 줄 c는 그 중 9보다 작은 인수를 찾는 것인데 그러기 위해서는 x,y 중 하나는 3보다 작아야 하고,
다른 하나는 3보다 같거나 작은 인수여야 하며, 6개의 선택사항 수, 다음 숫자 3을 제외한 -2~2일 경우의 수
5개의 선택지수가 되어 총 11 x 11 정사각 행렬이 되고 조건을 충족하므로 1로 세팅된다.
그런 다음 문제의 fft2 적용 fft2 적용은 fft 적용으로 열끼리만 계산한 후 행끼리 계산한다.
합계의 덧셈 과정이다. 매트랩 프로그램에서 공개하고 있는 코드의 내용은 다음과 같다.

fft2에 기록된 코드의 내용은 2차원 fft 내용이고, fft2 안에 들어가는 인수가 1차원 벡터라면,
fft2의 변환 결과도 1차원 벡터이다. 라고 영어로 기술되어 있으며,
코드의 내용은 ismatrix에서 시작하는데,





이상 ismatirx 함수는 안에 든 변수가 행렬인지 아닌지를 판단하는 함수임을 알 수 있을 것이다.
nargin의 역할은







예를 들면, 아래의 코드에서

nargin의 역할을 확인하기 위해 다음과 같은 코드를 작성하여 출력하면

mynewplot 함수가 받는 인수의 개수가 3개로 출력되는데,
마이너스가 붙어있는 것은 varargin이 세 번째 입력값임을 나타냅니다.(정수가 아닌 다른 값을 인수로 받는다는 의미인것 같다)
그다음에
fftn 함수의 코드는 다음과 같다.

일종의 DTFT 연산을 하는 함수가 들어있는 것 같다. DTFT는 수열의 합이니까

그래서 11×11 같은 경우에는 열끼리 계산하면 사실 한 줄의 숫자가 전부 11이어야 하는데,
11의 숫자가 또 11개이므로 더하면 121이 된다.
fftshift를 취하면 그 값이 행렬의 한가운데로 오게 되어 있는데, 가운데를 찾지 못했을 경우,
한 줄 조금 오른쪽으로 삐치게 된다.
fft shift를 적용하기 전에 fft2 함수의 적용만 보면 아래와 같이 확인할 수 있다.

그래서 그 다음에 아까 작성했던 fftshow 함수에 넣어서 원의 모양이 어떻게 되고,

행렬은 어떻게 이루어져 있는가?를 알려고 실행하면
출력인수가너무많습니다라는오류메시지를받는다.
그래서 결국 fft2의 함수 코드를 찾지 못했다.
저작권이라고 할까… 정확히 어떻게 동작하는지도 모른 채 사용해야 한다는 것은
매트랩 기능이 고급스럽긴 하지만 사용자로서는 깔끔하지 않다.
모르는 부분이 이렇게 두뇌에 남게 되면 세세한 부분에서 동작이 어떻게 되는지 전혀 파악할 수 없기 때문에
제대로 쓸 수 없게 되는 결과를 낳게 된다.
이것은 엔지니어에게 부적절한 소프트웨어라고도 생각할 수 있는 부분이다

위에서 AC 성분이 21과 9가 나오는데 이 숫자가 나오는 메커니즘은 아직 모른다.
매트랩을 사용하면서 머리를 때리는 것은 바로 이런 벽에 부딪히기 때문이다.
보통 코드를 할 때 어디가 문제인지 코드가 어떻게 작성되었는지 알아야 함수의 동작을 알 수 있거든요.
이것은 그것을 완전히 불가능하게 한다. 아래 데이터를 통해 21이라는 숫자와 9의 숫자는 어떤 값의 절대치인지
추측할 수는 있다.

21=abs(-8+j19.3137)이며 9=(-8-j3.3137)의 복소수 크기임을 알 수 있다.