00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00029 #ifndef QDOPERATIONS_H
00030 #define QDOPERATIONS_H
00031
00032 #include "IQConstants.h"
00033
00035
00041 #define MAG_QD(in) (_IQmag(in.q,in.d))
00042
00048 #define MAG_QD_NDATA(in,n) (_IQmag(in.q[n],in.d[n]))
00049
00055 #define MAG_QD_DATA(in,out) {\
00056 out[N] = MAG_QD_NDATA(in,N);\
00057 out[N1]= MAG_QD_NDATA(in,N1);\
00058 }
00059
00061
00067 #define SQR_QD(in) (_IQmpy(in.q,in.q)+_IQmpy(in.d,in.d))
00068
00074 #define SQR_QD_NDATA(in,n) (_IQmpy(in.q[n],in.q[n])+_IQmpy(in.d[n],in.d[n]))
00075
00081 #define SQR_QD_DATA(in,out) {\
00082 out[N]=SQR_QD_NDATA(in,N);\
00083 out[N1]=SQR_QD_NDATA(in,N1);\
00084 }
00085
00086
00088
00094 #define SUM_QD(s1,s2,out) {out.q=s1.q+s2.q;out.d=s1.d+s2.d;}
00095
00101 #define SUM_QD_NDATA(s1,s2,out,n) {out.q[n]=s1.q[n]+s2.q[n];out.d[n]=s1.d[n]+s2.d[n];}
00102
00108 #define SUM_QD_DATA(s1,s2,out) {\
00109 SUM_QD_NDATA(s1,s2,out,N);\
00110 SUM_QD_NDATA(s1,s2,out,N1);\
00111 }
00112
00114
00120 #define DIFF_QD(s1,s2,out) {out.q=s1.q-s2.q;out.d=s1.d-s2.d;}
00121
00127 #define DIFF_QD_NDATA(s1,s2,out,n) {out.q[n]=s1.q[n]-s2.q[n];out.d[n]=s1.d[n]-s2.d[n];}
00128
00134 #define DIFF_QD_DATA(s1,s2,out) {\
00135 DIFF_QD_NDATA(s1,s2,out,N);\
00136 DIFF_QD_NDATA(s1,s2,out,N1);\
00137 }
00138
00143 #define INV_QD(in,out) {out.q=_IQdiv(_IQ(1),in.q);out.d=_IQdiv(_IQ(1),in.d);}
00144
00148 #define MULT_REAL(dq,sc,out) {out.q=_IQmpy(dq.q,sc);out.d=_IQmpy(dq.d,sc);}
00149
00153 #define _NEG_QD(in) {in.q=-in.q;in.d=-in.d;}
00154 #define NEG_QD(in,out) {out.q=-in.q;out.d=-in.d;}
00155
00159 #define ASSIGN_QD(in,out) {out.q=in.q;out.d=in.d;}
00160
00164 #define SIGN(in) (1+((in & (long)0x80000000)>>30))//1-2*[1,0]
00165
00166 #ifdef QUADRATURE_AXIS_REAL
00167
00168 #define MAKE_QD(real,imag,out) out.q=real; out.d=-imag
00169
00170 #define REAL_QD(in) (in.q)
00171 #define IMAG_QD(in) (-in.d)
00172 #define REAL_QD_DATA(in) (in.q[N])
00173 #define IMAG_QD_DATA(in) (-in.d[N])
00174
00175 #define _CONJ_QD(in) in.d=-in.d
00176 #define CONJ_QD(in,out) {out.q=in.q;out.d=-in.d;}
00177 #define CONJ_QD_NDATA(in,out,n) {out.q[n]=in.q[n];out.d[n]=-in.d[n];}
00178 #define CONJ_QD_DATA(in,out) {\
00179 CONJ_QD_NDATA(in,out,N);\
00180 CONJ_QD_NDATA(in,out,N1);\
00181 }
00182
00183 #define _PHASE_QD(in) (_IQatan2(-in.d,in.q))
00184 #define PHASE_QD(in,out) out=_PHASE_QD(in);
00185 #define PHASE_QD_NDATA(in,n) (_IQatan2(-in.d[n],in.q[n]))
00186 #define PHASE_QD_DATA(in,out) {\
00187 out[N]=PHASE_QD_NDATA(in,N);\
00188 out[N1]=PHASE_QD_NDATA(in,N1);\
00189 }
00190
00191 #define TIMES_Q(s1,s2) (_IQmpy(s1.q,s2.q)-_IQmpy(s1.d,s2.d))
00192 #define TIMES_D(s1,s2) (_IQmpy(s1.q,s2.d)+_IQmpy(s1.d,s2.q))
00193 #define TIMES_QD(s1,s2,out) {out.q=TIMES_Q(s1,s2);out.d=TIMES_D(s1,s2);}
00194 #define TIMES_Q_DATA(s1,s2,n) (_IQmpy(s1.q[n],s2.q[n])-_IQmpy(s1.d[n],s2.d[n]))
00195 #define TIMES_D_DATA(s1,s2,n) (_IQmpy(s1.q[n],s2.d[n])+_IQmpy(s1.d[n],s2.q[n]))
00196 #define TIMES_QD_NDATA(s1,s2,out,n){\
00197 out.q[n]=TIMES_Q_DATA(s1,s2,n);\
00198 out.d[n]=TIMES_D_DATA(s1,s2,n);\
00199 }
00200 #define TIMES_QD_DATA(s1,s2,out){\
00201 TIMES_QD_NDATA(s1,s2,out,N);\
00202 TIMES_QD_NDATA(s1,s2,out,N1);\
00203 } }
00204
00205
00206 #define SQRT_QD(in,out) {\
00207 _iq mag = _IQsqrt(MAG_QD(in));\
00208 _iq phase = _PHASE_QD(in)/2;\
00209 REAL_QD(out)=_IQmpy(mag,_IQcos(phase));\
00210 IMAG_QD(out)=_IQmpy(mag,_IQsin(phase));\
00211 }
00212
00213
00214 #define POW_QD(in,out,pow) {\
00215 _iq mag = _IQsqrt(MAG_QD(in));\
00216 _iq phase = _IQmpy(_PHASE_QD(in),_IQ(pow));\
00217 REAL_QD(out)=_IQmpy(mag,_IQcos(phase));\
00218 IMAG_QD(out)=_IQmpy(mag,_IQsin(phase));\
00219 }
00220 #else
00221
00224 #define MAKE_QD(real,imag,out) out.d=real; out.q=imag
00225
00229 #define REAL_QD(in) (in.d)
00230 #define IMAG_QD(in) (in.q)
00231 #define REAL_QD_DATA(in) (in.d[N])
00232 #define IMAG_QD_DATA(in) (in.q[N])
00233
00239 #define MODARG2QD(mod,arg,out) {\
00240 out.d = _IQmpy(mod,_IQcos(arg));\
00241 out.q = _IQmpy(mod,_IQsin(arg));\
00242 }
00243 #define MODARG2QD_NDATA(mod,arg,out,n) {\
00244 out.d[n] = _IQmpy(mod,_IQcos(arg));\
00245 out.q[n] = _IQmpy(mod,_IQsin(arg));\
00246 }
00247 #define MODARG2QD_DATA(mod,arg,out) {\
00248 MODARG2QD_NDATA(mod,arg,out,N);\
00249 MODARG2QD_NDATA(mod,arg,out,N1);\
00250 }
00251
00256 #define _CONJ_QD(in) in.q=-in.q
00257 #define CONJ_QD(in,out) {out.d=in.d;out.q=-in.q;}
00258 #define CONJ_QD_NDATA(in,out,n) {out.d[n]=in.d[n];out.q[n]=-in.q[n];}
00259 #define CONJ_QD_DATA(in,out) {\
00260 CONJ_QD_NDATA(in,out,N);\
00261 CONJ_QD_NDATA(in,out,N1);\
00262 }
00263
00268 #define _PHASE_QD(in) (_IQatan2(in.q,in.d))
00269 #define PHASE_QD(in,out) out= _PHASE_QD(in);
00270 #define PHASE_QD_NDATA(in,n) (_IQatan2(in.q[n],in.d[n]))
00271 #define PHASE_QD_DATA(in,out) {\
00272 out[N]=PHASE_QD_NDATA(in,N);\
00273 out[N1]=PHASE_QD_NDATA(in,N1);\
00274 }
00275
00280 #define TIMES_D(s1,s2) (_IQmpy(s1.d,s2.d)-_IQmpy(s1.q,s2.q))
00281 #define TIMES_Q(s1,s2) (_IQmpy(s1.q,s2.d)+_IQmpy(s1.d,s2.q))
00282 #define TIMES_QD(s1,s2,out) out.d=TIMES_D(s1,s2);out.q=TIMES_Q(s1,s2)
00283 #define TIMES_D_DATA(s1,s2,n) (_IQmpy(s1.d[n],s2.d[n])-_IQmpy(s1.q[n],s2.q[n]))
00284 #define TIMES_Q_DATA(s1,s2,n) (_IQmpy(s1.q[n],s2.d[n])+_IQmpy(s1.d[n],s2.q[n]))
00285 #define TIMES_QD_NDATA(s1,s2,out,n){\
00286 out.d[n]=TIMES_D_DATA(s1,s2,n);\
00287 out.q[n]=TIMES_Q_DATA(s1,s2,n);\
00288 }
00289 #define TIMES_QD_DATA(s1,s2,out){\
00290 TIMES_QD_NDATA(s1,s2,out,N);\
00291 TIMES_QD_NDATA(s1,s2,out,N1);\
00292 }
00293
00294
00295
00296
00297
00298
00304 #define SQRT_QD(in,out) {\
00305 _iq mag = _IQsqrt(MAG_QD(in));\
00306 _iq phase = _PHASE_QD(in)/2;\
00307 REAL_QD(out)=_IQmpy(mag,_IQcos(phase));\
00308 IMAG_QD(out)=_IQmpy(mag,_IQsin(phase));\
00309 }
00310
00311 #endif
00312
00316 #define DIV_QD(s1,s2,temp,out) {\
00317 CONJ_QD(s2,temp);\
00318 out.q=_IQdiv(TIMES_Q(s1,temp),SQR_QD(s2));\
00319 out.d=_IQdiv(TIMES_D(s1,temp),SQR_QD(s2));\
00320 }
00321 #define DIV_QD_DATA(s1,s2,temp,out) {\
00322 CONJ_QD_DATA(s2,temp);\
00323 out.q[N]=_IQdiv(TIMES_Q_DATA(s1,temp,N),SQR_QD_NDATA(s2,N));\
00324 out.d[N]=_IQdiv(TIMES_D_DATA(s1,temp,N),SQR_QD_NDATA(s2,N));\
00325 out.q[N1]=_IQdiv(TIMES_Q_DATA(s1,temp,N1),SQR_QD_NDATA(s2,N1));\
00326 out.d[N1]=_IQdiv(TIMES_D_DATA(s1,temp,N1),SQR_QD_NDATA(s2,N1));\
00327 }
00328
00330 #endif
00331
00332
00333
00334