fft 相位 c 代码
时间: 2024-01-09 22:04:46 浏览: 122
下面是一个简单的 FFT 相位计算的 C 代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define PI 3.14159265358979323846
void fft(double *real, double *imag, int n) {
int i, j, k;
double theta, wr, wi, tempr, tempi;
int m = log(n) / log(2);
for (i = 0; i < n; i++) {
j = 0;
for (k = 0; k < m; k++) {
j <<= 1;
j |= (i >> k) & 1;
}
if (j < i) {
tempr = real[i];
real[i] = real[j];
real[j] = tempr;
tempi = imag[i];
imag[i] = imag[j];
imag[j] = tempi;
}
}
int n2, kmax, istep;
for (int mmax = 1; mmax < n; mmax = n2) {
n2 = mmax << 1;
theta = -2 * PI / mmax;
istep = n2 << 1;
for (k = 0; k < mmax; k++) {
wr = cos(k * theta);
wi = sin(k * theta);
for (i = k; i < n; i += istep) {
j = i + mmax;
tempr = wr * real[j] - wi * imag[j];
tempi = wr * imag[j] + wi * real[j];
real[j] = real[i] - tempr;
imag[j] = imag[i] - tempi;
real[i] += tempr;
imag[i] += tempi;
}
}
}
}
int main() {
int n = 8;
double real[] = {1, 0, 2, 0, 3, 0, 4, 0};
double imag[] = {0, 0, 0, 0, 0, 0, 0, 0};
fft(real, imag, n);
for (int i = 0; i < n; i++) {
double phase = atan2(imag[i], real[i]);
printf("Phase[%d]: %f\n", i, phase);
}
return 0;
}
```
这个代码计算了一个长度为 8 的实部数组和虚部数组的 FFT,然后计算了每个频率分量的相位,并输出到控制台。你可以将其扩展到你自己的代码中。注意,这个代码只是一个简单的示例,可能需要根据你的实际需求进行修改。
阅读全文