QT5 使用QCustomplot绘制频谱瀑布图并封快速傅里叶变换fft类

QT5 使用QCustomplot绘制频谱瀑布图并封快速傅里叶变换fft类近期想要做个上位机显示SDR设备的信号频谱,频谱瀑布图展示最为直观,经过多方评估比较最后选择了QCustomsplot图形库,相比于其他选择比如修改RGB像素刷新图片来说这种方式要简单的多,先做了个demo出来试试效果,话不多说先上动图。下面介绍方方法:第一步,QT没有自带QCustomplot库需要自行下载,实际上就是一个qcustomplot.h和qcustomplot.cpp文件,添加进工程就可以了,不想下载的后面我会上传de…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

         近期想要做个上位机显示SDR设备的信号频谱,频谱瀑布图展示最为直观,经过多方评估比较最后选择了QCustomsplot图形库,相比于其他选择比如修改RGB像素刷新图片来说这种方式要简单的多,先做了个demo出来试试效果,话不多说先上动图。

          QT5 使用QCustomplot绘制频谱瀑布图并封快速傅里叶变换fft类  

下面介绍方方法:

第一步,QT没有自带QCustomplot库需要自行下载,实际上就是一个qcustomplot.h和qcustomplot.cpp文件,添加进工程就可以了,不想下载的后面我会上传demo工程里面就包含有这连个文件。

第二步,绘制最上边瀑布图界面分三步

                1,.ui中拖入QWidget控件  2,控件提升为qcustomplot类,3,编写初始化以及显示代码

                初始化及刷新代码如下:其中F_domain_init()为初始化窗口,F_Show()为刷新窗口

void MainWindow::F_domain_init()
{
    fp3 = ui->widget; //创建一个画图指针
    fp3->setInteractions(QCP::iRangeDrag|QCP::iRangeZoom);//可拖拽+可滚轮缩放
    m_pColorMap = new QCPColorMap(fp3->xAxis,fp3->yAxis);
    m_pColorMap->data()->setSize(xlength+1,51);//设置整个图(x,y)点数
    m_pColorMap->data()->setRange(QCPRange(0,xlength),QCPRange(0,100));//setRange是设置X轴以及Y轴的范围
    m_pColorMap->setGradient(QCPColorGradient::gpJet);//设置默认渐进色变化(可在QCPColorGradient中查看)
    m_pColorMap->rescaleDataRange(true);
   // 立即刷新图像
    fp3->rescaleAxes();//自适应大小
   // ui->widget->replot();
}
void MainWindow::F_show(QVector<double> data)   //显示lofar瀑布图
{
    if(value_lofar.size()>49)
    {
        value_lofar.removeLast();  //当lofar累积到了50个,删除最后面的数据,防止绘图溢出绘图区域
    }
    value_lofar.prepend(data);//新来的数据一直往前面累加
    for (int i=0;i<value_lofar.size();i++)
    {
        for(int j=0;j<xlength;j++)
        {
            m_pColorMap->data()->setCell(j,i,value_lofar[i][j]);
        }
    }
    m_pColorMap->rescaleDataRange(true);
    fp3->rescaleAxes();//自适应大小
    ui->widget->replot();
}

第三步,绘制中间柱状离谱界面也有三步

                1,.ui中再拖入QWidget控件  2,控件提升为qcustomplot类,3,编写初始化以及显示代码

                初始化及刷新代码如下:其中Bars_domain_init()为初始化窗口,Bars_Show()为刷新窗口

void MainWindow::Bars_domain_init()
{
    QCPAxis *keyAxis = ui->widget_QCPBars->xAxis;
    QCPAxis *valueAxis = ui->widget_QCPBars->yAxis;
    fossil = new QCPBars(keyAxis, valueAxis);  // 使用xAxis作为柱状图的key轴,yAxis作为value轴

    fossil->setAntialiased(false); // 为了更好的边框效果,关闭抗齿锯
    fossil->setName("Fossil fuels"); // 设置柱状图的名字,可在图例中显示
    fossil->setPen(QPen(QColor(0, 168, 140).lighter(130))); // 设置柱状图的边框颜色
    fossil->setBrush(QColor(0, 168, 140));  // 设置柱状图的画刷颜色


    keyAxis->setRange(0, xlength);               // 设置范围
    keyAxis->setUpperEnding(QCPLineEnding::esSpikeArrow);
    valueAxis->setRange(0, 100);
}
void MainWindow::Bars_show(QVector<double> fossilData)
{
    QVector<double> ticks;
    for(int i=1;i<=xlength;i++)
    {
        ticks <<  i;
    }
    fossil->setData(ticks,fossilData);
    ui->widget_QCPBars->replot();
}

