kopia lustrzana https://github.com/projecthorus/radiosonde_auto_rx
Merge branch 'testing' into experimental
commit
3b6fb412c0
|
|
@ -0,0 +1,70 @@
|
|||
# 2019-03-03 generate_lowsnr.py Validation
|
||||
|
||||
All of the performance testing scripts in use rely on samples with 'calibrated' Signal-to-noise ratio (SNR) - we add noise to a 'golden' sample to produce a sample with a known SNR.
|
||||
|
||||
However, instead of using SNR in the signal bandwidth, we use [Eb/N0](https://en.wikipedia.org/wiki/Eb/N0) (SNR-per-bit). This normalises the SNR, and allows comparison between modems operating at different baud rates. Eventually, this will also allow comparison of the modems with the theoretical acheivable performance of a FSK modem.
|
||||
|
||||
The calibrated SNR samples are generated using [generate_lowsnr.py](../generate_lowsnr.py). A set of [golden samples](http://rfhead.net/sondes/sonde_samples.tar.gz) (one per radiosonde type) have very high SNRs, usually about 40dB or so - enough such that all packets are easily decoded. For each sample, we measure the signal power in the sample. Then, using a calculation based on the baud rate, the sample rate, the number of bits-per-symbol, and the desired SNR, we can generate white noise with a given noise power. This is added to the sample, which is then normalised (to +/-1.0) and saved. These samples can then be run through the various demodulation chains to measure their performance.
|
||||
|
||||
To be sure these measurements are meainingful, we need some confidence that the right amount of noise is being applied. We can do this by generating a FSK signal with known bits, and running it through the `generate_lowsnr.py` script. The 'noisy' signals can then be passed back into a FSK demodulator, and the Bit-Error-Eate (BER) measured. [David Rowe's FSK modem](http://svn.code.sf.net/p/freetel/code/codec2-dev/README_fsk.txt) has previously been demonstrated to have performance essentially equal to that of a theoretical non-coherent FSK modem, and so is ideal for this purpose.
|
||||
|
||||
## Generation of FSK
|
||||
The codec2-dev repository (which contains the fsk modem mentioned above) has a suite of utilities for testing modem performance. For our testing we will use the following utilities:
|
||||
|
||||
* **fsk_get_test_bits**: Generate a sequence of test bits, based off a known pseudorandom seed.
|
||||
* **fsk_mod**: Generate a FSK signal with provided baud rate, sample rate, centre frequency, and shift. Samples are accepted as one-byte-per-bit via stdin. fsk_mod usually generated real-valued outputs, but with a small modification can produce a complex output.
|
||||
* **fsk_demod**: Demodulate a FSK signal, with provided sample rate and baud rate. fsk_demod can accept real and complex-valued samples - we are using compex-valued samples.
|
||||
* **fsk_put_test_bits**: Receive the sequence of test bits, and provide BER statistics.
|
||||
|
||||
These utilities can be chained together using bash pipes, with a basic example being:
|
||||
```
|
||||
./fsk_get_test_bits - 100000 | ./fsk_mod 2 96000 4800 22000 4800 - - | ./fsk_demod --cs16 2 96000 4800 - - | ./fsk_put_test_bits -
|
||||
```
|
||||
Which produces output:
|
||||
```
|
||||
errs: 0 FSK BER 0.000000, bits tested 100, bit errors 0
|
||||
errs: 0 FSK BER 0.000000, bits tested 200, bit errors 0
|
||||
errs: 0 FSK BER 0.000000, bits tested 300, bit errors 0
|
||||
errs: 0 FSK BER 0.000000, bits tested 400, bit errors 0
|
||||
<lots of lines here>
|
||||
errs: 0 FSK BER 0.000000, bits tested 99900, bit errors 0
|
||||
```
|
||||
The settings used in this example (96 kHz sample rate, 4800 baud) are typical of some of the sample radiosonde signals.
|
||||
|
||||
The test signal can be saved to a file easily using:
|
||||
```
|
||||
./fsk_get_test_bits - 100000 | ./fsk_mod 2 96000 4800 22000 4800 - - > test_bits.bin
|
||||
```
|
||||
The `generate_lowsnr.py` works on complex float (64-bit) samples, so we convert the file using [csdr](https://github.com/simonyiszk/csdr):
|
||||
```
|
||||
cat test_bits.bin | csdr convert_s16_f > test_bits_f.bin
|
||||
```
|
||||
|
||||
## Adding Noise
|
||||
`generate_lowsnr.py` has a list of samples to process near the top of the source file. To process test_bits_f, an entry is added to the list, and all other entries commented out:
|
||||
|
||||
```
|
||||
SAMPLES = [
|
||||
['../test_bits_f.bin', 4800, -100.0, 96000],
|
||||
#['rs41_96k_float.bin', 4800, -20.0, 96000],
|
||||
#['rs92_96k_float.bin', 2400, -100, 96000], # No threshold set, as signal is continuous.
|
||||
#['dfm09_96k_float.bin', 2500, -100, 96000], # Weird baud rate. No threshold set, as signal is continuous.
|
||||
#['m10_96k_float.bin', 9616, -10.0, 96000] # Really weird baud rate.
|
||||
]
|
||||
```
|
||||
The parameters in the list are:
|
||||
* The source sample filename.
|
||||
* The baud rate of the source file
|
||||
* A threshold, which is used to identify sections of the file containing packets, so as to accurately calculate the signal power. As this file contains a continuous FSK signal, the threshold is set very low, so the entire file is used for calculations.
|
||||
* The sample rate of the file.
|
||||
|
||||
The script is then run, and produces a set of files named `test_bits_f_16.0dB.bin` or similar. These can then be run back through the demodulator code using:
|
||||
```
|
||||
cat test_bits_f_16.0dB.bin | csdr convert_f_s16 | ./fsk_demod --cs16 2 96000 4800 - - | ./fsk_put_test_bits -
|
||||
```
|
||||
|
||||
Collating the results, we obtain the following results:
|
||||
|
||||

|
||||
|
||||
The resulting BER closely matches the [theoretical](www.atlantarf.com/FSK_Modulation.php) FSK performance curve (some error due to the non-infinite number of packets used)! This provides good confidence that `generate_lowsnr.py` is producing samples with the correct Eb/N0.
|
||||
Ładowanie…
Reference in New Issue