【问题标题】:Computing the derivative of a function with ifft用 ifft 计算函数的导数
【发布时间】:2013-07-02 19:31:46
【问题描述】:

我想通过首先生成一些 2D 频域系数然后使用 ifft 生成纹理来生成 2D 纹理。为了计算法线贴图,我想对这个 2D 函数求导。我只想知道以下是否正确:

in 1D I would just do a loop for (k = 0; k < N, k++) coefficients[k] *= i * k; where i is sqrt(-1)
in 2D I should do this? for (m=0;m<N;m++) for (n=0;n<N;n++) coefficients[m,n] *= (i*m)*(i*n) -> -m*n;

【问题讨论】:

    标签: fft


    【解决方案1】:

    对于 2D,“导数”是 2D 梯度向量,其分量在空间域中是 w.r.t 的偏导数。坐标轴(通常表示为 x 和 y)。因此,您将为一个轴执行coefficients[m,n] *= i*m,为另一轴执行coefficients[m,n] *= i*n。您将对这两个中的每一个应用逆二维 fft,以获得偏导数 d/dx 和偏导数 d/dy 的图像。然后,法线将是归一化为长度 1 的向量 (d/dx, d/dy, -1)。

    【讨论】:

    • 所以你是说我应该创建 2 组系数并在它们上运行 2 个单独的 1D ifft?
    • 并非如此。对于他们每个人,您将应用 2d ifft。此信息已添加到答案中。
    • 你是说系数[m,n] = in?
    • 我将原始ifft的实部作为高度,因为原始系数的虚部都是0。如果系数是a+bi,其中b=0,那么乘以之后通过 in 我得到一个复系数 0+ani。我是只使用结果 ifft 的实部还是使用 sqrt(rere+im*im)?
    • = 更正为 *=,谢谢。至于第二个问题,请考虑一下:您正在频域中创建一个高度函数。如果你做对了,它的 IFFT 将是一个真正的函数(我假设你知道如何做到这一点,因为这不是你最初问题的主题)。由于数字(大约 1e-13 左右),IFFT 可能具有较小的虚部。衍生品也是如此。您正在计算频域中 real 函数的导数。 IFFT 将是真实的,如果不是,则实现存在错误。
    猜你喜欢
    • 1970-01-01
    • 2017-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-06
    • 1970-01-01
    • 2011-08-14
    • 1970-01-01
    相关资源
    最近更新 更多