使用 FFT 的 DCT 导致复杂的结果
DCT using FFT results in complex result
我正在尝试根据本文 https://www.researchgate.net/publication/330405662_PittPack_Open-Source_FFT-Based_Poisson%27s_Equation_Solver_for_Computing_With_Accelerators(第 "Neumann Boundary Condition" 节)实施 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
有人可以解释一下这里的问题是什么吗?还是我认为结果应该是纯真实的假设是错误的?
所以事实证明,使用这种技术舍弃非零虚部是正确的,尽管直觉上我觉得这是错误的。
反向变换没有恢复原始值只是频率分量的缩放问题。
我正在尝试根据本文 https://www.researchgate.net/publication/330405662_PittPack_Open-Source_FFT-Based_Poisson%27s_Equation_Solver_for_Computing_With_Accelerators(第 "Neumann Boundary Condition" 节)实施 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
有人可以解释一下这里的问题是什么吗?还是我认为结果应该是纯真实的假设是错误的?
所以事实证明,使用这种技术舍弃非零虚部是正确的,尽管直觉上我觉得这是错误的。 反向变换没有恢复原始值只是频率分量的缩放问题。