在Matlab中通过FFT实现DCT与DFT的连接

时间:2018-01-05 14:21:05

标签: matlab fft dct

我已经完成了在Matlab中实现1D DCT-II的任务,其中偶数长度序列的1D DCT-II被定义为: enter image description here

当然,在我可以使用fft功能的情况下,禁止使用内置dct功能。利用DCT-II和DFT之间的关系,我从原始序列的偶数和对称扩展的DFT系数计算出DCT系数,如下所示: enter image description here

但是,我自己的实现与内置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

提前致谢。

1 个答案:

答案 0 :(得分:0)

正如Cris Luengo在评论中所指出的,我的错误是在计算dct系数之前使用fftshift,因为我没有采取换档位置。