在使用JAVA语言计算FFT的时候 使用递归完成对输入参数的分组。图中这一段是如何通过k的取值控制分组次数的啊 萌新求解答!!!!!
下面是完整代码
public static Complex[] fft(Complex[] x) {
int N = x.length; //x.length代表数组或者字符串的长度
if (N == 1) return new Complex[] { x[0] };
//字符串长度为1 因为exp(-2i*n*PI)=1,n=1时递归原点
//基于 2 FFT的算法
if (N % 2 != 0) { throw new RuntimeException("N不是2的幂"); }
// ==为赋值 !=是不等于
//throw new RuntimeException 引发异常 打印后面的字符串。
// 提取下标为偶数的原始信号值进行递归fft计算
Complex[] even = new Complex[N/2];
for (int k = 0; k < N/2; k++) {
even[k] = x[2*k];
// System.out.println(k);
show(even, "偶");
}
Complex[] q = fft(even); //递归
// 提取下标为奇数的原始信号值进行递归fft计算
Complex[] odd = even;
for (int k = 0; k < N/2; k++) {
odd[k] = x[2*k + 1];
System.out.println(k);
show(odd, "奇");
}
Complex[] r = fft(odd); //递归
//奇数项+偶数项
Complex[] y = new Complex[N];
for (int k = 0; k < N/2; k++) {
// 使用欧拉公式e^(-i*2pi*k/N) = cos(-2pi*k/N) + i*sin(-2pi*k/N) sin为奇函数 -2写在里面
// sin为奇函数 -2写在里面,也可以为cos(2pi*k/N) - i*sin(2pi*k/N)
double kth = -2 * k * Math.PI / N;
Complex wk = new Complex(Math.cos(kth), Math.sin(kth));
y[k] = q[k].plus(wk.times(r[k]));
// exp(-2*(k+n/2)*PI/n) 相当于 -exp(-2*k*PI/n),其中exp(-n*PI)=-1(欧拉公式);
y[k + N/2] = q[k].minus(wk.times(r[k]));
show(y, "y");
}
return y;
}