From: drowe67 Date: Mon, 21 Nov 2016 21:42:40 +0000 (+0000) Subject: complex input fsk_demod running OK with test_ldpc_fsk_lib.m framework. gd BER and... X-Git-Url: http://git.whiteaudio.com/gitweb/?a=commitdiff_plain;h=18a0e46954d2ed0d9f571dea40499aa625888127;p=freetel-svn-tracking.git complex input fsk_demod running OK with test_ldpc_fsk_lib.m framework. gd BER and PER, much simpler cmd line git-svn-id: https://svn.code.sf.net/p/freetel/code@2905 01035d8c-6547-0410-b346-abe4f91aad63 --- diff --git a/codec2-dev/octave/ldpc_fsk_lib.m b/codec2-dev/octave/ldpc_fsk_lib.m index db3e6353..a47169dc 100644 --- a/codec2-dev/octave/ldpc_fsk_lib.m +++ b/codec2-dev/octave/ldpc_fsk_lib.m @@ -264,7 +264,7 @@ function frame_rs232 = gen_sstv_frame % generate payload data bytes and checksum data = floor(rand(1,256)*256); - % data = zeros(1,256); + %data = zeros(1,256); checksum = crc16(data); data = [data hex2dec(checksum(3:4)) hex2dec(checksum(1:2))]; @@ -279,7 +279,7 @@ function frame_rs232 = gen_sstv_frame % pack back into bytes to match python code - lpacked_codeword = length(codeword)/8 + lpacked_codeword = length(codeword)/8; packed_codeword = zeros(1,lpacked_codeword); for b=1:lpacked_codeword st = (b-1)*8 + 1; diff --git a/codec2-dev/octave/test_ldpc_fsk_lib.m b/codec2-dev/octave/test_ldpc_fsk_lib.m index e5109cdd..a0f6d92b 100644 --- a/codec2-dev/octave/test_ldpc_fsk_lib.m +++ b/codec2-dev/octave/test_ldpc_fsk_lib.m @@ -449,10 +449,15 @@ function [n_uncoded_errs n_uncoded_bits] = run_sstv_sim(sim_in, EbNodB) rx = tx + noise_complex; SNRdB = 10*log10(var(tx)/var(noise_real)); - printf("resampling ...\n"); + printf("fract resampling ...\n"); rx_resample_fract = fractional_resample(rx, 1.08331); save_rtlsdr("fsk_demod_resample.iq", rx_resample_fract); + % useful for HackRF + %printf("10X resampling ...\n"); + %rx_resample_10M = resample(rx_resample_fract, 10, 1); + %save_rtlsdr("fsk_demod_10M.iq", rx_resample_10M); + printf("run C cmd line chain - uncoded PER\n"); system("cat fsk_demod_resample.iq | csdr convert_u8_f | csdr bandpass_fir_fft_cc 0.1 0.4 0.05 | csdr realpart_cf | csdr convert_f_s16 | ../unittest/tsrc - - 0.9230968 | ../build_linux/src/fsk_demod 2X 8 9600 1200 - - | ../src/drs232 - /dev/null -v"); @@ -460,7 +465,34 @@ function [n_uncoded_errs n_uncoded_bits] = run_sstv_sim(sim_in, EbNodB) system("cat fsk_demod_resample.iq | csdr convert_u8_f | csdr bandpass_fir_fft_cc 0.1 0.4 0.05 | csdr realpart_cf | csdr convert_f_s16 | ../unittest/tsrc - - 0.9230968 | ../build_linux/src/fsk_demod 2XS 8 9600 1200 - - | ../src/drs232_ldpc - /dev/null -v"); end - if demod_type != 5 + if demod_type == 6 + % C demod with complex input driven simplfied csdr command line, just measure BER of demod + + assert(states.tx_real == 0, "need complex signal for this test"); + rx = tx + noise_complex; + SNRdB = 10*log10(var(tx)/var(noise_real)); + save_rtlsdr("fsk_demod.iq", rx); + system("cat fsk_demod.iq | csdr convert_u8_f | csdr convert_f_s16 | ../build_linux/src/fsk_demod 2X 8 9600 1200 - fsk_demod.bin C"); + + f = fopen("fsk_demod.bin","rb"); rx_bit_stream = fread(f, "uint8")'; fclose(f); + end + + if demod_type == 7 + % C demod with complex input, measure uncoded and uncoded PER + + assert(states.tx_real == 0, "need complex signal for this test"); + rx = tx + noise_complex; + SNRdB = 10*log10(var(tx)/var(noise_real)); + save_rtlsdr("fsk_demod.iq", rx); + + printf("run C cmd line chain - uncoded PER\n"); + system("cat fsk_demod.iq | csdr convert_u8_f | csdr convert_f_s16 | ../build_linux/src/fsk_demod 2X 8 9600 1200 - - C | ../src/drs232 - /dev/null -v"); + + printf("run C cmd line chain - LDPC coded PER\n"); + system("cat fsk_demod.iq | csdr convert_u8_f | csdr convert_f_s16 | ../build_linux/src/fsk_demod 2XS 8 9600 1200 - - C | ../src/drs232_ldpc - /dev/null -v"); + end + + if (demod_type != 5) && (demod_type != 7) % state machine. Look for SSTV UW. When found count bit errors over one frame of bits state = "wait for uw"; @@ -793,13 +825,12 @@ if demo == 10 end - % Measure PER of complete coded and uncoded system if demo == 11 sim_in.frames = 100; EbNodB = 7; - sim_in.demod_type = 5; + sim_in.demod_type = 7; run_sstv_sim(sim_in, EbNodB); end diff --git a/codec2-dev/src/fsk.c b/codec2-dev/src/fsk.c index eaf73326..0dd4c3ce 100644 --- a/codec2-dev/src/fsk.c +++ b/codec2-dev/src/fsk.c @@ -641,8 +641,8 @@ void fsk2_demod(struct FSK *fsk, uint8_t rx_bits[], float rx_sd[], COMP fsk_in[] dphi2 = comp_exp_j(2*M_PI*(f_est[1]/(float)(Fs))); } /* Downconvert and place into integration buffer */ - f1_intbuf[dc_i]=cmult(sample_src[dc_i],phi1_c); - f2_intbuf[dc_i]=cmult(sample_src[dc_i],phi2_c); + f1_intbuf[dc_i]=cmult(sample_src[dc_i],cconj(phi1_c)); + f2_intbuf[dc_i]=cmult(sample_src[dc_i],cconj(phi2_c)); modem_probe_samp_c("t_f1_dc",&f1_intbuf[dc_i],1); modem_probe_samp_c("t_f2_dc",&f2_intbuf[dc_i],1); @@ -669,8 +669,8 @@ void fsk2_demod(struct FSK *fsk, uint8_t rx_bits[], float rx_sd[], COMP fsk_in[] dphi2 = comp_exp_j(2*M_PI*((f_est[1])/(float)(Fs))); } /* Downconvert and place into integration buffer */ - f1_intbuf[cbuf_i+j]=cmult(sample_src[dc_i],phi1_c); - f2_intbuf[cbuf_i+j]=cmult(sample_src[dc_i],phi2_c); + f1_intbuf[cbuf_i+j]=cmult(sample_src[dc_i],cconj(phi1_c)); + f2_intbuf[cbuf_i+j]=cmult(sample_src[dc_i],cconj(phi2_c)); modem_probe_samp_c("t_f1_dc",&f1_intbuf[cbuf_i+j],1); modem_probe_samp_c("t_f2_dc",&f2_intbuf[cbuf_i+j],1); diff --git a/codec2-dev/src/fsk_demod.c b/codec2-dev/src/fsk_demod.c index 0aa9960b..96f287c8 100644 --- a/codec2-dev/src/fsk_demod.c +++ b/codec2-dev/src/fsk_demod.c @@ -48,11 +48,15 @@ int main(int argc,char *argv[]){ int i,j,Ndft; int soft_dec_mode = 0; stats_loop = 0; - + int complex_input = 1; if(argc<7){ - fprintf(stderr,"usage: %s (2|4|2X|4X|2XS) P SampleFreq SymbolFreq InputModemRawFile OutputOneBitPerCharFile [S]\n",argv[0]); - exit(1); + fprintf(stderr,"usage: %s (2|4|2X|4X|2XS) P SampleFreq SymbolFreq InputModemRawFile OutputOneBitPerCharFile [S] [C]\n",argv[0]); + fprintf(stderr, "2 - 2FSK low bit rate\n4 - 4FSK low bit rate\n2X - 2FSK high bit rate\n4 - 4FSK high bit rate\n2XS - high bit rate soft decision output\n\n"); + fprintf(stderr, "P - timing estimator window size, see README_fsk\n"); + fprintf(stderr, "S - dump demod stats to stderr for plotting with octave/fskdemodgui.py\n"); + fprintf(stderr, "C - complex (two sample) input\n"); + exit(1); } /* Extract parameters */ @@ -99,7 +103,8 @@ int main(int argc,char *argv[]){ goto cleanup; } - /* Check for and enable stat printing */ + /* Check for and enable stat printing and complex input */ + /* TODO: design better command line arguments */ if(argc>7){ if(strcmp(argv[7],"S")==0){ enable_stats = 1; @@ -108,22 +113,45 @@ int main(int argc,char *argv[]){ stats_loop = (int)(.125/loop_time); stats_ctr = 0; } + if(strcmp(argv[7],"C")==0){ + complex_input = 2; + } } - + if(argc>8){ + if(strcmp(argv[8],"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[8],"C")==0){ + complex_input = 2; + } + } + /* allocate buffers for processing */ 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)); + rawbuf = (int16_t*)malloc(sizeof(int16_t)*(fsk->N+fsk->Ts*2)*complex_input); modbuf = (COMP*)malloc(sizeof(COMP)*(fsk->N+fsk->Ts*2)); /* Demodulate! */ - while( fread(rawbuf,sizeof(int16_t),fsk_nin(fsk),fin) == fsk_nin(fsk) ){ - for(i=0;iNbits,fout); } } @@ -200,7 +207,14 @@ int main(int argc,char *argv[]){ bitbufp = bitbuf; modbufp = modbuf; while( modbufp < modbuf + modbufsize){ - fsk_demod(fsk,bitbuf,modbuf); + /* DR 21/11/16 temp code during port to complex */ + int n = fsk_nin(fsk); + COMP modbuf_comp[n]; + for(i=0; i