项目【QT5.13频谱分析软件】(四)——数据动态波形显示

 

当数据读取完毕后,我们要将数据描绘成波形并动态的显示出来。

线程读取完Excel表格数据后,发送request信号,触发槽函数showData(),此槽函数首先在chart上初始化前1024个点。

connect(&m_thread, &threadReadData::request, this, &MainWindow::showData);
void MainWindow::showData(const QVariant var)
{
//    QList<QList<QVariant>> excel_list;//用于将QVariant转换为Qlist的二维数组
    QVariantList varRows=var.toList();
    if(varRows.isEmpty())
    {
        QMessageBox::information(nullptr, "错误", "数据表格为空,\n请重新选择!",
                                 QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);
        ui->actionOpen->setEnabled(true);
        progressBarValue = 0;
        ui->progressBar->setValue(progressBarValue);
        progressBarTimer.stop();
        return;
    }
    const int row_count = varRows.size();
    qDebug()<<row_count;
    ui->labelRows->setNum(row_count);
​
    QString str = QString::number(row_count, 10);
    ui->lineEditEnd->setText(str);
    ui->lineEditEnd->setEnabled(false);
    max_count = row_count;
    QVariantList rowData;
​
    excel_list.clear();
    for(int i=0;i<row_count;++i)
    {
        rowData = varRows[i].toList();
        excel_list.push_back(rowData);
    }//转换完毕
//    qDebug()<<excel_list.at(2).at(2).toDouble();
​
​
    progressBarValue = 100; //数据读取完成,进度条显示100%
​
    ui->checkBoxLP->setEnabled(true);
    ui->checkBoxBP->setEnabled(true);
    ui->checkBoxHP->setEnabled(true);
​
    m_buffer.reserve(1000);
    for (int i = 0; i < 1000; ++i)
        m_buffer.append(QPointF(i, 0));
​
    for(int i = 0; i < 1000; i++)
    {
        m_buffer[i].setY(excel_list.at(i).at(2).toDouble());
    }
    chartData->m_series->replace(m_buffer);
}

在主函数中建立定时器信号槽机制,由开始按钮触发定时器,当点击按钮时,定时器开始刷新波形。

connect(&chartDataTimer, &QTimer::timeout, this, &MainWindow::handleTimeout);
chartDataTimer.setInterval(mscChanged);

开始按钮打开定时器函数

void MainWindow::on_actionStart_triggered()
{
    ui->actionOpen->setEnabled(false);
    ui->actionStart->setEnabled(false);
    ui->actionPause->setEnabled(true);
    ui->actionStop->setEnabled(false);
    ui->actionForward->setEnabled(true);
    ui->actionBackward->setEnabled(true);
​
    chartDataTimer.start();
}

定时器触发槽函数handleTimeout(),此函数负责刷新波形

void MainWindow::handleTimeout()
{
    qreal x = chartData->plotArea().width() / chartData->m_axisX->tickCount();
​
    m_buffer.reserve(100);
​
    if(1000 + 100 * chartDataCount >= max_count - 100)  //防止数据溢出
    {
        chartDataTimer.stop();
        return;
    }
    for (int i = 1000+100*chartDataCount; i < 1000+100*(chartDataCount+1); ++i)
    {
        m_buffer.append(QPointF(i, 0));
    }
​
    for (int i = 1000+100*chartDataCount; i < 1000+100*(chartDataCount+1); ++i)
    {
        m_buffer[i].setY(excel_list.at(i).at(2).toDouble());
    }
    chartData->m_series->replace(m_buffer);
    chartData->scroll(x, 0);
​
    QVector<Complex> inVec(1024);
    QVector<Complex> outVec(1024);
    qreal temp[512], mymax, mymin;
​
​
    for (int i = 0+100*chartDataCount; i < 1024+100*chartDataCount; i++)
            inVec[i-100*chartDataCount].rl = excel_list.at(i).at(2).toDouble();
    myfft.fft1(inVec, 1024, outVec);
    m_bufferFFT.reserve(512);
    for (int i = 0; i < 512; i++)
    {
        m_bufferFFT.append(QPointF(i, 0));
        temp[i] = qAbs(outVec[i].rl);
    }
    mymax = *max_element(temp, temp + 512);
    mymin = *min_element(temp, temp + 512);
​
    for(int i = 0; i < 512; i++)
    {
        m_bufferFFT[i].setY((temp[i] - mymin) / (mymax - mymin));
    }
​
    QString _valueLP = ui->lineEditLP->text();
    QString _valueHP = ui->lineEditHP->text();
    int valueLP = _valueLP.toInt();
    int valueHP = _valueHP.toInt();
​
    if(ui->checkBoxLP->isChecked() == true)
    {
        for(int i = valueLP; i < 512; i++)
        {
            m_bufferFFT[i].setY(0);
        }
    }
    if(ui->checkBoxBP->isChecked() == true)
    {
        for(int i = 0; i < valueLP; i++)
        {
            m_bufferFFT[i].setY(0);
        }
        for(int i = valueHP; i < 512; i++)
        {
            m_bufferFFT[i].setY(0);
        }
    }
    if(ui->checkBoxHP->isChecked() == true)
    {
        for(int i = 0; i < valueHP; i++)
        {
            m_bufferFFT[i].setY(0);
        }
    }
    m_bufferFFT[0].setY(0); //去除直流分量
    chartFFT->m_series->replace(m_bufferFFT);
    m_bufferFFT.clear();
​
    chartDataCount++;
}

至此,数据波形的动态显示就完成了。

  • 6
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 34
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 34
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白技术栈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值