C语言fft绘制频谱图
时间: 2023-07-05 09:08:43 浏览: 70
要绘制频谱图,需要进行以下步骤:
1. 使用fft算法将时间域的信号转换为频域信号。
2. 计算频率轴上每个点的幅度值。
3. 将幅度值映射到图像上的像素值,绘制出频谱图。
以下是一份基于C语言实现的FFT算法代码,你可以根据自己的需求进行修改:
```c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define N 1024 //采样点数
#define PI 3.1415926535898 //圆周率
//FFT变换
void fft(double *x, double *y, int n)
{
if (n == 1)
return;
double *x1, *y1, *x2, *y2, *e, *o;
x1 = (double *)malloc(n / 2 * sizeof(double));
y1 = (double *)malloc(n / 2 * sizeof(double));
x2 = (double *)malloc(n / 2 * sizeof(double));
y2 = (double *)malloc(n / 2 * sizeof(double));
e = (double *)malloc(n / 2 * sizeof(double));
o = (double *)malloc(n / 2 * sizeof(double));
for (int i = 0; i < n / 2; i++)
{
x1[i] = x[2 * i];
y1[i] = y[2 * i];
x2[i] = x[2 * i + 1];
y2[i] = y[2 * i + 1];
}
fft(x1, y1, n / 2);
fft(x2, y2, n / 2);
for (int i = 0; i < n / 2; i++)
{
e[i] = x1[i] + x2[i] * cos(2 * PI * i / n) + y2[i] * sin(2 * PI * i / n);
o[i] = y1[i] - x2[i] * sin(2 * PI * i / n) + y2[i] * cos(2 * PI * i / n);
}
for (int i = 0; i < n / 2; i++)
{
x[i] = e[i];
y[i] = o[i];
x[i + n / 2] = e[i];
y[i + n / 2] = o[i];
}
free(x1);
free(y1);
free(x2);
free(y2);
free(e);
free(o);
}
//计算幅度谱
void calc_spectrum(double *x, double *y, double *amp, int n)
{
for (int i = 0; i < n; i++)
{
amp[i] = sqrt(x[i] * x[i] + y[i] * y[i]) / n;
}
}
int main()
{
double x[N], y[N], amp[N];
for (int i = 0; i < N; i++)
{
x[i] = sin(2 * PI * 100 * i / N) + sin(2 * PI * 200 * i / N) + sin(2 * PI * 300 * i / N);
y[i] = 0;
}
fft(x, y, N);
calc_spectrum(x, y, amp, N);
//输出幅度谱
for (int i = 0; i < N; i++)
{
printf("%d %f\n", i, amp[i]);
}
return 0;
}
```
这里我们使用了一个简单的测试信号,由三个正弦波叠加而来。运行程序后,可以得到每个频率点的幅度值,将其映射到图像上,即可得到频谱图。