【问题标题】:ideal lowpass filter with fftw带fftw的理想低通滤波器
【发布时间】:2012-05-01 19:17:06
【问题描述】:

再次,我仍在尝试让我的低通滤波器运行,但我现在不知道为什么它仍然没有运行。我根据FFT Filters 和我之前的问题FFT Question 调整了我的代码,以便对图像应用理想的低通滤波器。下面的代码只是使图像变暗并在结果图像中放置一些白色像素。

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

我们将不胜感激。

【问题讨论】:

  • 对于任意内容,砖墙过滤器(将 FFT 箱归零)远非理想。
  • 据我所知,这种行为被称为“理想”,请参阅Ideal Low Pass
  • 请注意,此过滤器是连续的,其行为与 FFT bin 的行为非常不同(其中响应在 bin 中心之间可能有巨大的过冲,而不是平坦,如图所示)。
  • 这正是我所经历的。所以我用余弦过渡的过滤器代替了它,它更平滑。结果比理想滤波器的结果要理想得多。 :-D

标签: fft fftw lowpass-filter


【解决方案1】:

如果您有一个在频域中具有阶跃响应的滤波器,那么您将在空间域中看到显着的sin(x)/x振铃。这被称为Gibbs Phenomenon。您需要将window function 应用于所需的频率响应以缓解这种情况。

【讨论】:

  • 我最近发现,如果我将运算符从filter = r &gt; 0.7f ? 0.0f : 1.0f 切换到filter = r &lt; 0.7f ? 0.0f : 1.0f,在这种情况下它的行为就像一个低通,并带有你提到的振铃效果。上面写的代码应用了一个高通滤波器,尽管我期望相反。会不会是边缘处的低频造成的?
  • 这取决于您使用的 FFT 空间频率在 FFT 输出阵列中的排列方式 - 请参阅 FFTW 文档 - 如果您使用的是实到复 2D FFT不过我认为 DC 在 (0,0),而不是在中心。
  • 是的 fftw 将它们放在边缘,所以我必须计算 1 - r 然后它才能工作!
猜你喜欢
  • 1970-01-01
  • 2013-10-31
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
  • 2015-02-02
  • 2010-10-23
  • 2019-06-04
  • 1970-01-01
相关资源
最近更新 更多