一维 DCT matlab 代码

信息处理 图像处理 matlab 离散信号 转换 dct
2022-02-11 04:31:15

我正在编写 MATLAB 代码来计算样本 y 的一维 DCT。在计算 DCT 时y=[0,1,2],代码生成的系数[3.0000 -2.2304 0 -0.1585]与 Matlab 默认生成的系数一致dct([0,1,2])

选择样本y=[1,2,3]时,相同的代码无法正常工作。

期待在我的自定义 DCT 代码中进行修改和澄清。

等式 DCT:

C(u)=α(u)x=0N1f(x)cos[π(2x+1)u2N]foru=0,1,2,,N1

自定义代码

y=[0,1,2];
[M,N]=size(y);
sum=0;
dct1d=zeros(1,N);
u=[0:N-1] ; 
for j=1:N
    for i=1:N
        sum=sum+y(i).*(cos((pi.*(2.*y(i)+1).*u(j))/(2*N)));
    end
    if j==1   
            K=sqrt(1/N);
    else
            K=sqrt(2/N);
    end

   dct1d(j)=K.*sum;
   sum=0;
end
dct1d
2个回答

您输入错误的公式,替换此行

sum = sum + y(i).*(cos((pi.*(2.*y(i)+1).*u(j))/(2*N)));

与下面的一个,它工作正常。

sum = sum + y(i).*(cos((pi.*(2.*u(i)+1).*u(j))/(2*N)));

为清楚起见,我将此 DCT 写为:

F(u)=α(u)i=0N1f(i)cos(πu2N(2i+1))
我们注意到,使用 Matlab 的 1 索引:

y[i+1]=f(i).

然后我会修改内部限制(从0N1代替 1N):

for i = 0:N-1
sum = sum + y(i+1)*(cos((pi*(2*i+1)*u(j))/(2*N)));
end

您也可以删除虚线运算符。我确实更喜欢保持离散的时间/空间索引i更好地与离散频率指数分开u,以保持离散余弦变换的对称性/对偶性,以及它的逆变换的对称性/对偶性。这可能有利于类似三角变换的扩展或推广。