gr_vco.h
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef _GR_VCO_H_
00023 #define _GR_VCO_H_
00024
00025
00026 #include <vector>
00027 #include <gr_sincos.h>
00028 #include <cmath>
00029 #include <gr_complex.h>
00030
00036
00037
00038 template<class o_type, class i_type>
00039 class gr_vco {
00040 public:
00041 gr_vco () : d_phase (0) {}
00042
00043 virtual ~gr_vco () {}
00044
00045
00046 void set_phase (double angle) {
00047 d_phase = angle;
00048 }
00049
00050 void adjust_phase (double delta_phase) {
00051 d_phase += delta_phase;
00052 if (fabs (d_phase) > M_PI){
00053
00054 while (d_phase > M_PI)
00055 d_phase -= 2*M_PI;
00056
00057 while (d_phase < -M_PI)
00058 d_phase += 2*M_PI;
00059 }
00060 }
00061
00062 double get_phase () const { return d_phase; }
00063
00064
00065 void sincos (float *sinx, float *cosx) const;
00066
00067
00068 float cos () const { return std::cos (d_phase); }
00069 float sin () const { return std::sin (d_phase); }
00070
00071
00072 void cos (float *output, const float *input, int noutput_items, double k, double ampl = 1.0);
00073
00074 protected:
00075 double d_phase;
00076 };
00077
00078 template<class o_type, class i_type>
00079 void
00080 gr_vco<o_type,i_type>::sincos (float *sinx, float *cosx) const
00081 {
00082 gr_sincosf (d_phase, sinx, cosx);
00083 }
00084
00085 template<class o_type, class i_type>
00086 void
00087 gr_vco<o_type,i_type>::cos (float *output, const float *input, int noutput_items, double k, double ampl)
00088 {
00089 for (int i = 0; i < noutput_items; i++){
00090 output[i] = cos() * ampl;
00091 adjust_phase(input[i] * k);
00092 }
00093 }
00094 #endif