private static Complex[] IFFT(Complex[] input)
{
///输入序列的长度
int length = input.Length;
///输入序列的长度的一半
int half = length / 2;
///输入序列只有一个元素,输出这个元素并返回
if (input.Length == 1){
return new Complex[] { input[0] };
}
///有输入序列的长度确定输出序列的长度
Complex[] output = new Complex[length];
///正变换旋转因子的基数
double fac = 2.0 * Math.PI / length;
///序列中下标为偶数的点
Complex[] evens = new Complex[half];
for (int i = 0; i < half; i++){
evens[i] = input[2 * i];
}
///求偶数点FFT或IFFT的结果,递归实现多级蝶形运算
Complex[] evenResult = IFFT(evens);
///序列中下标为奇数的点
Complex[] odds = new Complex[half];
for (int i = 0; i < half; i++){
odds[i] = input[2 * i + 1];
}
///求偶数点IFFT的结果,递归实现多级蝶形运算
Complex[] oddResult = IFFT(odds);
for (int k = 0; k < half; k++){
///旋转因子
double fack = fac * k;
///进行蝶形运算
Complex oddPart = oddResult[k] * new Complex(Math.Cos(fack), Math.Sin(fack));
output[k] = evenResult[k] + oddPart;
output[k] = new Complex(output[k].Real / 2.0, output[k].Imaginary / 2.0);
output[k + half] = evenResult[k] - oddPart;
output[k+half] = new Complex(output[k+half].Real /2.0, output[k+half].Imaginary / 2.0);
}
//返回IFFT的结果
return output;
}
为何只有在是2的时候结果是正确的!数组长度为32!按理应该是除以32!不得其解!
一个有意思的地方是,如果把output单个拿出来打印,除以数组长度放外面处理,
就必须是除以32才正确!