离散余弦变换(dct-II)自己的循环实现

信息处理 matlab dct
2022-01-27 04:32:44

我想实现 DCT-2,dctmtx:

X[k]=n=0N1x[n]cos(πN(n+12)k)   ,  k=0,1,N1

function [ C ] = dct_mtx( N )
for k = 0:N-1
    for n = 0:N-1
       tmp(k+1,n+1) = cos((0.5+N)*k*pi/N);
    end
end

tmp(1,:) = tmp(1,:) / sqrt(2);
C = tmp;
end

如果我调用该函数C = dct_mtx(3);并检查矩阵C'*C = I并且不是身份而是几乎。

我必须在代码中更改什么才能最终获得身份?

身份看起来像这样:

1.50000000000000         -1.66533453693773e-16    -1.11022302462516e-16
-1.66533453693773e-16    1.50000000000000         -2.77555756156289e-16
-1.11022302462516e-16    -2.77555756156289e-16    1.50000000000000
1个回答

你错过了一个2N比例因子。更改以下行:

tmp(k+1,n+1) = sqrt(2/N)*cos((n+0.5)*k*pi/N);

您也可以简单地使用 Matlab 的内置函数dctmtx

C = dctmtx(n)