chebyshev_proto.cpp
上传用户:jtjnyq9001
上传日期:2014-11-21
资源大小:3974k
文件大小:3k
源码类别:

3G开发

开发平台:

Visual C++

  1. //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2. //
  3. //  File = chebyshev_proto.cpp
  4. //
  5. //  Prototype Chebyshev (Type I) Filter
  6. //
  7. #include <math.h>
  8. #include "misdefs.h"
  9. #include "parmfile.h"
  10. #include "chebyshev_proto.h"
  11. #include "filter_types.h"
  12. extern ParmFile ParmInput;
  13. #ifdef _DEBUG
  14. extern ofstream *DebugFile;
  15. #endif
  16. //======================================================
  17. //  constructor
  18. ChebyshevPrototype::ChebyshevPrototype( int filt_order,
  19.                                         double ripple,
  20.                                         bool bw_is_ripple_bw )
  21.                   :AnalogFilterPrototype( filt_order )
  22. {
  23.   Ripple = ripple;
  24.   Bw_Is_Ripple_Bw = bw_is_ripple_bw;
  25.   Bw_Is_3db_Bw = !bw_is_ripple_bw;
  26. //=========================================================
  27. //  Computes poles for normalized ChebyshevPrototype prototype
  28.   int k;
  29.   double x;
  30.   double epsilon;
  31.   double gamma;
  32.   double sigma_mult;
  33.   double omega_mult;
  34.   double a_factor, r_factor;
  35.   std::complex<double> work;
  36.   Pole_Locs = new std::complex<double>[Filt_Order+1];
  37.   Pole_Locs[0] = Filt_Order;
  38.   Num_Poles = Filt_Order;
  39.   Zero_Locs = new std::complex<double>[1];
  40.   Zero_Locs[0] = 0;
  41.   Num_Zeros = 0;
  42.   epsilon = sqrt(pow(10.0, (Ripple/10.0))-1.0);
  43.   if(Bw_Is_3db_Bw)
  44.     {
  45.     a_factor = log((1+sqrt(1.0-epsilon*epsilon))/epsilon)/Filt_Order;
  46.     r_factor = cosh(a_factor);
  47.     }
  48.   gamma = pow( (1+sqrt(1.0 + epsilon*epsilon))/epsilon,
  49.                 1.0/double(Filt_Order));
  50.   sigma_mult = ( (1.0/gamma) - gamma) / 2.0;
  51.   omega_mult = ( (1.0/gamma) + gamma) / 2.0;
  52.   for( k=1; k<=Filt_Order; k++)
  53.     {
  54.     x = PI * ((2*k)-1) / (2*Filt_Order);
  55.     Pole_Locs[k-1] = std::complex<double>( sigma_mult*sin(x), omega_mult*cos(x));
  56.     if(Bw_Is_3db_Bw) Pole_Locs[k-1] /= r_factor;
  57.     }
  58.   //-----------------------------------------
  59.   //  Compute Biquads
  60.   Num_Biquad_Sects = (Filt_Order-(Filt_Order%2))/2;
  61.   //Biquad_Coef_A = new double[Num_Biquad_Sects];
  62.   B1_Coef = new double[Num_Biquad_Sects];
  63.   B0_Coef = new double[Num_Biquad_Sects];
  64.   if(Filt_Order%2)
  65.     { // order is odd
  66.     Real_Pole = Pole_Locs[Num_Biquad_Sects].real();
  67.     }
  68.   for( k=1; k<=Num_Biquad_Sects; k++)
  69.     {
  70.     x = PI * ((2*k)-1) / (2*Filt_Order);
  71.     //Biquad_Coef_A[k-1] = 1.0;
  72.     B1_Coef[k-1] = -2.0 * sigma_mult * sin(x); 
  73.     B0_Coef[k-1] = (0.25/(gamma*gamma)) +
  74.                           gamma * gamma / 4.0 +
  75.                           0.5 * cos(2.0 * x);
  76.     }
  77.   //-----------------------------------------
  78.   //  Compute gain factor Ho
  79.   work = 1.0;
  80.   for( k=0; k<Filt_Order; k++)
  81.     {
  82.     work *= (-Pole_Locs[k]);
  83.     }
  84.   //H_Zero = std::real<double>(work);
  85.   H_Zero = work.real();
  86.   if(Filt_Order%2 == 0) // if order is even
  87.     {
  88.     H_Zero /= pow(10.0, Ripple/20.0);
  89.     }
  90.   //if(Bw_Is_3db_Bw)
  91.   //  {
  92.   //  H_Zero *= r_factor;
  93.    // }
  94.   #ifdef _DEBUG
  95.   int i;
  96.   for(i=0; i<filt_order; i++)
  97.     {
  98.     *DebugFile << "pole[" << i << "] = (" 
  99.               << Pole_Locs[i].real() << ", "
  100.               << Pole_Locs[i].imag() << ")" << endl;
  101.     }
  102.   #endif
  103.   return;
  104. }
  105. //==========================================================
  106. ChebyshevPrototype::~ChebyshevPrototype()
  107. {
  108. }