00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038 #ifndef _VRSIGSOURCE_H_
00039 #define _VRSIGSOURCE_H_
00040
00041 extern "C" {
00042 #include <math.h>
00043 #include <sys/time.h>
00044 #include <unistd.h>
00045 }
00046
00047 #include <VrSource.h>
00048 #include <stdlib.h>
00049
00050 enum {VR_SQUARE_WAVE, VR_TRIANGLE_WAVE, VR_SIN_WAVE, VR_DC_WAVE, VR_COS_WAVE};
00051
00052 template<class oType>
00053 class VrSigSource : public VrSource<oType> {
00054 protected:
00055 int wform;
00056 double freq;
00057 double amp;
00058 double time;
00059 oType* buffer;
00060 void incTime() {time = time + 1/(double)getSamplingFrequency();}
00061 double slope() {return 4 * amp * getSamplingFrequency() / freq;}
00062 void createBuffers();
00063 public:
00064 virtual int work2(VrSampleRange output, void *o[]);
00065
00066 virtual void initialize();
00067
00068 int getWaveform() {return wform;}
00069 double getAmplitude() {return amp;}
00070 double getFrequency() {return freq;}
00071
00072 void setWaveform(int w) {wform = w; initialize ();}
00073
00074 void setAmplitude(double a) {amp = a; initialize ();}
00075
00076 void setFrequency(double f) {
00077 if (2*f > getSamplingFrequency())
00078 freq = getSamplingFrequency()/2;
00079 else
00080 freq = f;
00081 initialize();
00082 }
00083
00084
00085 VrSigSource(double sampling_freq, int wf, double f, double a)
00086 :wform(wf),freq(f),time(0),buffer(0)
00087 {
00088 setSamplingFrequency (sampling_freq);
00089 amp = a;
00090 }
00091
00092 VrSigSource(double sampling_freq)
00093 :wform(VR_SIN_WAVE),freq(1000),time(0),buffer(0)
00094 {
00095 setSamplingFrequency (sampling_freq);
00096 amp = (1 << 8*sizeof(oType) - 1);
00097 }
00098 };
00099
00100 template<class oType> void
00101 VrSigSource<oType>::createBuffers()
00102 {
00103 unsigned int i;
00104
00105 switch (wform) {
00106 case VR_TRIANGLE_WAVE:
00107 for (i = 0;i < getOutputSize(); i++) {
00108 if ((i % (int)(getSamplingFrequency() / freq)) <
00109 getSamplingFrequency() / 2*freq)
00110 buffer[i] = (oType)(slope() * i - amp);
00111 else
00112 buffer[i] = (oType)(amp - slope() *
00113 (i - getSamplingFrequency() / 2*freq));
00114 }
00115 break;
00116
00117 case VR_SIN_WAVE:
00118 for (i = 0; i < getOutputSize(); i++) {
00119 buffer[i] = (oType)(amp * sin(2*M_PI*freq*time));
00120 incTime();
00121 }
00122
00123
00124 i--;
00125 buffer[i] = (buffer[i-1] + buffer[0]) / 2;
00126 break;
00127
00128 case VR_COS_WAVE:
00129 for (i = 0; i < getOutputSize(); i++) {
00130 buffer[i] = (oType)(amp * cos(2*M_PI*freq*time));
00131 incTime();
00132 }
00133
00134
00135 i--;
00136 buffer[i] = (buffer[i-1] + buffer[0]) / 2;
00137 break;
00138
00139 case VR_SQUARE_WAVE:
00140 fprintf (stderr, "VrSigSource: VR_SQUARE_WAVE is broken\a\n");
00141
00142 for (i = 0; i < getOutputSize();i++) {
00143 if (((int)time % (int)(getSamplingFrequency() / freq)) <
00144 getSamplingFrequency() / 2*freq)
00145 buffer[i] = (oType)amp;
00146 else
00147 buffer[i] = (oType)amp;
00148 }
00149 break;
00150
00151 case VR_DC_WAVE:
00152 for (i = 0; i < getOutputSize(); i++) {
00153 buffer[i] = (oType)amp;
00154 }
00155 break;
00156
00157 default:
00158 abort ();
00159 }
00160 }
00161
00162 template<class oType> void
00163 VrSigSource<oType>::initialize()
00164 {
00165 #if 1
00166
00167 double burst_length = 4096.0 / getSamplingFrequency ();
00168 if (0.050 > burst_length)
00169 burst_length = 0.050;
00170 #else
00171 double burst_length = 0.050;
00172 #endif
00173
00174
00175
00176
00177 if (freq == 0.0)
00178 setOutputSize ((int) (burst_length * getSamplingFrequency ()));
00179
00180 else {
00181 double samples_per_cycle = getSamplingFrequency() / freq;
00182 int cycles_in_burst = (int) ((getSamplingFrequency() * burst_length) / samples_per_cycle);
00183
00184 setOutputSize ((int) (cycles_in_burst * samples_per_cycle + 0.5));
00185 }
00186
00187 if (buffer != 0)
00188 delete[] buffer;
00189 buffer = new oType[getOutputSize()];
00190 createBuffers();
00191 }
00192
00193 template<class oType> int
00194 VrSigSource<oType>::work2(VrSampleRange output, void *ao[])
00195 {
00196 oType **o = (oType **)ao;
00197 unsigned int size = output.size;
00198 while (size > 0) {
00199 memcpy((char *)(o[0]),(char *)buffer,getOutputSize()*sizeof(oType));
00200 size -= getOutputSize();
00201 o[0]+=getOutputSize();
00202 }
00203 return output.size;
00204 }
00205
00206 #endif