2014-12-05 6 views
2
  • 루프가 감소 된 2D 치수 DFT 함수를 작성하고 싶습니다.

내가 구현하려고하는 이산 푸리에 변환입니다 : 2 Dimensional DFTMATLAB에서 fft2() 함수 작성

변환의 분리 성 속성 (실제로는 지수 함수)를 사용하여, 우리는 두 개의 1 차원 DFT의 곱으로이를 작성할 수 있습니다. 그런 다음 변환의 행 (아래의 행렬 wM)과 열 (행렬 wN)에 대한 지수 항을 계산할 수 있습니다.

f = imread('cameraman.tif'); 

[M, N, ~] = size(f); 
wM  = zeros(M, M); 
wN  = zeros(N, N); 

for u = 0 : (M - 1) 
    for x = 0 : (M - 1) 
     wM(u+1, x+1) = exp(-2 * pi * 1i/M * x * u); 
    end  
end 

for v = 0 : (N - 1) 
    for y = 0 : (N - 1) 
     wN(y+1, v+1) = exp(-2 * pi * 1i/N * y * v); 
    end  
end 

F = wM * im2double(f) * wN; 

내가 해달라고입니다 가장 먼저하는 일이 2 개 루프를 사용하려는 그런 다음, 요약 프로세스 우리가 "F = WM은 * original_matrix * wN으로 구성된 복소 가중치 '로 곱 수 있습니다 여기에

내가 쓴 코드는 MxM 및 NxN 시간 실행. 거대한 매트릭스 (또는 이미지)를 사용하면 문제가 될 수 있습니다. 이 코드를 더 빨리 만들 수있는 기회가 있습니까 (예 : 루프 제거)?

두 번째로 푸리에 변환 결과가 표시됩니다. 다른

% // "log" method 
fl = log(1 + abs(F)); 
fm = max(fl(:)); 
imshow(im2uint8(fl/fm)) 

% // "abs" method 
fa = abs(F); 
fm = max(fa(:)); 
imshow(fa/fm) 

나는 "복근"방법을 사용

, 나는 검은 색으로 만 그림 참조, 아무것도 : 나는 변환을 표시하지 않을 아래의 코드를 사용합니다. 당신이 생각하는 "abs"방법에있어 잘못된 점은 무엇입니까?

그리고 마지막으로 MATLAB의 fft2() 함수와 내 함수의 변환 결과를 비교하면 광산이 MATLAB의 결과보다 어두운 그림을 표시합니다. 내가 여기서 무엇을 놓치고 있니? 구현 misktake? The transform result of my own function

는 MATLAB의 FFT2() 함수의 결과를 변환 :

내 자신의 기능의 결과를 변환 enter image description here

+1

"검은 색 이미지"와 어두운 결과에 대해서는'imshow (image, []) '와 같이 대괄호를 추가하십시오. 그에 따라 결과의 크기가 조정됩니다. 그럴 수도 있습니다. – kkuilla

+0

@kkuilla 나는 그것을 시도했지만 불행히도 그것은 작동하지 않았다 :/ – mehmet

+1

실제로 스케일링 문제가있다. 하나를 다른 것으로 나눠서 시도해보십시오. 누락 된 부분에 대한 통찰력을 줄 수 있습니다. 그것은 fft 자체가 rigth 인 것처럼 보이지만 규모는 worng입니다. –

답변

1

나는 당신이 당신의 문제를 해결 행복하지만 불행히도 완전히 옳지 않다 대답합니다. 실제로 그 일을하지만, 내가 언급했듯이, im2double은 모든 것을 1로 표준화 할 것이므로, 당신이 가지고있는 스케일 결과를 보여줄 것입니다. 원하는 것은 (성능을 찾고있는 경우) im2double을 수행하지 않고 255로 곱하지만 직접 double()으로 전송합니다.

0

meshgrid을 사용하여 루프를 제거 할 수 있습니다. 예를 들어 는 :

M = 1024; 
tic 
[ mX, mY ] = meshgrid(0 : M - 1, 0 : M - 1); 
wM1 = exp(-2 * pi * 1i/M .* mX .* mY); 
toc 
tic 
for u = 0 : (M - 1) 
    for x = 0 : (M - 1) 
     wM2(u + 1, x + 1) = exp(-2 * pi * 1i/M * x * u); 
    end  
end 
toc 
all(wM1(:) == wM2(:)) 

내 시스템의 타이밍이었다 경과 시간이 0.130923 초입니다. 경과 시간은 0.493163 초입니다.