2014-01-29 7 views
1

저는 Matlab Newb입니다. 나는 현재 푸리에 변환 (Fourier Transformation)을 실험 중이며 주파수 필터 (k_min과 k_max 사이의 모든 주파수는 삭제)를 구현하려고합니다.Matlab : 복소수 배열 값 설정이 느립니다.

이를 실현하려면 푸리에 변환 된 이미지에서 각 픽셀을 삭제합니다. 다음 코드를 사용하고 있습니다.

% Example values 
kmin = 0; 
kmax = 300; 

for i = 1:w 
    for j = 1:h 
     if norm([w/2, h/2] - [i,j]) < kmin || norm([w/2, h/2] - [i,j]) > kmax 
      Fs(j,i) = 0.0; 
     end 
    end 
end 

내 이미지는 약 1000x600입니다. 따라서 Fs는 1000x600의 복잡한 숫자 배열입니다. 이제 내 문제 : 왜 이렇게 느린가요? 내가 거의 픽셀을 0으로 설정하면 (예 : kmin = 10, kmax = 무한대) 코드는 빠르게 실행됩니다. 그러나 거의 모든 픽셀을 0.0 (예 : kmin = 0, kmax = 10)으로 설정해야한다면 엄청난 양의 완료 할 시간.

내가하는 일은 배열 항목을 0으로 설정하는 것입니다 (최악의 경우 1,000,000 개 미만의 항목, 복소수이므로 2 개의 요소 일 수 있음). 왜이 작업이 몇 분이 걸릴까요? :)

+0

여기 MATLAB과 푸리에 도메인의 마스킹 주파수의 일부 세부 정보 : http://stackoverflow.com/a/19879538/2777181 –

답변

1

루프가 Matlab에서 느려지는 경향이 있습니다 (최근 버전에서는 개선되고 있지만). vectorize은 루프없이 모든 값을 "동시에"사용하는 것이 좋습니다. 이 경우 ndgridlinear/logical indexing를 사용하여 수행 할 수 있습니다

[ii jj] = ndgrid(1:w,1:h); %// creates all combinations 
aux = sqrt((w/2-ii(:)).^2+(h/2-jj(:)).^2); %// compute norm 
ind = (aux<kmin) | (aux>kmax); %// logical index 
Fs(ind) = 0; 
+0

이, 영업 이익의 나쁜 방법에 대한 좋은 속도 향상이지만, 여전히 나쁜 접근법입니다. –

0

대신 인덱스에서 주파수를 계산하고 패스 백에 들어 있는지를 보는, 컷오프 주파수에 해당하는 인덱스를 계산합니다.

일단 n_cutoff_lown_cutoff_high을 계산하면 1:n_cutoff_lown_cutoff_high:end의 모든 요소를 ​​0으로 설정하는 것이 쉽고 빠릅니다.

는 기본적으로, 당신은

j^2 < kmin^2 - i^2 
을 의미

i^2 + j^2 < kmin^2 

에이 광장

norm([i,j]) < kmin 

norm([w/2, h/2] - [i,j]) < kmin 

에서 수식을 변경 fftshift를 사용

또는

j_cutoff = floor(sqrt(kmin^2 - i^2)); 
Fs(i,-j_cutoff:j_cutoff) = 0;