From 339a6436bb07d8d7d3e3ce6fe4dd9d784af8e712 Mon Sep 17 00:00:00 2001 From: baobrien Date: Mon, 12 Sep 2016 04:50:04 +0000 Subject: [PATCH] Added soft decision output support to fsk_demod git-svn-id: https://svn.code.sf.net/p/freetel/code@2854 01035d8c-6547-0410-b346-abe4f91aad63 --- codec2-dev/src/fsk_demod.c | 138 +++++++++++++++++++++---------------- 1 file changed, 80 insertions(+), 58 deletions(-) diff --git a/codec2-dev/src/fsk_demod.c b/codec2-dev/src/fsk_demod.c index df1be049..69a91cf2 100644 --- a/codec2-dev/src/fsk_demod.c +++ b/codec2-dev/src/fsk_demod.c @@ -43,12 +43,14 @@ int main(int argc,char *argv[]){ FILE *fin,*fout; uint8_t *bitbuf; int16_t *rawbuf; - float *modbuf; + float *modbuf,*sdbuf; int i,j; + int soft_dec_mode = 0; stats_loop = 0; + if(argc<7){ - fprintf(stderr,"usage: %s Mode P SampleFreq SymbolFreq InputModemRawFile OutputOneBitPerCharFile [S]\n",argv[0]); + fprintf(stderr,"usage: %s (2|4|2X|4X|2XS) P SampleFreq SymbolFreq InputModemRawFile OutputOneBitPerCharFile [S]\n",argv[0]); exit(1); } @@ -59,33 +61,37 @@ int main(int argc,char *argv[]){ /* Open files */ if(strcmp(argv[5],"-")==0){ - fin = stdin; + fin = stdin; }else{ - fin = fopen(argv[5],"r"); + fin = fopen(argv[5],"r"); } - + if(strcmp(argv[6],"-")==0){ - fout = stdout; + fout = stdout; }else{ - fout = fopen(argv[6],"w"); + fout = fopen(argv[6],"w"); } /* Handle high-bit-rate special cases */ if(strcmp(argv[1],"2X")==0){ - M = 2; - hbr = 1; + M = 2; + hbr = 1; + }else if(strcmp(argv[1],"2XS")==0){ + M = 2; + hbr = 1; + soft_dec_mode = 1; }else if(strcmp(argv[1],"4X")==0){ - M = 4; - hbr = 1; + M = 4; + hbr = 1; }else { - M = atoi(argv[1]); + M = atoi(argv[1]); } - + /* set up FSK */ if(!hbr) - fsk = fsk_create(Fs,Rs,M,1200,400); + fsk = fsk_create(Fs,Rs,M,1200,400); else - fsk = fsk_create_hbr(Fs,Rs,P,M,1200,400); + fsk = fsk_create_hbr(Fs,Rs,P,M,1200,400); if(fin==NULL || fout==NULL || fsk==NULL){ fprintf(stderr,"Couldn't open test vector files\n"); @@ -94,60 +100,76 @@ int main(int argc,char *argv[]){ /* Check for and enable stat printing */ if(argc>7){ - if(strcmp(argv[7],"S")==0){ - enable_stats = 1; - fsk_setup_modem_stats(fsk,&stats); - loop_time = ((float)fsk_nin(fsk))/((float)Fs); - stats_loop = (int)(.125/loop_time); - stats_ctr = 0; - } + if(strcmp(argv[7],"S")==0){ + enable_stats = 1; + fsk_setup_modem_stats(fsk,&stats); + loop_time = ((float)fsk_nin(fsk))/((float)Fs); + stats_loop = (int)(.125/loop_time); + stats_ctr = 0; + } } /* allocate buffers for processing */ - bitbuf = (uint8_t*)malloc(sizeof(uint8_t)*fsk->Nbits); + if(soft_dec_mode){ + sdbuf = (float*)malloc(sizeof(float)*fsk->Nbits); + }else{ + bitbuf = (uint8_t*)malloc(sizeof(uint8_t)*fsk->Nbits); + } rawbuf = (int16_t*)malloc(sizeof(int16_t)*(fsk->N+fsk->Ts*2)); modbuf = (float*)malloc(sizeof(float)*(fsk->N+fsk->Ts*2)); /* Demodulate! */ while( fread(rawbuf,sizeof(int16_t),fsk_nin(fsk),fin) == fsk_nin(fsk) ){ - for(i=0;ippm); - fprintf(stderr,"\t\"f1_est\":%.1f,\t\"f2_est\":%.1f",fsk->f1_est,fsk->f2_est); - if(fsk->mode == 4){ - fprintf(stderr,",\t\"f3_est\":%.1f,\t\"f4_est\":%.1f",fsk->f3_est,fsk->f4_est); - } - fprintf(stderr,",\t\"eye_diagram\":["); - for(i=0;iNbits;i++){ - t = (int)bitbuf[i]; - }*/ - fwrite(bitbuf,sizeof(uint8_t),fsk->Nbits,fout); + for(i=0;ippm); + fprintf(stderr,"\t\"f1_est\":%.1f,\t\"f2_est\":%.1f",fsk->f1_est,fsk->f2_est); + if(fsk->mode == 4){ + fprintf(stderr,",\t\"f3_est\":%.1f,\t\"f4_est\":%.1f",fsk->f3_est,fsk->f4_est); + } + fprintf(stderr,",\t\"eye_diagram\":["); + for(i=0;iNbits;i++){ + t = (int)bitbuf[i]; + }*/ + if(soft_dec_mode){ + fwrite(sdbuf,sizeof(float),fsk->Nbits,fout); + }else{ + fwrite(bitbuf,sizeof(uint8_t),fsk->Nbits,fout); + } + if(fin == stdin || fout == stdin){ + fflush(fin); + fflush(fout); + } + } + + if(soft_dec_mode){ + free(sdbuf); + }else{ + free(bitbuf); } - free(bitbuf); free(rawbuf); free(modbuf); -- 2.25.1