Further work on IIR upconverter; verified entire chain with generated GMSK signal
authorbaobrien <baobrien@01035d8c-6547-0410-b346-abe4f91aad63>
Thu, 19 Mar 2015 17:25:41 +0000 (17:25 +0000)
committerbaobrien <baobrien@01035d8c-6547-0410-b346-abe4f91aad63>
Thu, 19 Mar 2015 17:25:41 +0000 (17:25 +0000)
git-svn-id: https://svn.code.sf.net/p/freetel/code@2084 01035d8c-6547-0410-b346-abe4f91aad63

codec2-dev/octave/dacres.m
codec2-dev/stm32/src/fast_dac_ut.c
codec2-dev/stm32/src/iir_duc.c

index 3ef8659f39425608e2473aac0b91c109f5b296a7..e75ac317d4b6af4e7bdba6885b8a12887b4d2ece 100644 (file)
@@ -15,7 +15,7 @@ fi = 2E6/M;                     %freq of first interpolation
 fb = 7E5;                       %Bandpass frequency
 fc1 = fi/4;                     %Frequency of initial upconversion
 ciccb=[-0.029626    0.252638   -2.304683   16.332166   -2.304683    0.252638   -0.029626]; %CIC Compensation FIR
-pcicfb = fir1(21,.5); %Interpolation LPF Fir
+pcicfb = fir1(41,.5); %Interpolation LPF Fir
 s1fir = filter(ciccb,1,pcicfb); %Combine compensation and LPF
 %s1fir = [-0.00000215, -0.00008715, 0.00073915, -0.00674415, 0.05618415, 0.01629015, -0.19074815, -0.04231615, 0.53620515, 0.09933915, -1.32978715, -0.38797815, 3.97887715, 6.70888315, 3.97887715, -0.38797815, -1.32978715, 0.09933915, 0.53620515, -0.04231615, -0.19074815, ];
 
@@ -121,14 +121,14 @@ scoimag=single(fdnext/(2**20));
 ssout = scoreal.*cos(pi*.5*(1:length(scoreal))) + scoimag.*sin(pi*.5*(1:length(scoimag)));
 
 
-t = (0:(fs-1));
+t = (0:(fi-1));
 
 beta1 = 0.999;
 b1x = -2*sqrt(beta1)*cos(2*pi*(fb/fd))
 beta2 = beta1 - (1-beta1)*M;
 
 sducin = ssout;
-
+%sducin = cos(pi*.5*t);
 
 sduceq = filter([1 0 beta2],1,sducin);  %pre interpolation notch filter to equalize bandpass after interpolation
 sducinterp = zeros(1,length(sduceq)*M);    %interpolate by zero-stuffing
index 1f9dec04894befb044303c2aa84673b5d63c06ec..08107dc3e3a2a7ea7612fcba4a56423025f3f631 100644 (file)
@@ -42,7 +42,7 @@
 /* 32 sample sine wave which at Fs=16kHz will be 500Hz.  Note samples\r
    are 16 bit 2's complement, the DAC driver convertsto 12 bit\r
    unsigned. */\r
-\r
+   \r
 short aWave[] = {4095,0,4095,0,4095,0,4095,0,4095,0,4095,0,4095,0,4095,0,4095,0,4095,0,4095,0,4095,0,4095,0,4095,0,4095,0,4095,0,\r
        4095,0,4095,0,4095,0,4095,0,4095,0,4095,0,4095,0,4095,0,4095,0,4095,0,4095,0,4095,0,4095,0,4095,0,4095,0,4095,0,};\r
 \r
@@ -50,10 +50,10 @@ short aSine[] = {1600, 3200, 1601, 0, 1600, 3200, 1601, 0, 1600, 3200, 1601, 0,
 };\r
 \r
 //Sine at Fs/4\r
-float f4sine[] = {1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,\r
-                -1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0,\r
-                 1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,\r
-                -1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0,};\r
+float f4sine[] = {1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0,\r
+1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0,\r
+1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0,\r
+1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0,};\r
 \r
 //Intermediate 80k real before tx\r
 float tx_imm[DUC_N];\r
@@ -90,7 +90,7 @@ int main(void) {
         comp_in[i].imag=0;\r
     }\r
     while (1) {\r
-       cyc+=16;\r
+       cyc+=DUC_N/10;\r
         if(cyc>GMSK_TEST_LEN)\r
             cyc=0;\r
        /*if(cyc%10000==0){\r
@@ -99,7 +99,7 @@ int main(void) {
        }*/\r
         tstart = TIM_GetCounter(TIM2);\r
 \r
-        upconv_8c_80r(comp_in,tx_imm,1);\r
+        upconv_8c_80r(&gmsk_test_d[cyc],tx_imm,1);\r
 \r
        tup = TIM_GetCounter(TIM2);\r
 \r
index f79dc609560e568a3ad66474cb1288fa916763d7..29b9e09b8e98d28c656b007a7f60cd5c6412fd5b 100644 (file)
@@ -79,10 +79,10 @@ void iir_upconv(float modin[], unsigned short dac_out[]){
     }
 }
 
-#define F8C80R_LEN 30                                     //Number of taps in the 8C80R filters
+#define F8C80R_LEN 42                                     //Number of taps in the 8C80R filters
 #define F8C80R_MUL 4096
