私は現在、いくつかのフーリエ変換アルゴリズムを書こうとしています。数学的な定義で説明したように、私は、単純な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個の値についての私の結果厥:
http://s1.directupload.net/images/110928/n3m8hqg6.jpg
変換がうまく働きました。私は私の計算された値の数を変更した場合
http://s7.directupload.net/images/110928/qizoiqbt.jpg
は、なぜ私が間違った結果を取得しています:私は、この結果を得る280個の値を計算しようとしていた場合
? 私の問題が私のコードにあるのか、DFTの数学的定義を誤解しているのか分かりません。いずれにせよ、誰も私の問題を助けてくれるの?ありがとう。
Transform関数の入力が複雑な配列である理由を教えてください。確かに標準的な音波(時間領域)から変換している場合、それは単一のダブル配列ですか? –
さて、私はそれを得ます - 虚数部は0に設定されているので、単なる二重の場合と本質的に同じです。あなたのコードでは、 'Complex.Polar'は 'Complex.FromPolarCoordinates'にする必要があります。 –
プロットには何を使用しますか? – GorillaApe