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

3G开发

开发平台:

Visual C++

  1. //
  2. //  File = fir_resp.cpp
  3. //
  4. //  Member functions for class FirFilterResponse
  5. //
  6. #include <math.h>
  7. #include <stdlib.h>
  8. #include <complex.>
  9. #include "fir_resp_w_noise_bw.h"
  10. #include "typedefs.h"
  11. #include "misdefs.h"
  12. //==================================================
  13. //  constructor with all configuration parameters
  14. //  passed in as arguments
  15. //--------------------------------------------------
  16. FirFilterResponse::FirFilterResponse( FirFilterDesign *filter_design,
  17.                                       int num_resp_pts,
  18.                                       int db_scale_enabled,
  19.                                       int normalize_enabled,
  20.                                       char* resp_file_name )
  21. {
  22.  Filter_Design = filter_design;
  23.  Num_Resp_Pts = num_resp_pts;
  24.  Db_Scale_Enabled = db_scale_enabled;
  25.  Normalize_Enabled = normalize_enabled;
  26.  
  27.  if( resp_file_name == NULL)
  28.    { Response_File = new ofstream("win_resp.txt", ios::out);}
  29.  else
  30.    { Response_File = new ofstream(resp_file_name, ios::out);}
  31.    
  32.  Num_Taps = Filter_Design->GetNumTaps();
  33.  Mag_Resp = new double[Num_Resp_Pts];
  34.  return;
  35. }
  36. //===================================================================
  37. // alternate constructor with interactive setting of
  38. // configuration parameters
  39. //-------------------------------------------------------------------
  40. FirFilterResponse::FirFilterResponse( FirFilterDesign *filter_design,
  41.                                       istream& uin,
  42.                                       ostream& uout )
  43. {
  44. // bool default_file_ok;
  45.  Filter_Design = filter_design;
  46.  
  47.  uout << "number of points in plot of frequency response?" << endl;
  48.  uin >> Num_Resp_Pts;
  49.  
  50.  uout << "scaling?n"
  51.       << "  0 = linear, 1 = dB"  << endl;
  52.  uin >> Db_Scale_Enabled;
  53.   
  54.  if( Db_Scale_Enabled != 0) Db_Scale_Enabled = 1;
  55.  Normalize_Enabled = 1;
  56.   
  57. // uout << "default name for magnitude response outputn"
  58. //      << "file is win_resp.txtnn"
  59. //      << "is this okay?"
  60. //      << "  0 = NO, 1 = YES"
  61. //      << endl;
  62. // uin >> default_file_ok;
  63.   
  64. // if( default_file_ok)
  65. //    {
  66.      Response_File = new ofstream("win_resp.txt", ios::out);
  67. //    }
  68. //  else
  69. //    {
  70. //     char *file_name;
  71. //     file_name = new char[31];
  72. //     
  73. //     uout << "enter complete name for output file (30 chars max)"
  74. //          << endl;
  75. //     uin >> file_name;
  76. //     Response_File = new ofstream(file_name, ios::out);
  77. //     delete []file_name;
  78. //    } 
  79.  Num_Taps = Filter_Design->GetNumTaps();
  80.  Mag_Resp = new double[Num_Resp_Pts];
  81.  return;
  82. //==================================================
  83. //  method to compute magnitude response
  84. //--------------------------------------------------
  85. double FirFilterResponse::ComputeMagResp( void )
  86. {
  87.  int resp_indx, tap_indx;
  88.  double lambda;
  89.  std::complex<double> work;
  90.  double total_power;
  91.  double noise_equiv_bw;
  92.  double peak;
  93.  
  94.  cout << " in FirFilterResponse::ComputeMagResp" << endl;
  95.  double* coeff = Filter_Design->GetCoefficients();
  96.    total_power = 0.0;
  97.  for( resp_indx=0; resp_indx<Num_Resp_Pts; resp_indx++)
  98.    {
  99.    lambda = resp_indx * PI / (double) Num_Resp_Pts; 
  100.    work = std::complex<double>(0.0, 0.0);
  101.   
  102.    for( tap_indx=0; tap_indx<Num_Taps; tap_indx++)
  103.      {
  104.       work = work + (coeff[tap_indx] * 
  105.          std::complex<double>( cos(tap_indx*lambda), 
  106.                             -sin(tap_indx*lambda)));
  107.      }
  108.       
  109.    total_power += norm(work)*norm(work);
  110.    if(Db_Scale_Enabled)
  111.      {Mag_Resp[resp_indx] = 20.0 * log10(norm(work));}
  112.    else
  113.      {Mag_Resp[resp_indx] = norm(work);}
  114.    }
  115.  if(Normalize_Enabled) peak = NormalizeResponse();
  116.    noise_equiv_bw = total_power/(peak*peak*2*Num_Resp_Pts);
  117.  return(noise_equiv_bw);
  118. }
  119. //=======================================================
  120. //  method to normalize magnitude response
  121. //-------------------------------------------------------
  122. double FirFilterResponse::NormalizeResponse( void )
  123. {
  124.  int n;
  125.  double biggest;
  126.  double peak_response;
  127.  
  128.  if(Db_Scale_Enabled)
  129.    {
  130.     biggest = -100.0; 
  131.     
  132.     for( n=0; n < Num_Resp_Pts; n++)
  133.       {if(Mag_Resp[n]>biggest) biggest = Mag_Resp[n];}
  134.     for( n=0; n < Num_Resp_Pts; n++)
  135.       {Mag_Resp[n] = Mag_Resp[n] - biggest;}
  136.    peak_response = pow(10.0,(biggest/20.0));
  137.    }
  138.  else
  139.    {
  140.     biggest = 0.0;
  141.     
  142.     for( n=0; n < Num_Resp_Pts; n++)
  143.       {if(Mag_Resp[n]>biggest) biggest = Mag_Resp[n];}
  144.     for( n=0; n < Num_Resp_Pts; n++)
  145.       {Mag_Resp[n] = Mag_Resp[n] / biggest;}
  146.    peak_response = biggest;
  147.    }
  148.  return(peak_response);
  149. }
  150. //===============================================
  151. //  method to return a pointer to the magnitude
  152. //  response that is stored inside this class
  153. //-----------------------------------------------
  154. double* FirFilterResponse::GetMagResp( void)
  155. {
  156.  return(Mag_Resp);
  157. }
  158. //===========================================================
  159. //  method to dump magnitude response to the stream
  160. //  designated by Response_File
  161. //-----------------------------------------------------------
  162. void FirFilterResponse::DumpMagResp( void )
  163. {
  164.  double freq;
  165.  
  166.  Response_File->setf(ios::fixed, ios::floatfield);
  167.  for(int n=0; n<Num_Resp_Pts; n++)
  168.    {
  169.     //freq = (n*PI)/double(Num_Resp_Pts);
  170.     freq = n/double(2*Num_Resp_Pts);
  171.     (*Response_File) << freq << ", " 
  172.                      << Mag_Resp[n] << endl;
  173.    }
  174.  Response_File->setf(0, ios::floatfield);
  175.  return;
  176. }
  177. //=====================================================
  178. //  searches the magnitude response over the interval
  179. //  from sample intrvl_beg thru the sample intrvl_end
  180. //  and then returns the largest value found in this
  181. //  interval.
  182. //-----------------------------------------------------
  183. double FirFilterResponse::GetIntervalPeak( int nBeg,
  184.                                            int nEnd)
  185. {
  186.  double peak;
  187.  int n, indexOfPeak;
  188.  peak = -9999.0;
  189.  for(n=nBeg; n<nEnd; n++)
  190.    {
  191.     if(Mag_Resp[n]>peak)
  192.       {
  193.        peak=Mag_Resp[n];
  194.        indexOfPeak = n;
  195.       }
  196.    }
  197.  return(peak);
  198. }