频谱图,又称光谱图,显示了信号的频谱强度随时间的变化,不同的强度采用不同的颜色显示,呈线性映射关系。在频谱图上,横轴表示频率,纵轴表示时间,每个点用不同颜色表示信号的强度。

在项目中遇到需要用Qt来实现频谱图绘制,数据每隔1秒发一批,每批数据包含不同频率对应的信号强度,频率最大到23300Hz,同时需要记录过去360秒的数据,最终程序需要运行在国产目标机上。

分析一下,需要建立坐标系来绘制,横轴有23300个维度,纵轴有360个维度,图上有23300×360=8388000个点,每秒更新一次。

实现方法有很多种,可以用QPainter、paintGL、QChart、QCustomPlot等,不同方法各有利弊,比如用QPainter实现的话性能较差,容易卡死;paintGL需要依赖OpenGL环境,国产机不一定支持;QChart只支持Qt5.7之后的版本;QCustomPlot功能强大,性能较好,而且开源,但是封装程度高,自由度小,可扩展接口较少。

这里提供另一种实现方法:

用QImage实时存储并显示,将信号强度对应的颜色存储到QImage中,每次更新时去掉第一个横向维度的数据,在最后添加一个横向维度的数据,组成新的图片更新显示。实测效果还不错,性能优良。

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QTimer>namespace Ui {
class Widget;
}class Widget : public QWidget
{Q_OBJECTpublic:explicit Widget(QWidget *parent = 0);~Widget();protected:void initSetting();     // 初始化设置图片参数QRgb getRgb();          // 获取每个像素点的rgb(可自定义)void showToLabel();     // 图片显示到界面protected slots:void updateImage();     // 定时器更新图片private:Ui::Widget *ui;QImage m_image;     // 图片int m_width;        // 宽度int m_height;       // 高度
};#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);// 定时器QTimer *timer = new QTimer(this);connect(timer, SIGNAL(timeout()), this, SLOT(updateImage()));timer->start(1000);// 初始化设置initSetting();
}Widget::~Widget()
{delete ui;
}void Widget::initSetting()
{m_width = 23300;m_height = 360;m_image = QImage(m_width, m_height, QImage::Format_RGB32);for (int i = 0; i < m_width; ++i){for (int j = 0; j < m_height; ++j){m_image.setPixel(QPoint(i, j), qRgb(21, 197, 212));     // 设置默认的背景颜色}}showToLabel();
}QRgb Widget::getRgb()
{// 自定义强度和颜色的映射关系,暂用随机数int a = qrand() % 256;int b = qrand() % 256;int c = qrand() % 256;return qRgb(a, b, c);
}void Widget::showToLabel()
{// 显示到labelint pxWidth = this->width(), pxHeight = this->height();QImage imageTemp = m_image.scaled(pxWidth, pxHeight);QPixmap pixmap;pixmap.convertFromImage(imageTemp);ui->label->setPixmap(pixmap);
}void Widget::updateImage()
{// 注:copy和setPixel接口的x和y指的是第x列,第y行QImage tempImage = m_image.copy(0, -1, m_width, m_height);      // 复制上一时刻背景,去掉最后一行,保留第一行为空(空即为黑色)for (int i = 0; i < m_width; ++i)       // 第一行赋值新的rgbtempImage.setPixel(QPoint(i, 0), getRgb());m_image = tempImage;showToLabel();
}

运行效果:

Qt QImage实现频谱图绘制相关推荐

  1. Qt Charts 动态实时折线图绘制

    在Qt Charts发布之前, Qt比较著名两个画图插件是 qwt和Qcustom, 其中Qcustom较轻量,只需要在project 中包含qcustomplot.h 和 qcustomplot.c ...

  2. 基于C++ 、 QT的可视化NS图绘制软件

    目录 一.项目介绍: 二.软件运行截图: 三.源码分享 一.项目介绍: 通过人机界面,能够绘制包含顺序型.选择型和WHILE重复型的NS图,为每个类型的NS图自带的数据可以输入C语言源代码文本,各类型 ...

  3. QT 借助 图表 实现音频频谱的绘制

    1.前言 因为项目需要,要将音频播放并且实时展现其频谱图.项目中需要解析频谱数据,涉及到相关算法问题.所以博主没有采用网络上QT用QPainter库绘制频谱,而是采用了QChart来绘制频谱. 2.效 ...

  4. html音乐播放器 频谱,HTML5 Canvas 实现简易 绘制音乐环形频谱图

    0.启发 在B站我们有很多的小伙伴们应该都看到过用AE做的可视化音乐播放器播放音乐的视频,看着特别酷炫带感有木有. B站截图 B站截图 B站截图 所以今天我就用 Canvas 做个简单 环形频谱图. ...

  5. php绘制频谱图,H5的Canvas如何实现绘制音乐环形频谱图

    这次给大家带来H5的Canvas如何实现绘制音乐环形频谱图,H5Canvas实现绘制音乐环形频谱图的注意事项有哪些,下面就是实战案例,一起来看一下. 在B站我们有很多的小伙伴们应该都看到过用AE做的可 ...

  6. qcustomplot绘制实时波形图(频谱图、瀑布图、星座图)并开启opengl支持

    先简单介绍一下,绘制实时数据波形图,我们一般使用到的库有qwt.qcustomplot以及官方的QtCharts模块. qwt这个库安装比较麻烦,界面老旧,不过功能比较全. qcustomplot很精 ...

  7. 不愧是摸鱼高手Python matplotlib 绘制频谱图都会,能怪老板不管

    复习回顾 matplotlib 是Python专门用来绘制渲染的模块,其底层主要分为脚本层.美工层和后端.脚本层为我们提供常见图形绘制如折线.柱状.直方.饼图.以往文章 这么详细的Python mat ...

  8. 2021-02-28 Matlab绘制短时傅里叶变换的频谱图和时间-频率-幅值三维图

    Matlab绘制短时傅里叶变换的频谱图和时间-频率-幅值三维图 function [t,frequency,f_spectrum]=fft_s(y,windowlength,Fs) % 输入 : % ...

  9. matlab相关性分析频谱_利用Matlab绘制正弦信号的频谱图并做相关分析[共6页]

    <利用Matlab绘制正弦信号的频谱图并做相关分析[共6页]>由会员分享,可在线阅读,更多相关<利用Matlab绘制正弦信号的频谱图并做相关分析[共6页](6页珍藏版)>请在人 ...

  10. 信源编码作业(1)——绘制并分析清浊音频谱图

    浊音 以a.o为例绘制相应频谱图 浊音 时域 频域 a o 结论: 1.时域波形呈现明显的周期特征. 2.频域在3kHz一下有多处明显波峰. 清音 以p.t为例绘制相应频谱图 清音 时域 频域 p t ...

最新文章

  1. wxWidgets3.0.2媒体播放器
  2. java mysql访问类_java 访问数据库公共类
  3. unix与linux的区别_Linux与Unix:有什么区别?
  4. java之单例设计模式
  5. IOS用标签显示滑块的值
  6. process_创建进程
  7. 边界安全 - CDN/DMZ/网络协议
  8. 不敢相信?System.currentTimeMillis() 居然存在性能问题
  9. 五款PC端小说阅读器 readbook、非常酷阅读器、iSilo、AlReader、haalireader
  10. 乌龟Git误点跳过工作树的解决方法
  11. 小学计算机说课稿,小学优秀信息技术说课稿
  12. ubuntu20.04下编译rovio代码报“undefined reference to ‘__glew***‘“
  13. 2021-04-17
  14. 1000亿资本“壕掷”!乡村旅游迎来黄金时代?
  15. BZOJ4987:Tree(树形DP)
  16. CASIA-B步态数据集的一些粗糙理解
  17. ueditor如何改变图片大小等比缩放
  18. SAP FAGLGVTR 总账科目年末结转
  19. 520告白网站的搭建
  20. okhttp的应用详解与源码解析--http的发展史

热门文章

  1. 证件照素材大合集(全网最全版本),满足证件照的一切需求!
  2. 在html中图文结合的怎么写,字形合一,网页设计中的图文配
  3. 如何设置论文目录左对齐?
  4. python将图片转换成手绘_利用Python生成手绘效果的图片
  5. java dos攻击 异常_HashMap出现Hash DOS攻击的问题
  6. 【Magick++透明图层合并】
  7. php实现图片去除水印,PHP实现水印图片
  8. HTML跳转下一行快捷键,wps常用快捷键有哪些?
  9. 使用application对象实现网站访问量统计
  10. NBA比赛数据table表格