📄 dct2d.m
字号:
function C=DCT2D(B)
%将图像数据进行快速傅立叶变换,返回幅度和相位信息
a=length(B);
%依次对每一行进行FFT操作
C=zeros(a);
for b=1:a
C(b,:)=DCT1D(B(b,:));
end
%依次对每一列进行FFT操作
for b=1:a
T=C(:,b);
T1=DCT1D(T');
C(:,b)=T1';
end
%%%%---------SubFunction-------------
function B=DCT1D(A)
%一维离散余弦变换
n=length(A);
%对变换数组延拓
T=zeros(1,n);
C=[A,T];
C=FFT1D(C)*2*n;
T=C(1:n);
T(1)=T(1)/n^0.5;
for u=2:n
T(u)=(2/n)^0.5*T(u)*exp(-i*(u-1)*pi/2/n);
end
B=real(T);
%%%-------------Subfunction-------
function B1=FFT1D(A1)
%%---对A1中的数据进行奇偶分解排序-----
B=SortOE(A1);
n=length(B);m=log2(n);
for s=1:n
T(s)=double(B(s));%将图像数据转换为double型
end
for a=0:m-1
M=2^a;nb=n/M/2;%每一块的半长度和分成的块数
for j=0:nb-1 %对每一块依次进行操作
for k=0:M-1%对每一块中的一半的点依次操作
t1=double(T(1+k+j*2*M));t2=double(T(1+k+j*2*M+M))*exp(-i*pi*k/M);
T(1+k+j*2*M)=0.5*(t1+t2);
T(1+k+j*2*M+M)=0.5*(t1-t2);
end
end
end
B1=T;
%%--------------Subfunction------------
%奇偶分解排序函数
function B=SortOE(T)
n=length(T);m=log2(n/2);
for i=1:m
nb=2^i;lb=n/nb;%分成的块数和每一块的长度
lc=2*lb;%操作间隔
for j=0:nb/2-1 %进行排序操作的次数
t=T(2+j*lc:2:2*lb+j*lc);
T(1+j*lc:lb+j*lc)=T(1+j*lc:2:(2*lb-1)+j*lc);
T(lb+1+j*lc:2*lb+j*lc)=t;
end
end
B=T;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -