forked from analogdevicesinc/scopy
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathaverage.h
149 lines (125 loc) · 3.54 KB
/
average.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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
/*
* Copyright 2017 Analog Devices, Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with GNU Radio; see the file LICENSE. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street,
* Boston, MA 02110-1301, USA.
*/
#ifndef AVERAGE_H
#define AVERAGE_H
namespace adiscope {
class SpectrumAverage {
public:
SpectrumAverage(unsigned int data_width, unsigned int history);
virtual ~SpectrumAverage();
virtual void pushNewData(double *data) = 0;
virtual void getAverage(double *out_data,
unsigned int num_samples) const;
virtual void reset() = 0;
unsigned int dataWidth() const;
unsigned int history() const;
protected:
unsigned int m_data_width;
unsigned int m_history_size;
double *m_average;
};
class AverageHistoryOne: public SpectrumAverage
{
public:
AverageHistoryOne(unsigned int data_width, unsigned history);
virtual void reset();
protected:
bool m_anyDataPushed;
};
class AverageHistoryN: public SpectrumAverage
{
public:
AverageHistoryN(unsigned int data_width, unsigned int history);
virtual ~AverageHistoryN();
virtual void pushNewData(double *data);
virtual void reset();
protected:
double **m_history;
unsigned int m_insert_index;
unsigned int m_inserted_count;
private:
void alloc_history(unsigned int data_width, unsigned int history_size);
void free_history();
};
class PeakHoldContinuous: public AverageHistoryOne
{
public:
PeakHoldContinuous(unsigned int data_width, unsigned int history);
virtual void pushNewData(double *data);
};
class MinHoldContinuous: public AverageHistoryOne
{
public:
MinHoldContinuous(unsigned int data_width, unsigned int history);
virtual void pushNewData(double *data);
};
class ExponentialRMS: public AverageHistoryOne
{
public:
ExponentialRMS(unsigned int data_width, unsigned int history);
virtual void pushNewData(double *data);
};
class ExponentialAverage: public AverageHistoryOne
{
public:
ExponentialAverage(unsigned int data_width, unsigned int history);
virtual void pushNewData(double *data);
};
class PeakHold: public AverageHistoryN
{
public:
PeakHold(unsigned int data_width, unsigned int history);
virtual void pushNewData(double *data);
private:
double getPeakFromHistoryColumn(unsigned int col);
};
class MinHold: public AverageHistoryN
{
public:
MinHold(unsigned int data_width, unsigned int history);
virtual void pushNewData(double *data);
private:
double getMinFromHistoryColumn(unsigned int col);
};
class LinearRMS: public AverageHistoryN
{
public:
LinearRMS(unsigned int data_width, unsigned int history);
~LinearRMS();
virtual void pushNewData(double *data);
virtual void getAverage(double *out_data,
unsigned int num_samples) const;
virtual void reset();
private:
double *m_sqr_sums;
};
class LinearAverage: public AverageHistoryN
{
public:
LinearAverage(unsigned int data_width, unsigned int history);
~LinearAverage();
virtual void pushNewData(double *data);
virtual void getAverage(double *out_data,
unsigned int num_samples) const;
virtual void reset();
private:
double *m_sums;
};
} // namespace adiscope
#endif // AVERAGE_H