% generate payload data bytes and checksum\r
\r
data = floor(rand(1,256)*256);\r
- % data = zeros(1,256);\r
+ %data = zeros(1,256);\r
checksum = crc16(data);\r
data = [data hex2dec(checksum(3:4)) hex2dec(checksum(1:2))];\r
\r
\r
% pack back into bytes to match python code \r
\r
- lpacked_codeword = length(codeword)/8\r
+ lpacked_codeword = length(codeword)/8;\r
packed_codeword = zeros(1,lpacked_codeword);\r
for b=1:lpacked_codeword\r
st = (b-1)*8 + 1;\r
rx = tx + noise_complex;\r
SNRdB = 10*log10(var(tx)/var(noise_real));\r
\r
- printf("resampling ...\n");\r
+ printf("fract resampling ...\n");\r
rx_resample_fract = fractional_resample(rx, 1.08331);\r
save_rtlsdr("fsk_demod_resample.iq", rx_resample_fract);\r
\r
+ % useful for HackRF\r
+ %printf("10X resampling ...\n");\r
+ %rx_resample_10M = resample(rx_resample_fract, 10, 1);\r
+ %save_rtlsdr("fsk_demod_10M.iq", rx_resample_10M);\r
+\r
printf("run C cmd line chain - uncoded PER\n");\r
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");\r
\r
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");\r
end\r
\r
- if demod_type != 5\r
+ if demod_type == 6\r
+ % C demod with complex input driven simplfied csdr command line, just measure BER of demod\r
+\r
+ assert(states.tx_real == 0, "need complex signal for this test");\r
+ rx = tx + noise_complex;\r
+ SNRdB = 10*log10(var(tx)/var(noise_real));\r
+ save_rtlsdr("fsk_demod.iq", rx);\r
+ 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");\r
+\r
+ f = fopen("fsk_demod.bin","rb"); rx_bit_stream = fread(f, "uint8")'; fclose(f);\r
+ end\r
+\r
+ if demod_type == 7\r
+ % C demod with complex input, measure uncoded and uncoded PER\r
+\r
+ assert(states.tx_real == 0, "need complex signal for this test");\r
+ rx = tx + noise_complex;\r
+ SNRdB = 10*log10(var(tx)/var(noise_real));\r
+ save_rtlsdr("fsk_demod.iq", rx);\r
+\r
+ printf("run C cmd line chain - uncoded PER\n");\r
+ 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");\r
+\r
+ printf("run C cmd line chain - LDPC coded PER\n");\r
+ 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");\r
+ end\r
+\r
+ if (demod_type != 5) && (demod_type != 7)\r
% state machine. Look for SSTV UW. When found count bit errors over one frame of bits\r
\r
state = "wait for uw";\r
\r
end\r
\r
-\r
% Measure PER of complete coded and uncoded system\r
\r
if demo == 11\r
sim_in.frames = 100;\r
EbNodB = 7;\r
- sim_in.demod_type = 5;\r
+ sim_in.demod_type = 7;\r
run_sstv_sim(sim_in, EbNodB);\r
end\r
\r
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);
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);
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 */
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;
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;i<fsk_nin(fsk);i++){
- modbuf[i].real = ((float)rawbuf[i])/FDMDV_SCALE;
- modbuf[i].imag = 0.0;
+ while( fread(rawbuf,sizeof(int16_t)*complex_input,fsk_nin(fsk),fin) == fsk_nin(fsk) ){
+ if (complex_input == 1) {
+ for(i=0;i<fsk_nin(fsk);i++){
+ modbuf[i].real = ((float)rawbuf[i])/FDMDV_SCALE;
+ modbuf[i].imag = 0.0;
+ }
+ }
+ else {
+ for(i=0;i<fsk_nin(fsk);i++){
+ modbuf[i].real = ((float)rawbuf[2*i])/FDMDV_SCALE;
+ modbuf[i].imag = ((float)rawbuf[2*i+1])/FDMDV_SCALE;
+ }
}
if(soft_dec_mode){
fsk_demod_sd(fsk,sdbuf,modbuf);
/* Demod-only test */
if(test_type == TEST_DEMOD){
while( fread(modbuf,sizeof(float),fsk_nin(fsk),fin) == fsk_nin(fsk) ){
- 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<n; i++) {
+ modbuf_comp[i].real = modbuf[i];
+ modbuf_comp[i].imag = 0.0;
+ }
+ fsk_demod(fsk,bitbuf,modbuf_comp);
fwrite(bitbuf,sizeof(uint8_t),fsk->Nbits,fout);
}
}
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<n; i++) {
+ modbuf_comp[i].real = modbuf[i];
+ modbuf_comp[i].imag = 0.0;
+ }
+ fsk_demod(fsk,bitbuf,modbuf_comp);
modbufp += fsk_nin(fsk);
}
}