From: baobrien Date: Thu, 19 Mar 2015 17:25:41 +0000 (+0000) Subject: Further work on IIR upconverter; verified entire chain with generated GMSK signal X-Git-Url: http://git.whiteaudio.com/gitweb/?a=commitdiff_plain;h=2884a22b94ed8b9727885c681eaca7120f96a89a;p=freetel-svn-tracking.git Further work on IIR upconverter; verified entire chain with generated GMSK signal git-svn-id: https://svn.code.sf.net/p/freetel/code@2084 01035d8c-6547-0410-b346-abe4f91aad63 --- diff --git a/codec2-dev/octave/dacres.m b/codec2-dev/octave/dacres.m index 3ef8659f..e75ac317 100644 --- a/codec2-dev/octave/dacres.m +++ b/codec2-dev/octave/dacres.m @@ -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 diff --git a/codec2-dev/stm32/src/fast_dac_ut.c b/codec2-dev/stm32/src/fast_dac_ut.c index 1f9dec04..08107dc3 100644 --- a/codec2-dev/stm32/src/fast_dac_ut.c +++ b/codec2-dev/stm32/src/fast_dac_ut.c @@ -42,7 +42,7 @@ /* 32 sample sine wave which at Fs=16kHz will be 500Hz. Note samples are 16 bit 2's complement, the DAC driver convertsto 12 bit unsigned. */ - + 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, 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,}; @@ -50,10 +50,10 @@ short aSine[] = {1600, 3200, 1601, 0, 1600, 3200, 1601, 0, 1600, 3200, 1601, 0, }; //Sine at Fs/4 -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,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,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,1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0,}; +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, +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, +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, +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,}; //Intermediate 80k real before tx float tx_imm[DUC_N]; @@ -90,7 +90,7 @@ int main(void) { comp_in[i].imag=0; } while (1) { - cyc+=16; + cyc+=DUC_N/10; if(cyc>GMSK_TEST_LEN) cyc=0; /*if(cyc%10000==0){ @@ -99,7 +99,7 @@ int main(void) { }*/ tstart = TIM_GetCounter(TIM2); - upconv_8c_80r(comp_in,tx_imm,1); + upconv_8c_80r(&gmsk_test_d[cyc],tx_imm,1); tup = TIM_GetCounter(TIM2); diff --git a/codec2-dev/stm32/src/iir_duc.c b/codec2-dev/stm32/src/iir_duc.c index f79dc609..29b9e09b 100644 --- a/codec2-dev/stm32/src/iir_duc.c +++ b/codec2-dev/stm32/src/iir_duc.c @@ -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