-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathplotter.h
130 lines (109 loc) · 3.9 KB
/
plotter.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#ifndef PLOTTER_H
#define PLOTTER_H
#include <QMap>
#include <qwt5/qwt_plot.h>
#include <qwt5/qwt_plot_curve.h>
#include <qwt5/qwt_plot_grid.h>
#include <complex>
#include <fasttransforms.h>
enum PlotterMode{
REAL,
IMAG,
ABS,
LOG,
FFT,
REAL_SHIFT,
IMAG_SHIFT,
};
struct PlotterCurve{
QVector<QPointF> samples;
QwtPlotCurve curve;
};
int getNumel(alglib::complex_1d_array samples);
double getReal(alglib::complex_1d_array samples,int i);
double getImag(alglib::complex_1d_array samples,int i);
int getNumel(std::vector<std::complex<int16_t> > samples);
double getReal(std::vector<std::complex<int16_t> > samples,int i);
double getImag(std::vector<std::complex<int16_t> > samples,int i);
class Plotter : public QWidget
{
Q_OBJECT
public:
explicit Plotter(QWidget *parent = 0);
QwtPlot plot;
QwtPlotGrid grid;
QMap<QString,PlotterCurve*> curves;
QVector<QPen> pens;
void setAxisScale(int axisId, double min, double max, double step = 0);
void setAxisAutoScale(int axisId);
PlotterCurve *PlotterCurveByName(QString name);
template<typename T>
void draw(QString name,T samples,int from, int to,PlotterMode mode,double scale=1,double offset=0){
PlotterCurve *curve=PlotterCurveByName(name);
curve->samples.clear();
int numel=getNumel(samples);
int ctr,ii;
switch(mode){
case REAL:
for(int i=from;i<to;++i)
curve->samples.push_back(QPointF(i,scale*(offset+getReal(samples,i))));
break;
case IMAG:
for(int i=from;i<to;++i)
curve->samples.push_back(QPointF(i,scale*(offset+getImag(samples,i))));
break;
case ABS:
for(int i=from;i<to;++i)
curve->samples.push_back(QPointF(i,scale*(offset+std::sqrt(std::pow(getReal(samples,i),2.0)+std::pow(getImag(samples,i),2.0)))));
break;
case LOG:
for(int i=from;i<to;++i){
double val=scale*10.0*std::log(offset+std::pow(getReal(samples,i),2.0)+std::pow(getImag(samples,i),2.0));
if(val<0)val=scale;
curve->samples.push_back(QPointF(i,val));
}
break;
case FFT:
ctr=(from+to)/2;
ii=-ctr;
for(int i=ctr;i<to;++i){
double val=scale*10.0*std::log(std::sqrt(offset+std::pow(getReal(samples,i),2.0)+std::pow(getImag(samples,i),2.0)));
if(val<0)val=scale;
curve->samples.push_back(QPointF(ii++,val));
}
for(int i=from;i<ctr;++i){
double val=scale*10.0*std::log(std::sqrt(offset+std::pow(getReal(samples,i),2.0)+std::pow(getImag(samples,i),2.0)));
if(val<0)val=scale;
curve->samples.push_back(QPointF(ii++,val));
}
break;
case REAL_SHIFT:
ctr=(from+to)/2;
ii=-ctr;
for(int i=ctr;i<to;++i)
curve->samples.push_back(QPointF(ii++,scale*(offset+getReal(samples,i))));
for(int i=from;i<ctr;++i)
curve->samples.push_back(QPointF(ii++,scale*(offset+getReal(samples,i))));
break;
case IMAG_SHIFT:
ctr=(from+to)/2;
ii=-ctr;
for(int i=ctr;i<to;++i)
curve->samples.push_back(QPointF(ii++,scale*(offset+getImag(samples,i))));
for(int i=from;i<ctr;++i)
curve->samples.push_back(QPointF(ii++,scale*(offset+getImag(samples,i))));
break;
}
curve->curve.setData(curve->samples);
updatePlot();
}
template<typename T>
void draw(QString name,T samples,PlotterMode mode,double scale=1,double offset=0){
draw(name,samples,0,getNumel(samples),mode,scale,offset);
}
void addPlot(QString name, PlotterCurve *curve);
void updatePlot();
signals:
public slots:
};
#endif // PLOTTER_H