00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef _GR_NCO_H_
00023 #define _GR_NCO_H_
00024
00025
00026 #include <vector>
00027 #include <gr_sincos.h>
00028 #include <cmath>
00029
00035
00036
00037 template<class o_type, class i_type>
00038 class gr_nco {
00039 public:
00040 gr_nco () : phase (0), phase_inc(0) {}
00041
00042 virtual ~gr_nco () {}
00043
00044
00045 void set_phase (double angle) {
00046 phase = angle;
00047 }
00048
00049 void adjust_phase (double delta_phase) {
00050 phase += delta_phase;
00051 }
00052
00053
00054
00055 void set_freq (double angle_rate){
00056 phase_inc = angle_rate;
00057 }
00058
00059
00060 void adjust_freq (double delta_angle_rate)
00061 {
00062 phase_inc += delta_angle_rate;
00063 }
00064
00065
00066
00067 void step ()
00068 {
00069 phase += phase_inc;
00070 if (fabs (phase) > M_PI){
00071
00072 while (phase > M_PI)
00073 phase -= 2*M_PI;
00074
00075 while (phase < -M_PI)
00076 phase += 2*M_PI;
00077 }
00078 }
00079
00080 void step (int n)
00081 {
00082 phase += phase_inc * n;
00083 if (fabs (phase) > M_PI){
00084
00085 while (phase > M_PI)
00086 phase -= 2*M_PI;
00087
00088 while (phase < -M_PI)
00089 phase += 2*M_PI;
00090 }
00091 }
00092
00093
00094 double get_phase () const { return phase; }
00095 double get_freq () const { return phase_inc; }
00096
00097
00098 void sincos (float *sinx, float *cosx) const;
00099
00100
00101 float cos () const { return std::cos (phase); }
00102 float sin () const { return std::sin (phase); }
00103
00104 protected:
00105 double phase;
00106 double phase_inc;
00107 };
00108
00109 template<class o_type, class i_type>
00110 void
00111 gr_nco<o_type,i_type>::sincos (float *sinx, float *cosx) const
00112 {
00113 gr_sincosf (phase, sinx, cosx);
00114 }
00115
00116 #endif