Skip to content

Commit 00c7c4e

Browse files
committed
添加数据产生C++类
1 parent 7100956 commit 00c7c4e

File tree

2 files changed

+138
-0
lines changed

2 files changed

+138
-0
lines changed
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
//
2+
// Created by rookie on 2025/12/3.
3+
//
4+
5+
#include "DataGenerator.h"
6+
7+
8+
QVector<double> DataGenerator::xData() const {
9+
QReadLocker locker(&m_lock);
10+
return m_xData;
11+
}
12+
13+
QVector<double> DataGenerator::yData() const {
14+
QReadLocker locker(&m_lock);
15+
return m_yData;
16+
}
17+
18+
bool DataGenerator::isRunning() const {
19+
return m_timer->isActive();
20+
}
21+
22+
Q_INVOKABLE void DataGenerator::start() {
23+
if (!m_timer->isActive()) {
24+
m_timer->start();
25+
emit runningChanged(true);
26+
generateData();
27+
}
28+
}
29+
30+
Q_INVOKABLE void DataGenerator::stop() {
31+
if (m_timer->isActive()) {
32+
m_timer->stop();
33+
emit runningChanged(false);
34+
}
35+
}
36+
37+
Q_INVOKABLE void DataGenerator::setParameters(double sineFreq, double sineAmp, double noiseAmp) {
38+
QWriteLocker locker(&m_lock);
39+
m_sineFrequency = sineFreq;
40+
m_sineAmplitude = sineAmp;
41+
m_noiseAmplitude = noiseAmp;
42+
}
43+
44+
void DataGenerator::generateData() {
45+
QWriteLocker locker(&m_lock);
46+
47+
m_xData.clear();
48+
m_yData.clear();
49+
50+
double dt = 1.0 / m_sampleRate;
51+
52+
for (int i = 0; i < m_sampleRate; ++i) {
53+
double t = i * dt;
54+
55+
double sineValue = m_sineAmplitude * std::sin(2 * M_PI * m_sineFrequency * t);
56+
57+
double randomValue = (QRandomGenerator::global()->generateDouble() - 0.5) * 2.0;
58+
double noiseValue = m_noiseAmplitude * randomValue;//-0.03~0.03
59+
60+
m_xData.append(t);
61+
m_yData.append(sineValue + noiseValue);
62+
}
63+
64+
emit dataUpdated();
65+
}
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
//
2+
// Created by rookie on 2025/12/3.
3+
//
4+
5+
#ifndef DATAGENERATOR_H
6+
#define DATAGENERATOR_H
7+
8+
9+
#include <QObject>
10+
#include <QVector>
11+
#include <QTimer>
12+
#include <QRandomGenerator>
13+
#include <QReadWriteLock>
14+
#include <cmath>
15+
#include <QDateTime>
16+
17+
class DataGenerator : public QObject {
18+
Q_OBJECT
19+
Q_PROPERTY(QVector<double> xData READ xData NOTIFY dataUpdated)
20+
Q_PROPERTY(QVector<double> yData READ yData NOTIFY dataUpdated)
21+
Q_PROPERTY(bool running READ isRunning NOTIFY runningChanged)
22+
23+
public:
24+
explicit DataGenerator(QObject *parent = nullptr)
25+
: QObject(parent), m_timer(new QTimer(this)) {
26+
27+
m_timer->setInterval(50);
28+
connect(m_timer, &QTimer::timeout, this, &DataGenerator::generateData);
29+
30+
m_sampleRate = 20000.0;
31+
m_sineFrequency = 2.0; //Hz
32+
m_sineAmplitude = 1.5;
33+
m_noiseAmplitude = 0.03;
34+
35+
m_xData.reserve(m_sampleRate);
36+
m_yData.reserve(m_sampleRate);
37+
}
38+
39+
~DataGenerator() override {
40+
stop();
41+
}
42+
QVector<double> xData() const;
43+
QVector<double> yData() const;
44+
bool isRunning() const;
45+
46+
47+
public slots:
48+
Q_INVOKABLE void start();
49+
Q_INVOKABLE void stop();
50+
Q_INVOKABLE void setParameters(double sineFreq, double sineAmp, double noiseAmp);
51+
52+
signals:
53+
void dataUpdated();
54+
void runningChanged(bool running);
55+
56+
private slots:
57+
void generateData();
58+
59+
private:
60+
double m_sampleRate;
61+
double m_sineFrequency;
62+
double m_sineAmplitude;
63+
double m_noiseAmplitude;
64+
65+
QVector<double> m_xData;
66+
QVector<double> m_yData;
67+
68+
QTimer *m_timer;
69+
mutable QReadWriteLock m_lock;
70+
};
71+
72+
73+
#endif //DATAGENERATOR_H

0 commit comments

Comments
 (0)