Open Ephys GUI
 All Classes Functions Variables
Params.h
1 /*******************************************************************************
2 
3 "A Collection of Useful C++ Classes for Digital Signal Processing"
4  By Vincent Falco
5 
6 Official project location:
7 http://code.google.com/p/dspfilterscpp/
8 
9 See Documentation.cpp for contact information, notes, and bibliography.
10 
11 --------------------------------------------------------------------------------
12 
13 License: MIT License (http://www.opensource.org/licenses/mit-license.php)
14 Copyright (c) 2009 by Vincent Falco
15 
16 Permission is hereby granted, free of charge, to any person obtaining a copy
17 of this software and associated documentation files (the "Software"), to deal
18 in the Software without restriction, including without limitation the rights
19 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
20 copies of the Software, and to permit persons to whom the Software is
21 furnished to do so, subject to the following conditions:
22 
23 The above copyright notice and this permission notice shall be included in
24 all copies or substantial portions of the Software.
25 
26 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
27 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
28 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
29 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
30 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
31 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
32 THE SOFTWARE.
33 
34 *******************************************************************************/
35 
36 #ifndef DSPFILTERS_PARAMS_H
37 #define DSPFILTERS_PARAMS_H
38 
39 #include "Common.h"
40 #include "Types.h"
41 
42 namespace Dsp {
43 
44 /*
45  * System for abstracting parameterizable filter specifications.
46  *
47  * This provides a "GUI-friendly" layer to the filters. Note that
48  * it is not necessary to use this layer, it is possible to instantiate
49  * the filters and their associated processing state directly,
50  * and bypass the overhead for this API if it is not needed.
51  *
52  */
53 
54 // Unique IDs to help identify parameters
55 enum ParamID
56 {
57  idSampleRate,
58  idFrequency,
59  idQ,
60  idBandwidth,
61  idBandwidthHz,
62  idGain,
63  idSlope,
64  idOrder,
65  idRippleDb,
66  idStopDb,
67  idRolloff,
68 
69  idPoleRho,
70  idPoleTheta,
71  idZeroRho,
72  idZeroTheta,
73 
74  idPoleReal,
75  idZeroReal
76 };
77 
78 enum
79 {
80  maxParameters = 8
81 };
82 
83 struct Params
84 {
85  void clear ()
86  {
87  for (int i = 0; i < maxParameters; ++i)
88  value[i] = 0;
89  }
90 
91  double& operator[] (int index)
92  {
93  return value[index];
94  }
95 
96  const double& operator[] (int index) const
97  {
98  return value[index];
99  }
100 
101  double value[maxParameters];
102 };
103 
104 //
105 // Provides meta-information about a filter parameter
106 // to achieve run-time introspection.
107 //
109 {
110 public:
111  typedef double (ParamInfo::*toControlValue_t) (double) const;
112  typedef double (ParamInfo::*toNativeValue_t) (double) const;
113  typedef std::string (ParamInfo::*toString_t) (double) const;
114 
115  // dont use this one
116  ParamInfo (); // throws std::logic_error
117 
118  ParamInfo (ParamID id,
119  const char* szLabel,
120  const char* szName,
121  double arg1,
122  double arg2,
123  double defaultNativeValue,
124  toControlValue_t toControlValue_proc,
125  toNativeValue_t toNativeValue_proc,
126  toString_t toString_proc)
127  : m_id (id)
128  , m_szLabel (szLabel)
129  , m_szName (szName)
130  , m_arg1 (arg1)
131  , m_arg2 (arg2)
132  , m_defaultNativeValue (defaultNativeValue)
133  , m_toControlValue (toControlValue_proc)
134  , m_toNativeValue (toNativeValue_proc)
135  , m_toString (toString_proc)
136  {
137  }
138 
139  // Used to identify well-known parameters (like cutoff frequency)
140  ParamID getId () const
141  {
142  return m_id;
143  }
144 
145  // Returns a short label suitable for placement on a control
146  const char* getLabel () const
147  {
148  return m_szLabel;
149  }
150 
151  // Returns the full name
152  const char* getName () const
153  {
154  return m_szName;
155  }
156 
157  double getDefaultValue () const
158  {
159  return m_defaultNativeValue;
160  }
161 
162  //
163  // Control value is always in the range [0..1]
164  //
165  double toControlValue (double nativeValue) const
166  {
167  return (this->*m_toControlValue) (nativeValue);
168  }
169 
170  //
171  // Native value is in filter-specific units. For example,
172  // cutoff frequency would probably be in Hertz.
173  //
174  double toNativeValue (double controlValue) const
175  {
176  return (this->*m_toNativeValue) (controlValue);
177  }
178 
179  std::string toString (double nativeValue) const
180  {
181  return (this->*m_toString) (nativeValue);
182  }
183 
184  double clamp (double nativeValue) const;
185 
186  //
187  // These routines are used as function pointers when
188  // constructing the various ParamInfo used by filters
189  //
190 
191  double Int_toControlValue (double nativeValue) const;
192  double Int_toNativeValue (double controlValue) const;
193 
194  double Real_toControlValue (double nativeValue) const;
195  double Real_toNativeValue (double controlValue) const;
196 
197  double Log_toControlValue (double nativeValue) const;
198  double Log_toNativeValue (double controlValue) const;
199 
200  double Pow2_toControlValue (double nativeValue) const;
201  double Pow2_toNativeValue (double controlValue) const;
202 
203  std::string Int_toString (double nativeValue) const;
204  std::string Hz_toString (double nativeValue) const;
205  std::string Real_toString (double nativeValue) const;
206  std::string Db_toString (double nativeValue) const;
207 
208  //
209  // Creates the specified ParamInfo
210  //
211 
212  static ParamInfo defaultSampleRateParam ();
213  static ParamInfo defaultCutoffFrequencyParam ();
214  static ParamInfo defaultCenterFrequencyParam ();
215  static ParamInfo defaultQParam ();
216  static ParamInfo defaultBandwidthParam ();
217  static ParamInfo defaultBandwidthHzParam ();
218  static ParamInfo defaultGainParam ();
219  static ParamInfo defaultSlopeParam ();
220  static ParamInfo defaultRippleDbParam ();
221  static ParamInfo defaultStopDbParam ();
222  static ParamInfo defaultRolloffParam ();
223  static ParamInfo defaultPoleRhoParam ();
224  static ParamInfo defaultPoleThetaParam ();
225  static ParamInfo defaultZeroRhoParam ();
226  static ParamInfo defaultZeroThetaParam ();
227  static ParamInfo defaultPoleRealParam ();
228  static ParamInfo defaultZeroRealParam ();
229 
230 private:
231  ParamID m_id;
232  const char* m_szLabel;
233  const char* m_szName;
234  double m_arg1;
235  double m_arg2;
236  double m_defaultNativeValue;
237  toControlValue_t m_toControlValue;
238  toNativeValue_t m_toNativeValue;
239  toString_t m_toString;
240 };
241 
242 }
243 
244 #endif