00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef _GRCOMPLEXVCOMIXER_H_
00024 #define _GRCOMPLEXVCOMIXER_H_
00025
00026 #include <VrSigProc.h>
00027
00028 template<class iType,class oType>
00029 class GrComplexVCOMixer : public VrSigProc {
00030 protected:
00031 double sensitivity;
00032 double freq;
00033 double arg;
00034 double argInc;
00035 void evaluate(int n);
00036 virtual void initialize();
00037 public:
00038 virtual const char *name() { return "GrComplexVCOMixer"; }
00039 virtual int work(VrSampleRange output, void *ao[],
00040 VrSampleRange inputs[], void *ai[]);
00041 GrComplexVCOMixer(double f,double s) :VrSigProc(2,sizeof(iType),sizeof(oType)),sensitivity(s),freq(f),arg(0) { }
00042 };
00043
00044 template<class iType,class oType> int
00045 GrComplexVCOMixer<iType,oType>::work(VrSampleRange output, void *ao[],
00046 VrSampleRange inputs[], void *ai[])
00047 {
00048 iType **i = (iType**)ai;
00049 oType **o = (iType**)ao;
00050 int size = output.size;
00051 while(size -- > 0) {
00052 *o[0]++ = (oType) (*i[0] * cos(arg));
00053 *o[1]++ = (oType) (*i[0]++ * sin(arg));
00054 arg += argInc;
00055 argInc = 2*M_PI*(freq + sensitivity * *i[1]++)*(1 / (double)getInputSamplingFrequencyN(0));
00056 }
00057 return output.size;
00058 }
00059
00060 template<class iType,class oType> void
00061 GrComplexVCOMixer<iType,oType>::initialize()
00062 {
00063 argInc = 2*M_PI*freq*(1 / (double)getInputSamplingFrequencyN(0));
00064 }
00065 #endif