最初にこの回答の注意点ですが,私はMatlabを持っていないので
FreeMatというMatlabモドキのアプリで確認しています。
したがって,本家のMatlabでは違うかもしれません。
まずは,関数にして少ないデータ数でfftと結果を比較すればいいと思います。
質問者のコードを忠実に関数にすると,次のような感じでしょうか?
なお,引数xのサイズは (N, 1)
と仮定します。
matlab
1function C = mydft(x)
2 N = size(x)(1);
3 i = 0:(N-1);
4 C = zeros(N, 1);
5 for k = 0:1:(N-1)
6 C(k+1, 1) = 1/N * exp(complex(0, -(2 * pi / N) * k * i)) * x;
7 end
8end
これを適当なデータに入れてみます。
--> test_in = [1,2,3,4,5]'
test_in =
1
2
3
4
5
--> fft(test_in)
ans =
15.0000 + 0.0000i
-2.5000 + 3.4410i
-2.5000 + 0.8123i
-2.5000 - 0.8123i
-2.5000 - 3.4410i
--> mydft(test_in)
ans =
3.0000 + 0.0000i
-0.5000 + 0.6882i
-0.5000 + 0.1625i
-0.5000 - 0.1625i
-0.5000 - 0.6882i
-->
忠実にfftを再現するなら,1/N
はいらなそうです。
また,ついでにサイズを(1, N)
, (N, 1)
の両対応にします。
matlab
1function C = mydft(x)
2 sz = size(x);
3 if sz(2) == 1
4 N = sz(1);
5 i = 0:(N-1);
6 C = zeros(N, 1);
7 for k = 0:1:(N-1)
8 C(k+1, 1) = exp(complex(0, -(2 * pi / N) * k * i)) * x;
9 end
10 elseif sz(1) == 1
11 N = sz(2);
12 i = (0:(N-1))';
13 C = zeros(1, N);
14 for k = 0:1:(N-1)
15 C(1, k+1) = x * exp(complex(0, -(2 * pi / N) * k * i));
16 end
17 else
18 C = []
19 end
20end
--> mydft(x_in)
ans =
15.0000 + 0.0000i
-2.5000 + 3.4410i
-2.5000 + 0.8123i
-2.5000 - 0.8123i
-2.5000 - 3.4410i
--> fft(x_in') - mydft(x_in')
ans =
1.0e-15 *
0 0.8882 - 0.4441i 0.0000 + 1.2212i -0.8882 + 1.4433i -3.5527 + 1.7764i
-->
誤差が1.0e-14
程度なので,まぁ精度としては十分でしょうか?
表示等で規格化するには,mydft(x) / N
,mydft(x) * 2 / N
,mydft(x) * sqrt(2) / N
等の後処理が必要です。