123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267 |
- /*******************************************************************************
-
- "A Collection of Useful C++ Classes for Digital Signal Processing"
- By Vinnie Falco
-
- Official project location:
- https://github.com/vinniefalco/DSPFilters
-
- See Documentation.cpp for contact information, notes, and bibliography.
-
- --------------------------------------------------------------------------------
-
- License: MIT License (http://www.opensource.org/licenses/mit-license.php)
- Copyright (c) 2009 by Vinnie Falco
-
- Permission is hereby granted, free of charge, to any person obtaining a copy
- of this software and associated documentation files (the "Software"), to deal
- in the Software without restriction, including without limitation the rights
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- copies of the Software, and to permit persons to whom the Software is
- furnished to do so, subject to the following conditions:
-
- The above copyright notice and this permission notice shall be included in
- all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- THE SOFTWARE.
-
- *******************************************************************************/
- #pragma once
-
- #include "Common.h"
- #include "Cascade.h"
- #include "Design.h"
- #include "Filter.h"
- #include "PoleFilter.h"
-
- namespace Dsp
- {
-
- /*
- * Filters with Elliptic response characteristics
- *
- */
-
- namespace Elliptic
- {
-
- // Solves for Jacobi elliptics
- class Solver
- {
- public:
- static double ellipticK(double k);
- };
-
- // Half-band analog prototype (s-plane)
-
- class AnalogLowPass : public LayoutBase
- {
- public:
- AnalogLowPass();
-
- void design(int numPoles, double rippleDb, double rolloff);
-
- private:
- void prodpoly(int sn);
- void calcfz2(int i);
- void calcfz();
- void calcqz();
- double findfact(int t);
- double calcsn(double u);
-
- #if 0
- template<int n>
- struct CalcArray
- {
- double& operator[](size_t index)
- {
- assert( index<n );
- return m_a[index];
- }
- private:
- double m_a[n];
- };
- #else
- #endif
-
- double m_p0 = 0;
- double m_q = 0;
- double m_K = 0;
- double m_Kprime = 0;
- double m_e = 0;
- int m_nin = 0;
- int m_m = 0;
- int m_n2 = 0;
- int m_em = 0;
- double m_zeros[100];
- double m_c1[100];
- double m_b1[100];
- double m_a1[100];
- double m_d1[100];
- double m_q1[100];
- double m_z1[100];
- double m_f1[100];
- double m_s1[100];
- double m_p [100];
- double m_zw1[100];
- double m_zf1[100];
- double m_zq1[100];
- double m_rootR[100];
- double m_rootI[100];
-
- int m_numPoles = 0;
- double m_rippleDb = 0;
- double m_rolloff = 0;
- };
-
- //------------------------------------------------------------------------------
-
- // Factored implementations to reduce template instantiations
-
- struct LowPassBase : PoleFilterBase<AnalogLowPass>
- {
- void setup(int order, double sampleRate, double cutoffFrequency, double rippleDb, double rolloff);
- };
-
- struct HighPassBase : PoleFilterBase<AnalogLowPass>
- {
- void setup(int order, double sampleRate, double cutoffFrequency, double rippleDb, double rolloff);
- };
-
- struct BandPassBase : PoleFilterBase<AnalogLowPass>
- {
- void setup(int order, double sampleRate, double centerFrequency, double widthFrequency, double rippleDb, double rolloff);
- };
-
- struct BandStopBase : PoleFilterBase<AnalogLowPass>
- {
- void setup(int order, double sampleRate, double centerFrequency, double widthFrequency, double rippleDb, double rolloff);
- };
-
- //------------------------------------------------------------------------------
-
- //
- // Raw filters
- //
-
- template <int MaxOrder>
- struct LowPass : PoleFilter<LowPassBase, MaxOrder> {};
-
- template <int MaxOrder>
- struct HighPass : PoleFilter<HighPassBase, MaxOrder> {};
-
- template <int MaxOrder>
- struct BandPass : PoleFilter<BandPassBase, MaxOrder, MaxOrder * 2> {};
-
- template <int MaxOrder>
- struct BandStop : PoleFilter<BandStopBase, MaxOrder, MaxOrder * 2> {};
-
- //------------------------------------------------------------------------------
-
- //
- // Gui-friendly Design layer
- //
-
- namespace Design
- {
- struct TypeIBase : DesignBase
- {
- enum
- {
- NumParams = 5
- };
-
- static int getNumParams() { return 5; }
- static ParamInfo getParamInfo_2() { return ParamInfo::defaultCutoffFrequencyParam(); }
- static ParamInfo getParamInfo_3() { return ParamInfo::defaultRippleDbParam(); }
- static ParamInfo getParamInfo_4() { return ParamInfo::defaultRolloffParam(); }
- };
-
- template <class FilterClass>
- struct TypeI : TypeIBase, FilterClass
- {
- void setParams(const Params& params) { FilterClass::setup(int(params[1]), params[0], params[2], params[3], params[4]); }
- };
-
- struct TypeIIBase : DesignBase
- {
- enum
- {
- NumParams = 6
- };
-
- static int getNumParams() { return 6; }
- static ParamInfo getParamInfo_2() { return ParamInfo::defaultCenterFrequencyParam(); }
- static ParamInfo getParamInfo_3() { return ParamInfo::defaultBandwidthHzParam(); }
- static ParamInfo getParamInfo_4() { return ParamInfo::defaultRippleDbParam(); }
- static ParamInfo getParamInfo_5() { return ParamInfo::defaultRolloffParam(); }
- };
-
- template <class FilterClass>
- struct TypeII : TypeIIBase, FilterClass
- {
- void setParams(const Params& params) { FilterClass::setup(int(params[1]), params[0], params[2], params[3], params[4], params[5]); }
- };
-
- // Factored kind and name
-
- struct LowPassDescription
- {
- static Kind getKind() { return kindLowPass; }
- static const char* getName() { return "Elliptic Low Pass"; }
- };
-
- struct HighPassDescription
- {
- static Kind getKind() { return kindHighPass; }
- static const char* getName() { return "Elliptic High Pass"; }
- };
-
- struct BandPassDescription
- {
- static Kind getKind() { return kindHighPass; }
- static const char* getName() { return "Elliptic Band Pass"; }
- };
-
- struct BandStopDescription
- {
- static Kind getKind() { return kindHighPass; }
- static const char* getName() { return "Elliptic Band Stop"; }
- };
-
- // This glues on the Order parameter
- template <int MaxOrder, template <class> class TypeClass, template <int> class FilterClass>
- struct OrderBase : TypeClass<FilterClass<MaxOrder>>
- {
- const ParamInfo getParamInfo_1() const
- {
- return ParamInfo(idOrder, "Order", "Order", 1, MaxOrder, 2, &ParamInfo::Int_toControlValue, &ParamInfo::Int_toNativeValue,
- &ParamInfo::Int_toString);
- }
- };
- //------------------------------------------------------------------------------
-
- //
- // Design filters
- //
-
- template <int MaxOrder>
- struct LowPass : OrderBase<MaxOrder, TypeI, Elliptic::LowPass>, LowPassDescription {};
-
- template <int MaxOrder>
- struct HighPass : OrderBase<MaxOrder, TypeI, Elliptic::HighPass>, HighPassDescription {};
-
- template <int MaxOrder>
- struct BandPass : OrderBase<MaxOrder, TypeII, Elliptic::BandPass>, BandPassDescription {};
-
- template <int MaxOrder>
- struct BandStop : OrderBase<MaxOrder, TypeII, Elliptic::BandStop>, BandStopDescription {};
- } // namespace Design
- } // namespace Elliptic
- } // namespace Dsp
|