首页 > 解决方案 > 使用 FFT 的 DCT 产生复杂的结果

问题描述

我正在尝试根据本文https://www.researchgate.net/publication/330405662_PittPack_Open-Source_FFT-Based_Poisson%27s_Equation_Solver_for_Computing_With_Accelerators(“Neumann边界条件”部分)实施 DCT10 。但是我有一个问题,在执行 FFT 和半样本移位后,结果不是纯真实的(我认为应该是,对吗?)因此,在截断虚部时,提到的逆变换不会导致我原来的价值观。

这是我的 Matlab 代码(第一维 DCT):

function X_dct = dct_type2(x_sig)
    N = size(x_sig);

    % shuffle to prepare for FFT
    x_hat = zeros(N);
    for m = 1 : N(2)
        for n = 1 : (N(1) / 2)
            x_hat(n, m) = x_sig((2 * n) - 1, m);
            x_hat(N(1) - n + 1, m) = x_sig(2 * n, m);
        end
    end

    % perform FFT
    X_hat_dft = fft(x_hat, N(1), 1);

    % apply shifting by half-sample
    X_dct = zeros(N);
    for m = 1 : N(2)
        for k = 1 : N(1)
            X_dct(k, m) = 2 * exp(-1i * (pi * (k-1)) / (2 * N(1))) * X_hat_dft(k, m);
        end
    end
end

有人可以解释这里有什么问题吗?还是我的假设是错误的,即结果应该是纯真实的?

标签: fftdct

解决方案


所以事实证明,使用这种技术删除非零虚部是正确的,即使它直观地对我来说似乎是错误的。逆变换没有恢复原始值仅仅是频率分量的缩放问题。


推荐阅读