From 94519ac2adb9ae0cc8041e9b4c80ee463b8ff8a4 Mon Sep 17 00:00:00 2001 From: baobrien Date: Fri, 13 Mar 2015 05:35:54 +0000 Subject: [PATCH] fir/cic 10x comp->real converter now works. cleanup still needed. git-svn-id: https://svn.code.sf.net/p/freetel/code@2071 01035d8c-6547-0410-b346-abe4f91aad63 --- codec2-dev/octave/dacres.m | 8 ++-- codec2-dev/stm32/src/iir_duc.c | 70 ++++++++++++++-------------------- 2 files changed, 32 insertions(+), 46 deletions(-) diff --git a/codec2-dev/octave/dacres.m b/codec2-dev/octave/dacres.m index d584d35d..41f82424 100644 --- a/codec2-dev/octave/dacres.m +++ b/codec2-dev/octave/dacres.m @@ -15,13 +15,13 @@ 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(39,.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, ]; +%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, ]; t = (1:fs/2); -%scpin = e.^(i*(t*pi*2*(3000/8000))); % initial complex input -scpin = zeros(1,length(t)); +scpin = e.^(i*(t*pi*2*(3000/8000))); % initial complex input +%scpin = zeros(1,length(t)); scpin(1) = 1+i; intstage1 = zeros(1,2*length(scpin)); %First stage of interpolation, 2x diff --git a/codec2-dev/stm32/src/iir_duc.c b/codec2-dev/stm32/src/iir_duc.c index 60fc601b..a37d0852 100644 --- a/codec2-dev/stm32/src/iir_duc.c +++ b/codec2-dev/stm32/src/iir_duc.c @@ -79,7 +79,7 @@ void iir_upconv(float modin[], unsigned short dac_out[]){ } } -#define F8C80R_LEN 21 //Number of taps in the 8C80R filters +#define F8C80R_LEN 40 //Number of taps in the 8C80R filters #define F8C80R_MUL 1024 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 @@ -117,13 +117,13 @@ void upconv_8c_80r(COMP comp_8[],float real_80[],int count){ fir_8c80r_im[ptr_8c80r+F8C80R_LEN]=f8c80r_temp_im[j]; nr=0; ni=0; for(k=0;kF8C80R_LEN) + if(ptr_8c80r>=F8C80R_LEN) ptr_8c80r=0; } for(j=0;j>0); - real_80[(i*DUC_N)+(j*5)] = ret/F8C80R_MUL; + ret = (float) (((-cosf4[w8c80r]*int4r)+(sinf4[w8c80r]*int4i))); + real_80[(i*DUC_N)+(j*5)] = ret/1052048; w8c80r = (w8c80r+1)&0x3; - for(k=1;k<5;k++){ //Next 4 stages of integration - //int1r = 0 + int1r; //Integrator stage 1 re + //Next 4 stages of integration. Stage 1 can be ignored because of zero stuffing. + for(k=1;k<5;k++){ int2r = int1r + int2r; //Integrator stage 2 re int3r = int2r + int3r; //Integrator stage 3 re int4r = int3r + int4r; //Integrator stage 4 re - //int1i = 0 + 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 - ret = (float)(((-cosf4[w8c80r]*int4r)+(sinf4[w8c80r]*int4i))>>0); - // printf("%f,",ret); - real_80[(i*DUC_N)+(j*5)+k] = ret/F8C80R_MUL; + ret = (float)(((-cosf4[w8c80r]*int4r)+(sinf4[w8c80r]*int4i))); + real_80[(i*DUC_N)+(j*5)+k] = ret/1052048; //Cancel out gain from all that. w8c80r = (w8c80r+1)&0x3; } } @@ -181,7 +179,7 @@ void upconv_8c_80r(COMP comp_8[],float real_80[],int count){ #define FS 80000 #define AMP_MAX 1 -#define NOUT_BUFS 1000 +#define NOUT_BUFS 500 #define NIN (NOUT_BUFS*DUC_N) #define NOUT (NIN*DUC_M) @@ -203,7 +201,7 @@ float fout[NIN]; unsigned short todac[NOUT]; int main(void) { - float f1,f2,f3; + float f1,f2,f3,w; FILE *f; int i; @@ -212,12 +210,15 @@ int main(void) { f3 = f1 + 7E3; /* wanted */ for(i=0;i