我已经完成了在Matlab中实现1D DCT-II的任务,其中偶数长度序列的1D DCT-II被定义为:
当然,在我可以使用fft功能的情况下,禁止使用内置dct功能。利用DCT-II和DFT之间的关系,我从原始序列的偶数和对称扩展的DFT系数计算出DCT系数,如下所示:
但是,我自己的实现与内置dct函数不一致。我已经看到了几个关于DCT实现的问题但是在我自己的代码中找不到问题。我的代码如下。
function X_dct = dct_new (x_sig)
N = length(x_sig);
if mod(N,2) ~= 0
error('Sequence is of odd length.');
end
x_hat = zeros(N, 1);
for n = 1: (N/2)
x_hat(n) = x_sig((2*n)-1);
x_hat(N-n+1) = x_sig(2*n);
end
X_hat_dft = fftshift(fft(x_hat));
X_dct = zeros(1, N);
for k = 1:N
X_dct(k) = real(alpha(k-1,N)* exp(-1i*pi*(k-1)/(2*N))*(X_hat_dft(k)));
end
end
function a = alpha(k, N)
if k == 0
a = sqrt(1/N);
else
a = sqrt(2/N);
end
end
提前致谢。
答案 0 :(得分:0)
正如Cris Luengo在评论中所指出的,我的错误是在计算dct系数之前使用fftshift,因为我没有采取换档位置。