From eb385887e1590df03c241a87f1cb127ece3bf614 Mon Sep 17 00:00:00 2001 From: baobrien Date: Sun, 22 Mar 2015 05:21:20 +0000 Subject: [PATCH] Added 48k complex to 80k real converter. Checked in Octave. git-svn-id: https://svn.code.sf.net/p/freetel/code@2087 01035d8c-6547-0410-b346-abe4f91aad63 --- codec2-dev/stm32/src/iir_duc.c | 68 +++++++++++++++++++++++++++++++--- 1 file changed, 63 insertions(+), 5 deletions(-) diff --git a/codec2-dev/stm32/src/iir_duc.c b/codec2-dev/stm32/src/iir_duc.c index 29b9e09b..dfe7f40b 100644 --- a/codec2-dev/stm32/src/iir_duc.c +++ b/codec2-dev/stm32/src/iir_duc.c @@ -8,7 +8,7 @@ Unit testing: - ~/codec2-dev/stm32$ gcc -D__UNITTEST__ -Iinc src/iir_duc.c -o iir_duc -lm -Wall + ~/codec2-dev/stm32$ gcc -D__UNITTEST__ -Iinc src/iir_duc.c -o iir_duc -lm -Wall -I../src/ ~/codec2-dev/stm32$ ./iir_duc \*---------------------------------------------------------------------------*/ @@ -79,6 +79,63 @@ void iir_upconv(float modin[], unsigned short dac_out[]){ } } +#define F48C80R_LEN 25 +#define F48C80R_MUL 4096 +static int js3 = 0; //Index for downsampling +static int js5 = 0; //Index for upsampling +static int w48c80r; //Phase for real to comp conversion +static int ptr_48c80r; //Pointer in fir delay lines +static int fir_48c80r[]; //Fir filter coeffs +static int fir_48c80r_re[F48C80R_LEN*2]; //Real delay line. Can probably be made much smaller. +static int fir_48c80r_im[F48C80R_LEN*2]; //Imag delay line. Can probably be made much smaller. + +void upconv_48c_80r(COMP comp_48[],float real_80[],int count){ + int i,j,k; //Loop counters + float ret; //Temp vars + int nr,ni; //Temp vars + int inidx = 0; //Input index + int outidx = 0; //Output index + for(i=0;ireal conversion by hand + case 0:ret=(float)(-ni>>11);break; + case 1:ret=(float)(nr>>11);break; + case 2:ret=(float)(ni>>11);break; + case 3:ret=(float)(-nr>>11);break; + } + real_80[outidx]=ret/8192; //Scale back result; should probably just return int + outidx++; + js3=3; + } + w48c80r++; + ptr_48c80r++; + if(ptr_48c80r>=F48C80R_LEN) + ptr_48c80r=0; + js3--; + js5--; + } + } +} + #define F8C80R_LEN 42 //Number of taps in the 8C80R filters #define F8C80R_MUL 4096 static int int1r,int2r,int3r,int4r,int5r,cmb1r,cmb2r,cmb3r,cmb4r,cmb5r; //States for re combs and integrators @@ -215,7 +272,7 @@ void synth_line(float us[], float f, float amp, int n) { } } -COMP in[NIN/10]; +COMP in[48000]; float s[NIN]; float fout[NIN]; unsigned short todac[NOUT]; @@ -225,7 +282,7 @@ int main(void) { FILE *f; int i; - for(i=0;i