답변:
나는 이것이 일반적인 CPU, 하나의 코어에서 하나의 간단한 스레드를 실행하고 멋진 하드웨어를 사용하지 않고 있다고 가정합니다. 그 이상이 있다면 더 간단한 시스템의 추론을 조정하여 설명 할 수 있습니다. 논의 할 특정 시스템이나 다양한 가능성을 다루는 전체 교과서 또는 연구 논문 없이는 더 이상 말할 수 없습니다.
나는 2의 거듭 제곱에 대해 걱정하지 않을 것입니다. 중요하지 않습니다. 버터 플라이 단위를 포함한 FFT 알고리즘과 2가 아닌 3의 요소 또는 소수의 요소에 대해 존재하는 모든 것입니다. 나는 그 무의미한 본성 때문에 이것에 Wikipedia를 인용하는 것을 좋아하지 않지만 어쨌든 :
모든 N에 대해 O (N log N) 복잡성을 갖는 FFT가 있으며, 소수 N에 대해서도
임의의 N에 대한 FFT의 구현은 GPL의 라이브러리 FFTW 에서 찾을 수 있습니다 .
진지한 엔지니어링 측면에서 신뢰할 수있는 유일한 방법은 구축하고 측정하는 것이지만, 변수 사이의 관계를보기 위해 이론으로부터 아이디어를 얻을 수 있습니다. 각 방법에 몇 개의 산술 연산이 포함되는지 추정해야합니다.
수년 동안 차이가 엄청나게 줄어든 경우에도 대부분의 CPU에서 곱셈이 여전히 더 느리므로 곱셈을 계산해 봅시다. 덧셈에 대한 회계는 좀 더 생각하고 물건을 추적해야합니다.
실제 출력 픽셀마다 반복되는 컨볼 루션 커널을 사용하여 곱하고 추가하는 간단한 컨벌루션에는 W² · K² 곱셈이 필요합니다. 여기서 W는 이미지의 한쪽면을 따라 픽셀 수 (간단 함을 위해 정사각형으로 가정)이고 K는 크기입니다. 한 쪽을 따라 픽셀로 컨볼 루션 커널의. 커널과 입력 이미지의 동일한 크기 부분을 사용하여 하나의 출력 픽셀을 계산하려면 K² 곱셈이 필요합니다. 입력 이미지와 번호가 같은 모든 출력 픽셀에 대해 반복합니다.
(N mults ) 직접 = W² · K²
푸리에 공간에서 작업을 수행하려면 이미지를 푸리에 변환해야합니다. 각 열에 개별적으로 FFT를 적용한 다음 각 행에 FFT를 적용하면됩니다. N 개의 데이터 포인트에 대한 FFT는 약 2N · log (N) 곱셈을 취한다; 우리는 N이 하나의 열 또는 행의 길이 인 W가되기를 원합니다. 여기의 모든 로그는 밑이 2입니다.
W 개의 행과 W 개의 열이 있으므로 모든 FFT가 완료된 후 2W · (2W · log (W)) 곱셈을 수행했습니다. 커널의 푸리에 변환을 곱한 후에는 데이터를 역 푸리에로 가져 와서 합리적인 이미지로 돌아 가야하기 때문에 두 배가됩니다. 8W² · log (W)입니다. 물론, 푸리에 변환의 곱셈과 또 다른 W² 곱셈이 이루어져야합니다. (출력 픽셀, 행 또는 한 번에 한 번이 아니라 한 번만 수행하십시오.) 이는 복잡한 곱셈이므로 4W²의 실제 곱셈입니다.
그래서, 내가 깨지거나 (아마도 그렇게하지 않았다면)
(N의 멀트 ) 푸리에 = 4W² · (2 · 로그 (W) + 1)
우리는 언제 직접 일을하고 싶습니까? K가 충분히 작아 W² · K²를 4W² · (2 · log (W) + 1)보다 작게 만드는 경우 W²의 공통 요소는 쉽게 제외됩니다. 이상적인 추정치를 다루기 때문에 아마도 "+1"을 떨어 뜨릴 수 있습니다. +1은 실제 계산과 관련하여 오류 수, 추가 횟수 계산, 루프 오버 헤드 등으로 인해 손실 될 수 있습니다. 그 나뭇잎 :
K² < 8·log(W)
이것은 주파수 공간 접근에 대한 직접 접근을 선택하기위한 대략적인 조건입니다.
동일한 크기의 두 이미지의 상관 관계는 크기가 K = W 인 커널과 충돌하는 것과 같습니다. 푸리에 공간은 항상 그렇게합니다.
오버 헤드, 오피 코드의 파이프 라이닝, 부동 소수점 대 고정 소수점을 설명하고 GPGPU 및 특수 하드웨어로 창을 버리기 위해이를 수정하고 논쟁 할 수 있습니다.