DFT に基づくプロジェクトの一環として、MATLAB でプログラムを作成しています。
N x N
データ行列X
を 、対応する DFT 行列を とすると、Y
DFT 係数は次のように表すことができます。
Y(k1,k2) = ∑(n1=0:N-1)∑(n2=0:N-1)[X(n1,n2)*(WN^(n1k1+n2k2))] (1)
0≤k1,k2≤N-1
Where WN^k=e^((-j2πk)/N)
回転因子 WN は周期的であるため、次の(1)
ように表すことができます。
Y(k1,k2)=∑(n1=0:N-1)∑(n1=0:N-1)[X(n1,n2)*(WN^([(n1k1+n2k2)mod N) ] (2)
指数は、与えられた に対して((n1k1 +n2k2)) N = p
のセットによって満たされます。したがって、そのようなデータをグループ化し、プロパティを適用することにより、(n1,n2)
(k1,k2)
WN^(p+N /2) = -(WN^P)
(2)
次のように表現できます。
Y(k1,k2)= ∑(p=0:M-1)[Y(k1,k2,p)*(WN^p)] (3)
どこ
Y(k1,k2,p)= ∑(∀(n1,n2)|z=p)X(n1,n2) - ∑(∀(n1,n2)|z=p+M)X(n1,n2) (4)
z=[(n1k1+n2k2)mod N] (5)
Y(k1,k2,p)
特定の 2D 正方行列 (これは行列です) から 2D 行列のスライス (つまり、各スライスが 2D 行列である 3D 行列) を作成する必要がありますX
。X
512。
上記の式に基づいて、次のようなコードを書きました。ベクトル化する必要があります。
N=size(X,1);
M=N/2;
Y(1:N,1:N,1:M)=0;
for k1 = 1:N
for k2 = 1:N
for p= 1:M
for n1=1:N
for n2=1:N
N1=n1-1; N2=n2-1; P=p-1; K1=k1-1; K2=k2-1;
z=mod((N1*K1+N2*K2),N);
if (z==P)
Y(k1,k2,p)= Y(k1,k2,p)+ X(n1,n2);
elsif (z==(P+M))
Y(k1,k2,p)= Y(k1,k2,p)- X(n1,n2);
end
end
end
end
end
5 つの FOR ループがあるため、N の次元が大きいと実行時間が非常に長くなります。したがって、FOR ループをなくしてコードをベクトル化するための解決策を教えてください。コードを最高速度で実行する必要があります。ありがとうございます。また..