一维数组 fft c++代码
时间: 2024-01-12 08:01:06 浏览: 231
一维数组 FFT(Fast Fourier Transform,快速傅里叶变换)是一种高效的算法,用于将一组离散的复数信号(例如音频数据)从时域转换到频域。
在 C 语言中,可以使用一维数组 FFT 代码来实现这个算法。以下是一个简单的例子:
```c
#include <stdio.h>
#include <math.h>
#define PI 3.14159265359
// 定义复数结构体
typedef struct {
double real;
double imag;
} Complex;
// 傅里叶变换
void fft(Complex buffer[], int n) {
if (n <= 1) {
return;
}
Complex even[n/2];
Complex odd[n/2];
for (int i = 0; i < n/2; i++) {
even[i] = buffer[2*i];
odd[i] = buffer[2*i+1];
}
fft(even, n/2);
fft(odd, n/2);
for (int i = 0; i < n/2; i++) {
double angle = -2*PI*i/n;
Complex t = {cos(angle), sin(angle)};
t.real *= odd[i].real;
t.imag *= odd[i].imag;
buffer[i].real = even[i].real + t.real;
buffer[i].imag = even[i].imag + t.imag;
buffer[i+n/2].real = even[i].real - t.real;
buffer[i+n/2].imag = even[i].imag - t.imag;
}
}
int main() {
int n = 8; // 输入数组长度为8
Complex buffer[n];
// 输入时域信号
for (int i = 0; i < n; i++) {
buffer[i].real = i + 1;
buffer[i].imag = 0;
}
// 执行傅里叶变换
fft(buffer, n);
// 输出频域信号
for (int i = 0; i < n; i++) {
printf("频域信号[%d]: %f + %f i\n", i, buffer[i].real, buffer[i].imag);
}
return 0;
}
```
以上代码使用递归的方式实现 FFT 算法。在主函数中,首先定义一个复数数组 `buffer`,然后将时域信号存储在其中。接着调用 `fft` 函数进行傅里叶变换。最后输出频域信号。
这是一个简化的示例,实际情况中可能需要考虑更多细节,例如输入数组的长度必须是 2 的幂次方等等。
阅读全文