Qt对复数数组求FFt并绘制图像
时间: 2024-06-06 07:11:13 浏览: 136
对数据进行fft和画图
以下是使用Qt对复数数组进行FFT并绘制图像的示例代码:
```cpp
#include <QCoreApplication>
#include <QImage>
#include <QPainter>
#include <QDebug>
#include <fftw3.h>
// 定义图像大小
const int IMAGE_WIDTH = 800;
const int IMAGE_HEIGHT = 600;
// 定义复数数组大小
const int N = 512;
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
// 初始化FFTW库
fftw_init_threads();
fftw_plan_with_nthreads(4);
// 创建输入和输出数组
fftw_complex *in = (fftw_complex*)fftw_malloc(sizeof(fftw_complex) * N);
fftw_complex *out = (fftw_complex*)fftw_malloc(sizeof(fftw_complex) * N);
// 创建正弦波信号
for (int i = 0; i < N; i++) {
in[i][0] = sin(2 * M_PI * i / N);
in[i][1] = 0;
}
// 创建FFT计算计划
fftw_plan plan = fftw_plan_dft_1d(N, in, out, FFTW_FORWARD, FFTW_ESTIMATE);
// 执行FFT计算
fftw_execute(plan);
// 创建图像对象
QImage image(IMAGE_WIDTH, IMAGE_HEIGHT, QImage::Format_RGB32);
QPainter painter(&image);
// 绘制波形图
painter.fillRect(image.rect(), Qt::white);
painter.setPen(Qt::blue);
for (int i = 0; i < N; i++) {
painter.drawLine(i * IMAGE_WIDTH / N, IMAGE_HEIGHT / 2 + in[i][0] * IMAGE_HEIGHT / 2,
(i + 1) * IMAGE_WIDTH / N, IMAGE_HEIGHT / 2 + in[(i + 1) % N][0] * IMAGE_HEIGHT / 2);
}
// 绘制频谱图
painter.setPen(Qt::red);
for (int i = 0; i < N / 2; i++) {
double freq = (double)i / N;
double mag = sqrt(out[i][0] * out[i][0] + out[i][1] * out[i][1]);
painter.drawLine(i * 2 * IMAGE_WIDTH / N, IMAGE_HEIGHT - mag * IMAGE_HEIGHT,
(i + 1) * 2 * IMAGE_WIDTH / N, IMAGE_HEIGHT - mag * IMAGE_HEIGHT);
}
// 保存图像
image.save("fft.png");
// 释放资源
fftw_destroy_plan(plan);
fftw_free(in);
fftw_free(out);
return 0;
}
```
该示例代码使用FFTW库计算FFT,并将计算结果绘制成波形图和频谱图。波形图使用蓝色绘制输入信号,在图像中间绘制。频谱图使用红色绘制FFT的幅度谱,纵坐标表示幅度,横坐标表示频率。最后将图像保存为fft.png。
运行示例代码后,将生成fft.png文件,其中包含波形图和频谱图。
![FFT图像](https://img-blog.csdnimg.cn/20211020101708201.png)
阅读全文