-static int int1r,int2r,int3r,int4r,cmb1r,cmb2r,cmb3r,cmb4r; //States for re combs and integrators
-static int int1i,int2i,int3i,int4i,cmb1i,cmb2i,cmb3i,cmb4i; //States for im combs and integrators
+static int int1r,int2r,int3r,int4r,int5r,cmb1r,cmb2r,cmb3r,cmb4r,cmb5r; //States for re combs and integrators
+static int int1i,int2i,int3i,int4i,int5i,cmb1i,cmb2i,cmb3i,cmb4i,cmb5i; //States for im combs and integrators
 static int ptr_8c80r;                                       //circular buffer ptr fir_8c80r_re
 static int w8c80r = 0;                                      //Omega for upconversion
 
@@ -135,28 +135,32 @@ void upconv_8c_80r(COMP comp_8[],float real_80[],int count){
             cmbrr = cmbr - cmb2r; cmb2r = cmbr;   //Comb 2 real
             cmbr = cmbrr - cmb3r; cmb3r = cmbrr;  //Comb 3 real
             cmbrr = cmbr - cmb4r; cmb4r = cmbr;   //Comb 4 real
+           cmbr = cmbrr - cmb5r; cmb5r = cmbrr;
 
             cmbi =  imin - cmb1i; cmb1i = imin;   //Comb 1 im
             cmbii = cmbi - cmb2i; cmb2i = cmbi;   //Comb 2 im
             cmbi = cmbii - cmb3i; cmb3i = cmbii;  //Comb 3 im
             cmbii = cmbi - cmb4i; cmb4i = cmbi;   //Comb 4 im
+            cmbi = cmbii - cmb5i; cmb5i = cmbii;   //Comb 4 im
             //Do first cycle of integration
-            int1r = cmbrr + int1r;                //Integrator stage 1 re
+            int1r = cmbr + int1r;                //Integrator stage 1 re
             int2r = int1r + int2r;                //Integrator stage 2 re
             int3r = int2r + int3r;                //Integrator stage 3 re
             int4r = int3r + int4r;                //Integrator stage 4 re
+            int5i = int4i + int5i; 
 
-            int1i = cmbii + int1i;                //Integrator stage 1 im
+            int1i = cmbi + int1i;                //Integrator stage 1 im
             int2i = int1i + int2i;                //Integrator stage 2 im
             int3i = int2i + int3i;                //Integrator stage 3 im
             int4i = int3i + int4i;                //Integrator stage 4 im
+            int5r = int4r + int5r; 
             //Convert this complex into real and cancel out the gain from CIC
             //This should probably spit out integers instead of going back to float
             switch(w8c80r&0x3){                   //Do comp->real conversion by hand
-                case 0:ret=(float)(-int4r>>8);break;
-                case 1:ret=(float)(int4i>>8);break;
-                case 2:ret=(float)(int4r>>8);break;
-                case 3:ret=(float)(-int4i>>8);break;
+                case 0:ret=(float)(-int5i>>7);break;
+                case 1:ret=(float)(int5r>>7);break;
+                case 2:ret=(float)(int5i>>7);break;
+                case 3:ret=(float)(-int5r>>7);break;
             }
             real_80[outidx] = ret/8192;   //Divide by 4096 to cancel out gain
             outidx++;
@@ -166,14 +170,16 @@ void upconv_8c_80r(COMP comp_8[],float real_80[],int count){
                 int2r = int1r + int2r;            //Integrator stage 2 re
                 int3r = int2r + int3r;            //Integrator stage 3 re
                 int4r = int3r + int4r;            //Integrator stage 4 re
+               int5r = int4r + int5r; 
                 int2i = int1i + int2i;            //Integrator stage 2 im
                 int3i = int2i + int3i;            //Integrator stage 3 im
                 int4i = int3i + int4i;            //Integrator stage 4 im
+               int5i = int4i + int5i; 
                 switch(w8c80r&0x3){               //Do comp->real conversion by hand
-                    case 0:ret=(float)(-int4r>>8);break;
-                    case 1:ret=(float)(int4i>>8);break;
-                    case 2:ret=(float)(int4r>>8);break;
-                    case 3:ret=(float)(-int4i>>8);break;
+                    case 0:ret=(float)(-int5i>>7);break;
+                    case 1:ret=(float)(int5r>>7);break;
+                    case 2:ret=(float)(int5i>>7);break;
+                    case 3:ret=(float)(-int5r>>7);break;
                 }
                 real_80[outidx] = ret/8192;  //Cancel out gain from all that.
                 outidx++;
@@ -221,11 +227,11 @@ int main(void) {
 
     for(i=0;i<NIN/10;i++){
         //Tone at Fs/4 +/- 3K
-       w = 2.*M_PI*2500./(float)(FS/10);
-        //in[i].real=cos((float)i*w);
+       w = 2.*M_PI*1000./(float)(FS/10);
+        in[i].real=cos((float)i*w);
         //in[i].imag=.1*sin((float)i*w);
         //in[i].real=0;
-        in[i].real=1;
+        //in[i].real=1;
         in[i].imag=0;
     }
 
@@ -266,8 +272,8 @@ int main(void) {
 
 //Coeffs for fixed point fir LPF and CIC precompensation
 static int fir_8c80r_cic_i[] = {
-1,-2,18,-128,135,309,-419,-926,1177,2284,-2790,
--5691,6535,24425,24425,6535,-5691,-2790,2284,1177,-926,-419,};
+0,0,-2,16,-16,-20,26,37,-47,-68,83,116,-139,-187,219,294,-339,-461,528,766,
+-882,-1540,1730,6117,6117,1730,-1540,-882,766,528,-461,-339,294,219,-187,-139,116,83,-68,-47,37,26};