bpsk31_ber.py
1 #!/usr/bin/python 2 3 import os, time, signal 4 from subprocess import * 5 #https://bugs.python.org/issue1652 6 7 def p(x): 8 global printcmds 9 if printcmds: print x 10 return check_output(x, shell=True) 11 12 printcmds=True 13 14 15 def genfiles(snr): 16 cmd="""(while true; do echo -n 'CQ CQ CQ DE HA7ILM HA7ILM HA7ILM PSE K '; done) | \ 17 csdr psk31_varicode_encoder_u8_u8 | \ 18 tee /s/bpsk31_testin | \ 19 csdr differential_encoder_u8_u8 | \ 20 csdr psk_modulator_u8_c 2 | \ 21 csdr psk31_interpolate_sine_cc 256 | \ 22 csdr awgn_cc %d | \ 23 csdr timing_recovery_cc GARDNER 256 0.5 2 --add_q | \ 24 csdr dbpsk_decoder_c_u8 | \ 25 dd bs=1024 count=10 of=/s/bpsk31_testout 26 """%snr 27 signal.signal(signal.SIGPIPE, signal.SIG_DFL) 28 if printcmds: print cmd 29 os.system(cmd) 30 31 def getminsize(): 32 return min(os.path.getsize("/s/bpsk31_testout"), os.path.getsize("/s/bpsk31_testin")) 33 34 def mkdiff(shift): 35 if shift==0: 36 return int(p("cmp -l /s/bpsk31_testin /s/bpsk31_testout | wc -l")) 37 elif shift<0: 38 return int(p("(dd if=/dev/zero bs=%d count=1; cat /s/bpsk31_testin)>/s/bpsk31_testin0; cmp -l /s/bpsk31_testin0 /s/bpsk31_testout | wc -l"%-shift)) 39 elif shift>0: 40 return int(p("(dd if=/dev/zero bs=%d count=1; cat /s/bpsk31_testout)>/s/bpsk31_testout0; cmp -l /s/bpsk31_testin /s/bpsk31_testout0 | wc -l"%shift)) 41 42 43 lf=open("/s/output_results","w") 44 45 for snr in range(0,20,2): 46 genfiles(snr) 47 num_totalbits=getminsize() 48 num_errors=None 49 for shift in range(-5,5): 50 curr_num_errors = mkdiff(shift) 51 if not num_errors or (num_errors and num_errors > curr_num_errors): 52 num_errors = curr_num_errors 53 lf.write("%d; %d; %d; %d\n" %(snr, num_errors, num_totalbits, num_errors/float(num_totalbits)))