2012-05-01 4 views
0

다시 저도 여전히 저역 통과 필터를 실행하려고합니다.하지만 왜 아직도 실행되지 않는지 모르겠습니다. 나는 이상적인 저역 통과 필터를 이미지에 적용하기 위해 내 코드 FFT Filters과 이전 질문 FFT Question을 사용했다. 아래 코드는 이미지를 어둡게 만들고 결과 이미지에 흰색 픽셀을 배치합니다.fftw가있는 이상적인 저역 통과 필터

// forward fft the result is in freqBuffer 
fftw_execute(forward); 

for (int y = 0; y < h; y++) 
{ 
    for (int x = 0; x < w; x++) 
    { 
     uint gid = y * w + x; 

     // shifting coordinates normalized to [-0.5 ... 0.5] 
     double xN = (x - (w/2))/(double)w; 
     double yN = (y - (h/2))/(double)h; 

     // max radius 
     double maxR = sqrt(0.5f * 0.5f + 0.5f * 0.5f); 

     // current radius normalized to [0 .. 1] 
     double r = sqrt(xN * xN + yN * yN)/maxR ; 

     // filter response 
     double filter = r > 0.7f ? 0.0f : 1.0f; 

     // applying filter response 
     freqBuffer[gid][0] *= filter; 
     freqBuffer[gid][1] *= filter; 
    } 
} 

// normlization (see fftw scaling) 
for (uint i = 0; i < size; i++) 
{ 
    freqBuffer[i][0] /= (float)size; 
    freqBuffer[i][1] /= (float)size; 
} 

// backward fft 
fftw_execute(backward); 

일부 도움을 받으실 수 있습니다. 늑대

+0

임의의 내용의 경우, 벽돌 벽 필터 (FFT bins을 제로화)는 이상적이지 않습니다. – hotpaw2

+0

내가 본 바로는이 동작을 "이상적"이라고합니다. [이상적인 저 패스] (https://ccrma.stanford.edu/~jos/sasp/Ideal_Lowpass_Filter.html) – DerHandwerk

+0

이 필터는 연속적으로 사용할 수 있습니다. FFT 빈과는 매우 다르게 동작합니다 (다이어그램에 따라 응답이 빈 센터간에 큰 오버 슛을 가질 수 있음). – hotpaw2

답변

1

는 주파수 영역에서의 스텝 응답과 필터가있는 경우

는 당신은 sin(x)/x중요한 공간 영역에서을 울리는 볼 수 있습니다. 이를 Gibbs Phenomenon이라고합니다. 이를 줄이려면 원하는 주파수 응답에 window function을 적용해야합니다.

+0

나는 최근에'filter = r> 0.7f에서 연산자를 토글하면? 0.0f : 1.0f'에서'filter = r <0.7f? 0.0f : 1.0f'라고 말하면, 당신이 언급 한 링잉 효과와 함께이 경우 저역 통과처럼 행동합니다. 위의 코드는 하이 패스 필터를 적용합니다. 이것은 가장자리에 위치한 저주파수의 결과 일 수 있습니까? – DerHandwerk

+0

그것은 실제 FFT 출력 배열에 공간 주파수가 어떻게 배열되어 있는지에 따라 어떤 FFT를 사용하는지에 따라 달라집니다 (실제 FFTW 문서를 참조하십시오). 그러나 실제 DCF가 복잡한 2D FFT를 사용하는 경우 DC가 (0,0)에서, 중앙에 있지 않습니다. –

+0

예 fftw가 가장자리에 위치하므로'1-r'을 계산해야합니다! – DerHandwerk

관련 문제