第四步,绘制最下边时域界面还是三步

                1,.ui中再拖入QWidget控件  2,控件提升为qcustomplot类,3,编写初始化以及显示代码

                初始化及刷新代码如下:其中T_domain_init()为初始化窗口,T_Show()为刷新窗口

void MainWindow::T_domain_init()
{
    CustomPlot->addGraph();
    CustomPlot->graph(0)->setPen(QPen(Qt::red));

    //CustomPlot->xAxis->setLabel("t");
    //CustomPlot->yAxis->setLabel("mV");

    CustomPlot->xAxis->setRange(0,xlength);
    CustomPlot->yAxis->setRange(0,100);
    CustomPlot->replot();
}
void MainWindow::T_Show(QVector<double> data)
{
    QVector<double> xx;
    for(int i=0;i<xlength;i++)
    {
        xx <<i;
    }
    CustomPlot->graph(0)->setData(xx,data);
    CustomPlot->replot();
}

完成以上四步后 三个显示画面就已经有了,怎样显示数据呢,且听下回分解。。。。。哈哈哈哈

第五步,定时刷新显示数据

          起个定时器就三行代码我就不写了,直接写刷新函数updata()

void MainWindow::update()
{
    QVector<double> data;
     static double f = qrand()%100;
    f = f +2;
    for(int i=0;i<xlength;i++)
    {
        data << 50+50*sin(2*3.14159*f*i/128);
    }
    fft.fft_data.clear();
    fft.fft_calculate(data);
    F_show(fft.fft_data);
    Bars_show(fft.fft_data);
    T_Show(data);

}

这个函数里边的内容我略微介绍下,首先产生要刷新的data数据,数据类型QVector<double>,长度xlength。我的应用是要计算fft所以我封装了FFT类计算频谱,不需要的直接将data传递给 F_show(); Bars_show();T_Show()这兄弟三个就可以,忽略fft_calculate()函数。

OK,以上就是完成开头动图展示的有需要的代码片段,需要完整工程的留邮箱,有CSDN积分的支持下:点击这里下载demo ,没有积分的话github自行下载吧:Github链接

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/181390.html原文链接:https://javaforall.net

(1)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 解决libssl.so.1.0.0 => not found以及libcrypto.so.1.0.0 => not found

    解决libssl.so.1.0.0 => not found以及libcrypto.so.1.0.0 => not found现在的apt源中,libssl1.0的版本一般是libssl1.0.2,libcrypto1.0的版本一般是libcrypto1.0.2。但是很多应用要使用libssl.so.1.0.0和libcrypto.so.1.0.0。试过软链接,但是没用。所以只好手动下载它们的安装包了。下载地址:https://packages.debian.org/search?suite=jessie&……

    2022年6月29日
    228
  • Cookies的实际存储位置

    Cookies的实际存储位置

    2021年10月12日
    54
  • 多行注释快捷键_jsp注释快捷键

    多行注释快捷键_jsp注释快捷键1、Pycharm同时编辑多行:alt+shift+ctral+鼠标左键2、Pycharm同时多行注释:多行选中后ctrl+\

    2022年8月28日
    7
  • virsh console 进不去虚拟机_virsh 命令

    virsh console 进不去虚拟机_virsh 命令参考自链接http://www.2cto.com/os/201411/354288.html下的文章,感谢作者,自己整理备份,以备查用。问题描述:       先执行命令virshstartmycentos,启动虚拟机。       当执行命令virshconsolemycentos后出现如下显示:       virshconsolemycentos

    2022年8月12日
    7
  • centos7怎么装系统_centos配置jdk环境变量

    centos7怎么装系统_centos配置jdk环境变量1.先查看是否安装了openjdk(两种方法)①在命令窗口键入:java -version②在命令窗口键入:rpm -qa | grep java2.在物理机下载的jdk安装包,后缀名是rpm3. 安装命令:rpm -ivh jdk-8u171-linux-x64.rpm4.配置JDK环境:vi /etc/profile#set java environmentJAVA_HOME=/usr/jav…

    2022年8月18日
    14
  • 免费申请国外免费域名超详细教程

    免费申请国外免费域名超详细教程1.首先申请免费域名网站:https://my.freenom.com/domains.php2.填入域名,这里我们以xcflag为列(尽量选择复杂一点的或者五个字母以上的域名,因为简单的有些域名是需要收费的),点击检查可用性。3.可以看到很多免费的域名(用的谷歌翻译插件,翻译有时候不是很准确,free翻译过来应该是免费而不是自由,之后会写一些关于谷歌插件的笔记,详细讲解)4.我们选择xcflag.tk点击立即获取,稍等一会点击购物车查看绿色按钮5.默认三个月试用,这里下拉框我们选择十二个月

    2022年6月30日
    65

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号