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); 

Некоторая помощь будет принята с благодарностью.

Wolf

+0

Для произвольного содержимого фильтр с кирпичной стеной (обнуление БПФ) далеко не идеален. – hotpaw2

+0

Насколько я вижу, это поведение называется «идеальным», см. [Идеальный низкий проход] (https://ccrma.stanford.edu/~jos/sasp/Ideal_Lowpass_Filter.html) – DerHandwerk

+0

Обратите внимание, что этот фильтр является непрерывным, что может ведут себя совсем по-другому от БПФ (где ответ может иметь огромные перерегулирования между центрами bin, а не быть плоскими, согласно диаграмме). – hotpaw2

ответ

1

Если у вас есть фильтр с шагом ответом в частотной области, то вы увидите значительные sin(x)/xзвона в пространственной области. Это называется Gibbs Phenomenon. Вам необходимо применить window function к требуемой частотной характеристике, чтобы уменьшить это.

+0

Недавно я обнаружил, что если я переключу оператор из 'filter = r> 0.7f? 0.0f: 1.0f 'to' filter = r <0.7f? 0.0f: 1.0f', он ведет себя как низкий проход в этом случае с упомянутым эффектом звонка. Код, как написано выше, применяет фильтр высоких частот, хотя я ожидал противоположного. Может быть, это результат низких частот, которые расположены по краям? – DerHandwerk

+0

Это зависит от того, с каким БПФ вы используете то, как пространственные частоты расположены в массиве вывода FFT - см. Документацию FFTW для этого - если вы используете реалистичный 2D-FFT 2D-код, хотя я думаю, что DC (0,0), а не в центре. –

+0

Да fftw помещает их в край, поэтому я должен вычислить '1 - r', тогда он работает! – DerHandwerk