私は現在、フーリエ変換アルゴリズムを書き込もうとしています。数学的な定義で説明されているように、単純なDFTアルゴリズムから始めました。
public class DFT {
public static Complex[] Transform(Complex[] input) {
int N = input.Length;
Complex[] output = new Complex[N];
double arg = -2.0 * Math.PI / (double)N;
for (int n = 0; n < N; n++) {
output[n] = new Complex();
for (int k = 0; k < N; k++)
output[n] += input[k] * Complex.Polar(1, arg * (double)n * (double)k);
}
return output;
}
}
そこで、このアルゴリズムを次のコードでテストしました。
private int samplingFrequency = 120;
private int numberValues = 240;
private void doCalc(object sender, EventArgs e) {
Complex[] input = new Complex[numberValues];
Complex[] output = new Complex[numberValues];
double t = 0;
double y = 0;
for (int i = 0; i < numberValues; i++) {
t = (double)i / (double)samplingFrequency;
y = Math.Sin(2 * Math.PI * t);
input[i] = new Complex(y, 0);
}
output = DFT.Transform(input);
printFunc(input);
printAbs(output);
}
変換は正常に機能しますが、numberValuesがsamplingFrequencyの倍数(この場合:120、240、360、...)である場合に限ります。これが240個の値に対する私の結果です。
変換はうまくいきました。
280の値を計算しようとすると、次の結果が得られます。
計算値の数を変更すると、間違った結果が得られるのはなぜですか?ここでの私の問題が私のコードの問題なのか、それともDFTの数学的定義の誤解なのかはわかりません。いずれにせよ、誰かが私の問題を手伝ってくれるでしょうか?ありがとう。