/ grc_tests / bpsk31_ber.py
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)))