discuss-gnuradio
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Discuss-gnuradio] root_raised_cosine principle


From: adream
Subject: [Discuss-gnuradio] root_raised_cosine principle
Date: Mon, 1 Sep 2014 23:01:50 +0800

Hi,
   I get the source code of root_raised_cosine function in gr_firdes.cc, but I can't understand why it writes in that way, is there any paper can give me more details about the principle of root_raised_cosine
Thank you

this is the source code of root_raised_cosine
vector<float> gr_firdes::root_raised_cosine (double gain,
                   double sampling_freq,
                   double symbol_rate,
                   double alpha,
                   int ntaps)
{
  ntaps |= 1;    // ensure that ntaps is odd

  double spb = sampling_freq/symbol_rate; // samples per bit/symbol
  vector<float> taps(ntaps);
  double scale = 0;
  for(int i=0;i<ntaps;i++)
    {
      double x1,x2,x3,num,den;
      double xindx = i - ntaps/2;
      x1 = M_PI * xindx/spb;
      x2 = 4 * alpha * xindx / spb;
      x3 = x2*x2 - 1;
      if( fabs(x3) >= 0.000001 )  // Avoid Rounding errors...
    {
      if( i != ntaps/2 )
        num = cos((1+alpha)*x1) + sin((1-alpha)*x1)/(4*alpha*xindx/spb);
      else
        num = cos((1+alpha)*x1) + (1-alpha) * M_PI / (4*alpha);
      den = x3 * M_PI;
    }
      else
    {
      if(alpha==1)
        {
          taps[i] = -1;
          continue;
        }
      x3 = (1-alpha)*x1;
      x2 = (1+alpha)*x1;
      num = (sin(x2)*(1+alpha)*M_PI
         - cos(x3)*((1-alpha)*M_PI*spb)/(4*alpha*xindx)
         + sin(x3)*spb*spb/(4*alpha*xindx*xindx));
      den = -32 * M_PI * alpha * alpha * xindx/spb;
    }
      taps[i] = 4 * alpha * num / den;
      scale += taps[i];
    }

  for(int i=0;i<ntaps;i++)
    taps[i] = taps[i] * gain / scale;

  return taps;
}

reply via email to

[Prev in Thread] Current Thread [Next in Thread]