Updated README and added bpsk31_ber.py
This commit is contained in:
parent
ee5b546439
commit
09bcde5b4e
2 changed files with 68 additions and 9 deletions
24
README.md
24
README.md
|
@ -1,14 +1,20 @@
|
|||
libcsdr
|
||||
=======
|
||||
CSDR
|
||||
====
|
||||
|
||||
`csdr` is a command line tool to carry out DSP tasks for Software Defined Radio.
|
||||
|
||||
It can be used to build simple signal processing flow graphs, right from the command line.
|
||||
|
||||
The included `libcsdr` library contains the DSP functions that `csdr` makes use of. It was designed to use auto-vectorization available in `gcc`, and also has some functions optimized with inline assembly for ARM NEON to achieve some speedup by taking advantage of SIMD command sets available in today's CPUs.
|
||||
|
||||
*libcsdr* is a set of simple DSP routines for Software Defined Radio.
|
||||
It is mostly useful for AM/FM/SSB demodulation and spectrum display.
|
||||
Feel free to use it in your projects.
|
||||
Most of the code is available under the permissive BSD license, with some optional parts under GPL. For additional details, see <a href="#licensing">licensing</a>.
|
||||
|
||||
- The package comes with a command-line tool `csdr`, which lets you build DSP processing chains by shell pipes.
|
||||
- The code of *libcsdr* was intended to be easy to follow.
|
||||
- *libcsdr* was designed to use auto-vectorization available in *gcc*. It means that it can achieve some speedup by taking advantage of SIMD command sets available in today's CPUs (e.g. SSE on x86 and NEON on ARM).
|
||||
`csdr` has already been used to build:
|
||||
|
||||
- AM/FM/SSB/CW demodulators, BPSK31 decoder and waterfall display in [OpenWebRX](https://github.com/simonyiszk/openwebrx),
|
||||
- AM/FM/SSB modulators in [qtcsdr](https://github.com/ha7ilm/qtcsdr) that can also be used standalone with [rpitx](https://github.com/ha7ilm/rpitx-app-note),
|
||||
- a decoder for FSK transmissions sent with the CC1111 wireless MCU, and also a standalone RTTY demodulator.
|
||||
|
||||
How to compile
|
||||
--------------
|
||||
|
@ -22,11 +28,11 @@ If you compile on ARM, please edit the Makefile and tailor `PARAMS_NEON` for you
|
|||
|
||||
To run the examples, you will also need <a href="http://sdr.osmocom.org/trac/wiki/rtl-sdr">rtl_sdr</a> from Osmocom, and the following packages (at least on Debian): `mplayer octave gnuplot gnuplot-x11`
|
||||
|
||||
If you compile *fftw3* from sources for use with *libcsdr*, you need to configure it with 32-bit float support enabled:
|
||||
If you compile `fftw3` from sources for use with `libcsdr`, you need to configure it with 32-bit float support enabled:
|
||||
|
||||
./configure --enable-float
|
||||
|
||||
(This is for *fftw3*, not *libcsdr*. You do not need to run the configure script before compiling *libcsdr*.)
|
||||
(This is for `fftw3`, not `libcsdr`. You do not need to run the configure script before compiling `libcsdr`.)
|
||||
|
||||
Credits
|
||||
-------
|
||||
|
|
53
grc_tests/bpsk31_ber.py
Executable file
53
grc_tests/bpsk31_ber.py
Executable file
|
@ -0,0 +1,53 @@
|
|||
#!/usr/bin/python
|
||||
|
||||
import os, time, signal
|
||||
from subprocess import *
|
||||
#https://bugs.python.org/issue1652
|
||||
|
||||
def p(x):
|
||||
global printcmds
|
||||
if printcmds: print x
|
||||
return check_output(x, shell=True)
|
||||
|
||||
printcmds=True
|
||||
|
||||
|
||||
def genfiles(snr):
|
||||
cmd="""(while true; do echo -n 'CQ CQ CQ DE HA7ILM HA7ILM HA7ILM PSE K '; done) | \
|
||||
csdr psk31_varicode_encoder_u8_u8 | \
|
||||
tee /s/bpsk31_testin | \
|
||||
csdr differential_encoder_u8_u8 | \
|
||||
csdr psk_modulator_u8_c 2 | \
|
||||
csdr psk31_interpolate_sine_cc 256 | \
|
||||
csdr awgn_cc %d | \
|
||||
csdr timing_recovery_cc GARDNER 256 0.5 2 --add_q | \
|
||||
csdr dbpsk_decoder_c_u8 | \
|
||||
dd bs=1024 count=10 of=/s/bpsk31_testout
|
||||
"""%snr
|
||||
signal.signal(signal.SIGPIPE, signal.SIG_DFL)
|
||||
if printcmds: print cmd
|
||||
os.system(cmd)
|
||||
|
||||
def getminsize():
|
||||
return min(os.path.getsize("/s/bpsk31_testout"), os.path.getsize("/s/bpsk31_testin"))
|
||||
|
||||
def mkdiff(shift):
|
||||
if shift==0:
|
||||
return int(p("cmp -l /s/bpsk31_testin /s/bpsk31_testout | wc -l"))
|
||||
elif shift<0:
|
||||
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))
|
||||
elif shift>0:
|
||||
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))
|
||||
|
||||
|
||||
lf=open("/s/output_results","w")
|
||||
|
||||
for snr in range(0,20,2):
|
||||
genfiles(snr)
|
||||
num_totalbits=getminsize()
|
||||
num_errors=None
|
||||
for shift in range(-5,5):
|
||||
curr_num_errors = mkdiff(shift)
|
||||
if not num_errors or (num_errors and num_errors > curr_num_errors):
|
||||
num_errors = curr_num_errors
|
||||
lf.write("%d; %d; %d; %d\n" %(snr, num_errors, num_totalbits, num_errors/float(num_totalbits)))
|
Loading…
Reference in a new issue