C语言手动实现FFT,代码详解,举例说明
时间: 2024-04-22 19:25:02 浏览: 107
当然可以,下面是一个手动实现FFT的示例代码:
```c
#include <stdio.h>
#include <math.h>
#include <complex.h>
#define PI 3.14159265358979323846
// 计算离散傅里叶变换
void DFT(complex double* input, complex double* output, int N) {
for (int k = 0; k < N; k++) {
output[k] = 0;
for (int n = 0; n < N; n++) {
output[k] += input[n] * cexp(-2 * PI * I * k * n / N);
}
}
}
// 计算快速傅里叶变换
void FFT(complex double* input, complex double* output, int N) {
if (N == 1) {
output[0] = input[0];
return;
}
complex double even[N/2];
complex double odd[N/2];
for (int i = 0; i < N/2; i++) {
even[i] = input[2*i];
odd[i] = input[2*i+1];
}
FFT(even, output, N/2);
FFT(odd, output + N/2, N/2);
for (int k = 0; k < N/2; k++) {
complex double t = output[k];
complex double twiddle = cexp(-2 * PI * I * k / N) * output[k + N/2];
output[k] = t + twiddle;
output[k + N/2] = t - twiddle;
}
}
int main() {
int N = 8;
complex double input[] = {1, 2, 3, 4, 5, 6, 7, 8};
complex double output[N];
// 使用DFT计算
DFT(input, output, N);
printf("DFT结果: \n");
for (int i = 0; i < N; i++) {
printf("(%f, %f)\n", creal(output[i]), cimag(output[i]));
}
// 使用FFT计算
FFT(input, output, N);
printf("FFT结果: \n");
for (int i = 0; i < N; i++) {
printf("(%f, %f)\n", creal(output[i]), cimag(output[i]));
}
return 0;
}
```
这段代码实现了一个简单的离散傅里叶变换(DFT)和快速傅里叶变换(FFT)。在 `DFT` 函数中,我们使用两个循环分别计算每个频率分量的值。而在 `FFT` 函数中,我们利用递归将输入序列分为偶数和奇数部分,并对它们分别进行FFT计算,然后再组合结果。通过递归的方式,FFT可以在O(NlogN)的时间复杂度内完成计算。
在主函数中,我们定义了一个长度为8的输入序列,并分别使用DFT和FFT计算其频谱。最后打印出结果,可以看到两种方法得到的频谱结果是一致的。
这只是一个简单的示例,实际使用时可能需要考虑更多细节,比如处理实数序列、处理非2的幂次长度序列等。但这段代码可以帮助你理解FFT的基本原理和实现方式。希望对你有帮助!
阅读全文