aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt22
-rw-r--r--README.md25
-rw-r--r--README_fsk.md4
-rw-r--r--misc/16_8_short.c47
-rw-r--r--misc/CMakeLists.txt35
-rw-r--r--misc/de.c59
-rw-r--r--misc/extract.c117
-rw-r--r--misc/ge_train.c306
-rw-r--r--misc/genlsp.c183
-rw-r--r--misc/pre.c59
-rw-r--r--misc/raw2h.c45
-rw-r--r--misc/speexnoisesup.c58
-rw-r--r--misc/tcodec2.c220
-rw-r--r--misc/tdec.c141
-rw-r--r--misc/timpulse.c128
-rw-r--r--misc/tinterp.c151
-rw-r--r--misc/tlininterp.c153
-rw-r--r--misc/tnlp.c164
-rw-r--r--misc/tprede.c53
-rw-r--r--misc/tquant.c214
-rw-r--r--misc/tsrc.c109
-rw-r--r--misc/vq_binary_switch.c296
-rw-r--r--misc/vqtrain.c399
-rw-r--r--octave/2400ab_frame_design.odsbin19194 -> 0 bytes
-rw-r--r--octave/apsk_ser.m56
-rw-r--r--octave/c2wideband_map8
-rw-r--r--octave/channel_lib.m2
-rw-r--r--octave/closed_quant_slope.m3
-rw-r--r--octave/cma.m114
-rw-r--r--octave/codec2_demo.m108
-rw-r--r--octave/cohpsk_plots.m141
-rw-r--r--octave/doppler_spread_ut.m51
-rw-r--r--octave/estsnr.m65
-rw-r--r--octave/fdmdv_ut_freq_off.m489
-rw-r--r--octave/fm.m484
-rw-r--r--octave/fm_radio_filt_model.txt8
-rw-r--r--octave/fmfsk.m346
-rw-r--r--octave/fsk4_dmr.m540
-rw-r--r--octave/fsk_basic.m60
-rw-r--r--octave/fsk_cml.m132
-rw-r--r--octave/fsk_cml_sam.m376
-rwxr-xr-xoctave/fsk_demod_BER_test.py610
-rw-r--r--octave/fsk_lib_ldpc_rx.m102
-rw-r--r--octave/fsk_lib_ldpc_tx.m44
-rw-r--r--octave/fsk_llr_plot.m51
-rw-r--r--octave/fsk_llr_test.m294
-rw-r--r--octave/fsk_lock_down.m393
-rw-r--r--octave/fsk_v_afsk.m232
-rw-r--r--octave/fskdemodgui.py220
-rw-r--r--octave/gmsk.m1021
-rw-r--r--octave/hackrf_dc.m26
-rw-r--r--octave/hackrf_twotone.m24
-rw-r--r--octave/hackrf_uc.m47
-rw-r--r--octave/hf_modem_curves.m272
-rw-r--r--octave/hf_sim.m78
-rw-r--r--octave/horus_msg.txt1
-rw-r--r--octave/hp_filt.m12
-rw-r--r--octave/impulse_noise.m122
-rw-r--r--octave/ldpc_gen_c_h_file.m142
-rw-r--r--octave/ldpc_gen_h_file.m72
-rw-r--r--octave/load_comp.m9
-rw-r--r--octave/load_f32.m14
-rw-r--r--octave/load_hackrf.m11
-rw-r--r--octave/load_rtlsdr.m11
-rw-r--r--octave/make_hilb.m60
-rw-r--r--octave/make_ssbfilt.m39
-rw-r--r--octave/mancyfsk.m500
-rw-r--r--octave/mfsk.m199
-rw-r--r--octave/newamp1_fbf.m144
-rw-r--r--octave/nf_from_gr.m129
-rw-r--r--octave/nf_from_stdio.m133
-rw-r--r--octave/oqpsk.m521
-rw-r--r--octave/papr_test.m407
-rw-r--r--octave/phase_noise.m72
-rw-r--r--octave/pitch_test.m39
-rw-r--r--octave/pl.m45
-rw-r--r--octave/pl2.m44
-rw-r--r--octave/pl_scatter.m13
-rw-r--r--octave/plamp.m135
-rw-r--r--octave/plinterp.m11
-rw-r--r--octave/pllpcpf.m150
-rw-r--r--octave/pllsp.m46
-rw-r--r--octave/pllspdt.m27
-rw-r--r--octave/plnlp.m134
-rw-r--r--octave/plphase.m198
-rw-r--r--octave/plpitch.m36
-rw-r--r--octave/plvoicing.m89
-rw-r--r--octave/png.m25
-rw-r--r--octave/power_from_stdio.m27
-rw-r--r--octave/pulse.m37
-rw-r--r--octave/qam16_test.m141
-rw-r--r--octave/rf_bpf.m37
-rw-r--r--octave/rf_design.m77
-rw-r--r--octave/rf_vhf_amp.m206
-rw-r--r--octave/rf_vhf_pa.m111
-rw-r--r--octave/save_array_c_header.m14
-rw-r--r--octave/save_comp.m12
-rw-r--r--octave/save_f32.m12
-rw-r--r--octave/save_hackrf.m13
-rw-r--r--octave/save_raw.m7
-rw-r--r--octave/snr_curves_plot.m262
-rw-r--r--octave/tcohpsk.m12
-rw-r--r--octave/tdetphase.m84
-rw-r--r--octave/test_dqpsk2.m465
-rw-r--r--octave/test_ldpc_fsk_lib.m851
-rw-r--r--octave/tfsk_2400a.m648
-rw-r--r--octave/train_all_speech_1.txt514
-rw-r--r--octave/train_all_speech_2.txt514
-rw-r--r--octave/trellis.m594
-rw-r--r--octave/trellis_dec3_nstage3.txt15
-rw-r--r--octave/vq10247
-rw-r--r--octave/vq_700c_eq.m366
-rw-r--r--octave/vq_binary_switch.m210
-rw-r--r--octave/vq_compare.m349
-rw-r--r--octave/vq_nm_xx_11_40_hpf1501615
-rw-r--r--raw/700d_end_over.rawbin238720 -> 0 bytes
-rw-r--r--raw/big_dog.rawbin40000 -> 0 bytes
-rw-r--r--raw/cq_ref.rawbin143828 -> 0 bytes
-rw-r--r--raw/cross.rawbin48000 -> 0 bytes
-rw-r--r--raw/f2400.rawbin27680 -> 0 bytes
-rw-r--r--raw/forig.rawbin25224 -> 0 bytes
-rw-r--r--raw/g3plx.rawbin91286 -> 0 bytes
-rw-r--r--raw/hts.rawbin384000 -> 0 bytes
-rw-r--r--raw/hts2.rawbin96000 -> 0 bytes
-rw-r--r--raw/hts2a.rawbin48000 -> 0 bytes
-rw-r--r--raw/m2400.rawbin33624 -> 0 bytes
-rw-r--r--raw/mmt1.rawbin64000 -> 0 bytes
-rw-r--r--raw/morig.rawbin32056 -> 0 bytes
-rw-r--r--raw/sine1k_2Hz_spread.rawbin962560 -> 0 bytes
-rw-r--r--raw/sine1k_2ms_delay_2Hz_spread.rawbin962560 -> 0 bytes
-rw-r--r--raw/speech_orig_16k.wavbin345644 -> 0 bytes
-rw-r--r--raw/test_datac1_006.rawbin805546 -> 0 bytes
-rw-r--r--raw/vk5qi.rawbin216716 -> 0 bytes
-rwxr-xr-xscript/gen_phi0136
-rwxr-xr-xscript/ofdm_stack_use.py150
-rwxr-xr-xscript/phi0_plot.py80
-rwxr-xr-xscript/separate_all.sh11
-rwxr-xr-xscript/subsetvq.sh148
-rwxr-xr-xscript/test_2020x.sh166
-rwxr-xr-xscript/train_700c_quant.sh107
-rwxr-xr-xscript/train_sub_quant.sh53
-rw-r--r--src/CMakeLists.txt12
-rw-r--r--src/c2dec.c6
-rw-r--r--src/cohpsk_mod.c5
-rw-r--r--src/fdmdv_mod.c4
-rw-r--r--src/fm_demod.c115
-rw-r--r--src/fmfsk_demod.c150
-rw-r--r--src/fmfsk_mod.c104
-rw-r--r--src/fsk_demod.c2
-rw-r--r--src/fsk_mod_ext_vco.c143
-rw-r--r--unittest/CMakeLists.txt38
-rw-r--r--unittest/fdmdv_mem.c63
-rw-r--r--unittest/function_trace.c36
-rw-r--r--unittest/hts1a_1300.h8002
-rw-r--r--unittest/mksine.c (renamed from misc/mksine.c)0
-rwxr-xr-xunittest/ofdm_fade_dpsk.sh15
-rw-r--r--unittest/ofdm_mem.c107
-rw-r--r--unittest/ofdm_stack.c229
-rwxr-xr-xunittest/ota_auto.sh15
-rwxr-xr-xunittest/ota_last.sh70
-rwxr-xr-xunittest/ota_summary.sh55
-rwxr-xr-xunittest/ota_test.sh161
-rwxr-xr-xunittest/ota_voice_auto.sh23
-rwxr-xr-xunittest/ota_voice_summary.sh80
-rwxr-xr-xunittest/ota_voice_test.sh309
-rw-r--r--unittest/raw_data_curves/Makefile132
-rwxr-xr-xunittest/raw_data_curves/snr_curves.sh184
-rw-r--r--unittest/sd.c84
-rw-r--r--unittest/sd.h33
-rwxr-xr-xunittest/spectrogram.sh17
-rw-r--r--unittest/t_helpers.c38
-rw-r--r--unittest/t_helpers.h41
-rw-r--r--unittest/tcontphase.c186
-rw-r--r--unittest/tdeframer.c148
-rw-r--r--unittest/test_phi0.c78
-rw-r--r--unittest/tfreedv_2400A_rawdata.c2
-rw-r--r--unittest/tfreedv_2400B_rawdata.c2
-rwxr-xr-xunittest/tnc1_high_snr.sh103
-rwxr-xr-xunittest/tnc4_high_snr_ping.sh114
-rw-r--r--unittest/tprede.c53
-rw-r--r--unittest/tquisk_filter.c3
-rw-r--r--unittest/tst_codec2_fft_init.c97
-rw-r--r--unittest/vq_mbest.c (renamed from misc/vq_mbest.c)0
-rw-r--r--wav/all.wavbin913868 -> 0 bytes
-rw-r--r--wav/big_dog.wavbin40044 -> 0 bytes
-rw-r--r--wav/cross.wavbin24058 -> 0 bytes
-rw-r--r--wav/f2400.wavbin27726 -> 0 bytes
-rw-r--r--wav/forig.wavbin25268 -> 0 bytes
-rw-r--r--wav/hts1a.wavbin48044 -> 0 bytes
-rw-r--r--wav/hts2a.wavbin48044 -> 0 bytes
-rw-r--r--wav/m2400.wavbin33668 -> 0 bytes
-rw-r--r--wav/mmt1.wavbin64044 -> 0 bytes
-rw-r--r--wav/morig.wavbin32100 -> 0 bytes
-rw-r--r--wav/ve9qrp.wavbin1799212 -> 0 bytes
-rw-r--r--wav/vk5qi.wavbin216760 -> 0 bytes
195 files changed, 36 insertions, 42289 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 9f86826..ba7cdd5 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -13,7 +13,7 @@ set(CMAKE_OSX_DEPLOYMENT_TARGET "10.9" CACHE STRING "Minimum OS X deployment ver
cmake_minimum_required(VERSION 3.13)
project(CODEC2
- VERSION 1.1.1
+ VERSION 1.2.0
DESCRIPTION "Next-Generation Digital Voice for Two-Way Radio"
HOMEPAGE_URL "https://www.rowetel.com/codec2.html"
LANGUAGES C
@@ -118,12 +118,6 @@ endif(MINGW)
option(BUILD_SHARED_LIBS
"Build shared library. Set to OFF for static library." ON)
option(UNITTEST "Build unittest binaries." OFF)
-option(INSTALL_EXAMPLES "Install example code." OFF)
-if(INSTALL_EXAMPLES)
- install(DIRECTORY octave raw script wav
- USE_SOURCE_PERMISSIONS
- DESTINATION ${CMAKE_INSTALL_DATADIR}/codec2)
-endif()
# LPCNet needs to be bootstraped because codec2 and freedvlpcnet are
# cross dependent.
@@ -135,7 +129,6 @@ if(LPCNET_BUILD_DIR)
endif()
-
include(CheckIncludeFiles)
check_include_files("stdlib.h" HAVE_STDLIB_H)
check_include_files("string.h" HAVE_STRING_H)
@@ -229,7 +222,6 @@ if(UNITTEST)
message(STATUS "Threads library flags: ${CMAKE_THREAD_LIBS_INIT}")
add_subdirectory(unittest)
- add_subdirectory(misc)
endif(UNITTEST)
message(STATUS "Build type is: " ${CMAKE_BUILD_TYPE})
@@ -361,7 +353,7 @@ endif()
# just the +ve freq exp(jwn) so output power is 0.5 input power
add_test(NAME test_quisk_filter
COMMAND sh -c "cd ${CMAKE_CURRENT_SOURCE_DIR}/octave;
- ${CMAKE_CURRENT_BINARY_DIR}/misc/mksine in.raw 1500 1;
+ ${CMAKE_CURRENT_BINARY_DIR}/unittest/mksine in.raw 1500 1;
cat in.raw | ${CMAKE_CURRENT_BINARY_DIR}/unittest/tquisk_filter |
sox -t .s16 -r 8000 -c 1 - -t .s16 out.raw vol 2;
cd ${CMAKE_CURRENT_SOURCE_DIR}/octave;
@@ -384,15 +376,15 @@ endif()
# check channel simulator measures correct Peak to Average Power Ratio (about 0dB) with a sine wave input signal
add_test(NAME test_ch_papr
COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR};
- ./misc/mksine - 1000 10 | ./src/ch - /dev/null --ctest")
+ ./unittest/mksine - 1000 10 | ./src/ch - /dev/null --ctest")
add_test(NAME test_codec2_700c_octave_port
COMMAND sh -c "
cd ${CMAKE_CURRENT_BINARY_DIR}/src;
- ./c2sim ${CMAKE_CURRENT_SOURCE_DIR}/raw/cq_ref.raw --phase0 --postfilter --dump cq_ref --lpc 10 --dump_pitch_e cq_ref_pitche.txt;
- cd ${CMAKE_CURRENT_BINARY_DIR}/unittest; ./tnewamp1 ${CMAKE_CURRENT_SOURCE_DIR}/raw/cq_ref.raw;
+ ./c2sim ${CMAKE_CURRENT_SOURCE_DIR}/raw/hts1a.raw --phase0 --postfilter --dump hts1a --lpc 10 --dump_pitch_e hts1a_pitche.txt;
+ cd ${CMAKE_CURRENT_BINARY_DIR}/unittest; ./tnewamp1 ${CMAKE_CURRENT_SOURCE_DIR}/raw/hts1a.raw;
cd ${CMAKE_CURRENT_SOURCE_DIR}/octave;
- DISPLAY=\"\" octave-cli -qf --eval 'tnewamp1(\"${CMAKE_CURRENT_BINARY_DIR}/src/cq_ref\", \"${CMAKE_CURRENT_BINARY_DIR}/unittest\")'")
+ DISPLAY=\"\" octave-cli -qf --eval 'tnewamp1(\"${CMAKE_CURRENT_BINARY_DIR}/src/hts1a\", \"${CMAKE_CURRENT_BINARY_DIR}/unittest\")'")
set_tests_properties(test_codec2_700c_octave_port PROPERTIES PASS_REGULAR_EXPRESSION "fails: 0")
# -------------------------------------------------------------------------
@@ -1162,7 +1154,7 @@ endif(NOT APPLE)
add_test(NAME test_vq_mbest
COMMAND sh -c "./tvq_mbest; \
cat target.f32 | \
- ../misc/vq_mbest -k 4 -q vq1.f32,vq2.f32 --st 1 --en 2 --mbest 2 -v > /dev/null;"
+ ./vq_mbest -k 4 -q vq1.f32,vq2.f32 --st 1 --en 2 --mbest 2 -v > /dev/null;"
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/unittest
)
set_tests_properties(test_vq_mbest PROPERTIES PASS_REGULAR_EXPRESSION "MSE: 0.00")
diff --git a/README.md b/README.md
index 097a4de..0785a5e 100644
--- a/README.md
+++ b/README.md
@@ -5,12 +5,13 @@ Codec 2 is an open source (LGPL 2.1) low bit rate speech codec: http://rowetel.c
Also included:
+ The FreeDV API for digital voice over radio. FreeDV is an open source digital voice protocol that integrates modems, codecs, and FEC [README_freedv](README_freedv.md)
- + APIs for raw and Ethernet packet data over radio [README_data](README_data.md)
- + High performance coherent OFDM modem for HF channels [README_ofdm](README_ofdm.md)
- + High performance non-coherent FSK modem [README_fsk](README_fsk.md)
+ + HF OFDM and FSK modems, FEC used in the FreeDV API
+ + APIs for packet data over radio [README_data](README_data.md)
+ An STM32 embedded version of FreeDV 1600/700D/700E for the [SM1000](stm32/README.md)
- + Coherent PSK modem [README_cohpsk](README_cohpsk.md) for HF channels
- + FDMDV DPSK modem [README_fdmdv](README_fdmdv.md) for HF channels
+
+## Older code
+
+In July 2023 this repo was refactored, older code can be found in https://github.com/drowe67/codec2-dev
## Quickstart
@@ -154,10 +155,7 @@ CTest is used as a test framework, with support from [GNU Octave](https://www.gn
```
cmake - cmake support files
demo - Simple Codec 2 and FreeDv API demo applications
-misc - misc C programs that have been useful in development,
- not reqd for Codec 2 release. Part of Debug build.
-octave - Octave scripts used to support development
-script - shell scripts for playing and converting raw files
+octave - Octave scripts used to support ctests
src - C source code for Codec 2, FDMDV modem, COHPSK modem, FreeDV API
raw - speech files in raw format (16 bits signed linear 8 kHz)
stm32 - STM32F4 microcontroller and SM1000 FreeDV Adaptor support
@@ -175,15 +173,6 @@ wav - speech files in wave file format
make
```
-1. For dump file support (dump data from c2sim for input to Octave development scripts):
- ```
- cd ~/codec2
- rm -Rf build_linux && mkdir build_linux
- cd build_linux
- CFLAGS=-DDUMP cmake ..
- make
- ```
-
## Building for Windows on a Linux machine
We recommend using Linux to cross compile for Windows.
diff --git a/README_fsk.md b/README_fsk.md
index fafc96b..820b55b 100644
--- a/README_fsk.md
+++ b/README_fsk.md
@@ -124,11 +124,7 @@ The Octave version of the modem was developed by David Rowe. Brady O'Brien port
| fsk_lib.m | Core FSK modem library |
| fsk_lib_demo.m | A demonstration of fsk_lib, runs a single point BER test |
| fsk_demod_file.m | Demodulates FSK signals from a file, useful for debugging FSK waveforms |
- | fsk_lock_down.m | simulations to support the "lock down" low SNR waveform |
| tfsk.m | automated test that compares the C and Octave versions of the modem |
- | fsk_cml.m | Symbol rate experiments with FSK modem LLR estimation and LDPC |
- | fsk_cml_sam.m | Sample rate experiments with FSK modem LLR estimation and LDPC |
- | fsk_llr_plot.m | Plots curves from fsk_cml.m & fsk_cml_sam.m |
| fsk_lib_ldpc_demo.m | CML library LLR routines and LDPC codes with fsk_lib.m |
You can run many of them from the Octave command line:
diff --git a/misc/16_8_short.c b/misc/16_8_short.c
deleted file mode 100644
index a23722c..0000000
--- a/misc/16_8_short.c
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- 16_8_short.c
- David Rowe
- October 2018
-
- Utility for resampling raw files from 16 to 8 kHz.
-*/
-
-#include <assert.h>
-#include <math.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include "codec2_fdmdv.h"
-
-#define N8 160 /* procssing buffer size at 8 kHz */
-#define N16 (N8*FDMDV_OS)
-
-int main(int argc, char *argv[]) {
- short in16k_short[FDMDV_OS_TAPS_16K + N16];
- FILE *f16;
- short out8k_short[N16];
- FILE *f8;
- int i;
-
- if (argc != 3) {
- fprintf(stderr, "usage: %s 16kHz.raw 8kHz.raw\n", argv[0]);
- exit(1);
- }
- f16 = fopen(argv[1], "rb");
- assert(f16 != NULL);
- f8 = fopen(argv[2], "wb");
- assert(f8 != NULL);
-
- /* clear filter memories */
-
- for(i=0; i<FDMDV_OS_TAPS_16K; i++)
- in16k_short[i] = 0;
-
- while(fread(&in16k_short[FDMDV_OS_TAPS_16K], sizeof(short), N16, f16) == N16) {
- fdmdv_16_to_8_short(out8k_short, &in16k_short[FDMDV_OS_TAPS_16K], N8);
- fwrite(out8k_short, sizeof(short), N8, f8);
- }
-
- fclose(f16);
- fclose(f8);
- return 0;
-}
diff --git a/misc/CMakeLists.txt b/misc/CMakeLists.txt
deleted file mode 100644
index 55728b4..0000000
--- a/misc/CMakeLists.txt
+++ /dev/null
@@ -1,35 +0,0 @@
-add_definitions(-DFLOATING_POINT -DVAR_ARRAYS)
-include_directories(../src)
-
-add_executable(mksine mksine.c)
-target_link_libraries(mksine m)
-
-add_executable(16_8_short 16_8_short.c ../src/fdmdv.c ../src/kiss_fft.c)
-target_link_libraries(16_8_short codec2)
-
-add_executable(extract extract.c)
-
-add_executable(vqtrain vqtrain.c)
-target_link_libraries(vqtrain m)
-
-add_executable(raw2h raw2h.c)
-target_link_libraries(raw2h codec2)
-
-add_executable(tnlp tnlp.c)
-target_link_libraries(tnlp codec2)
-
-add_executable(tlininterp tlininterp.c)
-
-add_executable(tdec tdec.c)
-
-add_executable(timpulse timpulse.c)
-target_link_libraries(timpulse m)
-
-add_executable(vq_mbest vq_mbest.c)
-target_link_libraries(vq_mbest codec2)
-
-add_executable(vq_binary_switch vq_binary_switch.c)
-target_link_libraries(vq_binary_switch m)
-
-add_executable(pre pre.c)
-target_link_libraries(pre codec2)
diff --git a/misc/de.c b/misc/de.c
deleted file mode 100644
index 9726743..0000000
--- a/misc/de.c
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- de.c
- David Rowe
- Sep 26 2012
-
- Takes audio from a file, de-emphasises, and sends to output file.
-*/
-
-#include <assert.h>
-#include <errno.h>
-#include <math.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include "lpc.h"
-
-#define N 80
-
-int main(int argc, char *argv[]) {
- FILE *fin, *fout;
- short buf[N];
- float Sn[N], Sn_de[N];
- float de_mem = 0.0;
- int i;
-
- if (argc != 3) {
- printf("usage: de InputRawSpeechFile OutputRawSpeechFile\n");
- printf("e.g de input.raw output.raw");
- exit(1);
- }
-
- if (strcmp(argv[1], "-") == 0) fin = stdin;
- else if ( (fin = fopen(argv[1],"rb")) == NULL ) {
- fprintf(stderr, "Error opening input speech file: %s: %s.\n",
- argv[1], strerror(errno));
- exit(1);
- }
-
- if (strcmp(argv[2], "-") == 0) fout = stdout;
- else if ( (fout = fopen(argv[2],"wb")) == NULL ) {
- fprintf(stderr, "Error opening output speech file: %s: %s.\n",
- argv[2], strerror(errno));
- exit(1);
- }
-
- while(fread(buf, sizeof(short), N, fin) == N) {
- for(i=0; i<N; i++)
- Sn[i] = buf[i];
- de_emp(Sn_de, Sn, &de_mem, N);
- for(i=0; i<N; i++)
- buf[i] = Sn_de[i];
- fwrite(buf, sizeof(short), N, fout);
- }
-
- fclose(fin);
- fclose(fout);
-
- return 0;
-}
diff --git a/misc/extract.c b/misc/extract.c
deleted file mode 100644
index b4f38db..0000000
--- a/misc/extract.c
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- extract.c
- david Rowe Jan 2019
-
- Extracts sub sets of vectors from .f32 files, used for LPCNet VQ experiments.
-*/
-
-#include <assert.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <getopt.h>
-
-#define NB_FEATURES 55 /* number of cols per row */
-
-int main(int argc, char *argv[]) {
- FILE *fin, *fout;
- int st = 0;
- int en = 17;
- int stride = NB_FEATURES;
- float gain = 1.0;
- int frame_delay = 1;
- float pred = 0.0;
- int removemean = 0;
- float lower = -1E32;
-
- static struct option long_options[] = {
- {"startcol", required_argument, 0, 's'},
- {"endcol", required_argument, 0, 'e'},
- {"stride", required_argument, 0, 't'},
- {"gain", required_argument, 0, 'g'},
- {"pred", required_argument, 0, 'p'},
- {"delay", required_argument, 0, 'd'},
- {"removemean", no_argument, 0, 'm'},
- {"lower", required_argument, 0, 'l'},
- {0, 0, 0, 0}
- };
-
- int opt_index = 0;
- int c;
-
- while ((c = getopt_long (argc, argv, "s:e:t:g:p:d:ml:", long_options, &opt_index)) != -1) {
- switch (c) {
- case 's':
- st = atoi(optarg);
- break;
- case 'e':
- en = atoi(optarg);
- break;
- case 't':
- stride = atoi(optarg);
- break;
- case 'g':
- gain = atof(optarg);
- break;
- case 'p':
- pred = atof(optarg);
- break;
- case 'd':
- frame_delay = atoi(optarg);
- break;
- case 'm':
- removemean = 1;
- break;
- case 'l':
- lower = atof(optarg);
- break;
- default:
- helpmsg:
- fprintf(stderr, "usage: %s -s startCol -e endCol [-t strideCol -g gain -p predCoeff -d framesDelay --removemean --lower] input.f32 output.f32\n", argv[0]);
- exit(1);
- }
- }
- if ( (argc - optind) < 2) {
- fprintf(stderr, "Too few arguments\n");
- goto helpmsg;
- }
-
- fin = fopen(argv[optind],"rb"); assert(fin != NULL);
- fout = fopen(argv[optind+1],"wb"); assert(fout != NULL);
- printf("extracting from %d to %d inclusive (stride %d) ... gain = %f pred = %f frame_delay = %d\n",
- st, en, stride, gain, pred, frame_delay);
-
- float features[stride], features_prev[frame_delay][stride], delta[stride];
- int i,f,wr=0;
-
- for (f=0; f<frame_delay; f++)
- for(i=0; i<stride; i++)
- features_prev[f][i] = 0.0;
-
- while((fread(features, sizeof(float), stride, fin) == stride)) {
- float mean = 0.0;
- for(i=st; i<=en; i++)
- mean += features[i];
- mean /= (en-st+1);
- if (removemean) {
- for(i=st; i<=en; i++)
- features[i] -= mean;
- }
- for(i=st; i<=en; i++) {
- delta[i] = gain*(features[i] - pred*features_prev[frame_delay-1][i]);
- }
- if (mean > lower) {
- fwrite(&delta[st], sizeof(float), en-st+1, fout);
- wr++;
- }
- for (f=frame_delay-1; f>0; f--)
- for(i=0; i<stride; i++)
- features_prev[f][i] = features_prev[f-1][i];
- for(i=0; i<stride; i++)
- features_prev[0][i] = features[i];
- }
-
- fclose(fin); fclose(fout);
- fprintf(stderr, "%d extracted\n", wr);
- return 0;
-}
-
diff --git a/misc/ge_train.c b/misc/ge_train.c
deleted file mode 100644
index db786fc..0000000
--- a/misc/ge_train.c
+++ /dev/null
@@ -1,306 +0,0 @@
-/*
- ge_train.c
- Jean Marc Valin Feb 2012
-
- Joint pitch and energy VQ training program
-
- usage:
-
- cat GE | ./ge_train 2 1000000 8 > quantized
-
- The first column is the log2 of the pitch compared to the lowest freq,
- so log2(wo/pi*4000/50) where wo is the frequency your patch outputs. The
- second column is the energy in dB, so 10*log10(1e-4+E)
-*/
-
-/*
- Copyright (C) 2012 Jean-Marc Valin
-
- All rights reserved.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License version 2.1, as
- published by the Free Software Foundation. This program is
- distributed in the hope that it will be useful, but WITHOUT ANY
- WARRANTY; without even the implied warranty of MERCHANTABILITY or
- FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
- License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <valgrind/memcheck.h>
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <math.h>
-
-#define MIN(a,b) ((a)<(b)?(a):(b))
-//#define COEF 0.0
-
-static float COEF[2] = {0.8, 0.9};
-//static float COEF[2] = {0.0, 0.};
-
-#define MAX_ENTRIES 16384
-
-void compute_weights2(const float *x, const float *xp, float *w, int ndim)
-{
- w[0] = 30;
- w[1] = 1;
- if (x[1]<0)
- {
- w[0] *= .6;
- w[1] *= .3;
- }
- if (x[1]<-10)
- {
- w[0] *= .3;
- w[1] *= .3;
- }
- /* Higher weight if pitch is stable */
- if (fabs(x[0]-xp[0])<.2)
- {
- w[0] *= 2;
- w[1] *= 1.5;
- } else if (fabs(x[0]-xp[0])>.5) /* Lower if not stable */
- {
- w[0] *= .5;
- }
-
- /* Lower weight for low energy */
- if (x[1] < xp[1]-10)
- {
- w[1] *= .5;
- }
- if (x[1] < xp[1]-20)
- {
- w[1] *= .5;
- }
-
- //w[0] = 30;
- //w[1] = 1;
-
- /* Square the weights because it's applied on the squared error */
- w[0] *= w[0];
- w[1] *= w[1];
-
-}
-
-int find_nearest_weighted(const float *codebook, int nb_entries, float *x, const float *w, int ndim)
-{
- int i, j;
- float min_dist = 1e15;
- int nearest = 0;
-
- for (i=0;i<nb_entries;i++)
- {
- float dist=0;
- for (j=0;j<ndim;j++)
- dist += w[j]*(x[j]-codebook[i*ndim+j])*(x[j]-codebook[i*ndim+j]);
- if (dist<min_dist)
- {
- min_dist = dist;
- nearest = i;
- }
- }
- return nearest;
-}
-
-int quantize_ge(const float *x, const float *codebook1, int nb_entries, float *xq, int ndim)
-{
- int i, n1;
- float err[ndim];
- float w[ndim];
-
- compute_weights2(x, xq, w, ndim);
-
- for (i=0;i<ndim;i++)
- err[i] = x[i]-COEF[i]*xq[i];
- n1 = find_nearest_weighted(codebook1, nb_entries, err, w, ndim);
-
- for (i=0;i<ndim;i++)
- {
- xq[i] = COEF[i]*xq[i] + codebook1[ndim*n1+i];
- err[i] -= codebook1[ndim*n1+i];
- }
- return 0;
-}
-
-void split(float *codebook, int nb_entries, int ndim)
-{
- int i,j;
- for (i=0;i<nb_entries;i++)
- {
- for (j=0;j<ndim;j++)
- {
- float delta = .01*(rand()/(float)RAND_MAX-.5);
- codebook[i*ndim+j] += delta;
- codebook[(i+nb_entries)*ndim+j] = codebook[i*ndim+j] - delta;
- }
- }
-}
-
-
-void update_weighted(float *data, float *weight, int nb_vectors, float *codebook, int nb_entries, int ndim)
-{
- int i,j;
- float count[MAX_ENTRIES][ndim];
- int nearest[nb_vectors];
-
- //fprintf(stderr, "weighted: %d %d\n", nb_entries, ndim);
- for (i=0;i<nb_entries;i++)
- for (j=0;j<ndim;j++)
- count[i][j] = 0;
-
- for (i=0;i<nb_vectors;i++)
- {
- nearest[i] = find_nearest_weighted(codebook, nb_entries, data+i*ndim, weight+i*ndim, ndim);
- }
- for (i=0;i<nb_entries*ndim;i++)
- codebook[i] = 0;
-
- for (i=0;i<nb_vectors;i++)
- {
- int n = nearest[i];
- for (j=0;j<ndim;j++)
- {
- float w = sqrt(weight[i*ndim+j]);
- count[n][j]+=w;
- codebook[n*ndim+j] += w*data[i*ndim+j];
- }
- }
-
- //float w2=0;
- for (i=0;i<nb_entries;i++)
- {
- for (j=0;j<ndim;j++)
- codebook[i*ndim+j] *= (1./count[i][j]);
- //w2 += (count[i]/(float)nb_vectors)*(count[i]/(float)nb_vectors);
- }
- //fprintf(stderr, "%f / %d\n", 1./w2, nb_entries);
-}
-
-void vq_train_weighted(float *data, float *weight, int nb_vectors, float *codebook, int nb_entries, int ndim)
-{
- int i, j, e;
- e = 1;
- for (j=0;j<ndim;j++)
- codebook[j] = 0;
- for (i=0;i<nb_vectors;i++)
- for (j=0;j<ndim;j++)
- codebook[j] += data[i*ndim+j];
- for (j=0;j<ndim;j++)
- codebook[j] *= (1./nb_vectors);
-
-
- while (e< nb_entries)
- {
-#if 1
- split(codebook, e, ndim);
- e<<=1;
-#else
- split1(codebook, e, data, nb_vectors, ndim);
- e++;
-#endif
- fprintf(stderr, "%d\n", e);
- for (j=0;j<10;j++)
- update_weighted(data, weight, nb_vectors, codebook, e, ndim);
- }
-}
-
-
-int main(int argc, char **argv)
-{
- int i,j;
- int nb_vectors, nb_entries, ndim;
- float *data, *pred, *codebook, *codebook2, *codebook3;
- float *weight, *weight2, *weight3;
- float *delta;
- double err[2] = {0, 0};
- double werr[2] = {0, 0};
- double wsum[2] = {0, 0};
-
- ndim = atoi(argv[1]);
- nb_vectors = atoi(argv[2]);
- nb_entries = 1<<atoi(argv[3]);
-
- data = malloc(nb_vectors*ndim*sizeof(*data));
- weight = malloc(nb_vectors*ndim*sizeof(*weight));
- weight2 = malloc(nb_vectors*ndim*sizeof(*weight2));
- weight3 = malloc(nb_vectors*ndim*sizeof(*weight3));
- pred = malloc(nb_vectors*ndim*sizeof(*pred));
- codebook = malloc(nb_entries*ndim*sizeof(*codebook));
- codebook2 = malloc(nb_entries*ndim*sizeof(*codebook2));
- codebook3 = malloc(nb_entries*ndim*sizeof(*codebook3));
-
- for (i=0;i<nb_vectors;i++)
- {
- if (feof(stdin))
- break;
- for (j=0;j<ndim;j++)
- {
- scanf("%f ", &data[i*ndim+j]);
- }
- }
- nb_vectors = i;
- VALGRIND_CHECK_MEM_IS_DEFINED(data, nb_entries*ndim);
-
- for (i=0;i<nb_vectors;i++)
- {
- if (i==0)
- compute_weights2(data+i*ndim, data+i*ndim, weight+i*ndim, ndim);
- else
- compute_weights2(data+i*ndim, data+(i-1)*ndim, weight+i*ndim, ndim);
- }
- for (i=0;i<ndim;i++)
- pred[i] = data[i];
- for (i=1;i<nb_vectors;i++)
- {
- for (j=0;j<ndim;j++)
- pred[i*ndim+j] = data[i*ndim+j] - COEF[j]*data[(i-1)*ndim+j];
- }
-
- VALGRIND_CHECK_MEM_IS_DEFINED(pred, nb_entries*ndim);
- vq_train_weighted(pred, weight, nb_vectors, codebook, nb_entries, ndim);
- printf("%d %d\n", ndim, nb_entries);
- for (i=0;i<nb_entries;i++)
- {
- for (j=0;j<ndim;j++)
- {
- printf("%f ", codebook[i*ndim+j]);
- }
- printf("\n");
- }
-
- delta = malloc(nb_vectors*ndim*sizeof(*data));
- float xq[2] = {0,0};
- for (i=0;i<nb_vectors;i++)
- {
- //int nearest = find_nearest_weighted(codebook, nb_entries, &pred[i*ndim], &weight[i*ndim], ndim);
- quantize_ge(&data[i*ndim], codebook, nb_entries, xq, ndim);
- //printf("%f %f\n", xq[0], xq[1]);
- for (j=0;j<ndim;j++)
- {
- delta[i*ndim+j] = xq[j]-data[i*ndim+j];
- err[j] += (delta[i*ndim+j])*(delta[i*ndim+j]);
- werr[j] += weight[i*ndim+j]*(delta[i*ndim+j])*(delta[i*ndim+j]);
- wsum[j] += weight[i*ndim+j];
- //delta[i*ndim+j] = pred[i*ndim+j] - codebook[nearest*ndim+j];
- //printf("%f ", delta[i*ndim+j]);
- //err[j] += (delta[i*ndim+j])*(delta[i*ndim+j]);
- }
- //printf("\n");
- }
- fprintf(stderr, "GE RMS error: %f %f\n", sqrt(err[0]/nb_vectors), sqrt(err[1]/nb_vectors));
- fprintf(stderr, "Weighted GE error: %f %f\n", sqrt(werr[0]/wsum[0]), sqrt(werr[1]/wsum[1]));
-
- free(codebook);
- free(codebook2);
- free(codebook3);
- free(weight);
- free(weight2);
- free(weight3);
- free(delta);
- return 0;
-}
diff --git a/misc/genlsp.c b/misc/genlsp.c
deleted file mode 100644
index 536651f..0000000
--- a/misc/genlsp.c
+++ /dev/null
@@ -1,183 +0,0 @@
-/*--------------------------------------------------------------------------*\
-
- FILE........: genlsp.c
- AUTHOR......: David Rowe
- DATE CREATED: 23/2/95
-
- This program generates a text file of LSP vectors from an input
- speech file.
-
-\*--------------------------------------------------------------------------*/
-
-/*
- Copyright (C) 2009 David Rowe
-
- All rights reserved.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License version 2.1, as
- published by the Free Software Foundation. This program is
- distributed in the hope that it will be useful, but WITHOUT ANY
- WARRANTY; without even the implied warranty of MERCHANTABILITY or
- FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
- License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#define P 12 /* LP order */
-#define LSP_DELTA1 0.01 /* grid spacing for LSP root searches */
-#define NW 279 /* frame size in samples */
-#define N 80 /* frame to frame shift */
-#define THRESH 40.0 /* threshold energy/sample for frame inclusion */
-#define PI 3.141592654 /* mathematical constant */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <math.h>
-#include "lpc.h" /* LPC analysis functions */
-#include "lsp.h" /* LSP encode/decode functions */
-
-int switch_present(sw,argc,argv)
- char sw[]; /* switch in string form */
- int argc; /* number of command line arguments */
- char *argv[]; /* array of command line arguments in string form */
-{
- int i; /* loop variable */
-
- for(i=1; i<argc; i++)
- if (!strcmp(sw,argv[i]))
- return(i);
-
- return 0;
-}
-
-int main(int argc, char *argv[]) {
- FILE *fspc; /* input file ptr for test database */
- FILE *flsp; /* output text file of LSPs */
- short buf[N]; /* input frame of speech samples */
- float Sn[NW]; /* float input speech samples */
- float ak[P+1]; /* LPCs for current frame */
- float lsp[P]; /* LSPs for current frame */
- float lsp_prev[P]; /* LSPs for previous frame */
- float E; /* frame energy */
- long f; /* number of frames */
- long af; /* number frames with "active" speech */
- float Eres; /* LPC residual energy */
- int i;
- int roots;
- int unstables;
- int lspd, log, lspdt;
- float diff;
-
- /* Initialise ------------------------------------------------------*/
-
- if (argc < 3) {
- printf("usage: %s RawFile LSPTextFile [--lspd] [--log] [--lspdt] \n", argv[0]);
- exit(1);
- }
-
- /* Open files */
-
- fspc = fopen(argv[1],"rb");
- if (fspc == NULL) {
- printf("Error opening input SPC file: %s",argv[1]);
- exit(1);
- }
-
- flsp = fopen(argv[2],"wt");
- if (flsp == NULL) {
- printf("Error opening output LSP file: %s",argv[2]);
- exit(1);
- }
-
- lspd = switch_present("--lspd", argc, argv);
- log = switch_present("--log", argc, argv);
- lspdt = switch_present("--lspdt", argc, argv);
-
- for(i=0; i<NW; i++)
- Sn[i] = 0.0;
-
- /* Read SPC file, and determine aks[] for each frame ------------------*/
-
- f = af = 0;
- unstables = 0;
- while(fread(buf,sizeof(short),N,fspc) == N) {
-
- for(i=0; i<NW-N; i++)
- Sn[i] = Sn[i+N];
- E = 0.0;
- for(i=0; i<N; i++) {
- Sn[i+NW-N] = buf[i];
- E += Sn[i]*Sn[i];
- }
-
- E = 0.0;
- for(i=0; i<NW; i++) {
- E += Sn[i]*Sn[i];
- }
- E = 10.0*log10(E/NW);
-
- /* If energy high enough, include this frame */
-
- f++;
- if (E > THRESH) {
- af++;
- printf("Active Frame: %ld unstables: %d\n",af, unstables);
-
- find_aks(Sn, ak, NW, P, &Eres);
- roots = lpc_to_lsp(ak, P , lsp, 5, LSP_DELTA1);
- if (roots == P) {
- if (lspd) {
- if (log) {
- fprintf(flsp,"%f ",log10(lsp[0]));
- for(i=1; i<P; i++) {
- diff = lsp[i]-lsp[i-1];
- if (diff < (PI/4000.0)*25.0) diff = (PI/4000.0)*25.0;
- fprintf(flsp,"%f ",log10(diff));
- }
- }
- else {
- fprintf(flsp,"%f ",lsp[0]);
- for(i=1; i<P; i++)
- fprintf(flsp,"%f ",lsp[i]-lsp[i-1]);
- }
-
- fprintf(flsp,"\n");
-
- }
- else if (lspdt) {
- for(i=0; i<P; i++)
- fprintf(flsp,"%f ",lsp[i]-lsp_prev[i]);
- fprintf(flsp,"\n");
-
- }
- else {
- if (log) {
- for(i=0; i<P; i++)
- fprintf(flsp,"%f ",log10(lsp[i]));
- fprintf(flsp,"\n");
- }
- else {
- for(i=0; i<P; i++)
- fprintf(flsp,"%f ",lsp[i]);
- fprintf(flsp,"\n");
- }
-
- }
- memcpy(lsp_prev, lsp, sizeof(lsp));
- }
- else
- unstables++;
- }
- }
-
- printf("%3.2f %% active frames\n", 100.0*(float)af/f);
- fclose(fspc);
- fclose(flsp);
-
- return 0;
-}
-
diff --git a/misc/pre.c b/misc/pre.c
deleted file mode 100644
index 8016c3f..0000000
--- a/misc/pre.c
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- pre.c
- David Rowe
- Sep 26 2012
-
- Takes audio from a file, pre-emphasises, and sends to output file.
-*/
-
-#include <assert.h>
-#include <math.h>
-#include <errno.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include "lpc.h"
-
-#define N 80
-
-int main(int argc, char*argv[]) {
- FILE *fin, *fout;
- short buf[N];
- float Sn[N], Sn_pre[N];
- float pre_mem = 0.0;
- int i;
-
- if (argc != 3) {
- printf("usage: pre InputRawSpeechFile OutputRawSpeechFile\n");
- printf("e.g pre input.raw output.raw\n");
- exit(1);
- }
-
- if (strcmp(argv[1], "-") == 0) fin = stdin;
- else if ( (fin = fopen(argv[1],"rb")) == NULL ) {
- fprintf(stderr, "Error opening input speech file: %s: %s.\n",
- argv[1], strerror(errno));
- exit(1);
- }
-
- if (strcmp(argv[2], "-") == 0) fout = stdout;
- else if ( (fout = fopen(argv[2],"wb")) == NULL ) {
- fprintf(stderr, "Error opening output speech file: %s: %s.\n",
- argv[2], strerror(errno));
- exit(1);
- }
-
- while(fread(buf, sizeof(short), N, fin) == N) {
- for(i=0; i<N; i++)
- Sn[i] = buf[i];
- pre_emp(Sn_pre, Sn, &pre_mem, N);
- for(i=0; i<N; i++)
- buf[i] = Sn_pre[i];
- fwrite(buf, sizeof(short), N, fout);
- }
-
- fclose(fin);
- fclose(fout);
-
- return 0;
-}
diff --git a/misc/raw2h.c b/misc/raw2h.c
deleted file mode 100644
index cb17f7c..0000000
--- a/misc/raw2h.c
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- raw2h.c
- David Rowe
- 10 April 2013
-
- Converts a raw sound file to a C header file. Used for generating arrays to
- test Codec2 on embedded systems without disk I/O.
-*/
-
-#include <assert.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-
-int main(int argc, char *argv[]) {
- FILE *fraw, *fheader;
- int i, samples, ret;
- short sam;
-
- if (argc != 5) {
- printf("usage: %s inputRawFile outputHeaderFile arrayName samples\n", argv[0]);
- exit(1);
- }
-
- fraw = fopen(argv[1] ,"rb");
- assert(fraw != NULL);
- fheader = fopen(argv[2],"wt");
- assert(fheader != NULL);
- samples = atoi(argv[4]);
-
- fprintf(fheader, "short %s[] = {\n", argv[3]);
- for(i=0; i<samples-1; i++) {
- ret = fread(&sam, sizeof(short), 1, fraw);
- assert(ret == 1);
- fprintf(fheader, "%d,\n", sam);
- }
- ret = fread(&sam, sizeof(short), 1, fraw);
- assert(ret == 1);
- fprintf(fheader, "%d\n};\n", sam);
-
- fclose(fraw);
- fclose(fheader);
-
- return 0;
-}
diff --git a/misc/speexnoisesup.c b/misc/speexnoisesup.c
deleted file mode 100644
index 7328235..0000000
--- a/misc/speexnoisesup.c
+++ /dev/null
@@ -1,58 +0,0 @@
-/*----------------------------------------------------------------------------*\
-
- FILE....: speexnoisesup.c
- AUTHOR..: David Rowe
- CREATED.: Sun 22 June 2014
-
- File I/O based test program for Speex pre-processor, used for
- initial testing of Speech noise suppression.
-
-\*----------------------------------------------------------------------------*/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <math.h>
-#include <stdint.h>
-#include <speex/speex_preprocess.h>
-
-#define N 80
-#define FS 8000
-
-int main(int argc, char *argv[]) {
- FILE *fin, *fout;
- short buf[N];
- SpeexPreprocessState *st;
-
- if (argc < 2) {
- printf("usage: %s InFile OutFile\n", argv[0]);
- exit(0);
- }
-
- if (strcmp(argv[1], "-") == 0) fin = stdin;
- else if ( (fin = fopen(argv[1],"rb")) == NULL ) {
- fprintf(stderr, "Error opening %s\n", argv[1]);
- exit(1);
- }
-
- if (strcmp(argv[2], "-") == 0) fout = stdout;
- else if ((fout = fopen(argv[2],"wb")) == NULL) {
- fprintf(stderr, "Error opening %s\n", argv[2]);
- exit(1);
- }
-
- st = speex_preprocess_state_init(N, FS);
-
- while(fread(buf, sizeof(short), N, fin) == N) {
- speex_preprocess_run(st, buf);
- fwrite(buf, sizeof(short), N, fout);
- if (fout == stdout) fflush(stdout);
- }
-
- speex_preprocess_state_destroy(st);
-
- fclose(fin);
- fclose(fout);
-
- return 0;
-}
diff --git a/misc/tcodec2.c b/misc/tcodec2.c
deleted file mode 100644
index ecb81d7..0000000
--- a/misc/tcodec2.c
+++ /dev/null
@@ -1,220 +0,0 @@
-/*---------------------------------------------------------------------------*\
-
- FILE........: tcodec2.c
- AUTHOR......: David Rowe
- DATE CREATED: 24/8/10
-
- Test program for codec2.c functions.
-
-\*---------------------------------------------------------------------------*/
-
-/*
- Copyright (C) 2010 David Rowe
-
- All rights reserved.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License version 2.1, as
- published by the Free Software Foundation. This program is
- distributed in the hope that it will be useful, but WITHOUT ANY
- WARRANTY; without even the implied warranty of MERCHANTABILITY or
- FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
- License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <assert.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <math.h>
-#include "defines.h"
-#include "comp.h"
-#include "codec2.h"
-#include "quantise.h"
-#include "interp.h"
-
-/* CODEC2 struct copies from codec2.c to help with testing */
-
-struct CODEC2 {
- int mode;
- float w[M]; /* time domain hamming window */
- COMP W[FFT_ENC]; /* DFT of w[] */
- float Pn[2*N]; /* trapezoidal synthesis window */
- float Sn[M]; /* input speech */
- float hpf_states[2]; /* high pass filter states */
- void *nlp; /* pitch predictor states */
- float Sn_[2*N]; /* synthesised output speech */
- float ex_phase; /* excitation model phase track */
- float bg_est; /* background noise estimate for post filter */
- float prev_Wo; /* previous frame's pitch estimate */
- MODEL prev_model; /* previous frame's model parameters */
- float prev_lsps_[LPC_ORD]; /* previous frame's LSPs */
- float prev_energy; /* previous frame's LPC energy */
-};
-
-void analyse_one_frame(struct CODEC2 *c2, MODEL *model, short speech[]);
-void synthesise_one_frame(struct CODEC2 *c2, short speech[], MODEL *model, float ak[]);
-
-int test1()
-{
- FILE *fin, *fout;
- short buf[N];
- struct CODEC2 *c2;
- MODEL model;
- float ak[LPC_ORD+1];
- float lsps[LPC_ORD];
-
- c2 = codec2_create(CODEC2_MODE_2400);
-
- fin = fopen("../raw/hts1a.raw", "rb");
- assert(fin != NULL);
- fout = fopen("hts1a_test.raw", "wb");
- assert(fout != NULL);
-
- while(fread(buf, sizeof(short), N, fin) == N) {
- analyse_one_frame(c2, &model, buf);
- speech_to_uq_lsps(lsps, ak, c2->Sn, c2->w, LPC_ORD);
- synthesise_one_frame(c2, buf, &model, ak);
- fwrite(buf, sizeof(short), N, fout);
- }
-
- codec2_destroy(c2);
-
- fclose(fin);
- fclose(fout);
-
- return 0;
-}
-
-int test2()
-{
- FILE *fin, *fout;
- short buf[2*N];
- struct CODEC2 *c2;
- MODEL model, model_interp;
- float ak[LPC_ORD+1];
- int voiced1, voiced2;
- int lsp_indexes[LPC_ORD];
- int energy_index;
- int Wo_index;
- char *bits;
- int nbit;
- int i;
- float lsps[LPC_ORD];
- float e;
-
- c2 = codec2_create(CODEC2_MODE_2400);
- bits = (char*)malloc(codec2_bits_per_frame(c2));
- assert(bits != NULL);
- fin = fopen("../raw/hts1a.raw", "rb");
- assert(fin != NULL);
- fout = fopen("hts1a_test.raw", "wb");
- assert(fout != NULL);
-
- while(fread(buf, sizeof(short), 2*N, fin) == 2*N) {
- /* first 10ms analysis frame - we just want voicing */
-
- analyse_one_frame(c2, &model, buf);
- voiced1 = model.voiced;
-
- /* second 10ms analysis frame */
-
- analyse_one_frame(c2, &model, &buf[N]);
- voiced2 = model.voiced;
-
- Wo_index = encode_Wo(model.Wo);
- e = speech_to_uq_lsps(lsps, ak, c2->Sn, c2->w, LPC_ORD);
- encode_lsps_scalar(lsp_indexes, lsps, LPC_ORD);
- energy_index = encode_energy(e);
- nbit = 0;
- pack((unsigned char*)bits, (unsigned *)&nbit, Wo_index, WO_BITS);
- for(i=0; i<LPC_ORD; i++) {
- pack((unsigned char*)bits, (unsigned *)&nbit, lsp_indexes[i], lsp_bits(i));
- }
- pack((unsigned char*)bits, (unsigned *)&nbit, energy_index, E_BITS);
- pack((unsigned char*)bits, (unsigned *)&nbit, voiced1, 1);
- pack((unsigned char*)bits, (unsigned *)&nbit, voiced2, 1);
-
- nbit = 0;
- Wo_index = unpack((unsigned char*)bits, (unsigned *)&nbit, WO_BITS);
- for(i=0; i<LPC_ORD; i++) {
- lsp_indexes[i] = unpack((unsigned char*)bits, (unsigned *)&nbit, lsp_bits(i));
- }
- energy_index = unpack((unsigned char*)bits, (unsigned *)&nbit, E_BITS);
- voiced1 = unpack((unsigned char*)bits, (unsigned *)&nbit, 1);
- voiced2 = unpack((unsigned char*)bits, (unsigned *)&nbit, 1);
-
- model.Wo = decode_Wo(Wo_index);
- model.L = PI/model.Wo;
- decode_amplitudes(&model,
- ak,
- lsp_indexes,
- energy_index,
- lsps,
- &e);
-
- model.voiced = voiced2;
- model_interp.voiced = voiced1;
- interpolate(&model_interp, &c2->prev_model, &model);
-
- synthesise_one_frame(c2, buf, &model_interp, ak);
- synthesise_one_frame(c2, &buf[N], &model, ak);
-
- memcpy(&c2->prev_model, &model, sizeof(MODEL));
- fwrite(buf, sizeof(short), 2*N, fout);
- }
-
- free(bits);
- codec2_destroy(c2);
-
- fclose(fin);
- fclose(fout);
-
- return 0;
-}
-
-int test3()
-{
- FILE *fin, *fout, *fbits;
- short buf1[2*N];
- short buf2[2*N];
- char *bits;
- struct CODEC2 *c2;
-
- c2 = codec2_create(CODEC2_MODE_2400);
- int numBits = codec2_bits_per_frame(c2);
- int numBytes = (numBits+7)>>3;
-
- bits = (char*)malloc(numBytes);
-
- fin = fopen("../raw/hts1a.raw", "rb");
- assert(fin != NULL);
- fout = fopen("hts1a_test.raw", "wb");
- assert(fout != NULL);
- fbits = fopen("hts1a_test3.bit", "wb");
- assert(fout != NULL);
-
- while(fread(buf1, sizeof(short), 2*N, fin) == 2*N) {
- codec2_encode(c2, (void*)bits, buf1);
- fwrite(bits, sizeof(char), numBytes, fbits);
- codec2_decode(c2, buf2, (void*)bits);
- fwrite(buf2, sizeof(short), numBytes, fout);
- }
-
- free(bits);
- codec2_destroy(c2);
-
- fclose(fin);
- fclose(fout);
- fclose(fbits);
-
- return 0;
-}
-
-int main() {
- test3();
- return 0;
-}
diff --git a/misc/tdec.c b/misc/tdec.c
deleted file mode 100644
index 501edc6..0000000
--- a/misc/tdec.c
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- tdec.c
- David Rowe
- Jan 2017
-
- Trivial non filtered decimator for high ration sample rate conversion.
-
- build: gcc tdec.c -o tdec -Wall -O2
-
-*/
-
-#include <assert.h>
-#include <getopt.h>
-#include <string.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <stdint.h>
-
-#define SIGNED_16BIT 0
-#define SIGNED_8BIT 1
-#define UNSIGNED_8BIT 2
-
-void freq_shift_complex_buf(short buf[], int n, int lo_i[], int lo_q[]);
-
-void display_help(void) {
- fprintf(stderr, "\nusage: tdec inputRawFile OutputRawFile DecimationRatio [-c]\n");
- fprintf(stderr, "\nUse - for stdin/stdout\n\n");
- fprintf(stderr, "-c complex signed 16 bit input and output\n");
- fprintf(stderr, "-d complex signed 8 bit input (e.g. HackRF), complex signed 16 bit output\n");
- fprintf(stderr, "-e complex unsigned 8 bit input (e.g. RTL-SDR), complex signed 16 bit output\n");
- fprintf(stderr, "-f -Fs/4 freq shift\n\n");
-}
-
-int main(int argc, char *argv[]) {
- FILE *fin, *fout;
- short dec;
- int lo_i[3], lo_q[3];
-
- if (argc < 3) {
- display_help();
- exit(1);
- }
-
- if (strcmp(argv[1], "-") == 0)
- fin = stdin;
- else
- fin = fopen(argv[1], "rb");
- assert(fin != NULL);
-
- if (strcmp(argv[2], "-") == 0)
- fout = stdout;
- else
- fout = fopen(argv[2], "wb");
- assert(fout != NULL);
-
- dec = atoi(argv[3]);
-
- int channels = 1;
- int freq_shift = 0;
- lo_i[0] = -1; lo_i[1] = 0;
- lo_q[0] = 0; lo_q[1] = -1;
- int opt;
- int format = SIGNED_16BIT;
- while ((opt = getopt(argc, argv, "cdef")) != -1) {
- switch (opt) {
- case 'c': channels = 2; break;
- case 'd': channels = 2; format = SIGNED_8BIT; break;
- case 'e': channels = 2; format = UNSIGNED_8BIT; break;
- case 'f': freq_shift = 1; break;
- default:
- display_help();
- exit(1);
- }
- }
-
- if (format == SIGNED_16BIT) {
- short buf[dec*channels];
- while(fread(buf, sizeof(short)*channels, dec, fin) == dec) {
- if (freq_shift)
- freq_shift_complex_buf(buf, dec*channels, lo_i, lo_q);
- fwrite(buf, sizeof(short), channels, fout);
- }
- }
- else {
- uint8_t inbuf[dec*channels];
- short outbuf[dec*channels];
- short sam, i;
-
- while(fread(inbuf, sizeof(uint8_t)*channels, dec, fin) == dec) {
- for (i=0; i<dec*channels; i++) {
- assert((format == SIGNED_8BIT) || (format == UNSIGNED_8BIT));
- if (format == SIGNED_8BIT) {
- sam = (short)inbuf[i];
- sam <<= 8;
- } else {
- sam = (short)inbuf[i] - 127;
- sam <<= 8;
- }
- outbuf[i] = sam;
- }
- if (freq_shift)
- freq_shift_complex_buf(outbuf, dec*channels, lo_i, lo_q);
- fwrite(outbuf, sizeof(short), channels, fout);
- }
-
- }
-
- fclose(fout);
- fclose(fin);
-
- return 0;
-}
-
-
-void freq_shift_complex_buf(short buf[], int n, int lo_i[], int lo_q[]) {
- int i;
-
- for (i=0; i<n; i+=2) {
- /* update local osc recursion */
-
- lo_i[2] = -lo_i[0]; lo_q[2] = -lo_q[0];
-
- /* freq shift down input samples */
-
- int a = buf[i];
- int b = buf[i+1];
- int c = lo_i[2];
- int d = -lo_q[2]; /* conj LO as down shift */
-
- buf[i] = a*c - b*d;
- buf[i+1] = b*c + a*d;
-
- //fprintf(stderr, "% d % d % 5d % 5d\n", lo_i[2], lo_q[2], buf[i], buf[i+1]);
-
- /* update LO memory */
-
- lo_i[0] = lo_i[1]; lo_i[1] = lo_i[2];
- lo_q[0] = lo_q[1]; lo_q[1] = lo_q[2];
- }
-}
-
diff --git a/misc/timpulse.c b/misc/timpulse.c
deleted file mode 100644
index 8227c0d..0000000
--- a/misc/timpulse.c
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- timpulse.c
- David Rowe Dec 2019
-
- Generate a synthetic speech signal from a sum of sinusoids. Generates a known test
- signals for phaseNN and ampNN projects.
-*/
-
-#include <assert.h>
-#include <math.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <getopt.h>
-
-#define FS 8000
-
-int main(int argc, char *argv[]) {
- short buf[FS] = {0};
- float f0 = 60.0;
- float n0 = 0.0;
- int Nsecs = 1;
- int randf0 = 0;
- int filter = 0;
- int rande = 0;
-
- int o = 0;
- int opt_idx = 0;
- while( o != -1 ) {
- static struct option long_opts[] = {
- {"help", no_argument, 0, 'h'},
- {"n0", required_argument, 0, 'n'},
- {"f0", required_argument, 0, 'f'},
- {"secs", required_argument, 0, 's'},
- {"randf0", no_argument, 0, 'r'},
- {"rande", required_argument, 0, 'e'},
- {"filter", no_argument, 0, 'i'},
- {0, 0, 0, 0}
- };
-
- o = getopt_long(argc,argv,"hn:f:s:r",long_opts,&opt_idx);
-
- switch(o) {
- case 'n':
- n0 = atof(optarg);
- break;
- case 'f':
- f0 = atof(optarg);
- break;
- case 's':
- Nsecs = atoi(optarg);
- break;
- case 'r':
- randf0 = 1;
- break;
- case 'i':
- filter = 1;
- break;
- case 'e':
- rande = atoi(optarg);
- break;
- case '?':
- case 'h':
- fprintf(stderr,
- "usage: %s\n"
- "[--f0 f0Hz] fixed F0\n"
- "[--n0 samples] time offset\n"
- "[--secs Nsecs] number of seconds to generate\n"
- "[--randf0] choose a random F0 every second\n"
- "[--rande Ndiscrete] choose a random frame energy every second, Ndiscrete values\n"
- "\n", argv[0]);
- exit(1);
- break;
- }
- }
-
- int t = 0;
- float A = 100.0;
-
- /* optionally filter with 2nd order system */
- float alpha = 0.25*M_PI, gamma=0.99;
- float a[2] = {-2.0*gamma*cos(alpha), gamma*gamma};
- float mem[2] = {0};
-
- for (int j=0; j<Nsecs; j++) {
- if (rande) {
- float AdB_min = 20.0*log10(100.0);
- float AdB_step = 6.0;
- float num_values = rande;
-
- // discrete RV between 0..1
- float r = (float)rand()/RAND_MAX;
- r = floor(r*num_values);
-
- float AdB = AdB_min + r*AdB_step;
- A = pow(10.0,AdB/20.0);
- fprintf(stderr, "r: %f AdB: %f A: %f\n", r, AdB, A);
- }
- if (randf0) {
- float pitch_period = FS/400.0 + (FS/80.0 - FS/400.0)*rand()/RAND_MAX;
- f0 = (float)FS/pitch_period;
- //fprintf(stderr, "P: %f f0: %f\n", pitch_period, f0);
- }
- float Wo = 2.0*M_PI*f0/FS;
- int L = M_PI/Wo;
- float e = 0.0;
- for(int i=0; i<FS; i++) {
- buf[i] = 0;
- // 1/sqrt(L) term makes power constant across Wo
- for(int m=1; m<L; m++)
- buf[i] += (A/sqrt(L))*cos(m*Wo*(t + n0));
- e += pow(buf[i], 2.0);
- t++;
- }
- //fprintf(stderr, "e (dB): %f\n", 10*log10(e));
- if (filter) {
- for(int i=0; i<FS; i++) {
- float x = (float)buf[i];
- float y = (x - mem[0]*a[0] - mem[1]*a[1]);
- mem[1] = mem[0]; mem[0] = y;
- buf[i] = (short)y;
- }
- }
-
- fwrite(buf, sizeof(short), FS, stdout);
- }
-
- return 0;
-}
diff --git a/misc/tinterp.c b/misc/tinterp.c
deleted file mode 100644
index 34f2eff..0000000
--- a/misc/tinterp.c
+++ /dev/null
@@ -1,151 +0,0 @@
-/*---------------------------------------------------------------------------*\
-
- FILE........: tinterp.c
- AUTHOR......: David Rowe
- DATE CREATED: 22/8/10
-
- Tests interpolation functions.
-
-\*---------------------------------------------------------------------------*/
-
-/*
- Copyright (C) 2010 David Rowe
-
- All rights reserved.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License version 2.1, as
- published by the Free Software Foundation. This program is
- distributed in the hope that it will be useful, but WITHOUT ANY
- WARRANTY; without even the implied warranty of MERCHANTABILITY or
- FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
- License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <assert.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <math.h>
-#include <ctype.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <unistd.h>
-
-#include "defines.h"
-#include "sine.h"
-#include "interp.h"
-
-void make_amp(MODEL *model, float f0, float cdB, float mdBHz)
-{
- int i;
- float mdBrad = mdBHz*FS/TWO_PI;
-
- model->Wo = f0*TWO_PI/FS;
- model->L = PI/model->Wo;
- for(i=0; i<=model->L; i++)
- model->A[i] = pow(10.0,(cdB + (float)i*model->Wo*mdBrad)/20.0);
- model->voiced = 1;
-}
-
-void write_amp(char file[], MODEL *model)
-{
- FILE *f;
- int i;
-
- f = fopen(file,"wt");
- for(i=1; i<=model->L; i++)
- fprintf(f, "%f\t%f\n", model->Wo*i, model->A[i]);
- fclose(f);
-}
-
-const char *get_next_float(const char *s, float *num)
-{
- const char *p = s;
- char tmp[MAX_STR];
-
- while(*p && !isspace(*p))
- p++;
- assert((p-s) < (int)(sizeof(tmp)-1));
- memcpy(tmp, s, p-s);
- tmp[p-s] = 0;
- *num = atof(tmp);
-
- return p+1;
-}
-
-const char *get_next_int(const char *s, int *num)
-{
- const char *p = s;
- char tmp[MAX_STR];
-
- while(*p && !isspace(*p))
- p++;
- assert((p-s) < (int)(sizeof(tmp)-1));
- memcpy(tmp, s, p-s);
- tmp[p-s] = 0;
- *num = atoi(tmp);
-
- return p+1;
-}
-
-void load_amp(MODEL *model, const char * file, int frame)
-{
- FILE *f;
- int i;
- char s[1024];
- const char *ps;
-
- f = fopen(file,"rt");
- assert(f);
-
- for(i=0; i<frame; i++)
- ps = fgets(s, 1023, f);
-
- /// can frame ever be 0? what if fgets fails?
- ps = s;
- ps = get_next_float(ps, &model->Wo);
- ps = get_next_int(ps, &model->L);
- for(i=1; i<=model->L; i++)
- ps = get_next_float(ps, &model->A[i]);
-
- fclose(f);
-}
-
-void load_or_make_amp(MODEL *model,
- const char * filename, int frame,
- float f0, float cdB, float mdBHz)
-{
- struct stat buf;
- int rc = stat(filename, &buf);
- if (rc || !S_ISREG(buf.st_mode) || ((buf.st_mode & S_IRUSR) != S_IRUSR))
- {
- make_amp(model, f0, cdB, mdBHz);
- }
- else
- {
- load_amp(model, filename, frame);
- }
-}
-int main() {
- MODEL prev, next, interp;
-
- load_or_make_amp(&prev,
- "../src/hts1a_model.txt", 32,
- 50.0, 60.0, 6E-3);
- load_or_make_amp(&next,
- "../src/hts1a_model.txt", 34,
- 50.0, 40.0, 6E-3);
-
- interp.voiced = 1;
- interpolate(&interp, &prev, &next);
-
- write_amp("tinterp_prev.txt", &prev);
- write_amp("tinterp_interp.txt", &interp);
- write_amp("tinterp_next.txt", &next);
-
- return 0;
-}
diff --git a/misc/tlininterp.c b/misc/tlininterp.c
deleted file mode 100644
index 7db6791..0000000
--- a/misc/tlininterp.c
+++ /dev/null
@@ -1,153 +0,0 @@
-/*
- tlininterp.c
- David Rowe
- Jan 2017
-
- Fast linear interpolator for high oversampling rates. Upsample
- with a decent filter first such that the signal is "low pass" wrt
- to the input sample rate.
-
- build: gcc tlininterp.c -o tlininterp -Wall -O2
-
-*/
-
-#include <assert.h>
-#include <getopt.h>
-#include <string.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <stdint.h>
-
-#define NBUF 1000
-#define SIGNED_16BIT 0
-#define SIGNED_8BIT 1
-
-void display_help(void) {
- fprintf(stderr, "\nusage: tlininterp inputRawFile OutputRawFile OverSampleRatio [-c]\n");
- fprintf(stderr, "\nUse - for stdin/stdout\n\n");
- fprintf(stderr, "-c complex signed 16 bit input and output\n");
- fprintf(stderr, "-d complex signed 16 bit input, complex signed 8 bit output\n");
- fprintf(stderr, "-f +Fs/4 freq shift\n\n");
-}
-
-int main(int argc, char *argv[]) {
- FILE *fin, *fout;
- short left[2], right[2], out[2*NBUF], i;
- float oversample, t;
- int8_t out_s8[2*NBUF];
- int lo_i[3], lo_q[3];
-
- if (argc < 3) {
- display_help();
- exit(1);
- }
-
- if (strcmp(argv[1], "-") == 0)
- fin = stdin;
- else
- fin = fopen(argv[1], "rb");
- assert(fin != NULL);
-
- if (strcmp(argv[2], "-") == 0)
- fout = stdout;
- else
- fout = fopen(argv[2], "wb");
- assert(fout != NULL);
-
- oversample = atof(argv[3]);
- if (oversample <= 1) {
- display_help();
- exit(1);
- }
-
- int channels = 1;
- int freq_shift = 0;
- lo_i[0] = -1; lo_i[1] = 0;
- lo_q[0] = 0; lo_q[1] = -1;
- int format = SIGNED_16BIT;
- int opt;
- while ((opt = getopt(argc, argv, "cdf")) != -1) {
- switch (opt) {
- case 'c': channels = 2; break;
- case 'd': channels = 2; format = SIGNED_8BIT; break;
- case 'f': freq_shift = 1; break;
- default:
- display_help();
- exit(1);
- }
- }
-
- for (i=0; i<channels; i++)
- left[i] = 0;
- t = 0.0;
- int j = 0;
- while(fread(&right, sizeof(short)*channels, 1, fin) == 1) {
- while (t < 1.0) {
-
- for (i=0; i<channels; i++) {
- out[2*j+i] = (1.0 - t)*left[i] + t*right[i];
- }
-
- if (freq_shift) {
-
- /* update local osc recursion */
-
- lo_i[2] = -lo_i[0]; lo_q[2] = -lo_q[0];
-
- /* complex mixer to up-shift complex samples */
-
- int a = out[2*j];
- int b = out[2*j+1];
- int c = lo_i[2];
- int d = lo_q[2];
-
- out[2*j] = a*c - b*d;
- out[2*j+1] = b*c + a*d;
-
- //fprintf(stderr, "% d % d % 5d % 5d\n", lo_i[2], lo_q[2], out[0], out[1]);
-
- /* update LO memory */
-
- lo_i[0] = lo_i[1]; lo_i[1] = lo_i[2];
- lo_q[0] = lo_q[1]; lo_q[1] = lo_q[2];
- }
-
- /* once we have enough samples write to disk */
-
- j++;
- if (j == NBUF) {
- if (format == SIGNED_16BIT) {
- fwrite(&out, sizeof(short)*channels, NBUF, fout);
- } else {
- for (i=0; i<channels*NBUF; i++) {
- out_s8[i] = out[i] >> 8;
- }
- fwrite(&out_s8, sizeof(int8_t)*channels, NBUF, fout);
- }
- j = 0;
- }
-
- t += 1.0/oversample;
- }
-
- t -= 1.0;
- for (i=0; i<channels; i++)
- left[i] = right[i];
- }
-
- /* write remaining samples to disk */
-
- if (format == SIGNED_16BIT) {
- fwrite(&out, sizeof(short), j, fout);
- } else {
- for (i=0; i<j; i++) {
- out_s8[i] = out[i] >> 8;
- }
- fwrite(&out_s8, sizeof(int8_t)*channels, j, fout);
- }
-
- fclose(fout);
- fclose(fin);
-
- return 0;
-}
diff --git a/misc/tnlp.c b/misc/tnlp.c
deleted file mode 100644
index 35e2ea4..0000000
--- a/misc/tnlp.c
+++ /dev/null
@@ -1,164 +0,0 @@
-/*---------------------------------------------------------------------------*\
-
- FILE........: tnlp.c
- AUTHOR......: David Rowe
- DATE CREATED: 23/3/93
-
- Test program for non linear pitch estimation functions.
-
-\*---------------------------------------------------------------------------*/
-
-/*
- Copyright (C) 2009 David Rowe
-
- All rights reserved.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License version 2.1, as
- published by the Free Software Foundation. This program is
- distributed in the hope that it will be useful, but WITHOUT ANY
- WARRANTY; without even the implied warranty of MERCHANTABILITY or
- FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
- License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <math.h>
-
-#include "defines.h"
-#include "dump.h"
-#include "sine.h"
-#include "nlp.h"
-#include "kiss_fft.h"
-
-int frames;
-
-/*---------------------------------------------------------------------------*\
-
- switch_present()
-
- Searches the command line arguments for a "switch". If the switch is
- found, returns the command line argument where it ws found, else returns
- NULL.
-
-\*---------------------------------------------------------------------------*/
-
-int switch_present(sw,argc,argv)
- char sw[]; /* switch in string form */
- int argc; /* number of command line arguments */
- char *argv[]; /* array of command line arguments in string form */
-{
- int i; /* loop variable */
-
- for(i=1; i<argc; i++)
- if (!strcmp(sw,argv[i]))
- return(i);
-
- return 0;
-}
-
-/*---------------------------------------------------------------------------*\
-
- MAIN
-
-\*---------------------------------------------------------------------------*/
-
-int main(int argc, char *argv[])
-{
- if (argc < 3) {
- printf("\nusage: tnlp InputRawSpeechFile Outputf0PitchTextFile "
- "[--dump DumpFile] [--Fs SampleRateHz]\n");
- exit(1);
- }
-
- int Fs = 8000;
- if (switch_present("--Fs",argc,argv)) {
- Fs = atoi(argv[argc+1]);
- }
-
- C2CONST c2const = c2const_create(Fs, N_S);
- int n = c2const.n_samp;
- int m = c2const.m_pitch;
- FILE *fin,*fout;
- short buf[n];
- float Sn[m]; /* float input speech samples */
- kiss_fft_cfg fft_fwd_cfg;
- COMP Sw[FFT_ENC]; /* DFT of Sn[] */
- float w[m]; /* time domain hamming window */
- float W[FFT_ENC]; /* DFT of w[] */
- float pitch_samples;
- int i;
- float f0, prev_f0;
- void *nlp_states;
- #ifdef DUMP
- int dump;
- #endif
-
- /* Input file */
-
- if ((fin = fopen(argv[1],"rb")) == NULL) {
- printf("Error opening input speech file: %s\n",argv[1]);
- exit(1);
- }
-
- /* Output file */
-
- if ((fout = fopen(argv[2],"wt")) == NULL) {
- printf("Error opening output text file: %s\n",argv[2]);
- exit(1);
- }
-
- #ifdef DUMP
- dump = switch_present("--dump",argc,argv);
- if (dump)
- dump_on(argv[dump+1]);
- #else
- /// TODO
- /// #warning "Compile with -DDUMP if you expect to dump anything."
- #endif
-
- for(i=0; i<m; i++) {
- Sn[i] = 0.0;
- }
-
- nlp_states = nlp_create(&c2const);
- fft_fwd_cfg = kiss_fft_alloc(FFT_ENC, 0, NULL, NULL);
- make_analysis_window(&c2const, fft_fwd_cfg, w, W);
-
- frames = 0;
- prev_f0 = 1/P_MAX_S;
- while(fread(buf, sizeof(short), n, fin)) {
- /* Update input speech buffers */
-
- for(i=0; i<m-n; i++)
- Sn[i] = Sn[i+n];
- for(i=0; i<n; i++)
- Sn[i+m-n] = buf[i];
- dft_speech(&c2const, fft_fwd_cfg, Sw, Sn, w);
- #ifdef DUMP
- dump_Sn(m, Sn); dump_Sw(Sw);
- #endif
-
- f0 = nlp(nlp_states, Sn, n, &pitch_samples, Sw, W, &prev_f0);
-
- fprintf(stderr,"%d %f %f\n", frames++, f0, pitch_samples);
- fprintf(fout,"%f %f\n", f0, pitch_samples);
- }
-
- fclose(fin);
- fclose(fout);
- #ifdef DUMP
- if (dump) dump_off();
- #endif
- nlp_destroy(nlp_states);
-
- return 0;
-}
-
-
diff --git a/misc/tprede.c b/misc/tprede.c
deleted file mode 100644
index 4d3d09c..0000000
--- a/misc/tprede.c
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- tpre_de.c
- David Rowe
- Sep 24 2012
-
- Unit test to generate the combined impulse response of pre & de-emphasis filters.
-
- pl("../unittest/out48.raw",1,3000)
- pl("../unittest/out8.raw",1,3000)
-
- Listening to it also shows up anything nasty:
-
- $ play -s -2 -r 48000 out48.raw
- $ play -s -2 -r 8000 out8.raw
-
- */
-
-#include <assert.h>
-#include <math.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include "lpc.h"
-
-#define N 10
-#define F 10
-
-int main() {
- FILE *fprede;
- float Sn[N], Sn_pre[N], Sn_de[N];
- float pre_mem = 0.0, de_mem = 0.0;
- int i, f;
-
- fprede = fopen("prede.txt", "wt");
- assert(fprede != NULL);
-
- for(i=0; i<N; i++)
- Sn[i] = 0.0;
-
- Sn[0]= 1.0;
-
- for(f=0; f<F; f++) {
- pre_emp(Sn_pre, Sn, &pre_mem, N);
- de_emp(Sn_de, Sn_pre, &de_mem, N);
- for(i=0; i<N; i++) {
- fprintf(fprede, "%f\n", Sn_de[i]);
- }
- Sn[0] = 0.0;
- }
-
- fclose(fprede);
-
- return 0;
-}
diff --git a/misc/tquant.c b/misc/tquant.c
deleted file mode 100644
index 2492123..0000000
--- a/misc/tquant.c
+++ /dev/null
@@ -1,214 +0,0 @@
-/*---------------------------------------------------------------------------*\
-
- FILE........: tquant.c
- AUTHOR......: David Rowe
- DATE CREATED: 22/8/10
-
- Generates quantisation curves for plotting on Octave.
-
-\*---------------------------------------------------------------------------*/
-
-/*
- Copyright (C) 2010 David Rowe
-
- All rights reserved.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License version 2.1, as
- published by the Free Software Foundation. This program is
- distributed in the hope that it will be useful, but WITHOUT ANY
- WARRANTY; without even the implied warranty of MERCHANTABILITY or
- FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
- License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <assert.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <math.h>
-
-#include "defines.h"
-#include "dump.h"
-#include "quantise.h"
-
-int test_Wo_quant();
-int test_lsp_quant();
-int test_lsp(int lsp_number, int levels, float max_error_hz);
-int test_energy_quant(int levels, float max_error_dB);
-
-int main() {
- quantise_init();
- test_Wo_quant();
- test_lsp_quant();
- test_energy_quant(E_LEVELS, 0.5*(E_MAX_DB - E_MIN_DB)/E_LEVELS);
-
- return 0;
-}
-
-int test_lsp_quant() {
- test_lsp( 1, 16, 12.5);
- test_lsp( 2, 16, 12.5);
- test_lsp( 3, 16, 25);
- test_lsp( 4, 16, 50);
- test_lsp( 5, 16, 50);
- test_lsp( 6, 16, 50);
- test_lsp( 7, 16, 50);
- test_lsp( 8, 8, 50);
- test_lsp( 9, 8, 50);
- test_lsp(10, 4, 100);
-
- return 0;
-}
-
-int test_energy_quant(int levels, float max_error_dB) {
- FILE *fe;
- float e,e_dec, error, low_e, high_e;
- int index, index_in, index_out, i;
-
- /* check 1:1 match between input and output levels */
-
- for(i=0; i<levels; i++) {
- index_in = i;
- e = decode_energy(index_in, E_BITS);
- index_out = encode_energy(e, E_BITS);
- if (index_in != index_out) {
- printf("edB: %f index_in: %d index_out: %d\n",
- 10.0*log10(e), index_in, index_out);
- exit(0);
- }
- }
-
- /* check error over range of quantiser */
-
- low_e = decode_energy(0, E_BITS);
- high_e = decode_energy(levels-1, E_BITS);
- fe = fopen("energy_err.txt", "wt");
-
- for(e=low_e; e<high_e; e +=(high_e-low_e)/1000.0) {
- index = encode_energy(e, E_BITS);
- e_dec = decode_energy(index, E_BITS);
- error = 10.0*log10(e) - 10.0*log10(e_dec);
- fprintf(fe, "%f\n", error);
- if (fabs(error) > max_error_dB) {
- printf("error: %f %f\n", error, max_error_dB);
- exit(0);
- }
- }
-
- fclose(fe);
- return 0;
-}
-
-int test_lsp(int lsp_number, int levels, float max_error_hz) {
- float lsp[LPC_ORD];
- int indexes_in[LPC_ORD];
- int indexes_out[LPC_ORD];
- int indexes[LPC_ORD];
- int i;
- float lowf, highf, f, error;
- char s[MAX_STR];
- FILE *flsp;
- float max_error_rads;
-
- lsp_number--;
- max_error_rads = max_error_hz*TWO_PI/FS;
-
- for(i=0; i<LPC_ORD; i++)
- indexes_in[i] = 0;
-
- for(i=0; i<levels; i++) {
- indexes_in[lsp_number] = i;
- decode_lsps_scalar(lsp, indexes_in, LPC_ORD);
- encode_lsps_scalar(indexes_out, lsp,LPC_ORD);
- if (indexes_in[lsp_number] != indexes_out[lsp_number]) {
- printf("freq: %f index_in: %d index_out: %d\n",
- lsp[lsp_number]+1, indexes_in[lsp_number],
- indexes_out[lsp_number]);
- exit(0);
- }
- }
-
- for(i=0; i<LPC_ORD; i++)
- indexes[i] = 0;
- indexes[lsp_number] = 0;
- decode_lsps_scalar(lsp, indexes, LPC_ORD);
- lowf = lsp[lsp_number];
- indexes[lsp_number] = levels - 1;
- decode_lsps_scalar(lsp, indexes, LPC_ORD);
- highf = lsp[lsp_number];
- sprintf(s,"lsp%d_err.txt", lsp_number+1);
- flsp = fopen(s, "wt");
-
- for(f=lowf; f<highf; f +=(highf-lowf)/1000.0) {
- lsp[lsp_number] = f;
- encode_lsps_scalar(indexes, lsp, LPC_ORD);
- decode_lsps_scalar(lsp, indexes, LPC_ORD);
- error = f - lsp[lsp_number];
- fprintf(flsp, "%f\n", error);
- if (fabs(error) > max_error_rads) {
- printf("%d error: %f %f\n", lsp_number+1, error, max_error_rads);
- exit(0);
- }
- }
-
- fclose(flsp);
-
- printf("OK\n");
-
- return 0;
-}
-
-int test_Wo_quant() {
- int c;
- FILE *f;
- float Wo,Wo_dec, error, step_size;
- int index, index_in, index_out;
-
- /* output Wo quant curve for plotting */
-
- f = fopen("quant_pitch.txt","wt");
-
- for(Wo=0.9*(TWO_PI/P_MAX); Wo<=1.1*(TWO_PI/P_MIN); Wo += 0.001) {
- index = encode_Wo(Wo, WO_BITS);
- fprintf(f, "%f %d\n", Wo, index);
- }
-
- fclose(f);
-
- /* check for all Wo codes we get 1:1 match between encoder
- and decoder Wo levels */
-
- for(c=0; c<WO_LEVELS; c++) {
- index_in = c;
- Wo = decode_Wo(index_in, WO_BITS);
- index_out = encode_Wo(Wo, WO_BITS);
- if (index_in != index_out)
- printf(" Wo %f index_in %d index_out %d\n", Wo,
- index_in, index_out);
- }
-
- /* measure quantisation error stats and compare to expected. Also
- plot histogram of error file to check. */
-
- f = fopen("quant_pitch_err.txt","wt");
- step_size = ((TWO_PI/P_MIN) - (TWO_PI/P_MAX))/WO_LEVELS;
-
- for(Wo=TWO_PI/P_MAX; Wo<0.99*TWO_PI/P_MIN; Wo += 0.0001) {
- index = encode_Wo(Wo, WO_BITS);
- Wo_dec = decode_Wo(index, WO_BITS);
- error = Wo - Wo_dec;
- if (fabs(error) > (step_size/2.0)) {
- printf("error: %f step_size/2: %f\n", error, step_size/2.0);
- exit(0);
- }
- fprintf(f,"%f\n",error);
- }
- printf("OK\n");
-
- fclose(f);
- return 0;
-}
diff --git a/misc/tsrc.c b/misc/tsrc.c
deleted file mode 100644
index 6791b51..0000000
--- a/misc/tsrc.c
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- tsrc.c
- David Rowe
- Sat Nov 3 2012
-
- Unit test for libresample code.
-
- build: gcc tsrc.c -o tsrc -lm -lsamplerate
-
- */
-
-#include <assert.h>
-#include <math.h>
-#include <string.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <samplerate.h>
-#include <unistd.h>
-
-#define N 10000 /* processing buffer size */
-
-void display_help(void) {
- fprintf(stderr, "\nusage: tsrc inputRawFile OutputRawFile OutSampleRatio [-l] [-c]\n");
- fprintf(stderr, "\nUse - for stdin/stdout\n\n");
- fprintf(stderr, "-l fast linear resampler\n");
- fprintf(stderr, "-c complex (two channel) resampling\n\n");
-}
-
-int main(int argc, char *argv[]) {
- FILE *fin, *fout;
- short in_short[N], out_short[N];
- float in[N], out[N];
- SRC_STATE *src;
- SRC_DATA data;
- int error, nin, nremaining, i;
-
- if (argc < 3) {
- display_help();
- exit(1);
- }
-
- if (strcmp(argv[1], "-") == 0)
- fin = stdin;
- else
- fin = fopen(argv[1], "rb");
- assert(fin != NULL);
-
- if (strcmp(argv[2], "-") == 0)
- fout = stdout;
- else
- fout = fopen(argv[2], "wb");
- assert(fout != NULL);
-
- data.data_in = in;
- data.data_out = out;
- data.end_of_input = 0;
- data.src_ratio = atof(argv[3]);
-
- int channels = 1;
- int resampler = SRC_SINC_FASTEST;
- int opt;
- while ((opt = getopt(argc, argv, "lc")) != -1) {
- switch (opt) {
- case 'l': resampler = SRC_LINEAR; break;
- case 'c': channels = 2; break;
- default:
- display_help();
- exit(1);
- }
- }
-
- data.input_frames = N/channels;
- data.output_frames = N/channels;
-
- src = src_new(resampler, channels, &error);
- assert(src != NULL);
-
- int total_in = 0;
- int total_out = 0;
-
- nin = data.input_frames;
- nremaining = 0;
- while(fread(&in_short[nremaining*channels], sizeof(short)*channels, nin, fin) == nin) {
- src_short_to_float_array(in_short, in, N);
- error = src_process(src, &data);
- assert(error == 0);
- src_float_to_short_array(out, out_short, data.output_frames_gen*channels);
-
- fwrite(out_short, sizeof(short), data.output_frames_gen*channels, fout);
- if (fout == stdout) fflush(stdout);
-
- nremaining = data.input_frames - data.input_frames_used;
- nin = data.input_frames_used;
- //fprintf(stderr, "input frames: %d output_frames %d nremaining: %d\n",
- // (int)data.input_frames_used, (int)data.output_frames_gen, nremaining);
- for(i=0; i<nremaining*channels; i++)
- in_short[i] = in_short[i+nin*channels];
-
- total_in += data.input_frames_used;
- total_out += data.output_frames_gen;
- }
-
- //fprintf(stderr, "total_in: %d total_out: %d\n", total_in, total_out);
-
- fclose(fout);
- fclose(fin);
-
- return 0;
-}
diff --git a/misc/vq_binary_switch.c b/misc/vq_binary_switch.c
deleted file mode 100644
index 4270c3d..0000000
--- a/misc/vq_binary_switch.c
+++ /dev/null
@@ -1,296 +0,0 @@
-/*
- vq_binary_switch.c
- David Rowe Dec 2021
-
- C implementation of [1], that re-arranges VQ indexes so they are robust to single
- bit errors.
-
- [1] Pseudo Gray Coding, Zeger & Gersho 1990
-*/
-
-#include <assert.h>
-#include <getopt.h>
-#include <math.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <limits.h>
-#include "mbest.h"
-
-#define MAX_DIM 20
-#define MAX_ENTRIES 4096
-
-// equation (33) of [1], total cost of all hamming distance 1 vectors of vq index k
-float cost_of_distance_one(float *vq, int n, int dim, float *prob, int k, int st, int en, int verbose) {
- int log2N = log2(n);
- float c = 0.0;
- for (int b=0; b<log2N; b++) {
- unsigned int index_neighbour = k ^ (1<<b);
- float dist = 0.0;
- for(int i=st; i<=en; i++)
- dist += pow(vq[k*dim+i] - vq[index_neighbour*dim+i], 2.0);
- c += prob[k]*dist;
- if (verbose)
- printf("k: %d b: %d index_neighbour: %d dist: %f prob: %f c: %f \n", k, b, index_neighbour, dist, prob[k], c);
- }
- return c;
-}
-
-// equation (39) of [1]
-float distortion_of_current_mapping(float *vq, int n, int dim, float *prob, int st, int en) {
- float d = 0.0;
- for(int k=0; k<n; k++)
- d += cost_of_distance_one(vq, n, dim, prob, k, st, en, 0);
- return d;
-}
-
-// we sort the cost array c[], returning the indexes of sorted elements
-float c[MAX_ENTRIES];
-
-/* Note how the compare function compares the values of the
- * array to be sorted. The passed value to this function
- * by `qsort' are actually the `idx' array elements.
- */
-int compare_increase (const void * a, const void * b) {
- int aa = *((int *) a), bb = *((int *) b);
- if (c[aa] < c[bb]) {
- return 1;
- } else if (c[aa] == c[bb]) {
- return 0;
- } else {
- return -1;
- }
-}
-
-void sort_c(int *idx, const size_t n) {
- for (size_t i=0; i<n; i++) idx[i] = i;
- qsort(idx, n, sizeof(int), compare_increase);
-}
-
-void swap(float *vq, int dim, float *prob, int index1, int index2) {
- float tmp[dim];
- for(int i=0; i<dim; i++) tmp[i] = vq[index1*dim+i];
- for(int i=0; i<dim; i++) vq[index1*dim+i] = vq[index2*dim+i];
- for(int i=0; i<dim; i++) vq[index2*dim+i] = tmp[i];
-
- tmp[0] = prob[index1];
- prob[index1] = prob[index2];
- prob[index2] = tmp[0];
-}
-
-int main(int argc, char *argv[]) {
- float vq[MAX_DIM*MAX_ENTRIES];
- int dim = MAX_DIM;
- int max_iter = INT_MAX;
- int st = -1;
- int en = -1;
- int verbose = 0;
- int n = 0;
- int fast_en = 0;
- char prob_fn[80]="";
-
- int o = 0; int opt_idx = 0;
- while (o != -1) {
- static struct option long_opts[] = {
- {"prob", required_argument, 0, 'p'},
- {"st", required_argument, 0, 't'},
- {"en", required_argument, 0, 'e'},
- {0, 0, 0, 0}
- };
- o = getopt_long(argc,argv,"hd:m:vt:e:n:fp:",long_opts,&opt_idx);
- switch (o) {
- case 'd':
- dim = atoi(optarg);
- assert(dim <= MAX_DIM);
- break;
- case 'm':
- max_iter = atoi(optarg);
- break;
- case 't':
- st = atoi(optarg);
- break;
- case 'e':
- en = atoi(optarg);
- break;
- case 'f':
- fast_en = 1;
- break;
- case 'n':
- n = atoi(optarg);
- break;
- case 'p':
- strcpy(prob_fn,optarg);
- break;
- case 'v':
- verbose = 1;
- break;
- help:
- fprintf(stderr, "\n");
- fprintf(stderr, "usage: %s -d dimension [-m max_iterations -v --st Kst --en Ken -n nVQ] vq_in.f32 vq_out.f32\n", argv[0]);
- fprintf(stderr, "\n");
- fprintf(stderr, "-n nVQ Run with just the first nVQ entries of the VQ\n");
- fprintf(stderr, "--st Kst Start vector element for error calculation (default 0)\n");
- fprintf(stderr, "--en Ken End vector element for error calculation (default K-1)\n");
- fprintf(stderr, "--prob probFile f32 file of probabilities for each VQ element (default 1.0)\n");
- fprintf(stderr, "-v verbose\n");
- exit(1);
- }
- }
-
- int dx = optind;
- if ((argc - dx) < 2) {
- fprintf(stderr, "Too few arguments\n");
- goto help;
- }
- if (dim == 0) goto help;
-
- /* default to measuring error on entire vector */
- if (st == -1) st = 0;
- if (en == -1) en = dim-1;
-
- /* load VQ quantiser file --------------------*/
-
- fprintf(stderr, "loading %s ... ", argv[dx]);
- FILE *fq=fopen(argv[dx], "rb");
- if (fq == NULL) {
- fprintf(stderr, "Couldn't open: %s\n", argv[dx]);
- exit(1);
- }
-
- if (n==0) {
- /* count how many entries m of dimension k are in this VQ file */
- float dummy[dim];
- while (fread(dummy, sizeof(float), dim, fq) == (size_t)dim)
- n++;
- assert(n <= MAX_ENTRIES);
- fprintf(stderr, "%d entries of vectors width %d\n", n, dim);
-
- rewind(fq);
- }
-
- /* load VQ into memory */
- int nrd = fread(vq, sizeof(float), n*dim, fq);
- assert(nrd == n*dim);
- fclose(fq);
-
- /* set probability of each vector to 1.0 as default */
- float prob[n];
- for(int l=0; l<n; l++) prob[l] = 1.0;
- if (strlen(prob_fn)) {
- fprintf(stderr, "Reading probability file: %s\n", prob_fn);
- FILE *fp = fopen(prob_fn,"rb");
- assert(fp != NULL);
- int nrd = fread(prob, sizeof(float), n, fp);
- assert(nrd == n);
- fclose(fp);
- float sum = 0.0;
- for(int l=0; l<n; l++) sum += prob[l];
- fprintf(stderr, "sum = %f\n", sum);
- }
-
- int iteration = 0;
- int i = 0;
- int finished = 0;
- int switches = 0;
- int log2N = log2(n);
- float distortion0 = distortion_of_current_mapping(vq, n, dim, prob, st, en);
- fprintf(stderr, "distortion0: %f\n", distortion0);
-
- while(!finished) {
-
- // generate a list A(i) of which vectors have the largest cost of bit errors
- for(int k=0; k<n; k++) {
- c[k] = cost_of_distance_one(vq, n, dim, prob, k, st, en, verbose);
- }
- int A[n];
- sort_c(A, n);
-
- // Try switching each vector with A(i)
- float best_delta = 0; int best_j = 0;
- for(int j=1; j<n; j++) {
- float distortion1, distortion2, delta = 0.0;
-
- // we can't switch with ourself
- if (j != A[i]) {
- if (fast_en) {
- // subtract just those contributions to delta that will change
- delta -= cost_of_distance_one(vq, n, dim, prob, A[i], st, en, verbose);
- delta -= cost_of_distance_one(vq, n, dim, prob, j, st, en, verbose);
- for (int b=0; b<log2N; b++) {
- unsigned int index_neighbour;
- index_neighbour = A[i] ^ (1<<b);
- if ((index_neighbour != j) && (index_neighbour != A[i]))
- delta -= cost_of_distance_one(vq, n, dim, prob, index_neighbour, st, en, verbose);
- index_neighbour = j ^ (1<<b);
- if ((index_neighbour != j) && (index_neighbour != A[i]))
- delta -= cost_of_distance_one(vq, n, dim, prob, index_neighbour, st, en, verbose);
- }
- }
- else
- distortion1 = distortion_of_current_mapping(vq, n, dim, prob, st, en);
-
- // switch vq entries A(i) and j
- swap(vq, dim, prob, A[i], j);
-
- if (fast_en) {
- // add just those contributions to delta that will change
- delta += cost_of_distance_one(vq, n, dim, prob, A[i], st, en, verbose);
- delta += cost_of_distance_one(vq, n, dim, prob, j, st, en, verbose);
- for (int b=0; b<log2N; b++) {
- unsigned int index_neighbour;
- index_neighbour = A[i] ^ (1<<b);
- if ((index_neighbour != j) && (index_neighbour != A[i]))
- delta += cost_of_distance_one(vq, n, dim, prob, index_neighbour, st, en, verbose);
- index_neighbour = j ^ (1<<b);
- if ((index_neighbour != j) && (index_neighbour != A[i]))
- delta += cost_of_distance_one(vq, n, dim, prob, index_neighbour, st, en, verbose);
- }
- }
- else {
- distortion2 = distortion_of_current_mapping(vq, n, dim, prob, st, en);
- delta = distortion2 - distortion1;
- }
-
- if (delta < 0.0) {
- if (fabs(delta) > best_delta) {
- best_delta = fabs(delta);
- best_j = j;
- }
- }
- // unswitch
- swap(vq, dim, prob, A[i], j);
- }
- } //next j
-
- // printf("best_delta: %f best_j: %d\n", best_delta, best_j);
- if (best_delta == 0.0) {
- // Hmm, no improvement, lets try the next vector in the sorted cost list
- if (i == n-1) finished = 1; else i++;
- } else {
- // OK keep the switch that minimised the distortion
- swap(vq, dim, prob, A[i], best_j);
- switches++;
-
- // save results
- FILE *fq=fopen(argv[dx+1], "wb");
- if (fq == NULL) {
- fprintf(stderr, "Couldn't open: %s\n", argv[dx+1]);
- exit(1);
- }
- int nwr = fwrite(vq, sizeof(float), n*dim, fq);
- assert(nwr == n*dim);
- fclose(fq);
-
- // set up for next iteration
- iteration++;
- float distortion = distortion_of_current_mapping(vq, n, dim, prob, st, en);
- fprintf(stderr, "it: %3d dist: %f %3.2f i: %3d sw: %3d\n", iteration, distortion,
- distortion/distortion0, i, switches);
- if (iteration >= max_iter) finished = 1;
- i = 0;
- }
- }
-
- return 0;
-}
-
diff --git a/misc/vqtrain.c b/misc/vqtrain.c
deleted file mode 100644
index 59e88f1..0000000
--- a/misc/vqtrain.c
+++ /dev/null
@@ -1,399 +0,0 @@
-/*--------------------------------------------------------------------------*\
-
- FILE........: VQTRAIN.C
- AUTHOR......: David Rowe
- DATE CREATED: 23/2/95
-
- This program trains vector quantisers using K dimensional Lloyd-Max
- method.
-
-\*--------------------------------------------------------------------------*/
-
-/*
- Copyright (C) 2009 David Rowe
-
- All rights reserved.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License version 2.1, as
- published by the Free Software Foundation. This program is
- distributed in the hope that it will be useful, but WITHOUT ANY
- WARRANTY; without even the implied warranty of MERCHANTABILITY or
- FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
- License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-/*-----------------------------------------------------------------------*\
-
- INCLUDES
-
-\*-----------------------------------------------------------------------*/
-
-#include <assert.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <math.h>
-#include <ctype.h>
-#include <getopt.h>
-#include <time.h>
-
-/*-----------------------------------------------------------------------*\
-
- DEFINES
-
-\*-----------------------------------------------------------------------*/
-
-#define DELTAQ 0.005 /* quitting distortion */
-#define MAX_STR 80 /* maximum string length */
-
-/*-----------------------------------------------------------------------*\
-
- FUNCTION PROTOTYPES
-
-\*-----------------------------------------------------------------------*/
-
-void zero(float v[], int k);
-void acc(float v1[], float v2[], int k);
-void norm(float v[], int k, long n);
-long quantise(float cb[], float vec[], int k, int m, int st, int en, float *beste, float *se);
-
-/*-----------------------------------------------------------------------* \
-
- MAIN
-
-\*-----------------------------------------------------------------------*/
-
-int main(int argc, char *argv[]) {
- long k,m; /* dimension and codebook size */
- float *vec; /* current vector */
- float *cb; /* vector codebook */
- float *cent; /* centroids for each codebook entry */
- long *n; /* number of vectors in this interval */
- long J; /* number of vectors in training set */
- long i,j;
- long ind; /* index of current vector */
- float e; /* squared error for current vector */
- float se; /* squared error for this iteration */
- float var,var_1; /* current and previous iterations distortion */
- float delta; /* improvement in distortion */
- long noutliers[3];/* number of vectors quantisers with > 3*sd */
- FILE *ftrain; /* file containing training set */
- FILE *fvq; /* file containing vector quantiser */
- int ret;
- float deltaq_stop = DELTAQ;
- FILE *fres = NULL;
- int st = -1;
- int en = -1;
- int init_rand = 0;
-
- int o = 0;
- int opt_idx = 0;
- while( o != -1 ) {
- static struct option long_opts[] = {
- {"help", no_argument, 0, 'h'},
- {"residual", required_argument, 0, 'r'},
- {"stop", required_argument, 0, 's'},
- {"st", required_argument, 0, 't'},
- {"en", required_argument, 0, 'e'},
- {"rand", no_argument, 0, 'i'},
- {0, 0, 0, 0}
- };
-
- o = getopt_long(argc,argv,"hr:s:t:e:",long_opts,&opt_idx);
-
- switch(o) {
- case 'r':
- fres = fopen(optarg,"wb"); assert(fres != NULL);
- //fprintf(stderr, "writing res to : %s \n", optarg);
- break;
- case 's':
- deltaq_stop = atof(optarg);
- //fprintf(stderr, "deltaq_stop :%f\n", deltaq_stop);
- break;
- case 't':
- st = atoi(optarg);
- break;
- case 'e':
- en = atoi(optarg);
- break;
- case 'i':
- init_rand = 1;
- break;
- case 'h':
- case '?':
- goto helpmsg;
- break;
- }
- }
- int dx = optind;
-
- if ((argc - dx) < 4) {
- fprintf(stderr, "Too few arguments\n");
- helpmsg:
- fprintf(stderr, "usage: %s [Options] TrainFile.f32 K(dimension) M(codebook size) VQFile.f32\n", argv[0]);
- fprintf(stderr, " -r --residual VQResidualErrorFile.f32\n");
- fprintf(stderr, " -s --stop StopDelta\n");
- fprintf(stderr, " --st Kst start vector element for error calculation (default 0)\n");
- fprintf(stderr, " --en Ken end vector element for error calculation (default K-1)\n");
- fprintf(stderr, " --rand use random sampling for initial VQ population\n");
- exit(1);
- }
-
- /* Open training file */
- ftrain = fopen(argv[dx],"rb");
- if (ftrain == NULL) {
- printf("Error opening training database file: %s\n",argv[dx]);
- exit(1);
- }
-
- /* determine k and m, and allocate arrays */
- k = atol(argv[dx+1]);
- m = atol(argv[dx+2]);
-
- /* default to measuring error on entire vector */
- if (st == -1) st = 0;
- if (en == -1) en = k-1;
-
- printf("vector dimension K=%ld codebook size M=%ld ", k, m);
- vec = (float*)malloc(sizeof(float)*k);
- cb = (float*)malloc(sizeof(float)*k*m);
- cent = (float*)malloc(sizeof(float)*k*m);
- n = (long*)malloc(sizeof(long)*m);
- if (vec == NULL || cb == NULL || cent == NULL || n == NULL) {
- printf("Error in malloc.\n");
- exit(1);
- }
-
- /* determine size of training set */
- J = 0; zero(cent, k);
- while(fread(vec, sizeof(float), k, ftrain) == (size_t)k) {
- J++;
- acc(cent, vec, k);
- }
- printf("J=%ld vectors in training set\n", J);
-
- /* Lets measure 0 bit VQ (i.e. mean of training set) as starting point */
- norm(cent, k, J);
- memcpy(cb, cent, k*sizeof(float));
- se = 0.0;
- rewind(ftrain);
- for(i=0; i<J; i++) {
- ret = fread(vec, sizeof(float), k, ftrain);
- assert(ret == k);
- quantise(cb, vec, k, 1, st, en, &e, &se);
- }
- var = se/(J*(en-st+1));
- printf("\r It: 0, var: %f sd: %f\n", var, sqrt(var));
-
- /* set up initial codebook state from samples of training set */
- if (init_rand) srand(time(NULL));
- for(i=0; i<m; i++) {
- if (init_rand)
- j = J*(float)rand()/RAND_MAX;
- else
- j = i*(J/m);
- fseek(ftrain, j*k*sizeof(float), SEEK_SET);
- ret = fread(&cb[i*k], sizeof(float), k, ftrain);
- assert(ret == k);
- }
-
- /* main loop */
- j = 1;
- do {
- var_1 = var;
-
- /* zero centroids */
- for(i=0; i<m; i++) {
- zero(&cent[i*k], k);
- n[i] = 0;
- }
-
- /* quantise training set */
- se = 0.0; noutliers[0] = noutliers[1] = noutliers[2] = 0;
- rewind(ftrain);
- for(i=0; i<J; i++) {
- ret = fread(vec, sizeof(float), k, ftrain);
- assert(ret == k);
- ind = quantise(cb, vec, k, m, st, en, &e, &se);
- n[ind]++;
- acc(&cent[ind*k], vec, k);
- if (sqrt(e/(en-st+1)) > 1.0) noutliers[0]++;
- if (sqrt(e/(en-st+1)) > 2.0) noutliers[1]++;
- if (sqrt(e/(en-st+1)) > 3.0) noutliers[2]++;
- }
- var = se/(J*(en-st+1));
- delta = (var_1-var)/var;
- int n_min = J;
- int n_max = 0;
- for(i=0; i<m; i++) {
- if (n[i] < n_min) n_min = n[i];
- if (n[i] > n_max) n_max = n[i];
- }
- printf("\r It: %2ld, var: %5f sd: %f outliers > 1/2/3 dB = %3.2f/%3.2f/%3.2f Delta = %5.4f %d %d\n", j, var, sqrt(var),
- (float)noutliers[0]/J, (float)noutliers[1]/J, (float)noutliers[2]/J, delta, n_min, n_max);
- j++;
-
- /* determine new codebook from centroids */
- if (delta > deltaq_stop)
- for(i=0; i<m; i++) {
- if (n[i] != 0) {
- norm(&cent[i*k], k, n[i]);
- memcpy(&cb[i*k], &cent[i*k], k*sizeof(float));
- }
- }
-
- } while (delta > deltaq_stop);
-
- /* save VQ to disk */
- fvq = fopen(argv[dx+3],"wt");
- if (fvq == NULL) {
- printf("Error opening VQ file: %s\n",argv[dx+3]);
- exit(1);
- }
-
- fwrite(cb, sizeof(float), m*k, fvq);
-
- /* optionally output residual error for next stage VQ */
- if (fres != NULL) {
- float res[k];
- rewind(ftrain);
- for(j=0; j<J; j++) {
- ret = fread(vec, sizeof(float), k, ftrain);
- ind = quantise(cb, vec, k, m, st, en, &e, &se);
- for(i=0; i<k; i++) {
- res[i] = vec[i] - cb[k*ind+i];
- }
- fwrite(res, sizeof(float), k, fres);
- }
- fclose(fres);
- }
-
- fclose(fvq);
- fclose(ftrain);
- free(vec);
- free(n);
-
- return 0;
-}
-
-/*-----------------------------------------------------------------------*\
-
- FUNCTIONS
-
-\*-----------------------------------------------------------------------*/
-
-/*-----------------------------------------------------------------------*\
-
- FUNCTION....: zero()
-
- AUTHOR......: David Rowe
- DATE CREATED: 23/2/95
-
- Zeros a vector of length k.
-
-\*-----------------------------------------------------------------------*/
-
-void zero(float v[], int k)
-/* float v[]; ptr to start of vector */
-/* int k; lngth of vector */
-{
- int i;
-
- for(i=0; i<k; i++)
- v[i] = 0.0;
-}
-
-/*---------------------------------------------------------------------------*\
-
- FUNCTION....: acc()
-
- AUTHOR......: David Rowe
- DATE CREATED: 23/2/95
-
- Adds k dimensional vectors v1 to v2 and stores the result back in v1.
-
-\*---------------------------------------------------------------------------*/
-
-void acc(float v1[], float v2[], int k)
-/* float v1[]; ptr to start of vector to accumulate */
-/* float v2[]; ptr to start of vector to add */
-/* int k; dimension of vectors */
-{
- int i;
-
- for(i=0; i<k; i++)
- v1[i] += v2[i];
-}
-
-/*---------------------------------------------------------------------------*\
-
- FUNCTION....: norm()
-
- AUTHOR......: David Rowe
- DATE CREATED: 23/2/95
-
- Divides each element in k dimensional vector v by n.
-
-\*---------------------------------------------------------------------------*/
-
-void norm(float v[], int k, long n)
-/* float v[]; ptr to start of vector */
-/* int k; dimension of vectors */
-/* int n; normalising factor */
-{
- int i;
-
- assert(n != 0);
- for(i=0; i<k; i++)
- v[i] /= n;
-}
-
-/*---------------------------------------------------------------------------*\
-
- FUNCTION....: quantise()
- AUTHOR......: David Rowe
- DATE CREATED: 23/2/95
-
- Quantises vec by choosing the nearest vector in codebook cb, and
- returns the vector index. The squared error of the quantised vector
- is added to se.
-
-\*---------------------------------------------------------------------------*/
-
-long quantise(float cb[], // current VQ codebook
- float vec[], // cb[][k]; current VQ codebook
- int k, // dimension of vectors
- int m, // size of codebook
- int st, // start sample of vector to use in error calc
- int en, // end sample of vector to use in error calc
- float *beste, // current squared error
- float *se) // accumulated squared error
-{
- long besti; /* best index so far */
- long j;
- int i;
- float diff,e;
-
- besti = 0;
- *beste = 1E32;
- for(j=0; j<m; j++) {
- e = 0.0;
- for(i=st; i<=en; i++) {
- diff = cb[j*k+i]-vec[i];
- e += diff*diff;
- }
- if (e < *beste) {
- *beste = e;
- besti = j;
- }
- }
-
- *se += *beste;
-
- return(besti);
-}
-
diff --git a/octave/2400ab_frame_design.ods b/octave/2400ab_frame_design.ods
deleted file mode 100644
index 015fc6b..0000000
--- a/octave/2400ab_frame_design.ods
+++ /dev/null
Binary files differ
diff --git a/octave/apsk_ser.m b/octave/apsk_ser.m
deleted file mode 100644
index c357a64..0000000
--- a/octave/apsk_ser.m
+++ /dev/null
@@ -1,56 +0,0 @@
-function [svec] = apsk_ser(Esvec, M)
-% Return approx (uncoded) SER for 16 or 32 APSK, or plot SERs if no args
-% USAGE apsk_ser(); OR SERvec = apsk_ser(Esvec_dBs, M)
-% VK5DSP, July 2020
-
-% Fit 3rd order polys to data in Figure 3 of
-% "Perf anal of APSK mod for DVB-S2 trans over nonlinear channels"
-% by Wonjin Sung et al;
-% Published in Int. J. Satellite Communications Networking, 2009
-% (see Fig 1 for constellation diagrams and bit mappings)
-
-% from the Figure data, we get 2 polynomials ...
-%{
-Fig3_Es = [10 12.5 15 17.5 20 21];
-Fig3_16_SER = [2e-1 8e-2 2.5e-2 3e-3 1e-4 2e-5];
-Fig3_32_SER = [4e-1 2.8e-1 1.5e-1 4e-2 1e-2 4e-3 1.05e-5];
-
-p16 = polyfit(Fig3_Es, log10(Fig3_16_SER), 3)
-p32 = polyfit([Fig3_Es 25], log10(Fig3_32_SER), 3)
-%}
-
-p16 = [-0.001816729857582 0.053322736530042 -0.653699203208837 2.315143765468362];
-p32 = [-0.001418894437779 0.049903575028137 -0.669130206501662 2.743251206655785];
-
-if nargin==0
- EStest = 10:21;
- EStest2 = 10:25;
- SER16 = polyval(p16, EStest);
- SER32 = polyval(p32, EStest2);
- figure(55);
- semilogy(EStest, 10.^SER16, 'b', EStest2, 10.^SER32, 'g')
- title('Approx Symb Error Rates for APSK')
- xlabel('Es/N0 (dB)')
- ylabel('SER'); grid on;
- legend('16APSK','32APSK'); legend('boxoff')
-elseif nargin~=2,
- error('usage is apsk_ser(Esvec, M)');
-
-else
- if (M~=16)&&(M~=32)
- error('M must be 16 or 32')
- end
- if min(Esvec)<8,
- error('Es/No values should be > 8 dB');
- end
- if (M==16) && (max(Esvec)>23),
- error('Es/No values should be < 23 dB');
- end
- if (M==32) && (max(Esvec)>27),
- error('Es/No values should be < 27 dB');
- end
-
- if M==16, svec = 10.^polyval(p16, Esvec); end
- if M==32, svec = 10.^polyval(p32, Esvec); end
-
-end
diff --git a/octave/c2wideband_map b/octave/c2wideband_map
deleted file mode 100644
index 946aa19..0000000
--- a/octave/c2wideband_map
+++ /dev/null
@@ -1,8 +0,0 @@
- 1.00000000e+00 3.00000000e+00 7.00000000e+00 8.00000000e+00 1.10000000e+01 1.50000000e+01 1.90000000e+01 2.60000000e+01 2.10000000e+01 2.40000000e+01 2.00000000e+01 3.00000000e+01 3.80000000e+01 4.80000000e+01 2.90000000e+01 3.20000000e+01 4.20000000e+01 6.40000000e+01 6.30000000e+01 5.40000000e+01 5.60000000e+01 5.00000000e+01 7.20000000e+01 9.10000000e+01 7.80000000e+01 6.70000000e+01 5.70000000e+01 7.00000000e+01 7.60000000e+01 1.04000000e+02
- 2.00000000e+00 5.00000000e+00 1.20000000e+01 2.20000000e+01 2.30000000e+01 3.30000000e+01 3.10000000e+01 4.30000000e+01 3.40000000e+01 3.90000000e+01 4.40000000e+01 4.10000000e+01 4.90000000e+01 6.00000000e+01 5.10000000e+01 7.70000000e+01 9.70000000e+01 9.00000000e+01 1.14000000e+02 8.10000000e+01 1.21000000e+02 1.13000000e+02 8.00000000e+01 9.90000000e+01 1.18000000e+02 1.09000000e+02 8.90000000e+01 1.02000000e+02 1.07000000e+02 1.19000000e+02
- 4.00000000e+00 9.00000000e+00 1.60000000e+01 2.70000000e+01 4.00000000e+01 4.50000000e+01 4.70000000e+01 5.50000000e+01 4.60000000e+01 6.10000000e+01 6.50000000e+01 6.60000000e+01 7.50000000e+01 8.30000000e+01 6.80000000e+01 1.06000000e+02 9.40000000e+01 1.27000000e+02 1.36000000e+02 1.38000000e+02 1.37000000e+02 1.41000000e+02 8.80000000e+01 1.50000000e+02 1.59000000e+02 1.47000000e+02 1.33000000e+02 1.28000000e+02 1.90000000e+02 1.31000000e+02
- 6.00000000e+00 1.80000000e+01 2.80000000e+01 5.20000000e+01 8.40000000e+01 6.20000000e+01 7.30000000e+01 7.90000000e+01 7.10000000e+01 9.80000000e+01 8.50000000e+01 9.30000000e+01 8.70000000e+01 1.12000000e+02 1.15000000e+02 1.10000000e+02 1.29000000e+02 1.99000000e+02 1.42000000e+02 1.70000000e+02 2.18000000e+02 1.62000000e+02 1.74000000e+02 2.05000000e+02 1.43000000e+02 1.64000000e+02 1.72000000e+02 1.75000000e+02 2.02000000e+02 2.16000000e+02
- 1.00000000e+01 2.50000000e+01 3.50000000e+01 6.90000000e+01 7.40000000e+01 9.20000000e+01 9.60000000e+01 1.35000000e+02 1.11000000e+02 1.56000000e+02 9.50000000e+01 1.05000000e+02 1.26000000e+02 1.34000000e+02 1.63000000e+02 2.15000000e+02 1.49000000e+02 1.48000000e+02 1.53000000e+02 2.28000000e+02 1.80000000e+02 2.30000000e+02 2.11000000e+02 2.13000000e+02 2.40000000e+02 2.24000000e+02 2.09000000e+02 2.22000000e+02 2.26000000e+02 1.73000000e+02
- 1.30000000e+01 3.70000000e+01 5.30000000e+01 1.08000000e+02 8.60000000e+01 1.17000000e+02 1.03000000e+02 1.00000000e+02 1.24000000e+02 1.22000000e+02 2.01000000e+02 1.92000000e+02 2.03000000e+02 2.19000000e+02 1.91000000e+02 1.69000000e+02 2.20000000e+02 2.14000000e+02 1.39000000e+02 2.04000000e+02 2.36000000e+02 1.79000000e+02 1.81000000e+02 2.00000000e+02 1.93000000e+02 2.21000000e+02 2.35000000e+02 1.87000000e+02 2.08000000e+02 2.17000000e+02
- 1.40000000e+01 3.60000000e+01 5.90000000e+01 1.16000000e+02 1.30000000e+02 1.78000000e+02 1.40000000e+02 1.32000000e+02 1.57000000e+02 1.52000000e+02 1.68000000e+02 1.60000000e+02 1.23000000e+02 1.97000000e+02 1.83000000e+02 2.34000000e+02 1.44000000e+02 2.23000000e+02 1.65000000e+02 1.67000000e+02 2.31000000e+02 1.96000000e+02 1.71000000e+02 2.33000000e+02 1.82000000e+02 2.25000000e+02 1.88000000e+02 2.37000000e+02 2.27000000e+02 2.10000000e+02
- 1.70000000e+01 5.80000000e+01 8.20000000e+01 1.01000000e+02 1.20000000e+02 1.86000000e+02 1.46000000e+02 1.25000000e+02 1.51000000e+02 1.94000000e+02 1.61000000e+02 1.84000000e+02 1.58000000e+02 1.89000000e+02 1.77000000e+02 1.95000000e+02 1.45000000e+02 1.66000000e+02 2.06000000e+02 1.54000000e+02 1.98000000e+02 2.12000000e+02 2.38000000e+02 2.29000000e+02 1.85000000e+02 1.76000000e+02 2.39000000e+02 1.55000000e+02 2.07000000e+02 2.32000000e+02
diff --git a/octave/channel_lib.m b/octave/channel_lib.m
index 6387d51..434f262 100644
--- a/octave/channel_lib.m
+++ b/octave/channel_lib.m
@@ -1,4 +1,4 @@
-% channel.m
+% channel_lib.m
%
% Commonly used channel simulation functions
diff --git a/octave/closed_quant_slope.m b/octave/closed_quant_slope.m
deleted file mode 100644
index 7d5a465..0000000
--- a/octave/closed_quant_slope.m
+++ /dev/null
@@ -1,3 +0,0 @@
-function b = closed_quant_slope(b)
- b(1) = max(0.5, b(1));
-end
diff --git a/octave/cma.m b/octave/cma.m
deleted file mode 100644
index a5a2195..0000000
--- a/octave/cma.m
+++ /dev/null
@@ -1,114 +0,0 @@
-% cma.m
-%
-% Constant modulus equaliser example from:
-%
-% http://dsp.stackexchange.com/questions/23540/matlab-proper-estimation-of-weights-and-how-to-calculate-mse-for-qpsk-signal-f
-%
-% Adapted to run bpsk and fsk signals
-
- rand('seed',1);
- randn('seed',1);
-
- N = 5000; % # symbols
- h = [1 0 0 0 0 0 0.0 0.5]; % simulation of HF multipath channel impulse response
- h = h/norm(h);
- Le = 20; % equalizer length
- mu = 1E-3; % step size
- snr = 30; % snr in dB
- M = 10; % oversample rate, e.g. Rs=400Hz at Fs=8000Hz
-
- tx_type = "fsk"; % select modulation type here "bpsk" or "fsk"
-
- if strcmp(tx_type, "bpsk")
- s0 = round( rand(N,1) )*2 - 1; % BPSK signal
- s0M = zeros(N*M,1); % oversampled BPSK signal
- k = 1;
- for i=1:M:N*M
- s0M(i:i+M-1) = s0(k);
- k ++;
- end
- end
-
- if strcmp(tx_type, "fsk")
- tx_bits = round(rand(1,N));
-
- % continuous phase FSK modulator
-
- w1 = pi/4;
- w2 = pi/2;
- tx_phase = 0;
- tx = zeros(M*N,1);
-
- for i=1:N
- for k=1:M
- if tx_bits(i)
- tx_phase += w2;
- else
- tx_phase += w1;
- end
- tx((i-1)*M+k) = exp(j*tx_phase);
- end
- end
-
- s0M = tx;
- end
-
- s = filter(h,1,s0M); % filtered signal
-
- % add Gaussian noise at desired snr
-
- n = randn(N*M,1);
- vs = var(s);
- vn = vs*10^(-snr/10);
- n = sqrt(vn)*n;
- r = s + n; % received signal
-
- e = zeros(N*M,1); % error
- w = zeros(Le,1); % equalizer coefficients
- w(Le)=1; % actual filter taps are flipud(w)!
-
- yd = zeros(N*M,1);
-
- for i = 1:N*M-Le,
- x = r(i:Le+i-1);
- y = w'*x;
- yd(i)=y;
- e(i) = abs(y).^2 - 1;
- w = w - mu * e(i) * real(conj(y) * x);
- end
-
- np = 100; % # sybmols to plot (last np will be plotted); np < N!
-
- figure(1); clf;
- %subplot(211), plot( 1:np, e(N-np+1-Le+1:N-Le+1).*e(N-np+1-Le+1:N-Le+1)), title('error')
- subplot(211), plot(e.*e), title('error');
- subplot(212), stem(conv(flipud(w),h)), title('equalized channel impulse response')
-
- figure(2); clf;
- subplot(311)
- plot(1:np, s0M(N-np+1:N))
- title('transmitted, received, and equalized signal')
- subplot(312)
- plot(1:np, r(N-np+1:N))
- subplot(313)
- plot(1:np, yd(N-np+1-Le+1:N-Le+1))
-
- figure(3); clf;
- h1 = freqz(h);
- h2 = freqz(flipud(w));
- h3 = freqz(conv(flipud(w),h));
- subplot(311); plot(20*log10(abs(h1)));
- title('channel, equaliser, combined freq resp')
- subplot(312); plot(20*log10(abs(h2)));
- subplot(313); plot(20*log10(abs(h3)));
-
- figure(4);
- subplot(211)
- plot(20*log10(abs(fft(s0M))))
- axis([1 length(s0M) 0 80]);
- grid;
- subplot(212)
- plot(20*log10(abs(fft(s))))
- axis([1 length(s0M) 0 80]);
- grid;
-
diff --git a/octave/codec2_demo.m b/octave/codec2_demo.m
deleted file mode 100644
index 0f3950b..0000000
--- a/octave/codec2_demo.m
+++ /dev/null
@@ -1,108 +0,0 @@
-% Copyright David Rowe 2012
-% This program is distributed under the terms of the GNU General Public License
-% Version 2
-%
-% codec2_demo.m
-
-% Designed as an educational tool to explain the operation of Codec 2
-% for conference and user group presentations on a projector. An
-% alternative to static overhead slides.
-%
-% Derived from codec2-dev/octave/plamp.m
-%
-% usage:
-% octave:1> plamp("../src/hts2a",40)
-%
-% Then press:
-% c - to cycle through the wavform being displayed on the figure
-% n - next frame
-% b - back one frame
-%
-% tip: hold down n or b to animate the display
-%
-% The text files used as input are generated using c2sim:
-%
-% /codec2-dev/src$ c2sim ../raw/hts2a.raw --dump hts2a
-%
-% The Codec 2 README explains how to build c2sim with dump files
-% enabled.
-
-function codec2_demo(samname, f)
-
- sn_name = strcat(samname,"_sn.txt");
- Sn = load(sn_name);
-
- sw_name = strcat(samname,"_sw.txt");
- Sw = load(sw_name);
-
- model_name = strcat(samname,"_model.txt");
- model = load(model_name);
-
- figure(1);
-
- k = ' ';
- wf = "Sn";
- do
-
- if strcmp(wf,"Sn")
- clf;
- s = [ Sn(2*f-1,:) Sn(2*f,:) ];
- plot(s);
- axis([1 length(s) -20000 20000]);
- end
-
- if (strcmp(wf,"Sw"))
- clf;
- plot((0:255)*4000/256, Sw(f,:),";Sw;");
- end
-
- if strcmp(wf,"SwAm")
- Wo = model(f,1);
- L = model(f,2);
- Am = model(f,3:(L+2));
- plot((0:255)*4000/256, Sw(f,:),";Sw;");
- hold on;
- plot((1:L)*Wo*4000/pi, 20*log10(Am),"+;Am;r");
- axis([1 4000 -10 80]);
- hold off;
- end
-
- if strcmp(wf,"Am")
- Wo = model(f,1);
- L = model(f,2);
- Am = model(f,3:(L+2));
- plot((1:L)*Wo*4000/pi, 20*log10(Am),"+;Am;r");
- axis([1 4000 -10 80]);
- end
-
- % interactive menu
-
- printf("\rframe: %d menu: n-next b-back w-cycle window q-quit", f);
- fflush(stdout);
- k = kbhit();
- if (k == 'n')
- f = f + 1;
- end
- if (k == 'b')
- f = f - 1;
- end
- if (k == 'w')
- if strcmp(wf,"Sn")
- next_wf = "Sw";
- end
- if strcmp(wf,"Sw")
- next_wf = "SwAm";
- end
- if strcmp(wf,"SwAm")
- next_wf = "Am";
- end
- if strcmp(wf,"Am")
- next_wf = "Sn";
- end
- wf = next_wf;
- end
-
- until (k == 'q')
- printf("\n");
-
-endfunction
diff --git a/octave/cohpsk_plots.m b/octave/cohpsk_plots.m
deleted file mode 100644
index 9fc9a11..0000000
--- a/octave/cohpsk_plots.m
+++ /dev/null
@@ -1,141 +0,0 @@
-% cohpsk_plots.m
-% David Rowe Feb 2017
-%
-% Generate some plots for chps modem blog post
-
-rand("seed",1);
-
-% Multipath with simple unfiltered BPSK signal
-
-N = 100; % number of symbols
-M = 4; % oversample rate
-
-tx_bits = rand(1,N) > 0.5;
-tx_symbols = 2*tx_bits - 1;
-tx = zeros(1,N*M);
-
-for i=1:N
- tx((i-1)*M+1:i*M) = tx_symbols(i);
-end
-
-h = [0 0 0 0 0.5]; % model of second path
-
-rx1 = tx;
-rx2 = filter(h,1,tx);
-rx = rx1 + rx2;
-
-% Multipath in time domain
-
-figure(1); clf;
-subplot(311)
-plot(rx1, "linewidth", 4)
-axis([0 10*M+1 -2 2]);
-subplot(312)
-plot(rx2, "linewidth", 4)
-axis([0 10*M+1 -2 2]);
-subplot(313)
-plot(rx, "linewidth", 4)
-axis([0 10*M+1 -2 2]);
-xlabel('Time');
-print("cohpsk_multipath_time.png", "-dpng", "-S600,440", "-F:8")
-
-% Multipath channel magnitude and phase response against frequency
-
-h = [1 0 0 0 0.5]; % model of two path multipath channel
-H = freqz(h,1,100);
-
-figure(2); clf;
-subplot(211)
-plot(20*log10(abs(H)), "linewidth", 4)
-title('Amplitude (dB)');
-subplot(212)
-plot(angle(H), "linewidth", 4)
-title('Phase (rads)');
-%axis([0 500 -2 2]);
-xlabel('Frequency');
-print("cohpsk_multipath_channel.png", "-dpng", "-S600,440", "-F:8")
-
-% Effective of 1 sample multipath for different symbols lengths
-
-h = [1 0 0 0 0.5]; % model of two path multipath channel
-M1 = 2;
-M2 = 20;
-tx1 = zeros(1,N*M1);
-tx2 = zeros(1,N*M2);
-for i=1:N
- tx1((i-1)*M1+1:i*M1) = tx_symbols(i);
- tx2((i-1)*M2+1:i*M2) = tx_symbols(i);
-end
-
-rx1 = filter(h,1,tx1);
-rx2 = filter(h,1,tx2);
-
-figure(3); clf;
-subplot(211)
-plot(rx1, "linewidth", 4)
-axis([0 10*M1+1 -2 2]);
-title('1ms multipath with 2ms symbols')
-subplot(212)
-plot(rx2, "linewidth", 4)
-axis([0 10*M2+1 -2 2]);
-title('1ms multipath with 20ms symbols')
-xlabel('Time');
-print("cohpsk_multipath_symbol_length.png", "-dpng", "-S600,440", "-F:8")
-
-% DBPSK --------------------------------------------------
-
-N = 10;
-tx_bits = rand(1,N) > 0.5;
-bpsk = 2*tx_bits - 1;
-prev_bpsk = 1;
-for i=1:N
-
- % BPSK -> DBPSK
-
- dbpsk(i) = bpsk(i) * (-prev_bpsk);
- prev_bpsk = bpsk(i);
-
- % oversampling
-
- tx_bpsk((i-1)*M+1:i*M) = bpsk(i);
- tx_dbpsk((i-1)*M+1:i*M) = dbpsk(i);
-end
-
-figure(4); clf;
-subplot(211);
-plot(tx_bpsk, "linewidth", 4)
-axis([0 10*M+1 -2 2]);
-title('Tx BPSK');
-subplot(212);
-plot(tx_dbpsk, "linewidth", 4)
-axis([0 10*M+1 -2 2]);
-title('Tx DBPSK');
-print("cohpsk_dbpsk1.png", "-dpng", "-S600,440", "-F:8")
-
-dbpsk *= -1;
-
-prev_rx = 1;
-for i=1:N
-
- % rx DBPSK -> PSK
-
- bpsk(i) = dbpsk(i) * (prev_rx);
- prev_rx = bpsk(i);
-
- % oversampling
-
- rx_bpsk((i-1)*M+1:i*M) = bpsk(i);
- rx_dbpsk((i-1)*M+1:i*M) = dbpsk(i);
-end
-
-figure(5); clf;
-subplot(211);
-plot(rx_dbpsk, "linewidth", 4)
-axis([0 10*M+1 -2 2]);
-title('Rx DBPSK with 180 deg phase shift');
-subplot(212);
-plot(rx_bpsk, "linewidth", 4)
-axis([0 10*M+1 -2 2]);
-title('Rx BPSK');
-print("cohpsk_dbpsk2.png", "-dpng", "-S600,440", "-F:8")
-
diff --git a/octave/doppler_spread_ut.m b/octave/doppler_spread_ut.m
deleted file mode 100644
index f7d96b0..0000000
--- a/octave/doppler_spread_ut.m
+++ /dev/null
@@ -1,51 +0,0 @@
-% doppler_spread_ut.m
-% David Rowe Jan 2016
-%
-% Unit test script for doppler_spread
-
-f = 1;
-Fs = 8000;
-N = Fs*10;
-
-[spread states] = doppler_spread(f, Fs, N);
-
-% use spreading samples to modulate 1000Hz sine wave
-% You can listen to this with: sine1k_1Hz.raw
-
-% $ play -t raw -r 8000 -s -2
-s = cos(2*pi*(1:N)*1000/Fs);
-s = s .* spread;
-s = real(s)*5000;
-fs = fopen("sine1k_1Hz.raw","wb"); fwrite(fs,s,"short"); fclose(fs);
-
-% Some plots
-
-x = states.x; y = states.y; b = states.b;
-
-H = freqz(b,1,x);
-
-figure(1)
-clf
-subplot(211)
-plot(x,y,';target;')
-title('Gaussian Filter Freq Resp Lin');
-legend('boxoff');
-subplot(212)
-plot(x,20*log10(y),';target;')
-hold on;
-plot(x,20*log10(y),'g+;actual;')
-hold off;
-axis([0 f*10/2 -60 0])
-title('Gaussian Filter Freq Resp dB');
-xlabel('Freq (Hz)');
-legend('boxoff');
-
-figure(2);
-subplot(211)
-plot(abs(spread))
-title('Spreading Function Magnitude');
-subplot(212)
-plot(s)
-title('1000Hz Sine Wave');
-xlabel('Time (samples)')
-
diff --git a/octave/estsnr.m b/octave/estsnr.m
deleted file mode 100644
index 5a00bd8..0000000
--- a/octave/estsnr.m
+++ /dev/null
@@ -1,65 +0,0 @@
-% estsnr.m
-% David Rowe May 2017
-%
-% estimate SNR of a sinewave in noise
-
-function snr_dB = estsnr(x, Fs=8000, Nbw = 3000)
-
- [nr nc] = size(x);
- if nr == 1
- x = x';
- end
-
- % find peak in +ve side of spectrum, ignoring DC
-
- L = length(x);
- X = abs(fft(x));
- st = floor(0.05*L); en = floor(0.45*L);
- [A mx_ind]= max(X(st:en));
- mx_ind += st;
-
- % signal energy might be spread by doppler, so sum energy
- % in frequencies +/- 1%
-
- s_st = floor(mx_ind*0.99); s_en = floor(mx_ind*1.01);
- S = sum(X(s_st:s_en).^2);
-
- % real signal, so -ve power is the same
-
- S = 2*S;
- SdB = 10*log10(S);
-
- printf("Signal Power S: %3.2f dB\n", SdB);
-
- % locate a band of noise next to it and find power in band
-
- st = floor(mx_ind+0.05*(L/2));
- en = st + floor(0.1*(L/2));
-
- N = sum(X(st:en).^2);
-
- % scale this to obtain total noise power across total bandwidth
-
- N *= L/(en-st);
- NdB = 10*log10(N);
- printf("Noise Power N: %3.2f dB\n", NdB);
-
- % scale noise to designed noise bandwidth /2 fudge factor as its a
- % real signal, wish I had a better way to explain that!
-
- NodB = NdB - 10*log10(Fs/2);
- NscaleddB = NodB + 10*log10(Nbw);
- snr_dB = SdB - NscaleddB;
-
- figure(1); clf;
- plot(20*log10(X(1:L/2)),'b');
- hold on;
- plot([s_st s_en], [NdB NdB]- 10*log10(L), 'r');
- plot([st en], [NdB NdB]- 10*log10(L), 'r');
- hold off;
- top = 10*ceil(SdB/10);
- bot = NodB - 20;
- axis([1 L/2 bot top]);
- grid
- grid("minor")
-endfunction
diff --git a/octave/fdmdv_ut_freq_off.m b/octave/fdmdv_ut_freq_off.m
deleted file mode 100644
index 395bcc5..0000000
--- a/octave/fdmdv_ut_freq_off.m
+++ /dev/null
@@ -1,489 +0,0 @@
-% fdmdv_ut_freq_off.m
-% David Rowe 17 June 2014
-%
-% Unit Test program for freq offset estimation in FDMDV modem.
-%
-% Copyright David Rowe 2012 This program is
-% distributed under the terms of the GNU General Public License
-% Version 2
-
-% [ ] sweep of different delays
-% [ ] sweep of Eb/No
-% [ ] sweep of freq offsets
-% [ ] step change in foff
-% + time to respond
-% [ ] plot/print pass fail/relevant stats
-% + variance
-% + histogram of freq ests?
-
-fdmdv; % load modem code
-hf_sim; % load hf sim code
-
-% ---------------------------------------------------------------------
-% Eb/No calculations. We need to work out Eb/No for each FDM carrier.
-% Total power is sum of power in all FDM carriers. These calcs set the
-% Eb/No of the data carriers, Eb/No of pilot will be higher.
-% ---------------------------------------------------------------------
-
-function [Nsd SNR] = calc_Nsd_from_EbNo(EbNo_dB)
- global Rs;
- global Nb;
- global Nc;
- global Fs;
-
- C = 1; % power of each FDM carrier (energy/sample). Total Carrier power should = Nc*C = Nc
- N = 1; % total noise power (energy/sample) of noise source across entire bandwidth
-
- % Eb = Carrier power * symbol time / (bits/symbol)
- % = C *(1/Rs) / Nb
- Eb_dB = 10*log10(C) - 10*log10(Rs) - 10*log10(Nb);
-
- No_dBHz = Eb_dB - EbNo_dB;
-
- % Noise power = Noise spectral density * bandwidth
- % Noise power = Noise spectral density * Fs/2 for real signals
- N_dB = No_dBHz + 10*log10(Fs/2);
- Ngain_dB = N_dB - 10*log10(N);
- Nsd = 10^(Ngain_dB/20);
-
- % C/No = Carrier Power/noise spectral density
- % = power per carrier*number of carriers / noise spectral density
- CNo_dB = 10*log10(C) + 10*log10(Nc) - No_dBHz;
-
- % SNR in equivalent 3000 Hz SSB channel, adding extra power for pilot to get
- % true SNR.
-
- B = 3000;
- SNR = CNo_dB - 10*log10(B) + 10*log10((Nc+4)/Nc);
-end
-
-% we keep a m sample buffer in sample_memory
-% update sample_memory with n samples each time this function is called
-% outputs one nfft2 slice of spectrogram in dB. Good idea to make nfft2 a power of 2
-
-function [S, states_out] = spectrogram_update(samples, n, states_in)
- sample_memory = states_in.sample_memory;
- m = states_in.m;
- nfft2 = states_in.nfft2;
- lower_clip_dB = states_in.lower_clip_dB;
- dec = states_in.dec;
-
- sample_memory(1:m-n) = sample_memory(n+1:m);
- sample_memory(m-n+1:m) = samples;
-
- F = fft(sample_memory .* hanning(m)', 2*nfft2);
- S = 20*log10(abs(F(1:dec:nfft2))/(nfft2));
- S(find(S < lower_clip_dB)) = lower_clip_dB; % clip lower limit
-
- states_out = states_in;
- states_out.sample_memory = sample_memory;
-end
-
-% ------------------------------------------------------------
-
-function sim_out = freq_off_est_test(sim_in)
- global Nc;
- global Nb;
- global M;
- global Fs;
- global pilot_lut_index;
- global prev_pilot_lut_index;
- global pilot_lpf1;
- global Npilotlpf;
- global spread;
- global spread_2ms;
- global hf_gain;
-
- EbNovec = sim_in.EbNovec;
- Ndelay = sim_in.delay;
- frames = sim_in.frames;
- startup_delay = sim_in.startup_delay;
- allowable_error = sim_in.allowable_error;
- foff_hz = sim_in.foff_hz;
- hf_sim = sim_in.hf_sim;
- hf_delay = floor(sim_in.hf_delay_ms*Fs/1000);
- plot_type = sim_in.plot_type;
-
- % work out gain for HF model
- % e = sum((g*s)^2) = g*g*sum(s^2) = N, g = sqrt(N/sum(s^2))
- % compute so e=N
-
- s1 = spread(1:frames*M);
- s2 = [zeros(hf_delay,1); spread_2ms(1:frames*M)];
- s2 = s2(1:frames*M);
-
- p = (s1+s2)'*(s1+s2);
- hf_gain = sqrt(frames*M/p);
- p2 = (hf_gain*(s1+s2))'*(hf_gain*(s1+s2));
-
- if hf_sim
- channel_model = "HF";
- else
- channel_model = "AWGN";
- end
-
- % spectrogram states
-
- spec_states.m = 8*M;
- spec_states.nfft2 = 2 ^ ceil(log2(spec_states.m/2));
- spec_states.dec = 4;
- spec_states.sample_memory = zeros(1, spec_states.m);
- spec_states.lower_clip_dB = -30;
-
- printf("\n%s\n", sim_in.test_name);
- printf(" Channel EbNo SNR(calc) SNR(meas) SD(Hz) Hits Hits(%%) Result\n");
-
- % ---------------------------------------------------------------------
- % Main loop
- % ---------------------------------------------------------------------
-
- for ne = 1:length(EbNovec)
- EbNo_dB = EbNovec(ne);
- [Nsd SNR] = calc_Nsd_from_EbNo(EbNo_dB);
- hits = 0;
-
- tx_filt = zeros(Nc,M);
- prev_tx_symbols = ones(Nc+1,1);
-
- tx_fdm_log = [];
- rx_fdm_log = [];
- pilot_lpf1_log = [];
- S1_log = [];
- rx_fdm_delay = zeros(M+Ndelay,1);
-
- % freq offset simulation states
-
- phase_offset = 1;
- Nmedian = 20;
- foff_median=zeros(1,Nmedian);
-
- % hf sim states
-
- path2 = zeros(1,hf_delay+M);
- sum_sig = 0;
- sum_noise = 0;
-
- % state machine
- state = 0;
- fest_current = 0;
- fdelta = 5;
- candidate_thresh = 10;
- foff_est_thresh_prev = 0;
-
- for f=1:frames
-
- % ------------------- Modulator -------------------
-
- tx_bits = get_test_bits(Nc*Nb);
- tx_symbols = bits_to_psk(prev_tx_symbols, tx_bits, 'dqpsk');
-
- % simulate BPF filtering of +/- 200 Hz
- % tx_symbols(1:6) = 0; tx_symbols(9:Nc) = 0;
-
- prev_tx_symbols = tx_symbols;
- tx_baseband = tx_filter(tx_symbols);
- tx_fdm = fdm_upconvert(tx_baseband);
- tx_fdm_log = [tx_fdm_log real(tx_fdm)];
-
- % ------------------- Channel simulation -------------------
-
- % frequency offset
-
- for i=1:M
- freq_offset = exp(j*2*pi*foff_hz(f)/Fs);
- phase_offset *= freq_offset;
- tx_fdm(i) = phase_offset*tx_fdm(i);
- end
-
- % optional HF channel sim
-
- if hf_sim
- path1 = tx_fdm .* conj(spread(f*M+1:f*M+M)');
-
- path2(1:hf_delay) = path2(M+1:hf_delay+M);
- path2(hf_delay+1:hf_delay+M) = tx_fdm .* conj(spread_2ms(f*M+1:f*M+M)');
-
- tx_fdm = hf_gain*(path1 + path2(1:M));
- end
- sum_sig += tx_fdm * tx_fdm';
-
- rx_fdm = real(tx_fdm);
-
- % AWGN noise
-
- noise = Nsd*randn(1,M);
- sum_noise += noise * noise';
- rx_fdm += noise;
- rx_fdm_log = [rx_fdm_log rx_fdm];
-
- % Fixed Delay
-
- rx_fdm_delay(1:Ndelay) = rx_fdm_delay(M+1:M+Ndelay);
- rx_fdm_delay(Ndelay+1:M+Ndelay) = rx_fdm;
-
- % ------------------- Freq Offset Est -------------------
-
- % frequency offset estimation and correction, need to call
- % rx_est_freq_offset even in track mode to keep states updated
-
- [pilot prev_pilot pilot_lut_index prev_pilot_lut_index] = ...
- get_pilot(pilot_lut_index, prev_pilot_lut_index, M);
- [foff_est S1 S2] = rx_est_freq_offset(rx_fdm_delay, pilot, prev_pilot, M);
- pilot_lpf1_log = [pilot_lpf1_log pilot_lpf1(Npilotlpf-M+1:Npilotlpf)];
- S1_log(f,:) = fftshift(S1);
- S2_log(f,:) = fftshift(S2);
-
- % raw estimate
-
- foff_log(ne,f) = foff_est;
- maxS1_log(ne,f) = max(S1.*conj(S1)/(S1*S1'));
- maxS2_log(ne,f) = max(S2.*conj(S2)/(S2*S2'));
-
- % median filter post-processed
-
- foff_median(1:Nmedian-1) = foff_median(2:Nmedian);
- foff_median(Nmedian) = foff_est;
- foff_median_log(ne,f) = foff_coarse = median(foff_median);
-
- % state machine post-processed
-
- next_state = state;
- if state == 0
- if abs(foff_est - fest_current) > fdelta
- fest_candidate = foff_est;
- candidate_count = 0;
- next_state = 1;
- end
- end
- if state == 1
- if abs(foff_est - fest_candidate) > fdelta
- next_state = 0;
- end
- candidate_count++;
- if candidate_count > candidate_thresh
- fest_current = fest_candidate;
- next_state = 0;
- end
- end
- state = next_state;
- foff_statemach_log(ne,f) = fest_current;
-
- % threshold post processed
-
- if (maxS1_log(ne,f) > 0.06) || (maxS2_log(ne,f) > 0.06)
- %if (maxS1_log(ne,f) > 0.08)
- foff_thresh_log(ne,f) = foff_est;
- else
- foff_thresh_log(ne,f) = foff_est_thresh_prev;
- end
- foff_est_thresh_prev = foff_thresh_log(ne,f);
-
- % hit/miss stats
- fest_current = foff_statemach_log(ne,f);
- if (f > startup_delay) && (abs(fest_current - foff_hz(f)) < allowable_error)
- hits++;
- end
-
- if length(EbNovec) == 1
- [spectrogram(f,:) spec_states] = spectrogram_update(rx_fdm, M, spec_states);
- end
- end
-
- % results for this EbNo value
-
- sim_out.foff_sd(ne) = std(foff_log(ne,startup_delay:frames));
- sim_out.hits = hits;
- sim_out.hits_percent = 100*sim_out.hits/(frames-startup_delay);
- sim_out.SNRvec(ne) = SNR;
- sim_out.tx_fdm_log = tx_fdm_log;
- sim_out.rx_fdm_log = rx_fdm_log;
-
- % noise we have measures is 4000 Hz wide, we want noise in 3000 Hz BW
-
- snr_meas = 10*log10(sum_sig/(sum_noise*4000/3000));
-
- printf(" %6s %5.2f % -5.2f % -5.2f %3.2f %d %3.2f ", ...
- channel_model, EbNo_dB, SNR, snr_meas, sim_out.foff_sd(ne), sim_out.hits, sim_out.hits_percent);
-
- if sim_out.hits_percent == 100
- printf("PASS\n");
- else
- printf("FAIL\n");
- figure(5)
- clf
- plot(abs(foff_statemach_log(ne,:) - foff_hz < allowable_error));
- end
-
- % plots if single dimension vector
-
- if length(EbNovec) == 1
- fmin = -200; fmax = 200;
- figure(1)
- clf;
- subplot(411)
- plot(foff_log(ne,:))
- axis([1 frames fmin fmax]);
- ylabel("Foff raw")
- subplot(412)
- plot(foff_median_log(ne,:))
- axis([1 frames fmin fmax]);
- ylabel("Foff median")
- subplot(413)
- plot(foff_statemach_log(ne,:),'g')
- ylabel("Foff state")
- axis([1 frames fmin fmax]);
- subplot(414)
- plot(foff_thresh_log(ne,:))
- ylabel("Foff thresh")
- axis([1 frames fmin fmax]);
- xlabel("Frames")
- grid;
-
- figure(2)
- clf;
- plot(maxS1_log(ne,:));
- axis([1 frames 0 0.2]);
- xlabel("Frames")
- ylabel("max(abs(S1/S2))")
- grid;
- hold on;
- plot(maxS2_log(ne,:),'g');
- hold off;
-
- figure(3)
- [n m] = size(S1_log);
- if strcmp(plot_type,"mesh")
- mesh(-200+400*(0:m-1)/256,1:n,abs(S1_log(:,:)));
- xlabel('Freq (Hz)'); ylabel('Frame num'); zlabel("max(abs(S1))")
- else
- imagesc(1:n,-200+400*(0:(m-1))/m,abs(S1_log(:,:))');
- set(gca,'YDir','normal')
- ylabel('Freq (Hz)'); xlabel('Frame num');
- axis([1 n -200 200])
- end
-
- figure(4)
- clf
- [n m] = size(spectrogram);
- if strcmp(plot_type,"mesh")
- mesh((4000/m)*(1:m),1:n,spectrogram);
- xlabel('Freq (Hz)'); ylabel('Frame num'); zlabel('Amplitude (dB)');
- else
- imagesc(1:n,(4000/m)*(1:m),spectrogram')
- set(gca,'YDir','normal')
- ylabel('Freq (Hz)'); xlabel('Frame num');
- axis([1 n 500 2500])
- end
-
- sim_out.spec = spectrogram;
- sim_out.tx_fdm_log = spectrogram;
- end
- end
-end
-
-% ---------------------------------------------------------------------
-% Run Automated Tests
-% ---------------------------------------------------------------------
-
-more off;
-
-function test1
- global M;
- global Rs;
-
- sim_in.test_name = "Test 1: range of Eb/No (SNRs) in AWGN channel";
- sim_in.EbNovec = [3:10 99];
- sim_in.delay = M/2;
- sim_in.frames = Rs*3;
- sim_in.foff_hz(1:sim_in.frames) = 50;
- sim_in.startup_delay = 0.5*Rs;
- sim_in.allowable_error = 5;
- sim_in.hf_sim = 0;
- sim_in.hf_delay_ms = 2;
- sim_in.delay = M/2;
- sim_in.plot_type = "waterfall";
-
- sim_out = freq_off_est_test(sim_in);
-
- figure(5)
- clf
- subplot(211)
- plot(sim_in.EbNovec, sim_out.foff_sd)
- hold on;
- plot(sim_in.EbNovec, sim_out.foff_sd,'+')
- hold off;
- xlabel("Eb/No (dB)")
- ylabel("Std Dev (Hz)")
- axis([(min(sim_in.EbNovec)-1) (max(sim_in.EbNovec)+1) -1 10]);
-
- subplot(212)
- plot(sim_out.SNRvec,sim_out.foff_sd)
- hold on;
- plot(sim_out.SNRvec,sim_out.foff_sd,'+')
- hold off;
- xlabel("SNR (dB)")
- ylabel("Std Dev (Hz)")
- axis([(min(sim_out.SNRvec)-1) (max(sim_out.SNRvec)+1) -1 10]);
-end
-
-
-function test2
- sim_in.test_name = "Test 2: range of Eb/No (SNRs) in HF multipath channel"
- sim_in.EbNovec = 0:10;
- sim_in.delay = 2;
- sim_in.hf_sim = 1;
- sim_in.hf_delay_ms = 2;
- sim_in.frames = Rs*2;
- sim_in.foff_hz = 0;
- sim_in.startup_delay = Rs/2;
- sim_in.allowable_error = 5;
-
- sim_out = freq_off_est_test(sim_in);
-
- figure(5)
- clf
- subplot(211)
- plot(sim_in.EbNovec,sim_out.foff_sd)
- hold on;
- plot(sim_in.EbNovec,sim_out.foff_sd,'+')
- hold off;
- xlabel("Eb/No (dB)")
- ylabel("Std Dev")
- axis([(min(sim_in.EbNovec)-1) (max(sim_in.EbNovec)+1) -1 10]);
-end
-
-function test3
- global M;
- global Rs;
-
- sim_in.test_name = "Test 3: 30 Seconds in HF multipath channel at 0dB-ish SNR";
- sim_in.EbNovec = 13;
- sim_in.hf_sim = 0;
- sim_in.hf_delay_ms = 2;
- sim_in.delay = M/2;
- sim_in.frames = Rs;
- sim_in.foff_hz(1:sim_in.frames) = -50;
- sim_in.startup_delay = Rs; % allow 1 second in heavily faded channels
- sim_in.allowable_error = 5;
- sim_in.plot_type = "mesh";
- sim_out = freq_off_est_test(sim_in);
-endfunction
-
-function animated_gif
- figure(4)
- for i=5:5:360
- view(i,45)
- filename=sprintf('fdmdv_fig%05d.png',i);
- print(filename);
- end
- if 0
- for i=90:-5:-270
- view(45,i)
- filename=sprintf('fdmdv_fig%05d.png',i);
- print(filename);
- end
- end
-endfunction
-
-test3;
-
diff --git a/octave/fm.m b/octave/fm.m
deleted file mode 100644
index e25432f..0000000
--- a/octave/fm.m
+++ /dev/null
@@ -1,484 +0,0 @@
-% fm.m
-% David Rowe Dec 2014
-%
-% Analog FM Octave simulation functions.
-
-1;
-
-graphics_toolkit ("gnuplot");
-
-function fm_states = analog_fm_init(fm_states)
-
- % FM modulator constants
-
- Fs = fm_states.Fs; FsOn2 = Fs/2;
- fm_max = fm_states.fm_max; % max modulation freq
- fd = fm_states.fd; % (max) deviation
- fm_states.m = fd/fm_max; % modulation index
- fm_states.Bfm = Bfm = 2*(fd+fm_max); % Carson's rule for FM signal bandwidth
- fm_states.tc = tc = 50E-6;
- fm_states.prede = [1 -(1 - 1/(tc*Fs))]; % pre/de emp filter coeffs
- fm_states.ph_dont_limit = 0; % Limit rx delta-phase
-
- % Select length of filter to be an integer number of symbols to
- % assist with "fine" timing offset estimation. Set Ts to 1 for
- % analog modulation.
-
- Ts = fm_states.Ts;
- desired_ncoeffs = 200;
- ncoeffs = floor(desired_ncoeffs/Ts+1)*Ts;
-
- % "coarse" timing offset is half filter length, we have two filters.
- % This is the delay the two filters introduce, so we need to adjust
- % for this when comparing tx to trx bits for BER calcs.
-
- fm_states.nsym_delay = ncoeffs/Ts;
-
- % input filter gets rid of excess noise before demodulator, as too much
- % noise causes atan2() to jump around, e.g. -pi to pi. However this
- % filter can cause harmonic distortion at very high SNRs, as it knocks out
- % some of the FM signal spectra. This filter isn't really required for high
- % SNRs > 20dB.
-
- fc = (Bfm/2)/(FsOn2);
- fm_states.bin = firls(ncoeffs,[0 fc*(1-0.05) fc*(1+0.05) 1],[1 1 0.01 0.01]);
-
- % demoduator output filter to limit us to fm_max (e.g. 3kHz)
-
- fc = fm_max/(FsOn2);
- fm_states.bout = firls(ncoeffs,[0 0.95*fc 1.05*fc 1], [1 1 0.01 0.01]);
-endfunction
-
-
-function fm_fir_coeff_file(fm_states, filename)
- global gt_alpha5_root;
- global Nfilter;
-
- f=fopen(filename,"wt");
-
- fprintf(f,"/* Generated by fm_fir_coeff_file() Octave function in fm.m */\n\n");
- fprintf(f,"const float bin[]={\n");
- for m=1:length(fm_states.bin)-1
- fprintf(f," %g,\n", fm_states.bin(m));
- endfor
- fprintf(f," %g\n};\n\n", fm_states.bin(length(fm_states.bin)));
-
- fprintf(f,"const float bout[]={\n");
- for m=1:length(fm_states.bout)-1
- fprintf(f," %g,\n", fm_states.bout(m));
- endfor
- fprintf(f," %g\n};\n", fm_states.bout(length(fm_states.bout)));
-
- fclose(f);
-endfunction
-
-
-function tx = analog_fm_mod(fm_states, mod)
- Fs = fm_states.Fs;
- fc = fm_states.fc; wc = 2*pi*fc/Fs;
- fd = fm_states.fd; wd = 2*pi*fd/Fs;
- nsam = length(mod);
-
- if fm_states.pre_emp
- mod = filter(fm_states.prede,1,mod);
- mod = mod/max(mod); % AGC to set deviation
- end
-
- tx_phase = 0;
- tx = zeros(1,nsam);
-
- for i=0:nsam-1
- w = wc + wd*mod(i+1);
- tx_phase = tx_phase + w;
- tx_phase = tx_phase - floor(tx_phase/(2*pi))*2*pi;
- tx(i+1) = exp(j*tx_phase);
- end
-endfunction
-
-
-function [rx_out rx_bb] = analog_fm_demod(fm_states, rx)
- Fs = fm_states.Fs;
- fc = fm_states.fc; wc = 2*pi*fc/Fs;
- fd = fm_states.fd; wd = 2*pi*fd/Fs;
- nsam = length(rx);
- t = 0:(nsam-1);
-
- rx_bb = rx .* exp(-j*wc*t); % down to complex baseband
- rx_bb = filter(fm_states.bin,1,rx_bb);
-
- % differentiate first, in rect domain, then find angle, this puts
- % signal on the positive side of the real axis
-
- rx_bb_diff = [ 1 rx_bb(2:nsam) .* conj(rx_bb(1:nsam-1))];
- rx_out = atan2(imag(rx_bb_diff),real(rx_bb_diff));
-
- % limit maximum phase jumps, to remove static type noise at low SNRs
- if !fm_states.ph_dont_limit
- rx_out(find(rx_out > wd)) = wd;
- rx_out(find(rx_out < -wd)) = -wd;
- end
- rx_out *= (1/wd);
-
- if fm_states.output_filter
- rx_out = filter(fm_states.bout,1,rx_out);
- end
- if fm_states.de_emp
- rx_out = filter(1,fm_states.prede,rx_out);
- end
-endfunction
-
-
-function sim_out = analog_fm_test(sim_in)
- nsam = sim_in.nsam;
- CNdB = sim_in.CNdB;
- verbose = sim_in.verbose;
-
- Fs = fm_states.Fs = 96000;
- fm_max = fm_states.fm_max = 3E3;
- fd = fm_states.fd = 5E3;
- fm_states.fc = 24E3;
-
- fm_states.pre_emp = pre_emp = sim_in.pre_emp;
- fm_states.de_emp = de_emp = sim_in.de_emp;
- fm_states.Ts = 1;
- fm_states.output_filter = 1;
- fm_states = analog_fm_init(fm_states);
- sim_out.Bfm = fm_states.Bfm;
-
- Bfm = fm_states.Bfm;
- m = fm_states.m; tc = fm_states.tc;
- t = 0:(nsam-1);
-
- fm = 1000; wm = 2*pi*fm/fm_states.Fs;
-
- % start simulation
-
- for ne = 1:length(CNdB)
-
- % work out the variance we need to obtain our C/N in the bandwidth
- % of the FM demod. The gaussian generator randn() generates noise
- % with a bandwidth of Fs
-
- aCNdB = CNdB(ne);
- CN = 10^(aCNdB/10);
- variance = Fs/(CN*Bfm);
-
- % FM Modulator -------------------------------
-
- mod = sin(wm*t);
- tx = analog_fm_mod(fm_states, mod);
-
- % Channel ---------------------------------
-
- noise = sqrt(variance/2)*(randn(1,nsam) + j*randn(1,nsam));
- rx = tx + noise;
-
- % FM Demodulator
-
- [rx_out rx_bb] = analog_fm_demod(fm_states, rx);
-
- % notch out test tone
-
- w = 2*pi*fm/Fs; beta = 0.99;
- rx_notch = filter([1 -2*cos(w) 1],[1 -2*beta*cos(w) beta*beta], rx_out);
-
- % measure power with and without test tone to determine S+N and N
-
- settle = 1000; % filter settling time, to avoid transients
- nsettle = nsam - settle;
-
- sinad = (rx_out(settle:nsam) * rx_out(settle:nsam)')/nsettle;
- nad = (rx_notch(settle:nsam) * rx_notch(settle:nsam)')/nsettle;
-
- snr = (sinad-nad)/nad;
- sim_out.snrdB(ne) = 10*log10(snr);
-
- % Theory from FMTutorial.pdf, Lawrence Der, Silicon labs paper
-
- snr_theory_dB = aCNdB + 10*log10(3*m*m*(m+1));
- fx = 1/(2*pi*tc); W = fm_max;
- I = (W/fx)^3/(3*((W/fx) - atan(W/fx)));
- I_dB = 10*log10(I);
-
- sim_out.snr_theorydB(ne) = snr_theory_dB;
- sim_out.snr_theory_pre_dedB(ne) = snr_theory_dB + I_dB;
-
- if verbose > 1
- printf("modn index: %2.1f Bfm: %.0f Hz\n", m, Bfm);
- end
-
- if verbose > 0
- printf("C/N: %4.1f SNR: %4.1f dB THEORY: %4.1f dB or with pre/de: %4.1f dB\n",
- aCNdB, 10*log10(snr), snr_theory_dB, snr_theory_dB+I_dB);
- end
-
- if verbose > 1
- figure(1)
- subplot(211)
- plot(20*log10(abs(fft(rx))))
- title('FM Modulator Output Spectrum');
- axis([1 length(tx) 0 100]);
- subplot(212)
- Rx_bb = 20*log10(abs(fft(rx_bb)));
- plot(Rx_bb)
- axis([1 length(tx) 0 100]);
- title('FM Demodulator (baseband) Input Spectrum');
-
- figure(2)
- subplot(211)
- plot(rx_out(settle:nsam))
- axis([1 4000 -1 1])
- subplot(212)
- Rx = 20*log10(abs(fft(rx_out(settle:nsam))));
- plot(Rx(1:10000))
- axis([1 10000 0 100]);
- end
-
- end
-
-endfunction
-
-
-function run_fm_curves
- sim_in.nsam = 96000;
- sim_in.verbose = 1;
- sim_in.pre_emp = 0;
- sim_in.de_emp = 0;
- sim_in.CNdB = -4:2:20;
-
- sim_out = analog_fm_test(sim_in);
-
- figure(1)
- clf
- plot(sim_in.CNdB, sim_out.snrdB,"r;FM Simulated;");
- hold on;
- plot(sim_in.CNdB, sim_out.snr_theorydB,"g;FM Theory;");
- plot(sim_in.CNdB, sim_in.CNdB,"b; SSB Theory;");
- hold off;
- grid("minor");
- xlabel("FM demod input C/N (dB)");
- ylabel("FM demod output S/N (dB)");
- legend("boxoff");
-
- % C/No curves
-
- Bfm_dB = 10*log10(sim_out.Bfm);
- Bssb_dB = 10*log10(3000);
-
- figure(2)
- clf
- plot(sim_in.CNdB + Bfm_dB, sim_out.snrdB,"r;FM Simulated;");
- hold on;
- plot(sim_in.CNdB + Bfm_dB, sim_out.snr_theorydB,"g;FM Theory;");
- plot(sim_in.CNdB + Bssb_dB, sim_in.CNdB,"b; SSB Theory;");
- hold off;
- grid("minor");
- xlabel("FM demod input C/No (dB)");
- ylabel("FM demod output S/N (dB)");
- legend("boxoff");
-
-endfunction
-
-
-function run_fm_single
- sim_in.nsam = 96000;
- sim_in.verbose = 2;
- sim_in.pre_emp = 0;
- sim_in.de_emp = 0;
-
- sim_in.CNdB = 20;
- sim_out = analog_fm_test(sim_in);
-end
-
-
-function fm_mod_file(file_name_out, file_name_in, CNdB)
- fm_states.Fs = 48000;
- fm_states.fm_max = 3E3;
- fm_states.fd = 5E3;
- fm_states.fc = fm_states.Fs/4;
- fm_states.pre_emp = 0;
- fm_states.de_emp = 0;
- fm_states.Ts = 1;
- fm_states.output_filter = 1;
- fm_states = analog_fm_init(fm_states);
-
- if nargin == 1
- nsam = fm_states.Fs * 10;
- t = 0:(nsam-1);
- fm = 1000; wm = 2*pi*fm/fm_states.Fs;
- mod = sin(wm*t);
- else
- fin = fopen(file_name_in,"rb");
- mod = fread(fin,"short")';
- mod /= 32767;
- fclose(fin);
- end
- tx = analog_fm_mod(fm_states, mod);
-
- if (nargin == 3)
- % Optionally add some noise
-
- CN = 10^(CNdB/10);
- variance = fm_states.Fs/(CN*fm_states.Bfm);
- tx += sqrt(variance)*randn(1,length(tx));
- end
-
- tx_out = tx*16384;
- fout = fopen(file_name_out,"wb");
- fwrite(fout, tx_out, "short");
- fclose(fout);
-endfunction
-
-
-function fm_demod_file(file_name_out, file_name_in)
- fin = fopen(file_name_in,"rb");
- rx = fread(fin,"short")';
- rx = rx(100000:length(rx)); % strip of wave header
- fclose(fin);
-
- Fs = fm_states.Fs = 48000;
- fm_max = fm_states.fm_max = 3E3;
- fd = fm_states.fd = 5E3;
- fm_states.fc = 12E3;
-
- fm_states.pre_emp = 0;
- fm_states.de_emp = 1;
- fm_states.Ts = 1;
- fm_states.output_filter = 1;
- fm_states = analog_fm_init(fm_states);
-
- [rx_out rx_bb] = analog_fm_demod(fm_states, rx);
-
- rx_out *= 20000;
- fout = fopen(file_name_out,"wb");
- fwrite(fout, rx_out, "short");
- fclose(fout);
-
- figure(1)
- subplot(211)
- plot(rx)
- subplot(212)
- plot(20*log10(abs(fft(rx))))
- title('FM Dmodulator Input Spectrum');
-
- figure(2)
- subplot(211)
- Rx_bb = 20*log10(abs(fft(rx_bb)));
- plot(Rx_bb)
- title('FM Demodulator (baseband) Input Spectrum');
-
- subplot(212)
- plot(20*log10(abs(fft(rx_out))))
- title('FM Dmodulator Output Spectrum');
-
- figure(3)
- plot(rx_out)
- title('FM Dmodulator Output');
-
- % estimate SNR, C/No etc
-
- npower_window = 1024;
- rx_power = conv(rx.^2,ones(1,npower_window))/(npower_window);
- rx_power_dB = 10*log10(rx_power);
- figure;
- subplot(211)
- plot(rx);
- subplot(212)
- plot(rx_power_dB);
- axis([1 length(rx_power) max(rx_power_dB)-9 max(rx_power_dB)+1])
- grid("minor")
-
- % estimate FM demod output SNR if a 1000 Hz tone is present
-
- w = 2*pi*1000/Fs; beta = 0.99;
- rx_notch = filter([1 -2*cos(w) 1],[1 -2*beta*cos(w) beta*beta], rx_out);
-
- rx_out_power = conv(rx_out.^2,ones(1,npower_window))/(npower_window);
- rx_out_power_dB = 10*log10(rx_out_power);
- rx_notch_power = conv(rx_notch.^2,ones(1,npower_window))/(npower_window);
- rx_notch_power_dB = 10*log10(rx_notch_power);
- figure;
- plot(rx_out_power_dB,'r;FM demod output power;');
- hold on;
- plot(rx_notch_power_dB,'b;1000 Hz notch filter output power;');
- plot(rx_out_power_dB-rx_notch_power_dB,'g;1000 Hz tone SNR;');
- hold off;
- legend("boxoff");
- ylabel('dB');
- xlabel('Time (samples)');
- grid("minor")
-
-endfunction
-
-
-% generate filter coeffs for C implementation of FM demod
-
-function make_coeff_file
- fm_states.Fs = 44400;
- fm_states.fm_max = 3E3;
- fm_states.fd = 5E3;
- fm_states.fc = fm_states.Fs/4;
-
- fm_states.pre_emp = 0;
- fm_states.de_emp = 0;
- fm_states.Ts = 1;
- fm_states.output_filter = 1;
- fm_states = analog_fm_init(fm_states);
-
- fm_fir_coeff_file(fm_states, "fm_fir_coeff.h")
-endfunction
-
-function test_fm_modulator
- fm_states.Fs = 48000;
- fm_states.fm_max = 3E3;
- fm_states.fd = 5E3;
- %fm_states.fc = fm_states.Fs/4;
- fm_states.fc = 0;
-
- fm_states.pre_emp = 0;
- fm_states.de_emp = 0;
- fm_states.Ts = 1;
- fm_states.output_filter = 1;
- fm_states = analog_fm_init(fm_states);
-
- test_t = [1:(fm_states.Fs*10)];
- test_freq1 = 2*pi*3000/fm_states.Fs;
- test_freq2 = 2*pi*1000/fm_states.Fs;
-
- test_sig = .5*sin(test_t*test_freq1) + .5*sin(test_t*test_freq2);
- %test_sig = zeros(1,length(test_t));
- %test_sig = ones(1,length(test_t));
-
- ftsig = fopen("fm_test_sig.raw","wb");
- fwrite(ftsig,test_sig*16384,"short");
- fclose(ftsig);
-
- system("../fm_test fm_test_sig.raw fm_test_out.raw");
- ftmod = fopen("fm_test_out.raw","r");
- test_mod_p = rot90(fread(ftmod,"short"))/16384;
- test_mod_r = test_mod_p(1:2:length(test_mod_p));
- test_mod_i = test_mod_p(2:2:length(test_mod_p));
- test_mod = test_mod_r .+ i*test_mod_i;
- fclose(ftmod);
-
- comp_mod = analog_fm_mod(fm_states,test_sig);
-
- figure(1)
- comp_mod_real = real(comp_mod);
- size(comp_mod_real)
- size(test_mod)
- mod_diff = zeros(1,length(test_mod));
- mod_diff = test_mod .- comp_mod;
- plot(test_t,real(test_mod .- comp_mod),test_t,imag(test_mod .- comp_mod));
-
-endfunction
-
-more off;
-
-%run_fm_curves
-%fm_demod_file("ssb_fm_out.raw","~/Desktop/ssb_fm.wav")
-%fm_demod_file("ssb25_fm_de.raw", "~/Desktop/ssb25db.wav")
-%run_fm_single
-%make_coeff_file
-%fm_mod_file("fm_1000.raw");
-%test_fm_modulator
diff --git a/octave/fm_radio_filt_model.txt b/octave/fm_radio_filt_model.txt
deleted file mode 100644
index 368f7e2..0000000
--- a/octave/fm_radio_filt_model.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-# Created by Octave 4.0.0, Wed Feb 10 20:14:16 2016 CST <baobrien@baobrien-d-desktop>
-# name: filt
-# type: matrix
-# rows: 1
-# columns: 1001
- 4.111934884608988e-05 4.529266752036107e-05 5.012294778018435e-05 5.387673663540811e-05 5.656595617636202e-05 5.754247327156636e-05 5.745029328387444e-05 5.810382275274602e-05 6.038440324493526e-05 6.151519405194188e-05 5.995001465356246e-05 5.965124091807071e-05 5.894036887788694e-05 5.282714911187688e-05 4.16286613756742e-05 2.733281113424976e-05 1.151301392357209e-05 -5.011952829637155e-06 -2.038060526743049e-05 -2.88950898384027e-05 -3.140205230802841e-05 -2.680377848432233e-05 -1.425766597021347e-05 2.754137907668088e-06 2.533067638032289e-05 5.098405707491412e-05 7.524935743597888e-05 9.490108720790089e-05 0.0001114408649087926 0.0001232907290105822 0.0001298558067129026 0.0001314146843973354 0.000126874153326206 0.0001211256678148737 0.0001128586850331393 0.0001021842594143064 9.340521285980458e-05 8.465588232787989e-05 7.602754602719386e-05 7.476083494605245e-05 7.795597606716329e-05 8.085052742218461e-05 8.855370570715267e-05 9.993747197784049e-05 0.0001100627878797455 0.0001157727179778551 0.0001211159686312227 0.0001276193402990368 0.0001274951568358215 0.0001237937282219144 0.0001199864757482567 0.0001145773485240607 0.0001078643622955885 9.949247921871633e-05 9.282321723585223e-05 8.670764514445847e-05 8.236867203976522e-05 8.178131856442866e-05 8.653490906422325e-05 9.474089964535933e-05 0.0001046664881685255 0.0001171407871684955 0.0001284375906324497 0.0001435371988464706 0.0001538019728144609 0.000157821986861445 0.0001617032194688335 0.000161139381508245 0.0001573044997290387 0.0001505912434581831 0.0001444545226667355 0.0001371895926370354 0.0001282916901414378 0.0001164777490003531 0.0001017868860228118 8.38857960955751e-05 6.397168698635467e-05 4.505424718694719e-05 2.609404178225459e-05 9.390120446350423e-06 -6.139147851498066e-06 -1.74535589572342e-05 -2.432568386408825e-05 -2.719609151945925e-05 -2.559556014458576e-05 -1.629614429158625e-05 -1.3631941893713e-06 1.383091083546116e-05 3.467670361993851e-05 6.180780852724694e-05 8.838658249276322e-05 0.0001119097915371812 0.0001372537482217498 0.0001573246833069575 0.0001685794934648446 0.0001736521706833196 0.0001743894362264053 0.000170440134727034 0.0001570034141396783 0.0001415291461137907 0.0001293030383250257 0.0001170129681552746 0.0001056747747162765 9.587608125739278e-05 8.209630166614193e-05 6.930393501059805e-05 6.085367944553192e-05 5.275816447026444e-05 4.194241650880381e-05 3.420239452264183e-05 3.304591574725996e-05 3.024288241806293e-05 3.012154305643325e-05 3.738917134601837e-05 4.770388200482866e-05 5.781977436721907e-05 7.420695272211161e-05 8.723833080263831e-05 9.505250826889752e-05 0.0001065158066456628 0.0001104312822684124 0.0001098275912662366 0.000107206024810334 0.0001025516069602837 9.894340278646091e-05 9.407503918864603e-05 8.7319365554045e-05 8.141197975598374e-05 8.422482885728253e-05 9.626406072217444e-05 0.0001047837385634293 0.0001197702730190546 0.0001441800101209614 0.000160456934552367 0.0001774138786603596 0.0001926926553236415 0.0001984206468214209 0.0001945597427125206 0.0001836754090288533 0.0001644147124457892 0.0001450923278130216 0.000131637876080013 0.0001194268883117051 0.0001142849115928036 0.0001090067194513346 0.0001167532618894625 0.0001293962113881341 0.0001304604164937581 0.0001310955784948294 0.0001353721674033472 0.0001341681487126995 0.0001198264422032539 0.0001012747411089002 7.153140827090248e-05 4.191084339680094e-05 2.303431628630918e-05 1.138159045954137e-05 1.214910078795732e-05 2.029103100753587e-05 3.914274819454478e-05 7.436668389413293e-05 0.0001131985409445768 0.0001541458098186209 0.0001981874567952984 0.0002293068332902554 0.0002574810386944711 0.0002797524248574673 0.000280098997160137 0.0002691199306180641 0.0002483396512410882 0.0002130987320308693 0.0001696438030090705 0.0001233684249499195 8.43926061428125e-05 5.198681974621152e-05 3.567320177887548e-05 4.949705291163776e-05 7.787515033943651e-05 0.0001300149878038 0.0002020713027294515 0.0002783857988869775 0.0003565185832637648 0.0004241895316775589 0.000479626912439881 0.0005159892932585141 0.0005326203262494115 0.0005366426137323655 0.0005240387399286967 0.0005041051313799223 0.0004864550530904512 0.0004727638664349475 0.0004645950604270155 0.0004548102499574072 0.000455527247961606 0.0004612992161328969 0.0004674556394527062 0.0004716258022734013 0.0004668087315020519 0.0004622641649603435 0.0004465585690774155 0.000425258701401412 0.00039751658715728 0.0003635800988525798 0.0003328960310700836 0.0003048849901663823 0.0002810007495450609 0.0002673721567286335 0.0002702604512501591 0.0002862572870604029 0.0003084406671027542 0.0003355248671444351 0.0003761847353904122 0.0004148377173810094 0.0004485558688712593 0.0004800892227209435 0.0005013700140284393 0.0005138034260364562 0.000523675449512398 0.0005317635475002124 0.0005322207128124348 0.0005292033760978139 0.0005269773541343302 0.0005175977188382754 0.0004993895797658196 0.0004858979454010794 0.0004684001252653537 0.0004587034220581103 0.0004638037190751786 0.0004761823498486873 0.0004885372867673723 0.0005043751480265481 0.0005446800229664075 0.0005890158012063288 0.0006231865628459465 0.0006616542116343469 0.0006972231165628774 0.0007040149509799145 0.000712178888077443 0.0007101214361108593 0.0006931453291674526 0.0006924927262763824 0.0006853703272953059 0.0007004172297637321 0.0007466476213180197 0.00080183074513318 0.0008653125079193471 0.000932413333045206 0.0009780458869915588 0.001000137248327646 0.0009991649016365171 0.0009565650123854935 0.0008785166874477056 0.0007712153995398795 0.0006440612144425213 0.0005014886072902373 0.0003647207877911045 0.0002314452035966864 0.0001215619643926978 5.102070582077005e-05 3.53881850929961e-06 5.024961716295417e-06 4.952203678213442e-05 0.0001260092656341149 0.0002274300947131321 0.0003513571295408856 0.0004918678731923972 0.0006212972022330388 0.0007279470267812717 0.0008134213275591345 0.000856084224659261 0.0008367582390177951 0.0007963231371937705 0.0007308920792511363 0.0006278320617335954 0.0005155411192978977 0.0004049366284488046 0.0003146483534597321 0.000232809201512697 0.0001611481391302676 0.0001276356087955276 0.0001258477694353633 0.000148410784426943 0.0001791264427517458 0.0002152831436118296 0.0002722059220446592 0.0003148588847685937 0.0003235563379009122 0.0003234961169067191 0.0003141523386480817 0.0002970986813756301 0.0002753731712067278 0.0002391073092942144 0.0002217724458095815 0.0002500563490184254 0.0002860821491880679 0.0003319979542964821 0.0004127132318400748 0.0005101781526047186 0.0006116301200159012 0.0007154307983328388 0.0008127224793692451 0.0008838704404048489 0.0009291650300966136 0.0009480193252716987 0.0009397344198433433 0.0009095689814133252 0.0008547924134192681 0.0007841007737282723 0.0007018037456432335 0.0006005948006725787 0.0005078784471340359 0.0004406418213749735 0.0003714124757418396 0.0003264057688551507 0.0003047322000871897 0.0002906911596356952 0.0002861738822980829 0.0002743316277907311 0.0002636405310368626 0.0002526665586205466 0.000226716276058895 0.0001875320324724495 0.0001636750239487869 0.0001372388125105794 0.0001222573562860838 0.0001269254248804013 0.0001139495649892648 0.0001106414381361491 0.0001196292706110303 0.0001189746129582091 0.0001112327955701268 0.0001296685790607515 0.0001643819608291414 0.0001878863422254414 0.0002344588678557017 0.0003203860709214426 0.0004064572654023451 0.0004940737860301076 0.000596014360602431 0.0006749848938371238 0.0007389096824511 0.0007792584703839535 0.0007965798134060041 0.0008056540909816971 0.0007849711152884964 0.000736062831596933 0.0006709962921592219 0.000603317655045247 0.0005383093164802969 0.0004900142937176716 0.0004551531490340078 0.000449534106387221 0.0004708650906301616 0.0004934795110626268 0.0005345974954791178 0.0006078660984573032 0.000702762715896311 0.0007775394691744047 0.0008818221619807017 0.001000679407785467 0.001092707546060794 0.001210613677564552 0.001312089019158298 0.001405270807169912 0.001490114661507714 0.001531394363834887 0.001555410794560944 0.001543704930528568 0.001470479573974331 0.001389350245308104 0.00128125012918577 0.001130987351527693 0.001007863016474597 0.0008564828937716682 0.0007074501288004987 0.0006213523466697201 0.0005713540643662852 0.0005583807693821872 0.0006196820100433617 0.0007361817663542591 0.0008554464717298295 0.0009758354537658702 0.001030406744297961 0.001035680319931336 0.001012121155964727 0.0009548313236383478 0.0008790095856581987 0.0008222269458738788 0.0007806888647762658 0.00070288663268893 0.0006454619358970265 0.0006054134743706602 0.000585536509799107 0.0005761856239940797 0.0005868746914752406 0.0006209602772533917 0.0006504193524742758 0.0006871616100603014 0.0007025287393104163 0.0007171995117985032 0.0007172937860848917 0.0006961439382863224 0.0006718024855287201 0.0006254758975065462 0.0005416137326971845 0.0004555547815183704 0.0003867779579310328 0.0003290178707355808 0.0002953031361596086 0.000255119760230264 0.0002488539502124204 0.0002677640501578254 0.0002652005008809371 0.0002906090024497945 0.0003166398471483209 0.0003089920401697223 0.0003114866028324989 0.0003133184110010134 0.0002840418132516435 0.0002386702280686958 0.0001892280180500572 0.0001115506030916713 1.983929251944428e-07 -0.0001282921891725907 -0.0002827272707108253 -0.0004368740799478221 -0.0005848618113809967 -0.0007194441046966012 -0.0008196524633909468 -0.0009048202133206396 -0.0009695404302984057 -0.00101680303425177 -0.00104331484535875 -0.001044670960196941 -0.001096308220052877 -0.001198928001528127 -0.001307622162194671 -0.001475710104821832 -0.001686034525628763 -0.001932017480014 -0.002224364121912755 -0.002509340882950428 -0.002795659773184621 -0.00309134921771924 -0.003339621248074061 -0.003527096039668997 -0.003713374797631359 -0.003865457109591278 -0.003984544055673171 -0.004135912398823348 -0.004315826807472575 -0.004496951439455919 -0.004688515788482826 -0.004898735004401356 -0.005110796780538788 -0.005339127441411028 -0.00553035210769078 -0.005705695069882694 -0.005870819376498557 -0.006004875496650137 -0.006110777442311181 -0.006164210930893388 -0.00618756905448379 -0.006096936349455484 -0.005939592020122337 -0.005693193052915928 -0.005354094079859258 -0.005027974684133828 -0.004692376525298168 -0.004435709093992968 -0.004274376328604747 -0.004208157300760209 -0.004223103959974963 -0.004327093561393999 -0.004497183833286816 -0.004613763151773346 -0.004718655531703288 -0.00476162995946275 -0.004733215833039038 -0.004717818557505252 -0.004685430263054647 -0.004754957289104762 -0.004977412914427918 -0.005345713165123564 -0.005956911360135976 -0.006682313612074329 -0.007507498625754038 -0.008207774465767762 -0.008390747806307929 -0.007774338884105022 -0.005813672313667084 -0.002020675163340676 0.003934699513891164 0.01218867179800687 0.0227189593674642 0.03474656425430857 0.0474559430852135 0.05969919927081149 0.06940044807963783 0.07690251527634465 0.08229165974889782 0.07690251527634465 0.06940044807963783 0.05969919927081149 0.04745594308521349 0.03474656425430857 0.02271895936746419 0.01218867179800687 0.003934699513891165 -0.002020675163340676 -0.005813672313667083 -0.007774338884105022 -0.008390747806307929 -0.008207774465767762 -0.007507498625754038 -0.006682313612074331 -0.005956911360135976 -0.005345713165123564 -0.004977412914427918 -0.004754957289104762 -0.004685430263054647 -0.004717818557505251 -0.004733215833039039 -0.00476162995946275 -0.004718655531703288 -0.004613763151773345 -0.004497183833286817 -0.004327093561393998 -0.004223103959974966 -0.004208157300760209 -0.004274376328604745 -0.00443570909399297 -0.004692376525298168 -0.005027974684133829 -0.00535409407985926 -0.005693193052915932 -0.005939592020122337 -0.006096936349455483 -0.006187569054483791 -0.006164210930893387 -0.006110777442311182 -0.006004875496650137 -0.005870819376498557 -0.005705695069882694 -0.00553035210769078 -0.005339127441411028 -0.005110796780538787 -0.004898735004401356 -0.004688515788482826 -0.004496951439455919 -0.004315826807472577 -0.004135912398823348 -0.003984544055673172 -0.003865457109591278 -0.00371337479763136 -0.003527096039668997 -0.003339621248074061 -0.00309134921771924 -0.00279565977318462 -0.002509340882950424 -0.002224364121912757 -0.001932017480014 -0.001686034525628767 -0.001475710104821831 -0.001307622162194672 -0.001198928001528127 -0.001096308220052873 -0.001044670960196942 -0.00104331484535875 -0.001016803034251772 -0.0009695404302984054 -0.00090482021332064 -0.0008196524633909476 -0.0007194441046966014 -0.0005848618113809963 -0.000436874079947822 -0.0002827272707108247 -0.0001282921891725906 1.9839292519393e-07 0.0001115506030916713 0.0001892280180500569 0.0002386702280686963 0.0002840418132516444 0.0003133184110010132 0.0003114866028324986 0.0003089920401697223 0.0003166398471483207 0.0002906090024497948 0.0002652005008809363 0.000267764050157825 0.0002488539502124205 0.0002551197602302644 0.000295303136159608 0.0003290178707355802 0.0003867779579310346 0.0004555547815183697 0.0005416137326971845 0.000625475897506546 0.0006718024855287199 0.0006961439382863226 0.0007172937860848909 0.0007171995117985036 0.0007025287393104162 0.0006871616100603015 0.000650419352474276 0.0006209602772533919 0.0005868746914752408 0.0005761856239940797 0.0005855365097991073 0.0006054134743706607 0.0006454619358970264 0.0007028866326889299 0.0007806888647762659 0.000822226945873879 0.0008790095856581987 0.0009548313236383482 0.001012121155964728 0.001035680319931336 0.001030406744297961 0.0009758354537658703 0.0008554464717298296 0.0007361817663542591 0.0006196820100433625 0.0005583807693821864 0.000571354064366285 0.0006213523466697193 0.0007074501288005006 0.0008564828937716656 0.001007863016474597 0.001130987351527696 0.001281250129185769 0.001389350245308103 0.001470479573974332 0.001543704930528569 0.001555410794560944 0.001531394363834887 0.001490114661507714 0.001405270807169912 0.001312089019158298 0.001210613677564552 0.001092707546060794 0.001000679407785467 0.0008818221619807018 0.0007775394691744045 0.0007027627158963109 0.0006078660984573031 0.000534597495479118 0.0004934795110626265 0.0004708650906301616 0.0004495341063872209 0.0004551531490340077 0.0004900142937176715 0.0005383093164802969 0.000603317655045247 0.0006709962921592213 0.0007360628315969327 0.0007849711152884964 0.0008056540909816968 0.0007965798134060039 0.000779258470383954 0.0007389096824511003 0.0006749848938371232 0.0005960143606024314 0.00049407378603011 0.0004064572654023451 0.000320386070921443 0.0002344588678557023 0.0001878863422254417 0.0001643819608291412 0.0001296685790607518 0.0001112327955701267 0.0001189746129582092 0.0001196292706110302 0.0001106414381361493 0.000113949564989265 0.0001269254248804011 0.000122257356286084 0.0001372388125105794 0.0001636750239487874 0.0001875320324724492 0.0002267162760588951 0.0002526665586205469 0.0002636405310368628 0.000274331627790731 0.0002861738822980834 0.0002906911596356955 0.0003047322000871902 0.0003264057688551512 0.0003714124757418389 0.0004406418213749726 0.0005078784471340354 0.000600594800672577 0.0007018037456432339 0.0007841007737282728 0.0008547924134192688 0.0009095689814133239 0.0009397344198433432 0.0009480193252716988 0.0009291650300966141 0.0008838704404048497 0.0008127224793692449 0.0007154307983328389 0.0006116301200159011 0.0005101781526047185 0.0004127132318400751 0.0003319979542964823 0.0002860821491880682 0.0002500563490184256 0.0002217724458095814 0.0002391073092942146 0.0002753731712067281 0.0002970986813756304 0.0003141523386480819 0.0003234961169067191 0.0003235563379009124 0.0003148588847685941 0.0002722059220446591 0.0002152831436118294 0.0001791264427517463 0.0001484107844269434 0.0001258477694353638 0.0001276356087955284 0.0001611481391302664 0.0002328092015126938 0.0003146483534597321 0.0004049366284488059 0.000515541119297898 0.0006278320617335942 0.0007308920792511362 0.0007963231371937704 0.0008367582390177949 0.000856084224659261 0.0008134213275591343 0.0007279470267812722 0.0006212972022330388 0.0004918678731923973 0.0003513571295408855 0.0002274300947131321 0.000126009265634115 4.952203678213429e-05 5.024961716295127e-06 3.538818509299518e-06 5.102070582076996e-05 0.0001215619643926977 0.0002314452035966865 0.0003647207877911044 0.0005014886072902379 0.0006440612144425216 0.0007712153995398789 0.0008785166874477058 0.0009565650123854939 0.0009991649016365179 0.001000137248327646 0.0009780458869915582 0.0009324133330452072 0.0008653125079193493 0.0008018307451331798 0.000746647621318018 0.0007004172297637317 0.0006853703272953076 0.0006924927262763831 0.0006931453291674521 0.0007101214361108594 0.0007121788880774427 0.000704014950979915 0.0006972231165628779 0.000661654211634347 0.0006231865628459464 0.0005890158012063288 0.0005446800229664074 0.0005043751480265481 0.0004885372867673724 0.0004761823498486873 0.0004638037190751788 0.0004587034220581102 0.0004684001252653539 0.0004858979454010797 0.0004993895797658201 0.0005175977188382752 0.0005269773541343305 0.0005292033760978143 0.0005322207128124349 0.0005317635475002128 0.000523675449512398 0.000513803426036456 0.0005013700140284385 0.0004800892227209432 0.0004485558688712597 0.0004148377173810098 0.0003761847353904126 0.0003355248671444355 0.0003084406671027549 0.0002862572870604022 0.000270260451250159 0.0002673721567286339 0.0002810007495450609 0.000304884990166382 0.0003328960310700833 0.00036358009885258 0.0003975165871572802 0.000425258701401412 0.0004465585690774157 0.0004622641649603433 0.0004668087315020517 0.0004716258022734012 0.0004674556394527063 0.0004612992161328973 0.0004555272479616062 0.000454810249957407 0.0004645950604270157 0.0004727638664349478 0.000486455053090451 0.0005041051313799224 0.0005240387399286972 0.0005366426137323651 0.0005326203262494113 0.0005159892932585147 0.0004796269124398812 0.0004241895316775592 0.0003565185832637645 0.0002783857988869775 0.0002020713027294521 0.0001300149878038001 7.787515033943645e-05 4.94970529116387e-05 3.567320177887565e-05 5.198681974621122e-05 8.439260614281255e-05 0.0001233684249499196 0.0001696438030090706 0.0002130987320308694 0.0002483396512410884 0.000269119930618064 0.0002800989971601369 0.0002797524248574673 0.0002574810386944714 0.0002293068332902553 0.0001981874567952985 0.0001541458098186209 0.0001131985409445768 7.436668389413293e-05 3.914274819454482e-05 2.02910310075359e-05 1.214910078795737e-05 1.138159045954142e-05 2.303431628630914e-05 4.191084339680085e-05 7.153140827090229e-05 0.0001012747411089004 0.0001198264422032543 0.0001341681487126989 0.0001353721674033473 0.0001310955784948295 0.0001304604164937583 0.0001293962113881343 0.0001167532618894624 0.0001090067194513343 0.0001142849115928038 0.0001194268883117053 0.0001316378760800131 0.0001450923278130218 0.0001644147124457893 0.0001836754090288532 0.0001945597427125205 0.000198420646821421 0.0001926926553236415 0.0001774138786603597 0.0001604569345523672 0.0001441800101209615 0.0001197702730190544 0.0001047837385634294 9.626406072217448e-05 8.422482885728265e-05 8.141197975598381e-05 8.7319365554045e-05 9.4075039188646e-05 9.894340278646086e-05 0.0001025516069602838 0.0001072060248103339 0.0001098275912662369 0.0001104312822684126 0.000106515806645663 9.505250826889828e-05 8.723833080263867e-05 7.420695272211161e-05 5.781977436721884e-05 4.770388200482809e-05 3.7389171346018e-05 3.012154305643296e-05 3.024288241806269e-05 3.30459157472601e-05 3.42023945226418e-05 4.194241650880383e-05 5.275816447026444e-05 6.085367944553199e-05 6.930393501059805e-05 8.209630166614197e-05 9.587608125739296e-05 0.0001056747747162764 0.0001170129681552745 0.0001293030383250257 0.0001415291461137908 0.0001570034141396783 0.0001704401347270341 0.0001743894362264053 0.0001736521706833197 0.0001685794934648447 0.0001573246833069577 0.00013725374822175 0.0001119097915371812 8.838658249276298e-05 6.180780852724682e-05 3.467670361993845e-05 1.383091083546099e-05 -1.363194189371131e-06 -1.629614429158657e-05 -2.559556014458577e-05 -2.719609151945906e-05 -2.432568386408844e-05 -1.745355895723421e-05 -6.139147851498011e-06 9.390120446350515e-06 2.609404178225465e-05 4.505424718694725e-05 6.397168698635465e-05 8.388579609557507e-05 0.0001017868860228118 0.0001164777490003533 0.0001282916901414377 0.0001371895926370353 0.0001444545226667357 0.0001505912434581831 0.0001573044997290388 0.0001611393815082451 0.0001617032194688336 0.0001578219868614449 0.000153801972814461 0.0001435371988464706 0.0001284375906324499 0.0001171407871684956 0.0001046664881685255 9.474089964535937e-05 8.653490906422336e-05 8.178131856442878e-05 8.236867203976517e-05 8.670764514445867e-05 9.282321723585233e-05 9.949247921871623e-05 0.0001078643622955885 0.0001145773485240607 0.0001199864757482572 0.0001237937282219144 0.0001274951568358209 0.0001276193402990368 0.0001211159686312227 0.0001157727179778552 0.0001100627878797457 9.993747197784049e-05 8.855370570715271e-05 8.085052742218457e-05 7.795597606716331e-05 7.47608349460523e-05 7.602754602719387e-05 8.465588232787989e-05 9.340521285980456e-05 0.0001021842594143064 0.0001128586850331394 0.0001211256678148737 0.0001268741533262061 0.0001314146843973354 0.0001298558067129026 0.0001232907290105823 0.0001114408649087925 9.490108720790098e-05 7.524935743597891e-05 5.098405707491407e-05 2.533067638032283e-05 2.754137907668097e-06 -1.425766597021359e-05 -2.680377848432208e-05 -3.140205230802843e-05 -2.889508983840295e-05 -2.038060526743043e-05 -5.011952829637147e-06 1.151301392357218e-05 2.733281113424968e-05 4.16286613756742e-05 5.28271491118769e-05 5.894036887788697e-05 5.965124091807064e-05 5.995001465356243e-05 6.151519405194192e-05 6.038440324493523e-05 5.810382275274606e-05 5.745029328387439e-05 5.754247327156637e-05 5.656595617636194e-05 5.387673663540817e-05 5.012294778018432e-05 4.529266752036116e-05 4.11193488460899e-05
-
-
diff --git a/octave/fmfsk.m b/octave/fmfsk.m
deleted file mode 100644
index 4b3cc91..0000000
--- a/octave/fmfsk.m
+++ /dev/null
@@ -1,346 +0,0 @@
-%
-% fmfsk.m
-% Author: Brady O'Brien 3 Feb 2016
-% Copyright 2016 David Rowe
-%
-% All rights reserved.
-%
-% This program is free software; you can redistribute it and/or modify
-% it under the terms of the GNU Lesser General Public License veRbion 2, as
-% published by the Free Software Foundation. This program is
-% distributed in the hope that it will be useful, but WITHOUT ANY
-% WARRANTY; without even the implied warranty of MERCHANTABILITY or
-% FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
-% License for more details.
-%
-% You should have received a copy of the GNU Lesser General Public License
-% along with this program; if not, see <http://www.gnu.org/licenses/>.
-
-% mancyfsk.m modem, extracted and made suitable for C implementation
-
-fm;
-pkg load signal;
-pkg load parallel;
-1;
-
-% Init fmfsk modem
-%Fs is sample frequency
-%Rb is pre-manchester bit rate
-function states = fmfsk_init(Fs,Rb)
- assert(mod(Fs,Rb*2)==0);
-
- %Current fixed processing buffer size, in non-ME bits
- nbit = 96;
-
- states.Rb = Rb;
- states.Rs = Rb*2; % Manchester-encoded bitrate
- states.Fs = Fs;
- states.Ts = Fs/states.Rs;
- states.N = nbit*2*states.Ts;
- states.nin = states.N; % Samples in the next demod cycle
- states.nstash = states.Ts*2; % How many samples to stash away between proc cycles for timing adjust
- states.nmem = states.N+(4*states.Ts);
- states.nsym = nbit*2;
- states.nbit = nbit;
-
- %tates.nsym = floor(states.Rs*.080);
- %states.nbit = floor(states.Rb*.080)
- %Old sample memory
-
- states.oldsamps = zeros(1,states.nmem);
-
- %Last sampled-stream output, for odd bitstream generation
- states.lastint = 0;
-
- %Some stats
- states.norm_rx_timing = 0;
-
-endfunction
-
-%Generate a stream of manchester-coded bits to be sent
-% to any ordinary FM modulator or VCO or something
-function tx = fmfsk_mod(states,inbits)
- Ts = states.Ts;
- tx = zeros(1,length(inbits)*2);
- for ii = 1:length(inbits)
- st = 1 + (ii-1)*Ts*2;
- md = st+Ts-1;
- en = md+Ts;
- if inbits(ii)==0
- tx(st:md) = -ones(1,Ts);
- tx(md+1:en) = ones(1,Ts);
- else
- tx(st:md) = ones(1,Ts);
- tx(md+1:en) = -ones(1,Ts);
- end
- end
-endfunction
-
-%Demodulate a bag of bits from the output of an FM demodulator
-% This function produces nbits output bits and takes states.nin samples
-function [rx_bits states] = fmfsk_demod(states,rx)
- Ts = states.Ts;
- Fs = states.Fs;
- Rs = states.Rs;
- nin = states.nin;
- N = states.N;
- nsym = states.nsym;
- nbits = states.nsym/2;
- nmem = states.nmem;
- nstash = states.nstash;
-
- nold = nmem-nin;
- ssamps = states.oldsamps;
-
-
- %Shift in nin samples
- ssamps(1:nold) = ssamps(nmem-nold+1:nmem);
- ssamps(nold+1:nmem) = rx;
- states.oldsamps = ssamps;
-
- rx_filt = zeros(1,(nsym+1)*Ts);
- %Integrate Ts input samples at every offset
- %This is the same thing as filtering with a filter of all ones
- % out to Ts.
- % It's implemented like this for ease of C-porting
- for ii=(1:(nsym+1)*Ts)
- st = ii;
- en = st+Ts-1;
- rx_filt(ii) = sum(ssamps(st:en));
- end
- states.rx_filt = rx_filt;
- % Fine timing estimation ------------------------------------------------------
-
- % Estimate fine timing using line at Rs/2 that Manchester encoding provides
- % We need this to sync up to Manchester codewords.
- Np = length(rx_filt);
- w = 2*pi*(Rs)/Fs;
- x = (rx_filt .^ 2) * exp(-j*w*(0:Np-1))';
- norm_rx_timing = angle(x)/(2*pi)-.42;
-
- rx_timing = round(norm_rx_timing*Ts);
-
- %If rx timing is too far out, ask for more or less sample the next time
- % around to even it all out
- next_nin = N;
- if norm_rx_timing > -.2;
- next_nin += Ts/2;
- end
- if norm_rx_timing < -.65;
- next_nin -= Ts/2;
- end
-
- states.nin = next_nin;
- states.norm_rx_timing = norm_rx_timing;
- %'Even' and 'Odd' manchester bitstream.
- % We'll figure out which to produce later
- rx_even = zeros(1,nbits);
- rx_odd = zeros(1,nbits);
- apeven = 0;
- apodd = 0;
-
- sample_offset = (Ts/2)+Ts+rx_timing-1;
-
- symsamp = zeros(1,nsym);
-
- % Figure out the bits of the 'even' and 'odd' ME streams
- % Also sample rx_filt offset by what fine timing determined along the way
- % Note: ii is a zero-indexed array pointer, for less mind-breaking c portage
- lastv = states.lastint;
- for ii = (0:nsym-1)
- currv = rx_filt(sample_offset+(ii*Ts)+1);
- mdiff = lastv-currv;
- lastv = currv;
- mbit = mdiff>0;
- symsamp(ii+1) = currv;
- if mod(ii,2)==1
- apeven += abs(mdiff);
- rx_even( floor(ii/2)+1 ) = mbit;
- else
- apodd += abs(mdiff);
- rx_odd( floor(ii/2)+1 ) = mbit;
- end
- end
- states.symsamp = symsamp;
- % Decide on the correct ME alignment
- if(apeven>apodd)
- rx_bits = rx_even;
- else
- rx_bits = rx_odd;
- end
-
- states.lastint = lastv;
-endfunction
-
-% run_sim copypasted from fsk_horus.m
-% simulation of tx and rx side, add noise, channel impairments ----------------------
-
-function fmfsk_run_sim(EbNodB,timing_offset=0,de=0,of=0,hpf=0)
- test_frame_mode = 2;
- frames = 70;
- %EbNodB = 3;
- %timing_offset = 0.0; % see resample() for clock offset below
- %fading = 0; % modulates tx power at 2Hz with 20dB fade depth,
- % to simulate balloon rotating at end of mission
- df = 0; % tx tone freq drift in Hz/s
- dA = 1; % amplitude imbalance of tones (note this affects Eb so not a gd idea)
-
- more off
- rand('state',1);
- randn('state',1);
-
- Fs = 48000;
- Rbit = 2400;
-
- % ----------------------------------------------------------------------
-
- fm_states.pre_emp = 0;
- fm_states.de_emp = de;
- fm_states.Ts = Fs/(Rbit*2);
- fm_states.Fs = Fs;
- fm_states.fc = Fs/4;
- fm_states.fm_max = 3E3;
- fm_states.fd = 5E3;
- fm_states.output_filter = of;
- fm_states = analog_fm_init(fm_states);
-
- % ----------------------------------------------------------------------
-
- states = fmfsk_init(Fs,Rbit);
-
- states.verbose = 0x1;
- Rs = states.Rs;
- nsym = states.nsym;
- Fs = states.Fs;
- nbit = states.nbit;
-
- EbNo = 10^(EbNodB/10);
- variance = states.Fs/(states.Rb*EbNo);
-
- % set up tx signal with payload bits based on test mode
-
- if test_frame_mode == 1
- % test frame of bits, which we repeat for convenience when BER testing
- test_frame = round(rand(1, states.nbit));
- tx_bits = [];
- for i=1:frames+1
- tx_bits = [tx_bits test_frame];
- end
- end
- if test_frame_mode == 2
- % random bits, just to make sure sync algs work on random data
- tx_bits = round(rand(1, states.nbit*(frames+1)));
- end
- if test_frame_mode == 3
- % repeating sequence of all symbols
- % great for initial test of demod if nothing else works,
- % look for this pattern in rx_bits
-
- % ...10101...
- tx_bits = zeros(1, states.nbit*(frames+1));
- tx_bits(1:2:length(tx_bits)) = 1;
-
- end
-
- load fm_radio_filt_model.txt
-
- [b, a] = cheby1(4, 1, 300/Fs, 'high'); % 300Hz HPF to simulate FM radios
-
- tx_pmod = fmfsk_mod(states, tx_bits);
- tx = analog_fm_mod(fm_states, tx_pmod);
-
- tx = tx(10:length(tx));
-
- if(timing_offset>0)
- tx = resample(tx, 1000,1001); % simulated 1000ppm sample clock offset
- end
-
-
- noise = sqrt(variance)*randn(length(tx),1);
- rx = tx + noise';
-
- %Demod by analog fm
- rx = analog_fm_demod(fm_states, rx);
-
- %High-pass filter to simulate the FM radios
- if hpf>0
- printf("high-pass filtering!\n")
- rx = filter(b,a,rx);
- end
- rx = filter(filt,1,rx);
-
- figure(4)
- title("Spectrum of rx-ed signal after FM demod and FM radio channel");
- plot(20*log10(abs(fft(rx))))
- figure(5)
- title("Time domain of rx-ed signal after FM demod and FM radio channel");
- plot(rx)
- %rx = real(rx);
- %b1 = fir2(100, [0 4000 5200 48000]/48000, [1 1 0.5 0.5]);
- %rx = filter(b1,1,rx);
- %[b a] = cheby2(6,40,[3000 6000]/(Fs/2));
- %rx = filter(b,a,rx);
- %rx = sign(rx);
- %rx(find (rx > 1)) = 1;
- %rx(find (rx < -1)) = -1;
-
- % dump simulated rx file
-
- timing_offset_samples = round(timing_offset*states.Ts);
- st = 1 + timing_offset_samples;
- rx_bits_buf = zeros(1,2*nbit);
- x_log = [];
- timing_nl_log = [];
- norm_rx_timing_log = [];
- f_int_resample_log = [];
- f_log = [];
- EbNodB_log = [];
- rx_bits_log = [];
- rx_bits_sd_log = [];
-
- for f=1:frames
-
- % extract nin samples from input stream
-
- nin = states.nin;
- en = st + states.nin - 1;
- sf = rx(st:en);
- st += nin;
-
- % demodulate to stream of bits
-
- [rx_bits states] = fmfsk_demod(states, sf);
-
- rx_bits_buf(1:nbit) = rx_bits_buf(nbit+1:2*nbit);
- rx_bits_buf(nbit+1:2*nbit) = rx_bits;
- rx_bits_log = [rx_bits_log rx_bits];
-
- end
-
- ber = 1;
- ox = 1;
- rx_bits = rx_bits_log;
- bitcnt = length(tx_bits);
- for offset = (1:100)
- nerr = sum(xor(rx_bits(offset:length(rx_bits)),tx_bits(1:length(rx_bits)+1-offset)));
- bern = nerr/(bitcnt-offset);
- if(bern < ber)
- ox = offset;
- best_nerr = nerr;
- end
- ber = min([ber bern]);
- end
- offset = ox;
- figure(3);
- plot(xor(rx_bits(ox:length(rx_bits)),tx_bits(1:length(rx_bits)+1-ox)))
-
- printf("BER: %f Errors: %d Bits:%d\n",ber,best_nerr,bitcnt-offset);
-
- endfunction
-
-
-% demodulate a file of 8kHz 16bit short samples --------------------------------
-
-
-
-
diff --git a/octave/fsk4_dmr.m b/octave/fsk4_dmr.m
deleted file mode 100644
index e6ccb7a..0000000
--- a/octave/fsk4_dmr.m
+++ /dev/null
@@ -1,540 +0,0 @@
-% fsk4.m
-%
-% Brady O'Brien October 2015
-%
-% 4FSK modem attempt from the DMR spec
-
-graphics_toolkit("gnuplot");
-
-fm; % analog FM modulator functions
-
-pkg load signal;
-
-% Init function for modem ------------------------------------------------------------
-
-function fsk4_states = fsk4_init(fsk4_states,fsk4_info)
- Fs = fsk4_states.Fs = 48000; %Sample rate
- Rs = fsk4_states.Rs = fsk4_info.rs; %Symbol rate
- M = fsk4_states.M = fsk4_states.Fs/fsk4_states.Rs; %Samples per symbol
-
- % Set up 4FSK raised cosine filter. This probably screws up perf if we were using
- % optimal mod and dmeods but helps performance when using nasty old analog FM mods
- % and demods
-
- empty_filter = [zeros(1,99) 1];
-
- rf = (0:(Fs/2));
- %If there's no filter with this modem configuration, don't bother generating one
- if fsk4_info.no_filter
- fsk4_states.tx_filter = empty_filter;
- fsk4_states.rx_filter = empty_filter;
- else
- fsk4_states.tx_filter = fir2(400 ,rf/(Fs/2),fsk4_info.tx_filt_resp(rf));
- fsk4_states.rx_filter = fir2(400 ,rf/(Fs/2),fsk4_info.rx_filt_resp(rf));
- endif
-
- %fsk4_states.tx_filter = fsk4_states.rx_filter = [zeros(1,99) 1];
- %Set up the 4FSK symbols
- fsk4_states.symmap = fsk4_info.syms / fsk4_info.max_dev;
-
- fm_states.Ts = M;
- fm_states.Fs = Fs;
- fm_states.fc = 0;
- fm_states.fm_max = fsk4_info.max_dev*2;
- fm_states.fd = fsk4_info.max_dev;
- fm_states.pre_emp = fm_states.de_emp = 0;
- fm_states.output_filter = 0;
- fm_states.ph_dont_limit = 1;
- fsk4_states.fm_states = analog_fm_init(fm_states);
- fsk4_states.modinfo = fsk4_info;
- fsk4_states.verbose = 0;
-endfunction
-
-%Integrate over data and dump every M samples
-function d = idmp(data, M)
- d = zeros(1,length(data)/M);
- for i = 1:length(d)
- d(i) = sum(data(1+(i-1)*M:i*M));
- end
-endfunction
-
-
-% DMR modulator ----------------------------------------------------------
-
-function [tx, tx_filt, tx_stream] = fsk4_mod(fsk4_states, tx_bits)
- verbose = fsk4_states.verbose
-
- hbits = tx_bits(1:2:length(tx_bits));
- lbits = tx_bits(2:2:length(tx_bits));
- %Pad odd bit lengths
- if(length(hbits)!=length(lbits))
- lbits = [lbits 0];
- end
- tx_symbols = lbits + hbits*2 + 1;
- M = fsk4_states.M;
- nsym = length(tx_symbols);
- nsam = nsym*M;
-
- tx_stream = zeros(1,nsam);
- for i=1:nsym
- tx_stream(1+(i-1)*M:i*M) = fsk4_states.symmap(tx_symbols(i));
- end
- tx_filt = filter(fsk4_states.tx_filter, 1, tx_stream);
- tx = analog_fm_mod(fsk4_states.fm_states, tx_filt);
-
- if verbose
- figure(10);
- plot(20*log10(abs(fft(tx))))
- title("Spectrum of modulated 4FSK")
- endif
-
-endfunction
-
-
-% Integrate and Dump 4FSK demod ----------------------------------------------------
-
-function bits = fsk4_demod_thing(fsk4_states, rx)
-
- M = fsk4_states.M;
- Fs = fsk4_states.Fs;
- verbose = fsk4_states.verbose;
- t = (0:length(rx)-1);
- symup = fsk4_states.modinfo.syms;
-
- % Integrator is like an FIR filter with rectangular window coeffs.
- % This has some nasty side lobes so lets limit the overall amount
- % of noise getting in. tx filter just happens to work, but I imagine
- % other LPF would as well.
-
- Fs = fsk4_states.Fs;
- rf = (0:(Fs/2));
- rx_filter_a = fir1(100 ,.2);
- rx_filter_b = fsk4_states.rx_filter;
- rx_filter_n = [zeros(1,99) 1];
-
- rx = filter(rx_filter_b, 1, rx);
-
- sym1m = exp(-j*2*pi*(symup(1)/Fs)*t).*rx;
- sym2m = exp(-j*2*pi*(symup(2)/Fs)*t).*rx;
- sym3m = exp(-j*2*pi*(symup(3)/Fs)*t).*rx;
- sym4m = exp(-j*2*pi*(symup(4)/Fs)*t).*rx;
-
- % this puppy found by experiment between 1 and M. Will vary with different
- % filter impulse responses, as delay will vary. f you add M to it coarse
- % timing will adjust by 1.
-
- fine_timing = 54;
-
- sym1m = idmp(sym1m(fine_timing:length(sym1m)),M); sym1m = (real(sym1m).^2+imag(sym1m).^2);
- sym2m = idmp(sym2m(fine_timing:length(sym2m)),M); sym2m = (real(sym2m).^2+imag(sym2m).^2);
- sym3m = idmp(sym3m(fine_timing:length(sym3m)),M); sym3m = (real(sym3m).^2+imag(sym3m).^2);
- sym4m = idmp(sym4m(fine_timing:length(sym4m)),M); sym4m = (real(sym4m).^2+imag(sym4m).^2);
-
-
- figure(2);
- nsym = 500;
- %subplot(411); plot(sym1m(1:nsym))
- %subplot(412); plot(sym2m(1:nsym))
- %subplot(413); plot(sym3m(1:nsym))
- %subplot(414); plot(sym4m(1:nsym))
- plot((1:nsym),sym1m(1:nsym),(1:nsym),sym2m(1:nsym),(1:nsym),sym3m(1:nsym),(1:nsym),sym4m(1:nsym))
-
- [x iv] = max([sym1m; sym2m; sym3m; sym4m;]);
- bits = zeros(1,length(iv*2));
- figure(3);
- hist(iv);
- for i=1:length(iv)
- bits(1+(i-1)*2:i*2) = [[0 0];[0 1];[1 0];[1 1]](iv(i),(1:2));
- end
-endfunction
-
-function dat = bitreps(in,M)
- dat = zeros(1,length(in)*M);
- for i=1:length(in)
- dat(1+(i-1)*M:i*M) = in(i);
- end
-endfunction
-
-% Minimal Running Disparity, 4 symbol encoder
-% This is a simple 1 bit to 1 symbol encoding for 4fsk modems built
-% on old fashoned FM radios.
-function syms = mrd4(bits)
- syms = zeros(1,length(bits));
- rd=0;
- lastsym=0;
- for n = (1:length(bits))
- bit = bits(n);
- sp = [1 3](bit+1); %Map a bit to a +1 or +3
- [x,v] = min(abs([rd+sp rd-sp])); %Select +n or -n, whichever minimizes disparity
- ssel = [sp -sp](v);
- if(ssel == lastsym)ssel = -ssel;endif %never run 2 of the same syms in a row
- syms(n) = ssel; %emit the symbol
- rd = rd + ssel; %update running disparity
- lastsym = ssel; %remember this symbol for next time
- end
-endfunction
-
-% Minimal Running Disparity, 8 symbol encoder
-% This is a simple 2 bit to 1 symbol encoding for 8fsk modems built
-% on old fashoned FM radios.
-function syms = mrd8(bits)
- bitlen = length(bits);
- if mod(bitlen,2) == 1
- bits = [bits 0]
- endif
-
- syms = zeros(1,length(bits)*.5);
- rd=0;
- lastsym=0;
- for n = (1:2:length(bits))
- bit = (bits(n)*2)+bits(n+1);
- sp = [1 3 7 5](bit+1); %Map a bit to a +1 or +3
- [x,v] = min(abs([rd+sp rd-sp])); %Select +n or -n, whichever minimizes disparity
- ssel = [sp -sp](v);
- if(ssel == lastsym)ssel = -ssel;endif %never run 2 of the same syms in a row
- syms((n+1)/2) = ssel; %emit the symbol
- rd = rd + ssel; %update running disparity
- lastsym = ssel; %remember this symbol for next time
- end
-endfunction
-
-% "Manchester 4" encoding
-function syms = mane4(bits)
- syms = zeros(1,floor(bits/2)*2);
- for n = (1:2:length(bits))
- bit0 = bits(n);
- bit1 = bits(n+1);
- sel = 2*bit0+bit1+1;
- syms(n:n+1) = [[3 -3];[-3 3];[1 -1];[-1 1]]( sel,(1:2) );
- end
-endfunction
-
-function out = fold_sum(in,l)
- sublen = floor(length(in)/l);
- out = zeros(1,l);
- for i=(1:sublen)
- v = in(1+(i-1)*l:i*l);
- out = out + v;
- end
-endfunction
-
-function [bits err rxphi] = fsk4_demod_fmrid(fsk4_states, rx, enable_fine_timing = 0)
- %Demodulate fsk signal with an analog fm demod
- rxd = analog_fm_demod(fsk4_states.fm_states,rx);
-
- M = fsk4_states.M;
- verbose = fsk4_states.verbose;
- %This is the ideal fine timing, assuming the same offset in nfbert
- fine_timing = 61;
-
- %This is meant to be adjusted by the fine timing estimator. comment out for
- %ideal timing
- %fine_timing = 59;
-
- %RRC filter to get rid of some of the noise
- rxd = filter(fsk4_states.rx_filter, 1, rxd);
-
- %Try and figure out where sampling should happen over 30 symbol periods
- diffsel = fold_sum(abs(diff( rxd(3001:3001+(M*30)) )),10);
-
- if verbose
- figure(11);
- plot(diffsel);
- title("Fine timing estimation");
- endif
-
- %adjust fine timing
- [v iv] = min(diffsel);
- if enable_fine_timing
- fine_timing = 59 + iv;
- endif
- rxphi = iv;
-
- %sample symbols
- sym = rxd(fine_timing:M:length(rxd));
-
- if verbose
- figure(4)
- plot(sym(1:1000));
- title("Sampled symbols")
- endif
- %eyediagram(afsym,2);
- % Demod symbol map. I should probably figure a better way to do this.
- % After sampling, the furthest symbols tend to be distributed about .80
-
- % A little cheating to demap the symbols
- % Take a histogram of the sampled symbols, find the center of the largest distribution,
- % and correct the symbol map to match it
- [a b] = hist(abs(sym),50);
- [a ii] = max(a);
- %grmax = abs(b(ii));
- %grmax = (grmax<.65)*.65 + (grmax>=.65)*grmax;
- grmax = .84;
- dmsyms = rot90(fsk4_states.symmap*grmax)
- (dmsyms(2)+dmsyms(1))/2
-
- if verbose
- figure(2)
- hist(abs(sym),200);
- title("Sampled symbol histogram")
- endif
-
- %demap the symbols
- [err, symout] = min(abs(sym-dmsyms));
-
- if verbose
- figure(3)
- hist(symout);
- title("De-mapped symbols")
- endif
-
- bits = zeros(1,length(symout)*2);
- %Translate symbols back into bits
-
- for i=1:length(symout)
- bits(1+(i-1)*2:i*2) = [[1 1];[1 0];[0 1];[0 0]](symout(i),(1:2));
- end
-endfunction
-
-% Frequency response of the DMR raised cosine filter
-% from ETSI TS 102 361-1 V2.2.1 page 111
-dmr.tx_filt_resp = @(f) sqrt(1.0*(f<=1920) - cos((pi*f)/1920).*1.0.*(f>1920 & f<=2880));
-dmr.rx_filt_resp = dmr.tx_filt_resp;
-dmr.max_dev = 1944;
-dmr.syms = [-1944 -648 1944 648];
-dmr.rs = 4800;
-dmr.no_filter = 0;
-dmr.demod_fx = @fsk4_demod_fmrid;
-global dmr_info = dmr;
-
-
-% No-filter 4FSK 'ideal' parameters
-nfl.tx_filt_resp = @(f) 1;
-nfl.rx_filt_resp = nfl.tx_filt_resp;
-nfl.max_dev = 7200;
-%nfl.syms = [-3600 -1200 1200 3600];
-nfl.syms = [-7200,-2400,2400,7200];
-nfl.rs = 4800;
-nfl.no_filter = 1;
-nfl.demod_fx = @fsk4_demod_thing;
-global nflt_info = nfl;
-
-%Some parameters for the NXDN filters
-nxdn_al = .2;
-nxdn_T = 416.7e-6;
-nxdn_fl = ((1-nxdn_al)/(2*nxdn_T));
-nxdn_fh = ((1+nxdn_al)/(2*nxdn_T));
-
-%Frequency response of the NXDN filters
-% from NXDN TS 1-A V1.3 page 13
-% Please note : NXDN not fully implemented or tested
-nxdn_H = @(f) 1.0*(f<nxdn_fl) + cos( (nxdn_T/(4*nxdn_al))*(2*pi*f-(pi*(1-nxdn_al)/nxdn_T)) ).*(f<=nxdn_fh & f>nxdn_fl);
-nxdn_P = @(f) (f<=nxdn_fh & f>0).*((sin(pi*f*nxdn_T))./(.00001+(pi*f*nxdn_T))) + 1.0*(f==0);
-nxdn_D = @(f) (f<=nxdn_fh & f>0).*((pi*f*nxdn_T)./(.00001+sin(pi*f*nxdn_T))) + 1.0*(f==0);
-
-nxdn.tx_filt_resp = @(f) nxdn_H(f).*nxdn_P(f);
-nxdn.rx_filt_resp = @(f) nxdn_H(f).*nxdn_D(f);
-nxdn.rs = 4800;
-nxdn.max_dev = 1050;
-nxdn.no_filter = 0;
-nxdn.syms = [-1050,-350,350,1050];
-nxdn.demod_fx = @fsk4_demod_fmrid;
-global nxdn_info = nxdn;
-
-% Bit error rate test ----------------------------------------------------------
-% Params - aEsNodB - EbNo in decibels
-% - timing_offset - how far the fine timing is offset
-% - bitcnt - how many bits to check
-% - demod_fx - demodulator function
-% Returns - ber - the measured BER
-% - thrcoh - theory BER of a coherent demod
-% - thrncoh - theory BER of non-coherent demod
-function [ber thrcoh thrncoh] = nfbert(aEsNodB,modem_config, bitcnt=100000, timing_offset = 10)
-
- rand('state',1);
- randn('state',1);
-
- %How many bits should this test run?
- bitcnt = 120000;
-
- test_bits = [zeros(1,100) rand(1,bitcnt)>.5]; %Random bits. Pad with zeros to prime the filters
- fsk4_states.M = 1;
- fsk4_states = fsk4_init(fsk4_states,modem_config);
-
- %Set this to 0 to cut down on the plotting
- fsk4_states.verbose = 1;
- Fs = fsk4_states.Fs;
- Rb = fsk4_states.Rs * 2; % Multiply symbol rate by 2, since we have 2 bits per symbol
-
- tx = fsk4_mod(fsk4_states,test_bits);
-
- %add noise here
- %shamelessly copied from gmsk.m
- EsNo = 10^(aEsNodB/10);
- EbNo = EsNo
- variance = Fs/(Rb*EbNo);
- nsam = length(tx);
- noise = sqrt(variance/2)*(randn(1,nsam) + j*randn(1,nsam));
- rx = tx*exp(j*pi/2) + noise;
-
- rx = rx(timing_offset:length(rx));
-
- rx_bits = modem_config.demod_fx(fsk4_states,rx);
- ber = 1;
-
- %thing to account for offset from input data to output data
- %No preamble detection yet
- ox = 1;
- for offset = (1:100)
- nerr = sum(xor(rx_bits(offset:length(rx_bits)),test_bits(1:length(rx_bits)+1-offset)));
- bern = nerr/(bitcnt-offset);
- if(bern < ber)
- ox = offset;
- best_nerr = nerr;
- end
- ber = min([ber bern]);
- end
- offset = ox;
- printf("\ncoarse timing: %d nerr: %d\n", offset, best_nerr);
-
- % Coherent BER theory
- thrcoh = erfc(sqrt(EbNo));
-
- % non-coherent BER theory calculation
- % It was complicated, so I broke it up
-
- ms = 4;
- ns = (1:ms-1);
- as = (-1).^(ns+1);
- bs = (as./(ns+1));
-
- cs = ((ms-1)./ns);
-
- ds = ns.*log2(ms);
- es = ns+1;
- fs = exp( -(ds./es)*EbNo );
-
- thrncoh = ((ms/2)/(ms-1)) * sum(bs.*((ms-1)./ns).*exp( -(ds./es)*EbNo ));
-
-endfunction
-
-% RX fine timing estimation playground
-function rxphi = fine_ex(timing_offset = 1)
- global dmr_info;
- global nxdn_info;
- global nflt_info;
-
- rand('state',1);
- randn('state',1);
-
- bitcnt = 12051;
- test_bits = [zeros(1,100) rand(1,bitcnt)>.5]; %Random bits. Pad with zeros to prime the filters
- t_vec = [0 0 1 1];
- %test_bits = repmat(t_vec,1,ceil(24000/length(t_vec)));
-
-
- fsk4_states.M = 1;
- fsk4_states = fsk4_init(fsk4_states,dmr_info);
- Fs = fsk4_states.Fs;
- Rb = fsk4_states.Rs * 2; %Multiply symbol rate by 2, since we have 2 bits per symbol
-
- tx = fsk4_mod(fsk4_states,test_bits);
-
- %add noise here
- %shamelessly copied from gmsk.m
- %EsNo = 10^(aEsNodB/10);
- %EbNo = EsNo
- %variance = Fs/(Rb*EbNo);
- %nsam = length(tx);
- %noise = sqrt(variance/2)*(randn(1,nsam) + j*randn(1,nsam));
- %rx = tx*exp(j*pi/2) + noise;
- rx = tx;
- rx = rx(timing_offset:length(rx));
-
- [rx_bits biterr rxphi] = fsk4_demod_fmrid(fsk4_states,rx);
- ber = 1;
-
- %thing to account for offset from input data to output data
- %No preamble detection yet
- ox = 1;
- for offset = (1:100)
- nerr = sum(xor(rx_bits(offset:length(rx_bits)),test_bits(1:length(rx_bits)+1-offset)));
- bern = nerr/(bitcnt-offset);
- if(bern < ber)
- ox = offset;
- best_nerr = nerr;
- end
- ber = min([ber bern]);
- end
- offset = ox;
- printf("\ncoarse timing: %d nerr: %d\n", offset, best_nerr);
-
-endfunction
-
-%Run over a wide range of offsets and make sure fine timing makes sense
-function fsk4_rx_phi(socket)
- %pkg load parallel
- offrange = [100:200];
- [a b c phi] = pararrayfun(1.25*nproc(),@nfbert,10*length(offrange),offrange);
-
- close all;
- figure(1);
- clf;
- plot(offrange,phi);
-endfunction
-
-
-% Run this function to compare the theoretical 4FSK modem performance
-% with our DMR modem simulation
-
-function fsk4_ber_curves
- global dmr_info;
- global nxdn_info;
- global nflt_info;
-
- EbNodB = 1:20;
- bers_tco = bers_real = bers_tnco = bers_idealsim = ones(1,length(EbNodB));
-
- %vectors of the same param to pass into pararrayfun
- dmr_infos = repmat(dmr_info,1,length(EbNodB));
- nflt_infos = repmat(nflt_info,1,length(EbNodB));
- thing = @fsk4_demod_thing;
-
- % Lovely innovation by Brady to use all cores and really speed up the simulation
-
- %try
- pkg load parallel
- bers_idealsim = pararrayfun(floor(1.25*nproc()),@nfbert,EbNodB,nflt_infos);
- [bers_real,bers_tco,bers_tnco] = pararrayfun(floor(1.25*nproc()),@nfbert,EbNodB,dmr_infos);
- %catch
- % printf("You should install package parallel. It'll make this run way faster\n");
- % for ii=(1:length(EbNodB));
- %[bers_real(ii),bers,tco(ii),bers_tnco(ii)] = nfbert(EbNodB(ii));
- % end
- %end_try_catch
-
- close all
- figure(1);
- clf;
- semilogy(EbNodB, bers_tnco,'r;4FSK non-coherent theory;')
- hold on;
-
- semilogy(EbNodB, bers_tco,'b;4FSK coherent theory;')
- semilogy(EbNodB, bers_real ,'g;4FSK DMR simulation;')
- semilogy(EbNodB, bers_idealsim, 'v;FSK4 Ideal Non-coherent simulation;')
- hold off;
- grid("minor");
- axis([min(EbNodB) max(EbNodB) 1E-5 1])
- legend("boxoff");
- xlabel("Eb/No (dB)");
- ylabel("Bit Error Rate (BER)")
-
-endfunction
-
-
-
-
-
-
-
-
diff --git a/octave/fsk_basic.m b/octave/fsk_basic.m
deleted file mode 100644
index 753f4ae..0000000
--- a/octave/fsk_basic.m
+++ /dev/null
@@ -1,60 +0,0 @@
-% fsk_basic.m
-% David Rowe 30 sep 2016
-%
-% Basic non-coherent FSK modem simulation to illustrate principles
-% and compare to ideal
-
-rand('seed',1);
-randn('seed',1);
-
-Fs = 9600; % sample rate
-f1 = 1200;
-f2 = 2400;
-Rs = 1200; % symbol rate
-Ts = Fs/Rs; % length of each symbol in samples
-Nbits = 10000;
-EbNodB = 9;
-
-tx_bits = round(rand(1,Nbits));
-
-% continuous phase FSK modulator
-
-w1 = 2*pi*f1/Fs;
-w2 = 2*pi*f2/Fs;
-tx_phase = 0;
-tx = zeros(1,Ts*Nbits);
-
-for i=1:Nbits
- for k=1:Ts
- if tx_bits(i)
- tx_phase += w2;
- else
- tx_phase += w1;
- end
- tx((i-1)*Ts+k) = exp(j*tx_phase);
- end
-end
-
-% AWGN channel noise
-
-EbNo = 10^(EbNodB/10);
-variance = Fs/(Rs*EbNo);
-noise = sqrt(variance/2)*(randn(1,Nbits*Ts) + j*randn(1,Nbits*Ts));
-rx = tx + noise;
-
-% integrate and dump demodulator
-
-rx_bits = zeros(1,Nbits);
-for i=1:Nbits
- arx_symb = rx((i-1)*Ts + (1:Ts));
- filt1 = sum(exp(-j*w1*(1:Ts)) .* arx_symb);
- filt2 = sum(exp(-j*w2*(1:Ts)) .* arx_symb);
- rx_bits(i) = filt2 > filt1;
-end
-
-Nerrors = sum(xor(tx_bits, rx_bits));
-ber = Nerrors/Nbits;
-printf("EbNodB: %4.1f Nerrors: %d BER: %1.3f\n", EbNodB, Nerrors, ber);
-
-
-
diff --git a/octave/fsk_cml.m b/octave/fsk_cml.m
deleted file mode 100644
index 25ca790..0000000
--- a/octave/fsk_cml.m
+++ /dev/null
@@ -1,132 +0,0 @@
-% Test MFSK at symbol level in CML using RA LDPC codes, Bill, June 2020
-% Simulate in AWGM and plot BERs. Assumes that CML is installed!
-%
-% If required setup numb of codewords (Ncw) and channel bits/sym (bps, 1 to 4)
-% may also select FEC code with Ctype (1 to 3); use plt to for debug plots of LLR values
-
-% July 1 version allows M=8 and pads required vectors if required to makeup 3rd bit
-
-ldpc;
-
-%rand('seed',1);
-%randn('seed',1);
-format short g
-more off
-init_cml();
-
-if exist('Ncw')==0, Ncw=100, end %setup defaults
-if exist('plt')==0, plt=0; end
-if exist('bps')==0, bps=4; end
-if exist('Ctype')==0, Ctype=1, end
-
-if Ctype==1
- load H_256_768_22.txt; HRA = H_256_768_22; % rate 1/3
-elseif Ctype==2
- load H_256_512_4.mat; HRA=H; % K=256, rate 1/2 code
- % above code might be improved -- but still works better than rate 1/3
-elseif Ctype==3
- load HRAa_1536_512.mat; % rate 3/4, N=2k code
-else
- error('bad Ctype');
-end
-
-M=2^bps; nos =0; clear res
-modulation = 'FSK'; mod_order=M; mapping = 'gray';
-code_param = ldpc_init_user(HRA, modulation, mod_order, mapping);
-
-[Nr Nc] = size(HRA);
-Nbits = Nc - Nr;
-Krate = (Nc-Nr)/Nc
-framesize = Nc;
-%{
-[H_rows, H_cols] = Mat2Hrows(HRA);
-code_param.H_rows = H_rows;
-code_param.H_cols = H_cols;
-code_param.P_matrix = [];
-%}
-
-
-S =CreateConstellation('FSK', M);
-if M==2, Ebvec=[7:0.2: 8.7], end
-if M==4, Ebvec=[4:0.25: 7], end
-if M==8, Ebvec =[3.5: 0.25: 5.5]; end
-if M==16, Ebvec=[2.5:0.25:4.8]; end
-
-disp(['Symbol-based ' num2str(M) 'FSK sim with K=' ...
- num2str(Nbits) ', code rate=' num2str(Krate) ', #CWs=' num2str(Ncw)])
-
-
-
-% if M=8, for 3 bits/symbol, may need to pad codeword with bits ...
-if floor(Nc/bps)*bps ~= Nc
- Npad = ceil(Nc/bps) *bps-Nc
- disp('padding codeword')
-else
- Npad=0;
-end
-
-for Eb = Ebvec
-
- Ec = Eb + 10*log10(Krate);
- Es = Ec + 10*log10(bps);
- Eslin = 10^(Es/10); %Es/N0 = 1/2k_n^2
-
- Terrs =0;
- for nn = 1:Ncw
-
- txbits = randi(2,1,Nbits) -1;
-
- codeword = LdpcEncode( txbits, code_param.H_rows, code_param.P_matrix );
- code_param.code_bits_per_frame = length( codeword );
- code_param.data_bits_per_frame = length(txbits);
- Nsymb = (code_param.code_bits_per_frame+Npad)/bps;
-
- if Npad; codeword = [codeword zeros(1,Npad)]; end
- Tx = Modulate(codeword, S);
-
- kn = sqrt(1/(2*Eslin));
- Rx = Tx + kn * (randn(size(Tx)) + j*randn(size(Tx)));
-
- SNRlin = Eslin; % Valenti calls this SNR, but seems to be Es/N0
- symL = DemodFSK(Rx, SNRlin, 2); %demod type is nonCOH, without estimate amplitudes
- bitL = Somap(symL);
-
- if Npad, bitL(end-Npad+1:end)=[]; end
- if plt>0, figure(110); hist(bitL); title('bit LLRs')
- figure(111); hist(bitL); title('Sym Ls'), pause,
- end
- max_it =100; decoder_type =0;
-
- [x_hat, PCcnt] = MpDecode( -bitL, code_param.H_rows, code_param.H_cols, ...
- max_it, decoder_type, 1, 1);
- Niters = sum(PCcnt~=0);
- detected_data = x_hat(Niters,:);
- error_positions = xor( detected_data(1:code_param.data_bits_per_frame), txbits );
-
- Nerrs = sum( error_positions);
- if plt>1, figure(121); plot(error_positions); Nerrs, end
- Terrs = Terrs + Nerrs;
- end
-
- BER = Terrs/ (Ncw*Nbits);
-
- %HDs = (sign(bitL)+1)/2;
- %NerrsHD = sum(codeword~=HDs);
- %BER_HD = Nerrs/Nbits;
-
- nos = nos+1;
- disp('Eb Nerrs BER')
- res(nos, :) = [Eb, Terrs, BER]
-
-end
-figure(91)
-semilogy(res(:,1), res(:,3), '-x'); grid on; hold on;
-%semilogy(res(:,1), berawgn(res(:,1), 'fsk', M, 'noncoherent'), 'g');
-title([num2str(M) 'FSK BER with LDPC FEC'])
-xlabel('Eb/N0'); ylabel('BER')
-
-
-
-
-
-
diff --git a/octave/fsk_cml_sam.m b/octave/fsk_cml_sam.m
deleted file mode 100644
index f7d02f9..0000000
--- a/octave/fsk_cml_sam.m
+++ /dev/null
@@ -1,376 +0,0 @@
-%fsk_llr_sam Test MFSK using David's sample-based mod/demod with CML LLR routines
-% using 2k rate 3/4 RA LDPC code. Bill, July 2020
-%
-%LLR conversion options: (Ltype)
-% 1 David's original M=2 SD to LLR routine
-% 2 Bill's pdf-based M=2 or 4 SD to LLR
-% 3 Some simple HD conversions
-% 4 CML approach using symbol likelihoods, then converted to bit LLRs
-%
-% Results from this sim are stored in "res" -- use fsk_llr_plot to see BER figs
-% Use "plt" to see some useful plots (for selected Ltypes) :
-% eg 1 is SD pdf histograms; 2 is Rx PSD; 3 is bit LLR histograms
-%
-% Adjust Evec and Nbits as required before running.
-
-#{
- Example 1 2FSK:
- octave:4> fsk_cml_sam
- octave:5> fsk_llr_plot
-
- Example 2 4FSK:
- octave:4> M=4; fsk_cml_sam
- octave:4> fsk_llr_plot
-#}
-
-ldpc;
-
-% define Rician pdf
-% note that Valenti uses an approximation that avoids Bessel evaluation
-function y = rice(x,v,s)
- s2 = s*s;
- y = (x / s2) .* exp(-0.5 * (x.^2 + v.^2)/s2) .* besseli(0, x*v/s2);
-endfunction
-
-function plot_pdf(v,s)
- x=(0:0.1:2*v);
- y= rice(x, v, s);
- figure(201); hold on
- plot(x,y,'g');
- %title('Rician pdf: signal carrier')
- y= rice(x, 0, s);
- plot(x,y,'b');
- title('Rician pdf: signal and noise-only carriers')
- pause(0.01);
-endfunction
-
-% single Eb/No point simulation ---------------
-function [raw_ber rx_filt rx_bits tx_symbols demapper sig_est SNRest v_est] = ...
- run_single(tx_bits, M, EcNodB, plt)
- % Ec/N0 is per channel bit
- bps = log2(M); % bits per symbol
- Ts = 16; % length of each symbol in samples
-
- if length(tx_bits)==1
- Nbits = tx_bits;
- tx_bits = randi(2,1,Nbits)-1; % make random bits
- end
-
- Nbits = length(tx_bits);
- Nsymbols = Nbits/log2(M);
- tx_symbols = zeros(1,Nsymbols);
-
- mapper = bps:-1:1;
- % look up table demapper from symbols to bits (hard decision)
- demapper=zeros(M,bps);
- for m=1:M
- for b=1:bps
- if bitand(m-1,b) demapper(m,bps-b+1) = 1; end
- end
- end
-
- % continuous phase mFSK modulator
-
- w(1:M) = 2*pi*(1:M)/Ts;
- tx_phase = 0;
- tx = zeros(1,Ts*Nsymbols);
-
- for s=1:Nsymbols
- bits_for_this_symbol = tx_bits(bps*(s-1)+1:bps*s);
- symbol_index = bits_for_this_symbol * mapper' + 1;
- tx_symbols(s) = symbol_index;
- assert(demapper(symbol_index,:) == bits_for_this_symbol);
- for k=1:Ts
- tx_phase = tx_phase + w(symbol_index);
- tx((s-1)*Ts+k) = exp(j*tx_phase);
- end
- end
-
- % AWGN channel noise
-
- EsNodB = EcNodB + 10*log10(bps);
- EsNo = 10^(EsNodB/10);
- variance = Ts/EsNo;
- noise = sqrt(variance/2)*(randn(1,Nsymbols*Ts) + j*randn(1,Nsymbols*Ts));
- rx = tx + noise;
-
- if plt==2, % check the Spectrum
- [psd,Fpsd] =pwelch(rx,128,0.5,128,Ts);
- figure(110); plot(Fpsd,10*log10(psd));
- title('Rx Signal: PSD ');
- xlabel('Freq/Rs');
- %figure(111);plot(unwrap(arg(tx)));
- pause(0.01);
- end
-
-
- % integrate and dump demodulator
-
- rx_bits = zeros(1,Nbits);
- rx_filt = zeros(Nsymbols,M);
- rx_pows = zeros(1,M);
- rx_nse_pow = 0.0; rx_sig_pow =0.0;
- for s=1:Nsymbols
- arx_symb = rx((s-1)*Ts + (1:Ts));
- for m=1:M
- r= sum(exp(-j*w(m)*(1:Ts)) .* arx_symb);
- rx_pows(m)= r * conj(r);
- rx_filt(s,m) = abs(r);
- end
- [tmp symbol_index] = max(rx_filt(s,:));
- rx_sig_pow = rx_sig_pow + rx_pows(symbol_index);
- rx_pows(symbol_index)=[];
- rx_nse_pow = rx_nse_pow + sum(rx_pows)/(M-1);
- rx_bits(bps*(s-1)+1:bps*s) = demapper(symbol_index,:);
- end
-
- % using Rxpower = v^2 + sigmal^2
- rx_sig_pow = rx_sig_pow/Nsymbols;
- rx_nse_pow = rx_nse_pow/Nsymbols;
- v_est = sqrt(rx_sig_pow-rx_nse_pow);
- SNRest = rx_sig_pow/rx_nse_pow;
- sig_est = sqrt(rx_nse_pow/2); % for Rayleigh: 2nd raw moment = 2 .sigma^2
- Kest = rx_sig_pow/(2.0*sig_est^2) -1.0;
-
- Nerrors = sum(xor(tx_bits, rx_bits));
- raw_ber = Nerrors/Nbits;
- printf('Ec (dB): %4.1f M: %2d Total bits: %5d HD Errs: %6d (Raw) BER: %1.3f\n', ...
- EcNodB, M, Nbits, Nerrors, raw_ber);
- if plt==1, plot_hist(rx_filt,tx_symbols, M); end
-
-endfunction
-
-% simulate one codeword of 2 or 4 FSK --------------------------
-function [Nerrors raw_ber EcNodB] = run_single_ldpc(M, Ltype, Nbits,EbNodB, plt, HRA)
-
- disp([num2str(M) 'FSK coded test ... '])
- if M==2
- bps = 1; modulation = 'FSK'; mod_order=2; mapping = 'gray';
- elseif M==4
- bps = 2; modulation = 'FSK'; mod_order=4; mapping = 'gray';
- else
- error('sorry - bad value of M!');
- end
- decoder_type = 0; max_iterations = 100;
-
- Hsize=size(HRA);
- Krate = (Hsize(2)-Hsize(1))/Hsize(2); %
- EcNodB = EbNodB + 10*log10(Krate);
- code_param = ldpc_init_user(HRA, modulation, mod_order, mapping);
- Nframes = floor(Nbits/code_param.data_bits_per_frame);
- Nbits = Nframes*code_param.data_bits_per_frame;
-
- % Encoder
- data_bits = round(rand(1,code_param.data_bits_per_frame));
- tx_bits = [];
- for f=1:Nframes;
- codeword_bits = LdpcEncode(data_bits, code_param.H_rows, code_param.P_matrix);
- tx_bits = [tx_bits codeword_bits];
- end
-
- % modem/channel simulation
- [raw_ber rx_filt rx_bits tx_symbols demapper sig_est SNRlin v_est] = ...
- run_single(tx_bits,M,EcNodB, plt );
-
- % Decoder
- Nerrors = 0;
- for f=1:Nframes
- st = (f-1)*code_param.coded_bits_per_frame/bps + 1;
- en = st + code_param.coded_bits_per_frame/bps - 1;
- if or(Ltype==1, Ltype==3)
- if bps==1,
- sd = rx_filt(st:en,1) - rx_filt(st:en,2);
- % OR ind = rx_filt(st:en,1) > rx_filt(st:en,2);
- % llr = ind'*2 -1; % this works but use SNR scaling
- if Ltype==3, HD=1; else, HD = 0; end
- llr = sd_to_llr(sd, HD)'; % David's orig 2FSK routine
- end
- if bps==2,
- if Ltype==3,
- llr = mfsk_hd_to_llrs(rx_filt(st:en,:), demapper);
- else
- error('Ltype =1 not provided for coded 4FSK');
- end
- end
- end
- if Ltype==2, % SDs are converted to LLRs
- % use the SD amp estimates, try Bill's new LLR routine
- if plt==1, plot_pdf(v_est, sig_est); end
- llr = mfsk_sd_to_llrs(rx_filt(st:en,:), demapper, v_est, sig_est);
- end
- if Ltype==4,
- % use CML demod: non-coherent; still seems to need amplitude estimate
- symL = DemodFSK(1/v_est*rx_filt(st:en,:)', SNRlin, 1);
- llr = -Somap(symL); % now convert to bit LLRs
- end
- if plt==3, figure(204); hist(llr);
- title('Histogram LLR for decoder inputs'); pause(0.01); end
-
- [x_hat, PCcnt] = MpDecode(llr, code_param.H_rows, code_param.H_cols, ...
- max_iterations, decoder_type, 1, 1);
- Niters = sum(PCcnt~=0);
- detected_data = x_hat(Niters,:);
- Nerrors = Nerrors + sum(xor(data_bits, detected_data(1:code_param.data_bits_per_frame)));
- end
-
- ber = Nerrors/Nbits;
- printf('Eb (dB): %4.1f Data Bits: %4d Num CWs: %5d Tot Errs: %5d (Cod) BER: %1.3f\n', ...
- EbNodB,Nbits , Nframes, Nerrors, ber);
-endfunction
-
-function plot_hist(rx_filt,tx_symbols, M)
- % more general version of previous fn; - plots histograms for any Tx patterns
- Smax = 36;
- X = 0:Smax-1;
- H = zeros(1,Smax); H2 = zeros(1,Smax); s2=0.0;
- for m = 1:M
- ind = tx_symbols==m;
- ind2 = tx_symbols~=m;
- H= H+ hist(rx_filt(ind,m),X);
- H2= H2+ hist(rx_filt(ind2,m),X);
- x=rx_filt(ind2,m);
- s2 =s2 + sum(x(:).^2)/length(x);
- end
- disp('noise RMS is '); sqrt(s2/4)
- figure(207); clf, plot(X,H);
- title([num2str(M) 'FSK pdf for rx=tx symbol'])
- hold on, plot(X,H2,'g');
- title([num2str(M) 'FSK pdf for rx!=tx symbol'])
- pause(0.1);
-endfunction
-
-
-% 2FSK SD -> LLR mapping that we used for Wenet SSTV system
-function llr = sd_to_llr(sd, HD=0) % original 2FSK + HD option
- sd = sd / mean(abs(sd));
- x = sd - sign(sd);
- sumsq = sum(x.^2);
- summ = sum(x);
- mn = summ/length(sd);
- estvar = sumsq/length(sd) - mn*mn;
- estEsN0 = 1/(2* estvar + 1E-3);
- if HD==0,
- llr = 4 * estEsN0 * sd;
- else
- llr = 8 * estEsN0 * sign(sd); %%%% *4 >> *8
- endif
-endfunction
-
-
-
-function llrs = mfsk_sd_to_llrs(SD, map, v, sig)
- % Array of MFSK SD is converted to bit LLR vector according to mapping 'map'
- % SD is M elements wide; map is M by log2(M); v and sig are params of Rician pdf
- % Bill (VK5DSP) for Codec2, version 24/6/20
-
- Llim = 1e-7;
- XX =1.0; % check LLR scaling?
- Smap = size(map);
- Ssd = size(SD);
- if Smap(1) == 2
- llrs = zeros(1, Ssd(1));
- bps = 1;
- assert(2^bps == Ssd(2), 'wrong SD length?')
- % note that when v=0, the pdf reverts to Rayleigh
- for kk = 1: Ssd(1)
- Prx_1 = rice(SD(kk,2), v, sig) * rice(SD(kk,1),0,sig);
- Prx_0 = rice(SD(kk,2), 0, sig) * rice(SD(kk,1),v,sig);
-
- if or(isnan(Prx_1), Prx_1<Llim), Prx_1 = Llim; end
- if or(isnan(Prx_0), Prx_0<Llim), Prx_0 = Llim; end
- llrs(kk) = -XX * log(Prx_1/Prx_0);
- %% note inversion of LLRs
- endfor
- else
- if map==[0 0; 0 1; 1 0; 1 1] % a specific case for 4FSK
- llrs = zeros(2, Ssd(1));
- for kk = 1: Ssd(1)
- % pn_m is prob of sub car n given bit m is transmitted
- p1_0 = rice(SD(kk,1), 0, sig); p1_1 = rice(SD(kk,1), v, sig);
- p2_0 = rice(SD(kk,2), 0, sig); p2_1 = rice(SD(kk,2), v, sig);
- p3_0 = rice(SD(kk,3), 0, sig); p3_1 = rice(SD(kk,3), v, sig);
- p4_0 = rice(SD(kk,4), 0, sig); p4_1 = rice(SD(kk,4), v, sig);
-
- % second bit
- Prx_1 = p1_0*p3_0*(p2_1*p4_0 + p2_0*p4_1);
- Prx_0 = p2_0*p4_0*(p1_1*p3_0 + p1_0*p3_1);
-
- if or(isnan(Prx_1), Prx_1<Llim), Prx_1 = Llim; end
- if or(isnan(Prx_0), Prx_0<Llim), Prx_0 = Llim; end
- llrs(2,kk) = -XX*log(Prx_1/Prx_0);
-
- % 1st bit (LHS)
- Prx_1 = p1_0*p2_0*(p3_1*p4_0 + p3_0*p4_1);
- Prx_0 = p3_0*p4_0*(p1_1*p2_0 + p1_0*p2_1);
-
- if or(isnan(Prx_1), Prx_1<Llim), Prx_1 = Llim; end
- if or(isnan(Prx_0), Prx_0<Llim), Prx_0 = Llim; end
- llrs(1,kk) = -XX* log(Prx_1/Prx_0);
- endfor
- llrs= llrs(:); % convert to single vector of LLRs
- llrs = llrs';
- else
- disp('the mapping is '); map
- error('not sure how that mapping works!!')
- endif
- endif
-endfunction
-
-function llrs = mfsk_hd_to_llrs(sd, map, SNRlin=4)
-% for M=4, compare these results to SD method of mfsk_sd_to_llrs
- [x, ind] = max(sd'); % find biggest SD
- b2 = map(ind', :)'; % get bit pairs
- b1 = b2(:)'; % convert to row vector
- b1 = b1*2 -1; % convert to -1/ +1
- llrs = -4*SNRlin*b1; % approx scaling; default is ~6dB SNR
-endfunction
-
-
-% main ------------------------------------------------------------------------------
-
-format short
-more off
-init_cml();
-
-if exist('Ctype')==0, Ctype=1, end
-
-if Ctype==1
- load H_256_768_22.txt; HRA = H_256_768_22; % rate 1/3
-elseif Ctype==2
- load H_256_512_4.mat; HRA=H; % rate 1/2 code
-elseif Ctype==3
- load HRAa_1536_512.mat; % rate 3/4 2k code
-else
- error('bad Ctype');
-end
-
-Hsize=size(HRA);
-printf('using LDPC code length: %5d: Code rate: %5.2f\n',length(HRA), (Hsize(2)-Hsize(1))/Hsize(2))
-
-% store results in array "res" and plot afterwards
-% retain prev sims?
-if exist('keep_res')==0, nrun = 0; clear res; end
-
-if exist('Nbits')==0, Nbits = 20000, end
-if exist('Evec')==0, Evec = [5: 0.5: 9], end
-if exist('plt')==0. plt=0; end
-
-if exist('M')==0, M=2, end
-
-for Ltype = [ 2 4] % << add other Ltype options here, if required
- for Eb = Evec
- if and(M==4, Ltype==1)
- disp('skip original SD >> LLRs in 4FSK')
- else
- [Nerr raw_ber Ec] = run_single_ldpc(M, Ltype, Nbits, Eb, plt, HRA);
- nrun = nrun+1; res(nrun,:) = [Eb Ec M Ltype Nbits Nerr raw_ber];
- endif
- end
-end
-disp('results stored in array "res" - plot with fsk_cml_plot')
-disp(' Eb Ec M Ltype #Bits #Errs Raw-BER')
-for n = 1: nrun
- printf(' %5.1f %5.1f %3d %3d %6d %6d %5.4f \n', res(n,:))
-end
-
-
diff --git a/octave/fsk_demod_BER_test.py b/octave/fsk_demod_BER_test.py
deleted file mode 100755
index f783cf0..0000000
--- a/octave/fsk_demod_BER_test.py
+++ /dev/null
@@ -1,610 +0,0 @@
-#!/usr/bin/env python3
-#
-# Perform automated Eb/N0 testing of the C-implementation of fsk_mod / fsk_demod
-#
-# Based on the analysis performed here: https://github.com/projecthorus/radiosonde_auto_rx/blob/master/auto_rx/test/notes/2019-03-03_generate_lowsnr_validation.md
-#
-# Copyright (C) 2020 Mark Jessop <[email protected]>
-# Released under GNU GPL v3 or later
-#
-# Requirements:
-# - csdr must be installed and available on the path. https://github.com/ha7ilm/csdr
-# - The following utilities from codec2 need to be built:
-# - fsk_get_test_bits, fsk_put_test_bits
-# - fsk_mod, fsk_demod
-# - Create the directories: 'samples' and 'generated' in this directory (octave)
-#
-import json
-import logging
-import os
-import time
-import traceback
-import subprocess
-import sys
-import argparse
-
-import numpy as np
-import matplotlib.pyplot as plt
-import scipy.signal
-import scipy.interpolate
-
-
-# Variables you will want to adjust:
-
-# Eb/N0 Range to test:
-# Default: 0 through 5 dB in 0.5 db steps, then up to 20 db in 1db steps.
-EBNO_RANGE = np.append(np.arange(0, 5, 0.5), np.arange(5, 20.5, 1))
-
-# Baud rates to test:
-BAUD_RATES = [100, 50, 25]
-
-# Order of the FSK signal (2 or 4)
-FSK_ORDER = 4
-
-# Test Length (bits)
-TEST_LENGTH = 2e4
-
-# Pseudorandom sequence length to generate test frames.
-# NOTE: BER results are quite dependent on the frame length and threshold parameters.
-FRAME_LENGTH = 2000
-
-# Frame threshold detection. This has the effect of setting an upper bound on the BER.
-FRAME_THRESHOLD = 0.4
-
-# Allow a reduction in 'expected' bits of this value, as we expect the modem to need
-# some time to 'spin up' the estimators.
-FRAME_IGNORE = FRAME_LENGTH
-
-# IF sample rate
-SAMPLE_RATE = 48000
-
-# Frequency estimator limits
-ESTIMATOR_LOWER_LIMIT = 100
-ESTIMATOR_UPPER_LIMIT = int(SAMPLE_RATE/2 - 1000)
-
-# Frequency of the low tone (Hz)
-LOW_TONE = 2000
-
-# Tone spacing (Hz)
-TONE_SPACING = 270
-
-# Mask Estimator
-MASK_ESTIMATOR = True
-
-# Switch to 'Low Bit-Rate' mode below this baud rate.
-#LBR_BREAK_POINT = 600 # No more LBR mode
-
-# Halt simulation for a particular baud rate when the BER drops below this level.
-BER_BREAK_POINT = 1e-4
-
-# If enabled, calculate Frequency Estimator error
-FEST_ERROR = True
-
-# Frequency estimator error calculation threshold (*Rs)
-FEST_THRESHOLD = 0.2
-
-# Enable doppler shift.
-# NOTE: This will apply up to +/- 6kHz of doppler shift to the test signal,
-# emulating transmission through a LEO linear transponder.
-# You will need to set the modem centre frequency and parameters such that
-# the modem signal will be contained within a 1-22 kHz modem RX passband.
-# For 100 baud Horus Binary testing, I use:
-# LOW_TONE = 10000
-# TONE_SPACING = 250
-# The TEST_LENGTH setting must also be long enough so that the test modem file
-# is at least 780 seconds long. For 100 baud 4FSK, a TEST_LENGTH of 2e6 is enough.
-DOPPLER_ENABLED = False
-DOPPLER_FILE = "doppler.npz" # generate using sat_doppler.py
-
-
-STATS_OUTPUT = True
-
-# Where to place the initial test samples.
-SAMPLE_DIR = "./samples"
-
-# Where to place the generated low-SNR samples.
-GENERATED_DIR = "./generated"
-
-# Location of the codec2 utils
-CODEC2_UTILS = "../build/src"
-
-
-THEORY_EBNO = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
-THEORY_BER_4 = [
- 0.22934,
- 0.18475,
- 0.13987,
- 0.09772,
- 0.06156,
- 0.03395,
- 0.01579,
- 0.00591,
- 0.00168,
- 3.39e-4,
- 4.44e-5,
- # 3.38e-6,
- # 1.30e-7,
- # 2.16e-9,
- # 1.23e-11,
- # 1.85e-14,
- # 5.13e-18,
- # 1.71e-22
-]
-THEORY_BER_2 = [
- 0.30327,
- 0.26644,
- 0.22637,
- 0.18438,
- 0.14240,
- 0.10287,
- 0.06831,
- 0.04080,
- 0.02132,
- 0.00942,
- 0.00337,
-]
-
-#
-# Functions to read files and add noise.
-#
-
-
-def load_sample(filename, loadreal=True):
- # If loading real samples (which is what fsk_mod outputs), apply a hilbert transform to get an analytic signal.
- if loadreal:
- return scipy.signal.hilbert(np.fromfile(filename, dtype="f4"))
- else:
- return np.fromfile(filename, dtype="c8")
-
-
-def save_sample(data, filename):
- # We have to make sure to convert to complex64..
- data.astype(dtype="c8").tofile(filename)
-
- # TODO: Allow saving as complex s16 - see view solution here: https://stackoverflow.com/questions/47086134/how-to-convert-a-numpy-complex-array-to-a-two-element-float-array
-
-
-def apply_doppler(data, dopplerfile, fs=48000):
- """ Apply a doppler curve to an input data stream """
-
- npzfile = np.load(dopplerfile)
-
- _time = npzfile["arr_0"]
- _doppler = npzfile["arr_1"]
-
- if len(data) < _time[-1] * fs:
- print("Input data length too short - use more bits!")
-
- # Clip data length if its too long for the input doppler data
- if len(data) > _time[-1] * fs:
- data = data[: int(_time[-1] * fs)]
-
- # Interpolate the doppler data
- _interp = scipy.interpolate.interp1d(_time, _doppler, kind="cubic")
-
- _timesteps = np.arange(0, len(data)) / fs
- _interp_doppler = _interp(_timesteps)
-
- # This isn't working properly.
- phase = np.cumsum(_interp_doppler / fs)
- mixed = data * np.exp(1.0j * 2.0 * np.pi * phase)
-
- return mixed
-
-
-def calculate_variance(data, threshold=-100.0):
- # Calculate the variance of a set of radiosonde samples.
- # Optionally use a threshold to limit the sample the variance
- # is calculated over to ones that actually have sonde packets in them.
-
- _data_log = 20 * np.log10(np.abs(data))
-
- # MSE is better than variance as a power estimate, as it counts DC
- data_thresh = data[_data_log > threshold]
- return np.mean(data_thresh * np.conj(data_thresh))
-
-
-def add_noise(
- data,
- variance,
- baud_rate,
- ebno,
- fs=96000,
- bitspersymbol=1.0,
- normalise=True,
- real=False,
-):
- # Add calibrated noise to a sample.
-
- # Calculate Eb/No in linear units.
- _ebno = 10.0 ** ((ebno) / 10.0)
-
- # Calculate the noise variance we need to add
- _noise_variance = variance * fs / (baud_rate * _ebno * bitspersymbol)
-
- # If we are working with real samples, we need to halve the noise contribution.
- if real:
- _noise_variance = _noise_variance * 0.5
-
- # Generate complex random samples
- _rand_i = np.sqrt(_noise_variance / 2.0) * np.random.randn(len(data))
- _rand_q = np.sqrt(_noise_variance / 2.0) * np.random.randn(len(data))
-
- _noisy = data + (_rand_i + 1j * _rand_q)
-
- if normalise:
- # print("Normalised to 1.0")
- return _noisy / np.max(np.abs(_noisy))
- else:
- return _noisy
-
-
-def generate_lowsnr(sample, outfile, fs, baud, ebno, order):
- """ Generate a low SNR test file """
-
- if order == 2:
- _bits_per_symbol = 1
- else:
- _bits_per_symbol = 2
-
- _var = calculate_variance(sample)
-
- _noisy = add_noise(sample, _var, baud, ebno, fs, _bits_per_symbol)
-
- save_sample(_noisy, outfile)
-
- return outfile
-
-
-#
-# Functions to deal with codec2 utils
-#
-
-
-def generate_fsk(baud):
- """ Generate a set of FSK data """
-
- # Calculate the number of bits we need to generate to get out desired test length.
- if FSK_ORDER == 2:
- _num_bits = TEST_LENGTH * baud
- else:
- _num_bits = TEST_LENGTH * baud * 2
-
- _num_bits = TEST_LENGTH
-
- _filename = "%s/fsk_%d_%d_%d_f.bin" % (SAMPLE_DIR, FSK_ORDER, SAMPLE_RATE, baud)
-
- # Generate the command we need to make:
- _cmd = (
- "%s/fsk_get_test_bits - %d %d | %s/fsk_mod %d %d %d %d %d - - | csdr convert_s16_f > %s"
- % (
- CODEC2_UTILS,
- _num_bits,
- FRAME_LENGTH,
- CODEC2_UTILS,
- FSK_ORDER,
- SAMPLE_RATE,
- baud,
- LOW_TONE,
- TONE_SPACING,
- _filename,
- )
- )
-
- print(_cmd)
-
- print("Generating test signal: %d-FSK, %d baud" % (FSK_ORDER, baud))
-
- # Run the command.
- try:
- _start = time.time()
- _output = subprocess.check_output(_cmd, shell=True, stderr=None)
- _output = _output.decode()
- except:
- # traceback.print_exc()
- _output = "error"
-
- _runtime = time.time() - _start
-
- print("Finished generating test signal.")
-
- return _filename
-
-
-def process_fsk(
- filename, baud, complex_samples=True, override_bits=None, stats=False, statsfile=""
-):
- """ Run a fsk file through fsk_demod """
-
- _estim_limits = "-b %d -u %d " % (ESTIMATOR_LOWER_LIMIT, ESTIMATOR_UPPER_LIMIT)
-
- if MASK_ESTIMATOR:
- _mask = "--mask %d " % TONE_SPACING
- else:
- _mask = ""
-
- if complex_samples:
- _cpx = "--cs16 "
- else:
- _cpx = ""
-
- if stats:
- _stats_file = GENERATED_DIR + "/" + statsfile + ".stats"
- _stats = "--stats=50 "
- else:
- _stats = ""
- _stats_file = None
-
- _cmd = "cat %s | csdr convert_f_s16 | %s/fsk_demod %s%s%s%s%d %d %d - - " % (
- filename,
- CODEC2_UTILS,
- _mask,
- _estim_limits,
- _cpx,
- _stats,
- FSK_ORDER,
- SAMPLE_RATE,
- baud,
- )
-
- if stats:
- _cmd += "2> %s" % _stats_file
-
- _cmd += "| %s/fsk_put_test_bits -f %d -t %.2f - 2>&1" % (
- CODEC2_UTILS,
- FRAME_LENGTH,
- FRAME_THRESHOLD,
- )
-
- # print("Processing %s" % filename)
-
- print(_cmd)
-
- # Run the command.
- try:
- _start = time.time()
- _output = subprocess.check_output(_cmd, shell=True)
- _output = _output.decode()
- except subprocess.CalledProcessError as e:
- _output = e.output.decode()
- except:
- traceback.print_exc()
- _output = "error"
- print("Run failed!")
- return (-1, _stats_file)
-
- _runtime = time.time() - _start
-
- # Try to grab last line of the stderr output
- try:
- _last_line = _output.split("\n")[-3]
- except:
- # Lack of a line indicates that we have decoded no data. return a BER of 1.
- print("No bits decoded.")
- return (1.0, _stats_file)
-
- # Detect no decoded bits when feeding in custom put_bits parameters.
- if "Using" in _last_line:
- print("No bits decoded.")
- return (1.0, _stats_file)
-
- # Example line:
- # [0009] BER 0.000, bits tested 18000, bit errors 0 errs: 0
- # [0009] BER 0.000, bits tested 18000, bit errors 0
- # PASS
- #
-
- # split into fields
- _fields = _last_line.split()
-
- # Extract number of bits and errors
- _bits = float(_fields[5][:-1]) # remove the trailing comma
- _errors = float(_fields[8])
-
- print("Bits: %d, Errors: %d, Raw BER: %.8f" % (_bits, _errors, _errors / _bits))
-
- if override_bits != None:
- if _bits < override_bits:
- print("Demod got %d bits, but we sent %d bits." % (_bits, override_bits))
- _errors += override_bits - _bits
-
- # Calculate and return BER
- _ber = _errors / _bits
-
- if _ber > 1.0:
- _ber = 1.0
-
- return (_ber, _stats_file)
-
-
-def read_stats(filename, sps = 50):
- """ Read in a statistics file, and re-organise it for easier calculations """
-
- _output = {
- 'ebno': [],
- 'f1_est': [],
- 'f2_est': [],
- 'f3_est': [],
- 'f4_est': [],
- 'ppm': [],
- 'time': []
- }
-
- with open(filename, 'r') as _f:
- for _line in _f:
- if _line[0] != '{':
- continue
-
- try:
- _data = json.loads(_line)
- except Exception as e:
- #print("Line parsing error: %s" % str(e))
- continue
-
- _output['ebno'].append(_data['EbNodB'])
- _output['f1_est'].append(_data['f1_est'])
- _output['f2_est'].append(_data['f2_est'])
-
- if 'f3_est' in _data:
- _output['f3_est'].append(_data['f3_est'])
- _output['f4_est'].append(_data['f4_est'])
-
- _output['ppm'].append(_data['ppm'])
-
- if _output['time'] == []:
- _output['time'] = [0]
- else:
- _output['time'].append(_output['time'][-1]+1.0/sps)
-
- return _output
-
-
-def freq_est_error(data, Rs):
- """ Calculate the frequency estimator error """
-
- _threshold = FEST_THRESHOLD*Rs
-
- _total_points = len(data['f1_est'])*FSK_ORDER
-
- _errors = 0
-
- _errors += np.sum(np.abs(np.array(data['f1_est'])-LOW_TONE) > _threshold)
- _errors += np.sum(np.abs(np.array(data['f2_est'])-LOW_TONE-TONE_SPACING) > _threshold)
-
- if FSK_ORDER == 4:
- _errors += np.sum(np.abs(np.array(data['f3_est'])-LOW_TONE-TONE_SPACING*2) > _threshold)
- _errors += np.sum(np.abs(np.array(data['f4_est'])-LOW_TONE-TONE_SPACING*3) > _threshold)
-
-
- return _errors/_total_points
-
-
-if __name__ == "__main__":
-
- parser = argparse.ArgumentParser(description="FSK modem BER simulations")
- parser.add_argument("--test", action="store_true", help="run automated test")
- args = parser.parse_args()
-
- if args.test:
- # test the AWGN channel simulation. We use BPSK that's phase shifted to exercise the
- # complex maths a bit
-
- nb_bits = 100000
- EbNo = 4
- tx_bits = np.random.randint(2, size=nb_bits)
- tx_bpsk_symbols = (2 * tx_bits - 1) * np.exp(1j * np.pi / 3)
- tx_power = calculate_variance(tx_bpsk_symbols)
-
- # check calculate_variance()
- assert tx_power < 1.1 and tx_power > 0.9
-
- # BPSK modem simulation
- rx_bpsk_symbols = add_noise(tx_bpsk_symbols, tx_power, 1, EbNo, 1, 1)
- rx_bpsk_symbols = rx_bpsk_symbols * np.exp(-1j * np.pi / 3)
- rx_bits = np.array([1 if np.real(s) > 0 else 0 for s in rx_bpsk_symbols])
- nb_errors = np.sum(np.bitwise_xor(tx_bits, rx_bits))
- ber = nb_errors / nb_bits
-
- # set limit of +/- 0.25dB on BER
- EbNo_lin_upper = 10 ** ((EbNo - 0.25) / 10)
- bpsk_ber_theory_upper = 0.5 * scipy.special.erfc(np.sqrt(EbNo_lin_upper))
- EbNo_lin_lower = 10 ** ((EbNo + 0.25) / 10)
- bpsk_ber_theory_lower = 0.5 * scipy.special.erfc(np.sqrt(EbNo_lin_lower))
- print(
- "nb_errors: %d ber: %4.3f ber_lower_limit: %4.3f ber_upper_limit: %4.3f"
- % (nb_errors, ber, bpsk_ber_theory_lower, bpsk_ber_theory_upper)
- )
- assert ber < bpsk_ber_theory_upper and ber > bpsk_ber_theory_lower
- print("AWGN channel simulation test PASSED!")
- exit()
-
- plot_data = {}
-
- for _baud in BAUD_RATES:
-
- _file = generate_fsk(_baud)
-
- print("Loading file and converting to complex.")
- _sample = load_sample(_file)
-
- if DOPPLER_ENABLED:
- print("Applying Doppler.")
- _sample = apply_doppler(_sample, DOPPLER_FILE)
- print("Done.")
- _override_bits = _baud * (len(_sample) / SAMPLE_RATE) - FRAME_IGNORE
- else:
- _override_bits = TEST_LENGTH - FRAME_IGNORE
-
- _temp_file = "%s/temp.bin" % GENERATED_DIR
-
- _ebnos = []
- _bers = []
- _fest_err = []
-
- for _ebno in EBNO_RANGE:
- generate_lowsnr(_sample, _temp_file, SAMPLE_RATE, _baud, _ebno, FSK_ORDER)
-
- _ber, _stats_file = process_fsk(
- _temp_file,
- _baud,
- override_bits=_override_bits,
- stats=STATS_OUTPUT,
- statsfile="fsk_%d_%.1f" % (_baud, _ebno),
- )
-
- print("%.1f, %.8f" % (_ebno, _ber))
-
- _ebnos.append(_ebno)
- _bers.append(_ber)
-
- if FEST_ERROR:
- _stats = read_stats(_stats_file)
- _fest_err.append(freq_est_error(_stats, _baud))
-
- # Halt the simulation if the BER drops below our break point.
- if _ber < BER_BREAK_POINT:
- break
-
- plot_data[_baud] = {"baud": _baud, "ebno": _ebnos, "ber": _bers, "fest_err":_fest_err}
- print(plot_data[_baud])
-
- # plt.semilogy(plot_data[_baud]['ebno'], plot_data[_baud]['ber'], label="Simulated - %d bd" % _baud)
-
- plt.figure()
-
- print(plot_data)
-
- for _b in plot_data:
- plt.semilogy(
- plot_data[_b]["ebno"], plot_data[_b]["ber"], label="Simulated - %d bd" % _b
- )
-
- if FSK_ORDER == 2:
- plt.semilogy(THEORY_EBNO, THEORY_BER_2, label="Theory")
- else:
- plt.semilogy(THEORY_EBNO, THEORY_BER_4, label="Theory")
-
- plt.xlabel("Eb/N0 (dB)")
- plt.ylabel("BER")
-
- # Crop plot to reasonable limits
- plt.ylim(1e-3, 1)
- plt.xlim(0, 10)
-
- plt.title("fsk_demod %d-FSK BER performance" % FSK_ORDER)
- plt.grid()
- plt.legend()
-
- if FEST_ERROR:
- plt.figure()
-
- for _b in plot_data:
- plt.plot(
- plot_data[_b]["ebno"], plot_data[_b]["fest_err"], label="Simulated - %d bd" % _b
- )
-
- plt.title("Frequency Estimator Error")
- plt.grid()
- plt.legend()
-
- plt.show()
diff --git a/octave/fsk_lib_ldpc_rx.m b/octave/fsk_lib_ldpc_rx.m
deleted file mode 100644
index 46b964d..0000000
--- a/octave/fsk_lib_ldpc_rx.m
+++ /dev/null
@@ -1,102 +0,0 @@
-% fsk_lib_ldpc_rx.m
-%
-% LDPC coded 4FSK modem rx, reads 8 kHz 16 bit short raw file of real samples and demodulates
-
-function fsk_lib_ldpc_rx(filename, Rs=100, coderate=0.5)
- fsk_lib_ldpc;
-
- % set up LDPC code
- init_cml();
- if coderate == 0.5
- load H_256_512_4.mat;
- elseif coderate == 0.75
- load HRAa_1536_512.mat; H=HRA;
- else
- disp("unknown code rate");
- end
- [states code_param] = fsk_lib_ldpc_init (H, Rs, Fs=8000);
- n = code_param.coded_bits_per_frame; k = code_param.data_bits_per_frame;
-
- % known transmitted bits for BER estimation
- rand('seed',1);
- data_bits = round(rand(1,code_param.data_bits_per_frame));
- codeword_bits = LdpcEncode(data_bits, code_param.H_rows, code_param.P_matrix);
-
- frx=fopen(filename,"rb"); rx = fread(frx, Inf, "short"); fclose(frx);
-
- % freq estimator and demod
- run_frames = floor(length(rx)/states.N)-1;
- st = 1; f_log = []; rx_bits = []; rx_filt = []; SNRest_log = []; rx_timing_log = [];
- for f=1:run_frames
-
- % extract nin samples from input stream
- nin = states.nin;
- en = st + states.nin - 1;
-
- % due to nin variations it's possible to overrun buffer
- if en < length(rx)
- sf = rx(st:en);
- states = est_freq(states, sf, states.M); states.f = states.f2;
- [arx_bits states] = fsk_demod(states, sf);
- rx_bits = [rx_bits arx_bits];
- rx_filt = [rx_filt abs(states.f_int_resample)];
- f_log = [f_log; states.f];
- SNRest_log = [SNRest_log states.SNRest];
- rx_timing_log = [rx_timing_log states.norm_rx_timing];
- st += nin;
- end
- end
-
- % count bit errors in test frames
-
- num_frames=floor(length(rx_bits)/code_param.coded_bits_per_frame);
- log_nerrs = []; num_frames_rx = 0; Tbits = Terrs = Tperr = Tpackets = 0;
- uber = cber = 0.5; cper = 1;
- for f=1:num_frames-1
- st = (f-1)*code_param.coded_bits_per_frame + 1; en = (f+1)*code_param.coded_bits_per_frame;
- states = ber_counter(states, codeword_bits, rx_bits(st:en));
- log_nerrs = [log_nerrs states.nerr];
- if states.ber_state num_frames_rx++; end
-
- % Using sync provided by ber_counter() state machine for LDPC frame alignment
- if states.ber_state
- st_bit = (f-1)*code_param.coded_bits_per_frame + states.coarse_offset;
- st_symbol = (st_bit-1)/states.bitspersymbol + 1;
- en_symbol = st_symbol + code_param.coded_bits_per_frame/states.bitspersymbol - 1;
-
- % map FSK filter outputs to LLRs, then LDPC decode (see also fsk_cml_sam.m)
- symL = DemodFSK(1/states.v_est*rx_filt(:,st_symbol:en_symbol), states.SNRest, 1);
- llr = -Somap(symL);
- [x_hat, PCcnt] = MpDecode(llr, code_param.H_rows, code_param.H_cols, max_iterations=100, decoder_type=0, 1, 1);
- Niters = sum(PCcnt~=0);
- detected_data = x_hat(Niters,:);
- Nerrs = sum(xor(data_bits, detected_data(1:code_param.data_bits_per_frame)));
- Terrs += Nerrs;
- Tbits += code_param.data_bits_per_frame;
- if Nerrs Tperr++; end
- Tpackets++;
- end
- end
-
- SNRestdB_log = 10*log10(SNRest_log);
- if states.Tbits
- printf("Fs: %d Rs: %d rate %4.2f (%d,%d) frames received: %3d SNRav: %4.2f\n",
- Fs, Rs, coderate, n, k, num_frames_rx, mean(SNRestdB_log));
- uber = states.Terrs/states.Tbits; cber = Terrs/Tbits; cper = Tperr/Tpackets;
- printf(" Uncoded: nbits: %6d nerrs: %6d ber: %4.3f\n", states.Tbits, states.Terrs, uber);
- printf(" Coded..: nbits: %6d nerrs: %6d ber: %4.3f\n", Tbits, Terrs, cber);
- printf(" Coded..: npckt: %6d perrs: %6d per: %4.3f\n", Tpackets, Tperr, cper);
- else
- printf("No frames detected....\n");
- end
-
- figure(1); clf; subplot(211); plot(rx); axis([1 length(rx) -32767 32767]); subplot(212); plot_specgram(rx);
- figure(2); clf;
- subplot(211); plot(f_log); axis([1 length(f_log) states.fest_fmin states.fest_fmax]); ylabel('Tone Freq (Hz)');
- subplot(212); plot(rx_timing_log); axis([1 length(rx_timing_log) -0.5 0.5]); ylabel('Timing');
- figure(3); clf;
- mx_SNRestdB = 5*ceil(max(SNRestdB_log)/5);
- subplot(211); plot(SNRestdB_log); axis([1 length(SNRestdB_log) 0 mx_SNRestdB]); ylabel('SNRest (dB)');
- subplot(212); stem(log_nerrs); ylabel('Uncoded errors');
-end
-
diff --git a/octave/fsk_lib_ldpc_tx.m b/octave/fsk_lib_ldpc_tx.m
deleted file mode 100644
index 408ba79..0000000
--- a/octave/fsk_lib_ldpc_tx.m
+++ /dev/null
@@ -1,44 +0,0 @@
-% fsk_lib_ldpc_tx.m
-%
-% LDPC coded 4FSK modem tx, generates a 8 kHz 16 bit short real valued sample file
-
-function fsk_lib_ldpc_tx(filename, num_frames=10, Rs=100, coderate=0.5, EbNodB=100)
- fsk_lib_ldpc;
-
- % set up LDPC code
- init_cml();
- if coderate == 0.5
- load H_256_512_4.mat;
- elseif coderate == 0.75
- load HRAa_1536_512.mat; H=HRA;
- else
- disp("unknown code rate");
- end
- [states code_param] = fsk_lib_ldpc_init (H, Rs, Fs=8000);
- n = code_param.coded_bits_per_frame; k = code_param.data_bits_per_frame;
-
- rand('seed',1);
- data_bits = round(rand(1,code_param.data_bits_per_frame)); tx_bits = [];
- for f=1:num_frames
- codeword_bits = LdpcEncode(data_bits, code_param.H_rows, code_param.P_matrix);
- tx_bits = [tx_bits codeword_bits];
- end
-
- tx = fsk_mod(states, tx_bits);
-
- % set up (optional) AWGN noise
- EcNodB = EbNodB + 10*log10(states.rate);
- EcNo = 10^(EcNodB/10);
- variance = states.Fs/(states.Rs*EcNo*states.bitspersymbol);
-
- % note real noise
- noise = sqrt(variance/2)*randn(length(tx),1);
- rx = tx + noise;
-
- frx=fopen(filename,"wb"); fwrite(frx, states.amp_scale*rx, "short"); fclose(frx);
- printf("Fs: %d Rs: %d rate %4.2f (%d,%d) EbNodB: %3.1f EcNodB: %3.1f frames transmitted: %3d\n",
- Fs, Rs, coderate, n, k, EbNodB, EcNodB, num_frames);
-end
-
-
-
diff --git a/octave/fsk_llr_plot.m b/octave/fsk_llr_plot.m
deleted file mode 100644
index f1b1a9f..0000000
--- a/octave/fsk_llr_plot.m
+++ /dev/null
@@ -1,51 +0,0 @@
-% Plot some results from FSK LLR tests
-% Assume array "res" contains rows of simulation results:::
-% Eb Ec M Ltype Nbits Nerr BERraw
-% (some uncoded rows might contain -1 to indicate val is not applicable)
-
-figure(102); clf; hold on;
-
-%uncoded results
-sub = res(res(:,4)==-1 & res(:,3)==2, :)
-semilogy(sub(:,1), sub(:,7), 'k+--')
-sub = res(res(:,4)==-1 & res(:,3)==4, :)
-semilogy(sub(:,1), sub(:,7), 'k--')
-
-leg=[];
-% coded results
-for M = [2 4 ]
-
-if M==2, lt = '-+'; else lt='-x'; end
-
- sub = res(res(:,4)==1 & res(:,3)==M, :)
- if length(sub)>0,
- semilogy(sub(:,1), sub(:,6)./sub(:,5), ['k' lt])
- leg= [leg; 'Orig LLRs'];
- end
-
-
-sub = res(res(:,4)==2 & res(:,3)==M, :)
-if length(sub)>0,
- semilogy(sub(:,1), sub(:,6)./sub(:,5), ['g' lt])
- leg= [leg; ' PDF LLRs'];
-end
-
-sub = res(res(:,4)==3 & res(:,3)==M, :)
-if length(sub)>0
- semilogy(sub(:,1), sub(:,6)./sub(:,5), ['b' lt])
- leg= [leg; ' HD LLRs'];
-end
-
-sub = res(res(:,4)==4 & res(:,3)==M, :)
-semilogy(sub(:,1), sub(:,6)./sub(:,5), ['m' lt])
-leg= [leg; ' CML LLRs'];
-endfor
-
-ylabel('BER')
-xlabel('Eb/N0 (Info Bits; dB)')
- title('MFSK LLR test (+is 2FSK, xis 4FSK')
- legend(leg)
- legend('boxoff');
-
-if exist('plotname'), print -dpng plotname; disp('saved'); end
-
diff --git a/octave/fsk_llr_test.m b/octave/fsk_llr_test.m
deleted file mode 100644
index 3c21c64..0000000
--- a/octave/fsk_llr_test.m
+++ /dev/null
@@ -1,294 +0,0 @@
-% fsk_llr_test.m
-%
-% 2/4FSK simulation to develop LLR estimation algorithms for 4FSK/LDPC modems
-% Modified version of David's fsk_llr.m; Bill
-
-#{
- TODO
- The 'v' param of the Ricean pdf is the signal-only amplitude: genie value=16
- In practice, given varying input levels, this value needs to be estimated.
-
- A small scaling factor seems to improve 2FSK performance -- probably the 'sig'
- estimate can be improved.
-
- Only tested with short code -- try a longer one!
-
- Simulation should be updated to exit Eb after given Nerr reached
-
-#}
-
-ldpc;
-
-% define Rician pdf
-function y = rice(x,v,s)
- s2 = s*s;
- y = (x / s2) .* exp(-0.5 * (x.^2 + v.^2)/s2) .* besseli(0, x*v/s2);
-endfunction
-
-function plot_pdf(v,s)
- x=(0:0.1:2*v);
- y= rice(x, v, s);
- figure(201); hold on
- plot(x,y,'g');
- %title('Rician pdf: signal carrier')
- y= rice(x, 0, s);
- plot(x,y,'b');
- title('Rician pdf: signal and noise-only carriers')
- pause(0.01);
-endfunction
-
-% single Eb/No point simulation %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-function [raw_ber rx_filt rx_bits tx_symbols demapper sig_est ] = run_single(tx_bits, M, EcNodB, plt=0)
- % Ec/N0 is per channel bit
- bps = log2(M); % bits per symbol
- Ts = 16; % length of each symbol in samples
-
- if length(tx_bits)==1
- Nbits = tx_bits;
- tx_bits = randi(2,1,Nbits)-1; % make random bits
- endif
-
- Nbits = length(tx_bits);
- Nsymbols = Nbits/log2(M);
- tx_symbols = zeros(1,Nsymbols);
-
- mapper = bps:-1:1;
- % look up table demapper from symbols to bits (hard decision)
- demapper=zeros(M,bps);
- for m=1:M
- for b=1:bps
- if bitand(m-1,b) demapper(m,bps-b+1) = 1; end
- end
- end
-
- % continuous phase mFSK modulator
-
- w(1:M) = 2*pi*(1:M)/Ts;
- tx_phase = 0;
- tx = zeros(1,Ts*Nsymbols);
-
- for s=1:Nsymbols
- bits_for_this_symbol = tx_bits(bps*(s-1)+1:bps*s);
- symbol_index = bits_for_this_symbol * mapper' + 1;
- tx_symbols(s) = symbol_index;
- assert(demapper(symbol_index,:) == bits_for_this_symbol);
- for k=1:Ts
- tx_phase += w(symbol_index);
- tx((s-1)*Ts+k) = exp(j*tx_phase);
- end
- end
-
- % AWGN channel noise
-
-
- EsNodB = EcNodB + 10*log10(bps)
- EsNo = 10^(EsNodB/10);
- variance = Ts/EsNo;
- noise = sqrt(variance/2)*(randn(1,Nsymbols*Ts) + j*randn(1,Nsymbols*Ts));
- rx = tx + noise;
-
- if plt==2, % check the Spectrum
- [psd,Fpsd] =pwelch(rx,128,0.5,128,Ts);
- figure(110); plot(Fpsd,10*log10(psd));
- title('Rx Signal: PSD ');
- xlabel('Freq/Rs');
- %figure(111);plot(unwrap(arg(tx)));
- pause(0.01);
- endif
-
-
- % integrate and dump demodulator
-
- rx_bits = zeros(1,Nbits);
- rx_filt = zeros(Nsymbols,M);
- rx_pows = zeros(1,M);
- rx_nse_pow = 0.0; rx_sig_pow =0.0;
- for s=1:Nsymbols
- arx_symb = rx((s-1)*Ts + (1:Ts));
- for m=1:M
- r= sum(exp(-j*w(m)*(1:Ts)) .* arx_symb);
- rx_pows(m)= r * conj(r);
- rx_filt(s,m) = abs(r);
- end
- [tmp symbol_index] = max(rx_filt(s,:));
- rx_sig_pow = rx_sig_pow + rx_pows(symbol_index);
- rx_pows(symbol_index)=[];
- rx_nse_pow = rx_nse_pow + sum(rx_pows)/(M-1);
- rx_bits(bps*(s-1)+1:bps*s) = demapper(symbol_index,:);
- end
- % using Rxpower = v^2 + sigmal^2
-
- rx_sig_pow = rx_sig_pow/Nsymbols;
- rx_nse_pow = rx_nse_pow/Nsymbols;
- sig_est = sqrt(rx_nse_pow/2) % for Rayleigh: 2nd raw moment = 2 .sigma^2
- Kest = rx_sig_pow/(2.0*sig_est^2) -1.0
-
- Nerrors = sum(xor(tx_bits, rx_bits));
- raw_ber = Nerrors/Nbits;
- printf("EcNodB: %4.1f M: %2d Uncoded Nbits: %5d Nerrors: %4d (Raw) BER: %1.3f\n", ...
- EcNodB, M, Nbits, Nerrors, raw_ber);
- if plt==1, plot_hist(rx_filt,tx_symbols, M); end
-
-endfunction
-
-
-% Plot histograms of Rx filter outputs
-function plot_hist(rx_filt,tx_symbols, M)
- % more general version of previous fn; - plots histograms for any Tx patterns
- Smax = 36;
- X = 0:Smax-1;
- H = zeros(1,Smax); H2 = zeros(1,Smax); s2=0.0;
- for m = 1:M
- ind = tx_symbols==m;
- ind2 = tx_symbols~=m;
- H= H+ hist(rx_filt(ind,m),X);
- H2= H2+ hist(rx_filt(ind2,m),X);
- x=rx_filt(ind2,m);
- s2 =s2 + sum(x(:).^2)/length(x);
- end
- disp('noise RMS is '); sqrt(s2/4)
- figure(1); clf; plot(X,H);
- title([num2str(M) 'FSK pdf for rx=tx symbol'])
- figure(2); clf; plot(X,H2);
- title([num2str(M) 'FSK pdf for rx!=tx symbol'])
- pause(0.1);
-
-endfunction
-
-% 2FSK SD -> LLR mapping that we used for Wenet SSTV system
-function llr = sd_to_llr(sd, HD=0) % original 2FSK + HD option
- sd = sd / mean(abs(sd));
- x = sd - sign(sd);
- sumsq = sum(x.^2);
- summ = sum(x);
- mn = summ/length(sd);
- estvar = sumsq/length(sd) - mn*mn;
- estEsN0 = 1/(2* estvar + 1E-3);
- if HD==0,
- llr = 4 * estEsN0 * sd;
- else
- llr = 4 * estEsN0 * sign(sd);
- endif
-endfunction
-
-
-% single point LDPC encoded frame simulation, using 2FSK as a tractable starting point
-% Note: ~/cml/matCreateConstellation.m has some support for FSK - can it do 4FSK?
-
-%%%%%%%%%%%%%%%%%%%%%%%%%
- function [Nerrors raw_ber EcNodB] = run_single_ldpc(M, Ltype, Nbits,EbNodB, plt=0)
-
- disp([num2str(M) 'FSK coded test ... '])
- if M==2
- bps = 1; modulation = 'FSK'; mod_order=2; mapping = 'gray';
- elseif M==4
- bps = 2; modulation = 'FSK'; mod_order=4; mapping = 'gray';
- else
- error('sorry - bad value of M!');
- endif
- decoder_type = 0; max_iterations = 100;
-
- load H_256_768_22.txt
- Krate = 1/3;
- EcNodB = EbNodB + 10*log10(Krate);
- code_param = ldpc_init_user(H_256_768_22, modulation, mod_order, mapping);
- Nframes = floor(Nbits/code_param.data_bits_per_frame)
- Nbits = Nframes*code_param.data_bits_per_frame
-
- % Encoder
- data_bits = round(rand(1,code_param.data_bits_per_frame));
- tx_bits = [];
- for f=1:Nframes;
- codeword_bits = LdpcEncode(data_bits, code_param.H_rows, code_param.P_matrix);
- tx_bits = [tx_bits codeword_bits];
- end
- %tx_bits = zeros(1,length(tx_bits));
-
- % modem/channel simulation
- [raw_ber rx_filt rx_bits tx_symbols demapper sig_est ] = run_single(tx_bits,M,EcNodB, 0 );
-
- % Decoder
- Nerrors = 0;
- for f=1:Nframes
- st = (f-1)*code_param.coded_bits_per_frame/bps + 1;
- en = st + code_param.coded_bits_per_frame/bps - 1;
-
- if or(Ltype==1, Ltype==3)
- if bps==1,
- sd = rx_filt(st:en,1) - rx_filt(st:en,2);
- % OR ind = rx_filt(st:en,1) > rx_filt(st:en,2);
- % llr = ind'*2 -1; % this works but use SNR scaling
- if Ltype==3, HD=1; else, HD = 0; endif
- llr = sd_to_llr(sd, HD)';
- endif
- if bps==2,
- if Ltype==3,
- llr = mfsk_hd_to_llrs(rx_filt(st:en,:), demapper);
- else
- error('Ltype =1 not provided for coded 4FSK');
- endif
- endif
- endif
- if Ltype==2, % SDs are converted to LLRs
- v=16;
- if plt==1, plot_pdf(v, sig_est); endif
- llr = mfsk_sd_to_llrs(rx_filt(st:en,:), demapper, v, sig_est);
- endif
-
- [x_hat, PCcnt] = MpDecode(llr, code_param.H_rows, code_param.H_cols, ...
- max_iterations, decoder_type, 1, 1);
- Niters = sum(PCcnt!=0);
- detected_data = x_hat(Niters,:);
- Nerrors += sum(xor(data_bits, detected_data(1:code_param.data_bits_per_frame)));
- endfor
- ber = Nerrors/Nbits;
- printf("EbNodB: %4.1f Coded Nbits: %5d Nerrors: %4d BER: %1.3f\n", EbNodB, Nbits, Nerrors, ber);
-endfunction
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-%rand('seed',1);
-%randn('seed',1);
-format short
-more off
-init_cml();
-
-% store results in array "res" and plot afterwards
-% comment the following line if you want to retain prev sims
-nrun = 0; clear res;
-
-Nbits = 20000; plt=0;
-
-#{
-disp(' uncoded runs')
-for M= [2 4]
-for Eb = [6:10]
- raw_ber = run_single(Nbits, M, Eb, plt) % 2fsk coded
- nrun = nrun+1; res(nrun,:) = [Eb Eb M -1 Nbits -1 raw_ber]
-endfor
-endfor
-#}
-
-disp(' coded runs ');
-
-M=2,
-for Ltype = [1 2 3]
-for Eb = [7: 0.5: 9]
- [Nerr raw_ber Ec] = run_single_ldpc(M, Ltype, Nbits, Eb, plt)
- nrun = nrun+1; res(nrun,:) = [Eb Ec M Ltype Nbits Nerr raw_ber]
-endfor
-endfor
-
-M=4, %v=16;
-for Ltype = [2 3]
-for Eb = [8.0 8.3 8.6 ]
- [Nerr raw_ber Ec] = run_single_ldpc(M, Ltype, Nbits, Eb, plt)
- nrun = nrun+1; res(nrun,:) = [Eb Ec M Ltype Nbits Nerr raw_ber]
-endfor
-endfor
-
-
-date = datestr(now)
-save 'mfsk_test_res.mat' res date
-
diff --git a/octave/fsk_lock_down.m b/octave/fsk_lock_down.m
deleted file mode 100644
index 85ac034..0000000
--- a/octave/fsk_lock_down.m
+++ /dev/null
@@ -1,393 +0,0 @@
-% fsk_lock_down.m
-% David Rowe April 2020
-%
-% tests for "Lock down" waveform, low Eb/No 4FSK
-
-fsk_lib;
-
-% "Genie" (ie perfect) timing estimate, we just want to see impact on BER from frequency est errors
-function rx_bits = simple_fsk_demod(states, rx, f)
- M = states.M; Ts = states.Ts; Fs = states.Fs; N = states.nin;
-
- nsymb = states.nin/states.Ts;
- rx_filter = zeros(states.nin,M);
- rx_symbols = zeros(nsymb,M);
-
- % Down convert each tone. We can use any time index for down
- % conversion as it's non-coherent
- for m=1:M
- phase = exp(-j*2*pi*(1:N)'*f(m)/Fs);
- rx_filter(:,m) = rx .* phase;
- end
-
- % sum energy for each symbol
- for s=1:nsymb
- st_sym = (s-1)*Ts+1; en_sym = s*Ts;
- for m=1:M
- rx_symbols(s,m) = sum(rx_filter(st_sym:en_sym,m));
- end
- end
-
- % map symbols back to bits
- rx_bits = [];
- for s=1:nsymb
- [tone_max tone_index] = max(rx_symbols(s,:));
- arx_bits = dec2bin(tone_index - 1, states.bitspersymbol) - '0';
- rx_bits = [rx_bits arx_bits];
- end
-
-end
-
-% set up "lock down" waveform
-function [states M bits_per_frame] = lock_down_init(Rs,Fs,df,tx_tone_separation=250)
- M = 4;
- states = fsk_init(Fs,Rs,M,P=8,nsym=100);
- bits_per_frame = 512;
- states.tx_real = 0; % complex signal
- states.tx_tone_separation = tx_tone_separation;
- states.ftx = -2.5*states.tx_tone_separation + states.tx_tone_separation*(1:M);
- states.fest_fmin = -Fs/2;
- states.fest_fmax = +Fs/2;
- states.df = df;
-
- % cumulative PDF, cdf(x) probability of 0....x errors in frame
- cdf = binocdf(1:bits_per_frame, bits_per_frame, 0.3);
- % our valid frame threshold is 50% probability, so if we get this many errors
- % we have a 50% chance it's a valid frame
- nerrs_valid = find(cdf>=0.5)(1);
- % our invalid frame threshold is 99% probability, so very unlikely to
- % get this many errors
- nerrs_invalid = find(cdf>=0.99)(1);
- states.ber_valid_thresh = nerrs_valid/bits_per_frame;
- states.ber_invalid_thresh = nerrs_invalid/bits_per_frame;
-end
-
-% run a test at an Eb/No point, measure how many dud freq estimates using both algorithms
-function [states f_log f_log2 num_dud1 num_dud2 ber ber2] = freq_run_test(EbNodB = 10, num_frames=10, Fs=8000, Rs=100, df=0)
- [states M bits_per_frame] = lock_down_init(Rs,Fs,df);
- N = states.N;
-
- EbNo = 10^(EbNodB/10);
- variance = states.Fs/(states.Rs*EbNo*states.bitspersymbol);
-
- nbits = bits_per_frame*num_frames;
- tx_bits = round(rand(1,nbits));
- tx = fsk_mod(states, tx_bits);
- noise = sqrt(variance/2)*randn(length(tx),1) + j*sqrt(variance/2)*randn(length(tx),1);
- rx = tx + noise;
- run_frames = floor(length(rx)/N)-1;
- st = 1; f_log = []; f_log2 = []; rx_bits = []; rx_bits2 = [];
- for f=1:run_frames
-
- % extract nin samples from input stream
- nin = states.nin;
- en = st + states.nin - 1;
-
- % due to nin variations it's possible to overrun buffer
- if en < length(rx)
- sf = rx(st:en);
- states = est_freq(states, sf, states.M);
- arx_bits = simple_fsk_demod(states, sf, states.f);
- rx_bits = [rx_bits arx_bits];
- arx_bits = simple_fsk_demod(states, sf, states.f2);
- rx_bits2 = [rx_bits2 arx_bits];
- f_log = [f_log; states.f]; f_log2 = [f_log2; states.f2];
- st += nin;
- end
- end
-
- % ignore start up transient
- startup = 1; % TODO make this sensible/proportional so its scales across Rs
- if num_frames > startup
- tx_bits = tx_bits(startup*bits_per_frame:end);
- rx_bits = rx_bits(startup*bits_per_frame:end);
- rx_bits2 = rx_bits2(startup*bits_per_frame:end);
- end
-
- % measure BER
- nerrors = sum(xor(tx_bits(1:length(rx_bits)),rx_bits)); ber = nerrors/nbits;
- nerrors2 = sum(xor(tx_bits(1:length(rx_bits2)),rx_bits2)); ber2 = nerrors2/nbits;
-
- % Lets say that for a valid freq estimate, all four tones must be within 0.1*Rs of their tx frequency
- num_dud1 = 0; num_dud2 = 0;
- for i=1:length(f_log)
- if sum(abs(f_log(i,:)-states.ftx) > 0.1*states.Rs)
- num_dud1++;
- end
- if sum(abs(f_log2(i,:)-states.ftx) > 0.1*states.Rs)
- num_dud2++;
- end
- end
-end
-
-function freq_run_single(EbNodB = 3, num_frames = 10)
- [states f_log f_log2 num_dud1 num_dud2 ber ber2] = freq_run_test(EbNodB, num_frames);
-
- percent_dud1 = 100*num_dud1/length(f_log);
- percent_dud2 = 100*num_dud2/length(f_log);
- printf("EbNodB: %4.2f dB tests: %3d duds1: %3d %5.2f %% duds2: %3d %5.2f %% ber1: %4.3f ber2: %4.3f\n",
- EbNodB, length(f_log), num_dud1, percent_dud1, num_dud2, percent_dud2, ber, ber2)
-
- figure(1); clf;
- ideal=ones(length(f_log),1)*states.ftx;
- plot((1:length(f_log)),ideal(:,1),'bk;ideal;')
- hold on; plot((1:length(f_log)),ideal(:,2:states.M),'bk'); hold off;
- hold on;
- plot(f_log(:,1), 'linewidth', 2, 'b;peak;');
- plot(f_log(:,2:states.M), 'linewidth', 2, 'b');
- plot(f_log2(:,1),'linewidth', 2, 'r;mask;');
- plot(f_log2(:,2:states.M),'linewidth', 2, 'r');
- hold off;
- xlabel('Time (frames)'); ylabel('Frequency (Hz)');
- title(sprintf("EbNo = %4.2f dB", EbNodB));
- print("fsk_freq_est_single.png", "-dpng")
-
- figure(2); clf;
- errors = (f_log - states.ftx)(:);
- ind = find(abs(errors) < 100);
- errors2 = (f_log2 - states.ftx)(:);
- ind2 = find(abs(errors2) < 100);
- if length(ind)
- subplot(211); hist(errors(ind),50)
- end
- if length(ind2)
- subplot(212); hist(errors2(ind2),50)
- end
-end
-
-
-% test peak and mask algorithms side by side
-function freq_run_curve_peak_mask
-
- EbNodB = 0:9;
- m4fsk_ber_theory = [0.23 0.18 0.14 0.09772 0.06156 0.03395 0.01579 0.00591 0.00168 3.39E-4];
- percent_log = []; ber_log = [];
- for ne = 1:length(EbNodB)
- [states f_log f_log2 num_dud1 num_dud2 ber ber2] = freq_run_test(EbNodB(ne), 10);
- percent_dud1 = 100*num_dud1/length(f_log);
- percent_dud2 = 100*num_dud2/length(f_log);
- percent_log = [percent_log; [percent_dud1 percent_dud2]];
- ber_log = [ber_log; [ber ber2]];
- printf("EbNodB: %4.2f dB tests: %3d duds1: %3d %5.2f %% duds2: %3d %5.2f %% ber1: %4.3f ber2: %4.3f\n",
- EbNodB(ne), length(f_log), num_dud1, percent_dud1, num_dud2, percent_dud2, ber, ber2)
- end
-
- figure(1); clf; plot(EbNodB, percent_log(:,1), 'linewidth', 2, '+-;peak;'); grid;
- hold on; plot(EbNodB, percent_log(:,2), 'linewidth', 2, 'r+-;mask;'); hold off;
- xlabel('Eb/No (dB)'); ylabel('% Errors');
- title(sprintf("Fs = %d Rs = %d df = %3.2f", states.Fs, states.Rs, states.df));
- print("fsk_freq_est_errors.png", "-dpng")
-
- figure(2); clf; semilogy(EbNodB, m4fsk_ber_theory, 'linewidth', 2, 'bk+-;theory;'); grid;
- hold on; semilogy(EbNodB, ber_log(:,1), 'linewidth', 2, '+-;peak;');
- semilogy(EbNodB, ber_log(:,2), 'linewidth', 2, 'r+-;mask;'); hold off;
- xlabel('Eb/No (dB)'); ylabel('BER');
- title(sprintf("Fs = %d Rs = %d df = %3.2f", states.Fs, states.Rs, states.df));
- print("fsk_freq_est_ber.png", "-dpng")
-end
-
-
-function freq_run_curve_mask(Fs,Rs)
- EbNodB = 0:9;
- m4fsk_ber_theory = [0.23 0.18 0.14 0.09772 0.06156 0.03395 0.01579 0.00591 0.00168 3.39E-4];
- figure(1); clf; semilogy(EbNodB, m4fsk_ber_theory, 'linewidth', 2, 'bk+-;theory;'); grid;
- xlabel('Eb/No (dB)'); ylabel('BER');
- title(sprintf("Mask: Fs = %d Hz Rs = %d Hz", Fs, Rs));
- hold on;
-
- for df=-0.01:0.01:0.01
- ber_log = [];
- for ne = 1:length(EbNodB)
- [states f_log f_log2 num_dud1 num_dud2 ber ber2] = freq_run_test(EbNodB(ne), 100, Fs, Rs, df*Rs);
- ber_log = [ber_log; [ber ber2]];
- printf("Fs: %d Rs: %d df %3.2f EbNodB: %4.2f dB tests: %3d ber: %4.3f\n",
- Fs, Rs, df, EbNodB(ne), length(f_log), ber2)
- end
- semilogy(EbNodB, ber_log(:,2), 'linewidth', 2, sprintf("+-;df=% 3.2f Hz/s;",df*Rs));
- end
- hold off;
- print(sprintf("fsk_freq_est_ber_%d_%d.png",Fs,Rs), "-dpng")
-end
-
-
-% Run a complete modem (freq and timing estimators running) at a
-% single Eb/No point. At low Eb/No the estimators occasionally fall
-% over so we get complete junk, we consider that case a packet error
-% and exclude it from the BER estimation.
-
-function [states ber per] = modem_run_test(EbNodB = 10, num_frames=10, Fs=8000, Rs=100, df=0, plots=0, spreadHz=0,tx_tone_separation=250)
- [states M bits_per_frame] = lock_down_init(Rs, Fs, df, tx_tone_separation);
- N = states.N;
- if plots; states.verbose = 0x4; end
- EbNo = 10^(EbNodB/10);
- variance = states.Fs/(states.Rs*EbNo*states.bitspersymbol);
-
- nbits = bits_per_frame*num_frames;
- test_frame = round(rand(1,bits_per_frame)); tx_bits = [];
- for f=1:num_frames
- tx_bits = [tx_bits test_frame];
- end
-
- tx = fsk_mod(states, tx_bits);
- noise = sqrt(variance/2)*randn(length(tx),1) + j*sqrt(variance/2)*randn(length(tx),1);
- if spreadHz
- % just use phase part of doppler spread, not interested in amplitude fading
- spread = doppler_spread(spreadHz, Fs, round(1.1*length(tx)));
- spread = exp(j*arg(spread(1:length(tx))));
- rx = tx.*rot90(spread) + noise;
- else
- rx = tx + noise;
- end
- run_frames = floor(length(rx)/N)-1;
- st = 1; f_log = []; f_log2 = []; rx_bits = []; rx_bits2 = [];
- for f=1:run_frames
-
- % extract nin samples from input stream
- nin = states.nin;
- en = st + states.nin - 1;
-
- % due to nin variations it's possible to overrun buffer
- if en < length(rx)
- sf = rx(st:en);
- states = est_freq(states, sf, states.M); states.f = states.f2;
- [arx_bits states] = fsk_demod(states, sf);
- rx_bits = [rx_bits arx_bits];
- f_log = [f_log; states.f];
- st += nin;
- end
- end
-
- num_frames=floor(length(rx_bits)/bits_per_frame);
- log_nerrs = []; num_frames_rx = 0;
- for f=1:num_frames-1
- st = (f-1)*bits_per_frame + 1; en = (f+1)*bits_per_frame;
- states = ber_counter(states, test_frame, rx_bits(st:en));
- log_nerrs = [log_nerrs states.nerr];
- if states.ber_state; num_frames_rx++; end
- end
- if states.Terrs
- printf("Fs: %d Rs: %d df % 3.2f sp: %2.1f EbNo: %4.2f ftx: %3d frx: %3d nbits: %4d nerrs: %3d ber: %4.3f\n",
- Fs, Rs, df, spreadHz, EbNodB, num_frames, num_frames_rx, states.Tbits, states.Terrs, states.Terrs/states.Tbits);
- ber = states.Terrs/states.Tbits;
- else
- ber = 0.5;
- end
-
- if plots
- figure(1); clf;
- ideal=ones(length(f_log),1)*states.ftx;
- plot((1:length(f_log)),ideal(:,1),'bk;ideal;')
- hold on; plot((1:length(f_log)),ideal(:,2:states.M),'bk'); hold off;
- hold on;
- plot(f_log(:,1), 'linewidth', 2, 'b;peak;');
- plot(f_log(:,2:states.M), 'linewidth', 2, 'b');
- hold off;
- xlabel('Time (frames)'); ylabel('Frequency (Hz)');
- figure(2); clf; plot(log_nerrs); title('Errors per frame');
- end
-
- per = 1 - num_frames_rx/num_frames;
-end
-
-
-% run BER v Eb/No curves over a range of frequency rate/change
-function modem_run_curve(Fs, Rs, num_frames=100, dfmax=0.01)
- EbNodB = 0:9;
- m4fsk_ber_theory = [0.23 0.18 0.14 0.09772 0.06156 0.03395 0.01579 0.00591 0.00168 3.39E-4];
- figure(1); clf; semilogy(EbNodB, m4fsk_ber_theory, 'linewidth', 2, 'bk+-;theory;'); grid;
- xlabel('Eb/No (dB)'); ylabel('BER');
- title(sprintf("Mask: Fs = %d Hz Rs = %d Hz", Fs, Rs)); hold on;
- figure(2); clf;
- xlabel('Eb/No (dB)'); ylabel('PER'); title(sprintf("Mask: Fs = %d Hz Rs = %d Hz", Fs, Rs));
- grid; axis([min(EbNodB) max(EbNodB) 0 1]); hold on;
-
- for df=-dfmax:dfmax:dfmax
- ber_log = []; per_log = [];
- for ne = 1:length(EbNodB)
- [states ber per] = modem_run_test(EbNodB(ne), num_frames, Fs, Rs, df*Rs);
- ber_log = [ber_log; ber]; per_log = [per_log; per];
- end
- figure(1); semilogy(EbNodB, ber_log, 'linewidth', 2, sprintf("+-;df=% 3.2f Hz/s;",df*Rs));
- figure(2); plot(EbNodB, per_log, 'linewidth', 2, sprintf("+-;df=% 3.2f Hz/s;",df*Rs));
- end
-
- figure(1); hold off; print(sprintf("fsk_modem_ber_%d_%d.png",Fs,Rs), "-dpng")
- figure(2); hold off; print(sprintf("fsk_modem_per_%d_%d.png",Fs,Rs), "-dpng")
-end
-
-% run BER v Eb/No curve with some phase noise spreading the energy of the tones in frequency
-function modem_run_curve_spread(Fs, Rs, num_frames=100)
- EbNodB = 0:9;
- m4fsk_ber_theory = [0.23 0.18 0.14 0.09772 0.06156 0.03395 0.01579 0.00591 0.00168 3.39E-4];
- figure(1); clf; semilogy(EbNodB, m4fsk_ber_theory, 'linewidth', 2, 'bk+-;theory;'); grid;
- xlabel('Eb/No (dB)'); ylabel('BER');
- title(sprintf("Spread: Fs = %d Hz Rs = %d Hz", Fs, Rs)); hold on;
- figure(2); clf;
- xlabel('Eb/No (dB)'); ylabel('PER');
- title(sprintf("Spread: Fs = %d Hz Rs = %d Hz", Fs, Rs));
- grid; axis([min(EbNodB) max(EbNodB) 0 1]); hold on;
-
- spreadHz = [0.0 1 2 5];
- for ns = 1:length(spreadHz)
- ber_log = []; per_log = [];
- for ne = 1:length(EbNodB)
- [states ber per] = modem_run_test(EbNodB(ne), num_frames, Fs, Rs, 0, 0, spreadHz(ns));
- ber_log = [ber_log; ber]; per_log = [per_log; per];
- end
- figure(1); semilogy(EbNodB, ber_log, 'linewidth', 2, sprintf("+-;spread=% 3.2f Hz;",spreadHz(ns)));
- figure(2); plot(EbNodB, per_log, 'linewidth', 2, sprintf("+-;spread=% 3.2f Hz;",spreadHz(ns)));
- end
-
- figure(1); hold off; print(sprintf("fsk_modem_ber_spread_%d_%d.png",Fs,Rs), "-dpng")
- figure(2); hold off; print(sprintf("fsk_modem_per_spread_%d_%d.png",Fs,Rs), "-dpng")
-end
-
-% study code rate versus Rs and MDS
-function code_rate_table
- packet_duration_sec = 20;
- k = 256;
- noise_figure = 1;
- bits_per_symbol = 2;
- noise_bandwidth = 3000;
-
- code_rate=[1 0.8 0.5 1/3];
- raw_ber=[2E-3 0.04 0.08 0.16];
- EbNodB_4fsk=[8 4.5 3.5 1.5];
-
- printf("Code Rate | Raw BER | 4FSK Eb/No | n,k | Rs | SNR | MDS |\n");
- printf("| --- | --- | --- | --- | --- | --- | --- |\n");
- for i=1:length(code_rate)
- n = k/code_rate(i);
- Rb = n/packet_duration_sec;
- Rs = Rb/bits_per_symbol;
- snr = EbNodB_4fsk(i) + 10*log10(Rb/noise_bandwidth);
- mds = EbNodB_4fsk(i) + 10*log10(Rb) + noise_figure - 174;
- printf("%3.2f | %4.3f | %2.1f | %d,%d | %4.1f | %4.1f | %5.1f |\n",
- code_rate(i), raw_ber(i), EbNodB_4fsk(i), n, k, Rs, snr, mds);
- end
-end
-
-graphics_toolkit("gnuplot");
-more off;
-
-% same results every time
-rand('state',1);
-randn('state',1);
-
-% freq estimator tests (choose one)
-#freq_run_single(3,10)
-#freq_run_curve_peak_mask
-#freq_run_curve_mask(8000,100)
-#freq_run_curve_mask(24000,25)
-#freq_run_curve_mask(8000,25)
-
-% complete modem tests (choose one)
-#modem_run_curve(24000,25,100)
-#modem_run_curve(8000,100,50,0.05)
-#modem_run_curve_spread(8000,25,50)
-#modem_run_curve(8000,100,20)
-modem_run_test(2, 20, 8000, 25, 0, 1, 0, 270);
-
-% just print a table of code rates
-#code_rate_table
-
diff --git a/octave/fsk_v_afsk.m b/octave/fsk_v_afsk.m
deleted file mode 100644
index a692c18..0000000
--- a/octave/fsk_v_afsk.m
+++ /dev/null
@@ -1,232 +0,0 @@
-% fsk.m
-% David Rowe Nov 2014
-
-% Ideal non-coherent FSK and AFSK-over-analog-FM simulation. Can draw
-% Eb/No curves or run single point simulations
-
-rand('state',1);
-randn('state',1);
-graphics_toolkit ("gnuplot");
-
-fm;
-
-function sim_out = fsk_ber_test(sim_in)
- Fs = 96000;
- fmark = sim_in.fmark;
- fspace = sim_in.fspace;
- Rs = sim_in.Rs;
- Ts = Fs/Rs;
- emphasis = 50E-6;
- verbose = sim_in.verbose;
-
- nsym = sim_in.nsym;
- nsam = nsym*Ts;
- EbNodB = sim_in.EbNodB;
-
- fm = sim_in.fm;
-
- if fm
- fm_states.pre_emp = 0;
- fm_states.de_emp = 0;
- fm_states.Ts = Ts;
- fm_states.Fs = Fs;
- fm_states.fc = Fs/4;
- fm_states.fm_max = 3E3;
- fm_states.fd = 5E3;
- fm_states.output_filter = 1;
- fm_states = analog_fm_init(fm_states);
- end
-
- % simulate over a range of Eb/No values
-
- for ne = 1:length(EbNodB)
- Nerrs = Terrs = Tbits = 0;
-
- % randn() generates noise spread across the entire Fs bandwidth.
- % The power (aka variance) of this noise is N = NoFs, or No =
- % N/Fs. The power of each bit is C=1, so the energy of each bit
- % is Eb=1/Rs. We want to find N as a function of Eb/No, so:
-
- % Eb/No = (1/Rs)/(N/Fs) = Fs/(RsN)
- % N = Fs/(Rs(Eb/No))
-
- aEbNodB = EbNodB(ne);
- EbNo = 10^(aEbNodB/10);
- variance = Fs/(Rs*EbNo);
-
- % Modulator -------------------------------
-
- tx_bits = round(rand(1, nsym));
- tx = zeros(1,nsam);
- tx_phase = 0;
-
- for i=1:nsym
- for k=1:Ts
- if tx_bits(i) == 1
- tx_phase += 2*pi*fmark/Fs;
- else
- tx_phase += 2*pi*fspace/Fs;
- end
- tx_phase = tx_phase - floor(tx_phase/(2*pi))*2*pi;
- tx((i-1)*Ts+k) = exp(j*tx_phase);
- end
- end
-
- % Optional AFSK over FM modulator
-
- if sim_in.fm
- % FM mod takes real input; +/- 1 for correct deviation
- tx = analog_fm_mod(fm_states, real(tx));
- end
-
- % Channel ---------------------------------
-
- % We use complex (single sided) channel simulation, as it's convenient
- % for the FM simulation.
-
- noise = sqrt(variance/2)*(randn(1,nsam) + j*randn(1,nsam));
- rx = tx + noise;
- if verbose > 1
- printf("EbNo: %f Eb: %f var No: %f EbNo (meas): %f\n",
- EbNo, var(tx)*Ts/Fs, var(noise)/Fs, (var(tx)*Ts/Fs)/(var(noise)/Fs));
- end
- save fsk tx_bits rx
-
- % Optional AFSK over FM demodulator
-
- if sim_in.fm
- % scaling factor for convenience to match pure FSK
- rx_bb = 2*analog_fm_demod(fm_states, rx);
- else
- rx_bb = rx;
- end
-
- % Demodulator -----------------------------
-
- % non-coherent FSK demod
-
- mark_dc = rx_bb .* exp(-j*(0:nsam-1)*2*pi*fmark/Fs);
- space_dc = rx_bb .* exp(-j*(0:nsam-1)*2*pi*fspace/Fs);
-
- rx_bits = zeros(1, nsym);
- for i=1:nsym
- st = (i-1)*Ts+1;
- en = st+Ts-1;
- mark_int(i) = sum(mark_dc(st:en));
- space_int(i) = sum(space_dc(st:en));
- rx_bits(i) = abs(mark_int(i)) > abs(space_int(i));
- end
-
- if fm
- d = fm_states.nsym_delay;
- error_positions = xor(rx_bits(1+d:nsym), tx_bits(1:(nsym-d)));
- else
- error_positions = xor(rx_bits, tx_bits);
- end
- Nerrs = sum(error_positions);
- Terrs += Nerrs;
- Tbits += length(error_positions);
-
- TERvec(ne) = Terrs;
- BERvec(ne) = Terrs/Tbits;
-
- if verbose > 1
- figure(2)
- clf
- Rx = 10*log10(abs(fft(rx)));
- plot(Rx(1:Fs/2));
- axis([1 Fs/2 0 50]);
-
- figure(3)
- clf;
- subplot(211)
- plot(real(rx_bb(1:Ts*20)))
- subplot(212)
- Rx_bb = 10*log10(abs(fft(rx_bb)));
- plot(Rx_bb(1:3000));
- axis([1 3000 0 50]);
-
- figure(4);
- subplot(211)
- stem(abs(mark_int(1:100)));
- subplot(212)
- stem(abs(space_int(1:100)));
- end
-
- if verbose
- printf("EbNo (db): %3.2f Terrs: %d BER: %3.2f \n", aEbNodB, Terrs, Terrs/Tbits);
- end
- end
-
- sim_out.TERvec = TERvec;
- sim_out.BERvec = BERvec;
-endfunction
-
-
-function run_fsk_curves
- sim_in.fmark = 1200;
- sim_in.fspace = 2200;
- sim_in.Rs = 1200;
- sim_in.nsym = 12000;
- sim_in.EbNodB = 0:2:20;
- sim_in.fm = 0;
- sim_in.verbose = 1;
-
- EbNo = 10 .^ (sim_in.EbNodB/10);
- fsk_theory.BERvec = 0.5*exp(-EbNo/2); % non-coherent BFSK demod
- fsk_sim = fsk_ber_test(sim_in);
-
- sim_in.fm = 1;
- fsk_fm_sim = fsk_ber_test(sim_in);
-
- % BER v Eb/No curves
-
- figure(1);
- clf;
- semilogy(sim_in.EbNodB, fsk_theory.BERvec,'r;FSK theory;')
- hold on;
- semilogy(sim_in.EbNodB, fsk_sim.BERvec,'g;FSK sim;')
- semilogy(sim_in.EbNodB, fsk_fm_sim.BERvec,'b;FSK over FM sim;')
- hold off;
- grid("minor");
- axis([min(sim_in.EbNodB) max(sim_in.EbNodB) 1E-4 1])
- legend("boxoff");
- xlabel("Eb/No (dB)");
- ylabel("Bit Error Rate (BER)")
-
- % BER v C/No (1 Hz noise BW and Eb=C/Rs=1/Rs)
- % Eb/No = (C/Rs)/(1/(N/B))
- % C/N = (Eb/No)*(Rs/B)
-
- RsOnB_dB = 10*log10(sim_in.Rs/1);
- figure(2);
- clf;
- semilogy(sim_in.EbNodB+RsOnB_dB, fsk_theory.BERvec,'r;FSK theory;')
- hold on;
- semilogy(sim_in.EbNodB+RsOnB_dB, fsk_sim.BERvec,'g;FSK sim;')
- semilogy(sim_in.EbNodB+RsOnB_dB, fsk_fm_sim.BERvec,'b;FSK over FM sim;')
- hold off;
- grid("minor");
- axis([min(sim_in.EbNodB+RsOnB_dB) max(sim_in.EbNodB+RsOnB_dB) 1E-4 1])
- legend("boxoff");
- xlabel("C/No for Rs=1200 bit/s and 1 Hz noise bandwidth (dB)");
- ylabel("Bit Error Rate (BER)")
-end
-
-function run_fsk_single
- sim_in.fmark = 1000;
- sim_in.fspace = 2000;
- sim_in.Rs = 1000;
- sim_in.nsym = 2000;
- sim_in.EbNodB = 7;
- sim_in.fm = 0;
- sim_in.verbose = 1;
-
- fsk_sim = fsk_ber_test(sim_in);
-endfunction
-
-# choose one of these functions below
-
-run_fsk_curves
-#run_fsk_single
-
diff --git a/octave/fskdemodgui.py b/octave/fskdemodgui.py
deleted file mode 100644
index f1a4f29..0000000
--- a/octave/fskdemodgui.py
+++ /dev/null
@@ -1,220 +0,0 @@
-#!/usr/bin/env python3
-#
-# fsk_demod Statistics GUI
-# Accepts the stats output from fsk_demod on stdin, and plots it.
-#
-# Mark Jessop 2016-03-13 <[email protected]>
-#
-# NOTE: This is intended to be run on a 'live' stream of samples, and hence expects
-# updates at about 10Hz. Anything faster will fill up the input queue and be discarded.
-#
-# Call using:
-# <producer>| ./fsk_demod --cu8 -s --stats=100 2 $SDR_RATE $BAUD_RATE - - 2> >(python fskdemodgui.py --wide) | <consumer>
-#
-# Dependencies:
-# * Python (written for 2.7, only tested recently on 3+)
-# * numpy
-# * pyqtgraph
-# * PyQt5 (Or some Qt5 backend compatible with pyqtgraph)
-#
-#
-import sys, time, json, argparse
-from threading import Thread
-try:
- from pyqtgraph.Qt import QtGui, QtCore
-except ImportError:
- print("Could not import PyQt5 - is it installed?")
- sys.exit(1)
-
-try:
- import numpy as np
-except ImportError:
- print("Could not import numpy - is it installed?")
- sys.exit(1)
-
-try:
- import pyqtgraph as pg
-except ImportError:
- print("Could not import pyqtgraph - is it installed?")
- sys.exit(1)
-
-try:
- # Python 2
- from Queue import Queue
-except ImportError:
- # Python 3
- from queue import Queue
-
-parser = argparse.ArgumentParser()
-parser.add_argument("--wide", action="store_true", default=False, help="Alternate wide arrangement of widgets, for placement at bottom of 4:3 screen.")
-args = parser.parse_args()
-
-# Some settings...
-update_rate = 2 # Hz
-history_size = 100 # 10 seconds at 10Hz...
-history_scale = np.linspace((-1*history_size+1)/float(update_rate),0,history_size)
-
-# Input queue
-in_queue = Queue(1) # 1-element FIFO...
-
-win = pg.GraphicsWindow()
-win.setWindowTitle('FSK Demodulator Modem Statistics')
-
-
-# Plot objects
-ebno_plot = win.addPlot(title="Eb/No")
-ppm_plot = win.addPlot(title="Sample Clock Offset")
-if args.wide == False:
- win.nextRow()
-else:
- win.resize(1024,200)
-fest_plot =pg.PlotItem() # win.addPlot(title="Tone Frequency Estimation")
-eye_plot = win.addPlot(title="Eye Diagram")
-# Disable auto-ranging on eye plot and fix axes for a big speedup...
-spec_plot = win.addPlot(title="Spectrum")
-spec_plot.setYRange(0,40)
-spec_plot.setLabel('left','SNR (dB)')
-spec_plot.setLabel('bottom','FFT Bin')
-# Configure plot labels and scales.
-ebno_plot.setLabel('left','Eb/No (dB)')
-ebno_plot.setLabel('bottom','Time (seconds)')
-ebno_plot.setYRange(0,30)
-ppm_plot.setLabel('left','Clock Offset (ppm)')
-ppm_plot.setLabel('bottom','Time (seconds)')
-fest_plot.setLabel('left','Frequency (Hz)')
-fest_plot.setLabel('bottom','Time (seconds)')
-eye_plot.disableAutoRange()
-eye_plot.setYRange(0,1)
-eye_plot.setXRange(0,15)
-eye_xr = 15
-
-# Data arrays...
-ebno_data = np.zeros(history_size)
-ppm_data = np.zeros(history_size)
-fest_data = np.zeros((4,history_size))
-
-# Curve objects, so we can update them...
-spec_curve = spec_plot.plot([0])
-ebno_curve = ebno_plot.plot(x=history_scale,y=ebno_data)
-ppm_curve = ppm_plot.plot(x=history_scale,y=ppm_data)
-fest1_curve = fest_plot.plot(x=history_scale,y=fest_data[0,:],pen='r') # f1 = Red
-fest2_curve = fest_plot.plot(x=history_scale,y=fest_data[1,:],pen='g') # f2 = Blue
-fest3_curve = fest_plot.plot(x=history_scale,y=fest_data[2,:],pen='b') # f3 = Greem
-fest4_curve = fest_plot.plot(x=history_scale,y=fest_data[3,:],pen='m') # f4 = Magenta
-
-# Plot update function. Reads from queue, processes and updates plots.
-def update_plots():
- global timeout,timeout_counter,eye_plot,ebno_curve, ppm_curve, fest1_curve, fest2_curve, ebno_data, ppm_data, fest_data, in_queue, eye_xr, spec_curve
-
- try:
- if in_queue.empty():
- return
- in_data = in_queue.get_nowait()
- in_data = json.loads(in_data)
- except Exception as e:
-
- sys.stderr.write(str(e))
- return
-
- # Roll data arrays
- ebno_data[:-1] = ebno_data[1:]
- ppm_data[:-1] = ppm_data[1:]
- fest_data = np.roll(fest_data,-1,axis=1)
-
-
- # Try reading in the new data points from the dictionary.
- try:
- new_ebno = in_data['EbNodB']
- new_ppm = in_data['ppm']
- new_fest1 = in_data['f1_est']
- new_fest2 = in_data['f2_est']
- new_spec = in_data['samp_fft']
- except Exception as e:
- print("ERROR reading dict: %s" % e)
-
- # Try reading in the other 2 tones.
- try:
- new_fest3 = in_data['f3_est']
- new_fest4 = in_data['f4_est']
- fest_data[2,-1] = new_fest3
- fest_data[3,-1] = new_fest4
- except:
- # If we can't read these tones out of the dict, fill with NaN
- fest_data[2,-1] = np.nan
- fest_data[3,-1] = np.nan
-
- # Add in new data points
- ebno_data[-1] = new_ebno
- ppm_data[-1] = new_ppm
- fest_data[0,-1] = new_fest1
- fest_data[1,-1] = new_fest2
-
-
- # Update plots
- spec_data_log = 20*np.log10(np.array(new_spec)+0.01)
- spec_curve.setData(spec_data_log)
- spec_plot.setYRange(spec_data_log.max()-50,spec_data_log.max()+10)
- ebno_curve.setData(x=history_scale,y=ebno_data)
- ppm_curve.setData(x=history_scale,y=ppm_data)
- fest1_curve.setData(x=history_scale,y=fest_data[0,:],pen='r') # f1 = Red
- fest2_curve.setData(x=history_scale,y=fest_data[1,:],pen='g') # f2 = Blue
- fest3_curve.setData(x=history_scale,y=fest_data[2,:],pen='b') # f3 = Green
- fest4_curve.setData(x=history_scale,y=fest_data[3,:],pen='m') # f4 = Magenta
-
- #Now try reading in and plotting the eye diagram
- try:
- eye_data = np.array(in_data['eye_diagram'])
-
- #eye_plot.disableAutoRange()
- eye_plot.clear()
- col_index = 0
- for line in eye_data:
- eye_plot.plot(line,pen=(col_index,eye_data.shape[0]))
- col_index += 1
- #eye_plot.autoRange()
-
- #Quick autoranging for x-axis to allow for differing P and Ts values
- if eye_xr != len(eye_data[0]) - 1:
- eye_xr = len(eye_data[0]) - 1
- eye_plot.setXRange(0,len(eye_data[0])-1)
-
- except Exception as e:
- pass
-
-
-timer = pg.QtCore.QTimer()
-timer.timeout.connect(update_plots)
-timer.start(1000/update_rate)
-
-
-# Thread to read from stdin and push into a queue to be processed.
-def read_input():
- global in_queue
-
- while True:
- in_line = sys.stdin.readline()
- if type(in_line) == bytes:
- in_line = in_line.decode()
-
- # Only push actual data into the queue...
- # This stops sending heaps of empty strings into the queue when fsk_demod closes.
- if in_line == "":
- time.sleep(0.1)
- continue
-
- if not in_queue.full():
- in_queue.put_nowait(in_line)
-
-
-read_thread = Thread(target=read_input)
-read_thread.daemon = True # Set as daemon, so when all other threads die, this one gets killed too.
-read_thread.start()
-
-## Start Qt event loop unless running in interactive mode or using pyside.
-if __name__ == '__main__':
- import sys
- if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):
- try:
- QtGui.QApplication.instance().exec_()
- except KeyboardInterrupt:
- sys.exit(0)
diff --git a/octave/gmsk.m b/octave/gmsk.m
deleted file mode 100644
index a8c04a1..0000000
--- a/octave/gmsk.m
+++ /dev/null
@@ -1,1021 +0,0 @@
-% gmsk.m
-% David Rowe Dec 2014
-%
-% GMSK modem implementation and simulations to test
-
-%
-% [X] plot eye diagram
-% [X] BER curves with reas match to theoretical
-% [X] fine timing estimator
-% [X] test with fine timing error by resampling
-% [X] phase/freq estimator
-% + need initial acquisition and tracking
-% [X] test with different freq offsets
-% [X] coarse timing estimator (sync up to known test frames)
-% [X] test with different coarse timing offsets
-% [ ] file read/write interface
-% [ ] refactor into tx/rx functions
-% [X] modify for 1200 (or any) bit/s operation
-% + ie GMSK filter coeff generation
-% + or just re-sampling? e.g. ratio of Fs to Rs?
-% [ ] way to measure input SNR to demod
-% + Maybe based on test tone/carrier from the other side?
-% + think about process ... total signal plus noise power? Increase power until S+N doubles?
-% [X] generate curves for baseline modem and with sync algorithms
-% [X] used coarse sync code to remove need for knowing delays
-% [X] demod level indep
-% + scaled OK +/- 20dB same BER
-% [X] effect of DC signals from SDRs
-% + simulated effect of general interferer at -1500Hz, at an amplitude of 4
-% (12 dB above GMSK signal), it started to affect BER e.g. 0.007 to 0.009
-% Line appeared about 30dB above top of GMSK signal.
-% [ ] effect of quantisation noise
-
-% Filter coeffs From:
-% https://github.com/on1arf/gmsk/blob/master/gmskmodem_codec2/API/a_dspstuff.h,
-% which is in turn from Jonathan G4KLX. The demod coeffs low pass filter noise
-
-global gmsk_mod_coeff = [...
- 6.455906007234699e-014, 1.037067381285011e-012, 1.444835156335346e-011,...
-1.745786683011439e-010, 1.829471305298363e-009, 1.662729407135958e-008,...
-1.310626978701910e-007, 8.959797186410516e-007, 5.312253663302771e-006,...
-2.731624380156465e-005, 1.218217140199093e-004, 4.711833994209542e-004,...
-1.580581180127418e-003, 4.598383433830095e-003, 1.160259430889949e-002,...
-2.539022692626253e-002, 4.818807833062393e-002, 7.931844341164322e-002,...
-1.132322945270602e-001, 1.401935338024111e-001, 1.505383695578516e-001,...
-1.401935338024111e-001, 1.132322945270601e-001, 7.931844341164328e-002,...
-4.818807833062393e-002, 2.539022692626253e-002, 1.160259430889949e-002,...
-4.598383433830090e-003, 1.580581180127420e-003, 4.711833994209542e-004,...
-1.218217140199093e-004, 2.731624380156465e-005, 5.312253663302753e-006,...
-8.959797186410563e-007, 1.310626978701910e-007, 1.662729407135958e-008,...
-1.829471305298363e-009, 1.745786683011426e-010, 1.444835156335356e-011,...
-1.037067381285011e-012, 6.455906007234699e-014];
-
-global gmsk_demod_coeff = [...
--0.000153959924563, 0.000000000000000, 0.000167227768379, 0.000341615513437,...
-0.000513334449696, 0.000667493753523, 0.000783901543032, 0.000838293462576,...
-0.000805143268199, 0.000661865814384, 0.000393913058926, -0.000000000000000,...
--0.000503471198655, -0.001079755887508, -0.001671728086040, -0.002205032425392,...
--0.002594597675000, -0.002754194565297, -0.002608210441859, -0.002104352817854,...
--0.001225654870420, 0.000000000000000, 0.001494548041184, 0.003130012785731,...
-0.004735238379172, 0.006109242742194, 0.007040527007323, 0.007330850462455,...
-0.006821247169795, 0.005417521811131, 0.003112202160626, -0.000000000000000,...
--0.003715739376345, -0.007727358782391, -0.011638713107503, -0.014992029537478,...
--0.017304097563429, -0.018108937286588, -0.017003180218569, -0.013689829477969,...
--0.008015928769710, 0.000000000000000, 0.010154104792614, 0.022059114281395,...
-0.035162729807337, 0.048781621388364, 0.062148583345584, 0.074469032280094,...
-0.084982001723750, 0.093020219991183, 0.098063819576269, 0.099782731268437,...
-0.098063819576269, 0.093020219991183, 0.084982001723750, 0.074469032280094,...
-0.062148583345584, 0.048781621388364, 0.035162729807337, 0.022059114281395,...
-0.010154104792614, 0.000000000000000, -0.008015928769710, -0.013689829477969,...
--0.017003180218569, -0.018108937286588, -0.017304097563429, -0.014992029537478,...
--0.011638713107503, -0.007727358782391, -0.003715739376345, -0.000000000000000,...
-0.003112202160626, 0.005417521811131, 0.006821247169795, 0.007330850462455,...
-0.007040527007323, 0.006109242742194, 0.004735238379172, 0.003130012785731,...
-0.001494548041184, 0.000000000000000, -0.001225654870420, -0.002104352817854,...
--0.002608210441859, -0.002754194565297, -0.002594597675000, -0.002205032425392,...
--0.001671728086040, -0.001079755887508, -0.000503471198655, -0.000000000000000,...
-0.000393913058926, 0.000661865814384, 0.000805143268199, 0.000838293462576,...
-0.000783901543032, 0.000667493753523, 0.000513334449696, 0.000341615513437,...
-0.000167227768379, 0.000000000000000, -0.000153959924563];
-
-rand('state',1);
-randn('state',1);
-graphics_toolkit ("gnuplot");
-fm;
-close all;
-
-%
-% Functions that implement the GMSK modem ------------------------------------------------------
-%
-
-function gmsk_states = gmsk_init(gmsk_states, Rs)
-
- % general
-
- verbose = gmsk_states.verbose;
- gmsk_states.Fs = 48000;
- gmsk_states.Rs = Rs;
- M = gmsk_states.M = gmsk_states.Fs/gmsk_states.Rs;
- global gmsk_mod_coeff;
- global gmsk_demod_coeff;
- gmsk_states.mod_coeff = (Rs/4800)*resample(gmsk_mod_coeff, 4800, Rs);
-
- if verbose > 1
- figure;
- plot(gmsk_mod_coeff,'r;original 4800;')
- hold on;
- plot(gmsk_states.mod_coeff,'g;interpolated;')
- hold off;
- title('GMSK pulse shaping filter')
- end
-
- % set up FM modulator
-
- fm_states.Fs = gmsk_states.Fs;
- fm_states.fc = 0;
- fm_max = fm_states.fm_max = Rs/2;
- fd = fm_states.fd = Rs/4;
- fm_states.Ts = gmsk_states.M;
- fm_states.pre_emp = fm_states.de_emp = 0;
- fm_states.output_filter = 1;
- gmsk_states.fm_states = analog_fm_init(fm_states);
-
-endfunction
-
-
-function [tx tx_filt tx_symbols] = gmsk_mod(gmsk_states, tx_bits)
- M = gmsk_states.M;
- nsym = length(tx_bits);
- nsam = nsym*M;
- verbose = gmsk_states.verbose;
-
- % NRZ sequence of symbols
-
- tx_symbols = zeros(1,nsam);
- for i=1:nsym
- tx_symbols(1+(i-1)*M:i*M) = -1 + 2*tx_bits(i);
- end
-
- tx_filt = filter(gmsk_states.mod_coeff, 1, tx_symbols);
-
- if verbose > 1
- figure;
- clf
- plot(tx_filt(1:M*10))
- title('tx signal after filtering, before FM mod')
- end
-
- tx = analog_fm_mod(gmsk_states.fm_states, tx_filt);
-endfunction
-
-
-function [rx_bits rx_int rx_filt] = gmsk_demod(gmsk_states, rx)
- M = gmsk_states.M;
- Rs = gmsk_states.Rs;
- Fs = gmsk_states.Fs;
- nsam = length(rx);
- nsym = floor(nsam/M);
- global gmsk_demod_coeff;
- wd = 2*pi*gmsk_states.fm_states.fd/gmsk_states.Fs;
- timing_angle_log = zeros(1,length(rx));
- rx_int = zeros(1,length(rx));
-
- if gmsk_states.coherent_demod
-
- % See IEEE Trans on Comms, Muroyta et al, 1981, "GSM Modulation
- % for Digital Radio Telephony" Fig 8:
-
- % matched filter
-
- rx_filt = filter(gmsk_states.mod_coeff, 1, rx);
-
- % Property of MSK that re and im arms are sequences of 2T
- % long symbols, can be demodulated like QPSK with matched filter
- % and integrate and dump.
-
- % integrate energy in symbols 2T long in re and im arms
- % note this could be combined with matched filter
-
- rx_int = conv(rx_filt,ones(1,2*M));
-
- % phase and fine frequency tracking and correction ------------------------
-
- if gmsk_states.phase_track
-
- % DCO design from "Introduction To Phase-Lock Loop System Modeling", Wen Li
- % http://www.ece.ualberta.ca/~ee401/parts/data/PLLIntro.pdf
-
- eta = 0.707;
- wn = 2*pi*10*(Rs/4800); % (Rs/4800) -> found reducing the BW benifical with falling Rs
- Ts = 1/Fs;
- g1 = 1 - exp(-2*eta*wn*Ts);
- g2 = 1 + exp(-2*eta*wn*Ts) - 2*exp(-eta*wn*Ts)*cos(wn*Ts*sqrt(1-eta*eta));
- Gpd = 2/pi;
- Gvco = 1;
- G1 = g1/(Gpd*Gvco); G2 = g2/(Gpd*Gvco);
- %printf("g1: %e g2: %e G1: %e G2: %e\n", g1, g2, G1, G2);
-
- filt_prev = dco = lower = ph_err_filt = ph_err = 0;
- dco_log = filt_log = zeros(1,nsam);
-
- % w is the ref sine wave at the timing clock frequency
- % tw is the length of the window used to estimate timing
-
- k = 1;
- tw = 200*M;
- xr_log = []; xi_log = [];
- w_log = [];
- timing_clock_phase = 0;
- timing_angle = 0;
- timing_angle_log = zeros(1,nsam);
-
- for i=1:nsam
-
- % update sample timing estimate every tw samples
-
- if mod(i,tw) == 0
- l = i - tw+1;
- xr = abs(real(rx_int(l:l+tw-1)));
- xi = abs(imag(rx_int(l:l+tw-1)));
- w = exp(j*(l:l+tw-1)*2*pi*(Rs/2)/Fs);
- X = xr * w';
- timing_clock_phase = timing_angle = angle(X);
- k++;
- xr_log = [xr_log xr];
- xi_log = [xi_log xi];
- w_log = [w_log w];
- else
- timing_clock_phase += (2*pi)/(2*M);
- end
- timing_angle_log(i) = timing_angle;
-
- rx_int(i) *= exp(-j*dco);
- ph_err = sign(real(rx_int(i))*imag(rx_int(i)))*cos(timing_clock_phase);
- lower = ph_err*G2 + lower;
- filt = ph_err*G1 + lower;
- dco = dco + filt;
- filt_log(i) = filt;
- dco_log(i) = dco;
- end
-
- figure;
- clf
- subplot(211);
- plot(filt_log);
- title('PLL filter')
- subplot(212);
- plot(dco_log/pi);
- title('PLL DCO phase');
- %axis([1 nsam -0.5 0.5])
- end
-
- % sample integrator output at correct timing instant
-
- timing_adj = timing_angle_log*2*M/(2*pi);
- timing_adj_uw = unwrap(timing_angle_log)*2*M/(2*pi);
- % Toff = floor(2*M+timing_adj);
- Toff = floor(timing_adj_uw+0.5);
- k = 1;
- re_syms = im_syms = zeros(1,nsym/2);
-
- for i=2*M:2*M:nsam
- if (i-Toff(i)+M) < nsam
- re_syms(k) = real(rx_int(i-Toff(i)));
- im_syms(k) = imag(rx_int(i-Toff(i)+M));
- end
- %re_syms(k) = real(rx_int(i-10));
- %im_syms(k) = imag(rx_int(i+M-10));
- k++;
- end
-
- figure
- subplot(211)
- stem(re_syms)
- subplot(211)
- stem(im_syms)
-
- figure;
- clf
- subplot(211)
- plot(timing_adj);
- title('Timing est');
- subplot(212)
- plot(Toff);
- title('Timing est unwrap');
-
- % XORs/adders on the RHS of Muroyta et al Fig 8 (a) and (b). We
- % simulate digital logic bit stream at clock rate Rs, even though
- % we sample integrators at rate Rs/2. I can't explain how and why
- % this logic works/is required. I think it can be worked out from
- % comparing to MSK/OQPSK demod designs.
-
- l = length(re_syms);
- l2 = 2*l;
- re_bits = zeros(1,l2);
- im_bits = zeros(1,l2);
- clk_bits = zeros(1,l2);
- for i=1:l-1
- re_bits(2*(i-1)+1) = re_syms(i) > 0;
- re_bits(2*(i-1)+2) = re_syms(i) > 0;
- im_bits(2*(i-1)+2) = im_syms(i) > 0;
- im_bits(2*(i-1)+3) = im_syms(i) > 0;
- clk_bits(2*(i-1)+1) = 0;
- clk_bits(2*(i-1)+2) = 1;
- end
-
- rx_bits = bitxor(bitxor(re_bits,im_bits), clk_bits);
- rx_bits = rx_bits(2:length(rx_bits)-1);
- else
- % non-coherent demod
-
- % filter to get rid of most of noise before FM demod, but doesn't
- % introduce any ISI
-
- fc = Rs/(Fs/2);
- bin = firls(200,[0 fc*(1-0.05) fc*(1+0.05) 1],[1 1 0.01 0.01]);
- rx_filt = filter(bin, 1, rx);
-
- % FM demod
-
- rx_diff = [ 1 rx_filt(2:nsam) .* conj(rx_filt(1:nsam-1))];
- rx_filt = (1/wd)*atan2(imag(rx_diff),real(rx_diff));
-
- % low pass filter, trade off between ISI and removing noise
-
- rx_filt = filter(gmsk_demod_coeff, 1, rx_filt);
- Toff = 7;
- rx_bits = real(rx_filt(1+Toff:M:length(rx_filt)) > 0);
-
- end
-
-endfunction
-
-
-% Initial frequency offset estimation. Look for line a centre
-% frequency, which is the strongest component when ...101010... is
-% used to modulate the GMSK signal. Note just searching for a single
-% line will get false lock on random sine waves but that's OK for a
-% PoC. It could be improved by checking for other lines, or
-% demodulating the preamble and checking for bit errors.
-
-function [freq_offset_est ratio] = gmsk_est_freq_offset(gmsk_states, rx, verbose)
- Fs = gmsk_states.Fs;
- Rs = gmsk_states.Rs;
-
- % Suggest Rs/10 symbols of preamble (100ms), this works OK at
- % Rs=4800 and Es/No = 6dB. The large, Fs sample FFT size is used
- % for convenience (the bin resolution is 1 Hz), for real time we
- % would decimate and use smaller FFT to save CPU and memory.
-
- ndft = Fs;
- f = fft(rx .* hanning(length(rx))', ndft);
- f = fftshift(f);
-
- start_bin = 1 + Fs/2-Rs/4;
- stop_bin = start_bin + Rs/2;
- [max_val max_bin] = max(abs(f(start_bin:stop_bin)));
-
- max_bin -= Rs/4 + 1;
- if verbose > 1
- printf("ndft: %d start_bin: %d stop_bin: %d max_bin: %d\n", ndft, start_bin, stop_bin, max_bin);
- end
-
- % calc ratio of line energy to total energy. For a valid preamble
- % this was measured as about 0.20 to 0.25 depending on noise.
-
- sum_sq = sum(abs(f(start_bin:stop_bin)) .^ 2);
- ratio = sqrt(max_val*max_val/sum_sq);
-
- % map max_bin to frequency offset
-
- freq_offset_est = max_bin;
-
- if verbose > 1
- printf("freq_offset_est: %f pk/rms ratio: %f \n", freq_offset_est, ratio);
- figure;
- clf
- subplot(211)
- plot(rx,'+')
- title('rx signal on complex plane')
- subplot(212)
- plot(-Rs/4:Rs/4, 20*log10(abs(f(start_bin:stop_bin))));
- axis([-Rs/4 Rs/4 0 80]);
- title('spectrum of rx signal');
- end
-
-endfunction
-
-%
-% Functions for Testing the GMSK modem --------------------------------------------------------
-%
-
-function sim_out = gmsk_test(sim_in)
- nsym = sim_in.nsym;
- EbNodB = sim_in.EbNodB;
- verbose = sim_in.verbose;
- Rs = 4800;
-
- gmsk_states.verbose = verbose;
- gmsk_states.coherent_demod = sim_in.coherent_demod;
- gmsk_states.phase_track = 0;
- gmsk_states = gmsk_init(gmsk_states, Rs);
- M = gmsk_states.M;
- Fs = gmsk_states.Fs;
- Rs = gmsk_states.Rs;
- Bfm = gmsk_states.fm_states.Bfm;
-
- for ne = 1:length(EbNodB)
- aEbNodB = EbNodB(ne);
- EbNo = 10^(aEbNodB/10);
- variance = Fs/(Rs*EbNo);
-
- tx_bits = round(rand(1, nsym));
- %tx_bits = ones(1, nsym);
- %tx_bits = zeros(1, nsym);
- %tx_bits(1:2:nsym) = 0;
- [tx tx_filt tx_symbols] = gmsk_mod(gmsk_states, tx_bits);
- nsam = length(tx);
-
- noise = sqrt(variance/2)*(randn(1,nsam) + j*randn(1,nsam));
- rx = tx*exp(j*pi/2) + noise;
-
- [rx_bits rx_out rx_filt] = gmsk_demod(gmsk_states, rx(1:length(rx)));
-
- % search for frame location over a range
-
- Nerrs_min = nsym; Nbits_min = nsym; l = length(rx_bits);
- for i=1:100;
- Nerrs = sum(xor(rx_bits(i:l), tx_bits(1:l-i+1)));
- if Nerrs < Nerrs_min
- Nerrs_min = Nerrs;
- Nbits_min = l;
- end
- end
-
- TERvec(ne) = Nerrs_min;
- BERvec(ne) = Nerrs_min/Nbits_min;
-
- if verbose > 0
- printf("EbNo dB: %3.1f Nerrs: %d BER: %f BER Theory: %f\n", aEbNodB, Nerrs_min, BERvec(ne), 0.5*erfc(sqrt(0.75*EbNo)));
- end
-
- if verbose > 1
-
- if gmsk_states.coherent_demod == 0
- Toff = 0; dsam = M*30;
- figure;
- clf
- eyesyms = 2;
- plot(rx_filt(dsam+1+Toff:dsam+eyesyms*M+Toff))
- hold on;
- for i=1:10
- st = dsam+1+Toff+i*eyesyms*M;
- en = st + eyesyms*M;
- plot(rx_filt(st:en))
- end
- hold off;
- %axis([dsam dsam+eyesyms*M -2 2]);
- title('Eye Diagram');
- else
- figure;
- nplot = 16;
- clf;
- subplot(211)
- plot(real(rx_filt(1:nplot*M)))
- axis([1 nplot*M -1 1])
- title('Matched Filter');
- subplot(212)
- plot(imag(rx_filt(1:nplot*M)))
- axis([1 nplot*M -1 1])
-
- figure;
- nplot = 16;
- clf;
- subplot(211)
- plot(real(rx_out(1:nplot*M))/(2*M))
- title('Integrator');
- axis([1 nplot*M -1 1])
- subplot(212)
- plot(imag(rx_out(1:nplot*M)/(2*M)))
- axis([1 nplot*M -1 1])
- end
-
- figure;
- clf
- subplot(211)
- stem(tx_bits(1:20))
- title('Tx Bits')
- subplot(212)
- stem(rx_bits(1:20))
- title('Rx Bits')
-
- figure;
- clf
- subplot(211);
- f = fft(rx);
- Tx = 20*log10(abs(f));
- plot(Tx)
- grid;
- title('GMSK Demodulator Input Spectrum');
- axis([1 5000 0 80])
-
- subplot(212)
- f = fft(tx);
- f = f(1:length(f)/2);
- cs = cumsum(abs(f).^2);
- plot(cs)
- hold on;
- x = 0.99;
- tots = x*sum(abs(f).^2);
- xpercent_pwr = find(cs > tots);
- bw = 2*xpercent_pwr(1);
- plot([1 Fs/2],[tots tots],'r')
- plot([bw/2 bw/2],[0 tots],'r')
- hold off;
- title("Cumulative Power");
- grid;
- axis([1 5000 0 max(cs)])
-
- printf("Bfm: %4.0fHz %3.0f%% power bandwidth %4.0fHz = %3.2f*Rb\n", Bfm, x*100, bw, bw/Rs);
-
- end
- end
-
- sim_out.TERvec = TERvec;
- sim_out.BERvec = BERvec;
- sim_out.Rs = gmsk_states.Rs;
-endfunction
-
-
-function run_gmsk_single
- sim_in.coherent_demod = 0;
- sim_in.nsym = 4800;
- sim_in.EbNodB = 10;
- sim_in.verbose = 2;
-
- sim_out = gmsk_test(sim_in);
-endfunction
-
-
-% Generate a bunch of BER versus Eb/No curves for various demods
-
-function run_gmsk_curves
- sim_in.coherent_demod = 1;
- sim_in.nsym = 48000;
- sim_in.EbNodB = 2:10;
- sim_in.verbose = 1;
-
- gmsk_coh = gmsk_test(sim_in);
-
- sim_in.coherent_demod = 0;
- gmsk_noncoh = gmsk_test(sim_in);
-
- Rs = gmsk_coh.Rs;
- EbNo = 10 .^ (sim_in.EbNodB/10);
- alpha = 0.75; % guess for BT=0.5 GMSK
- gmsk_theory.BERvec = 0.5*erfc(sqrt(alpha*EbNo));
-
- % BER v Eb/No curves
-
- figure;
- clf;
- semilogy(sim_in.EbNodB, gmsk_theory.BERvec,'r;GMSK theory;')
- hold on;
- semilogy(sim_in.EbNodB, gmsk_coh.BERvec,'g;GMSK sim coherent;')
- semilogy(sim_in.EbNodB, gmsk_noncoh.BERvec,'b;GMSK sim non-coherent;')
- hold off;
- grid("minor");
- axis([min(sim_in.EbNodB) max(sim_in.EbNodB) 1E-4 1])
- legend("boxoff");
- xlabel("Eb/No (dB)");
- ylabel("Bit Error Rate (BER)")
-
- % BER v C/No (1 Hz noise BW and Eb=C/Rs=1/Rs)
- % Eb/No = (C/Rs)/(1/(N/B))
- % C/N = (Eb/No)*(Rs/B)
-
- RsOnB_dB = 10*log10(Rs/1);
- figure;
- clf;
- semilogy(sim_in.EbNodB+RsOnB_dB, gmsk_theory.BERvec,'r;GMSK theory;')
- hold on;
- semilogy(sim_in.EbNodB+RsOnB_dB, gmsk_coh.BERvec,'g;GMSK sim coherent;')
- semilogy(sim_in.EbNodB+RsOnB_dB, gmsk_noncoh.BERvec,'b;GMSK sim non-coherent;')
- hold off;
- grid("minor");
- axis([min(sim_in.EbNodB+RsOnB_dB) max(sim_in.EbNodB+RsOnB_dB) 1E-4 1])
- legend("boxoff");
- xlabel("C/No for Rs=4800 bit/s and 1 Hz noise bandwidth (dB)");
- ylabel("Bit Error Rate (BER)")
-
-endfunction
-
-
-function [preamble_location freq_offset_est] = find_preamble(gmsk_states, M, npreamble, rx)
- verbose = gmsk_states.verbose;
-
- % look through rx buffer and determine if there is a valid preamble. Use steps of half the
- % preamble size in samples to try to bracket the pre-amble.
-
- preamble_step = npreamble*M/2;
- ratio = 0; freq_offset_est = 0; preamble_location = 0;
- ratio_log = [];
- for i=1:preamble_step:length(rx)-preamble_step
- [afreq_offset_est aratio] = gmsk_est_freq_offset(gmsk_states, rx(i:i+preamble_step-1), verbose);
- ratio_log = [ratio_log aratio];
- if aratio > ratio
- preamble_location = i;
- ratio = aratio;
- freq_offset_est = afreq_offset_est;
- end
- end
- if verbose
- printf("preamble location: %2.1f seconds est f_off: %5.1f Hz ratio: %3.2f\n",
- preamble_location/gmsk_states.Fs, freq_offset_est, ratio);
- figure;
- plot(ratio_log);
- title('Preamble ratio');
- end
-endfunction
-
-
-% attempt to perform "coarse sync" sync with the received frames, we
-% check each frame for the best coarse sync position. Brute force
-% approach, that would be changed for a real demod which has some
-% sort of unique word. Start looking for valid frames 1 frame
-% after start of pre-amble to give PLL time to lock
-
-function [total_errors total_bits Nerrs_log Nerrs_all_log errors_log] = coarse_sync_ber(nframes_rx, tx_frame, rx_bits)
-
- Nerrs_log = zeros(1, nframes_rx);
- Nerrs_all_log = zeros(1, nframes_rx);
- total_errors = 0;
- total_bits = 0;
- framesize = length(tx_frame);
- errors_log = [];
-
- for f=2:nframes_rx-1
- Nerrs_min = framesize;
- for i=1:framesize;
- st = (f-1)*framesize+i; en = st+framesize-1;
- errors = xor(rx_bits(st:en), tx_frame);
- Nerrs = sum(errors);
- if Nerrs < Nerrs_min
- Nerrs_min = Nerrs;
- errors_min = errors;
- end
- end
- Nerrs_all_log(f) = Nerrs_min;
- if Nerrs_min/framesize < 0.1
- errors_log = [errors_log errors_min];
- Nerrs_log(f) = Nerrs_min;
- total_errors += Nerrs_min;
- total_bits += framesize;
- end
- end
-endfunction
-
-function plot_spectrum(gmsk_states, rx, preamble_location, title_str)
- Fs = gmsk_states.Fs;
- st = preamble_location + gmsk_states.npreamble*gmsk_states.M;
- sig = rx(st:st+Fs*0.5);
- h = hanning(length(sig))';
- Rx=20*log10(abs(fftshift(fft(sig .* h, Fs))));
- figure;
- plot(-Fs/2:Fs/2-1,Rx);
- grid("minor");
- xlabel('Hz');
- ylabel('dB');
- topy = ceil(max(Rx)/10)*10;
- axis([-4000 4000 topy-50 topy+10])
- title(title_str);
-endfunction
-
-% Give the demod a hard time: frequency, phase, time offsets, sample clock difference
-
-function run_test_channel_impairments
- Rs = 1200;
- verbose = 1;
- aEbNodB = 6;
- phase_offset = pi/2;
- freq_offset = -104;
- timing_offset = 100E3;
- sample_clock_offset_ppm = -500;
- interferer_freq = -1500;
- interferer_amp = 0;
- nsym = 4800*2;
- npreamble = 480;
-
- gmsk_states.npreamble = npreamble;
- gmsk_states.verbose = verbose;
- gmsk_states.coherent_demod = 1;
- gmsk_states.phase_track = 1;
- gmsk_states = gmsk_init(gmsk_states, Rs);
- Fs = gmsk_states.Fs;
- Rs = gmsk_states.Rs;
- M = gmsk_states.M;
-
- % A frame consists of nsym random data bits. Some experimentation
- % has shown they must be random-ish data (not say 11001100...) for
- % timing estimator to work. However initial freq offset estimation
- % is a lot easier with a 01010 type sequence, so we construct a
- % frame with a pre-amble followed by frames of random data.
-
- framesize = 480;
- nframes = floor(nsym/framesize);
- tx_frame = round(rand(1, framesize));
- tx_bits = zeros(1,npreamble);
- tx_bits(1:2:npreamble) = 1;
- for i=1:nframes
- tx_bits = [tx_bits tx_frame];
- end
-
- [tx tx_filt tx_symbols] = gmsk_mod(gmsk_states, tx_bits);
-
- tx = resample(tx, 1E6, 1E6-sample_clock_offset_ppm);
- tx = [zeros(1,timing_offset) tx];
- nsam = length(tx);
-
- if verbose > 1
- figure;
- subplot(211)
- st = timing_offset; en = st+M*10;
- plot(real(tx(st:en)))
- title('Real part of tx');
- subplot(212)
- plot(imag(tx(st:en)))
- title('Imag part of tx');
- end
-
- EbNo = 10^(aEbNodB/10);
- variance = Fs/(Rs*EbNo);
- noise = sqrt(variance/2)*(randn(1,nsam) + j*randn(1,nsam));
- w = (0:nsam-1)*2*pi*freq_offset/Fs + phase_offset;
- interferer = interferer_amp*exp(j*interferer_freq*(2*pi/Fs)*(0:nsam-1));
-
- rx = sqrt(2)*tx.*exp(j*w) + noise + interferer;
-
- % optional dump to file
-
- if 1
- fc = 1500; gain = 10000;
- wc = 2*pi*fc/Fs;
- w1 = exp(j*wc*(1:nsam));
- rx1 = gain*real(rx .* w1);
- fout = fopen("rx_6dB.raw","wb");
- fwrite(fout, rx1, "short");
- fclose(fout);
- end
-
- rx = rx1 .* conj(w1);
-
- [preamble_location freq_offset_est] = find_preamble(gmsk_states, M, npreamble, rx);
- w_est = (0:nsam-1)*2*pi*freq_offset_est/Fs;
- rx = rx.*exp(-j*w_est);
-
- plot_spectrum(gmsk_states, rx, preamble_location, "GMSK rx just after preamble");
-
- % printf("ntx: %d nrx: %d ntx_bits: %d\n", length(tx), length(rx), length(tx_bits));
-
- [rx_bits rx_out rx_filt] = gmsk_demod(gmsk_states, rx(preamble_location+framesize:nsam));
- nframes_rx = length(rx_bits)/framesize;
-
- % printf("ntx: %d nrx: %d ntx_bits: %d nrx_bits: %d\n", length(tx), length(rx), length(tx_bits), length(rx_bits));
-
- [total_errors total_bits Nerrs_log Nerrs_all_log] = coarse_sync_ber(nframes_rx, tx_frame, rx_bits);
-
- ber = total_errors/total_bits;
-
- printf("Eb/No: %3.1f f_off: %4.1f ph_off: %4.3f Nframes: %d Nbits: %d Nerrs: %d BER: %f\n",
- aEbNodB, freq_offset, phase_offset, nframes_rx, total_bits, total_errors, ber);
-
- figure;
- clf
- subplot(211)
- plot(Nerrs_log,'r;errors/frame counted for BER;');
- hold on;
- plot(Nerrs_all_log,'g;all errors/frame;');
- hold off;
- legend("boxoff");
- title('Bit Errors')
- subplot(212)
- stem(real(cumsum(Nerrs_log)))
- title('Cumulative Bit Errors')
-
-endfunction
-
-
-% Generates a Fs=48kHz raw file of 16 bit samples centred on 1500Hz,
-% Suitable for transmitting with a SSB tx
-
-function gmsk_tx(tx_file_name)
- rand('state',1);
- Rs = 1200;
- nsym = Rs*4;
- framesize = 480;
- npreamble = 480;
- gain = 10000;
- fc = 1500;
-
- gmsk_states.verbose = 0;
- gmsk_states.coherent_demod = 1;
- gmsk_states.phase_track = 1;
- gmsk_states = gmsk_init(gmsk_states, Rs);
- Fs = gmsk_states.Fs;
- Rs = gmsk_states.Rs;
- M = gmsk_states.M;
-
- % generate frame with preamble
-
- nframes = floor(nsym/framesize)
- tx_frame = round(rand(1, framesize));
- tx_bits = zeros(1,npreamble);
- tx_bits(1:2:npreamble) = 1;
- for i=1:nframes
- tx_bits = [tx_bits tx_frame];
- end
-
- [tx tx_filt tx_symbols] = gmsk_mod(gmsk_states, tx_bits);
- nsam = length(tx);
-
- wc = 2*pi*fc/Fs;
- w = exp(j*wc*(1:nsam));
- tx = gain*real(tx .* w);
- figure;
- plot(tx(1:4000))
- fout = fopen(tx_file_name,"wb");
- fwrite(fout, tx, "short");
- fclose(fout);
-
-endfunction
-
-
-% Reads a file of Fs=48kHz 16 bit samples centred on 1500Hz, and
-% measures the BER.
-
-function gmsk_rx(rx_file_name, err_file_name)
- rand('state',1);
-
- Rs = 1200;
- framesize = 480;
- npreamble = 480;
- fc = 1500;
-
- gmsk_states.npreamble = npreamble;
- gmsk_states.verbose = 1;
- gmsk_states.coherent_demod = 1;
- gmsk_states.phase_track = 1;
- gmsk_states = gmsk_init(gmsk_states, Rs);
- Fs = gmsk_states.Fs;
- Rs = gmsk_states.Rs;
- M = gmsk_states.M;
-
- tx_frame = round(rand(1, framesize));
-
- % get real signal at fc offset and convert to baseband complex
- % signal
-
- fin = fopen(rx_file_name,"rb");
- rx = fread(fin,"short")';
- fclose(fin);
- rx = filter([1 -0.999],[1 -0.99],rx);
- nsam = length(rx);
- wc = 2*pi*fc/Fs;
- w = exp(-j*wc*(1:nsam));
- rxbb = rx .* w;
-
- figure;
- plot(rx);
-
- % find preamble
-
- [preamble_location freq_offset_est] = find_preamble(gmsk_states, M, npreamble, rxbb);
-
- % power of signal, averaged over window
- % TODO: remove wave file header, scale of actual level
- % filter so we measure only energy in our passband
- % work out noise BW of filter. Use GMSK filter?
-
- [b a] = cheby2(6,40,[200 3000]/(Fs/2));
- %bpwr_lp = fir2([200,4000/(Fs/2));
- noise_bw = var(filter(b,a,randn(1,1E6)));
-
- rx_filt = filter(b, a, rx(1000:length(rx)));
- npower_window = 200*M;
- rx_power = conv(rx_filt.^2,ones(1,npower_window))/(npower_window);
- rx_power_dB = 10*log10(rx_power);
- figure;
- subplot(211)
- plot(rx_filt(1000:length(rx_filt)));
- title('GMSK Power (narrow filter)');
- subplot(212)
- plot(rx_power_dB);
- axis([1 length(rx_power) max(rx_power_dB)-29 max(rx_power_dB)+1])
- grid("minor")
-
- % Work out where to sample N, and S+N
-
- noise_end = preamble_location - 2*npreamble*M;
- noise_start = noise_end - Fs;
- if noise_start < 1
- printf("Hmm, we really need >1 second of noise only before preamble to measure noise!\n");
- else
- noise = mean(rx_power_dB(noise_start:noise_end));
- signal_noise_start = preamble_location + 2*npreamble*M;
- signal_noise_end = signal_noise_start + Fs;
- signal_noise = mean(rx_power_dB(signal_noise_start:signal_noise_end));
- hold on;
- plot([noise_start noise_end],[noise noise],'color','r','linewidth',5);
- plot([signal_noise_start signal_noise_end],[signal_noise signal_noise],'color','r','linewidth',5);
-
- % determine SNR
-
- noise_lin = 10 ^ (noise/10);
- signal_noise_lin = 10 ^ (signal_noise/10);
- signal_lin = signal_noise_lin - noise_lin;
- signal = 10*log10(signal_lin);
- snr = signal - noise;
- fudge_factor = 3; % 3dB for single/double sided noise adjustment? Just a guess
- CNo = snr + 10*log10(Fs*noise_bw) - fudge_factor;
- EbNo = CNo - 10*log10(Rs);
-
- EbNo_lin = 10 .^ (EbNo/10);
- alpha = 0.75; % guess for BT=0.5 GMSK
- ber_theory = 0.5*erfc(sqrt(alpha*EbNo_lin));
-
- printf("Estimated S: %3.1f N: %3.1f Nbw: %4.0f Hz SNR: %3.1f CNo: %3.1f EbNo: %3.1f BER theory: %f\n",
- signal, noise, Fs*noise_bw, snr, CNo, EbNo, ber_theory);
-
- % FM signal is centred on 12 kHz and 16 kHz wide so lets also work out noise there
-
- [b a] = cheby2(6,40,[12000-8000 12000+8000]/(Fs/2));
- noise_bw_fm = var(filter(b,a,randn(1,1E6)));
-
- rx_filt_fm = filter(b, a, rx(1000:length(rx)));
- rx_power_fm = conv(rx_filt_fm.^2,ones(1,npower_window))/(npower_window);
- rx_power_dB_fm = 10*log10(rx_power_fm);
-
- noise = mean(rx_power_dB_fm(noise_start:noise_end))*ones(1, length(rx_power_fm));
- noise_lin = 10 .^ (noise/10);
-
- signal_lin = rx_power_fm - noise_lin;
- signal = 10*log10(abs(signal_lin) + 1E-6);
- snr = signal - noise;
-
- CNo = snr + 10*log10(Fs*noise_bw_fm) - fudge_factor;
-
- figure
- plot(rx_power_dB_fm,'r;signal plus noise;');
- hold on;
- plot(CNo,'g;C/No;');
- hold off;
- top_fm = ceil(max(CNo)/10)*10;
- axis([1 length(rx_power_dB_fm) 20 top_fm])
- grid("minor")
- legend("boxoff");
- title('FM C/No');
- end
-
- % spectrum of a chunk of GMSK signal just after preamble
-
- plot_spectrum(gmsk_states, rx, preamble_location, "GMSK rx just after preamble");
-
- % correct freq offset and demodulate
-
- w_est = (0:nsam-1)*2*pi*freq_offset_est/Fs;
- rxbb = rxbb.*exp(-j*w_est);
- st = preamble_location+npreamble*M;
- %en = min(nsam,st + 4*framesize*M);
- en = nsam;
- gmsk_statres.verbose = 2;
- [rx_bits rx_out rx_filt] = gmsk_demod(gmsk_states, rxbb(st:en));
- nframes_rx = length(rx_bits)/framesize;
-
- % count errors
-
- [total_errors total_bits Nerrs_log Nerrs_all_log errors_log] = coarse_sync_ber(nframes_rx, tx_frame, rx_bits);
-
- ber = total_errors/total_bits;
-
- printf("Nframes: %d Nbits: %d Nerrs: %d BER: %f\n",
- nframes_rx, total_bits, total_errors, ber);
-
- % Optionally save a file of bit errors so we can simulate the effect on Codec 2
-
- if nargin == 2
-
- % To simulate effects of these errors on Codec 2:
- % $ ~/codec2-dev/octave$ ../build_linux/src/c2enc 1300 ../raw/hts1raw - | ../build_linux/src/insert_errors - - ssb7dbSNR.err 52 | ../build_linux/src/c2dec 1300 - - | play -t raw -r 8000 -s -2 -
- % Note in this example I'm using the 1300 bit/s codec, it's sig more robust that 1200 bit/s,
- % if we ran the GMSK modem at 1300 bit/s there would be a 10*log10(1300/1200) = 0.35dB SNR penalty
-
- fep=fopen(err_file_name,"wb"); fwrite(fep, errors_log, "short"); fclose(fep);
- end
-
- figure;
- clf
- subplot(211)
- plot(Nerrs_log,'r;errors/frame counted for BER;');
- hold on;
- plot(Nerrs_all_log,'g;all errors/frame;');
- hold on;
- title('Bit Errors')
- legend("boxoff");
- subplot(212)
- stem(real(cumsum(Nerrs_log)))
- title('Cumulative Bit Errors')
-endfunction
-
-
-%run_gmsk_single
-%run_gmsk_curves
-%run_gmsk_init
-%run_test_channel_impairments
-gmsk_tx("test_gmsk.raw")
-gmsk_rx("test_gmsk.raw")
-%gmsk_rx("ssb25db.wav")
-%gmsk_rx("~/Desktop/ssb_fm_gmsk_high.wav")
-%gmsk_rx("~/Desktop/test_gmsk_28BER.raw")
-%gmsk_rx("~/Desktop/gmsk_rec_reverse.wav")
-
diff --git a/octave/hackrf_dc.m b/octave/hackrf_dc.m
deleted file mode 100644
index a204e70..0000000
--- a/octave/hackrf_dc.m
+++ /dev/null
@@ -1,26 +0,0 @@
-% hackrf_dc.m
-%
-% David Rowe Nov 2015
-%
-% Downconverts a HackRF IQ sample file to a lower sample rate
-%
-% To sample a -60dB signal:
-% $ hackrf_transfer -r df1.iq -f 439200000 -n 10000000 -l 20 -g 40play file at 10.7MHz used:
-% octave:25> d = hackrf_dc("df1.iq")
-
-function d = hackrf_dc(infilename)
- Fs1 = 10E6; % input sample rate to HackRF
- Fs2 = 96E3; % output sample rate
- fc = 700E3; % offset to shift input by, HackRF doesn't like signals in the centre
-
- s1 = load_hackrf(infilename);
- ls1 = length(s1);
- ls1 = 20*Fs1;
- t = 0:ls1-1;
-
- % shift down to baseband from Fc, not sure of rot90 rather than trasnpose operator '
- % to avoid unwanted complex conj
-
- s2 = rot90(s1(1:ls1)) .* exp(-j*2*pi*t*fc/Fs1);
- d = resample(s2, Fs2, Fs1);
-end
diff --git a/octave/hackrf_twotone.m b/octave/hackrf_twotone.m
deleted file mode 100644
index 1d5aa02..0000000
--- a/octave/hackrf_twotone.m
+++ /dev/null
@@ -1,24 +0,0 @@
-% hackrf_twotone.m
-%
-% David Rowe Nov 2015
-%
-% Generates a two tone test signal that can be played out of HackRF
-%
-% To play file at 10.7MHz used:
-% $ hackrf_transfer -t ../octave/twotone.iq -f 10000000 -a 0 -x 47
-%
-% However 2nd harmonic at 21.4 was only -32dBC so not really useful for my application
-% in testing an ADC
-
-Fs = 8E6;
-fc = 2E6;
-f1 = fc;
-f2 = fc+1E3;
-A = 127;
-T = 2;
-
-N = T*Fs;
-t = 0:N-1;
-%s = A*exp(j*2*pi*t*f1/Fs) + A*exp(j*2*pi*t*f2/Fs);
-s = A*exp(j*2*pi*t*f2/Fs);
-save_hackrf("twotone.iq",s);
diff --git a/octave/hackrf_uc.m b/octave/hackrf_uc.m
deleted file mode 100644
index 0f55bd1..0000000
--- a/octave/hackrf_uc.m
+++ /dev/null
@@ -1,47 +0,0 @@
-% hackrf_uc.m
-%
-% David Rowe Nov 2015
-%
-% Upconverts a real baseband sample file to a file suitable for input into a HackRF
-%
-% To play file at 10.7MHz used:
-% octave:25> hackrf_uc("fsk_10M.iq","fsk_horus_rx_1200_96k.raw")
-% $ hackrf_transfer -t ../octave/fsk_10M.iq -f 10000000 -a 1 -x 40
-
-function hackrf_uc(outfilename, infilename)
- pkg load signal;
- Fs1 = 48E3; % input sample rate
- Fs2 = 10E6; % output sample rate to HackRF
- fc = 700E3-24E3; % offset to shift to, HackRF doesn't like signals in the centre
- A = 100; % amplitude of signal after upc-nversion (max 127)
- N = Fs1*20;
-
- fin = fopen(infilename,"rb");
- printf("1\n");
- s1 = fread(fin,"short");
- printf("1\n");
- fclose(fin);
- printf("1\n");
- ls1 = length(s1);
- printf("1\n");
- N = ls1;
- % single sided freq shifts, we don't want DSB
- printf("1\n");
- s1 = hilbert(s1(1:N));
-
- % upsample to Fs2
-
- M = Fs2/Fs1;
- s2 = resample(s1(1:N),Fs2,Fs1);
- ls2 = length(s2);
- mx = max(abs(s2));
- t = 0:ls2-1;
- printf("2\n");
- % shift up to Fc, note use of rot90 rather than trasnpose operator '
- % as we don't want complex conj, that would shift down in freq
-
- sout = rot90((A/mx)*s2) .* exp(j*2*pi*t*fc/Fs2);
-
- save_hackrf(outfilename,sout);
-
-end
diff --git a/octave/hf_modem_curves.m b/octave/hf_modem_curves.m
deleted file mode 100644
index d98d40e..0000000
--- a/octave/hf_modem_curves.m
+++ /dev/null
@@ -1,272 +0,0 @@
-% hf_modem_curves
-% David Rowe Feb 2017
-%
-% Ideal implementations of a bunch of different HF modems, used to
-% generate plots for a blog post.
-
-#{
- [X] ideal AWGN/HF curves
- [X] exp AWGN QPSK curves
- [X] exp AWGN DQPSK curves
- [X] exp HF channel model
- [ ] diversity
- [ ] COHPSK frames
- + would require multiple carriers
- + filtering or OFDM
-#}
-
-1;
-
-% Gray coded QPSK modulation function
-
-function symbol = qpsk_mod(two_bits)
- two_bits_decimal = sum(two_bits .* [2 1]);
- switch(two_bits_decimal)
- case (0) symbol = 1;
- case (1) symbol = j;
- case (2) symbol = -j;
- case (3) symbol = -1;
- endswitch
-endfunction
-
-
-% Gray coded QPSK demodulation function
-
-function two_bits = qpsk_demod(symbol)
- bit0 = real(symbol*exp(j*pi/4)) < 0;
- bit1 = imag(symbol*exp(j*pi/4)) < 0;
- two_bits = [bit1 bit0];
-endfunction
-
-
-% Rate Rs modem simulation model -------------------------------------------------------
-
-function sim_out = ber_test(sim_in)
- bps = 2; % two bits/symbol for QPSK
- Rs = 50; % symbol rate (needed for HF model)
-
- verbose = sim_in.verbose;
- EbNovec = sim_in.EbNovec;
- hf_en = sim_in.hf_en;
-
- % user can supply number of bits per point to get good results
- % at high Eb/No
-
- if length(sim_in.nbits) > 1
- nbitsvec = sim_in.nbits;
- nbitsvec += 100 - mod(nbitsvec,100); % round up to nearest 100
- else
- nbitsvec(1:length(EbNovec)) = sim_in.nbits;
- end
-
- % init HF model
-
- if hf_en
-
- % some typical values
-
- dopplerSpreadHz = 1.0; path_delay = 1E-3*Rs;
-
- nsymb = max(nbitsvec)/2;
- spread1 = doppler_spread(dopplerSpreadHz, Rs, nsymb);
- spread2 = doppler_spread(dopplerSpreadHz, Rs, nsymb);
- hf_gain = 1.0/sqrt(var(spread1)+var(spread2));
- % printf("nsymb: %d lspread1: %d\n", nsymb, length(spread1));
- end
-
- for ne = 1:length(EbNovec)
-
- % work out noise power -------------
-
- EbNodB = EbNovec(ne);
- EsNodB = EbNodB + 10*log10(bps);
- EsNo = 10^(EsNodB/10);
- variance = 1/EsNo;
- nbits = nbitsvec(ne);
- nsymb = nbits/bps;
-
- % modulator ------------------------
-
- tx_bits = rand(1,nbits) > 0.5;
- tx_symb = [];
- prev_tx_symb = 1;
- for s=1:nsymb
- atx_symb = qpsk_mod(tx_bits(2*s-1:2*s));
- if sim_in.dqpsk
- atx_symb *= prev_tx_symb;
- prev_tx_symb = atx_symb;
- end
- tx_symb = [tx_symb atx_symb];
- end
-
- % channel ---------------------------
-
- rx_symb = tx_symb;
-
- if hf_en
-
- % simplified rate Rs simulation model that doesn't include
- % ISI, just freq filtering. We assume perfect phase estimation
- % so it's just amplitude distortion.
-
- hf_model1 = hf_model2 = zeros(1, nsymb);
- for s=1:nsymb
- hf_model1(s) = hf_gain*(spread1(s) + exp(-j*path_delay)*spread2(s));
- hf_model = abs(hf_model1(s));
-
- if sim_in.diversity
- % include amplitude information from another frequency in channel model
- w1 = 7*2*pi;
- hf_model2(s) = hf_gain*(spread1(s) + exp(-j*w1*path_delay)*spread2(s));
- hf_model = 0.5*abs(hf_model1(s)) + 0.5*abs(hf_model2(s));
- end
-
- rx_symb(s) = rx_symb(s).*hf_model;
- end
- end
-
- % variance is noise power, which is divided equally between real and
- % imag components of noise
-
- noise = sqrt(variance*0.5)*(randn(1,nsymb) + j*randn(1,nsymb));
- rx_symb += noise;
-
- % demodulator ------------------------------------------
-
- % demodulate rx symbols to bits
-
- rx_bits = [];
- prev_rx_symb = 1;
- for s=1:nsymb
- arx_symb = rx_symb(s);
- if sim_in.dqpsk
- tmp = arx_symb;
- arx_symb *= prev_rx_symb';
- prev_rx_symb = tmp;
- end
- two_bits = qpsk_demod(arx_symb);
- rx_bits = [rx_bits two_bits];
- end
-
- % count errors -----------------------------------------
-
- error_pattern = xor(tx_bits, rx_bits);
- nerrors = sum(error_pattern);
- bervec(ne) = nerrors/nbits;
- if verbose
- printf("EbNodB: % 3.1f nbits: %5d nerrors: %5d ber: %4.3f\n", EbNodB, nbits, nerrors, bervec(ne));
- if verbose == 2
- figure(2); clf;
- plot(rx_symb*exp(j*pi/4),'+','markersize', 10);
- mx = max(abs(rx_symb));
- axis([-mx mx -mx mx]);
- if sim_in.diversity && sim_in.hf_en
- figure(3);
- plot(1:nsymb, abs(hf_model1), 1:nsymb, abs(hf_model2), 'linewidth', 2);
- end
- end
- end
- end
-
- sim_out.bervec = bervec;
-endfunction
-
-
-% -------------------------------------------------------------
-
-
-function run_single
- sim_in.verbose = 2;
- sim_in.nbits = 1000;
- sim_in.EbNovec = 4;
- sim_in.dqpsk = 0;
- sim_in.hf_en = 0;
- sim_in.diversity = 0;
-
- sim_qpsk = ber_test(sim_in);
-endfunction
-
-
-function run_curves
- max_nbits = 1E5;
- sim_in.verbose = 1;
- sim_in.EbNovec = 0:10;
- sim_in.dqpsk = 0;
- sim_in.hf_en = 0;
- sim_in.diversity = 0;
-
- % AWGN -----------------------------
-
- ber_awgn_theory = 0.5*erfc(sqrt(10.^(sim_in.EbNovec/10)));
- sim_in.nbits = min(max_nbits, floor(500 ./ ber_awgn_theory));
-
- sim_qpsk = ber_test(sim_in);
- sim_in.dqpsk = 1;
- sim_dqpsk = ber_test(sim_in);
-
- % HF -----------------------------
-
- hf_sim_in = sim_in; hf_sim_in.dqpsk = 0; hf_sim_in.hf_en = 1;
- hf_sim_in.EbNovec = 0:16;
-
- EbNoLin = 10.^(hf_sim_in.EbNovec/10);
- ber_hf_theory = 0.5.*(1-sqrt(EbNoLin./(EbNoLin+1)));
-
- hf_sim_in.nbits = min(max_nbits, floor(500 ./ ber_hf_theory));
- sim_qpsk_hf = ber_test(hf_sim_in);
-
- hf_sim_in.dqpsk = 1;
- sim_dqpsk_hf = ber_test(hf_sim_in);
-
- hf_sim_in.dqpsk = 0;
- hf_sim_in.diversity = 1;
- sim_qpsk_hf_div = ber_test(hf_sim_in);
-
- % Plot results --------------------
-
- close all;
- figure (1, 'position', [100, 10, 600, 400]); clf;
-
- semilogy(sim_in.EbNovec, ber_awgn_theory,'r+-;QPSK AWGN theory;', 'linewidth', 2)
- xlabel('Eb/No (dB)')
- ylabel('BER')
- grid("minor")
- axis([min(sim_in.EbNovec) max(sim_in.EbNovec) 1E-3 1])
- hold on;
-
- semilogy([0 4 4], [ber_awgn_theory(5) ber_awgn_theory(5) 1E-3],'k--', 'linewidth', 2);
- hold off;
-
- figure (2, 'position', [300, 10, 600, 400]); clf;
- semilogy(sim_in.EbNovec, ber_awgn_theory,'r+-;QPSK AWGN theory;','markersize', 10, 'linewidth', 2)
- hold on;
- semilogy(sim_in.EbNovec, sim_qpsk.bervec,'g+-;QPSK AWGN simulated;','markersize', 10, 'linewidth', 2)
- semilogy(sim_in.EbNovec, sim_dqpsk.bervec,'b+-;DQPSK AWGN simulated;','markersize', 10, 'linewidth', 2)
- xlabel('Eb/No (dB)')
- ylabel('BER')
- grid("minor")
- axis([min(sim_in.EbNovec) max(sim_in.EbNovec) 1E-3 1])
-
- figure (3, 'position', [400, 10, 600, 400]); clf;
- semilogy(sim_in.EbNovec, ber_awgn_theory,'r+-;QPSK AWGN theory;','markersize', 10, 'linewidth', 2)
- hold on;
- semilogy(sim_in.EbNovec, sim_qpsk.bervec,'g+-;QPSK AWGN simulated;','markersize', 10, 'linewidth', 2)
- semilogy(sim_in.EbNovec, sim_dqpsk.bervec,'b+-;DQPSK AWGN simulated;','markersize', 10, 'linewidth', 2)
- semilogy(hf_sim_in.EbNovec, ber_hf_theory,'r+-;QPSK HF theory;','markersize', 10, 'linewidth', 2)
- semilogy(hf_sim_in.EbNovec, sim_dqpsk_hf.bervec,'b+-;DQPSK HF simulated;','markersize', 10, 'linewidth', 2)
- semilogy(hf_sim_in.EbNovec, sim_qpsk_hf.bervec,'g+-;QPSK HF simulated;','markersize', 10, 'linewidth', 2)
- semilogy(hf_sim_in.EbNovec, sim_qpsk_hf_div.bervec,'c+-;QPSK Diversity HF simulated;','markersize', 10, 'linewidth', 2)
- hold off;
- xlabel('Eb/No (dB)')
- ylabel('BER')
- grid("minor")
- axis([min(hf_sim_in.EbNovec) max(hf_sim_in.EbNovec) 1E-3 1])
-
-endfunction
-
-% -------------------------------------------------------------
-
-more off;
-rand('seed',1); randn('seed', 1);
-run_curves
-#run_single
diff --git a/octave/hf_sim.m b/octave/hf_sim.m
deleted file mode 100644
index c9105c0..0000000
--- a/octave/hf_sim.m
+++ /dev/null
@@ -1,78 +0,0 @@
-% hf_sim.m
-% David Rowe March 2014
-%
-% Two path CCIR poor HF channel simulation, with apaologies to PathSim
-
-% Init HF channel model from stored sample files of spreading signal ----------------------------------
-
-global spread;
-global spread_2ms;
-global hf_gain;
-
-% convert "spreading" samples from 1kHz carrier at Fs to complex
-% baseband, generated by passing a 1kHz sine wave through PathSim with
-% the ccir-poor model, enabling one path at a time. Because I'm too
-% lazy to generate my own spreading signals
-
-Fc = 1000; Fs=8000;
-fspread = fopen("../raw/sine1k_2Hz_spread.raw","rb");
-spread1k = fread(fspread, "int16")/10000;
-fclose(fspread);
-fspread = fopen("../raw/sine1k_2ms_delay_2Hz_spread.raw","rb");
-spread1k_2ms = fread(fspread, "int16")/10000;
-fclose(fspread);
-
-% down convert to complex baseband
-
-spreadbb = spread1k.*exp(-j*(2*pi*Fc/Fs)*(1:length(spread1k))');
-spreadbb_2ms = spread1k_2ms.*exp(-j*(2*pi*Fc/Fs)*(1:length(spread1k_2ms))');
-
-% remove -2000 Hz image
-
-b = fir1(50, 5/Fs);
-spread = filter(b,1,spreadbb);
-spread_2ms = filter(b,1,spreadbb_2ms);
-
-% discard first 1000 samples as these were near 0, probably as
-% PathSim states were ramping up
-
-spread = spread(1000:length(spread));
-spread_2ms = spread_2ms(1000:length(spread_2ms));
-
-hf_gain = 1.0/sqrt(var(spread)+var(spread_2ms));
-
-% This function simulates the HF channel at 8kHz for real signals. A
-% good use case is passing a vector of speech samples through it to
-% simulate SSB over HF. There's a really good reason for the 300 -
-% 3000 Hz filter that escapes me right now :-)
-
-function [sim_out snr3kHz_measured ] = hf_sim_real(sim_in, snr3kHz)
-
- % 300 - 3000 Hz filter
-
- b = fir1(100,[300/4000, 3000/4000], 'pass');
-
- % det power of unit variance noise passed through this filter
-
- filter_var = var(filter(b,1,randn(1000,1)));
-
- % Start simulation
-
- s = hilbert(filter(b,1,sim_in));
- n1 = length(s); n2 = length(spread);
- n = min(n1,n2);
- path1 = s(1:n) .* spread(1:n);
- path2 = s(1:n) .* spread_2ms(1:n);
- delay = floor(0.002*Fs);
-
- combined = path1(delay+1:n) + path2(1:n-delay);
-
- snr = 10 .^ (snr3kHz/10);
- variance = (combined'*combined)/(snr*n);
- noise = sqrt(variance*0.5/filter_var)*(randn(n-delay,1) + j*randn(n-delay,1));
- filtered_noise = filter(b,1,noise);
-
- sim_out = real(combined+filtered_noise);
- snr3kHz_measured = 10*log10(var(real(combined))/var(real(filtered_noise)));
-endfunction
-
diff --git a/octave/horus_msg.txt b/octave/horus_msg.txt
deleted file mode 100644
index 882a9b3..0000000
--- a/octave/horus_msg.txt
+++ /dev/null
@@ -1 +0,0 @@
- 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 1.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00
diff --git a/octave/hp_filt.m b/octave/hp_filt.m
deleted file mode 100644
index 1087bb9..0000000
--- a/octave/hp_filt.m
+++ /dev/null
@@ -1,12 +0,0 @@
-% hp_filt.m
-% David Rowe 20 Feb 2012
-
-function hp_filt(in_file, out_file)
- fin = fopen(in_file,"rb");
- s = fread(fin,Inf,"short");
- b = fir1(256, 300/4000, "high");
- freqz(b);
- s_hpf = filter(b,1,s);
- fout = fopen(out_file,"wb");
- fwrite(fout, s_hpf, "short");
-endfunction
diff --git a/octave/impulse_noise.m b/octave/impulse_noise.m
deleted file mode 100644
index dee5c5d..0000000
--- a/octave/impulse_noise.m
+++ /dev/null
@@ -1,122 +0,0 @@
-% impulse_noise
-% David Rowe May 2017
-%
-% Experiments with impulsive noise and HF radio
-
-format;
-more off;
-rand('seed',1)
-
-% DFT function ------------------------------------------------
-% note k is on 0..K-1 format, unlike Octave fft() which is 1..K
-
-function H = calc_H(k, K, a, d)
- L = length(d);
- H = 0;
- for i=1:L
- H += a(i)*exp(-j*2*pi*k*d(i)/K);
- end
-endfunction
-
-% -----------------------------------------
-% PWM noise simulation
-% -----------------------------------------
-
-function pwm_noise
-
- Fs = 10E6; % sample rate of simulation
- Fsig = 1E6; % frequency of our wanted signal
- Fpwm = 255E3; % switcher PWM frequency
- T = 1; % length of simulations in seconds
- Nsam = T*Fs;
- Nsamplot = 200;
- Apwm = 0.1;
- Asig = -40; % attenuation of wanted signal in dB
-
- % generate an impulse train with jitter to simulate switcher noise
-
- pwm = zeros(1,Fs);
- Tpwm = floor(Fs/Fpwm);
- pulse_positions_pwm = Tpwm*(1:T*Fpwm) + round(rand(1,T*Fpwm));
-
- h_pwm = zeros(1,Nsam);
- h_pwm(pulse_positions_pwm) = Apwm;
- h_pwm = h_pwm(1:Nsam);
-
- % add in wanted signal and computer amplitude spectrum
-
- s = 10^(Asig/20)*cos(2*pi*Fsig*(1:Nsam)/Fs);
-
- h = h_pwm+s;
- H = fft(h);
- Hdb = 20*log10(abs(H)) - 20*log10(Nsam/2);
-
- figure(1); clf;
- subplot(211)
- plot(h(1:Nsamplot));
- subplot(212)
- plot(Hdb(1:Nsam/2));
- axis([0 T*2E6 -120 0]); xlabel('Frequency Hz'); ylabel('Amplityude dBV'); grid;
-
- printf("pwm rms: %f signal rms: %f noise rms\n", std(h_pwm), std(s));
-endfunction
-
-% -----------------------------------------
-% Single pulse noise simulation
-% -----------------------------------------
-
-function pulse_noise
-
- % set up short pulse in wide window, consisting of two samples next
- % to each other
-
- K = 1024;
- a(1) = a(2) = 1; d(1) = 10; d(2) = d(1)+1;
- h = zeros(1,K);
- h(d(1)) = a(1);
- h(d(2)) = a(2);
-
- % mag and phase spectrum, mag spectrum changes slowly
-
- figure(2); clf;
- Hfft = fft(h);
- subplot(311)
- stem(h(1:100));
- axis([1 100 -0.2 1.2]);
- subplot(312)
- plot(abs(Hfft(1:K/2)),'+');
- title('Magnitude');
- subplot(313)
- plot(angle(Hfft(1:K/2)),'+');
- title('Phase');
-
- % simple test to estimate H(k+1) from H(k) --------------------
-
- % brute force calculation
-
- k = 300;
- H = zeros(1,K);
- H(k-1) = calc_H(k-1, K, a, d);
- H(k) = calc_H(k, K, a, d);
- H(k+1) = calc_H(k+1, K, a, d);
-
- % calculation of k+1 from k using approximation that {d(i)} are
- % close together compared to M, i.e it's a narrow pulse (assumes we
- % can estimate d using other means)
-
- Hk1_ = exp(-j*2*pi*d(1)/K)*H(k);
-
- % plot zoomed in version around k to compare
-
- figure(3); clf;
- plot(H(k-1:k+1),'b+','markersize', 10, 'linewidth', 2);
- hold on; plot(Hk1_,'g+','markersize', 10, 'linewidth', 2); hold off;
- title('H(k-1) .... H(k+1)');
- printf("H(k+1) match: %f dB\n", 20*log10(abs(H(k+1) - Hk1_)));
-endfunction
-
-% Run various simulations here ---------------------------------------------
-
-%pwm_noise
-pulse_noise
-
diff --git a/octave/ldpc_gen_c_h_file.m b/octave/ldpc_gen_c_h_file.m
deleted file mode 100644
index 4e9aca1..0000000
--- a/octave/ldpc_gen_c_h_file.m
+++ /dev/null
@@ -1,142 +0,0 @@
-% ldpc_gen_c_h_file.m
-% David Rowe Sep 2015, B. Van Slyke 2019
-%
-% Create .c and h files for use in LDPC decoders
-%
-% NOTE: You'll need to install the CML library as a number of functions involved
-% in LDPC use it. See ldpc.m for instructions in installing the CML
-% library.
-%
-% usage examples:
-%
-% 1/ Using codes defined in external files:
-%
-% octave:1> ldpc_gen_c_h_file("HRA_112_112.txt")
-% octave:1> ldpc_gen_c_h_file(""H_4096_8192_3d.mat")
-%
-% 2/ Using built in CML codes:
-%
-% octave:1> ldpc_gen_c_h_file("dvbs2", 0.6, 16200)
-%
-% Output: Two files with the same filename as the LDPC input, but with .c and .h
-% extensions.
-
-function ldpc_gen_c_h_file(varargin)
-
- ldpc % load ldpc functions
- ldpc_fsk_lib % for ldpc_encode
-
- % Assuming cml has been installed in the users' home folder, which is the
- % default install location
- init_cml();
-
- if nargin == 0
- printf("Error - you must specify a file containing the LDPC codes (e.g. HRA_112_112.txt).\n");
- return;
- end
- loadStr = varargin{1};
-
- max_iterations = 100;
- decoder_type = 0;
- % the tests are performed using BPSK modulation, but in practice codes can be used
- % with other modulation, e.g. QPSK
- mod_order = 2; modulation = 'BPSK'; mapping = 'gray';
-
- if strcmp(loadStr, "dvbs2")
- rate = varargin{2};
- framesize = varargin{3};
- code_param = ldpc_init_builtin(loadStr, rate, framesize, modulation, mod_order, mapping);
- n = code_param.ldpc_coded_bits_per_frame;
- k = code_param.ldpc_data_bits_per_frame;
- ldpcArrayName = sprintf("H_%d_%d",n,k);
- includeFileName = strcat(ldpcArrayName, '.h');
- sourceFileName = strcat(ldpcArrayName, '.c');
- else
- % The ldpc variable name may not be what we want for a file/variable names, but
- % the load filename will be, so use it.
- [~,ldpcArrayName,ext] = fileparts(loadStr);
- includeFileName = strcat(ldpcArrayName, '.h');
- sourceFileName = strcat(ldpcArrayName, '.c');
-
- % Get the ext of the file first. If it's a txt, then do what we
- % are doing. If .mat, then just load, knowing the variable is HRA
- if strcmp(ext, '.mat') == 1
- load(loadStr);
- if exist("H") & !exist("HRA")
- printf("renaming H to HRA...\n");
- HRA=H;
- end
- else
- % When calling 'load' this way, it returns a struct. The code assumes the
- % struct has one element, and the one/first element is the array
- % to process
- tempStruct = load(loadStr);
- b = fieldnames(tempStruct);
- ldpcArrayName = b{1,1};
- % extract the array from the struct
- HRA = tempStruct.(ldpcArrayName);
- endif
-
- code_param = ldpc_init_user(HRA, modulation, mod_order, mapping);
- end
-
- code_length = code_param.coded_syms_per_frame;
-
- % First, create the H file
- f = fopen(includeFileName, "wt");
- printHeader(f, includeFileName, ldpcArrayName, mfilename());
-
- fprintf(f,"#define %s_NUMBERPARITYBITS %d\n", ldpcArrayName, rows(code_param.H_rows));
- fprintf(f,"#define %s_MAX_ROW_WEIGHT %d\n", ldpcArrayName, columns(code_param.H_rows));
- fprintf(f,"#define %s_CODELENGTH %d\n", ldpcArrayName, code_param.coded_syms_per_frame);
- fprintf(f,"#define %s_NUMBERROWSHCOLS %d\n", ldpcArrayName, rows(code_param.H_cols));
- fprintf(f,"#define %s_MAX_COL_WEIGHT %d\n", ldpcArrayName, columns(code_param.H_cols));
- fprintf(f,"#define %s_DEC_TYPE %d\n", ldpcArrayName, decoder_type);
- fprintf(f,"#define %s_MAX_ITER %d\n", ldpcArrayName, max_iterations);
- fprintf(f,"\n");
- fprintf(f,"extern const uint16_t %s_H_rows[];\n", ldpcArrayName);
- fprintf(f,"extern const uint16_t %s_H_cols[];\n", ldpcArrayName);
-
- fclose(f);
-
-
- % Then, the C file
- f = fopen(sourceFileName, "wt");
- printHeader(f, sourceFileName, ldpcArrayName, mfilename());
- fprintf(f, "#include <stdint.h>\n");
- fprintf(f, "#include \"%s\"\n", includeFileName);
-
- % clock out 2D array to linear C array in row order ....
- fprintf(f,"\nconst uint16_t %s_H_rows[] = {\n", ldpcArrayName);
- [r c] = size(code_param.H_rows);
- for j=1:c
- for i=1:r
- fprintf(f, "%d", code_param.H_rows(i,j));
- if (i == r) && (j ==c) % weird, this does nothing
- fprintf(f,"\n};\n");
- else
- fprintf(f,", ");
- end
- end
- end
-
- fprintf(f,"\nconst uint16_t %s_H_cols[] = {\n", ldpcArrayName);
- [r c] = size(code_param.H_cols);
- for j=1:c
- for i=1:r
- fprintf(f, "%d", code_param.H_cols(i,j));
- if (i == r) && (j == c)
- fprintf(f,"\n};\n");
- else
- fprintf(f,", ");
- end
- end
- end
-
- fclose(f);
-endfunction
-
-function printHeader(f, includeFileName, ldpcArrayName, mFilename)
- fprintf(f, "/*\n FILE....: %s\n\n", includeFileName);
- fprintf(f, " Static arrays for LDPC codec %s, generated by %s.m.\n*/\n\n", ldpcArrayName, mFilename);
-endfunction
diff --git a/octave/ldpc_gen_h_file.m b/octave/ldpc_gen_h_file.m
deleted file mode 100644
index edda815..0000000
--- a/octave/ldpc_gen_h_file.m
+++ /dev/null
@@ -1,72 +0,0 @@
-% ldpc_gen_h_file.m
-% David Rowe Sep 2015
-%
-% Create a C include file for use in mpdecode.c C cmd line LDPC decoder
-
-function ldpc_gen_h_file(code_param, max_iterations, decoder_type, input_decoder_c, x_hat, detected_data)
-
- f = fopen(code_param.c_include_file, "wt");
-
- fprintf(f, "/*\n FILE....: %s\n\n Static arrays for LDPC codec, generated", code_param.c_include_file);
- fprintf(f, "\n ldpc_gen_h_file.m.\n\n*/\n\n");
-
- fprintf(f,"#define NUMBERPARITYBITS %d\n", rows(code_param.H_rows));
- fprintf(f,"#define MAX_ROW_WEIGHT %d\n", columns(code_param.H_rows));
- fprintf(f,"#define CODELENGTH %d\n", code_param.symbols_per_frame);
- fprintf(f,"#define NUMBERROWSHCOLS %d\n", rows(code_param.H_cols));
- fprintf(f,"#define MAX_COL_WEIGHT %d\n", columns(code_param.H_cols));
- fprintf(f,"#define DEC_TYPE %d\n", decoder_type);
- fprintf(f,"#define MAX_ITER %d\n", max_iterations);
-
- fprintf(f,"\ndouble H_rows[] = {\n");
-
- % clock out 2D array to linear C array in row order ....
-
- [r c] = size(code_param.H_rows);
- for j=1:c
- for i=1:r
- fprintf(f, "%d", code_param.H_rows(i,j));
- if (i == r) && (j ==c)
- fprintf(f,"\n};\n");
- else
- fprintf(f,", ");
- end
- end
- end
-
- fprintf(f,"\ndouble H_cols[] = {\n");
- [r c] = size(code_param.H_cols);
- for j=1:c
- for i=1:r
- fprintf(f, "%d", code_param.H_cols(i,j));
- if (i == r) && (j == c)
- fprintf(f,"\n};\n");
- else
- fprintf(f,", ");
- end
- end
- end
-
- fprintf(f,"\ndouble input[] = {\n");
- for i=1:length(input_decoder_c)
- fprintf(f, "%.17g", input_decoder_c(i));
- if i == length(input_decoder_c)
- fprintf(f,"\n};\n");
- else
- fprintf(f,", ");
- end
- end
-
- fprintf(f,"\nchar detected_data[] = {\n");
- for i=1:length(detected_data)
- fprintf(f, "%d", detected_data(i));
- if i == length(detected_data)
- fprintf(f,"\n};\n");
- else
- fprintf(f,", ");
- end
- end
-
- fclose(f);
-end
-
diff --git a/octave/load_comp.m b/octave/load_comp.m
deleted file mode 100644
index b9fa686..0000000
--- a/octave/load_comp.m
+++ /dev/null
@@ -1,9 +0,0 @@
-% load_comp.m
-% David Rowe Sep 2015
-
-function s = load_comp(fn)
- fs=fopen(fn,"rb");
- s = fread(fs,Inf,"float32");
- ls = length(s);
- s = s(1:2:ls) + j*s(2:2:ls);
-endfunction
diff --git a/octave/load_f32.m b/octave/load_f32.m
deleted file mode 100644
index df76c8b..0000000
--- a/octave/load_f32.m
+++ /dev/null
@@ -1,14 +0,0 @@
-% load_f32.m
-% David Rowe Jan 2019
-%
-% load up .f32 binary files from dump_data
-
-function features = load_f32(fn, ncols)
- f=fopen(fn,"rb");
- features_lin=fread(f, 'float32');
- fclose(f);
-
- nrows = length(features_lin)/ncols;
- features = reshape(features_lin, ncols, nrows);
- features = features';
-endfunction
diff --git a/octave/load_hackrf.m b/octave/load_hackrf.m
deleted file mode 100644
index 85bfb73..0000000
--- a/octave/load_hackrf.m
+++ /dev/null
@@ -1,11 +0,0 @@
-% load_hackrf.m
-%
-% David Rowe Oct 2015
-
-function s = load_hackrf(fn)
- fs = fopen(fn,"rb");
- iq = fread(fs,Inf,"schar");
- fclose(fs);
- l = length(iq);
- s = iq(1:2:l) + j*iq(2:2:l);
-endfunction
diff --git a/octave/load_rtlsdr.m b/octave/load_rtlsdr.m
deleted file mode 100644
index 946cfb2..0000000
--- a/octave/load_rtlsdr.m
+++ /dev/null
@@ -1,11 +0,0 @@
-% load_rtlsdr.m
-%
-% David Rowe Oct 2015
-
-function s = load_rtlsdr(fn)
- fs = fopen(fn,"rb");
- iq = fread(fs,Inf,"uchar");
- fclose(fs);
- l = length(iq);
- s = iq(1:2:l) + j*iq(2:2:l);
-endfunction
diff --git a/octave/make_hilb.m b/octave/make_hilb.m
deleted file mode 100644
index 6c6323c..0000000
--- a/octave/make_hilb.m
+++ /dev/null
@@ -1,60 +0,0 @@
-% make_hilb.m
-% David Rowe May 2015
-%
-% creates Hilber Transformer FIR coeffs
-
-graphics_toolkit ("gnuplot");
-
-% from https://www.dsprelated.com/freebooks/sasp/Hilbert_Transform_Design_Example.html
-
-M = 257; % window length = FIR filter length (Window Method)
-fs = 8000; % sampling rate assumed (Hz)
-f1 = 100; % lower pass-band limit = transition bandwidth (Hz)
-beta = 8; % beta for Kaiser window for decent side-lobe rejection
-fn = fs/2; % Nyquist limit (Hz)
-f2 = fn - f1; % upper pass-band limit
-N = 2^(nextpow2(8*M)); % large FFT for interpolated display
-k1 = round(N*f1/fs); % lower band edge in bins
-if k1<2, k1=2; end; % cannot have dc or fn response
-kn = N/2 + 1; % bin index at Nyquist limit (1-based)
-k2 = kn-k1+1; % high-frequency band edge
-f1 = k1*fs/N % quantized band-edge frequencies
-f2 = k2*fs/N
-w = kaiser(M,beta)'; % Kaiser window in "linear phase form"
-H = [ ([0:k1-2]/(k1-1)).^8,ones(1,k2-k1+1),...
- ([k1-2:-1:0]/(k1-1)).^8, zeros(1,N/2-1)];
-h = ifft(H); % desired impulse response
-hodd = imag(h(1:2:N)); % This should be zero
-
-% put window in zero-phase form:
-wzp = [w((M+1)/2:M), zeros(1,N-M), w(1:(M-1)/2)];
-hw = wzp .* h; % single-sideband FIR filter, zero-centered
-Hw = fft(hw);
-hh = [hw(N-(M-1)/2+1:N),hw(1:(M+1)/2)]; % causal FIR
-hh *= 2;
-
-figure(1);
-HH = fft([hh,zeros(1,N-M)]);
-plot(20*log10(abs(HH)));
-figure(2);
-subplot(211); plot(real(hh)); title('real imp resp');
-subplot(212); plot(imag(hh)); title('imag imp resp');
-
-% save coeffs to a C header file
-
-f=fopen("../src/ht_coeff.h","wt");
-fprintf(f,"/* Hilbert Transform FIR filter coeffs */\n");
-fprintf(f,"/* Generated by make_hilb Octave script */\n");
-
-fprintf(f,"\n#define HT_N %d\n\n", M);
-
-fprintf(f,"COMP ht_coeff[]={\n");
-for r=1:M
- if r < M
- fprintf(f, " {%f,%f},\n", real(hh(r)), imag(hh(r)));
- else
- fprintf(f, " {%f,%f}\n};", real(hh(r)), imag(hh(r)));
- end
-end
-
-fclose(f);
diff --git a/octave/make_ssbfilt.m b/octave/make_ssbfilt.m
deleted file mode 100644
index bcd00f1..0000000
--- a/octave/make_ssbfilt.m
+++ /dev/null
@@ -1,39 +0,0 @@
-% make_ssbfilt.m
-% David Rowe May 2015
-%
-% Creates low pass filter coeff used to implement a SSB filter in ch
-
-graphics_toolkit ("gnuplot");
-
-ssbfilt_n = 100;
-ssbfilt_bw = 2400;
-ssbfilt_centre = 1500;
-Fs = 8000;
-
-ssbfilt_coeff = sbfilt_coeff = fir1(ssbfilt_n, ssbfilt_bw/Fs);
-
-figure(1)
-clf;
-h = freqz(ssbfilt_coeff,1,Fs/2);
-plot(20*log10(abs(h)))
-grid minor
-
-% save coeffs to a C header file
-
-f=fopen("../src/ssbfilt_coeff.h","wt");
-fprintf(f,"/* %d Hz LPF FIR filter coeffs */\n", ssbfilt_bw);
-fprintf(f,"/* Generated by make_ssbfilt Octave script */\n");
-
-fprintf(f,"\n#define SSBFILT_N %d\n\n", ssbfilt_n);
-fprintf(f,"\n#define SSBFILT_CENTRE %d\n\n", ssbfilt_centre);
-
-fprintf(f,"float ssbfilt_coeff[]={\n");
-for r=1:ssbfilt_n
- if r < ssbfilt_n
- fprintf(f, " %f,\n", ssbfilt_coeff(r));
- else
- fprintf(f, " %f\n};", ssbfilt_coeff(r));
- end
-end
-
-fclose(f);
diff --git a/octave/mancyfsk.m b/octave/mancyfsk.m
deleted file mode 100644
index 1ee24ef..0000000
--- a/octave/mancyfsk.m
+++ /dev/null
@@ -1,500 +0,0 @@
-% mancyfsk.m
-% David Rowe October 2015
-%
-% Manchester encoded 2FSK & 4FSK simulation.
-%
-% Attempt to design a FSK waveform that can pass through legacy FM
-% radios but still be optimally demodulated by SDRs. It doesn't have
-% to be optimally demodulated by legacy radios. Trick is getting it
-% to pass through 300-3000Hz audio filters in legacy radios.
-%
-% [X] code up modulator
-% [X] manchester two bit symbols
-% [X] plot spectrum
-% [X] demodulate using analog FM and ideal demods
-% [X] measure BER compared to ideal coherent FSK
-
-1;
-
-fm; % analog FM library
-
-
-function states = legacyfsk_init(M,Rs)
- Fs = states.Fs = 96000;
- states.Rs = Rs; % symbol rate over channel
- Ts = states.Ts = Fs/Rs; % symbol period in samples
- states.M = M; % mFSK, either 2 or 4
- bpsym = state.Rb = log2(M); % bits per symbol over channel
- rate = states.rate = 0.5; % Manchester code rate
- nbits = 100;
- nbits = states.nbits = 100; % number of payload data symbols/frame
- nbits2 = states.nbits2 = nbits/rate; % number of symbols/frame over channel after manchester encoding
- nsym = states.nsym = nbits2/log2(M); % number of symbols per frame
- nsam = states.nsam = nsym*Ts;
-
- %printf(" Rs: %d M: %d bpsym: %d nbits: %d nbits2: %d nsym: %d nsam: %d\n", Rs, M, bpsym, nbits, nbits2, nsym, nsam);
-
- states.fc = states.Fs/4;
- if states.M == 2
- states.f(1) = states.fc - Rs/2;
- states.f(2) = states.fc + Rs/2;
- else
- states.f(1) = states.fc - 3*Rs/2;
- states.f(2) = states.fc - Rs/2;
- states.f(3) = states.fc + Rs/2;
- states.f(4) = states.fc + 3*Rs/2;
- end
-endfunction
-
-
-% test modulator function
-
-function tx = legacyfsk_mod(states, tx_bits)
- Fs = states.Fs;
- Ts = states.Ts;
- Rs = states.Rs;
- f = states.f;
- M = states.M;
- nsym = states.nsym;
-
- tx = zeros(Ts*length(tx_bits)/log2(M),1);
- tx_phase = 0;
-
- step = log2(M);
- k = 1;
- for i=1:step:length(tx_bits)
- if M == 2
- tone = tx_bits(i) + 1;
- else
- tone = (tx_bits(i:i+1) * [2 1]') + 1;
- end
- tx_phase_vec = tx_phase + (1:Ts)*2*pi*f(tone)/Fs;
- tx((k-1)*Ts+1:k*Ts) = 2.0*cos(tx_phase_vec); k++;
- tx_phase = tx_phase_vec(Ts) - floor(tx_phase_vec(Ts)/(2*pi))*2*pi;
- end
-
-endfunction
-
-
-function run_sim(sim_in)
-
- frames = sim_in.frames;
- test_frame_mode = sim_in.test_frame_mode;
- M = sim_in.M;
- Rs = sim_in.Rs;
- demod = sim_in.demod;
- EbNodB = sim_in.EbNodB;
- timing_offset = sim_in.timing_offset;
-
- % rx timing has been adjusted experimentally
-
- if Rs == 4800
- if demod == 1
- rx_timing = 4;
- else
- rx_timing = 0;
- end
- end
- if Rs == 2400
- if demod == 1
- rx_timing = 40;
- else
- rx_timing = 0;
- end
- end
-
- % init fsk modem
-
- more off
- rand('state',1);
- randn('state',1);
- states = legacyfsk_init(M,Rs);
- Fs = states.Fs;
- nbits = states.nbits;
- nbits2 = states.nbits2;
- Ts = states.Ts;
- nsam = states.nsam;
- rate = states.rate;
-
- % init analog FM modem
-
- fm_states.Fs = Fs;
- fm_max = fm_states.fm_max = 3E3;
- fd = fm_states.fd = 5E3;
- fm_states.fc = states.fc;
-
- fm_states.pre_emp = 0;
- fm_states.de_emp = 1;
- fm_states.Ts = 1;
- fm_states.output_filter = 1;
- fm_states = analog_fm_init(fm_states);
- [b, a] = cheby1(4, 1, 300/Fs, 'high'); % 300Hz HPF to simulate FM radios
-
- % init sim states
-
- rx_bits_buf = zeros(1,2*nbits2);
- Terrs = Tbits = 0;
- state = 0;
- nerr_log = [];
-
- % set up the channel noise. We have log(M)*rate payload bits/symbol
- % we have log2(M) bits/symbol, and rate bits per payload symbol
- % TODO: explain this better as Im confused!
-
- EbNo = 10^(EbNodB/10);
- EsNo = EbNo*rate*log2(M);
- variance = states.Fs/((states.Rs)*EsNo);
- %printf("EbNodB: %3.1f EbNo: %3.2f EsNo: %3.2f\n", EbNodB, EbNo, EsNo);
-
- % set up the input bits
-
- if test_frame_mode == 1
- % test frame of bits, which we repeat for convenience when BER testing
- test_frame = round(rand(1, nbits));
- tx_bits = [];
- for i=1:frames+1
- tx_bits = [tx_bits test_frame];
- end
- end
- if test_frame_mode == 2
- % random bits, just to make sure sync algs work on random data
- tx_bits = round(rand(1, nbits*(frames+1)));
- end
- if test_frame_mode == 3
- % ...10101... sequence
- tx_bits = zeros(1, nbits*(frames+1));
- tx_bits(1:2:length(tx_bits)) = 1;
- end
-
- % Manchester Encoding -----------------------------------------------------------
-
- % Manchester encoding, which removes DC term in baseband signal,
- % making the waveform friendly to old-school legacy FM radios with
- % voiceband filtering. The "code rate" is 0.5, which means we have
- % encode one input bit into 2 output bits. The 2FSK encoder takes
- % one input bit, the 4FSK encoder two input bits.
-
- tx_bits_encoded = zeros(1,length(tx_bits)*2);
- fsk2_enc = [[1 0]; [0 1]];
- % -1.5 1.5 1.5 -1.5 -0.5 0.5 0.5 -0.5
- % 0 3 3 0 1 2 2 1
- fsk4_enc = [[0 0 1 1]; [1 1 0 0]; [0 1 1 0]; [1 0 0 1]];
- k=1;
- if M == 2
- for i=1:2:length(tx_bits_encoded)
- input_bit = tx_bits(k); k++;
- tx_bits_encoded(i:i+1) = fsk2_enc(input_bit+1,:);
- end
- else
- for i=1:4:length(tx_bits_encoded)
- input_bits = tx_bits(k:k+1) * [2 1]'; k+=2;
- tx_bits_encoded(i:i+3) = fsk4_enc(input_bits+1,:);
- end
- end
-
- % FSK Modulator --------------------------------------------------------------
-
- % use ideal FSK modulator (note: need to try using analog FM modulator)
-
- tx = legacyfsk_mod(states, tx_bits_encoded);
- noise = sqrt(variance)*randn(length(tx),1);
- rx = tx + noise;
- timing_offset_samples = round(timing_offset*Ts);
- rx = [zeros(timing_offset_samples,1); rx];
-
- % Demodulator ----------------------------------------------------------------------------
-
- if demod == 1
- % use analog FM demodulator, aka a $40 Baofeng
-
- [rx_out rx_bb] = analog_fm_demod(fm_states, rx');
- if sim_in.hpf
- rx_out_hp = filter(b,a,rx_out);
- else
- rx_out_hp = rx_out;
- end
- rx_filt = filter(ones(1,Ts),1,rx_out_hp);
- rx_timing_sig = rx_filt;
-
- % TODO: for 4FSK determine amplitude/decn boundaries, choose closest to demod each symbol
-
- end
-
- if demod == 2
-
- % optimal non-coherent demod at Rs
-
- rx_timing_sig = zeros(1,length(rx));
- for m=1:M
- phi_vec = (1:length(rx))*2*pi*states.f(m)/Fs;
- dc = rx' .* exp(-j*phi_vec);
- rx_filt(m,:) = abs(filter(ones(1,Ts),1,dc));
- rx_timing_sig = rx_timing_sig + rx_filt(m,1:length(rx));
- end
- end
-
- % Fine timing estimation ------------------------------------------------------
-
- % Estimate fine timing using line at Rs/2 that Manchester encoding provides
- % We need this to sync up to Manchester codewords. TODO plot signal and
- % timing "line" we extract
-
- Np = length(rx_timing_sig);
- w = 2*pi*(Rs)/Fs;
- x = (rx_timing_sig .^ 2) * exp(-j*w*(0:Np-1))';
- norm_rx_timing = angle(x)/(2*pi) - 0.42;
- %rx_timing = round(norm_rx_timing*Ts);
- %printf("norm_rx_timing: %4.4f rx_timing: %d\n", norm_rx_timing, rx_timing);
-
- % Max likelihood decoding of Manchester encoded symbols. Search
- % through all ML possibilities to extract bits. Use energy (filter
- % output sq)
-
- % Manchester Decoding --------------------------------------------------------
-
- if M == 2
- if demod == 1
-
- % sample at optimum instant
-
- [tmp l] = size(rx_filt);
- rx_filt_dec = rx_filt(:, Ts+rx_timing:Ts:l);
-
- [tmp l] = size(rx_filt_dec);
- rx_bits = zeros(1,l);
- k = 1;
- for i=1:2:l-1
- ml = [rx_filt_dec(i)-rx_filt_dec(i+1) -rx_filt_dec(i)+rx_filt_dec(i+1)];
- [mx mx_ind] = max(ml);
- rx_bits(k) = mx_ind-1; k++;
- end
- end
-
- if demod == 2
-
- % sample at optimum instant
-
- [tmp l] = size(rx_filt);
- rx_filt_dec = rx_filt(:, Ts+rx_timing:Ts:l);
-
- [tmp l] = size(rx_filt_dec);
- rx_bits = zeros(1,l);
- k = 1;
- for i=1:2:l-1
- %ml = [rx_filt_dec(2,i)*rx_filt_dec(1,i+1) rx_filt_dec(1,i)*rx_filt_dec(2,i+1)];
- ml = [rx_filt_dec(2,i)+rx_filt_dec(1,i+1) rx_filt_dec(1,i)+rx_filt_dec(2,i+1)];
- [mx mx_ind] = max(ml);
- rx_bits(k) = mx_ind-1; k++;
- end
- end
- else % M == 4
- if demod == 1
- % TODO: 4FSK version of demod
- rx_bits=tx_bits;
- end
- if demod == 2
- % sample at optimal instant
-
- [tmp l] = size(rx_filt);
- rx_filt_dec = rx_filt(:, Ts+rx_timing:Ts:l);
- [tmp l] = size(rx_filt_dec);
- rx_bits = zeros(1,l);
-
- k = 1;
- fsk4_dec = [[0 0]; [0 1]; [1 0]; [1 1]];
- for i=1:2:l-1
- %ml = [rx_filt_dec(1,i)*rx_filt_dec(4,i+1) rx_filt_dec(4,i)*rx_filt_dec(1,i+1) rx_filt_dec(2,i)*rx_filt_dec(3,i+1) rx_filt_dec(3,i)*rx_filt_dec(2,i+1)];
- ml = [(rx_filt_dec(1,i)+rx_filt_dec(4,i+1)) (rx_filt_dec(4,i)+rx_filt_dec(1,i+1)) (rx_filt_dec(2,i)+rx_filt_dec(3,i+1)) (rx_filt_dec(3,i)+rx_filt_dec(2,i+1))];
- [mx mx_ind] = max(ml);
- rx_bits(k:k+1) = fsk4_dec(mx_ind,:); k+=2;
- end
- end
- end
-
- % useful for getting decoding right
- %tx_bits(1:20)
- %rx_bits(1:20)
-
- % Frame sync and BER logic -------------------------------------------------------------
-
- st = 1;
- for f=1:frames
-
- % extract nin bits
-
- nin = nbits;
- en = st + nin - 1;
-
- rx_bits_buf(1:nbits) = rx_bits_buf(nbits+1:2*nbits);
- rx_bits_buf(nbits+1:2*nbits) = rx_bits(st:en);
-
- st += nin;
-
- % frame sync based on min BER
-
- if test_frame_mode == 1
- nerrs_min = nbits;
- next_state = state;
- if state == 0
- for i=1:nbits
- error_positions = xor(rx_bits_buf(i:nbits+i-1), test_frame);
- nerrs = sum(error_positions);
- %printf("i: %d nerrs: %d nerrs_min: %d \n", i, nerrs, nerrs_min);
- if nerrs < nerrs_min
- nerrs_min = nerrs;
- coarse_offset = i;
- end
- end
- if nerrs_min < 3
- next_state = 1;
- %printf("%d %d\n", coarse_offset, nerrs_min);
- end
- end
-
- if state == 1
- error_positions = xor(rx_bits_buf(coarse_offset:coarse_offset+nbits-1), test_frame);
- nerrs = sum(error_positions);
- Terrs += nerrs;
- Tbits += nbits;
- nerr_log = [nerr_log nerrs];
- end
-
- state = next_state;
-
- end
- end
-
- if test_frame_mode == 1
- if sim_in.verbose
- printf(" demod: %d frames: %d EbNodB: %3.1f Tbits: %d Terrs: %d BER %4.3f\n", demod, frames, EbNodB, Tbits, Terrs, Terrs/Tbits);
- else
- printf(" EbNodB: %3.1f BER %4.3f\n", EbNodB, Terrs/Tbits);
- end
- end
-
- % Bunch O'plots --------------------------------------------------------------
-
- close all;
-
- st = 1; en=20;
-
- Tx=fft(tx, Fs);
- TxdB = 20*log10(abs(Tx(1:Fs/2)));
- figure(1)
- clf;
- plot(TxdB)
- axis([1 Fs/2 (max(TxdB)-100) max(TxdB)])
- title('Tx Spectrum');
-
- figure(2)
- clf
- if demod == 1
- subplot(211)
- plot(rx_filt(st*Ts:en*Ts));
- title('After integrator');
- subplot(212)
- plot(rx_filt_dec(st:en),'+');
- title('Decimated output');
- end
- if demod == 2
- subplot(211);
- plot(rx_filt(1,st*Ts:en*Ts));
- hold on;
- plot(rx_filt(2,st*Ts:en*Ts),'g');
- if M == 4
- plot(rx_filt(3,st*Ts:en*Ts),'c');
- plot(rx_filt(4,st*Ts:en*Ts),'r');
- end
- hold off;
- title('Output of each filter');
- subplot(212);
- plot(rx_filt_dec(1,st:en),'+');
- hold on;
- plot(rx_filt_dec(2,st:en),'g+');
- if M == 4
- plot(rx_filt_dec(3,st:en),'c+');
- plot(rx_filt_dec(4,st:en),'r+');
- end
- hold off;
- title('Decimated output of each filter');
- end
-
- figure(3)
- clf;
- subplot(211)
- plot(rx_timing_sig(st*Ts:en*Ts).^2)
- title('rx-timing-sig')
- subplot(212)
- F = abs(fft(rx_timing_sig(1:Fs)));
- plot(F(100:8000))
- title('FFT of rx-timing-sig')
-
- if demod == 1
- figure(4);
- clf;
- h = fft(rx_out, Fs);
- hdB = 20*log10(abs(h));
- plot(hdB(1:4000))
- title('Spectrum of baseband modem signal after analog FM demod');
- axis([1 4000 (max(hdB)-40) max(hdB)])
- end
-
- if demod == 1
- figure(5)
- clf;
- subplot(211)
- plot(rx_out(st*Ts:en*Ts));
- title('baseband modem signal after analog FM demod');
- subplot(212)
- plot(rx_out_hp(st*Ts:en*Ts));
- title('baseband modem signal after 300Hz filter');
- end
-end
-
-
-% Run various permutations of simulation here ---------------------------------------
-
-function run_single
-
- sim_in.frames = 100;
- sim_in.test_frame_mode = 1;
- sim_in.M = 2;
- sim_in.Rs = 2400;
- sim_in.demod = 1;
- sim_in.EbNodB = 15;
- sim_in.timing_offset = 0.0;
- sim_in.hpf = 1;
- sim_in.verbose = 1;
-
- run_sim(sim_in);
-endfunction
-
-
-function run_lots
-
- % adjusted a few scenarios for about 2% BER so we can compare
-
- sim_in.frames = 100;
- sim_in.test_frame_mode = 1;
- sim_in.M = 2;
- sim_in.Rs = 4800;
- sim_in.demod = 1;
- sim_in.EbNodB = 12;
- sim_in.timing_offset = 0.0;
- sim_in.hpf = 1;
- sim_in.verbose = 0;
-
- printf("Rs=4800 2FSK ideal demod\n");
- sim_in.EbNodB = 8.5; sim_in.demod = 2; run_sim(sim_in);
- printf("Rs=4800 2FSK analog FM demod, not too shabby and pushes 2400bit/s thru a $40 HT!\n");
- sim_in.EbNodB = 12; sim_in.demod = 1; run_sim(sim_in);
- printf("Rs=2400 2FSK analog FM demod, needs more power for same BER! Che?\n");
- sim_in.Rs = 2400; sim_in.EbNodB = 15; run_sim(sim_in);
- printf("Hmm, doesn't improve with no 300Hz HPF, maybe due to less deviation?\n");
- sim_in.hpf = 0; run_sim(sim_in);
- printf("Rs=2400 4FSK ideal demod, nice low Eb/No!\n");
- sim_in.demod = 2; sim_in.M = 4; sim_in.Rs = 2400; sim_in.EbNodB = 6; run_sim(sim_in);
-endfunction
-
-%run_single;
-run_lots;
diff --git a/octave/mfsk.m b/octave/mfsk.m
deleted file mode 100644
index 0414b5e..0000000
--- a/octave/mfsk.m
+++ /dev/null
@@ -1,199 +0,0 @@
-% mfsk.m
-% David Rowe Nov 2015
-
-% Simulation to test m=2 and m=4 FSK demod
-
-
-1;
-
-function sim_out = fsk_ber_test(sim_in)
- Fs = 96000;
- M = sim_in.M;
- Rs = sim_in.Rs;
- Ts = Fs/Rs;
- verbose = sim_in.verbose;
-
- nbits = sim_in.nbits;
- nsym = sim_in.nbits*2/M;
- nsam = nsym*Ts;
- EsNodB = sim_in.EbNodB + 10*log10(M/2);
-
- % printf("M: %d nbits: %d nsym: %d\n", M, nbits, nsym);
-
- if M == 2
- f(1) = -Rs/2;
- f(2) = Rs/2;
- end
- if M == 4
- f(1) = -3*Rs/2;
- f(2) = -Rs/2;
- f(3) = Rs/2;
- f(4) = 3*Rs/2;
- end
-
- % simulate over a range of Eb/No values
-
- for ne = 1:length(EsNodB)
- Nerrs = Terrs = Tbits = 0;
-
- aEsNodB = EsNodB(ne);
- EsNo = 10^(aEsNodB/10);
- variance = Fs/(Rs*EsNo);
-
- % Modulator -------------------------------
-
- tx_bits = round(rand(1, nbits));
- tx = zeros(1,nsam);
- tx_phase = 0;
-
- for i=1:nsym
- if M == 2
- tone = tx_bits(i) + 1;
- else
- tone = (tx_bits(2*(i-1)+1:2*i) * [2 1]') + 1;
- end
-
- tx_phase_vec = tx_phase + (1:Ts)*2*pi*f(tone)/Fs;
- tx((i-1)*Ts+1:i*Ts) = exp(j*tx_phase_vec);
- tx_phase = tx_phase_vec(Ts) - floor(tx_phase_vec(Ts)/(2*pi))*2*pi;
- end
-
- % Channel ---------------------------------
-
- % We use complex (single sided) channel simulation, as it's convenient
- % for the FM simulation.
-
- noise = sqrt(variance/2)*(randn(1,nsam) + j*randn(1,nsam));
- rx = tx + noise;
- if verbose > 1
- printf("EbNo: %f Eb: %f var No: %f EbNo (meas): %f\n",
- EbNo, var(tx)*Ts/Fs, var(noise)/Fs, (var(tx)*Ts/Fs)/(var(noise)/Fs));
- end
-
- % Demodulator -----------------------------
-
- % non-coherent FSK demod
-
- rx_bb = rx;
- dc = zeros(M,nsam);
- for m=1:M
- dc(m,:) = rx_bb .* exp(-j*(0:nsam-1)*2*pi*f(m)/Fs);
- end
-
- rx_bits = zeros(1, nsym);
- for i=1:nsym
- st = (i-1)*Ts+1;
- en = st+Ts-1;
- for m=1:M
- int(m,i) = abs(sum(dc(m,st:en)));
- end
- if m == 2
- rx_bits(i) = int(1,i) < int(2,i);
- else
- [max_amp tone] = max([int(1,i) int(2,i) int(3,i) int(4,i)]);
- if tone == 1
- rx_bits(2*(i-1)+1:2*i) = [0 0];
- end
- if tone == 2
- rx_bits(2*(i-1)+1:2*i) = [0 1];
- end
- if tone == 3
- rx_bits(2*(i-1)+1:2*i) = [1 0];
- end
- if tone == 4
- rx_bits(2*(i-1)+1:2*i) = [1 1];
- end
- end
- end
-
- error_positions = xor(rx_bits, tx_bits);
- Nerrs = sum(error_positions);
- Terrs += Nerrs;
- Tbits += length(error_positions);
-
- TERvec(ne) = Terrs;
- BERvec(ne) = Terrs/Tbits;
-
- if verbose > 1
- figure(2)
- clf
- Rx = 10*log10(abs(fft(rx)));
- plot(Rx(1:Fs/2));
- axis([1 Fs/2 0 50]);
-
- figure(3)
- clf;
- subplot(211)
- plot(real(rx_bb(1:Ts*20)))
- subplot(212)
- Rx_bb = 10*log10(abs(fft(rx_bb)));
- plot(Rx_bb(1:3000));
- axis([1 3000 0 50]);
-
- figure(4);
- subplot(211)
- stem(abs(mark_int(1:100)));
- subplot(212)
- stem(abs(space_int(1:100)));
- end
-
- if verbose
- printf("EbNo (db): %3.2f Terrs: %d BER: %4.3f \n", aEsNodB - 10*log10(M/2), Terrs, Terrs/Tbits);
- end
- end
-
- sim_out.TERvec = TERvec;
- sim_out.BERvec = BERvec;
-endfunction
-
-
-function run_fsk_curves
- sim_in.M = 2;
- sim_in.Rs = 1200;
- sim_in.nbits = 12000;
- sim_in.EbNodB = 0:2:20;
- sim_in.verbose = 1;
-
- EbNo = 10 .^ (sim_in.EbNodB/10);
- fsk_theory.BERvec = 0.5*exp(-EbNo/2); % non-coherent BFSK demod
- fsk2_sim = fsk_ber_test(sim_in);
-
- sim_in.M = 4;
- fsk4_sim = fsk_ber_test(sim_in);
-
- % BER v Eb/No curves
-
- figure(1);
- clf;
- semilogy(sim_in.EbNodB, fsk_theory.BERvec,'r;2FSK theory;')
- hold on;
- semilogy(sim_in.EbNodB, fsk2_sim.BERvec,'g;2FSK sim;')
- semilogy(sim_in.EbNodB, fsk4_sim.BERvec,'b;4FSK sim;')
- hold off;
- grid("minor");
- axis([min(sim_in.EbNodB) max(sim_in.EbNodB) 1E-4 1])
- legend("boxoff");
- xlabel("Eb/No (dB)");
- ylabel("Bit Error Rate (BER)")
-
-end
-
-
-function run_fsk_single
- sim_in.M = 4;
- sim_in.Rs = 1200;
- sim_in.nbits = 5000;
- sim_in.EbNodB = 8;
- sim_in.verbose = 1;
-
- fsk_sim = fsk_ber_test(sim_in);
-endfunction
-
-
-rand('state',1);
-randn('state',1);
-graphics_toolkit ("gnuplot");
-
-run_fsk_curves
-%run_fsk_single
-
diff --git a/octave/newamp1_fbf.m b/octave/newamp1_fbf.m
deleted file mode 100644
index 69111c6..0000000
--- a/octave/newamp1_fbf.m
+++ /dev/null
@@ -1,144 +0,0 @@
-% newamp1_fbf.m
-%
-% Copyright David Rowe 2016
-% This program is distributed under the terms of the GNU General Public License
-% Version 2
-%
-% Interactive Octave script to explore frame by frame operation of newamp1
-% spectral amplitude modelling.
-%
-% Usage:
-% Make sure codec2-dev is compiled with the -DDUMP option - see README for
-% instructions.
-% ~/codec2-dev/build_linux/src$ ./c2sim ../../raw/hts1a.raw --dump hts1a
-% $ cd ~/codec2-dev/octave
-% octave:14> newamp1_fbf("../build_linux/src/hts1a",50)
-
-
-function newamp1_fbf(samname, f=73, varargin)
- more off;
-
- newamp_700c; melvq;
- load train_120_1.txt; load train_120_2.txt;
- train_120_vq(:,:,1)= train_120_1; train_120_vq(:,:,2)= train_120_2; m=5;
-
- Fs = 8000; K = 20;
-
- vq = 0; eq_en = 0; pf = 0;
-
- % load up text files dumped from c2sim ---------------------------------------
-
- sn_name = strcat(samname,"_sn.txt");
- Sn = load(sn_name);
- sw_name = strcat(samname,"_sw.txt");
- Sw = load(sw_name);
- model_name = strcat(samname,"_model.txt");
- model = load(model_name);
- [frames tmp] = size(model);
-
- % pre-process
- [rate_K_surface sample_freqs_kHz] = resample_const_rate_f_mel(model(1:frames,:), K);
-
- % we need to know eq states on each frame
- eq = zeros(frames,K); an_eq = zeros(1,K);
- for ff=1:frames
- mean_f = mean(rate_K_surface(ff,:));
- rate_K_vec_no_mean = rate_K_surface(ff,:) - mean_f;
- [tmp an_eq] = front_eq(rate_K_vec_no_mean, an_eq);
- eq(ff,:) = an_eq;
- end
-
- % Keyboard loop --------------------------------------------------------------
-
- k = ' ';
- do
- fg = 1;
- s = [ Sn(2*f-1,:) Sn(2*f,:) ];
- figure(fg++); clf; plot(s); axis([1 length(s) -20000 20000]);
-
- Wo = model(f,1); L = model(f,2); Am = model(f,3:(L+2)); AmdB = 20*log10(Am);
- Am_freqs_kHz = (1:L)*Wo*4/pi;
-
- % plots ----------------------------------
-
- figure(fg++); clf;
- l = sprintf(";rate %d AmdB;g+-", L);
- plot((1:L)*Wo*4000/pi, AmdB, l);
- axis([1 4000 -20 80]);
- hold on;
- stem(sample_freqs_kHz*1000, rate_K_surface(f,:), ";rate K;b+-");
-
- % default
- rate_K_vec_ = rate_K_surface(f,:);
-
- mean_f = mean(rate_K_surface(f,:));
- rate_K_vec_no_mean = rate_K_surface(f,:) - mean_f;
- if eq_en
- rate_K_vec_no_mean -= eq(f,:);
- end
- rate_K_vec_no_mean_ = rate_K_vec_no_mean;
- if vq
- [res rate_K_vec_no_mean_ ind] = mbest(train_120_vq, rate_K_vec_no_mean, m);
- if pf
- rate_K_vec_no_mean_ = post_filter(rate_K_vec_no_mean_, sample_freqs_kHz, 1.5);
- end
- rate_K_vec_ = rate_K_vec_no_mean_ + mean_f;
- end
-
- % back to rate L
- model_(f,:) = resample_rate_L(model(f,:), rate_K_vec_, sample_freqs_kHz);
- Am_ = model_(f,3:(L+2)); AmdB_ = 20*log10(Am_);
- varL = var(AmdB - AmdB_);
-
- plot((1:L)*Wo*4000/pi, AmdB_,";AmdB bar;r+-");
- l = sprintf(";error var %3.2f dB;bk+-", varL);
- plot((1:L)*Wo*4000/pi, (AmdB - AmdB_), l);
- hold off;
-
- figure(3); clf;
- plot(sample_freqs_kHz*1000, 40+ rate_K_vec_no_mean, ";rate K no mean;g+-");
- axis([1 4000 -20 80]); hold on;
- plot(sample_freqs_kHz*1000, 40 + rate_K_vec_no_mean_, ";rate K no mean bar;r+-");
- varK = var(rate_K_vec_no_mean - rate_K_vec_no_mean_);
- l = sprintf(";error var %3.2f dB;bk+-", varK);
- plot(sample_freqs_kHz*1000, rate_K_vec_no_mean - rate_K_vec_no_mean_, l);
-
- plot(sample_freqs_kHz*1000, eq(f,:), ";eq;b+-");
- hold off;
-
- % interactive menu ------------------------------------------
-
- printf("\rframe: %d menu: n-next b-back q-quit v-vq[%d] p-pf[%d] e-eq[%d]", f, vq, pf, eq_en);
- fflush(stdout);
- k = kbhit();
-
- if k == 'v'
- if vq == 0; vq = 1; else vq = 0; end
- endif
- if k == 'p'
- if pf == 0; pf = 1; else pf = 0; end
- endif
- if k == 'e'
- if eq_en == 0; eq_en = 1; else eq_en = 0; end
- endif
- if k == 'n'
- f = f + 1;
- endif
- if k == 'b'
- f = f - 1;
- endif
-
- until (k == 'q')
- printf("\n");
-
-endfunction
-
-
-function ind = arg_exists(v, str)
- ind = 0;
- for i=1:length(v)
- if !ind && strcmp(v{i}, str)
- ind = i;
- end
- end
-endfunction
diff --git a/octave/nf_from_gr.m b/octave/nf_from_gr.m
deleted file mode 100644
index bd36d02..0000000
--- a/octave/nf_from_gr.m
+++ /dev/null
@@ -1,129 +0,0 @@
-% nf_from_gr.m
-% David Rowe Mar 2016
-
-#{
- Calculate NF from GNU Radio output samples in
- ...IQIQ... (32 bit float) sample files
-
- 1/ Take one sample with a -100dBm input carrier
- 2/ Take another sample with no signal (just rx noise)
- 3/ Set Fs, adjust st and en to use a chunk of spectrum without too
- many birdies.
-
- Gotchas:
-
- 1/ Inspect Figure(1), the time domain plots.
- 2/ Make sure plenty of ADC bits are being used with the noise-only sample,
- we don't want ADC quantisation noise to dominate. Aim for about half
- full scale.
- 3/ Also watch out for clipping on either sample.
-
-#}
-
-1;
-
-function det_nf(p_filename, n_filename, title, Fs, st, en, Pin_dB, real_file=0)
-
- if real_file
- % real samples files of 16 bit shorts
- fs=fopen(p_filename,"rb");
- p = fread(fs,Inf,"short");
- fclose(fs);
- fs=fopen(n_filename,"rb");
- pn = fread(fs,Inf,"short");
- fclose(fs);
- else
- % GNU radio complex file input
- p = load_comp(p_filename);
- pn = load_comp(n_filename);
- end
-
- % skip any start up transients
-
- tst = floor(0.1*Fs); ten = st + Fs - 1;
- P = fft(p(tst:ten));
- N = fft(pn(tst:ten));
-
- PdB = 20*log10(abs(P));
- NdB = 20*log10(abs(N));
-
- figure(1); clf;
- subplot(211); plot(real(p(tst:tst+floor(Fs*0.1))));
- subplot(212); plot(real(pn(tst:tst+floor(Fs*0.1))));
-
- figure(2); clf;
- subplot(211); plot(st:en, PdB(st:en));
- subplot(212); plot(st:en, NdB(st:en));
-
- #{
- ------------------------------------------------------------------------
-
- From Wikipedia: The Noise Figure is the difference in decibels
- (dB) between the noise output of the actual receiver to the noise
- output of an “ideal” receiver
-
- An ideal receiver would have an output noise power of:
-
- Nout_dB = 10log10(B) -174 + G_dB
-
- The -174 dBm/Hz figure is the thermal noise density at 25C, for
- every 1Hz of bandwidth your will get -174dBm of noise power. It's
- the lower limit set by the laws of physics. G_dB is the Rx gain. The
- 10log10(B) term takes into account the bandwidth of the Rx. A wider
- bandwidth means more total noise power.
-
- So if you have a 1Hz bandwidth, and a gain of 100dB, you would
- expect Nout_NdB = 0 -174 + 100 = -74dBm at the rx output with no
- signal. If you have a 1000Hz bandwidth receiver you would have NdB_out
- = 20 -174 + 100 = -44dBm of noise power at the output.
-
- To determine Noise Figure:
- 1) Sample the Rx output first with a test signal and then with noise only.
- 2) Find the Rx gain using the test signal.
- 3) Find the noise output power, then using the gain we can find the noise
- input power.
- 4) Normalise the noise input power to 1Hz noise bandwidth and
- compare to the thermal noise floor.
-
- ----------------------------------------------------------------------------
- #}
-
- % variance is the power of a sampled signal
-
- Pout_dB = 10*log10(var(P(st:en))); % Rx output power with test signal
- G_dB = Pout_dB - Pin_dB; % Gain of Rx
- Nout_dB = 10*log10(var(N(st:en))); % Rx output power with noise
- Nin_dB = Nout_dB - G_dB; % Rx input power with noise
- No_dB = Nin_dB - 10*log10(en-st); % Rx input power with noise in 1Hz bandwidth
- NF_dB = No_dB + 174; % compare to thermal noise to get NF
- printf("%10s: Pin: %4.1f Pout: %4.1f G: %4.1f NF: %3.1f dB\n", title, Pin_dB, Pout_dB, G_dB, NF_dB);
-endfunction
-
-
-% HackRF --------------------------
-
-%p_filename = "~/Desktop/blogs/nf/hackrf_100dbm_4MHz.bin";
-%n_filename = "~/Desktop/blogs/nf/hackrf_nosignal_4MHz.bin";
-p_filename = "~/codec2-dev/build_linux/unittest/hackrf_100dbm_4MHz.bin";
-n_filename = "~/codec2-dev/build_linux/unittest/hackrf_nosignal_4MHz.bin";
-det_nf(p_filename, n_filename, "HackRF", 4E6, 180E3, 600E3, -100);
-
-#{
-% RTL-SDR --------------------------
-
-p_filename = "~/Desktop/nf/neg100dBm_2MHz.bin";
-n_filename = "~/Desktop/nf/nosignal_2MHz.bin";
-det_nf(p_filename, n_filename, "RTL-SDR", 2E6, 100E3, 300E3, -100);
-
-% AirSpy -------------------------
-
-p_filename = "~/Desktop/nf/airspy_100dbm_2.5MSPS.bin";
-n_filename = "~/Desktop/nf/airspy_nosig_2.5MSPS.bin";
-det_nf(p_filename, n_filename, "AirSpy", 2.5E6, 100E3, 300E3, -100);
-
-% Fun Cube Dongle Pro Plus -------------------------
-
-p_filename = "~/Desktop/nf/fcdpp_100dbm_192khz.bin";
-n_filename = "~/Desktop/nf/fcdpp_nosig_192khz.bin";
-det_nf(p_filename, n_filename, "FunCube PP", 192E3, 25E3, 125E3, -100);
-#}
diff --git a/octave/nf_from_stdio.m b/octave/nf_from_stdio.m
deleted file mode 100644
index e1d38f2..0000000
--- a/octave/nf_from_stdio.m
+++ /dev/null
@@ -1,133 +0,0 @@
-% nf_from_gr.m
-% David Rowe Mar 2018
-
-#{
-
- Calculate NF in real time from 16 bit real samples from stdin
-
- 1/ Using gqrx:
-
- gqrx setup:
- Configure I/O devices:
- To switch on LNA bias for HackRF, in Configure I/O devices menu set:
- Device String: hackrf,bias=1
- To switch on LNA bias for airspy run for a few seconds this before starting gqrx:
- $ airspy_rx -r /dev/null -f 435 -b 1
- I used a sample rate of 250000 for Airspy R2, 3000000 for Airspy Mini
- Input options...: start with set all gain sliders set to maximum
- FFT Setting.....: freq Zoom to max
- Receiver Options: On spectrum display, drag filter width until it's about 12k
- Filter Shape Normal
- Mode USB
- Tune until tone is between 2 and 4 k
- Press UDP button
-
- Then in a Linux Term:
-
- $ nc -ul 7355 | octave --no-gui -qf nf_from_stdio.m 48000
-
- 2/ Using command line tools. Compile airspy tools and csdr from source:
-
- a) Airspy:
-
- $ airspy_rx -a 6000000 -l 14 -m 15 -v 15 -r - -f 434.998 -b 1 | \
- csdr convert_s16_f | csdr fir_decimate_cc 50 | csdr convert_f_s16 | \
- octave --no-gui -qf ~/codec2-dev/octave/nf_from_stdio.m 120000 complex
-
- Note: we tuned a few kHz down to put the test tone in the 2000 to 4000 Hz range.
-
- b) HackRF:
-
- Term 1:
-
- $ ~/codec2-dev/octave$ nc -ul 7355 | octave --no-gui -qf nf_from_stdio.m 80000 complex
-
- Term 2:
-
- $ hackrf_transfer -r - -f 434995000 -s 4000000 -a 1 -p 1 -l 40 -g 32 | \
- csdr convert_s8_f | csdr fir_decimate_cc 50 | csdr convert_f_s16 | \
- nc localhost -u 7355
-
- Note: HackRF needed a bit of tuning to get test tone in 2000 to 4000 Hz range. This
- can be tricky with the command line method, easier with gqrx.
-
- c) rtlsdr (assuming sig gen set to 144.5MHz, -100dBm)
-
- Term 1:
-
- $ ./rtl_sdr -g 50 -s 2400000 -f 144.498E6 - | csdr convert_u8_f | csdr fir_decimate_cc 50 | \
- csdr convert_f_s16 | octave --no-gui -qf ~/codec2/octave/nf_from_stdio.m 48000 complex
-
- TODO:
- [ ] work out why noise power st bounces around so much, signal power seems stable
- [ ] reduce CPU load, in particular of plotting
-#}
-
-graphics_toolkit ("gnuplot")
-
-% command line arguments
-
-arg_list = argv ();
-if nargin == 0
- printf("\nusage: %s FsHz [real|complex] [testToneLeveldBm]\n\n", program_name());
- exit(0);
-end
-
-Fs = str2num(arg_list{1});
-shorts_per_sample = 1;
-
-if nargin == 2
- if strcmp(arg_list{2}, "real")
- shorts_per_sample = 1;
- end
- if strcmp(arg_list{2}, "complex")
- shorts_per_sample = 2;
- end
-end
-
-Pin_dB = -100; % level of input test tone
-if nargin == 3
- Pin_dB = str2num(arg_list{3});
-end
-
-printf("Fs: %d shorts_per_sample: %d Pin_dB: %f\n", Fs, shorts_per_sample, Pin_dB);
-
-[s,c] = fread(stdin, shorts_per_sample*Fs, "short");
-
-while c
- if shorts_per_sample == 2
- s = s(1:2:end)+j*s(2:2:end);
- end
- S = fft(s.*hanning(Fs));
- SdB = 20*log10(abs(S));
- figure(1); plot(real(s)); axis([0 Fs -4E4 4E4]);
- figure(2); plot(SdB); axis([0 12000 40 180]);
-
- % assume sine wave is between 2000 and 4000 Hz, and dominates energy in that
- % region. Noise is between 5000 - 10000 Hz
-
- sig_st = 2000; sig_en = 5000;
- noise_st = 6000; noise_en = 10000;
-
- % find peak and sum power a few bins either side, this ensure we don't capture
- % too much noise as well
-
- [pk pk_pos] = max(abs(S));
- if pk_pos > 5
- Pout_dB1 = 10*log10(sum(abs(S(pk_pos-5:pk_pos+5)).^2)); % Rx output power with test signal
- else
- Pout_dB1 = 0;
- end
-
- Pout_dB = 10*log10(sum(abs(S(sig_st:sig_en)).^2)); % Rx output power with test signal
- G_dB = Pout_dB - Pin_dB; % Gain of Rx
- Nout_dB = 10*log10(sum(abs(S(noise_st:noise_en)).^2)/(noise_en-noise_st)); % Rx output power with noise
- Nin_dB = Nout_dB - G_dB; % Rx input power with noise
- No_dB = Nin_dB; %- 10*log10(noise_en-noise_st); % Rx input power with noise in 1Hz bandwidth
- NF_dB = No_dB + 174; % compare to thermal noise to get NF
- printf("Pout: %4.1f %d %4.1f Nout: %4.1f G: %4.1f No: %4.1f NF: %3.1f dB\n", Pout_dB, pk_pos, Pout_dB1, Nout_dB, G_dB, No_dB, NF_dB);
-
- pause(2);
- [s,c] = fread(stdin, shorts_per_sample*Fs, "short");
-endwhile
-
diff --git a/octave/oqpsk.m b/octave/oqpsk.m
deleted file mode 100644
index f308617..0000000
--- a/octave/oqpsk.m
+++ /dev/null
@@ -1,521 +0,0 @@
-% oqpsk.m
-% David Rowe Jan 2017
-%
-% Unfiltered OQPSK modem implementation and simulations to test,
-% derived from GMSK modem in gmsk.m
-%
-% Usage: see "choose one of these to run" at the end of this file.
-
-rand('state',1);
-randn('state',1);
-graphics_toolkit ("gnuplot");
-format
-more off;
-
-% init modem states
-
-function oqpsk_states = oqpsk_init(oqpsk_states, Rs)
-
- % general
-
- verbose = oqpsk_states.verbose;
- oqpsk_states.Fs = 4*Rs;
- oqpsk_states.Rs = Rs;
- oqpsk_states.bps = 2; % two bit/symbol for QPSK
-
- M = oqpsk_states.M = oqpsk_states.Fs/oqpsk_states.Rs;
- assert(floor(M) == M, "oversampling factor M must be an integer");
- assert(floor(M/2) == M/2, "(oversampling factor M)/2 must be an integer to offset QPSK");
-endfunction
-
-
-% Gray coded QPSK modulation function
-
-function symbol = qpsk_mod(two_bits)
- two_bits_decimal = sum(two_bits .* [2 1]);
- switch(two_bits_decimal)
- case (0) symbol = 1;
- case (1) symbol = j;
- case (2) symbol = -j;
- case (3) symbol = -1;
- endswitch
-endfunction
-
-
-% Gray coded QPSK demodulation function
-
-function two_bits = qpsk_demod(symbol)
- if isscalar(symbol) == 0
- printf("only works with scalars\n");
- return;
- end
- bit0 = real(symbol*exp(j*pi/4)) < 0;
- bit1 = imag(symbol*exp(j*pi/4)) < 0;
- two_bits = [bit1 bit0];
-endfunction
-
-
-% Unfiltered OQPSK modulator
-
-function [tx tx_symb] = oqpsk_mod(oqpsk_states, tx_bits)
- M = oqpsk_states.M;
- bps = oqpsk_states.bps;
- nsym = length(tx_bits)/bps;
- nsam = nsym*M;
- verbose = oqpsk_states.verbose;
-
- % Map bits to Gray coded QPSK symbols
-
- tx_symb = zeros(1,nsym);
-
- for i=1:nsym
- tx_symb(i) = qpsk_mod(tx_bits(2*i-1:2*i))*exp(j*pi/4);
- end
-
- % Oversample by M (sample and hold) to create unfiltered QPSK
-
- tx = zeros(1, nsam);
- for i=1:nsym
- tx((i-1)*M+1:(i*M)) = tx_symb(i);
- end
-
- % delay Q arm by half of a symbol to make OQPSK
-
- tx = [real(tx) zeros(1,M/2)] + j*[zeros(1,M/2) imag(tx)];
-endfunction
-
-
-#{
-
- Unfiltered OQPSK demodulator function, with (optional) phase and
- timing estimation. Adapted from Fig 8 of [1]. See also gmsk.m and
- [2].
-
- Note demodulator returns phase corrected symbols sampled at ideal
- timing instant. These symbols may have a m*pi/2 phase ambiguity due
- to properties of phase tracking loop. The caller is responsible for
- determining this ambiguity and recovering the actual bits.
-
- [1] GMSK demodulator in IEEE Trans on Comms, Muroyta et al, 1981,
- "GSM Modulation for Digital Radio Telephony".
-
- [2] GMSK Modem Simulation, http://www.rowetel.com/?p=3824
-
-#}
-
-
-function [rx_symb rx_int filt_log dco_log timing_adj Toff] = oqpsk_demod(oqpsk_states, rx)
- M = oqpsk_states.M;
- Rs = oqpsk_states.Rs;
- Fs = oqpsk_states.Fs;
- nsam = length(rx);
- nsym = floor(nsam/M);
- verbose = oqpsk_states.verbose;
-
- timing_angle_log = zeros(1,length(rx));
- rx_int = zeros(1,length(rx));
- dco_log = filt_log = zeros(1,nsam);
-
- % Unfiltered PSK - integrate energy in symbols M long in re and im arms
-
- rx_int = conv(rx,ones(1,M))/M;
-
- % phase and fine frequency tracking and correction ------------------------
-
- if oqpsk_states.phase_est
-
- % DCO design from "Introduction To Phase-Lock Loop System Modeling", Wen Li
- % http://www.ece.ualberta.ca/~ee401/parts/data/PLLIntro.pdf
-
- eta = 0.707;
- wn = 2*pi*10*(Rs/4800); % (Rs/4800) -> found reducing the BW beneficial with falling Rs
- Ts = 1/Fs;
- g1 = 1 - exp(-2*eta*wn*Ts);
- g2 = 1 + exp(-2*eta*wn*Ts) - 2*exp(-eta*wn*Ts)*cos(wn*Ts*sqrt(1-eta*eta));
- Gpd = 2/pi;
- Gvco = 1;
- G1 = g1/(Gpd*Gvco); G2 = g2/(Gpd*Gvco);
- %printf("g1: %e g2: %e G1: %e G2: %e\n", g1, g2, G1, G2);
-
- filt_prev = dco = lower = ph_err_filt = ph_err = 0;
- end
-
- if oqpsk_states.timing_est
- % w is the ref sine wave at the timing clock frequency
- % tw is the length of the window used to estimate timing
-
- tw = 200*M;
- k = 1;
- xr_log = []; xi_log = [];
- w_log = [];
- timing_clock_phase = 0;
- timing_angle = 0;
- timing_angle_log = zeros(1,nsam);
- end
-
- % Sample by sample processing loop for timing and phase est. Note
- % this operates at sample rate Fs, unlike many PSK modems that
- % operate at the symbol rate Rs
-
- for i=1:nsam
-
- if oqpsk_states.timing_est
-
- % update sample timing estimate every tw samples, free wheel
- % rest of the time
-
- if mod(i,tw) == 0
- l = i - tw+1;
- xr = abs(real(rx_int(l:l+tw-1)));
- xi = abs(imag(rx_int(l:l+tw-1)));
- w = exp(j*(l:l+tw-1)*2*pi*Rs/Fs);
- X = xr * w';
- timing_clock_phase = timing_angle = angle(X);
- k++;
- xr_log = [xr_log xr];
- xi_log = [xi_log xi];
- w_log = [w_log w];
- else
- timing_clock_phase += (2*pi)/M;
- end
- timing_angle_log(i) = timing_angle;
- end
-
- if oqpsk_states.phase_est
-
- % PLL per-sample processing
-
- rx_int(i) *= exp(-j*dco);
- ph_err = sign(real(rx_int(i))*imag(rx_int(i)))*cos(timing_clock_phase);
- lower = ph_err*G2 + lower;
- filt = ph_err*G1 + lower;
- dco_log(i) = dco;
- dco = dco + filt;
- filt_log(i) = filt;
-
- end
-
- end
-
- % final adjustment of timing output to take into account slowly
- % moving estimates due to sample clock offset. Unwrap ensures that
- % when timing angle jumps from -pi to pi we move to the next symbol
- % and frame sync isn't broken
-
- timing_adj = timing_angle_log*M/(2*pi);
- timing_adj_uw = unwrap(timing_angle_log)*M/(2*pi);
- % Toff = floor(2*M+timing_adj);
- Toff = floor(timing_adj_uw+0.5);
-
- % sample integrator output at correct timing instant
-
- k = 1;
- re_syms = im_syms = zeros(1,nsym);
- rx_symb = [];
- for i=M:M:nsam
- if i-Toff(i)+M/2 <= nsam
- re_syms(k) = real(rx_int(i-Toff(i)));
- im_syms(k) = imag(rx_int(i-Toff(i)+M/2));
- %re_syms(k) = real(rx_int(i));
- %im_syms(k) = imag(rx_int(i));
- rx_symb = [rx_symb re_syms(k) + j*im_syms(k)];
- k++;
- end
- end
-
-endfunction
-
-
-% Test modem over a range Eb/No points in an AWGN channel. Can
-% simulate a variety of channel impairments and performs ambiguity
-% resolution.
-
-function sim_out = oqpsk_test(sim_in)
- bitspertestframe = sim_in.bitspertestframe;
- nbits = sim_in.nbits;
- EbNodB = sim_in.EbNodB;
- verbose = sim_in.verbose;
- Rs = 4800;
-
- oqpsk_states.verbose = verbose;
- oqpsk_states.coherent_demod = sim_in.coherent_demod;
- oqpsk_states.phase_est = sim_in.phase_est;
- oqpsk_states.timing_est = sim_in.timing_est;
- oqpsk_states = oqpsk_init(oqpsk_states, Rs);
- M = oqpsk_states.M;
- Fs = oqpsk_states.Fs;
- Rs = oqpsk_states.Rs;
- sample_clock_offset_ppm = sim_in.sample_clock_offset_ppm;
-
- tx_testframe = round(rand(1, bitspertestframe));
- ntestframes = floor(nbits/bitspertestframe);
- tx_bits = [];
- for i=1:ntestframes
- tx_bits = [tx_bits tx_testframe];
- end
-
- for ne = 1:length(EbNodB)
- aEbNodB = EbNodB(ne);
- EbNo = 10^(aEbNodB/10);
- variance = Fs/(Rs*EbNo*oqpsk_states.bps);
-
- [tx tx_symb] = oqpsk_mod(oqpsk_states, tx_bits);
- if sample_clock_offset_ppm
- tx = resample(tx, 1E6, 1E6-sample_clock_offset_ppm);
- end
- nsam = length(tx);
-
- phi = sim_in.phase_offset + 2*pi*sim_in.freq_offset*(1:nsam)/M;
-
- noise = sqrt(variance/2)*(randn(1,nsam) + j*randn(1,nsam));
- st = 1+sim_in.timing_offset; en = length(tx);
- rx = tx(st:en).*exp(j*phi(st:en)) + noise(st:en);
-
- [rx_symb rx_int filt_log dco_log timing_adj Toff] = oqpsk_demod(oqpsk_states, rx);
-
- % OK so the phase and timing estimators get us close (e.g. a good
- % scatter diagram), but no banana just yet. One problem is the
- % PLL can lock up on mulitples of pi/2. Combinations of phase
- % offsets can confuse the timing estimator. One tricky example is a
- % phase offset of pi/2 which swaps I & Q, and with OQPSK (unlike
- % MSK and friends) we can't easily tell which is I and which is Q
- % after a phase rotation, e.g. could be IQIQIQI or QIQIQIQ
-
- % So we need to determine the ambiguities:
- % a) could be m*pi/2 rotations of phase
- % b) could be I and Q swapped by timing est
- % c) time alignment of test frame
-
- nsymb = bitspertestframe/oqpsk_states.bps;
- nrx_symb = length(rx_symb);
- rx_bits = zeros(1, bitspertestframe);
- atx_symb = tx_symb(1:nsymb);
-
- % Treat I and Q as separate sequences, each with their own unique
- % word. In our case the UW is the whole test frame. Correlate rx
- % sequence with tx sequence at each possible offset through the
- % received symbols to find the test frames. Note we also
- % correlate I of tx with Q of rx to trap any IQ swaps.
-
- % The sign of the I and Q correlation lets us sort out the pi/2
- % phase rotation issue.
-
- nerrs_tot = 0; nbits_tot = 0;
-
- max_corr = real(atx_symb) * real(atx_symb)';
- for offset=2:nrx_symb-nsymb+1
- corr_ii(offset) = real(atx_symb) * real(rx_symb(offset:offset+nsymb-1))'/max_corr;
- corr_qq(offset) = imag(atx_symb) * imag(rx_symb(offset:offset+nsymb-1))'/max_corr;
- corr_iq(offset) = real(atx_symb) * imag(rx_symb(offset:offset+nsymb-1))'/max_corr;
- corr_qi(offset) = imag(atx_symb) * real(rx_symb(offset:offset+nsymb-1))'/max_corr;
- %printf("offset: %2d ii: % 5f qq: % 5f iq: % 5f qi: % 5f\n",
- %offset, corr_ii(offset), corr_qq(offset), corr_iq(offset), corr_qi(offset));
-
- if abs(corr_ii(offset)) > 0.8
-
- % no IQ swap, or time offset
-
- i_sign = sign(corr_ii(offset));
- q_sign = sign(corr_qq(offset));
- arx_symb = i_sign*real(rx_symb(offset:offset+nsymb-1)) + j*q_sign*imag(rx_symb(offset:offset+nsymb-1));
-
- for i=1:nsymb
- rx_bits(2*i-1:2*i) = qpsk_demod(arx_symb(i)*exp(-j*pi/4));
- end
- nerrs = sum(xor(tx_testframe, rx_bits));
- if verbose > 2
- printf("offset: %5d swap: %d i_sign: % 2.1f q_sign: % 2.1f nerr: %d\n",
- offset, 0, i_sign, q_sign, nerrs);
- end
- nerrs_tot += nerrs;
- nbits_tot += bitspertestframe;
- end
-
- if abs(corr_qi(offset)) > 0.8
-
- % IQ swap, I part in Q part of symbol before
-
- i_sign = sign(corr_iq(offset-1));
- q_sign = sign(corr_qi(offset));
- arx_symb = i_sign*imag(rx_symb(offset-1:offset+nsymb-2)) + j*q_sign*real(rx_symb(offset:offset+nsymb-1));
-
- for i=1:nsymb
- rx_bits(2*i-1:2*i) = qpsk_demod(arx_symb(i)*exp(-j*pi/4));
- end
- nerrs = sum(xor(tx_testframe, rx_bits));
- if verbose > 1
- printf("offset: %5d swap: %d i_sign: % 2.1f q_sign: % 2.1f nerr: %d\n",
- offset, 1, i_sign, q_sign, nerrs);
- end
- nerrs_tot += nerrs;
- nbits_tot += bitspertestframe;
- end
- end
-
- TERvec(ne) = nerrs_tot;
- BERvec(ne) = nerrs_tot/nbits_tot;
-
- if verbose > 0
- printf("EbNo dB: %3.1f Nbits: %d Nerrs: %d BER: %4.3f BER Theory: %4.3f\n",
- aEbNodB, nbits_tot, nerrs_tot, BERvec(ne), 0.5*erfc(sqrt(EbNo)));
- end
-
- if find(sim_in.plots == 1)
- figure(1); clf;
- subplot(211)
- stem(real(tx))
- title('Tx samples');
- ylabel('Inphase');
- subplot(212)
- stem(imag(tx))
- ylabel('Quadrature');
- end
-
- if find(sim_in.plots == 2)
- figure(2); clf;
- f = fftshift(fft(rx));
- Tx = 20*log10(abs(f));
- plot((1:length(f))*Fs/length(f) - Fs/2, Tx)
- grid;
- title('OQPSK Demodulator Input Spectrum');
- end
-
- if find(sim_in.plots == 3)
- figure(3); clf;
- nplot = min(16, nbits/oqpsk_states.bps);
- title('Rx Integrator');
- subplot(211)
- stem(real(rx_int(1:nplot*M)))
- axis([1 nplot*M -1 1])
- subplot(212)
- stem(imag(rx_int(1:nplot*M)))
- axis([1 nplot*M -1 1])
- end
-
- if find(sim_in.plots == 4)
- figure(4); clf;
- subplot(211);
- plot(filt_log);
- title('PLL filter')
- subplot(212);
- plot(dco_log);
- title('PLL DCO phase');
- end
-
- if find(sim_in.plots == 5)
- figure(5); clf;
- subplot(211)
- plot(timing_adj);
- title('Timing est');
- subplot(212)
- plot(Toff);
- title('Timing est unwrap');
- end
-
- if find(sim_in.plots == 6)
- figure(6); clf;
- st = floor(0.5*nrx_symb);
- plot(rx_symb(st:nrx_symb), '+');
- title('Scatter Diagram');
- axis([-1.5 1.5 -1.5 1.5])
- end
-
- if find(sim_in.plots == 7)
- figure(7); clf;
- subplot(211)
- plot(corr_ii);
- axis([1 length(corr_ii) -1.2 1.2]);
- title('corr ii');
- subplot(212)
- plot(corr_qi);
- axis([1 length(corr_ii) -1.2 1.2]);
- title('corr qi');
- end
-
- if find(sim_in.plots == 8)
- figure(8); clf;
- subplot(211);
- stem(real(arx_symb));
- title('Rx symbols')
- subplot(212);
- stem(imag(arx_symb));
- end
-
- if find(sim_in.plots == 9)
- figure(9); clf;
- subplot(211)
- stem(tx_testframe(1:min(20,length(rx_bits))))
- title('Tx Bits')
- subplot(212)
- stem(rx_bits(1:min(20,length(rx_bits))))
- title('Rx Bits')
- end
- end
-
- sim_out.TERvec = TERvec;
- sim_out.BERvec = BERvec;
- sim_out.Rs = oqpsk_states.Rs;
-endfunction
-
-
-function run_oqpsk_single
- sim_in.coherent_demod = 1;
- sim_in.phase_est = 1;
- sim_in.timing_est = 1;
- sim_in.bitspertestframe = 100;
- sim_in.nbits = 10000;
- sim_in.EbNodB = 4;
- sim_in.verbose = 1;
- sim_in.phase_offset = 3*pi/4; % in radians
- sim_in.timing_offset = 4; % in samples 0..M-1
- sim_in.freq_offset = 0.001; % fraction of Symbol Rate
- sim_in.plots = [1 2 4 5 6 7];
- sim_in.sample_clock_offset_ppm = 100;
-
- sim_out = oqpsk_test(sim_in);
-endfunction
-
-
-% Generate a bunch of BER versus Eb/No curves for various demods
-
-function run_oqpsk_curves
- sim_in.coherent_demod = 1;
- sim_in.EbNodB = 2:8;
- sim_in.verbose = 1;
- sim_in.phase_est = 1;
- sim_in.timing_est = 1;
- sim_in.bitspertestframe = 100;
- sim_in.nbits = 50000;
- sim_in.phase_offset = 3*pi/4; % in radians
- sim_in.timing_offset = 4; % in samples 0..M-1
- sim_in.freq_offset = 0.001; % fraction of Symbol Rate
- sim_in.plots = [];
- sim_in.sample_clock_offset_ppm = 0;
-
- oqpsk_coh = oqpsk_test(sim_in);
-
- Rs = oqpsk_coh.Rs;
- EbNo = 10 .^ (sim_in.EbNodB/10);
- oqpsk_theory.BERvec = 0.5*erfc(sqrt(EbNo));
-
- % BER v Eb/No curves
-
- figure;
- clf;
- semilogy(sim_in.EbNodB, oqpsk_theory.BERvec,'r+-;OQPSK theory;')
- hold on;
- semilogy(sim_in.EbNodB, oqpsk_coh.BERvec,'g+-;OQPSK sim;')
- hold off;
- grid("minor");
- axis([min(sim_in.EbNodB) max(sim_in.EbNodB) 1E-4 1])
- legend("boxoff");
- xlabel("Eb/No (dB)");
- ylabel("Bit Error Rate (BER)")
-endfunction
-
-
-% Choose one of these to run ------------------------------------------
-
-run_oqpsk_single
-%run_oqpsk_curves
-
diff --git a/octave/papr_test.m b/octave/papr_test.m
deleted file mode 100644
index 3785e25..0000000
--- a/octave/papr_test.m
+++ /dev/null
@@ -1,407 +0,0 @@
-% papr_test.m
-%
-% Experiments with PAPR reduction using clipping/compression
-%
-% OFDM Tx -> compress -> filter -> normalise power -> channel -> OFDM Rx
-
-#{
- TODO:
- [ ] option for normalised power after clipper
- [ ] experiment to plot those curves
-#}
-
-1;
-
-function symbol = qpsk_mod(two_bits)
- two_bits_decimal = sum(two_bits .* [2 1]);
- switch(two_bits_decimal)
- case (0) symbol = 1;
- case (1) symbol = j;
- case (2) symbol = -j;
- case (3) symbol = -1;
- endswitch
-endfunction
-
-function two_bits = qpsk_demod(symbol)
- bit0 = real(symbol*exp(j*pi/4)) < 0;
- bit1 = imag(symbol*exp(j*pi/4)) < 0;
- two_bits = [bit1 bit0];
-endfunction
-
-function papr = calc_papr(tx)
- papr = 10*log10(max(abs(tx).^2)/mean(abs(tx).^2));
-end
-
-% test PAPR calculation with a two tone signal of known PAPR (3dB)
-function test_papr
- f1=800; f2=1200; Fs=8000; n=(0:Fs-1);
- tx=exp(j*2*pi*n*f1/Fs) + exp(j*2*pi*n*f2/Fs);
- papr = calc_papr(tx);
- assert(abs(papr-3.0) < 0.05, 'test_papr() failed!')
-end
-
-% "Genie" OFDM modem simulation that assumes ideal sync
-
-function [ber papr] = run_sim(Nc, Nsym, EbNodB, channel='awgn', plot_en=0, filt_en=0, method="", threshold=1, norm_ebno=0)
- rand('seed',1);
- randn('seed',1);
-
- M = 160; % number of samples in each symbol
- bps = 2; % two bits per symbol for QPSK
- Ncp = 16; % cyclic prefix samples
- Fs = 8000;
-
- phase_est = 1; % perform phase estimation/correction
- timing = Ncp;
-
- if strcmp(method,"diversity")
- % total power of tx symbol after combination the same. Scatter plot positions
- % different but also twice as much noise (bandwidth)
- Nd = 2; gain = 1/sqrt(2);
- else
- Nd = 1; gain = 1.0;
- end
-
- if strcmp(channel,'multipath')
- dopplerSpreadHz = 1; path_delay = Ncp/2;
- Nsam = floor(Nsym*(M+Ncp)*1.1);
- spread1 = doppler_spread(dopplerSpreadHz, Fs, Nsam);
- spread2 = doppler_spread(dopplerSpreadHz, Fs, Nsam);
- end
-
- papr_log = [];
- for e=1:length(EbNodB)
- % generate a 2D array of QPSK symbols
-
- Nphases = 2^bps;
- tx_phases = pi/2*floor((rand(Nsym,Nc)*Nphases));
- if strcmp(method,"diversity")
- % duplicate carriers but with opposite phase
- tx_phases = [tx_phases (tx_phases-pi/2)];
- end
- tx_sym = gain*exp(j*tx_phases);
-
- % carrier frequencies, centre about 0
- st = floor(Nc*Nd/2);
- w = 2*pi/M*(-st:-st+Nc*Nd-1);
-
- % generate OFDM signal
-
- tx = [];
- for s=1:Nsym
- atx = zeros(1,M);
- for c=1:Nc*Nd
- atx += exp(j*(0:M-1)*w(c))*tx_sym(s,c);
- end
- % insert cyclic prefix and build up stream of time domain symbols
- % note CP costs us 10*log10((Ncp+M)/M) in Eb, as energy in CP isn't used for demodulation
- tx = [tx atx(end-Ncp+1:end) atx];
- end
- Nsam = length(tx);
-
- if strcmp(channel,'multipath')
- assert(length(spread1) >= Nsam);
- assert(length(spread2) >= Nsam);
- end
-
- % bunch of PAPR reduction options
- tx_ = tx;
-
- % determine threshold based on CDF
- cdf = empirical_cdf((1:Nc),abs(tx));
- if strcmp(method, "clip") || strcmp(method, "diversity") || strcmp(method, "compand")
- if threshold < 1
- threshold_level = find(cdf >= threshold)(1);
- else
- threshold_level = 10*Nc;
- end
-
- % printf("threshold: %f threshold_level: %f\n", threshold, threshold_level);
- end
-
- if strcmp(method, "clip") || strcmp(method, "diversity")
- ind = find(abs(tx) > threshold_level);
- tx_(ind) = threshold_level*exp(j*angle(tx(ind)));
- end
- if strcmp(method, "compand")
- # power law compander x = a*y^power, y = (x/a) ^ (1/power)
- power=2; a=threshold_level/(threshold_level^power);
- tx_mag = (abs(tx)/a) .^ (1/power);
- tx_ = tx_mag.*exp(j*angle(tx));
- end
-
- if filt_en
- Nfilt=80;
- b = fir1(Nfilt,2*Nc*Nd/M);
- tx_ = filter(b,1,[tx_ zeros(1,Nfilt/2)]);
- tx_ = [tx_(Nfilt/2+1:end)];
- end
-
- rx = tx_;
-
- % multipath channel
-
- if phase_est
- % estimate phase of each symbol before multipath simulation
-
- rx_phase1 = zeros(Nsym,Nc);
- for s=1:Nsym
- st = (s-1)*(M+Ncp)+1+timing; en = st+M-1;
- for c=1:Nc*Nd
- rx_phase1(s,c) = sum(exp(-j*(0:M-1)*w(c)) .* rx(st:en))/M;
- end
- end
- end
-
- if strcmp(channel,'multipath')
- rx = spread1(1:Nsam).*rx + spread2(1:Nsam).*[zeros(1,path_delay) rx(1:end-path_delay)];
- end
-
- % normalise power after multipath, so that Eb/No is set up
- % correctly
-
- if norm_ebno == 0
- norm = sqrt(mean(abs(tx_).^2)/mean(abs(rx).^2));
- else
- % normalise after clipper, this makes norm_pwr constant for all test
- % conditions
- norm = sqrt(mean(abs(tx).^2)/mean(abs(rx).^2));
- end
- rx *= norm;
- norm_pwr = 10*log10(mean(abs(rx).^2));
-
- if phase_est
- % auxiliary rx to get ideal phase ests on signal after multipath but before AWGN noise is added
-
- rx_phase = zeros(Nsym,Nc);
- for s=1:Nsym
- st = (s-1)*(M+Ncp)+1+timing; en = st+M-1;
- for c=1:Nc*Nd
- arx_sym = sum(exp(-j*(0:M-1)*w(c)) .* rx(st:en))/M;
- rx_phase(s,c) = arx_sym * conj(rx_phase1(s,c));
- end
- end
- rx_phase = exp(j*arg(rx_phase));
- end
-
- % AWGN channel
-
- EsNodB = EbNodB(e) + 10*log10(bps);
- variance = M/(10^(EsNodB/10));
- noise = sqrt(variance/2)*randn(1,Nsam) + j*sqrt(variance/2)*randn(1,Nsam);
- rx += noise;
-
- % demodulate
- rx_sym = zeros(Nsym,Nc);
- for s=1:Nsym
- st = (s-1)*(M+Ncp)+1+timing; en = st+M-1;
- for c=1:Nc*Nd
- rx_sym(s,c) = sum(exp(-j*(0:M-1)*w(c)) .* rx(st:en))/M;
- if phase_est rx_sym(s,c) *= conj(rx_phase(s,c)); end
- end
-
- if strcmp(method,"diversity")
- for c=1:Nc
- rx_sym(s,c) += rx_sym(s,c+Nc)*exp(j*pi/2);
- end
- end
- end
-
- % count bit errors
-
- Tbits = Terrs = 0; ErrPerSym = zeros(1,Nsym);
- for s=1:Nsym
- Nerrs = 0;
- for c=1:Nc
- tx_bits = qpsk_demod(tx_sym(s,c));
- rx_bits = qpsk_demod(rx_sym(s,c));
- Tbits += bps;
- Nerrs += sum(xor(tx_bits,rx_bits));
- end
- ErrPerSym(s) = Nerrs;
- Terrs += Nerrs;
- end
-
- if plot_en
- figure(1); clf;
- plot(abs(tx(1:5*M))); hold on; plot(abs(tx_(1:5*M))); hold off;
- axis([0 5*M 0 max(abs(tx))]);
- figure(2); clf; [hh nn] = hist(abs(tx),25,1);
- plotyy(nn,hh,1:Nc,cdf); title('PDF and CDF'); grid;
- figure(3); clf; plot(real(rx_sym(:,1:Nc)), imag(rx_sym(:,1:Nc)), '+'); axis([-2 2 -2 2]);
- figure(4); clf; Tx_ = 10*log10(abs(fft(tx_))); plot(fftshift(Tx_));
- mx = 10*ceil(max(Tx_)/10); axis([1 length(Tx_) mx-60 mx]);
- figure(5); plot_specgram(real(rx.*exp(j*2*pi*(0:Nsam-1)/4)));
- figure(6); clf; stem(ErrPerSym);
- end
-
- papr1 = calc_papr(tx);
- papr2 = calc_papr(tx_);
- papr_log = [papr_log papr2];
- ber(e) = Terrs/Tbits;
- printf("EbNodB: %4.1f %3.1f %4.1f PAPR: %5.2f %5.2f Tbits: %6d Terrs: %6d BER: %5.3f\n",
- EbNodB(e), norm, norm_pwr, papr1, papr2, Tbits, Terrs, ber(e))
- end
-
- papr = mean(papr_log);
-end
-
-% BER versus Eb/No curves -------------------------------------
-
-% first pass at trying out a few different schemes
-function curves_experiment1(Nc=8, channel='awgn', Nsym=1000, EbNodB=2:8)
-
- [ber1 papr1] = run_sim(Nc, Nsym, EbNodB, channel, 0, filt_en=1);
- [ber2 papr2] = run_sim(Nc, Nsym, EbNodB, channel, 0, filt_en=1, "clip", threshold=0.8);
- [ber3 papr3] = run_sim(Nc, Nsym, EbNodB, channel, 0, filt_en=1, "clip", threshold=0.6);
- [ber4 papr4] = run_sim(Nc, Nsym, EbNodB, channel, 0, filt_en=1, "compand", threshold=0.6);
- [ber5 papr5] = run_sim(Nc, Nsym, EbNodB, channel, 0, filt_en=1, "diversity", threshold=0.6);
-
- figure(7); clf;
- semilogy(EbNodB, ber1,sprintf('b+-;vanilla OFDM %3.1f;',papr1),'markersize', 10, 'linewidth', 2); hold on;
- semilogy(EbNodB, ber2,sprintf('r+-;clip 0.8 %3.1f;',papr2),'markersize', 10, 'linewidth', 2);
- semilogy(EbNodB, ber3,sprintf('g+-;clip 0.6 %3.1f;',papr3),'markersize', 10, 'linewidth', 2);
- semilogy(EbNodB, ber4,sprintf('c+-;compand 0.6 %3.1f;',papr4),'markersize', 10, 'linewidth', 2);
- semilogy(EbNodB, ber5,sprintf('bk+-;diversity 0.6 %3.1f;',papr5),'markersize', 10, 'linewidth', 2);
- hold off;
- axis([min(EbNodB) max(EbNodB) 1E-3 1E-1]); grid;
- xlabel('Eb/No'); title(sprintf("%s Nc = %d", channel, Nc))
- fn = sprintf("papr_exp1_%s_BER_EbNo.png", channel);
- print(fn,"-dpng");
-
- figure(8); clf;
- semilogy(EbNodB+papr1, ber1,sprintf('b+-;vanilla OFDM %3.1f;',papr1),'markersize', 10, 'linewidth', 2); hold on;
- semilogy(EbNodB+papr2, ber2,sprintf('r+-;clip 0.8 %3.1f;',papr2),'markersize', 10, 'linewidth', 2);
- semilogy(EbNodB+papr3, ber3,sprintf('g+-;clip 0.6 %3.1f;',papr3),'markersize', 10, 'linewidth', 2);
- semilogy(EbNodB+papr4, ber4,sprintf('c+-;compand 0.6 %3.1f;',papr4),'markersize', 10, 'linewidth', 2);
- semilogy(EbNodB+papr5, ber5,sprintf('bk+-;diversity 0.6 %3.1f;',papr5),'markersize', 10, 'linewidth', 2);
- hold off;
- xlabel('Peak Eb/No');
- axis([min(EbNodB)+papr2 max(EbNodB)+papr1 1E-3 1E-1]); grid; title(sprintf("%s Nc = %d", channel, Nc))
- fn = sprintf("papr_exp1_%s_BER_peakEbNo.png", channel);
- print(fn,"-dpng");
-end
-
-
-% vary threshold and plot BER v Eb/No curves
-function curves_experiment2(Nc=8, channel='awgn', Nsym=1000, EbNodB=2:16)
-
- [ber1 papr1] = run_sim(Nc, Nsym, EbNodB, channel, 0, filt_en=1);
- [ber2 papr2] = run_sim(Nc, Nsym, EbNodB, channel, 0, filt_en=1, "clip", threshold=0.8);
- [ber3 papr3] = run_sim(Nc, Nsym, EbNodB, channel, 0, filt_en=1, "clip", threshold=0.6);
- [ber4 papr4] = run_sim(Nc, Nsym, EbNodB, channel, 0, filt_en=1, "clip", threshold=0.4);
- [ber5 papr5] = run_sim(Nc, Nsym, EbNodB, channel, 0, filt_en=1, "clip", threshold=0.2);
- [ber6 papr6] = run_sim(Nc, Nsym, EbNodB, channel, 0, filt_en=1, "diversity", threshold=0.8);
-
- figure(7); clf;
- semilogy(EbNodB, ber1,sprintf('b+-;vanilla OFDM %3.1f;',papr1),'markersize', 10, 'linewidth', 2); hold on;
- semilogy(EbNodB, ber2,sprintf('r+-;clip 0.8 %3.1f;',papr2),'markersize', 10, 'linewidth', 2);
- semilogy(EbNodB, ber3,sprintf('g+-;clip 0.6 %3.1f;',papr3),'markersize', 10, 'linewidth', 2);
- semilogy(EbNodB, ber4,sprintf('c+-;clip 0.4 %3.1f;',papr4),'markersize', 10, 'linewidth', 2);
- semilogy(EbNodB, ber5,sprintf('bk+-;clip 0.2 %3.1f;',papr5),'markersize', 10, 'linewidth', 2);
- semilogy(EbNodB, ber6,sprintf('m+-;diversity 0.8 %3.1f;', papr6),'markersize', 10, 'linewidth', 2);
- hold off;
- axis([min(EbNodB) max(EbNodB) 1E-3 1E-1]); grid;
- xlabel('Eb/No'); title(sprintf("%s Nc = %d", channel, Nc))
- fn = sprintf("papr_exp2_Nc%d_%s_BER_EbNo.png", Nc, channel);
- print(fn,"-dpng");
-
- figure(8); clf;
- semilogy(EbNodB+papr1, ber1,sprintf('b+-;vanilla OFDM %3.1f;',papr1),'markersize', 10, 'linewidth', 2); hold on;
- semilogy(EbNodB+papr2, ber2,sprintf('r+-;clip 0.8 %3.1f;',papr2),'markersize', 10, 'linewidth', 2);
- semilogy(EbNodB+papr3, ber3,sprintf('g+-;clip 0.6 %3.1f;',papr3),'markersize', 10, 'linewidth', 2);
- semilogy(EbNodB+papr4, ber4,sprintf('c+-;clip 0.4 %3.1f;',papr4),'markersize', 10, 'linewidth', 2);
- semilogy(EbNodB+papr5, ber5,sprintf('bk+-;clip 0.2 %3.1f;',papr5),'markersize', 10, 'linewidth', 2);
- semilogy(EbNodB+papr6, ber6,sprintf('m+-;diversity 0.8 %3.1f;', papr6),'markersize', 10, 'linewidth', 2);
- hold off;
- xlabel('Peak Eb/No');
- axis([min(EbNodB)+papr2 max(EbNodB)+papr1 1E-3 1E-1]); grid; title(sprintf("%s Nc = %d", channel, Nc))
- fn = sprintf("papr_exp2_Nc%d_%s_BER_peakEbNo.png", Nc, channel);
- print(fn,"-dpng");
-end
-
-% PAPR against number of carriers Nc
-function curves_experiment3(Nsym=3000)
-
- paper = zeros(1,32);
- Nc = 2:2:32;
- for i = 1:length(Nc)
- aNc = Nc(i);
- [aber apapr] = run_sim(aNc, Nsym, 100);
- papr(aNc) = apapr;
- end
-
- figure(9); clf;
- plot(Nc, papr(Nc)); xlabel('Number of Carriers Nc'); ylabel('PAPR (dB)'); grid;
- fn = sprintf("papr_exp3_Nc.png");
- print(fn,"-dpng");
-end
-
-% focus on diversity - vary threshold and plot BER v Eb/No curves
-function curves_experiment4(Nc=8, channel='multipath', Nsym=3000, EbNodB=2:2:16)
-
- [ber1 papr1] = run_sim(Nc, Nsym, EbNodB, channel, 0, filt_en=1);
- [ber2 papr2] = run_sim(Nc, Nsym, EbNodB, channel, 0, filt_en=1, "diversity", threshold=1);
- [ber3 papr3] = run_sim(Nc, Nsym, EbNodB, channel, 0, filt_en=1, "diversity", threshold=0.8);
- [ber4 papr4] = run_sim(Nc, Nsym, EbNodB, channel, 0, filt_en=1, "diversity", threshold=0.6);
-
- figure(7); clf;
- semilogy(EbNodB, ber1,sprintf('b+-;vanilla OFDM %3.1f;',papr1),'markersize', 10, 'linewidth', 2); hold on;
- semilogy(EbNodB, ber2,sprintf('r+-;diversity 1.0 %3.1f;',papr2),'markersize', 10, 'linewidth', 2);
- semilogy(EbNodB, ber3,sprintf('g+-;diversity 0.8 %3.1f;',papr3),'markersize', 10, 'linewidth', 2);
- semilogy(EbNodB, ber4,sprintf('c+-;diversity 0.6 %3.1f;',papr4),'markersize', 10, 'linewidth', 2);
- hold off;
- axis([min(EbNodB) max(EbNodB) 1E-3 1E-1]); grid;
- xlabel('Eb/No'); title(sprintf("%s Nc = %d", channel, Nc))
- fn = sprintf("papr_exp4_Nc%d_%s_BER_EbNo.png", Nc, channel);
- print(fn,"-dpng");
-
- figure(8); clf;
- semilogy(EbNodB+papr1, ber1,sprintf('b+-;vanilla OFDM %3.1f;',papr1),'markersize', 10, 'linewidth', 2); hold on;
- semilogy(EbNodB+papr2, ber2,sprintf('r+-;diversity 1.0 %3.1f;',papr2),'markersize', 10, 'linewidth', 2);
- semilogy(EbNodB+papr3, ber3,sprintf('g+-;diversity 0.8 %3.1f;',papr3),'markersize', 10, 'linewidth', 2);
- semilogy(EbNodB+papr4, ber4,sprintf('c+-;diversity 0.6 %3.1f;',papr4),'markersize', 10, 'linewidth', 2);
- hold off;
- xlabel('Peak Eb/No');
- axis([min(EbNodB)+papr4 max(EbNodB)+papr1 1E-3 1E-1]); grid; title(sprintf("%s Nc = %d", channel, Nc))
- fn = sprintf("papr_exp4_Nc%d_%s_BER_peakEbNo.png", Nc, channel);
- print(fn,"-dpng");
-end
-
-% plot BER v Eb/No curves for clipping with normalised Eb/No after clipping
-function curves_experiment5(Nc=8, channel='awgn', Nsym=1000, EbNodB=2:10)
-
- [ber1 papr1] = run_sim(Nc, Nsym, EbNodB, channel, 0, filt_en=1, "", threshold=1, norm=1);
- [ber2 papr2] = run_sim(Nc, Nsym, EbNodB, channel, 0, filt_en=1, "clip", threshold=0.8, norm=1);
- [ber3 papr3] = run_sim(Nc, Nsym, EbNodB, channel, 0, filt_en=1, "clip", threshold=0.6, norm=1);
- [ber4 papr4] = run_sim(Nc, Nsym, EbNodB, channel, 0, filt_en=1, "clip", threshold=0.4, norm=1);
- [ber5 papr5] = run_sim(Nc, Nsym, EbNodB, channel, 0, filt_en=1, "clip", threshold=0.2, norm=1);
-
- figure(7); clf;
- semilogy(EbNodB, ber1,sprintf('b+-;vanilla OFDM %3.1f;',papr1),'markersize', 10, 'linewidth', 2); hold on;
- semilogy(EbNodB, ber2,sprintf('r+-;clip 0.8 %3.1f;',papr2),'markersize', 10, 'linewidth', 2);
- semilogy(EbNodB, ber3,sprintf('g+-;clip 0.6 %3.1f;',papr3),'markersize', 10, 'linewidth', 2);
- semilogy(EbNodB, ber4,sprintf('c+-;clip 0.4 %3.1f;',papr4),'markersize', 10, 'linewidth', 2);
- semilogy(EbNodB, ber5,sprintf('bk+-;clip 0.2 %3.1f;',papr5),'markersize', 10, 'linewidth', 2);
- hold off;
- axis([min(EbNodB) max(EbNodB) 1E-3 1E-1]); grid;
- xlabel('Eb/No'); title(sprintf("%s Nc = %d", channel, Nc))
- fn = sprintf("papr_exp5_Nc%d_%s_BER_EbNo.png", Nc, channel);
- print(fn,"-dpng");
-end
-
-pkg load statistics;
-more off;
-
-test_papr;
-
-% single point with lots of plots -----------
-
-%run_sim(8, 1000, EbNo=100, channel='awgn', plot_en=1, filt_en=1);
-%run_sim(8, 8, EbNo=100, channel='awgn', plot_en=1, filt_en=1, "diversity", threshold=0.8);
-%run_sim(8, 1000, EbNo=10, channel='multipath', plot_en=1, filt_en=0, "diversity", threshold=5);
-%curves_experiment2(Nc=16, 'awgn', Nsym=1000);
-curves_experiment2(Nc=16,'multipath', Nsym=3000, EbNodB=2:2:16);
-%curves_experiment3()
-%curves_experiment4()
-%curves_experiment5(Nc=16)
diff --git a/octave/phase_noise.m b/octave/phase_noise.m
deleted file mode 100644
index 37e933c..0000000
--- a/octave/phase_noise.m
+++ /dev/null
@@ -1,72 +0,0 @@
-% phase_noise.m
-% David Nov 2019
-
-% Close-in look at phase noise. Feed in a off-air sample file of a
-% sine wave, extracts the phase noise contour and returns the Doppler
-% spreading function that can be used to model the channel in
-% simulations
-
-function spread_FsHz = phase_noise(file_name)
- Fs = 8000;
- s = load_raw(file_name);
- % skip past wave header
- s = [zeros(256,1); s(256:end)];
- S = abs(fft(s(1:Fs).*hanning(Fs)));
- [mx mx_bin] = max(S);
- ftone = mx_bin-1;
-
- figure(1); clf;
- plot(20*log10(S(1:Fs/2)))
- title('Input Spectrum');
-
- % downshift to baseband and LPF. We just want the sinusoid with as little
- % additive AWGN noise as possible
- sbb = s' .* exp(-j*(1:length(s))*2*pi*ftone/Fs);
- [b a] = cheby1(4, 1, 20/Fs);
- sbb_lpf = filter(b,a,sbb);
-
- spread_fsHz = sbb_lpf;
-
- % estimate and remove fine freq offset, and HF phase noise
-
- st = Fs; en = 20*Fs;
- phase = unwrap(angle(sbb_lpf(st:en)));
- fine_freq = mean(phase(2:end) - phase(1:end-1));
- sbb_lpf_fine = sbb_lpf .* exp(-j*(1:length(sbb_lpf))*fine_freq);
- phase = unwrap(angle(sbb_lpf_fine(st:en)));
-
- printf("length: %3.2fs freq: %5.1f\n", length(s)/Fs, ftone+fine_freq*Fs/(2*pi));
-
- figure(2); clf;
- plot3((st:en)/Fs, real(sbb_lpf_fine(st:en)),imag(sbb_lpf_fine(st:en)))
- title('Polar phase trajectory');
-
- figure(3); clf;
- S2 = fftshift(fft(sbb_lpf_fine(Fs:Fs*11)));
- [mx mx_bin] = max(abs(S2));
- S2dB = 20*log10(abs(S2));
- mxdB = 10*ceil(max(S2dB)/10);
- x = -10:0.1:10;
- plot(x,S2dB(mx_bin-100:mx_bin+100));
- axis([-10 10 mxdB-40 mxdB])
- title('Close in Phase Noise Spectrum');
- xlabel('Freq (Hz)');
- grid;
-
- figure(5); clf;
- t = (st:en)/Fs;
- plot(t, phase,'b;phase;');
- title('Unwrapped Phase');
- xlabel('Time (sec)')
- ylabel('Phase (radians)')
-
- figure(6); clf;
- beta = 0.00001;
- rate_of_change_Hz = filter(beta, [1 -(1-beta)],phase(2:end) - phase(1:end-1))*Fs/pi;
- plot(t(2:end), rate_of_change_Hz)
- title('Rate of change of phase (Hz)');
- xlabel('Time (sec)')
- ylabel('Freq (Hz)')
-
- spread_FsHz = sbb_lpf_fine/std(sbb_lpf_fine);
-end
diff --git a/octave/pitch_test.m b/octave/pitch_test.m
deleted file mode 100644
index 3fe0d1a..0000000
--- a/octave/pitch_test.m
+++ /dev/null
@@ -1,39 +0,0 @@
-% pitch_test.m
-% David Rowe Sep 2009
-% Constructs a sequence to test the pitch estimator
-
-function pitch_test(samname)
- M=320;
- F=200;
-
- fs=fopen(samname,"wb");
-
- f0 = 100;
- for f=1:200
- Wo=2*pi*f0/8000;
- P=2*pi/Wo;
- L = floor(pi/Wo);
- A = 10000/L;
- phi = zeros(1,L);
- s = zeros(1,M);
-
- for m=1:L
- s = s + A*cos(m*Wo*(0:(M-1)) + phi(m));
- endfor
-
- figure(1);
- clf;
- plot(s);
-
- fwrite(fs,s,"short");
-
- f0 = f0 + 5;
- if (f0 > 400)
- f0 = 100;
- endif
- endfor
-
- fclose(fs);
-
-endfunction
-
diff --git a/octave/pl.m b/octave/pl.m
deleted file mode 100644
index 0d54788..0000000
--- a/octave/pl.m
+++ /dev/null
@@ -1,45 +0,0 @@
-% Copyright David Rowe 2009
-% This program is distributed under the terms of the GNU General Public License
-% Version 2
-%
-% Plots a raw speech sample file, you can optionally specify the start and end
-% samples and create a large and small PNGs
-
-function pl(samname1, start_sam, end_sam, pngname)
-
- fs=fopen(samname1,"rb");
- s=fread(fs,Inf,"short");
-
- st = 1;
- en = length(s);
- if (nargin >= 2)
- st = start_sam;
- endif
- if (nargin >= 3)
- en = end_sam;
- endif
-
- figure(1);
- clf;
- plot(s(st:en));
- axis([1 en-st 1.1*min(s) 1.1*max(s)]);
-
- if (nargin == 4)
-
- % small image
-
- __gnuplot_set__ terminal png size 420,300
- ss = sprintf("__gnuplot_set__ output \"%s.png\"", pngname);
- eval(ss)
- replot;
-
- % larger image
-
- __gnuplot_set__ terminal png size 800,600
- ss = sprintf("__gnuplot_set__ output \"%s_large.png\"", pngname);
- eval(ss)
- replot;
-
- endif
-
-endfunction
diff --git a/octave/pl2.m b/octave/pl2.m
deleted file mode 100644
index a25c6a2..0000000
--- a/octave/pl2.m
+++ /dev/null
@@ -1,44 +0,0 @@
-% Copyright David Rowe 2009
-% This program is distributed under the terms of the GNU General Public License
-% Version 2
-
-function pl2(samname1, samname2, start_sam, end_sam, offset)
-
- fs1=fopen(samname1,"rb");
- s1=fread(fs1,Inf,"short");
- fs2=fopen(samname2,"rb");
- s2=fread(fs2,Inf,"short");
-
- st1 = st2 = 1;
- en1 = en2 = length(s1);
- if (nargin >= 3)
- st1 = st2 = start_sam;
- endif
- if (nargin >= 4)
- en1 = en2 = end_sam;
- endif
-
- if (nargin == 5)
- st2 += offset
- en2 += offset
- endif
-
- figure(1);
- clf;
- subplot(211);
- l1 = strcat("r;",samname1,";");
- plot(s1(st1:en1), l1); grid minor;
- axis([1 en1-st1 min(s1(st1:en1)) max(s1(st1:en1))]);
- subplot(212);
- l2 = strcat("r;",samname2,";");
- plot(s2(st2:en2),l2); grid minor;
- axis([1 en2-st2 min(s1(st2:en2)) max(s1(st2:en2))]);
-
- figure(2)
- plot(s1(st1:en1)-s2(st2:en2)); grid minor;
-
- f=fopen("diff.raw","wb");
- d = s1(st1:en1)-s2(st2:en2);
- fwrite(f,d,"short");
-
-endfunction
diff --git a/octave/pl_scatter.m b/octave/pl_scatter.m
deleted file mode 100644
index bc283a3..0000000
--- a/octave/pl_scatter.m
+++ /dev/null
@@ -1,13 +0,0 @@
-% pl_scatter.m
-% Render scatter plot from freedv_data_raw_rx --scatter
-
-function pl_scatter(filename)
- s=load(filename);
- figure(1); clf;
- for b=1:length(fieldnames(s))
- field_name = fieldnames(s){b};
- x = s.(field_name);
- plot(x,'+');
- end
- print("scatter.png", "-dpng");
-endfunction
diff --git a/octave/plamp.m b/octave/plamp.m
deleted file mode 100644
index 1d575b8..0000000
--- a/octave/plamp.m
+++ /dev/null
@@ -1,135 +0,0 @@
-% Copyright David Rowe 2009
-% This program is distributed under the terms of the GNU General Public License
-% Version 2
-%
-% Plot ampltiude modelling information from dump files.
-
-function plamp(samname, f, samname2)
-
- % switch some stuff off to unclutter display
-
- plot_sw = 0;
-
- sn_name = strcat(samname,"_sn.txt");
- Sn = load(sn_name);
-
- sw_name = strcat(samname,"_sw.txt");
- Sw = load(sw_name);
-
- sw__name = strcat(samname,"_sw_.txt");
- if (file_in_path(".",sw__name))
- Sw_ = load(sw__name);
- endif
-
- ew_name = strcat(samname,"_ew.txt");
- if (file_in_path(".",ew_name))
- Ew = load(ew_name);
- endif
-
- rk_name = strcat(samname,"_rk.txt");
- if (file_in_path(".",rk_name))
- Rk = load(rk_name);
- endif
-
- model_name = strcat(samname,"_model.txt");
- model = load(model_name);
-
- modelq_name = strcat(samname,"_qmodel.txt");
- if (file_in_path(".",modelq_name))
- modelq = load(modelq_name);
- endif
-
- pw_name = strcat(samname,"_pw.txt");
- if (file_in_path(".",pw_name))
- Pw = load(pw_name);
- endif
-
- lsp_name = strcat(samname,"_lsp.txt");
- if (file_in_path(".",lsp_name))
- lsp = load(lsp_name);
- endif
-
- phase_name = strcat(samname,"_phase.txt");
- if (file_in_path(".",phase_name))
- phase = load(phase_name);
- endif
-
- phase_name_ = strcat(samname,"_phase_.txt");
- if (file_in_path(".",phase_name_))
- phase_ = load(phase_name_);
- endif
-
- snr_name = strcat(samname,"_snr.txt");
- if (file_in_path(".",snr_name))
- snr = load(snr_name);
- endif
-
- % optional second file, for exploring post filter
-
- if nargin == 3
- model2_name = strcat(samname2,"_model.txt");
- model2 = load(model2_name);
- sn2_name = strcat(samname2,"_sn.txt");
- Sn2 = load(sn2_name);
-
- sw_name2 = strcat(samname2,"_sw.txt");
- Sw2 = load(sw_name2);
- end
-
- k = ' ';
- do
- figure(1);
- clf;
- s = [ Sn(2*f-1,:) Sn(2*f,:) ];
- plot(s,'b');
- if (nargin == 3)
- s2 = [ Sn2(2*f-1,:) Sn2(2*f,:) ];
- hold on; plot(s2,'r'); hold off;
- end
- axis([1 length(s) -30000 30000]);
-
- figure(2);
- Wo = model(f,1);
- L = model(f,2);
- Am = model(f,3:(L+2));
- plot((1:L)*Wo*4000/pi, 20*log10(Am),";Am;+-b");
- axis([1 4000 -10 80]);
- hold on;
- if plot_sw; plot((0:255)*4000/256, Sw(f,:),";Sw;b"); end
-
- if (nargin == 3)
- Wo2 = model2(f,1);
- L2 = model2(f,2);
- Am2 = model2(f,3:(L2+2));
- plot((1:L2)*Wo2*4000/pi, 20*log10(Am2),";Am2;+-r" );
- if plot_sw; plot((0:255)*4000/256, Sw2(f,:),";Sw2;r"); end
- endif
-
- hold off; grid minor;
-
- % interactive menu
-
- printf("\rframe: %d menu: n-next b-back p-png s-plot_sw q-quit", f);
- fflush(stdout);
- k = kbhit();
- if k == 'n'; f = f + 1; endif
- if k == 'b'; f = f - 1; endif
- if k == 's'
- if plot_sw; plot_sw = 0; else; plot_sw = 1; end
- endif
- % optional print to PNG
-
- if (k == 'p')
- figure(1);
- pngname = sprintf("%s_%d_sn.png",samname,f);
- print(pngname, '-dpng', "-S800,600")
-
- figure(2);
- pngname = sprintf("%s_%d_sw.png",samname,f);
- print(pngname, '-dpng', "-S800,600")
- endif
-
- until (k == 'q')
- printf("\n");
-
-endfunction
diff --git a/octave/plinterp.m b/octave/plinterp.m
deleted file mode 100644
index 794a085..0000000
--- a/octave/plinterp.m
+++ /dev/null
@@ -1,11 +0,0 @@
-load ../unittest/tinterp_prev.txt;
-load ../unittest/tinterp_interp.txt;
-load ../unittest/tinterp_next.txt;
-
-clf;
-plot(tinterp_prev(:,1), 20.0*log10(tinterp_prev(:,2)),";prev;")
-hold on;
-plot(tinterp_interp(:,1), 20.0*log10(tinterp_interp(:,2)),'g+-;interp;')
-plot(tinterp_next(:,1), 20.0*log10(tinterp_next(:,2)),'ro-;next;')
-hold off;
-axis([0 pi 0 80])
diff --git a/octave/pllpcpf.m b/octave/pllpcpf.m
deleted file mode 100644
index 924e045..0000000
--- a/octave/pllpcpf.m
+++ /dev/null
@@ -1,150 +0,0 @@
-% Copyright David Rowe 2012
-% This program is distributed under the terms of the GNU General Public License
-% Version 2
-%
-% Plot amplitude modelling information from dump files to test and develop
-% LPC post filter.
-
-function pllpcpf(samname, f)
-
- % switch some stuff off to unclutter display
-
- plot_Am = 0;
- plot_Amq = 0;
- plot_err = 0;
- plot_lsp = 0;
- plot_snr = 0;
- plot_vsnr = 0;
- plot_sw = 0;
- plot_pw = 1;
- plot_pwb = 1;
- plot_rw = 1;
-
- sn_name = strcat(samname,"_sn.txt");
- Sn = load(sn_name);
-
- sw_name = strcat(samname,"_sw.txt");
- Sw = load(sw_name);
-
- sw__name = strcat(samname,"_sw_.txt");
- if (file_in_path(".",sw__name))
- Sw_ = load(sw__name);
- endif
-
- model_name = strcat(samname,"_model.txt");
- model = load(model_name);
-
- modelq_name = strcat(samname,"_qmodel.txt");
- if (file_in_path(".",modelq_name))
- modelq = load(modelq_name);
- endif
-
- % Pw (LPC synth filter spectrum) before post filter
-
- pwb_name = strcat(samname,"_pwb.txt");
- if (file_in_path(".",pwb_name))
- Pwb = load(pwb_name);
- endif
-
- % Rw (Post filter spectrum)
-
- rw_name = strcat(samname,"_rw.txt");
- if (file_in_path(".",rw_name))
- Rw = load(rw_name);
- endif
-
- % Pw (LPC synth filter spectrum) after post filter
-
- pw_name = strcat(samname,"_pw.txt");
- if (file_in_path(".",pw_name))
- Pw = load(pw_name);
- endif
-
-
- Ew_on = 1;
- k = ' ';
- do
- figure(1);
- clf;
- s = [ Sn(2*f-1,:) Sn(2*f,:) ];
- size(s);
- plot(s);
- axis([1 length(s) -20000 20000]);
-
- figure(2);
- clf;
- Wo = model(f,1);
- L = model(f,2);
- Am = model(f,3:(L+2));
- if plot_Am
- plot((1:L)*Wo*4000/pi, 20*log10(Am),";Am;r");
- end
- axis([1 4000 -10 80]);
- hold on;
- if plot_sw
- plot((0:255)*4000/256, Sw(f,:),";Sw;");
- end
-
- if (file_in_path(".",modelq_name))
-
- Amq = modelq(f,3:(L+2));
- if plot_Amq
- plot((1:L)*Wo*4000/pi, 20*log10(Amq),";Amq;g" );
- end
-
- if (file_in_path(".",pwb_name) && plot_pwb)
- plot((0:255)*4000/256, 10*log10(Pwb(f,:)),";Pwb;r");
- endif
-
- if (file_in_path(".",rw_name) && plot_rw)
- plot((0:255)*4000/256, 10*log10(Rw(f,:)),";Rw;b");
- endif
-
- if (file_in_path(".",pw_name) && plot_pw)
- plot((0:255)*4000/256, 10*log10(Pw(f,:)),";Pw;g.");
- endif
-
- signal = Am * Am';
- noise = (Am-Amq) * (Am-Amq)';
- snr1 = 10*log10(signal/noise);
- Am_err_label = sprintf(";Am error SNR %4.2f dB;m",snr1);
- if plot_err
- plot((1:L)*Wo*4000/pi, 20*log10(Amq) - 20*log10(Am), Am_err_label);
- end
- endif
-
-
- hold off;
-
- % interactive menu
-
- printf("\rframe: %d menu: n-next b-back p-png q-quit", f);
- fflush(stdout);
- k = kbhit();
- if (k == 'n')
- f = f + 1;
- endif
- if (k == 'b')
- f = f - 1;
- endif
-
- % optional print to PNG
-
- if (k == 'p')
- figure(1);
- pngname = sprintf("%s_%d_sn.png",samname,f);
- print(pngname, '-dpng', "-S500,500")
- pngname = sprintf("%s_%d_sn_large.png",samname,f);
- print(pngname, '-dpng', "-S800,600")
-
- figure(2);
- pngname = sprintf("%s_%d_sw.png",samname,f);
- print(pngname, '-dpng', "-S500,500")
- pngname = sprintf("%s_%d_sw_large.png",samname,f);
- print(pngname, '-dpng', "-S1200,800")
- endif
-
- until (k == 'q')
- printf("\n");
-
-endfunction
diff --git a/octave/pllsp.m b/octave/pllsp.m
deleted file mode 100644
index 0606d3c..0000000
--- a/octave/pllsp.m
+++ /dev/null
@@ -1,46 +0,0 @@
-% Copyright David Rowe 2010
-% This program is distributed under the terms of the GNU General Public License
-% Version 2
-%
-% Plots a bunch of information related to LSP quantisation:
-% - speech file
-% - LSPs before and after quantisation
-% - SNR for each frame
-%
-% Note: there is a 160 sample (two frame delay) from the when a sample
-% enters the input buffer until it is at the centre of the analysis window
-
-function pllsp(rawfile,
- dumpfile_prefix_lpc_only,
- dumpfile_prefix_lsp,
- start_f, end_f)
-
- fs=fopen(rawfile,"rb");
- s=fread(fs,Inf,"short");
-
- lpc_snr_name = strcat(dumpfile_prefix_lpc_only,"_lpc_snr.txt");
- lpc10_snr = load(lpc_snr_name);
- lpc_snr_name = strcat(dumpfile_prefix_lsp,"_lpc_snr.txt");
- lsp_snr = load(lpc_snr_name);
-
- lsp_name = strcat(dumpfile_prefix_lsp,"_lsp.txt");
- lsps = load(lsp_name);
- [m,n]=size(lsps);
- lsp = lsps(1:2:m,:);
- lsp_ = lsps(2:2:m,:);
-
- figure(1);
- clf;
- subplot(211);
- sp = s((start_f-2)*80:(end_f-2)*80);
- plot(sp);
-
- subplot(212);
- plot(lpc10_snr((start_f+1):end_f)-lsp_snr((start_f+1):end_f));
-
- figure(2);
- plot((4000/pi)*lsp((start_f+1):end_f,:));
- hold on;
- plot((4000/pi)*lsp_((start_f+1):end_f,:),'+-');
- hold off;
-endfunction
diff --git a/octave/pllspdt.m b/octave/pllspdt.m
deleted file mode 100644
index c711aa4..0000000
--- a/octave/pllspdt.m
+++ /dev/null
@@ -1,27 +0,0 @@
-% pllspdt.m
-% Copyright David Rowe 2010
-% This program is distributed under the terms of the GNU General Public License
-% Version 2
-%
-% Test script to plot differences in LSps between frames
-
-function pllspdt(rawfile,dumpfile_prefix_lsp,lspn, start_f, end_f)
-
- fs=fopen(rawfile,"rb");
- s=fread(fs,Inf,"short");
-
- lsp_name = strcat(dumpfile_prefix_lsp,"_lsp.txt");
- lsps = load(lsp_name);
- [m,n]=size(lsps);
- lsp = lsps(1:2:m,:);
- lsp_ = lsps(2:2:m,:);
- lspdt = lsp(2:m/2,:) - lsp(1:m/2-1,:);
-
- figure(1);
- clf;
- sp = s((start_f-2)*80:(end_f-2)*80);
- plot(sp);
-
- figure(2);
- plot((4000/pi)*lspdt((start_f+1):end_f,lspn));
-endfunction
diff --git a/octave/plnlp.m b/octave/plnlp.m
deleted file mode 100644
index 01b4931..0000000
--- a/octave/plnlp.m
+++ /dev/null
@@ -1,134 +0,0 @@
-% Copyright David Rowe 2009
-% This program is distributed under the terms of the GNU General Public License
-% Version 2
-%
-% Plot NLP states from dump files.
-
-function plnlp(samname, f)
-
- sn_name = strcat(samname,"_sn.txt");
- Sn = load(sn_name);
-
- sw_name = strcat(samname,"_sw.txt");
- Sw = load(sw_name);
-
- fw_name = strcat(samname,"_fw.txt");
- if (file_in_path(".",fw_name))
- fw = load(fw_name);
- endif
-
- e_name = strcat(samname,"_e.txt");
- if (file_in_path(".",e_name))
- e = load(e_name);
- endif
-
- p_name = strcat(samname,".p");
- if (file_in_path(".",p_name))
- p = load(p_name);
- endif
-
- sq_name = strcat(samname,"_sq.txt");
- if (file_in_path(".",sq_name))
- sq = load(sq_name);
- endif
-
- dec_name = strcat(samname,"_dec.txt");
- if (file_in_path(".",dec_name))
- dec = load(dec_name);
- endif
-
- do
- figure(1);
- clf;
- s = [ Sn(2*f-1,:) Sn(2*f,:) ];
- plot(s, ";Sn;");
- grid
- axis([1 length(s) -20000 20000]);
-
- figure(2);
- plot((0:255)*4000/256, Sw(f,:),";Sw;");
- grid
- axis([1 4000 -10 80]);
- hold on;
-
- f0 = 8000/p(f);
- Wo = 2*pi/p(f);
- L = floor(pi/Wo);
- f0_label = sprintf("b;P=%3.1f F0=%3.0f;",p(f),f0);
- for m=1:L-1
- plot([ m*Wo*4000/pi m*Wo*4000/pi], [10 60], 'b');
- endfor
- plot([ L*Wo*4000/pi L*Wo*4000/pi], [10 60], f0_label);
-
- hold off;
-
- if (file_in_path(".",fw_name))
- figure(3);
- if (file_in_path(".",e_name))
- subplot(211);
- endif
- plot((0:255)*800/256, fw(f,:)/max(fw(f,:)), ";Fw;");
- axis([1 400 0 1]);
- if (file_in_path(".",e_name))
- subplot(212);
- e_concat = [ e(2*f-1,:) e(2*f,:) ];
- plot(e_concat(1:400)/max(e_concat(1:400)), "+;MBE E(f);");
- axis([1 400 0 1]);
- endif
- endif
-
- if (file_in_path(".",sq_name))
- figure(4);
- sq_concat = [ sq(2*f-1,:) sq(2*f,:) ];
- axis
- plot(sq_concat, ";sq;");
- endif
-
- if (file_in_path(".",dec_name))
- figure(5);
- plot(dec(f,:), ";dec;");
- endif
-
- figure(2);
-
- % interactive menu
-
- printf("\rframe: %d menu: n-next b-back p-png q-quit ", f);
- fflush(stdout);
- k = kbhit();
- if (k == 'n')
- f = f + 1;
- endif
- if (k == 'b')
- f = f - 1;
- endif
-
- % optional print to PNG
-
- if (k == 'p')
-
- pngname = sprintf("%s_%d",samname,f);
-
- % small image
-
- __gnuplot_set__ terminal png size 420,300
- ss = sprintf("__gnuplot_set__ output \"%s.png\"", pngname);
- eval(ss)
- replot;
-
- % larger image
-
- __gnuplot_set__ terminal png size 800,600
- ss = sprintf("__gnuplot_set__ output \"%s_large.png\"", pngname);
- eval(ss)
- replot;
-
- % for some reason I need this to stop large plot getting wiped
- __gnuplot_set__ output "/dev/null"
-
- endif
-
- until (k == 'q')
- printf("\n");
-
-endfunction
diff --git a/octave/plphase.m b/octave/plphase.m
deleted file mode 100644
index c12422e..0000000
--- a/octave/plphase.m
+++ /dev/null
@@ -1,198 +0,0 @@
-% Copyright David Rowe 2009
-% This program is distributed under the terms of the GNU General Public License
-% Version 2
-%
-% Plot phase modelling information from dump files.
-
-function plphase(samname, f)
-
- sn_name = strcat(samname,"_sn.txt");
- Sn = load(sn_name);
-
- sw_name = strcat(samname,"_sw.txt");
- Sw = load(sw_name);
-
- model_name = strcat(samname,"_model.txt");
- model = load(model_name);
-
- sw__name = strcat(samname,"_sw_.txt");
- if (file_in_path(".",sw__name))
- Sw_ = load(sw__name);
- endif
-
- pw_name = strcat(samname,"_pw.txt");
- if (file_in_path(".",pw_name))
- Pw = load(pw_name);
- endif
-
- ak_name = strcat(samname,"_ak.txt");
- if (file_in_path(".",ak_name))
- ak = load(ak_name);
- endif
-
- phase_name = strcat(samname,"_phase.txt");
- if (file_in_path(".",phase_name))
- phase = load(phase_name);
- endif
-
- phase_name_ = strcat(samname,"_phase_.txt");
- if (file_in_path(".",phase_name_))
- phase_ = load(phase_name_);
- endif
-
- snr_name = strcat(samname,"_snr.txt");
- if (file_in_path(".",snr_name))
- snr = load(snr_name);
- endif
-
- sn_name_ = strcat(samname,".raw");
- if (file_in_path(".",sn_name_))
- fs_ = fopen(sn_name_,"rb");
- sn_ = fread(fs_,Inf,"short");
- endif
-
- k = ' ';
- do
- figure(1);
- clf;
- s = [ Sn(2*f-1,:) Sn(2*f,:) ];
- plot(s);
- grid;
- axis([1 length(s) -20000 20000]);
- if (k == 'p')
- pngname = sprintf("%s_%d_sn",samname,f);
- png(pngname);
- endif
-
- figure(2);
- Wo = model(f,1);
- L = model(f,2);
- Am = model(f,3:(L+2));
- plot((1:L)*Wo*4000/pi, 20*log10(Am),"r;Am;");
- axis([1 4000 -10 80]);
- hold on;
- plot((0:255)*4000/256, Sw(f,:),";Sw;");
- grid;
-
- if (file_in_path(".",sw__name))
- plot((0:255)*4000/256, Sw_(f,:),"g;Sw_;");
- endif
-
- if (file_in_path(".",pw_name))
- plot((0:255)*4000/256, 10*log10(Pw(f,:)),";Pw;");
- endif
-
- if (file_in_path(".",snr_name))
- snr_label = sprintf(";phase SNR %4.2f dB;",snr(f));
- plot(1,1,snr_label);
- endif
-
- % phase model - determine SNR and error spectrum for phase model 1
-
- if (file_in_path(".",phase_name_))
- orig = Am.*exp(j*phase(f,1:L));
- synth = Am.*exp(j*phase_(f,1:L));
- signal = orig * orig';
- noise = (orig-synth) * (orig-synth)';
- snr_phase = 10*log10(signal/noise);
-
- phase_err_label = sprintf("g;phase_err SNR %4.2f dB;",snr_phase);
- plot((1:L)*Wo*4000/pi, 20*log10(orig-synth), phase_err_label);
- endif
-
- hold off;
- if (k == 'p')
- pngname = sprintf("%s_%d_sw",samname,f);
- png(pngname);
- endif
-
- if (file_in_path(".",phase_name))
- figure(3);
- plot((1:L)*Wo*4000/pi, phase(f,1:L)*180/pi, "-o;phase;");
- axis;
- if (file_in_path(".", phase_name_))
- hold on;
- plot((1:L)*Wo*4000/pi, phase_(f,1:L)*180/pi, "g;phase after;");
- grid
- hold off;
- endif
- if (k == 'p')
- pngname = sprintf("%s_%d_phase",samname,f);
- png(pngname);
- endif
- endif
-
- % synthesised speech
-
- if (file_in_path(".",sn_name_))
- figure(4);
- s_ = sn_((f-3)*80+1:(f+1)*80);
- plot(s_);
- axis([1 length(s_) -20000 20000]);
- if (k == 'p')
- pngname = sprintf("%s_%d_sn_",samname,f)
- png(pngname);
- endif
- endif
-
- if (file_in_path(".",ak_name))
- figure(5);
- axis;
- akw = ak(f,:);
- weight = 1.0 .^ (0:length(akw)-1);
- akw = akw .* weight;
- H = 1./fft(akw,8000);
- subplot(211);
- plot(20*log10(abs(H(1:4000))),";LPC mag spec;");
- grid;
- subplot(212);
- plot(angle(H(1:4000))*180/pi,";LPC phase spec;");
- grid;
- if (k == 'p')
- % stops multimode errors from gnuplot, I know not why...
- figure(2);
- figure(5);
-
- pngname = sprintf("%s_%d_lpc",samname,f);
- png(pngname);
- endif
- endif
-
-
- % autocorrelation function to research voicing est
-
- %M = length(s);
- %sw = s .* hanning(M)';
- %for k=0:159
- % R(k+1) = sw(1:320-k) * sw(1+k:320)';
- %endfor
- %figure(4);
- %R_label = sprintf(";R(k) %3.2f;",max(R(20:159))/R(1));
- %plot(R/R(1),R_label);
- %grid
-
- figure(2);
-
- % interactive menu
-
- printf("\rframe: %d menu: n-next b-back p-png q-quit ", f);
- fflush(stdout);
- k = kbhit();
- if (k == 'n')
- f = f + 1;
- endif
- if (k == 'b')
- f = f - 1;
- endif
-
- % optional print to PNG
-
- if (k == 'p')
- pngname = sprintf("%s_%d",samname,f);
- png(pngname);
- endif
-
- until (k == 'q')
- printf("\n");
-
-endfunction
diff --git a/octave/plpitch.m b/octave/plpitch.m
deleted file mode 100644
index 69ad533..0000000
--- a/octave/plpitch.m
+++ /dev/null
@@ -1,36 +0,0 @@
-% Copyright David Rowe 2009
-% This program is distributed under the terms of the GNU General Public License
-% Version 2
-%
-% plpitch.m
-% Plots two pitch tracks on top of each other, used for comparing pitch
-% estimators
-
-function plpitch(pitch1_name, pitch2_name, start_fr, end_fr)
-
- pitch1 = load(pitch1_name);
- pitch2 = load(pitch2_name);
-
- st = 1;
- en = length(pitch1);
- if (nargin >= 3)
- st = start_fr;
- endif
- if (nargin >= 4)
- en = end_fr;
- endif
-
- figure(1);
- clf;
- l1 = strcat("r;",pitch1_name,";")
- l1
- st
- en
- plot(pitch1(st:en), l1);
- axis([1 en-st 20 160]);
- l2 = strcat("g;",pitch2_name,";");
- hold on;
- plot(pitch2(st:en),l2);
- hold off;
-endfunction
-
diff --git a/octave/plvoicing.m b/octave/plvoicing.m
deleted file mode 100644
index a531747..0000000
--- a/octave/plvoicing.m
+++ /dev/null
@@ -1,89 +0,0 @@
-% Copyright David Rowe 2009
-% This program is distributed under the terms of the GNU General Public License
-% Version 2
-%
-% Plot voicing information from sample and dump files.
-%
-% samfilename is the raw source file, e.g. "../raw/hts1a.raw"
-% samname is the dumpfile prefix, e.g. "../src/hts1a"
-%
-% There is a 160 sample (two frame delay) from the when a sample
-% enters the input buffer until it is at the centre of the analysis window
-
-function plvoicing(samfilename, samname, start_f, end_f, pngname)
-
- fs=fopen(samfilename,"rb");
- s=fread(fs,Inf,"short");
-
- snr_name = strcat(samname,"_snr.txt");
- snr = load(snr_name);
- model_name = strcat(samname,"_model.txt");
- model = load(model_name);
-
- Wo = model((start_f+1):end_f,1);
- F0 = Wo*4000/pi;
- dF0 = F0(1:length(Wo)-1) - F0(2:length(Wo));
-
- % work out LP and HP energy
-
- for f=(start_f+1):end_f
- L = model(f,2);
- Am = model(f,3:(L+2));
- L2 = floor(L/2);
- elow = Am(1:L2) * Am(1:L2)';
- ehigh = Am(L2:L) * Am(L2:L)';
- erat(f-(start_f+1)+1) = 10*log10(elow/ehigh);
- endfor
-
- figure(1);
- clf;
- sp = s((start_f-2)*80:(end_f-2)*80);
- plot(sp);
- hold on;
- vhigh = snr((start_f+1):end_f) > 7;
- vlow = snr((start_f+1):end_f) > 4;
-
- % test correction based on erat
-
- vlowadj = vlow;
-
- for f=1:length(erat)-1
- if (vlow(f) == 0)
- if (erat(f) > 10)
- vlowadj(f) = 1;
- endif
- endif
- if (vlow(f) == 1)
- if (erat(f) < -10)
- vlowadj(f) = 0;
- endif
- if (abs(dF0(f)) > 15)
- vlowadj(f) = 0;
- endif
- endif
- endfor
-
- x = 1:(end_f-start_f);
- plot(x*80,snr((start_f+1):end_f)*1000,';SNRdB x 1000;g+');
- plot(x*80,-8000 + vhigh*2000,';7dB thresh;g');
- plot(x*80,-11000 + vlowadj*2000,';vlow with corr;g');
- plot(x*80,erat*1000,';elow/ehigh in dB;r');
- plot(x*80,-14000 + vlow*2000,';4dB thresh;r');
- hold off;
- grid
- if (nargin == 5)
- print(pngname, "-dpng", "-S500,500")
- endif
-
- figure(2)
- Wo = model((start_f+1):end_f,1);
- F0 = Wo*4000/pi;
- dF0 = F0(1:length(Wo)-1) - F0(2:length(Wo));
- %plot(dF0,'+--')
- %hold on;
- %plot([ 1 length(dF0) ], [10 10] ,'r')
- %plot([ 1 length(dF0) ], [-10 -10] ,'r')
- %axis([1 length(dF0) -50 50])
- %hold off;
- plot(F0,'+--')
-endfunction
diff --git a/octave/png.m b/octave/png.m
deleted file mode 100644
index 09a7996..0000000
--- a/octave/png.m
+++ /dev/null
@@ -1,25 +0,0 @@
-% Copyright David Rowe 2009
-% This program is distributed under the terms of the GNU General Public License
-% Version 2
-%
-% Replot current plot as a png, generates small and large versions
-
-function png(pngname)
- % small image
-
- __gnuplot_set__ terminal png size 420,300
- ss = sprintf("__gnuplot_set__ output \"%s.png\"", pngname);
- eval(ss)
- replot;
-
- % larger image
-
- __gnuplot_set__ terminal png size 800,600
- ss = sprintf("__gnuplot_set__ output \"%s_large.png\"", pngname);
- eval(ss)
- replot;
-
- % for some reason I need this to stop large plot getting wiped
- __gnuplot_set__ output "/dev/null"
-
-endfunction
diff --git a/octave/power_from_stdio.m b/octave/power_from_stdio.m
deleted file mode 100644
index a4dbddc..0000000
--- a/octave/power_from_stdio.m
+++ /dev/null
@@ -1,27 +0,0 @@
-% power_from_gr.m
-% David Rowe June 2018
-%
-% Measure power of signal from stdio, used for SNR tests from analog radios
-
-#{
- $ rec -t raw -r 8000 -s -2 -c 1 - -q | octave --no-gui -qf power_from_stdio.m
-#}
-
-graphics_toolkit ("gnuplot")
-
-Fs = 48000; % sample rate in Hz
-shorts_per_sample = 1; % real samples
-
-[s,c] = fread(stdin, shorts_per_sample*Fs, "short");
-
-while c
- S = fft(s.*hanning(Fs));
- SdB = 20*log10(abs(S));
- figure(1); plot(real(s)); axis([0 Fs -3E4 3E4]);
- figure(2); plot(SdB); axis([0 12000 40 160]);
-
- printf("power: %f dB\n", 10*log10(var(s)));
- %pause(2);
- [s,c] = fread(stdin, shorts_per_sample*Fs, "short");
-endwhile
-
diff --git a/octave/pulse.m b/octave/pulse.m
deleted file mode 100644
index 223389e..0000000
--- a/octave/pulse.m
+++ /dev/null
@@ -1,37 +0,0 @@
-% pulse.m
-% David Rowe August 2009
-%
-% Experiments with human pulse perception for sinusoidal codecs
-
-function pulse(samname)
-
- A = 1000;
- K = 16000;
- N = 80;
- frames = K/N;
- s = zeros(1,K);
-
- for f=1:frames
- % lets try placing np random pulses in every frame
-
- P = 20 + (160-20)*rand(1,1);
- Wo = 2*pi/P;
- L = floor(pi/Wo);
- sf = zeros(1,N);
- for m=1:L/2:L
- pos = floor(rand(1,1)*N)+1;
- %pos = 50;
- for l=m:m+L/2-1
- sf = sf + A*cos(l*Wo*((f-1)*N+1:f*N) - pos*l*Wo);
- endfor
- endfor
- s((f-1)*N+1:f*N) = sf;
- endfor
-
- plot(s(1:250));
-
- fs=fopen(samname,"wb");
- fwrite(fs,s,"short");
- fclose(fs);
-endfunction
-
diff --git a/octave/qam16_test.m b/octave/qam16_test.m
deleted file mode 100644
index c613214..0000000
--- a/octave/qam16_test.m
+++ /dev/null
@@ -1,141 +0,0 @@
-% qam16_test.m
-% David Rowe May 2020
-%
-% Octave symbol rate QAM16/LDPC experiments
-
-% Libraries we need
-
-1;
-qam16;
-ldpc;
-
-function test_qam16(fg=2)
- printf("QAM16 ----------------------------------------\n");
-
- mod_order = 16; bps = log2(mod_order);
- modulation = 'QAM'; mapping = ""; demod_type = 0; decoder_type = 0;
- max_iterations = 100; EsNo_dec = 10;
- qam16_const = [
- 1 + j, 1 + j*3, 3 + j, 3 + j*3;
- 1 - j, 1 - j*3, 3 - j, 3 - j*3;
- -1 + j, -1 + j*3, -3 + j, -3 + j*3;
- -1 - j, -1 - j*3, -3 - j, -3 - j*3];
- rms = sqrt(qam16_const(:)'*qam16_const(:)/16);
- qam16_const = qam16_const/rms;
- constellation_source = 'custom';
- test_qam16_mod_demod(qam16_const);
-
- load HRA_504_396.txt
- if strcmp(constellation_source,'cml')
- code_param = ldpc_init_user(HRA_504_396, modulation, mod_order, mapping);
- else
- code_param = ldpc_init_user(HRA_504_396, modulation, mod_order, mapping, reshape(qam16_const,1,16));
- end
- rate = code_param.ldpc_data_bits_per_frame/code_param.ldpc_coded_bits_per_frame;
-
- printf("EbNodB Tbits Terrs BER Tcbits Tcerrs Perrs CBER CPER\n");
- EbNodBvec = 3:10; Ntrials = 1000;
- for i=1:length(EbNodBvec)
- EbNodB = EbNodBvec(i);
- EsNodB = EbNodB + 10*log10(rate) + 10*log10(bps); EsNodBvec(i) = EsNodB;
- EsNo = 10^(EsNodB/10);
- variance = 1/EsNo;
- Terrs = Tbits = 0; Tcerrs = 0; Tcbits = 0; Perrs = 0; rx_symbols_log = [];
- for nn = 1:Ntrials
- tx_bits = round(rand(1, code_param.ldpc_data_bits_per_frame));
- [tx_codeword, tx_symbols] = ldpc_enc(tx_bits, code_param);
- noise = sqrt(variance*0.5)*(randn(1,length(tx_symbols)) + j*randn(1,length(tx_symbols)));
- rx_symbols = tx_symbols + noise;
- rx_symbols_log = [rx_symbols_log rx_symbols];
-
- % uncoded decode/demod and count errors
- rx_codeword = zeros(1,code_param.ldpc_coded_bits_per_frame);
- for s=1:length(rx_symbols)
- rx_codeword((s-1)*bps+1:s*bps) = qam16_demod(qam16_const,rx_symbols(s));
- end
- Nerr = sum(xor(tx_codeword,rx_codeword));
- Terrs += Nerr;
- Tbits += code_param.ldpc_coded_bits_per_frame;
-
- % LDPC demod/decode and count errors
- dec_rx_codeword = ldpc_dec(code_param, max_iterations, demod_type, decoder_type, rx_symbols, EsNo_dec, ones(1,length(rx_symbols)));
- errors_positions = xor(tx_bits, dec_rx_codeword(1:code_param.ldpc_data_bits_per_frame));
- Ncerr = sum(errors_positions);
- Tcbits += code_param.ldpc_data_bits_per_frame; Tcerrs += Ncerr;
- if Ncerr Perrs++; end
- end
- figure(fg); clf; plot(rx_symbols_log,"."); axis([-1.5 1.5 -1.5 1.5]); drawnow;
- printf("%5.1f %6d %6d %5.2f %6d %6d %6d %5.2f %5.2f\n",
- EbNodB, Tbits, Terrs, Terrs/Tbits, Tcbits, Tcerrs, Perrs, Tcerrs/Tcbits, Perrs/Ntrials);
- ber(i) = Terrs/Tbits; cber(i) = Tcerrs/Tcbits; cper(i) = Perrs/Ntrials;
- end
- print("qam64_scatter.png","-dpng");
-
- figure(fg+1); clf; title('QAM16 Uncoded');
- uncoded_EbNodBvec = EbNodBvec + 10*log10(rate);
- ber_theory = ber_qam(uncoded_EbNodBvec);
- semilogy(uncoded_EbNodBvec,ber_theory,'b+-;uncoded QAM16 BER theory;','markersize', 10, 'linewidth', 2); hold on;
- semilogy(uncoded_EbNodBvec,ber+1E-10,'g+-;uncoded QAM16 BER;','markersize', 10, 'linewidth', 2); hold on;
- grid; axis([min(uncoded_EbNodBvec) max(uncoded_EbNodBvec) 1E-5 1]); xlabel('Uncoded Eb/No (dB)');
- print("qam16_uncoded_ber.png","-dpng");
-
- figure(fg+2); clf; title('QAM16 with LDPC (504,396)');
- semilogy(EbNodBvec,cber+1E-10,'b+-;QAM16 coded BER;','markersize', 10, 'linewidth', 2); hold on;
- semilogy(EbNodBvec,cper+1E-10,'g+-;QAM16 coded PER;','markersize', 10, 'linewidth', 2); hold off;
- grid; axis([min(EbNodBvec) max(EbNodBvec) 1E-5 1]); xlabel('Eb/No (dB)');
-
- figure(fg+3); clf; title('QAM16 with LDPC (504,396)');
- semilogy(EsNodBvec,cber+1E-10,'b+-;QAM16 coded BER;','markersize', 10, 'linewidth', 2); hold on;
- semilogy(EsNodBvec,cper+1E-10,'g+-;QAM16 coded PER;','markersize', 10, 'linewidth', 2); hold off;
- grid; axis([min(EsNodBvec) max(EsNodBvec) 1E-5 1]); xlabel('Es/No (dB)');
- print("qam16_504_396.png","-dpng");
-endfunction
-
-
-% Thanks Bill VK5DSP, for the QAM BER functions
-
-function p = ber_qam(ebn0)
- % Calculate the bit error rate (BER) for square 16QAM in AWGN
- % given the Eb/N0 in dB, ebn0 can be a scalar or vector
- % (assuming coherent detection, uncoded)
- % [section 5.3 Webb and Hanzo text]
-
- e = 4*10.^(ebn0/10); % Es/N0 vector in linear
- b2 = qfn(sqrt(e/5));
- b1 = (qfn(sqrt(e/5)) + qfn(3*sqrt(e/5)))/2;
- p = (b1+b2)/2;
-endfunction
-
-function tail=qfn(a)
- % Usage: tail=qfn(a)
- % where: tail=area under the tail of the normal dist. from a to inf.
- % for zero mean, unit variance distribution
- %
- % If no argument is given, plot Q(x) for x = 0 to 5
-
- % use erfc instead of 1-erf to avoid truncation errors! April 2010
-
- fact = 1 / sqrt(2);
- if exist('a')
-
- % tail = 0.5 * ( 1 - erf(a * fact));
- tail = 0.5 * erfc(a * fact);
- else
- x=(0: 0.1: 6); semilogy(x, 0.5*( erfc(x * fact)));
- title('Q function plot');
- xlabel('x'); ylabel('Q(x)');
- end
-endfunction
-
-
-% --------------------------------------------------------------------------------
-% START SIMULATIONS
-% --------------------------------------------------------------------------------
-
-more off;
-format;
-
-% Start CML library (see CML set up instructions in ldpc.m)
-init_cml();
-
-test_qam16(1)
diff --git a/octave/rf_bpf.m b/octave/rf_bpf.m
deleted file mode 100644
index e0a39ba..0000000
--- a/octave/rf_bpf.m
+++ /dev/null
@@ -1,37 +0,0 @@
-% rtlsdr_bpf.m
-%
-% David Rowe 24 August 2018
-%
-% Calculate component values for cascaded HP-LP 2-8 MHz Chebychev filter
-%
-% From "RF Circuit Design", Chris Bowick, Ch 3
-
-1;
-
-function C = find_C(Cn, fc, R)
- C = Cn/(2*pi*fc*R);
-endfunction
-
-function L = find_L(Ln, fc, R)
- L = R*Ln/(2*pi*fc);
-endfunction
-
-% 3rd order HP filter, 1dB ripple Cheby, 3MHz cut off, >20dB down at
-% 1MHz to nail strong AM broadcast signals, Table 3-7A. Use a Rs=50,
-% Rl=50, so Rs/Rl = 1. Note we assume a or phantom load in between
-% cascaded HP-LP sections of 50 ohms.
-
-L1 = find_L(1/2.216, 3E6, 50);
-C1 = find_C(1/1.088, 3E6, 50);
-L2 = find_L(1/2.216, 3E6, 50);
-
-printf("L1: %f uH C1: %f pF L2: %f uH\n", L1*1E6, C1*1E12, L2*1E6);
-
-% 3rd order LPF, 8MHz cut off so >30dB down at 21MHz, which aliases back to 7MHz
-% with Fs=28MHz on RTLSDR (14 MHz Nyquist freq). Rs=50, Rl=50, Rs/Rl = 1
-
-C2 = find_C(2.216, 9E6, 50);
-L3 = find_L(1.088, 9E6, 50);
-C3 = find_C(2.216, 9E6, 50);
-
-printf("C2: %f pF L3: %f uH C3: %f pF\n", C2*1E12, L3*1E6, C3*1E12);
diff --git a/octave/rf_design.m b/octave/rf_design.m
deleted file mode 100644
index eae79f6..0000000
--- a/octave/rf_design.m
+++ /dev/null
@@ -1,77 +0,0 @@
-% rfdesign.m
-%
-% David Rowe Nov 2015
-%
-% Helper functions for RF Design
-
-1;
-
-
-% convert a parallel R/X to a series R/X
-
-function Zs = zp_to_zs(Zp)
- Xp = j*imag(Zp); Rp = real(Zp);
- Zs = Xp*Rp/(Xp+Rp);
-endfunction
-
-
-% convert a series R/X to a parallel R/X
-
-function Zp = zs_to_zp(Zs)
- Xs = imag(Zs); Rs = real(Zs);
- Q = Xs/Rs;
- Rp = (Q*Q+1)*Rs;
- Xp = Rp/Q;
- Zp = Rp + j*Xp;
-endfunction
-
-
-% Design a Z match network with a parallel and series reactance
-% to match between a low and high resistance. Note Xp and Xs
-% must be implemented as opposite sign, ie one a inductor, one
-% a capacitor (your choice).
-%
-% /--Xs--+---\
-% | | |
-% Rlow Xp Rhigh
-% | | |
-% \------+---/
-%
-
-function [Xs Xp] = z_match(Rlow, Rhigh)
- assert(Rlow < Rhigh, "Rlow must be < Rhigh");
- Q = sqrt(Rhigh/Rlow -1);
- Xs = Q*Rlow;
- Xp = Rhigh/Q;
-endfunction
-
-
-% Design an air core inductor, Example 1-5 "RF Circuit Design"
-
-function Nturns = design_inductor(L_uH, diameter_mm)
- Nturns = sqrt(29*L_uH/(0.394*(diameter_mm*0.1/2)));
-endfunction
-
-
-% Work out series resistance Rl of series resonant inductor. Connect
-% tracking generator to spec-an input, the series LC to ground. V is
-% the ref TG level (e.g. with perfect 50 ohm term) in volts, Vmin is the
-% minimum at series res freq.
-%
-% /-50-+---+
-% | | |
-% TG C 50 spec-an
-% | | |
-% | L |
-% | | |
-% | Rl |
-% | | |
-% \----+---/
-
-function Rl = find_rl(V,Vmin)
- % at series resonance effect of C and L goes away and we are left with
- % parallel combination of Ls and spec-an 50 ohm input impedance
-
- Rp = Vmin*50/(2*V*(1-Vmin/(2*V)));
- Rl = 1/(1/Rp - 1/50)
-endfunction
diff --git a/octave/rf_vhf_amp.m b/octave/rf_vhf_amp.m
deleted file mode 100644
index 8c5186a..0000000
--- a/octave/rf_vhf_amp.m
+++ /dev/null
@@ -1,206 +0,0 @@
-% s_param_rf.m
-%
-% David Rowe Nov 2015
-%
-% Working for small signal VHF amplifier design using
-% S-param techniques from "RF Circuit Design" by Chris Bowick
-
-rfdesign; % library of helped functions
-
-more off;
-
-Ic = 0.014;
-
-% BRF92 VCE=5V Ic=5mA 100MHz
-
-if Ic == 0.005
- S11 = 0.727*exp(j*(-43)*pi/180);
- S12 = 0.028*exp(j*(69.6)*pi/180);
- S21 = 12.49*exp(j*(147)*pi/180);
- S22 = 0.891*exp(j*(-16)*pi/180);
-end
-
-% BRF92 VCE=10V Ic=14mA 100MHz
-
-if Ic == 0.02
- S11 = 0.548*exp(j*(-56.8)*pi/180);
- S12 = 0.020*exp(j*(67.8)*pi/180);
- S21 = 20.43*exp(j*(133.7)*pi/180);
- S22 = 0.796*exp(j*(-18.5)*pi/180);
-end
-
-% Stability
-
-Ds = S11*S22-S12*S21;
-Knum = 1 + abs(Ds)^2 - abs(S11)^2 - abs(S22)^2;
-Kden = 2*abs(S21)*abs(S12);
-K = Knum/Kden % If > 1 unconditionally stable
- % If < 1 panic
-figure(1);
-clf
-scCreate;
-
-if K < 1
- C1 = S11 - Ds*conj(S22);
- C2 = S22 - Ds*conj(S11);
- rs1 = conj(C1)/(abs(S11)^2-abs(Ds)^2); % centre of input stability circle
- ps1 = abs(S12*S21/(abs(S11)^2-abs(Ds)^2)); % radius of input stability circle
- rs2 = conj(C2)/(abs(S22)^2-abs(Ds)^2); % centre of input stability circle
- ps2 = abs(S12*S21/(abs(S22)^2-abs(Ds)^2)); % radius of input stability circle
-
- s(1,1)=S11; s(1,2)=S12; s(2,1)=S21; s(2,2)=S22;
- plotStabilityCircles(s)
-end
-
-% Gain circle
-
-D2 = abs(S22)^2-abs(Ds)^2;
-C2 = S22 - Ds*conj(S11);
-GdB = 20; Glin = 10^(GdB/10); % lets shoot for 20dB gain
-G = Glin/(abs(S21)^2);
-r0 = G*conj(C2)/(1+D2*G); % centre of gain circle
-p0 = sqrt(1 - 2*K*abs(S12*S21)*G + (abs(S12*S21)^2)*(G^2))/(1+D2*G); % radius of gain circle
-
-scAddCircle(abs(r0),angle(r0)*180/pi,p0,'g')
-printf("Green is the %3.1f dB constant gain circle for gammaL\n",GdB);
-
-% Note different design procedures for different operating points
-
-if Ic == 0.005
- % Choose a gammaL on the gain circle
-
- gammaL = 0.8 - 0.4*j;
-
- % Caclulate gammaS and make sure it's stable by visual inspection
- % compared to stability circle.
-
- gammaS = conj(S11 + ((S12*S21*gammaL)/(1 - (gammaL*S22))));
-end
-
-if Ic == 0.014
-
- % lets set zo (normalised Zo) based on Pout and get gammaL from that
-
- Pout = 0.01;
- Irms = 0.002;
- Zo = Pout/(Irms*Irms);
- zo = Zo/50;
- [magL,angleL] = ztog(zo);
- gammaL = magL*exp(j*angleL*pi/180);
-
- % calculate gammaS
-
- gammaS = conj(S11 + ((S12*S21*gammaL)/(1 - (gammaL*S22))));
-
-end
-
-[zo Zo] = gtoz(abs(gammaL), angle(gammaL)*180/pi,50);
-[zi Zi] = gtoz(abs(gammaS), angle(gammaS)*180/pi,50);
-
-scAddPoint(zi);
-scAddPoint(zo);
-
-% Transducer gain
-
-Gt_num = (abs(S21)^2)*(1-abs(gammaS)^2)*(1-abs(gammaL)^2);
-Gt_den = abs((1-S11*gammaS)*(1-S22*gammaL) - S12*S21*gammaL*gammaS)^2;
-Gt = Gt_num/Gt_den;
-
-if Ic == 0.005
-
- % Lets design the z match for the input ------------------------------
-
- % put input impedance in parallel form
-
- Zip = zs_to_zp(Zi);
-
- % first match real part of impedance
-
- Rs = 50; Rl = real(Zip);
- [Xs Xp] = z_match(Rs,Rl);
-
- % Modify Xp so transistor input sees conjugate match to Zi
- % Lets make Xp a capacitor, so negative sign
-
- Xp_match = -Xp - imag(Zip);
-
- % Now convert to real component values
-
- w = 2*pi*150E6;
- Ls = Xs/w; diameter_mm = 6.25;
- Ls_turns = design_inductor(Ls*1E6, diameter_mm);
- Cp = 1/(w*(-Xp_match));
-
- printf("Transducer gain: %3.1f dB\n", 10*log10(Gt));
- printf("Input: Zi = %3.1f + %3.1fj ohms\n", real(Zi), imag(Zi));
- printf(" In parallel form Rp = %3.1f Xp = %3.1fj ohms\n", real(Zip), imag(Zip));
- printf(" So for a conjugate match transistor input wants to see:\n Rp = %3.1f Xp = %3.1fj ohms\n", real(Zip), -imag(Zip));
- printf(" Rs = %3.1f to Rl = %3.1f ohm matching network Xs = %3.1fj Xp = %3.1fj\n", Rs, Rl, Xs, Xp);
- printf(" with conj match to Zi Xs = %3.1fj Xp = %3.1fj\n", Xs, Xp_match);
- printf(" matching components Ls = %5.3f uH Cp = %4.1f pF\n", Ls*1E6, Cp*1E12);
- printf(" Ls can be made from %3.1f turns on a %4.2f mm diameter air core\n", Ls_turns, diameter_mm);
-
- % Now Z match for output -------------------------------------
-
- Lo = -imag(Zo)/w;
- Lo_turns = design_inductor(Lo*1E6, diameter_mm);
- printf("Output: Zo = %3.1f + %3.1fj ohms\n", real(Zo), imag(Zo));
- printf(" So for a conjugate match transistor output wants to see:\n Rl = %3.1f Xl = %3.1fj ohms\n", real(Zo), -imag(Zo));
- printf(" Which is a series inductor Lo = %5.3f uH\n", Lo*1E6);
- printf(" Lo can be made from %3.1f turns on a %4.2f mm diameter air core\n", Lo_turns, diameter_mm);
-end
-
-
-if Ic == 0.014
- printf("Transducer gain: %3.1f dB\n", 10*log10(Gt));
-
- % Lets design the z match for the input ------------------------------
-
- % put input impedance in parallel form
-
- Zip = zs_to_zp(Zi);
-
- % first match real part of impedance
-
- Rs = 50; Rl = real(Zip);
- [Xs Xp] = z_match(Rl,Rs);
-
- % Lets make Xs a capacitir to block DC, so Xp is an inductor.
- % Modify Xs so transistor input sees conjugate match to Zi. Xs is a
- % capacitor, so reactance is negative
-
- Xs_match = -Xs - imag(Zip);
-
- % Now convert to real component values
-
- w = 2*pi*150E6; diameter_mm = 6.25;
- Li = Xp/w;
- Li_turns = design_inductor(Li*1E6, diameter_mm);
- Ci = 1/(w*(-Xs_match));
-
- printf("Input: Zi = %3.1f + %3.1fj ohms\n", real(Zi), imag(Zi));
- printf(" In parallel form Rp = %3.1f Xp = %3.1fj ohms\n", real(Zip), imag(Zip));
- printf(" So for a conjugate match transistor input wants to see:\n Rp = %3.1f Xp = %3.1fj ohms\n", real(Zip), -imag(Zip));
- printf(" Rs = %3.1f to Rl = %3.1f ohm matching network Xs = %3.1fj Xp = %3.1fj\n", Rs, Rl, Xs, Xp);
- printf(" with Xs a capacitor, and Xp and inductor Xs = %3.1fj Xp = %3.1fj\n", -Xs, Xp);
- printf(" With a conj match to Zi Xs = %3.1fj Xp = %3.1fj\n", Xs_match, Xp);
- printf(" matching components Li = %5.3f uH Ci = %4.1f pF\n", Li*1E6, Ci*1E12);
- printf(" Li can be made from %3.1f turns on a %4.2f mm diameter air core\n", Li_turns, diameter_mm);
-
- % Design output Z match ----------------------------------------------
-
- Rs = real(Zo); Rl = 50;
- [Xs Xp] = z_match(Rl,Rs);
-
- % Lets make XP an inductor so it can double as a RF choke, and Xp as
- % a capacitor will give us a convenient DC block
-
- w = 2*pi*150E6; diameter_mm = 6.25;
- Lo = Xp/w; Lo_turns = design_inductor(Lo*1E6, diameter_mm);
- Co = 1/(w*Xs);
- printf("Output: Zo = %3.1f + %3.1fj ohms\n", real(Zo), imag(Zo));
- printf(" matching network Xp = %3.1f X = %3.1f ohms\n", Xp, Xs);
- printf(" which is parallel Lo = %5.3f uH and series Co = %4.1f pF\n", Lo*1E6, Co*1E12);
- printf(" Lo can be made from %3.1f turns on a %4.2f mm diameter air core\n", Lo_turns, diameter_mm);
-end
-
diff --git a/octave/rf_vhf_pa.m b/octave/rf_vhf_pa.m
deleted file mode 100644
index 000c3fc..0000000
--- a/octave/rf_vhf_pa.m
+++ /dev/null
@@ -1,111 +0,0 @@
-% vhf_pa.m
-%
-% David Rowe Dec 2015
-%
-% Working for 0.5W VHF PA
-
-rfdesign;
-
-% BFQ19 Vce=5V Ic=50mA. These are small signal S-params,
-% which (according to "RF Circuit Design") are not valid.
-% However I need to start somewhere.
-
-S11 = 0.324*exp(j*(-158.1)*pi/180);
-S12 = 0.031*exp(j*(75.9)*pi/180);
-S21 = 19.693*exp(j*(102.7)*pi/180);
-S22 = 0.274*exp(j*(-74.6)*pi/180);
-
-% Lets check stability
-
-Ds = S11*S22-S12*S21;
-Knum = 1 + abs(Ds)^2 - abs(S11)^2 - abs(S22)^2;
-Kden = 2*abs(S21)*abs(S12);
-K = Knum/Kden
-figure(1);
-clf
-scCreate;
-
-if K < 1
- C1 = S11 - Ds*conj(S22);
- C2 = S22 - Ds*conj(S11);
- rs1 = conj(C1)/(abs(S11)^2-abs(Ds)^2); % centre of input stability circle
- ps1 = abs(S12*S21/(abs(S11)^2-abs(Ds)^2)); % radius of input stability circle
- rs2 = conj(C2)/(abs(S22)^2-abs(Ds)^2); % centre of input stability circle
- ps2 = abs(S12*S21/(abs(S22)^2-abs(Ds)^2)); % radius of input stability circle
-
- s(1,1)=S11; s(1,2)=S12; s(2,1)=S21; s(2,2)=S22;
- plotStabilityCircles(s)
-end
-
-
-% determine collector load Rl for our desired power output
-
-if 0
-P = 0.5;
-Vcc = 5;
-w = 2*pi*150E6;
-
-Rl = Vcc*Vcc/(2*P);
-end
-Rl = 10;
-
-% choose gammaL based on Rl
-
-zo = Rl/50;
-[magL,angleL] = ztog(zo);
-gammaL = magL*exp(j*angleL*pi/180);
-
-% calculate gammaS and Zi and plot
-
-gammaS = conj(S11 + ((S12*S21*gammaL)/(1 - (gammaL*S22))));
-[zi Zi] = gtoz(abs(gammaS), angle(gammaS)*180/pi,50);
-
-scAddPoint(zi);
-scAddPoint(zo);
-
-% design Pi network for matching Rl to Ro, where Ro > Rl
-%
-% /---+-Xs1-Xs2-+---\
-% | | | |
-% Rl Xp1 Xp2 Ro
-% | | | |
-% \---+---------+---/
-%
-% highest impedance used to define Q of pi network and determine R,
-% the "virtual" impedance at the centre of the network, whuch is smaller
-% than Rl and Ro
-
-Ro = 50;
-Q = 3;
-R = Ro/(Q*Q+1);
-
-Xp2 = Ro/Q;
-Xs2 = Q*R;
-
-Q1 = sqrt(Rl/R - 1);
-Xp1 = Rl/Q1;
-Xs1 = Q1*R;
-
-Cp1 = 1/(w*Xp1);
-Cp2 = 1/(w*Xp2);
-Ls = (Xs1+Xs2)/w;
-
-printf("Output Matching:\n");
-printf(" Rl = %3.1f Ro = %3.1f\n", Rl, Ro);
-printf(" Q = %3.1f virtual R = %3.1f\n", Q, R);
-printf(" Xp1 = %3.1f Xs1 = %3.1f Xs2 = %3.1f Xp2 = %3.1f\n", Xp1, Xs1, Xs2, Xp2);
-printf(" Cp1 = %3.1f pF Ls = %3.1f nH Cp2 = %3.1f pF\n", Cp1*1E12, Ls*1E9, Cp2*1E12);
-
-% design input matching network between 50 ohms source and 10 ohms at base
-
-Rb = 10; Rs = 50;
-
-[Xs Xp] = z_match(Rb, Rs);
-
-Lp = Xp/w;
-Cs = 1/(w*Xs);
-
-printf("Input Matching:\n");
-printf(" Xs = %3.1f Xp = %3.1f\n", Xs, Xp);
-printf(" Lp = %3.1f nH Cs = %3.1f pF\n", Lp*1E9, Cs*1E12);
-
diff --git a/octave/save_array_c_header.m b/octave/save_array_c_header.m
deleted file mode 100644
index 1fd87bb..0000000
--- a/octave/save_array_c_header.m
+++ /dev/null
@@ -1,14 +0,0 @@
-% save_array_c_header.m
-%
-% David Rowe Sep 2015
-
-function save_array_c_header(array, array_name, filename)
- f=fopen(filename,"wt");
- fprintf(f,"/* Generated by save_array_c_header.m Octave function */\n\n");
- fprintf(f,"const float %s[]={\n", array_name);
- for m=1:length(array)-1
- fprintf(f," % .16f,\n",array(m));
- endfor
- fprintf(f," % .16f\n};\n",array(length(array)));
- fclose(f);
-endfunction
diff --git a/octave/save_comp.m b/octave/save_comp.m
deleted file mode 100644
index b8e663f..0000000
--- a/octave/save_comp.m
+++ /dev/null
@@ -1,12 +0,0 @@
-% save_comp.m
-% David Rowe Aug 2020
-
-function save_comp(fn, iq)
- l = length(iq);
- s = zeros(1,2*l);
- s(1:2:2*l) = real(iq);
- s(2:2:2*l) = imag(iq);
- fs=fopen(fn,"wb");
- s = fwrite(fs,s,"float32");
- fclose(fs);
-endfunction
diff --git a/octave/save_f32.m b/octave/save_f32.m
deleted file mode 100644
index 62214d4..0000000
--- a/octave/save_f32.m
+++ /dev/null
@@ -1,12 +0,0 @@
-% save_f32.m
-% David Rowe Sep 2021
-%
-% save a matrix to .f32 binary files in row-major order
-
-function save_f32(fn, m)
- f=fopen(fn,"wb");
- [r c] = size(m);
- mlinear = reshape(m', 1, r*c);
- fwrite(f, mlinear, 'float32');
- fclose(f);
-endfunction
diff --git a/octave/save_hackrf.m b/octave/save_hackrf.m
deleted file mode 100644
index 5dda704..0000000
--- a/octave/save_hackrf.m
+++ /dev/null
@@ -1,13 +0,0 @@
-% save_hackrf.m
-%
-% David Rowe Aug 2020
-
-function save_hackrf(fn,iq)
- l = length(iq);
- s = zeros(1,2*l);
- s(1:2:2*l) = real(iq);
- s(2:2:2*l) = imag(iq);
- fs = fopen(fn,"wb");
- fwrite(fs,s,"schar");
- fclose(fs);
-endfunction
diff --git a/octave/save_raw.m b/octave/save_raw.m
deleted file mode 100644
index 7f17277..0000000
--- a/octave/save_raw.m
+++ /dev/null
@@ -1,7 +0,0 @@
-% save_raw.m
-% David Rowe 9 Feb 2015
-
-function s = save_raw(fn,s)
- fs=fopen(fn,"wb");
- fwrite(fs,s,"short");
-endfunction
diff --git a/octave/snr_curves_plot.m b/octave/snr_curves_plot.m
deleted file mode 100644
index 8a2e234..0000000
--- a/octave/snr_curves_plot.m
+++ /dev/null
@@ -1,262 +0,0 @@
-% snr_curves_plot.m
-%
-% Companion script for unittest/raw_data_curves
-
-1;
-
-function state_vec = set_graphics_state_print()
- textfontsize = get(0,"defaulttextfontsize");
- linewidth = get(0,"defaultlinelinewidth");
- markersize = get(0, "defaultlinemarkersize");
- set(0, "defaulttextfontsize", 16);
- set(0, "defaultaxesfontsize", 16);
- set(0, "defaultlinelinewidth", 1);
- state_vec = [textfontsize linewidth markersize];
-endfunction
-
-function set_graphics_state_screen(state_vec)
- textfontsize = state_vec(1);
- linewidth = state_vec(2);
- markersize = state_vec(3);
- set(0, "defaulttextfontsize", textfontsize);
- set(0, "defaultaxesfontsize", textfontsize);
- set(0, "defaultlinelinewidth", linewidth);
- set(0, "defaultlinemarkersize", markersize);
-endfunction
-
-function [snr_ch per] = snr_scatter(source, mode, channel, colour)
- suffix = sprintf("_%s_%s_%s",source, mode, channel);
- snr = load(sprintf("snr%s.txt",suffix));
- offset = load(sprintf("offset%s.txt",suffix));
- snr -= offset;
- snr_x = []; snrest_y = [];
- for i=1:length(snr)
- fn = sprintf('snrest%s_%d.txt',suffix,i);
- if exist(fn,'file') == 2
- snrest=load(fn);
- if i == length(snr)
- plot(snr(i)*ones(1,length(snrest)), snrest, sprintf('%s;%s %s;',colour,source,mode));
- else
- plot(snr(i)*ones(1,length(snrest)), snrest, sprintf('%s',colour));
- end
- snr_x = [snr_x snr(i)]; snrest_y = [snrest_y mean(snrest)];
- end
- end
- plot(snr_x, snrest_y, sprintf('%s', colour));
-endfunction
-
-function [snr_ch per] = per_snr(mode, colour)
- snrch = load(sprintf("snrch_%s.txt",mode));
- snroffset = load(sprintf("snroffset_%s.txt",mode));
- snrch -= snroffset;
- per = load(sprintf("per_%s.txt",mode));
- plot(snrch, per, sprintf('%so-;%s;', colour, mode));
-endfunction
-
-function snrest_snr_screen(source, channel)
- clf; hold on;
- snr_scatter(source, 'datac0', channel,'b+-')
- snr_scatter(source, 'datac1', channel,'g+-')
- snr_scatter(source, 'datac3', channel,'r+-')
- snr_scatter(source, 'datac4', channel,'c+-')
- snr_scatter(source, 'datac13', channel,'m+-')
- xlabel('SNR (dB)'); ylabel('SNRest (dB)'); grid('minor');
- axis([-12 12 -12 12]);
- a = axis;
- plot([a(1) a(2)],[a(1) a(2)],'bk-');
- hold off; grid;
- if strcmp(source,'ctx')
- title(sprintf('SNR estimate versus SNR (%s) (no compression)', channel));
- else
- title(sprintf('SNR estimate versus SNR (%s) (with compression)', channel));
- end
- legend('location','northwest');
-endfunction
-
-function snrest_snr_print(source, channel)
- state_vec = set_graphics_state_print();
- snrest_snr_screen(source, channel);
- print(sprintf("snrest_snr_%s.png", source), "-dpng", "-S1000,800");
- set_graphics_state_screen(state_vec);
-endfunction
-
-function ber_per_v_snr(source, mode, channel, colour)
- suffix = sprintf("_%s_%s_%s.txt",source, mode, channel);
- snr = load(sprintf("snr%s",suffix));
- offset = load(sprintf("offset%s",suffix));
- snr -= offset;
- ber = load(sprintf("ber%s",suffix)) + 1E-6;
- per = load(sprintf("per%s",suffix)) + 1E-6;
- semilogy(snr, ber, sprintf('%s;%s %s ber;', colour, source, mode));
- semilogy(snr, per, sprintf('%s;%s %s per;', colour, source, mode),'linewidth',3,'markersize',10);
-endfunction
-
-function per_v_snr(source, mode, channel, colour)
- suffix = sprintf("_%s_%s_%s.txt",source, mode, channel);
- snr = load(sprintf("snr%s",suffix));
- offset = load(sprintf("offset%s",suffix));
- snr -= offset;
- per = load(sprintf("per%s",suffix)) + 1E-6;
- if strcmp(channel,"awgn")
- semilogy(snr, per, sprintf('%s;%s %s;', colour, mode, channel));
- else
- semilogy(snr, per, sprintf('%s;%s %s;', colour, mode, channel),'linewidth',3,'markersize',10);
- end
-endfunction
-
-function thruput_v_snr(source, mode, channel, colour)
- suffix = sprintf("_%s_%s_%s.txt",source, mode, channel);
- snr = load(sprintf("snr%s",suffix));
- offset = load(sprintf("offset%s",suffix));
- snr -= offset;
- per = load(sprintf("per%s",suffix)) + 1E-6;
- if strcmp(mode,"datac0") Rb=291; end;
- if strcmp(mode,"datac1") Rb=980; end;
- if strcmp(mode,"datac3") Rb=321; end;
- if strcmp(mode,"datac4") Rb=87; end;
- if strcmp(mode,"datac13") Rb=65; end;
- if strcmp(channel,"awgn")
- plot(snr, Rb*(1-per), sprintf('%s;%s %s;', colour, mode, channel));
- else
- plot(snr, Rb*(1-per), sprintf('%s;%s %s;', colour, mode, channel),'linewidth',3,'markersize',10);
- end
-endfunction
-
-function octave_ch_noise_screen(channel)
- clf; hold on;
- ber_per_v_snr('oct','datac0',channel,'bo-')
- ber_per_v_snr('ch' ,'datac0',channel,'bx-')
- ber_per_v_snr('oct','datac1',channel,'go-')
- ber_per_v_snr('ch' ,'datac1',channel,'gx-')
- ber_per_v_snr('oct','datac3',channel,'ro-')
- ber_per_v_snr('ch' ,'datac3',channel,'rx-')
- xlabel('SNR (dB)'); grid;
- hold off;
- if strcmp(channel,"awgn")
- axis([-6 8 1E-3 1]);
- else
- axis([-2 12 1E-3 1]);
- end
- title(sprintf('Comparsion of Measuring SNR from Octave and ch tool (%s)', channel));
-endfunction
-
-function octave_ch_noise_print(channel)
- state_vec = set_graphics_state_print();
- octave_ch_noise_screen(channel);
- print(sprintf("octave_ch_noise_%s.png", channel), "-dpng","-S1000,800");
- set_graphics_state_screen(state_vec);
-endfunction
-
-function octave_c_tx_screen(channel)
- clf; hold on;
- ber_per_v_snr('oct','datac0',channel,'bo-')
- ber_per_v_snr('ctx','datac0',channel,'bx-')
- ber_per_v_snr('oct','datac1',channel,'go-')
- ber_per_v_snr('ctx','datac1',channel,'gx-')
- ber_per_v_snr('oct','datac3',channel,'ro-')
- ber_per_v_snr('ctx','datac3',channel,'rx-')
- xlabel('SNR (dB)'); grid;
- hold off;
- if strcmp(channel,"awgn")
- axis([-6 8 1E-3 1]);
- else
- axis([-2 12 1E-3 1]);
- end
- title(sprintf('Comparsion of Octave Tx and C Tx (no compression) (%s)', channel));
-endfunction
-
-function octave_c_tx_print(channel)
- state_vec = set_graphics_state_print();
- octave_c_tx_screen(channel);
- print(sprintf("octave_c_tx_%s.png", channel), "-dpng","-S1000,800");
- set_graphics_state_screen(state_vec);
-endfunction
-
-function octave_c_tx_comp_screen(channel)
- clf; hold on;
- ber_per_v_snr('oct','datac0',channel,'bo-')
- ber_per_v_snr('ctxc','datac0',channel,'bx-')
- ber_per_v_snr('oct','datac1',channel,'go-')
- ber_per_v_snr('ctxc','datac1',channel,'gx-')
- ber_per_v_snr('oct','datac3',channel,'ro-')
- ber_per_v_snr('ctxc','datac3',channel,'rx-')
- xlabel('SNR (dB)'); grid;
- hold off;
- if strcmp(channel,"awgn")
- axis([-6 8 1E-3 1]);
- else
- axis([-2 12 1E-3 1]);
- end
- title(sprintf('Comparsion of Octave Tx and C Tx (with compression) (%s)', channel));
-endfunction
-
-function octave_c_tx_comp_print(channel)
- state_vec = set_graphics_state_print();
- octave_c_tx_comp_screen(channel);
- print(sprintf("octave_c_tx_comp_%s.png", channel), "-dpng","-S1000,800");
- set_graphics_state_screen(state_vec);
-endfunction
-
-% composite AWGN and MPP for compressed
-function c_tx_comp_screen
- clf; hold on;
- per_v_snr('ctxc','datac0','awgn','bo-')
- per_v_snr('ctxc','datac1','awgn','go-')
- per_v_snr('ctxc','datac3','awgn','ro-')
- per_v_snr('ctxc','datac4','awgn','co-')
- per_v_snr('ctxc','datac13','awgn','mo-')
- per_v_snr('ctxc','datac0','mpp','bx-')
- per_v_snr('ctxc','datac1','mpp','gx-')
- per_v_snr('ctxc','datac3','mpp','rx-')
- per_v_snr('ctxc','datac4','mpp','cx-')
- per_v_snr('ctxc','datac13','mpp','mx-')
- xlabel('SNR (dB)'); ylabel('PER'); grid;
- hold off;
- axis([-10 10 1E-3 1]);
- title('PER of C Raw Data Modes (with compression)');
-endfunction
-
-function c_tx_comp_print;
- state_vec = set_graphics_state_print();
- c_tx_comp_screen;
- print("c_tx_comp.png", "-dpng","-S1000,800");
- set_graphics_state_screen(state_vec);
-endfunction
-
-function c_tx_comp_thruput_screen
- clf; hold on;
- thruput_v_snr('ctxc','datac0','awgn','bo-')
- thruput_v_snr('ctxc','datac1','awgn','go-')
- thruput_v_snr('ctxc','datac3','awgn','ro-')
- thruput_v_snr('ctxc','datac4','awgn','co-')
- thruput_v_snr('ctxc','datac13','awgn','mo-')
- thruput_v_snr('ctxc','datac0','mpp','bx-')
- thruput_v_snr('ctxc','datac1','mpp','gx-')
- thruput_v_snr('ctxc','datac3','mpp','rx-')
- thruput_v_snr('ctxc','datac4','mpp','cx-')
- thruput_v_snr('ctxc','datac13','mpp','mx-')
- xlabel('SNR (dB)'); ylabel('bits/s'); grid;
- hold off;
- axis([-10 10 0 1000]);
- title(' Throughput for C Tx (with compression)');
- legend('location','west');
-endfunction
-
-function c_tx_comp_thruput_print;
- state_vec = set_graphics_state_print;
- c_tx_comp_thruput_screen;
- print("c_tx_comp_thruput.png", "-dpng","-S1000,800");
- set_graphics_state_screen(state_vec);
-endfunction
-
-#{
-figure(1); octave_ch_noise_screen;
-figure(2); octave_c_tx_screen;
-figure(3); octave_c_tx_comp_screen
-figure(4); snrest_snr_screen;
-
-figure(5); octave_ch_noise_print;
-figure(6); octave_c_tx_print;
-figure(7); octave_c_tx_comp_print;
-figure(8); snrest_snr_print;
-#}
diff --git a/octave/tcohpsk.m b/octave/tcohpsk.m
index 00afafb..54bdeb1 100644
--- a/octave/tcohpsk.m
+++ b/octave/tcohpsk.m
@@ -1,7 +1,7 @@
% tcohpsk.m
% David Rowe Oct 2014
%
-% Octave coherent PSK modem script that hs two modes:
+% Octave coherent PSK modem script that has two modes:
%
% i) tests the C port of the coherent PSK modem. This script loads
% the output of unittest/tcohpsk.c and compares it to the output of
@@ -254,10 +254,12 @@ acohpsk.f_fine_est = 0;
acohpsk.ct = 4;
acohpsk.ftrack_en = ftrack_en;
-[spread spread_2ms hf_gain] = init_hf_model(Fs, frames*acohpsk.Nsymbrowpilot*afdmdv.M);
-hf_n = 1;
-nhfdelay = floor(hf_delay_ms*Fs/1000);
-ch_fdm_delay = zeros(1, acohpsk.Nsymbrowpilot*M + nhfdelay);
+if fading_en
+ [spread spread_2ms hf_gain] = init_hf_model(Fs, frames*acohpsk.Nsymbrowpilot*afdmdv.M);
+ hf_n = 1;
+ nhfdelay = floor(hf_delay_ms*Fs/1000);
+ ch_fdm_delay = zeros(1, acohpsk.Nsymbrowpilot*M + nhfdelay);
+end
% simulated SSB tx filter
diff --git a/octave/tdetphase.m b/octave/tdetphase.m
deleted file mode 100644
index 8d7f96c..0000000
--- a/octave/tdetphase.m
+++ /dev/null
@@ -1,84 +0,0 @@
-% tdetphase.m
-% David Rowe August 2017
-%
-% Testing Hilbert Transform recover of phase from magnitude spectra
-
-newamp;
-Fs = 8000;
-
-w = 2*pi*500/Fs; gamma = 0.95
-ak = [1 -2*gamma*cos(w) gamma*gamma];
-Nfft = 512;
-
-% Test 1 - compare phase from freqz for 2nd order system (all pole filter)
-% - uses internal test of determine_phase()
-
-h = freqz(1,ak,Nfft/2);
-
-% note dummy_model not used, as determine_phase() is used in test mode
-
-L = 20; Wo = pi/(L+1);
-dummy_model = [Wo L ones(1,L)];
-phase = determine_phase(dummy_model, 1, Nfft, ak);
-
-fg = 1;
-figure(fg++); clf;
-subplot(211); plot(20*log10(abs(h))); title('test 1');
-subplot(212); plot(angle(h)); hold on; plot(phase(1:Nfft/2),'g'); hold off;
-
-% Test 2 - feed in harmonic magnitudes
-
-F0 = 100; Wo = 2*pi*F0/Fs; L = floor(pi/Wo);
-Am = zeros(1,L);
-for m=1:L
- b = round(m*Wo*Nfft/(2*pi));
- Am(m) = abs(h(b));
-end
-AmdB = 20*log10(Am);
-model = [Wo L Am];
-[phase Gdbfk s] = determine_phase(model, 1, Nfft);
-
-fftx = (1:Nfft/2)*(Fs/Nfft);
-harmx = (1:L)*Wo*Fs/(2*pi);
-
-figure(fg++); clf;
-subplot(211); plot(fftx, Gdbfk(1:Nfft/2));
-subplot(212); plot(s(1:Nfft/2))
-
-figure(fg++); clf;
-subplot(211); plot(fftx, 20*log10(abs(h)));
- hold on; plot(harmx, AmdB, 'g+'); plot(fftx, Gdbfk(1:Nfft/2), 'r'); hold off;
-subplot(212); plot(fftx, angle(h)); hold on; plot(fftx, phase(1:Nfft/2),'g'); hold off;
-
-% Test 3 - Use real harmonic amplitudes
-
-model = load("../build_linux/src/hts1a_model.txt");
-phase_orig = load("../build_linux/src/hts1a_phase.txt");
-
-f = 184;
-Wo = model(f,1); L = model(f,2); Am = model(f,3:L+2); AmdB = 20*log10(Am);
-[phase Gdbfk s] = determine_phase(model, f, Nfft);
-
-fftx = (1:Nfft/2)*(Fs/Nfft);
-harmx = (1:L)*Wo*Fs/(2*pi);
-
-figure(fg++); clf;
-subplot(211); plot(fftx, Gdbfk(1:Nfft/2));
-subplot(212); plot(s(1:Nfft/2))
-
-figure(fg++); clf;
-subplot(211); plot(harmx, AmdB, 'g+');
- hold on; plot(fftx, Gdbfk(1:Nfft/2), 'r'); hold off;
-subplot(212); plot(fftx, phase(1:Nfft/2),'g');
-
-% synthesise using phases
-
-N = 320;
-s = s_phase = zeros(1,N);
-for m=1:L/4
- s = s + Am(m)*cos(m*Wo*(1:N) + phase_orig(f,m));
- b = round(m*Wo*Nfft/(2*pi));
- s_phase = s_phase + Am(m)*cos(m*Wo*(1:N) + phase(b));
-end
-figure(fg++); clf;
-subplot(211); plot(s); subplot(212); plot(s_phase,'g');
diff --git a/octave/test_dqpsk2.m b/octave/test_dqpsk2.m
deleted file mode 100644
index d421d62..0000000
--- a/octave/test_dqpsk2.m
+++ /dev/null
@@ -1,465 +0,0 @@
-% test_dqpsk2.m
-% David Rowe April 2014
-%
-% DQPSK modem simulation inclduing filtering to test modulating modem
-% tx power based on speech energy. Unlike test_dpsk runs at sample
-% rate Fs.
-
-1;
-
-% main test function
-
-function sim_out = ber_test(sim_in)
- Fs = 8000;
-
- verbose = sim_in.verbose;
- framesize = sim_in.framesize;
- Ntrials = sim_in.Ntrials;
- Esvec = sim_in.Esvec;
- phase_offset = sim_in.phase_offset;
- w_offset = sim_in.w_offset;
- plot_scatter = sim_in.plot_scatter;
- Rs = sim_in.Rs;
- hf_sim = sim_in.hf_sim;
- Nhfdelay = floor(sim_in.hf_delay_ms*Fs/1000);
- Nc = sim_in.Nc;
- symbol_amp = sim_in.symbol_amp;
-
- bps = 2;
- Nsymb = framesize/bps;
- for k=1:Nc
- prev_sym_tx(k) = qpsk_mod([0 0]);
- prev_sym_rx(k) = qpsk_mod([0 0]);
- end
-
- % design root nyquist (root raised cosine) filter and init tx and rx filter states
-
- alpha = 0.5; T=1/Fs; Nfiltsym=7; M=Fs/Rs;
- if floor(Fs/Rs) != Fs/Rs
- printf("oversampling ratio must be an integer\n");
- return;
- end
- hrn = gen_rn_coeffs(alpha, T, Rs, Nfiltsym, M);
- Nfilter = length(hrn);
-
- % convert "spreading" samples from 1kHz carrier at Fs to complex
- % baseband, generated by passing a 1kHz sine wave through PathSim
- % with the ccir-poor model, enabling one path at a time.
-
- Fc = 1000;
- fspread = fopen("../raw/sine1k_2Hz_spread.raw","rb");
- spread1k = fread(fspread, "int16")/10000;
- fclose(fspread);
- fspread = fopen("../raw/sine1k_2ms_delay_2Hz_spread.raw","rb");
- spread1k_2ms = fread(fspread, "int16")/10000;
- fclose(fspread);
-
- % down convert to complex baseband
- spreadbb = spread1k.*exp(-j*(2*pi*Fc/Fs)*(1:length(spread1k))');
- spreadbb_2ms = spread1k_2ms.*exp(-j*(2*pi*Fc/Fs)*(1:length(spread1k_2ms))');
-
- % remove -2000 Hz image
- b = fir1(50, 5/Fs);
- spread = filter(b,1,spreadbb);
- spread_2ms = filter(b,1,spreadbb_2ms);
-
- % discard first 1000 samples as these were near 0, probably as
- % PathSim states were ramping up. Transpose for convenience
-
- spread = transpose(spread(1000:length(spread)));
- spread_2ms = transpose(spread_2ms(1000:length(spread_2ms)));
-
- % Determine "gain" of HF channel model, so we can normalise
- % carrier power during HF channel sim to calibrate SNR. I imagine
- % different implementations of ccir-poor would do this in
- % different ways, leading to different BER results. Oh Well!
-
- hf_gain = 1.0/sqrt(var(spread)+var(spread_2ms));
-
- % Start Simulation ----------------------------------------------------------------
-
- for ne = 1:length(Esvec)
- EsNodB = Esvec(ne);
- EsNo = 10^(EsNodB/10);
-
- variance = Fs/(Rs*EsNo);
- if verbose > 1
- printf("EsNo (dB): %f EsNo: %f variance: %f\n", EsNodB, EsNo, variance);
- end
-
- Terrs = 0; Tbits = 0;
-
- tx_symb_log = [];
- rx_symb_log = [];
- noise_log = [];
- sim_out.errors_log = [];
- sim_out.tx_baseband_log = [];
- sim_out.rx_filt_log = [];
- symbol_amp_index = 1;
-
- % init filter memories and LOs
-
- tx_filter_memory = zeros(Nc, Nfilter);
- rx_filter_memory = zeros(Nc, Nfilter);
- s_delay_line_filt = zeros(Nc, Nfiltsym);
- phase_tx = ones(1,Nc);
- phase_rx = ones(1,Nc);
- Fcentre = 1500; Fsep = (1+alpha)*Rs;
- freq = Fcentre + Fsep*((-Nc/2+0.5):(Nc/2-0.5));
- freq = exp(j*freq*2*pi/Fs);
-
- % init HF channel
-
- sc = 1; hf_n = 1;
- hf_sim_delay_line = zeros(1,M+Nhfdelay);
- freq_sample_hz = Fcentre + ((Fsep*(-Nc/2)):50:(Fsep*(Nc/2)));
- freq_sample_rads = (2*pi/Fs)*freq_sample_hz;
- hf_model = ones(Ntrials*Nsymb/Nc, length(freq_sample_rads)); % defaults for plotting surface
-
- % bunch of outputs we log for graphing
-
- sim_out.errors_log = [];
- sim_out.Nerrs = [];
- sim_out.snr_log = [];
- sim_out.hf_model_pwr = [];
- sim_out.tx_fdm_log = [];
- C_log = [];
-
- for nn = 1: Ntrials
-
- tx_bits = round( rand( 1, framesize ) );
-
- % modulate --------------------------------------------
-
- s = zeros(1, Nsymb);
- for i=1:Nc:Nsymb
- for k=1:Nc
- tx_symb = qpsk_mod(tx_bits(2*(i-1+k-1)+1:2*(i+k-1)));
- s_qpsk(i+k-1) = tx_symb;
- tx_symb *= prev_sym_tx(k);
- prev_sym_tx(k) = tx_symb;
- s(i+k-1) = symbol_amp(symbol_amp_index)*tx_symb;
- end
- end
- symbol_amp_index++;
- s_ch = s;
-
- % Now we start processing frame Nc symbols at a time to model parallel carriers
-
- tx_fdm_sym_log = [];
- for i=1:Nc:Nsymb
-
- % Delay tx symbols to match delay due to filters. qpsk
- % (rather than dqpsk) symbols used for convenience as
- % it's easy to shift symbols than pairs of bits
-
- s_delay_line_filt(:,1:Nfiltsym-1) = s_delay_line_filt(:,2:Nfiltsym);
- s_delay_line_filt(:,Nfiltsym) = s_qpsk(i:i+Nc-1);
- s_qpsk(i:i+Nc-1) = s_delay_line_filt(:,1);
- for k=1:Nc
- tx_bits(2*(i-1+k-1)+1:2*(i+k-1)) = qpsk_demod(s_qpsk(i+k-1));
- end
-
- % tx filter
-
- tx_baseband = zeros(Nc,M);
-
- % tx filter each symbol, generate M filtered output samples for each symbol.
- % Efficient polyphase filter techniques used as tx_filter_memory is sparse
-
- tx_filter_memory(:,Nfilter) = s(i:i+Nc-1);
-
- for k=1:M
- tx_baseband(:,k) = M*tx_filter_memory(:,M:M:Nfilter) * hrn(M-k+1:M:Nfilter)';
- end
- tx_filter_memory(:,1:Nfilter-M) = tx_filter_memory(:,M+1:Nfilter);
- tx_filter_memory(:,Nfilter-M+1:Nfilter) = zeros(Nc,M);
-
- sim_out.tx_baseband_log = [sim_out.tx_baseband_log tx_baseband];
-
- % upconvert
-
- tx_fdm = zeros(1,M);
-
- for c=1:Nc
- for k=1:M
- phase_tx(c) = phase_tx(c) * freq(c);
- tx_fdm(k) = tx_fdm(k) + tx_baseband(c,k)*phase_tx(c);
- end
- end
-
- sim_out.tx_fdm_log = [sim_out.tx_fdm_log tx_fdm];
-
- % HF channel
-
- if hf_sim
- hf_sim_delay_line(1:Nhfdelay) = hf_sim_delay_line(M+1:M+Nhfdelay);
- hf_sim_delay_line(Nhfdelay+1:M+Nhfdelay) = tx_fdm;
-
- tx_fdm = tx_fdm.*spread(sc:sc+M-1) + hf_sim_delay_line(1:M).*spread_2ms(sc:sc+M-1);
- tx_fdm *= hf_gain;
-
- % sample HF channel spectrum in middle of this symbol for plotting
-
- hf_model(hf_n,:) = hf_gain*(spread(sc+M/2) + exp(-j*freq_sample_rads*Nhfdelay)*spread_2ms(sc+M/2));
-
- sc += M;
- hf_n++;
- end
-
- tx_fdm_sym_log = [tx_fdm_sym_log tx_fdm ];
-
- % AWGN noise and phase/freq offset channel simulation
- % 0.5 factor ensures var(noise) == variance , i.e. splits power between Re & Im
-
- noise = sqrt(variance*0.5)*(randn(1,M) + j*randn(1,M));
- noise_log = [noise_log noise];
-
- % apply frequency and phase offset and noise
-
- for k=1:M
- rx_fdm(k) = tx_fdm(k)*exp(j*phase_offset) + noise(k);
- phase_offset += w_offset;
- end
-
- % downconvert
-
- rx_baseband = zeros(Nc,M);
- for c=1:Nc
- for k=1:M
- phase_rx(c) = phase_rx(c) * freq(c);
- rx_baseband(c,k) = rx_fdm(k)*phase_rx(c)';
- end
- end
-
- % rx filter
-
- rx_filter_memory(:,Nfilter-M+1:Nfilter) = rx_baseband;
- rx_filt = rx_filter_memory * hrn';
- rx_filter_memory(:,1:Nfilter-M) = rx_filter_memory(:,1+M:Nfilter);
- sim_out.rx_filt_log = [sim_out.rx_filt_log rx_filt];
-
- s_ch(i:i+Nc-1) = rx_filt;
- end
-
- % est HF model power for entire code frame (which could be several symbols)
-
- if hf_sim
- frame_hf_model = reshape(hf_model(hf_n-Nsymb/Nc:hf_n-1,:),1,(Nsymb/Nc)*length(freq_sample_hz));
- sim_out.hf_model_pwr = [sim_out.hf_model_pwr mean(abs(frame_hf_model).^2)];
- else
- sim_out.hf_model_pwr = [sim_out.hf_model_pwr 1];
- end
-
- % "genie" SNR estimate
-
- snr = (tx_fdm_sym_log*tx_fdm_sym_log')/(M*variance);
- sim_out.snr_log = [sim_out.snr_log snr];
-
- % de-modulate
-
- rx_bits = zeros(1, framesize);
- for i=1:Nc:Nsymb
- for k=1:Nc
- rx_symb = s_ch(i+k-1);
- tmp = rx_symb;
- rx_symb *= conj(prev_sym_rx(k)/abs(prev_sym_rx(k)));
- prev_sym_rx(k) = tmp;
- rx_bits((2*(i-1+k-1)+1):(2*(i+k-1))) = qpsk_demod(rx_symb);
- rx_symb_log = [rx_symb_log rx_symb];
- end
- end
-
- % ignore data until we have enough frames to fill filter memory
- % then count errors
-
- if nn > ceil(Nfiltsym/(Nsymb/Nc))
- error_positions = xor(rx_bits, tx_bits);
- sim_out.errors_log = [sim_out.errors_log error_positions];
- Nerrs = sum(error_positions);
- sim_out.Nerrs = [sim_out.Nerrs Nerrs];
- Terrs += Nerrs;
- Tbits += length(tx_bits);
- end
-
- end
-
- TERvec(ne) = Terrs;
- BERvec(ne) = Terrs/Tbits;
-
- if verbose
- printf("EsNo (dB): %f Terrs: %d BER %f ", EsNodB, Terrs, Terrs/Tbits);
- printf("\n");
- end
- if verbose > 1
- printf("Terrs: %d BER %f C %f N %f Es %f No %f Es/No %f\n\n", Terrs,
- Terrs/Tbits, var(sim_out.tx_fdm_log), var(noise_log),
- var(sim_out.tx_fdm_log)/(Nc*Rs), var(noise_log)/Fs, (var(sim_out.tx_fdm_log)/(Nc*Rs))/(var(noise_log)/Fs));
- end
- end
-
- Ebvec = Esvec - 10*log10(bps);
-
- sim_out.BERvec = BERvec;
- sim_out.Ebvec = Ebvec;
- sim_out.TERvec = TERvec;
-
- if plot_scatter
- figure(2);
- clf;
- scat = rx_symb_log(Nfiltsym*Nc:length(rx_symb_log)) .* exp(j*pi/4);
- plot(real(scat), imag(scat),'+');
- title('Scatter plot');
-
- figure(3);
- clf;
- y = 1:Rs*2;
- EsNodBSurface = 20*log10(abs(hf_model(y,:))) + EsNodB;
- mesh(1:length(freq_sample_hz),y,EsNodBSurface);
- grid
- title('HF Channel Es/No');
- end
-
-endfunction
-
-% Gray coded QPSK modulation function
-
-function symbol = qpsk_mod(two_bits)
- two_bits_decimal = sum(two_bits .* [2 1]);
- switch(two_bits_decimal)
- case (0) symbol = 1;
- case (1) symbol = j;
- case (2) symbol = -j;
- case (3) symbol = -1;
- endswitch
-endfunction
-
-% Gray coded QPSK demodulation function
-
-function two_bits = qpsk_demod(symbol)
- if isscalar(symbol) == 0
- printf("only works with scalars\n");
- return;
- end
- bit0 = real(symbol*exp(j*pi/4)) < 0;
- bit1 = imag(symbol*exp(j*pi/4)) < 0;
- two_bits = [bit1 bit0];
-endfunction
-
-function sim_in = standard_init
- sim_in.verbose = 1;
- sim_in.plot_scatter = 0;
-
- sim_in.Esvec = 5:15;
- sim_in.Ntrials = 100;
- sim_in.framesize = 64;
- sim_in.Rs = 100;
- sim_in.Nc = 8;
-
- sim_in.phase_offset = 0;
- sim_in.w_offset = 0;
- sim_in.phase_noise_amp = 0;
-
- sim_in.hf_delay_ms = 2;
- sim_in.hf_sim = 0;
- sim_in.hf_phase_only = 0;
- sim_in.hf_mag_only = 0;
-endfunction
-
-function awgn_hf_ber_curves()
- sim_in = standard_init();
-
- Ebvec = sim_in.Esvec - 10*log10(2);
- BER_theory = 0.5*erfc(sqrt(10.^(Ebvec/10)));
-
- dpsk_awgn = ber_test(sim_in);
- sim_in.hf_sim = 1;
- dpsk_hf = ber_test(sim_in);
-
- figure(1);
- clf;
- semilogy(Ebvec, BER_theory,'r;QPSK theory;')
- hold on;
- semilogy(dpsk_awgn.Ebvec, dpsk_awgn.BERvec,'g;DQPSK;')
- semilogy(dpsk_hf.Ebvec, dpsk_hf.BERvec,'g;DQPSK HF;')
- hold off;
- xlabel('Eb/N0')
- ylabel('BER')
- grid("minor")
- axis([min(Ebvec) max(Ebvec) 1E-3 1])
-end
-
-sim_in = standard_init();
-
-% energy file sampled every 10ms
-
-load ../src/ve9qrp.txt
-pdB=10*log10(ve9qrp);
-for i=1:length(pdB)
- if pdB(i) < 0
- pdB(i) = 0;
- end
-end
-
-% Down sample to 40ms rate used for 1300 bit/s codec, every 4th sample is transmitted
-
-pdB = pdB(4:4:length(pdB));
-
-% Use linear mapping function in dB domain to map to symbol power
-
-%power_map_x = [ 0 20 24 40 50 ];
-%power_map_y = [--6 -6 0 6 6];
-power_map_x = [ 0 50 ];
-power_map_y = [ -15 12];
-mapped_pdB = interp1(power_map_x, power_map_y, pdB);
-
-sim_in.symbol_amp = 10 .^ (mapped_pdB/20);
-%sim_in.symbol_amp = ones(1,length(pdB));
-sim_in.plot_scatter = 1;
-sim_in.verbose = 2;
-sim_in.hf_delay_ms = 2;
-sim_in.hf_sim = 1;
-sim_in.Esvec = 10;
-sim_in.Ntrials = 400;
-
-dqpsk_pwr_hf = ber_test(sim_in);
-
-% note: need way to test that power is aligned with speech
-
-figure(4)
-clf;
-plot((1:sim_in.Ntrials)*80*4, pdB(1:sim_in.Ntrials));
-hold on;
-plot((1:sim_in.Ntrials)*80*4, mapped_pdB(1:sim_in.Ntrials),'r');
-hold off;
-
-figure(5)
-clf;
-s = load_raw("../raw/ve9qrp.raw");
-M=320; M_on_2 = M/2; % processing delay between input speech and centre of analysis window
-subplot(211)
-plot(M_on_2:(M_on_2-1+sim_in.Ntrials*M),s(1:sim_in.Ntrials*M))
-hold on;
-plot((1:sim_in.Ntrials)*M, 5000*sim_in.symbol_amp(1:sim_in.Ntrials),'r');
-hold off;
-axis([1 sim_in.Ntrials*M -3E4 3E4]);
-subplot(212)
-plot(real(dqpsk_pwr_hf.tx_fdm_log));
-
-
-figure(6)
-clf;
-plot((1:sim_in.Ntrials)*M, 20*log10(sim_in.symbol_amp(1:sim_in.Ntrials)),'b;Es (dB);');
-hold on;
-plot((1:sim_in.Ntrials)*M, 10*log10(dqpsk_pwr_hf.hf_model_pwr),'g;Fading (dB);');
-plot((1:sim_in.Ntrials)*M, 10*log10(dqpsk_pwr_hf.snr_log),'r;Es/No (dB);');
-
-ber = dqpsk_pwr_hf.Nerrs/sim_in.framesize;
-ber_clip = ber;
-ber_clip(find(ber > 0.2)) = 0.2;
-plot((1:length(ber_clip))*M, -20+100*ber_clip,'k;BER (0-20%);');
-hold off;
-axis([1 sim_in.Ntrials*M -20 20])
-
-fep=fopen("dqpsk_errors_pwr.bin","wb"); fwrite(fep, dqpsk_pwr_hf.errors_log, "short"); fclose(fep);
-fber=fopen("ber.bin","wb"); fwrite(fber, ber, "float"); fclose(fber);
diff --git a/octave/test_ldpc_fsk_lib.m b/octave/test_ldpc_fsk_lib.m
deleted file mode 100644
index 0817888..0000000
--- a/octave/test_ldpc_fsk_lib.m
+++ /dev/null
@@ -1,851 +0,0 @@
-% test_ldpc_fsk_lib
-% David Rowe 16 April 2016
-%
-% A series of tests for ldpc_fsk_lib, and C versions ldpc_enc and ldpc_dec.
-% Gradually builds up complete C command line for SSTV balloon system,
-% using Octave versions of LDPC and FSK modem as reference points.
-
-1;
-
-% encodes and decodes one frame, also writes codeword.bin for testing
-% decode_from_file() below, and can optionally generate include file for
-% C version of decoder.
-
-function [data code_param] = simple_ut(c_include_file)
- load('H2064_516_sparse.mat');
- HRA = full(HRA);
- max_iterations = 100;
- decoder_type = 0;
- EsNodB = 3;
- mod_order = 2;
-
- code_param = ldpc_init(HRA, mod_order);
- data = round( rand( 1, code_param.data_bits_per_frame ) );
- codeword = ldpc_encode(code_param, data);
- f = fopen("codeword.bin","wt"); fwrite(f, codeword, "uint8"); fclose(f);
- s = 1 - 2 * codeword;
- code_param.symbols_per_frame = length( s );
-
- EsNo = 10^(EsNodB/10);
- variance = 1/(2*EsNo);
- noise = sqrt(variance)* randn(1,code_param.symbols_per_frame);
- rx = s + noise;
-
- if nargin == 1
- code_param.c_include_file = c_include_file;
- end
- [detected_data Niters] = ldpc_decode(rx, code_param, max_iterations, decoder_type);
-
- error_positions = xor(detected_data(1:code_param.data_bits_per_frame), data);
- Nerrs = sum(error_positions);
-
- printf("Nerrs = %d\n", Nerrs);
-end
-
-
-% This version decodes from a file of bits
-
-function detected_data = decode_from_file(filename)
- max_iterations = 100;
- decoder_type = 0;
- load('H2064_516_sparse.mat');
- HRA = full(HRA);
- mod_order = 2;
-
- f = fopen(filename,"rb"); codeword = fread(f, "uint8")'; fclose(f);
- r = 1 - 2 * codeword;
- code_param = ldpc_init(HRA, mod_order);
- [detected_data Niters] = ldpc_decode(r, code_param, max_iterations, decoder_type);
-end
-
-
-% plots a BER curve for the LDPC decoder. Takes a while to run, uses parallel cores
-
-function plot_curve
- num_cores = 4; % set this to the number of cores you have
-
- load('H2064_516_sparse.mat');
- HRA = full(HRA);
- [Nr Nc] = size(HRA);
- sim_in.rate = (Nc-Nr)/Nc;
-
- sim_in.HRA = HRA;
- sim_in.mod_order = 2;
- sim_in.framesize = Nc;
- sim_in.mod_order = 2;
- sim_in.Lim_Ferrs = 100;
-
- % note we increase number of trials as BER goes down
-
- Esvec = [ 0 0.5 1.0 1.5 2.0 2.5 3.0 3.5 4.0 ];
- Ntrials = [ 1E4 1E4 1E4 1E4 1E5 1E5 1E5 1E5 1E5 ];
- num_runs = length(Esvec)
-
- sim_in_vec(1:num_runs) = sim_in;
- for i = 1:num_runs
- sim_in_vec(i).Esvec = Esvec(i);
- sim_in_vec(i).Ntrials = Ntrials(i);
- end
-
- %sim_out = ldpc5(sim_in_vec(1));
- tstart = time();
- sim_out = pararrayfun(num_cores, @ldpc5, sim_in_vec);
- tend = time();
-
- total_bits = sum(Ntrials)*sim_in.framesize;
- total_secs = tend - tstart;
- printf("%d bits in %4.1f secs, or %5f bits/s\n", total_bits, total_secs, total_bits/total_secs);
-
- for i=1:num_runs
- Ebvec(i) = sim_out(i).Ebvec;
- BERvec(i) = sim_out(i).BERvec;
- end
- semilogy(Ebvec, BERvec, '+-')
- xlabel('Eb/N0')
- ylabel('BER')
- title(['H2064 516 sparse.mat' ' ' date])
-
-end
-
-
-% Test C encoder
-
-function test_c_encoder
- load('H2064_516_sparse.mat');
- HRA = full(HRA);
- max_iterations = 100;
- decoder_type = 0;
- EsNodB = 3;
- mod_order = 2;
- frames = 100;
-
- EsNo = 10^(EsNodB/10);
- variance = 1/(2*EsNo);
-
- code_param = ldpc_init(HRA, mod_order);
-
- data = round(rand(1,frames*code_param.data_bits_per_frame));
- f = fopen("data.bin","wt"); fwrite(f, data, "uint8"); fclose(f);
-
- % Outboard C encoder
-
- system("../src/ldpc_enc data.bin codewords.bin");
-
- % Test with Octave decoder
-
- f = fopen("codewords.bin","rb"); codewords = fread(f, "uint8")'; fclose(f);
-
- Nerrs = 0;
- for i=1:frames
- st = (i-1)*code_param.symbols_per_frame+1; en = st+code_param.symbols_per_frame-1;
- tx = 1 - 2 * codewords(st:en);
-
- noise = sqrt(variance)*randn(1,code_param.symbols_per_frame);
- rx = tx + noise;
-
- [detected_data Niters] = ldpc_decode(rx, code_param, max_iterations, decoder_type);
-
- st = (i-1)*code_param.data_bits_per_frame+1; en = st+code_param.data_bits_per_frame-1;
- error_positions = xor(detected_data(1:code_param.data_bits_per_frame), data(st:en));
- Nerrs += sum(error_positions);
- end
-
- printf("Nerrs = %d\n", Nerrs);
-end
-
-
-function test_c_decoder
- load('H2064_516_sparse.mat');
- HRA = full(HRA);
- max_iterations = 100;
- decoder_type = 0;
- mod_order = 2;
- frames = 10;
- EsNodB = 2;
- sdinput = 1;
-
- EsNo = 10^(EsNodB/10);
- variance = 1/(2*EsNo);
-
- code_param = ldpc_init(HRA, mod_order);
- data = round(rand(1,code_param.data_bits_per_frame*frames));
-
- f = fopen("data.bin","wt"); fwrite(f, data, "uint8"); fclose(f);
- system("../src/ldpc_enc data.bin codewords.bin");
- f = fopen("codewords.bin","rb"); codewords = fread(f, "uint8")'; fclose(f);
-
- s = 1 - 2 * codewords;
- noise = sqrt(variance)*randn(1,code_param.symbols_per_frame*frames);
- r = s + noise;
-
- % calc LLRs frame by frame
-
- for i=1:frames
- st = (i-1)*code_param.symbols_per_frame+1;
- en = st + code_param.symbols_per_frame-1;
- llr(st:en) = sd_to_llr(r(st:en));
- end
-
- % Outboard C decoder
-
- if sdinput
- f = fopen("sd.bin","wb"); fwrite(f, r, "double"); fclose(f);
- system("../src/ldpc_dec sd.bin data_out.bin --sd");
- else
- f = fopen("llr.bin","wb"); fwrite(f, llr, "double"); fclose(f);
- system("../src/ldpc_dec llr.bin data_out.bin");
- end
-
- f = fopen("data_out.bin","rb"); data_out = fread(f, "uint8")'; fclose(f);
-
- Nerrs = Nerrs2 = zeros(1,frames);
- for i=1:frames
-
- % Check C decoder
-
- data_st = (i-1)*code_param.data_bits_per_frame+1;
- data_en = data_st+code_param.data_bits_per_frame-1;
- st = (i-1)*code_param.symbols_per_frame+1;
- en = st+code_param.data_bits_per_frame-1;
- data_out_c = data_out(st:en);
- error_positions = xor(data_out_c, data(data_st:data_en));
- Nerrs(i) = sum(error_positions);
-
- % Octave decoder
-
- st = (i-1)*code_param.symbols_per_frame+1; en = st+code_param.symbols_per_frame-1;
- [detected_data Niters] = ldpc_decode(r(st:en), code_param, max_iterations, decoder_type);
- st = (i-1)*code_param.data_bits_per_frame+1; en = st+code_param.data_bits_per_frame-1;
- data_out_octave = detected_data(1:code_param.data_bits_per_frame);
- error_positions = xor(data_out_octave, data(st:en));
- Nerrs2(i) = sum(error_positions);
- %printf("%4d ", Niters);
- end
- printf("Errors per frame:\nC.....:");
- for i=1:frames
- printf("%4d ", Nerrs(i));
- end
- printf("\nOctave:");
- for i=1:frames
- printf("%4d ", Nerrs2(i));
- end
- printf("\n");
-
-end
-
-% Saves a complex vector s to a file "filename" of IQ unsigned 8 bit
-% chars, same as RTLSDR format.
-
-function save_rtlsdr(filename, s)
- mx = max(abs(s));
- re = real(s); im = imag(s);
- l = length(s);
- iq = zeros(1,2*l);
- %iq(1:2:2*l) = 127 + re*(127/mx);
- %iq(2:2:2*l) = 127 + im*(127/mx);
- iq(1:2:2*l) = 127 + 32*re;
- iq(2:2:2*l) = 127 + 32*im;
- figure(3); clf; plot(iq); title('simulated IQ signal from RTL SDR');
- fs = fopen(filename,"wb");
- fwrite(fs,iq,"uchar");
- fclose(fs);
-endfunction
-
-
-% Oversamples by a factor of 2 using Octaves resample() function then
-% uses linear interpolation to achieve fractional sample rate
-
-function rx_resample_fract = fractional_resample(rx, resample_rate);
- assert(resample_rate < 2, "keep resample_rate between 0 and 2");
- rx_resample2 = resample(rx, 2, 1);
- l = length(rx_resample2);
- rx_resample_fract = zeros(1,l);
- k = 1;
- step = 2/resample_rate;
- for i=1:step:l-1
- i_low = floor(i);
- i_high = ceil(i);
- f = i - i_low;
- rx_resample_fract(k) = (1-f)*rx_resample2(i_low) + f*rx_resample2(i_high);
- %printf("i: %f i_low: %d i_high: %d f: %f\n", i, i_low, i_high, f);
- k++;
- end
- rx_resample_fract = rx_resample_fract(1:k-1);
-endfunction
-
-
-% Using simulated SSTV packet, generate complex fsk mod signals, 8-bit
-% unsigned IQ for feeding into C demod chain. Can also be used to
-% generate BER curves. Found bugs in UW size and our use of csdr
-% re-sampler using this function, and by gradually and carefully
-% building up the C command line.
-
-#{
-todo: [X] uncoded BER
- [X] octave fsk demod
- [X] use C demod
- [X] compare uncoded BER to unsigned 8 bit IQ to regular 16-bit
- [X] generate complex rx signal with noise
- [X] used cmd line utils to drive demod
- [X] test with resampler
- [X] measure effect on PER with coding
-#}
-
-function [n_uncoded_errs n_uncoded_bits] = run_sstv_sim(sim_in, EbNodB)
-
- frames = sim_in.frames;
- demod_type = sim_in.demod_type;
-
- % init LDPC code
-
- load('H2064_516_sparse.mat');
- HRA = full(HRA);
- max_iterations = 100;
- decoder_type = 0;
- mod_order = 2;
-
- code_param = ldpc_init(HRA, mod_order);
-
- % note fixed frame of bits used for BER testing
-
- tx_codeword = gen_sstv_frame;
-
- % init FSK modem
-
- fsk_horus_as_a_lib = 1;
- fsk_horus;
- states = fsk_horus_init_hbr(9600, 8, 1200, 2, length(tx_codeword));
- states.df(1:states.M) = 0;
- states.dA(1:states.M) = 1;
- states.tx_real = 0; % Octave fsk_mod generates complex valued output
- % so we can simulate rtl_sdr complex output
-
- % Set up simulated tx tones to sit in the middle of cdsr passband
-
- filt_low_norm = 0.1; filt_high_norm = 0.4;
- fc = states.Fs*(filt_low_norm + filt_high_norm)/2;
- %fc = 1800;
- f1 = fc - states.Rs/2;
- f2 = fc + states.Rs/2;
- states.ftx = [f1 f2];
-
- % set up AWGN channel
-
- EbNo = 10^(EbNodB/10);
- variance = states.Fs/(states.Rs*EbNo*states.bitspersymbol);
-
- % start simulation ----------------------------------------
-
- tx_bit_stream = [];
- for i=1:frames
- % uncomment for different data on each frame
- %tx_codeword = gen_sstv_frame;
- tx_bit_stream = [tx_bit_stream tx_codeword];
- end
-
- printf("%d bits at %d bit/s is a %3.1f second run\n", length(tx_bit_stream), 115200,length(tx_bit_stream)/115200);
-
- % modulate and channel model
-
- tx = fsk_horus_mod(states, tx_bit_stream);
- noise_real = sqrt(variance)*randn(length(tx),1);
- noise_complex = sqrt(variance/2)*(randn(length(tx),1) + j*randn(length(tx),1));
-
- % demodulate -----------------------------------------------------
-
- if demod_type == 1
-
- % Octave demod
-
- if states.tx_real
- rx = tx + noise_real;
- else
- rx = tx + noise_complex;
- end
- SNRdB = 10*log10(var(tx)/var(noise_complex));
-
- % demodulate frame by frame using Octave demod
-
- st = 1;
- run_frames = floor(length(rx)/states.N);
- rx_bit_stream = [];
- rx_sd_stream = [];
- for f=1:run_frames
-
- % extract nin samples from rx sample stream
-
- nin = states.nin;
- en = st + states.nin - 1;
-
- if en <= length(rx) % due to nin variations its possible to overrun buffer
- sf = rx(st:en);
- st += nin;
-
- % demodulate to stream of bits
-
- states.f = [f1 f2]; % note that for Octave demod we cheat and use known tone frequencies
- % allows us to determine if freq offset estimation in C demod is a problem
-
- [rx_bits states] = fsk_horus_demod(states, sf);
- rx_bit_stream = [rx_bit_stream rx_bits];
- rx_sd_stream = [rx_sd_stream states.rx_bits_sd];
- end
- end
- end
-
- if demod_type == 2
- % baseline C demod
-
- if states.tx_real
- rx = tx + noise_real;
- else
- rx = 2*real(tx) + noise_real;
- end
- SNRdB = 10*log10(var(tx)/var(noise_real));
- rx_scaled = 1000*real(rx);
- f = fopen("fsk_demod.raw","wb"); fwrite(f, rx_scaled, "short"); fclose(f);
- system("../build_linux/src/fsk_demod 2X 8 9600 1200 fsk_demod.raw fsk_demod.bin");
- f = fopen("fsk_demod.bin","rb"); rx_bit_stream = fread(f, "uint8")'; fclose(f);
- end
-
- if demod_type == 3
- % C demod driven by csdr command line kung fu
-
- assert(states.tx_real == 0, "need complex signal for this test");
- rx = tx + noise_complex;
- SNRdB = 10*log10(var(tx)/var(noise_real));
- save_rtlsdr("fsk_demod.iq", rx);
- system("cat fsk_demod.iq | csdr convert_u8_f | csdr bandpass_fir_fft_cc 0.1 0.4 0.05 | csdr realpart_cf | csdr convert_f_s16 | ../build_linux/src/fsk_demod 2X 8 9600 1200 - fsk_demod.bin");
- f = fopen("fsk_demod.bin","rb"); rx_bit_stream = fread(f, "uint8")'; fclose(f);
- end
-
- if demod_type == 4
- % C demod with resampler ....... getting closer to Mark's real time cmd line
-
- assert(states.tx_real == 0, "need complex signal for this test");
- rx = tx + noise_complex;
- SNRdB = 10*log10(var(tx)/var(noise_real));
-
- printf("resampling ...\n");
- rx_resample_fract = fractional_resample(rx, 1.08331);
- %rx_resample_fract = fractional_resample(rx_resample_fract, 1/1.08331);
- save_rtlsdr("fsk_demod_resample.iq", rx_resample_fract);
-
- printf("run C cmd line chain ...\n");
-% 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 | ../build_linux/src/fsk_demod 2X 8 9600 1200 - fsk_demod.bin");
- 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 - fsk_demod.bin");
-% 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 fractional_decimator_ff 1.08331 | csdr convert_f_s16 | ../build_linux/src/fsk_demod 2X 8 9600 1200 - fsk_demod.bin");
- f = fopen("fsk_demod.bin","rb"); rx_bit_stream = fread(f, "uint8")'; fclose(f);
- end
-
-
- if demod_type == 5
-
- % C demod with resampler and use C code to measure PER, in this
- % test we don't need to run state machine below as C code gives us
- % the outputs we need
-
- assert(states.tx_real == 0, "need complex signal for this test");
- rx = tx + noise_complex;
- SNRdB = 10*log10(var(tx)/var(noise_real));
-
- printf("fract resampling ...\n");
- rx_resample_fract = fractional_resample(rx, 1.08331);
- save_rtlsdr("fsk_demod_resample.iq", rx_resample_fract);
-
- % useful for HackRF
- %printf("10X resampling ...\n");
- %rx_resample_10M = resample(rx_resample_fract, 10, 1);
- %save_rtlsdr("fsk_demod_10M.iq", rx_resample_10M);
-
- printf("run C cmd line chain - uncoded PER\n");
- 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");
-
- printf("run C cmd line chain - LDPC coded PER\n");
- 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");
- end
-
- if demod_type == 6
- % C demod with complex input driven simplfied csdr command line, just measure BER of demod
-
- assert(states.tx_real == 0, "need complex signal for this test");
- rx = tx + noise_complex;
- SNRdB = 10*log10(var(tx)/var(noise_real));
- save_rtlsdr("fsk_demod.iq", rx);
- 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");
-
- f = fopen("fsk_demod.bin","rb"); rx_bit_stream = fread(f, "uint8")'; fclose(f);
- end
-
- if demod_type == 7
- % C demod with complex input, measure uncoded and uncoded PER
-
- assert(states.tx_real == 0, "need complex signal for this test");
- rx = tx + noise_complex;
- SNRdB = 10*log10(var(tx)/var(noise_real));
- save_rtlsdr("fsk_demod.iq", rx);
-
- printf("run C cmd line chain - uncoded PER\n");
- 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");
-
- printf("run C cmd line chain - LDPC coded PER\n");
- %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");
- system("cat fsk_demod.iq | ../build_linux/src/fsk_demod 2XS 8 9600 1200 - - CU8 | ../src/drs232_ldpc - /dev/null -v");
- end
-
- if (demod_type != 5) && (demod_type != 7)
- % state machine. Look for SSTV UW. When found count bit errors over one frame of bits
-
- state = "wait for uw";
- start_uw_ind = 16*10+1; end_uw_ind = start_uw_ind + 5*10 - 1;
- uw_rs232 = tx_codeword(start_uw_ind:end_uw_ind); luw = length(uw_rs232);
- start_frame_ind = end_uw_ind + 1;
- nbits = length(rx_bit_stream);
- uw_thresh = 5;
- n_uncoded_errs = 0;
- n_uncoded_bits = 0;
- n_packets_rx = 0;
- last_i = 0;
-
- % might as well include RS232 framing bits in uncoded error count
-
- nbits_frame = code_param.data_bits_per_frame*10/8;
-
- uw_errs = zeros(1, nbits);
- for i=luw:nbits
- uw_errs(i) = sum(xor(rx_bit_stream(i-luw+1:i), uw_rs232));
- end
-
- for i=luw:nbits
- next_state = state;
- if strcmp(state, 'wait for uw')
- if uw_errs(i) <= uw_thresh
- next_state = 'count errors';
- tx_frame_ind = start_frame_ind;
- rx_frame_ind = i + 1;
- n_uncoded_errs_this_frame = 0;
- %printf("%d %s %s\n", i, state, next_state);
- if last_i
- printf("i: %d i-last_i: %d ", i, i-last_i);
- end
- end
- end
- if strcmp(state, 'count errors')
- n_uncoded_errs_this_frame += xor(rx_bit_stream(i), tx_codeword(tx_frame_ind));
- n_uncoded_bits++;
- tx_frame_ind++;
- if tx_frame_ind == (start_frame_ind+nbits_frame)
- n_uncoded_errs += n_uncoded_errs_this_frame;
- printf("n_uncoded_errs_this_frame: %d\n", n_uncoded_errs_this_frame);
- frame_rx232_rx = rx_bit_stream(rx_frame_ind:rx_frame_ind+nbits_frame-1);
- %tx_codeword(start_frame_ind+1:start_frame_ind+10)
- %frame_rx232_rx(1:10)
- sstv_checksum(frame_rx232_rx);
- last_i = i;
- n_packets_rx++;
- next_state = 'wait for uw';
- end
- end
- state = next_state;
- end
-
- uncoded_ber = n_uncoded_errs/n_uncoded_bits;
- printf("EbNodB: %4.1f SNRdB: %4.1f pkts: %d bits: %d errs: %d BER: %4.3f\n",
- EbNodB, SNRdB, n_packets_rx, n_uncoded_bits, n_uncoded_errs, uncoded_ber);
-
- figure(2);
- plot(uw_errs);
- title('Unique Word Hamming Distance')
- end
-
-endfunction
-
-
-% Function to test flight mode software. Takes a rx stream of
-% demodulated bits, and locates frames using UW detection. Extracts
-% data and parity bits. Uses data bits to generate parity bits here
-% and compare.
-
-function compare_parity_bits(rx_bit_stream)
- nframes = 500;
-
- % init LDPC code
-
- load('H2064_516_sparse.mat');
- HRA = full(HRA);
- max_iterations = 100;
- decoder_type = 0;
- mod_order = 2;
-
- code_param = ldpc_init(HRA, mod_order);
-
- % generate frame, this will have random bits not related to
- % rx_stream, however we just use it for the UW
-
- tx_codeword = gen_sstv_frame;
- l = length(tx_codeword);
- printf("expected rs232 frames codeword length: %d\n", l);
-
- % state machine. Look for SSTV UW. When found count bit errors over one frame of bits
-
- state = "wait for uw";
- start_uw_ind = 16*10+1; end_uw_ind = start_uw_ind + 4*10 - 1;
- uw_rs232 = tx_codeword(start_uw_ind:end_uw_ind); luw = length(uw_rs232);
- start_frame_ind = end_uw_ind + 1;
- nbits = nframes*l;
- uw_thresh = 5;
- n_uncoded_errs = 0;
- n_uncoded_bits = 0;
- n_packets_rx = 0;
- last_i = 0;
-
- % might as well include RS232 framing bits in uncoded error count
-
- uw_errs = luw*ones(1, nbits);
- for i=luw:nbits
- uw_errs(i) = sum(xor(rx_bit_stream(i-luw+1:i), uw_rs232));
- end
-
- frame_start = find(uw_errs < 2)+1;
- nframes = length(frame_start)
- for i=1:nframes
-
- % double check UW OK
-
- st_uw = frame_start(i) - luw; en_uw = frame_start(i) - 1;
- uw_err_check = sum(xor(rx_bit_stream(st_uw:en_uw), uw_rs232));
- %printf("uw_err_check: %d\n", uw_err_check);
-
- % strip off rs232 start/stop bits
-
- nbits_rs232 = (256+2+65)*10;
- nbits = (256+2+65)*8;
- nbits_byte = 10;
- rx_codeword = zeros(1,nbits);
- pdb = 1;
-
- for k=1:nbits_byte:nbits_rs232
- for l=1:8
- rx_codeword(pdb) = rx_bit_stream(frame_start(i)-1+k+l);
- pdb++;
- end
- end
- assert(pdb == (nbits+1));
-
- data_bits = rx_codeword(1:256*8);
- checksum_bits = rx_codeword(256*8+1:258*8);
- parity_bits = rx_codeword(258*8+1:258*8+516);
- padding_bits = rx_codeword(258*8+516+1:258*8+516+1);
-
- % stopped here as we found bug lol!
- end
-
- figure(1); clf;
- plot(uw_errs);
- title('Unique Word Hamming Distance')
- figure(2); clf;
- lframe_start = length(frame_start);
- plot(frame_start(2:lframe_start)-frame_start(1:lframe_start-1));
- %title('Unique Word Hamming Distance')
-
-endfunction
-
-
-% Start simulation --------------------------------------------------------
-
-more off;
-currentdir = pwd;
-thiscomp = computer;
-
-if strcmpi(thiscomp, 'MACI64')==1
- if exist('CMLSimulate')==0
- cd '/Users/bill/Current/Projects/DLR_FSO/Visit2013_FSO_GEO/cml'
- addpath '../' % assume the source files stored here
- CmlStartup % note that this is not in the cml path!
- disp('added MACI64 path and run CmlStartup')
- end
-end
-
-if strfind(thiscomp, 'pc-linux-gnu')==8
- if exist('LdpcEncode')==0,
- cd '~/tmp/cml'
- CmlStartup
- disp('CmlStartup has been run')
- % rmpath '/home/bill/cml/mexhelp' % why is this needed?
- % maybe different path order in octave cf matlab ?
- end
-end
-
-cd(currentdir)
-
-ldpc_fsk_lib;
-randn('state',1);
-rand('state',1);
-
-% ------------------ select which demo/test to run here ---------------
-
-demo = 12;
-
-if demo == 1
- printf("simple_ut....\n");
- data = simple_ut;
-end
-
-if demo == 2
- printf("generate C header file....\n");
- data = simple_ut("../src/H2064_516_sparse.h");
-end
-
-if demo == 3
- printf("decode_from_file ......\n");
- data = simple_ut;
- detected_data = decode_from_file("codeword.bin");
- error_positions = xor( detected_data(1:length(data)), data );
- Nerrs = sum(error_positions);
- printf(" Nerrs = %d\n", Nerrs);
-end
-
-if demo == 4
- printf("plot a curve....\n");
- plot_curve;
-end
-
-if demo == 5
-
- % generate test data and save to disk
-
- [data code_param] = simple_ut;
- f = fopen("dat_in2064.bin","wb"); fwrite(f, data, "uint8"); fclose(f);
-
- % Outboard C encoder
-
- system("../src/ldpc_enc dat_in2064.bin dat_op2064.bin");
-
- % Test with Octave decoder
-
- detected_data = decode_from_file("dat_op2064.bin");
- error_positions = xor(detected_data(1:length(data)), data);
- Nerrs = sum(error_positions);
- printf("Nerrs = %d\n", Nerrs);
-end
-
-if demo == 6
- test_c_encoder;
-end
-
-if demo == 7
- test_c_decoder;
-end
-
-% generates simulated demod soft decision symbols to drive C ldpc decoder with
-
-if demo == 8
- frames = 100;
- EsNodB = 3;
- EsNo = 10^(EsNodB/10);
- variance = 1/(2*EsNo);
-
- frame_rs232 = [];
- for i=1:frames
- frame_rs232 = [frame_rs232 gen_sstv_frame];
- end
-
- % write hard decn version to disk file, useful for fsk_mod input
-
- f = fopen("sstv.bin","wb"); fwrite(f, frame_rs232, "char"); fclose(f);
-
- % soft decision version (with noise)
-
- s = 1 - 2*frame_rs232;
- noise = sqrt(variance)*randn(1,length(frame_rs232));
- r = s + noise;
- f = fopen("sstv_sd.bin","wb"); fwrite(f, r, "float32"); fclose(f);
-end
-
-
-if demo == 9
- frames = 100;
- EbNodB = 11;
-
- frame_rs232 = [];
- for i=1:frames
- frame_rs232 = [frame_rs232 gen_sstv_frame];
- end
-
- % Use C FSK modulator to generate modulated signal
-
- f = fopen("sstv.bin","wb"); fwrite(f, frame_rs232, "char"); fclose(f);
- system("../build_linux/src/fsk_mod 2 9600 1200 1200 2400 sstv.bin fsk_mod.raw");
-
- % Add some channel noise here in Octave
-
- f = fopen("fsk_mod.raw","rb"); tx = fread(f, "short")'; fclose(f); tx_pwr = var(tx);
- Fs = 9600; Rs=1200; EbNolin = 10 ^ (EbNodB/10);
- variance = (tx_pwr/2)*states.Fs/(states.Rs*EbNolin*states.bitspersymbol);
- noise = sqrt(variance)*randn(1,length(tx));
- SNRdB = 10*log10(var(tx)/var(noise));
- rx = tx + noise;
- f = fopen("fsk_demod.raw","wb"); tx = fwrite(f, rx, "short"); fclose(f);
-
- % Demodulate using C modem and C de-framer/LDPC decoder
-
- system("../build_linux/src/fsk_demod 2XS 8 9600 1200 fsk_demod.raw - | ../src/drs232_ldpc - dummy_out.bin");
-end
-
-
-% Plots uncoded BER curves for two different SSTV simulations. Used
-% to compare results with different processing steps as we build up C
-% command line. BER curves are powerful ways to confirm system is
-% operating as expected, several bugs were found using this system.
-
-if demo == 10
- sim_in.frames = 10;
- EbNodBvec = 7:10;
-
- sim_in.demod_type = 3;
- ber_test1 = [];
- for i = 1:length(EbNodBvec)
- [n_uncoded_errs n_uncoded_bits] = run_sstv_sim(sim_in, EbNodBvec(i));
- ber_test1(i) = n_uncoded_errs/n_uncoded_bits;
- end
-
- sim_in.demod_type = 4;
- ber_c = [];
- for i = 1:length(EbNodBvec)
- [n_uncoded_errs n_uncoded_bits] = run_sstv_sim(sim_in, EbNodBvec(i));
- ber_test2(i) = n_uncoded_errs/n_uncoded_bits;
- end
-
- figure(1);
- clf;
- semilogy(EbNodBvec, ber_test1, '+-;first test;')
- grid;
- xlabel('Eb/No (dB)')
- ylabel('BER')
-
- hold on;
- semilogy(EbNodBvec, ber_test2, 'g+-;second test;')
- legend("boxoff");
- hold off;
-
-end
-
-% Measure PER of complete coded and uncoded system
-
-if demo == 11
- sim_in.frames = 10;
- EbNodB = 9;
- sim_in.demod_type = 7;
- run_sstv_sim(sim_in, EbNodB);
-end
-
-
-% Compare parity bits from an off-air stream of demodulated bits
-% Use something like:
-% cat ~/Desktop/923096fs_wenet.iq | ../build_linux/src/fsk_demod 2X 8 9600 1200 - fsk_demod.bin CU8
-% (note not soft dec mode)
-if demo == 12
- f = fopen("fsk_demod.bin","rb"); rx_bit_stream = fread(f, "uint8")'; fclose(f);
-
- compare_parity_bits(rx_bit_stream);
-end
diff --git a/octave/tfsk_2400a.m b/octave/tfsk_2400a.m
deleted file mode 100644
index 87a1e25..0000000
--- a/octave/tfsk_2400a.m
+++ /dev/null
@@ -1,648 +0,0 @@
-% tfsk.m
-% Author: Brady O'Brien 8 January 2016
-
-
-
-% Copyright 2016 David Rowe
-%
-% All rights reserved.
-%
-% This program is free software; you can redistribute it and/or modify
-% it under the terms of the GNU Lesser General Public License version 2.1, as
-% published by the Free Software Foundation. This program is
-% distributed in the hope that it will be useful, but WITHOUT ANY
-% WARRANTY; without even the implied warranty of MERCHANTABILITY or
-% FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
-% License for more details.
-%
-% You should have received a copy of the GNU Lesser General Public License
-% along with this program; if not, see <http://www.gnu.org/licenses/>.
-
-
-% Octave script to check c port of fsk_horus against the fsk_horus.m
-%
-% [X] - Functions to wrap around fsk_mod and fsk_demod executables
-% [X] - fsk_mod
-% [X] - fsk_demod
-% [X] - Functions to wrap around octave and c implementations, pass
-% same dataset, compare outputs, and give clear go/no-go
-% [X] - fsk_mod_test
-% [X] - fsk_demod_test
-% [X] - Port of run_sim and EbNodB curve test battery
-% [X] - Extract and compare more parameters from demod
-% [X] - Run some tests in parallel
-
-#{
-
- FSK Modem automated test instructions:
-
- 1. Use cmake to build in debug mode to ensure unittest/tfsk is built:
-
- $ cd ~/codec2
- $ rm -Rf build_linux && mkdir build_linux
- $ cd build_linux
- $ cmake -DCMAKE_BUILD_TYPE=Debug ..
- $ make
-
- 2 - Change tfsk_location below if required
- 3 - Ensure Octave packages signal and parallel are installed
- 4 - Start Octave and run tfsk_2400a.m. It will perform all tests automatically
-
-#}
-
-
-
-%tfsk executable path/file
-global tfsk_location = '../build_linux/unittest/tfsk';
-
-%Set to 1 for verbose printouts
-global print_verbose = 0;
-
-
-fsk_horus_as_a_lib = 1; % make sure calls to test functions at bottom are disabled
-%fsk_horus_2fsk;
-fsk_horus
-pkg load signal;
-pkg load parallel;
-graphics_toolkit('gnuplot');
-
-
-global mod_pass_fail_maxdiff = 1e-3/5000;
-
-function mod = fsk_mod_c(Fs,Rs,f1,fsp,bits,M)
- global tfsk_location;
- %command to be run by system to launch the modulator
- command = sprintf('%s MX %d %d %d %d %d fsk_mod_ut_bitvec fsk_mod_ut_modvec fsk_mod_ut_log.txt',tfsk_location,M,f1,fsp,Fs,Rs);
- %save input bits into a file
- bitvecfile = fopen('fsk_mod_ut_bitvec','wb+');
- fwrite(bitvecfile,bits,'uint8');
- fclose(bitvecfile);
-
- %run the modulator
- system(command);
-
- modvecfile = fopen('fsk_mod_ut_modvec','rb');
- mod = fread(modvecfile,'single');
- fclose(modvecfile);
-
-endfunction
-
-
-%Compare 2 vectors, fail if they are not close enough
-function pass = vcompare(vc,voct,vname,tname,tol,pnum)
- global print_verbose;
- %Get delta of vectors
- dvec = abs(abs(vc)-abs(voct));
-
- %Normalize difference
- dvec = dvec ./ abs(max(abs(voct))+1e-8);
-
- maxdvec = abs(max(dvec));
- pass = maxdvec<tol;
-
- if print_verbose == 1
- printf(' Comparing vectors %s in test %s. Diff is %f\n',vname,tname,maxdvec);
- end
-
- if pass == 0
- printf('\n*** vcompare failed %s in test %s. Diff: %f Tol: %f\n\n',vname,tname,maxdvec,tol);
-
- titlestr = sprintf('Diff between C and Octave of %s for %s',vname,tname)
- figure(10+pnum*2)
- plot(abs(dvec))
- title(titlestr)
-
- figure(11+pnum*2)
- plot((1:length(vc)),abs(vc),(1:length(voct)),abs(voct))
-
- end
-
-endfunction
-
-function test_stats = fsk_demod_xt(Fs,Rs,f1,fsp,mod,tname,M=2)
- global tfsk_location;
- global print_verbose;
- %Name of executable containing the modulator
- fsk_demod_ex_file = '../build/unittest/tfsk';
- modvecfilename = sprintf('fsk_demod_ut_modvec_%d',getpid());
- bitvecfilename = sprintf('fsk_demod_ut_bitvec_%d',getpid());
- tvecfilename = sprintf('fsk_demod_ut_tracevec_%d.txt',getpid());
-
- %command to be run by system to launch the demod
- command = sprintf('%s DX %d %d %d %d %d %s %s %s',tfsk_location,M,f1,fsp,Fs,Rs,modvecfilename,bitvecfilename,tvecfilename);
-
- %save modulated input into a file
- modvecfile = fopen(modvecfilename,'wb+');
- fwrite(modvecfile,mod,'single');
- fclose(modvecfile);
-
- %run the modulator
- system(command);
-
- bitvecfile = fopen(bitvecfilename,'rb');
- bits = fread(bitvecfile,'uint8');
- fclose(bitvecfile);
- bits = bits!=0;
-
- %Load test vec dump
- load(tvecfilename);
-
- %Clean up files
- delete(bitvecfilename);
- delete(modvecfilename);
- delete(tvecfilename);
-
- o_f1_dc = [];
- o_f2_dc = [];
- o_f3_dc = [];
- o_f4_dc = [];
- o_f1_int = [];
- o_f2_int = [];
- o_f3_int = [];
- o_f4_int = [];
- o_f1 = [];
- o_f2 = [];
- o_f3 = [];
- o_f4 = [];
- o_EbNodB = [];
- o_ppm = [];
- o_Sf = [];
- o_fest = [];
- o_rx_timing = [];
- o_norm_rx_timing = [];
- o_nin = [];
- %Run octave demod, dump some test vectors
- states = fsk_horus_init_hbr(Fs,10,Rs,M);
- Ts = states.Ts;
- P = states.P;
- states.ftx(1) = f1;
- states.ftx(2) = f1+fsp;
- states.ftx(3) = f1+fsp*2;
- states.ftx(4) = f1+fsp*3;
- states.dA = 1;
- states.dF = 0;
- modin = mod;
- obits = [];
- while length(modin)>=states.nin
- ninold = states.nin;
- states = est_freq(states, modin(1:states.nin), states.M);
- [bitbuf,states] = fsk_horus_demod(states, modin(1:states.nin));
- modin=modin(ninold+1:length(modin));
- obits = [obits bitbuf];
-
- %Save other parameters
- o_f1_dc = [o_f1_dc states.f_dc(1,1:states.Nmem-Ts/P)];
- o_f2_dc = [o_f2_dc states.f_dc(2,1:states.Nmem-Ts/P)];
- o_f1_int = [o_f1_int states.f_int(1,:)];
- o_f2_int = [o_f2_int states.f_int(2,:)];
- o_EbNodB = [o_EbNodB states.EbNodB];
- o_ppm = [o_ppm states.ppm];
- o_rx_timing = [o_rx_timing states.rx_timing];
- o_norm_rx_timing = [o_norm_rx_timing states.norm_rx_timing];
- o_Sf = [o_Sf states.Sf'];
- o_f1 = [o_f1 states.f(1)];
- o_f2 = [o_f1 states.f(2)];
- o_fest = [o_fest states.f];
- o_nin = [o_nin states.nin];
- if M==4
- o_f3_dc = [o_f3_dc states.f_dc(3,1:states.Nmem-Ts/P)];
- o_f4_dc = [o_f4_dc states.f_dc(4,1:states.Nmem-Ts/P)];
- o_f3_int = [o_f3_int states.f_int(3,:)];
- o_f4_int = [o_f4_int states.f_int(4,:)];
- o_f3 = [o_f1 states.f(3)];
- o_f4 = [o_f1 states.f(4)];
- end
- end
-
- %close all
-
- pass = 1;
-
- pass = vcompare(o_Sf, t_fft_est(1:length(o_Sf)),'fft est',tname,1,1) && pass;
- pass = vcompare(o_fest, t_f_est,'f est',tname,1,2) && pass;
- pass = vcompare(o_rx_timing, t_rx_timing,'rx timing',tname,1,3) && pass;
-
- if M==4
- pass = vcompare(o_f3_dc, t_f3_dc, 'f3 dc', tname,1,4) && pass;
- pass = vcompare(o_f4_dc, t_f4_dc, 'f4 dc', tname,1,5) && pass;
- pass = vcompare(o_f3_int, t_f3_int, 'f3 int', tname,1,6) && pass;
- pass = vcompare(o_f4_int, t_f4_int, 'f4 int', tname,1,7) && pass;
- end
-
- pass = vcompare(o_f1_dc, t_f1_dc, 'f1 dc', tname,1,8) && pass;
- pass = vcompare(o_f2_dc, t_f2_dc, 'f2 dc', tname,1,9) && pass;
- pass = vcompare(o_f2_int, t_f2_int, 'f2 int', tname,1,10) && pass;
- pass = vcompare(o_f1_int, t_f1_int, 'f1 int', tname,1,11) && pass;
-
- pass = vcompare(o_ppm , t_ppm, 'ppm', tname,1,12) && pass;
- pass = vcompare(o_EbNodB, t_EbNodB,'EbNodB', tname,1,13) && pass;
- pass = vcompare(o_nin, t_nin, 'nin', tname,1,14) && pass;
- pass = vcompare(o_norm_rx_timing, t_norm_rx_timing,'norm rx timing',tname,1,15) && pass;
-
-
- diffpass = sum(xor(obits,bits'))<5;
- diffbits = sum(xor(obits,bits'));
-
- if print_verbose == 1
- printf('%d bit diff in test %s\n',diffbits,tname);
- end
- if diffpass==0
- printf('\n***bitcompare test failed test %s diff %d\n\n',tname,sum(xor(obits,bits')))
- figure(15)
- plot(xor(obits,bits'))
- title(sprintf('Bitcompare failure test %s',tname))
- end
-
- pass = pass && diffpass;
-
- assert(pass);
-
- test_stats.pass = pass;
- test_stats.diff = sum(xor(obits,bits'));
- test_stats.cbits = bits';
- test_stats.obits = obits;
-
-endfunction
-
-function [dmod,cmod,omod,pass] = fsk_mod_test(Fs,Rs,f1,fsp,bits,tname,M=2)
- global mod_pass_fail_maxdiff;
- %Run the C modulator
- cmod = fsk_mod_c(Fs,Rs,f1,fsp,bits,M);
- %Set up and run the octave modulator
- states.M = M;
- states = fsk_horus_init_hbr(Fs,10,Rs,M);
-
- states.ftx(1) = f1;
- states.ftx(2) = f1+fsp;
-
- if states.M == 4
- states.ftx(3) = f1+fsp*2;
- states.ftx(4) = f1+fsp*3;
- end
-
- states.dA = [1 1 1 1];
- states.dF = 0;
- omod = fsk_horus_mod(states,bits);
-
- dmod = cmod-omod;
- pass = max(dmod)<(mod_pass_fail_maxdiff*length(dmod));
- if !pass
- printf('Mod failed test %s!\n',tname);
- end
-endfunction
-
-% Random bit modulator test
-% Pass random bits through the modulators and compare
-function pass = test_mod_2400a_randbits
- rand('state',1);
- randn('state',1);
- bits = rand(1,96000)>.5;
- [dmod,cmod,omod,pass] = fsk_mod_test(48000,1200,1200,1200,bits,"mod 2400a randbits",4);
-
- if(!pass)
- figure(1)
- plot(dmod)
- title("Difference between octave and C mod impl");
- end
-
-endfunction
-
-
-% A big ol' channel impairment tester
-% Shamlessly taken from fsk_horus
-% This throws some channel imparment or another at the C and octave modem so they
-% may be compared.
-function stats = tfsk_run_sim(test_frame_mode,EbNodB,timing_offset,fading,df,dA,M=2)
- global print_verbose;
- frames = 190;
- %EbNodB = 10;
- %timing_offset = 2.0; % see resample() for clock offset below
- %fading = 0; % modulates tx power at 2Hz with 20dB fade depth,
- % to simulate balloon rotating at end of mission
- %df = 0; % tx tone freq drift in Hz/s
- %dA = 1; % amplitude imbalance of tones (note this affects Eb so not a gd idea)
-
- more off
- rand('state',10);
- randn('state',10);
-
- % ----------------------------------------------------------------------
-
- % sm2000 config ------------------------
- %states = fsk_horus_init(96000, 1200);
- %states.f1_tx = 4000;
- %states.f2_tx = 5200;
-
- if test_frame_mode == 2
- % 2400A config
- states = fsk_horus_init_hbr(48000,10, 1200, M);
- states.f1_tx = 1200;
- states.f2_tx = 2400;
- states.f3_tx = 3600;
- states.f4_tx = 4800;
- states.ftx(1) = 1200;
- states.ftx(2) = 2400;
- states.ftx(3) = 3600;
- states.ftx(4) = 4800;
-
- end
-
- if test_frame_mode == 4
- % horus rtty config ---------------------
- states = fsk_horus_init_hbr(48000,10, 1200, M);
- states.f1_tx = 1200;
- states.f2_tx = 2400;
- states.f3_tx = 3600;
- states.f4_tx = 4800;
- states.ftx(1) = 1200;
- states.ftx(2) = 2400;
- states.ftx(3) = 3600;
- states.ftx(4) = 4800;
-
- states.tx_bits_file = "horus_tx_bits_rtty.txt"; % Octave file of bits we FSK modulate
-
- end
-
- if test_frame_mode == 5
- % horus binary config ---------------------
- states = fsk_horus_init_hbr(48000,10, 1200, M);
- states.f1_tx = 1200;
- states.f2_tx = 2400;
- states.f3_tx = 3600;
- states.f4_tx = 4800;
- states.ftx(1) = 1200;
- states.ftx(2) = 2400;
- states.ftx(3) = 3600;
- states.ftx(4) = 4800;
- %%%states.tx_bits_file = "horus_tx_bits_binary.txt"; % Octave file of bits we FSK modulate
- states.tx_bits_file = "horus_payload_rtty.txt";
- end
-
- % ----------------------------------------------------------------------
-
- states.verbose = 0;%x1;
- N = states.N;
- P = states.P;
- Rs = states.Rs;
- nsym = states.nsym;
- Fs = states.Fs;
- states.df = df;
- states.dA = [dA dA dA dA];
- states.M = M;
-
- EbNo = 10^(EbNodB/10);
- variance = states.Fs/(states.Rs*EbNo*states.bitspersymbol);
-
- % set up tx signal with payload bits based on test mode
-
- if test_frame_mode == 1
- % test frame of bits, which we repeat for convenience when BER testing
- test_frame = round(rand(1, states.nsym));
- tx_bits = [];
- for i=1:frames+1
- tx_bits = [tx_bits test_frame];
- end
- end
- if test_frame_mode == 2
- % random bits, just to make sure sync algs work on random data
- tx_bits = round(rand(1, states.nbit*(frames+1)));
- end
- if test_frame_mode == 3
- % ...10101... sequence
- tx_bits = zeros(1, states.nsym*(frames+1));
- tx_bits(1:2:length(tx_bits)) = 1;
- end
-
- if (test_frame_mode == 4) || (test_frame_mode == 5)
-
- % load up a horus msg from disk and modulate that
-
- test_frame = load(states.tx_bits_file);
- ltf = length(test_frame);
- ntest_frames = ceil((frames+1)*nsym/ltf);
- tx_bits = [];
- for i=1:ntest_frames
- tx_bits = [tx_bits test_frame];
- end
- end
-
-
-
- f1 = states.f1_tx;
- fsp = states.f2_tx-f1;
- states.dA = [dA dA dA dA];
- states.ftx(1) = f1;
- states.ftx(2) = f1+fsp;
-
- if states.M == 4
- states.ftx(3) = f1+fsp*2;
- states.ftx(4) = f1+fsp*3;
- end
-
- tx = fsk_horus_mod(states, tx_bits);
-
- if timing_offset
- tx = resample(tx, 1000, 1001); % simulated 1000ppm sample clock offset
- end
-
- if fading
- ltx = length(tx);
- tx = tx .* (1.1 + cos(2*pi*2*(0:ltx-1)/Fs))'; % min amplitude 0.1, -20dB fade, max 3dB
- end
-
- noise = sqrt(variance)*randn(length(tx),1);
- rx = tx + noise;
-
- test_name = sprintf("tfsk EbNodB:%d frames:%d timing_offset:%d fading:%d df:%d",EbNodB,frames,timing_offset,fading,df);
- tstats = fsk_demod_xt(Fs,Rs,states.f1_tx,fsp,rx,test_name,M);
-
- pass = tstats.pass;
- obits = tstats.obits;
- cbits = tstats.cbits;
- stats.name = test_name;
-
- if tstats.pass
- printf("Test %s passed\n",test_name);
- else
- printf("Test %s failed\n",test_name);
- end
-
- % Figure out BER of octave and C modems
- bitcnt = length(tx_bits);
- rx_bits = obits;
- ber = 1;
- ox = 1;
- for offset = (1:100)
- nerr = sum(xor(rx_bits(offset:length(rx_bits)),tx_bits(1:length(rx_bits)+1-offset)));
- bern = nerr/(bitcnt-offset);
- if(bern < ber)
- ox = offset;
- best_nerr = nerr;
- end
- ber = min([ber bern]);
- end
- offset = ox;
- bero = ber;
- ber = 1;
- rx_bits = cbits;
- ox = 1;
- for offset = (1:100)
- nerr = sum(xor(rx_bits(offset:length(rx_bits)),tx_bits(1:length(rx_bits)+1-offset)));
- bern = nerr/(bitcnt-offset);
- if(bern < ber)
- ox = offset;
- best_nerr = nerr;
- end
- ber = min([ber bern]);
- end
- offset = ox;
- berc = ber;
- stats.berc = berc;
- stats.bero = bero;
- % coherent BER theory calculation
-
- if print_verbose == 1
- printf("C BER: %f Oct BER: %f Test %s\n",berc,bero,test_name);
- end
-
- stats.thrcoh = .5*(M-1)*erfc(sqrt( (log2(M)/2) * EbNo ));
-
- % non-coherent BER theory calculation
- % It was complicated, so I broke it up
-
- ms = M;
- ns = (1:ms-1);
- as = (-1).^(ns+1);
- bs = (as./(ns+1));
-
- cs = ((ms-1)./ns);
-
- ds = ns.*log2(ms);
- es = ns+1;
- fs = exp( -(ds./es)*EbNo );
-
- thrncoh = ((ms/2)/(ms-1)) * sum(bs.*((ms-1)./ns).*exp( -(ds./es)*EbNo ));
-
- stats.thrncoh = thrncoh;
- stats.pass = pass;
-endfunction
-
-
-function pass = ebno_battery_test(timing_offset,fading,df,dA,M)
- %Range of EbNodB over which to test
- ebnodbrange = fliplr(5:2:13);
- ebnodbs = length(ebnodbrange);
-
- mode = 2;
- %Replication of other parameters for parcellfun
- modev = repmat(mode,1,ebnodbs);
- timingv = repmat(timing_offset,1,ebnodbs);
- fadingv = repmat(fading,1,ebnodbs);
- dfv = repmat(df,1,ebnodbs);
- dav = repmat(dA,1,ebnodbs);
- mv = repmat(M,1,ebnodbs);
- statv = pararrayfun(floor(1.25*nproc()),@tfsk_run_sim,modev,ebnodbrange,timingv,fadingv,dfv,dav,mv);
- %statv = arrayfun(@tfsk_run_sim,modev,ebnodbrange,timingv,fadingv,dfv,dav,mv);
-
- passv = zeros(1,length(statv));
- for ii=(1:length(statv))
- passv(ii)=statv(ii).pass;
- if statv(ii).pass
- printf("Test %s passed\n",statv(ii).name);
- else
- printf("Test %s failed\n",statv(ii).name);
- end
-
- end
-
- %All pass flags are '1'
- pass = sum(passv)>=length(passv);
- %and no tests died
- pass = pass && length(passv)==ebnodbs;
- passv;
- assert(pass)
-endfunction
-
-%Test with and without sample clock offset
-function pass = test_timing_var(df,dA,M)
- pass = ebno_battery_test(1,0,df,dA,M)
- assert(pass)
- pass = pass && ebno_battery_test(0,0,df,dA,M)
- assert(pass)
-endfunction
-
-%Test with and without 1 Hz/S freq drift
-function pass = test_drift_var(M)
- pass = test_timing_var(1,1,M)
- assert(pass)
- pass = pass && test_timing_var(0,1,M)
- assert(pass)
-endfunction
-
-function pass = test_fsk_battery()
- pass = 1;
- pass = pass && test_mod_2400a_randbits;
- assert(pass)
- pass = pass && test_drift_var(4);
- assert(pass)
- if pass
- printf("***** All tests passed! *****\n");
- end
-endfunction
-
-function plot_fsk_bers(M=2)
- %Range of EbNodB over which to plot
- ebnodbrange = (4:13);
-
- berc = ones(1,length(ebnodbrange));
- bero = ones(1,length(ebnodbrange));
- berinc = ones(1,length(ebnodbrange));
- beric = ones(1,length(ebnodbrange));
- ebnodbs = length(ebnodbrange)
- mode = 2;
- %Replication of other parameters for parcellfun
- modev = repmat(mode,1,ebnodbs);
- timingv = repmat(1,1,ebnodbs);
- fadingv = repmat(0,1,ebnodbs);
- dfv = repmat(1,1,ebnodbs);
- dav = repmat(1,1,ebnodbs);
- Mv = repmat(M,1,ebnodbs);
-
-
- statv = pararrayfun(floor(nproc()),@tfsk_run_sim,modev,ebnodbrange,timingv,fadingv,dfv,dav,Mv);
- %statv = arrayfun(@tfsk_run_sim,modev,ebnodbrange,timingv,fadingv,dfv,dav,Mv);
-
- for ii = (1:length(statv))
- stat = statv(ii);
- berc(ii)=stat.berc;
- bero(ii)=stat.bero;
- berinc(ii)=stat.thrncoh;
- beric(ii) = stat.thrcoh;
- end
- clf;
- figure(M)
-
- semilogy(ebnodbrange, berinc,sprintf('r;%dFSK non-coherent theory;',M))
- hold on;
- semilogy(ebnodbrange, beric ,sprintf('g;%dFSK coherent theory;',M))
- semilogy(ebnodbrange, bero ,sprintf('b;Octave fsk horus %dFSK Demod;',M))
- semilogy(ebnodbrange, berc,sprintf('+;C fsk horus %dFSK Demod;',M))
- hold off;
- grid("minor");
- axis([min(ebnodbrange) max(ebnodbrange) 1E-5 1])
- legend("boxoff");
- xlabel("Eb/No (dB)");
- ylabel("Bit Error Rate (BER)")
-
-endfunction
-
-
-xpass = test_fsk_battery
-%plot_fsk_bers(2)
-plot_fsk_bers(4)
-
-if xpass
- printf("***** All tests passed! *****\n");
-else
- printf("***** Some test failed! Look back through output to find failed test *****\n");
-end
diff --git a/octave/train_all_speech_1.txt b/octave/train_all_speech_1.txt
deleted file mode 100644
index 735c713..0000000
--- a/octave/train_all_speech_1.txt
+++ /dev/null
@@ -1,514 +0,0 @@
- 3.503901481628418 3.791774749755859 5.251767158508301 6.508749961853027 5.127012252807617 3.361294507980347 0.243348091840744 -1.111059069633484 0.645551323890686 -0.5759052038192749 0.0442858524620533 -0.001516825286671519 0.3966041207313538 -2.835689306259155 -3.605791568756104 -7.889068126678467 -3.260931253433228 -0.1228795349597931 -5.004364490509033 -4.467086315155029
- 28.03043365478516 23.2732105255127 16.69843864440918 9.301326751708984 2.729286432266235 -2.458910465240479 -5.740657329559326 -6.68559741973877 -7.492500305175781 -7.85601806640625 -7.454850196838379 -5.931487083435059 -4.112403869628906 -2.233861207962036 -3.926839113235474 -5.844244956970215 -6.445382118225098 -5.252916812896729 -4.993747234344482 -3.603279590606689
- 32.56464004516602 28.81554794311523 23.21220970153809 17.26614570617676 12.75540542602539 9.964438438415527 6.646321296691895 1.243698716163635 -4.590430736541748 -7.218576908111572 -8.396566390991211 -8.751805305480957 -10.14919185638428 -11.93070697784424 -11.88467979431152 -12.72025680541992 -13.08411026000977 -13.18809127807617 -14.76470184326172 -15.78927612304688
- 5.975729942321777 4.555702209472656 2.87472939491272 2.512071371078491 0.9860721826553345 -0.8367324471473694 -0.6223300695419312 0.3663770854473114 0.7955335974693298 0.392966091632843 -2.49055814743042 -2.309305429458618 -2.556457042694092 -2.528177976608276 -3.023877620697021 -2.204056024551392 -2.405418157577515 -0.8756491541862488 1.105034351348877 0.288346916437149
- 7.673871040344238 7.434552669525146 7.830992698669434 10.15661811828613 13.83097839355469 15.30639362335205 11.42201519012451 8.932522773742676 10.37486934661865 12.57092475891113 4.56135082244873 -3.044244766235352 -6.334497928619385 -7.038057804107666 -4.782663822174072 -11.09237766265869 -17.77633285522461 -18.82984161376953 -15.95373916625977 -25.24331092834473
- -11.28521823883057 -9.271133422851562 -2.778221845626831 1.807992339134216 0.7304858565330505 -0.184556320309639 -1.86104941368103 -1.324167966842651 -1.543161273002625 -1.253548741340637 1.257227182388306 3.003896474838257 5.694759845733643 4.67047119140625 4.934287071228027 3.337021350860596 1.418267488479614 -1.865221738815308 0.6671320199966431 3.844735145568848
- 6.876662731170654 7.183174610137939 7.623923301696777 8.234439849853516 5.887650012969971 3.210459470748901 2.382892847061157 3.868316411972046 3.362746477127075 0.6627451181411743 -1.66800856590271 -1.858322024345398 -3.388047695159912 -3.685295581817627 -3.735403299331665 -5.712156295776367 -7.716336727142334 -6.992678165435791 -7.389943599700928 -7.146812915802002
- -6.053719520568848 -3.63427734375 0.2870153188705444 3.108088254928589 2.850396156311035 0.1260831952095032 -0.7389681339263916 0.5524262189865112 1.546064019203186 4.515695571899414 5.740691184997559 4.424627304077148 2.731694459915161 0.4941331148147583 -0.3833900392055511 -0.8107656240463257 -1.980955243110657 -3.035221338272095 -3.79147481918335 -5.948152542114258
- 25.5760440826416 27.94159889221191 24.34627342224121 14.69587993621826 3.129726648330688 -5.597395896911621 -8.945341110229492 -10.00861740112305 -10.91853427886963 -12.20146465301514 -10.84396553039551 -7.469461441040039 -1.659998059272766 4.689345359802246 2.184104204177856 -0.7359857559204102 -4.123245716094971 -4.153082370758057 -9.386194229125977 -16.51968383789062
- 2.083509922027588 2.018866539001465 1.961146473884583 3.584662914276123 6.372915267944336 8.050569534301758 6.806997776031494 4.416918754577637 1.979579329490662 -0.6982173919677734 -1.020430684089661 1.8607177734375 5.724912643432617 5.976870536804199 -0.4547030925750732 -7.373361110687256 -9.62476921081543 -7.055913925170898 -9.67552375793457 -14.93474006652832
- 9.900005340576172 11.11205959320068 12.69847106933594 15.64771842956543 18.72967338562012 17.63078880310059 12.23540306091309 7.59137487411499 6.715625286102295 8.484490394592285 8.800906181335449 1.508745670318604 -7.228737831115723 -14.38050556182861 -17.9872932434082 -18.65911674499512 -15.54321575164795 -13.96155548095703 -20.45906639099121 -22.83575630187988
- 33.31724548339844 31.22291564941406 26.2960033416748 20.17128753662109 12.19244766235352 5.185864448547363 3.246951103210449 5.006373882293701 2.141655445098877 -5.400078773498535 -10.55130100250244 -13.10519027709961 -13.06551074981689 -12.01528644561768 -12.90364456176758 -13.44828128814697 -13.26143646240234 -13.49717712402344 -15.32059669494629 -16.21224594116211
- 1.160675168037415 -0.3747923970222473 -2.663496017456055 -2.927655696868896 -0.3560551702976227 3.28938102722168 5.239902496337891 8.044262886047363 6.652604579925537 3.97779369354248 4.083271980285645 6.961338043212891 8.550065994262695 2.346344232559204 -2.809552192687988 -6.179857730865479 -7.585293292999268 -6.895844459533691 -9.640233993530273 -10.87286186218262
- 5.94452953338623 3.811221361160278 1.134124636650085 2.619336366653442 5.347626209259033 6.752548217773438 5.364405155181885 1.397107362747192 -1.545763611793518 -4.071928977966309 -2.443724393844604 -2.439105272293091 -3.489367246627808 -0.5402494668960571 1.537298321723938 -1.653804302215576 -3.502989053726196 -2.35117244720459 -4.944786548614502 -6.92530632019043
- 27.48577308654785 24.51284790039062 19.48355484008789 14.3996639251709 9.474723815917969 4.536386013031006 -0.5103690624237061 -3.632709503173828 -5.82119607925415 -7.263043880462646 -7.536733627319336 -7.448832035064697 -8.315095901489258 -7.85472297668457 -7.082536697387695 -7.529149055480957 -8.032625198364258 -8.674041748046875 -9.140567779541016 -11.05131435394287
- 6.75608491897583 6.328508853912354 5.419772148132324 5.890230655670166 7.777308940887451 10.29029655456543 10.68216705322266 7.286451816558838 2.889912843704224 -1.301931977272034 -4.434157848358154 -5.080985546112061 -2.961805105209351 2.305842876434326 -0.01768347434699535 -5.421481132507324 -6.190484523773193 -6.402289390563965 -13.91303730010986 -19.9027042388916
- 5.375237941741943 4.880783557891846 3.848113059997559 3.542019128799438 4.622683048248291 6.69300651550293 9.027632713317871 10.2619743347168 7.902902603149414 4.52606201171875 2.255825042724609 2.263393402099609 5.199076175689697 2.179580926895142 -5.786059856414795 -8.947177886962891 -9.236479759216309 -9.68709659576416 -16.95894050598145 -21.96252250671387
- 15.65207767486572 12.11825275421143 7.862476348876953 5.795327186584473 4.078181266784668 1.869440197944641 0.294452428817749 -1.144178748130798 -1.743003249168396 -2.345729112625122 -3.181504964828491 -3.503159284591675 -4.294906139373779 -4.03973913192749 -4.509326934814453 -5.331762790679932 -4.550152778625488 -3.840717077255249 -4.018199443817139 -5.167826175689697
- 18.86136245727539 22.2327938079834 24.68154144287109 25.0569019317627 19.81441307067871 12.41040420532227 7.601511001586914 6.082168579101562 8.023798942565918 8.556151390075684 0.7312884330749512 -7.768879890441895 -14.02567863464355 -17.86144828796387 -20.32940101623535 -21.05902671813965 -19.86882209777832 -17.11456871032715 -17.58621406555176 -18.43827438354492
- -6.099148273468018 -3.074884653091431 1.065669655799866 3.46605396270752 2.664950609207153 -0.1740235686302185 -1.065245866775513 -1.431956768035889 -0.8008455038070679 -0.4683205783367157 0.2586084306240082 1.447079658508301 3.035146713256836 5.815367221832275 8.046737670898438 5.779229640960693 0.8773371577262878 -4.074870109558105 -6.226751804351807 -9.040132522583008
- 17.96066093444824 21.18134307861328 23.09299087524414 21.8427677154541 14.64311599731445 5.688597202301025 -0.2130907475948334 -3.072567701339722 -5.391517162322998 -7.200598239898682 -8.211039543151855 -6.548444747924805 -1.767251491546631 1.299013376235962 -7.267916202545166 -12.67638683319092 -11.8170166015625 -5.908488750457764 -15.3381519317627 -20.29601287841797
- 26.30965232849121 26.33807754516602 25.27392578125 21.48009490966797 16.14387512207031 13.19803905487061 8.739408493041992 2.180922746658325 -3.75966477394104 -5.995718955993652 -8.005228996276855 -8.755231857299805 -9.549881935119629 -9.806296348571777 -7.275689125061035 -11.07846164703369 -16.52146530151367 -18.4779167175293 -19.93660545349121 -20.5018196105957
- -8.617772102355957 -8.945120811462402 -4.539582252502441 1.078097343444824 2.600668907165527 1.022749304771423 -0.5104072690010071 0.4009959101676941 0.08736521005630493 -0.4390178620815277 2.36236572265625 5.524200439453125 3.933060884475708 1.591420769691467 -1.926792025566101 -3.021800518035889 -1.699977517127991 -1.463400363922119 3.61325216293335 8.949700355529785
- 5.822198390960693 6.222359657287598 4.698714733123779 3.132632732391357 3.07255744934082 2.390854358673096 1.206083059310913 0.1907666325569153 -0.2577031850814819 0.3930277526378632 -1.284250378608704 0.04870199412107468 -1.276285171508789 -3.034269571304321 -3.365149259567261 -2.531657218933105 -1.984165072441101 -1.298876047134399 -8.775853157043457 -3.369685649871826
- 22.01222038269043 22.66417694091797 21.52972793579102 17.68148422241211 10.48514270782471 2.689077615737915 -2.264973402023315 -4.631338596343994 -6.71744966506958 -8.984005928039551 -9.821804046630859 -8.145534515380859 -2.854689836502075 -0.757327675819397 -7.845916271209717 -10.87128257751465 -9.10041332244873 -4.198158264160156 -10.38017272949219 -10.48876094818115
- 0.87721186876297 1.023530602455139 1.017704963684082 1.556210994720459 3.583067417144775 6.056449890136719 9.576187133789062 12.43352222442627 11.38518905639648 7.673481941223145 6.882114410400391 8.946038246154785 6.608055591583252 -1.276444554328918 -6.488674640655518 -6.960916519165039 -7.693408012390137 -13.73535442352295 -19.55771255493164 -21.90627288818359
- 4.583919048309326 5.54997444152832 6.632177352905273 8.406952857971191 11.17818737030029 13.65631580352783 12.20436096191406 6.401305675506592 1.154896140098572 -1.293386459350586 -1.867376804351807 0.8424116373062134 6.344460487365723 4.921483516693115 -2.225198268890381 -5.077576160430908 -9.220178604125977 -17.42711639404297 -22.00735473632812 -22.75824928283691
- -3.102021217346191 -4.934051990509033 -5.026371955871582 -3.679954767227173 1.594022154808044 3.571999788284302 5.714908599853516 8.114648818969727 6.035937309265137 6.302038669586182 1.37278425693512 -1.393239378929138 -4.985548496246338 -4.824649333953857 1.068022608757019 2.268578290939331 -2.253105163574219 -1.408431768417358 1.219765901565552 -5.655329704284668
- -3.316742181777954 -2.979648351669312 -1.643033266067505 0.2565309703350067 0.6060237884521484 -0.02428602613508701 -1.232267260551453 -1.93351674079895 -1.940996289253235 -2.524378776550293 -2.40356183052063 -1.856996655464172 -1.024620056152344 0.03681971505284309 0.01067735254764557 -0.2030823975801468 0.4532400071620941 1.599214792251587 5.77880334854126 12.34182167053223
- 15.8239278793335 16.16110801696777 16.57540702819824 17.84334754943848 16.66327667236328 12.71552467346191 7.510667324066162 3.022555351257324 0.6088733077049255 -1.061047077178955 1.844056129455566 5.594436168670654 1.795042634010315 -3.180304527282715 -7.426888465881348 -12.97753429412842 -18.76288986206055 -23.58376502990723 -24.8903694152832 -24.2754020690918
- -0.4329100549221039 -1.153759121894836 -2.361927509307861 -3.003302097320557 -3.672260046005249 -5.084637641906738 -6.65839672088623 -6.925933837890625 -6.42293119430542 -6.08603048324585 -5.84499454498291 -5.423248291015625 -4.065683364868164 -0.7888540029525757 1.539779901504517 3.364370107650757 7.599849700927734 12.73376750946045 14.96135997772217 17.72574996948242
- 18.3255786895752 20.44512748718262 20.71366691589355 16.62657928466797 8.420391082763672 1.511367797851562 -2.391377210617065 -1.262075424194336 -1.956893444061279 -9.352529525756836 -17.8893928527832 -20.79939079284668 -20.16166496276855 -15.59700202941895 -3.843715667724609 4.558215141296387 4.646618366241455 2.505266427993774 -0.9462172985076904 -3.552557229995728
- 33.96227264404297 30.3023681640625 23.93390464782715 17.46969413757324 10.30532073974609 1.410054087638855 -3.531162261962891 -1.113182902336121 3.273731708526611 0.6619448661804199 -6.759619235992432 -10.10671234130859 -11.61876678466797 -11.87101554870605 -11.30706596374512 -11.56081199645996 -12.20409202575684 -13.50289916992188 -14.10133457183838 -13.64265632629395
- 24.68064117431641 26.29081153869629 25.42455101013184 20.26850700378418 11.56712245941162 4.094350337982178 -1.698356628417969 -5.774074554443359 -9.001168251037598 -11.34935569763184 -12.74047374725342 -13.08970165252686 -11.50658798217773 -6.554616451263428 -1.450866460800171 -2.475327730178833 -4.598902225494385 -4.598552703857422 -12.65169525146484 -14.83629608154297
- 25.19855117797852 24.98921966552734 23.05159378051758 18.37245941162109 13.00849628448486 9.966771125793457 9.327069282531738 9.223878860473633 5.977185726165771 0.5773510336875916 -3.128563642501831 -5.36072301864624 -7.908251762390137 -12.29754734039307 -15.44667148590088 -17.00860595703125 -17.36274337768555 -19.40313339233398 -20.41622543334961 -21.36010360717773
- -9.144045829772949 -7.866376876831055 -4.516994476318359 0.04078018292784691 2.233412742614746 0.7148503661155701 -2.801738977432251 -4.78801155090332 -4.991693496704102 -2.994109630584717 0.4564718008041382 6.954310894012451 6.343183040618896 4.793509960174561 5.267282962799072 3.474374532699585 2.709347486495972 2.763020753860474 1.886340975761414 -0.5339090824127197
- 27.15909194946289 25.39476013183594 21.54992866516113 15.52098083496094 6.309974670410156 -1.627548575401306 -4.721316814422607 -5.576619625091553 -8.175256729125977 -11.3615026473999 -13.9495325088501 -14.59604358673096 -15.31496715545654 -15.50387001037598 -14.14670848846436 -8.48103141784668 1.818431496620178 6.948720455169678 6.240270614624023 2.512237787246704
- 15.26922607421875 18.09340858459473 20.5144214630127 20.9620475769043 15.71985816955566 8.584695816040039 4.213981628417969 2.376119375228882 3.310333490371704 6.336117267608643 4.72252893447876 -3.25541090965271 -10.24591636657715 -14.85652542114258 -16.80167198181152 -13.832350730896 -7.703041076660156 -16.83441734313965 -20.30658721923828 -16.26680946350098
- 4.907369613647461 4.265684604644775 3.083312034606934 3.738429307937622 3.159228801727295 2.312073469161987 1.725414276123047 1.140659689903259 -1.256341218948364 -5.75554370880127 -7.852888584136963 -6.981096267700195 -6.175336837768555 -3.354127168655396 2.111618757247925 3.207269668579102 2.460299491882324 4.880172729492188 -1.607948660850525 -4.008255481719971
- -2.825491428375244 -2.664080619812012 -3.556501388549805 -1.536420583724976 2.61185359954834 2.423787593841553 0.8607557415962219 0.0351119227707386 -1.387669086456299 -2.584674119949341 -2.979906558990479 -2.425863265991211 1.690563797950745 9.607510566711426 7.604969501495361 3.176784753799438 -1.457247972488403 -1.847179889678955 -2.844440698623657 -1.901864290237427
- 19.42486763000488 20.72030639648438 21.55156135559082 19.6943531036377 12.82256031036377 5.137216091156006 -0.7697764039039612 -5.058693408966064 -8.504769325256348 -9.637164115905762 -7.715685844421387 -2.976856231689453 2.599075317382812 -3.922131299972534 -10.11317348480225 -9.754851341247559 -4.615532875061035 -11.02495861053467 -14.72185897827148 -13.13448619842529
- 12.17941188812256 10.62963485717773 9.625134468078613 9.297036170959473 10.73871612548828 12.27712821960449 12.28466987609863 10.12379932403564 7.496825218200684 6.475470066070557 5.117063522338867 -0.1686364710330963 -8.273245811462402 -14.1778450012207 -16.94489288330078 -16.27918434143066 -11.97532844543457 -9.788707733154297 -13.57298755645752 -15.06404685974121
- 10.03407287597656 8.969793319702148 7.404208660125732 7.644266605377197 7.855467796325684 8.301459312438965 4.597716808319092 1.47676956653595 -0.2043584734201431 -2.676269054412842 -1.992263078689575 1.343597173690796 4.854265213012695 -0.3698329925537109 -3.6153883934021 -4.216947078704834 -6.633061408996582 -13.87497520446777 -14.84012126922607 -14.05840492248535
- 14.32112312316895 10.05139255523682 6.251046657562256 3.785530567169189 3.75807523727417 4.139776229858398 4.057256698608398 3.483638048171997 1.278795480728149 1.251617193222046 5.155167579650879 9.70378303527832 7.714277267456055 2.864827632904053 -5.078719615936279 -11.8890905380249 -14.22188663482666 -14.24189186096191 -14.2360143661499 -18.14870643615723
- 8.840707778930664 6.645888328552246 3.140192031860352 3.038378477096558 2.625264406204224 2.530407667160034 4.01621150970459 7.545373916625977 9.417645454406738 10.34425163269043 6.008065700531006 -0.1526446789503098 -3.714003086090088 -6.668576717376709 -6.876534461975098 -7.528736114501953 -8.436820030212402 -10.3456449508667 -10.8781795501709 -9.551239013671875
- -7.837013721466064 -6.67249584197998 -3.152433156967163 0.4392966628074646 -1.273952126502991 -4.348273277282715 -6.318003177642822 -7.018110752105713 -8.457772254943848 -7.514058589935303 -2.865795135498047 3.081298351287842 7.746901512145996 8.452938079833984 11.85788726806641 9.881362915039062 5.741739749908447 4.635182857513428 3.411952018737793 0.2093580216169357
- 27.54855155944824 28.77965354919434 26.33428382873535 19.14382743835449 10.77631759643555 3.271880149841309 -2.67638635635376 -5.800123691558838 -9.516213417053223 -13.1913013458252 -15.42091941833496 -15.93879985809326 -16.00874519348145 -16.0577220916748 -14.44884586334229 -7.193002700805664 3.788428544998169 3.703774929046631 0.8510863780975342 -7.945737838745117
- 24.19801139831543 25.59066963195801 25.80960083007812 23.84943389892578 19.97462844848633 17.20759582519531 14.6951847076416 9.667998313903809 3.539491891860962 -2.221262216567993 -6.48640251159668 -9.835855484008789 -13.20033264160156 -15.846848487854 -17.8895263671875 -18.48914337158203 -18.81632614135742 -20.02217674255371 -20.79559707641602 -20.92916297912598
- 12.59621429443359 16.68565940856934 19.45024681091309 20.43060493469238 13.84965038299561 4.59410285949707 -1.769034147262573 -4.940058708190918 -7.263986110687256 -9.646286964416504 -11.21702766418457 -11.4636812210083 -11.40165901184082 -9.891270637512207 -5.427464962005615 3.6655592918396 1.742243409156799 0.7706802487373352 -6.934028625488281 -13.83045291900635
- 18.06538963317871 17.25232887268066 15.33289909362793 13.93245792388916 12.52245616912842 9.988646507263184 5.418338775634766 0.6451141834259033 -3.238833427429199 -6.515908718109131 -7.432992458343506 -4.743278503417969 0.1820781975984573 -1.570407032966614 -9.396409034729004 -12.18791961669922 -9.19588565826416 -6.906168460845947 -14.42296600341797 -17.72895431518555
- 15.05443000793457 16.37663650512695 17.70572090148926 18.91182518005371 18.30153465270996 14.39801406860352 8.932284355163574 4.261475563049316 0.6362144947052002 -0.1248405501246452 2.191779136657715 2.687022924423218 -4.15589714050293 -13.19209861755371 -18.43183708190918 -18.98002433776855 -16.46874046325684 -11.46321296691895 -16.56308364868164 -20.07719802856445
- -5.537087917327881 -4.176273822784424 -0.5606800317764282 2.441699028015137 0.993984043598175 -1.350461721420288 -3.78162407875061 -4.757624626159668 -6.273262023925781 -6.783051490783691 -5.647544384002686 -3.607697248458862 -1.177781105041504 -1.170651194115635e-05 4.883847713470459 10.65908432006836 9.394406318664551 9.270697593688965 5.686070442199707 0.3233091235160828
- 21.52824783325195 24.1579532623291 26.22974586486816 22.04270362854004 13.27961444854736 8.41521167755127 8.569576263427734 11.17470741271973 5.902539253234863 -3.779788970947266 -10.78228282928467 -15.85575675964355 -18.57206535339355 -19.02480697631836 -17.4420051574707 -14.79302597045898 -11.79622364044189 -11.63099479675293 -7.382223129272461 -10.24111652374268
- 22.73174858093262 23.08975219726562 21.47014427185059 16.63557243347168 8.850260734558105 2.017651557922363 0.4573545157909393 3.762774467468262 6.82050085067749 3.410573720932007 -2.919714450836182 -7.515873908996582 -9.142491340637207 -10.26068115234375 -9.582749366760254 -10.09675216674805 -8.151313781738281 -10.46341419219971 -18.89085960388184 -22.22247695922852
- 18.12631034851074 15.45483207702637 11.53939437866211 8.04310131072998 3.53790020942688 0.2780878245830536 -0.9592297077178955 0.6267252564430237 4.941982746124268 6.307762145996094 4.390275001525879 0.8409125804901123 -1.036473155021667 -4.707476139068604 -7.088866233825684 -7.83818531036377 -9.28543758392334 -11.71403980255127 -14.83414459228516 -16.62343215942383
- -2.29499626159668 -2.961411952972412 -2.122499227523804 -0.6669596433639526 -1.868154406547546 -3.875410556793213 -4.91694164276123 -4.891730308532715 0.4568216800689697 8.197615623474121 9.696140289306641 6.704034328460693 4.585768699645996 2.476099014282227 1.091381192207336 0.4335243105888367 -0.5687254071235657 -1.496876835823059 -2.130787372589111 -5.846884727478027
- 24.05082511901855 25.09373474121094 24.21193504333496 20.36325073242188 13.02910614013672 6.454100131988525 1.52746319770813 -3.075709819793701 -6.728793144226074 -8.80589771270752 -9.460672378540039 -11.76644706726074 -14.25769233703613 -13.67530250549316 -10.29029750823975 -1.650750637054443 -0.208829939365387 -2.077195644378662 -14.20537853240967 -18.52744102478027
- 25.77254676818848 24.06040191650391 20.5677547454834 13.68278884887695 5.020671844482422 -2.12727427482605 -5.282031536102295 -6.440862655639648 -8.702506065368652 -11.12855434417725 -11.91766548156738 -11.47909927368164 -12.10610198974609 -11.86609935760498 -9.121820449829102 -1.812450408935547 5.107182502746582 4.920481204986572 -0.2710652351379395 -6.876292705535889
- 5.561813831329346 2.296516895294189 -0.6591858863830566 -3.080161571502686 -3.533051490783691 -4.745232582092285 -4.471720695495605 -3.686116218566895 -2.147258281707764 -0.5663018822669983 0.5162866711616516 0.5424752235412598 1.623911499977112 3.003451824188232 3.977317333221436 2.498654365539551 0.8724212646484375 1.875412940979004 0.8027309775352478 -0.6819630861282349
- 19.61917686462402 18.45609474182129 18.47799491882324 19.79827308654785 17.10689926147461 11.72068023681641 6.055995941162109 0.3120600879192352 -7.114355087280273 -10.52225017547607 -11.70136451721191 -8.293768882751465 -1.405723810195923 -0.828071117401123 -6.074288845062256 -8.731206893920898 -4.095196723937988 -12.754958152771 -20.17257690429688 -19.85340881347656
- 14.80952072143555 17.46819114685059 20.82170867919922 23.67953681945801 20.62967872619629 15.85824108123779 14.72475910186768 14.74053478240967 8.142818450927734 -1.516817450523376 -7.932543277740479 -13.25365257263184 -16.83670234680176 -18.73295783996582 -19.06973457336426 -14.8338737487793 -10.93320178985596 -19.29703712463379 -18.45751571655273 -10.01095199584961
- 7.482068538665771 2.326231241226196 0.8688164949417114 4.389250755310059 4.947178840637207 1.969788432121277 0.3478336930274963 -1.950579762458801 -0.6798459887504578 1.780028462409973 1.205663084983826 -1.826590538024902 -2.571975708007812 -0.3986675441265106 -0.9361929893493652 -4.171066761016846 -2.571427345275879 -1.413182735443115 -5.015262126922607 -3.782065391540527
- 16.95998382568359 19.05223655700684 20.96267890930176 20.32244682312012 14.70008850097656 7.190319061279297 2.223759651184082 -1.443077445030212 -3.278354644775391 -3.199059009552002 -0.04841838777065277 3.228098630905151 -2.527568340301514 -9.855935096740723 -13.36289215087891 -10.47643089294434 -5.752617835998535 -17.51169776916504 -21.04363632202148 -16.13993453979492
- 15.64274024963379 19.27226829528809 21.4488525390625 20.53884315490723 13.66665840148926 5.105432033538818 -0.7823804616928101 -4.142613887786865 -7.173386573791504 -9.41521167755127 -11.72210216522217 -11.10785388946533 -8.61270809173584 -3.044043064117432 3.076077938079834 1.689179301261902 0.3429312407970428 -9.090780258178711 -17.00619888305664 -18.68569564819336
- 19.27406120300293 21.01512718200684 20.60714340209961 18.0533504486084 12.44712829589844 7.032878398895264 1.493260860443115 -0.216831773519516 -0.8198972344398499 -5.150724411010742 -8.989385604858398 -14.3274507522583 -16.3749828338623 -13.28943920135498 -3.104153156280518 0.7044649720191956 -0.1911748647689819 -9.366016387939453 -14.67130661010742 -14.12605476379395
- 15.87197208404541 15.75725650787354 16.47409057617188 19.80266571044922 21.39151000976562 19.08158874511719 16.78145980834961 16.32483673095703 10.03868007659912 -0.9548486471176147 -9.011223793029785 -14.07724475860596 -17.37917518615723 -19.1207275390625 -17.84129524230957 -13.48428630828857 -12.33353710174561 -12.18802642822266 -12.13397884368896 -22.99972343444824
- 19.77115440368652 22.67024993896484 23.19706153869629 17.61261940002441 8.879744529724121 -0.4675633609294891 -8.805087089538574 -14.97460079193115 -15.98870277404785 -15.40387725830078 -15.30841827392578 -12.50540828704834 -9.714068412780762 -6.806031227111816 -0.3164576590061188 4.903091907501221 7.00535249710083 3.019530534744263 -1.439740896224976 -5.328848361968994
- 17.01533126831055 19.18019866943359 19.9151611328125 17.81879997253418 9.990311622619629 1.763305306434631 -3.084365606307983 -4.78412389755249 -5.365145206451416 -5.203848361968994 -3.580549240112305 1.362223386764526 1.751674771308899 -4.448344230651855 -10.60238933563232 -12.07896423339844 -7.70475959777832 -6.26707124710083 -12.03426933288574 -13.64316558837891
- 21.14457321166992 24.05511474609375 23.26415252685547 16.86582946777344 6.21747875213623 -5.369931221008301 -11.22651100158691 -10.98467063903809 -11.96151065826416 -14.12011528015137 -14.95305633544922 -13.99252319335938 -13.30426406860352 -11.91360473632812 -7.540650367736816 3.757909536361694 11.0077543258667 9.207610130310059 2.215277433395386 -2.368848562240601
- 29.00222396850586 28.48460388183594 25.93150901794434 21.4667797088623 15.26805686950684 8.907505989074707 3.094134569168091 -0.3704345226287842 -0.3725618124008179 1.128356575965881 -0.8198649883270264 -7.251070022583008 -11.8759126663208 -14.63476467132568 -14.83200454711914 -14.91627025604248 -15.43190670013428 -17.03767204284668 -18.12302780151367 -17.6176643371582
- -0.5229872465133667 -0.9333568811416626 -1.976774334907532 -0.825653076171875 0.7381709814071655 0.9048271179199219 1.387306094169617 1.699026107788086 -0.06231091171503067 -0.732931911945343 0.9243366122245789 3.672161340713501 6.35561990737915 4.802435398101807 1.277143716812134 -2.026589393615723 -3.49106240272522 -0.9316468834877014 -2.478273630142212 -7.779440879821777
- 12.37761497497559 8.500540733337402 3.963826179504395 2.993585586547852 2.330672740936279 0.9922259449958801 -0.5155994892120361 -2.419493913650513 -2.139281272888184 -1.493281006813049 -1.923130989074707 1.723258495330811 4.125826358795166 3.013142347335815 0.1448220759630203 -2.225801467895508 -4.866007804870605 -7.273083209991455 -8.250102996826172 -9.059732437133789
- 14.71333122253418 15.06742572784424 18.74950408935547 23.52798652648926 21.64268684387207 15.7910213470459 15.44819450378418 14.6940279006958 3.300268173217773 -6.043857574462891 -12.38335990905762 -15.97732639312744 -18.13620948791504 -18.5322151184082 -15.62265777587891 -7.273159980773926 -13.44136810302734 -15.2663459777832 -7.649264812469482 -12.60868167877197
- 48.95719146728516 38.51773071289062 28.26075172424316 18.50657081604004 9.553078651428223 2.031860828399658 -2.963486909866333 -5.224729537963867 -6.883813858032227 -8.123416900634766 -8.973358154296875 -10.01819801330566 -11.01023101806641 -11.78633785247803 -12.352614402771 -12.40237236022949 -12.7945384979248 -13.53164100646973 -14.37493133544922 -15.38752365112305
- 20.14043045043945 22.09770202636719 23.61984443664551 20.70815277099609 12.92933368682861 6.965699672698975 4.558826923370361 5.68310546875 10.17691421508789 10.27906608581543 2.949414253234863 0.4938775300979614 -1.449414491653442 -10.34737014770508 -17.76157188415527 -20.15271949768066 -20.61063957214355 -22.88518905639648 -23.28697395324707 -24.10848999023438
- 10.52316665649414 11.40132236480713 12.66412162780762 15.0340051651001 16.0078125 12.45312023162842 5.898415088653564 0.4244002997875214 -3.046837329864502 -5.709925174713135 -5.847077369689941 -1.937305450439453 3.21573805809021 0.1034991592168808 -7.329855918884277 -7.853392124176025 -4.880685806274414 -13.89130973815918 -19.94056129455566 -17.28865242004395
- 4.588668346405029 6.570792675018311 8.394368171691895 8.328991889953613 4.536696434020996 1.18450391292572 -0.8655908107757568 -2.701234340667725 -3.482176303863525 -4.731601715087891 -5.074623584747314 -6.095221042633057 -7.251790523529053 -8.958389282226562 -6.104052066802979 -1.21333634853363 2.024424076080322 4.289226531982422 5.466686248779297 1.093659996986389
- 29.94863700866699 29.49594879150391 27.16386604309082 21.51515960693359 15.09241390228271 8.721625328063965 4.970298767089844 0.9929517507553101 -5.966999530792236 -11.41642379760742 -14.27747249603271 -15.10451984405518 -12.94044017791748 -11.16920852661133 -10.04634094238281 -6.543850421905518 -5.894989490509033 -9.758112907409668 -16.5338191986084 -18.24871444702148
- 21.83877182006836 20.97796249389648 16.94112014770508 11.61819267272949 5.872594356536865 0.1224955543875694 -3.212450504302979 -4.082170963287354 -3.923421144485474 -6.459991455078125 -9.039790153503418 -8.42768383026123 -8.672144889831543 -8.221024513244629 -3.779259204864502 -0.2299136072397232 -1.772968769073486 -2.763445377349854 -6.812325000762939 -9.974555969238281
- 10.06608009338379 12.53314876556396 14.51608562469482 16.25030899047852 14.19843101501465 8.040790557861328 1.817384481430054 -3.18849515914917 -7.034405708312988 -9.931848526000977 -11.79605579376221 -11.61011695861816 -10.18306541442871 -6.639899253845215 1.248023509979248 2.217592000961304 -0.1409498453140259 -0.3832103908061981 -8.301152229309082 -11.67865180969238
- 11.47887706756592 13.86257266998291 16.45888519287109 20.15396881103516 21.92895698547363 17.73989295959473 11.87622833251953 9.149440765380859 11.01427841186523 11.71131134033203 3.032826662063599 -5.608216285705566 -12.16831302642822 -17.32048797607422 -19.42136192321777 -18.5024356842041 -13.43717670440674 -19.46553421020508 -22.80763053894043 -19.67611122131348
- -4.030637264251709 -2.885680913925171 0.1430564075708389 4.568660736083984 2.949539184570312 0.4165210425853729 1.256185054779053 5.05045223236084 11.17075157165527 12.37558078765869 7.851804256439209 4.096808910369873 -0.01647955365478992 -2.634834766387939 -3.817649126052856 -5.186172008514404 -6.909162521362305 -6.777373790740967 -7.978471279144287 -9.64290714263916
- -4.582842826843262 -4.938823699951172 -3.97158670425415 -1.191046833992004 0.4686195254325867 0.4696268439292908 0.7897435426712036 1.007123470306396 0.9759035110473633 0.7490917444229126 3.345463514328003 4.258479118347168 1.889129400253296 0.4904288053512573 -0.6166672706604004 1.178263664245605 1.760909795761108 -0.386031836271286 -0.5971260666847229 -1.098657608032227
- 18.16452407836914 15.93523979187012 12.69881439208984 9.163189888000488 5.68792200088501 3.221932411193848 1.378219723701477 0.7165012955665588 -0.04331810399889946 -2.390689849853516 -4.209126472473145 -3.840389013290405 -3.458535671234131 -5.032373428344727 -7.358416080474854 -7.793894290924072 -7.618057250976562 -7.4072265625 -8.241902351379395 -9.572412490844727
- 18.65714073181152 21.6392879486084 23.14701271057129 19.70701789855957 9.618742942810059 1.223453998565674 -3.562457084655762 -6.017216682434082 -7.231733798980713 -8.804216384887695 -9.193452835083008 -6.414642333984375 -0.6559333801269531 2.950440168380737 -1.541023850440979 -0.7578599452972412 -4.592584133148193 -11.68973445892334 -16.67496109008789 -19.80730628967285
- 25.89447593688965 28.08014678955078 28.30322265625 22.88685417175293 14.30008125305176 7.697629928588867 6.975630760192871 9.39089298248291 9.127365112304688 1.994027018547058 -6.20891284942627 -11.60031986236572 -15.35876560211182 -17.2491340637207 -17.58245086669922 -17.56136131286621 -16.83846473693848 -16.73702621459961 -17.42365837097168 -18.09022331237793
- 25.91289329528809 26.5307559967041 24.99502182006836 21.00735664367676 14.51052665710449 5.89196252822876 -2.764667510986328 -5.982351779937744 -5.862534999847412 -5.455358028411865 -5.616053581237793 -6.529488086700439 -7.304214477539062 -9.862467765808105 -9.469766616821289 -7.576248168945312 0.3342598080635071 -8.488096237182617 -21.4695873260498 -22.80195236206055
- -2.074811697006226 -1.379054188728333 0.01440542191267014 3.46073317527771 5.932763576507568 7.50106954574585 9.151447296142578 11.70153999328613 14.97406578063965 13.73254013061523 7.314203262329102 0.7578305602073669 -4.526126384735107 -7.792448997497559 -7.752913475036621 -7.687578678131104 -11.6464204788208 -12.75423908233643 -10.24080848693848 -8.686188697814941
- 5.395631790161133 6.458533763885498 7.563086032867432 10.97248458862305 14.47399044036865 13.63891887664795 6.956953525543213 0.587205708026886 -3.735230445861816 -6.338038444519043 -7.727948665618896 -5.995079517364502 -1.221249580383301 4.427247047424316 1.087075114250183 -3.115803003311157 -2.559682130813599 -8.986092567443848 -15.33430862426758 -16.54770088195801
- 7.409373760223389 7.695731163024902 8.154870986938477 9.880136489868164 12.9074592590332 14.7426643371582 13.79567050933838 12.06047344207764 12.62145519256592 11.72721862792969 2.965122938156128 -5.753271102905273 -11.96146774291992 -16.7459831237793 -18.08276176452637 -19.30992889404297 -17.38825416564941 -8.724355697631836 -7.540921211242676 -8.453221321105957
- 4.96336555480957 9.996636390686035 14.311842918396 17.83664894104004 13.37979030609131 4.466736793518066 -2.443968534469604 -6.613634586334229 -9.214696884155273 -10.84931945800781 -11.36781120300293 -10.56637287139893 -8.684598922729492 -5.701920032501221 1.975816130638123 3.872113704681396 2.062820672988892 2.185985326766968 -3.216341495513916 -6.393094539642334
- 9.937215805053711 9.546629905700684 8.942694664001465 9.494353294372559 11.37107372283936 13.71105003356934 13.10164356231689 10.91634368896484 9.760026931762695 10.16535091400146 6.406124114990234 -0.795256495475769 -5.633151531219482 -8.741108894348145 -8.804507255554199 -7.941834449768066 -17.37422943115234 -24.62496757507324 -23.34028816223145 -16.0971508026123
- 25.04638671875 28.31245040893555 30.09809112548828 25.19725608825684 17.16758918762207 13.95879936218262 14.62166595458984 11.47086238861084 2.385091066360474 -5.529094696044922 -11.06947898864746 -14.87096786499023 -17.54668045043945 -18.25679588317871 -17.60579490661621 -16.48863792419434 -16.82614517211914 -16.26765060424805 -17.22675895690918 -16.5701847076416
- 0.1861922889947891 0.9933821558952332 1.407365202903748 2.385457038879395 4.697247505187988 8.267799377441406 11.20168304443359 9.177871704101562 3.897504091262817 1.19879412651062 0.9696437120437622 3.811080932617188 6.218757152557373 2.046954393386841 -3.372447729110718 -4.264369964599609 -4.85486888885498 -12.49968338012695 -15.97949409484863 -15.48887729644775
- 10.04598236083984 10.85248279571533 12.00761985778809 14.89963817596436 17.79332160949707 16.17134666442871 10.49749565124512 6.242854118347168 4.67501974105835 6.522838115692139 8.398330688476562 3.183536529541016 -3.453681230545044 -8.892962455749512 -11.84520530700684 -12.1473217010498 -15.1132173538208 -24.09582710266113 -24.7960376739502 -20.94625663757324
- -3.491617918014526 -1.485655784606934 3.950692892074585 9.229430198669434 7.517223358154297 2.145496129989624 -1.415111064910889 -2.380982160568237 -2.882533550262451 -3.89798378944397 -1.201219081878662 4.009006500244141 3.563282012939453 -0.9534040093421936 -2.717098712921143 -2.829782247543335 -3.718904733657837 -4.624296188354492 -0.721588671207428 1.905048012733459
- 7.136748313903809 9.704776763916016 11.83459091186523 15.42144584655762 15.85572528839111 10.22522449493408 3.411412715911865 -1.60797131061554 -5.067855834960938 -6.342608451843262 -5.501177310943604 -1.083021879196167 6.475111484527588 8.123156547546387 4.048862457275391 -3.604238510131836 -14.79314231872559 -20.80034065246582 -18.90864753723145 -14.52805233001709
- 6.531763553619385 9.634510040283203 12.81524658203125 16.13408851623535 15.64743137359619 8.741541862487793 1.710421323776245 -5.35227108001709 -9.97281551361084 -10.95711803436279 -10.78933429718018 -8.797097206115723 -3.595824480056763 3.170336484909058 6.32103967666626 1.094992160797119 1.220337748527527 -7.576735496520996 -13.53053569793701 -12.44996643066406
- -7.363903522491455 -6.806900978088379 -2.836859226226807 1.175342679023743 1.479748368263245 -1.402959108352661 -3.674769163131714 -4.856005668640137 -4.591520309448242 -0.3723679482936859 8.325454711914062 10.33613681793213 6.669467926025391 3.046763181686401 1.662578225135803 0.1397121250629425 -1.543805599212646 -1.155826449394226 0.9786150455474854 0.791096568107605
- 29.80045127868652 28.91568756103516 26.60078239440918 21.97250556945801 16.60643005371094 11.04075717926025 2.602904081344604 -6.682921886444092 -10.14100074768066 -9.767416954040527 -8.65099048614502 -5.926705837249756 -5.210380077362061 -8.59261417388916 -8.445284843444824 -10.87628650665283 -13.19943046569824 -14.73625087738037 -17.3039665222168 -18.00626945495605
- -3.688560009002686 -2.818481922149658 -0.6802619099617004 2.270853519439697 1.879542589187622 0.940893292427063 0.6564497947692871 2.256100177764893 4.703661441802979 8.975269317626953 13.59372425079346 11.68512058258057 6.962771415710449 1.251905083656311 -2.763835191726685 -5.771818161010742 -7.884562015533447 -8.462206840515137 -10.35957622528076 -12.74699211120605
- 4.248004913330078 4.765432834625244 4.915815830230713 5.49687671661377 7.023930072784424 10.7000789642334 13.39191150665283 12.50377178192139 7.702636241912842 4.374923706054688 5.430500030517578 7.171112537384033 4.185420513153076 -1.677868843078613 -5.097870826721191 -5.405557155609131 -11.90072917938232 -21.51240158081055 -24.1170482635498 -22.19893264770508
- 15.75334930419922 17.19730758666992 20.7005672454834 18.72154808044434 8.951026916503906 0.6867164373397827 -3.716609954833984 -5.566258430480957 -6.311602115631104 -7.152885437011719 -5.432274341583252 1.117875218391418 6.214285850524902 -2.5494544506073 -5.128464698791504 -0.04915498197078705 -10.04692077636719 -16.14870834350586 -15.10398864746094 -12.13636016845703
- 17.97311401367188 19.76634979248047 21.39565658569336 21.74516868591309 16.75929641723633 9.467004776000977 2.849482774734497 -2.500046253204346 -5.042112350463867 -6.342464447021484 -5.623378753662109 -1.123852968215942 5.147496700286865 4.953648567199707 -2.517591714859009 -11.62445735931396 -17.46012115478516 -21.40938377380371 -22.94816970825195 -23.46565437316895
- 11.63461589813232 9.158080101013184 6.488457202911377 5.143817901611328 2.916905403137207 -0.1068479046225548 -3.112392425537109 -5.819238185882568 -7.164790630340576 -8.176109313964844 -7.564079284667969 -4.48690128326416 0.8956932425498962 7.570874214172363 1.312260150909424 -1.768796443939209 -2.289218664169312 -3.31137490272522 -3.028005123138428 1.707053899765015
- 2.926234483718872 29.14865112304688 21.47149467468262 2.439462184906006 5.501011371612549 1.643659591674805 -6.76292085647583 -2.409740924835205 -8.03907299041748 -5.249748706817627 -9.267143249511719 -5.653778553009033 -3.96656322479248 -3.667096853256226 -4.748202323913574 -1.549194693565369 -0.9463512301445007 -1.836906909942627 -3.314558506011963 -5.719235897064209
- 12.470947265625 15.11152458190918 18.02553176879883 21.29134178161621 19.52526092529297 12.10525226593018 6.312593936920166 3.845258474349976 4.148721218109131 8.307011604309082 6.77711820602417 -0.07827016711235046 -3.445091009140015 -3.363857984542847 -8.071511268615723 -18.60810089111328 -23.78367233276367 -24.94066429138184 -24.25318717956543 -21.3762035369873
- 7.031388759613037 6.56312894821167 5.011763572692871 4.739909172058105 3.760274887084961 1.649250745773315 0.7073513865470886 0.1368855834007263 0.6126673817634583 0.1664887070655823 0.4641624093055725 -1.579413890838623 -3.002885341644287 -1.619839429855347 -2.136864423751831 -2.416504621505737 -2.729471206665039 -2.035640239715576 -3.998173236846924 -11.3244743347168
- 26.10825538635254 27.87723541259766 27.57238388061523 22.53870582580566 13.55697631835938 4.377523899078369 -4.967516422271729 -9.398359298706055 -7.663876056671143 -2.978241443634033 2.235098361968994 0.4064364731311798 -5.980384349822998 -8.795235633850098 -6.909957408905029 -9.368417739868164 -15.10078525543213 -16.43280982971191 -18.18826675415039 -18.88875007629395
- -5.332527160644531 -4.412014007568359 -1.92000412940979 -0.9148799180984497 -1.788313031196594 -3.458236217498779 -4.219573497772217 -4.257562160491943 -4.52461051940918 -5.294120311737061 -4.055778026580811 -1.531636595726013 1.79312539100647 0.6853257417678833 -0.3957566916942596 1.670542120933533 2.707639455795288 5.126019954681396 11.65222549438477 18.47012901306152
- -5.89049768447876 -4.81791353225708 -1.081678628921509 5.210571765899658 8.489131927490234 6.439982891082764 1.294154167175293 -3.274646043777466 -5.840307235717773 -5.678736686706543 -4.992888927459717 -2.973397016525269 -1.036866664886475 6.145828723907471 2.573880434036255 0.356663316488266 1.453744173049927 -1.621693134307861 -1.165271759033203 6.409940719604492
- 17.66457748413086 19.16311454772949 20.8537654876709 19.46419525146484 11.7333345413208 3.940036773681641 -1.99169135093689 -6.299876689910889 -9.069355010986328 -10.85267543792725 -11.00132465362549 -8.994890213012695 -4.004629611968994 3.13444447517395 -2.397467374801636 -4.317055225372314 -2.567871570587158 -10.91507053375244 -13.57569408416748 -9.965864181518555
- 20.93514251708984 22.32027816772461 22.67409706115723 21.14582824707031 15.3944616317749 8.963449478149414 4.276293754577637 -1.209252595901489 -5.569623947143555 -9.04305362701416 -11.31122303009033 -11.90524959564209 -10.29675769805908 -5.414793491363525 -4.478218078613281 -9.073565483093262 -11.81995391845703 -9.795501708984375 -11.63317680358887 -14.15919971466064
- 12.1132755279541 12.60517501831055 13.1745548248291 14.86605358123779 17.28303146362305 18.20900917053223 16.71659660339355 15.193434715271 14.69535732269287 10.41833019256592 0.1862402707338333 -8.594590187072754 -15.08750343322754 -19.6607780456543 -21.82248306274414 -21.11617660522461 -16.99981498718262 -11.3578987121582 -14.72579193115234 -16.09602165222168
- -5.465966701507568 -3.264725685119629 0.9728610515594482 3.154532432556152 2.278740644454956 -0.3419993221759796 -2.567096471786499 -2.122959613800049 -1.745057702064514 -2.443787097930908 -2.750707864761353 -4.094523429870605 -3.222794532775879 8.81804370880127 2.149501800537109 -0.4293558299541473 1.450195908546448 3.500549793243408 1.755900740623474 4.368653297424316
- 19.10623359680176 18.27375030517578 16.36072731018066 14.52373695373535 12.06633377075195 9.84489917755127 8.277098655700684 5.320629596710205 1.419358968734741 -1.654242753982544 -3.454586982727051 -5.132024765014648 -8.012357711791992 -9.783267974853516 -9.893815040588379 -10.32134437561035 -12.21881580352783 -13.14967155456543 -14.13659381866455 -17.4360466003418
- 12.86025714874268 17.76287651062012 19.6215877532959 16.7944278717041 8.887890815734863 -0.07134453952312469 -5.687702655792236 -8.288370132446289 -9.721799850463867 -12.15043258666992 -12.64809513092041 -11.97291278839111 -11.12402820587158 -9.167056083679199 -2.822146415710449 6.055039405822754 5.621646404266357 5.278852462768555 -3.004235982894897 -6.224456310272217
- 15.44426250457764 17.72979354858398 19.69716835021973 20.67222785949707 17.2242259979248 9.833361625671387 3.39949369430542 -0.1992348283529282 -2.688804149627686 -4.334923267364502 -3.844566822052002 0.4062078297138214 2.857535600662231 -5.772940635681152 -13.67775058746338 -16.08181571960449 -13.63161659240723 -8.060153961181641 -17.29298400878906 -21.67949295043945
- 7.698844909667969 8.738471984863281 8.745844841003418 7.698896408081055 3.663897037506104 0.573648989200592 -0.3727831840515137 -2.538948535919189 -1.645619630813599 0.1504676342010498 1.366070985794067 -0.6653468012809753 -2.98711371421814 -2.646284341812134 -1.340891122817993 -6.458623886108398 -6.322549819946289 -2.637673616409302 -5.701182842254639 -5.319135189056396
- 4.066613674163818 -0.5547595024108887 -5.034553527832031 -5.277034759521484 -2.400102138519287 -0.3168928027153015 0.4989962875843048 3.530563592910767 5.426045417785645 2.565437316894531 2.01171875 1.435815572738647 2.939490079879761 4.050272464752197 1.313495516777039 0.5883401036262512 -0.6518515944480896 -1.240793347358704 -5.079005718231201 -7.871795177459717
- -1.448119401931763 0.6444759368896484 3.32461404800415 4.711866855621338 3.763662338256836 1.080332398414612 -1.286277413368225 -1.319438815116882 -1.532131552696228 -1.768378019332886 -3.707221269607544 -5.079774379730225 -3.48140549659729 -0.8008399605751038 -2.879961013793945 -3.931840181350708 0.275295615196228 -0.1360030919313431 3.79906702041626 9.772076606750488
- 12.1269359588623 11.27189159393311 10.59097862243652 10.46043586730957 10.2598237991333 10.81139469146729 9.668438911437988 6.660717487335205 4.573893547058105 3.467939138412476 5.238237857818604 5.803231716156006 -1.210148215293884 -7.493948459625244 -11.93519115447998 -14.7085428237915 -16.71599769592285 -16.05445671081543 -15.70364952087402 -17.11195945739746
- 13.12377738952637 14.76900291442871 16.54218292236328 18.39592933654785 17.37423896789551 11.19109058380127 4.846801280975342 -0.07917411625385284 -4.133964061737061 -6.860244750976562 -7.90886402130127 -7.139285087585449 -4.538718223571777 -3.392687797546387 -7.839596271514893 -11.61318588256836 -10.64090919494629 -8.868794441223145 -10.99363040924072 -12.23396301269531
- 26.81447792053223 27.96259498596191 25.43362045288086 17.52786445617676 7.419716358184814 -0.9599667191505432 -6.38667631149292 -9.264720916748047 -10.46603775024414 -12.98816680908203 -15.02329730987549 -13.95087242126465 -13.49857807159424 -11.75158309936523 -5.786628723144531 4.058955669403076 4.121197700500488 3.128490447998047 -6.040102005004883 -10.3502836227417
- 25.52299308776855 26.00387573242188 24.36669731140137 18.27095985412598 9.770153999328613 1.368101000785828 -4.337774753570557 -6.078232765197754 -7.139277458190918 -8.449238777160645 -6.285707473754883 0.8910611867904663 3.336474180221558 -2.790127038955688 -6.165754795074463 -7.770922183990479 -10.82155895233154 -14.25809097290039 -17.0772647857666 -18.35636711120605
- 17.56317329406738 19.77436637878418 20.96381187438965 20.10425567626953 15.16935634613037 8.723620414733887 2.202280759811401 -4.633536338806152 -9.062554359436035 -11.55770587921143 -13.7131872177124 -14.99067497253418 -15.49533748626709 -13.84534168243408 -7.838288307189941 -0.3781206607818604 -0.9606676697731018 0.2202225625514984 -3.724903106689453 -8.520763397216797
- 10.77509307861328 9.713216781616211 7.613139629364014 6.115299224853516 5.473390102386475 6.564493179321289 6.196128845214844 3.413422346115112 -0.02892985567450523 -3.367078304290771 -4.039168357849121 -0.102944016456604 4.495573997497559 -0.4807423651218414 -6.583694934844971 -9.843358993530273 -10.01949501037598 -5.279670238494873 -8.310620307922363 -12.30404376983643
- 16.25362396240234 18.52274513244629 20.42025947570801 20.34381103515625 15.32809066772461 7.423810958862305 1.014423608779907 -3.601566314697266 -7.054345607757568 -9.875856399536133 -11.27408123016357 -11.39995384216309 -10.55090522766113 -6.693789005279541 -0.8936566710472107 -3.154413223266602 -5.269351959228516 -2.610140323638916 -10.16194248199463 -16.7667293548584
- 3.905270099639893 4.179000377655029 5.603682041168213 8.862052917480469 10.36059665679932 8.620098114013672 6.471692562103271 7.155777454376221 9.086709976196289 10.42552947998047 2.746437788009644 -2.729669809341431 -6.542405605316162 -7.424158573150635 -6.387094497680664 -7.067750930786133 -9.778780937194824 -10.32910251617432 -11.56781959533691 -15.59007835388184
- -6.808318614959717 -7.090552806854248 -6.253806591033936 -3.689674377441406 1.446397304534912 4.566421508789062 5.933397769927979 7.514000415802002 7.479331970214844 7.777411937713623 8.614169120788574 6.021528720855713 1.703269243240356 -3.3706214427948 -6.088683128356934 -6.042318344116211 -3.703494071960449 -2.794055223464966 -2.483824014663696 -2.730587005615234
- -4.518355369567871 -2.309658050537109 -0.07686230540275574 2.702617883682251 2.256586313247681 -0.08113429695367813 -2.718752861022949 -4.201854705810547 -4.282203197479248 -5.620865821838379 -7.055092334747314 -7.958604335784912 -4.317380905151367 0.03007601946592331 -0.9952335357666016 1.324269413948059 7.6004958152771 10.07666778564453 9.924391746520996 10.22088718414307
- 5.193268299102783 18.71485900878906 7.907965183258057 1.701437592506409 2.314491033554077 0.03160341084003448 -0.7266870737075806 -1.575950860977173 -1.885913252830505 -1.634743571281433 -1.900933742523193 -2.700615644454956 -2.390077114105225 -1.362438559532166 -3.721405744552612 -2.861743450164795 -3.147173166275024 -2.292251825332642 -4.752890586853027 -4.910801410675049
- -5.400527477264404 -4.492744922637939 -1.888294458389282 1.232377529144287 2.88743257522583 1.315721392631531 -1.799540042877197 -2.02327561378479 -1.006501913070679 1.384703159332275 6.246706008911133 10.34042930603027 11.93471527099609 9.124555587768555 3.317849159240723 -1.930319786071777 -5.636334419250488 -7.022735118865967 -8.171489715576172 -8.412727355957031
- 10.08158874511719 13.33664798736572 15.84231090545654 17.82143592834473 13.8110179901123 5.529462337493896 -0.3985528945922852 -3.980654716491699 -6.574244022369385 -7.981208324432373 -7.879886627197266 -5.496023654937744 0.223065048456192 5.774120330810547 2.761629819869995 0.8614833950996399 -6.516460418701172 -15.14510059356689 -17.31759834289551 -14.75303840637207
- 22.60013008117676 24.54156684875488 23.84326362609863 19.09496688842773 10.35621643066406 0.1859720498323441 -6.529986381530762 -8.530640602111816 -9.13427734375 -12.85328769683838 -16.79564476013184 -16.80108261108398 -16.06009864807129 -15.23451805114746 -11.63305282592773 -2.050983667373657 9.135754585266113 6.994509220123291 2.099718570709229 -3.228525400161743
- 25.89415168762207 28.10893249511719 26.96290588378906 22.13865661621094 14.95983600616455 7.596179485321045 2.084829807281494 -3.544821500778198 -9.640351295471191 -13.9775915145874 -14.70730590820312 -16.57130813598633 -17.99108695983887 -18.67123031616211 -18.50144958496094 -13.6798677444458 -3.831031084060669 2.643254518508911 2.780942440032959 -2.053637504577637
- 22.93076515197754 22.75090026855469 22.0548038482666 20.26150512695312 15.51104259490967 9.472469329833984 7.012144088745117 5.358087062835693 -4.120922088623047 -14.14297580718994 -16.55397796630859 -18.74569702148438 -20.71169090270996 -19.25810241699219 -14.79666805267334 -5.918205261230469 -0.5904276967048645 1.12313711643219 -3.183269500732422 -8.452899932861328
- -5.418164253234863 -3.471637725830078 2.6681969165802 6.788909912109375 7.09466552734375 6.437314510345459 5.553920269012451 7.795188903808594 11.93319129943848 15.64833068847656 12.53702926635742 4.330926418304443 0.6339982748031616 -3.339206218719482 -3.792855262756348 -4.291908264160156 -8.324840545654297 -13.37173080444336 -16.93652725219727 -22.47480201721191
- -0.05879762768745422 0.6452949643135071 2.405997276306152 5.493192195892334 7.127470970153809 5.682305335998535 4.48931884765625 5.042030334472656 7.676459312438965 12.43595218658447 13.69847869873047 7.465067386627197 0.7681453824043274 -5.490077972412109 -8.937341690063477 -11.43538093566895 -12.79670524597168 -10.97546291351318 -11.29264831542969 -11.94329643249512
- 10.88403987884521 12.92324447631836 14.38540935516357 16.91743087768555 17.27330780029297 13.22148895263672 7.155322551727295 3.993715286254883 2.442624807357788 4.40928840637207 6.261072158813477 -0.6198334693908691 -9.670731544494629 -15.26863765716553 -17.71808242797852 -19.10515213012695 -16.69156074523926 -9.953075408935547 -8.27349853515625 -12.56636428833008
- 2.27680516242981 2.113321304321289 2.437686443328857 3.008768320083618 1.241589426994324 -1.387916803359985 -2.462588310241699 -2.975337028503418 -1.88559091091156 -0.2042010277509689 4.651990413665771 9.968090057373047 8.300644874572754 0.9605519771575928 -0.04896814003586769 -3.365617513656616 -5.978078365325928 -6.833310127258301 -5.090195178985596 -4.727645874023438
- 7.847574234008789 7.067167282104492 6.662248134613037 6.578348159790039 5.079869270324707 5.592251300811768 6.218988418579102 4.586808681488037 2.581440448760986 3.04776406288147 6.129241466522217 4.793115139007568 -1.531108379364014 -3.758066654205322 -3.071969032287598 -7.702095985412598 -11.62927913665771 -12.84663105010986 -12.25682735443115 -13.38883113861084
- 4.514105319976807 4.66682767868042 4.232834815979004 4.099987506866455 5.760811805725098 8.106185913085938 8.97283935546875 7.705116271972656 3.943045854568481 1.224737286567688 1.876956105232239 4.768482685089111 3.795475006103516 -4.402254581451416 -9.583163261413574 -11.04205894470215 -8.369756698608398 -7.266294002532959 -11.14993095397949 -11.85393905639648
- 20.3990650177002 23.50200271606445 26.11712646484375 27.20767021179199 24.64443588256836 21.54933738708496 20.01017951965332 15.03142261505127 4.738848686218262 -4.783853530883789 -10.73083591461182 -15.53164863586426 -18.9738712310791 -20.52020072937012 -20.84870910644531 -20.41202545166016 -18.743896484375 -17.63668441772461 -18.33848571777344 -16.67988014221191
- 9.542250633239746 8.481548309326172 5.684684753417969 1.996210336685181 -0.245926633477211 1.624283313751221 3.946237087249756 2.700109481811523 2.234994173049927 0.115024022758007 -0.6976653337478638 -0.5476781725883484 -1.046251058578491 -2.904873609542847 -2.946000099182129 -4.478445529937744 -4.57406759262085 -3.898633241653442 -6.183862686157227 -8.801935195922852
- 16.16145896911621 17.42645454406738 18.16004371643066 16.37112045288086 9.949515342712402 2.940956115722656 -1.942262172698975 -3.597460746765137 -4.915493965148926 -3.411347150802612 -2.519420862197876 -5.716957092285156 -10.15748882293701 -13.70100402832031 -14.29308319091797 -10.95629215240479 -1.597131013870239 -2.676204919815063 -1.170148372650146 -4.355268478393555
- 12.28768920898438 12.68321704864502 15.569580078125 19.4908447265625 16.91010856628418 8.692852020263672 2.517797946929932 -0.9263007640838623 -1.170295238494873 -0.06174460425972939 6.420377731323242 8.932571411132812 4.201237678527832 1.721729397773743 -9.224428176879883 -17.35285568237305 -19.26045417785645 -15.71762275695801 -19.16238212585449 -26.55192756652832
- 6.245744705200195 6.268002986907959 4.207524299621582 1.79872739315033 -1.229633688926697 0.7408354878425598 1.604185223579407 0.142693817615509 0.1075441762804985 -0.644679069519043 -0.08846840262413025 -1.768100142478943 -2.159897804260254 -1.129769682884216 0.2629894316196442 -2.082078456878662 -2.441042423248291 -1.899894237518311 -3.815143823623657 -4.119542121887207
- 20.05173110961914 20.88055038452148 17.51747512817383 10.19919300079346 0.5258507132530212 -7.500913143157959 -11.45216369628906 -11.26561164855957 -12.39236927032471 -13.94026947021484 -12.39535140991211 -10.40854358673096 -7.500237941741943 -0.08528272807598114 5.785986423492432 2.105387926101685 4.345167636871338 1.501741051673889 1.500825643539429 2.526839256286621
- 8.607571601867676 10.66682815551758 9.249236106872559 5.503625392913818 2.882188558578491 0.8992083668708801 -0.0635828971862793 2.035057067871094 0.9016298651695251 2.023458003997803 -1.298769593238831 -3.129651069641113 2.074720621109009 4.167274475097656 1.610644698143005 -1.834706664085388 -4.397714614868164 -9.282272338867188 -13.77460956573486 -16.84013748168945
- 17.72782897949219 13.35384750366211 9.865743637084961 8.380244255065918 7.216981410980225 4.388460636138916 0.8877004384994507 -1.852398037910461 -4.192076206207275 -8.631535530090332 -11.5961332321167 -11.11518955230713 -11.34392833709717 -12.33370208740234 -8.607263565063477 -0.6291151642799377 5.245619773864746 4.970704555511475 2.182846784591675 -3.918646335601807
- 8.837656021118164 8.571144104003906 8.405841827392578 9.54058837890625 12.27148914337158 14.57786083221436 14.13510322570801 10.99378108978271 7.196304798126221 5.435515403747559 6.295659065246582 4.651970386505127 -2.721877098083496 -10.37612533569336 -14.87836933135986 -13.88115406036377 -10.32938575744629 -14.44945526123047 -20.78187370300293 -23.49467086791992
- 23.84619140625 25.78300857543945 25.47788238525391 19.87122344970703 11.68521499633789 3.604460954666138 -5.03634786605835 -11.32021522521973 -12.02878570556641 -13.42320442199707 -13.94569301605225 -14.02375507354736 -12.19654178619385 -9.82501220703125 -5.048263549804688 -2.246386051177979 -3.514144659042358 -2.5782470703125 -1.633030891418457 -3.448371648788452
- 3.340758562088013 3.870378017425537 4.120713710784912 5.037959098815918 6.753860950469971 9.110489845275879 12.00573444366455 13.37793254852295 12.55318927764893 11.54603958129883 9.90861988067627 5.425647735595703 -2.18930196762085 -8.727770805358887 -13.10155391693115 -13.52284622192383 -11.65468502044678 -12.26611804962158 -16.727294921875 -18.86173439025879
- -9.828516006469727 -8.915326118469238 -8.974359512329102 -7.217646598815918 -2.282588720321655 2.893517971038818 4.239310741424561 7.093316078186035 6.604909420013428 2.865988254547119 1.83055579662323 3.2193443775177 5.518388271331787 7.064283847808838 3.67120885848999 0.8540105223655701 -0.3388596475124359 0.6132372617721558 -3.018272638320923 -5.892501354217529
- -2.874711275100708 -2.752830028533936 -2.014209508895874 -2.198307752609253 -2.533478498458862 -3.003878116607666 -3.114390134811401 -1.569741010665894 -0.112723134458065 0.5634764432907104 0.8838361501693726 0.2968892157077789 -0.07328982651233673 0.8557653427124023 1.598296284675598 2.840940713882446 1.994451642036438 3.354205369949341 3.775538682937622 4.084163188934326
- 15.98454570770264 15.1947603225708 14.83768558502197 15.3307991027832 15.14640808105469 12.90590858459473 9.047271728515625 4.183680534362793 -2.723320245742798 -8.632135391235352 -11.74036693572998 -12.76990604400635 -12.81839466094971 -9.959145545959473 -5.365267276763916 -5.420938968658447 -7.030534267425537 -4.051525592803955 -9.210529327392578 -12.90900325775146
- 5.808152198791504 5.720107078552246 6.113341331481934 7.924656391143799 10.49635887145996 13.1540412902832 13.37427043914795 9.870301246643066 5.203501224517822 0.6487607359886169 -1.668828845024109 -1.010637760162354 1.291379928588867 -1.743746638298035 -9.325093269348145 -12.29535293579102 -9.551430702209473 -8.369579315185547 -14.92904567718506 -20.71117210388184
- 16.51220321655273 16.43748092651367 15.49705600738525 15.38887596130371 13.89906311035156 9.833464622497559 5.09571647644043 0.7448903322219849 -3.773747205734253 -8.787490844726562 -12.47578144073486 -14.80143547058105 -15.03035926818848 -13.44840717315674 -8.022580146789551 0.2365774512290955 0.2807630300521851 0.296282947063446 -5.820065975189209 -12.06250762939453
- -9.217697143554688 -8.090685844421387 -4.641467571258545 -2.057780027389526 -1.992717146873474 -3.516020774841309 -2.843037843704224 -0.5224300026893616 -0.7823125123977661 2.480736017227173 4.146018028259277 2.472123384475708 1.546867370605469 -0.2983658909797668 -1.849201917648315 -1.127020835876465 -0.5901479125022888 3.693552732467651 9.157370567321777 14.0322151184082
- -1.976412534713745 -2.173535585403442 0.7694739103317261 3.23710298538208 0.8608817458152771 -1.77998149394989 -2.03187894821167 -1.642399668693542 1.260336756706238 7.953809261322021 9.447467803955078 5.30814266204834 0.04628446325659752 -5.822784900665283 -4.83160400390625 -4.831812381744385 -5.098841190338135 -1.812971591949463 2.025947093963623 1.092775464057922
- -6.570667266845703 -4.6805739402771 -1.852029085159302 0.08193914592266083 -0.2363552004098892 -1.678380131721497 -3.177366495132446 -3.337771654129028 -2.952064275741577 -2.232300519943237 -1.573031067848206 -1.594407320022583 -2.042798280715942 -2.983182191848755 0.3691272139549255 3.700782060623169 5.453786373138428 10.41572380065918 10.58175373077393 4.307811260223389
- 1.787362694740295 2.793349504470825 3.836597919464111 5.649247646331787 8.752525329589844 12.60365104675293 12.86293697357178 8.05153751373291 4.367712020874023 4.074845790863037 7.052967548370361 7.244086265563965 -0.05366810783743858 -7.330480575561523 -10.00409126281738 -8.005287170410156 -6.356993675231934 -15.1110372543335 -18.3768482208252 -13.83841419219971
- 2.341654539108276 2.388215780258179 2.863267183303833 4.648303031921387 8.122657775878906 11.42584133148193 12.51743698120117 11.02591419219971 8.554328918457031 8.951103210449219 7.793797969818115 0.411314457654953 -7.197686195373535 -12.37596797943115 -14.07142066955566 -13.0402364730835 -8.43012809753418 -7.47089147567749 -9.221945762634277 -9.23554515838623
- -2.109720230102539 -1.5848708152771 1.873279213905334 7.853331565856934 6.608457565307617 1.915987849235535 -1.072176456451416 -3.109765529632568 -5.152875900268555 -5.94966983795166 -5.459291934967041 -3.629111766815186 -2.284777402877808 0.5669218301773071 8.365090370178223 6.38809061050415 2.966304779052734 0.7316229343414307 -2.428706169128418 -4.488123893737793
- 18.11464691162109 17.04067039489746 15.46302890777588 13.02914142608643 8.66083812713623 4.241238117218018 0.1176207438111305 -2.475629091262817 -3.161414384841919 -5.331512451171875 -7.091492176055908 -5.272529125213623 -3.315841913223267 -2.177387475967407 -3.030715465545654 -5.545974731445312 -7.453866481781006 -9.154640197753906 -10.69330310821533 -11.96286869049072
- -7.152008056640625 -4.281537532806396 1.351773381233215 5.114845752716064 4.510157108306885 2.515305042266846 1.736945033073425 1.729850888252258 0.6823156476020813 -0.1912119686603546 -1.01634156703949 -2.340070724487305 0.7699002027511597 0.1453834772109985 0.02102604135870934 -0.6207496523857117 -1.611258149147034 -3.454113960266113 -0.8278251886367798 2.917616605758667
- 9.232468605041504 10.09817695617676 11.44250774383545 13.9641284942627 13.49008178710938 7.798350811004639 1.654053807258606 -3.256836414337158 -6.486809253692627 -8.684080123901367 -8.676959037780762 -5.96602201461792 0.1038316115736961 3.271592855453491 -2.433842420578003 -5.343145370483398 -2.0563805103302 -7.70362663269043 -11.05433559417725 -9.393156051635742
- 11.3211088180542 10.30084133148193 8.714303970336914 8.196332931518555 8.060892105102539 6.808402061462402 3.831996202468872 0.652700662612915 -2.153224945068359 -4.997282028198242 -6.756732940673828 -5.48879337310791 -2.711465358734131 1.958363890647888 -0.6092830300331116 -5.806711673736572 -7.736612319946289 -5.348489761352539 -6.235086441040039 -12.00126171112061
- 11.96300792694092 12.53170776367188 8.439566612243652 6.113806247711182 6.259037971496582 5.941214084625244 7.968895435333252 8.847665786743164 7.777585983276367 2.564042329788208 -1.488135576248169 -3.309003114700317 -5.532947540283203 -7.894922256469727 -7.109066963195801 -6.037189960479736 -6.409726619720459 -10.09978866577148 -14.47838592529297 -16.04736709594727
- -1.172796130180359 -0.1036691814661026 3.157508134841919 5.005873203277588 3.929879665374756 0.04579575732350349 -1.657067775726318 -2.327197313308716 -2.822494029998779 -3.302454471588135 -3.811484575271606 -3.67184042930603 -5.60439920425415 -3.971993923187256 -0.9259896278381348 1.074672222137451 2.243359565734863 5.628334999084473 5.614348411560059 2.671618938446045
- 3.512696743011475 1.096527457237244 -0.6281859874725342 -0.7485429644584656 0.5178734064102173 -0.3651645183563232 -0.7127798795700073 -2.345064878463745 -2.432967901229858 -2.26310658454895 -2.034166812896729 -2.083575248718262 -1.449461221694946 0.8295428156852722 -0.70797199010849 -1.382944107055664 1.025775074958801 3.812258243560791 3.899998426437378 2.459261178970337
- 2.429807424545288 3.187890529632568 5.378279209136963 6.000016212463379 4.466296195983887 2.91185998916626 0.9844428896903992 -1.477342844009399 -2.199348449707031 -2.298166513442993 -1.367229223251343 0.08722665905952454 -3.61474347114563 -6.213674545288086 -2.892201900482178 -1.260724186897278 -2.151336431503296 -1.416283965110779 -0.550739049911499 -0.00402315566316247
- 14.52378749847412 16.6730785369873 19.1119499206543 17.22778511047363 9.291229248046875 1.790346741676331 -3.118408203125 -3.548830032348633 -3.531383991241455 -1.608735203742981 4.218640804290771 7.31464147567749 3.481146574020386 1.081024765968323 -7.068146228790283 -16.28680038452148 -19.13638496398926 -16.59426689147949 -11.00821685791016 -12.81246280670166
- 3.692018508911133 5.628849506378174 7.832692623138428 11.53136348724365 13.04549980163574 8.675453186035156 2.028456687927246 -2.84373927116394 -5.490196704864502 -7.426167488098145 -8.206168174743652 -7.061071872711182 -4.723628520965576 -0.3768564462661743 3.87096118927002 -1.735897183418274 -2.740102529525757 0.1546860039234161 -5.976396560668945 -9.87975025177002
- 16.16242599487305 18.2116870880127 20.05804824829102 22.24453544616699 22.07296752929688 18.55509185791016 15.19608306884766 15.21150779724121 14.64852905273438 7.719002246856689 -1.769524931907654 -8.865024566650391 -15.03671550750732 -19.52850151062012 -21.77362823486328 -22.65321731567383 -20.66617584228516 -17.67313003540039 -20.46086311340332 -21.65310859680176
- 28.15493965148926 26.31645965576172 22.09249877929688 15.63876724243164 8.021668434143066 3.506574153900146 4.89709997177124 8.966142654418945 7.682575225830078 0.7692403793334961 -5.459128379821777 -10.63140773773193 -12.70171737670898 -14.02644157409668 -12.66135215759277 -12.88409805297852 -14.31961154937744 -14.34045124053955 -13.3057804107666 -15.71598052978516
- 20.48115348815918 23.84610366821289 23.25873565673828 17.72960090637207 8.124981880187988 -1.403685212135315 -6.072505950927734 -7.492461681365967 -9.476207733154297 -12.23296165466309 -13.57093715667725 -12.11631202697754 -10.83927917480469 -7.927901268005371 -0.5167157649993896 8.051298141479492 7.771177291870117 -2.611780643463135 -11.50110244750977 -13.50121021270752
- -9.201011657714844 -7.988215446472168 -5.149657726287842 -1.251887679100037 0.4118910431861877 -0.6776695847511292 -1.663016796112061 -2.084519624710083 -2.385931491851807 -1.912577152252197 -1.813396573066711 -2.126807451248169 2.982677459716797 6.587588310241699 8.439833641052246 6.018701076507568 5.55783224105835 3.078472852706909 2.011021137237549 1.166679859161377
- 0.08954151719808578 0.2202292382717133 3.421765804290771 6.276632308959961 4.703573703765869 2.273778915405273 -0.4053238928318024 -2.012648582458496 -3.465083122253418 -4.702807426452637 -2.802443265914917 -2.402425050735474 -2.552382707595825 -5.434629917144775 -5.399964332580566 -1.856257796287537 -4.965855598449707 1.25382399559021 7.27832555770874 10.48214626312256
- 11.18907260894775 11.73231315612793 11.04765605926514 12.22256374359131 15.83541488647461 18.46990585327148 19.01543426513672 18.75796508789062 18.2039794921875 12.02499866485596 0.6351144909858704 -7.118268966674805 -12.3120641708374 -16.5434627532959 -18.81189918518066 -16.49979400634766 -14.38820266723633 -19.86294937133789 -21.32654571533203 -22.27123069763184
- 13.02842807769775 10.86863994598389 7.294010162353516 5.918304920196533 5.722743511199951 5.950034141540527 5.150651454925537 3.129361391067505 -1.551511406898499 -7.276643753051758 -9.330766677856445 -9.050996780395508 -8.989059448242188 -5.652007102966309 3.008387565612793 1.174135446548462 -0.8717693090438843 -0.4941126704216003 -7.436751365661621 -10.59107112884521
- 10.80727195739746 11.62981033325195 13.01964092254639 15.56442642211914 16.35092544555664 11.84114265441895 5.384622573852539 0.1702777296304703 -3.451409816741943 -7.103994369506836 -8.973663330078125 -8.735379219055176 -7.914924144744873 -4.197132110595703 0.8146427273750305 -3.325746297836304 -5.976436614990234 -4.152822971343994 -12.45363903045654 -19.297607421875
- 14.72954273223877 16.08261108398438 14.17352676391602 11.88899421691895 7.473514080047607 1.529868960380554 -2.953817367553711 -5.173144817352295 -6.694506168365479 -8.938716888427734 -9.363166809082031 -8.236028671264648 -5.627835750579834 0.7493261098861694 -0.5223051905632019 -5.783594131469727 -3.531458139419556 1.223669767379761 -4.0694580078125 -6.957036018371582
- 16.72555541992188 15.26893901824951 11.5390625 8.025328636169434 1.746574878692627 -4.360284805297852 -7.747194290161133 -9.38283634185791 -9.792986869812012 -10.40388584136963 -10.06481838226318 -8.170990943908691 -5.678887844085693 -3.475198030471802 -3.164578676223755 0.7308672666549683 3.477402925491333 6.308117389678955 5.589455604553223 2.830361366271973
- 7.345042705535889 8.680426597595215 9.749619483947754 12.49200248718262 15.73318386077881 15.27023792266846 10.12906646728516 4.700282096862793 1.922553539276123 1.018091917037964 3.698895692825317 7.969869613647461 7.611150741577148 4.163828372955322 -2.567738056182861 -12.87359619140625 -21.41029930114746 -25.05918884277344 -22.71145629882812 -25.86196327209473
- 18.71936988830566 20.68647575378418 23.41899299621582 22.76237678527832 15.78819370269775 9.799668312072754 7.765241622924805 9.587062835693359 10.38189888000488 3.341527700424194 -4.944698333740234 -10.29120063781738 -14.14022159576416 -15.70387744903564 -13.80038070678711 -8.58829402923584 -16.18624687194824 -21.13409233093262 -20.62886810302734 -16.83290672302246
- 27.87442016601562 26.96112251281738 24.0582103729248 19.32543182373047 12.84800243377686 5.682741165161133 3.51162052154541 4.850452423095703 -1.909026265144348 -12.72551155090332 -15.08962535858154 -9.714102745056152 -3.31471586227417 -10.95889663696289 -11.41346836090088 -8.323419570922852 -7.359457015991211 -9.401535034179688 -15.79771423339844 -19.10453033447266
- 10.07621288299561 7.797087669372559 3.951492309570312 0.3331794142723083 -1.459578037261963 -5.277621746063232 -4.554242610931396 -3.164191961288452 1.188359260559082 2.639423847198486 3.018832921981812 2.21898365020752 1.448704242706299 -0.2560862004756927 -0.7721953988075256 -2.158268213272095 -3.343647003173828 -3.830219030380249 -4.08119535446167 -3.775028228759766
- 14.14085388183594 18.24298095703125 21.36625671386719 20.00353813171387 10.84364986419678 1.21229350566864 -4.475771427154541 -7.729876041412354 -9.343160629272461 -10.68409729003906 -11.19771862030029 -9.997315406799316 -7.551893711090088 -2.443511486053467 3.020612716674805 -0.6816856861114502 -1.046849370002747 -2.333725452423096 -9.136162757873535 -12.20838832855225
- 4.831536769866943 4.856345176696777 5.052229404449463 4.323375225067139 2.620728969573975 1.240252256393433 1.285614728927612 1.274769425392151 2.714488506317139 3.533999919891357 1.331077337265015 -1.702780246734619 -7.298985958099365 -2.362451791763306 -1.748149394989014 -2.798870086669922 -3.557214736938477 -3.920377492904663 -4.58315896987915 -5.092426776885986
- -8.770161628723145 -6.593889236450195 -2.424760103225708 2.594765424728394 5.37811803817749 2.913643598556519 0.1374624669551849 1.340630531311035 0.233826532959938 -0.5468482971191406 0.6904201507568359 4.214969635009766 6.88810396194458 5.09185266494751 0.9326309561729431 -0.2858251929283142 -1.985121726989746 -1.640618681907654 -3.88466477394104 -4.284529209136963
- 21.96732521057129 24.21925163269043 23.86867523193359 19.26315307617188 11.19740009307861 2.215265035629272 -3.387691259384155 -5.112757682800293 -7.165873050689697 -10.0352029800415 -11.95029830932617 -12.50530338287354 -13.10330200195312 -13.46958160400391 -11.35860157012939 -2.521730422973633 4.336183547973633 2.053223609924316 -5.4366135597229 -13.07352256774902
- 3.342934131622314 4.287295818328857 4.96614933013916 4.633366107940674 4.337628841400146 3.09008526802063 2.305321455001831 1.343788623809814 1.644765138626099 0.1375970840454102 -2.512146949768066 -7.56221866607666 -1.288949847221375 -2.610968828201294 -1.305450797080994 -0.7630775570869446 -2.601759910583496 -2.755043268203735 -4.275901794433594 -4.413410663604736
- 22.1788444519043 24.56454467773438 25.83176803588867 20.61639785766602 12.94971656799316 8.714364051818848 8.60114860534668 13.73898029327393 13.36184597015381 7.382289886474609 4.262598991394043 -3.105434656143188 -13.70510578155518 -19.30609130859375 -20.0294017791748 -19.6268482208252 -20.40436363220215 -21.70120429992676 -22.05267906188965 -22.2713737487793
- 17.08452606201172 18.63121795654297 17.28200340270996 10.18600940704346 0.9047264456748962 -5.769303321838379 -8.870579719543457 -9.263986587524414 -9.583680152893066 -9.771441459655762 -7.365384101867676 -2.126832962036133 4.993155479431152 4.14546537399292 3.043732881546021 0.4034484624862671 -4.596707820892334 -4.000100135803223 -4.001798152923584 -11.32447528839111
- 3.308281421661377 0.7628875374794006 -0.6617570519447327 -0.05335136130452156 2.597671747207642 6.354086399078369 8.23735523223877 8.332303047180176 6.223223209381104 5.031754493713379 8.093350410461426 9.925691604614258 2.418773174285889 -4.871974468231201 -9.15618896484375 -12.22183132171631 -11.66841697692871 -7.352973461151123 -6.765195369720459 -8.53369140625
- 13.52341556549072 14.92821788787842 16.83053779602051 19.57003211975098 19.61124801635742 14.55799102783203 9.966564178466797 8.374958992004395 9.971537590026855 12.65628528594971 9.050710678100586 4.956510066986084 2.693578958511353 -8.44794750213623 -19.81601333618164 -24.96413803100586 -25.53888130187988 -26.25833511352539 -25.2250804901123 -26.44122314453125
- 2.227933406829834 3.742212057113647 5.66429328918457 8.46546745300293 12.21207523345947 12.14280033111572 7.173071384429932 2.207161426544189 -0.3620262145996094 -0.1362887322902679 3.184273958206177 8.550507545471191 6.411488056182861 2.474506139755249 0.4528176784515381 -8.577210426330566 -15.63698959350586 -19.28199005126953 -16.41607284545898 -14.49803638458252
- 7.692607402801514 10.89262771606445 13.92684936523438 16.72857856750488 16.56256484985352 10.2755651473999 3.975806474685669 -0.8361673951148987 -3.162058591842651 -1.791858434677124 2.535933971405029 7.296338081359863 8.919187545776367 6.461850166320801 -4.072275638580322 -16.53657722473145 -22.56225204467773 -24.55673408508301 -20.20475006103516 -11.54522228240967
- 12.82986450195312 14.95521831512451 19.14453315734863 20.5372428894043 11.2462911605835 1.551305532455444 -5.443355560302734 -10.95425605773926 -15.02199935913086 -15.36999988555908 -15.22126388549805 -12.65652179718018 -7.642220020294189 0.1088813841342926 1.906976103782654 1.661651968955994 3.659494638442993 -1.161453127861023 0.3513465225696564 -4.481740951538086
- 2.498115301132202 2.269802093505859 5.42523717880249 8.504334449768066 5.693159580230713 1.334556221961975 -0.8337335586547852 0.5078381299972534 3.238528490066528 8.719211578369141 8.290030479431152 3.340613126754761 0.3521939814090729 -2.624809741973877 -3.853048801422119 -5.220168113708496 -7.487966060638428 -9.298221588134766 -9.22874641418457 -11.62692260742188
- 2.680857419967651 3.003198385238647 3.409420490264893 5.929980754852295 9.358918190002441 12.19396495819092 9.532551765441895 2.128130674362183 -4.209565162658691 -5.676620960235596 -5.773328304290771 -2.54345703125 6.447335720062256 8.718700408935547 3.022321462631226 -0.1908483952283859 -3.507422685623169 -13.78666210174561 -17.14689254760742 -13.590576171875
- -0.1238657087087631 -0.7467499971389771 -0.8606674075126648 0.9500460028648376 2.272556304931641 0.306546539068222 -1.757795810699463 -3.261495113372803 -5.63302755355835 -5.860240936279297 -1.687984704971313 5.435196399688721 5.633073806762695 2.441767454147339 3.242724180221558 2.501389026641846 0.7468942999839783 -2.209927558898926 -1.621481895446777 0.2330401837825775
- 22.27009773254395 20.58505058288574 19.32877922058105 19.19776725769043 16.04549217224121 11.43531513214111 8.545010566711426 5.04408597946167 0.08544245362281799 -3.480097770690918 -5.938987255096436 -8.133966445922852 -9.961761474609375 -13.2747974395752 -13.28524494171143 -11.297776222229 -5.769373893737793 -7.27945613861084 -20.25574493408203 -23.85982894897461
- 15.13276290893555 16.72235107421875 19.29923439025879 20.15243911743164 13.83577728271484 6.385299682617188 2.19368314743042 0.2870577275753021 -0.6039847731590271 0.6380589604377747 7.863599300384521 11.77124118804932 8.427032470703125 -0.9672374725341797 -14.1384916305542 -21.31941795349121 -23.57412338256836 -23.38068389892578 -19.86440086364746 -18.86019897460938
- 20.61358833312988 23.81437301635742 25.30980491638184 20.18338012695312 10.429856300354 1.001171350479126 -6.638706684112549 -12.31037044525146 -13.61087894439697 -14.84149646759033 -14.65114593505859 -12.03194427490234 -6.596310615539551 1.112412214279175 5.595176219940186 5.701927185058594 0.119323655962944 -9.245035171508789 -12.44776439666748 -11.50736236572266
- 20.02503967285156 22.21102714538574 26.78817176818848 28.51939010620117 22.7094554901123 19.15492057800293 19.01291084289551 10.40171527862549 -0.4550841450691223 -8.042952537536621 -13.44649314880371 -16.64340591430664 -18.4780158996582 -18.71750831604004 -18.29573631286621 -16.42117881774902 -13.69264221191406 -16.98819923400879 -12.51419353485107 -15.12720489501953
- 14.88516807556152 16.10471534729004 18.13610076904297 19.50263786315918 15.91295433044434 9.245290756225586 3.499725103378296 -1.481967806816101 -4.86527681350708 -6.488455772399902 -3.973629236221313 0.9033311009407043 1.895107626914978 -4.194590091705322 -7.035339832305908 -7.669322490692139 -13.8880672454834 -19.35153007507324 -17.51463890075684 -13.62220096588135
- 15.62930965423584 16.86459541320801 18.74105072021484 21.14679145812988 20.12394332885742 15.97838973999023 12.86601257324219 13.91710376739502 13.96356678009033 5.734773635864258 -2.778235673904419 -6.146415233612061 -6.230354785919189 -6.765965938568115 -14.22164535522461 -21.95081520080566 -25.08389282226562 -24.56394004821777 -23.0617790222168 -24.16248893737793
- 10.39857959747314 9.902873039245605 10.43587493896484 15.12217330932617 15.31923770904541 8.907997131347656 2.8302161693573 -0.4043548107147217 -3.749866724014282 -4.582551956176758 -0.7010706067085266 3.783650875091553 -2.94155740737915 -7.834283828735352 -6.707688331604004 -4.993249893188477 -13.40748691558838 -16.62495231628418 -8.052194595336914 -6.701350212097168
- 8.757573127746582 10.01415920257568 11.31327152252197 13.79831600189209 16.26449966430664 15.59647178649902 11.34064960479736 7.384111404418945 5.735970497131348 8.124849319458008 10.93261241912842 8.599547386169434 6.78111743927002 2.014044761657715 -11.55905818939209 -22.03640937805176 -27.67374420166016 -28.98818206787109 -25.71052360534668 -20.68927383422852
- 11.60599708557129 15.20479106903076 18.75311660766602 20.60714340209961 14.90422916412354 6.514626979827881 0.3688325881958008 -3.631831884384155 -5.889451503753662 -6.719012260437012 -5.461198329925537 -0.6609947085380554 4.922869682312012 -2.042565584182739 -9.40633487701416 -9.12317943572998 -3.453888654708862 -11.64505958557129 -17.42349052429199 -17.42458915710449
- 19.01464462280273 21.14679527282715 22.83805274963379 21.0030403137207 12.57469654083252 4.288835048675537 -3.159780263900757 -9.476808547973633 -11.30855751037598 -11.46416187286377 -9.432809829711914 -3.914461135864258 5.125019550323486 5.052341938018799 0.2600426375865936 -5.825098991394043 -7.427604198455811 -11.82730197906494 -18.64381980895996 -18.82307243347168
- 12.30899620056152 11.9555082321167 10.83330821990967 8.842498779296875 3.896013975143433 0.2282551527023315 -0.4788022935390472 -2.572926759719849 -3.632532835006714 -3.584671974182129 -3.35651683807373 -3.341462135314941 -3.818673849105835 -4.564336776733398 -0.5857362747192383 1.896973133087158 -2.874486446380615 -6.29917573928833 -7.014914512634277 -7.837318897247314
- 3.296769380569458 3.547193050384521 5.272069931030273 6.67866039276123 2.41662335395813 -2.836133003234863 -5.373547554016113 -6.121944427490234 -6.972627639770508 -7.586311817169189 -7.345023632049561 -6.884947776794434 -4.093441009521484 0.8166292905807495 0.9748799800872803 3.747726917266846 8.830391883850098 5.862343311309814 3.557900905609131 2.212787866592407
- -7.826388835906982 -7.62874174118042 -4.937259197235107 -0.8020728230476379 2.141714334487915 1.761100649833679 -0.7069389224052429 -3.700064659118652 -5.26003360748291 -4.515527725219727 -2.649164438247681 0.229227676987648 2.087120294570923 7.220807552337646 4.123185634613037 2.464181184768677 2.05262279510498 0.3679012060165405 3.867342948913574 11.7109842300415
- 10.97468948364258 10.96027565002441 12.10276317596436 14.61746311187744 15.65119647979736 11.7838306427002 6.285211563110352 3.373393774032593 3.948726892471313 6.970715045928955 5.968252658843994 -1.579415440559387 -7.268170833587646 -8.547689437866211 -5.455753326416016 -9.339248657226562 -17.88034057617188 -21.75579833984375 -16.23410034179688 -14.57599067687988
- -1.151786923408508 0.3562232255935669 4.105234622955322 4.6091628074646 1.121737599372864 -3.196008443832397 -4.702627658843994 -6.648385047912598 -7.236968040466309 -7.154190540313721 -6.574336051940918 -5.02200174331665 -1.13543164730072 -5.101800918579102 -2.871386528015137 2.9462571144104 3.081861972808838 7.378602981567383 15.5444860458374 11.65135955810547
- 11.34338188171387 11.19913387298584 12.50715827941895 15.84076881408691 17.10323143005371 12.29142570495605 6.988306522369385 4.413517951965332 5.027740478515625 8.428199768066406 8.23624324798584 1.152420997619629 -2.592719793319702 -3.07826042175293 -11.90985202789307 -20.47063827514648 -22.3043327331543 -18.75558471679688 -13.5499792098999 -21.8701286315918
- 9.078579902648926 9.186633110046387 9.339278221130371 10.55455684661865 12.47384452819824 12.83367919921875 9.073692321777344 3.734415054321289 -0.6726703643798828 -4.320102691650391 -6.029776096343994 -5.125953674316406 -1.246421217918396 1.966521739959717 -4.535735130310059 -9.616764068603516 -10.02407932281494 -6.061404228210449 -12.49483585357666 -18.11346244812012
- -2.280097246170044 -2.68834924697876 -3.311764240264893 3.520923376083374 10.89420032501221 4.839663028717041 -3.218804121017456 -3.714579820632935 0.2111168950796127 -0.06632798165082932 -1.835359334945679 1.055355668067932 4.26752758026123 4.854606151580811 0.6746150851249695 -1.810803651809692 -2.038526058197021 -2.780031204223633 -2.86063027381897 -3.712734699249268
- 15.6898775100708 14.25310516357422 12.00113677978516 8.265121459960938 2.769523859024048 -1.839638710021973 -4.366783618927002 -5.091458797454834 -5.524468898773193 -6.214487552642822 -6.849764823913574 -4.835565090179443 -1.781233191490173 -2.874162197113037 -5.832647800445557 -3.938868522644043 -2.314552545547485 -3.232621431350708 -1.063970565795898 2.781453609466553
- 20.71076965332031 17.25700569152832 13.16612339019775 8.311223030090332 2.24157977104187 -2.576900243759155 -5.553876876831055 -5.902385711669922 -5.546775341033936 -4.485719203948975 -2.10135293006897 -0.6028069853782654 -1.887004613876343 -2.969450950622559 -4.074849128723145 -5.083820819854736 -5.638541698455811 -3.910549879074097 -5.090580940246582 -6.262086868286133
- 31.8298454284668 28.44303131103516 22.73410987854004 17.41254043579102 11.26890087127686 3.803855180740356 -1.837916135787964 -5.268406391143799 -6.438517093658447 -3.545932769775391 0.05899094045162201 -4.288939952850342 -10.38533020019531 -11.67748832702637 -11.13669490814209 -10.58297443389893 -11.13157558441162 -12.50732326507568 -13.26161670684814 -13.48856925964355
- -4.754414081573486 -4.29445219039917 -3.168632984161377 0.1290164440870285 3.570644378662109 3.314040184020996 1.955246329307556 1.348280191421509 -0.8042680025100708 -2.629224300384521 -4.914752006530762 -2.001047611236572 5.124592781066895 6.069299697875977 0.1415419578552246 -3.626595497131348 1.771703362464905 3.683246374130249 -2.327579259872437 1.41335654258728
- 2.639788150787354 2.159015893936157 4.708622455596924 8.607648849487305 5.801329612731934 0.7648182511329651 -0.3380908071994781 -1.544275879859924 -4.542886257171631 -6.16004467010498 -2.698446750640869 0.9262956976890564 9.940608024597168 -0.7314932942390442 -2.589507102966309 2.756600618362427 -3.510427951812744 -5.458281993865967 -4.096356391906738 -6.634921550750732
- 16.85803985595703 17.09976005554199 17.47396850585938 18.36672401428223 17.34212684631348 13.70298385620117 9.851248741149902 7.641875743865967 8.03339672088623 7.617740631103516 2.199268817901611 -4.893833160400391 -11.72187900543213 -17.10725593566895 -18.81849098205566 -18.74653053283691 -15.40892887115479 -12.58003807067871 -16.79844856262207 -20.11173057556152
- 22.06707000732422 35.62493133544922 11.812819480896 6.424155712127686 7.10381031036377 -0.05969046056270599 -1.284817695617676 -2.963520526885986 -2.958014249801636 -4.077013969421387 -5.650639533996582 -6.130179405212402 -5.849739551544189 -5.752974987030029 -6.697713851928711 -7.910535335540771 -7.863702297210693 -8.072952270507812 -9.230849266052246 -8.530439376831055
- 11.97937107086182 12.09840774536133 12.05047702789307 13.27731323242188 14.60399723052979 13.96254253387451 9.541193008422852 4.33142614364624 0.5711573958396912 -2.765728235244751 -3.445377588272095 -0.4580845832824707 2.504267692565918 -3.52159857749939 -11.50433444976807 -14.44248008728027 -14.24422454833984 -9.923008918762207 -15.01983261108398 -19.59549331665039
- 14.88490581512451 14.43462181091309 13.64084434509277 13.18804931640625 13.96810245513916 15.41825389862061 14.65137481689453 14.75992298126221 14.53237533569336 8.346854209899902 -0.5528849363327026 -7.38205623626709 -12.75345230102539 -15.72228336334229 -17.83517646789551 -21.49028015136719 -24.21296119689941 -19.11733627319336 -11.10431289672852 -7.654553413391113
- 11.57993221282959 10.86910057067871 9.292579650878906 5.34028959274292 2.997883796691895 5.224020481109619 6.902576446533203 5.95371675491333 3.218202590942383 1.304577112197876 4.576533317565918 5.49297571182251 -1.158196091651917 -8.633240699768066 -11.69718551635742 -15.56486129760742 -11.68460178375244 -5.742196559906006 -8.887182235717773 -9.384926795959473
- -5.013375282287598 -1.957106828689575 3.936692714691162 7.770921230316162 7.280149459838867 4.715601921081543 1.489615082740784 0.7599493861198425 -0.2818634510040283 -0.6248555779457092 -1.59972870349884 -2.472980976104736 -4.103787899017334 0.1207979917526245 0.1578272730112076 -2.168327808380127 -2.566078424453735 0.3693423271179199 -1.567225098609924 -4.245570182800293
- 11.8250675201416 11.75462341308594 13.146484375 14.40010833740234 8.680706024169922 2.451049566268921 -2.276995182037354 -7.947771549224854 -10.78728294372559 -11.6722354888916 -10.47933006286621 -8.248405456542969 -2.564605236053467 4.413960456848145 1.477530360221863 2.645415782928467 0.5283230543136597 -4.487845897674561 -3.822267532348633 -9.036537170410156
- 8.18290901184082 8.990080833435059 10.58115482330322 15.59363746643066 18.85009002685547 11.41630840301514 3.00689435005188 -2.788646936416626 -4.043056488037109 -2.216956615447998 4.225522994995117 2.624749183654785 -6.408520221710205 -10.62216949462891 -10.82849788665771 -8.878623962402344 -5.606212615966797 -9.247514724731445 -9.171202659606934 -13.65995407104492
- 1.122125148773193 2.340639591217041 4.852828979492188 9.07249641418457 10.91962146759033 7.267090797424316 2.862101554870605 1.919704437255859 0.273803323507309 -2.294070482254028 -3.884986162185669 -5.235678672790527 -3.864643096923828 5.882376194000244 -1.578886032104492 -6.334455490112305 -5.514403343200684 -0.7279078364372253 -8.353438377380371 -8.724315643310547
- 17.14527130126953 20.26199722290039 23.17537879943848 24.0041675567627 18.14511871337891 11.01581954956055 8.574430465698242 10.4360818862915 12.49145889282227 5.829493999481201 -3.923637628555298 -10.94857788085938 -16.28080368041992 -18.94600868225098 -19.85500526428223 -17.23432922363281 -9.003313064575195 -16.8664608001709 -20.5401611328125 -17.48090934753418
- 10.55026245117188 9.129498481750488 6.626078128814697 4.33876371383667 4.654973030090332 8.004281044006348 10.71401214599609 10.78413486480713 10.3967866897583 11.53522109985352 8.377507209777832 0.4597346186637878 -7.171211719512939 -11.95686149597168 -14.46788787841797 -18.23646354675293 -19.71159172058105 -10.51286029815674 -6.559005260467529 -6.955362796783447
- 15.84598350524902 19.43674087524414 22.85293197631836 24.50748634338379 20.79323768615723 16.51449394226074 15.64095592498779 13.840989112854 5.013079643249512 -4.427651882171631 -10.018310546875 -14.97299289703369 -19.46054077148438 -21.31647872924805 -21.76855278015137 -20.36329650878906 -12.68413925170898 -10.14741516113281 -13.79270839691162 -5.493778228759766
- 13.94381904602051 16.43526268005371 18.66817283630371 21.15324783325195 20.96892738342285 16.19882202148438 11.53557300567627 11.19319820404053 11.63861274719238 5.517746925354004 -3.452783346176147 -10.59959888458252 -16.6658878326416 -20.53487396240234 -21.84101676940918 -23.30248641967773 -21.42453956604004 -13.75922393798828 -5.866023540496826 -9.806961059570312
- 5.420772075653076 3.181998491287231 0.9735147356987 0.5510501265525818 3.229780673980713 5.21458625793457 4.726947784423828 2.143694400787354 1.255003809928894 3.039951086044312 3.897990703582764 1.44657826423645 -1.896672368049622 -3.810643911361694 -4.312219619750977 -4.728193759918213 -5.456769466400146 -5.385796070098877 -4.902922630310059 -4.588656902313232
- 21.27044486999512 24.08491325378418 26.50861930847168 25.93334770202637 19.78920555114746 13.71450996398926 12.57365131378174 14.33030128479004 11.14276313781738 1.456703662872314 -7.919396877288818 -13.94567680358887 -17.9332389831543 -20.08360481262207 -20.28531074523926 -19.57321548461914 -19.44615745544434 -18.53407096862793 -16.06371307373047 -17.02007865905762
- -5.07229471206665 -2.673027276992798 0.1863208413124084 1.013860464096069 1.269213795661926 0.6856178045272827 -1.148736596107483 -1.975215315818787 -0.8282109498977661 0.2170413583517075 0.3902241885662079 1.803727626800537 1.366949439048767 1.99494194984436 1.425867795944214 -0.2583991587162018 -0.2421907484531403 -0.6433937549591064 2.033026218414307 0.4546787142753601
- 12.33667469024658 9.263205528259277 6.013627529144287 3.242619276046753 -2.04919958114624 -5.781479358673096 -7.16286039352417 -9.668787956237793 -9.240730285644531 -5.410822868347168 0.4398817718029022 4.0452561378479 5.102258682250977 5.437817573547363 4.034950256347656 1.557661890983582 -1.395820021629333 -1.710574626922607 -3.775616645812988 -5.278054237365723
- 4.00970458984375 4.243353366851807 4.418988704681396 5.687031269073486 2.622324466705322 -0.9186838269233704 -3.086290836334229 -4.4349684715271 -5.905517101287842 -6.297449111938477 -5.28984546661377 -3.434298753738403 1.549245238304138 8.161531448364258 6.771480083465576 3.789035320281982 0.8126276135444641 -2.69298243522644 -4.459996223449707 -5.545289516448975
- 16.34438896179199 18.4940299987793 20.55770683288574 21.24932479858398 16.44334411621094 9.492633819580078 4.141826152801514 0.9502881169319153 1.721351861953735 4.550103664398193 2.203536987304688 -5.914438247680664 -13.2753963470459 -17.82462692260742 -18.2209300994873 -16.58901596069336 -10.96980094909668 -8.35638427734375 -10.71623706817627 -14.2817211151123
- -1.768032431602478 0.1761233359575272 2.252463817596436 6.361618518829346 10.33906841278076 12.4231481552124 8.363289833068848 1.52364706993103 -2.29892373085022 -4.496731281280518 -4.185180187225342 -1.60689651966095 3.926949739456177 2.458340167999268 -2.319498538970947 -4.485013961791992 -5.137418270111084 -5.211325645446777 -7.696087837219238 -8.619550704956055
- 11.08488273620605 11.7852611541748 12.92747783660889 15.01494121551514 15.44369792938232 12.07398509979248 6.266739368438721 2.460949420928955 0.4702639281749725 1.07369339466095 4.758166313171387 4.984653472900391 -0.8855037689208984 -4.581241130828857 -4.824244499206543 -10.50354194641113 -17.17863082885742 -18.10089302062988 -13.49168872833252 -28.77894592285156
- 6.929741382598877 7.825069904327393 5.77735710144043 2.587711811065674 3.563386917114258 5.160883903503418 5.126599788665771 4.502707481384277 0.8351610898971558 -1.632234811782837 0.7420730590820312 0.12342369556427 3.517768383026123 3.057796478271484 1.368760228157043 -4.286410808563232 -10.46026706695557 -14.56558036804199 -12.81235122680664 -7.361606121063232
- 2.191778659820557 3.513268709182739 4.713126659393311 5.223500728607178 5.715236186981201 5.479634284973145 4.516466617584229 2.858439922332764 0.05186956375837326 -0.5694597363471985 -1.685080051422119 -2.039292573928833 -2.591443300247192 -2.490133047103882 -4.205042362213135 -4.566408157348633 -4.019378662109375 -2.816128969192505 -3.588330030441284 -5.692621231079102
- -2.097806930541992 -3.25182843208313 -3.114562511444092 -2.844318866729736 -3.859760999679565 -5.712578773498535 -5.040430545806885 -4.48835563659668 -3.653167009353638 -1.838237047195435 2.461645126342773 5.505383014678955 5.742931842803955 4.578234672546387 3.168388605117798 4.534303188323975 4.382081508636475 2.832297563552856 2.518158912658691 0.1776237934827805
- 17.4088077545166 18.31974411010742 18.854248046875 19.61898422241211 18.58040618896484 14.79512596130371 10.30733489990234 7.095895767211914 6.93044376373291 8.344578742980957 4.694713592529297 -2.594254493713379 -9.020417213439941 -12.33715724945068 -13.71531963348389 -17.76349449157715 -21.14961242675781 -23.54549789428711 -23.33137702941895 -21.49314498901367
- 8.481592178344727 10.91602802276611 12.62129783630371 14.31409645080566 13.91150188446045 9.004624366760254 1.920468211174011 -1.742034077644348 -4.080940723419189 -5.218583106994629 -4.190650939941406 0.4368254244327545 3.856915950775146 -2.976571083068848 -9.561041831970215 -11.80435657501221 -8.181826591491699 -4.906846523284912 -10.33259773254395 -12.46790504455566
- 25.5666389465332 23.68691635131836 18.78746032714844 14.111083984375 8.82848072052002 3.205553293228149 1.324411988258362 0.3318596482276917 -0.6595930457115173 -5.150588989257812 -9.499537467956543 -6.876737594604492 -1.765209674835205 -2.82733416557312 -5.068912982940674 -6.80744743347168 -8.437265396118164 -9.323757171630859 -17.57405662536621 -21.8519458770752
- 14.02389812469482 13.77211284637451 15.62245464324951 16.63031005859375 11.80296897888184 6.446163654327393 3.031527519226074 0.9142658114433289 1.641602277755737 4.214316368103027 5.046321392059326 0.665174663066864 -3.854398965835571 -4.954565048217773 -4.76600980758667 -6.274704933166504 -7.901957511901855 -14.74887180328369 -23.93405914306641 -27.37654113769531
- -6.13859224319458 -4.946783065795898 -4.029239654541016 -3.219005823135376 -3.006635189056396 -2.876469135284424 -2.764590978622437 -1.043931841850281 1.520820021629333 3.286266565322876 3.582094430923462 3.500922918319702 4.142548084259033 4.196081638336182 2.466428995132446 1.189210176467896 0.9860852956771851 1.069903969764709 1.366392016410828 0.7184919714927673
- -4.109463214874268 -2.632721424102783 0.5314706563949585 3.449937582015991 3.192186117172241 2.046949863433838 -0.009129852056503296 -0.1964436322450638 -0.8928117156028748 -1.009577989578247 -0.7628929018974304 0.2475123256444931 1.15898072719574 -3.243423461914062 -4.782504558563232 -4.64444637298584 0.468833863735199 3.766880989074707 4.878130912780762 2.542529344558716
- -1.647605180740356 0.2618206739425659 1.971102833747864 2.544361352920532 1.15186333656311 -0.515619695186615 -1.419001221656799 -1.687308788299561 -1.461441516876221 -1.687948703765869 -1.865533113479614 -1.773398280143738 -1.544569849967957 0.1818061619997025 1.935967922210693 4.564754962921143 5.86070442199707 3.613274812698364 -1.783733487129211 -6.699496746063232
- 8.218077659606934 8.36836051940918 8.590140342712402 10.91640377044678 15.26675605773926 18.74322509765625 15.39290714263916 13.29907131195068 14.50366878509521 6.068000793457031 -4.49066686630249 -11.37653541564941 -16.28762626647949 -18.28180313110352 -17.28350448608398 -15.40235328674316 -7.205194473266602 -8.288730621337891 -7.324810981750488 -13.42539215087891
- 11.73594188690186 13.70747852325439 15.48323154449463 17.94837760925293 15.59787464141846 8.011203765869141 1.407221436500549 -2.020777940750122 -4.604009628295898 -6.823038578033447 -7.378701210021973 -5.953355312347412 -1.263996362686157 3.535661458969116 -3.562870979309082 -9.09814453125 -8.555088043212891 -3.749105453491211 -12.97335243225098 -21.44452857971191
- 9.426523208618164 12.99773406982422 17.31319618225098 20.40255928039551 15.12877559661865 4.556667327880859 -2.404085159301758 -7.309301376342773 -8.954307556152344 -9.473834037780762 -8.94853687286377 -6.45704984664917 -1.346714019775391 2.424389839172363 -3.885556697845459 -7.15138578414917 -3.132001638412476 -3.133339166641235 -9.104418754577637 -10.94930267333984
- 6.961635112762451 9.523253440856934 16.73820114135742 17.71315002441406 7.020796775817871 1.930528044700623 -0.3522165417671204 -1.58617377281189 -0.9375661611557007 -1.061645269393921 -0.726159930229187 -3.672266960144043 -5.233458042144775 -4.923686981201172 -4.085436344146729 -5.767467975616455 -6.59648323059082 -5.657567024230957 -9.336575508117676 -9.950865745544434
- 0.4838113188743591 1.375690102577209 2.193771600723267 2.736467599868774 0.7269363403320312 -1.655763864517212 -3.619451761245728 -4.335795879364014 -3.308824777603149 0.1796272099018097 2.696713447570801 2.654937982559204 2.706673145294189 1.865849018096924 -0.1049886643886566 -0.4607899785041809 -0.8976724743843079 -0.124328076839447 -0.9268824458122253 -2.185978651046753
- -5.218797206878662 -4.889193534851074 -1.373051762580872 2.476942300796509 1.744365811347961 -1.049572944641113 -3.225939989089966 -4.171715259552002 -5.243880271911621 -5.251483917236328 -5.762197017669678 -6.042542457580566 -4.167647838592529 1.72130823135376 10.1200532913208 3.24189829826355 3.302833795547485 8.066161155700684 6.588317394256592 9.13414192199707
- 9.704636573791504 10.64715766906738 11.76275539398193 14.81031799316406 16.85883140563965 14.82177639007568 8.597762107849121 3.847447872161865 0.5471333265304565 -0.958280086517334 1.305961608886719 5.939559459686279 0.9206979274749756 -7.140867233276367 -11.61437606811523 -10.61985206604004 -9.407258033752441 -17.39714050292969 -22.14491081237793 -20.48134231567383
- 28.90131568908691 27.67374992370605 24.27939224243164 19.31695938110352 12.47010803222656 5.452095985412598 0.7062522172927856 -1.572138547897339 -4.616943359375 -6.630959987640381 -3.794699668884277 1.067591547966003 -3.109381914138794 -8.847738265991211 -11.87843418121338 -12.95088768005371 -14.31411266326904 -15.54751682281494 -17.58464431762695 -19.02000427246094
- 25.90213394165039 25.89734268188477 23.53892517089844 18.79122161865234 11.68747711181641 3.678178310394287 -3.660246610641479 -6.219344615936279 -5.166650295257568 -2.509670257568359 0.4824471473693848 -0.5207012891769409 -5.87305736541748 -7.691280841827393 -6.765379905700684 -5.783536434173584 -4.755335330963135 -19.76284599304199 -21.4870433807373 -19.78263664245605
- 5.902889728546143 5.59215784072876 6.002723693847656 7.333315372467041 10.82566165924072 13.96048450469971 12.58405113220215 8.752208709716797 6.233176708221436 6.918257236480713 9.634609222412109 5.873047828674316 0.4111865758895874 -1.698720812797546 -4.376388072967529 -13.30565643310547 -20.88594245910645 -22.87973976135254 -18.75935554504395 -18.11796951293945
- -6.514405727386475 -5.437079429626465 -3.264081001281738 1.27970564365387 3.962663412094116 2.271744728088379 1.02592146396637 1.945308685302734 1.613759875297546 -1.267844796180725 -1.518831253051758 -1.518889904022217 -4.672675132751465 0.8256152868270874 3.834310293197632 2.905214548110962 1.178243517875671 3.182616710662842 1.092018127441406 -0.9233121275901794
- 11.67148208618164 11.26891803741455 10.90925693511963 11.41635322570801 12.84046840667725 14.70354461669922 12.12472248077393 8.723217964172363 7.386577606201172 8.005328178405762 10.3506031036377 5.592259407043457 -1.296667814254761 -4.224706172943115 -7.555230140686035 -12.99310207366943 -20.50958251953125 -25.02577018737793 -25.92427062988281 -27.46341323852539
- 16.20952796936035 18.79202651977539 21.13847541809082 23.80237579345703 23.88206672668457 20.29559326171875 17.91850471496582 17.53240585327148 11.83515930175781 0.889728307723999 -8.05699634552002 -14.09476375579834 -18.38312339782715 -21.60922050476074 -22.66406440734863 -22.25393867492676 -20.40405082702637 -14.16322135925293 -15.660325050354 -15.00618553161621
- 1.332775831222534 4.540472030639648 5.744597434997559 5.158358573913574 5.250928401947021 3.684443473815918 -3.143379211425781 -2.028280258178711 -1.02878201007843 -0.3361429870128632 -1.116461873054504 -1.71676766872406 -4.126121520996094 0.8790532350540161 -0.7885099053382874 -2.913221836090088 -3.568353414535522 -2.063380718231201 -2.309557914733887 -1.451665759086609
- -1.293760061264038 -0.4718028008937836 1.60360324382782 4.362293720245361 3.793002605438232 1.713796615600586 0.8898845911026001 -0.3427882194519043 -1.766693472862244 -2.913138151168823 -4.84385871887207 -1.894249320030212 4.639877319335938 4.34099817276001 -1.607470631599426 -1.314101934432983 1.84531044960022 -0.4525135159492493 -2.935023069381714 -3.353369235992432
- -10.76155948638916 -9.117382049560547 -5.077114582061768 -1.805173516273499 -0.4236795008182526 -1.142552733421326 -1.660835027694702 -1.172795414924622 -0.1269660443067551 0.3222311437129974 1.678869962692261 0.8585785627365112 -0.96555095911026 4.772230625152588 4.167304515838623 1.308529019355774 2.200663089752197 5.060666084289551 6.064671516418457 5.819861888885498
- 22.57675933837891 22.41295623779297 21.89896965026855 20.12034034729004 14.67387199401855 7.715049266815186 2.484054803848267 -0.575508177280426 -4.107325077056885 -6.831031322479248 -6.633961200714111 -1.897298455238342 1.635537028312683 -4.862734794616699 -10.25027275085449 -10.8586483001709 -8.151853561401367 -14.33871650695801 -21.98727798461914 -23.02290916442871
- -9.34221076965332 -9.290777206420898 -7.660970687866211 -5.695330619812012 -4.999914646148682 -6.497367858886719 -7.056390285491943 -6.700881481170654 -5.362234115600586 -4.580047130584717 -3.109976530075073 -0.4361536800861359 2.412587642669678 5.234089374542236 6.659108638763428 5.803432941436768 7.357170581817627 10.88450813293457 14.32406616210938 18.05728530883789
- 20.44619560241699 22.33601951599121 22.63082504272461 19.35242652893066 11.46528911590576 3.117271184921265 -1.055151581764221 -1.79200267791748 -3.173611640930176 -4.100831985473633 -0.3322575390338898 4.949789047241211 -1.67628538608551 -9.806520462036133 -12.89304733276367 -11.95707416534424 -6.166247367858887 -10.784743309021 -19.66230201721191 -20.89774131774902
- 0.256197988986969 1.536613821983337 2.957437038421631 5.2234206199646 6.354453086853027 3.696042776107788 0.7037686109542847 -0.6300698518753052 -2.101612329483032 -4.444314002990723 -4.173471927642822 -1.491001605987549 5.151174068450928 9.585725784301758 5.665143966674805 -0.408844381570816 -3.492814302444458 -7.313898086547852 -8.801700592041016 -8.272249221801758
- 28.96685028076172 27.60278701782227 24.3299617767334 19.82255363464355 13.40191555023193 5.374635696411133 -0.2391291260719299 -1.643232464790344 -1.866767644882202 -6.27919864654541 -13.37139701843262 -11.61345100402832 -3.956285238265991 -2.976941108703613 -7.367682933807373 -9.043316841125488 -10.35547924041748 -12.04689884185791 -19.0933723449707 -19.64555740356445
- 7.8268141746521 7.661505699157715 7.500350475311279 8.078084945678711 9.425930023193359 11.5485782623291 12.26556968688965 9.966827392578125 6.851613998413086 4.498805522918701 4.676517486572266 7.766087055206299 5.541260719299316 -2.529203414916992 -8.679522514343262 -11.28592109680176 -13.17383480072021 -16.37701225280762 -23.27567672729492 -28.28676605224609
- 35.52833557128906 31.66068267822266 25.37701988220215 19.27362823486328 12.94277286529541 5.775343894958496 -0.7749545574188232 -5.389566421508789 -7.441998481750488 -8.394183158874512 -9.043607711791992 -9.8797607421875 -10.42886829376221 -10.22016716003418 -10.19195461273193 -10.66593074798584 -11.1938304901123 -11.67916965484619 -12.41997241973877 -12.83380603790283
- 22.54461669921875 23.32077026367188 21.75076866149902 18.91819000244141 13.03644943237305 6.55272102355957 1.854758501052856 -1.005697727203369 -3.922854423522949 -6.391634941101074 -9.368968963623047 -16.02129173278809 -20.49285507202148 -21.405029296875 -17.68970680236816 -6.272115707397461 3.27418327331543 2.227151155471802 -2.892533302307129 -8.016922950744629
- -1.016274571418762 1.836273312568665 4.510078430175781 6.521440505981445 5.49302864074707 1.954428195953369 -0.601430356502533 -2.199551105499268 -1.309728026390076 0.2738093733787537 0.4291742146015167 0.9877617359161377 4.564645290374756 4.814922332763672 0.9567139744758606 -4.246704578399658 -5.209033966064453 -4.465246677398682 -5.836385250091553 -7.457924842834473
- 19.69192504882812 22.09206962585449 23.80901336669922 21.19912910461426 12.23721408843994 4.72580623626709 -0.4148092567920685 -3.826264381408691 -3.63470196723938 -2.288662195205688 2.101486682891846 4.527408599853516 0.1444754898548126 -2.039730787277222 -2.929513931274414 -13.12440204620361 -19.56832885742188 -21.00856590270996 -20.53844261169434 -21.15511703491211
- 7.62865686416626 8.226352691650391 6.950485229492188 6.50428581237793 5.521165370941162 4.095008373260498 0.2109681814908981 -3.786160707473755 -0.3319760262966156 1.160059332847595 -1.997029066085815 -3.957691192626953 -1.659037828445435 -1.516908645629883 -3.160657167434692 -1.93512499332428 -4.271431922912598 -4.183150291442871 -6.317551612854004 -7.180263042449951
- 9.274513244628906 9.768712043762207 13.41430759429932 16.60546684265137 10.43594074249268 2.931338548660278 -2.13913369178772 -4.436796188354492 -4.64939546585083 -4.175276756286621 -0.09205605834722519 7.67596435546875 7.083322525024414 3.903372049331665 0.6201664805412292 -9.050173759460449 -12.46957492828369 -10.02309417724609 -13.13846302032471 -21.53913688659668
- 8.100369453430176 7.838342189788818 7.10407543182373 8.068931579589844 10.80666923522949 13.47452163696289 15.93661212921143 16.2795524597168 15.77183437347412 15.02822589874268 8.247328758239746 -1.597835183143616 -9.153887748718262 -15.06421279907227 -18.40178871154785 -18.89818572998047 -15.87324714660645 -11.77176666259766 -16.96852493286133 -18.9270133972168
- 15.89307117462158 13.94218635559082 11.84148120880127 8.804191589355469 3.204591035842896 -0.2878334522247314 -2.61271071434021 -4.027554035186768 -3.52007794380188 -3.780377864837646 -1.576756119728088 -4.247349262237549 -7.15900707244873 -8.766011238098145 -8.830037117004395 -7.552667617797852 -7.192822456359863 -4.331611156463623 1.414379119873047 8.784918785095215
- 13.37816429138184 14.83925342559814 19.17241096496582 21.42833518981934 16.64079475402832 9.404074668884277 5.096750259399414 5.844509124755859 10.50385761260986 14.80595207214355 11.81415271759033 7.29457950592041 -6.347949981689453 -17.87113380432129 -23.08801460266113 -24.85861587524414 -23.46842956542969 -18.6118106842041 -13.97248077392578 -22.00439262390137
- 5.809521675109863 4.499151706695557 1.726754665374756 1.496702432632446 3.043510437011719 2.410009860992432 2.647355318069458 4.942822933197021 3.320942878723145 0.1809196770191193 -3.598520040512085 -2.810449123382568 1.244809508323669 4.914441108703613 -1.919122815132141 -4.742350101470947 -2.798822402954102 -3.097017765045166 -8.562280654907227 -8.708371162414551
- -0.7433948516845703 0.6290790438652039 4.290616989135742 9.319417953491211 9.438047409057617 5.431394577026367 2.410978555679321 1.756274580955505 2.399199485778809 5.045031070709229 3.696019411087036 -0.5171908736228943 -4.493594646453857 -7.243680000305176 -7.094901084899902 -6.63560962677002 -8.511418342590332 -5.742341041564941 -1.905528664588928 -1.528403043746948
- 16.02640151977539 16.88601303100586 20.27311134338379 22.95177841186523 16.51199340820312 8.169997215270996 3.205844163894653 0.7203652858734131 2.32510232925415 6.823920249938965 3.088744878768921 -6.237605571746826 -12.3858585357666 -14.66896915435791 -11.41484642028809 -5.91987419128418 -13.8611364364624 -16.74186515808105 -16.20819854736328 -19.54491996765137
- 28.70901107788086 26.74901008605957 22.41019630432129 16.26782608032227 9.633708000183105 5.01160717010498 3.813749313354492 2.318852186203003 -1.775809526443481 -3.124970436096191 -4.951873302459717 -9.006095886230469 -10.96864891052246 -12.91622161865234 -11.37460136413574 -6.327468395233154 -3.874560117721558 -13.60419750213623 -18.35502052307129 -18.63449668884277
- 16.76492118835449 18.53962135314941 22.00734901428223 23.77195167541504 17.37566375732422 10.85693454742432 8.482762336730957 11.06650543212891 14.47068786621094 8.978681564331055 3.180291652679443 3.287941694259644 -4.277831554412842 -16.76885986328125 -22.19854736328125 -22.23225975036621 -22.40470123291016 -22.81134605407715 -23.5716381072998 -24.51812934875488
- 24.68488693237305 25.2512092590332 22.44723320007324 15.77536869049072 7.284281253814697 -0.3390955924987793 -5.155105590820312 -6.980916500091553 -8.144389152526855 -11.31495571136475 -11.14698791503906 -9.477306365966797 -6.634860992431641 1.133751630783081 5.708544731140137 0.7609378695487976 -7.239751815795898 -12.6716947555542 -12.63096141815186 -11.31018829345703
- 12.1938943862915 12.45997142791748 15.35780048370361 20.32815170288086 18.95355987548828 13.29246044158936 12.50092601776123 15.65379428863525 7.744460105895996 -2.879125833511353 -8.869330406188965 -11.96176815032959 -13.38275146484375 -12.10928630828857 -6.750946044921875 -9.434435844421387 -14.06286716461182 -9.809247970581055 -15.4976806640625 -23.72757911682129
- 18.14355087280273 19.00253677368164 19.98784637451172 15.79288959503174 6.609574317932129 -0.5279169082641602 -5.207690715789795 -5.706249237060547 -5.2888503074646 -3.929961204528809 0.2551923990249634 3.666478872299194 -1.617277145385742 -4.594314575195312 -0.8400980830192566 -7.191524505615234 -15.28251838684082 -13.91899013519287 -8.400474548339844 -10.95219898223877
- -1.209361672401428 1.382168173789978 5.119255542755127 6.187464714050293 4.921239852905273 4.045382976531982 3.307084083557129 3.897459268569946 3.699335813522339 2.850033283233643 3.133702516555786 3.574357748031616 0.3321199715137482 -1.261278033256531 -3.536951541900635 -5.573594093322754 -7.333509922027588 -6.612568378448486 -8.03129768371582 -8.891047477722168
- 21.25825500488281 23.65346336364746 24.47770881652832 21.03482437133789 12.90108871459961 4.998486042022705 2.169271469116211 2.674301147460938 5.845990180969238 5.495700359344482 -2.556919813156128 -9.905426979064941 -14.95088195800781 -17.64135932922363 -18.43180465698242 -17.7553825378418 -14.19757556915283 -11.65029335021973 -9.392925262451172 -8.026556968688965
- 10.57416915893555 6.940167427062988 3.377308368682861 0.1674692034721375 -4.456944465637207 -7.959919452667236 -9.466750144958496 -10.31172180175781 -10.32407283782959 -9.972018241882324 -8.43491268157959 -4.619442462921143 -1.032624959945679 0.3527268767356873 4.959675788879395 8.442365646362305 7.155454635620117 10.09233951568604 8.988237380981445 5.528491020202637
- -7.303966522216797 -6.072146892547607 0.03037638403475285 4.888665676116943 2.882314920425415 -0.3495607674121857 -1.423956632614136 -1.117535471916199 -3.287755012512207 -5.638257026672363 -1.321971535682678 4.593060493469238 0.6953179836273193 -4.267212390899658 -3.024996280670166 2.733240604400635 -1.291894435882568 0.7963177561759949 6.687963485717773 11.79199314117432
- 19.57700347900391 19.22323036193848 17.8361759185791 14.8910026550293 10.03314304351807 5.288291454315186 3.868746519088745 4.305737972259521 6.140094757080078 6.750828266143799 3.403490543365479 -0.7690652012825012 -4.462819576263428 -7.740454196929932 -12.09807968139648 -15.74795341491699 -16.49748039245605 -16.40741920471191 -16.36639785766602 -21.22806930541992
- -13.60956954956055 -13.43655014038086 -10.68354797363281 -7.816117763519287 -7.257256031036377 -8.560713768005371 -10.12047863006592 -9.742441177368164 -8.897125244140625 -8.331297874450684 -4.778324127197266 0.1313253492116928 4.923659324645996 8.689200401306152 10.71094989776611 15.27718544006348 16.82255744934082 16.99509239196777 16.23367691040039 13.44978141784668
- 2.998192071914673 5.060214996337891 9.128397941589355 11.72884654998779 7.501063346862793 3.049983501434326 -0.2290438711643219 -2.830741405487061 -4.030549049377441 -5.998746395111084 -6.492287635803223 -5.973284244537354 -1.747057318687439 -0.04092250764369965 -1.939504861831665 -4.568539142608643 -1.428504586219788 -3.250531911849976 -1.501166105270386 0.5641858577728271
- -9.875384330749512 -8.996847152709961 -7.259862422943115 -5.099687099456787 -4.747788429260254 -5.377129554748535 -4.533528327941895 -2.740194320678711 -1.019506692886353 0.2546121776103973 2.611207485198975 4.471316814422607 5.004693984985352 4.662132263183594 5.580606937408447 5.569987297058105 5.934168815612793 5.616549968719482 6.005987167358398 3.938658475875854
- 6.324036121368408 5.534636497497559 6.871768951416016 11.52741050720215 12.75160026550293 7.741029739379883 3.503966093063354 0.5145781636238098 -0.2266563773155212 0.4568825960159302 6.004167556762695 7.255617618560791 0.2812454402446747 -2.467282295227051 -2.955026865005493 -2.348532676696777 -7.746325016021729 -9.635989189147949 -15.20050239562988 -28.18662261962891
- 3.269198417663574 4.329102516174316 3.63520336151123 4.240509033203125 2.643314599990845 1.306932687759399 0.5871008038520813 0.01858275942504406 -3.445292234420776 0.2536954283714294 2.62947940826416 0.453508198261261 0.2572880387306213 -2.218570470809937 -2.030983448028564 -2.472489833831787 -1.544004678726196 -1.770274639129639 -3.215528964996338 -6.926770687103271
- 24.28678512573242 20.96181106567383 16.37893295288086 11.63182163238525 6.46122932434082 1.640398621559143 -0.6090925335884094 -0.8962091207504272 -0.9581948518753052 -0.6643978357315063 -0.7903278470039368 -2.765601634979248 -5.320699214935303 -7.348938465118408 -7.670615673065186 -8.164978981018066 -9.409834861755371 -11.03562641143799 -12.33566665649414 -13.39078426361084
- 17.44244956970215 12.6025390625 6.476651668548584 2.572973251342773 0.07880938798189163 -1.494240760803223 -1.026918292045593 0.05849277228116989 0.5748964548110962 2.224634647369385 0.9260033965110779 -0.9737981557846069 -2.529262065887451 -4.725411415100098 -5.308783531188965 -5.208952903747559 -5.336541175842285 -5.965589046478271 -5.326721668243408 -5.061234474182129
- 9.055865287780762 8.884231567382812 10.20116806030273 15.56664085388184 19.45423889160156 13.64838886260986 7.375551700592041 5.846075057983398 8.041905403137207 12.47882080078125 9.985394477844238 6.33833646774292 4.154695987701416 -9.475737571716309 -18.78720474243164 -22.48675346374512 -20.38532829284668 -14.83318042755127 -18.28673934936523 -26.77635955810547
- 19.13214874267578 15.08913326263428 6.245914459228516 1.684667944908142 -2.593921661376953 -3.631608963012695 -4.6460862159729 -4.676587104797363 -4.376307010650635 -3.846136331558228 -3.359805107116699 -1.947200417518616 -0.7491039037704468 -0.9314246773719788 -1.021931529045105 -1.608303189277649 -1.11945641040802 -1.422060251235962 -2.57276463508606 -3.649176836013794
- -0.8554011583328247 0.01535670552402735 2.490541458129883 3.42849326133728 1.061878800392151 -1.813973426818848 -2.927071809768677 -4.505068302154541 -5.312741756439209 -6.198869228363037 -6.950813770294189 -2.745384454727173 6.032547950744629 3.116117477416992 -1.126639127731323 3.105453968048096 2.409670114517212 0.641316294670105 4.751763820648193 5.38281774520874
- 12.43925189971924 12.14298343658447 13.70097923278809 17.80710220336914 17.88127326965332 11.7794303894043 7.265505790710449 6.8924241065979 10.65805530548096 8.542099952697754 -1.237858533859253 -6.518909931182861 -8.609734535217285 -7.908468723297119 -6.340353488922119 -11.20984840393066 -14.85240650177002 -14.19177913665771 -21.24096298217773 -26.99876594543457
- 23.45121192932129 22.68519020080566 22.15351676940918 16.3964786529541 9.885462760925293 9.428561210632324 7.929757118225098 -5.295900344848633 -7.287815093994141 -6.190315723419189 -2.851263999938965 -1.912238717079163 -4.807369232177734 -3.605723142623901 3.066253900527954 0.3395583927631378 -16.53752326965332 -21.54922294616699 -20.96185684204102 -24.33675384521484
- 33.77143478393555 28.77348709106445 22.14700317382812 16.84343338012695 10.51287364959717 3.082031488418579 -2.772854804992676 -6.841246128082275 -8.5224609375 -8.851617813110352 -8.034506797790527 -4.58641529083252 -3.406130075454712 -7.006688594818115 -9.190608978271484 -9.06142520904541 -9.784893035888672 -11.42448425292969 -12.47732830047607 -13.16959762573242
- 4.425622940063477 5.459275722503662 5.645858287811279 6.871219635009766 6.816186428070068 4.309556484222412 2.105921268463135 1.583795070648193 0.2403468489646912 -0.8186249732971191 -0.475554883480072 1.799342036247253 1.35185444355011 -1.574759602546692 -3.126091241836548 -2.931037425994873 -4.274541854858398 -7.028286457061768 -8.702722549438477 -11.67736625671387
- 12.38517475128174 14.56315517425537 18.42501640319824 18.26544189453125 8.050895690917969 0.3629726469516754 -4.455294132232666 -6.819499969482422 -8.02800178527832 -8.136819839477539 -5.520301342010498 1.332758903503418 6.101493835449219 -1.145743131637573 -1.988560676574707 0.2712494730949402 -7.173962593078613 -8.100958824157715 -8.120369911193848 -20.26863098144531
- 13.23258495330811 14.43017864227295 17.6368236541748 20.34798431396484 15.51551151275635 7.98248291015625 3.920857667922974 2.722862720489502 4.856165409088135 9.656986236572266 8.020086288452148 3.274206876754761 1.099612355232239 -7.756321430206299 -14.47027206420898 -16.03600883483887 -14.80824565887451 -17.98133277893066 -24.48733329772949 -27.15681838989258
- 10.00753974914551 9.453824996948242 9.669445991516113 10.54615497589111 11.17346286773682 12.14949893951416 10.9928503036499 7.247820854187012 1.246783375740051 -4.546037673950195 -6.751821994781494 -7.538656234741211 -7.913768768310547 -5.880470275878906 -3.478797197341919 -5.813286304473877 -8.640678405761719 -9.01876163482666 -10.51074314117432 -12.39435768127441
- 13.41866111755371 12.95781326293945 14.06664562225342 16.35210418701172 17.40312004089355 16.2164478302002 14.19972705841064 10.60995674133301 4.731914520263672 -0.9379525780677795 -5.641208171844482 -9.150605201721191 -10.46435642242432 -10.43190383911133 -8.466348648071289 -7.95847225189209 -13.20952796936035 -21.08566665649414 -18.33942604064941 -14.27093315124512
- 10.05934429168701 10.14851951599121 11.85326862335205 16.17757225036621 16.12358283996582 9.054707527160645 1.976132750511169 -1.013263702392578 -3.108107805252075 -4.151781558990479 -0.6483354568481445 7.060160636901855 3.349245309829712 -3.173089981079102 -3.364842176437378 -4.28009033203125 -13.98790836334229 -18.64199066162109 -16.24434661865234 -17.18877983093262
- 14.16552066802979 16.79090118408203 19.07204627990723 19.25079345703125 13.39351367950439 5.549007892608643 -0.1253228634595871 -5.0051589012146 -6.942836284637451 -7.847989082336426 -7.06005859375 -2.986793041229248 3.983493328094482 5.623464107513428 2.900903701782227 -6.678395748138428 -16.7363338470459 -19.5196704864502 -16.10754013061523 -11.7195405960083
- 10.13781261444092 7.938575744628906 6.437095165252686 4.467501640319824 0.5077049136161804 -2.692654371261597 -5.074657917022705 -5.295346736907959 -6.35460901260376 -4.61092472076416 -0.264788806438446 2.69492244720459 0.1478714197874069 -3.632023334503174 -4.382040023803711 -3.492551803588867 -3.24286937713623 -1.711934328079224 2.209748983383179 6.213161945343018
- 2.057488679885864 3.72131872177124 7.908454895019531 11.76238822937012 10.78023338317871 7.873641014099121 5.909515857696533 3.327877044677734 1.41585898399353 -1.367973566055298 -3.643851280212402 -2.785484552383423 -1.257898569107056 -4.318547248840332 -5.67584228515625 -6.277145862579346 -6.429201602935791 -7.490517616271973 -8.424822807312012 -7.085493087768555
- 7.820384502410889 10.26064205169678 12.71585273742676 15.51255893707275 16.45561218261719 12.41169452667236 6.263260364532471 2.430400609970093 1.652305245399475 3.500654220581055 7.109420299530029 1.926035761833191 -7.15310001373291 -12.63532257080078 -14.97638130187988 -11.57130146026611 -5.502624034881592 -13.57993698120117 -18.28493881225586 -14.35521697998047
- 1.54519259929657 0.6455914378166199 1.130767107009888 3.020956754684448 7.271472454071045 8.955120086669922 8.167258262634277 4.944859981536865 2.918270349502563 4.133959293365479 8.64280891418457 4.413627624511719 -3.077182769775391 -5.508891582489014 -2.826085805892944 -1.797946929931641 -7.302445411682129 -9.750840187072754 -9.437262535095215 -16.08923149108887
- 4.742734909057617 4.582306861877441 5.318164825439453 4.916128158569336 3.035914897918701 0.8362451791763306 0.644989013671875 0.6589030027389526 0.9749945998191833 0.6436808705329895 -0.7589300870895386 -0.07376500219106674 -0.6987859010696411 -1.686697721481323 -3.857694387435913 -3.223940134048462 -2.982022762298584 -5.557400226593018 -3.43154501914978 -4.083280086517334
- 17.28988647460938 19.64286422729492 23.01824951171875 25.35204887390137 21.07189750671387 15.74672794342041 14.5294075012207 11.94213485717773 3.267378091812134 -6.753466606140137 -12.9169750213623 -17.29338645935059 -20.19407653808594 -20.9992561340332 -20.75796699523926 -20.98210906982422 -17.32324028015137 -6.989824295043945 -0.938843846321106 -6.711450099945068
- -7.405002117156982 -6.63621711730957 -5.119040489196777 -1.162852644920349 0.4995702505111694 0.2100710719823837 -1.180066823959351 -1.163569569587708 -0.4376775920391083 -1.852619051933289 -0.4564747214317322 1.148225903511047 6.407271385192871 3.180431365966797 1.355106592178345 1.219310641288757 0.8625170588493347 3.981961965560913 4.656658172607422 1.892392635345459
- -3.590446710586548 -3.353392839431763 -3.226964235305786 -2.259954452514648 -2.231477975845337 -2.566890001296997 -3.83813214302063 -3.984575986862183 -2.819719076156616 -2.430130243301392 -2.946921586990356 -0.3914734125137329 2.281153678894043 4.415081024169922 4.060555458068848 5.467803955078125 7.041676998138428 6.639510631561279 3.931572437286377 -0.1972776055335999
- 22.25151252746582 22.33121871948242 19.61933517456055 14.41214084625244 6.373692035675049 -2.562642812728882 -8.079279899597168 -10.45693778991699 -11.46908855438232 -12.5139102935791 -12.6769962310791 -11.84523582458496 -11.13391017913818 -8.746359825134277 -6.000263690948486 -0.9988529682159424 1.019225597381592 1.755787253379822 4.937151908874512 3.783427476882935
- 12.95260810852051 14.53674030303955 15.61411285400391 17.62470817565918 16.29912567138672 10.77538204193115 4.80446195602417 -0.3277279138565063 -2.880457878112793 -3.404256820678711 -0.7713425159454346 2.83541464805603 -2.578746318817139 -10.90081691741943 -14.56606388092041 -13.50789356231689 -7.632486820220947 -11.03356838226318 -15.46594715118408 -12.37324047088623
- 22.99762153625488 22.39748191833496 20.37690162658691 14.76454162597656 7.125988483428955 3.390379667282104 3.458976745605469 5.378371715545654 0.7713942527770996 -5.258638381958008 -9.207550048828125 -10.89459133148193 -11.36552143096924 -11.22277641296387 -9.833528518676758 -9.501014709472656 -10.30780124664307 -8.845525741577148 -7.249639511108398 -6.975067615509033
- 13.84787750244141 15.7175931930542 17.50483894348145 19.84147453308105 18.8011531829834 13.04101657867432 7.530145168304443 3.875656366348267 2.221766471862793 3.678050518035889 8.451436996459961 9.786053657531738 7.524314403533936 0.2494767010211945 -14.43461513519287 -23.53226280212402 -26.45499992370605 -26.53988265991211 -25.81037521362305 -25.2987174987793
- 14.26181793212891 15.01669216156006 16.73629379272461 20.87573051452637 21.24555587768555 14.78086280822754 10.10431003570557 9.993119239807129 13.58131122589111 6.923305988311768 -4.2493896484375 -10.31592178344727 -14.37813472747803 -15.54409217834473 -12.65233135223389 -9.27055549621582 -17.35264015197754 -21.07265853881836 -16.86798858642578 -21.81527900695801
- -6.701730251312256 -6.423609733581543 -5.063463687896729 -3.075657367706299 -2.159016370773315 -3.141475677490234 -3.714672803878784 -2.327291965484619 -1.513632416725159 -2.370358943939209 -3.681196212768555 -3.985078096389771 -2.353027105331421 4.192892551422119 2.026463270187378 1.374962210655212 4.116894721984863 10.67783832550049 10.28569221496582 13.83546257019043
- 19.48781204223633 21.24834060668945 25.726318359375 26.79023933410645 19.5052661895752 14.94903659820557 16.14799499511719 12.56389713287354 1.256492614746094 -7.453189373016357 -13.13076496124268 -16.61943244934082 -18.1139087677002 -18.03603363037109 -13.4610595703125 -7.199068069458008 -13.86595821380615 -13.67895412445068 -16.15209007263184 -19.96494483947754
- 7.247554302215576 8.33905029296875 9.486268043518066 11.4226188659668 14.50669574737549 15.68746852874756 12.76148700714111 9.342776298522949 9.199343681335449 10.15981769561768 4.807382583618164 -3.574278593063354 -10.69182014465332 -15.21487140655518 -17.11676406860352 -13.65310859680176 -6.910757541656494 -16.70827293395996 -18.30534362792969 -10.78525257110596
- 19.14772033691406 21.59174728393555 24.05929374694824 21.3127269744873 12.89314746856689 4.167294025421143 -2.102882623672485 -6.323522567749023 -7.398536682128906 -6.703073024749756 -2.85664701461792 2.544823408126831 -4.055274486541748 -12.41448020935059 -15.04971790313721 -13.84373378753662 -6.27100133895874 -9.492775917053223 -9.887845993041992 -9.317259788513184
- 26.41968536376953 27.0235481262207 26.0343189239502 20.88638496398926 13.91330432891846 9.138555526733398 8.043726921081543 8.41940975189209 3.39354395866394 -5.950228214263916 -12.00013160705566 -15.41503620147705 -16.60493087768555 -16.50509834289551 -12.8128719329834 -7.158292770385742 -8.021406173706055 -11.21308612823486 -17.88352394104004 -19.70788764953613
- 10.56875133514404 9.655482292175293 4.223331928253174 0.7909567356109619 -0.4405189454555511 -2.849485874176025 -4.903106689453125 -5.652542114257812 -5.761168956756592 -7.115509033203125 -6.522299766540527 -6.316676616668701 -2.391098737716675 0.715168297290802 -1.13979434967041 -0.5824928879737854 0.7493327856063843 2.430058479309082 4.630113124847412 9.911500930786133
- 15.78400325775146 16.23406219482422 19.18672561645508 20.00784683227539 13.85215187072754 6.369851589202881 1.944249391555786 -2.078444242477417 -10.75318241119385 -16.79421043395996 -15.73612976074219 -11.85544490814209 -5.196184635162354 1.752044081687927 -2.497430562973022 -6.221963882446289 -4.478374004364014 -6.537206649780273 -4.950833797454834 -8.031515121459961
- 22.88135528564453 22.09592437744141 20.8078727722168 13.6090726852417 4.595454692840576 -0.72449791431427 3.414735555648804 7.479996681213379 7.168763637542725 0.1997841149568558 -6.418004035949707 -9.228799819946289 -9.804014205932617 -7.249096870422363 0.1684483736753464 -3.810968399047852 -17.22014427185059 -18.71464920043945 -16.33136558532715 -12.91985607147217
- 4.989173889160156 2.360268831253052 0.4501810073852539 -0.7491955161094666 -2.538476228713989 -3.425108194351196 -4.350328922271729 -4.323370933532715 -3.835586547851562 -3.945193529129028 -2.699645042419434 -0.9040977358818054 -1.544869422912598 -2.718829870223999 -2.965738534927368 -0.8955147266387939 0.4472894668579102 5.198237419128418 8.607419013977051 12.84339141845703
- 16.12025260925293 17.63321304321289 21.4428539276123 24.34177398681641 16.9606761932373 8.84307861328125 6.738799571990967 10.01789283752441 11.35753726959229 0.3357406854629517 -9.06071949005127 -14.43208312988281 -17.59659385681152 -18.28078079223633 -14.80839729309082 -7.358630180358887 -9.821417808532715 -9.654747009277344 -12.67974185943604 -20.09868431091309
- -9.211740493774414 -8.87540340423584 -6.297139167785645 -3.247445344924927 -4.456758499145508 -5.464083194732666 -4.820130348205566 -2.262447118759155 2.475754499435425 9.864048004150391 11.28189754486084 7.739889144897461 3.522980451583862 1.257933139801025 2.171902179718018 1.554603695869446 0.2394822686910629 1.348282098770142 2.236604928970337 0.9417739510536194
- 22.59792709350586 22.23996353149414 20.93175888061523 15.17020511627197 6.236386299133301 -0.8764825463294983 -5.056914329528809 -6.203244209289551 -6.453927993774414 -5.877345561981201 -1.569867014884949 1.154849648475647 -6.127275466918945 -10.36573314666748 -9.736984252929688 -5.781574726104736 -8.737113952636719 -9.527509689331055 -7.009016990661621 -5.008105278015137
- 16.95464324951172 16.0569953918457 17.12229156494141 15.73456573486328 10.31270503997803 5.433484077453613 3.938912153244019 5.185332775115967 7.57879114151001 2.28395676612854 -5.735975742340088 -9.219627380371094 -11.62969207763672 -10.39375686645508 -6.960520267486572 -7.592714309692383 -10.21255683898926 -13.8248405456543 -13.26231670379639 -11.76964664459229
- 12.28885078430176 13.31100368499756 17.00658416748047 18.69374465942383 10.71056365966797 2.877930402755737 -1.967705011367798 -4.204086780548096 -4.696738719940186 -3.976315021514893 1.850314974784851 5.742563724517822 -2.43388032913208 -5.893528938293457 -2.637853860855103 -3.53376293182373 -10.49744033813477 -9.290708541870117 -11.66168212890625 -21.6878604888916
- 16.32644462585449 17.39614677429199 20.53213310241699 19.96866989135742 11.49829483032227 4.482291221618652 0.3640915751457214 -1.303813815116882 -0.8305099010467529 2.432171106338501 7.311874389648438 0.5549811720848083 -6.532717227935791 -8.626335144042969 -5.209945678710938 -7.723212718963623 -15.12660789489746 -15.98785591125488 -16.77809715270996 -22.74800872802734
- 36.26478958129883 29.16506958007812 18.88672637939453 11.29608726501465 4.25379467010498 -0.445648580789566 -3.325072526931763 -3.86842155456543 -4.627791404724121 -5.308796405792236 -6.112049102783203 -6.154624462127686 -6.960426330566406 -7.687922954559326 -7.803619384765625 -8.489947319030762 -9.088846206665039 -9.471495628356934 -10.03959655761719 -10.48222541809082
- 5.780822277069092 4.729944705963135 5.420453071594238 9.377270698547363 11.10299682617188 7.595249652862549 2.372618436813354 -0.3598511219024658 -2.176183462142944 -3.469889163970947 1.770817637443542 8.367834091186523 0.2412943243980408 -4.547429084777832 -4.491291999816895 -3.55483865737915 -9.05653190612793 -10.83175468444824 -8.612157821655273 -9.659374237060547
- 16.41555023193359 14.10188293457031 11.62247753143311 9.257728576660156 4.841358661651611 1.543326258659363 -1.545565128326416 -3.703099250793457 -4.978522300720215 -4.204208374023438 -1.368051648139954 2.156086206436157 2.162181854248047 -0.8789411783218384 -2.9700608253479 -4.858625411987305 -6.423192024230957 -8.652698516845703 -11.15371227264404 -11.36390399932861
- 16.10409545898438 17.92288208007812 21.83524513244629 22.52743339538574 14.43243217468262 6.848017692565918 3.221755981445312 2.279388904571533 3.802780389785767 9.888998985290527 12.63655948638916 9.522839546203613 2.566931247711182 -11.69426918029785 -19.76411437988281 -22.3358097076416 -22.23702812194824 -21.64353942871094 -21.32683372497559 -24.58775901794434
- 10.72166538238525 10.90416812896729 10.53556442260742 12.80475902557373 14.52211761474609 11.32664489746094 5.512959003448486 2.059190988540649 -0.9984778165817261 -2.616565704345703 0.8497801423072815 5.827003002166748 -0.7128457427024841 -7.924247264862061 -11.35591983795166 -14.3775691986084 -15.52609634399414 -7.991408824920654 -8.317806243896484 -15.24291801452637
- 19.64011383056641 20.09951591491699 3.73078727722168 4.298727035522461 3.901035308837891 1.736476540565491 -0.1971252858638763 -1.806933879852295 -1.589736938476562 -1.590380311012268 -3.101474523544312 -4.023970603942871 -2.120734691619873 -3.070114850997925 -5.017482280731201 -4.891379356384277 -4.810243129730225 -5.123622417449951 -8.227829933166504 -7.835626125335693
- 8.733895301818848 7.966941356658936 8.619454383850098 12.11435413360596 17.36251449584961 16.79151916503906 12.56485176086426 13.53887844085693 11.6723051071167 0.9210886359214783 -7.735207557678223 -12.13870239257812 -15.31115818023682 -15.37791728973389 -11.02734851837158 -5.627762794494629 -8.130962371826172 -7.171896934509277 -8.675792694091797 -19.08905982971191
- 13.74830913543701 14.03474998474121 16.81496047973633 19.97044944763184 13.72278308868408 5.233769416809082 -0.4247041046619415 -5.009110450744629 -8.885136604309082 -10.67052936553955 -9.199058532714844 -4.386091709136963 3.549043416976929 -0.7413970828056335 -4.454002380371094 -2.738729238510132 -9.688662528991699 -14.24010944366455 -7.356659889221191 -9.279876708984375
- 20.83841705322266 23.37444305419922 21.96332168579102 14.0463285446167 4.707098007202148 -3.454752922058105 -7.031973361968994 -8.247625350952148 -8.021733283996582 -8.446310043334961 -6.74375581741333 -1.701759934425354 5.688807964324951 6.658039569854736 4.332261562347412 -5.951213836669922 -13.42262840270996 -12.22700500488281 -11.32407569885254 -15.0358829498291
- 7.207045555114746 6.176064968109131 5.345635414123535 7.618152618408203 10.25305652618408 11.62214756011963 8.760963439941406 5.212853908538818 2.73217248916626 2.664905309677124 5.942745208740234 4.149530410766602 -4.500996589660645 -10.13909816741943 -9.937795639038086 -9.813549041748047 -17.44272422790527 -11.63266563415527 -4.419963359832764 -9.798478126525879
- 16.05946159362793 17.4783821105957 21.23090553283691 23.64727210998535 19.62251663208008 16.5314826965332 16.1394214630127 8.627650260925293 -0.1975974142551422 -7.240071296691895 -12.49001026153564 -14.75961399078369 -15.51878929138184 -13.46572113037109 -7.01030158996582 -12.02378559112549 -13.263671875 -7.646562099456787 -15.89719390869141 -19.82374572753906
- 14.98097801208496 15.5669641494751 17.67537498474121 20.85232543945312 17.22256088256836 9.611412048339844 4.912789344787598 4.019162654876709 7.113863468170166 9.847255706787109 1.316589593887329 -6.184567928314209 -10.87567520141602 -11.27708911895752 -7.885459899902344 -13.08677673339844 -21.08088684082031 -20.78436470031738 -14.12562656402588 -17.81882095336914
- 24.70122909545898 21.52716827392578 20.18359756469727 15.67780303955078 8.116883277893066 5.965303421020508 7.824417591094971 8.531929016113281 -4.015629768371582 -9.77031421661377 -3.555948257446289 -4.037703037261963 -8.993593215942383 -8.89934253692627 -2.862210035324097 1.763970971107483 -15.08697319030762 -20.0122127532959 -20.03493309020996 -17.02342796325684
- 11.51157474517822 11.33275032043457 12.48272800445557 16.49664115905762 20.78080940246582 17.92484092712402 13.26130962371826 14.8084602355957 13.74868202209473 2.481383800506592 -6.05708122253418 -11.60165977478027 -15.57636070251465 -16.86976051330566 -14.53013515472412 -10.75713539123535 -16.85516548156738 -20.02822494506836 -12.50354862213135 -10.05010509490967
- 13.43461418151855 14.33900547027588 17.07033538818359 19.74283218383789 14.37437534332275 5.228202819824219 -0.7103554010391235 -4.28042459487915 -7.09163761138916 -7.408814907073975 -2.964175701141357 2.376692771911621 -3.480540990829468 -10.35213851928711 -9.717494010925293 -5.586410522460938 -6.802725791931152 -8.403306007385254 -6.616281032562256 -13.1517448425293
- 9.963135719299316 9.340554237365723 10.65275192260742 14.79289531707764 19.56935691833496 17.04957962036133 11.05484771728516 12.18426990509033 15.92981815338135 5.628086566925049 -3.488591194152832 -7.927986621856689 -10.63529014587402 -9.420705795288086 -7.041135311126709 -15.3204927444458 -19.33856964111328 -16.25669479370117 -12.8823938369751 -23.85343933105469
- 22.06594848632812 24.1613883972168 23.23174858093262 14.79627227783203 4.655078411102295 -0.9209227561950684 2.34649920463562 7.607211112976074 4.634677886962891 -4.511134624481201 -9.675531387329102 -13.88466930389404 -15.12217140197754 -12.5805721282959 -3.860899209976196 -2.127594470977783 -2.984724760055542 -7.038827419281006 -14.30890274047852 -16.48287200927734
- 9.838269233703613 7.411069869995117 5.207682609558105 4.320160388946533 3.407595872879028 2.323895931243896 1.179081916809082 0.3448304831981659 -1.869332432746887 -1.541472196578979 -1.186288595199585 -1.98955512046814 -2.880399942398071 -2.99422287940979 -2.861319303512573 -2.746136426925659 -3.60328197479248 -4.409862041473389 -4.106838226318359 -3.843872547149658
- 16.57100868225098 16.7503776550293 19.52754402160645 19.92691421508789 12.71861267089844 5.590298652648926 1.350907921791077 -1.353148341178894 -2.131840944290161 -0.2975033521652222 4.883733749389648 0.3517743945121765 -7.934087753295898 -11.32361793518066 -9.469447135925293 -5.700685024261475 -15.65244483947754 -19.0988597869873 -16.45174217224121 -8.257791519165039
- 10.3472375869751 9.582415580749512 13.51676559448242 13.12163162231445 3.850957870483398 -1.172455310821533 -0.9376927614212036 0.4330868721008301 5.778407573699951 5.62817907333374 1.32157027721405 -1.832874774932861 -4.590438842773438 -5.001556873321533 -0.2184758931398392 -3.016781091690063 -8.313580513000488 -9.928302764892578 -14.60472679138184 -13.96335887908936
- 10.6744556427002 9.223483085632324 7.286635875701904 6.623978614807129 7.8115553855896 9.858303070068359 10.06727981567383 8.143356323242188 4.965957641601562 1.093035340309143 2.540902376174927 5.567163467407227 1.563134908676147 -7.483416080474854 -12.57964515686035 -13.34443378448486 -10.27435111999512 -9.547389984130859 -15.1450834274292 -17.04491996765137
- 22.61507225036621 22.19220352172852 20.78857231140137 17.87928771972656 12.97425174713135 7.441983699798584 3.015723466873169 -0.7323780059814453 -3.833522319793701 -5.40011739730835 -5.188457489013672 -2.586252450942993 -3.092840671539307 -8.979012489318848 -12.45120716094971 -14.02441310882568 -14.09079933166504 -10.26203632354736 -12.12062644958496 -14.14542770385742
- 20.0369815826416 21.88425064086914 22.59913444519043 16.26919937133789 5.765384197235107 -2.596404552459717 -6.921975135803223 -7.7259202003479 -8.513130187988281 -9.156466484069824 -7.832399368286133 -2.006499767303467 4.400502681732178 -3.357564926147461 -7.072220325469971 -3.132044792175293 -5.308005809783936 -9.698538780212402 -8.158881187438965 -9.47538948059082
- 24.7900562286377 24.57070159912109 22.47764778137207 15.59422969818115 5.557416439056396 -0.8392100930213928 -3.255009174346924 -2.43094801902771 2.518007516860962 1.311827421188354 -4.551904678344727 -7.921079158782959 -9.127832412719727 -7.31419038772583 -4.248980522155762 -9.331894874572754 -10.90885066986084 -9.801833152770996 -12.27042675018311 -14.81773281097412
- 19.06133079528809 18.92216873168945 17.74175834655762 13.92116832733154 6.478623390197754 -0.1854871809482574 -4.166169166564941 -6.711711883544922 -8.350668907165527 -11.22728061676025 -12.57486915588379 -11.55605030059814 -10.069899559021 -4.730217456817627 1.977546453475952 1.628638982772827 0.5441478490829468 -1.782336592674255 -4.968446731567383 -3.952256441116333
- -8.781754493713379 -6.759359359741211 -2.638554811477661 1.034084558486938 1.047808289527893 -1.047583699226379 -1.839722275733948 -1.76888370513916 -1.470815420150757 -3.207891941070557 -3.524168729782104 -0.7099326848983765 6.27788257598877 1.46797239780426 -2.931539535522461 -0.8624012470245361 4.868256568908691 0.4229905307292938 7.099373817443848 13.32423877716064
- -5.042667865753174 -3.386234998703003 -0.7758886218070984 3.584923028945923 4.317422389984131 0.7304357290267944 -3.478339195251465 -5.022218227386475 -6.705511093139648 -5.960153102874756 -3.308512449264526 1.907798409461975 9.045369148254395 11.85012817382812 4.949860095977783 2.548784494400024 0.1815174371004105 -0.3121159374713898 -3.081512928009033 -2.043085336685181
- -10.00387477874756 -8.376090049743652 -5.489814281463623 -2.673295497894287 -2.706565618515015 -4.76490306854248 -6.262611389160156 -6.1615891456604 -6.334480285644531 -7.062235355377197 -5.906555652618408 -3.624308109283447 0.3987578749656677 2.333470821380615 5.59135913848877 11.14741516113281 13.07797622680664 14.15965270996094 12.96971893310547 9.687982559204102
- -8.870566368103027 -7.033083915710449 -3.011588096618652 -2.033329963684082 -4.182293891906738 -5.991842269897461 -7.221319198608398 -7.11468505859375 -6.198483467102051 -1.445847749710083 4.332780838012695 5.920451164245605 1.791638135910034 -0.9192991852760315 -0.6911481022834778 2.258736848831177 4.750698566436768 9.587289810180664 13.54182052612305 12.53007125854492
- 20.79511642456055 23.35627174377441 24.30972671508789 17.90277862548828 7.48461389541626 -1.146560668945312 -7.041982173919678 -9.264655113220215 -10.66538238525391 -11.62015533447266 -11.51129245758057 -9.146036148071289 -4.666460514068604 2.427054405212402 -4.869124412536621 -6.552189826965332 -2.362501859664917 -5.024530410766602 -5.366015911102295 -7.038678169250488
- 14.0546178817749 13.9150915145874 14.14274883270264 13.53974151611328 9.619218826293945 5.328763484954834 1.850947737693787 -0.3509775102138519 -1.30689525604248 -1.373533129692078 1.655947208404541 3.027402639389038 -1.076544284820557 -5.540617942810059 -8.736478805541992 -9.839535713195801 -10.05195426940918 -12.88014316558838 -14.11404037475586 -11.86374855041504
- 6.266130924224854 7.286652088165283 8.275715827941895 7.255132675170898 2.327090978622437 -1.601768732070923 -3.234281778335571 -3.222900390625 -2.022616863250732 1.56577479839325 6.710108280181885 7.885100841522217 3.162348508834839 -0.6525370478630066 -2.645117282867432 -4.06615686416626 -5.738631725311279 -6.695847034454346 -8.843130111694336 -12.01107025146484
- 6.828343868255615 4.459591388702393 1.198031544685364 0.7824835181236267 0.01672930084168911 -0.1440626829862595 0.5611345767974854 1.389024496078491 1.641718983650208 3.19788646697998 7.521622180938721 6.554508686065674 2.642773628234863 -2.729480504989624 -5.040643692016602 -5.397490978240967 -5.645934581756592 -3.751798868179321 -7.952482223510742 -6.131951332092285
- 17.15304946899414 19.70195388793945 22.30288124084473 21.63157653808594 14.24821472167969 6.653785228729248 2.391925811767578 1.300657868385315 3.07582950592041 7.480111598968506 7.815942287445068 1.615616321563721 -0.09025578945875168 -1.579151034355164 -13.20334815979004 -20.13413619995117 -22.47246360778809 -21.20928001403809 -21.59443473815918 -25.08847618103027
- -0.2766841053962708 0.7652203440666199 3.130171060562134 7.014883518218994 7.574380874633789 3.860817909240723 1.275616645812988 0.5127306580543518 1.21248996257782 3.044691562652588 7.53275203704834 11.51608180999756 8.558302879333496 2.306163549423218 -4.646841049194336 -8.152456283569336 -9.874943733215332 -10.85867118835449 -11.62216091156006 -12.87253570556641
- 14.58757877349854 13.4433126449585 12.19839763641357 12.26298236846924 10.49035739898682 8.284884452819824 4.338857173919678 0.5772092938423157 -0.6892585158348083 -1.634074330329895 -0.3921059668064117 4.99318265914917 6.218422889709473 2.682348251342773 -2.457679748535156 -10.93043041229248 -17.28855323791504 -20.13235282897949 -17.7656307220459 -18.78745079040527
- -10.75904750823975 -10.34540748596191 -8.902874946594238 -7.04743766784668 -6.985999584197998 -8.331351280212402 -9.549447059631348 -9.20896053314209 -8.697383880615234 -8.456084251403809 -6.940177440643311 -3.590844869613647 0.9863254427909851 4.681756019592285 6.73741340637207 9.360860824584961 15.0661153793335 18.28639030456543 22.07860374450684 21.61755752563477
- -1.287543177604675 20.19104194641113 27.22828483581543 11.4342565536499 3.150161266326904 8.620709419250488 0.8991665244102478 -4.53799295425415 -0.4792215824127197 -4.391318798065186 -2.672147989273071 -4.932036399841309 -1.928362369537354 -2.832908391952515 -5.563168525695801 -5.543959617614746 -7.598354339599609 -8.501565933227539 -10.36492729187012 -10.89010524749756
- 28.71035003662109 22.4637393951416 13.87556266784668 7.381300449371338 2.60440468788147 0.1322620958089828 -1.652303576469421 -2.636790752410889 -3.067835569381714 -3.635971784591675 -4.209535598754883 -4.394295215606689 -5.017501354217529 -5.634757995605469 -6.221107482910156 -6.841684818267822 -6.968877792358398 -7.241861343383789 -8.560672760009766 -9.084414482116699
- 16.99798393249512 17.5201587677002 19.34952163696289 22.57324409484863 23.11054229736328 20.02192115783691 18.4974365234375 17.20974731445312 8.773975372314453 -1.464429020881653 -8.23919677734375 -12.56816387176514 -15.0216588973999 -15.69274139404297 -13.91776084899902 -13.68856430053711 -19.48722267150879 -22.30436134338379 -20.97488975524902 -20.69553184509277
- 27.11906242370605 26.69607734680176 21.31425476074219 15.05877876281738 6.812201499938965 -2.963446140289307 -5.781047821044922 0.01076712924987078 5.3713059425354 0.1437889188528061 -7.663357257843018 -4.606181621551514 -2.860592365264893 -1.989763140678406 2.831855773925781 -0.9180324673652649 -15.58075714111328 -20.32701873779297 -20.75848579406738 -21.90942764282227
- 3.131580114364624 4.151116847991943 7.434891223907471 14.36890983581543 10.43841648101807 2.083693265914917 -1.160747885704041 -1.785005331039429 -1.059820532798767 -0.8607094883918762 -0.582769513130188 -1.723235487937927 -3.144015312194824 -3.714138031005859 -4.502712726593018 -4.210123538970947 -4.773705005645752 -1.485553860664368 -4.113268375396729 -8.492809295654297
- 1.142902374267578 0.2453206330537796 0.8132816553115845 1.077951431274414 0.2023733705282211 -0.2459586560726166 -0.9695939421653748 -0.2864019870758057 -0.4226151704788208 -1.076228737831116 -1.368513584136963 -0.8243883848190308 0.3282999694347382 -0.7071506977081299 2.188615798950195 0.8555563688278198 -0.2733390927314758 -0.6857246160507202 -2.218570232391357 2.224181652069092
- -4.687366008758545 -3.961490154266357 -2.036029577255249 -1.066571831703186 -1.939400196075439 -4.03884744644165 -5.074076652526855 -4.675766468048096 -3.516644716262817 -0.926347017288208 2.730309009552002 7.084615707397461 9.38873291015625 9.869900703430176 6.729549407958984 2.096508026123047 -0.7032226324081421 -0.9217782020568848 -2.307338714599609 -2.044742584228516
- 11.4772310256958 14.14109706878662 16.4000244140625 19.60442733764648 18.33625030517578 10.7554178237915 4.582533359527588 0.4301901161670685 -1.55649197101593 -1.721121788024902 0.7484422326087952 6.665191173553467 9.090088844299316 5.951194286346436 -3.117987155914307 -15.76199531555176 -23.76863288879395 -25.61515808105469 -22.60769271850586 -24.03303146362305
- -9.588109970092773 -7.642099380493164 -3.05499267578125 0.8280278444290161 1.806826829910278 0.3249257504940033 -1.142592549324036 1.319003462791443 3.241925239562988 2.882942676544189 2.059044361114502 1.878607869148254 1.825798511505127 3.239100933074951 1.754096031188965 -0.5881785750389099 -1.347134113311768 1.969451427459717 0.5703395009040833 -0.3369859158992767
- 12.66843318939209 10.89885520935059 8.914315223693848 8.688826560974121 7.515252113342285 6.08191967010498 3.942771434783936 0.8813322782516479 0.1250016242265701 2.141575574874878 1.048773884773254 -1.684188961982727 -4.577215194702148 -5.879157066345215 -5.310585498809814 -7.62126350402832 -8.172539710998535 -9.055081367492676 -9.540971755981445 -11.06605529785156
- 14.38044357299805 16.05905532836914 18.22954559326172 20.40789794921875 17.77795791625977 10.21966075897217 4.592190265655518 1.079554915428162 -0.6842128038406372 -0.04784240201115608 4.629171848297119 4.429327487945557 -3.822072744369507 -9.87629508972168 -12.38427352905273 -10.87876892089844 -13.48275279998779 -19.87479400634766 -20.19206809997559 -20.56173133850098
- 6.231515884399414 6.763469219207764 7.120380401611328 8.545663833618164 11.11819839477539 14.47330570220947 16.16985893249512 15.21030807495117 14.09131622314453 14.76974773406982 10.56958389282227 0.7008793950080872 -6.040367603302002 -11.09020519256592 -12.95589542388916 -11.16558742523193 -14.11951065063477 -21.47142028808594 -24.59536933898926 -24.32587623596191
- -1.399533629417419 -2.759334802627563 -1.206623673439026 2.628692150115967 6.057358264923096 5.514919757843018 4.017879009246826 3.717763900756836 1.340534090995789 0.4898809194564819 3.70012378692627 6.209922790527344 6.258806705474854 1.218298554420471 -0.7110701203346252 -0.6941475868225098 -7.32550573348999 -10.32217979431152 -8.729896545410156 -8.005890846252441
- -1.364186406135559 0.6892449259757996 2.111026048660278 2.881333351135254 2.59060263633728 1.091035604476929 0.8035702109336853 0.8664032816886902 1.760137796401978 2.011093378067017 1.090478301048279 0.6154927015304565 -0.3025144636631012 -0.01897144503891468 -0.5883193612098694 -1.117183089256287 -2.287424564361572 -2.428406238555908 -3.735827922821045 -4.667580127716064
- 20.36409759521484 17.32998275756836 11.80078315734863 5.576584815979004 0.8480595350265503 -1.597505927085876 -2.543995141983032 -1.69214129447937 -0.8085401654243469 -0.5264999270439148 -1.4205482006073 -3.235416650772095 -3.984282255172729 -3.856939554214478 -3.221519470214844 -4.666608810424805 -5.838024139404297 -5.908698081970215 -8.023261070251465 -8.595511436462402
- 16.18913459777832 17.06760025024414 20.63652610778809 22.2095890045166 16.08213233947754 9.59947681427002 6.996028900146484 10.29943943023682 10.80450630187988 1.22305703163147 -7.348905086517334 -11.50436687469482 -13.15321826934814 -12.35775375366211 -7.259929180145264 -13.12864780426025 -18.68785095214844 -16.23081398010254 -10.97327899932861 -20.46272468566895
- 21.30654335021973 19.6473388671875 16.74763488769531 10.71519088745117 1.520034909248352 -1.734574675559998 1.145763278007507 3.737959623336792 3.766458034515381 -0.1733606904745102 -3.032854557037354 -3.319661140441895 -4.079640865325928 -1.864676475524902 1.188229441642761 -1.161325573921204 -8.75430965423584 -13.42594337463379 -19.23901748657227 -22.98978805541992
- 11.30935382843018 11.17526054382324 11.35609149932861 13.02991199493408 15.93793869018555 17.72149658203125 14.10339260101318 11.81316184997559 13.56808185577393 14.03435325622559 5.160505294799805 -2.227959156036377 -4.986024379730225 -4.943968296051025 -9.246584892272949 -18.56520462036133 -24.83685111999512 -26.05096435546875 -22.70619201660156 -25.64580917358398
- 17.83202171325684 20.10625839233398 22.41818809509277 16.9942455291748 7.129134178161621 0.8414992690086365 -2.375513792037964 -2.780144214630127 -1.09681224822998 3.245035171508789 9.03863525390625 7.081283092498779 3.617681264877319 -1.524614214897156 -9.938373565673828 -11.42700386047363 -13.37421226501465 -18.84647560119629 -21.83783149719238 -25.1030158996582
- 18.22967720031738 16.94033622741699 16.67654609680176 15.64188575744629 12.75177764892578 9.681244850158691 6.748854637145996 2.111249446868896 -0.9165295958518982 -4.03234338760376 -6.80380916595459 -4.37997579574585 -2.689070701599121 -0.6527182459831238 -1.392222285270691 -6.700642108917236 -13.7589635848999 -16.76444053649902 -18.93343925476074 -21.75741958618164
- 10.93580722808838 10.86438083648682 11.08986282348633 12.94742012023926 14.59217834472656 13.39250564575195 9.137676239013672 4.842693328857422 0.5263168811798096 -3.264991760253906 -4.740993022918701 -2.70852255821228 0.8826950192451477 1.499852299690247 -4.863853931427002 -8.882965087890625 -8.598028182983398 -10.94161319732666 -19.99942588806152 -26.71098899841309
- 10.01206684112549 9.365582466125488 8.482909202575684 8.349141120910645 9.704506874084473 12.20029926300049 11.63984107971191 8.315208435058594 3.680938005447388 -0.0171410758048296 -1.145117163658142 2.165038108825684 4.500191211700439 -1.831978321075439 -7.96696949005127 -9.694586753845215 -10.75667762756348 -16.64505004882812 -21.10502815246582 -19.2531623840332
- -4.796628475189209 -4.921994209289551 -0.4119044244289398 4.893801689147949 7.154260635375977 5.382511138916016 1.61054003238678 0.1038698554039001 1.121608138084412 1.418224215507507 1.764253973960876 -0.561644971370697 0.3406071960926056 0.630460262298584 -3.516857862472534 -2.70116138458252 -5.228322505950928 1.573094367980957 -3.322217464447021 -0.5325049161911011
- 7.903432846069336 7.235350608825684 7.972126007080078 12.60205459594727 16.63029861450195 11.10814094543457 1.690403342247009 -3.981684446334839 -7.746416568756104 -8.574784278869629 -6.819003105163574 -0.5224794745445251 3.180744647979736 -4.070266723632812 -6.312726020812988 -5.026178359985352 -3.13036322593689 -6.768670558929443 -5.226391792297363 -10.14357852935791
- 21.68161773681641 22.41369438171387 22.62211990356445 16.99417495727539 8.209881782531738 3.175555229187012 4.759945392608643 9.09013557434082 7.943402290344238 -2.082306385040283 -8.931857109069824 -11.48226642608643 -12.59692096710205 -10.90591716766357 -4.027942180633545 -2.747084856033325 -6.435141563415527 -16.4090747833252 -21.74642181396484 -19.52561187744141
- -6.173064708709717 -5.96327543258667 -3.528045177459717 -0.3217867910861969 0.3633228242397308 -0.6122471690177917 -0.1745707094669342 1.680195212364197 1.112641215324402 0.3470962941646576 1.041796803474426 0.9683806896209717 0.7797499895095825 -1.420798778533936 -1.712903261184692 1.571486592292786 0.6065927743911743 0.701576292514801 2.839795112609863 7.894057750701904
- -8.597162246704102 -7.984790802001953 -5.985772609710693 -2.301552534103394 -0.8695802092552185 -2.926555156707764 -2.002375841140747 0.8874312043190002 4.681686401367188 9.215790748596191 10.62390995025635 10.0728120803833 7.823439121246338 4.98911190032959 1.718626737594604 1.186076521873474 -1.911845803260803 -5.02608585357666 -6.099943161010742 -7.49322509765625
- -11.03237056732178 -9.77393913269043 -6.086191177368164 -2.263701200485229 -1.132107377052307 -2.090561628341675 -3.159245014190674 -1.787237405776978 -2.234658241271973 -2.219777584075928 -0.3450060784816742 1.882188200950623 5.150389671325684 2.117553949356079 1.246603846549988 3.462316036224365 4.104862213134766 5.533912181854248 7.81689453125 10.81007194519043
- 20.06258392333984 20.52496910095215 19.70958709716797 13.23114490509033 3.873177289962769 -3.501782417297363 -7.625485420227051 -9.193585395812988 -9.619814872741699 -10.10238075256348 -8.03574275970459 -3.638236284255981 -1.561076641082764 -6.777949810028076 -8.744353294372559 -5.159697532653809 -4.548657894134521 -4.305416584014893 1.765290260314941 3.647428512573242
- -12.62337303161621 -10.77267169952393 -6.713631629943848 -2.356719493865967 -0.9545043706893921 -1.314618349075317 -1.204311609268188 0.9519127607345581 2.529060125350952 3.738895654678345 3.543590068817139 3.480704307556152 3.770825386047363 3.900096416473389 2.935614585876465 3.731853485107422 2.773390293121338 1.36874794960022 1.86901843547821 1.346112608909607
- 4.859148979187012 5.375709056854248 6.929606437683105 9.178874969482422 12.43757247924805 15.39855480194092 16.32788467407227 15.39450454711914 14.55756664276123 10.45544242858887 1.292600035667419 -6.265548706054688 -10.38967323303223 -13.38938808441162 -12.95211219787598 -8.890670776367188 -11.38747406005859 -18.68959045410156 -16.29861831665039 -13.9443883895874
- 15.77815341949463 18.25551414489746 22.3198356628418 21.42018890380859 11.7012882232666 3.024410963058472 -1.752663969993591 -3.756941318511963 -4.067193984985352 -3.439844846725464 1.261776924133301 9.334712028503418 6.984341144561768 4.010790824890137 -7.639993667602539 -16.15771102905273 -17.59549903869629 -14.57194137573242 -20.85239601135254 -24.25683212280273
- -11.05942916870117 -10.00147533416748 -7.447062492370605 -5.632204532623291 -5.473527908325195 -7.793481349945068 -8.01336669921875 -6.400827884674072 -4.194078922271729 0.3109219372272491 6.442381858825684 10.91819858551025 12.22136497497559 11.84522342681885 8.797990798950195 6.20741605758667 3.313423871994019 3.266344547271729 1.671919465065002 1.020260572433472
- 8.519640922546387 8.289227485656738 8.995603561401367 8.742317199707031 4.436429977416992 0.6413780450820923 -3.61502742767334 -6.392239093780518 -7.133174896240234 -4.442526817321777 0.1373001486063004 5.341552734375 7.185813903808594 0.8366307020187378 -0.4659213125705719 -4.405711650848389 -7.075875759124756 -7.335079193115234 -4.504730701446533 -7.755612373352051
- 18.84737586975098 20.82525444030762 25.05878639221191 27.53649711608887 21.91413116455078 18.37550354003906 16.05982971191406 7.565887928009033 -2.314254999160767 -9.414538383483887 -14.84871006011963 -17.89739799499512 -19.03853416442871 -19.49631309509277 -18.20376014709473 -14.88103485107422 -7.449466705322266 -5.842984676361084 -10.70525550842285 -16.09100914001465
- 11.17381763458252 11.73581600189209 12.76785087585449 16.95885848999023 22.25809288024902 22.01443481445312 17.35465240478516 15.91978549957275 9.558157920837402 -1.782183408737183 -10.19282150268555 -16.16479110717773 -19.70077705383301 -20.4652042388916 -19.63494682312012 -19.72922706604004 -13.54111289978027 -3.357020139694214 -3.942026138305664 -11.23134994506836
- 8.913291931152344 7.96657133102417 8.525087356567383 10.92004871368408 15.7230863571167 13.53544330596924 6.278426647186279 1.89404833316803 -0.3686396181583405 0.07206964492797852 5.371940135955811 6.633976936340332 -2.771955728530884 -7.922903537750244 -7.518352031707764 -4.765822410583496 -13.7933874130249 -18.73945236206055 -15.21298122406006 -14.74051380157471
- 3.402238130569458 4.38342809677124 7.372255325317383 7.728855609893799 4.227364063262939 1.61199414730072 1.424536466598511 -0.6806030869483948 -2.745299577713013 -1.67626166343689 0.005013336893171072 -1.363193154335022 -3.862785816192627 -1.437924742698669 1.139387011528015 -1.961188077926636 -1.780180692672729 -2.933499097824097 -8.27347469329834 -4.580662250518799
- 22.56399536132812 25.54781913757324 26.45932197570801 22.04913330078125 13.09465980529785 5.449113368988037 1.858722686767578 2.901705980300903 5.779496192932129 7.843489646911621 3.12408971786499 -4.477516174316406 -11.33000564575195 -15.72787952423096 -16.83627700805664 -15.65703010559082 -15.02642059326172 -18.16428375244141 -19.84463310241699 -19.60749816894531
- -7.236518383026123 -5.575801372528076 -1.055126547813416 1.858322262763977 1.063185453414917 -2.114048004150391 -2.252481460571289 -1.488677978515625 -1.624836921691895 0.3907175660133362 1.890889644622803 2.591307640075684 2.263744592666626 1.155809640884399 3.288020849227905 4.917746543884277 2.529228925704956 4.517363548278809 0.1589960306882858 -5.277845859527588
- 8.726991653442383 8.607576370239258 9.068562507629395 11.91340732574463 15.79548263549805 15.50794792175293 9.229578018188477 4.436100006103516 4.070641994476318 8.425225257873535 1.636174440383911 -7.47866678237915 -13.08150863647461 -15.89782428741455 -14.29007625579834 -10.30896472930908 -7.292512893676758 -9.358960151672363 -6.599284172058105 -13.10986042022705
- -10.07052516937256 -7.769840717315674 -2.410463809967041 1.763256192207336 2.371699571609497 1.300210952758789 0.0592716857790947 -0.186667874455452 -0.1993192136287689 -0.3643225729465485 -1.058914184570312 -1.794434189796448 0.04385639727115631 0.3285703659057617 -1.676158308982849 -1.613530516624451 0.935849666595459 4.837431907653809 6.64939546585083 8.854628562927246
- 11.29299831390381 10.70684146881104 10.77766036987305 12.926344871521 17.35233306884766 17.8224925994873 12.74110794067383 8.971072196960449 12.31371593475342 9.791772842407227 -1.521692991256714 -9.37180233001709 -13.68000888824463 -16.40431022644043 -13.32993125915527 -8.885443687438965 -14.15606212615967 -14.12332820892334 -11.32181930541992 -21.90194702148438
- 21.67450141906738 24.1998233795166 22.05311012268066 14.11573123931885 3.138538122177124 -7.095758438110352 -12.6709098815918 -14.25389575958252 -16.23056602478027 -16.95135307312012 -16.02666282653809 -14.85798835754395 -13.61117744445801 -6.993234157562256 3.848437309265137 5.176148414611816 6.376491546630859 8.201635360717773 8.481925964355469 1.425205826759338
- -4.474852085113525 -3.643330812454224 -2.98609447479248 -1.046510577201843 -0.6623164415359497 -2.156109809875488 -2.654155969619751 0.4314819276332855 0.6183124184608459 0.3206990361213684 -1.173453092575073 -1.984958529472351 6.207587242126465 4.192528247833252 1.175938129425049 -0.06426703929901123 -0.09673029184341431 1.695602059364319 0.2945472002029419 6.006087303161621
- 13.54265308380127 14.67825698852539 19.01576614379883 20.40329933166504 11.6596097946167 3.872746467590332 -0.1622317880392075 0.04457050934433937 3.785968780517578 8.226879119873047 1.124628901481628 -6.867735862731934 -9.734193801879883 -8.573418617248535 -3.713707685470581 -10.67591571807861 -13.52225685119629 -8.942417144775391 -13.65639305114746 -20.50613021850586
- 6.977321624755859 5.673982620239258 6.472606658935547 6.603614807128906 2.133017778396606 -1.350364208221436 -4.397219657897949 -4.135441303253174 -2.338057279586792 -2.390894174575806 -1.73834502696991 -0.1287206709384918 0.9391232132911682 -0.639868438243866 -1.114269733428955 -0.9667397737503052 -0.5924702882766724 -1.210771679878235 -2.727119445800781 -5.069387435913086
- 13.71279621124268 16.06346130371094 18.67594337463379 15.91226100921631 6.642357349395752 -1.123621463775635 -6.001998424530029 -8.210847854614258 -9.57009220123291 -10.36978054046631 -9.241696357727051 -6.490242958068848 -0.6061758995056152 6.642014503479004 2.946542263031006 1.705726623535156 -4.208385467529297 -11.19047355651855 -10.06715965270996 -5.22062349319458
- 13.87119483947754 13.60242462158203 14.81721782684326 18.39755249023438 20.40693092346191 18.47162246704102 16.14850425720215 16.64939308166504 11.51263618469238 1.507368922233582 -5.710821628570557 -9.225401878356934 -10.39441108703613 -9.04575252532959 -6.629664421081543 -14.44726371765137 -21.40112495422363 -21.92295837402344 -21.99299240112305 -24.61444854736328
- 18.04973602294922 20.38852310180664 23.28554534912109 19.01937675476074 8.903037071228027 1.795131683349609 -2.377401828765869 -3.543127298355103 -4.400113105773926 -4.381193161010742 0.9627353549003601 6.8584885597229 -3.112943172454834 -9.587831497192383 -8.428634643554688 -0.2614285349845886 -12.19017601013184 -16.7332592010498 -16.50801277160645 -17.73843383789062
- 2.935255527496338 2.494773864746094 5.048237800598145 6.060988903045654 1.051603078842163 -4.726632595062256 -6.469597816467285 -8.688765525817871 -9.144537925720215 -7.516429424285889 -3.910306215286255 3.390753269195557 7.961606502532959 0.7364627122879028 3.860669136047363 4.830472469329834 -0.413238525390625 2.586595058441162 2.328270673751831 -2.416172742843628
- 26.04530906677246 27.5455150604248 23.52222442626953 14.47762680053711 4.483986854553223 -5.616511821746826 -10.1148853302002 -11.20306301116943 -12.11391448974609 -13.48807144165039 -13.81072330474854 -11.41358947753906 -9.557857513427734 -2.865420341491699 4.820107460021973 -0.4135714471340179 1.190287351608276 -0.3344442248344421 -3.078560352325439 -8.074442863464355
- 28.64225387573242 30.34657669067383 30.42641067504883 24.92678070068359 19.48105049133301 16.29994583129883 10.3444766998291 2.106016635894775 -4.103388786315918 -8.274578094482422 -11.03090858459473 -13.73697662353516 -15.11685943603516 -15.48884677886963 -14.43652629852295 -15.05267143249512 -15.83790874481201 -15.75239944458008 -16.61796760559082 -17.1245002746582
- 10.48817825317383 10.52224540710449 11.68124771118164 15.42751312255859 17.92415237426758 13.7446985244751 7.455336093902588 4.198126316070557 4.725359916687012 9.119702339172363 5.170355319976807 -4.025290489196777 -9.422515869140625 -12.04949474334717 -10.01875972747803 -7.474428176879883 -13.6494607925415 -15.38888072967529 -12.71372413635254 -25.71435928344727
- -12.27659034729004 -11.32632350921631 -7.513252258300781 -4.939467430114746 -5.796271324157715 -8.138972282409668 -8.797755241394043 -8.534284591674805 -8.839288711547852 -6.626235961914062 -1.945817708969116 2.902139902114868 6.24564266204834 8.565464019775391 14.87910270690918 16.18206977844238 11.2841625213623 11.19836044311523 8.415910720825195 5.061402320861816
- 4.802523612976074 4.503732204437256 4.721674919128418 4.401204109191895 3.478729963302612 1.885169148445129 1.605275273323059 0.3432831168174744 0.2189076393842697 0.3075803816318512 -0.393260270357132 -0.4767297804355621 -1.419069886207581 -1.861791133880615 -0.1692178994417191 -2.115620136260986 -8.723348617553711 -3.536106109619141 -3.865071773529053 -3.707862138748169
- -9.692647933959961 -9.22626781463623 -6.351307392120361 -3.786615610122681 -3.759792566299438 -5.117617607116699 -6.414169788360596 -6.056954860687256 -5.489849090576172 -5.054973125457764 -4.297509670257568 -3.701982021331787 -1.902263283729553 0.6614897847175598 0.6646522283554077 4.08777379989624 8.500331878662109 14.32246971130371 19.52342224121094 23.0917854309082
- 9.605265617370605 7.917129039764404 5.450119972229004 4.660484313964844 4.718952655792236 2.371891975402832 0.5677677392959595 -0.2095966786146164 -0.03304304182529449 0.3723271191120148 1.293834447860718 1.160353064537048 -1.004828691482544 -1.290224671363831 -3.274217844009399 -9.903040885925293 -4.364231109619141 -5.654353141784668 -5.75820779800415 -6.626378059387207
- 10.65970611572266 9.201120376586914 7.679224967956543 8.658510208129883 6.842851161956787 5.400555610656738 5.745941638946533 6.045200824737549 4.292452335357666 -1.631278038024902 -4.247810363769531 -6.408622264862061 -9.948398590087891 -10.30978107452393 -8.69011116027832 -4.600172519683838 -4.262642860412598 -4.857944488525391 -4.076342582702637 -5.49245548248291
- 20.01477432250977 20.90167808532715 21.28337287902832 17.17258262634277 9.099832534790039 1.560136675834656 -2.533341646194458 -3.835709571838379 -3.838943958282471 -1.908662796020508 3.497523546218872 2.40043830871582 -6.495970726013184 -11.22317028045654 -12.49804592132568 -8.614226341247559 -6.507180690765381 -13.84256553649902 -14.25671768188477 -10.37580490112305
- 20.80282783508301 23.01670265197754 25.23017692565918 22.06847763061523 13.34460544586182 6.587434768676758 4.035947799682617 6.107962131500244 9.89378833770752 5.313068866729736 -3.524396657943726 -8.768362045288086 -10.99186611175537 -8.75698184967041 -7.31260347366333 -15.89384841918945 -20.20448684692383 -19.49742317199707 -20.49799346923828 -20.95304489135742
- 1.112135291099548 1.679536700248718 2.138391733169556 3.410985469818115 3.71178412437439 2.930932998657227 3.283352375030518 3.969638347625732 2.084598541259766 -1.426822900772095 -0.8856951594352722 1.016344308853149 5.128527641296387 0.4168203175067902 -2.394213676452637 -5.627807140350342 -6.498308181762695 -3.880506992340088 -3.405381679534912 -6.764309406280518
- 16.84527778625488 20.15522956848145 23.35427474975586 17.54995727539062 6.320985794067383 -1.148457288742065 -6.488667488098145 -9.401909828186035 -10.0902624130249 -10.98797225952148 -9.937409400939941 -6.472338199615479 -0.03792007267475128 5.83006763458252 0.3465135395526886 1.962833046913147 -5.747587203979492 -8.713689804077148 -6.595053672790527 -16.74385452270508
- -0.175922691822052 -0.3392089903354645 3.446411609649658 8.461982727050781 8.435442924499512 4.178000450134277 2.031186580657959 0.7055367827415466 -1.929324507713318 -1.186627388000488 3.413535594940186 6.633113861083984 1.712199330329895 -4.988245964050293 -5.607166290283203 -3.031121015548706 -3.457066297531128 -4.790519237518311 -4.364737510681152 -9.147473335266113
- 22.29063034057617 23.97075843811035 23.27596282958984 17.90572929382324 9.348537445068359 1.87749969959259 -2.474119186401367 -3.170991182327271 -0.9640589952468872 3.555204391479492 4.53749942779541 -2.077203035354614 -8.870077133178711 -10.92167282104492 -10.11583614349365 -8.117061614990234 -6.369678974151611 -12.51077938079834 -20.21393585205078 -20.9564323425293
- -3.057344198226929 -2.8087317943573 -1.093109250068665 0.469587653875351 -0.1794872730970383 -2.173644065856934 -4.259597301483154 -5.188438415527344 -4.757630348205566 -3.20599627494812 1.229697227478027 4.462307929992676 4.061110019683838 1.625710129737854 -0.1563905477523804 -0.552192211151123 -1.765473604202271 1.74962592124939 6.205678462982178 9.394316673278809
- 19.61542320251465 21.94364738464355 19.86596870422363 11.82929134368896 2.523934125900269 -6.111340045928955 -10.21962261199951 -10.33879566192627 -11.057861328125 -12.24213790893555 -11.36732196807861 -8.627589225769043 -3.538101673126221 6.064846992492676 4.739538669586182 3.149100780487061 -1.811686992645264 -6.242119312286377 -4.583901882171631 -3.591279745101929
- 29.43381309509277 32.87830352783203 29.73860168457031 20.80992889404297 16.40338325500488 16.22147178649902 6.522161483764648 -6.435578346252441 -10.2713737487793 -12.00178813934326 -12.49606037139893 -13.68628406524658 -14.64797782897949 -13.60736560821533 -4.027771472930908 -6.029695987701416 -10.59019088745117 -16.03215599060059 -16.22187995910645 -15.95952415466309
- -7.01591157913208 -5.715380668640137 -1.626675963401794 0.9221866726875305 0.4081452786922455 -1.005972504615784 -2.755638122558594 -2.554766178131104 -2.080392122268677 -1.745342969894409 -1.008216738700867 -2.322623014450073 -3.847446441650391 -5.072258949279785 -3.880792617797852 0.07016272842884064 1.717446208000183 7.208227157592773 12.95217037200928 17.35307312011719
- 5.477029323577881 8.173159599304199 6.422657012939453 5.341064453125 3.062849521636963 2.45807409286499 1.54998517036438 0.3937896192073822 -1.357647180557251 -3.189165353775024 -3.871724367141724 -3.134510040283203 -0.3495767116546631 2.917126178741455 -2.330762624740601 -6.090649127960205 -4.970141887664795 -0.4822643101215363 -5.075662136077881 -4.943630695343018
- 12.5955982208252 13.77890014648438 18.30307388305664 21.59243965148926 14.85214996337891 7.433459281921387 4.869880676269531 8.15217113494873 8.695764541625977 -1.678695559501648 -9.385774612426758 -13.83348846435547 -16.42182159423828 -15.39605617523193 -11.6067943572998 -6.948153495788574 -11.98177719116211 -11.80886459350586 -4.334839820861816 -6.877176284790039
- 1.419307231903076 1.524868726730347 1.362967014312744 2.714002132415771 3.082342386245728 1.285038352012634 0.648038923740387 -0.5841737985610962 -1.618401765823364 -1.045000791549683 3.433628559112549 5.883842468261719 5.38477897644043 2.516360521316528 2.645832300186157 2.330636024475098 -1.273251533508301 -4.437887668609619 -10.03049468994141 -15.24242782592773
- 21.17899703979492 21.63118171691895 16.4135684967041 9.217244148254395 0.1791206747293472 -7.232132911682129 -11.07520771026611 -11.30471801757812 -11.98587226867676 -12.85896110534668 -10.89315414428711 -8.924420356750488 -3.650354862213135 6.884785652160645 3.042017459869385 3.568992137908936 4.011132717132568 1.915784358978271 3.316825866699219 -13.43481922149658
- 20.54770851135254 22.19759368896484 23.21295928955078 18.93502616882324 11.36981678009033 6.030840873718262 3.26379132270813 -3.391864776611328 -12.71049308776855 -19.66250610351562 -20.27547454833984 -17.38802528381348 -14.33404541015625 -8.270648956298828 -0.3982932269573212 0.6727895736694336 2.271696805953979 -2.144125938415527 -3.110556364059448 -6.816196918487549
- 6.310121536254883 6.333037376403809 8.804222106933594 13.71268939971924 13.97992420196533 6.189701557159424 0.2391342967748642 -3.585678100585938 -5.816271305084229 -6.397223472595215 -4.444539546966553 0.8361324071884155 7.133593082427979 1.170412182807922 -2.234095573425293 -0.8191328048706055 -7.236052989959717 -11.23121070861816 -10.80379390716553 -12.14094734191895
- 7.451253414154053 6.149855613708496 7.256801605224609 10.89402389526367 15.34398365020752 12.79841899871826 8.768499374389648 8.579646110534668 11.06977462768555 6.04635763168335 -2.637142658233643 -7.933014869689941 -11.1741943359375 -10.79344844818115 -6.221822738647461 -9.319869041442871 -15.19604015350342 -13.38976001739502 -7.046983242034912 -10.64634418487549
- -0.2915470004081726 -0.7367169857025146 0.7309360504150391 5.500640869140625 8.343731880187988 8.284258842468262 9.765144348144531 10.31025981903076 9.563140869140625 5.090346336364746 -0.7062538266181946 -4.646887302398682 -6.757493495941162 -7.82038402557373 -6.03977632522583 -5.030092239379883 -6.922825336456299 -7.286518096923828 -4.939605712890625 -6.410363674163818
- 21.00883674621582 22.91725540161133 26.21879386901855 24.0670337677002 15.62715911865234 11.73959064483643 13.444091796875 13.58902359008789 3.867225170135498 -5.15926456451416 -10.71269702911377 -13.78102779388428 -14.35583972930908 -10.86686515808105 -8.147103309631348 -16.44315338134766 -18.02453994750977 -17.01098823547363 -17.99375343322754 -19.98375701904297
- 10.03453826904297 6.773412704467773 2.505077123641968 0.5299304127693176 -0.4764107167720795 -1.488977313041687 -1.522027969360352 -1.135879874229431 -2.537898302078247 -3.037395715713501 -2.972354173660278 -0.9401606321334839 2.725913524627686 2.007568597793579 -1.263015031814575 -2.720503091812134 -2.706114768981934 -1.326903939247131 -2.594584703445435 0.1457876712083817
- 10.30598449707031 9.680682182312012 12.30059432983398 16.63021087646484 15.71973133087158 9.227455139160156 4.790554046630859 5.183098793029785 9.694279670715332 7.656355381011963 -1.202949047088623 -6.134037494659424 -7.703773975372314 -6.95940113067627 -10.068359375 -15.56697845458984 -16.69293975830078 -10.67906761169434 -8.995759963989258 -17.18567848205566
- 10.33647441864014 11.13605403900146 14.50987720489502 19.55765533447266 15.32199859619141 5.841301441192627 0.2834679484367371 -1.302920937538147 -1.170873641967773 1.614076137542725 7.350321769714355 4.059854984283447 -3.76279091835022 -6.356240272521973 -5.494593620300293 -11.70594692230225 -16.66755294799805 -15.301513671875 -9.931950569152832 -18.31670570373535
- 6.665878772735596 5.287078380584717 6.604174613952637 11.24390697479248 15.73708820343018 10.88919353485107 3.615051031112671 1.545713543891907 1.317800402641296 5.003365993499756 9.209177017211914 0.2331276834011078 -5.380549907684326 -6.400966167449951 -3.573290348052979 -9.712291717529297 -15.60323524475098 -14.45553874969482 -8.61473560333252 -13.61093235015869
- 24.84246444702148 24.72958183288574 25.05094337463379 18.6519775390625 11.2672643661499 8.92552661895752 10.56259918212891 10.60634136199951 2.62476110458374 -5.334508895874023 -11.0812406539917 -13.20625686645508 -15.02491188049316 -13.65923976898193 -6.694888591766357 -2.787519216537476 -15.76016235351562 -19.30805969238281 -18.20397186279297 -16.20072174072266
- 19.58020210266113 22.63994979858398 24.85937690734863 23.73339080810547 16.40652084350586 8.655902862548828 2.692973136901855 -0.9732272624969482 -2.432784557342529 -1.183987140655518 2.202678918838501 2.898808002471924 -0.6551418900489807 -7.756970405578613 -15.51250839233398 -18.82013511657715 -18.30494499206543 -16.93642044067383 -20.15601921081543 -20.93766784667969
- -1.255172252655029 -0.3113114833831787 0.7072728872299194 4.946125030517578 19.29331970214844 20.6010856628418 3.340485334396362 -2.18834114074707 0.2548024952411652 5.804544448852539 -0.177555114030838 -3.612357378005981 -5.060549736022949 -5.611148357391357 -4.149014949798584 -6.123706817626953 -6.200331211090088 -7.116665840148926 -6.722080707550049 -6.419397830963135
- 21.05316352844238 23.36001014709473 24.36540222167969 21.45010948181152 12.48474502563477 4.082840919494629 -1.245608806610107 -3.183476448059082 -2.304561138153076 0.5786012411117554 3.783148288726807 -1.133320569992065 -8.830019950866699 -13.8347692489624 -15.2947244644165 -13.6972770690918 -10.44550800323486 -8.296177864074707 -14.21250057220459 -18.6800651550293
- 10.37947082519531 10.20931816101074 8.271500587463379 5.467775344848633 -0.09628541022539139 -4.205060482025146 -6.42449951171875 -7.845910549163818 -8.762962341308594 -9.111204147338867 -7.384249210357666 -4.592853546142578 -2.77894401550293 0.2429867386817932 6.057669639587402 8.652376174926758 3.84000301361084 2.198265075683594 -0.9337678551673889 -3.183626413345337
- -4.15082836151123 -2.855858087539673 -0.4716212451457977 3.780704736709595 6.066000938415527 4.922677040100098 4.493431568145752 3.659519672393799 0.2725513577461243 -1.047417759895325 2.58400297164917 5.217532634735107 2.720312118530273 -2.818809747695923 -4.440462112426758 -5.8205246925354 -3.548867702484131 -5.631536960601807 -5.468313694000244 2.537501811981201
- 14.4602108001709 14.94652462005615 15.6305685043335 14.41653633117676 8.741317749023438 2.195253372192383 -2.3428635597229 -5.394208431243896 -7.140635967254639 -8.232874870300293 -7.09685230255127 -2.729194641113281 0.4225172400474548 -4.406015396118164 -8.054690361022949 -8.433924674987793 -4.002011775970459 -4.787050724029541 -4.803210258483887 -3.389398813247681
- 13.61625576019287 12.93839550018311 11.99118518829346 11.97700977325439 12.76942539215088 13.99450397491455 11.76297855377197 9.01258373260498 8.550151824951172 9.896116256713867 8.040699005126953 0.7377694845199585 -7.386106967926025 -12.57392978668213 -16.43876647949219 -20.54883193969727 -23.81130409240723 -20.06807708740234 -11.72089576721191 -12.73915195465088
- 18.25611686706543 19.3969898223877 19.66707038879395 14.32180213928223 5.810091495513916 -0.9553779363632202 -4.524950981140137 -5.469868183135986 -5.026162147521973 -4.127743244171143 -0.8071671724319458 6.424685955047607 5.824182987213135 3.295158863067627 -0.7150189876556396 -6.60588264465332 -7.967678546905518 -13.18302345275879 -20.03922080993652 -23.57401275634766
- 23.75066947937012 23.80665588378906 22.9061279296875 19.15889549255371 12.9243803024292 7.81028938293457 3.232327938079834 0.7559596300125122 1.412768602371216 1.131664991378784 0.693674623966217 -3.000707864761353 -8.008969306945801 -9.435736656188965 -7.426898002624512 -8.683975219726562 -15.56129169464111 -21.17743873596191 -21.50063133239746 -22.78774833679199
- 22.20578575134277 19.86033058166504 15.79944515228271 12.16376686096191 5.56561803817749 0.7775504589080811 -1.959669709205627 -4.665484428405762 -6.331968307495117 -7.980122566223145 -8.627533912658691 -5.214047431945801 0.1038874909281731 0.7415638566017151 -1.392701983451843 -2.967875957489014 -2.681667327880859 -5.498506546020508 -12.87279891967773 -17.02556037902832
- 23.0167236328125 19.66872024536133 14.46619701385498 9.354114532470703 5.886606693267822 3.548409938812256 3.291259050369263 4.87733268737793 6.359760761260986 5.53524923324585 0.712098240852356 -3.141013145446777 -6.328586578369141 -8.716710090637207 -11.64977169036865 -13.01816940307617 -12.47462844848633 -14.29913139343262 -14.66958713531494 -12.41888427734375
- 22.78421592712402 22.54104423522949 19.36458969116211 11.89761066436768 3.813448905944824 -2.766532897949219 -5.860476016998291 -5.352670192718506 -3.241155385971069 0.3529499173164368 4.590380668640137 2.886757850646973 -2.476957321166992 -3.389545202255249 -3.355114936828613 -9.570169448852539 -11.17313098907471 -9.408451080322266 -13.1599645614624 -18.4768180847168
- 6.077428817749023 5.613298892974854 6.019557476043701 7.465881824493408 10.75988101959229 14.1450366973877 12.55710601806641 7.738298892974854 5.433481216430664 7.246567726135254 8.792430877685547 -0.2265758216381073 -6.745157718658447 -10.20847797393799 -9.725765228271484 -5.989837646484375 -11.59928035736084 -17.44060897827148 -13.94773387908936 -15.96553516387939
- 11.88570117950439 13.69797992706299 16.69544792175293 19.03876113891602 13.65995407104492 6.49862813949585 1.090433359146118 -3.448119401931763 -4.899106979370117 -5.979784488677979 -4.574348449707031 0.5459050536155701 5.65796947479248 1.046589732170105 -0.6061590909957886 -4.254570960998535 -12.42788791656494 -14.78377151489258 -13.16948413848877 -25.67412757873535
- 9.669761657714844 12.5869779586792 16.10577011108398 19.31002998352051 18.1252269744873 11.59854888916016 6.249930381774902 5.650259494781494 8.786742210388184 9.47613525390625 -0.03960930928587914 -7.283413410186768 -13.13479423522949 -16.41493606567383 -16.53716659545898 -11.61318016052246 -8.986817359924316 -15.86849880218506 -16.58048629760742 -11.10048007965088
- 12.46806049346924 14.88292789459229 17.79672622680664 20.63623428344727 18.84663581848145 12.54423046112061 8.294511795043945 8.013032913208008 10.10925483703613 4.546423435211182 -4.235581874847412 -11.07094764709473 -16.6797046661377 -19.73879814147949 -20.18843841552734 -18.86830902099609 -11.96073627471924 -6.344791889190674 -9.577949523925781 -9.472785949707031
- 20.53796005249023 21.90321922302246 22.28560829162598 18.10272979736328 8.989124298095703 2.176859140396118 -0.5817242860794067 -0.287967324256897 3.112398862838745 6.86476993560791 1.833616614341736 -6.179459571838379 -11.48313236236572 -13.64754009246826 -12.71519565582275 -8.516919136047363 -12.03660202026367 -16.91633987426758 -14.81015586853027 -8.631259918212891
- 11.60680103302002 11.85505199432373 12.85512161254883 15.10396003723145 17.35493850708008 16.72762107849121 12.64882564544678 10.93340587615967 13.10458564758301 11.36492443084717 0.9490270018577576 -6.092689990997314 -10.05137157440186 -11.87186336517334 -11.79834461212158 -14.41411876678467 -21.47661399841309 -23.51333808898926 -19.09796714782715 -16.18795013427734
- 24.52836799621582 26.2111873626709 25.33324241638184 18.9857292175293 9.584904670715332 2.018861532211304 -2.465427160263062 -1.767440319061279 0.7104041576385498 4.801408767700195 3.829744100570679 -4.493820667266846 -10.97359275817871 -12.1612377166748 -7.233429908752441 -11.12522602081299 -18.05344200134277 -17.28647994995117 -11.52244853973389 -18.92131614685059
- 23.12882995605469 26.05768203735352 29.93949699401855 29.64876174926758 24.47180938720703 21.93432807922363 15.3261890411377 3.769094467163086 -4.600830554962158 -10.20814228057861 -14.23781299591064 -16.46170997619629 -17.13750267028809 -16.26701354980469 -14.19005107879639 -14.87963199615479 -15.83047866821289 -16.57930564880371 -16.80863380432129 -17.07507705688477
- -0.5882477164268494 -1.531315445899963 -2.527407646179199 -2.305526971817017 -4.086747646331787 -5.959141254425049 -7.423610210418701 -8.374463081359863 -8.524413108825684 -8.100237846374512 -4.632142543792725 -1.661475300788879 2.979997158050537 6.70287036895752 7.188657283782959 8.806729316711426 8.659381866455078 7.952831745147705 7.556660175323486 5.867602348327637
- 24.30745506286621 22.4275951385498 20.73090553283691 15.5381326675415 8.56695556640625 5.672979831695557 0.8411679267883301 -8.708767890930176 -1.499181509017944 -0.1685007363557816 -4.014512538909912 -3.226223707199097 -5.55338716506958 -4.657928943634033 -0.351344496011734 -0.8989975452423096 -6.205326080322266 -16.60711860656738 -22.42523765563965 -23.76866340637207
- 5.180050849914551 6.041500568389893 6.860336303710938 8.956050872802734 13.32253074645996 14.6285514831543 9.409848213195801 1.849394202232361 -1.724948883056641 -3.098674535751343 -2.059240102767944 3.562844038009644 3.819305181503296 -4.527313709259033 -8.809619903564453 -8.658734321594238 -4.736572742462158 -10.68166732788086 -14.85742855072021 -14.47622585296631
- 15.80508041381836 15.63898086547852 15.88506317138672 16.13718795776367 13.47125720977783 8.73521900177002 3.636890649795532 -0.339383453130722 -5.560337066650391 -10.54215431213379 -13.62865257263184 -12.16235542297363 -8.602408409118652 -2.032558917999268 1.592831015586853 -1.978568077087402 -3.389095783233643 -8.284897804260254 -12.71383094787598 -11.66827297210693
- 26.18878746032715 26.02281951904297 23.38271331787109 17.19644927978516 8.949422836303711 2.020498752593994 -1.268647909164429 -0.2651183903217316 3.892852544784546 6.015614032745361 0.9221491813659668 -3.620756149291992 -5.481115818023682 -5.426047325134277 -10.27603435516357 -15.89168739318848 -16.77092552185059 -17.16012191772461 -18.59013938903809 -19.84072113037109
- 9.163393974304199 10.0832405090332 15.00693511962891 16.57118225097656 6.619165897369385 -1.479613900184631 -6.077719688415527 -7.751141548156738 -8.722336769104004 -9.041499137878418 -7.687320709228516 -2.570497751235962 6.751341342926025 1.899693846702576 -1.455192923545837 2.540307760238647 -4.263998985290527 -6.59299898147583 -3.977922677993774 -9.015023231506348
- 28.60880279541016 28.5955867767334 25.74451637268066 20.2282657623291 12.98462200164795 6.272964477539062 -1.270745754241943 -4.694289207458496 0.6216191053390503 -1.871351718902588 -7.325624465942383 -8.693500518798828 -10.72037982940674 -10.37525177001953 -5.04227352142334 -5.860230922698975 -11.15826511383057 -18.15434837341309 -19.03731918334961 -18.85279273986816
- 14.56285381317139 11.91119480133057 9.127939224243164 4.955471515655518 -1.859045147895813 -5.527246952056885 -7.291328430175781 -7.257721424102783 -7.936927318572998 -7.522019386291504 -5.699267387390137 -4.295718669891357 -6.046833038330078 -7.484413146972656 -5.929449558258057 -1.751848816871643 -0.4330388605594635 3.87393593788147 10.92901134490967 13.67445850372314
- 6.51925802230835 5.868056297302246 4.894417762756348 6.951455593109131 11.15463829040527 13.76603889465332 9.959395408630371 3.711484909057617 -0.4425097405910492 -0.1968532353639603 4.800868034362793 1.330580115318298 -8.130728721618652 -11.60699653625488 -9.227926254272461 -6.489060878753662 -3.754976272583008 -8.181388854980469 -8.191291809082031 -12.73445606231689
- -12.38740634918213 -10.21508312225342 -5.852412700653076 -2.136318445205688 -1.759829044342041 -2.811165571212769 -2.869603157043457 -1.037415146827698 -1.620659232139587 -1.65497887134552 0.01288516260683537 0.5949336886405945 0.08965931832790375 -1.801554560661316 -0.9082702994346619 1.798803925514221 4.207374572753906 7.146528720855713 13.32305431365967 17.88145065307617
- 4.987802982330322 7.1372389793396 8.835489273071289 8.994952201843262 6.126404762268066 3.864791870117188 1.343653082847595 -0.4084400236606598 -0.4445983171463013 0.6985169649124146 4.246108531951904 1.664074182510376 -3.283009767532349 -6.344760894775391 -7.022064208984375 -4.365979194641113 -6.104038238525391 -7.224530696868896 -7.507492542266846 -5.194108009338379
- 0.8742403388023376 -0.1953169703483582 0.01760067977011204 1.549441933631897 1.768524527549744 0.8429960012435913 0.06463783234357834 0.3984734416007996 0.9265114068984985 0.9952888488769531 1.865400314331055 0.4303093552589417 -1.977151989936829 -1.565799593925476 -3.158882856369019 -3.664788722991943 -4.126267433166504 -2.768099069595337 1.686561822891235 6.036318302154541
- 15.46885871887207 16.0085620880127 19.44907760620117 22.42435073852539 16.41948509216309 10.26043224334717 9.094603538513184 13.04658317565918 10.87363147735596 1.354310631752014 -5.934009552001953 -8.36617374420166 -7.111842155456543 -4.493043899536133 -11.16856670379639 -15.53051280975342 -14.68656444549561 -18.99347114562988 -23.50125503540039 -24.61445045471191
- 6.603334426879883 5.585556983947754 6.647547721862793 10.17383575439453 15.25801277160645 12.96533489227295 6.642523288726807 3.414900541305542 2.982682943344116 5.721572399139404 10.22160625457764 5.013276100158691 -0.3243998885154724 -2.390127420425415 -5.324588775634766 -9.820241928100586 -13.70053958892822 -14.69600105285645 -18.41834259033203 -26.55594253540039
- 12.37706851959229 13.17043399810791 15.49816226959229 14.22429656982422 5.17231273651123 -1.316939234733582 -4.672329902648926 -5.044862270355225 -5.592236995697021 -5.459487438201904 0.3524168431758881 3.863491773605347 -3.27344822883606 -8.139137268066406 -7.895611763000488 -0.9601824283599854 -5.682562351226807 -8.069439888000488 -3.529186248779297 -5.022748947143555
- 21.58291053771973 21.0160083770752 18.84441947937012 14.6915922164917 8.501016616821289 4.111413955688477 0.1588360965251923 -0.6771475076675415 4.226070404052734 4.271119117736816 -0.1932351142168045 -0.9946475625038147 -2.206359386444092 -1.129950642585754 0.6167441606521606 -5.536649227142334 -18.86670303344727 -21.06279563903809 -22.50994682312012 -24.84271049499512
- 29.1742115020752 27.73128890991211 23.78449630737305 16.20070838928223 7.804171085357666 4.62283992767334 6.618515968322754 2.002690553665161 -8.812130928039551 -9.347260475158691 -5.028340816497803 -9.039759635925293 -12.13632678985596 -12.18521022796631 -6.66544246673584 2.907634258270264 -8.947727203369141 -16.14755821228027 -15.8516321182251 -16.68515396118164
- 17.52192687988281 18.48198127746582 19.56446838378906 15.87956047058105 7.895845413208008 1.758221983909607 -2.161993503570557 -2.602938652038574 -0.3607065081596375 3.439788341522217 0.8002592921257019 -6.168744564056396 -10.9293737411499 -12.32912254333496 -10.55030059814453 -8.129195213317871 -11.04506683349609 -9.589564323425293 -5.572501182556152 -5.902548789978027
- 37.90076065063477 34.45671844482422 29.74997520446777 23.66351890563965 17.73532676696777 11.17491054534912 3.756527423858643 -3.225162744522095 -8.056818962097168 -10.30983257293701 -11.20657444000244 -11.58444786071777 -12.20452213287354 -13.10412120819092 -13.9846076965332 -13.87027835845947 -13.75427722930908 -15.14665794372559 -15.70295429229736 -16.2874870300293
- 11.63211250305176 11.50481033325195 14.76960277557373 18.55362892150879 12.47855758666992 3.995025396347046 0.09296571463346481 -1.110555291175842 -1.018493294715881 2.535382747650146 6.585675716400146 -1.587183475494385 -9.116602897644043 -12.02014255523682 -10.08510303497314 -2.456929922103882 -9.525175094604492 -12.43867683410645 -9.930220603942871 -12.85867786407471
- 10.88762187957764 11.41915130615234 15.72104454040527 19.24050331115723 12.93360996246338 5.175852298736572 1.189446210861206 0.06192104518413544 1.09056031703949 5.328004837036133 12.79714488983154 7.848507404327393 6.693451881408691 -2.518177270889282 -12.68602848052979 -15.10251522064209 -11.06857490539551 -17.80665397644043 -24.3961009979248 -26.80878829956055
- 12.04619407653809 12.54083728790283 16.10873794555664 18.44397926330566 10.75066661834717 2.74236273765564 -2.459700584411621 -5.040712356567383 -5.865875244140625 -5.228089809417725 -1.838192462921143 5.844863414764404 0.5670551657676697 -6.815145492553711 -6.905168056488037 -0.4683799147605896 -10.44375514984131 -14.27520751953125 -10.82914924621582 -8.87531566619873
-
-
diff --git a/octave/train_all_speech_2.txt b/octave/train_all_speech_2.txt
deleted file mode 100644
index bd6fd92..0000000
--- a/octave/train_all_speech_2.txt
+++ /dev/null
@@ -1,514 +0,0 @@
- -1.753433346748352 0.0942588597536087 1.379803538322449 2.072990655899048 1.876945614814758 0.3252158463001251 -0.4604800045490265 1.392059564590454 2.51468825340271 2.726940870285034 1.346734285354614 -3.432505130767822 -4.508626937866211 -1.071884870529175 5.149267673492432 -1.864397406578064 -3.520386695861816 -0.987758994102478 -2.191234111785889 0.9117975831031799
- -2.740678787231445 -0.7557816505432129 1.221166849136353 2.429412603378296 1.121769070625305 -2.109005212783813 -3.207082986831665 -1.283277988433838 1.23898720741272 2.216673135757446 1.987575054168701 3.320088148117065 1.843206286430359 -0.6056810617446899 1.845213294029236 2.970349788665771 -4.477020740509033 -3.250196933746338 -0.660971462726593 -1.104741096496582
- 0.8637488484382629 -0.3699468970298767 -0.3692027628421783 1.025614023208618 1.526248335838318 -1.09520697593689 -4.278725624084473 -0.9699022769927979 5.088742256164551 2.842086315155029 -4.768896579742432 -1.872474551200867 2.118366479873657 -0.6976305246353149 1.185539484024048 3.40752124786377 -0.8052951693534851 -1.561945796012878 -1.542000651359558 0.2733546793460846
- -1.144956588745117 -0.1454758495092392 0.08790544420480728 -0.02088651992380619 -0.8916767239570618 -0.1761495471000671 1.68149209022522 1.516316413879395 -0.8769388198852539 -1.930211663246155 -0.9893726110458374 2.492476224899292 2.351692676544189 -0.6615152359008789 -1.857846736907959 4.520679473876953 4.450479030609131 -4.987422466278076 -0.3564645349979401 -3.062129020690918
- -3.01615047454834 -3.111889600753784 -2.866418600082397 -1.588913679122925 -1.588775634765625 -0.2449028044939041 0.9310630559921265 1.395220994949341 1.342057108879089 0.9993742108345032 1.242173075675964 1.108432412147522 1.414095878601074 1.482768416404724 1.385738372802734 5.528781890869141 -2.099417924880981 -2.41669774055481 4.861923217773438 -4.758462905883789
- 0.8427443504333496 1.215364336967468 0.09320242702960968 -0.2604077458381653 -0.5247545838356018 -1.967142343521118 -2.698567867279053 0.1313823461532593 3.205588102340698 1.998406291007996 -1.989334344863892 -2.173259258270264 -2.062813282012939 1.726672291755676 7.535818576812744 0.4266133308410645 2.029835939407349 -6.092190742492676 -2.910575151443481 1.473413348197937
- -1.032739520072937 -0.9894866347312927 -1.526102423667908 -1.59191882610321 -0.2723776400089264 0.64164799451828 -0.8059507608413696 -1.191702723503113 0.09020776301622391 -1.060420274734497 0.3806934654712677 4.184435367584229 2.431001424789429 -2.035251140594482 -2.090354919433594 2.199838399887085 -0.3658998608589172 0.09143834561109543 -0.3407558500766754 3.283697366714478
- 0.09579634666442871 -0.5799037218093872 0.3841956555843353 1.487872123718262 1.979267477989197 0.7764622569084167 0.6211426854133606 1.777725577354431 5.853362083435059 5.018080234527588 -1.464226603507996 -3.236551284790039 -2.264443635940552 -3.471408367156982 -3.092434406280518 0.1645918339490891 -2.626392602920532 -3.916962146759033 0.76935213804245 1.724476456642151
- -0.811269998550415 -1.995243072509766 -3.103911638259888 -2.199812650680542 0.8351114988327026 2.872645378112793 2.846061944961548 2.516482591629028 1.664498209953308 1.229272842407227 0.1869180500507355 -2.820144653320312 -3.284145832061768 -1.804192066192627 -0.4315302073955536 -1.891431331634521 -1.279873847961426 2.767906665802002 -2.973227739334106 7.675887107849121
- -0.8152815699577332 -0.3413392305374146 0.4037869870662689 0.315345972776413 -1.540551543235779 -3.120832920074463 -3.166280269622803 -0.5739026069641113 3.500081062316895 0.5491748452186584 -6.07478141784668 -3.788755416870117 1.034412980079651 1.376763343811035 1.135967493057251 0.4547922611236572 1.173577547073364 2.110079526901245 7.675674915313721 -0.3079297542572021
- -2.651316165924072 -1.908707976341248 -0.5694659948348999 1.551503539085388 3.206167697906494 2.564919948577881 -0.8488295674324036 -3.430304050445557 -2.325228214263916 -0.6848338842391968 1.187225103378296 0.8688910007476807 -0.08795472979545593 0.671331524848938 1.194888353347778 4.820491790771484 -0.899141788482666 -3.411194324493408 0.7041743993759155 0.04737823083996773
- -1.544002294540405 -0.7887297868728638 0.9314983487129211 1.087976574897766 -0.4193236231803894 -0.006955572403967381 0.9089468717575073 0.4165940582752228 -0.6243113875389099 -2.085224866867065 -3.36680269241333 -1.14743971824646 4.429374217987061 8.18505859375 2.526922464370728 -1.439463257789612 -2.911975622177124 -1.292481660842896 0.02361198514699936 -2.883274078369141
- 2.72967267036438 1.223486185073853 -0.4147254228591919 -1.102556824684143 0.03947576507925987 1.598259210586548 3.364975452423096 1.16395115852356 -3.654291391372681 -4.9219970703125 -2.223340749740601 -1.48681640625 -1.157513499259949 -2.681891202926636 -2.685308933258057 3.31487774848938 7.715513706207275 -0.2770547270774841 0.8034194707870483 -1.348137140274048
- -1.842585682868958 -1.539855480194092 -1.55155611038208 0.7617592215538025 2.24738073348999 1.404512166976929 -0.0482788160443306 0.2210453450679779 1.090998649597168 -3.461035966873169 1.544136762619019 -3.229188919067383 -2.070632934570312 3.600785732269287 -1.455200552940369 3.69648814201355 1.746862649917603 0.6004441380500793 0.08029398322105408 -1.796372890472412
- -2.415617942810059 -3.211170673370361 -4.819873809814453 -3.206589937210083 1.787257552146912 4.948456287384033 -0.1977581977844238 -3.283747673034668 -1.607443928718567 0.65901118516922 -0.03758396208286285 -1.439054727554321 -0.6943122148513794 -0.1511005163192749 1.362555384635925 6.210984706878662 -0.5453330278396606 -0.01679189503192902 1.862467169761658 4.795656681060791
- 0.856853723526001 0.8676319718360901 1.264796376228333 1.778098940849304 2.750473976135254 2.78684401512146 1.633050799369812 0.5312818884849548 -0.5235286951065063 -1.18840754032135 -1.003754019737244 0.4010737836360931 -1.194388151168823 -2.923749446868896 -2.785791158676147 0.01484451070427895 -1.729824185371399 -0.3013865947723389 7.437404155731201 -8.671523094177246
- -3.133574724197388 -2.42682409286499 -1.867851614952087 -1.267155647277832 -0.8527985215187073 -1.118702411651611 -0.0356421135365963 0.301592618227005 -1.012029647827148 -0.409947544336319 0.3539893329143524 1.103417873382568 3.380499601364136 5.894412994384766 3.340315341949463 1.212600350379944 3.397170066833496 1.995545506477356 -2.641837120056152 -6.213176727294922
- -2.355335235595703 -2.020031929016113 -1.706264615058899 -1.858449697494507 -3.014138221740723 -2.368912696838379 -0.3175995647907257 0.9534608721733093 1.996512293815613 2.713643312454224 2.526366710662842 1.092188835144043 1.637070775032043 1.919391751289368 -1.441635847091675 -0.2470939606428146 4.631109237670898 -0.2607018053531647 -1.011650443077087 -0.867921769618988
- -0.1634024679660797 0.7038992047309875 2.01164722442627 4.823482036590576 6.365779876708984 3.551002264022827 -0.9600869417190552 -0.7979612350463867 1.504276752471924 0.008344966918230057 -2.356373310089111 -1.682130813598633 0.8478856086730957 1.295838952064514 -0.7240107655525208 -1.516607999801636 -3.840235948562622 -3.183795928955078 -2.234462738037109 -3.653089284896851
- -4.10896635055542 -2.948151588439941 -1.846358299255371 -2.215651512145996 -2.276339769363403 -1.934123635292053 -1.9860680103302 -1.519635796546936 0.09298322349786758 1.52109158039093 2.943732261657715 2.536495447158813 1.460915684700012 1.980175018310547 2.281753540039062 2.428494930267334 -0.2390885055065155 -0.3986181616783142 0.5407825112342834 3.68657374382019
- 0.3376611173152924 -0.405711442232132 -0.7594498991966248 -0.6338635087013245 0.9688994884490967 2.71795129776001 2.178635358810425 -1.594286561012268 -3.96287989616394 -4.945488452911377 -2.866297721862793 0.9431570768356323 1.468511581420898 0.7158414721488953 1.673624277114868 1.029506087303162 -1.533793449401855 2.920562267303467 3.113263368606567 -1.365842700004578
- 2.899140596389771 0.9370946884155273 -0.6385203003883362 -0.2824523746967316 0.4858080148696899 0.653084397315979 1.642471432685852 2.847016572952271 3.041836500167847 0.260204017162323 -3.388786315917969 -1.993575930595398 0.01249594613909721 -3.636595487594604 -4.419864654541016 -0.5688806772232056 0.259507417678833 3.263191699981689 -0.7724171876907349 -0.6007593870162964
- 0.3602983951568604 -1.103044390678406 -2.610003232955933 1.862635135650635 4.10805606842041 -0.6760388612747192 -0.2770002782344818 0.8007866144180298 -1.50946056842804 -2.143035650253296 2.251482009887695 -3.210285425186157 -1.534357666969299 -2.806710243225098 -0.4910678565502167 6.850430011749268 0.04701343178749084 -2.011737108230591 3.84626293182373 -1.754221439361572
- -3.970570802688599 0.9034222960472107 1.601167321205139 -3.261712312698364 -1.454250574111938 2.371148347854614 -0.5763523578643799 -0.3183937072753906 -1.859842419624329 4.226692199707031 2.478902578353882 2.609435081481934 -3.968642473220825 -1.910259604454041 2.649215221405029 -0.3447525501251221 -0.3537707626819611 -0.1577663272619247 1.331998586654663 0.004331546369940042
- 0.9033505320549011 1.018759727478027 0.9994967579841614 0.1703789681196213 0.05728701502084732 0.7972038388252258 1.196253418922424 0.806815505027771 1.384194612503052 1.721873760223389 0.04775457829236984 -0.4318471550941467 1.117746472358704 -0.2524875104427338 -1.877697229385376 -0.3937424719333649 0.1000218093395233 -1.898982763290405 -2.84639310836792 -2.619985818862915
- 0.9135280251502991 1.203501224517822 1.668694376945496 2.154065847396851 2.527366399765015 2.730547189712524 1.689695358276367 -0.1636868715286255 -2.054582834243774 -1.985506534576416 0.1739869862794876 1.989100456237793 1.741321682929993 -0.1648613959550858 -1.175531029701233 -1.237800359725952 0.4519326388835907 -1.030008912086487 -3.706311941146851 -5.72545337677002
- -3.142806529998779 -3.919329166412354 -4.734344959259033 -4.40484094619751 -2.063961505889893 -1.018884420394897 0.8597702383995056 1.255039572715759 1.6310213804245 0.6763664484024048 -0.5272673964500427 0.9387079477310181 1.663054347038269 1.33214795589447 1.244482755661011 1.056186676025391 2.961543798446655 5.027171611785889 4.088237285614014 -2.922294855117798
- -0.9770626425743103 -0.4073547124862671 0.3676201403141022 1.642319798469543 3.005655288696289 2.641597747802734 1.796241283416748 -2.53751277923584 -6.613279819488525 -4.721647262573242 -2.995388746261597 -2.126639366149902 1.196971416473389 4.928654193878174 5.778659343719482 0.2262211591005325 -1.624743938446045 -3.515040397644043 -0.91311115026474 4.84783411026001
- 2.837055683135986 0.9031884670257568 -1.532898187637329 -2.502817392349243 -0.1501402705907822 3.225682258605957 3.147495031356812 -0.8131982088088989 -0.43022820353508 2.090200662612915 0.8426501750946045 -5.467745304107666 -5.644083976745605 -1.516536116600037 1.89213752746582 1.069879412651062 2.553152322769165 -0.253553569316864 -1.562990188598633 1.312758684158325
- -0.5927649736404419 -1.844843864440918 -2.575576305389404 -3.442096948623657 -2.571449995040894 -0.9164751172065735 0.02997413277626038 0.4077724516391754 -0.122354082763195 -2.290364503860474 -3.182424068450928 -1.360231876373291 2.503585577011108 2.873739957809448 2.53493857383728 3.836205959320068 3.836267471313477 2.364410877227783 -1.161432385444641 1.673118233680725
- 2.856972455978394 2.492480278015137 2.231014966964722 0.7411325573921204 -1.052316427230835 -0.8533980846405029 0.671392023563385 0.6464994549751282 0.9309341311454773 -1.040181040763855 -3.618435144424438 -2.053068161010742 3.62058162689209 1.61152446269989 -6.782958984375 -1.981187582015991 2.699594736099243 0.1594014912843704 0.08959367126226425 -1.369579911231995
- 1.078739285469055 1.074744462966919 0.6718518733978271 0.5085514783859253 -0.09625278413295746 0.0615365207195282 0.8627645373344421 -1.188016176223755 -3.092968463897705 -3.108200073242188 -2.471059560775757 1.775631666183472 6.050312995910645 3.529508113861084 -1.648690223693848 -2.167469501495361 1.695204734802246 3.226016283035278 -2.882296323776245 -3.879907131195068
- 0.9792439341545105 1.214890956878662 2.308911561965942 3.733537435531616 3.540550231933594 0.3062601089477539 -4.126937866210938 -3.654101133346558 -0.9159884452819824 1.832683086395264 1.80902099609375 0.4586995542049408 -0.6427890658378601 -0.8560721874237061 -2.392578363418579 -2.416328191757202 -2.383878946304321 -0.3694500625133514 1.286453366279602 0.2878735959529877
- 2.423818826675415 3.007327318191528 2.135926485061646 -2.034657955169678 -5.461593627929688 -2.561244010925293 -0.338556706905365 -0.5013476014137268 -0.1401437968015671 -0.3544419407844543 0.3951407074928284 1.008994817733765 0.7905126810073853 0.305091917514801 0.9002846479415894 -0.148711159825325 1.587835788726807 3.022983074188232 -4.334061145782471 0.2968471646308899
- -6.327876567840576 -4.028615951538086 -0.2255803793668747 1.545189738273621 -1.878235936164856 -3.734161138534546 -1.011298775672913 -0.5493985414505005 -2.806061983108521 -2.748118877410889 2.139888763427734 2.564397811889648 2.625416040420532 3.003743648529053 0.53402179479599 1.336577415466309 0.6078375577926636 4.079238891601562 2.18957781791687 2.68345832824707
- 2.581474304199219 2.36850380897522 1.43277370929718 0.2482245415449142 -0.1808166205883026 -0.8153743147850037 0.7429525852203369 2.223650455474854 1.142540693283081 -1.983848690986633 -2.907890558242798 0.9047016501426697 2.719773292541504 0.05290422588586807 -1.04272198677063 -1.639018297195435 -6.297164440155029 4.667632579803467 -2.044981002807617 -2.173316955566406
- 2.338831663131714 3.953107357025146 5.057451725006104 3.495959997177124 -0.01505088247358799 -2.239426851272583 -2.637377262115479 -4.052860260009766 -3.427762985229492 -2.303401470184326 -1.582272410392761 -0.2015602886676788 0.1802167594432831 0.9930737018585205 0.4057787954807281 -1.297936677932739 2.388148307800293 2.07930588722229 0.5604507923126221 -3.694672822952271
- -0.06280031055212021 0.1822905689477921 0.9343177676200867 1.633650898933411 1.086728930473328 -0.9122570157051086 -1.499099731445312 -0.4103981554508209 0.7165676951408386 2.630934000015259 4.361100196838379 2.107539653778076 -0.9250072836875916 -0.702198326587677 -1.436064839363098 -1.212265729904175 -1.790579915046692 -5.674106121063232 -3.231900215148926 4.203548431396484
- -0.9261225461959839 -2.652244806289673 -3.41820240020752 -1.213795065879822 2.22429633140564 2.756520748138428 0.2317240685224533 -1.048009157180786 1.010584354400635 -1.464856624603271 -1.315748929977417 -0.9065449833869934 -1.199864625930786 -0.5329930782318115 4.44901704788208 -3.004823446273804 -2.298711061477661 2.834484815597534 2.923709869384766 3.551576852798462
- 1.34647274017334 0.9438439607620239 0.707275390625 -1.848343014717102 -3.687234878540039 -2.206405401229858 -1.744781255722046 -3.352344751358032 -1.09133780002594 0.7478398680686951 0.4757425487041473 0.5614649057388306 1.034227967262268 0.8030547499656677 1.022857069969177 5.572185516357422 -2.217324495315552 -1.043362736701965 3.554798364639282 0.4213726222515106
- -0.2160917222499847 0.07304821908473969 0.02678781189024448 0.7684974670410156 0.8867902755737305 -0.07795398682355881 0.3844016790390015 0.6891030669212341 2.269387006759644 2.06947922706604 -1.088860154151917 -5.27960729598999 -1.748061895370483 6.508728504180908 -1.883930563926697 -5.512304782867432 1.636713266372681 2.368702411651611 -1.225628852844238 -0.6492009162902832
- -1.255194544792175 -1.302929759025574 -0.6579268574714661 -0.1076324284076691 1.711164236068726 3.384237051010132 2.538342952728271 1.231293678283691 -0.02371722273528576 -2.692868947982788 -5.822212696075439 -4.666101455688477 1.978023171424866 3.319245338439941 0.4231303930282593 -0.07671023160219193 -0.07308174669742584 1.972413301467896 0.9325659275054932 -0.8120441436767578
- -1.279676198959351 0.1432122439146042 1.453585743904114 2.485038280487061 2.522484064102173 1.274455070495605 -0.998775839805603 -4.58380126953125 -1.029544472694397 6.014295101165771 5.2723069190979 -1.385550260543823 -3.730100154876709 -2.692431211471558 -1.094702959060669 -0.6503020524978638 1.181514143943787 -0.8170534372329712 -1.225354075431824 -0.8596006631851196
- 8.950066566467285 2.162154197692871 -2.465624094009399 -3.813029289245605 -0.3172167241573334 1.989170789718628 1.339954972267151 1.143736004829407 -0.6551546454429626 -1.059598922729492 0.3803310394287109 3.058720111846924 2.601807594299316 -0.5292413234710693 -4.76899528503418 -3.650734186172485 -2.989776611328125 -2.203534126281738 -0.891753613948822 1.718718886375427
- 3.925971031188965 2.762718915939331 0.3577904105186462 0.07022497057914734 -0.2839126288890839 -3.654122114181519 -1.787204623222351 0.484510213136673 2.004240989685059 0.1203320100903511 3.055083036422729 -3.118391513824463 -0.4780527055263519 -4.470702648162842 3.524649143218994 -1.642618417739868 -1.789724946022034 -0.5149629712104797 -0.7095901966094971 2.143762826919556
- 1.680977463722229 2.680704832077026 2.953125 2.681848764419556 3.414096593856812 2.931484937667847 1.625633835792542 -1.982954502105713 -3.478357315063477 -1.464381337165833 0.04214123263955116 -0.2089722156524658 1.231490850448608 -0.5130674839019775 -5.040481090545654 -6.227958202362061 -2.312071800231934 1.129736423492432 1.778091430664062 -0.9210825562477112
- -2.685198783874512 -2.693038940429688 -3.197998523712158 -3.600865602493286 -1.876337885856628 2.737993478775024 4.938388824462891 1.53123950958252 -0.1327638030052185 1.480213761329651 1.392121434211731 0.1407555192708969 2.590087413787842 2.508197069168091 0.3467240631580353 -1.601864099502563 1.324195504188538 2.399215698242188 -2.399705648422241 -3.201367139816284
- 4.649632930755615 4.103415489196777 2.230583667755127 -1.208535075187683 -2.979002475738525 -2.531723976135254 -1.483600258827209 0.01598095707595348 1.992982506752014 4.341715335845947 3.270479440689087 1.567877054214478 -0.5994386076927185 -0.1800925731658936 -1.483845114707947 -1.11552369594574 -1.85425853729248 -2.021752119064331 -3.223924160003662 -3.490976572036743
- -2.587739229202271 -4.004673957824707 -0.1615901589393616 1.465993642807007 -0.8009586930274963 0.4228487014770508 1.01431405544281 3.661267757415771 3.130116701126099 -5.053112030029297 -4.402786254882812 0.9835018515586853 2.532066822052002 1.21819281578064 0.37729811668396 -3.090780258178711 3.366688966751099 -0.003572235116735101 0.4895821809768677 1.443337559700012
- 1.083445072174072 1.350360035896301 1.467774510383606 1.051374912261963 -0.5367999672889709 -1.734742879867554 -1.915510773658752 -2.681770324707031 -4.414272308349609 -3.800456762313843 -0.5848281979560852 0.8424116969108582 1.573248863220215 -0.3854655623435974 -0.7289639115333557 2.945659875869751 4.600401878356934 1.968300342559814 -0.7895047068595886 0.6893418431282043
- 2.117254734039307 1.794649720191956 1.76526951789856 1.228325486183167 0.853095531463623 1.049728155136108 0.7880261540412903 0.9458931088447571 1.611085176467896 1.895824313163757 2.173893690109253 3.566093921661377 1.621903657913208 -3.045209884643555 -4.809722900390625 -3.937893867492676 -3.790269613265991 -2.349242448806763 -1.712751150131226 -1.765950083732605
- -0.550390899181366 -0.1456060409545898 0.06831026822328568 0.06755679845809937 -0.3594590425491333 -0.6108787059783936 1.305925965309143 3.565895557403564 3.845162391662598 3.343498945236206 4.23656702041626 1.139753937721252 -4.096770763397217 -3.984713077545166 -2.574383974075317 -1.49754524230957 1.370550513267517 -1.396419048309326 -2.481056690216064 -1.245996832847595
- 2.539516925811768 3.312321424484253 3.472085475921631 1.80453085899353 -1.291619300842285 -2.945203304290771 -2.752407789230347 -0.7741461396217346 1.255736112594604 1.038846611976624 0.3887260854244232 0.2155319005250931 0.5921913981437683 -0.7804065942764282 -1.855653166770935 -1.52841317653656 1.821839094161987 3.595362186431885 -1.577325224876404 -6.531517028808594
- 1.448929667472839 0.9731826186180115 0.3772236108779907 0.4992556869983673 0.03069067560136318 0.2661497294902802 -0.6922726631164551 -1.757544279098511 -1.942002177238464 -0.2323834449052811 -0.1351326704025269 -1.141071438789368 -1.922140121459961 -0.5856561660766602 -0.4116664528846741 0.988368034362793 8.018025398254395 5.373849868774414 -4.720942974090576 -4.434868335723877
- -1.300205707550049 -1.283541560173035 -2.541507959365845 -1.363983392715454 1.581914305686951 1.192334413528442 -3.307676553726196 -6.183123588562012 -0.2655551731586456 5.10042667388916 1.284762382507324 0.6987558603286743 -0.1073669418692589 1.511645436286926 -0.2220783829689026 -1.443181872367859 0.4423579573631287 1.494206070899963 4.214337348937988 0.4974804818630219
- 3.982675313949585 2.500311851501465 0.9296759963035583 -0.2905532717704773 -0.9293051362037659 0.4707818627357483 1.093547105789185 1.030629634857178 -0.9216092824935913 -1.830772519111633 -3.620242834091187 -5.397396564483643 0.4524465501308441 2.335021734237671 -0.712591826915741 -0.5228031277656555 5.887351989746094 0.2700175642967224 -1.985262274742126 -2.741916179656982
- -1.743592143058777 -3.184886932373047 -4.194586277008057 -3.433204650878906 -1.825550436973572 0.4183304607868195 0.01079587917774916 -0.8160049915313721 1.921983361244202 1.985825896263123 1.164842963218689 -1.048493385314941 -1.276103138923645 1.516258358955383 4.86310338973999 4.435692310333252 3.67277717590332 -2.676289319992065 0.8816239237785339 -0.6725241541862488
- -1.183035373687744 -2.049641609191895 -2.717050313949585 -1.753745079040527 0.3172051012516022 2.691312789916992 2.903335571289062 2.621742010116577 1.172496676445007 -0.882566511631012 0.9131653904914856 2.198816299438477 1.515944004058838 -0.3016216158866882 -0.7288107872009277 1.069084405899048 3.881456613540649 -0.0991465300321579 -3.955688714981079 -5.613255023956299
- -2.34644889831543 -0.9500645399093628 2.081428050994873 2.734233617782593 1.797738671302795 -0.006271620281040668 -1.47850501537323 -0.89984130859375 -2.507781028747559 -4.745498657226562 3.516669273376465 1.686064839363098 0.09878169000148773 -1.788741588592529 -1.648031234741211 1.870131969451904 0.6805910468101501 3.269325494766235 0.9005476832389832 -2.264332294464111
- -3.011304616928101 -1.872262954711914 -0.5455194115638733 0.3007282018661499 0.6100534796714783 0.2692229747772217 -0.03983331099152565 -0.2470410317182541 1.529674887657166 4.210292339324951 3.105183362960815 -0.6378636956214905 -1.827103137969971 -1.803852558135986 -0.8596709966659546 5.830551624298096 -2.828168869018555 -3.047624111175537 -1.632792234420776 2.497328758239746
- -2.664051294326782 -0.2667175531387329 1.790863275527954 2.401898145675659 1.839009404182434 0.7107056975364685 -0.6093127131462097 -1.575464606285095 -3.61558198928833 -4.224365711212158 -1.074870109558105 1.991366028785706 2.224975109100342 1.857958793640137 1.306209564208984 -0.4488008618354797 -1.27746307849884 -1.346636533737183 -0.1418596357107162 3.122139453887939
- 3.413169145584106 2.538918256759644 0.3459382653236389 -0.9251654148101807 -1.021764039993286 -2.135052680969238 -3.619184494018555 -1.634521007537842 0.4082626700401306 0.3465279638767242 0.6109509468078613 2.378391981124878 -3.827320098876953 -0.9945292472839355 1.115954279899597 -2.059475660324097 5.303928852081299 0.9681726098060608 1.328379154205322 -2.541584014892578
- 1.499601602554321 1.000034093856812 0.2513402104377747 -0.1194327101111412 0.961767315864563 2.157263040542603 2.368011951446533 1.760470986366272 0.003814725670963526 -1.885188221931458 -1.488059639930725 1.969880819320679 0.01281854044646025 0.07247123867273331 -0.4742676317691803 -2.063200950622559 -2.894011974334717 -0.8292675018310547 -1.867210507392883 -0.436829149723053
- 7.415341854095459 4.679947376251221 -0.01050963532179594 -4.071547985076904 -3.97344708442688 -2.266092300415039 -0.7633808255195618 -0.04246245324611664 -0.203739657998085 -1.227560043334961 -1.35532009601593 1.050325751304626 2.07463526725769 0.9253273010253906 0.1675505042076111 1.64550518989563 3.207226514816284 -0.2274925410747528 -1.352173924446106 -5.672138690948486
- -1.898545145988464 -0.6441818475723267 0.3502191007137299 1.066592335700989 0.2693812251091003 -1.69586718082428 -3.87159538269043 -2.28667163848877 0.4059168696403503 2.196408987045288 1.898446559906006 1.779008626937866 0.9248983860015869 0.2051427960395813 1.24515974521637 3.303592681884766 6.128532886505127 -1.937797427177429 -3.950801134109497 -3.487842082977295
- 0.1516454070806503 2.215803146362305 4.908269882202148 2.082131624221802 -2.436846733093262 -3.718151092529297 -0.1713129431009293 -1.137084364891052 -3.646186590194702 -2.168651819229126 3.060532093048096 1.469862461090088 -1.273031115531921 -0.1882144659757614 -3.945636749267578 -0.8899976015090942 1.718190670013428 0.6414726376533508 1.18510377407074 2.142102241516113
- 0.2086958885192871 -0.6458078026771545 -0.1587435454130173 1.82531213760376 2.517449378967285 0.8300987482070923 -2.093193292617798 -2.139988660812378 1.725311875343323 1.53205668926239 -1.278612375259399 -1.996461272239685 -2.516732215881348 -4.302355766296387 -3.053000450134277 5.937968730926514 3.488107919692993 2.696087121963501 -1.575858235359192 -1.000340461730957
- 0.09748056530952454 1.122649192810059 0.6962146759033203 1.047524333000183 1.269667744636536 0.227587416768074 -0.4924246966838837 0.2546910643577576 2.253618240356445 1.903453588485718 -0.3235071301460266 0.6117635369300842 2.720096111297607 3.185922861099243 -4.25635290145874 -8.060596466064453 -3.68529486656189 -3.083024978637695 -0.4128779768943787 4.923409938812256
- 1.630689978599548 0.98050457239151 1.333264231681824 1.829413056373596 2.540329694747925 1.638649225234985 0.8695799708366394 1.013662576675415 1.412273168563843 -3.671929597854614 -5.960317134857178 -2.860669851303101 -1.072245955467224 -1.200642466545105 0.4062235951423645 2.335040330886841 2.680099487304688 0.2577986121177673 -0.592905580997467 -3.568818092346191
- 4.689018726348877 4.519196033477783 4.059896469116211 3.0339674949646 2.299744844436646 1.235875248908997 -0.1321182250976562 0.100344642996788 1.02567183971405 0.3347478210926056 -1.620137095451355 -2.011083602905273 -2.032325267791748 -2.117369174957275 -2.707364082336426 -2.422475337982178 -1.503098011016846 -2.15949559211731 -2.712530612945557 -1.880461692810059
- 2.306589126586914 -0.4024480581283569 -2.301783800125122 -2.135865688323975 0.5871487855911255 1.249439477920532 -2.285779714584351 0.3783716261386871 2.349616765975952 -0.3999252617359161 -2.693830251693726 1.106496930122375 -0.2962234020233154 -4.055545330047607 4.353967666625977 -2.374120950698853 1.936208486557007 2.02873420715332 0.7309495806694031 -0.08200207352638245
- 2.786206960678101 2.668025970458984 1.745712757110596 0.7529512047767639 0.5644647479057312 0.8536949157714844 1.513676881790161 1.202269554138184 0.9400677084922791 0.4857968091964722 0.6255044937133789 -0.8105387091636658 -3.529870510101318 -5.842987060546875 -4.407203197479248 -0.05232741311192513 1.46184504032135 -1.924028873443604 -3.01827335357666 3.985016107559204
- -0.008113428018987179 0.5660753846168518 0.9294919371604919 1.581533432006836 1.115763783454895 2.067715406417847 4.347882270812988 2.955169439315796 -6.827727794647217 -1.862815737724304 -2.504034280776978 -0.9208692908287048 0.1155669912695885 -1.236315250396729 1.07185161113739 3.006508588790894 -2.592896938323975 -1.709957122802734 1.049230813980103 -1.144058346748352
- 2.409350395202637 2.23582124710083 -0.3402231633663177 -2.433928251266479 -1.385465264320374 -0.5246292352676392 -2.478551387786865 -1.993001580238342 -0.865767776966095 -1.606540441513062 -1.063154578208923 -0.7123730182647705 1.660784840583801 7.742666244506836 -2.127227783203125 -1.822961568832397 -2.400290727615356 0.6258722543716431 2.222369432449341 2.857248067855835
- -4.636505126953125 -3.944947242736816 -1.174988627433777 1.544285297393799 2.648262500762939 1.770408868789673 0.08630818873643875 -2.455178260803223 -2.924627780914307 0.1822405755519867 3.947190761566162 3.241473197937012 0.5515185594558716 -0.7145354747772217 -0.8927555680274963 -0.1512598246335983 1.103008270263672 0.7411171793937683 0.9069061875343323 0.1720729023218155
- -1.00038480758667 0.6768290996551514 3.58110523223877 3.822054147720337 1.054018139839172 -1.22930371761322 -0.8793721199035645 -0.4868297576904297 0.1832262724637985 -0.6697851419448853 -1.872934818267822 0.139283612370491 6.782491683959961 -2.623489141464233 -5.121035099029541 -2.204014539718628 -2.21247935295105 2.219970941543579 -0.0395641140639782 -0.1197867766022682
- 5.36863899230957 2.320730447769165 -0.9496486783027649 -3.339934587478638 -2.172893524169922 -0.3047231733798981 -0.3569243848323822 1.084809064865112 1.083213329315186 0.0910109207034111 -0.1769344508647919 -1.477084517478943 -1.846298098564148 -1.744992733001709 -2.515811204910278 -2.416417121887207 -0.7893837094306946 -1.082106947898865 2.302924394607544 6.921826362609863
- 0.2962099313735962 1.402395248413086 2.869835138320923 4.363369464874268 4.366862773895264 2.365393400192261 -1.150591611862183 -4.272635936737061 -4.453513622283936 -2.193560838699341 -0.7572203874588013 -1.033759951591492 -0.5224516987800598 -0.3620997965335846 -0.5172574520111084 -2.661078691482544 0.06091374531388283 4.675126075744629 -2.05347204208374 -0.4224680364131927
- -0.4634552597999573 -0.7852734327316284 -0.3235795199871063 1.48763906955719 2.065875291824341 1.622999906539917 1.532273650169373 -0.02392737753689289 -1.683803915977478 -3.235286235809326 -2.824216842651367 -3.836560487747192 -2.768944263458252 -1.92069149017334 -0.4522866308689117 3.212500333786011 1.505879402160645 -1.039793610572815 0.8325814008712769 7.098064422607422
- -0.2492552399635315 1.817596554756165 3.026833057403564 1.543034195899963 0.698566198348999 -0.2403708249330521 -0.5762346386909485 -0.1735755205154419 0.6721184253692627 -0.01150834839791059 -1.593131422996521 -4.011972904205322 -4.170482158660889 -1.676751375198364 -1.095991611480713 -3.052336692810059 -1.732545256614685 2.67919397354126 2.718042373657227 5.428771495819092
- -5.781765460968018 -2.349586248397827 0.6335902810096741 2.558069705963135 0.6671069860458374 -2.355352878570557 -3.23147177696228 -2.631713390350342 -0.4098121225833893 1.325615406036377 1.105318903923035 -1.755217909812927 -1.130976915359497 2.656232833862305 2.981982231140137 3.440193653106689 3.753854990005493 2.051274538040161 -0.8867725133895874 -0.6405686736106873
- 4.928459644317627 -7.384880065917969 -2.831598043441772 2.505595207214355 -0.1236712262034416 0.9499881267547607 -1.34644889831543 0.7326071262359619 0.8114901781082153 -0.3090329170227051 -1.413174867630005 -0.2937881946563721 -0.8449950814247131 -1.185345768928528 1.056826829910278 1.341277241706848 1.592118501663208 0.9586052298545837 0.1298162192106247 0.7261488437652588
- -2.943997383117676 -2.495987176895142 -0.9931591749191284 0.4088180065155029 -0.05235563218593597 0.2732318043708801 2.618948459625244 2.107980966567993 -1.746818423271179 -1.972509503364563 -1.243218421936035 -1.533345937728882 -0.004780224524438381 -0.7466258406639099 -0.8186952471733093 -0.07976577430963516 -0.9385713338851929 0.3193176090717316 8.988508224487305 0.8530231118202209
- 0.6725184917449951 -0.7527700066566467 -2.619318008422852 -4.336596488952637 -4.078447818756104 -0.9098162055015564 1.987511992454529 2.89670991897583 1.877282500267029 1.066784143447876 -0.3056377768516541 -0.6793118715286255 2.670625448226929 4.677536964416504 1.789814472198486 -1.990837812423706 -0.4971506595611572 -1.528030633926392 -0.7574587464332581 0.8165900111198425
- 0.3461527526378632 -1.272879719734192 -0.9220470190048218 2.760842800140381 2.638737678527832 -2.523347854614258 0.0795324519276619 4.064794063568115 1.336477637290955 -3.260955333709717 0.5778152346611023 -3.985713005065918 1.516497850418091 0.6206018328666687 -2.55692195892334 0.4346851408481598 -3.904742240905762 0.1841141283512115 2.090150356292725 1.776205658912659
- -5.227280139923096 -1.209118366241455 2.191707372665405 2.639630317687988 0.6573095917701721 -1.028080463409424 0.3515641093254089 1.960708737373352 2.340264797210693 2.408000230789185 2.187431335449219 1.431820631027222 -2.120247602462769 -2.748018026351929 -2.418210506439209 -3.571943283081055 -1.392201900482178 4.845144271850586 -0.9770885109901428 -0.3213975727558136
- -2.043016910552979 -3.046781063079834 -3.842391014099121 -2.219273567199707 2.093014240264893 4.279487609863281 3.131388902664185 2.988543033599854 2.473475456237793 0.06153576821088791 -3.807759284973145 -2.551745176315308 -2.139024257659912 -1.267277240753174 0.2637574970722198 5.370180606842041 2.648119926452637 3.335795879364014 -2.156539678573608 -3.571489572525024
- 1.275663614273071 -0.1627533137798309 -2.799559593200684 -3.372941017150879 -2.410378932952881 -1.358693480491638 0.1089682951569557 0.5672398209571838 0.1229675635695457 1.788984060287476 5.03717041015625 4.388677597045898 1.879981160163879 -0.4258941113948822 -0.4019408822059631 4.588913440704346 1.558045744895935 -1.894327998161316 -4.425883769989014 -4.064239978790283
- 4.318189144134521 2.751234292984009 0.2829276025295258 -2.910548686981201 -1.979781270027161 2.966404676437378 4.263378143310547 -0.7366398572921753 -1.090137124061584 -0.01572997123003006 -1.269016146659851 -3.628020763397217 -2.645751237869263 0.5460577011108398 -0.7541292309761047 0.7128481864929199 -2.082374811172485 -0.70896315574646 2.64811372756958 -0.668062686920166
- -4.623716354370117 -2.302133083343506 -6.889860153198242 -6.005307674407959 -1.081237435340881 16.72801399230957 -2.088576078414917 -2.896540880203247 4.548826694488525 -6.325735569000244 0.5507532954216003 2.046671628952026 -4.968996047973633 -3.730587959289551 3.371580839157104 -2.611865043640137 -1.423172473907471 -1.252711296081543 16.52289772033691 2.431673526763916
- 3.2436683177948 1.653014421463013 -0.2329336106777191 -0.2412382215261459 1.389712929725647 2.610812664031982 1.040119647979736 1.056528329849243 2.587957143783569 0.02149972133338451 -2.710483074188232 -3.909730911254883 -3.513160228729248 1.472121119499207 4.622661113739014 -1.375612378120422 -5.545970916748047 0.6564407348632812 -0.6024191379547119 -2.222986221313477
- 2.791118621826172 2.096353530883789 0.8548614382743835 0.326848179101944 -1.355351567268372 -1.673450469970703 -1.079655528068542 0.7899753451347351 -0.7372048497200012 -2.989439010620117 -0.6738529205322266 7.742810249328613 3.953354597091675 -2.906037569046021 -3.507718324661255 0.3794279098510742 -1.802185297012329 -0.01503289397805929 0.4149118065834045 -2.609737157821655
- -1.306400656700134 -0.237811341881752 1.566078066825867 3.469221353530884 3.999252796173096 3.54664945602417 3.208535194396973 1.926640629768372 0.3310911953449249 -0.6113461852073669 -2.109458923339844 -3.80659818649292 -3.577003479003906 -1.582272291183472 -2.446916341781616 -2.507627725601196 2.779303312301636 1.469172477722168 -2.111587524414062 -1.998923182487488
- -3.847949743270874 -3.146463871002197 -1.405809998512268 -0.3051537871360779 -0.02258723601698875 -0.07752328366041183 -0.1886478960514069 1.321210145950317 2.052456140518188 0.4253513514995575 -0.4235289394855499 1.592959403991699 0.213726818561554 -2.012930154800415 -0.4827274978160858 2.060429573059082 2.793022632598877 -1.223517894744873 2.558805465698242 0.1188790947198868
- -2.764703512191772 -2.129357814788818 -0.917736828327179 1.197009801864624 2.688787937164307 1.59153139591217 0.3399880230426788 -1.711789488792419 -2.784286022186279 -1.924505233764648 0.50083988904953 0.3961921632289886 -0.216722697019577 -0.2049663066864014 -1.116783022880554 -1.271123290061951 -1.928176403045654 -0.9552882313728333 2.082529067993164 9.128556251525879
- -1.263115167617798 -1.12502133846283 -0.9244920015335083 -0.7616177797317505 -0.576793909072876 1.366979837417603 1.355091571807861 -0.3981406986713409 -0.9075824618339539 0.2151392996311188 -0.4842222630977631 -2.200862169265747 -0.6150520443916321 5.542587757110596 3.255381107330322 -0.6138777136802673 -4.638441562652588 -0.6119273900985718 2.378829956054688 1.00713837146759
- 0.7585794925689697 1.766006827354431 3.076374292373657 3.163918972015381 1.732400894165039 -0.9458684325218201 -2.86342453956604 -2.686741590499878 -1.84391176700592 -0.5596410036087036 1.793423533439636 2.157157897949219 0.7795391082763672 -2.654270172119141 -5.051540851593018 -0.2388036847114563 6.217349529266357 -0.2776187062263489 -2.700377464294434 -1.622559309005737
- 3.07083535194397 2.339120626449585 0.7922935485839844 -0.9941287040710449 0.02557752095162868 1.851992130279541 1.782932639122009 0.8367459177970886 0.8800138831138611 0.9838425517082214 0.8278151154518127 -0.2318043261766434 -2.380693912506104 -0.472337007522583 1.777923464775085 1.87605094909668 -2.56452488899231 -6.413066387176514 -5.116411209106445 1.127830147743225
- 2.200177907943726 -0.4993496239185333 -2.964590311050415 -3.342673063278198 -0.7716522216796875 2.789312124252319 3.970641613006592 1.75713062286377 -2.290652751922607 -4.041758060455322 -4.369264125823975 -1.357726335525513 2.769946813583374 4.553998470306396 5.197065353393555 0.8802440762519836 -1.01824414730072 -1.084168314933777 -1.525487661361694 -0.8529430031776428
- 0.04349595308303833 0.1950835138559341 1.874127984046936 2.7015540599823 2.463735580444336 2.446211814880371 2.101677179336548 -2.962379932403564 -5.301493167877197 -0.04583136737346649 0.1571594327688217 -3.10448145866394 0.848435640335083 4.860725402832031 0.9659931063652039 -0.2521164119243622 -0.3625280559062958 -2.142562389373779 -2.997592926025391 -1.489210844039917
- -0.8642691373825073 -1.195456147193909 -1.44449520111084 -1.735252499580383 0.5135400891304016 2.650077104568481 3.272169589996338 2.410286903381348 0.4308320879936218 -0.8395769000053406 -2.17469596862793 -2.507655620574951 -0.7924020886421204 3.629956007003784 6.422986030578613 5.569507598876953 -1.43520987033844 -4.916754722595215 -4.94819450378418 -2.045391082763672
- -3.335895299911499 -2.268898248672485 -0.4255673289299011 -0.03816553205251694 -0.9779834151268005 -1.186464190483093 -0.09549914300441742 1.313698291778564 2.275920152664185 3.081841707229614 2.744543552398682 2.47901177406311 2.760192632675171 0.10756865888834 -1.410292506217957 -2.568015336990356 -1.062770247459412 -2.096790552139282 -1.319215297698975 2.022785186767578
- 4.684600353240967 -1.844922780990601 -7.143537044525146 -0.8666052222251892 2.414668798446655 4.036345958709717 2.27144455909729 -0.7613409757614136 -2.608560085296631 -1.8277747631073 0.4198328256607056 1.451507687568665 -1.922782301902771 -0.8172503709793091 1.654939770698547 -2.306989431381226 1.448765277862549 0.6824448108673096 0.02111987583339214 1.01409375667572
- -1.692325711250305 -2.184553384780884 -2.10218358039856 -0.09578699618577957 2.228186130523682 2.623479604721069 1.959334850311279 -1.318089723587036 -3.829515218734741 -3.123764991760254 -2.339495182037354 -3.976166009902954 -1.471984148025513 1.780753374099731 4.01289701461792 2.922211647033691 4.360041618347168 0.1676905900239944 0.526846706867218 1.552429914474487
- 0.3344283103942871 -1.291541695594788 -0.9038380980491638 2.56584095954895 4.820815563201904 -3.57453179359436 -6.717348098754883 2.911172389984131 0.9218342304229736 -1.986038565635681 1.170289278030396 -0.06239826232194901 2.292547225952148 0.8090817332267761 0.2117560505867004 -2.891561508178711 2.988969326019287 0.4681760668754578 -1.144858241081238 -0.9227947592735291
- -1.826314210891724 -1.754594326019287 -3.01036262512207 -1.88750171661377 0.4161270260810852 -0.2800817489624023 -1.397851347923279 -1.395628213882446 0.673579216003418 -4.044177055358887 4.391806602478027 8.167318344116211 2.898618221282959 2.443790674209595 -2.162331819534302 -0.6609148979187012 -3.967863798141479 -2.03875732421875 -0.1461312472820282 5.581264495849609
- 2.812103033065796 3.123026847839355 3.066988706588745 2.961346864700317 2.027236700057983 -1.822220206260681 -5.147045135498047 -4.246560096740723 -2.486081838607788 -1.938552856445312 -0.89797043800354 0.3832512199878693 -0.5191247463226318 -1.538990259170532 -0.08232738077640533 4.152136325836182 0.2749515175819397 -1.449609518051147 0.34468013048172 0.9827666282653809
- -1.581940054893494 -1.883486866950989 -1.772028684616089 -0.7374373078346252 1.328734874725342 2.505082368850708 0.5012051463127136 -0.672995924949646 -0.6718342900276184 0.09070800989866257 -0.6943642497062683 0.3483452796936035 2.733851194381714 5.97962760925293 -1.683677434921265 -4.372589111328125 -1.37207567691803 5.466661930084229 -2.648414373397827 -0.8633710741996765
- -0.9156389832496643 -2.105777263641357 -3.224012851715088 -2.382087469100952 -1.20255172252655 -0.2402347326278687 -0.9952443838119507 -0.3743942677974701 1.612543225288391 1.500919699668884 1.206759691238403 0.5599402785301208 1.813851833343506 4.088022708892822 8.926924705505371 -1.459465980529785 -5.284323215484619 -2.292426109313965 1.966849446296692 -1.199653625488281
- -3.427816152572632 -1.816295385360718 0.3855145275592804 1.898669242858887 1.459931373596191 -0.5537392497062683 -3.864177942276001 -3.213627099990845 -0.85962975025177 0.4924800395965576 -1.049012541770935 0.2265847325325012 1.099317908287048 4.087194442749023 3.689862966537476 -3.625888347625732 -4.641784191131592 0.5120067596435547 6.034490585327148 3.165913581848145
- 1.776201248168945 -1.040261626243591 -3.40283203125 -3.492448568344116 1.270417094230652 4.74774169921875 2.008545398712158 -1.63007926940918 -2.207189798355103 -0.1419738233089447 0.4140065312385559 0.3830350339412689 1.075376868247986 -0.08395946770906448 1.632293105125427 0.3006181120872498 4.057515621185303 -0.9087996482849121 -4.641332626342773 -0.1168743669986725
- 0.9524889588356018 0.8946379423141479 0.4786113500595093 -0.2127174586057663 0.6955034732818604 2.565141439437866 0.4860809445381165 -4.122813701629639 -3.814164400100708 0.4842146039009094 4.104711532592773 2.191668748855591 0.7880504131317139 0.4310582280158997 0.8920984864234924 -3.510748624801636 -4.833930969238281 -1.136292815208435 0.7651386857032776 1.901268482208252
- -3.330813407897949 -0.9627285003662109 0.9309161305427551 2.322856903076172 2.965914964675903 2.384452342987061 0.4624191224575043 -1.312568545341492 0.2238638699054718 1.745165109634399 3.212472200393677 2.849147319793701 2.735619783401489 1.017621040344238 -2.363679885864258 -2.882908344268799 -3.7200026512146 -1.703224301338196 -3.15653395652771 -1.417991638183594
- -0.3557108938694 -1.237022280693054 -1.920073270797729 -2.884670495986938 -2.558191061019897 0.7829590439796448 3.617220878601074 2.728307008743286 -2.455113887786865 -3.805186748504639 -0.5509454607963562 0.8650372624397278 0.02325134165585041 -1.136043906211853 -0.6322678923606873 0.113565668463707 4.386733531951904 2.084975481033325 -0.7072232961654663 3.640396595001221
- 0.1652252823114395 0.07702844589948654 -0.8720242381095886 -1.352357149124146 -0.6620933413505554 -0.4443088471889496 -0.3202587962150574 1.057315945625305 -0.02818114683032036 -0.1994329988956451 -1.262977957725525 -3.990545511245728 -4.657601356506348 6.193367004394531 2.653747320175171 1.900214672088623 2.429477691650391 1.19290566444397 -0.5250349044799805 -1.354464530944824
- 3.180796146392822 1.684457898139954 -0.2434033453464508 -1.200877070426941 -1.66473388671875 -2.266343832015991 -2.248439073562622 -3.02873682975769 -3.200077533721924 -1.758388161659241 -0.6658428907394409 2.336386680603027 4.437602996826172 4.547305583953857 4.884922504425049 1.110220193862915 -1.93416166305542 -1.145631313323975 -1.287282586097717 -1.537776589393616
- -1.023317813873291 -0.3008571267127991 0.1561834961175919 -0.04655804112553596 -0.04335153102874756 0.9429492354393005 0.7884448766708374 -0.647585928440094 -0.8861508369445801 0.7611973881721497 1.418976545333862 1.455326557159424 1.97431755065918 1.780092477798462 2.955410718917847 1.46821141242981 0.3925897479057312 -4.102686405181885 -4.564184188842773 -2.479003667831421
- -8.218681335449219 -3.566868543624878 1.855102181434631 5.511859893798828 3.82102370262146 0.8773584961891174 -0.8684132099151611 -1.030125856399536 -1.468230724334717 -0.7591843605041504 0.4122280776500702 -0.1640418320894241 0.2173622101545334 1.351261019706726 0.6267194151878357 -2.048535346984863 -1.152574181556702 3.207647800445557 0.3885404765605927 1.007549405097961
- 0.7792531847953796 1.214251160621643 1.083475589752197 -0.6135390400886536 0.4538560509681702 -0.5160768032073975 -0.2662078738212585 0.7339430451393127 -0.2886902093887329 -0.3962529897689819 -2.030474185943604 1.155610322952271 2.607173442840576 -5.100152492523193 1.58341121673584 -1.342710494995117 2.77907919883728 -1.291707038879395 -1.110264897346497 0.5660248398780823
- 5.988917350769043 -0.6864361763000488 -5.233677864074707 -7.056098937988281 -3.686964750289917 0.7768621444702148 2.619722843170166 1.668745756149292 0.5527424216270447 0.1692372411489487 -0.2117762565612793 0.3596915304660797 1.092411041259766 0.05775297060608864 -1.302576541900635 -0.1835884153842926 1.042017221450806 1.108894228935242 1.618121147155762 1.305999875068665
- -4.684010982513428 3.766290664672852 0.8334711194038391 -2.450476169586182 -1.954184174537659 -1.545153021812439 1.202027678489685 1.001728296279907 -2.442356824874878 -1.823500514030457 3.688943862915039 3.680140972137451 2.7550048828125 0.1211226209998131 -0.381228119134903 -3.584646701812744 -1.515619993209839 -0.3526636064052582 -1.22882866859436 4.913937568664551
- -2.001219987869263 -1.722123146057129 -0.858845055103302 -0.2947234213352203 -0.8887907862663269 -2.042191982269287 -1.93724536895752 -1.555139183998108 -1.761178612709045 -2.061721086502075 0.5160256028175354 1.111323356628418 -0.7145267724990845 0.02064616791903973 2.140822649002075 2.812996625900269 6.732042789459229 -1.257380366325378 -1.508837699890137 5.270064830780029
- 2.813940763473511 3.818896532058716 3.220969915390015 1.746689677238464 1.28357994556427 0.6407355666160583 0.2140964865684509 -1.017700791358948 -1.486476540565491 0.3347507417201996 -0.2448190599679947 -2.55954909324646 -2.849544763565063 -2.146551609039307 -0.429468184709549 4.529891014099121 2.647419929504395 -1.019735813140869 -5.763925075531006 -3.733203649520874
- 0.5618757009506226 0.04183336719870567 0.2829039096832275 1.755828380584717 2.759276866912842 -1.981367230415344 -6.904044628143311 -5.071457862854004 -1.772143006324768 0.9665818214416504 1.231832265853882 -0.144504502415657 0.246131643652916 0.3566900491714478 1.000815629959106 0.7930272817611694 -0.3874965608119965 5.69962739944458 0.65835040807724 -0.09376088529825211
- 2.265027761459351 2.841084957122803 2.768940210342407 -0.02663189917802811 -3.286848783493042 -3.668768644332886 -3.423656940460205 -0.9613938927650452 0.6519028544425964 -0.4566704034805298 -2.342981815338135 -0.3570006489753723 -0.3128823041915894 -1.572396993637085 -2.763247013092041 -0.4568156599998474 6.773353576660156 2.199715852737427 0.1143937557935715 2.014874458312988
- -2.565356731414795 -1.186033964157104 0.1507374197244644 0.6904939413070679 1.036520481109619 1.232287645339966 1.026824235916138 1.231656312942505 2.084303140640259 0.1626958101987839 -2.308375120162964 -2.052404880523682 1.011566281318665 0.6293473839759827 -1.249484658241272 -2.045370578765869 -1.683743953704834 1.138691067695618 -0.006142654921859503 2.701789855957031
- -0.4824840724468231 -2.227495670318604 -1.840970158576965 0.5646653175354004 -1.578695058822632 -3.812900304794312 -0.9884511232376099 2.068039655685425 0.09224601089954376 0.6240044832229614 2.781502246856689 3.469705581665039 -0.3121247589588165 -5.635539531707764 3.481332540512085 2.701026916503906 -0.774756133556366 -3.047760248184204 3.20404577255249 1.714610695838928
- 1.244764685630798 1.447283148765564 1.27377188205719 0.3290298581123352 -0.1407239139080048 -0.249041959643364 0.1230414360761642 -0.7334665656089783 -2.358121156692505 -3.595139980316162 -5.01688289642334 -4.708362102508545 -1.644675254821777 -0.2702929973602295 0.7621994018554688 1.72296130657196 1.885928988456726 3.846893548965454 2.968327045440674 3.112507104873657
- 3.532830476760864 1.905431151390076 -0.1003651320934296 -0.6697112321853638 2.297243356704712 3.411514759063721 1.557764172554016 -0.5362000465393066 -0.3026747405529022 0.283659040927887 -1.61668586730957 -1.749811291694641 -2.597909927368164 -2.010987758636475 -1.559972047805786 -1.325504183769226 -0.8779592514038086 6.520644187927246 -2.194122076034546 -3.967176914215088
- -1.871952772140503 -1.243737578392029 -0.751727819442749 -0.5315722823143005 -0.2581925094127655 1.003674864768982 1.964991688728333 2.583043098449707 3.553110361099243 4.076921463012695 3.564288377761841 3.103835105895996 0.9899579882621765 -0.09774848073720932 -0.08414078503847122 -1.007092475891113 -3.116352558135986 -4.162136554718018 -4.007534503936768 -3.707638263702393
- -0.6110165119171143 0.995637834072113 1.962226867675781 1.615572810173035 1.375821709632874 0.4468392431735992 -0.8705726265907288 -0.61809241771698 0.5076802372932434 1.598168253898621 1.521427869796753 -0.3127596080303192 -1.852982759475708 -0.8769214153289795 2.478506565093994 1.253387570381165 -4.295887470245361 -5.120477676391602 5.904015064239502 -5.100572109222412
- -9.148601531982422 9.006413459777832 3.232460021972656 -6.388524055480957 1.422566771507263 1.869997978210449 -2.803926229476929 2.283159255981445 0.3277046084403992 -0.3104619085788727 -0.9541979432106018 -0.3242390751838684 -1.423137664794922 1.508536696434021 0.2883390486240387 0.3418907523155212 -0.5461450815200806 1.322430729866028 -0.01056482642889023 0.3063026070594788
- -2.036820411682129 -2.35016918182373 -1.044999957084656 1.692157983779907 0.6363020539283752 -1.67059850692749 -1.697255849838257 -1.810060739517212 -2.504842519760132 -2.310841083526611 -2.831440925598145 -1.403926730155945 6.042915344238281 4.38822078704834 -1.034969806671143 -3.507012844085693 6.382536888122559 0.5199052691459656 1.293260812759399 3.247636795043945
- 2.786171436309814 0.9289950132369995 -0.477313369512558 -0.1216153055429459 1.810048222541809 2.165903568267822 -0.1938784867525101 -3.109621286392212 -3.023420095443726 -1.099364399909973 -1.442540526390076 -1.844265222549438 -0.3933765292167664 1.494388580322266 0.03202163428068161 -0.3237376511096954 -2.27657675743103 0.5597753524780273 1.521786332130432 3.00661826133728
- -0.3459900319576263 -0.1308896243572235 0.2063546478748322 0.7647039294242859 0.8749287724494934 1.816063165664673 1.455613017082214 -1.414953112602234 -3.19898247718811 -3.521245956420898 -2.472352504730225 -1.387831926345825 1.206044435501099 1.163167357444763 2.788333415985107 6.192074775695801 3.191872119903564 0.6181160807609558 -4.339565753936768 -3.465464115142822
- -0.7849637269973755 -0.5405548810958862 -1.06424868106842 -0.8121200203895569 -0.7035602331161499 -1.312778949737549 -1.22839879989624 -0.6326525807380676 -0.3292334973812103 0.8223403692245483 5.024534225463867 6.962143421173096 2.079214334487915 -1.857627987861633 -3.68907618522644 -3.662513494491577 -2.655725240707397 -0.4090327322483063 3.263421058654785 1.530823588371277
- 1.035767674446106 1.408733129501343 1.22136402130127 0.9877231121063232 0.6859818696975708 0.04878819733858109 1.601135015487671 2.882477045059204 3.630971193313599 2.387482643127441 -0.8575460314750671 -2.247939109802246 -2.515256643295288 -2.397141456604004 -2.383872985839844 -0.7042079567909241 1.427923440933228 1.677761673927307 -0.304531067609787 -7.585615158081055
- -4.088444232940674 -3.461344242095947 -1.622636556625366 0.7055404186248779 0.8220340609550476 0.1018122285604477 0.9279172420501709 2.196024179458618 1.8846595287323 0.507500946521759 1.01116418838501 0.9111276865005493 1.065937876701355 0.2298617660999298 1.39046585559845 8.05463695526123 -0.04711972177028656 -3.437175273895264 -4.589169025421143 -2.562790393829346
- 2.06325364112854 1.841472268104553 1.701282858848572 0.8503978848457336 -0.3080076277256012 -0.6069350838661194 -0.4206934869289398 -1.103274941444397 -1.826452493667603 -0.6048267483711243 2.19294285774231 -0.9212049841880798 -3.243194580078125 -4.524242877960205 -4.685952663421631 5.110512256622314 -0.5957462191581726 0.004722327459603548 4.086636066436768 0.9893117547035217
- 0.6028595566749573 0.171802431344986 -0.6300531029701233 -2.012423276901245 -3.666726350784302 -4.261476993560791 -3.795412540435791 -2.51570463180542 -2.445616245269775 -1.444071888923645 1.057420134544373 3.681090593338013 2.008516550064087 -0.3316654562950134 0.3660877048969269 1.296679496765137 2.620066165924072 1.972467303276062 3.479217290878296 3.846937894821167
- -0.5176569819450378 -1.686132550239563 -0.4134161472320557 1.020720720291138 -1.139117002487183 -1.082967519760132 0.5987489819526672 -0.006351599469780922 -0.3174097239971161 -1.543566226959229 -1.950517177581787 -0.7656686305999756 8.736327171325684 -5.214029312133789 -0.8509284257888794 2.924906253814697 1.764193534851074 3.639477729797363 -1.721527457237244 -1.475088357925415
- -0.5623205900192261 -2.092078685760498 -2.85969066619873 -2.095769882202148 -1.344032287597656 -0.2237742096185684 -0.6231472492218018 -1.755012273788452 -1.209031462669373 1.201611638069153 0.7974305748939514 -1.893580079078674 -1.058013677597046 1.882786393165588 3.275384187698364 -6.240147113800049 -0.8862361311912537 7.359743595123291 5.482077121734619 2.843799829483032
- -0.2564646899700165 -0.3371598422527313 -0.1493592113256454 -1.688663959503174 -4.365056037902832 -0.7148441672325134 -0.6613509654998779 -3.395405769348145 0.808099627494812 5.394294261932373 4.59424352645874 1.3478764295578 0.7274182438850403 1.429787397384644 -0.6518324613571167 -1.097482681274414 -0.5886217951774597 -0.05440934002399445 2.177875280380249 -2.518951892852783
- -2.819216251373291 -3.008774757385254 -1.555320382118225 1.190289258956909 1.834352493286133 1.310477137565613 0.8972813487052917 4.513104438781738 7.782402992248535 2.564141750335693 -2.203880786895752 -1.451546788215637 -1.009198427200317 -0.7052731513977051 -2.2630455493927 -2.216995239257812 -0.09086468070745468 0.1729571372270584 1.377644300460815 -4.318534851074219
- -1.272941470146179 1.075538635253906 2.21186375617981 -1.190088391304016 -4.319554328918457 0.3843879997730255 1.483383893966675 -3.396879434585571 0.1718388944864273 -1.530780076980591 -3.050742626190186 0.9755308628082275 -1.958547115325928 -0.8114834427833557 2.608862161636353 -0.7799949049949646 2.737862348556519 3.287628412246704 2.493192195892334 0.8809213638305664
- -3.085702896118164 -2.998663902282715 -2.427502870559692 -1.528639435768127 0.04043152555823326 0.3126021027565002 0.05091485381126404 0.2221731692552567 1.043558120727539 1.541467547416687 1.850071668624878 0.2313484251499176 -0.2265582382678986 -1.644219279289246 -3.303746938705444 -3.645859479904175 1.185133457183838 1.201941967010498 6.472959518432617 4.708288669586182
- -4.726571083068848 -0.7783393859863281 2.063473224639893 1.84335458278656 0.3135126233100891 1.385035514831543 2.482676267623901 2.129348516464233 0.8677417039871216 -1.400456309318542 -2.071055173873901 -1.627567052841187 -0.9945804476737976 -2.918722152709961 0.6114040017127991 2.338141202926636 0.8794646859169006 0.4755713045597076 -0.8270531296730042 -0.04538047686219215
- 2.444886684417725 1.102450251579285 0.2861195802688599 -1.292391419410706 -1.836443066596985 -0.3798631727695465 1.2832190990448 0.2368119210004807 -1.57464873790741 -0.7134192585945129 1.278488516807556 2.105404853820801 0.6032810807228088 -0.7284773588180542 -0.2003483325242996 0.6041272878646851 0.0788845419883728 1.742262601852417 1.242832779884338 -6.283181667327881
- 2.150618076324463 0.7029879093170166 -0.9604247212409973 -1.483393311500549 -1.04889976978302 -0.3000126481056213 0.5119193196296692 0.3146196305751801 0.5565519332885742 1.142988443374634 1.793936729431152 2.006229877471924 0.1663385927677155 -1.700566291809082 -5.047182559967041 -4.356348514556885 -1.608909010887146 1.011662244796753 -4.056429862976074 10.20431900024414
- -1.278284907341003 -1.009564757347107 -0.2334626764059067 -0.4406247138977051 -1.620192527770996 -1.760385751724243 0.1417310833930969 1.568484306335449 2.280131816864014 1.174952030181885 -1.578830003738403 1.443419814109802 4.594386100769043 2.080986738204956 0.5982211232185364 1.694727301597595 -1.135469675064087 -0.4140327572822571 -2.972537279129028 -3.133656740188599
- -0.4942384958267212 -1.047592163085938 -1.241211771965027 -0.8996909856796265 0.5448033213615417 2.168879270553589 2.366272926330566 -0.2979503571987152 -2.927075386047363 -3.418108701705933 -2.72508692741394 -2.923410892486572 -0.06215564534068108 -1.519163131713867 -3.431677579879761 -1.978963017463684 3.920609474182129 2.033552169799805 4.080483436584473 7.851727962493896
- -1.821760296821594 -2.197330713272095 -1.59965717792511 0.4990229606628418 2.388712882995605 3.208804368972778 3.246670007705688 1.828473329544067 1.355918765068054 1.040343523025513 2.032708168029785 2.122942924499512 1.398778080940247 -0.6881999373435974 -1.933196902275085 1.30211341381073 -3.807019948959351 -5.178139209747314 0.4790957272052765 -3.678279876708984
- -0.4330079853534698 0.3131713271141052 0.2686564922332764 -0.3412981033325195 -0.7717618942260742 -1.051017642021179 -0.6576240658760071 -0.4307793378829956 -0.113796778023243 0.2721555829048157 1.018352031707764 0.06853417307138443 0.405571311712265 0.3216699063777924 -0.03916404768824577 0.04132213443517685 0.7627220749855042 -6.004536151885986 -3.539169549942017 9.909998893737793
- 0.9022256135940552 0.508641242980957 0.2081129252910614 -0.09129645675420761 -0.1006664633750916 0.2260296046733856 0.5970988869667053 0.1364035755395889 0.5811063647270203 0.3292680382728577 2.464056968688965 1.625600457191467 -3.129810333251953 -5.086357116699219 -4.918898105621338 -4.075864791870117 0.724645733833313 3.228858470916748 2.386183738708496 3.484659194946289
- -0.6537494659423828 0.7332283854484558 1.562767028808594 -0.5649407505989075 -4.517839908599854 -3.595715284347534 -1.468638896942139 -0.812872052192688 -0.2901796400547028 -0.2451590597629547 0.01795168220996857 -1.01013195514679 -0.3136384189128876 0.7114138007164001 -1.299245834350586 -2.566297769546509 1.260599732398987 4.591088771820068 2.982858180999756 5.478504180908203
- -1.595106840133667 0.004218399059027433 2.077651500701904 3.318827867507935 2.232555627822876 -0.380823165178299 -0.9523966908454895 0.06919809430837631 1.707433819770813 2.123703718185425 2.678765058517456 1.735341191291809 -0.9315985441207886 -2.459148168563843 -3.221009016036987 -0.3020234704017639 2.542954683303833 -0.3207231462001801 -5.347194194793701 -2.980633974075317
- 8.484978675842285 5.10798454284668 1.450596809387207 -1.522996187210083 -2.068831205368042 -0.1522108316421509 1.13636314868927 1.15285313129425 0.01831918209791183 -1.25509774684906 -2.944597005844116 -3.14495062828064 -2.174127101898193 -1.229882001876831 -0.5651668906211853 -0.4199739694595337 -0.4242381751537323 -0.6261632442474365 -1.126787066459656 0.3039223253726959
- -1.434911131858826 0.6733859181404114 1.792589664459229 1.162557125091553 1.539647459983826 1.975577831268311 0.682404100894928 0.694273054599762 0.6961225271224976 0.006177407223731279 -0.6502417325973511 -2.422773122787476 -1.186649680137634 0.4673312306404114 -0.3465060889720917 -1.266816735267639 -1.079667806625366 0.531513512134552 1.569873213768005 -3.403881072998047
- 0.6291220188140869 0.6591586470603943 0.9982244968414307 1.410849213600159 3.761451482772827 4.826357364654541 2.175938367843628 -3.528533458709717 -3.171208381652832 -0.9293313026428223 0.1063432395458221 0.5262072086334229 -3.376620054244995 -3.88848876953125 1.15589165687561 0.7638463973999023 -1.22597062587738 0.3000786602497101 0.1415395736694336 -1.334857583045959
- -1.404036402702332 -0.4949288964271545 1.792271614074707 1.202057957649231 -1.582002758979797 -3.053953170776367 -3.284349203109741 -2.185635328292847 0.4628176093101501 0.3635879158973694 0.01238901540637016 4.487257957458496 2.035299301147461 -1.195004343986511 1.315890550613403 -2.409059286117554 -2.982527017593384 5.838627815246582 -1.855497002601624 2.936793327331543
- 2.43900728225708 0.4375534057617188 -1.192231178283691 1.717099070549011 2.562806606292725 -1.777615904808044 -6.118545532226562 0.1555164307355881 2.028718233108521 -3.116269588470459 -3.906543254852295 -0.5758532881736755 -0.339824765920639 4.248504161834717 0.04541477560997009 0.727154552936554 2.151017189025879 0.4022883176803589 -0.2515895664691925 0.3633922040462494
- -1.113993287086487 -0.3403771221637726 0.0003118672757409513 2.0294189453125 2.832032203674316 0.8379266262054443 -0.06088848784565926 1.269313335418701 -2.030551433563232 -1.668656706809998 1.498933911323547 2.048534631729126 0.6556811332702637 0.6210088729858398 -1.33629322052002 -6.148656368255615 3.61490273475647 -3.757303476333618 3.423357009887695 -2.374702453613281
- -1.197287321090698 -0.7861245274543762 0.1269521415233612 1.787760734558105 2.190688610076904 0.7736960649490356 -0.7154728174209595 -1.249329447746277 -1.603448987007141 -0.6387233734130859 1.303261518478394 3.606222629547119 3.919223546981812 3.091882467269897 1.019997000694275 -3.168501853942871 -4.899145126342773 -1.413185596466064 2.948186159133911 -5.096660137176514
- -0.7864799499511719 -1.921873450279236 -2.762947797775269 -3.141228437423706 -2.706290006637573 -2.336817741394043 -1.735097408294678 -1.686154127120972 -0.6251711845397949 1.458673357963562 2.992332696914673 4.512560844421387 4.720959663391113 4.050472736358643 1.488114476203918 -0.9130719900131226 -0.6937777400016785 2.230068922042847 -1.346580862998962 -0.7976869344711304
- -0.8808369636535645 -2.949674844741821 -4.014623641967773 -2.822420835494995 1.083713293075562 4.127925872802734 4.515237331390381 3.390237092971802 -0.1287930458784103 -3.728860855102539 -0.7648059129714966 1.671968817710876 2.003270626068115 -1.16916286945343 -0.5852150321006775 2.172300577163696 -2.329458951950073 0.5499764680862427 0.358457624912262 -0.4992374777793884
- 3.336735010147095 1.498843789100647 -0.6374315619468689 -1.804556846618652 -1.113049387931824 -1.090686678886414 0.1789370179176331 -0.4513640403747559 -4.053735256195068 -3.143187046051025 -2.379745244979858 -1.398135304450989 0.4567070603370667 3.827675342559814 2.545870304107666 -2.650899887084961 4.961931705474854 0.4675460755825043 0.0318748876452446 1.416666984558105
- 0.6002232432365417 -2.059746503829956 -3.125505924224854 2.082553863525391 2.900876998901367 -2.082984924316406 -2.638264894485474 2.189123153686523 -1.826845288276672 0.3554781079292297 1.365400314331055 1.37950587272644 -0.20357546210289 1.446929454803467 0.9811457991600037 0.6315570473670959 -0.472800225019455 -0.4388346672058105 -0.2344044297933578 -0.849833071231842
- -3.345343589782715 -2.826060771942139 -1.520564198493958 0.7624252438545227 3.355126619338989 2.398891448974609 -1.882467985153198 -4.767358779907227 -4.065673828125 -2.004006147384644 -1.066236257553101 0.8513294458389282 3.839807271957397 5.058109283447266 1.91477632522583 -0.4093771278858185 1.870300769805908 2.393833875656128 -0.0564795695245266 -0.5010339617729187
- -0.5252552032470703 0.05419864878058434 0.263132631778717 -0.01849362067878246 -1.303780317306519 -3.378253936767578 -3.488091230392456 -1.333951592445374 1.430064678192139 5.151139736175537 3.816533327102661 -0.5493816137313843 -1.038339734077454 1.653360724449158 -0.5862375497817993 -0.9361066818237305 -4.34959602355957 -0.2458246648311615 0.7402305006980896 4.644649028778076
- -4.315028190612793 6.151956081390381 1.941355466842651 -5.948561668395996 0.797458291053772 -1.551777124404907 -1.525060534477234 2.004741668701172 -0.3898306787014008 2.803936958312988 -1.568340539932251 -2.95022988319397 4.539616584777832 1.824672818183899 -0.820562481880188 -1.380958914756775 0.6647427082061768 -1.843630194664001 -0.4889211356639862 2.054418325424194
- 1.768492937088013 1.282490730285645 -0.1037737801671028 -2.434236288070679 -2.364559650421143 -0.07177185267210007 1.032116889953613 1.099005222320557 1.554517388343811 1.176052927970886 1.283626675605774 0.3361565172672272 0.5653849840164185 -0.3139529824256897 -3.069697380065918 -3.800623655319214 -5.168447494506836 2.098379850387573 1.798455595970154 3.332380533218384
- 0.7680978178977966 2.751090526580811 -0.8489375710487366 -7.870937347412109 1.876347899436951 0.8816798329353333 -0.3352073132991791 -1.078357696533203 3.528999805450439 0.9242259860038757 -1.358763813972473 2.644371271133423 3.413114547729492 1.67173957824707 -1.363125920295715 -1.848823428153992 -0.3104478418827057 -1.353336334228516 -1.347145557403564 -0.7445839643478394
- 3.77938437461853 2.993147850036621 0.4129238426685333 -1.977230310440063 -2.109279870986938 0.3041840195655823 2.412634611129761 0.7223978042602539 -1.392147541046143 -4.622053146362305 2.280272483825684 0.9303337931632996 1.511996030807495 -2.436215400695801 2.20874285697937 3.72291374206543 -1.578287839889526 -3.270700216293335 -1.30840802192688 -2.584612131118774
- 7.199164390563965 5.639228820800781 3.882253408432007 0.7759840488433838 -2.359249591827393 -2.870411396026611 -1.954083442687988 -1.539823770523071 -0.4486651122570038 -0.3732754588127136 0.6135104894638062 0.2169491648674011 -1.946075677871704 -3.375437259674072 -1.79188859462738 0.6840245723724365 -1.269964814186096 -1.881776213645935 2.695850372314453 -1.896317362785339
- -0.8080898523330688 -0.2103544473648071 -0.06832022964954376 -1.123983144760132 -2.301493167877197 -2.940392732620239 -1.477601885795593 -0.8414900302886963 -0.7257471084594727 -0.3215399086475372 -0.4625894129276276 -1.10373318195343 -1.348937034606934 -0.9856061935424805 1.992084622383118 -0.128867506980896 -2.682020425796509 -0.7331782579421997 7.922133445739746 8.349717140197754
- 1.439423084259033 0.2572260797023773 0.3887234032154083 2.877299070358276 4.279431819915771 2.002367973327637 -0.7325559854507446 -2.497083425521851 1.455586552619934 0.7781453728675842 -6.164517402648926 -3.831222534179688 3.051114320755005 -0.6906889081001282 -2.347918748855591 -2.374441862106323 -0.929098904132843 2.193138360977173 0.7620028257369995 0.08306961506605148
- 1.624141573905945 -0.1278207898139954 -1.845260143280029 -0.3868854343891144 3.964265584945679 3.378515958786011 -1.694218039512634 -3.119768857955933 -1.609663128852844 2.311115503311157 3.874553918838501 0.1010498180985451 -1.383771300315857 2.460033416748047 3.20344614982605 0.9234535098075867 -4.31144380569458 -3.966475248336792 -1.715403437614441 -1.679863691329956
- -0.2207600623369217 -0.8121403455734253 -0.970670223236084 0.5701048970222473 0.09830325841903687 0.04112470895051956 3.362931966781616 4.0138840675354 1.806106925010681 1.044528961181641 1.34040379524231 -1.306107401847839 -3.775233030319214 -1.430840969085693 0.5711982846260071 0.4318476915359497 -8.243371963500977 0.9778024554252625 2.583982467651367 -0.0831008180975914
- -2.519084930419922 -2.462416410446167 -1.594884753227234 -1.199584126472473 -0.7757186889648438 -0.4026131629943848 0.8164576888084412 1.447077035903931 -0.5694954991340637 -1.416383266448975 -0.1281112432479858 0.5631314516067505 1.14222526550293 2.495215177536011 3.208263397216797 3.935092926025391 7.66112756729126 -2.455862760543823 -5.872114181518555 -1.8723224401474
- 0.6998337507247925 -0.9634463787078857 -2.811930894851685 -2.859386682510376 -0.7437832355499268 2.277597427368164 1.397117018699646 -0.9798871278762817 -3.738078594207764 -2.125317573547363 2.14862847328186 1.315360546112061 -1.314367532730103 1.248083829879761 2.618282794952393 0.05492019653320312 1.275793671607971 7.597745418548584 -2.158586025238037 -2.938581228256226
- -1.72258460521698 -0.8887978196144104 -0.0840914249420166 0.5052283406257629 1.195479512214661 2.106095790863037 3.074187278747559 3.045332908630371 -0.01851080171763897 -1.468672037124634 0.8962899446487427 0.5471946001052856 -3.104886770248413 -4.746195793151855 -5.080262184143066 1.067072868347168 2.571664094924927 2.306813716888428 1.648616313934326 -1.849972486495972
- 3.226638317108154 2.257411479949951 0.5219392776489258 -0.5989087224006653 0.06023003160953522 2.301773309707642 2.159093618392944 1.021427512168884 -0.6410099864006042 -2.220914840698242 -2.875962018966675 -1.784097194671631 1.057564973831177 2.121126651763916 1.330727219581604 -1.429377913475037 0.3601927757263184 3.401676177978516 1.464607119560242 -11.73413753509521
- -3.794840812683105 -3.448805332183838 -2.838809728622437 -0.8295835852622986 1.316970467567444 1.8645840883255 1.23262083530426 1.007864594459534 1.985741138458252 2.071584224700928 0.04022420942783356 -2.221260547637939 -2.083492517471313 -0.7302404642105103 1.9165118932724 1.965276837348938 2.633802175521851 2.14700984954834 4.949888706207275 -7.185054302215576
- 3.609154462814331 2.434276342391968 0.8928325176239014 -0.1498316824436188 0.2479646950960159 0.9367567300796509 1.024337768554688 0.5454397201538086 0.4587807953357697 -0.2356830835342407 -1.164620637893677 0.1006302237510681 1.72371506690979 3.173871278762817 -0.0009914684342220426 -2.387315511703491 -5.024709224700928 -5.499818325042725 3.367495775222778 -4.052287578582764
- -1.591322660446167 -1.825435280799866 -2.150434970855713 -2.621929407119751 -2.289903163909912 -0.7359009385108948 1.646371126174927 3.194739103317261 2.339303731918335 1.409732222557068 1.457520365715027 1.613039135932922 0.9518581628799438 0.8195027709007263 2.934353351593018 2.558130025863647 -3.247446537017822 -3.867941617965698 -2.675986289978027 2.08175253868103
- -0.3093160390853882 -0.835271418094635 -1.150156378746033 -1.678059577941895 -0.1613420397043228 2.913862228393555 3.739522457122803 1.982236385345459 -0.8735901713371277 -1.272524118423462 -0.3717261254787445 -0.5633774995803833 -0.9696149230003357 -2.141363859176636 -0.2537407875061035 5.180625438690186 -1.612857460975647 -4.855942726135254 -3.936721324920654 7.16935396194458
- -1.725458860397339 -1.186820864677429 -0.8205283880233765 -0.9186801910400391 0.1904848963022232 0.1453497111797333 -0.7094876170158386 1.533177852630615 3.181315898895264 2.600384473800659 1.814068078994751 2.555005073547363 3.669476270675659 1.493212938308716 -4.262375831604004 -4.213309288024902 3.217337846755981 0.9968889951705933 -1.720976233482361 -5.839066982269287
- 4.62887716293335 5.617956638336182 4.711224555969238 1.177598595619202 -1.25556492805481 -1.010066509246826 -0.9369958639144897 -0.7958201766014099 -1.143312454223633 -0.8345605134963989 -0.5754700303077698 -0.2699837684631348 1.35710871219635 -0.4121522605419159 -3.067024946212769 -5.772094249725342 -2.069222927093506 1.758733868598938 -1.231003761291504 0.1217701137065887
- -0.1159271895885468 0.821042001247406 2.314310789108276 -0.2236680388450623 -5.007972240447998 -6.288604736328125 -1.269732236862183 4.359742641448975 4.507987022399902 1.83780562877655 0.4881592392921448 0.5740888714790344 2.081774950027466 0.2648633420467377 -2.986263990402222 -5.330811023712158 -1.722606420516968 1.583829283714294 1.727774024009705 2.384208202362061
- -1.640856862068176 0.5256378054618835 1.528967499732971 0.6920586824417114 -3.754474639892578 -5.384864330291748 -2.662916421890259 1.895923376083374 3.657480955123901 1.952844142913818 1.246854662895203 0.806419312953949 -0.9099503755569458 0.3963871598243713 0.4317761659622192 1.582202076911926 2.902565479278564 4.316998958587646 -4.00571346282959 -3.577343463897705
- -2.014410018920898 -0.9699628353118896 0.1718983352184296 0.03949877247214317 0.09602415561676025 0.2394635379314423 -0.2785386741161346 -0.7722175121307373 -0.7962647676467896 -0.5732556581497192 0.2055183351039886 1.073575973510742 0.9582253694534302 1.094063758850098 0.7891679406166077 0.06506816297769547 -0.0804188996553421 1.733665347099304 0.1490028351545334 -1.130106210708618
- -1.613322257995605 -1.20709216594696 -0.9819656610488892 0.100926049053669 -2.193729400634766 -5.598783016204834 -2.340989589691162 1.721211075782776 1.787777304649353 1.075205564498901 1.045644760131836 0.4821473062038422 -1.17065703868866 -0.4248511791229248 0.5546662211418152 -0.6324701309204102 0.07814858853816986 5.055663585662842 3.287301540374756 0.9751696586608887
- -6.438221454620361 -3.034084796905518 1.181200861930847 3.426241159439087 -0.5531871318817139 -3.649101495742798 -2.274588108062744 1.345062971115112 3.962940692901611 2.461493253707886 0.1025941148400307 -1.561909794807434 -0.4186883866786957 -0.01728061772882938 -2.94070291519165 -0.2239212095737457 3.797638893127441 0.6755555868148804 0.9355751276016235 3.223381519317627
- 1.015803813934326 3.125324249267578 4.612008571624756 2.567328214645386 -0.5580847859382629 -0.4178664684295654 0.7826746106147766 -0.3516343235969543 -0.8355296850204468 -0.8597845435142517 -3.910168886184692 0.3256617188453674 1.142997622489929 -1.761329650878906 -1.273059964179993 -0.8701618909835815 -0.179423525929451 -4.112878799438477 1.007897019386292 0.5502256155014038
- -0.7150840163230896 0.3122595250606537 1.239510893821716 2.848442316055298 2.781967163085938 -1.105071306228638 -3.522068023681641 -1.587732791900635 1.626759767532349 3.770409822463989 -0.5641489028930664 -4.096752166748047 -2.618404626846313 -1.854638576507568 -2.300654411315918 -2.274564027786255 5.401237010955811 1.910033464431763 0.002572018653154373 0.745927631855011
- 0.3883191049098969 -1.707669377326965 -4.676046848297119 -4.609840869903564 -1.295810580253601 0.5089675188064575 2.365602970123291 5.770671844482422 6.889104843139648 1.647375345230103 -2.814334154129028 -1.24828827381134 -1.841241836547852 -0.1341859847307205 -0.8136023283004761 0.3114830851554871 1.987286806106567 0.874433696269989 -1.461726784706116 -0.1405019313097
- -1.159355282783508 -1.440540075302124 -1.440516233444214 -0.1136730536818504 2.31513500213623 1.81186044216156 1.859626650810242 1.779043674468994 2.028892517089844 1.276183366775513 1.467326760292053 2.654965400695801 2.68584156036377 0.5475837588310242 -1.131666898727417 -2.921167373657227 -2.759979248046875 3.215917587280273 -4.754122734069824 -5.921351909637451
- 4.984585285186768 4.229278087615967 1.579556107521057 -4.76039981842041 -6.580567359924316 -3.12081241607666 -0.4806137382984161 -0.0630495473742485 -0.127580314874649 0.01634879596531391 0.4631707072257996 -0.7536261677742004 -1.362088084220886 -1.607821941375732 -3.859269380569458 -1.472748160362244 2.388311147689819 5.192093372344971 3.759419441223145 1.575805306434631
- 3.950888395309448 3.574319839477539 1.551233768463135 -0.8778896331787109 -0.4673118591308594 0.4091207683086395 -1.292404294013977 -3.753393411636353 -4.600126266479492 -2.529347658157349 -0.6998153924942017 -1.750494599342346 -2.865834474563599 -0.3434666395187378 4.900280952453613 3.302380323410034 1.433253645896912 -0.5249667167663574 -0.7124294638633728 1.296011447906494
- 3.656460285186768 1.837764739990234 0.2115099728107452 -0.398909330368042 -1.372710108757019 -1.598230481147766 -0.8803108334541321 -4.105282783508301 -4.693819046020508 -2.690914630889893 -0.1923439204692841 2.184429883956909 3.295293807983398 0.1182713657617569 -0.9839699864387512 -3.676902770996094 -1.441415429115295 2.301230907440186 3.729691743850708 4.700153350830078
- 0.4671164751052856 -1.533605098724365 -1.407259225845337 -0.09667783975601196 2.304092407226562 3.068086624145508 2.850079298019409 1.122531533241272 -1.148253440856934 -1.593063354492188 -1.087430953979492 -0.9353883862495422 -0.03636074066162109 -1.442529439926147 3.378866672515869 4.119542598724365 -3.383687734603882 3.110209703445435 -3.451993227005005 -4.304284572601318
- 3.022115468978882 0.4212996959686279 -5.260384559631348 -5.03773021697998 -0.4252432286739349 1.659762024879456 -0.1280300617218018 -1.86340594291687 -0.9987885355949402 1.203965425491333 0.0792284682393074 -5.287661552429199 0.9158254265785217 4.318248748779297 0.9395741820335388 0.5360367298126221 0.5103887915611267 3.204955816268921 0.763538658618927 1.426300883293152
- 3.256726980209351 1.876342177391052 -1.375297427177429 -4.006753921508789 -4.833859443664551 -4.200634479522705 -3.27719259262085 -0.7353278994560242 1.157040476799011 1.48169732093811 2.35602855682373 2.06672477722168 2.287012577056885 3.781905174255371 -0.6356787085533142 -3.057964324951172 0.2314467579126358 -2.132731676101685 0.3676562607288361 5.392857074737549
- 3.048077821731567 2.725038528442383 1.58044159412384 -0.168928399682045 -0.4902862310409546 0.8290096521377563 0.5696977376937866 -0.4775168597698212 -2.923431873321533 -4.803501129150391 0.8080835342407227 4.603496074676514 0.5739788413047791 -1.04686439037323 -2.101531267166138 -0.03988733515143394 0.5580613017082214 -3.533805847167969 -3.287264347076416 3.577136278152466
- -0.4142954647541046 -1.66756010055542 -1.759037733078003 0.6831538081169128 1.534312009811401 2.140157699584961 0.9718847870826721 -2.687642812728882 -3.891808986663818 -2.556697368621826 -0.3312273621559143 1.470361709594727 2.495124101638794 2.153951168060303 -1.205095410346985 -0.6211956739425659 10.15773487091064 -0.6219488978385925 -3.337560415267944 -2.512618541717529
- 1.730190753936768 1.80750036239624 1.356786131858826 1.03377377986908 2.644163846969604 3.421843767166138 3.353516101837158 0.1886256188154221 -1.793168187141418 -2.514832019805908 -1.671969652175903 -2.081163167953491 -0.3478952348232269 0.5352653861045837 -0.6271575689315796 -4.642775058746338 -3.963194847106934 -4.043620586395264 -1.845553517341614 7.459671020507812
- 2.246662616729736 0.2016398459672928 -2.066519021987915 -2.167887210845947 -1.520911455154419 -0.9548236131668091 -3.787577867507935 -5.536649227142334 -0.0315396748483181 3.257961273193359 2.192927837371826 0.507627010345459 1.885614037513733 3.6100914478302 2.338510751724243 1.476654529571533 3.08937406539917 -2.046329975128174 -2.558128595352173 -0.1366939097642899
- 0.9409266114234924 0.1299967169761658 0.4150329530239105 1.657934427261353 3.4643394947052 2.971324682235718 1.26098108291626 -3.431446075439453 -3.467576265335083 -2.766378402709961 -1.298755288124084 2.578521251678467 2.456178665161133 -0.7263119220733643 -3.805424928665161 -4.849814891815186 4.408540725708008 -0.1302659809589386 -3.103549718856812 3.295742750167847
- -4.206661224365234 -3.093836307525635 -1.885167956352234 0.3432153761386871 1.920194029808044 3.301616191864014 3.043381690979004 0.693256676197052 -3.202852249145508 -3.460277557373047 -0.07581372559070587 4.513870716094971 5.212947845458984 0.01259410567581654 -1.202102303504944 -0.804783821105957 1.467697739601135 1.828694939613342 -0.5030103325843811 -3.902971267700195
- -0.08068391680717468 -0.8876106739044189 -2.114362478256226 -2.314155340194702 -0.8555014133453369 0.1941107660531998 -1.435997366905212 -4.036779403686523 -4.782611846923828 -1.647210240364075 0.6695964336395264 1.313233256340027 3.23312783241272 4.20278263092041 3.928963661193848 3.312346458435059 -1.261749148368835 -3.984436511993408 -1.144672989845276 7.691615581512451
- 0.1973518133163452 1.134447336196899 2.264684677124023 3.129763126373291 3.192946910858154 0.4772716462612152 -2.8204345703125 -5.624075412750244 -4.664904117584229 -1.667420268058777 1.273649454116821 3.002247095108032 4.387224674224854 2.545683860778809 -0.8016163110733032 -2.084271907806396 0.7862294316291809 -2.196537256240845 -1.952954530715942 -0.5792983174324036
- 0.5695887207984924 0.6340851187705994 1.423723578453064 1.273433566093445 1.780985593795776 0.4616143703460693 -3.98089861869812 -6.27265739440918 -4.35621976852417 -1.658235907554626 -1.609244108200073 -1.676583170890808 1.289169788360596 0.7930409908294678 -0.6181238889694214 -0.7524999380111694 4.227668285369873 1.216794610023499 4.233243465423584 3.021116256713867
- -0.9315301775932312 -0.693462610244751 0.9812681674957275 2.268364429473877 1.248473525047302 0.6391181945800781 2.592506408691406 2.078622579574585 -3.31908130645752 -1.000458717346191 4.82146692276001 5.076925754547119 -1.44421911239624 -2.212822675704956 0.8249605894088745 -1.255263328552246 -2.779444694519043 -1.482762455940247 -3.967663049697876 -1.445004224777222
- -4.247566223144531 -4.628451824188232 -5.143855094909668 -1.432929039001465 2.186558723449707 2.138543605804443 2.390938997268677 1.632461905479431 0.9359801411628723 0.7484003305435181 2.069157838821411 3.952538728713989 2.265897512435913 0.3787554800510406 -0.7099461555480957 2.280219316482544 2.796808481216431 -4.414876937866211 -3.899014949798584 0.7003780603408813
- 2.506306886672974 -0.4629577696323395 -2.654558181762695 -3.057210922241211 -1.589912056922913 0.6660507321357727 0.8343724012374878 -0.06786613911390305 0.2687220573425293 1.116681098937988 4.011116504669189 3.427970409393311 -0.07037731260061264 -1.994296669960022 0.6851036548614502 1.337218642234802 -6.063977241516113 1.615261435508728 0.551310658454895 -1.058965921401978
- 5.075595855712891 2.839337110519409 1.125145673751831 0.05325284227728844 1.526267886161804 3.579237461090088 3.655905723571777 -0.7969452142715454 -5.469647884368896 -4.784720420837402 -2.22431492805481 -0.04531000554561615 0.7196849584579468 0.7189165353775024 -1.134250044822693 -2.05254602432251 -0.7627865672111511 -0.01343510672450066 -1.984909296035767 -0.02447272278368473
- -1.973973870277405 -2.853821754455566 -4.159491539001465 -2.701791286468506 1.136979699134827 3.45562219619751 2.987138748168945 1.540666460990906 1.570943355560303 2.480554819107056 3.631794452667236 0.9033071994781494 0.19173464179039 1.192399859428406 0.3931145071983337 -2.101349115371704 -3.979198694229126 -4.028999805450439 -1.865604519844055 4.17998218536377
- 2.612542390823364 2.637369394302368 1.938381552696228 1.562232732772827 2.033096313476562 1.097117304801941 -0.7239171862602234 -1.550070405006409 -2.626423358917236 -3.72711181640625 -4.890734195709229 -2.117693185806274 4.722455501556396 3.587860345840454 -0.6683249473571777 -1.841630458831787 -0.09125998616218567 -1.731591701507568 -1.034153461456299 0.8118547201156616
- -1.86566698551178 -1.534289836883545 -0.2549380958080292 1.605711340904236 1.997530341148376 0.6981138586997986 -0.2005807459354401 -1.214897513389587 -1.97079610824585 -1.371358275413513 -2.205374240875244 -2.777385473251343 -2.003430604934692 1.749455094337463 3.131277084350586 -3.150391340255737 3.633936405181885 0.8237195014953613 -3.67561411857605 8.58498477935791
- -0.9080625176429749 -0.5643367171287537 -0.1798691153526306 0.3851201832294464 2.832698583602905 4.753808498382568 4.441968441009521 2.946808338165283 3.046150207519531 2.228733539581299 1.332873344421387 -0.803180992603302 -2.1224205493927 -2.686851501464844 -2.861533403396606 -1.780993461608887 -0.7767348289489746 -1.709251284599304 -3.636190891265869 -3.938740015029907
- -3.286377429962158 -2.94014835357666 -1.962908864021301 0.2306658327579498 1.673109769821167 1.795318484306335 1.700936913490295 1.911530256271362 2.253362417221069 1.707910060882568 0.1459473073482513 -2.16858983039856 -1.435630559921265 1.814271569252014 3.619447469711304 0.9067350625991821 0.7779750823974609 -0.3734017014503479 -3.564304828643799 -2.805852651596069
- 4.532641410827637 1.556758284568787 -5.955741405487061 -3.451792001724243 -1.025020599365234 -0.7284210324287415 -1.581573486328125 -1.020163536071777 2.192934989929199 -0.989959180355072 -1.528468489646912 -2.001089811325073 1.483138084411621 0.3208783864974976 -0.6298050284385681 4.813745975494385 3.783868551254272 -1.100683450698853 0.6418613791465759 0.6868882179260254
- -0.9921926856040955 -0.1352859884500504 2.291607141494751 2.5090651512146 -0.08225294202566147 -2.002672433853149 -1.56878650188446 0.8675857782363892 1.95181667804718 0.05126297101378441 -1.328660368919373 -1.25770115852356 -1.280509948730469 0.7901251316070557 2.449223041534424 -2.889055728912354 -1.136701822280884 -5.171831130981445 1.222669839859009 5.712295532226562
- 1.915411353111267 1.660171627998352 0.2547465264797211 -2.513649225234985 -3.243869304656982 -1.794315934181213 0.4055875837802887 2.701183795928955 2.845400810241699 -0.5983377695083618 -4.491726875305176 -3.158946514129639 0.2569545209407806 1.605349183082581 0.2164389491081238 -0.4218901097774506 2.315808296203613 -0.1155387312173843 2.845340013504028 -0.6841148138046265
- -0.8538243770599365 -0.07624401152133942 0.8141910433769226 0.6994466781616211 -0.2983684837818146 0.7337501645088196 0.997434139251709 0.8233739733695984 4.670567512512207 5.26185941696167 -5.157133102416992 -4.986374855041504 -1.486152172088623 0.5323930978775024 0.8082526326179504 -0.3009117245674133 0.1093277633190155 1.363349676132202 -2.639734029769897 -1.015202403068542
- 0.9368481040000916 0.7757503390312195 -0.5035182237625122 -3.261734008789062 -4.876591682434082 -3.212521553039551 -0.02773032709956169 2.458033323287964 2.474524736404419 1.163027405738831 1.029763460159302 1.897167086601257 -0.4114074110984802 -2.601962089538574 -2.087533473968506 1.40582287311554 2.001470565795898 0.006993690971285105 0.7180596590042114 2.115538597106934
- -2.183514833450317 -1.155147194862366 0.2214956134557724 0.7958913445472717 1.262578010559082 0.08206032961606979 -1.663285851478577 -3.088372230529785 -2.322583913803101 -0.7113370895385742 1.018126130104065 0.4799972772598267 -1.57696259021759 -0.1492600291967392 -1.367772221565247 -2.607873678207397 1.811965346336365 4.857338905334473 5.928305149078369 0.368346780538559
- -1.69674015045166 -1.277707934379578 -1.086201429367065 -0.8835206031799316 -0.5684354305267334 -1.010282635688782 0.633206844329834 2.393503189086914 1.857365489006042 -1.809373259544373 -2.73065710067749 -1.90215015411377 -0.3549813032150269 0.7240884900093079 1.660195350646973 1.469058632850647 4.3583083152771 7.525566577911377 -3.538461446762085 -3.762785196304321
- 5.7382493019104 -3.85563588142395 -5.315161228179932 5.921488285064697 -4.281460285186768 5.260439872741699 -9.275504112243652 1.76386547088623 1.221485733985901 -5.1672043800354 -2.833406448364258 4.669177532196045 2.562131643295288 3.457016706466675 1.666059613227844 1.092357039451599 -4.354482173919678 0.117755115032196 0.1451983600854874 1.467633128166199
- 1.738956570625305 1.276961803436279 0.6706709861755371 0.9255129098892212 1.672762036323547 2.881028652191162 3.253419160842896 0.3127984702587128 -2.325064659118652 -4.894453525543213 -1.702617883682251 -1.549631595611572 0.1964573562145233 1.112061738967896 1.874354362487793 0.939062774181366 -3.833739995956421 -6.543989181518555 4.608721256256104 -0.6132685542106628
- 3.30802845954895 3.743199825286865 3.949561357498169 3.241483211517334 1.122807621955872 -0.1012496575713158 -0.8875467777252197 -3.341885089874268 -4.868460655212402 -4.514423847198486 -3.085786104202271 -2.029554843902588 -1.811974763870239 1.623563051223755 3.215551137924194 -0.01514841802418232 -2.545238733291626 -0.3552898764610291 3.973867416381836 -0.6215028166770935
- -12.22462272644043 -6.464321613311768 5.936203956604004 10.26612567901611 0.3533716797828674 -5.842537403106689 6.700780391693115 3.567131280899048 -1.324599266052246 -1.190125465393066 -1.678467631340027 0.8134780526161194 0.6276314854621887 -0.3319787979125977 0.07532181590795517 0.7096930742263794 0.3629662692546844 -0.2506147921085358 -1.022657752037048 0.9172195792198181
- -3.405005693435669 -2.632751226425171 -1.104950308799744 -0.4617224931716919 -0.9894509315490723 -1.864806771278381 -1.15491771697998 0.2464453428983688 1.455269455909729 2.032581567764282 2.211673736572266 4.441634178161621 1.761250495910645 -3.639087915420532 -5.115172863006592 1.147759795188904 4.164153099060059 4.534347057342529 1.261209964752197 -2.888462066650391
- -2.444375514984131 -1.03214955329895 -0.6666702032089233 -0.8459668159484863 -0.2256809622049332 1.404442310333252 2.994933128356934 3.488863229751587 3.119350671768188 1.66137969493866 0.9976102113723755 1.134762644767761 -0.8957454562187195 -3.684870719909668 -4.358022212982178 -2.877231359481812 -1.611382246017456 -2.883767604827881 0.5206760168075562 6.203844547271729
- -1.351171255111694 0.08814587444067001 1.972174644470215 3.17270302772522 0.3024349212646484 -0.9654114246368408 -0.5868905782699585 0.7191372513771057 -0.08535508066415787 -3.633039236068726 -6.124952793121338 -4.659860134124756 1.063521146774292 2.28391695022583 2.131966829299927 4.141183376312256 4.395400047302246 -1.373229742050171 -2.471087694168091 0.9804191589355469
- -1.542289853096008 -0.9070443511009216 1.950586199760437 2.989598751068115 0.8862497806549072 -3.760587215423584 -3.477617502212524 0.9040294289588928 2.352634191513062 4.5486159324646 2.783955097198486 -0.8741428852081299 -1.712838292121887 -2.486133813858032 2.116595983505249 1.617660760879517 0.8580408692359924 0.4273018538951874 -1.75425922870636 -4.920356273651123
- -0.2104582786560059 1.539854288101196 2.947955846786499 3.108729362487793 -1.656308054924011 -4.609014987945557 -4.329689979553223 0.01759308204054832 2.197838544845581 0.1032348647713661 -2.490244388580322 -3.26110053062439 -3.24273681640625 -0.2256909161806107 1.429942727088928 1.03976035118103 2.869428157806396 3.413915395736694 0.3720668256282806 0.9849210977554321
- -2.468743085861206 -3.041579961776733 -3.417840957641602 -4.082282066345215 -2.656680583953857 -0.05570569261908531 1.917701482772827 3.339271068572998 3.247806310653687 3.444195985794067 3.534446716308594 2.249480009078979 -0.3618398904800415 -0.7035619020462036 -0.7965534329414368 -2.988089323043823 -1.385775566101074 2.730974912643433 1.12250292301178 0.3722683787345886
- -3.53771185874939 -3.864402770996094 -3.594928503036499 -2.26500129699707 -0.3527889549732208 0.02643513306975365 0.4437484741210938 2.315786838531494 1.980449676513672 -0.5039483308792114 -0.1344144493341446 -0.05589749664068222 -0.3053185641765594 -1.719434022903442 -1.045078039169312 0.5995876789093018 0.5909432172775269 4.78416109085083 2.644230842590332 3.993580341339111
- 2.135690450668335 2.470329284667969 2.287582874298096 0.6162289381027222 -0.3576080203056335 0.3570308089256287 2.526720285415649 2.971996307373047 0.3376413881778717 -2.737874984741211 -2.415783882141113 -2.369345188140869 -3.722419023513794 -2.282341241836548 -0.5268208980560303 -3.380814075469971 -0.7139467597007751 2.445013523101807 1.384738802909851 0.9739827513694763
- 0.6892144083976746 -0.7755703926086426 -0.9179646372795105 -1.104295015335083 -4.173151969909668 -1.825912475585938 2.335436820983887 1.37088680267334 -7.677338123321533 3.041042566299438 0.7694249749183655 -0.3475957214832306 -0.4376232922077179 -0.1537235230207443 2.025394201278687 2.20682168006897 0.1810460090637207 2.339884519577026 0.7899954319000244 1.664023041725159
- 0.9722591638565063 1.080639719963074 -0.6150646209716797 0.3913913667201996 5.73197078704834 -0.7731648087501526 3.10522985458374 -4.624513626098633 2.272378444671631 -3.130392551422119 1.771270632743835 0.741333544254303 -1.314170718193054 -0.2636646330356598 0.7419057488441467 -2.675032377243042 0.9024366140365601 -1.069159150123596 -2.469605445861816 -0.7760494947433472
- 0.5212695002555847 -2.132228136062622 2.612447261810303 5.015206813812256 -7.030396461486816 0.5633965134620667 2.181003093719482 -0.9754311442375183 1.057846426963806 1.888550639152527 -1.328085064888 -0.9201077222824097 -0.7608626484870911 1.413591384887695 -1.662752509117126 -0.1425493955612183 0.4111571609973907 -1.092167615890503 -0.6277540326118469 1.007864356040955
- 0.7876244187355042 -3.649866104125977 -5.050781726837158 -1.887533903121948 1.347736716270447 -0.492973804473877 -2.776907444000244 0.9731534123420715 1.778215169906616 -0.6990918517112732 -1.511082291603088 4.794960975646973 5.955360412597656 2.471929788589478 0.2214550226926804 -4.337646007537842 -1.260016560554504 0.2205745726823807 2.015838861465454 1.099048733711243
- -0.7874332070350647 6.530407905578613 -0.3863449096679688 -5.952509880065918 2.478557348251343 0.7585934996604919 -0.9226968288421631 -0.2257856279611588 -2.849920034408569 1.794929981231689 3.634504795074463 -0.8041509985923767 -1.332000851631165 -1.02665901184082 -0.5165682435035706 -0.7698636651039124 -0.07768085598945618 0.1644118130207062 0.4671123623847961 -0.1769070476293564
- 0.7433757781982422 -0.06600571423768997 -1.079881548881531 -2.933520078659058 -1.483096599578857 0.9383431673049927 -0.1625253409147263 -3.234504699707031 -2.970511436462402 0.2017260938882828 -0.3278959393501282 -1.339880704879761 1.211628198623657 4.394339084625244 1.822871208190918 0.6182709336280823 3.54756236076355 0.4751554727554321 4.778993606567383 -5.134444236755371
- -6.193244457244873 -3.176199436187744 0.6801114678382874 1.143396973609924 0.2180878669023514 0.8771732449531555 0.7413792014122009 -0.2389177829027176 0.1126995459198952 1.303455948829651 2.647835254669189 2.627485513687134 -2.618185043334961 -3.498697757720947 -2.876373291015625 1.47896945476532 -0.6928929090499878 0.3147088587284088 2.125945329666138 5.023263931274414
- -2.668442487716675 -1.650956511497498 0.2424901574850082 1.404856443405151 1.14376437664032 -0.6741237044334412 -2.145938873291016 -3.34625768661499 -2.49115252494812 -0.6849365830421448 -0.2060147672891617 -0.05462698638439178 -1.345702290534973 -1.338747262954712 3.761161088943481 1.588302373886108 1.295844674110413 2.464917182922363 1.572971701622009 3.132583141326904
- 0.1871038973331451 0.4954811334609985 0.04791008308529854 -0.6528371572494507 -0.3231654167175293 0.876278281211853 1.357858777046204 0.011256268247962 -1.015754461288452 0.1041342169046402 -1.264799118041992 0.7102871537208557 2.152963161468506 4.265294551849365 0.9986034631729126 -0.3931733071804047 4.33096981048584 -8.162398338317871 -4.569711208343506 0.8436927795410156
- 1.603586912155151 0.4870936274528503 -0.2213805764913559 -0.4609602689743042 0.4110568463802338 0.303532749414444 0.01096658688038588 0.06359908729791641 -1.705424070358276 0.9849494695663452 1.61255943775177 1.172182321548462 -0.9711759090423584 2.73061466217041 -6.156934261322021 1.810209393501282 -1.542398452758789 0.9320940971374512 0.1937434822320938 -1.257914066314697
- 1.579040169715881 -0.2433784157037735 -1.672214269638062 -0.6848471164703369 1.030548930168152 -0.2684314548969269 0.01845100708305836 4.338749408721924 5.995797157287598 -1.614572048187256 -7.091094970703125 -0.9613765478134155 0.6383325457572937 -0.02656086534261703 1.667960524559021 -0.216257631778717 -2.935107231140137 -2.810086488723755 0.5046302676200867 2.750415086746216
- 5.685893058776855 3.163216352462769 -0.4088685512542725 -3.265186548233032 -1.913361668586731 -0.3799533247947693 -0.4437901377677917 -0.6762396693229675 -0.7051770091056824 -1.418257236480713 -2.830198049545288 -0.6916139721870422 1.338987588882446 1.835981607437134 2.278292179107666 1.826688528060913 -0.9239478707313538 -3.342416524887085 -3.405107975006104 4.275057792663574
- -3.138552665710449 -1.094781637191772 1.529457449913025 2.972817182540894 3.732217073440552 2.33418607711792 0.5593523979187012 0.4908125698566437 0.3558463156223297 0.4672195315361023 0.2037717700004578 0.176104947924614 -1.133292317390442 -2.114072561264038 -0.3769603371620178 -1.45184338092804 -1.216614246368408 -1.393083095550537 -4.846780300140381 3.944191694259644
- -5.019831657409668 -3.771313190460205 -2.539316654205322 -1.398217558860779 -0.4494338035583496 1.081843852996826 1.422099232673645 1.314233183860779 1.041459321975708 -0.07761901617050171 0.04250325262546539 0.5065903067588806 1.527674794197083 0.4347424209117889 -0.7826052308082581 -2.61234450340271 3.288515329360962 0.3317862451076508 -0.69339919090271 6.35263729095459
- 2.251860380172729 4.04280948638916 3.865673303604126 0.8188772201538086 -3.078532457351685 -4.502622604370117 -4.583059787750244 -2.465086460113525 -0.9406352043151855 1.851559638977051 2.448692083358765 1.115672588348389 -0.2699349224567413 0.5184076428413391 2.866621971130371 1.54410457611084 -2.381492853164673 1.269447565078735 -1.434101581573486 -2.938257932662964
- -2.347013235092163 -2.001991510391235 -1.434831738471985 -0.8298280239105225 0.4620734453201294 1.875778436660767 1.253874063491821 0.7603420615196228 -0.5217772722244263 0.2630568742752075 0.01150889601558447 -1.841344118118286 -1.586396098136902 0.6315964460372925 -3.0359046459198 -3.549762487411499 6.989432334899902 3.879693746566772 0.7547399401664734 0.2667502164840698
- 2.59989333152771 1.274308085441589 -0.01152442954480648 -1.263461351394653 -1.295027494430542 -2.524879455566406 -1.609083294868469 3.557408571243286 2.483957767486572 -4.707064151763916 -1.482265949249268 4.238638877868652 1.865494966506958 -0.1574246138334274 -1.977993369102478 -1.023856043815613 3.222598075866699 -0.3063560724258423 -2.31501317024231 -0.5683553814888
- -1.708734631538391 -1.514800071716309 -1.129241108894348 -1.292758464813232 -1.690871477127075 -3.039062738418579 -4.668495178222656 -3.020464658737183 0.8907089829444885 3.335945606231689 2.574652433395386 0.2507872879505157 -0.02416657842695713 -1.391170382499695 -0.7406736612319946 0.9291949272155762 3.995064973831177 3.58231258392334 1.294066786766052 3.367705106735229
- -0.7308525443077087 0.5534930825233459 1.876127362251282 2.385608673095703 -1.369242072105408 -2.313159704208374 1.087968349456787 5.111093521118164 0.5589612722396851 -4.287982940673828 -1.545682072639465 2.03200101852417 -0.8129301071166992 -0.9434912800788879 -1.036221027374268 -1.846355438232422 0.5198851227760315 5.268942356109619 -3.66060733795166 -0.8475566506385803
- -1.151612520217896 -1.791241526603699 0.3302052021026611 -0.2721012532711029 -0.3806628584861755 -0.9549692869186401 -0.6866446733474731 -1.774772047996521 -1.472887873649597 -1.674550294876099 0.9231255650520325 1.066949248313904 0.8665286898612976 3.924666404724121 -6.023348808288574 4.330567359924316 3.760181665420532 -0.06783535331487656 4.309100151062012 -3.26069188117981
- -0.88199782371521 1.981577634811401 3.75695276260376 1.546116232872009 -2.148651123046875 -2.566235542297363 -1.9017333984375 -0.7683435678482056 0.8630893230438232 1.533197164535522 1.407054424285889 1.714533090591431 -1.641535401344299 -3.778181791305542 -1.345935344696045 -0.02263041399419308 -0.3932666480541229 0.608609676361084 1.132511258125305 0.9048671722412109
- 7.196781635284424 1.468628644943237 -2.52098274230957 1.786643266677856 1.94323205947876 -1.514943957328796 0.1491302847862244 0.6869137287139893 -3.366606712341309 -3.640038967132568 -0.2857992351055145 2.221171140670776 -3.165215492248535 1.668398380279541 -1.082773089408875 -0.1408033519983292 1.175822496414185 -1.392779588699341 -0.3199502527713776 -0.8668237328529358
- -3.947493553161621 0.03975019603967667 2.965737819671631 1.466609954833984 -3.87905216217041 -4.130489826202393 1.936582565307617 4.800464153289795 1.152953743934631 0.835141122341156 -0.1746273934841156 -0.8576342463493347 -0.9760010838508606 -0.2643941938877106 -1.002382040023804 0.8332653045654297 0.5182068943977356 0.6255298256874084 0.4843355417251587 -0.4265030920505524
- -3.640172004699707 -3.737707853317261 -2.923035144805908 0.3282618522644043 1.48232638835907 -0.441068023443222 0.7756396532058716 1.693741202354431 1.413447856903076 0.8937015533447266 1.847288370132446 -0.8475233316421509 -3.840097904205322 -3.062532424926758 3.513256311416626 2.630796670913696 1.897123336791992 1.093554258346558 -3.189511775970459 4.112508773803711
- -0.6489149928092957 0.5130596160888672 1.673443555831909 2.117481470108032 0.0827990397810936 -1.47014045715332 -1.104773283004761 -1.167572379112244 -1.090356588363647 -1.019984841346741 -1.115590929985046 -1.883090257644653 0.5330615639686584 2.586933135986328 2.465914487838745 4.256698131561279 0.5812928676605225 -5.436106204986572 -1.564060568809509 1.689914464950562
- 0.6048972010612488 0.8798101544380188 -0.2702876925468445 -1.161617517471313 -1.391723990440369 -1.502087354660034 -1.778924107551575 -0.7998572587966919 0.1514480412006378 -0.633873462677002 0.9010939598083496 3.499900102615356 3.461895942687988 3.49565052986145 5.038520812988281 6.190263271331787 -4.197624206542969 -6.022910594940186 -4.015003681182861 -2.449573516845703
- 0.9015991687774658 1.457147836685181 2.144871711730957 2.21974778175354 1.175731897354126 0.322929173707962 2.050617218017578 4.716849803924561 3.125296592712402 -0.01539208833128214 -0.2587837278842926 0.6095321178436279 -1.256268978118896 -1.625360727310181 -2.985262393951416 -1.15560519695282 -2.401651620864868 -5.022729396820068 -3.00604510307312 -0.9972224831581116
- 1.380930304527283 1.067306756973267 0.2246159017086029 0.365425318479538 2.081364631652832 3.191563844680786 3.615046977996826 1.521717667579651 -0.1809195280075073 -1.923221468925476 -3.112886905670166 -1.92116904258728 1.394784927368164 1.284379482269287 -2.220463275909424 -1.478888750076294 0.8971588015556335 -2.612983465194702 -6.165031909942627 2.591264247894287
- -0.272815614938736 -0.6798882484436035 -0.6335951685905457 -0.04987706989049911 1.403038382530212 -0.08515746891498566 -0.9812989234924316 -0.7015728354454041 -0.4563063979148865 0.5457165837287903 2.790622711181641 1.10162079334259 0.4895525574684143 3.30007529258728 2.073791980743408 -0.7823245525360107 -2.715193748474121 1.766475558280945 -8.859146118164062 2.746285200119019
- 2.103977680206299 0.5472617149353027 -2.602070569992065 -4.229795932769775 -3.166706085205078 -0.2284818589687347 1.825952768325806 2.842360973358154 3.158400058746338 3.215318202972412 0.7962328195571899 -1.601359248161316 0.08501449972391129 1.723167061805725 2.608096599578857 2.034399747848511 1.310831308364868 0.416411429643631 -4.472352981567383 -6.366658210754395
- -5.485379695892334 -4.297726631164551 -2.217624425888062 0.2768277823925018 0.9465814232826233 -0.8696280121803284 -1.632207155227661 -0.03004632517695427 1.303911805152893 1.784476041793823 2.256384611129761 2.824195623397827 2.50342845916748 1.330517888069153 0.7959917783737183 -0.193672776222229 1.446552276611328 4.229986190795898 0.2517535388469696 -5.224321365356445
- -2.005870819091797 -0.1439944356679916 -0.7407601475715637 -1.52299952507019 1.990339875221252 2.370657920837402 -6.703121185302734 1.059283852577209 2.654191732406616 0.6987029910087585 1.020458817481995 0.03746103867888451 1.287217497825623 1.982913851737976 0.7155669331550598 -0.9581405520439148 -0.567360520362854 -1.221967935562134 -1.37591826915741 1.423339366912842
- 0.3196007609367371 0.8668915033340454 1.01660430431366 0.1034482419490814 -1.281264901161194 -3.159471035003662 -3.684342384338379 -1.496236443519592 0.5283424854278564 0.7569391131401062 0.06740052998065948 2.390336751937866 3.822274208068848 -0.04812368005514145 -5.812849521636963 -2.595292806625366 0.7279472947120667 0.5582651495933533 4.936729907989502 1.982794642448425
- 2.170500993728638 -0.1483595818281174 -1.556460618972778 -2.396624565124512 -0.3265185654163361 1.396482944488525 1.125537157058716 -0.7775927782058716 -1.990305662155151 -1.264681696891785 1.09859824180603 3.085969686508179 2.28730845451355 2.327304840087891 -1.27954638004303 -0.111607514321804 -1.398654818534851 -5.230142593383789 2.969053506851196 0.01973943971097469
- 0.2485319674015045 1.270951747894287 0.8527784943580627 -0.5065891146659851 -1.079405069351196 -1.735257506370544 -1.137871980667114 1.475104093551636 4.318470001220703 4.439592361450195 2.234207153320312 -2.03368878364563 -2.031128644943237 -1.205292701721191 -2.716577768325806 -3.6485276222229 -1.695624470710754 2.759658098220825 0.820486307144165 -0.6298169493675232
- -3.21246600151062 -2.581574678421021 -1.3803551197052 0.68104088306427 1.19791853427887 1.027921199798584 -2.324929475784302 -2.265019178390503 -1.810427188873291 2.766178131103516 5.736523628234863 -0.03758067265152931 -0.7454152703285217 2.999567985534668 1.000487685203552 -2.319940567016602 2.99962592124939 -2.992578744888306 1.774289727210999 -0.5132672190666199
- -2.324465751647949 -2.494159698486328 -1.857834696769714 0.9909756183624268 3.729615688323975 4.034987449645996 2.637047290802002 1.430828809738159 0.5229517221450806 0.1707436889410019 0.6221446394920349 0.3805403709411621 -1.113720178604126 -2.124089002609253 -2.893681764602661 -2.391358613967896 -0.9509013891220093 1.584174871444702 0.8280807733535767 -0.7818822860717773
- -3.279093742370605 -2.522412061691284 -1.822725653648376 -1.5146564245224 -1.0070880651474 -0.8679795265197754 0.1694394499063492 1.498874306678772 1.507836222648621 0.3237001597881317 -1.602571725845337 -0.8729630708694458 1.063968896865845 2.431190490722656 1.298272371292114 -1.288565158843994 -3.286158323287964 -1.909510493278503 -0.01807212829589844 11.69851684570312
- 1.9761723279953 3.046615600585938 4.641309261322021 3.941258907318115 -1.744837284088135 -5.600364685058594 0.7032915949821472 2.552472829818726 -0.8877605795860291 -2.581939697265625 -2.959408521652222 -3.066996812820435 -1.791499495506287 0.2938017845153809 0.1250737309455872 0.8268405199050903 -0.3802095651626587 -0.3068093955516815 -1.443376183509827 2.656371831893921
- 3.672005891799927 2.591688394546509 0.19033382833004 -2.395688056945801 -2.132944107055664 -1.378620028495789 0.06012586131691933 2.014268398284912 2.738793134689331 1.87729287147522 1.618634462356567 1.746564149856567 3.592814207077026 2.198830366134644 0.4244254231452942 -2.973081827163696 -4.933310508728027 -4.118823528289795 -4.763049125671387 -0.03027168288826942
- -1.659799337387085 -0.03053028136491776 1.045113921165466 1.227718710899353 -0.1633797585964203 -0.9574674963951111 2.941096305847168 4.191059112548828 2.474253416061401 -0.8774530291557312 -1.305905222892761 -2.518466472625732 0.5843521952629089 3.87605357170105 0.8032591938972473 -0.5535963773727417 -0.1372668147087097 -2.293759346008301 -3.582501649856567 -3.062779426574707
- -0.9753477573394775 -0.6185209155082703 -0.6955870389938354 -1.719986200332642 -2.313568592071533 -2.046369552612305 -0.7299229502677917 -0.1431421786546707 -1.810551047325134 -1.519577145576477 3.551153898239136 5.033046245574951 4.033206939697266 0.2534317374229431 -2.178523063659668 -1.691487908363342 1.181924819946289 5.7584228515625 -1.256636500358582 -2.111962556838989
- 1.35952889919281 1.058261275291443 0.2898530662059784 -1.559389233589172 0.1257677227258682 1.414305686950684 0.3267423510551453 -4.892368793487549 0.7362755537033081 0.1806825399398804 0.4358586966991425 -1.968353033065796 -2.907437562942505 -1.4133380651474 0.4416031241416931 -1.642604231834412 1.369425058364868 4.703865528106689 -2.313536167144775 4.254855155944824
- 5.839766979217529 3.618801116943359 0.3395464718341827 -2.535825729370117 -3.016909837722778 -2.122210264205933 1.960120558738708 5.249429702758789 4.21408748626709 2.151787281036377 -0.1207830309867859 -0.8710322976112366 -1.64888870716095 -1.782386779785156 -2.057308197021484 -2.614068031311035 -2.066056489944458 -0.8994701504707336 -0.4921998381614685 -3.146404027938843
- 1.270758986473083 0.4981606304645538 -1.289483428001404 -2.575528621673584 -1.575491666793823 -2.203043222427368 -3.650526285171509 0.5493277311325073 4.23436450958252 0.8644081950187683 -0.8472791314125061 0.987879753112793 -1.540350079536438 1.819575667381287 1.702721476554871 0.1340120285749435 -3.420907258987427 1.067797422409058 5.456310272216797 -1.48271107673645
- -4.451383590698242 -3.755133628845215 -1.82866632938385 0.3984891176223755 -0.951784074306488 -3.135467052459717 -1.728514432907104 -0.04023090004920959 1.404926657676697 0.1494394689798355 -0.7724082469940186 -0.570627748966217 2.107621192932129 4.318464279174805 1.510631322860718 1.465327143669128 0.6502286791801453 -0.4973269402980804 4.060819149017334 1.665605545043945
- -1.05268120765686 -0.9534827470779419 -0.6732161641120911 0.5275088548660278 0.5511384010314941 -0.03755126520991325 0.07956549525260925 1.919205069541931 3.078785419464111 2.298753499984741 4.050081253051758 1.275439143180847 -4.113246440887451 -4.659193992614746 -3.202828407287598 -2.202170610427856 -1.878964781761169 -1.835919618606567 7.133494853973389 -0.3047038912773132
- 3.397567987442017 3.766955852508545 4.43159008026123 3.538892030715942 -0.3002689182758331 -2.479736566543579 -2.73085880279541 -2.692430257797241 -1.698422789573669 1.863077878952026 3.463094711303711 0.1606989502906799 -1.343940138816833 -2.06696081161499 -0.8699946999549866 -1.248955607414246 -3.672839164733887 -3.862622976303101 -0.6676210165023804 3.012771606445312
- -0.6110478043556213 -0.9072748422622681 -1.245896816253662 -2.864366054534912 -3.761975526809692 -3.233641862869263 -0.7312024831771851 0.7240825295448303 3.445564031600952 5.342422485351562 1.633359909057617 -4.056819915771484 -5.072022438049316 0.4060265719890594 1.812990069389343 1.78030788898468 1.815221071243286 0.530630350112915 3.593682050704956 1.399961113929749
- 2.163651466369629 0.8974334597587585 -2.989454984664917 1.252920031547546 2.619703531265259 -4.353257656097412 2.999261617660522 -2.945071220397949 -0.3621189892292023 0.9966713190078735 -1.617904782295227 1.541269421577454 0.1673654764890671 -0.6667944192886353 -1.567312955856323 0.4599047601222992 -1.898073434829712 1.29564893245697 1.391135573387146 0.6150220632553101
- 2.517238855361938 1.410249710083008 -0.3158705234527588 -2.062621831893921 -2.365298509597778 -0.4074690043926239 -1.450215101242065 -2.68840479850769 -0.05973474308848381 1.476058483123779 0.5065557360649109 -1.031965851783752 -0.9773908853530884 -3.933051347732544 1.317268013954163 0.1638581305742264 -2.734279632568359 2.314821243286133 3.650205373764038 4.670043468475342
- -2.282395839691162 -2.747188806533813 -1.730971574783325 0.4156885743141174 0.702764630317688 0.7957024574279785 2.072203397750854 1.297626972198486 -2.483386516571045 -5.123660564422607 0.2562307119369507 1.801027417182922 -1.060787320137024 1.335592865943909 6.180609226226807 1.921746015548706 -1.224457621574402 -1.187418460845947 4.501907348632812 -3.44082498550415
- -1.140081524848938 -2.814337968826294 -0.931449294090271 1.394097924232483 0.2153871059417725 2.28806734085083 1.976774096488953 -0.6914021372795105 -2.467367649078369 8.430156707763672 0.6897558569908142 -0.3542301058769226 -1.420809864997864 -1.110457420349121 1.173167943954468 -1.087818264961243 -3.823419570922852 -1.277307271957397 0.7987177968025208 0.1525568068027496
- 0.3685346245765686 -0.2521028518676758 -0.2922182977199554 -0.3171975910663605 -1.216607451438904 0.2239763587713242 1.916216611862183 2.473952770233154 0.3221211433410645 -1.675219058990479 4.132746696472168 3.914035320281982 -5.390508651733398 -5.243728160858154 0.8539519906044006 4.814949512481689 -2.84544038772583 -0.7398339509963989 0.8198337554931641 -1.867464780807495
- 0.7342661619186401 -0.01463430561125278 -1.29353141784668 -2.156312704086304 -1.126276731491089 1.267405271530151 1.906457185745239 1.130183935165405 -0.02080252952873707 -1.609390497207642 -1.994526624679565 0.3755637407302856 -2.643950223922729 -6.270133018493652 -0.3753513693809509 5.171947479248047 1.43317699432373 1.414733171463013 3.197651386260986 0.8735224604606628
- 1.245159029960632 1.81938624382019 3.887174367904663 4.402950286865234 1.393079280853271 -0.2933463752269745 -0.3961271941661835 0.1692074686288834 1.09541392326355 0.5334194302558899 -0.695104718208313 -2.069591283798218 -2.656838417053223 -1.380606293678284 3.67685079574585 -5.394083023071289 -5.489723205566406 -0.0689258798956871 1.622476577758789 -1.400772333145142
- 2.219863176345825 2.198966503143311 1.199610590934753 -0.6769376397132874 -0.9114306569099426 -1.44481635093689 -2.597196102142334 -1.850537538528442 -1.743741869926453 -1.699656963348389 -1.111023783683777 -0.8135321736335754 -1.509403586387634 -1.757909655570984 -0.9990682601928711 0.8946291208267212 1.652252316474915 0.5192946791648865 0.5508427619934082 7.879798889160156
- 0.08627790212631226 -0.352785587310791 -1.505839228630066 -2.173711776733398 -1.321738600730896 -0.3925156891345978 -0.1446467489004135 0.1024910137057304 0.3447778224945068 0.3017198741436005 -0.5197684764862061 -0.8500537872314453 0.1553759425878525 0.1786637455224991 0.2850920557975769 1.277270674705505 1.664149045944214 1.610536217689514 0.7945935726165771 0.4601131081581116
- -0.8324769139289856 0.004387835040688515 0.5643593668937683 0.346871018409729 -0.4143480658531189 0.4651801884174347 1.393947005271912 2.925382852554321 1.800491809844971 -0.222584143280983 -2.090665817260742 2.75069785118103 7.229732036590576 2.794186592102051 -3.316712379455566 -3.867590427398682 -1.585769772529602 -4.047162055969238 -3.213950872421265 -0.6839743852615356
- -1.053339123725891 -1.532515645027161 -1.272014141082764 -1.943403601646423 -3.084941625595093 -3.434366464614868 -2.110629081726074 0.3083342015743256 0.6609321236610413 0.7842252850532532 0.6473435163497925 0.8418018221855164 0.5776985883712769 0.4204946458339691 4.626517295837402 7.943256378173828 0.845883846282959 1.233871579170227 -2.174356460571289 -2.284794330596924
- 0.1832716166973114 -0.4268336594104767 -1.267805218696594 -1.709869384765625 -0.5305456519126892 0.3674589991569519 0.1298015564680099 0.7501029968261719 0.6456313729286194 -0.6937118172645569 -4.45004940032959 0.7561370134353638 5.738455295562744 -1.007960319519043 1.383902907371521 4.442962169647217 -1.60377311706543 -2.916305541992188 1.951486468315125 -1.74235987663269
- 5.478209018707275 2.763286352157593 0.1907121539115906 -2.010389804840088 -0.7422595024108887 0.5569106340408325 1.102149605751038 -2.372735977172852 -3.09471321105957 0.2367222756147385 1.444461703300476 0.753203809261322 3.167746305465698 6.109694480895996 -0.8254058361053467 -4.4361572265625 -2.733795166015625 -0.03519377857446671 -3.816632270812988 -1.735818266868591
- 2.145143270492554 2.902304410934448 1.735076069831848 -1.060021877288818 -2.352748870849609 -2.72128438949585 -2.147922515869141 -1.102774024009705 -2.313727855682373 -0.6042326092720032 -1.304415941238403 -2.456649780273438 -2.086045026779175 1.710857629776001 4.482873439788818 7.53724479675293 1.060777068138123 -0.1099622324109077 -1.375148296356201 -1.939335227012634
- 2.805823564529419 2.718520164489746 3.06906533241272 0.5964243412017822 -3.258936643600464 -3.670506954193115 -1.451389312744141 2.102123498916626 2.564121961593628 0.6076732277870178 -0.3388808071613312 -0.59478360414505 -0.8475059866905212 -0.386567622423172 3.662489652633667 4.471081733703613 -3.298681735992432 -6.766214370727539 -1.449633955955505 -0.5342206358909607
- 3.333135604858398 1.725234746932983 -0.05917806178331375 -1.200749635696411 0.3582500517368317 2.08272910118103 3.269086599349976 2.971601247787476 2.278128862380981 2.053563356399536 -0.4305766522884369 -2.679158926010132 -1.699803590774536 -1.725454211235046 -1.852011680603027 -3.52437424659729 -2.624058246612549 -1.370424628257751 -2.974032878875732 2.068089723587036
- 0.7300598621368408 0.9286527037620544 0.4690899848937988 -0.5915138125419617 -0.8803994059562683 -0.1646547317504883 0.2853293418884277 -0.06886313855648041 -0.3139051496982574 -1.092487812042236 -1.670052289962769 -1.559359192848206 -0.7439225316047668 -2.235743284225464 -3.587430953979492 2.322990894317627 5.273247241973877 3.622897624969482 5.463759899139404 -6.187698364257812
- 0.04920459911227226 -0.4138303995132446 0.243647038936615 0.4813270568847656 1.019590258598328 -0.4301485121250153 -4.3324294090271 -0.005256227217614651 -0.01158559508621693 0.9164841175079346 -0.5561929941177368 -7.103898525238037 4.332442283630371 2.241353511810303 1.801789283752441 1.014440059661865 -0.0771755576133728 1.381010770797729 0.1392876952886581 -0.6900590062141418
- 2.01094126701355 -8.840018272399902 1.069246411323547 -1.084383726119995 3.039701700210571 -1.371479988098145 2.82773494720459 -0.5893377661705017 0.9046841859817505 2.152605772018433 0.130592554807663 1.572691082954407 0.5286253094673157 -1.220544219017029 -0.7493510246276855 1.298364877700806 -0.52510666847229 -0.7555492520332336 0.5338075160980225 -0.9332287907600403
- -1.515900611877441 -0.5287664532661438 0.02138320542871952 -0.08847950398921967 1.179110050201416 1.166744112968445 0.3275284767150879 -0.3910714983940125 0.9981274604797363 1.566396355628967 0.9157280921936035 1.207241892814636 -2.162854433059692 -2.386226892471313 1.823522567749023 2.785845518112183 0.7005510330200195 -1.227026343345642 -0.7795233130455017 -3.612332344055176
- -0.8056474924087524 0.4130642414093018 1.030588626861572 1.208819389343262 2.569214582443237 1.563028693199158 -0.9008945822715759 -1.250939607620239 1.052812457084656 1.99735689163208 1.750177025794983 1.64970064163208 -0.3399961292743683 -2.263405799865723 -3.939839124679565 -4.848467826843262 1.288721561431885 4.373429775238037 -2.817300319671631 -1.730421185493469
- 4.398905754089355 0.919450581073761 -2.397307634353638 -1.48506760597229 -3.484066009521484 -6.312099456787109 1.232280373573303 4.541868209838867 -0.8619783520698547 -2.213992595672607 -0.8484045267105103 0.1358030885457993 2.767056941986084 -1.469879269599915 -0.7181640863418579 3.178452253341675 0.02406773902475834 -0.4922002255916595 1.136059045791626 1.949217677116394
- -0.2276657223701477 0.3830579519271851 -0.01230426970869303 -2.737083673477173 -1.741576313972473 3.928742647171021 6.60343599319458 1.933004260063171 -0.9754073619842529 -0.8301846981048584 1.279482960700989 1.46198570728302 1.675611615180969 -1.816817283630371 -1.406123638153076 -1.004090905189514 -0.321149080991745 -2.541867971420288 -3.164283275604248 -0.4867659211158752
- 0.7820807099342346 1.85450804233551 3.503858804702759 3.91967511177063 2.35407543182373 0.1486390233039856 -0.08479894697666168 1.305164098739624 0.2734384536743164 -2.229823350906372 -3.198352813720703 -3.515724420547485 -1.535397171974182 1.487228274345398 1.126807808876038 -1.526113986968994 -1.218683481216431 0.8017659783363342 -3.747550964355469 -0.5007978677749634
- 2.70096755027771 3.304495334625244 3.319874048233032 2.810394287109375 3.664436817169189 4.500162124633789 2.524105072021484 -0.1029922813177109 -2.29908561706543 -2.097378492355347 -2.607158660888672 -4.082388401031494 -3.850815534591675 -4.374883651733398 -3.658360004425049 -1.331148624420166 0.1287888288497925 0.03983134031295776 0.8927544951438904 0.5184105634689331
- 0.1324127465486526 -0.6631520390510559 -2.456928968429565 -2.840767860412598 -1.690516710281372 -0.7244755625724792 -0.9214229583740234 -0.08829448372125626 -0.1416297554969788 -1.490013837814331 -1.31697952747345 0.9013311266899109 4.279376029968262 4.518374919891357 -1.527072072029114 -3.905913114547729 -1.918677687644958 3.445153951644897 7.242285251617432 -0.8330909013748169
- -0.8547506332397461 -1.002581477165222 -0.4809522926807404 -0.2057351619005203 0.4169751107692719 1.259698510169983 0.4396704435348511 -0.4354678094387054 -0.4879927933216095 0.867415189743042 2.855930805206299 -0.6113927960395813 -3.349229097366333 -0.8049419522285461 0.587507963180542 -0.04810728877782822 -0.5467925667762756 -0.6772913932800293 1.111591577529907 1.966445446014404
- -0.6269298791885376 -0.6474055051803589 -0.03791651502251625 0.5507333874702454 1.005316853523254 -0.0245465561747551 -0.2395180761814117 -0.143607422709465 0.3078622221946716 0.7394601106643677 0.9445894360542297 0.345738559961319 1.348352193832397 1.33486795425415 1.541133522987366 3.652918100357056 0.1804796010255814 -0.1130997315049171 0.502081036567688 -10.62050437927246
- -1.79146671295166 -0.5602762699127197 1.142598986625671 0.1449309289455414 -1.743457555770874 -2.651652336120605 -3.003703355789185 -1.964361906051636 -1.917770028114319 -1.449868679046631 -0.9305822253227234 0.07521495223045349 2.259527444839478 3.324147701263428 1.903745174407959 -1.479177951812744 0.7492966055870056 9.940327644348145 1.314756512641907 -3.362226963043213
- -2.046612024307251 -1.482483506202698 -1.839763164520264 -4.346721649169922 -5.095214366912842 -0.8335946202278137 3.042556047439575 3.208396434783936 0.4192072749137878 -1.109411716461182 1.67880916595459 5.395397663116455 2.874510765075684 0.07067225128412247 0.2552483677864075 0.7535077929496765 -0.124852143228054 -2.720198392868042 2.542780637741089 -0.642231285572052
- -4.236565589904785 -3.702650308609009 -1.894917726516724 0.5285468101501465 2.99497389793396 2.933282852172852 0.5138083100318909 -1.26378071308136 -0.829133927822113 1.076542615890503 2.010394334793091 2.561738014221191 2.608696937561035 3.383423566818237 3.919377088546753 0.7894454002380371 -1.710481882095337 -0.983987033367157 -3.946410179138184 -4.752305507659912
- 4.310616016387939 2.705586433410645 0.7157266139984131 -1.442261934280396 -2.330213308334351 -0.9929413795471191 -0.3994666934013367 -0.9292001724243164 -0.8844471573829651 -0.06307733058929443 1.100482583045959 0.291367769241333 -0.9830474853515625 0.3469436168670654 -0.02115641348063946 -3.30620265007019 -4.880945205688477 4.386973857879639 4.807640075683594 -2.432382583618164
- 0.9424914717674255 0.2372087687253952 0.1085052713751793 0.7694780230522156 3.311416625976562 4.465609550476074 2.371778964996338 0.1124070584774017 0.2652880549430847 0.01393753010779619 -0.198256716132164 -1.825438380241394 -2.67084813117981 -2.56573224067688 -2.714336395263672 -3.069093704223633 -4.880091190338135 0.8437320590019226 6.009586811065674 -1.527645587921143
- 3.487513303756714 0.9369924664497375 -1.264194130897522 -1.65328848361969 -0.1827923208475113 -1.65233838558197 -3.020734310150146 -3.425989627838135 -1.239329099655151 4.524533271789551 7.945565223693848 5.376322746276855 1.932855486869812 -1.89636754989624 -2.872833967208862 -1.5417240858078 -1.544376492500305 -0.7161530256271362 -1.85902214050293 -1.334640502929688
- 3.575641870498657 -2.140479326248169 -4.728575229644775 4.778760433197021 -0.2178809344768524 -0.2643680572509766 -4.19535493850708 0.04190317541360855 -1.420573234558105 1.192662954330444 -0.1810762286186218 -1.406258106231689 1.751004099845886 1.175361514091492 -4.831809997558594 0.4343885779380798 0.5452494025230408 3.086219310760498 0.09999201446771622 2.705193996429443
- 1.488669633865356 0.6230473518371582 -0.3772713541984558 -0.88755202293396 0.7939217090606689 1.897245168685913 0.6011427640914917 -1.542657852172852 -1.903641700744629 0.9431750774383545 0.3882133364677429 -5.527318954467773 -5.419240951538086 -3.335561275482178 1.401542544364929 2.595142602920532 1.500421762466431 3.042678356170654 5.569425582885742 -1.851373195648193
- -4.457861423492432 -4.25111722946167 -1.899293780326843 1.10222601890564 1.046847939491272 -0.834941565990448 2.48631763458252 3.981426954269409 2.32318639755249 3.308381080627441 2.898470163345337 0.1306009739637375 -1.099928855895996 -2.279291391372681 -1.298146843910217 3.465991497039795 -1.450250625610352 1.229582548141479 -0.9725422859191895 -3.429654121398926
- 2.050058841705322 2.280264377593994 2.002211332321167 0.7293190956115723 0.00934708584100008 -0.07563371956348419 -0.3953499794006348 -0.6061539053916931 -1.032893657684326 0.1086416617035866 -0.448949009180069 -1.931215882301331 -2.465993881225586 0.2038096487522125 0.09919945150613785 -0.2735584080219269 0.470416933298111 0.4162492454051971 -0.2916281223297119 -0.848143458366394
- -1.393782019615173 -2.327441692352295 -2.157792568206787 1.973991394042969 6.027108669281006 5.338900566101074 3.331356287002563 0.3696639835834503 -2.185264110565186 -1.570574641227722 -1.800838708877563 -1.291267871856689 2.434555530548096 1.644800186157227 1.912709355354309 -2.250123500823975 -1.14780855178833 -2.065698385238647 -3.231765747070312 -1.610736131668091
- 2.840147256851196 -0.5065755844116211 -3.383320808410645 -2.846185684204102 1.314135670661926 1.626678109169006 -0.4990595281124115 -0.9715559482574463 1.905833005905151 4.507324695587158 1.312321543693542 -1.849607586860657 -0.06476990133523941 -0.461659163236618 -1.027477383613586 -1.192480206489563 -0.9565013647079468 -0.02667775005102158 1.805808901786804 -1.52638041973114
- 1.435736298561096 -0.5321202278137207 -2.50213623046875 -3.776311874389648 -3.163796424865723 -0.1304887682199478 2.73951530456543 3.51189923286438 2.445429086685181 1.391998529434204 -0.0461425743997097 0.6448684930801392 0.3274059593677521 -1.596135497093201 -2.801647424697876 -2.05764627456665 5.771510124206543 2.987147808074951 -1.713802218437195 -2.935284376144409
- -1.79314661026001 -0.4897537231445312 3.013928413391113 4.958909511566162 0.6519218683242798 -2.718425989151001 -3.920622825622559 -2.566118240356445 -1.129867792129517 -1.031805634498596 -1.119361996650696 0.2783998250961304 -0.08195604383945465 -1.059302687644958 -2.016788005828857 -0.4750585556030273 -1.108274817466736 0.05081822350621223 4.492834568023682 6.063666820526123
- -0.6767776012420654 -0.1957288682460785 -0.04472888261079788 0.1083610206842422 1.490352988243103 2.409213304519653 0.7489264607429504 -1.148550271987915 -3.208182573318481 -2.046503305435181 -1.4329833984375 0.6589847207069397 0.2104056477546692 -1.640016794204712 -2.836886882781982 -3.475991487503052 -1.430539846420288 7.495837688446045 3.220044612884521 1.794761061668396
- 1.186030149459839 1.849978446960449 1.639191508293152 0.6172394156455994 -0.09355918318033218 -1.050958156585693 -0.8904258012771606 0.6248625516891479 2.393120288848877 1.349990010261536 0.2049116790294647 0.6811513900756836 1.30882203578949 -1.003997802734375 -3.040266275405884 -4.450092315673828 -7.976119995117188 -3.844814777374268 8.824363708496094 1.670571327209473
- -1.843494057655334 -2.282655477523804 -0.9885742664337158 2.558804035186768 5.65041971206665 3.609754085540771 -0.6687325835227966 -3.365294694900513 -1.857032299041748 -1.164284110069275 -2.105275392532349 -0.7656622529029846 -0.7471562027931213 -1.385410070419312 -0.3040576875209808 2.156218290328979 5.392293930053711 0.9884688854217529 -0.6510481238365173 -2.22727632522583
- -2.182024955749512 0.02911118417978287 3.032117605209351 4.783159732818604 3.860750675201416 1.142744183540344 -2.06998348236084 -1.829299807548523 -0.2796923816204071 -0.2607273757457733 -1.079266428947449 -1.160606622695923 -1.738610982894897 -1.770478963851929 0.5134162306785583 3.140848875045776 2.047521829605103 -3.17074990272522 -3.470529079437256 0.4622991681098938
- 2.08658766746521 2.321782112121582 1.859747529029846 -1.249405026435852 -4.981188774108887 -4.812893390655518 -2.460597038269043 0.4683910310268402 2.628458976745605 1.839210391044617 -1.561433076858521 -1.339381456375122 1.409864664077759 4.562982082366943 2.748553514480591 0.6901256442070007 -1.172405004501343 -0.7502867579460144 -1.712900996208191 -0.5752169489860535
- 0.8184414505958557 -0.2962335348129272 -1.022157907485962 0.01561964675784111 0.6288811564445496 -0.7829751968383789 -2.530503273010254 -3.755099296569824 1.744163155555725 2.273992776870728 -1.020649671554565 -0.1963364481925964 1.319931626319885 1.892782807350159 0.7290130853652954 0.04840057343244553 4.038049697875977 2.872266292572021 -2.261462211608887 -4.51612377166748
- -1.446102738380432 -0.7167303562164307 0.2515703439712524 -1.23483407497406 -2.609738826751709 0.3079873621463776 1.690143704414368 -4.403445243835449 -2.799608707427979 1.409569263458252 1.280640840530396 1.462202548980713 2.593785047531128 1.137232065200806 -1.32743239402771 -1.1048264503479 2.930372953414917 -0.7692573070526123 -0.8502528667449951 4.198720455169678
- -3.718855619430542 -4.413382053375244 -2.711734533309937 2.262424468994141 5.887364864349365 2.504238128662109 -1.442863821983337 -2.787719964981079 -0.3718608915805817 -0.3677531778812408 0.3978939354419708 1.645890593528748 3.828397989273071 -0.7775834798812866 -4.310483932495117 -3.670040130615234 0.4069628417491913 4.75504207611084 2.082890748977661 0.8011701703071594
- 3.892307043075562 3.822668790817261 2.376802921295166 -1.261266589164734 -3.091756820678711 -2.18494725227356 -0.8012214303016663 -0.1136020794510841 0.2132180631160736 0.2839116454124451 -0.2682572603225708 -2.507866859436035 -1.160998582839966 2.282519817352295 -0.4657276570796967 1.579750418663025 3.038134813308716 -4.558950424194336 -2.232706546783447 1.157987356185913
- 0.79844731092453 0.8326568603515625 1.049015998840332 -0.4503269791603088 -2.355181217193604 -2.713284969329834 -1.367990851402283 -2.897423028945923 -4.049951553344727 2.635582685470581 6.964749336242676 -0.3327135741710663 -2.441974639892578 0.6748703122138977 3.510799169540405 -0.2816167175769806 0.4659367501735687 0.9373818039894104 1.330911874771118 -2.309890508651733
- 1.717276096343994 2.544231653213501 2.00365686416626 -1.235613584518433 -4.288255214691162 -2.787402868270874 1.9127436876297 1.894940972328186 -3.67094898223877 -5.479747772216797 -2.875224590301514 0.005169824231415987 1.559132933616638 0.08513864874839783 0.9387868046760559 -0.5025088787078857 0.1407343298196793 2.487510681152344 1.675570726394653 3.874813556671143
- 2.481478452682495 2.961296081542969 1.636443734169006 0.08288729935884476 -4.460241794586182 -5.584952831268311 -0.5584561228752136 1.288374781608582 1.671128749847412 2.791324853897095 1.298115491867065 0.1001590266823769 -1.22749924659729 -0.8381553292274475 -2.076330661773682 -2.292328834533691 -1.138233065605164 -2.386862277984619 7.480965614318848 -1.2291179895401
- -0.5527461767196655 1.595328807830811 3.48974084854126 2.548578500747681 -0.2684855461120605 -2.436187267303467 -2.238657236099243 -1.490797638893127 -0.2697281837463379 1.40843939781189 1.933435678482056 1.937822937965393 2.167401552200317 3.993409633636475 -1.02372407913208 -4.459651470184326 -2.665486097335815 1.027994275093079 -2.209256649017334 -2.487433195114136
- 1.648601651191711 -1.325186610221863 -2.59160304069519 -0.3897635638713837 1.937838435173035 2.864520788192749 1.853426694869995 1.096339344978333 0.09384593367576599 -0.3646806478500366 0.1689387112855911 1.249445796012878 1.954450130462646 1.038281321525574 -2.723332166671753 -4.213016986846924 3.640157222747803 -6.037474155426025 -1.899118661880493 1.998327016830444
- -5.695510864257812 -4.174426555633545 -0.04523338750004768 4.670047760009766 3.302312850952148 1.184760093688965 0.5913969874382019 0.790643036365509 1.841755390167236 1.575088500976562 -0.8008028864860535 -2.595237255096436 -2.689868450164795 -0.8327107429504395 3.241783857345581 0.4629069864749908 -3.158851146697998 -2.229681253433228 3.790990114212036 0.7706426382064819
- 0.2763624787330627 0.6423590183258057 1.892408013343811 3.692827701568604 1.536208868026733 -0.7880287170410156 0.04114867746829987 1.062060475349426 -3.543919324874878 -4.773282527923584 -0.2869487404823303 6.617877960205078 -1.308582544326782 -6.406513690948486 0.6333562731742859 1.39584743976593 1.096988797187805 0.668147087097168 -2.435470819473267 -0.01284445449709892
- -2.929668188095093 -1.463376879692078 1.638237595558167 2.475247383117676 -0.2191907614469528 -3.497880220413208 -0.04315080866217613 2.382368326187134 2.61348295211792 0.5396826267242432 2.710929870605469 3.412773370742798 -0.4170291125774384 0.9737174510955811 -1.636469602584839 -1.267998099327087 -0.9241710901260376 -4.652457714080811 1.215757250785828 -0.9108089208602905
- 0.6292325854301453 0.2062002867460251 0.3606775104999542 3.292857646942139 1.227551937103271 0.3687893450260162 1.943183660507202 1.933870911598206 0.7714879512786865 -0.8543561100959778 0.4368536472320557 3.532084465026855 0.4997440874576569 -4.950562477111816 -3.96056079864502 4.164540767669678 0.8672187924385071 -6.245272159576416 -2.85256552696228 -1.370973110198975
- 0.2077154964208603 1.360790848731995 3.011338472366333 1.448279023170471 0.8481842875480652 -1.371118664741516 -1.681269764900208 0.8414862751960754 -0.3629663586616516 -1.602252840995789 -0.1024579927325249 -0.1697578728199005 -4.928637981414795 -4.290009021759033 4.711252689361572 1.019842028617859 -1.718722224235535 5.252682209014893 -0.8344643115997314 -1.639922499656677
- -3.006164789199829 -4.607873439788818 -3.632050514221191 -0.08763166517019272 2.663437366485596 1.289820909500122 -2.095130443572998 -1.744541883468628 2.639355182647705 5.408267498016357 2.530782699584961 1.208352327346802 0.5823025107383728 -0.5013665556907654 -0.8788560032844543 -0.8186993002891541 1.320674777030945 0.2637715637683868 -2.344348669052124 1.809890627861023
- 1.760598182678223 1.771975874900818 2.057921886444092 1.416042923927307 -0.6168055534362793 -0.6877173781394958 -0.1423780769109726 -0.7616351842880249 -1.03268563747406 -2.153908729553223 0.7624067068099976 0.1311984807252884 -1.547802567481995 0.5320296883583069 -1.787500023841858 1.404358744621277 -2.131267547607422 1.601096034049988 -3.929259777069092 3.353332042694092
- -1.364639282226562 -1.170698761940002 -1.504715204238892 -2.492687940597534 -1.75039279460907 0.6238287687301636 1.288414239883423 0.1642747074365616 0.2112672328948975 -0.2258281707763672 -1.472754001617432 -2.122465133666992 -2.151413440704346 0.5189334154129028 0.2608343064785004 1.190940022468567 0.1028645634651184 1.10194194316864 3.27560830116272 5.516687870025635
- 1.959387540817261 1.831663966178894 1.935948848724365 2.653372764587402 2.022023916244507 0.8812538981437683 -1.058476686477661 0.3819854855537415 1.619094967842102 2.249097347259521 1.621755242347717 -2.288035869598389 -7.003807544708252 -5.247036457061768 -0.5048026442527771 -0.5523558259010315 -1.325468420982361 -0.751647412776947 0.3117852210998535 1.264256596565247
- 2.868587732315063 2.118951559066772 1.803818225860596 1.661841511726379 0.8628541827201843 -0.7095708250999451 -0.4536882340908051 -0.06366419047117233 -0.3320952951908112 -1.215360522270203 -3.138045310974121 -4.249349117279053 -2.03001856803894 -2.836879730224609 -0.4425094723701477 5.499884128570557 -5.265222549438477 0.5111331939697266 2.232098579406738 3.177235126495361
- 4.700842380523682 0.8226092457771301 -9.462460517883301 6.794791698455811 -3.043027400970459 5.066953659057617 -4.148794174194336 1.778123021125793 -3.303350210189819 0.5842142701148987 1.695544838905334 0.2344068735837936 -0.08452018350362778 -2.03486967086792 -0.6564037203788757 -1.005685567855835 0.2908599972724915 0.5953078866004944 0.4169158935546875 0.7585396766662598
- -1.197206974029541 -0.4662580490112305 -0.475071132183075 -2.406960964202881 -3.393859386444092 -3.422770977020264 -1.678554892539978 -0.003673851024359465 0.3097603917121887 0.08369193226099014 0.3067538440227509 -0.05054872110486031 0.7746817469596863 0.6275773048400879 0.5238117575645447 2.578717470169067 8.927600860595703 0.7547761201858521 1.309368371963501 -3.101839065551758
- -3.396648645401001 -3.006953954696655 -2.54184627532959 -0.669414758682251 1.274054646492004 0.7544602155685425 -0.5457019805908203 0.1150546222925186 0.3017935454845428 1.347033500671387 1.149272799491882 0.3716540634632111 2.079627990722656 0.5113272070884705 -0.1361311674118042 -0.2812511324882507 -3.894354581832886 -3.966667890548706 6.400481224060059 4.134207248687744
- 0.5280729532241821 1.041056871414185 1.940832614898682 1.553367018699646 -0.1882649660110474 -1.781635642051697 -1.203657627105713 0.3910945355892181 2.17659592628479 2.519144296646118 0.8655117154121399 -3.366393804550171 -4.6307692527771 -2.398255586624146 -0.3263684511184692 1.662757515907288 4.807094097137451 -2.749747037887573 -3.072910070419312 2.232465267181396
- -1.893018484115601 -1.217199563980103 -0.9682928919792175 0.3463273644447327 -2.676116228103638 -1.431546092033386 -0.8731400370597839 -0.1490593105554581 0.6183457970619202 0.6536892652511597 2.422162771224976 3.453183889389038 -4.791984081268311 -3.712500333786011 4.708353519439697 -0.1838409900665283 -2.173721551895142 2.417072296142578 0.2861114144325256 5.165168762207031
- -2.034722805023193 -0.9588102102279663 -0.01749689318239689 -0.2261103391647339 -0.1477866172790527 1.578912377357483 2.098614454269409 2.074756622314453 2.235087156295776 2.421241760253906 2.078609943389893 2.313151597976685 1.591197371482849 -0.5774418115615845 -2.152228593826294 -5.887124061584473 -5.430069923400879 -0.5863301753997803 3.938504219055176 -2.311954259872437
- 0.193042054772377 -0.8256046175956726 -0.2352310121059418 -0.8852900862693787 -1.467100620269775 -0.7054958939552307 0.7411825060844421 -0.2379120439291 -1.60500156879425 -0.5094668865203857 0.04227841272950172 -0.3478812873363495 -0.03992712497711182 0.07689163088798523 -1.774202823638916 2.528244256973267 3.533122062683105 -7.166943073272705 3.626859903335571 5.058434963226318
- 1.391436100006104 3.105663776397705 1.916596651077271 1.276423335075378 0.7894902229309082 -6.508738994598389 0.1832661181688309 2.675395488739014 -0.7023449540138245 0.1622187942266464 3.792406558990479 -1.421934485435486 1.120653510093689 1.952394604682922 -0.9856393933296204 -4.68065071105957 2.596538782119751 -2.330784797668457 -1.614585995674133 -2.717800855636597
- 1.033023715019226 -1.053178906440735 -2.684606313705444 -2.478799819946289 1.353747129440308 4.171833515167236 2.574680328369141 2.271486043930054 1.932726144790649 0.9706431031227112 0.2737517356872559 0.3402403891086578 0.5320044755935669 0.7378954887390137 2.057255983352661 -1.097760438919067 -3.932865381240845 -1.886742949485779 1.42937445640564 -6.544708251953125
- -2.669582843780518 -2.342683553695679 -1.537942409515381 -0.1841365993022919 0.9828346967697144 1.245828986167908 0.130805715918541 0.7215755581855774 1.161487698554993 0.1317613571882248 0.5843257904052734 2.470001220703125 1.020850539207458 -1.71483039855957 -1.117891311645508 -0.01830779202282429 -7.61931037902832 5.138027191162109 2.654516458511353 0.9626672267913818
- 2.701655626296997 1.582839846611023 0.58031165599823 0.7968406677246094 1.402288794517517 2.262923717498779 3.022931575775146 4.455127239227295 3.563494205474854 0.9642434120178223 -2.422784566879272 -3.648863792419434 -0.8347338438034058 1.796675682067871 -3.585479974746704 -4.955000877380371 -4.394599437713623 -0.2374833226203918 -0.8463470935821533 -2.204041957855225
- 1.177448868751526 -0.3372834622859955 -0.9290520548820496 -1.437718749046326 -0.6079438924789429 0.5688709616661072 0.1867759525775909 -1.220811247825623 -5.792614936828613 -3.623303890228271 3.93553352355957 1.617368459701538 -1.645743131637573 -1.735467314720154 1.705010175704956 1.853546500205994 0.08750929683446884 0.3738145232200623 2.375198841094971 3.448861598968506
- 0.3161343634128571 1.21888542175293 2.285951852798462 0.4127763211727142 -1.209391713142395 -0.689723789691925 -0.1063813045620918 0.1718097329139709 0.4380899965763092 -0.3762838244438171 -2.149899482727051 0.05767787992954254 3.16109037399292 -0.6023402214050293 -5.396179676055908 4.925402164459229 -3.090698957443237 -3.218554019927979 0.41961470246315 3.432022094726562
- -0.06093846634030342 -2.644865274429321 -3.666503190994263 -2.493161678314209 0.8069440722465515 2.970539093017578 3.370298624038696 3.010579347610474 1.728769421577454 0.1816002130508423 -1.673816680908203 -2.438737154006958 -1.930779457092285 -1.29712450504303 1.008697032928467 3.663813352584839 -2.023665189743042 -5.031120300292969 5.518422603607178 1.001044034957886
- 0.7320125102996826 -2.331653356552124 0.06877173483371735 -3.11285924911499 4.714087963104248 -2.631018161773682 -0.7590774297714233 1.989057183265686 -2.383845329284668 -0.004400276578962803 -0.114359512925148 -0.8074385523796082 -2.197742223739624 0.3523499965667725 4.072504997253418 2.771194696426392 -1.188065052032471 0.05695556849241257 -2.919783115386963 3.693297624588013
- -0.2235530316829681 -0.3803997337818146 0.5376530289649963 1.314172863960266 0.5564204454421997 -1.663768768310547 -3.225914478302002 -3.92216420173645 -2.979527950286865 -1.238452553749084 4.784476280212402 6.576930046081543 0.632330060005188 -1.143015623092651 1.977515935897827 0.7014617323875427 0.1038806661963463 -1.642755270004272 -1.711505174636841 0.946214497089386
- -0.9767561554908752 0.4133218824863434 1.059082865715027 -0.2017582207918167 -2.852156400680542 -3.881631374359131 -2.032818078994751 -0.3288829922676086 -0.4455679953098297 -4.300843715667725 -0.8296360373497009 5.500622272491455 2.456516742706299 2.854861974716187 3.263457536697388 0.5948963761329651 -1.720106482505798 0.904988706111908 2.089772701263428 -1.567367792129517
- -0.2208908349275589 0.8586509823799133 2.39211630821228 2.832198858261108 -1.346587061882019 -3.900247097015381 -1.02666711807251 0.7597519159317017 1.967016100883484 2.086107969284058 0.5408236384391785 -0.1459962576627731 2.725881338119507 0.3153025805950165 -0.2360152453184128 -3.780904531478882 2.741753578186035 0.1469841599464417 -6.705402374267578 -0.003874896327033639
- 1.713500380516052 0.4096760153770447 -1.079294085502625 -0.3439009189605713 3.244986772537231 2.8205885887146 -0.6904048919677734 -1.87639057636261 -1.600510954856873 -1.88703989982605 -2.456420183181763 3.79804515838623 0.567797064781189 3.282307147979736 -1.00359570980072 2.512642383575439 1.042544484138489 -1.489490389823914 -4.691313743591309 -2.273730039596558
- -1.378519296646118 -0.8361780643463135 1.404695153236389 3.355095386505127 2.68464207649231 0.03594308719038963 -1.053908824920654 0.4063661694526672 4.644443988800049 5.480449676513672 0.3615856468677521 -0.4425186812877655 0.556786060333252 1.532435417175293 -1.76366925239563 -2.338820457458496 -2.379199743270874 -3.042872428894043 -3.689615964889526 -3.537143707275391
- 1.428278565406799 1.988517761230469 2.031313180923462 -0.2583244740962982 -2.494675636291504 -0.9767099022865295 0.7532281279563904 -0.4732295274734497 -1.991236329078674 -0.6871415972709656 3.570252656936646 4.25687837600708 3.13536810874939 1.785650610923767 0.7124302983283997 -1.008084058761597 -2.389198303222656 -3.383609056472778 -2.553059577941895 -3.44665265083313
- -1.271450757980347 -1.360670447349548 -3.521802186965942 -2.896998643875122 -1.225138902664185 -0.3272210359573364 0.6326116323471069 1.836167097091675 1.862745761871338 2.403506517410278 1.325380444526672 -0.8812326192855835 3.45412540435791 0.2694416344165802 -5.485726356506348 2.291593790054321 0.07528118044137955 0.01971222460269928 1.875144720077515 0.9245322942733765
- -3.122657537460327 -3.139187574386597 -2.463742733001709 -1.985505938529968 -1.884193062782288 -0.8959736824035645 -2.033669948577881 -1.541178703308105 -1.450661063194275 -1.526492953300476 -0.7581529021263123 -0.4746161997318268 -0.9514655470848083 -0.08385688066482544 0.418423056602478 3.11402440071106 3.995398283004761 4.972164630889893 6.473308086395264 3.338037490844727
- 2.526722431182861 2.944838047027588 3.589931488037109 2.166812181472778 -0.2016685605049133 -1.106748104095459 -2.649778842926025 -2.223835945129395 -0.2176427990198135 1.269417643547058 -0.1558391600847244 -3.274273157119751 -1.262032151222229 1.749134182929993 -1.95890748500824 -4.578955173492432 2.265961647033691 -2.483431100845337 -2.283903837203979 5.884201049804688
- -0.272401362657547 -0.5664513111114502 -0.2859717309474945 -1.295641183853149 -0.6679728627204895 1.527059316635132 1.122546672821045 0.7962974309921265 2.370281219482422 2.617199420928955 1.142063736915588 -1.479499578475952 -3.65531849861145 -4.731695652008057 -1.698650479316711 7.573663234710693 3.952348709106445 -2.00234055519104 -1.818847298622131 -2.626665592193604
- -0.9978251457214355 -0.3445082008838654 2.350752115249634 0.7622905969619751 -0.5986901521682739 0.6137807369232178 -0.7229595184326172 -0.002284240443259478 3.534998178482056 2.122037887573242 -4.812726497650146 5.917830944061279 -0.03075867891311646 -2.566981077194214 0.8924157023429871 -0.3432605862617493 0.2862564921379089 -1.027161836624146 -3.182841539382935 -1.850368499755859
- -0.9495909214019775 0.465959757566452 1.764587759971619 1.546875238418579 -0.1255608648061752 -0.9421167373657227 -1.247283101081848 -1.233747243881226 -0.5313619375228882 0.6430454850196838 2.696417093276978 3.702658653259277 -0.1457497477531433 -4.60930871963501 -2.494087219238281 -2.895824432373047 -2.424416780471802 5.417782306671143 4.918808460235596 -3.557090044021606
- -1.030405521392822 -0.8023036122322083 -0.5904064774513245 -1.03156578540802 -2.082833290100098 -1.591696739196777 -0.4132141470909119 0.2687574625015259 0.2448409497737885 0.51706862449646 -0.9436204433441162 -2.442615032196045 -3.266153573989868 -2.20817494392395 -1.651225209236145 5.500433921813965 7.052728176116943 2.987900972366333 -0.7579793334007263 2.2404625415802
- 2.589227914810181 0.4400538206100464 -2.837404012680054 -3.329279184341431 -1.850268363952637 -1.149185299873352 -2.595610380172729 -0.000785681651905179 2.499572038650513 1.044571280479431 -1.909776329994202 -1.550613284111023 4.546487331390381 2.414699554443359 -2.182963132858276 -4.256907939910889 1.910601139068604 5.404051780700684 -1.057012319564819 1.870539426803589
- -4.199136257171631 -4.42754602432251 -5.7106032371521 10.08052539825439 16.78405570983887 -3.152700662612915 -4.857255458831787 -2.244782686233521 -4.164987087249756 1.451949000358582 5.444407939910889 -3.596778392791748 -1.800343990325928 2.870931386947632 -1.700112342834473 -2.7829430103302 -2.321566820144653 0.341965526342392 0.03859251365065575 3.946330308914185
- -0.7501673102378845 -0.9857423305511475 -0.6321393251419067 1.374637365341187 1.987499833106995 0.7196906805038452 -0.008339477702975273 1.317149996757507 1.30441677570343 -0.05784959346055984 -1.540507912635803 -0.1534523665904999 1.117976546287537 -2.726280927658081 -5.546449661254883 -1.069750308990479 6.8494553565979 -1.726668238639832 -2.909657001495361 3.436178207397461
- 3.583144187927246 3.198900461196899 3.065187215805054 1.722529053688049 0.5028476119041443 -0.699317991733551 -0.8333207368850708 -1.070127844810486 -1.687241792678833 -3.49016547203064 -3.354517221450806 0.7512331008911133 -0.706838846206665 -3.813214302062988 -3.857327938079834 -1.362147331237793 2.529687643051147 0.6258994936943054 2.515447854995728 2.379342794418335
- -5.442665100097656 3.68870997428894 3.871597528457642 -5.278135299682617 -4.490569591522217 1.083476543426514 0.051875039935112 -2.970682144165039 -1.011559844017029 -2.051226615905762 -0.0408315546810627 0.415074497461319 2.37037205696106 2.705331087112427 1.556277632713318 1.488031268119812 0.9928176403045654 1.952879190444946 0.3862295746803284 0.7229958772659302
- -1.059159159660339 -2.302575349807739 -3.73100209236145 -3.760766983032227 -2.211306095123291 0.0347541980445385 0.7744829654693604 0.02941202931106091 -1.236848831176758 1.852622985839844 4.099488258361816 1.1764976978302 -1.793488025665283 -2.237806081771851 -0.7126759886741638 3.949085474014282 -0.701549232006073 3.404113054275513 4.626301765441895 -0.1995829641819
- 0.2374536544084549 1.566378116607666 2.740406036376953 1.511246800422668 -3.239214658737183 -4.520734310150146 -2.577881813049316 -1.441423416137695 0.2196123450994492 1.74962055683136 3.309897661209106 2.983213901519775 -0.6901386380195618 -3.253738403320312 -1.596030116081238 5.582816123962402 1.050547122955322 -1.165971636772156 -3.4047691822052 0.9387071132659912
- -0.1036208942532539 0.1876322776079178 -0.2121543139219284 0.04690039902925491 0.4663183987140656 2.065295934677124 4.677820205688477 2.13742733001709 -3.941335439682007 -3.684225797653198 -0.9626390337944031 4.193143367767334 5.577122688293457 -0.8785200119018555 -4.359488964080811 -4.281440258026123 -2.982467889785767 -0.5754686594009399 0.801977276802063 1.827723503112793
- 0.1278781741857529 0.2687109112739563 -0.8236921429634094 2.660154581069946 4.420417308807373 -4.455633163452148 0.09870412200689316 -1.695899128913879 -0.5371567010879517 1.202093720436096 0.5301929116249084 -2.883213043212891 1.124411106109619 -0.9898179769515991 2.054413080215454 -3.078934669494629 -0.2278607785701752 1.39113712310791 1.534266948699951 -0.720173180103302
- 3.769246816635132 -1.01996898651123 -3.440073251724243 -0.3005786836147308 2.949532985687256 -0.3944534659385681 1.065977334976196 -1.836590170860291 0.4499357342720032 0.8188204169273376 0.7831099033355713 0.699485719203949 2.347730875015259 -4.580638885498047 1.993945717811584 0.6164001226425171 -0.7352221012115479 -1.576722502708435 -4.651494026184082 3.041560649871826
- -3.468271255493164 2.168287038803101 0.2562046349048615 -1.404000639915466 0.1332112699747086 -2.88915228843689 3.170912027359009 2.558159112930298 -4.005714893341064 5.003609180450439 -1.449915528297424 -1.879528522491455 -0.4359064400196075 -0.8183899521827698 1.755608916282654 -2.313157558441162 0.6026942729949951 0.5909388065338135 0.9147639870643616 1.509647846221924
- -2.483497142791748 -1.523133158683777 -0.7651989459991455 -1.005481958389282 -1.847957134246826 -1.803458094596863 -0.8597741723060608 -2.212020397186279 -0.2205722779035568 0.8671842813491821 4.120834827423096 3.554033041000366 -3.617197275161743 -5.094652652740479 3.083799362182617 5.246707916259766 3.602969408035278 4.011700630187988 -0.9498605728149414 -2.104419946670532
- -2.671776294708252 1.506115913391113 3.807487010955811 3.400156259536743 -0.9251390099525452 -1.94014310836792 -0.08978157490491867 2.175362110137939 2.308850765228271 -4.643712043762207 0.119082547724247 0.3501554131507874 1.781512975692749 0.6938214898109436 -0.2862620055675507 -1.404526352882385 -1.368448972702026 -1.153199791908264 1.755699038505554 -3.415257692337036
- 5.195250034332275 2.966614723205566 0.1351861953735352 -2.045390844345093 -2.874892473220825 -3.164917707443237 -2.473138809204102 -1.483839988708496 -0.2236808389425278 2.055234670639038 -0.7854546904563904 -3.138363599777222 -2.166174173355103 1.128945231437683 2.202524662017822 -0.1959279477596283 -0.5846036672592163 2.861791372299194 0.8885049223899841 1.702340006828308
- -0.4649189114570618 -2.498614072799683 -4.485294342041016 -3.801587820053101 -1.626065850257874 0.2282653599977493 0.1077531203627586 -0.9278391599655151 -1.735161662101746 -1.632193803787231 -0.2159860730171204 1.906472086906433 3.316807746887207 2.595955610275269 1.417796492576599 -0.2477727979421616 -1.129722237586975 0.5453447699546814 4.201554775238037 4.445203304290771
- 4.827155113220215 3.932016372680664 2.032240867614746 0.2925414144992828 -0.7519041895866394 0.3531821370124817 1.399823307991028 1.199200749397278 -1.139524102210999 -1.690314412117004 -2.305120468139648 -1.088095307350159 1.511814475059509 2.49120831489563 1.758594512939453 0.9801353812217712 -1.168035745620728 -3.380238771438599 -4.678845882415771 -4.575832843780518
- 1.66147780418396 0.9180510640144348 0.7631861567497253 0.8707747459411621 -0.4780696034431458 -1.580554604530334 -0.1080114841461182 2.067233324050903 0.3887670338153839 -4.675474166870117 -3.378207683563232 0.355591893196106 -1.57286536693573 -2.010226726531982 -1.878196954727173 -0.5066808462142944 -1.599499344825745 0.3597856462001801 7.981940269470215 2.420974254608154
- 2.872686386108398 1.147725939750671 -0.3624208867549896 -1.451219201087952 -1.205541133880615 -0.7444716691970825 -0.7388442754745483 -0.2350238561630249 0.3041113615036011 0.4739408493041992 0.7783424258232117 1.265362620353699 1.016754627227783 0.6340544819831848 -0.4100202023983002 -1.461962819099426 -0.726905345916748 -0.1058801487088203 -0.5112472772598267 -0.5394427180290222
- 2.279183387756348 1.438037991523743 -1.743365526199341 -4.283932685852051 -5.414597988128662 -4.454378128051758 -0.1296612173318863 3.23888111114502 2.967418193817139 -1.240531206130981 -1.265366911888123 -0.945634126663208 -0.9949120283126831 1.152771592140198 4.300113677978516 1.02858829498291 -1.484533190727234 2.210370779037476 -0.1285808682441711 3.470129489898682
- 0.3017450571060181 -0.1498636305332184 0.1029097437858582 -1.433868765830994 -1.915183305740356 -1.155570507049561 1.715258717536926 1.900405049324036 -2.217571020126343 -3.589828014373779 -2.157891988754272 -2.458143949508667 -0.3310191631317139 2.272882461547852 8.204835891723633 -0.1225843727588654 -1.385596871376038 2.375417947769165 1.737648010253906 -1.693982362747192
- 3.745594263076782 2.004984617233276 -2.245905637741089 -7.090678215026855 -8.159734725952148 -1.767064332962036 5.23501443862915 6.305153846740723 4.978433132171631 3.202115535736084 2.106504917144775 2.562182188034058 1.520685076713562 0.3888741433620453 -1.872121691703796 -0.9152169227600098 -3.041243553161621 -4.312341690063477 -3.511852264404297 0.8666195273399353
- -2.680328130722046 -2.553738594055176 -1.875401377677917 -1.490962028503418 -0.1114008203148842 0.4590074717998505 0.8290086388587952 1.161263346672058 2.043784618377686 2.759833097457886 1.701228737831116 1.104482412338257 2.558989524841309 5.695891380310059 0.3211452066898346 -3.596060276031494 -4.822910785675049 -1.150652766227722 1.174303531646729 -1.527485132217407
- -0.09116837382316589 0.4384465515613556 1.250977754592896 1.852476716041565 1.869683027267456 -0.04114127159118652 0.09432986378669739 -0.7332554459571838 -1.90261971950531 -2.870981454849243 -2.118256330490112 -3.636200189590454 -2.691668748855591 -2.417536020278931 -1.085556030273438 1.118744850158691 1.143314838409424 8.593686103820801 2.19420862197876 -0.967487633228302
- 1.519890785217285 1.444992542266846 1.16922664642334 0.9511992931365967 0.1843592524528503 -1.727593779563904 -5.366539001464844 -2.714352130889893 4.652383804321289 5.431854724884033 1.047267436981201 -1.795069932937622 -0.6797837018966675 1.121488332748413 0.5058336853981018 0.3877582848072052 -2.513861417770386 -2.15250301361084 -0.8991096019744873 -0.5674426555633545
- 3.231687784194946 2.224106311798096 0.5264853239059448 -0.1369419246912003 -1.487146496772766 -2.203551292419434 -3.225065469741821 -1.313546538352966 0.00570213096216321 1.709993600845337 1.64920699596405 1.912981033325195 4.045007228851318 -2.141630411148071 -2.495683193206787 -0.3145557940006256 1.217272758483887 -4.764912605285645 0.8985964059829712 0.6619864106178284
- 4.616347312927246 2.070970058441162 -0.2733224928379059 -1.727367877960205 1.802179932594299 3.314459323883057 -2.122619390487671 -5.179647922515869 -0.6722184419631958 1.200976133346558 -1.414963245391846 -0.02202126756310463 0.7474585175514221 -1.479194045066833 -1.104833245277405 1.7520432472229 0.4058637022972107 -0.6629653573036194 -0.6953992247581482 -0.5557476282119751
- 7.463465690612793 -6.408750534057617 2.956119060516357 0.4402835071086884 -0.02264184504747391 -3.327150106430054 0.7482340335845947 -0.131329670548439 -1.054370999336243 1.074682116508484 1.283100605010986 0.6829223036766052 -0.5991993546485901 1.811161756515503 0.1444214135408401 -1.876204967498779 -1.064442157745361 0.3508663475513458 -1.245215654373169 -1.225958108901978
- -0.2351352125406265 0.01811729185283184 -0.05697528272867203 -0.8668802976608276 -0.5024009943008423 -0.1121786385774612 1.133620858192444 2.566619634628296 4.086926937103271 3.822227239608765 0.3442915081977844 -1.099249124526978 0.1443336755037308 -0.2559133768081665 -1.268902659416199 0.6399479508399963 4.581653594970703 -6.307387828826904 -4.837281227111816 -1.795439600944519
- -0.4482209086418152 -0.05377323552966118 0.8197201490402222 1.117106199264526 0.816688060760498 2.291161298751831 3.060038328170776 3.125231981277466 0.8374813199043274 1.135741591453552 2.073976993560791 -1.905388236045837 -6.510054588317871 -1.254198551177979 3.41459584236145 1.127954125404358 -0.04054573178291321 -0.3543456792831421 -3.757726669311523 -5.495452880859375
- 1.790761590003967 1.299143552780151 1.433046221733093 1.226120829582214 -0.5729221105575562 -1.764503240585327 0.03072447888553143 2.54798412322998 2.313984632492065 0.7630730271339417 -0.1827373057603836 -0.40970379114151 -0.3339998722076416 -1.062450766563416 0.9253862500190735 4.49340295791626 -0.1233074590563774 -2.623739004135132 -6.091894149780273 -3.658363580703735
- -2.921163082122803 -2.645121097564697 1.023138523101807 1.237741112709045 -1.971966505050659 -1.205491065979004 0.3032820522785187 1.704661130905151 -1.473243117332458 -3.659762620925903 -2.563016414642334 -1.257284641265869 -0.706519603729248 -0.7819157242774963 2.317039966583252 6.856012344360352 0.3574521243572235 -0.1411291360855103 3.321772336959839 2.205508947372437
- 1.104993224143982 0.5250481963157654 -0.657941997051239 0.6948821544647217 2.570430755615234 3.373988389968872 -2.838412761688232 -0.1248543635010719 0.7351546287536621 -3.077698945999146 4.914359092712402 -1.436528563499451 1.116251826286316 -3.133138656616211 1.498485922813416 -0.116263747215271 -2.669975519180298 -0.6549662351608276 -0.1218395680189133 -1.701972842216492
- -4.769429683685303 -2.368108987808228 1.917902827262878 1.810898303985596 -1.195234298706055 1.014883399009705 1.441771030426025 0.7814999222755432 1.183945894241333 0.3900144696235657 -1.045584082603455 1.129734992980957 -1.167035460472107 -1.556897044181824 0.7664211988449097 -2.102808475494385 7.788211822509766 -1.190859198570251 -0.4986566603183746 -2.330669403076172
- 3.905627250671387 3.981068134307861 3.11693263053894 0.9327282309532166 -0.5940809845924377 -1.17639684677124 -0.7782648205757141 0.02980975992977619 0.6868348121643066 0.4711532890796661 -2.204205274581909 -3.686488628387451 0.143789991736412 1.39569103717804 1.092862129211426 -2.08640193939209 -5.464561462402344 -3.350888013839722 1.963101983070374 1.621684312820435
- -0.7140541672706604 0.06303763389587402 1.120216727256775 1.616607069969177 1.206099390983582 1.41834545135498 2.196152210235596 4.182565689086914 2.846391201019287 -0.9723392724990845 -2.398123741149902 -1.31235146522522 -0.4345399141311646 1.996130347251892 1.688552618026733 -0.7124021649360657 -6.036073207855225 -6.503729820251465 -4.440065860748291 5.189582347869873
- -3.82236909866333 -4.118223667144775 -4.63170862197876 -1.713215351104736 2.0875563621521 2.123144865036011 0.9285532236099243 -0.8457594513893127 -1.54129695892334 -1.217466592788696 0.1901047676801682 2.186631917953491 0.0766717866063118 -0.8707726001739502 0.3252776265144348 2.846697807312012 4.661111354827881 4.406574249267578 0.7708444595336914 -1.842356324195862
- -5.054139137268066 -4.235100269317627 -3.109839200973511 -2.504670858383179 -0.3832361996173859 1.673603892326355 1.623918890953064 -0.5048198103904724 -2.529747724533081 -1.929627537727356 0.9486346840858459 2.252139091491699 2.801390886306763 2.345565557479858 4.126954078674316 2.190564393997192 1.156854510307312 -1.195654511451721 -0.03771268948912621 2.364927053451538
- -1.395893096923828 -2.812762975692749 -4.74422550201416 -3.515018701553345 4.502767562866211 8.48429012298584 1.358663201332092 -3.101924419403076 -0.2496404945850372 0.5463494062423706 -0.5636650323867798 -0.5185211896896362 1.907350659370422 0.8056055307388306 -1.8412184715271 -1.63126277923584 1.91503632068634 0.125316396355629 2.43311882019043 -1.70436692237854
- 2.392595767974854 2.101143836975098 1.153611302375793 -0.07043066620826721 -0.3547010123729706 0.04476236552000046 -0.1367338299751282 -1.144255399703979 -1.07750678062439 -1.16557765007019 -0.6561461091041565 1.0876544713974 1.360438704490662 3.20914101600647 5.429684638977051 -7.407874584197998 -4.813741683959961 1.046329498291016 -0.8467155694961548 -0.1516827344894409
- -1.278135895729065 -1.003596305847168 -2.234717130661011 -2.428241729736328 -1.403702616691589 0.1303887218236923 0.8925742506980896 2.78271484375 2.651901483535767 1.180822253227234 -2.147993087768555 -3.759033918380737 -4.210339069366455 -1.085604548454285 3.666681051254272 1.694392561912537 -0.7788124680519104 5.618120193481445 2.924813985824585 -1.212228655815125
- -0.9826477766036987 -0.4078772962093353 -0.1547617465257645 0.3026951551437378 2.157851457595825 2.451629400253296 1.365828633308411 -0.7742500305175781 -1.859753608703613 -1.59996509552002 -2.589557647705078 -2.292937278747559 -0.8853583335876465 1.239197731018066 1.059711098670959 -4.13409423828125 1.911443591117859 0.8247614502906799 7.141946315765381 -2.773864269256592
- -1.026805996894836 -0.8450024724006653 0.5572199821472168 2.07533073425293 -1.462152481079102 -0.1032509729266167 2.116403102874756 0.6908389925956726 -1.540337681770325 1.8099125623703 2.435013294219971 -0.4527953863143921 -0.8811330795288086 -2.113967657089233 1.363522410392761 -5.869611740112305 0.9726383090019226 1.959186434745789 -0.4253981709480286 0.7403932213783264
- 1.123180389404297 2.423921346664429 2.011796236038208 -2.259575366973877 -4.282215118408203 0.1472185701131821 4.915524482727051 5.70862865447998 2.015475034713745 -3.493731737136841 -1.241144061088562 -0.2100538015365601 -0.7192803025245667 -0.8147674798965454 -0.07723068445920944 -1.486554026603699 -0.5631479024887085 -1.783346176147461 -0.9210835695266724 -0.4936171472072601
- 0.5895103216171265 0.9709528088569641 0.1735081374645233 -0.1970603913068771 -1.337148785591125 -0.06833704560995102 -0.4701314568519592 2.186729192733765 2.284431219100952 -2.787222862243652 2.051291704177856 0.9480997920036316 -6.012847423553467 3.844573259353638 0.7472637891769409 -1.91102659702301 0.2128291428089142 -0.7649785876274109 -0.03817859292030334 -0.4222567081451416
- -1.379981875419617 1.402148246765137 4.875002384185791 6.304775714874268 3.348557472229004 -1.464800834655762 -4.132672786712646 -1.724153518676758 0.5740823149681091 0.1912133097648621 -2.036574602127075 -2.316275835037231 -2.718025207519531 -2.366349458694458 -1.165546417236328 -0.2541355490684509 0.3527232110500336 0.8893675804138184 2.979902982711792 -1.359256863594055
- -0.444318950176239 -0.1581173092126846 1.410300254821777 2.026899576187134 -0.8528115153312683 -1.712621927261353 -1.290557980537415 -1.028133869171143 -1.316847324371338 -0.4018021821975708 1.542700529098511 1.603733420372009 0.6873594522476196 2.569429397583008 7.563037395477295 -1.413105249404907 -1.040423393249512 0.3264094591140747 -4.817464828491211 -3.253657817840576
- -2.221257925033569 -1.203308343887329 -0.841457724571228 -0.4839256405830383 0.234556645154953 0.9496363997459412 0.644877552986145 -1.157626390457153 -0.8406092524528503 1.938154816627502 3.560226678848267 3.708475351333618 1.709346175193787 0.9665330648422241 -2.635007858276367 1.413408994674683 3.170425891876221 -3.188573122024536 -5.548774242401123 -0.175101637840271
- -0.7359840273857117 -0.6846503615379333 -0.778592050075531 -0.8845138549804688 -0.5485366582870483 -0.1052070558071136 0.3515810370445251 1.483491063117981 4.341372966766357 4.646251678466797 0.828454315662384 -2.989817142486572 -5.206014633178711 -6.646724224090576 -4.708529949188232 -0.286090224981308 3.470548629760742 6.586966037750244 1.16373598575592 0.7022614479064941
- -2.709268093109131 2.286872863769531 1.916141986846924 1.569508075714111 -3.077790975570679 1.031215906143188 -1.078618884086609 -0.6200118064880371 -0.6181358695030212 1.336355686187744 1.802809834480286 -4.964313507080078 3.385557174682617 -0.9283789396286011 0.6122055649757385 0.2602559626102448 0.7491185069084167 -1.64072597026825 0.2687221467494965 0.4184781908988953
- 1.494965076446533 1.965440392494202 2.627892255783081 4.021340370178223 3.965642690658569 1.240720272064209 -3.086320877075195 -3.545190095901489 -1.87777304649353 -0.5816421508789062 -2.999452114105225 -3.642553329467773 -2.195728063583374 2.235869407653809 5.806941986083984 1.150704860687256 -1.994730830192566 -1.989902496337891 -2.647743225097656 0.0515185184776783
- -0.2264197915792465 -0.1971047967672348 -0.1741528362035751 0.4345186948776245 -1.870457649230957 -5.329024791717529 -6.270888805389404 -1.334821343421936 4.276025295257568 1.973252654075623 1.380060791969299 2.986200571060181 6.134986877441406 1.48797082901001 -1.369405150413513 -1.211462736129761 -0.1342415362596512 1.256632685661316 -0.263476699590683 -1.548185348510742
- -2.33762264251709 -1.631290435791016 -0.604299008846283 -0.3463553786277771 -0.2443800866603851 0.0713343620300293 1.376959443092346 2.319380044937134 2.301084041595459 1.945846199989319 1.862362265586853 0.02486804686486721 -1.430258989334106 1.809818863868713 2.350292682647705 -3.146598100662231 -4.824000835418701 5.913082122802734 -1.727676033973694 -3.682543039321899
- -2.758931636810303 -1.100733399391174 0.558655321598053 1.779149651527405 0.2744987308979034 -1.815987944602966 -3.108854532241821 -2.565789461135864 -1.339316129684448 -1.625769972801208 -0.9663746356964111 2.052451610565186 0.6209516525268555 -1.144605159759521 1.386128783226013 3.212734699249268 2.704270124435425 2.662636518478394 6.316751956939697 -5.141870021820068
- -0.5228580832481384 1.41612696647644 3.108437061309814 3.292774438858032 1.662018895149231 0.357271283864975 -1.057023048400879 -1.390819787979126 -0.09707825630903244 1.711698174476624 1.777765512466431 1.029929757118225 -0.7029690742492676 0.04578863829374313 0.9560613632202148 0.2011677622795105 -2.77204704284668 -0.3143361508846283 -1.954058527946472 -6.74785041809082
- -0.1732531785964966 -1.18536114692688 -0.9506043195724487 0.9022118449211121 1.933163046836853 0.5983042120933533 -1.068716764450073 -2.203985452651978 -0.2459413558244705 3.831197261810303 3.010987043380737 -0.7694485187530518 -1.875512003898621 -1.147825360298157 -2.322557926177979 -2.562115430831909 -0.8013483881950378 9.086957931518555 2.099645137786865 -6.155799865722656
- 2.037159442901611 0.7230191230773926 -0.9744407534599304 -2.687884330749512 -2.684824705123901 -0.5445084571838379 -0.02050095982849598 0.4776790142059326 0.1824893802404404 1.669981360435486 2.759214401245117 2.193583726882935 0.552003026008606 1.925677895545959 3.018617391586304 -1.828918099403381 -7.656185150146484 -6.222053050994873 2.739850997924805 4.340044498443604
- -4.383162021636963 -4.860086917877197 -4.678047180175781 -2.133308410644531 1.284398078918457 2.448622465133667 1.392604947090149 1.544065117835999 1.972741365432739 1.942896962165833 -0.3106227219104767 -0.6194444298744202 0.9533984065055847 2.888707876205444 0.3137526512145996 -1.084503173828125 0.558111310005188 0.4764999449253082 1.015757918357849 1.277619242668152
- -2.242287397384644 -1.207882642745972 2.833821058273315 4.377055644989014 -0.6073071956634521 -2.979512691497803 -0.1014730483293533 0.04415048658847809 -4.467023849487305 -0.743904173374176 5.245648384094238 -0.4027847051620483 0.6405357122421265 -1.703345656394958 3.047703504562378 3.318382263183594 -1.565080404281616 -4.426920890808105 2.85019326210022 -1.909968733787537
- 3.252065896987915 2.1204514503479 1.250069499015808 0.6572626829147339 1.570657849311829 2.687922716140747 1.796550273895264 -1.036808729171753 -0.8893373608589172 0.3325667381286621 1.140213012695312 0.6364154815673828 -2.7862708568573 -3.102370262145996 -2.317468166351318 -0.4858391880989075 3.238951683044434 -4.561693668365479 1.083260893821716 -4.586606025695801
- -1.126035213470459 -1.586501002311707 0.2156299203634262 2.529297828674316 1.891400337219238 -1.287881731987 -1.991743326187134 1.121294856071472 2.407986640930176 0.04552340134978294 -2.730382919311523 0.546550452709198 -3.518901348114014 -0.8904414772987366 -0.9814826846122742 3.967867851257324 -1.420720934867859 2.809509992599487 0.3843038380146027 -0.3852741718292236
- 1.990612268447876 0.2317107766866684 0.0957951545715332 2.515290975570679 4.182775497436523 2.778775453567505 -0.9705345630645752 -0.7873442769050598 0.5709816217422485 3.367680788040161 2.237672090530396 -2.498032093048096 -0.9660761952400208 -1.212912559509277 -5.316340923309326 -3.007562637329102 -1.235488653182983 -3.186823129653931 -0.9193791747093201 2.12919807434082
- 2.321329832077026 0.4444210231304169 -1.894779086112976 -1.849559187889099 -0.6142104864120483 1.346371412277222 0.2262534499168396 0.6071723103523254 0.09052518010139465 0.8353667855262756 -0.06246256828308105 0.835460901260376 1.094091415405273 -2.149107933044434 -4.070557117462158 -4.494726657867432 2.818042516708374 -0.1844979673624039 5.084220886230469 -0.3833515644073486
- 2.111615896224976 2.084982633590698 0.8322656750679016 -0.7473138570785522 0.01127674803137779 1.555516004562378 2.145292282104492 1.751661062240601 0.9654734134674072 -0.07680458575487137 -0.1746436059474945 0.8751113414764404 -1.952924609184265 -5.888501644134521 -0.7709777355194092 0.8082262873649597 -3.634444236755371 -3.715582132339478 2.486640214920044 1.333128333091736
- 0.3340907096862793 1.149330735206604 1.063872456550598 -2.485194444656372 -3.695894479751587 -1.686497569084167 -0.1920667886734009 0.3223410248756409 -0.1483930051326752 -0.1887768805027008 0.2029314786195755 1.385816335678101 0.2215270400047302 1.832212805747986 4.154302597045898 1.772417664527893 1.493994355201721 -2.763720273971558 0.7371487617492676 -3.509444713592529
- -3.761635780334473 0.453637421131134 3.294391870498657 2.316661357879639 0.2406443357467651 -0.4456931054592133 -0.8964108824729919 -1.637391686439514 -0.03136210143566132 -0.4426851570606232 -1.439038395881653 -0.2512814402580261 0.3208941519260406 0.272266298532486 -2.527072191238403 0.03374050930142403 2.481537342071533 1.195797443389893 0.7456631660461426 0.07733120769262314
- -2.36484169960022 -0.4539093375205994 1.924231290817261 2.149558544158936 -0.1917875409126282 -1.566577553749084 -0.7834290862083435 -0.7745492458343506 0.9264863729476929 1.55904221534729 -1.207550883293152 -2.934635639190674 -2.611535549163818 -1.275795340538025 -0.8221775889396667 3.985908508300781 0.7585724592208862 -0.1113175451755524 6.457903385162354 -2.663588285446167
- -4.540645599365234 -1.736595392227173 2.519779443740845 5.010525703430176 1.270471453666687 -1.774886250495911 -2.140958070755005 -2.173447370529175 -1.230325818061829 -0.6804889440536499 -1.603806734085083 1.32327139377594 5.124528408050537 1.615581154823303 1.199942231178284 1.739656209945679 0.9085417985916138 -0.4389427006244659 -1.427870035171509 -2.964331150054932
- 2.03402304649353 0.5242045521736145 -0.8046222329139709 -2.129473924636841 -2.195356369018555 -1.559438586235046 -0.5700394511222839 0.6354565024375916 2.001302719116211 1.547194957733154 1.711015701293945 1.543220520019531 1.294059753417969 0.1703027486801147 -0.6959021687507629 -1.722038388252258 0.1735468804836273 2.076246023178101 6.673828601837158 -10.70752811431885
- 0.3280434310436249 -0.8924556970596313 0.7687479853630066 2.465175628662109 1.299799561500549 -1.808864116668701 -1.84071683883667 -0.9749685525894165 -1.403514981269836 -1.463377952575684 0.7168353199958801 1.370628237724304 -1.108215570449829 -1.326982736587524 4.056696891784668 5.365180492401123 -4.341931343078613 4.742630958557129 -5.286323547363281 -0.6663839817047119
- -0.8401033282279968 1.243762016296387 0.541200578212738 -2.107916831970215 -1.707943439483643 2.479121446609497 2.508502960205078 -0.1202973127365112 0.07236047089099884 0.7121232748031616 -0.2494134902954102 -3.42930793762207 -2.631858348846436 0.3674730062484741 7.242950439453125 -0.6433866024017334 -2.203860998153687 -2.450813055038452 1.764704823493958 -0.5472996830940247
- -5.954978942871094 -4.654018402099609 -1.391068339347839 1.59299910068512 2.836308002471924 3.987026691436768 4.465559959411621 3.504318237304688 0.8801449537277222 -0.7890124917030334 -1.490849256515503 -2.140362024307251 -2.905712127685547 -1.345769166946411 -1.38212263584137 1.384067535400391 2.871713161468506 -2.750940322875977 -0.2874114811420441 3.570107936859131
- 0.9381494522094727 4.943887710571289 -6.980007648468018 3.712339162826538 -1.752593159675598 -0.5654335021972656 3.253010511398315 0.05434125661849976 -1.858324527740479 2.403076410293579 -1.087943196296692 -1.182916283607483 0.07188922911882401 1.164808750152588 -0.9529622793197632 0.07986257970333099 -0.7583127617835999 -0.7994028329849243 -0.6452192664146423 -0.03825145587325096
- 5.19520378112793 3.376176595687866 -0.07801643759012222 -2.392257690429688 -1.799867391586304 0.6603149175643921 1.291313290596008 0.9133610725402832 -1.585594296455383 -1.136907458305359 3.796416997909546 2.452640056610107 -1.141846895217896 -4.103722095489502 -3.622637271881104 -1.176715731620789 0.1949243992567062 3.097946882247925 -2.645885467529297 -1.29484748840332
- 2.186923265457153 1.436425566673279 -1.713910102844238 -1.67038893699646 1.285163879394531 0.4028415977954865 -0.325665295124054 2.058190584182739 -0.05910899117588997 2.754994869232178 0.5912014245986938 -0.8453603982925415 -3.793429374694824 1.205444931983948 2.730337858200073 -1.681332111358643 1.007359862327576 -7.277997016906738 1.353625655174255 0.3546784222126007
- -3.036164283752441 -1.298454523086548 -0.1832795888185501 -1.350492477416992 -2.121684789657593 -2.245599508285522 -2.300954341888428 -0.6700448989868164 1.859996199607849 2.081530809402466 1.12386167049408 0.6491095423698425 1.086628556251526 2.472708463668823 6.145779132843018 -3.029524803161621 -0.6260604858398438 2.065441131591797 1.915528059005737 -2.538328170776367
- 1.723827719688416 1.125535488128662 -0.1863810569047928 -1.769676208496094 -4.512877464294434 -3.16309928894043 -1.725188851356506 -0.9713910222053528 -0.3831331133842468 0.4452079236507416 0.8197721838951111 -0.3720356523990631 -2.485151529312134 -2.916470050811768 1.360888838768005 3.382392644882202 1.772484540939331 6.227567195892334 5.313973426818848 -3.686244010925293
- -1.044923067092896 -0.6204045414924622 0.4762036800384521 1.38463294506073 1.896140098571777 0.8442369103431702 -1.000043511390686 -1.628986954689026 -1.293834567070007 0.4870565533638 0.1893805116415024 0.2234033346176147 2.065907001495361 8.522867202758789 -6.470883369445801 -4.023353099822998 1.43738579750061 -1.611199975013733 2.192246913909912 -2.025832891464233
- 0.5273020267486572 -0.6774094104766846 -1.29461681842804 -1.574475884437561 -0.9886358976364136 1.996883153915405 6.080745220184326 5.987292766571045 -0.3999612033367157 -3.713287830352783 -3.684836149215698 -2.649953603744507 -0.6658831238746643 -0.06266254186630249 -0.5540755987167358 -3.395471334457397 -2.232511520385742 4.278748512268066 0.545662522315979 2.477146625518799
- -0.1050721555948257 0.2543626427650452 0.4843499660491943 1.372157454490662 1.879227757453918 1.241358757019043 -0.6687085628509521 -1.956961393356323 -1.595991969108582 -0.487903505563736 -0.01529598701745272 1.100984573364258 3.392524242401123 3.180742502212524 2.200745344161987 -2.317345857620239 -5.851405143737793 -5.270879745483398 -1.319336771965027 4.482447624206543
- 0.0861944854259491 1.627197742462158 3.119501113891602 2.88640284538269 -1.188022017478943 -4.920713424682617 -3.729239463806152 -1.751325368881226 -0.5010479688644409 0.124340333044529 -0.2716037034988403 1.384114503860474 3.488973140716553 5.251720428466797 0.2342787981033325 -0.630257248878479 -2.122978210449219 -4.461305618286133 -0.9762325286865234 2.350007057189941
- -1.578287482261658 -1.151609063148499 -0.7226881384849548 -0.3585452139377594 -1.416881680488586 -2.117095470428467 -1.243236064910889 -1.838885903358459 -2.377279043197632 -2.065260887145996 -1.012246131896973 0.1873133778572083 2.22126579284668 1.408414244651794 4.575538635253906 5.178004741668701 -3.079495906829834 5.061307430267334 3.801852941513062 -3.472188711166382
- 3.111293315887451 3.499862909317017 2.331948041915894 0.4638634324073792 2.347216844558716 3.522525310516357 0.3779596090316772 -4.296150207519531 -4.16926383972168 -1.525550961494446 0.626427948474884 -1.253017067909241 -2.947427988052368 -2.39054274559021 -0.02942688949406147 -1.402943134307861 -3.100247144699097 -4.577243328094482 3.587210655212402 5.823503494262695
- -1.179384589195251 -1.121111392974854 -0.9256934523582458 -1.168110489845276 -1.46504008769989 -0.6227954626083374 0.7835890054702759 1.578969240188599 1.548165440559387 1.72139048576355 0.4458664953708649 0.09952378273010254 0.4080110788345337 0.8219373226165771 0.6378029584884644 0.06796485930681229 2.590851783752441 -0.8319486379623413 -8.538399696350098 5.148406982421875
- -2.809927225112915 -1.541267991065979 -0.05660203844308853 0.2732137143611908 0.7314560413360596 -0.7509997487068176 -1.288371324539185 -0.7030578851699829 0.03508049249649048 -3.465934276580811 -2.587848424911499 -2.710115909576416 -0.9070274233818054 4.234298229217529 2.352331399917603 0.307625412940979 0.8923546075820923 7.137224674224854 -3.019083738327026 3.876649379730225
- -2.398871898651123 -2.430040121078491 -2.182124137878418 1.710171818733215 4.558404445648193 2.585255146026611 -0.1513275951147079 0.2480347156524658 -0.6019328832626343 -2.090327739715576 -3.856148719787598 2.461416721343994 2.211403369903564 0.2258319556713104 2.451232671737671 0.196534737944603 -2.86897087097168 -0.8819790482521057 1.970257043838501 -1.156824707984924
- 2.179726362228394 0.9464124441146851 1.234337568283081 2.913567543029785 4.491357803344727 2.805644273757935 -0.6168544888496399 -1.101556777954102 -2.003764867782593 -3.208517789840698 -0.3169008195400238 1.360198259353638 0.02002580650150776 -3.03547191619873 -3.313289880752563 -0.1966520696878433 -2.457667589187622 -1.742273688316345 1.50789749622345 0.533784806728363
- 2.292646884918213 0.4295259714126587 -1.309694051742554 -0.9024999737739563 -0.7171260714530945 -0.3549686968326569 3.02696704864502 4.821635246276855 3.106724739074707 0.530340850353241 -1.806814789772034 -5.306365489959717 -2.775550603866577 -1.666095733642578 0.8008070588111877 6.27994966506958 -2.28711986541748 -1.751072645187378 -1.300008893013 -1.111285328865051
- 1.828822731971741 1.924084305763245 2.210238456726074 1.150583624839783 -0.1303954869508743 -2.154010534286499 -2.40791916847229 -2.493299245834351 -1.046431660652161 -0.9707775712013245 -3.985835790634155 -3.150720119476318 0.06721735000610352 3.989891290664673 3.017390727996826 -2.933792114257812 -2.54486346244812 6.15129566192627 1.576316595077515 -0.0977918952703476
- -0.1405362188816071 -1.052835464477539 -1.937581658363342 -0.9822971820831299 1.244488835334778 2.789332628250122 -0.2322647124528885 -7.044950008392334 -4.668091297149658 0.3274454176425934 1.807197332382202 2.320538997650146 2.911417961120605 2.004117012023926 4.145725250244141 2.274838447570801 -1.673011183738708 0.4367547035217285 0.3939058780670166 -2.924193143844604
- -4.809693813323975 -3.094882726669312 -1.08229398727417 2.195174932479858 3.95325231552124 3.087880849838257 0.2461965978145599 0.3359392285346985 1.092726826667786 -0.07033021003007889 -2.383874416351318 -3.94788646697998 -3.19091796875 0.9326770305633545 6.279399871826172 -0.9659249186515808 -1.181946754455566 4.384064197540283 0.9626205563545227 -2.742186546325684
- -3.016356706619263 9.801516532897949 -3.363113403320312 -4.45392370223999 2.905460596084595 -6.254342555999756 3.317172288894653 -4.589588165283203 1.738738536834717 -1.200492858886719 0.4400055706501007 0.925441563129425 2.630321264266968 0.1618210673332214 -1.531188249588013 -0.3781534135341644 1.329635500907898 2.630168676376343 -0.6150040626525879 -0.4781222641468048
- 4.55604362487793 2.580373048782349 0.1762706488370895 -2.095387697219849 -2.392717123031616 -1.946521878242493 -2.249571561813354 -1.525928616523743 -1.484807014465332 -2.755709171295166 -2.578634738922119 -0.1556224524974823 1.710514426231384 0.3374819755554199 1.420053124427795 1.359533667564392 -0.3075164556503296 2.475363969802856 2.287737131118774 0.5890458226203918
- -7.977521896362305 -1.658228874206543 2.922909259796143 -2.1527099609375 -3.673208236694336 1.383365392684937 2.214821338653564 1.311644911766052 2.874455213546753 0.1955442279577255 1.306565046310425 2.689847230911255 -2.426669836044312 2.250471115112305 3.505016326904297 -2.891240358352661 1.488453507423401 0.7992474436759949 -2.107151985168457 -0.05561193823814392
- 0.1422393321990967 -0.7619351148605347 -0.9460119605064392 -0.3138290047645569 0.1281789690256119 1.315140843391418 1.855281233787537 -2.782629251480103 -4.401731491088867 -3.140527009963989 2.252847909927368 2.367610692977905 -1.058021664619446 -1.90732729434967 1.152185201644897 10.19630336761475 0.8858375549316406 -3.147515773773193 -1.1206374168396 -0.7154669761657715
- 0.8248384594917297 0.8526181578636169 1.315985918045044 2.502092838287354 4.36121940612793 5.271065711975098 3.694977283477783 0.6551068425178528 -0.6280556917190552 -0.7392285466194153 -2.101599216461182 -3.216418504714966 -3.044646739959717 -1.389599084854126 0.5011292099952698 1.630648016929626 -1.71641731262207 -5.533926963806152 -2.957022666931152 -0.2827623188495636
- 2.055291652679443 1.917427659034729 2.022477388381958 1.330519199371338 0.1396175622940063 -0.145114466547966 0.7287222146987915 0.9049378633499146 -2.827601671218872 -7.110092639923096 -3.722591876983643 4.693623542785645 3.313851833343506 -2.71045708656311 -1.027623891830444 4.011478900909424 -3.833123445510864 -2.273756980895996 1.183056116104126 1.349351406097412
- 0.3466275632381439 -0.811500608921051 -1.162166595458984 -0.97109454870224 1.014793992042542 2.412246465682983 2.660403490066528 1.828718900680542 0.966307520866394 -0.4084873497486115 -2.010743141174316 -1.884526491165161 -2.395977735519409 0.03519318625330925 -0.8708953857421875 0.1145875155925751 2.584129810333252 -1.97539496421814 -0.5613021850585938 1.08907949924469
- -1.263380885124207 -0.7822160124778748 0.5198600292205811 0.1983784884214401 -0.5348799824714661 -0.365075409412384 -0.8693314790725708 -0.8515676856040955 -0.2659909427165985 -1.334527254104614 -7.663465023040771 3.310134410858154 3.016531467437744 0.7068309783935547 -3.084003925323486 2.022332429885864 2.872159481048584 -0.4162555336952209 1.218373537063599 3.566088199615479
- -0.3216516971588135 3.221625804901123 3.870472192764282 0.2122312188148499 -3.657544136047363 0.7412871122360229 5.284444808959961 -2.531900644302368 -5.432384967803955 -0.97563636302948 -0.42440465092659 -0.4731929898262024 -1.393001914024353 -2.044685363769531 0.8389638066291809 2.077716827392578 0.8919699788093567 -0.207108274102211 -0.2953191995620728 0.6181174516677856
- 0.7108275890350342 0.3348914682865143 0.3416587114334106 0.6324843168258667 1.492210984230042 1.477305769920349 1.358806133270264 0.8752771019935608 -0.6455005407333374 -0.4927145540714264 -0.5016289353370667 -1.181386113166809 -1.327820181846619 -1.542193174362183 -0.7287373542785645 -4.591496467590332 -6.263872623443604 -1.872579216957092 5.095321655273438 6.829142093658447
- -2.133308172225952 -1.305227160453796 -0.8609516620635986 -1.00655996799469 -1.819628000259399 -1.892853379249573 -1.955222487449646 -2.512522459030151 -1.395277500152588 -1.057385206222534 -2.125317573547363 -2.107363939285278 0.9142829775810242 5.264134883880615 4.94709587097168 2.039867639541626 0.6937384605407715 0.9543434381484985 1.085071682929993 4.273086547851562
- -0.01218937523663044 -0.2104109972715378 -0.4952553808689117 -0.8956567645072937 -2.061127424240112 -1.503689050674438 -0.5898793339729309 -0.2332734316587448 -1.119745969772339 -0.7025426626205444 -1.698992013931274 -1.141206979751587 -1.269649147987366 0.9420334696769714 5.496718406677246 6.396792411804199 -5.525935173034668 -2.62508225440979 1.461837530136108 5.787248134613037
- -0.5800591111183167 -0.6420941352844238 0.7610563635826111 3.122416973114014 2.004901170730591 -0.9473462104797363 -2.701996088027954 1.207645297050476 -0.6979436874389648 -3.340005159378052 -2.477483987808228 -1.702896356582642 -0.07528796046972275 -1.053730487823486 0.2758727669715881 2.857306241989136 7.10299825668335 -3.54712438583374 3.055685997009277 -2.621918916702271
- -0.3279118239879608 -0.9622610211372375 -2.090043306350708 0.03295630216598511 1.90688681602478 0.6526901721954346 0.5049722790718079 0.8756893873214722 -1.947240948677063 0.9828313589096069 4.045522689819336 0.3910680413246155 1.593252301216125 -6.054596900939941 -2.835060358047485 0.8481953740119934 1.475954532623291 1.433577537536621 -2.576107025146484 2.049623489379883
- 2.475205898284912 2.29104208946228 0.9969691634178162 0.04573535174131393 -0.2792411148548126 0.5950846076011658 -0.3121286332607269 1.327158451080322 2.187009334564209 2.182214498519897 0.443950891494751 0.4745225310325623 -0.6979313492774963 1.297338008880615 0.3273941278457642 -5.592404842376709 -2.777544021606445 4.176718235015869 -4.712465286254883 -4.448632717132568
- 0.7547904253005981 -0.06769806891679764 -0.2861188054084778 -0.2048496603965759 -0.3728801906108856 -0.645748496055603 -2.420403957366943 -3.016635656356812 -3.133468866348267 -2.066494226455688 1.293098926544189 2.185741901397705 1.946314096450806 1.237818837165833 1.592957139015198 0.8078241348266602 -3.820257425308228 -2.739664077758789 10.02688407897949 -1.071196913719177
- 1.386120557785034 1.239166140556335 -0.5838223099708557 -2.502824544906616 -0.9563609957695007 2.376350879669189 4.298339366912842 2.312064170837402 -0.3481047451496124 2.647337436676025 4.624639987945557 -1.711463212966919 -1.910499453544617 -0.8152333498001099 -2.839919567108154 -3.772347450256348 0.1047441586852074 -1.079155683517456 -1.053714990615845 -1.41532027721405
- 0.04745131731033325 2.718222618103027 4.573976993560791 5.058319091796875 3.582614183425903 1.999575853347778 0.5326112508773804 -1.030566453933716 -1.437790751457214 0.0681239515542984 2.065274953842163 0.3729293346405029 -1.023535490036011 -1.70553982257843 -2.583095073699951 -2.701324462890625 -4.407942295074463 -3.705919027328491 -2.753569364547729 0.3301959037780762
- -2.809134483337402 -1.86467719078064 0.3480339348316193 2.714848756790161 3.440782070159912 2.50223970413208 3.02089786529541 4.725719451904297 2.68867826461792 -1.864084601402283 -0.9962918162345886 0.4556294977664948 -1.938915252685547 -1.354613542556763 1.140177369117737 -4.312443256378174 -3.830919981002808 -2.809704065322876 0.9063619375228882 -0.1625916361808777
- 3.127937316894531 3.475513219833374 2.674872875213623 1.849913120269775 -0.2330504208803177 -2.754216432571411 -2.436744928359985 -0.1260258406400681 0.06145073473453522 -0.7245709896087646 -2.101935386657715 -1.849913954734802 0.3675121665000916 1.200463175773621 0.9443950057029724 2.181560277938843 -2.85406494140625 0.4793441593647003 1.246674299240112 -4.529114723205566
- -2.243232727050781 -2.290646553039551 -1.393570184707642 -0.01825732551515102 0.2698008120059967 -3.317106008529663 -6.407065868377686 -1.995304942131042 1.540119767189026 1.784000039100647 0.5734401345252991 0.1995477676391602 0.3754545152187347 -0.3499642014503479 1.46204948425293 6.038210391998291 0.2639777660369873 -1.717935919761658 3.115074872970581 4.111408233642578
- 3.658582210540771 1.056252002716064 -1.640542984008789 -2.278313875198364 -0.6621015667915344 2.55027437210083 4.715645790100098 4.590397357940674 0.4363184869289398 -3.301156759262085 -2.539849519729614 -1.849626064300537 -2.316951274871826 -1.048295736312866 1.133107542991638 2.060016632080078 -0.3099344074726105 -0.8783843517303467 -1.142873764038086 -2.232572555541992
- 0.3676292896270752 0.2759748101234436 0.2392083704471588 1.035270929336548 2.386772394180298 2.178936243057251 1.983893752098083 1.707737565040588 1.321234226226807 1.086136341094971 0.5223771333694458 0.02120557241141796 1.792625069618225 3.298501491546631 3.448411703109741 -3.085736751556396 -5.119638442993164 -5.101778507232666 -4.716545104980469 -3.642220258712769
- 4.884219646453857 1.063145995140076 -3.544343233108521 -5.776185035705566 -5.772930145263672 -4.018037796020508 -1.721833229064941 -1.812821745872498 -1.741513729095459 -0.4040072858333588 1.838671326637268 1.469184637069702 0.7607325911521912 0.9303805828094482 3.222580671310425 2.851775646209717 3.461273670196533 1.40652596950531 1.713598489761353 1.1895831823349
- 0.1613136678934097 -1.264242172241211 -3.324083805084229 -4.26353120803833 -4.725387573242188 -4.818338394165039 -1.641623258590698 2.477029085159302 4.598411560058594 7.415260791778564 5.576790332794189 3.55778694152832 1.601449966430664 1.816928148269653 0.2265026420354843 -1.378551006317139 -2.014397621154785 -2.168810367584229 -0.6702194809913635 -1.162286043167114
- 0.5943188071250916 1.814015984535217 1.802202582359314 0.7965434193611145 0.1747429668903351 1.237513899803162 3.052348375320435 2.679614543914795 -0.4772282242774963 -0.1802288293838501 0.6013532876968384 -0.1617982089519501 -1.953948259353638 -3.968850374221802 -3.181699752807617 -0.01018625777214766 5.768858909606934 1.510913133621216 -5.867515087127686 -4.230972766876221
- 3.697107076644897 0.8225064873695374 -2.455718278884888 -4.100333213806152 -2.223346471786499 -0.5557944178581238 -0.5015264749526978 0.2601654529571533 2.774975061416626 3.813210010528564 2.954968214035034 -0.1322500854730606 -3.903019905090332 -1.906180620193481 1.655888676643372 2.595170736312866 -0.4601938724517822 -1.438645720481873 -1.855635046958923 0.9586510062217712
- 2.995631217956543 -0.002277234336361289 -3.014349699020386 -3.461998224258423 -0.9265079498291016 0.4599019885063171 -0.5558301210403442 -2.901886701583862 -2.364246606826782 -0.1564784497022629 0.5596774220466614 2.428518533706665 1.639878749847412 -2.539297103881836 -3.717720508575439 1.243941903114319 4.205615043640137 5.557441711425781 0.9545348882675171 -0.4045487344264984
- 1.493394255638123 -0.4669122695922852 -2.28948450088501 -2.45932674407959 -2.136809587478638 -0.3295146226882935 -0.2779994606971741 -0.577634871006012 -0.6169610619544983 0.6561386585235596 4.724327087402344 3.07610034942627 -1.658060193061829 -2.031235456466675 -2.215492248535156 -2.107334136962891 6.704012393951416 -1.129895687103271 -0.6797859072685242 2.322467565536499
- -1.297030210494995 -0.5794317722320557 -0.1081402152776718 2.54412579536438 4.775333404541016 1.514504432678223 -1.747814416885376 -1.956537365913391 0.07455040514469147 1.546693801879883 -5.200569152832031 -5.585100173950195 -4.08670711517334 0.9180998802185059 -0.1823501735925674 0.9893454313278198 1.162729144096375 -0.04664810374379158 2.218381881713867 5.04656457901001
- 1.532089948654175 2.323511123657227 2.362767696380615 0.5084763169288635 -1.581148386001587 -0.5399421453475952 0.5696616172790527 2.288986682891846 0.3461943566799164 -3.190247297286987 -3.13453221321106 -2.923089504241943 -4.691374778747559 -2.944085597991943 4.81080436706543 2.626655340194702 2.906660079956055 -0.6256694793701172 -0.8443707823753357 0.1986517906188965
- -3.910779237747192 -2.54503345489502 -1.068150281906128 0.03138452768325806 0.9545773267745972 0.6089075207710266 0.8500150442123413 1.553359389305115 0.7447646260261536 -0.6660216450691223 -1.251451134681702 0.9642975330352783 3.072862148284912 2.39927864074707 -0.3977593183517456 1.682255029678345 -0.9336167573928833 -2.297159433364868 -2.267054557800293 2.475322484970093
- -1.234686613082886 -1.618472337722778 -1.720277547836304 -0.9833378195762634 2.112728357315063 5.194481372833252 4.810319900512695 0.8448953032493591 -2.347816705703735 -0.3326122760772705 1.17035448551178 0.5326123833656311 -1.681164145469666 0.7134349942207336 -3.921677112579346 -2.740969181060791 -1.502994060516357 0.1494543105363846 -1.303657412528992 3.859384536743164
- -0.1974760890007019 -1.204159379005432 0.7870263457298279 1.20784318447113 -0.412180632352829 2.854308605194092 2.036135673522949 -7.896153450012207 1.96798038482666 0.6142703294754028 -1.04549241065979 0.7656822800636292 0.530646800994873 0.7491075992584229 2.27885913848877 -1.031242847442627 -0.5792055726051331 -0.1947787255048752 -0.2996771633625031 -0.9314987063407898
- -0.4684286415576935 -0.8086718320846558 -0.4803415238857269 -0.05642393231391907 -0.07137160003185272 -0.5396735072135925 -0.140896812081337 1.908030867576599 3.449936151504517 0.9632052183151245 -2.89526104927063 -3.726168155670166 -3.505832433700562 -3.098532438278198 -3.468913555145264 -0.6730149388313293 3.466864347457886 0.407550185918808 5.336441040039062 4.401493072509766
- -2.703024387359619 -0.1572434902191162 2.461108684539795 3.664478302001953 3.587172031402588 3.79566216468811 2.713443994522095 -1.633461594581604 -5.015755176544189 -4.550937652587891 -3.106352567672729 -2.323480606079102 -1.362185120582581 -0.8140701055526733 -0.7929184436798096 0.005429294891655445 1.243126511573792 1.093090772628784 2.23856520652771 1.657349467277527
- 0.03467286005616188 0.719140350818634 0.3970751166343689 -1.179105997085571 -3.582636117935181 -2.297462224960327 1.133430480957031 2.930241823196411 4.449448108673096 3.285587787628174 0.9356228709220886 -0.6920117735862732 -0.9163419008255005 -1.47978138923645 -0.1448333114385605 3.028470516204834 -3.840100526809692 -2.107812881469727 2.127859592437744 -2.801463842391968
- 0.1642050743103027 1.550507426261902 2.340445041656494 0.8584553599357605 -3.849125862121582 -6.730381488800049 -5.366515159606934 -2.990593910217285 -1.69432544708252 -0.3469432592391968 1.720078587532043 1.839707493782043 1.809596061706543 2.265991687774658 3.629663944244385 2.290788173675537 3.841415643692017 -0.8610998392105103 -1.324124097824097 0.8522539734840393
- -3.16595196723938 -2.74837589263916 -2.364439487457275 -2.732161045074463 -3.585515260696411 -3.129282236099243 -0.4480576515197754 2.710974216461182 3.149567127227783 0.229665219783783 -1.196038365364075 -0.4921483099460602 0.6224842667579651 0.377840667963028 1.882081866264343 3.848324537277222 2.575013637542725 -0.9573463201522827 -0.5414612293243408 5.964829921722412
-
-
diff --git a/octave/trellis.m b/octave/trellis.m
deleted file mode 100644
index 01649ec..0000000
--- a/octave/trellis.m
+++ /dev/null
@@ -1,594 +0,0 @@
-% trellis.m
-% David Rowe July 2021
-%
-% Testing trellis decoding of Codec 2 Vector Quantiser (VQ)
-% information. Uses soft decision information, probablility of state
-% transitions, and left over redundancy to correct errors on VQ
-% reception.
-%
-% VQ indexes are transmitted as codewords mapped to +-1
-%
-% y = c + n
-%
-% where c is the transmitted codeword, y is the received codeword,
-% and n is Gaussian noise.
-%
-% This script generates the test data files:
-%
-% cd codec2/build_linux
-% ../script/train_trellis.sh
-%
-% Results so far (August 2021):
-%
-% 1/ 2dB improvement with nstages=3, dec=1
-% 2/ No useful improvement with nstages=3, dec=4. This is required for a practical codec to
-% get a useful bit rate.
-
-1;
-
-% converts a decimal value to a soft dec binary value
-function c = dec2sd(dec, nbits)
-
- % convert to binary
-
- c = zeros(1,nbits);
- for j=0:nbits-1
- mask = 2.^j;
- if bitand(dec,mask)
- c(nbits-j) = 1;
- end
- end
-
- % map to +/- 1
-
- c = -1 + 2*c;
-endfunction
-
-
-% y is vector of received soft decision values (e.g +/-1 + noise)
-function [txp indexes] = ln_tx_codeword_prob_given_rx_codeword_y(y, nstates, C)
- nbits = length(y);
- np = 2.^nbits;
-
- % Find log probability of all possible transmitted codewords
- txp = C * y';
-
- % return most probable codewords (number of states to search)
- [txp indexes] = sort(txp,"descend");
- txp = txp(1:nstates);
- indexes = indexes(1:nstates) - 1;
-endfunction
-
-% A matrix of all possible tx codewords C, one per row
-function C = precompute_C(nbits)
- np = 2.^nbits;
-
- C = zeros(np, nbits);
- for r=0:np-1
- C(r+1,:) = dec2sd(r,nbits);
- end
-
-endfunction
-
-
-% work out transition probability matrix, given lists of current and next
-% candidate codewords
-
-function tp = calculate_tp(vq, sd_table, h_table, indexes_current, indexes_next, verbose)
- ntxcw = length(indexes_current);
- tp = zeros(ntxcw, ntxcw);
- for txcw_current=1:ntxcw
- index_current = indexes_current(txcw_current);
- for txcw_next=1:ntxcw
- index_next = indexes_next(txcw_next);
- dist = vq(index_current+1,:) - vq(index_next+1,:);
- sd = mean(dist.^2);
- p = prob_from_hist(sd_table, h_table, sd);
- if bitand(verbose, 0x2)
- printf("index_current: %d index_next: %d sd: %f p: %f\n", index_current, index_next, sd, p);
- end
- tp(txcw_current, txcw_next) = log(p);
- end
- end
-endfunction
-
-
-% y is the sequence received soft decision codewords, each row is one
-% codeword in time. sd_table and h_table map SD to
-% probability. Returns the most likely transmitted VQ index ind in the
-% middle of the codeword sequence y. We search the most likely ntxcw
-% tx codewords out of 2^nbits possibilities.
-
-function ind = find_most_likely_index(y, vq, C, sd_table, h_table, nstages, ntxcw, verbose)
- [ncodewords nbits] = size(y);
-
- % populate the nodes of the trellis with the most likely transmitted codewords
- txp = zeros(nstages, ntxcw); indexes = zeros(nstages, ntxcw);
- for s=1:nstages
- [atxp aindexes] = ln_tx_codeword_prob_given_rx_codeword_y(y(s,:), ntxcw, C);
- txp(s,:) = atxp;
- indexes(s,:) = aindexes;
- end
-
- if verbose
- printf("rx_codewords:\n");
- for r=1:ncodewords
- for c=1:nbits
- printf("%7.2f", y(r,c));
- end
- printf("\n");
- end
-
- printf("\nProbability of each tx codeword index/binary/ln(prob):\n");
- printf(" ");
- for s=1:nstages
- printf("Time n%+d ", s - (floor(nstages/2)+1));
- end
- printf("\n");
-
- for i=1:ntxcw
- printf("%d ", i);
- for s=1:nstages
- ind = indexes(s,i);
- printf("%4d %12s %5.2f ", ind, dec2bin(ind,nbits), txp(s, i));
- end
- printf("\n");
- end
- printf("\n");
- end
-
- % Determine transition probability matrix for each stage, this
- % changes between stages as lists of candidate tx codewords
- % changes
-
- tp = zeros(nstages, ntxcw, ntxcw);
- for s=1:nstages-1
- if verbose printf("Calc tp(%d,:,:)\n", s), end
- tp(s,:,:) = calculate_tp(vq, sd_table, h_table, indexes(s,:), indexes(s+1,:), verbose);
- end
-
- if verbose
- printf("Evaluation of all possible paths:\n");
- printf(" ");
- for s=1:nstages
- printf(" n%+d", s - (floor(nstages/2)+1));
- end
- printf(" indexes");
- printf(" ");
-
- for s=1:nstages
- printf(" txp(%d)", s-1);
- if s < nstages
- printf(" tp(%d,%d) ", s-1,s);
- end
- end
- printf(" prob max_prob\n");
- end
-
- % OK lets search all possible paths and find most probable
-
- n = ones(1,nstages); % current node at each stage through trellis, describes current path
- max_prob = -100;
- do
-
- if bitand(verbose, 0x4)
- printf(" ");
- for s=1:nstages
- printf("%4d", n(s)-1);
- end
- printf(" ");
- for s=1:nstages
- printf("%4d ", indexes(s,n(s)));
- end
- end
-
- % find the probability of current path
- prob = 0;
- for s=1:nstages
- prob += txp(s, n(s));
- if bitand(verbose,0x4)
- printf("%8.2f ", txp(s, n(s)));
- end
- if s < nstages
- prob += tp(s, n(s), n(s+1));
- if bitand(verbose,0x4)
- printf("%8.2f ", tp(s, n(s), n(s+1)));
- end
- end
- end
-
- if (prob > max_prob)
- max_prob = prob;
- max_n = n;
- end
-
- if bitand(verbose,0x4)
- printf("%9.2f %9.2f\n", prob, max_prob);
- end
-
- % next path
-
- s = nstages;
- n(s)++;
- while (s && (n(s) == (ntxcw+1)))
- n(s) = 1;
- s--;
- if s > 0
- n(s)++;
- end
- end
- until (sum(n) == nstages)
-
- middle = floor(nstages/2)+1;
- ind = indexes(middle, max_n(middle));
- if verbose
- printf("\nMost likely path through nodes... ");
- for s=1:nstages
- printf("%4d ", max_n(s)-1);
- end
- printf("\nMost likely path through indexes: ");
- for s=1:nstages
- printf("%4d ", indexes(s,max_n(s)));
- end
- printf("\nMost likely VQ index at time n..: %4d\n", ind);
- end
-endfunction
-
-
-% Given a normalised histogram, estimate probability from SD
-function p = prob_from_hist(sd_table, h_table, sd)
- p = interp1 (sd_table, h_table, sd, "extrap", "nearest");
-endfunction
-
-
-% Calculate a normalised histogram of the SD of adjacent frames from
-% a file of output vectors from the VQ.
-function [sd_table h_table] = vq_hist(vq_output_fn, dec=1)
- K=20; K_st=2+1; K_en=16+1;
- vq_out = load_f32(vq_output_fn, K);
- [r c]= size(vq_out);
- diff = vq_out(dec+1:end,K_st:K_en) - vq_out(1:end-dec,K_st:K_en);
- % Octave efficient way to determine MSE or each row of matrix
- sd_adj = meansq(diff');
- [h_table sd_table] = hist(sd_adj,100,1);
- h_table = max(h_table, 1E-5);
-endfunction
-
-
-% vector quantise a sequence of target input vectors, returning the VQ indexes and
-% quantised vectors target_
-function [indexes target_] = vector_quantiser(vq, target, verbose=1)
- [vq_size K] = size(vq);
- [ntarget tmp] = size(target);
- target_ = zeros(ntarget,K);
- indexes = zeros(1,ntarget);
- for i=1:ntarget
- best_e = 1E32;
- for ind=1:vq_size
- e = sum((vq(ind,:)-target(i,:)).^2);
- if verbose printf("i: %d ind: %d e: %f\n", i, ind, e), end;
- if e < best_e
- best_e = e;
- best_ind = ind;
- end
- end
- if verbose printf("best_e: %f best_ind: %d\n", best_e, best_ind), end;
- target_(i,:) = vq(best_ind,:); indexes(i) = best_ind;
- end
-endfunction
-
-
-% faster version of vector quantiser
-function [indexes target_] = vector_quantiser_fast(vq, target, verbose=1)
- [vq_size K] = size(vq);
- [ntarget tmp] = size(target);
- target_ = zeros(ntarget,K);
- indexes = zeros(1,ntarget);
-
- % pre-compute energy of each VQ vector
- vqsq = zeros(vq_size,1);
- for i=1:vq_size
- vqsq(i) = vq(i,:)*vq(i,:)';
- end
-
- % use efficient matrix multiplies to search for best match to target
- for i=1:ntarget
- best_e = 1E32;
- e = vqsq - 2*(vq * target(i,:)');
- [best_e best_ind] = min(e);
- if verbose printf("best_e: %f best_ind: %d\n", best_e, best_ind), end;
- target_(i,:) = vq(best_ind,:); indexes(i) = best_ind;
- end
-endfunction
-
-
-% VQ a target sequence of frames then run a test using vanilla uncoded/trellis decoder
-function results = run_test(target, vq, sd_table, h_table, ntxcw, nstages, EbNo, verbose)
- [frames tmp] = size(target);
- [vq_length tmp] = size(vq);
- nbits = log2(vq_length);
- nerrors = 0;
- nerrors_vanilla = 0;
- tbits = 0;
- nframes = 0;
- nper = 0;
- nper_vanilla = 0;
-
- C = precompute_C(nbits);
-
- % Vector Quantise target vectors sequence
- [tx_indexes target_ ] = vector_quantiser_fast(vq, target, verbose);
- % use convention of indexes starting from 0
- tx_indexes -= 1;
- % mean SD of VQ with no errors
- diff = target - target_;
- mse_noerrors = mean(diff(:).^2);
-
- % construct tx symbol codewords from VQ indexes
- tx_codewords = zeros(frames, nbits);
- for f=1:frames
- tx_codewords(f,:) = dec2sd(tx_indexes(f), nbits);
- end
-
- rx_codewords = tx_codewords + randn(frames, nbits)*sqrt(1/(2*EbNo));
- rx_indexes = zeros(1,frames);
- rx_indexes_vanilla = ones(1,frames);
-
- ns2 = floor(nstages/2);
- for f=ns2+1:frames-ns2
- %if f==10 verbose = 1+0x2, else verbose = 0;, end
- if verbose
- printf("f: %d tx_indexes: ", f);
- for i=f-ns2:f+ns2
- printf("%d ", tx_indexes(i));
- end
- printf("\n");
- end
- tx_bits = tx_codewords(f,:) > 0;
- if verbose
- printf("tx_bits: ");
- for i=1:nbits
- printf("%d",tx_bits(i));
- end
- printf("\n");
- end
- rx_bits_vanilla = rx_codewords(f,:) > 0;
- rx_indexes(f) = find_most_likely_index(rx_codewords(f-ns2:f+ns2,:)*EbNo,
- vq, C, sd_table, h_table, nstages, ntxcw, verbose);
- rx_bits = dec2sd(rx_indexes(f), nbits) > 0;
- rx_indexes_vanilla(f) = sum(rx_bits_vanilla .* 2.^(nbits-1:-1:0));
- errors = sum(xor(tx_bits, rx_bits));
- nerrors += errors;
- if errors nper++;, end
- errors = sum(xor(tx_bits, rx_bits_vanilla));
- nerrors_vanilla += errors;
- if errors nper_vanilla++;, end
- if verbose
- printf("[%d] %d %d\n", f, nerrors, nerrors_vanilla);
- end
- tbits += nbits;
- nframes++;
- end
-
- EbNodB = 10*log10(EbNo);
- target = target(ns2+1:frames-ns2,:);
- target_vanilla_ = vq(rx_indexes_vanilla(ns2+1:frames-ns2)+1,:);
- target_ = vq(rx_indexes(ns2+1:frames-ns2)+1,:);
- diff_vanilla = target - target_vanilla_;
- mse_vanilla = mean(diff_vanilla(:).^2);
- diff = target - target_;
- mse = mean(diff(:).^2);
- printf("Eb/No: %3.2f dB nframes: %2d nerrors %3d %3d BER: %4.3f %4.3f PER: %3.2f %3.2f mse: %3.2f %3.2f %3.2f\n",
- EbNodB, nframes, nerrors, nerrors_vanilla, nerrors/tbits, nerrors_vanilla/tbits,
- nper/nframes, nper_vanilla/nframes,
- mse_noerrors, mse, mse_vanilla);
- results.ber = nerrors/tbits;
- results.ber_vanilla = nerrors_vanilla/tbits;
- results.per = nper/nframes;
- results.per_vanilla = nper_vanilla/nframes;
- results.mse_noerrors = mse_noerrors;
- results.mse = mse;
- results.mse_vanilla = mse_vanilla;
- results.tx_indexes = tx_indexes;
- results.rx_indexes = rx_indexes;
- results.rx_indexes_vanilla = rx_indexes_vanilla;
-endfunction
-
-% Simulations ---------------------------------------------------------------------
-
-% top level function to set up and run a test
-function [results target_] = test_trellis(target_fn, nframes=100, dec=1, ntxcw=8, nstages=3, EbNodB=3, verbose=0)
- K = 20; K_st=2+1; K_en=16+1;
- vq_fn = "../build_linux/vq_stage1_bs004.f32";
- vq_output_fn = "../build_linux/all_speech_8k_test.f32";
-
- % load VQ
- vq = load_f32(vq_fn, K);
- [vq_size tmp] = size(vq);
- vqsub = vq(:,K_st:K_en);
-
- % load file of VQ-ed vectors to train up SD PDF estimator
- [sd_table h_table] = vq_hist(vq_output_fn, dec);
-
- % load sequence of target vectors we wish to VQ
- target = load_f32(target_fn, K);
-
- % limit test to the first nframes vectors
- if nframes != -1
- last = nframes;
- else
- last = length(target);
- end
- target = target(1:dec:last,K_st:K_en);
-
- % run a test
- EbNo=10^(EbNodB/10);
- results = run_test(target, vqsub, sd_table, h_table, ntxcw, nstages, EbNo, verbose);
- if verbose
- for f=2:nframes-1
- printf("f: %03d tx_index: %04d rx_index: %04d\n", f, results.tx_indexes(f), results.rx_indexes(f));
- end
- end
-
- % return full band vq-ed vectors
- target_ = zeros(last,K);
- target_(1:dec:last,:) = vq(results.rx_indexes+1,:);
-
- % use linear interpolation to restore original frame rate
- for f=1:dec:last-dec
- prev = f; next = f + dec;
- for g=prev+1:next-1
- cnext = (g-prev)/dec; cprev = 1 - cnext;
- target_(g,:) = cprev*target_(prev,:) + cnext*target_(next,:);
- %printf("f: %d g: %d cprev: %f cnext: %f\n", f, g, cprev, cnext);
- end
- end
-endfunction
-
-% Plot histograms of SD at different decimations in time
-function vq_hist_dec(vq_output_fn)
- figure(1); clf;
- [sd_table h_table] = vq_hist(vq_output_fn, dec=1);
- plot(sd_table, h_table, "b;dec=1;");
- hold on;
- [sd_table h_table] = vq_hist(vq_output_fn, dec=2);
- plot(sd_table, h_table, "r;dec=2;");
- [sd_table h_table] = vq_hist(vq_output_fn, dec=3);
- plot(sd_table, h_table, "g;dec=3;");
- [sd_table h_table] = vq_hist(vq_output_fn, dec=4);
- plot(sd_table, h_table, "c;dec=4;");
- hold off;
- axis([0 300 0 0.5])
- xlabel("SD dB*dB"); title('Histogram of SD(n,n+1)');
-endfunction
-
-% Automated tests for vanilla and fast VQ search functions
-function test_vq(vq_fn)
- K=20;
- vq = load_f32(vq_fn, K);
- vq_size = 100;
- target = vq(1:vq_size,:);
- indexes = vector_quantiser(target,target, verbose=0);
- assert(indexes == 1:vq_size);
- printf("Vanilla OK!\n");
- indexes = vector_quantiser_fast(target,target, verbose=0);
- assert(indexes == 1:vq_size);
- printf("Fast OK!\n");
-endfunction
-
-% Test trellis decoding a single vector in a sequence of 3
-function ind = run_test_single(tx_codewords, ntxcw, var, verbose)
- nstages = 3;
- nbits = 2;
-
- rx_codewords = tx_codewords + randn(nstages, nbits)*var;
- vq = [0 0 0 1;
- 0 0 1 0;
- 0 1 0 0;
- 1 0 0 0];
- sd_table = [0 1 2 4];
- h_table = [0.5 0.25 0.15 0.1];
- C = precompute_C(nbits);
- ind = find_most_likely_index(rx_codewords, vq, C, sd_table, h_table, nstages, ntxcw, verbose);
-endfunction
-
-% Series of single point sanity checks
-function test_single
- printf("Single vector decode tests....\n");
- ind = run_test_single([-1 -1; -1 -1; -1 -1], ntxcw=1, var=0, verbose=0);
- assert(ind == 0);
- printf("00 with no noise OK!\n");
-
- ind = run_test_single([-1 1; 1 1; -1 1], ntxcw=1, var=0, verbose=0);
- assert(ind == 3);
- printf("11 with no noise OK!\n");
-
- ind = run_test_single([-1 -1; -1 1; -1 -1], ntxcw=4, var=1, verbose=0);
- assert(ind == 1);
- printf("01 with noise OK!\n");
-endfunction
-
-% BPSK simulation to check noise injection
-function test_bpsk_ber
- nbits = 12;
- frames = 10000;
- tx_codewords = zeros(frames,nbits);
- tx_bits = zeros(frames,nbits);
- for f=1:frames
- tx_codewords(f,:) = dec2sd(f, nbits);
- tx_bits(f,:) = tx_codewords(f,:) > 0;
- end
-
- EbNodB = 5;
- EbNo = 10^(EbNodB/10);
- rx_codewords = tx_codewords + randn(frames, nbits)*sqrt(1/(2*EbNo));
- rx_bits = rx_codewords > 0;
- nerrors = sum(xor(tx_bits, rx_bits)(:));
- tbits = frames*nbits;
- printf("EbNo: %4.2f dB tbits: %d errs: %d BER: %4.3f %4.3f\n", EbNodB, tbits, nerrors, nerrors/tbits, 0.5*erfc(sqrt(EbNo)));
-endfunction
-
-% generate sets of curves
-function [EbNodB rms_sd] = run_curves(frames=100, dec=1, nstages=5)
- results_log = [];
- EbNodB = [0 1 2 3 4 5];
- target_fn = "../build_linux/all_speech_8k_lim.f32";
-
- for i=1:length(EbNodB)
- results = test_trellis(target_fn, frames, dec, ntxcw=8, nstages, EbNodB(i), verbose=0);
- results_log = [results_log results];
- end
- for i=1:length(results_log)
- ber(i) = results_log(i).ber;
- ber_vanilla(i) = results_log(i).ber_vanilla;
- per(i) = results_log(i).per;
- per_vanilla(i) = results_log(i).per_vanilla;
- rms_sd_noerrors(i) = sqrt(results_log(i).mse_noerrors);
- rms_sd(i) = sqrt(results_log(i).mse);
- rms_sd_vanilla(i) = sqrt(results_log(i).mse_vanilla);
- end
-
- figure(1); clf; semilogy(EbNodB, ber_vanilla, "r+-;uncoded;"); hold on;
- semilogy(EbNodB, ber, "g+-;trellis;"); hold off;
- grid('minor'); title(sprintf("BER dec=%d nstages=%d",dec,nstages));
- print("-dpng", sprintf("trellis_dec_%d_ber.png",dec));
-
- figure(2); clf; semilogy(EbNodB, per_vanilla, "r+-;uncoded;"); hold on;
- semilogy(EbNodB, per, "g+-;trellis;");
- grid('minor'); title(sprintf("PER dec=%d nstages=%d",dec,nstages));
- print("-dpng", sprintf("trellis_dec_%d_per.png",dec));
-
- figure(3); clf; plot(EbNodB, rms_sd_noerrors, "b+-;no errors;"); hold on;
- plot(EbNodB, rms_sd_vanilla, "r+-;uncoded;");
- plot(EbNodB, rms_sd, "g+-;trellis;"); hold off;
- grid('minor'); title(sprintf("RMS SD dec=%d nstages=%d",dec,nstages));
- print("-dpng", sprintf("trellis_dec_%d_rms_sd.png",dec));
-endfunction
-
-function vq_file(vq_fn, dec, EbNodB, in_fn, out_fn)
- [results target_] = test_trellis(in_fn, nframes=-1, dec, ntxcw=8, nstages=3, EbNodB, verbose=0);
- save_f32(out_fn, target_);
-endfunction
-
-% -------------------------------------------------------------------
-
-more off;
-randn('state',1);
-
-% uncomment one of the below to run a test or simulation
-
-% These two tests show where we are at:
-%test_trellis(target_fn, nframes=600, dec=1, ntxcw=8, nstages=3, EbNodB=3, verbose=0);
-%test_trellis(target_fn, nframes=600, dec=4, ntxcw=8, nstages=3, EbNodB=3, verbose=0);
-
-%run_curves(600,1)
-%run_curves(600,2)
-%run_curves(600,4)
-%[EbNodB rms_sd] = run_curves(30*100,3,3)
-
-%test_trellis(target_fn, nframes=200, dec=1, ntxcw=1, nstages=3, EbNodB=3, verbose=0);
-%test_trellis(target_fn, nframes=100, dec=2, ntxcw=8, nstages=3, EbNodB=3, verbose=0);
-%test_vq("../build_linux/vq_stage1.f32");
-%vq_hist_dec("../build_linux/all_speech_8k_test.f32");
-%test_single
-%test_bpsk_ber
diff --git a/octave/trellis_dec3_nstage3.txt b/octave/trellis_dec3_nstage3.txt
deleted file mode 100644
index b4d8e98..0000000
--- a/octave/trellis_dec3_nstage3.txt
+++ /dev/null
@@ -1,15 +0,0 @@
-# Created by Octave 5.2.0, Sun Sep 12 12:26:33 2021 ACST <david@boomer>
-# name: EbNodB
-# type: matrix
-# rows: 1
-# columns: 6
- 0 1 2 3 4 5
-
-
-# name: rms_sd
-# type: matrix
-# rows: 1
-# columns: 6
- 7.7412523956816406 6.4841339000579836 5.8017966072531637 4.9470616511274006 4.3575512816148612 3.5924646693565796
-
-
diff --git a/octave/vq b/octave/vq
deleted file mode 100644
index d5ab591..0000000
--- a/octave/vq
+++ /dev/null
@@ -1,10247 +0,0 @@
-# Created by Octave 3.8.1, Sat Apr 23 08:58:51 2016 AEST <david@penetrator>
-# name: vq
-# type: matrix
-# ndims: 3
- 256 20 2
- 1.085205426985832
- -0.4260300009189197
- 0.833577745236378
- 1.798373960816606
- 0.9935936444607169
- 0.1239833582287509
- 1.575157273987481
- 0.9540245374175702
- 0.3562009016948172
- 1.585644452239723
- 1.506294746166876
- 0.2396183532805597
- 1.367446280732269
- 1.282223720216575
- 1.162423214604796
- 0.5244164469952718
- 1.128835884692779
- 1.058918853547902
- 1.963632826547209
- 0.5811484562442362
- 1.120960795023191
- 1.293247932196338
- 0.8421615329424976
- 1.327956700632984
- 1.150131602897049
- 1.32240186352708
- 1.151653785065956
- 0.4043141675059787
- -0.605854891571997
- 0.5664167394483143
- -0.7537298690327013
- 1.049449161804654
- 0.5218464074650003
- 1.494541250873327
- 0.8342264875867933
- 0.9206540524095941
- 0.06472922157937634
- 0.7198209111919989
- 1.38273463666622
- 1.369195704270166
- 0.7200435399985342
- 0.4728514924142588
- 1.338670575504253
- 0.901349771652351
- 0.7221823774481055
- 1.05531832867729
- 1.122264649509382
- 0.03480813187567571
- 0.8704977954705367
- 0.3118300343783649
- 1.345816954855809
- 0.9902369196859547
- 1.630250359910498
- 0.9962379680208187
- 0.7860178377708859
- 1.405072623711622
- 0.04215045540948043
- 1.100604952014984
- 1.801940417320714
- 1.672902158942722
- 0.9189112275890299
- 1.073606509430072
- 0.7077106102247487
- 1.351518501029729
- 0.8198628050578108
- 1.233747356047938
- 1.867879182176302
- 1.16871953438174
- 0.5619271296279016
- 1.377194835765386
- -0.06310946462056462
- 1.193115849982975
- 0.3302970529535515
- 1.128793026714063
- 0.9728683717267995
- 1.387587258338834
- 1.244021687351402
- 0.6683606936174704
- 1.199485416480435
- 0.5956899153219491
- 0.3013694867793058
- 0.8655341870443748
- 0.2088344957654923
- 1.1447496470614
- 1.084164446118127
- 1.003149200094682
- 1.191560192626183
- 0.07486858283563912
- 0.7661458586347402
- 0.4866127826256495
- -0.1089155940953209
- 1.23959659930226
- 1.054183144345908
- 0.2504451195646863
- 0.8956884207647202
- 1.119249454883628
- 1.116978748635182
- 0.9513183172426499
- 0.1089893432612581
- 0.6032927070356664
- 1.223982221591883
- 1.252308815173021
- 0.5827306571168442
- 1.421065953702404
- 0.162963901404173
- 1.196233511235407
- 1.84581856021695
- 0.9869956389787488
- 0.1646961461119581
- 0.9850201800243675
- 1.429250808608257
- 0.9923260772179757
- 0.9590272370201224
- 0.5825501483605714
- 1.070845967907089
- 1.175383240709347
- 0.6499779705541643
- 0.3320598410515813
- 1.592125364047756
- -0.3139251676378877
- 0.2941683771906135
- 1.678238614064441
- -0.4402253102695204
- 1.311626010101525
- 1.230368944293766
- 1.118969630404878
- 0.4699109361369931
- 0.5566459218624169
- 0.3996167544525743
- 1.063017424039592
- 0.9065738165115017
- 1.274194918558561
- 1.226051793207517
- 1.195335954727556
- 0.5219409661767341
- -0.3567210160579476
- 0.2030643648479605
- 1.385132588724635
- 0.9158832967346469
- 0.9322888042239789
- 1.298607308549179
- 0.6104336622079205
- 1.112243563345926
- 1.520623715949573
- 0.9317177714797874
- 0.7712367063105167
- 1.340499022391671
- 1.304764024159155
- 0.4735061357092801
- 0.9625427325458471
- 1.136775254002388
- 0.4261374335150909
- 0.3337168222499328
- 0.9646263375973135
- 0.1382418388350582
- 1.142845116548473
- 0.8905004958914902
- 0.6352197854178532
- 0.5315973388091748
- 0.2762672232170045
- 0.7323883053221711
- 1.069700009254771
- 0.5773447972180785
- 0.6265539300205094
- 1.208723096926154
- 1.373557618988817
- 1.396848139856655
- 1.22644909332404
- 0.747423382879117
- 0.1923928104579403
- 0.2317151183086048
- 1.195158636439779
- 1.235985355812018
- 0.9547800158843198
- 0.8904454757455824
- 1.143257875740302
- 0.908286803400884
- 0.1941688834036181
- 0.3158243056857314
- 0.6849987277815992
- 0.6445369483172818
- 1.05538088978711
- 0.6030235309635322
- 1.486202280215748
- 1.396804660772058
- 1.150704097309296
- 0.6920213957251961
- 1.582203495857851
- 1.202025792169117
- 1.374999251582953
- 0.2288168689728823
- 0.4329608518584964
- 0.8464391637680514
- 1.135844763204482
- -0.1545900194782768
- 0.9567819848531226
- 1.374372950241175
- 1.333415099532475
- 1.200028477439384
- -1.0208946912861
- 1.334019146241362
- 0.5691948095784971
- 1.250417957983486
- 0.1606069495457166
- 1.351838776281039
- 0.09518343481973855
- 0.3320891202043986
- 1.650452578645842
- 1.569148456097603
- -0.09071912653151751
- 0.3264988095922111
- 0.8375894641356687
- 0.6559955317907418
- 1.149364426104217
- 0.8062962854345533
- 0.9188276660142149
- 0.3028421810952253
- 1.566145006462622
- 0.5822774136794752
- 1.069120717715464
- 1.721561396547623
- 0.856831005984519
- 0.5564137080731699
- 0.7153678821180693
- 0.853234505158737
- 0.603185994785441
- 1.186506259153193
- 1.148948504058279
- 0.6177590034489259
- 0.5760949222380469
- 1.855034211463561
- 0.9121147355845477
- 1.010718439207553
- 1.549735365386854
- 1.069655184913645
- -0.7295454638452006
- 0.8476706126547495
- 1.045201963428327
- 1.876209304797508
- 1.100098125226684
- 0.5449377727755268
- 1.393285124315972
- 0.3558090786406779
- 0.9881025017683388
- 1.093368419306702
- 0.448706447264993
- 0.911083453512061
- 1.15800556561816
- -0.4846742001392422
- 0.5454789417356526
- -0.02763772693410249
- 0.7899662745198055
- 1.086855284902688
- 0.5083938014690804
- 1.784614071563062
- 0.4955810910707088
- 0.6307896832511808
- -0.34177101856323
- 1.407977101362635
- 0.01089753717535649
- 0.8109156423843644
- 0.02157571365906377
- 0.7974501480560753
- 1.161677104060995
- 0.7449135184865795
- 1.335922577995176
- 1.618074115184736
- 0.5036808860872769
- 1.281621536264201
- 1.496512222586918
- 0.5656867946695433
- 0.6635578371625578
- 0.7769267716943143
- 0.7863318705349102
- -1.780978883369023
- -0.0334354168623605
- 0.6636862687063216
- 1.31953372409462
- 0.7679335906405473
- 1.357765462325111
- 1.002678487287578
- 1.312437664849832
- 0.8924926344549168
- 0.4636383638860451
- -0.4070912248841624
- 0.3217800893580187
- -0.05480191063438398
- 0.5704105297752942
- 0.5671989228695588
- 1.265425897803026
- 0.9479718237857699
- 0.8777643997522284
- 0.1431302574000071
- 0.6515151863984949
- 1.173472222357272
- 1.362655064101474
- 0.5580298125429235
- 0.6418980270774041
- 1.03039668193185
- 0.3594537068522266
- -0.04147042419107318
- 1.455218010598134
- 1.227033289641574
- 0.06992318109090488
- 0.3180324711899842
- -0.1495786011244451
- 0.9918971182481525
- 0.8774198930235823
- 1.721649383997356
- 0.9281742007128928
- 1.640992165953183
- 1.269750130001307
- 0.03069266092696008
- 0.3789038439191283
- 0.593613546633564
- 1.111480012530088
- 0.8286979077983071
- 1.18404324241428
- 0.7819017133615419
- 1.184090438751563
- 0.7659782497915133
- 1.0270864532279
- 1.828429658014905
- 0.7901410673132826
- 0.7366673489477884
- 1.154988816261634
- -0.5471812039524085
- 0.934981740816867
- 0.2371332570247094
- 1.0250163450453
- 1.27266423448643
- 1.454333079552459
- 0.5727768922154086
- 0.9771845066546033
- 0.9172197471647986
- 1.075563145199177
- 0.4384292666482437
- 1.239092406693795
- 0.210285117767336
- 0.8733612055335693
- 1.053824328003951
- 1.140078195008836
- 0.7905272592630922
- 0.7828638574028199
- 0.3800700405357779
- 0.04386828899833825
- 0.4448709339379409
- 1.175831673476218
- 0.5101567242836115
- 0.09582478057635176
- 0.5917407640130367
- 1.188218565713065
- 0.9963122522605247
- 0.9296892601798483
- 0.2641176647599591
- 0.03959598133926203
- 0.9551648406598405
- 1.0764477050855
- 0.1378738153867933
- 1.23353768813546
- -0.4889616350026407
- 0.8333605392781226
- 1.077043592755524
- 0.4993903680346781
- -0.1139168084620633
- 0.7914997890435082
- 1.061615511701903
- 0.7068251156389007
- 0.8895360567176563
- 0.9221606578157804
- 0.8720105612358751
- 1.146999585796198
- 0.2380133501973453
- 0.5057686048644131
- 1.479930515236531
- 0.01015620544596672
- 0.2431628777000853
- 1.702530222152529
- -0.6796910843532397
- 1.032776572059292
- 1.301342297641337
- 0.8143336069861939
- 0.7635151712808649
- 0.6362377313700681
- 0.4339276521621836
- 0.4802842872208226
- 0.3001502607473731
- 1.106077237434545
- 1.008263870942845
- 1.365542441935153
- 0.6790855740186382
- -0.0837459219137099
- 0.8732339782103199
- 1.640876156222111
- 0.9177915661396188
- 1.104421107680557
- 0.8853913828852079
- 0.4571773916694294
- 0.9094059065244827
- 1.587617533587789
- 0.1524648649046425
- 0.3692382822458569
- 1.242632785428377
- 1.320666722021657
- 0.6910286390838315
- 0.8196657398334
- 1.094117543461184
- 1.050573062644234
- -0.095843175006164
- 0.8439478073229337
- 0.01388520142811661
- 0.8525313241450097
- 0.7560187534936887
- 0.7163589419339997
- 0.48172955945087
- 0.3191282594036909
- 0.5887849395958622
- 1.073048278856649
- 0.6298813075484302
- 0.8494144146160413
- 1.119108071145198
- 0.5041467048651576
- 0.753953116677396
- 1.415463825758381
- 0.7543289699956602
- 0.1886565605608594
- 0.337384574159233
- 0.997230623170282
- 0.9040472605249359
- 0.4907711273324722
- 0.9061210546528722
- 1.156437217107255
- 0.4695398632675316
- -0.00085808420372521
- 0.1361669439466877
- 0.789467312307312
- 0.5997423085983093
- 0.6901869245440042
- 0.6159422966653133
- 1.199854198628586
- 0.8079953503366223
- 0.468524121850383
- 0.5324545493188838
- 0.8344982497659503
- 1.370319814607772
- 1.44131066853247
- 0.7407415623265214
- 0.05393103628695976
- 1.079745668684748
- 0.5729519871321513
- -0.1851074752298328
- 0.992944720430734
- 0.9115450331591136
- 1.370626836759575
- 0.4751961017836588
- -0.6822887887799577
- 1.355603094738513
- 0.7582980444714997
- 1.287305989858565
- 0.3103196025488943
- 1.421172024185723
- -0.03865357392167217
- 0.7292790541459703
- 1.503226353587898
- 0.5882138571631963
- -0.6093718430332411
- 0.1767394375474176
- 1.276766057212127
- 0.2680255519434074
- 1.12370254387008
- 0.398854116141619
- 1.137373259085501
- -0.3490926629910003
- 1.624321880009409
- 0.5226169241649171
- 0.9044285339583492
- 1.521669667354217
- 0.7912102844944133
- 0.4799761729696941
- 0.007198768056136138
- 1.118146053519841
- 0.6123216140984202
- 1.326185872147739
- 0.9124790581806869
- 0.04998935374131432
- 0.197000146554438
- 0.891152524397205
- 0.5822353455552293
- 0.3891121700178945
- 1.593699066012701
- 0.9369187911763287
- -0.4173953205770336
- 0.02815662236665207
- 1.263074340857436
- -0.4156518344072447
- 0.9024061343598681
- 0.08377464923872469
- 1.738787817003506
- 0.5177228046119318
- 1.132147362693591
- 1.279158205976386
- 0.7202975064986489
- 1.083485371159031
- 1.243643218383548
- -0.252741128821911
- 0.7413435329819636
- 0.4777693296936473
- 0.8402990100436456
- 1.01127993141735
- 0.1533121344864636
- 1.467708403340319
- 0.491607387702562
- 0.2813488729981752
- -0.23309774437551
- 0.8385025128809915
- 0.3270048984513226
- 0.8551646087377082
- 0.0510931504452391
- 0.2765658079493324
- 1.19487687416751
- 0.7330927106990655
- 0.4039208562877936
- 0.7509115681262256
- 0.2929882944647805
- 0.6622594713526353
- 0.8716985336118284
- 0.256385689857605
- 0.5761648585763438
- 0.5135305910284679
- 0.7367357125025655
- 1.893284660668191
- -0.1812633458814429
- 0.5535296184930434
- 0.7110951260347793
- 0.1472364235480178
- 0.821249306261171
- 0.4425183187837054
- 1.099118632151938
- 0.5697552691995635
- 0.9103172272666007
- -0.3505623944219689
- 0.3038726147938779
- 0.2766268157752633
- 0.4633144824118865
- 0.421873437147429
- 1.403668123763734
- 0.885456979305717
- 0.4495998966673143
- 0.1751816133102695
- 0.1420572593236852
- 1.023012905853923
- 0.6073508208973148
- 0.698487833169068
- 0.6488088673841286
- 0.5915845287078585
- -0.05177700993234245
- -0.2162361772648918
- 1.095833420194178
- 1.280856218535019
- 0.1730234086711988
- 0.1005129723860903
- -0.2376144855255936
- 0.4483192343799798
- 1.104287886446522
- 1.05196798440898
- 1.422049575253155
- 1.537352663766892
- 0.7500419081327695
- 0.03991494652899544
- 0.1034867659806852
- 0.4224085207772535
- 0.3864210672817945
- 0.3735747180645465
- 0.7765915223589677
- 0.3315281950696041
- 0.5683741364769683
- 0.2019063044164997
- 1.034269555873555
- 1.233685691705767
- 0.09881214847988599
- 0.2720142723998445
- 0.6198100476916732
- -0.4401429185734267
- 0.2989412982646393
- 0.1531713813109536
- 0.6256149735005488
- 0.2905363579030045
- 1.397726502355438
- 0.2616648818407552
- 0.4490368449109646
- 0.9163917663722386
- 1.089257583951409
- 0.5203423966116525
- 0.8826668740057446
- 0.5417175045725473
- 1.090892214419326
- 0.7454410916412249
- 0.7525217841302803
- 0.1226292710741966
- 1.030237066837245
- 0.2089646577463286
- -0.06084684303132043
- 0.9846655017994531
- 0.5153646593337698
- 0.2205181808919031
- 0.2146525528107585
- 0.4538487033213079
- 0.3112177429774014
- 0.6401051461257636
- 0.2233938908298634
- 0.2471328569943696
- -0.3118132717953503
- 1.011259948671065
- 0.8180977557926039
- 0.01109870254488479
- 0.9295340611245301
- -0.4471511869338353
- 0.2186642118804684
- 0.3410503815535691
- 0.2961312366333129
- -0.143295880948191
- 0.6570058907728265
- 0.3374478790259653
- 0.7164972147498678
- 0.4728493928151949
- 0.6309390863530263
- 0.9192287990009655
- 0.5236244132628847
- -0.01669515537818698
- 0.7359536567719464
- 0.7633933826108308
- 0.1505084066165529
- 0.03028416277848445
- 1.085764033307612
- -0.5202265832878327
- 0.7875814498506806
- 0.3028976076028166
- 0.3041742281687709
- 0.6305983965683244
- 0.3863647299097199
- 0.6091800798116837
- 0.2766290594885096
- -0.04164046469769212
- 1.095085939499609
- 0.7520161873439619
- 0.6899692417334078
- 0.722569043292997
- 0.1692090038495222
- 1.082199154298006
- 1.581671334352642
- 0.689404983899905
- 0.6840779222017123
- 0.8436653279709823
- 0.2662908234016441
- 0.981892759284849
- 1.134640943038094
- -0.2345715436513772
- 0.6178212925489196
- 0.4036932487417162
- 0.7952702641381866
- 0.5639573896008447
- 0.5993645140406432
- 0.7141580513604615
- 1.014012316351468
- -0.08744981314008972
- 1.063873115437658
- 0.1099034874188993
- 0.9950519710874927
- 0.1534889007169
- 0.05631190168031441
- 0.1748263357959901
- 0.165560369417498
- 0.4633308759715956
- 1.188905400442834
- 0.7731024403484956
- 0.8423415798127308
- 0.9718508042477025
- 0.2297467466333339
- -0.01320786123883487
- 0.5873563449277251
- 0.5910935104098086
- 0.3635749528124803
- 0.3343544719801193
- 1.18648459924689
- 0.4451694598362241
- 0.1324333660623244
- 1.084951896740999
- 0.3960438506447841
- 0.1749869325737155
- 0.02208594803615767
- 0.09245561966466478
- 1.122532226331501
- 0.4393539525729408
- 0.4115588600754834
- 0.2702758540323703
- 1.011999371548518
- 0.4948376043376667
- 0.07072665059510284
- 0.3109519530391471
- 0.08833859645953668
- 1.42027802339303
- 0.9341542146532245
- 0.4553619567468035
- -0.1411301391868214
- 1.056999637245755
- 0.2473749868663636
- -0.1674778939937979
- 0.4949894843141263
- 0.3037014956998224
- 1.043405348612228
- -0.02690205634125676
- -0.4006218991582415
- 0.7880313750703598
- 0.8392053130898005
- 0.8938116092151039
- 0.4481197017943047
- 1.044980745627303
- 0.0633474328942642
- 0.3676187329050571
- 0.8260672972308953
- 0.09198051118011895
- -0.4135806176956385
- 0.3550021274498011
- 0.9113941029960042
- 0.1252852590239979
- 0.6630493499094094
- 0.3076774479505871
- 0.2015842344325611
- -0.346834457601448
- 0.8287973613110869
- 0.2967238340679168
- 1.249776900632627
- 0.8378302025923385
- 0.2601815719430856
- 0.2421592762135072
- -0.2792952167765571
- 1.016400334668337
- 0.0916798184791715
- 0.4392572064535232
- 0.4227332600248574
- -0.1001271299425782
- -0.001465314706970619
- 0.2560201957554942
- 0.3296530897657324
- 0.1565518292519268
- 1.261770984934702
- 0.3885726181860199
- -0.1954207667055181
- -0.2052101948457193
- 1.144868702233546
- 1.298048107673848
- 0.7249741552686874
- -0.08176434161962366
- 1.176339530411192
- 0.6407595791199964
- 0.8844590668365837
- 0.6642328057538459
- 0.848163608448612
- 0.6932933316219306
- 0.7959734189807569
- -0.1667762824316838
- 1.286512244363518
- 0.6279406083841168
- 0.8883628309026455
- 0.9414864655393888
- 0.2784164795536057
- 0.7809719251837841
- 0.3649021998185719
- 0.1617608439534715
- -0.1337007970435923
- 0.05357396878826291
- -0.4123475197060653
- 0.6793419169334679
- 0.0531435473951218
- 0.08546646719549002
- 0.8467171554056512
- 0.2006091551971668
- 0.02207625831547735
- -0.2065546538260196
- -0.1500903968350547
- -0.1780567295704319
- 0.1747860566134954
- 0.02125819010347606
- 0.2164826363626913
- 0.1443591827454877
- 0.9803964077859239
- -1.780599153696266
- 0.2055912305732803
- 0.6887745530042322
- -0.01050806541979735
- -0.2426710690444304
- 0.1410483568277712
- -0.2006929997681248
- 0.8833631850914567
- 0.162520794689835
- 0.5527779486354782
- -0.3978712960120283
- 0.3437758311462648
- -0.007205974613345725
- 0.1841357965531394
- 0.09152585081054528
- 1.286508701564548
- 0.3655186020172489
- 0.316716706042257
- -0.3127458919964299
- -0.2094498284541832
- 0.7904908777949718
- -0.01086593359251741
- 0.8864233108894075
- 0.4630987816902309
- 0.3434295920993696
- -0.2792796618186488
- -0.2016090751399555
- 0.4244685847407725
- 1.262064526376716
- -0.08544915908117247
- 0.07717200318988543
- -0.2904135750963075
- 0.1095873134471235
- 0.8385397295204448
- 0.318490257369696
- 1.235507037818786
- 1.259099473202747
- 0.3947007258433206
- -0.008180057120502274
- -0.0361143889651698
- 0.4164480523231656
- -0.02334847607833782
- 0.06517205255138779
- 0.1618198171183014
- -0.2659533632859265
- -0.01562677004495009
- -0.1206358109498548
- 1.002757776307379
- 0.4986699392847478
- -0.1371903112173145
- -0.00344358633489329
- -0.07996003153263954
- -0.3379485137288289
- -0.03806474899354377
- 0.2683029250821991
- 0.4100228415034203
- -0.5108165651107379
- 1.184539416771237
- 0.1978249632565801
- -0.09630232711143173
- 0.5430847989065629
- 0.4074670926797942
- 0.4631484926382279
- 0.1088129743911087
- 0.6248848760480203
- 1.335482560719826
- 0.5155308620325403
- 0.06752770884254551
- -0.1248334783810167
- 0.3963970410539291
- -0.04969096370578793
- -0.1216187484590646
- 0.8689318195651347
- 0.08578933212809549
- 0.08798208804502958
- 0.1239523977696128
- 0.7575757543842648
- -0.5595989732992216
- 0.0622867847444411
- -0.2926542381256442
- 0.1580875827841728
- -0.425556755299803
- 1.289880604134823
- 0.3535913221615343
- -0.09873744696346339
- 0.5035922557411745
- -0.3769750284854071
- -0.2740109377625299
- 0.08237750806349588
- 0.2263722622510267
- -0.2518950618988852
- 0.6067018699476547
- -0.08611878074779186
- 0.9899446712432615
- 0.56646645492197
- 0.1011353098063996
- 0.6347240555798442
- -0.195088801537368
- -0.1654943782773581
- 0.9426980842944602
- 0.5010721927420557
- -0.02065723337935632
- -0.1873567752539188
- 0.4389198390611936
- -0.5307174645776235
- 0.5103471895505917
- -0.5719078828410628
- 0.2149994092751085
- 0.06942256938950482
- -0.09480109603957031
- 0.7856110736017079
- 0.1262729905621497
- -0.1242442642087571
- 0.7375115728397422
- 0.7289571746152353
- -0.06700990897760298
- 0.5820134850756077
- 0.192612145157865
- 0.4557109964282625
- 1.51341697909097
- 0.7253998697830548
- 0.1460115103717501
- 0.5642719127158798
- 0.08625007759573282
- 0.8566197096352928
- 0.8364491248658364
- -0.3513666162487823
- 0.5432105555615571
- -0.4289085218375293
- 0.08484774382517647
- 0.1045245386515451
- 0.1566853648593213
- 0.2079149196894243
- 0.4077901486435228
- 0.006353698137078662
- 1.168997355279365
- 0.1597654442842663
- 1.237495342298039
- -0.1510923183128803
- -0.3458940525314884
- -0.07979655864943636
- -0.01560096750891377
- 0.3022630572884595
- 0.6470884583341112
- 0.5607465349171387
- 0.5874337534730686
- 0.5187410585951379
- 0.09923649517267127
- -0.3903120574808259
- -0.2248925641470509
- 0.5022861897824493
- 0.4374504749438747
- 0.3313371562970333
- 0.7814655560905704
- 0.01544256774635527
- -0.1346611555543178
- 0.9649205799373766
- -0.07399090242506197
- 0.00216705002061529
- 0.1458209566043037
- 0.05173860838852241
- 0.8507228862081294
- 0.3320570498962878
- 0.1655384932336358
- -0.02728734826639537
- 0.691336705496105
- 0.3150476389121989
- -0.03357036370806174
- 0.1898216245312712
- -0.1342540497391477
- 0.7772548085734329
- 0.03422543205667956
- -0.05226192976806608
- -0.1849123430625171
- 0.3275105501377845
- 0.04307605486698986
- -0.131123603083785
- 0.07487897523238661
- 0.1296086875090163
- 0.2501117652645889
- -0.2469752436259501
- -0.3544171354949975
- 0.08169347749847211
- 0.5339569458487908
- -0.09703519674586708
- 0.7488798079926938
- 0.08679629241041764
- -0.07072096977100872
- -0.2971862572087856
- 0.1263912615773313
- -0.05568275635783676
- -0.3822170484681757
- 0.6091905020006767
- 0.1930470707969421
- 0.08467963438116037
- 0.05249402872623965
- 0.2494332525911941
- -0.3320851228066722
- -0.2403789133443307
- 0.003345438942484604
- 0.3176445946245712
- 1.208968052226298
- 0.1203616024566635
- -0.1936304993502403
- 0.2018677424059998
- -0.3857096249615873
- 0.4468458397728436
- -0.2453648163093229
- -0.4256714755667666
- 0.1389267737056973
- -0.01545153071922624
- -0.1413233554768697
- 0.147789392764825
- 0.1156480357397888
- 0.0266055205360948
- 0.6561921889029468
- 0.7010147506182437
- -0.2516907836458909
- 0.05665772882715631
- 0.7190474056023438
- -0.403927684259865
- 0.6010008006167838
- -0.1350583498082975
- 0.4163660158163784
- 0.5782030959359387
- 0.3523975447901436
- -0.347734778161943
- 0.5127491719291808
- -0.3351261666665789
- 0.250711139193513
- 0.04821676249691886
- 0.9861395396684846
- 0.2187220948755276
- 0.3511444826916622
- 0.4410497755064916
- 0.4556123632934783
- 0.1785487993615588
- 0.2588746056146861
- 0.2492336745272817
- -0.1150533905185065
- -0.4450561816044189
- -0.06993355636454991
- 0.09253844510767809
- -0.1000610640420145
- -0.0698313843763893
- 0.937320563935966
- -0.0467781576047443
- -0.1681224604784059
- -0.6348904503155944
- -0.3255593080943681
- -0.4085209807394772
- -0.1973597162255788
- -0.1207550566380952
- 0.01052399285950291
- -0.1848780649545811
- 0.3931454951158443
- 1.708587401263964
- 0.1815742073568385
- 0.3432258558580351
- -0.3235036466031508
- 0.1002580442394274
- -0.1656183374822657
- -0.5108101149367126
- 0.7029226243217359
- -0.1502954479250325
- 0.05155446529395855
- -0.3022605283953436
- 0.5006594548808039
- -0.1540169005448221
- -0.0808246526473457
- -0.06080349728458864
- 1.237949063220778
- 0.457988933458353
- -0.1983797881327917
- -0.1453660564807468
- -0.3645458471204732
- 0.6623087958585292
- -0.5191638331056148
- 0.730676729677982
- 0.454354417807533
- 0.244905553179521
- -0.4545438372434316
- -0.1777129740215161
- -0.09666991424093212
- 0.8612857352244105
- -0.2867503905402772
- 0.01147565153030176
- -0.3327065762902315
- -0.04614795914575914
- 0.1769359982094564
- -0.07447234559883557
- 0.6946784329695896
- 0.8512323210306233
- 0.1273929508353219
- -0.03714283970900223
- -0.1163562140248569
- 0.07905646190407437
- -0.2586250581226313
- 0.3106167704848445
- -0.1873673582250238
- -0.5676658815811136
- -0.3809431196943583
- 0.06176087555426465
- 0.6575358337549088
- -0.006769186530244102
- -0.1203960737346448
- -0.1094544844648559
- 0.1531586841524122
- -0.3214904782015948
- -0.2921953670052535
- 0.326382780315558
- 0.2417348463238819
- -0.5516588351271658
- 1.066164073381822
- 0.14324349480137
- -0.2733021473763657
- 0.206060754119072
- -0.02257933747166856
- 0.2768576353874935
- -0.2579005608332602
- 0.1801217548083397
- 1.084353873711691
- 0.3582093678938069
- -0.2916869832915906
- -0.3537129759545287
- -0.09869695728672255
- -0.1342763217983003
- -0.1435248816361132
- 0.538588215431827
- -0.1648167859173915
- -0.06048176695018438
- 0.01708217866334022
- 0.5826225897182519
- -0.8955426379811293
- -0.2145654505127193
- -0.5702901567777114
- 0.06182340425302407
- -0.4727413815038695
- 0.8668513674103833
- -0.2782503430951879
- -0.1368352825144238
- 0.2666864101935165
- -0.3559992263173706
- -0.5413058149479931
- -0.1907750299241658
- 0.09113609665269655
- -0.3366637410284195
- 0.1974660169012988
- -0.310940985712738
- 0.7591977595514805
- 0.6462592979786056
- -0.1249380157468614
- 0.1349792499000788
- -0.40097352887511
- -0.2663907703264866
- 0.6431491233037089
- 0.5477259895917688
- -0.1387607052964635
- -0.2325564654979926
- -0.01989557145425267
- -0.5983963836613112
- 0.27513653485933
- -0.8452115138518678
- 0.05263917292841345
- -0.1531721592418351
- -0.2878930384944877
- 0.4625364395796986
- 0.02948229076842242
- -0.1863083386357931
- 0.5301844345548528
- 0.4299777175923086
- -0.357440209921069
- 0.4446768916936731
- 0.2061364228902275
- -0.008035266959642419
- 1.00567185628664
- 0.6234505133315437
- -0.1063755889918123
- 0.213775422530152
- 0.1716216539220448
- 0.5969951111180575
- 0.3515302459721952
- -0.4956136864952044
- 0.04742685940225402
- -0.7257486741103216
- -0.2310899485637471
- -0.1499868791407927
- -0.2112420300445047
- -0.00566803311686644
- 0.1889455471317475
- 0.02645800593250528
- 0.4402766676397445
- 0.2016486637184166
- 1.098692300417186
- -0.3895102758514091
- -0.5062551631617818
- -0.09603580353709633
- 0.148616169977114
- 0.100593758335289
- 0.1763413543551331
- 0.3274952942433564
- 0.8240464416796819
- 0.3176467522397424
- -0.03187377697036982
- -0.623889657664299
- -0.4860291478329514
- 0.5281204436024102
- 0.06702912108261062
- 0.2380243775316523
- 0.5437146177333005
- -0.04966703248674136
- -0.1810109555153837
- 0.5573015738350131
- -0.4083930320187065
- -0.04320482925074265
- 0.1645640721387698
- 0.06119533902414419
- 0.7425524922816565
- 0.1299360824582844
- -0.00884558853432627
- -0.1015165767888688
- 0.6068938884710866
- -0.09923176919218805
- -0.09297497927202424
- 0.03586137208023404
- -0.2786570728969295
- 0.6649177733162734
- -0.3535585321565478
- -0.3390062989598818
- -0.2086173775975975
- -0.09920688041443682
- -0.02341421167161965
- -0.1471803450154052
- -0.3161453029449265
- 0.02391801391446054
- -0.04373650519867519
- -0.3397983188119051
- -0.3666108066854937
- -0.2162670349776072
- 0.2132530233673774
- -0.5116313544736404
- 0.5354757508904081
- -0.2877069810675497
- -0.1315602000375319
- -0.5317429707262271
- 0.4238105116584094
- -0.2146127374578656
- -0.2904641996440634
- 0.6841309250228275
- -0.1734036669822675
- 0.005484918036074342
- -0.3094351754069787
- 0.1344267232447092
- -0.6602876216385007
- -0.1758653406754312
- -0.3571123654793031
- 0.1814137431085418
- 0.9650432304737308
- -0.2398079143340615
- -0.1022114709403531
- 0.03833987493886366
- -0.3376619943855572
- 0.1669260746161754
- -0.3955724827984012
- -0.7739629842886803
- -0.0266264690360493
- -0.06371473601428168
- -0.3384160982798863
- -0.05691570711822313
- 0.07058341334237343
- -0.01760983935993179
- 0.2081866155072211
- 0.2984905798906045
- -0.2593394298702862
- 0.01981180292951551
- 0.4216274320393357
- 0.3486590169606297
- -0.07631088265866229
- -0.2152207410893138
- 0.1740728055653103
- 0.351290202185461
- 0.04066787938431084
- -0.7437385732488911
- 0.6547699883537691
- -0.8451054495912956
- 0.2292264008553798
- -0.0910354805579545
- 1.087828336259904
- -0.0444661460746549
- -0.1193586278922212
- 0.00836495372866819
- 0.4149317943238018
- -0.1581694414855725
- 0.08022494337025025
- 0.3714328091574364
- -0.2005283438516713
- -0.542568868853561
- -0.6382264845260477
- 0.2456136959769961
- -0.1647019171280566
- -0.1592900284421765
- 0.9506598247249513
- -0.1207854405852313
- -0.2320709254975472
- -0.6554658409277617
- -0.588265612204362
- -0.5559580747465549
- -0.4149467836913759
- -0.1721699893401752
- -0.09271062009813449
- -0.3065949565790526
- 0.3610463992147586
- -1.78045410986781
- -0.3813604075130993
- 0.2611315918154911
- -0.207841246725757
- 0.3654741734387875
- -0.3644560512267753
- -0.6258362695359259
- -0.0945642246204438
- -0.3941104951709534
- -0.06527453859664278
- -0.3584363686709794
- 0.4315938791984615
- -0.1953073467988072
- -0.2190909953692586
- -0.115021973890395
- 0.5799855764499777
- 0.4499280518089379
- -0.5754623080981474
- 0.531975657300825
- -0.4917340256474008
- 0.5072275379282593
- -0.7153225605620414
- 0.4846294110052394
- 0.5671459824889488
- 0.03992505321172374
- -0.6354848713516034
- -0.1867426422707893
- -0.4303902770886434
- 0.05275823539234827
- -0.4461769419672343
- -0.1229379590513772
- -0.4236142668132394
- 0.01106239915900415
- -0.02154850438347221
- -0.03911587016610428
- 0.9569181342427248
- -0.1128324858156322
- -0.1695409319828666
- -0.05347345920787545
- -0.1795049898251221
- 0.3169830183710285
- -0.3858293237770161
- 0.2037783992187152
- -0.2794130633306701
- -0.6069808533956208
- -0.5405563985527269
- -0.04436903747447773
- -0.05993332426826255
- -0.04974037829521032
- -0.1947166630766153
- -0.2516635983236469
- 0.3346425156244562
- -0.3918183728316629
- -0.4036485461565948
- 0.105743687571403
- -0.07132399658671379
- -0.5961395921676819
- 0.4239921022177991
- 0.05750311417620047
- -0.5471088188113188
- 0.1308358818651182
- -0.3976010903399521
- 0.1146153207182655
- -0.4476997987535604
- 0.01426975284128053
- 1.003570984477288
- 0.1452193440987051
- -0.4920617589968798
- -0.5690524190500713
- -0.2134868635891582
- -0.206170501706324
- -0.04551872261921921
- 0.8430678829372334
- -0.3573183298914445
- -0.05962991053493866
- -0.1001963259200308
- 0.2847204138826752
- -1.067253762044989
- -0.4326873724552786
- -0.7130954442931835
- -0.2365857079833269
- -0.5591639722162693
- 1.026305220224091
- -0.5373489300732801
- -0.1441161885568221
- 0.3954713930918267
- -0.2624003777474603
- -0.6800973467876378
- -0.3813540502920702
- 0.02821904743041741
- -0.3865876884501602
- -0.08912517604637459
- -0.4377488653601013
- 0.7829160956965705
- 0.5113482797258616
- -0.285247669325678
- -0.04442222555388487
- -0.5576208874960122
- -0.3505112609552292
- 0.1994045086736325
- 0.07125286146978603
- -0.2208518845142651
- -0.3202505459560078
- -0.1275974934391475
- -0.5368283548484399
- -0.1480910631784682
- -0.975609212789403
- 0.01524830790131133
- -0.3797981234106209
- -0.5498579688739406
- 0.5070616356581784
- -0.001014036535875534
- -0.2136852815281384
- 0.5351705137754126
- 0.08279981590377991
- -0.4575661231955304
- 0.5586819570966582
- 0.1739043109215139
- -0.1407498560001399
- 0.04272868334967283
- 0.2589469168022305
- -0.138637126227741
- 0.3913490250444416
- 0.06068764895200751
- 0.2879950589451611
- -0.1776425990110019
- -0.5470553498576566
- -0.03406831478065626
- -0.8856640480589015
- -0.3461303344982883
- -0.4023461757591711
- -0.5967203343406117
- -0.04762961620743728
- 0.1634154696283311
- 0.05156478889768506
- 0.374891437163266
- 0.2299621020330013
- 1.01764078070525
- -0.5542537884397342
- -0.7868807188082098
- -0.1262971870208869
- 0.05216108980434844
- -0.0722023109936355
- 0.2268641079788984
- 0.126409343375917
- 0.3224594870190853
- 0.5492181841314215
- -0.1329315953862936
- -0.7962834558222827
- -0.6022961242698679
- 0.4057523933407385
- -0.1588419956916801
- -0.1271202814589718
- 0.580341660931135
- -0.1631469874510582
- -0.2844734846955352
- 0.3520853860280144
- -0.4708253576023849
- -0.1477759737373208
- 0.2000449434284807
- 0.02390515810455116
- 0.8398425001088277
- -0.1637045561289333
- -0.05200944806289531
- -0.14638327980134
- 0.3766178616028983
- -0.5126500931342141
- -0.2669373765010273
- 0.02493733031875291
- -0.2934717180120997
- 0.824756983242672
- -0.5509116165875499
- -0.3916611609328474
- -0.3230987657043287
- -0.2514784111222529
- -0.1763128799012259
- -0.1933217809645003
- -0.37408932417309
- -0.1586106281388953
- 0.133115414169056
- -0.38928854969928
- -0.3592629507256938
- -0.3747091378581611
- 0.004420574358069006
- -0.6735642918324432
- 0.4881412103038595
- -0.06094400134750316
- -0.1633112102906608
- -0.734951957008667
- 0.306838462713064
- -0.2605132937858697
- -0.3404126612988638
- 0.3516440964860457
- -0.4766602216916284
- -0.05426675370681971
- -0.4342439540358475
- 0.0905079479202041
- -0.752640192074215
- -0.2411232653901751
- -0.5183463379948153
- 0.2126155799223657
- 0.948355905720532
- -0.251404012937978
- -0.01864565836884751
- -0.152745167675961
- -0.3721405280381076
- 0.007573265391428359
- -0.6043799101486504
- -0.8691910425416818
- -0.165923299089091
- -0.1757896034347677
- -0.3015416522430929
- -0.1333719889512778
- 0.04745289842002288
- -0.222624961467681
- -0.1631402378169525
- 0.0739691720732934
- -0.1689965018755382
- 0.005539011694333889
- 0.6129557359718374
- -0.4440599719271117
- -0.3418145940577555
- -0.293785222543304
- 0.6078366804029476
- 0.1906107547366269
- 0.137547076884127
- -0.943828539188439
- 0.7542068635643424
- -1.015740738824357
- -0.2226812806909455
- 0.09622791925686651
- 0.6386974647154608
- -0.1553697927018379
- -0.2751948666931138
- -0.1178172406670678
- 0.1506741517475596
- -0.2192374339679856
- 0.0135607250263139
- -0.004752347692954299
- 0.005054603630500858
- -0.4789227097538492
- -0.3271859252645017
- -0.1580288546184008
- -0.08159157907690892
- -0.2166292514303432
- 0.5961321612150892
- 0.3707747287391505
- -0.2595670498573999
- -0.5778442850297116
- -0.6142482455949375
- -0.7786208651206313
- -0.5311628869128089
- -0.2070242437373837
- 0.2423429217005519
- -0.09245807969026332
- 0.02615242705254926
- 1.942214456604149
- 0.07208652198382035
- 0.1504526940669746
- -0.05671761665546045
- -0.06677154272410081
- -0.5413677077846294
- -0.6400015435233035
- -0.7474244708216383
- -0.5783654785183465
- 0.08554097884892409
- -0.3741144811529576
- 0.2892656903887446
- -0.1525561886731615
- -0.3020201241191387
- -0.1405210702236058
- -0.2410430005772214
- -0.124156588480938
- -0.4829678766533977
- 0.7552798920589129
- -0.5025719260091526
- 0.04839544960622997
- -0.7348360949421585
- 0.4634060934266534
- 0.1885051703879014
- -0.3369733760555384
- -0.6455485059546264
- -0.1281979342578744
- -0.4972877106215881
- -0.2173002860186208
- -0.4275808205441188
- -0.08610192215690848
- -0.4741005227561371
- 0.05390825452802709
- 0.02131214188614609
- -0.03694598086610448
- 0.4851014317380515
- -0.3749988873268422
- -0.2153080505518481
- 0.005454571033644709
- -0.06216789174860946
- -0.05298547864825581
- -0.3776317477238814
- -0.2033939365053905
- -0.2729618944782381
- -0.617892763468474
- -0.5639878821042957
- -0.300527489898864
- -0.6502440469005009
- -0.1661282163318294
- -0.1854846483129881
- -0.006825468443105815
- -0.1454399028385248
- -0.3735116269659869
- -0.5043072482481197
- -0.09373620565476463
- -0.3468495424275193
- -0.4970941831883467
- -0.1946564746342996
- -0.0128130086532128
- -0.5956489362061527
- 0.2880632110527631
- -0.339743804629175
- 0.2302477552400708
- -0.5155223897531509
- 0.3230057499453503
- 0.2443372096977281
- 0.1857369124026829
- -0.5216692991239195
- -0.5302076887443022
- -0.3336553073704617
- -0.1643661678253931
- 0.03181972875602657
- 0.5721384201397109
- -0.4072878610131206
- -0.06375422981163069
- -0.0662786403733346
- 0.3134737792595582
- -1.084549023715948
- -0.5955791155606697
- -0.8054529387630414
- -0.1051827144574285
- -0.6791187379527408
- 0.6462816413821661
- -0.5280350810192099
- -0.1648132542036891
- 0.526712757951232
- -0.09628546759534155
- -0.788958909796334
- -0.4110895253730163
- 0.02938766500826371
- -0.3816012990976516
- -0.2855459266116003
- -0.3498999592906448
- 0.7197165137063136
- 0.525578745117918
- -0.4399810046534121
- -0.1176780637657514
- -0.6574389741286525
- -0.4059997477136861
- -0.02724444073919859
- -0.2410073835946322
- -0.2825317206242124
- -0.2876586024759145
- -0.1298022304206394
- -0.2049024513723418
- -0.8038773122221586
- -0.9975979347616613
- -0.03281499261344051
- -0.1940293767501099
- -0.7860682768196964
- 0.4543715285779033
- -0.07209027658748152
- -0.1446449097416507
- -0.1868152497898727
- -0.5881902819879754
- -0.5321495288436316
- 0.6425934220835628
- 0.05838196677647711
- -0.06241466981931418
- -0.2258698606250561
- 0.1637755188302492
- -0.1268876669791284
- 0.06679710616576874
- -0.1745458432677706
- -0.4748157857742784
- -0.3874042266589584
- -0.4659903196160114
- 0.172659502462631
- -0.9203095010657294
- -0.4016074524432053
- -0.2846290115047411
- -0.688387086349787
- 0.09400168903740208
- 0.482718361588352
- 0.1907900932278317
- 0.6582303876744932
- 0.367157062330624
- 0.2690321364338947
- -0.5779947927492164
- -0.7309560554516883
- -0.128657432304649
- -0.09187162706370723
- -0.1882842217449678
- 0.40874401973777
- -0.03130755302113058
- -0.3412385797966293
- 0.234304443341925
- -0.2454741056646836
- -0.8174339501665628
- -0.4409480491605677
- -0.003423790669959458
- 0.03471918611582803
- -0.1751602049742589
- -0.0962699260609152
- -0.3575486518148243
- -0.2997772098928483
- 0.5528427675133079
- -0.4121011613286376
- 0.04238504407094401
- 0.2405879512685
- -0.1012576708106302
- 0.2279585778625073
- -0.2863998298406531
- -0.05219271166546807
- -0.305340545950068
- -0.1902978854849447
- -0.523803810243433
- -0.3461196904921145
- 0.05097977700431616
- -0.3051033284103351
- 0.1209534532016621
- -0.3118662592391754
- -0.2471677289165367
- -0.3125483853830653
- -0.3104062832576036
- -0.4092539943953493
- -0.241651308123654
- -0.379341148361141
- -0.2501425531983235
- -0.2518264578417332
- -0.3966071359905799
- -0.3240074369953281
- -0.5662052753132578
- -0.2093338097701624
- -0.3654291491401669
- 0.618226872646975
- 0.01197486512055113
- -0.3029674445530482
- -0.6831754900066797
- -0.2282876800713723
- -0.1867473527777132
- -0.1807807287112149
- 0.01182529324308042
- -0.5783718429461576
- -0.05890433736285863
- -0.4596359838036555
- 0.06885394425402475
- -0.6632254849218142
- -0.1119292966104332
- -0.3877424738160345
- 0.2503909100523899
- 0.1635842514715485
- -0.3359498325708253
- -0.1415028506256285
- -0.283024730305682
- -0.3154435107845465
- 0.1277001905978781
- -0.6027792371346498
- -0.8613851761163197
- -0.1716816907748511
- -0.02833239581533218
- 0.02422305156303762
- -0.228209148920771
- -0.07642839357270599
- -0.3370520799134479
- -0.5885763840417114
- 0.1216933565689515
- -0.08781274217183209
- 0.0678691506744504
- 0.8424386819484797
- 0.1373254746392774
- -0.01848687134635017
- -0.2380789556814966
- 0.3417536574220434
- 0.4341107023035369
- 0.3841811126078573
- -0.8935118834612313
- 0.01571764673947633
- -1.042059171744363
- -0.8365385347930292
- 0.3401309333656257
- -0.2915878882651581
- 0.1051927749202422
- -0.2901577020926721
- 0.0618613740823458
- 0.1533367066468448
- -0.2252632609392385
- -0.0003889279360040632
- -0.574137609203859
- 0.1966132976521402
- -0.4753077034071311
- -0.3572521744406706
- -0.7600784837680594
- 0.1047355703523071
- -0.2638850591568736
- 0.4206406658170802
- 0.7805677897879814
- -0.3590121499116142
- -0.6126076017729987
- -0.3302466011684718
- -0.8327453653806592
- -0.2046762646182836
- -0.2275626429313998
- 0.2320441691743063
- 0.1401799332325747
- -0.5970465754508761
- -1.780599153696266
- 0.07756987606041904
- -0.3081400852234309
- -0.4248968471027421
- -0.2693592531484564
- -0.5683078211876698
- -0.5945883095431329
- -0.8705911103661095
- -0.5075128735422443
- 0.4214597634040959
- -0.2486203285499218
- 0.1125025700369858
- 0.225057411613186
- -0.1430888696058143
- -0.1429968851306541
- -0.5604979110577604
- -0.5351480260750218
- 0.004678630466235922
- 0.4320858695144522
- -0.5161319662964049
- -0.3630488095515725
- -0.4527927889180065
- 0.2031393281035178
- -0.1607454270140085
- -0.4966602900840969
- -0.6582776894049744
- -0.04318015066022519
- -0.3635098083101613
- -0.471579012273411
- -0.1123145540876857
- 0.05589509485996638
- -0.4836089243064695
- -0.06424757629741631
- 0.3175334511103713
- 0.06938305935798574
- -0.3293119100959557
- -0.6367383000612401
- -0.2040734804354499
- 0.04266999162404084
- -0.04060325871850645
- -0.3757511228832247
- -0.3815103374201938
- 0.05287483712614335
- -0.09858223122449138
- -0.5837487434671705
- -0.4299966143237329
- -0.2148995151424994
- -0.8285804665265564
- -0.4165323504967136
- -0.1857809070418956
- 0.3446712216799147
- -0.4880118815776988
- -0.1894365459451416
- -0.4380478611667041
- -0.0763717173429115
- -0.4952954920935713
- -0.5693328535465947
- -0.4754685200172154
- -0.1007641264668812
- -0.3800576287270971
- 0.284635942408415
- -0.2709478490104187
- 0.2334849156425411
- -0.5605803775049333
- 0.3945194182158658
- -0.3357561736624433
- 0.2253190472079402
- -0.479571204852919
- -0.5695138081165433
- -0.3906093647055345
- -0.1365679338739176
- 0.05764066780159962
- 0.08603301501314856
- -0.2196888087093433
- -0.1234972996007928
- -0.0986833872951893
- 0.3237792379812792
- -0.8613525024878457
- -0.5615509348870983
- -0.7592446921472276
- 0.1699980362800157
- -0.4653118715861744
- -0.2158006747055174
- -0.2500944346872818
- -0.1287854137025125
- 0.128934571740776
- -0.003526488785242154
- -0.8399276712505523
- -0.330399341517634
- -0.01560115462140701
- -0.352187401170877
- -0.2560230975307909
- -0.1958792003549243
- 0.01514683254785584
- 0.1089498658005297
- -0.5585856462889451
- 0.1480583418170258
- -0.6789117454684233
- -0.3929536172126375
- 0.2071827027731075
- -0.3573211252942662
- -0.2629996235435352
- 0.001391320378811444
- -0.1169842512237953
- 0.1198736272528314
- -0.737587748318728
- -0.9270430400979962
- -0.3577244664949029
- 0.1776867345474032
- -0.6732144224554912
- 0.08819573140103359
- -0.06922081909004965
- -0.1024104914371722
- -0.6596795250648703
- -0.8987836492684684
- -0.6217412233252386
- 0.5988427651116034
- 0.1024886468185866
- 0.2814267734258853
- -0.440849302190123
- 0.2833800216072526
- -0.1857008106833104
- -0.4790854306347693
- -0.1410378587265264
- -0.8097925772780029
- -0.4025154663769632
- -0.5350615369579589
- 0.09176713893577661
- -0.7769137755094272
- -0.4436049473708966
- 0.2343623787993738
- -0.5701056042917206
- -0.01064426636932409
- 0.2954508823005327
- 0.2358216485226806
- 0.2181170324298531
- 0.3495023267527235
- -0.2927560280883714
- -0.4162973994033312
- -0.5906676988840915
- -0.1222333382354282
- 0.08664743597606636
- -0.2651065135750781
- 0.08935692622538703
- 0.1381891885489051
- -0.3560236805655786
- -0.3290535692413685
- -0.2352849906006602
- -0.5946768609244922
- -0.06981201403965386
- -0.1493741410658145
- 0.5328681676798306
- -0.1803987177453212
- -0.4656443892726355
- -0.2449153482117758
- -0.2656246175033493
- 0.4126557393360887
- -0.06970205768609888
- 0.1689991496794057
- 0.03521543088269639
- -0.1734343633323954
- -0.2564711009803666
- -0.1574609723597054
- 0.002429636388936149
- -0.3187242454451427
- -0.4410757545849738
- -0.2359101417730298
- -0.3100384590225302
- 0.03471939488113072
- -0.3296317688323425
- -0.5098149823851663
- 0.1115913721329731
- 0.05544012386448133
- -0.2966993802900029
- -0.1209047751876421
- -0.3866592490685754
- -0.1826766095340182
- -0.4171484883108832
- -0.2055397286381209
- -0.7338480244931559
- -0.283080680774467
- -0.2987096942708872
- -0.7017857700949461
- -0.250202168055706
- 0.08381076909182114
- 0.332480902185142
- -0.4351887355398816
- -0.3163994729811774
- -0.4724570727667632
- -0.4884225332146895
- -0.4150732055937091
- 0.07797318041408605
- -0.03151408728005083
- -0.6058452367039552
- -0.07677053496821562
- -0.1392373581209522
- 0.0006927963515423502
- -0.656714391695566
- 0.2670241507563403
- -0.2274640211730099
- 0.1341297488331412
- -0.3458294865065677
- -0.2721745884432445
- -0.1487729025880484
- -0.4218555509077397
- -0.2251641955182626
- 0.458214894576395
- -0.3824456598159615
- -0.6264304719445675
- -0.02818429183189752
- 0.2873914589498447
- -0.2338890229101601
- -0.4467807308459597
- -0.135648058213299
- -0.200936807542687
- -0.7314371257828245
- -0.449482767223645
- -0.1042173793885466
- -0.09641920731737179
- 0.6206538973634722
- -0.4435485103285841
- -0.003479203257694294
- -0.05194601433788879
- -0.1700149283501921
- 0.5020815222136729
- 0.0192417018483452
- -0.6057225242512514
- -0.2621997899297607
- -0.8682309385078543
- -1.043226215785034
- 0.5722085366169893
- -0.4789889334996213
- 0.4311134707884468
- -0.101731891758905
- 0.2487426248174195
- 0.01732784564969043
- -0.3846973076070464
- 0.06265948837716913
- -0.7293727917649786
- 0.3199024793730494
- -0.2831940560390996
- -0.198043463486127
- -0.9064857416764353
- 0.3022793558404221
- -0.3038014268564736
- 0.02765174351442887
- 0.7054582590677552
- -0.4053038671205914
- -0.5922230756584481
- 0.0907887262006568
- -0.7964267323984823
- 0.3489800291146762
- -0.1950297082350069
- -0.1181827315175544
- -0.04118604247545288
- -0.6400703568846832
- 1.590408800181046
- 0.1571280168753901
- -0.4780752919448401
- -0.6494939895635206
- -0.05350493158024193
- -0.329179308140593
- -0.257915126993325
- -0.8452967617689512
- -0.1919436667441916
- 0.08452274833016174
- -0.1506276388393554
- 0.01064368205982586
- 0.378029109083333
- -0.002957610086980191
- -0.1433967042786035
- -0.6681496213324567
- -0.6965558583695808
- 0.07571463971795134
- 0.02660778153957135
- -0.4866147033920999
- -0.4676101780756626
- -0.09402517136169601
- -0.1326465655751625
- -0.2803161262685953
- -0.485866789551306
- -0.6445031845162837
- -0.06321898795230017
- -0.1374206965699841
- -0.4298840398853365
- 0.3437860129195507
- 0.1592555937562658
- -0.2693761470584372
- -0.1425018237827043
- 0.3288224426709815
- 0.0195566626478075
- -0.654391449308484
- -0.6664374747216034
- -0.3510986932119884
- 0.03509224374305035
- -0.147292553679547
- -0.7057787800957498
- -0.4426942656955598
- 0.01710547508556669
- 0.3133941036713175
- -0.06798168256159805
- -0.07650107513124035
- -0.1655639353152909
- -0.9519765174331033
- -0.3779128940251456
- -0.2298855679561967
- 0.2021331965923949
- -0.4780967027784193
- -0.09950319619920876
- -0.4720304411565514
- -0.1112782900500317
- -0.3773567266591552
- -0.5667222274309959
- -0.5896218913169158
- -0.1510458944758229
- -0.04156115793996827
- -0.03681408002395202
- -0.4049332155526779
- -0.02564108070178676
- -0.6269657015590318
- -0.01375084422072832
- -0.7141367265552291
- 0.006402219572510645
- -0.1116813095085798
- -0.6351424844998569
- -0.3215358210264493
- -0.1453723291787659
- 0.05600993134507122
- 0.03509606520352065
- -0.2278840841918018
- -0.09522467680281629
- -0.228585377418122
- 0.08195281332895714
- -0.1842305797350325
- -0.4984737766499143
- -0.4774309346289708
- -0.008274983605111122
- -0.2823742909616017
- -0.5074415497056384
- -0.0601794615320619
- -0.07871156883960556
- -0.00377493693413423
- -0.09820926355559258
- -0.7688777294662257
- -0.1374337098313828
- -0.06543259074014873
- 0.02158491328776586
- 0.1396910922816859
- -0.2860301223920511
- -0.3672166937853523
- -0.2510587610670307
- -0.7060334798031539
- 0.2515814693383551
- -0.6614633043811741
- -0.2949217675439889
- 0.4303324168282956
- -0.3135406019711567
- -0.1993587358280154
- 0.06932898965958072
- 0.02217375067049907
- 0.3213100649691303
- -0.4335256262750316
- -0.4281642139585038
- -0.473963183933536
- 0.2133249927104609
- -0.4004653724469927
- -0.151378714167807
- -0.02945951951758842
- -0.142659286076651
- -0.7121306953654724
- -0.8445663015726538
- -0.2209021606614747
- 0.512200415597961
- 0.13769296313119
- 0.5519345468118018
- -0.5762499488813367
- 0.3555599434085788
- -0.305311940074022
- -0.6351470680682418
- -0.04196554042601083
- -0.8998594993504928
- -0.4535528189901826
- -0.6777603265344038
- -0.2887483673233799
- -0.2831278318562285
- -0.4127703587845231
- 0.4146056042245125
- -0.3064887161727025
- -0.1141271356089437
- -0.07834559455024592
- 0.1277111151789827
- -0.4689873231334128
- 0.2541968472283095
- -0.4181961051962566
- -0.453338303251671
- -0.497127561623368
- -0.1288193178658342
- 0.09946804927215061
- -0.12091369625438
- -0.396217561134134
- 0.3894409469451128
- -0.4567492349068292
- -0.4467548413341039
- -0.2729206784507691
- -0.3992577023411391
- -0.2573050411317117
- -0.2067353367913678
- 0.5553610595412475
- 0.04538662696329159
- -0.3803851835258086
- -0.00259323383371598
- -0.2350047786824387
- -0.1829308873898255
- 0.5419626222596291
- -0.03811420635925365
- -0.185960744657928
- -0.2164678225760939
- -0.4200307266349941
- 0.0002546722747690633
- -0.07481360739756698
- -0.1625080928643031
- -0.4125995043730831
- 0.1502347487002705
- -0.1108577175964447
- 0.03345724174870192
- -0.2647308458052282
- -0.584897453222202
- -0.2650084377370297
- 0.3530167565089282
- -0.1902048302092513
- 0.1541529182310633
- -0.1538034588366328
- -0.08610237613014243
- -0.4160826091813778
- -0.09220729602744239
- -0.8254781753596087
- -0.1683985710011476
- -0.1735331419808584
- -0.7272198112431602
- -0.2717276480951551
- -0.2211317713624017
- 0.05543300345384761
- -0.6889324090807434
- -0.1535171750177869
- -0.1836087058263277
- -0.3632190296038028
- -0.4846933554914004
- 0.2302330350816434
- -0.102657421229265
- -0.5803153691199542
- -0.04487682653247512
- 0.2462586672395643
- -0.01417572099124056
- -0.418053859829126
- 0.2724431659469464
- -0.4492959915335534
- 0.05943425868649164
- -0.5366000624281262
- 0.06590299731818172
- -0.1273034477604761
- -0.3070846767492227
- -0.197093048201637
- 0.7219881824524234
- -0.155631745676243
- -0.04563653298760457
- 0.09480141906801526
- 0.3893130988045581
- -0.4143033631645172
- -0.5812985885040769
- -0.1412033826050553
- -0.1309092407210991
- -0.7567019244018102
- -0.653214702445443
- -0.1231280865165363
- -0.1867860070024334
- 0.4687074101654123
- -0.07346352365363995
- -0.4513008291317256
- 0.1414997796645397
- -0.3930457399982226
- 0.1631704198669574
- -0.4001551301711788
- 0.01042299058816831
- -0.4046580574017991
- -0.2040063920270557
- -1.102677030407465
- 0.3518882150110856
- -0.6382891836101693
- 0.3346394949630933
- 0.3602337672832703
- -0.05594881120170617
- -0.1656607059035895
- -0.5210339696533037
- 0.1185495276223964
- -0.340517133351099
- 0.1902629384864901
- 0.1621509275941509
- -0.71835646970261
- -0.8127341619973234
- 0.4469372558920139
- -0.3512253696851279
- -0.457648781991237
- 0.3527961760445964
- -0.4035043205011868
- -0.1225143340455787
- 0.4983127024531727
- -0.7183171201401464
- 0.1876845817269912
- -0.2093057835543573
- -0.2019724687188628
- -0.1713789561376335
- -0.3952918491817058
- -1.780978883369023
- 0.2054842071086569
- -0.4635030503835605
- -0.2956284372493603
- -0.001774898250552024
- 0.1488280602474648
- 0.1264226549129192
- -0.8286877440999377
- 0.2245515245693221
- -0.3073731151894248
- -0.06460709917175121
- -0.07790419215112504
- 0.007877119553052977
- -0.09092231242175547
- -0.1686780185257491
- -0.765013763816823
- -0.6871377717234923
- -0.006594425772513775
- -0.04806563673352361
- -0.3037413570737171
- -0.4753764674771662
- -0.0379924271185581
- -0.2571618251627662
- -0.2459781214801
- -0.4163424599886744
- -0.4175941733527985
- 0.01312125107172365
- -0.02035363517690484
- -0.02847920176124768
- 0.5206458942302443
- 0.1079314780400711
- 0.0009521103246746602
- -0.1253918872207877
- -0.1693561910156049
- -0.1016467216058956
- -0.8184227805599097
- -0.7299448618632853
- -0.3707293502550358
- 0.001252315368334842
- -0.3326712945128822
- -0.5176513739044207
- -0.4375717545721807
- -0.5399760187668166
- 0.2186112767831467
- 0.5257085521262155
- -0.135808682835768
- 0.0579250191708186
- -0.5360367459179185
- -0.2452683086022597
- -0.2616003825821842
- 0.05008352235535284
- -0.1258846733544287
- -0.1190667804258561
- -0.660169922962523
- -0.1080773298518675
- -0.001930059900269921
- -0.2254690900251465
- -0.5199738071019793
- -0.15368605110091
- 0.382747030021245
- -0.3399709960143961
- -0.05185000718016074
- -0.1809122102596091
- -0.3344644883054311
- -0.1577847536637051
- -0.5534016355907267
- -0.1609953751694373
- 0.4180245105874469
- -0.7122580027821085
- 0.005350136450229161
- -0.2130573081651347
- 0.0547486758571803
- -0.09144499173330059
- -0.5043758693566643
- -0.08137944512578063
- -0.165721680075962
- -0.2147303372558582
- 0.1802639287302827
- -0.2503409246424228
- 0.008387856501332013
- -0.1343322075075337
- -0.1552770470090488
- -0.4236960286618235
- -0.1051338219795501
- -0.07967984352968752
- 0.06485908420979801
- 0.01619844664292754
- -0.6022687374535013
- -0.1064542089149937
- -0.1135033618750938
- 0.3748822295642341
- 0.3055917998483587
- -0.3332077235466904
- -0.5053144394121257
- -0.4181511486753801
- -0.5480040773026975
- -0.1093613562713298
- -0.5535666429787212
- -0.1495924073026777
- 0.3717905496599088
- -0.07874312291855366
- 0.0197351116593076
- -0.1857099985425998
- -0.04408574975722964
- 0.6265704341874341
- 0.0411248751029252
- 0.2177664529664201
- -0.463326466177071
- -0.1155788520119949
- 0.07627480780988947
- -0.1154392196611928
- -0.05354405147501572
- -0.09449540109562496
- -0.5771323721290285
- -0.5184918414810038
- 0.302546362799287
- 0.0418575769084128
- 0.134369023143456
- 0.272872593738047
- -0.451072112669163
- 0.2222601662559372
- -0.3671819292660506
- -0.6668562782762132
- 0.1268313211719089
- -0.8644601868357874
- -0.2605807864844837
- -0.6512543457612744
- -0.2815701835236822
- 0.03980362031234853
- -0.3384463768631267
- 0.1358336920104301
- 0.1764416948239552
- 0.07118155278932202
- -0.2955362599328757
- -0.0620030852375667
- -0.5535991388553626
- 0.2081219248241339
- -0.1849028896935379
- -0.730857270559144
- -0.06876572091017155
- -0.130106666752676
- 0.261837008192287
- -0.1167673382119821
- -0.3435751842616931
- 0.2185022598636893
- -0.2986719176606851
- -0.3476349706604125
- -0.3383069171226881
- -0.4943657876494036
- -0.3014395244202314
- -0.1512277644792329
- 0.2497477773393427
- 0.3684965157080135
- -0.03975557072904728
- 0.1156069179951857
- -0.07180650093159041
- -0.2438028687998155
- 0.4418684913637954
- -0.1536875051000218
- -0.05110101265443797
- 0.04262054514314754
- -0.5450020522064242
- 0.06382102010754576
- -0.2633338422159232
- 0.03428998973366581
- -0.3396396278171734
- 0.2218785662937951
- -0.1406035549058024
- 0.009704001788654788
- -0.2790755487712052
- -0.3025930785630245
- -0.5992507698826174
- 0.3179612276310023
- 0.003149844452743701
- -0.01660386451206627
- -0.03989765752844681
- -0.1471733429454518
- -0.3991178639965604
- -0.2310807981650578
- -0.6165195989948826
- -0.2443863922497242
- 0.1446641504619525
- -0.7581687113193498
- -0.1630934639146746
- -0.1864094203189325
- 0.007390622514341341
- -0.4222623583706733
- 0.06589276325146391
- 0.3931121254033183
- -0.05997993820942499
- -0.6096833499924588
- 0.2736455897344224
- -0.1761486303371735
- -0.5060751065354971
- -0.02909222922175481
- -0.01524255743558093
- -0.1839560200807636
- 0.04091625043667953
- 0.1315026676092598
- -0.4866903458965861
- 0.1711047202539764
- -0.4422489010456397
- 0.001511426167088095
- -0.04639869365802123
- -0.07198601017677353
- 0.01831033130226101
- 0.5726396179628991
- 0.1963252025856242
- 0.09560035596270883
- -0.07479006174482507
- 0.2383236076594711
- -0.6525137457339615
- -0.5733500639054371
- -0.09277279640447748
- 0.2135053197475681
- -0.5839706148374094
- -0.5772042349178457
- -0.02587418833276165
- -0.1758147521967876
- -0.02039002839069973
- -0.4584890671511103
- -0.3727776208085981
- 0.2161430387505507
- -0.33382871875445
- -0.1018758948934526
- -0.5155807499245789
- 0.2230774657853115
- -0.3842771617731814
- 0.2765709669076771
- -1.11437088776058
- 0.1370290419361331
- -0.6907121556971
- -0.04739560124816106
- 0.4945854676725926
- -0.2518511238092139
- -0.2090823881211713
- -0.5826711045003965
- 0.04548258606789699
- -0.1853294453073051
- 0.1542278754398604
- 0.4641990825116425
- -0.3355069922025304
- -0.3325706576622386
- 0.240999893509847
- -0.3739549587971491
- -0.7292391624211603
- -0.1778788290675548
- -0.32985631835857
- 0.1773685507675661
- 0.3143987682501025
- -0.4241186269008492
- -0.1196109874348598
- -0.2703331487635954
- 0.0646029191795594
- -0.09293151587895067
- 0.05867323189292146
- 1.572152959310365
- 0.0270851943823703
- -0.3201605719329901
- 0.03511290922165978
- 0.1842220640356778
- 0.4459288682235256
- 0.2279510038651417
- -0.6208225668217512
- 0.2033200440448049
- -0.4768920295949141
- 0.05635444804434454
- -0.1792207056397316
- -0.05082725323384989
- -0.116466160497955
- -0.1646789310506677
- -0.8546516345710713
- -0.6863333032159274
- 0.1251280715920445
- -0.1954916256772424
- -0.06330408849680744
- -0.3614178746908751
- 0.1110444058475385
- -0.4441635474921972
- 0.0421501215297819
- -0.3563461749842403
- -0.2847085013375505
- -0.01885466908589918
- -0.08714902937426544
- 0.1108528108141068
- 0.1868153364508421
- -0.0782948091852478
- -0.09368056609716874
- -0.06796896435348695
- -0.497680262528085
- -0.1496864352033443
- -0.7899711281536115
- -0.6025616651729295
- -0.3411802195266797
- -0.04670556170928879
- -0.3428166896726749
- -0.2845726199256554
- -0.4125870758047719
- -0.3383725144380084
- 0.04576291584876581
- 0.4867574895058831
- -0.1734111351515317
- 0.4046916923000636
- -0.0692196393810556
- -0.364205893770604
- -0.2551900009272337
- 0.05737247351539661
- 0.08039984007240546
- -0.11299788125515
- -0.4721938914488412
- 0.04841770947422069
- 0.2143597286200945
- 0.1183004551578102
- -0.363460031717068
- -0.1907615130706292
- 0.4028808348822922
- -0.3171712423084697
- 0.1974988994089932
- -0.242326408426382
- 0.06990657685043837
- 0.03283291026075733
- -0.4808273426038372
- -0.353546190225623
- 0.3814243035574654
- -0.6407503423680718
- 0.3096372846159585
- -0.2214550425447073
- -0.02287760645039265
- -0.1304712309055208
- -0.5079350855894919
- -0.09170209542267782
- -0.2564185760653225
- -0.4122184566482636
- 0.05779244757900356
- 0.1355589819676707
- 0.3286801707679867
- -0.2242603117821102
- 0.0335455361107912
- -0.5371454248562983
- 0.1317342409872321
- -0.08379994681574615
- -0.1375314996449098
- 0.1556617156194927
- -0.2608544997717424
- -0.2488335162112193
- -0.1214693826932154
- 0.1554129338795171
- -0.005680118626726197
- -0.1059142855277008
- -0.6238782668523944
- -0.5963151157794544
- -0.2148362270843856
- -0.3258183472222976
- -0.248606488482252
- -0.09849441598768362
- 0.1805113569718476
- -0.04418818805519761
- 0.3737371718874873
- -0.1530315749338608
- -0.2235354786574718
- 0.7630667232166822
- 0.2642022185562009
- 0.3208451718589377
- -0.4680450945273534
- -0.171291712100384
- 0.1519325249856672
- 0.0864344929490222
- -0.1192515192935129
- -0.05985311789830235
- -0.2929187491434199
- -0.3373089593719307
- 0.2738443816818401
- -0.4459312647860724
- 0.1019232205332759
- 0.0505340192312996
- -0.2868115385288292
- -0.1693873008287598
- -0.2983439658193252
- -0.5193256213739745
- 0.2007825339743431
- -0.677732951503412
- -0.09657284972081065
- -0.4774623379542781
- -0.01895688026804819
- 0.1338266916968649
- -0.1412708513186414
- 0.138190548765444
- 0.07912287981106435
- 0.1137545407236712
- -0.2905926167465767
- -0.1433534307405324
- -0.5789718450772364
- 0.06703335477883755
- -0.2909611390633863
- -0.4768384780853501
- 0.3468340324384735
- -0.1242840480300472
- 0.1628599665526195
- -0.2098058380705283
- -0.2650524620418804
- -0.04530575041494886
- 0.0742239161679762
- -0.2315164120681402
- -0.3974653743649324
- -0.3949615742671702
- 0.1431491502245915
- -0.06100188175408954
- 0.254619509251988
- 0.2385636964554492
- -0.0377979983973895
- -0.08510487825699684
- 0.07898195343477653
- -0.3157876622138711
- 0.3101460860926867
- -0.2513762463139826
- 0.02130796450574071
- 0.2262271679854062
- -0.5401435669147285
- -0.3928044928834363
- -0.2627404691172375
- 0.1127320496462008
- -0.3874823969145912
- 0.01510115021532389
- -0.2242313304610447
- -0.03784015856384065
- -0.231376614555029
- -0.08660512547898351
- -0.2163715339732224
- 0.2014987297473436
- 0.00183042504023886
- -0.3018592518870045
- -0.1481235804195503
- -0.1354999653037391
- -0.09485588183453179
- -0.3306772971591763
- -0.1183932030843847
- -0.2962642578543512
- 0.3651718826337273
- -0.3648497928756702
- -0.02235452262494591
- 0.281071647808349
- 0.1376248104624031
- 0.04071968038686895
- -0.0623331878745489
- 0.5235593914018143
- 0.1847146953260254
- -0.5898320982543569
- 0.07259131492753236
- -0.07542503649687438
- -0.3877343858715561
- -0.07180098022627282
- -0.2175881717960334
- -0.261557164031689
- 0.2491196222479528
- 0.04101563216656046
- -0.2394441282095503
- 0.2637079765764338
- -0.491673551927533
- -0.3199563992575
- 0.2237069053073689
- -0.1916615770179255
- 0.03207752718399837
- 0.1150203537322834
- 0.2999929701318548
- 0.1594169188046992
- -0.2518452325433932
- 0.1315469323585451
- -0.5568227828411216
- -0.4552940231107597
- -0.1225571536787343
- 0.3087794611803037
- -0.4073169324749234
- -0.4018687778918577
- 0.1001182006973928
- -0.1233661035052116
- -0.5311694950430884
- -0.06244269889225383
- -0.04191660189537352
- 0.1652929995941863
- -0.2685189742071611
- -0.2022708955035912
- -0.4994199663615731
- 0.2949704313847821
- -0.0413959778685745
- 0.1839277872468872
- -0.8877791188039712
- 0.124646207202205
- -0.5174491059310083
- -0.1741877905242727
- 0.2182184736194161
- -0.1985385581553671
- -0.1495612649704648
- -0.5022711929891177
- -0.03208153325427857
- -0.3229429888774093
- 0.1232233055373354
- 0.2090266598930229
- -0.565694282351267
- 0.004313344182687162
- -0.0508010608429796
- -0.3660963789208949
- -0.7893390105930082
- -0.6141821686914091
- -0.1735863843034059
- 0.153064126764466
- 0.2688441272796904
- 0.01891955490740877
- -0.03993908158052884
- -0.2345909675961855
- 0.0488287063273122
- -0.1771437205453895
- 0.07067450063965428
- -1.781448255057624
- 0.08491388308960003
- -0.03810905788179736
- -0.3085800186030186
- 0.1155403599852064
- 0.3749475045315057
- 0.1361256280495673
- -0.381924303711864
- -0.0602324042427213
- -0.4588384239011747
- 0.2167459982336198
- -0.3119731657244059
- 0.09338490336141297
- -0.00013580052025487
- -0.1582682259768826
- -0.8192320269381829
- -0.5635562527794323
- -0.1163258468853171
- -0.1849412934159787
- 0.2078265387141373
- -0.1693054398482254
- -0.1339753540407564
- -0.5926870633174385
- -0.2068659662318922
- -0.4028693742414952
- -0.1592433573791794
- -0.03298466862338994
- -0.2664711180239981
- -0.6223670831098527
- 0.2539463342474416
- -0.2112463899073392
- -0.06707021797068523
- -0.2540933845523378
- -0.5723527575894582
- -0.2663211757105155
- -0.559775271923221
- -0.1669748156094223
- -0.3391612146520647
- -0.007304739959241142
- -0.3714503942196212
- 0.1978289085127442
- -0.2994606800321042
- 0.07648124144600604
- 0.1120042552350718
- 0.2106307826577676
- 0.001842787583032354
- 0.3002279075694899
- -0.1444902776971541
- -0.5616957465792392
- -0.1711839811946715
- -0.1908787083942699
- -0.01413513841741283
- 0.01441352600904396
- -0.2493234142352183
- 0.07187192025363083
- 0.08250887000827953
- 0.4622517571621938
- -0.3484961403360574
- -0.2500344340875087
- 0.327055980519856
- 0.01861793533271652
- 0.1246782192478675
- -0.3286139189108901
- 0.3619715668980983
- 0.2289805073568801
- -0.7468191925568648
- -0.5389303871852547
- 0.14594117923781
- -0.4542946657875223
- 0.2432635170910493
- -0.2263087899597126
- -0.04143624459168473
- -0.2929049223777545
- -0.4249351946087646
- -0.1945125584822932
- -0.2787407752932843
- -0.3020247629591156
- 0.2550596994518242
- 0.1787026603248639
- 0.07429499669250805
- -0.1636903109796274
- 0.2187793428277464
- -0.6477365560999034
- 0.121753783403594
- -0.1053863531423386
- -0.439961013599136
- 0.07622327403616731
- -0.08556302169099331
- -0.0008746784338009017
- -0.1351544972756517
- 0.1271525507074459
- -0.2176602092416781
- -0.01554345296761483
- -0.5222439855642136
- -0.7316171375860131
- 0.2446548485233575
- -0.1467291582369216
- 0.1175902634457195
- -0.1681546882107498
- -0.04521157099650252
- -0.2043091023341305
- 0.4424845033373849
- -0.02996202084625425
- -0.4227659748562899
- 0.5910684140400475
- 0.1593138334345164
- 0.3361204425311022
- -0.1920805023816655
- 0.09822228634348028
- 0.09002368509893081
- -0.1322447170189405
- -0.2313654657212282
- -0.1137904372765817
- -0.1345582192042777
- -0.5916468699011971
- -0.1974399310317567
- -0.7310498207769246
- 0.0904490285916611
- 0.2617952826851531
- -0.6658800334079958
- -0.2136383312489579
- -0.2474050201719908
- -0.37313985201887
- -0.09261816710249975
- -0.2226843760738902
- -0.3276008787398033
- -0.2650874794759996
- 0.1107475747306679
- 0.2261150250691746
- 0.01410981678350486
- 0.08656220760912722
- -0.223291144823372
- -0.04653183679472674
- -0.0123189017563664
- -0.1241550945158221
- -0.5780305491792225
- -0.2051679551218057
- -0.6380321535686744
- -0.2217327200028662
- 0.1880702651678863
- -0.1374455798500671
- 0.07477579189264887
- -0.230654246917585
- -0.1460761228157335
- -0.351748140673035
- -0.009962655782386361
- -0.4829335787134655
- -0.4047193455733119
- -0.08748337483917695
- -0.03324537104327262
- -0.2107543464561359
- 0.04541561517782763
- -0.1206787589924748
- -0.3716068785062409
- -0.3374418396412748
- 0.1726760188136365
- -0.3308066332358634
- 0.255170315489397
- -0.2759676806557681
- -0.04273612238743313
- 0.1552226463334661
- -0.5278672766348809
- -0.5171652498932222
- -0.259448482300692
- 0.07732678154058592
- -0.5486383408282367
- 0.314303831825362
- -0.2208393588601793
- -0.04410650703985628
- -0.2222334863746301
- -0.4153149275231512
- 0.2285908136142874
- 0.2151545018434103
- 0.08146538307396635
- -0.1900672020132375
- -0.3466077795322671
- 0.03569483143576228
- 0.1384705152199227
- -0.3207737890095315
- -0.1944937775285996
- -0.2662333462037326
- 0.4404826946611061
- 0.08773299284947769
- -0.09194271179202586
- 0.1281029509325907
- -0.01978898548302627
- -0.00775196992546068
- -0.1741854317807355
- 0.3259848025224046
- 0.04401697403542181
- -0.4975007188752522
- 0.1436066122471584
- -0.2219367402569576
- -0.1000778091158833
- -0.1266845224851695
- -0.09121927167550367
- -0.3601844598365169
- 0.2486687523844783
- -0.03584302241113982
- -0.09127580032417015
- -0.02447346217466925
- -0.4224191129196516
- -0.4131361763939417
- 0.203067049236413
- -0.3012140924559434
- -0.01364892432756534
- -0.4814532324701255
- 0.3170718278420939
- 0.1587410603006361
- -0.216424363157273
- -0.06895458529347577
- -0.4016696264415105
- -0.3622807926391333
- -0.162427061007282
- 0.1434223168812234
- -0.3712616885015544
- -0.5024324778723644
- 0.2529794125252718
- -0.1779998772475726
- -0.7279837946956683
- -0.4446830120824465
- -0.1750441732422112
- 0.1146496243364256
- -0.4959298585253443
- -0.163924280908683
- -0.3573746569560586
- 0.3814031678509575
- 0.05951062074438399
- 0.2997662033054271
- -0.3855924523817795
- 0.1029731263097956
- -0.1208204919484131
- 0.08569036493936666
- -0.1509810931506685
- -0.2073591495323373
- -0.2151644795594506
- -0.2827638203076263
- -0.09764470321143262
- -0.6350097962454752
- 0.1677218152331212
- 0.03991765426500021
- -0.3740673754317914
- -0.3755793000001317
- -0.1420218531216212
- -0.3745804350769871
- -0.9402288793052358
- -0.7371490179018136
- -0.199320776234589
- -0.1086466664003375
- 0.2234300207129388
- 0.4520090418359478
- -0.1103738931205903
- -0.2241078313420341
- -0.3088597516010719
- -0.5642512091492026
- -0.4143577903162539
- 1.585769903461108
- -0.0928980419106312
- -0.1639243683643334
- -0.6609187513382873
- -0.03370139779658248
- 0.3998306293641981
- 0.008523386283980328
- -0.3397761104272032
- 0.1596395829533195
- -0.2321779744920058
- 0.3470263743593928
- -0.2987069271702892
- 0.3727308282033386
- -0.1411837021579574
- -0.1765649647109546
- -0.4840684675721143
- -0.5546491976224101
- -0.519672020666552
- -0.07326886758992969
- 0.2264171857621609
- -0.3077200915977026
- -0.5490934046857481
- -0.6020907699945578
- -0.6160437088271168
- -0.2187029258141679
- 0.1405764638862422
- -0.093012829466791
- -0.2969089595390227
- -0.7501222899942074
- 0.2866256906799098
- -0.2387046251713708
- 0.04525727454160814
- -0.2667324397508992
- -0.5717447658970759
- -0.1781952509044608
- -0.5443454325827244
- -0.3391144945543338
- -0.3844961989382008
- 0.01499988326006704
- -0.3258333496747647
- -0.2592405706859131
- -0.3504717802952628
- -0.02668263132768721
- -0.336942418143115
- -0.008899326508741834
- -0.4064724339785245
- -0.12176728147033
- -0.6585179601696123
- -0.4894753878178747
- -0.2442924820600981
- -0.3920391396714519
- -0.5221616690504185
- 0.08143575493923301
- -0.4243781097009219
- -0.0783176392163677
- -0.2195665841694698
- 0.1850063913193356
- -0.7196111874495446
- -0.3179532141429242
- -0.01565370585505655
- 0.005846773803302997
- 0.01335231182307772
- -0.2718325851744277
- 0.3462680224808091
- -0.1959387716606182
- -0.5438993329772722
- -0.4787343953438634
- -0.06678603417674459
- -0.499921571639358
- 0.09815744930648497
- -0.2129229731611965
- -0.07730212367128855
- -0.5485743205851044
- -0.5452923246924926
- -0.3020803622176061
- -0.1591960143215016
- -0.04956358398817994
- -0.0290568894388576
- -0.008253192309295925
- -0.1955745058619006
- -0.04618583863778489
- 0.1091612752012542
- -0.4619001610364459
- -0.3692202542164156
- -0.09988786470240667
- -0.4692197245166221
- 0.1914676051407242
- 0.2121749482849875
- -0.1149307010526159
- -0.1904478657477881
- 0.2462014858522821
- 0.001754223755763481
- -0.08480309741901883
- -0.2127612683438606
- -0.5118184167687053
- 0.382347513962762
- 0.03808150938029006
- 0.2518807181589469
- 0.02154858415273547
- -0.3893449322968922
- -0.2167216909410216
- 0.3860177129811224
- -0.08499909511413424
- -0.3887432617560126
- 0.3708619457636211
- -0.3120436016510948
- -0.05299917601938802
- -0.1099162929881584
- 0.3817873712974926
- 0.341076861738471
- -0.5291531398780812
- -0.3218978604160307
- -0.1569871545851364
- -0.3389052762012951
- -0.8543496902114009
- -0.4430601170393201
- -0.822917007835629
- 0.1578091180914681
- 0.02356555643550554
- -0.7311591075724099
- -0.02046745063084701
- -0.2556341900660989
- -0.4334977374873441
- -0.2172836075673819
- -0.1004610402281179
- -0.5995114010789439
- -0.1580215576663957
- -0.2700160753907077
- -0.1791718769204184
- 0.10433318172727
- -0.2628705816799846
- -0.1686570115607318
- -0.3068685281060631
- -0.09814630618918101
- -0.1497385025023432
- -0.4074351212448353
- -0.3334924678781389
- -0.6538958399570722
- -0.300561782996361
- 0.1822896782480434
- -0.1139468491097467
- 0.03539343147907053
- -0.1550662450716123
- -0.5397131238570544
- -0.372181867218021
- -0.4674203237608217
- -0.6545563178051702
- -0.4229395670115984
- -0.04113516245428499
- -0.5451085318148088
- -0.511592875468121
- -0.2840266659950414
- 0.0106744015890542
- -0.4554353508680534
- -0.3388074378591223
- 0.06221199312929226
- -0.2740359519549297
- -0.3067440885546456
- -0.2550129301256622
- -0.2390063345835033
- -0.0006035686096761179
- -0.605677444649717
- -0.119793771027347
- -0.2750243242962616
- -0.04642902449794497
- -0.6308490936483154
- -0.01242161786196535
- -0.07132997202448933
- -0.0887428962759793
- -0.2325238462713042
- -0.9047463541424298
- 0.01658182378927922
- -0.00757330869321584
- 0.1593916913105907
- -0.30865992061819
- -0.3331606028431572
- 0.1263895129933455
- 0.01961474297915897
- -0.3470257833748221
- -0.5424716805812152
- -0.2009709154582145
- 0.45758918922306
- 0.2787925860775491
- -0.2414443397955571
- -0.315930801341089
- -0.2764128272374969
- -0.3745237272689381
- -0.126159677981048
- 0.4191869601185408
- -0.6784266104832994
- -0.5163194826192089
- 0.05122030675741623
- -0.3439245695363883
- 0.1948868616089859
- -0.195621240269816
- -0.2138035569149919
- -0.347389993572753
- 0.339360043845781
- 0.01605039416612359
- -0.3309417321826002
- -0.3241029873528691
- -0.2576945702651006
- -0.3775080322103062
- 0.1443789467073577
- -0.2115000012605343
- -0.0632786938770744
- -0.8588933711020734
- 0.217274860245064
- -0.3226043112026534
- 0.01771453443535823
- -0.2761564016940267
- -0.3606438760377993
- -0.4118506441057463
- -0.2423832117304276
- -0.0887804850759015
- -0.5729156705116153
- -0.6925410607046041
- 0.5280927917298445
- -0.2823300145568775
- -0.9402331275720441
- -0.1997246501346932
- -0.6724763279724075
- 0.06182904160979734
- -0.708049809297232
- -0.259721293167383
- -0.3865451274527018
- -0.1284111529569806
- -0.3514575322321374
- 0.08207950137162345
- -0.09598541532096631
- 0.147289309646151
- -0.2497369372424541
- 0.2156248484000855
- -0.2658245768023106
- -0.572600223736922
- -0.2521990907983624
- -0.4295099510742876
- -0.04681170516341528
- -0.7328427675174419
- 0.1884437179260753
- -0.04673741402675256
- -0.7794252860778346
- -0.6598692557606886
- -0.1671782095543159
- -0.3821492234558344
- -0.9238147067806809
- -0.6916296008663123
- -0.3402834544006016
- -0.578286567452837
- -0.08526704879707259
- 0.4962274795435372
- -0.7861315151895858
- -0.2066634650164923
- -0.5337220378425992
- -0.718410100444599
- -0.504459492665439
- -1.781827984730382
- -0.009947068886489769
- -0.4232115708025747
- -0.5426458863517839
- -0.5264455047333106
- -0.02365578538253354
- -0.3068997345092218
- -0.5150887200116396
- 0.19076241356687
- -0.1554067325416549
- 0.3969325754490018
- -0.3676212471563032
- 0.5257695833701596
- -0.274742496467984
- -0.1857001610880882
- -0.1400976841123476
- -0.3617743663956622
- -0.6082153702179874
- -0.03632788515964308
- 0.02645797539322557
- -0.4161029360544639
- -0.7431684755220693
- -0.664251865974368
- -0.686806875659062
- -0.1496536443263377
- 0.190202432826203
- -0.1443255792224843
- -0.08102931935739026
- -0.72094662197717
- 0.004892581362082224
- -0.299705529614719
- -0.01696646447822541
- -0.3272883990347764
- -0.4905533145913219
- -0.1813396174116535
- -0.4071266089152618
- -0.5655314771866083
- -0.4955683794089641
- -0.006248670385064545
- -0.3033017414216436
- -0.5888400949273649
- -0.4074841816642161
- -0.5959435509593141
- -0.9107791944897182
- -0.3349167971705578
- -0.7373588861608363
- -0.6026594024957698
- -0.6107404965543706
- -0.5003765155757252
- -0.2098611070589861
- -0.4021373027965684
- -0.8970043375612039
- 0.08397910064022965
- -0.4382484290758023
- -0.3301399368071711
- -0.1242664808119831
- -0.2566178601993747
- -0.8580139120956334
- -0.3507095368583322
- -0.3811768675654083
- -0.399773831124957
- 0.1689071027451845
- -0.1953723184008203
- 0.3067860909489342
- -0.5295403789461324
- -0.462947842632857
- -0.309595415132518
- -0.4885207249855884
- -0.3616981532296132
- 0.1724954091130182
- -0.2242279567779056
- -0.1011815074360616
- -0.6491739385864949
- -0.586984527587308
- -0.3778323314108448
- -0.09455214175017755
- -0.1417058751390151
- -0.2992596095016197
- -0.03766037803092157
- -0.1127711321594186
- -0.148458127618688
- 0.2093510540750044
- -0.4264534725673995
- -0.5603598915878025
- -0.1225630439665603
- -0.4815789276416481
- 0.1703550775539186
- 0.08599999366535897
- -0.4500855357806468
- -0.299901613610683
- -0.006269558339009458
- 0.1243574071130169
- -0.2346236097390691
- -0.08636255906208028
- -0.2229581332903815
- 0.2823707262727844
- -0.2397291346814265
- 0.1680025127720532
- 0.3012079184576376
- -0.7086369232392157
- -0.6408726543683755
- 0.3433000709787449
- -0.1575065203138797
- -0.2867059557405419
- 0.2773035145438126
- -0.2150019370514253
- -0.4243012461071846
- -0.05769483473691139
- -0.07319840475241103
- 0.3170796895196715
- -0.5671667329225263
- -0.3613263866052935
- -0.1833799785322691
- -0.6008257845500781
- -0.6653095750697096
- -0.6002023243499531
- -0.6657416600414023
- 0.1797629486941266
- -0.3595463967012169
- -0.6608457903818953
- -0.1399092453423791
- -0.3320523822637252
- -0.6346831609524493
- -0.1126116635467497
- -0.4430829785354419
- -0.5485231708125181
- 0.03204657762249968
- -0.5301733635083953
- -0.5816943497436409
- 0.008806774026283262
- -0.5491988821134777
- 0.08435077825563157
- -0.4249142318330439
- -0.4528829190479355
- -0.1372350565664413
- -0.3979607906751999
- -0.2736356445295965
- -0.6591575170066557
- -0.2028113340747752
- 0.3093224396829657
- -0.1191120114081912
- -0.05310542061942999
- -0.07089508746778765
- -0.8108684520555332
- -0.1785032426837721
- -0.5999447934883962
- -0.6111411990278564
- -0.4186274799455245
- -0.1996346316510463
- -0.5072772867718675
- -0.5085715229962611
- -0.4783727689671217
- 0.3888878648421634
- -0.5018817073580097
- -0.1710123961143074
- -0.03440537061758202
- -0.6307201710364533
- -0.7624669294232587
- -0.1576758872803966
- -0.1730081850814273
- -0.02625730250783562
- -0.5651390390100943
- -0.2542031839819762
- -0.3311672194039363
- -0.07320000952316806
- -0.7051065686715809
- -0.5397917702212847
- -0.02024915602074184
- -0.1898657938494608
- -0.314988435251115
- -1.106120080454726
- -0.5480091149859121
- -0.09145879212478093
- 0.1440405642236308
- -0.5120847002837695
- -0.05440699605913334
- 0.2362600119337995
- -0.2498941318550015
- -0.3758131420797248
- -0.4106673983087781
- -0.3363085217087289
- 0.6044613757751727
- 0.1122602238867986
- -0.3170173832997
- -0.2052360563028308
- -0.3537423350446363
- -0.3191986995735654
- 0.01210117158462355
- 0.2407197443137293
- -1.131072648759672
- -0.6094826423122511
- 0.1481031201204994
- -0.2816758046960969
- 0.1752267227585191
- -0.2742201391037056
- -0.650284605760318
- -0.4139406904977087
- 0.3116073296461769
- 0.09366767815532326
- -0.6537020409696733
- -0.5264410585863214
- -0.6306669892186386
- -0.2142258307113107
- -0.2299817083155755
- 0.06915493757999686
- -0.1521691785608325
- -1.141583345649978
- -0.06592206427003312
- -0.3126744427081004
- 0.01693288377691876
- -0.3528965617401257
- -0.1314278329686176
- -0.5596825145110919
- -0.2598449364567456
- -0.3186944506137265
- -0.6657774294296043
- -0.6689401126733523
- 0.8424123812819385
- -0.3009561611668924
- -1.064671667809632
- -0.5656834873141398
- -0.7752133072999027
- -0.1241937641920823
- -0.6374480002381808
- -0.4316929876739758
- -0.5379254658864181
- -0.1328429314433819
- -0.5164809431613604
- -0.2962416807611852
- -0.1095985366281921
- 0.1207874243767804
- -0.6628900788488759
- -0.1351168325674617
- -0.2640325389261486
- -0.8452106536516678
- -0.3278363941281444
- -0.5382437306891634
- 0.0007679836840912218
- -0.4236868179998368
- 0.1319238561852083
- -0.2514732603231891
- 0.00682872503865941
- -0.2460237822275235
- -0.2149518213119463
- -0.3853157704397552
- -0.7518385681609683
- -0.5661407784010941
- -0.4055167927140272
- -0.5343414090579431
- -0.2868332194461589
- 0.2708073279502483
- -1.022867290643607
- -0.2684839686071238
- -0.4610225988546588
- -0.6772542738231266
- -0.3544382407374108
- 1.740030988687096
- -0.2402757352641925
- -0.5008001701776205
- -0.32203566623503
- -0.420424818079375
- -0.5527956962790427
- -0.4165025225562441
- -0.1934917831570036
- -0.2564252939818574
- -0.3979042505792373
- 0.569503383874053
- -0.3992567834737347
- 0.5897134182343675
- -0.4717142696950412
- -0.1879011738315803
- -0.3296751719897661
- -0.04853534424595358
- -0.3196629319664885
- 0.01616278646428472
- -0.02518437276958412
- -0.5159949290714172
- -0.4637381442910093
- -0.7480603122998082
- -0.593565034849613
- -0.3443225637849446
- 0.1915663217760353
- -0.2208231019276707
- -0.0229822183777675
- -0.9744571245769105
- -0.1626221200879218
- -0.3515559219094913
- 0.03383880333558515
- -0.4688044937671148
- -0.7618252549229642
- -0.62682769836385
- -0.5754922484276397
- -0.2888300568057754
- -0.572224317416559
- 0.01053109933068843
- -0.294445312607977
- -0.7097400471505686
- -0.3989451628754628
- -0.7911465174554497
- -0.8293220722254347
- -0.2840166022341136
- -0.5712601088393791
- -0.4600099221423827
- -0.28899931163757
- -0.3643181064797407
- -0.2225982521597181
- -0.2438786397524137
- -0.9357264224665949
- 0.228355580792485
- -0.1621760245473221
- -0.3049375648757576
- -0.02225913657565592
- -0.1694873664214451
- -0.7959264250443929
- -0.4139968176207957
- -0.4110033725326739
- -0.7852385808451339
- 0.1283921083206729
- -0.1463796515185316
- 0.2271431064471801
- -0.5617095218394167
- -0.7841145258499482
- -0.2560159493630336
- -0.5580690917179528
- -0.04531553057782736
- 0.3554651982974579
- -0.2229454527347418
- -0.1027446492423381
- -0.6148578968220384
- -0.3213478564924183
- -0.4648935364962582
- -0.1411256112089259
- -0.5837217247480977
- 0.147878190493986
- 0.2097076500532646
- -0.06846971738883641
- -0.247471001276119
- 0.5637195559861582
- -0.8643569774815417
- -0.5739224547249889
- -0.1211870337370245
- -0.6808082790534996
- 0.0666681877316912
- 0.06161818894203498
- -0.6313891561168232
- -0.4116426898980775
- -0.1467126937197818
- -0.2977466389072961
- -0.3153989022423644
- -0.5208853164006397
- -0.3845323102999652
- 0.280267202921041
- -0.6839282700139054
- 0.1757954743509033
- 0.2795987531029381
- -1.063435226925195
- -0.7635577498452711
- 0.4197159489910926
- -0.04269171867875766
- -0.1163816233067556
- 0.3169323876707662
- -0.3241239598066025
- 0.02207212575000063
- -0.02996874692232253
- -0.4523229984245173
- 0.01235470586480735
- -0.4904427974491405
- -0.3480502876861254
- -0.1594231677310244
- -0.6080547005840844
- -0.1753453575408354
- -0.4323488361306168
- -0.505339485231958
- 0.1550320090461448
- -0.4788857991812676
- -0.7416837536959027
- -0.526284161501043
- -0.3205144331745952
- -0.6799907880853793
- -0.0004602501180474434
- -0.3553702825004848
- -0.5628476691497847
- 0.1831584813954614
- -0.5833876316757762
- -0.2385667806020592
- -0.1435223220691675
- -0.5862099375816562
- -0.006706504552293172
- -0.4107388300348321
- -0.4971982875136436
- -0.197366562155806
- -0.7940342484313364
- -0.1969251071604586
- -0.9874351191383243
- 0.07926008935697504
- 0.1646474683723194
- -0.1233008039743702
- -0.02671002162957524
- -0.1444779380085388
- -0.8378694132281145
- -0.3031219709420606
- -0.4809574349308396
- -0.5928992192700092
- -0.4413021065317886
- -0.04918086472912069
- -0.1076738850473241
- -0.3879281706209609
- -0.5227018007203815
- 0.3082199540555409
- -0.8051717417915679
- -0.1150540598055636
- -0.1704053487569717
- -0.8442359408404969
- -0.7832043444645047
- -0.1760183397472159
- -0.03972588631436266
- 0.1985375297124761
- -0.3433438205288021
- -0.6022461326730766
- -0.3832753364025572
- 0.02496989821628015
- -0.7482856620325489
- -0.676472325144241
- -0.1995175329101491
- -0.3055061345658232
- -0.3525741657072834
- -1.041952251483809
- -0.4833379927283012
- -0.1631391027722319
- 0.08717001671536372
- -0.5758173054151819
- 0.2556821980832631
- 0.2893202308655086
- -0.3180363901873887
- -0.3543792204057355
- -0.1415516959141055
- -0.3925201797698654
- 0.8471840398193545
- -0.007706221773311706
- -0.1963279733293128
- -0.06959797801059125
- -0.3439763571075633
- -0.1369718553100855
- 0.08363263051704599
- -0.08420122646260238
- -0.9430659754739588
- -0.4837684467461363
- 0.108912306293059
- -0.3097210873343849
- 0.2073936141374547
- -0.2969534935970397
- -0.6893898771050506
- -0.3805016869987031
- -0.01829813528337139
- -0.03519004420106402
- -0.4904205191547068
- -0.5237925240566278
- -0.8873934736899731
- -0.1647033558058378
- -0.6895951797493588
- 0.1969087071731084
- -0.1431303983363662
- -1.199648901972244
- -0.2292936600652613
- 0.1048424274021737
- -0.211285411441128
- -0.3412345589704287
- 0.1421968005512652
- -0.5929397675682737
- -0.300151981810605
- -0.3521789047934598
- -0.512952562361777
- -0.3186910232639853
- 0.9687960781341542
- -0.3247884445108192
- -1.111584493802074
- -0.3401393556610821
- -0.4732730076001035
- -0.2112119737469602
- -0.6182892105283664
- -0.5317519963536463
- -0.5122297506852407
- 0.1991472282966215
- -0.3521110322185296
- 0.07007926399907323
- 0.1071993659132263
- 0.08979388021070796
- -0.6263631267375758
- -0.3159070728631599
- -0.621762198439926
- -0.8270000722327756
- -0.3211575912606422
- -0.4743296938417983
- -0.1040256616831242
- -0.1049837439919935
- 0.1657019051342271
- -0.3762664671296157
- -0.470896309465375
- 0.1131506048092131
- -0.2081354288090403
- -0.3751672573201461
- -0.7475183680699227
- -0.3429889606103283
- -0.3563272169382081
- -0.193391652912252
- -0.1531689089457126
- 0.01097693395417735
- -0.8701040648264207
- -0.3143213515089616
- -0.320219666872623
- -0.592222215133461
- -0.3119573320575327
- -1.781973028558838
- -0.5607983807665291
- -0.5284186051541483
- -0.2431205520419281
- -0.3293907359360963
- -0.844879692017794
- -0.3785271889603082
- -0.01566285948976559
- -0.6479386231714839
- -0.4968833348626299
- 0.7222550173615462
- -0.5314642510724801
- 0.4308429549802154
- -0.6232325490933887
- -0.182016847791158
- -0.8778392013648422
- -0.1639641219509562
- 0.03408601202469844
- -0.01649806840710853
- 0.08165899544008666
- -0.7182053520196864
- -0.0282191147370792
- -0.5870543552588785
- -0.3231940518303731
- -0.5771586795985312
- 0.3262405283444714
- -0.2528153413391997
- -0.4082394060139936
- -0.7741023157948116
- -0.1681944551198781
- -0.409362942909045
- 0.1675440584613964
- -0.5640719656890355
- -1.055730129940361
- -1.098571488379675
- -0.8975787973673068
- -0.03772469550847653
- -0.5642342418592303
- 0.008230844877315392
- -0.3339261354764625
- -0.5514432759140413
- -0.3581455261509393
- -0.4072398822900626
- -0.7505923501963231
- -0.4133824271519346
- -0.2502443089715727
- -0.1859781500659672
- -0.2507778584384046
- -0.5768442401927268
- -0.172494219696996
- -0.1370585867667568
- -0.7451345314503817
- 0.3863714854580726
- 0.08592667913501936
- -0.224872090415018
- -0.3867075059046672
- -0.01995574410190462
- -0.7792667864810917
- -0.5139905686401676
- -0.1542818303227253
- -0.9569043036713922
- -0.2697091330581493
- -0.1987512335898944
- -0.2010240181995746
- -0.3898078563984238
- -0.5728928421282474
- -0.4898382537117549
- -0.6661950745854164
- 0.2316645697315715
- 0.1451958537847786
- -0.285186100538286
- -0.1548825383639861
- -0.3606243712905282
- -0.04309501997003859
- -0.5252121926059879
- -0.08087819685630879
- -0.8435507862497488
- 0.4306854850221897
- -0.08238840393192921
- -0.05041650085296915
- -0.01158433575335821
- 0.6521341473703037
- -1.047237039308981
- -0.3746236902847343
- -0.1082794913183117
- -1.031700987750881
- 0.1391159630165882
- 0.1736528264501267
- -0.6512238773038403
- -0.4587991036038348
- -0.1340821280386915
- -0.7334583616678994
- -0.4458441551671066
- -0.837471432556554
- -0.6672799757736255
- 0.2448374172288726
- -0.9024474589734426
- 0.1023670755906258
- 0.0292058596005524
- -0.9520214971401303
- -0.8268143038010669
- 0.2972605217114852
- 0.1453064233583261
- -0.5232784383932808
- 0.2086008331921708
- -0.7627467577788207
- 0.3941662642328789
- -0.2286381155884264
- -0.5870456814615304
- 0.102084148967303
- -0.4329515063089142
- -0.3906233582382577
- -0.1731692891447
- -0.462936283622991
- 0.2186150787660332
- -0.5378741730398333
- -0.5513110470695967
- 0.08792702355002706
- -0.5160325021276126
- -0.8038774266202716
- -0.8673068591619917
- -0.2800402211052486
- -0.5071812287055846
- -0.245761552277381
- -0.1131894656146579
- -0.7111469043039585
- 0.2949153372857375
- -0.6125145957330751
- 0.1333191507641706
- -0.4143036664128203
- -0.3881311020441194
- -0.4536636134855772
- -0.6501534428375323
- -0.4587908045668875
- -0.2262689907292591
- -1.008930698162811
- -0.2858199286034775
- -1.097091975238689
- 0.3349940031359749
- -0.03397858581056419
- -0.1115325585421367
- -0.1536060218366431
- -0.2472757970660318
- -0.9552163802897028
- -0.6360437725640494
- -0.2415017541557331
- -0.587043818741025
- -0.4349002239176226
- 0.05466084891586871
- -0.08379992506168299
- -0.4337862151309793
- -0.3523864784159469
- -0.2180967687295187
- -0.8293383325079787
- -0.3981414008486881
- -0.3406100475235269
- -0.9146022384063078
- -0.4776784098582947
- -0.2444239310349579
- 0.02509980574020787
- 0.01141825131356056
- -0.4052794734982313
- -0.4729987232950348
- -0.4093980513685815
- -0.00873726058681297
- -0.7712260881429435
- -0.7848996302391045
- -0.4474293883176877
- -0.4323587577203974
- -0.3591563401798847
- -0.9546891379024977
- -0.4272933483664859
- -0.06972562127096517
- -0.02149647229712578
- -0.770948698054748
- -0.03291204158136948
- 0.3803140241482079
- -0.1873962583031693
- -0.347983988323403
- -0.1636512977496206
- -0.3091525419691572
- 0.8900416145331014
- -0.1743739584560785
- -0.2799925329935282
- -0.2953298210434973
- -0.450373929504557
- -0.1897727562191744
- 0.1512685793668392
- -0.2564901069991625
- -0.7598665348694464
- -0.4516988612050298
- 0.1068511089079621
- -0.2808640885633978
- 0.08429370500173265
- -0.3006954281227031
- -0.5940605997954104
- -0.4359973149611513
- -0.2442812926963645
- -0.0329967553759234
- -0.2558588863449351
- -0.5317364343041211
- -0.8531979377142996
- -0.6747777970265376
- -0.759844933067973
- 0.0006778703703523043
- -0.1294741974933304
- -1.106916969987646
- -0.1352047865966687
- 0.08682798495941844
- -0.5157487159470723
- -0.3502479771286062
- 0.3010730983680521
- -0.5465252622325496
- -0.3861814509901219
- -0.460932413329754
- -0.3924467851902882
- -0.003125988376217017
- 0.7091393647100384
- -0.3071080884322199
- -1.248602155389827
- -0.6026747990886756
- -0.151398152882901
- -0.2826794853998861
- -0.7794898241130669
- -0.5593715976627073
- -0.4852336979367511
- 0.008309981183236928
- -0.1021599316578544
- 0.3411885873017287
- 0.5081079556857369
- 0.03733243284709165
- -0.3308654045131658
- -0.2466537274174862
- -0.9377014554868648
- -0.8369771035990859
- -0.3451759856061667
- -0.4415002397679108
- -0.2260156389975992
- -0.09391867372990505
- 0.20536671518883
- -0.3820615019536124
- 0.8603809226716443
- 0.04649318982692087
- -0.158594619703022
- -0.3744326803384477
- -0.9125369928504006
- -0.2378369680554814
- -0.3006028796512427
- -0.08976209282829463
- 0.03878589158372698
- -0.2571253410084418
- -0.785713420861162
- -0.3177862219631656
- -0.2314554537666901
- -0.3843821789143249
- -0.4873158910290698
- 1.867504138689031
- -0.1400122810502813
- -0.6753642256336548
- -0.2131931662576885
- -0.4222201678406883
- -0.992839970337568
- -0.3564598873179906
- -0.1984565326015064
- -0.8003576707711179
- -0.4047668580826831
- 0.7674033625513189
- -0.5379221398723746
- 0.3200337625725557
- -0.6216122206835325
- -0.1813225694221128
- -1.087091976625574
- -0.261186702356849
- 0.01544308449351302
- -0.2500519919860956
- 0.1441280229092948
- -0.9619638588218969
- 0.1269707449510237
- -0.6043244873826396
- -0.1725858061112837
- -0.6338179309763565
- 0.3837868560834052
- -0.1949495842806335
- -0.758838935074038
- -0.6577446655062089
- -0.1066555349812738
- -0.4665885207142938
- 0.3969287809523685
- -0.692421554516083
- -0.8766299067088819
- -1.222737098832862
- -0.9412237269783912
- -0.1783534432115874
- -0.5793127719721858
- 0.00198151099599386
- -0.2914654072177844
- -0.9132033195906868
- -0.3403370434379572
- -0.1868548302155974
- -0.6710837117043588
- -0.2454886164132825
- -0.1241173018458294
- -0.2881038463860114
- -0.2303714358992366
- -1.015450790887978
- -0.103293216194567
- -0.2492892148066009
- -0.501306977223504
- 0.5467538639021241
- 0.2218582371860424
- -0.2512560586044336
- -0.7542107007949712
- -0.02320318421047902
- -0.8658572514826759
- -0.5559053392767729
- 0.02184836138294483
- -1.020389550090781
- -0.6871829233387893
- -0.3082731594064871
- -0.6241027114402874
- -0.2269937410753727
- -0.7018013596758071
- -0.7708968870449653
- -0.6888896844758244
- 0.4445543856629801
- -0.2511562352753987
- -0.1454995404220746
- -0.2401718120916491
- -0.1373932587443327
- 0.05750814917539201
- -0.5077294001027047
- 0.05337787197100174
- -0.9368218187167636
- 0.3094167643873372
- -0.5086778642578426
- 0.06744163899424491
- 0.1149160751543754
- 0.2772787764088001
- -1.131635194925813
- -0.24299331655764
- -0.1048965486925691
- -1.226254278840357
- 0.2029837279627382
- 0.1659767946555612
- -0.7132139376091509
- -0.4943209625346273
- 0.05117485812238402
- -0.9063858289101545
- -0.4820357410883333
- -0.9985494038759675
- -0.6582131227198482
- -0.1703380258281345
- -0.9928703297273094
- -0.114582736253507
- -0.09210900657241534
- -0.7078960436284223
- -0.9469585751118496
- 0.1005995272527878
- 0.2414918171114861
- -1.09964696711853
- 0.1575427776842223
- -0.8200464232382167
- 0.333162096363932
- -0.3821110116835941
- -0.5101465687146329
- 0.2144853276229104
- -0.512968358020117
- -0.488113300839539
- -0.2231572929378784
- -0.6201640114343301
- 0.2779820537987536
- -0.5104169196537974
- -0.6104312516002482
- -0.01020268160961942
- -0.5220419351288996
- -1.02325893573648
- -1.128840855457466
- -0.2799193428358276
- -0.4285771894615326
- -0.546634031813172
- -0.1516111067465357
- -0.8121415040333105
- 0.4884931648429183
- -0.6067981257056273
- 0.1552447809247549
- -0.559431567530568
- -0.1767958055953588
- -0.5082820086240474
- -0.8587536693663146
- -0.4448482480218933
- -0.190572533645124
- -0.9276026706789513
- -0.3727380520268397
- -1.022288134606446
- 0.5338402697560298
- 0.01606721260939164
- -0.1198185494852305
- -0.4219561200564114
- -0.3629507087479318
- -0.7933746066071081
- -0.839387868910383
- -0.2714587435270597
- -0.6183725771998323
- -0.4406180819036702
- 0.120792154047767
- -0.1751175420400254
- -0.5428664166010159
- -0.2268962176582445
- -0.509221779962194
- -0.8449037912845141
- -0.6846059682233914
- -0.3219151493929256
- -1.034332439008274
- -0.3900501572073875
- -0.2413581968510067
- -0.113597852135392
- -0.3351205767677078
- -0.6361979833288497
- -0.1928292306697757
- -0.43680298624963
- -0.1887923567377331
- -0.8025552691681482
- -0.8822249286684164
- -0.5173636867479294
- -0.5396821401592674
- -0.3784762859892659
- -0.8448706219451347
- -0.5234203882543
- -0.02523284708004396
- -0.03004488642002552
- -0.5911414799190232
- -0.5198729319281616
- 0.3793210414752821
- -0.04253283290772383
- -0.3466682916964748
- -0.2922567493223415
- -0.1092012753827762
- 0.7215290234431692
- -0.3998376566347607
- -0.3785129240010847
- -0.534849131920757
- -0.7159466788797467
- -0.5158517564827039
- 0.2191034254880796
- -0.1687253454842232
- -0.8006633752006649
- -0.04233864925094758
- 0.2140476332785622
- -0.2296165453694349
- -0.2915847379002629
- -0.2888886891570239
- -0.4784622980651279
- -0.4467145960481185
- -0.2256072700117347
- -0.04297332735554762
- -0.3004901990870193
- -0.5309290473258421
- -1.007158475659556
- -1.111196509017678
- -0.4529845320173796
- -0.1409433732378824
- 0.0222587276785431
- -0.820032995490547
- 0.007376701449273282
- -0.09344757451430596
- -0.6575287905493787
- -0.3359023295164944
- 0.5245680980769555
- -0.6068177056063478
- -0.4216118690137018
- -0.5725608766120418
- -0.4132240278745631
- 0.06853942621820504
- 0.3766986723601243
- -0.2236264198419682
- -1.155001748353813
- 0.3835755738205138
- -0.07269001608422644
- -0.2961927238014648
- -1.011602948583423
- -0.5476932202465833
- -0.4673703739609745
- -0.1149249823172179
- -0.3212341778145969
- 0.251035724468793
- 0.5090317567423607
- -0.2018856400356364
- -0.3026056454976902
- -0.1696618457657907
- -0.8511035584348059
- -0.6360251499027173
- -0.3479035685123237
- -0.5099340626202971
- -0.4260193709536283
- 0.01391765724150718
- 0.04716688284851223
- -0.5193920652906535
- 0.1336592645915052
- -0.1157910297988457
- -0.1209061571098737
- -0.3175436010167856
- -0.9144348098228305
- -0.3985852511791289
- -0.3255970899053792
- -0.2155615860397035
- 0.02576505316702601
- -0.4311139406371869
- -0.3922836136710843
- -0.2706420873581653
- -0.3149541713240933
- -0.1009102613588649
- -0.7589114696564203
- -1.781827984730382
- -0.3225388769638705
- -0.6477950476558042
- -0.1705397346900364
- -0.4016639554119894
- -0.9560729763139403
- -0.1062869424071198
- -0.3410653174718074
- -0.6938947223719386
- -0.2531015973304419
- 0.5154964732046285
- -0.4933817747571067
- -0.103099497056752
- -0.3720333613045235
- -0.123252982762294
- -1.055082572544018
- -0.1092166843215198
- -0.2198511401706685
- -0.4913473463108912
- 0.1099251875339939
- -1.123872395689639
- -0.02938743533917771
- -0.5059274709014567
- -0.2227055243212799
- -0.4690992425341026
- 0.3639924227658843
- -0.02027030350821564
- -0.7309819750094045
- -0.7262974959532765
- -0.06390253566339001
- -0.3340042434091533
- 0.597777278013657
- -0.6949221865942922
- -0.4493798828966502
- -1.160855418373404
- -0.7053072891484373
- -0.699276484447522
- -0.4376704852886505
- -0.05167241028317913
- -0.04077780340070988
- -0.599338006731406
- -0.1877316316037821
- -0.2386115078344901
- -0.3960026156101754
- 0.07314693730402491
- -0.0877385462508644
- -0.3490784660286306
- -0.3042342943000372
- -1.04485869334051
- -0.2133530210299411
- -0.3146573130592388
- -0.3321743102554562
- 0.6536809804245225
- 0.3356024170565902
- -0.1934155285213567
- -0.9308302814893227
- -0.03611906779631877
- -0.9231960135360759
- -0.5094190712281376
- -0.2368865955761142
- -1.039908483654012
- -0.8350780325527202
- -0.4063549237358346
- -0.7216287535653085
- -0.283549014328219
- -0.9303673883439546
- -0.9378338521796289
- -0.3743380151152271
- 0.6652621891428373
- -0.6261809288546966
- 0.04919270649906123
- -0.2000238336443852
- -0.3805201612720025
- 0.1070814407263242
- -0.2373341039643005
- 0.1680623173657377
- -0.8636506670044971
- 0.08496989766350729
- -0.5964578505190108
- 0.2616961079899485
- 0.08564325237143779
- -0.03076282855809052
- -1.006776302453722
- -0.4388848296833138
- -0.02522913690806778
- -1.237672975105699
- 0.2268815798631884
- 0.3284199476696821
- -0.6537825551034893
- -0.5222905782590661
- 0.2957512926294534
- -0.9733422277481359
- -0.3595601174139009
- -1.003688310960785
- -0.5937017251294097
- -0.4447872447259192
- -0.8495306072401683
- -0.2914004542718777
- -0.02520211595957169
- -0.5032552818223736
- -0.8935797977110612
- -0.1749640360389038
- 0.2067588852205771
- -1.361739084645942
- 0.01607068850026597
- -0.5986951376148295
- -0.006364519784491229
- -0.418312344602186
- -0.3255628138534578
- -0.05822691441876494
- -0.5470615402964608
- -0.4674344014256545
- -0.166972824355683
- -0.7266288134790206
- 0.003911148183964989
- -0.1107724574764601
- -0.6388237463609426
- -0.3195108977045384
- -0.7914273227694385
- -1.030707884301274
- -1.347581155474584
- -0.2335665650734107
- -0.282266159456554
- -0.6047644519379601
- -0.2647827722254275
- -0.7656455368948109
- 0.6925461994067584
- -0.3355196829331084
- 0.05457413196311294
- -0.6654809206432205
- -0.1716090184197709
- -0.1816043155841315
- -0.8710697445735216
- -0.655246440909579
- -0.1038510359864993
- -0.5753790585325803
- -0.388110581745044
- -0.7701068611951711
- 0.5265629438784175
- 0.1877246111858627
- -0.07274151601928062
- -0.5412953692036067
- -0.4119734917352358
- -0.5366763068137621
- -0.789734438665066
- -0.4938557305258537
- -0.632044272904425
- -0.05377693088462582
- 0.3993417959047834
- -0.2338366100911965
- -0.4892118216335631
- -0.4090155269574513
- -0.7430633627590832
- -0.8739827201153766
- -0.6241417643999819
- -0.3287665353236034
- -0.9053857928987108
- -0.5648028405516894
- -0.3831278412321464
- -0.2667834069307376
- -0.4260095140851397
- -0.5942808972698476
- 0.06590664074879116
- -0.399205686951896
- -0.3525046922510404
- -0.6482042707020442
- -0.6884904318529738
- -0.2322503571731199
- -0.5186819183156427
- -0.259992661918489
- -0.5319560685499135
- -0.5339174568628724
- -0.3743326975744048
- 0.01490145813696582
- -0.2211962027111431
- -0.5308552983355076
- 0.2582853853062619
- -0.04561453043301034
- -0.3664513725843536
- -0.431973756895839
- 0.2651925127001253
- 0.3946610267467467
- -0.4687043765476729
- -0.4124847689797652
- -0.7568303916281496
- -0.8018285259196836
- -0.826153435156299
- 0.2906615985251585
- -0.03724746981708974
- -0.8016310126139845
- 0.4818981906977681
- 0.2721103651715217
- -0.360637480659132
- -0.3872973663893723
- -0.1495220514798854
- -0.1864243586610831
- -0.2102292448691494
- -0.07317014262805463
- -0.09662769112699954
- -0.3378718456832781
- -0.4576579062142558
- -0.9075882353475503
- -0.9219014718538876
- -0.1920685081266685
- -0.116875762912306
- 0.2890653171322882
- -0.4893731464572967
- 0.03429173363179066
- -0.09668863893128976
- -0.7566245638496483
- -0.2809460853315527
- 0.516164339665746
- -0.1102249908103984
- -0.40935018207511
- -0.4571520457708725
- -0.3416521138433671
- -0.06327507390117715
- -0.09480691448373813
- -0.02804242689107814
- -0.8009299785593715
- -0.5118264582900479
- -0.2142006600809974
- -0.1384804766152002
- -0.8475682420452058
- -0.5735110982901541
- -0.3799754077955094
- -0.4477211045778108
- -0.6532779099630316
- -0.03162730375362215
- 0.1448841305296973
- -0.2120341453962263
- -0.4524362540144146
- -0.356780235568433
- -0.5381069203948087
- -0.3039616033589326
- -0.2984008579276916
- -0.4473431779410559
- -0.6485066001685057
- 0.4410917197120264
- -0.1458758574465191
- -0.3815449557405615
- 1.667218727796572
- 0.06210318337388328
- -0.02218373853791181
- 0.3143943544532836
- -0.3695653803667836
- -0.3176914477891388
- 0.05118959850659156
- 0.09008013501068504
- -0.006350069057788199
- -0.01232797267804324
- 0.203935684172132
- 0.2330687614757996
- -0.1624114630506737
- 0.4307269245467064
- -0.4004737420633673
- 1.948549556721081
- 0.3335890928151976
- -0.04192142481248118
- 0.2367004576456525
- -0.1409107966175674
- -0.3436863316219508
- 0.3816399232737833
- 0.007629740452386909
- -0.05620962790570525
- -0.009210520727384545
- 0.04312762633207708
- -0.1045037202332779
- -0.7291590733833684
- 0.275517453291411
- 0.1064432317573884
- -0.2697058202994626
- 0.2235728075947489
- -0.1292678701953861
- -0.3588164388952433
- 0.2089953707997088
- -0.4268770803072862
- 0.1658208426565521
- -0.05874670210612977
- -0.1252114055277611
- 0.2118547821865102
- 0.6627473287282948
- 0.4459429401917344
- -0.2771606877337046
- -0.1775338519619086
- -0.01473339359956204
- 0.1495908131907566
- 0.6746854718412869
- -0.0901262206339789
- 0.1370647022270746
- -0.4456022646206545
- -0.09722113324201812
- -0.6545926777777892
- 0.163677723514819
- -0.0587339326604285
- 0.5543693527837558
- 0.4353403263900784
- 0.5271708111732047
- 0.01003765855487058
- 0.1071942561920385
- 0.3096140164305524
- 0.3841871459387871
- -0.09583582922239864
- 0.01559603339907481
- -0.3155942273850432
- 0.09957052658816262
- -0.1328321173322763
- 0.3564622545695095
- 0.6085146381009029
- 0.5867399596143027
- -0.02250972884758025
- -0.4763015329738412
- 0.1363186111626235
- -0.2266561576288394
- 0.06372520143932857
- -0.2334396842365647
- -0.3265031596549025
- -0.5225730768617836
- -0.2794768981321148
- -0.3806046580723788
- -0.2709384658505899
- -0.3745368673442807
- -0.4919386695331785
- 0.1155843211204948
- 0.9277339631772524
- -0.8220383796531052
- 0.4677961095284494
- 0.1012249285417283
- -0.5689958029104534
- 0.3486579083308017
- 0.3536085222332953
- 0.327297536819787
- -0.3524532775029237
- 0.2478060497053853
- -0.167875376600675
- 0.4683052857569047
- 0.04845777005968554
- 0.151462095439388
- -0.2954444421277257
- -0.1202327210119957
- 0.2654746711195042
- -0.468234794883329
- 0.3119278052564229
- 0.6273311313018934
- 0.2530745559027924
- -0.06309058374995485
- 0.4189488387699707
- -0.4732279941849034
- 0.2094095552707933
- -0.4025186655027134
- -0.1659355510438331
- -0.3177972199941017
- -0.2481462321985213
- 0.006592088157052001
- 0.268780447633735
- -0.2073683427305351
- -0.2106105744749099
- -0.4509560351939277
- 0.1834184809985726
- -0.7661370276962249
- -0.07903346079921088
- 0.04676248215594855
- 0.1237008920290094
- -0.0126499125481814
- -0.05835220431205906
- -0.1588734042816966
- -0.3299073260347327
- 0.08167118119376097
- 0.2478343554039025
- -0.1452099065062266
- 0.1326568406926738
- 0.3491255078998559
- -0.3934174673339707
- -0.5960640115453083
- -0.7910878843462008
- -0.3020982053926454
- -0.8838714860757471
- 0.06568719607260053
- 0.3369431365777982
- -0.2198210057155472
- 0.02881191399440781
- -0.1501821522283808
- 0.9675637896490875
- 0.1967637389689453
- 0.3815388218291317
- -0.2548597206712573
- -0.0560737578407515
- 0.2869704311115486
- -0.2854761498665436
- -0.5950011402363669
- 0.1513743013486433
- -0.009470931824429152
- -0.1739807982033399
- -0.1466233207008622
- 0.5357347876397437
- 0.3074301522098216
- 0.1270808780145465
- -0.3704049340693402
- -0.07042455885511463
- 0.0405713279179636
- -0.3815384053212412
- -0.2997819510430044
- -0.1114667378498817
- 0.7258062829153872
- 0.8700940416597699
- 0.03826930388024562
- -0.1790194202449966
- -0.3616556505927438
- -0.6152504762514582
- -0.2677397580547463
- 0.01079977629521155
- 0.07883747390706719
- -0.3624426716699543
- -0.1527248418632322
- -0.03702200314495983
- -0.08732007815655742
- -0.2271404016758612
- -0.1883027115152028
- 0.3416053441977727
- 0.06418830949057062
- -0.1998428761163998
- 0.1306830477324872
- 0.1391202979596478
- 0.4529091731012134
- -0.1446157003666682
- 0.4358962341170605
- 0.08644203357368854
- -0.08867530401801563
- -0.5120811340035706
- 0.2381130654095968
- 0.182322993378588
- 0.05348965071702647
- 0.1170819346874089
- 0.08019216083419001
- 0.07552243569663072
- -0.0684438818084938
- 0.8236200014683633
- -0.1678402216367604
- -0.04058297968371218
- -0.2326005508457137
- -0.3000381837143903
- -0.6188481131311174
- -0.3212977529986542
- 0.3054848536615199
- 0.02003101442925876
- -0.003896575842105588
- 1.191761661333273
- 0.3339563486035031
- -0.2411313538627305
- -0.1368102385058602
- 0.2099639721724371
- 0.3302646100890316
- 0.279735322187841
- 0.1572125831554773
- 0.1621614227576263
- 0.1361991186281638
- -0.2350784094731422
- -0.2718929744151896
- -0.04033994923534494
- 0.1344402640829349
- 0.08336221947186542
- 0.632881462354837
- -0.008140666772563247
- 0.1272758672873934
- 0.196510462374386
- -0.298640402793001
- 0.1041277340782838
- 0.5678023283084099
- 0.8473197976328795
- 0.006957767088195686
- 0.09493592588800308
- 0.207316106352868
- 0.1114048869767513
- -0.562370393977032
- 0.4970552468469591
- -0.1555858172176586
- 1.338651333090117
- 0.003053498157229314
- 0.1928128576865458
- -0.2186155105026712
- -0.3556388494918716
- 0.02312630631403897
- -0.2670535650055857
- -0.5414662108847647
- 0.01424970636943131
- 0.2005908144610585
- -0.4205355698145358
- -0.1858662228644941
- -0.4665512175475525
- -0.03506163734660313
- 0.2307098331622904
- 0.004312729534306625
- 0.2707557794007244
- -0.4447926297528495
- 0.9127134278553473
- -0.2995522399174017
- 0.1735995315903607
- 0.4425718024777047
- 0.4639329917160108
- 0.08637960391492526
- 1.264868773671721
- 0.4464640301029854
- 0.007233381035124405
- 0.859917942528008
- 0.8262969742469247
- 0.04341658666399524
- 0.8330641227804799
- 0.909348690733269
- 0.9999538158809214
- 0.1665464753088647
- 0.9694422871445725
- 0.3922478417557296
- -1.781448255057624
- 0.03635886860908773
- 0.8076620929999465
- 0.8339334756445123
- 0.3860128823332295
- 0.6653047893610314
- 0.9185296346976854
- 0.6649787949751917
- 0.7825902558010049
- 0.2837037127269504
- -0.3747990077395175
- 0.4214443559395317
- -1.019361892775693
- 0.9171977008345442
- 0.4222361559174124
- 0.88407023912625
- 0.627550531980175
- 0.3566140855934134
- -0.03223197651486596
- 0.4444754817930365
- 0.7198529871401895
- 0.769543155492363
- 0.4522789066520774
- 0.1552051873408984
- 1.087046685118705
- 0.7110449593763254
- 0.8551578745013462
- 0.4445553463014242
- 0.6336985233194055
- -8.666585533623437e-05
- 0.7481389904150876
- 0.6099165356679989
- 0.8441275807205756
- 0.6746478056933407
- 0.7710196583450366
- 0.6015009959469434
- -0.02078264166128433
- 0.9139622734605635
- 0.03649114793601069
- 1.081362510467778
- 1.294925438224664
- 1.364399995326488
- 0.470971101873399
- 0.7400190105755877
- 0.5699287605581952
- 1.004010254105531
- 0.3370758327320168
- 0.6131293665130263
- 1.066506465129122
- 0.75007755748098
- 0.2092889950274849
- 1.188379584369206
- 0.3927020524332166
- 0.8976178226409594
- 0.253591376201034
- 0.4788474086715514
- 0.5846703904079941
- 0.7458621662241995
- 0.9803193405410499
- 0.1373088202715007
- 0.7124319998825741
- 0.001392091297370719
- 0.005439118590977577
- 0.262311652226433
- -0.1294387395986635
- 0.4247535343006393
- 0.4684777559177688
- 0.7152179782510809
- 1.122769290452707
- -0.556571539027084
- 0.7158780094478909
- 0.4802045073119096
- -0.4895153647051178
- 0.7811319855474181
- 0.9588152497290688
- 0.4196819710368834
- 0.4150388135584117
- 0.6482857515970342
- 0.6148584162460666
- 0.7321927360436169
- 0.06685955368278976
- 0.5237996850885736
- 0.5458979798565589
- 0.6853456078499774
- 0.6057305714252021
- 0.7063432420794981
- 0.4090613901948583
- 0.9384325755638672
- 1.422475224972518
- 0.7340220696204048
- 0.3974070122287193
- 0.4291073097870783
- 1.005825244363131
- 0.3983200619644611
- 0.5215660680357879
- 0.1392856995086938
- 0.5911512297254349
- 0.6914181916293677
- 0.6381864477415636
- 0.05556341432556314
- 0.7827245647227641
- -0.4785100388053652
- 0.2664119832167832
- 0.6996726492098401
- -0.1791803178514642
- 0.7268684014643656
- 0.6467564449413579
- 0.7068816095330724
- 0.2160304367590288
- 0.1248403590807845
- -0.01822133643607303
- 0.8960340501583953
- 0.8322632672202777
- 0.7877349704122448
- 0.6127608453581013
- 0.9125600228691853
- 0.06050065398089624
- -0.5814533023644182
- -0.3861156330785092
- 0.7708663019767132
- 0.1414340489287589
- 0.5450846421816883
- 1.038949892081503
- 0.4174288596040157
- 0.6038789998183522
- 0.8250064010704237
- 1.11633891363245
- 0.6408815696753317
- 0.9088580805829342
- 0.7197199404882286
- 0.1852800172254349
- 0.7500042345480682
- 0.6006719336512956
- -0.1501357023317271
- 0.394046806730308
- 0.5674422352507514
- 0.1304522816363141
- 0.5481581118181026
- 0.6648882198575188
- 0.4502490682344322
- 0.4188941087144956
- -0.008164313196871244
- 0.4794370562070326
- 0.7040197300011987
- 0.1877608974045845
- 0.1910932773547232
- 0.7258251041884094
- 1.338647325753172
- 1.3061328441664
- 0.6580938987572295
- 0.3064888139023139
- -0.1279381299652183
- -0.1440544070168745
- 0.6855176548603273
- 0.8451296607375113
- 0.6977692058261843
- 0.3177587836652486
- 0.6277976642860534
- 0.6384007278203387
- 0.1512017510970298
- 0.1909791050629819
- 0.3696613702906053
- 0.5423921235811779
- 0.8189746404472315
- 0.1927059080312683
- 1.122373108673155
- 1.100572668977905
- 1.091448881157351
- 0.3864913664206477
- 1.29530959251389
- 0.8166113995733907
- 0.7601671784301625
- -0.2943511055448276
- 0.4917982436421829
- 0.6232040439503094
- 0.8468610412307204
- -0.05076225304297343
- 0.4823821786251634
- 0.9086852725808422
- 0.7046377387435105
- 1.242050893449605
- -0.7175982302830722
- 0.7622778304151561
- 0.1487060867832971
- 0.6084926229448413
- -0.2617814820307586
- 0.6290740543293295
- 0.2531324541004852
- 0.09820565686203631
- 1.193013779567532
- 1.494944274248078
- 0.2742953038453484
- 0.1402216542798266
- 0.3435783831149599
- 0.618862358885921
- 0.9138941426379912
- 0.7181690558115195
- 0.4396937723365966
- 0.4221474844300872
- 0.9678478824954682
- 0.1621521255176283
- 0.5450861789392766
- 1.068244577362342
- 0.489124356812478
- 0.330030433503413
- 0.8970494954352911
- 0.5013533174532329
- 0.309797772279065
- 0.6738041032434924
- 0.6227668595077965
- 0.5713027065599533
- 0.684893885478556
- 1.668225806816082
- 0.6859151920623758
- 0.8158011224900357
- 1.024473169971108
- 0.5605174526484484
- -0.7576389300488497
- 0.9096875215211347
- 0.6175767372236864
- -0.4161537577909997
- 0.5088495346896563
- 0.5476722851792211
- 0.6339601342061658
- -0.006306045422751316
- 0.5799397740036482
- 0.4713993384867219
- -0.083403128637816
- 0.4313779446126474
- 0.6510757062085264
- -0.3388413420791607
- 0.2626113689451582
- -0.3569649977516132
- 0.50820676068601
- 0.8229394466911507
- 0.4958243200831756
- 1.234369408535352
- 0.09407623276619048
- 0.16842663485555
- 0.2002091519936368
- -0.07338891003129742
- 0.03331177114379679
- 0.06963817063415607
- -0.05666121342626853
- 0.08655782188589418
- -0.01629413987509927
- -0.0332371260118988
- -0.02941861722641498
- 0.01738958082197578
- 0.1508821012348263
- -0.051592030018763
- 0.2067810222519689
- 0.05302820677562026
- 0.01475648246371792
- 0.03010009527862536
- -0.1648663516653107
- 0.0986444033843535
- 0.02027653632157885
- -0.05078959067312729
- 0.04004260342727669
- -0.2910429917514142
- 0.009850227406214163
- 0.1586227363125275
- -0.08533163081359228
- 0.1673847065407495
- -0.0917935042165738
- 0.1496801847004745
- 0.05771147395976754
- 0.0631735402019261
- 0.02467558167012938
- 0.1587463118517278
- -0.03870559009042487
- 0.05765655119519951
- -0.05502951990483894
- -0.3012790946012868
- -0.1039280495160258
- 0.1063983049323238
- 0.1299338848245758
- -0.003281233343411412
- -0.06988172596811287
- 0.02815284661452942
- 0.0654020521108339
- 0.226333928109976
- -0.8343562552992259
- -0.0002100803877835796
- 0.02684384062962547
- -0.1219953203155064
- 0.06685253359104405
- 0.1429352102978557
- -0.005442904517195468
- -0.09786802994119191
- 0.1052384838435717
- -0.03206215886241107
- 0.2012229204149918
- 0.07186077200532717
- -0.05932874527873284
- -0.04265924879392123
- -0.005029992987120322
- 0.1776225785436245
- 0.03883419764649802
- 0.08355110602415086
- 0.05911197404941929
- 0.02744318552902593
- 0.03314821072530822
- -0.1156332194681546
- -0.07758888949702572
- -0.1623300604236726
- 0.0005639166436980795
- -0.09556544175099256
- 0.194410794896442
- 0.1358244714355086
- -0.01425257479015681
- 0.09425253927267592
- -0.07385767853002158
- -0.3628988036168848
- -0.2146645370879713
- -0.0401558831442899
- 0.2023585303653781
- -0.09606575710809313
- 0.04378813468096158
- -0.02788479011315963
- 0.3519728163930858
- -0.0001313508494149237
- 0.008423859760551206
- -0.268183675166824
- 0.2300554358278003
- 0.001880330496123822
- -0.1476457270882015
- 0.01403761966618388
- -0.0630537502894067
- -0.2041918066761578
- -0.04062467047844028
- -0.1682476818663452
- -0.1031124765729317
- 0.02918936363321958
- 0.05452945343404456
- -0.1460370674413418
- 0.01368646691490838
- -0.1899527644748964
- -0.01702910558237531
- -0.1713812863587018
- 0.07653604731612897
- -0.06494812002629886
- 0.01790638988306824
- -0.163161299634012
- 0.4186091936942767
- 0.03277851788802352
- -0.2322537030083748
- 0.1982227211646411
- -0.2272728848992447
- -0.03318808364409243
- 0.297722163180038
- 0.1312673666716315
- 0.02707837278671361
- -0.1045740404142386
- 0.06787272474274135
- -0.0177580833569292
- -0.05490839383191812
- 0.1308294886719442
- -0.2207755143605773
- -0.1089692820110456
- 0.04825438989315921
- 0.09779390536555653
- -0.159821320130119
- -0.1159093358272197
- 0.05504310471972555
- -0.04369590214089984
- 0.07073691346077766
- -0.2665016984645774
- 0.02388628555373233
- -0.1331219373728809
- -0.1315555893633195
- -0.06908019445383771
- 0.2312935793190567
- -0.08531872120563737
- 0.02223642415897086
- 0.001315907955975409
- -0.003219648225799025
- 0.1870041029706274
- 0.1245742096237773
- 0.007212315883091193
- 0.2933352247807992
- -0.1566204420992092
- -0.08010624272851696
- 0.1786967634108413
- -0.1574906964543311
- 0.1441132851146465
- -0.06408174708644622
- 0.0717139431529894
- 0.03420951895790216
- 0.1331460517005429
- 0.04490175496779899
- -0.1682940088864579
- -0.1606290462842259
- -0.1095605690760876
- 0.0703893083785119
- 0.1301886675064558
- -0.06285998139635339
- 0.1072014485263314
- 0.1864957025207911
- 0.1656476217731681
- -0.03771128064524416
- 0.05275133711277115
- -0.05914498255328498
- -0.2412207759451671
- -0.04341537955952204
- 0.09853843308378572
- 0.08483301958683054
- -0.02168065306972378
- -0.05806995455294194
- -0.1079272844064938
- -0.1402367825155833
- -0.2052195370357991
- -0.1461590008469454
- 0.1674809774632851
- -0.1171866023103899
- 0.1770773086824776
- 0.02092695476785725
- -0.09157510795679843
- 0.08314239556065293
- -0.01217193864140235
- 0.01153770504490583
- 0.3140648343578761
- 0.2396795677341494
- 0.2249844623340858
- -0.244831129540522
- 0.1053719321222459
- 0.09361168043526424
- -0.02266110585285825
- -0.06167914271045204
- -0.03705363258744244
- -0.005263490772896322
- -0.09384491064174344
- 0.03946683821921681
- 0.01845952648647741
- 0.06066962117487223
- -0.02945166347639823
- -0.004223972154107899
- -0.1428458864404036
- -0.08579148420848684
- -0.3255186696508054
- 0.04540112842836656
- -0.05576060017284517
- -0.01384273119247929
- -0.07305402602545237
- -0.100654644786767
- 0.005329844548711019
- 0.02934153184211075
- -0.06984474286547115
- -0.04122717181903108
- 0.03290419475050719
- -0.4133569367044335
- 0.06775182474313729
- 0.1772140735162707
- 0.003248483255291397
- 0.04296208909131485
- 0.3431333654275189
- -0.03871745538008486
- 0.1766783407641636
- 0.0460523110090707
- -0.07520341094887323
- 0.08284553027863532
- 0.1740913079788215
- 0.01809985546751373
- -0.1094076772147493
- -0.03925931024129927
- 0.1017545885000872
- 0.09301126508547274
- 0.01796674827291573
- -0.08422663634004003
- 0.1314579050325454
- 0.009934515128281765
- 0.04736214721307783
- 0.1611831029076925
- 0.07469134378121381
- -0.008688620866355658
- 0.04282709599317566
- 0.1323820885508907
- -0.1107229385527645
- -0.1133368256790011
- -0.0459486059883938
- 0.1114174586694786
- 0.26349350716653
- 0.09818252537678392
- 0.03504037872886116
- -0.1162312971726918
- -0.1591063880725286
- 0.1555748484065873
- -0.154247216803497
- 0.0490591323247089
- 0.0929430548766054
- 0.1178215250516526
- -0.1134350274363533
- 0.07244243910134429
- 0.03998721194228382
- 0.1052494456143171
- -0.04262946624192485
- -0.08725504193066186
- 0.06265232603509548
- -0.1557092102388964
- 0.1753979955966792
- -0.06733339913948581
- 0.08715931476376157
- 0.02948267836490326
- -0.008909144763984772
- 0.1563359655905267
- -0.05026344163091333
- -0.3099416532081774
- -0.02252695372927473
- -0.05322128241114864
- -0.2313971425581751
- -0.1376543196677307
- -0.08065248195315032
- -0.0335594557425421
- -0.1087889341658553
- 0.1941952195731843
- 0.27335991085888
- 0.03174973422505341
- 0.1087183032023318
- -0.07277191334214393
- 0.1455907995382223
- -0.2001838849645602
- 0.03320370387695018
- -0.06197912233764708
- 0.01410195340752804
- 0.01372864142911234
- 0.07664842345475986
- 0.03233615007575832
- 0.04381621891927816
- -0.09361364408696254
- 0.006565063126730873
- -0.02813253533513596
- -0.002449654378479011
- 0.2924301339635104
- 0.1279139857807472
- -0.1502568345185902
- -0.07645015982645979
- 0.09421012372930569
- 0.3553212819567743
- 0.2494348310081459
- 0.0275948225891571
- -0.1435876140693143
- -0.05424799028852052
- 0.2409457651046875
- -0.1426719295706738
- 0.1154469398619241
- -0.05369085059805818
- 0.01897320528268845
- 0.01275747864292193
- 0.003689019913332679
- 0.02827455430048977
- -0.07984699455104921
- -0.06797394061366296
- 0.1212564950450237
- -0.1960618137453715
- -0.09683425857490388
- 0.1625091151723048
- 0.05735260304386951
- 0.0649558780618292
- 0.05393729792221152
- 0.05771647975747233
- 0.112328277324155
- 0.2010842151124908
- 0.1299469560205206
- 0.04705999169372613
- -0.07344074375644771
- 0.1731101441377517
- -0.08521136720832667
- 0.03103926449628581
- -0.2369087256316569
- -0.4057361910769023
- -0.1802663568471768
- -0.06830016428428791
- 0.02065208732647386
- 0.1304358199585746
- 0.009291199244945198
- 0.03131300120451403
- 0.2614638361003256
- 0.05726215855315517
- 0.1008871314671699
- 0.0776934461461917
- 0.2411573591019756
- -0.108961076734261
- -0.03143384627224154
- -0.08869558332854235
- -0.02620386274025086
- -0.1944154308886958
- -0.1464571280866085
- -0.08211537452518618
- -0.04525100538866837
- -0.01480706021524014
- -0.02622405533125793
- -0.03222492058576161
- 0.05531493263417533
- -0.09536230584591553
- -0.2657933462823083
- 0.003511554192852637
- 0.1040045950633752
- -0.0643319807725756
- -0.02456055406858055
- -0.1527368084273734
- 0.2039156838377204
- -0.04614595459571332
- 0.1383953210780827
- 0.15335789427913
- -0.09469437658861783
- -0.06939368529485657
- 0.02259770448006768
- 0.09063562523011133
- -0.03506968044716959
- 0.004689551738990857
- 0.0701692225806361
- 0.1524524551345627
- -0.00887168264725475
- 0.0612795715519656
- -0.1880743639803473
- -0.03419202920347694
- -0.2205024044827757
- 0.04316044181250382
- -0.1860162859585104
- -0.2952115152104636
- -0.08086769540225973
- 0.1271400705169667
- 0.09997258260052364
- -0.1484255014522047
- -0.06001497231748486
- -0.2055772052697093
- -0.06461080274518102
- -0.1154168540652843
- 0.2450778606519572
- -0.09774093966489961
- 0.03361481812357046
- 0.1274484861655066
- 0.04658229224015976
- 0.1682097468429917
- 0.136374068518749
- -0.06650469470777762
- 0.1454777819236287
- -0.0157773352449335
- -0.09863551419750645
- 0.4622932525711828
- 0.04710157842102276
- -0.03443272187990695
- -0.2832439423713189
- 0.1638567961588143
- 0.09442389295231869
- -0.007576265363466159
- -0.2879655869659259
- -0.0743581323142373
- -0.05042343051430474
- -0.1172837493064219
- -0.02559801558175114
- -0.07067220311485925
- 0.1125519225973421
- 0.07585188970971808
- 0.2420419973543043
- 0.179652579607638
- -0.1280025305739423
- 0.06818308740058765
- 0.07556006179131504
- -0.1940808202141242
- 0.04345232351334239
- 0.112443249129403
- 0.0989908603263522
- 0.02088908872875778
- 0.05790370714827859
- -0.01796710156257132
- -0.2792180665172357
- -0.210693400008256
- 0.111017788230398
- -0.0298717163527407
- 0.003758143044481368
- 0.03771808997590925
- -0.07308416037773038
- 0.07385573875491853
- 0.2317103066600028
- 0.04775874399765781
- 0.0008162012429432146
- 0.1167119728324198
- 0.2494491214796501
- 0.03502285208264171
- -0.1993792192288653
- -0.02992864390518694
- -0.03988931355877789
- -0.04845462260168403
- -0.08525205846589816
- 0.06458784740877944
- -0.1457621300482446
- 0.2372288490763193
- 0.2315088860789077
- -0.02906439075567777
- 0.09043893831471891
- 0.06806004901408956
- 0.1773685381359586
- -0.1002895339525629
- -0.1030474940028186
- -0.06685135721556766
- -0.009494480748024404
- -0.08233077107660457
- -0.06795900382431448
- 0.01984187301448656
- 0.1879683707803882
- -0.03264058325964003
- -0.1029122265241363
- -0.02568932697075629
- -0.2521045791709349
- 0.04317657967759692
- -0.05645267796085152
- 0.2238174134328292
- 0.1057869088465305
- -0.1028237655007978
- 0.04697808684187352
- -0.02692511781227247
- 0.07514191727511906
- -0.0325372214288146
- -0.114105831706632
- -0.1332982644144468
- 0.143888682494877
- 0.1923741971777899
- -0.009441879578553006
- -0.05305916645584323
- 0.3655496397624907
- -0.1047726696649691
- 0.09839744252839218
- 0.146262029875463
- 0.04783809674776492
- -0.05961764261014981
- -0.2303543547302474
- 0.1239376438255468
- 0.0902998117749161
- 0.1882512706033346
- -0.06098355383884435
- 0.03492676899891604
- -0.1279398887896151
- 0.07494299689706893
- -0.06867091735070924
- -0.1011853585030417
- 0.002110145973569824
- 0.1122651892907851
- 0.2245176403570509
- -0.06151859448723768
- -0.1905807695250177
- -0.1042842346187136
- -0.06993332850885071
- 0.04984860043000781
- 0.04047400265423855
- -0.01068933422058112
- 0.04823808865646682
- -0.1243800732412288
- 0.2316511829482659
- -0.008037639587616455
- -0.1778516712913076
- -0.2052946682411498
- -0.1687083974501712
- 0.03459655001895804
- -0.006630064203240225
- 0.1006584019709
- -0.04244122159478375
- 0.08159497935877594
- -0.01266493479379308
- -0.0288792121905993
- 0.1682379198614404
- 0.008728001158971396
- -0.1555792526281528
- 0.1635304848911861
- 0.01630985404599713
- -0.05296878016437333
- -0.01537197781945606
- -0.1207389398644774
- 0.09168035008466739
- 0.2925462203322529
- -0.1598920960179509
- 0.1746087338012031
- -0.04144942997718663
- 0.02055106366848109
- -0.04187894692093149
- -0.1177700554574433
- -0.067864386769004
- 0.04982664374529477
- -0.03477383810396281
- -0.1026457900365856
- 0.02389394304207002
- 0.1574495591570526
- 0.09739512718297694
- 0.1106261083233014
- 0.00801404846251458
- 0.1613322442360942
- 0.08616735645223149
- 0.1859789764165273
- 0.2474742546739467
- 0.06291682520729272
- -0.2030437971549434
- -0.05382540471511167
- -0.03812255457064273
- -0.02457863077762059
- 0.1781307308649321
- -0.01237139654450955
- -0.00114844506680325
- -0.1298759640158143
- 0.05817115711263673
- -0.3530874584580207
- 0.1136046931567839
- 0.03309808390053976
- 0.08131867939377826
- 0.1831587802279089
- -0.2034076083246985
- 0.04731554699004937
- -0.02775319654121298
- -0.1410403927210198
- 0.06762738875729439
- -0.1061971942924593
- -0.05350723567508586
- 0.07649038651118326
- 0.08921996521851855
- 0.04791840793953057
- 0.2480402245018685
- 0.06247923214066559
- 0.1280832419886825
- 0.1330282338987272
- 0.06854235337126194
- -0.03975494973853664
- 0.02402641448972406
- 0.145413219878447
- -0.00350099405653656
- -0.09810997341003236
- -0.1500518919795678
- -0.275020134408748
- -0.07505396684635902
- -0.1457041606386233
- -0.3393187166056383
- 0.1331571973328037
- -0.110283055446299
- -0.02562766355709294
- -0.0558913701239514
- -0.0540756304549689
- 0.02139833868657917
- 0.2205169077130332
- -0.04415656578896279
- -0.1615604785746199
- 0.03657934722427986
- -0.09425250958089726
- -0.02845521308420071
- -0.08266720616518415
- -0.2489411019473962
- 0.01551150807894458
- -0.1277766426254786
- -0.1691337461890193
- -0.09273232958486907
- 0.0845434590416053
- -0.0817751520007895
- 0.04361955426464188
- -0.262435290409621
- 0.1442086180490096
- 0.07815467566285009
- -0.2562333574160348
- -0.2275846595756743
- 0.1486191045161695
- 0.2855672884338436
- -0.1398290720386017
- 0.1731883617890136
- 0.009957407779010814
- -0.09448514311850834
- -0.1593999127820855
- -0.03854423723202845
- 0.2118057062761691
- 0.01930063332334164
- 0.1506572182847392
- 0.2308755807189392
- 0.1442402790078226
- 0.0530624584100496
- 0.04252502304683763
- -0.1317695271211297
- -0.05924126515106762
- -0.1097744994715752
- 0.004630728843213914
- -0.106197543538807
- -0.0998591148670562
- -0.1604477184855824
- 0.2646560396434452
- 0.1480768751094904
- -0.05162166226015313
- 0.02309799163797649
- -0.2814022399810224
- -0.02969994659345677
- -0.1395323233630525
- -0.268298986889466
- 0.4146699577137405
- 0.1014612430879724
- 0.1821610284707323
- -0.03092092842970402
- 0.07234289713535821
- -0.01041232905007928
- -0.1474829460290751
- 0.03362189986808967
- 0.03201243006072946
- -0.06957364486403016
- 0.0899445395012064
- 0.1935554792783035
- -0.1199422743478855
- -0.06353686911752858
- 0.1364805514280732
- 0.05643413420523858
- 0.03690107874732951
- -0.3773551167868887
- 0.05649944329596363
- -0.07684561102210888
- 0.04350290182599659
- -0.07919882384150727
- -0.2039564331696269
- 0.05629593168269784
- -0.0298110525392648
- 0.1717338301460992
- -0.01785708941003036
- -0.2024444721638224
- -0.07202577012263808
- 0.07234709133240455
- 0.06584590085102029
- -0.1078776389011856
- 0.1029176823718753
- 0.06760606622634731
- 0.05016141636702857
- -0.00339974708292407
- -0.03646702814256569
- -0.04890538611847352
- -0.009125287635034774
- 0.05146855159228438
- -0.1333717654033707
- 0.08210873107533997
- 0.29076471220691
- -0.2153016200718147
- -0.0584331067687738
- 0.1027377358039736
- 0.05707947341335337
- 0.1667090660184277
- 0.1976291448841175
- 0.02705729925436348
- 0.01796950700497731
- 0.06239382005319734
- -0.05082587991023677
- 0.09761408457778654
- -0.08940644377316814
- -0.06202291503023948
- -0.07776493497605269
- -0.1336187903269319
- -0.3230132731727937
- 0.2026037072666919
- 0.06478741284224945
- -0.007670666588370619
- 0.02412129735770062
- 0.1549891824772819
- -0.02400206066288015
- -0.02870356578221772
- 0.2000413014906103
- 0.08609323070443986
- -0.1638678325480539
- 0.01214314996945172
- 0.07249614106737805
- 0.1439697415499205
- -0.01725091313445289
- -0.1469376673305392
- 0.02595477068778226
- 0.0656249719102938
- 0.08198805995748196
- 0.134772323868445
- 0.01101929296878628
- 0.002542188397544281
- -0.08349254207437565
- 0.1639297528158151
- -0.3768610749072907
- 0.1193802020527624
- -0.7697569130806157
- -0.2212924141519562
- -0.1681963510971431
- -0.3145464746558496
- 0.06697730222334126
- -0.03112173839743644
- 0.02307491489955696
- 0.1779478861056873
- -0.1247043537880247
- 0.1007967404580479
- 0.2357077424255827
- 0.06232940371195738
- -0.2778913971415855
- -0.2392497454953789
- 0.08819940141049225
- 0.03000924825976448
- 0.332884041643997
- -0.1303595676940465
- 0.03196268480698171
- -0.1167470328550719
- 0.1892232447370581
- -0.09112310014241388
- 0.1042936618050788
- -0.2723908567928376
- -0.007807977398082571
- 0.2543584458207669
- 0.04754557711456058
- -0.02702586450417269
- -0.11247871762982
- -0.09908603805634476
- 0.1788009668591205
- -0.1479500846715779
- -0.1273106699193646
- 0.01493238263591523
- 0.006088374554609633
- 0.20848851010708
- 0.02960787768672649
- -0.1871474654099734
- -0.09261442327916931
- 0.112615633171938
- -0.0477977622372065
- -0.06855526883756495
- 0.09516219703305855
- -0.03771138000669634
- 0.06536359649796689
- -0.213911711083961
- -0.0184447990250914
- -0.1661792336858582
- 0.02508859994982515
- 0.1692517069104558
- 0.2603517069755765
- -0.1611989560822039
- -0.1185667809432909
- 0.08500005984630972
- -0.1794990547496751
- 0.1082623427790162
- 0.2439491750351128
- 0.1222696381705514
- 0.1972043484281278
- -0.1028242609241676
- -0.01791131640789705
- 0.09985342344774374
- -0.2370203511062225
- 0.1084863755220742
- 0.1243641419869446
- 0.004428783435230674
- 0.1166853829263854
- 0.0006417599748490489
- 0.07671629582011849
- 0.3423576057170364
- -0.1286038917737745
- 0.01098050492101829
- 0.1378661619571264
- 0.03998660684459197
- -0.01005031263122967
- 0.1086828262986002
- -0.01727507920194267
- -0.06986219185448164
- -0.01427371425125049
- 0.0885045711825615
- 0.009883819379971704
- 0.1894430080463225
- 0.03484655823368423
- 0.214884581387276
- -0.07130934093027447
- -0.04340437887562161
- -0.2022571389717478
- -0.02501150279020167
- -0.01278745513540494
- 0.06716704213823628
- 0.1851014372250321
- -0.194051534415858
- 0.1788158973775606
- 0.03188963064137908
- -0.08253812956052718
- -0.06170568993328969
- -0.05737790184588787
- 0.03885178012826314
- -0.01354704450405351
- -0.05551526757755507
- 0.0007761519328859751
- 0.2757262930258098
- 0.1703222680758462
- 0.03583533982022052
- -0.1184735909773455
- -0.2484053745821439
- -0.08398857949189971
- 0.1018498084782536
- 0.06636905895411564
- 0.1124592143743815
- -0.1347358818391486
- 0.1518183767349677
- -0.03562442174682971
- 0.08418917643700233
- -0.02920869049669517
- -0.1745529973124222
- 0.1037633610308533
- -0.06235644863091044
- -0.01196390537163998
- 0.2731464249223822
- -0.03804965905807817
- -0.06399023174599729
- 0.03547330035402781
- -0.01804496861815282
- -0.1024977563933929
- -0.04501010768300148
- -0.04910453547920961
- -0.01728294054364678
- 0.1572386315096017
- -0.06734885497082059
- 0.1443934100694797
- -0.1436615543943069
- -0.09466828377217448
- -0.004330153042636131
- 0.1913010148017029
- -0.1368754415116969
- -0.00208609509175319
- -0.1312275937571549
- 0.07444739943629684
- -0.2329053404501217
- -0.2353707836953204
- -0.4670382295590909
- 0.1676718329911781
- 0.1256197734101599
- -0.1527130733158328
- 0.1394342797512396
- 0.005729875436846226
- 0.007173844000127672
- -0.03541315470374997
- 0.147206034049565
- 0.272633085022892
- 0.01253635783119945
- 0.08281616319501042
- 0.117315213179572
- 0.106769320571199
- 0.07978772367351653
- -0.05038937449415107
- 0.0364650804498464
- -0.03399044141345221
- 0.008989999415654336
- -0.06135875114513663
- 0.03701824757004867
- 0.08834510093795316
- -0.1278252370645362
- 0.1574450128407891
- 0.1655971666411339
- 0.01154446735174964
- 0.02891216529006158
- -0.1510320590519443
- 0.05204112594114344
- -0.07593744680166088
- -0.4138633883342974
- 0.2971610789853015
- 0.1032389457227845
- 0.042722708165842
- -0.07398693402250441
- 0.04680673326062725
- -0.1550704335285432
- -0.02835355382795042
- 0.001013562389351253
- -0.03415613998520712
- 0.1035506496875199
- 0.009702094458653499
- -0.03053279813549682
- 0.01911176807061997
- 0.2017057983970884
- 0.1156356413096757
- -0.1595455041757185
- 0.09890136233921518
- -0.1778554275110646
- -0.001807292015045894
- -0.1906967933769538
- -0.07257211703374573
- -0.06248519921819782
- -0.01249856873485695
- 0.09398110471902847
- -0.02160325627512833
- 0.1245407646495057
- -0.05232644551298546
- -0.1790765773523827
- -0.01897172327316724
- -0.01962115402213288
- 0.2119706354113583
- -0.151308906841208
- 0.03418825523820215
- 0.1537911475109066
- -0.03595210444858842
- -0.08491740445548025
- 0.0327406120855941
- 0.1256431957379078
- 0.08999861349306743
- 0.08760907484101546
- -0.1039145574117216
- 0.06398995044988803
- 0.4298587134553199
- -0.06102954219851842
- -0.1014616362107472
- 0.07713828412731696
- -0.1444581254181776
- 0.2307687752129999
- 0.2334921997037168
- -0.05998435740010866
- 0.07889161262700368
- 0.003578566114233683
- 0.06149617990064773
- 0.1811831206069739
- 0.08757078068453107
- 0.03400379089270179
- -0.131330229422718
- -0.1777631994598496
- -0.3290570890762421
- -0.02835966373002344
- 0.03524444326120029
- -0.1080349870804105
- -0.01195764247083099
- 0.04683810773614416
- -0.02230029202487139
- 0.1169618632296458
- -0.08851404824049508
- 0.04255511064689352
- -0.1562474583322839
- -0.08122905722240509
- -0.1704179301914067
- 0.08537830096966534
- -0.009797310754328685
- 0.1414731548451054
- 0.04627016369924405
- 0.1377370974472886
- 0.2636392257951558
- -0.2817031995233829
- 0.09831748910435606
- -0.06839020807394663
- 0.1280549372926579
- 0.148760866245911
- 0.01898582240542632
- 0.0933142153584746
- -0.05057622296644462
- -0.2832701052078901
- -0.1028754888172324
- 0.1403578542345698
- -0.1833699674137213
- 0.02141267876055514
- -0.2998055512704632
- -0.06539238256887613
- 0.02530649266748932
- 0.06850147636661247
- -0.001889913437682705
- -0.05283586200400071
- 0.008108253139624917
- 0.08240507879696403
- 0.04560331658201312
- -0.0699857999776398
- 0.1086942793177416
- -0.04494937655217514
- 0.009100631658522327
- -0.07290206367182554
- 0.1438805512608022
- -0.04704044584113247
- -0.1711495592485757
- -0.1122872098904535
- 0.01936821183861987
- 0.06438997344154014
- 0.04255883302612039
- 0.00973666537978766
- 0.04875120868678354
- 0.01188379936070664
- 0.1177921661224317
- 0.1475238640848043
- -0.1295175158050947
- -0.06133022169748133
- 0.2547427913807691
- 0.05325537204173097
- 0.05816878790942419
- 0.07433569920857755
- 0.140841277859727
- 0.08534630320085594
- -0.03993419415585034
- 0.07343852091749987
- 0.1447256254233307
- -0.05922094075484226
- 0.06351622340299432
- -0.2623012473648039
- 0.03452007042708084
- -0.1016908036134709
- -0.001857342774820718
- 0.08004858115146685
- 0.2262818666995441
- -0.06603100555720481
- -0.2053596158294931
- 0.05147830504666341
- -0.1911422727890306
- -0.09706700280155754
- 0.05689820173409721
- 0.4055416755968649
- -0.06045015747968319
- -0.07215582679990599
- 0.09047104314226406
- 0.08792909000318049
- -0.1384239188079479
- -0.07526870151890001
- 0.05430573940157028
- -0.03061862974998544
- 0.1920483112105993
- 0.01361571257424987
- -0.2022986330679549
- 0.08576621131137273
- -0.1006769503700991
- -0.04829909267755558
- 0.07445329021491819
- -0.05785914769218926
- -0.000288026838702963
- -0.06039200903907745
- 0.04740370916698566
- -0.09210572312764646
- -0.008982897615944547
- 0.2089714371613931
- 0.003802995174447648
- 0.1282832576030806
- 0.07085126629284354
- 0.2575779573336598
- -0.003245695368985666
- -0.04645043743831927
- -0.03592711768097116
- -0.01501835018022073
- 0.01222520233100322
- 0.05324069261113746
- -0.007630051770320241
- -0.06519217637440303
- 0.2772122564727599
- 0.05421092793840426
- -0.1795493423378846
- -0.1043030228048571
- -0.2096157493654643
- 0.03161970429654114
- -0.162957657579994
- -0.2029210829360478
- -0.07873777224210178
- 0.01549336902258435
- 0.1195119318163313
- 0.1628895010184224
- -0.2331677475272382
- -0.1179024507595966
- -0.06601264399183283
- 0.01218647724486012
- 0.1246464607113467
- 0.04651012132072902
- -0.09122572593482157
- 0.1304489894385491
- 0.02460312741297827
- 0.1498139448125036
- 0.1294024976467686
- 0.002203916297196569
- 0.01400735487612577
- -0.06904451846888261
- 0.02244753505164843
- -0.1572124025941077
- 0.1379598358264871
- -0.07694981373413404
- 0.001838132802904508
- 0.03666987814968007
- -0.0410467125186896
- 0.06264110288488313
- 0.04978779246132818
- 0.2266903342914401
- 0.1355720700670011
- 0.01580792019937535
- 0.3992858367294341
- -0.01517818093267168
- -0.05642782056978031
- 0.04389038142601238
- 0.2769661938885635
- -0.2094644741193975
- -0.01666146892767501
- -0.05902280139308708
- -0.03686782691408207
- -0.1997312222186776
- -0.09509481309887594
- -0.1845015267858572
- 0.06017821034235248
- 0.0803345684071237
- -0.2231198267850516
- 0.1196152587195683
- 0.0006534887741532187
- 0.0693280567312691
- -0.0999848616946544
- 0.04983856620229732
- 0.1166291413501656
- 0.01231080972420872
- -0.1553107478114333
- 0.05633787454245718
- 0.0131816237445624
- 0.1469588545322484
- 0.004650806424363286
- 0.08171864806490213
- 0.007667240734114789
- -0.2769519987192213
- -0.07068737420795315
- -0.01335151611115145
- 0.07934103151738113
- -0.05277150963284991
- -0.2204514564377206
- 0.06770385071557219
- 0.01349377337296595
- 0.06724870882152342
- -0.07321971693821221
- 0.0689815566096212
- -0.06556822853459073
- -0.3405769780780462
- -0.2079202715642693
- 0.06874620651005929
- 0.1014448664188468
- -0.0899575247326684
- -0.008633996238676197
- -0.1318760825377482
- 0.0537456516068722
- 0.04143429301499196
- 0.05769910880675788
- -0.02517423883738
- -0.0243614922091839
- -0.09878680065472323
- -0.1673317736328157
- 0.06266832909058168
- 0.1621691492551542
- -0.1143393628213833
- -0.05096783041597443
- -0.0329197429046467
- -0.0235137527585709
- -0.152886255965112
- 0.05093560464103159
- 0.0413186428856004
- -0.1118916283589024
- -0.1973663614814243
- -0.04348765532040831
- 0.06031361729075244
- -0.05149962671389304
- -0.1186287422520261
- 0.07882155850965274
- 0.05028301695623184
- 0.1805170097025446
- -0.03834334654557187
- 0.008261548203595932
- 0.1198297017706722
- -0.1208120540244246
- -0.06950348113101155
- 0.1907045386237932
- 0.08165601937573704
- -0.01614123998677435
- 0.117706334185299
- -0.1244341417566289
- 0.03239572909980223
- 0.2268711577146954
- 0.03526082219974716
- -0.05546513529591963
- 0.05958464319749743
- -0.1265909351671086
- 0.09675752816798573
- -0.1207550094341743
- 0.09779956939124441
- 0.08801758535309609
- 0.01280399571287237
- 0.1082388938336093
- 0.03515949888262818
- 0.04812613344167038
- -0.004193939645691374
- 0.08946323725090613
- -0.09631050033452093
- 0.3075350177834638
- -0.06634672135964825
- 0.07925227109529463
- -0.1409078912558518
- 0.05056851836101016
- -0.01700815625902306
- -0.06037943269559536
- 0.09892857925799212
- 0.08207875678191826
- 0.0401805078370504
- -0.04691411048033799
- -0.1662293308415775
- -0.2386409089095987
- 0.1586092106306007
- -0.0204356756327099
- 0.2627466381613962
- -0.1157412604526542
- -0.03923621018256393
- 0.3193006336495912
- -0.01181507447535234
- 0.1254963820836255
- -0.04696239711554804
- 0.2112234161247342
- 0.08163203374064897
- 0.3712691614291372
- 0.2283796358644019
- 0.2420889510666089
- -0.281673795428583
- -0.1389834210322841
- 0.2943637510606202
- -0.1975271758184561
- 0.1195817368993112
- -0.2066886502902928
- 0.1033015872255916
- 0.1029312706874491
- -0.02355045691314823
- -0.03711032362622817
- -0.049928013128906
- 0.0146609823226943
- 0.1068268367986153
- -0.005238915606817294
- -0.04449246861487063
- 0.0739165699188737
- 0.1175015099835593
- -0.0243198957171463
- 0.07690788118031312
- 0.1096078461382219
- 0.05853528842874703
- -0.1919779200916936
- -0.05562009028453184
- -0.03235072832237598
- -0.09081991578068289
- 0.1105893907789839
- 0.00280376974543959
- -0.07294169392772441
- 0.0593325025186879
- -0.0829750906869218
- 0.2424132404060261
- -0.04390007976447648
- -0.0873205133527018
- 0.1913256250076217
- -0.05789972447599219
- 0.1191838521977546
- 0.07900534964962966
- 0.1129964413566027
- 0.03845314612416371
- -0.01317128353652406
- -0.02754672704586516
- 0.04604311801172246
- -0.02687915964511522
- 0.1191444452592128
- -0.2392759431145069
- 0.01014355816765817
- 0.0580615715529177
- 0.0914704018910612
- -0.008884776013316038
- -0.04174903019054066
- 0.14955696141056
- 0.1336423278175688
- 0.02123406414716683
- -0.1375520801272396
- -0.1887516837003186
- 0.05191888771528524
- 0.2925449608997491
- 0.03245073533332654
- 0.02192667445428681
- 0.1404058648788435
- -0.02028972204692782
- -0.04913767326933603
- -0.002364782444934244
- 0.00965292158421107
- -0.04144962060783889
- 0.09228770761422608
- 0.04112390328947663
- -0.3967713971507376
- -0.03255896326177396
- -0.09554414475173044
- -0.05747590975060092
- -0.05546432616814327
- -0.000166187772064942
- 0.1062606880514689
- -0.01455756280987187
- 0.08262341961431828
- -0.219871104445319
- 0.03597020818609064
- 0.2315650637310843
- -0.03958668798802647
- 0.07855633440888411
- 0.1030849307433538
- 0.006127776655955027
- -0.03728892565704994
- -0.07241346010985282
- -0.08780590558102311
- -0.01740091800666538
- 0.06585768438947309
- -0.06094450606352605
- -0.09395148275873738
- 0.1026817079466833
- 0.1932802332254911
- 0.162764433792275
- -0.01324235558117182
- -0.2206420718282719
- 0.009920626486896266
- 0.006057614362890605
- -0.1411360490903299
- -0.2164550302726913
- -0.06939873057915501
- -0.498731101783119
- -0.00385814543924401
- 0.2153053789400234
- -0.1669108972524112
- -0.03539562399349915
- -0.1272513348545094
- -0.04215578131798401
- 0.2145207734956126
- 0.1331724101917932
- -0.1098188629910101
- -0.02168924754782288
- -0.1106534730987053
- 0.1085657570585296
- 0.1251350262479071
- 0.05778852887854908
- -0.04742373437661727
- 0.01797717897646522
- 0.01645073086220431
- 0.2664561481422336
- -0.008392111472630187
- -0.04528896930336532
- -0.00216995855390202
- -0.03916490066317626
- 0.02198220012055105
- 0.05555817935154898
- 0.07599306511099609
- 0.1362888427705322
- 0.1554237734967745
- -0.04551202934879932
- 0.1069293564908843
- 0.1180088398692217
- -0.1133149481407102
- 0.08121494920599147
- 0.2646036558026292
- -0.2680881726094901
- -0.1947311428580881
- 0.005697175228141779
- -0.024058085666542
- -0.09151138411650346
- 0.2790377689348492
- 0.00143556469283001
- -0.01545180402031711
- -0.1926163179636097
- -0.07773657840772526
- 0.03577573808018113
- -0.04838235032545117
- 0.03068462739239929
- -0.1387770103835139
- 0.01909701250847535
- 0.01736687926195046
- 0.01883761066448333
- -0.1129357845163832
- 0.09855311989182682
- 0.004589081249278285
- 0.18725128783944
- 0.01550393360272544
- 0.1093913651796013
- 0.02628663360875518
- -0.03829388673206289
- -0.105746267779198
- -0.142118170935968
- 0.05449591018541769
- -0.151018406625868
- -0.153723790640134
- -0.008451157597419039
- 0.08925480787582508
- 0.04699635773247333
- -0.07590012352052174
- 0.06014588467749803
- -0.03237137826702115
- -0.3183451703992329
- 0.0875859134231752
- 0.08964738038496677
- 0.2821280918359231
- 0.005662018097984336
- 0.03056095026899291
- -0.1882400506327246
- -0.08449772351404176
- 0.07991338212418417
- -0.07326873742972478
- -0.1863414254955279
- -0.01319297352559068
- -0.01449668152337194
- -0.1261539684963731
- -0.1883329468916585
- 0.1423233693263666
- -0.08255587111893474
- -0.1141101550114962
- 0.03695196019278594
- -0.04072939643458205
- -0.1816130657213404
- 0.08586036121206912
- 0.05124622044257115
- -0.2251892885789057
- -0.4797212360798791
- -0.05549447976051809
- -0.1733223006890926
- -0.02810359722888719
- 0.04877735500991873
- -0.191666458982011
- 0.05942958732370112
- 0.1671513379397107
- 0.1094287220875946
- 0.1247558320833959
- -0.06563015056961696
- -0.05701115550338574
- -0.03552623205876849
- 0.02987451744304551
- -0.171299712843539
- 0.1255319518586041
- 0.177864398040107
- -0.0907314208486666
- 0.07818614115408005
- -0.02216558399800002
- -0.1202248200307474
- -0.03927548598722567
- -0.06580683250926828
- 0.04584251582050356
- 0.2291711708987619
- -0.2292464328148839
- 0.005712488594544227
- 0.001411987182642534
- 0.1437168015077329
- 0.2207250968630461
- -0.03040152824312825
- -0.09163135049325133
- -0.05553346446533728
- 0.2893526675049227
- -0.04377551385726801
- 0.2571736983640531
- 0.0315288253194958
- 0.07015499073129612
- -0.05599623927470815
- 0.04752956918115923
- 0.1600765040849279
- -0.005855937437852521
- 0.1274030475061361
- 0.1664775049021864
- 0.01529660960014022
- -0.06400075394324004
- 0.02249443258044355
- 0.007313269269809203
- 0.06226120378549171
- -0.06515344424510049
- 0.1568628708771108
- -0.1460478268205407
- 0.003509720329546019
- 0.3147860634711218
- 0.1067427958971875
- -0.01232217623658509
- -0.117080571480174
- 0.1114377531566743
- 0.02986809717666046
- 0.2917139776371681
- 0.1488158375149453
- -0.1020770229650464
- -0.2724511974927713
- -0.06846503524543952
- -0.1216571076104225
- -0.1563323908332596
- 0.2482538139343893
- -0.05330376867448976
- 0.04077766875038313
- 0.1289781526280537
- -0.01950364386916388
- -0.03131871028591678
- -0.02393909763780365
- -0.04003190736139422
- 0.09177588796181167
- -0.03135089689512027
- 0.03817521828212919
- 0.1550290015856702
- 0.1491135104682224
- -0.05776170485294529
- -0.0606283708625731
- 0.02420577837027465
- 0.1096046698416483
- -0.06832501046485764
- -0.06025481187237652
- -0.05713198949008493
- -0.1115617925067333
- 0.01732638989195593
- -0.05138089165158981
- -0.1726948431105822
- 0.1561199121907351
- -0.09347701987379298
- 0.07120136997733857
- -0.04899064095725596
- 0.01018054910601599
- 0.1420625571236766
- -0.02194993127520828
- 0.165452099447372
- -0.01742395167695984
- -0.05992497363119213
- 0.1033815810803336
- -0.05653441988631364
- -0.0388155111464341
- -0.0166015167043805
- 0.0274138125074293
- 0.101805240598185
- -0.07729067099646124
- -0.06188927731361168
- -0.0100185248292066
- 0.03460900093152912
- 0.1226685406386579
- -0.001757099748671331
- -0.08839696288114754
- 0.1588837040266128
- 0.163601062828788
- -0.13826633220042
- -0.08152173912197842
- 0.008506746394785361
- 0.07042556131263193
- -0.1828657545808618
- -0.03848807844263183
- 0.2606417611079284
- -0.01265122240910012
- -0.09397630781127818
- -0.09748902091685237
- 0.105866264912152
- 0.01896539015218655
- 0.03727952419280388
- 0.1356579535941467
- -0.2376481909952
- -0.002655511764697968
- -0.1743034157769036
- -0.03230914849792802
- -0.04919283048200387
- 0.04992690302660464
- -0.1289717379605334
- 0.00102616320028599
- 0.03478821231647943
- -0.1769792199015237
- 0.05763456781085124
- -0.03671818539191991
- 0.1008802439141509
- 0.1136148027650005
- -0.002567505373993753
- -0.2756069303559292
- -0.158115294759348
- -0.1086499956201196
- 0.002846788351640035
- -0.1189305369308229
- 0.0311792838299531
- -0.2239770597758744
- -0.08231036079318614
- 0.08862385163541975
- 0.131008945252178
- 0.1907787404319429
- 0.2709292772826193
- -0.08307084287653484
- 0.03446911300784438
- 0.01750728010709182
- 0.05835275312271333
- -0.08604719696999655
- 0.05547809569775107
- -0.2553890780051052
- 0.02715648753903925
- 0.1507507653991545
- 0.0519486834894145
- -0.0210808836261286
- 0.03290650143910099
- -0.1270844254729972
- 0.1132300562737093
- 0.04159665516818557
- -0.1948375096323234
- 0.05739364360134825
- 0.04914049978626839
- -0.02422684163367515
- 0.2950433175222979
- 0.1519390042565463
- -0.06276568150556379
- -0.09561077032176436
- -0.0008378532471674976
- -0.1806188062236245
- -0.2420778639017236
- 0.06189512960544813
- -0.03872342988893834
- 0.2508174006510015
- 0.1248760017255552
- -0.1466699934890679
- 0.06194452024505161
- 0.07994076107156113
- 0.1541741990563387
- -0.008523247745018094
- -0.3862841820194676
- 0.06513823835110087
- 0.06359201764578154
- -0.0009936793314582546
- 0.2027632786253278
- -0.0827394422553194
- -0.3187135152576908
- 0.04662790662305236
- -0.01161450013403172
- -0.02961184580446037
- 0.2670706588229759
- 0.05214539555352883
- -0.1203018171547773
- -0.4478927277556519
- 0.1427811915174739
- -0.0009452916897276462
- -0.05958411841878353
- 0.03568905427264147
- 0.1088453123567649
- -0.0868523306888092
- -0.01843269790782425
- 0.02669644607712607
- 0.1368932942382582
- 0.03779970347539997
- 0.02211521663639291
- -0.08950440177402666
- -0.07478127170514788
- 0.07233690342985652
- 0.02634823503006173
- 0.1406981381324208
- -0.2896216362595403
- -0.1121983138388147
- 0.07196330086151316
- -0.1553042879140343
- 0.03637390451718276
- -0.05687159695765016
- 0.06919151073825189
- -0.01805904709167047
- -0.01148728056394477
- 0.1091348561167036
- 0.006320162599893106
- -0.2796085243257688
- 0.04739100273532246
- 0.09121740265040824
- 0.02640660763106167
- 0.1243318128016849
- 0.0678073515026652
- -0.01969988734011586
- -0.1169717251247893
- 0.09389876178033754
- -0.1723059167997276
- -0.03750938125555992
- -0.05872270975314106
- -0.06340521882151837
- -0.1344028859715276
- -0.1588560293136797
- -0.1688707989086347
- -0.1257175256489785
- -0.125088715520732
- 0.2054866846531306
- -0.01506271934864957
- -0.1193881940972365
- 0.006854672134935615
- 0.04752726548117205
- 0.1124313047487734
- -0.2345716043131754
- -0.0966784526190799
- -0.07068464232571015
- 0.01736857233411952
- 0.04488167006610325
- -0.2843837732643927
- 0.10716574280311
- 0.1666004751499099
- 0.2857988321304801
- 0.122947875889353
- -0.08663222981928188
- 0.0212658468879969
- -0.003613203808198238
- -0.09128479640783342
- -0.2531883278119825
- 0.1815634810104498
- 0.08845489272367121
- -0.05233137768136104
- 0.08031762182304369
- -0.2155777146411779
- -0.2564823595474058
- -0.03019130441808567
- -0.1797136818846594
- 0.05377877052887539
- 0.1096448138915206
- -0.1479548314371374
- -0.2690653689962727
- -0.04255533440371613
- 0.07790825620708147
- 0.3199944979618799
- -0.08049724751558474
- 0.139398263929424
- -0.03513301979550565
- 0.1557230323367141
- -0.1043800105403567
- -0.04915709973821722
- 0.1740392832053469
- 0.07850578662337659
- 0.06900135804453329
- 0.1543174396321019
- 0.1913021203470564
- 0.03248262135533719
- 0.1362352004509483
- 0.03820012662259802
- 0.02465376305200654
- -0.07973176671490013
- 0.06660671848250377
- 0.18871219108177
- -0.008093631404408198
- -0.1767246417538758
- 0.00990266015180156
- -0.07132583087173691
- 0.02628871489469766
- -0.01151204088869364
- 0.3209454112733626
- -0.01572949438450685
- -0.1179416333477361
- 0.02767486872290684
- -0.003196235972921697
- -0.2018400719502092
- -0.1443658218393715
- 0.1409700805900654
- -0.1374062844011678
- 0.1566387766450519
- -0.01464142325283152
- -0.09386910081568539
- 0.1940871551473544
- -0.0009229305722659523
- -0.1003453469074656
- 0.08707272424241898
- -0.04084866700580461
- -0.00835848653063914
- 0.1374031742323946
- -0.05941076295697365
- -0.05361274680393424
- 0.06005774690231313
- -0.08728264413619945
- -0.03182871408833136
- 0.07761623662150324
- -0.005465534469940489
- -0.1435986443157352
- 0.2229362210983785
- 0.165694452920798
- -0.09733483826165971
- -0.06192171203911068
- -0.01201138599168869
- -0.241464183207144
- 0.01447397517722392
- -0.1580508339638638
- 0.1239975988161607
- 0.01318763966961383
- -0.02318521075282481
- 0.1253227011275004
- -0.09051730063913441
- 0.1010992941034518
- 0.07236374335157782
- -0.06829558579670918
- 0.08802095769461238
- 0.02222150657255103
- -0.1240027586042427
- -0.1127318578300772
- 0.01058998788801809
- 0.09129799024348864
- 0.08406216402634781
- 0.01469513470310243
- -0.09377037590621057
- -0.02957921396339794
- -0.02224655259628815
- -0.1256856814296717
- 0.0327859115036057
- 0.01735739917724188
- 0.2321654126178073
- -0.05301387703579736
- 0.02086166570938919
- 0.1808990770867712
- -0.01100092518093565
- 0.1254107013013275
- 0.07712432562303929
- -0.1846333616553162
- 0.0354631792700261
- -0.1237949044698444
- 0.267900287597566
- 0.02569258517592024
- -0.04495669809550676
- -0.1168890230323697
- 0.0336975646046045
- 0.02125973110491677
- -0.02677683817964055
- 0.1197209867783265
- -0.0777858807226266
- -0.02425547448365667
- -0.08487292490805882
- 0.06291808994433309
- -0.02204340304934895
- 0.02377435051419018
- -0.1718773573170014
- -0.1011571579988193
- -0.1208029255107849
- -0.1441164927563105
- -0.04633424809550369
- -0.1422415093881239
- 0.2088533311413101
- -0.001853172596141906
- -0.1295936882431212
- -0.1282184353297419
- -0.1794144878161049
- -0.2040305688976426
- 0.1399649813297814
- -0.10764262620441
- 0.0616301297066474
- -0.1474197011387816
- -0.05050426102121119
- 0.1653477333539644
- 0.06068948659719262
- -0.05325459514810765
- 0.1373242105620577
- 0.03880137337106698
- 0.06017715543512947
- 0.06211813928644649
- -0.04191313812532114
- -0.04513341992023757
- 0.01914286643644276
- -0.04438971983871555
- 0.1387577841756764
- 0.05386357276079355
- 0.1042718732060936
- -0.07513626164669096
- 0.1786960028553379
- -0.05637216233733611
- -0.03720214170877462
- -0.1774340291717748
- -0.2549011743869734
- 0.186879844725118
- 0.2833063725183637
- -0.01880086739296004
- 0.1769374720509577
- 0.004564930889063233
- -0.05798972499647807
- -0.2747641741293661
- 0.027553184454707
- 0.2632412184052024
- -0.1095551353914822
- 0.06916048702527024
- 0.03080355376703287
- 0.2165981712802113
- 0.1890893856843088
- -0.08659995312896483
- 0.1069192157133039
- 0.0454950752455283
- 0.14187715557712
- 0.100672848815481
- -0.124773924250272
- -0.05335187514446071
- 0.1547592109188055
- 0.002641240342700039
- 0.1258711227814993
- 0.1206538733123445
- -0.135791533512724
- -0.130918815644207
- -0.05396861570570471
- -0.09140332872931331
- 0.09794058035021644
- 0.1588423831952299
- -0.1616346066767531
- -0.03167509234642521
- 0.2413978277122087
- 0.07297159339659552
- -0.003991980625359775
- -0.01341487228926374
- 0.1968283025420433
- -0.1106224029092038
- -0.02915201476535762
- 0.01299576259906967
- 0.1763479829281023
- 0.02034320445669416
- -0.007975760651902569
- -0.1878436437209434
- -0.0511284052070836
- -0.2054486303338899
- 0.08939311648359854
- 0.1069566349676425
- -0.3163184448636494
- 0.06701973428191561
- 0.01615250637797392
- 0.1795215061720997
- 0.02017711076221559
- -0.3561757064215255
- 0.03738435948083851
- -0.06283102722927891
- 0.1113950871495966
- 0.1520074264787128
- -0.05117322488552872
- -0.5240923053401126
- -0.04551984233766806
- 0.0596401451452126
- -0.2693136769181011
- 0.0703840776719498
- -0.09642522868000397
- 0.03163871728561705
- -0.04684419890810169
- 0.1078803552979049
- 0.01765144204601502
- 0.01842808628453179
- -0.2247013264156105
- -0.1572500241274349
- -0.1543378466013791
- 0.08844108358348482
- -0.2226388530497707
- -0.00802841258335605
- -0.1282277729831008
- 0.06727365881224892
- 0.01015621985250618
- -0.1004970234627534
- 0.102732150328305
- 0.1667404221737363
- 0.1832359281510589
- 0.1395964845806093
- -0.193799724903005
- 0.0191596749759875
- -0.0583700053589912
- -0.04116152622862413
- -0.08204498601953146
- 0.1714138796188239
- 0.1756244579872559
- 0.0390069765786883
- 0.08129445383792273
- -0.05658080254966814
- 0.04682762892287125
- -0.09957164218093659
- -0.05143646723972818
- -0.0480872450150412
- -0.01121554980364516
- -0.05096509640375396
- -0.01891053018629413
- 0.1746410924551564
- -0.1545065355810867
- -0.2141290021524509
- -0.04098056720418834
- -0.09707855006958718
- -0.01746835336172641
- -0.05827000757328446
- -0.06903569742387033
- -0.2576319419162038
- 0.0556139976498211
- 0.01293602538646877
- 0.3203057499851356
- 0.0727244748608836
- 0.2165980582221478
- -0.05750323110572632
- -0.06969582175803714
- -0.03590660607489582
- -0.2687061807209369
- 0.07258616839256866
- 0.2460848343887318
- 0.06489755354914239
- 0.08224910815883786
- 0.03288801465840412
- 0.01926730455644425
- 0.118500161428956
- 0.213596783357284
- -0.1274323690677871
- 0.04630213557499899
- -0.01416508956449309
- 0.1685802397578535
- 0.04117581547460621
- -0.1347008843688866
- -0.1925124798927196
- -0.02819143318336916
- -0.1353145214126829
- 0.01537443611510884
- 0.04182514849884943
- -0.02488285487230305
- -0.07523371621282608
- 0.0456453497418188
- 0.02320659688479692
- -0.09184485017807738
- -0.1021420570691875
- -0.09019704903516369
- -0.1115790792593659
- 0.06726113707953835
- -0.09485300922229126
- 0.08202262147375204
- -0.1951874480726342
- 0.01751795456052687
- -0.1731541700471953
- -0.04642163512287122
- -0.1274507602620129
- 0.02694469481270243
- 0.2510538147171613
- -0.1473392223633127
- -0.2314405061445512
- 0.1459719401193021
- -0.1136173010133768
- 0.006868532856616406
- 0.02400895591422874
- -0.00140889397098312
- 0.07962126481284934
- 0.2570673940922909
- 0.2279872117501605
- 0.01066635433307934
- -0.2524576715800825
- 0.04402546277869483
- -0.1891818569796238
- 0.02491066047065214
- -0.06917415231101073
- 0.05843516739505776
- -0.110344662084734
- -0.004722266458798184
- 0.1407029769762403
- -0.0681792501302895
- 0.0728679211868621
- -0.09338393260688856
- 0.08571355216912344
- -0.2519953195513743
- 0.04142534451424247
- 0.1759653276726652
- -0.1958231103718363
- 0.03723831697901804
- 0.2646310160443111
- 0.1403640832729521
- -0.1018280651378107
- -0.1731322699109423
- -0.05120455192347869
- -0.001620598747993561
- -0.216583888020244
- -0.05044656277776705
- 0.03362227898942541
- 0.256463105846393
- 0.1215738701026295
- -0.005237128515646541
- -0.01022664676506063
- 0.1004277789860339
- 0.07712816122879944
- 0.1078374290208138
- -0.007194865777990773
- 0.1876551699642019
- 0.001667350295852293
- 0.02867937541054041
- 0.04517293409604164
- 0.0937114515641464
- 0.04633236924123863
- -0.1006494697492672
- 0.0003997197461487522
- -0.1220211830864603
- -0.1356895851520392
- -0.08619539425047287
- -0.005520532485616399
- -0.1622350543024395
- 0.1329943913962352
- -0.05133839832939446
- 0.06049281304004884
- -0.1380009534292445
- -0.0307093703266272
- -0.08189895899890301
- -0.09582785752375117
- -0.0133575494018252
- 0.03102839653371089
- 0.1113109805250389
- 0.02820468239319545
- -0.0905428916681274
- -0.05018668575904902
- -0.04851622012133064
- -0.1322551094153764
- 0.03595758536261508
- 0.05241541823993601
- 0.09172724805967761
- -0.06604359102903488
- -0.07165658896802339
- 0.1102900466151579
- -0.04752197349369227
- -0.08734046422401183
- 0.05591510956639406
- 0.006237028274019086
- 0.0857669005057204
- 0.05031680710561896
- -0.1452009830004442
- -0.05728141241003363
- -0.1012379336542239
- -0.1854106056175622
- 0.04013411401239173
- -0.04897801504707037
- -0.0637802936013028
- 0.03357712506802858
- 0.09828752550925135
- -0.07136897380156022
- 0.08090884282108722
- -0.09502012443304242
- -0.01161741856411765
- 0.1226464776813545
- 0.4485759372466924
- -0.05015434808813306
- -0.1744905663010217
- -0.2358783567264802
- 0.1040871860255075
- -0.218228186542194
- 0.05162613366267214
- -0.5825444454694714
- -0.01614290196515434
- 0.07456015276006371
- 0.1418633731961386
- 0.1795583698412907
- 0.03381238488305453
- 0.0641206581459849
- 0.001235302052984547
- -0.006611515360967271
- 0.1564581816138022
- 0.141106710505395
- -0.08431365731908896
- -0.009499002919999685
- 0.04644193436697899
- 0.2307887457874641
- 0.06050815293330995
- 0.1143476769885243
- 0.2110614716643876
- -0.2520013744550498
- -0.1146434935033729
- -0.2128355272346812
- 0.2014480460676106
- 0.09181113139079973
- -0.1056804973878586
- 0.08361396201986253
- 0.2518627168471895
- 0.1044295499804132
- -0.0406760446165754
- -0.07860006405826045
- 0.2528533561426618
- -0.1517541335513065
- -0.1025524098656186
- 0.05673539907367186
- 0.07782671150468863
- 0.001871582368684291
- -0.04449885254367604
- -0.03126683895503429
- -0.1051607436456349
- -0.2244141685950463
- -0.008170682034190205
- 0.03879446505442504
- -0.1628287294733831
- 0.05642526266835852
- -0.06253827842498424
- 0.331488732904181
- 0.001724232810947692
- -0.3905681921687634
- 0.05895642348297336
- -0.1119125616668234
- 0.1662986332997487
- 0.1434946617819624
- -0.07435548186449015
- -0.743880033080766
- -0.02644796415833742
- 0.04367084422748885
- -0.1834752372963459
- -0.02560951051033576
- -0.07631670614634718
- -0.03255868057230467
- -0.1167436877537004
- -0.02272147536737479
- 0.06411591472749349
- -0.01711449495783932
- -0.3044626495788554
- -0.1025855568381658
- -0.006429097263303756
- 0.1276193682095619
- -0.04285743679608941
- 0.1192362093919868
- -0.03412323380836676
- -0.08479576892930732
- 0.05299622364885363
- -0.07586777001477925
- 0.1309517244008993
- 0.05149356145811348
- 0.007873673151187054
- 0.04735582667900365
- -0.1654823590931954
- 0.08008416420393097
- -0.01715419516027902
- -0.007799091890092146
- -0.05088691456518094
- 0.2452605269787489
- 0.1546863842593431
- -0.2897062969332454
- 0.1188305054507049
- -0.07850503665204994
- -0.1006540439965697
- -0.2558986811122662
- 0.01548507621356168
- 0.07329585410572076
- -0.1370082978264821
- 0.1387774740885949
- 0.02955181581980287
- 0.1444144371420732
- 0.001837120217595092
- -0.1578832986296675
- 0.07882715158627783
- 0.1928696950352308
- 0.03224946199772585
- 0.01341000025888617
- -0.09598925318276851
- -0.08435593451679063
- 0.1228162643816339
- 0.008015286774561025
- 0.0228881821998962
- 0.1570899536013809
- 0.1095158523606059
- 0.01446583578714654
- -0.08895128018728235
- -0.001236351104625074
- -0.09216526425223315
- -0.06910048027843081
- 0.1502827463066932
- -0.02645425706844879
- -0.1538238485937606
- -0.09373051983743103
- 0.02993235896387325
- 0.05922767058409489
- 0.1931404783602182
- -0.2580179446158961
- 0.1319803253620105
- -0.0610923011835895
- 0.1136388376870395
- 0.04235085121945019
- 0.02087704833914409
- -0.1097924577012104
- 0.07209542544760648
- -0.08731372091508521
- -0.063858737454594
- -0.1110311004225679
- -0.03257993814386672
- -0.09986316072865788
- -0.05838994288214209
- 0.06026660892265399
- 0.06659362531488025
- -0.03691176136829286
- 0.1723615161788895
- 0.09643056698971313
- 0.06167212184878227
- 0.06048632545906647
- 0.106561067003565
- -0.2359146628019494
- -0.0856503881291492
- -0.099643415633156
- -0.1299553527488587
- -0.1610609809668669
- -0.04330429826958397
- 0.07109263745939573
- 0.09291327612335114
- -0.1843812962021002
- 0.1013587594778311
- -0.03519803794281224
- -0.1078463848683327
- 0.0909954873993804
- 0.02351873163478438
- 0.08716975720936852
- 0.09728441875793437
- 0.1864120685550244
- 0.09595823902078447
- -0.1451589532866548
- 0.01640819868298184
- -0.0561591030940127
- 0.1338230159271746
- -0.01851799790476288
- 0.07011706705491963
- -0.01918525560968478
- -0.08029296938813098
- 0.07278078422728794
- -0.1135486288809505
- 0.02457002483323539
- -0.0596770669792222
- 0.2358769742082185
- -0.2400165177972425
- 0.08009438860952148
- 0.2424825159792996
- -0.008410432856421089
- 0.02011138695890911
- 0.1780224878404248
- 0.1424454598257794
- -0.05871314571253786
- -0.09512264323598589
- 0.1371897600998222
- -0.09056466252358075
- -0.1854181803259646
- -0.2109512305338813
- 0.09803982108185796
- 0.03598251874938754
- -0.04517478104099741
- -0.04854246064512729
- -0.06171789472616177
- 0.07192616766614239
- -0.03708658598751851
- -0.01567456113454775
- 0.03187402259986397
- 0.05677710270208582
- 0.08741110014562621
- -0.2753834455814234
- 0.0402215068984251
- 0.001435929594174574
- -0.03611589497412362
- 0.007823493431096024
- -0.003238811581184531
- -0.2068030895775749
- -0.2594894484833802
- 0.2144522619103169
- -0.1280545220519629
- -0.134423044690689
- 0.0913785824982643
- -0.06794205571613246
- 0.01436313583963213
- -0.06666843135356472
- 0.00838343184753052
- 0.06888419434911967
- 0.2325929290607184
- 0.08681794826751776
- 0.1593828431302552
- -0.0971809489452081
- -0.005808009595889368
- -0.06696428436631012
- 0.03116172093868571
- 0.1198006010171893
- 0.1584776439167764
- -0.03353484654982301
- 0.0926434116160393
- 0.1045065496719981
- 0.06503528577764309
- -0.05100480215807208
- 0.2010842588680187
- -0.0726139584172765
- 0.1975982144772545
- 0.02064828836619831
- 0.1142919992778068
- -0.0463195959649861
- 0.03451511108502742
- -0.08986324087716212
- -0.1767873512546086
- -0.1247911188277607
- -0.1398351533981865
- -0.2721859928562543
- -0.094640776176979
- -0.05921379350247209
- 0.2545959570106689
- -0.1106979387583882
- -0.180340863682782
- 0.1531141947425265
- -0.01814999583861644
- 0.1670941187078815
- -0.1504044341610136
- 0.368068076988876
- -0.1145625107919577
- -0.1011895529635533
- -0.1876994034146107
- 0.2110545262545824
- -0.06033059066490179
- 0.04113581812067183
- 0.2507545279143593
- 0.1255650058849573
- 0.1443145310492009
- 0.1252464690064321
- 0.1293592914089819
- 0.09720477364753313
- 0.1440814100814087
- -0.1511182191743992
- -0.0464273303555949
- -0.03428424282005958
- 0.1791273628939941
- -0.08208633904799664
- 0.04671543365037168
- -0.01056477561293342
- 0.3280100816934571
- 0.06032636234666212
- -0.01359310216640612
- 0.1919570464308755
- -0.0873620119777706
- -0.02203560019350116
- -0.09774582328771275
- 0.1148398538982248
- 0.07421430013508032
- 0.003495306017029558
- -0.2222163726228187
- 0.08997589458793422
- 0.1696783366534761
- -0.1255260657153987
- -0.007072320209895626
- 0.1276347303962281
- 0.1292982787448447
- -0.05208297537677408
- 0.1479841311882314
- 0.04822554642615769
- -0.131141197759718
- 0.03471180741801515
- -0.06440961118901059
- -0.08722003818511585
- -0.1441997814585887
- -0.2274125474961627
- -0.097169489440387
- 0.02773088947569199
- -0.1070466485408921
- 0.06902503587091795
- 0.1311954112343072
- -0.141284481173385
- -0.04546677580696161
- 0.1097978230835506
- -0.08057433169438499
- 0.06757099048783766
- 0.07174731709769074
- -0.02851849012567256
- -0.3757146075638175
- 0.2328719117865827
- -0.01005557396472817
- -0.1243003275634562
- -0.04595478016296822
- -0.044100267647423
- -0.138084140211752
- -0.15511164224655
- -0.2178613785661863
- -0.01691927442642227
- 0.07818793707265874
- -0.1341944968282519
- -0.05851098802706113
- 0.1045252256364899
- -0.0499496819284715
- -0.1902526701601442
- 0.07196166882139192
- 0.004072779842996579
- 0.0160270595289024
- 0.04695225902353219
- -0.04911191224655075
- 0.191892831327582
- -0.1444945058834267
- -0.2202853904366343
- 0.01006205721444285
- -0.09504504271660796
- 0.1401082316439268
- -0.05821947588738329
- 0.01428714349737697
- -0.04498780531374046
- 0.1007395382555364
- 0.09608177306795511
- -0.1427377335384288
- 0.03727287969905327
- -0.1777903785780568
- -0.09485022788467795
- -0.06500052025496814
- 0.09284764092538193
- 0.1299617494659396
- -0.03042087319097689
- 0.1796893932241038
- -0.01073288538730337
- -0.1049688058609258
- 0.02829700538848619
- -0.285330643098704
- 0.1050696416419029
- 0.1765518138946547
- 0.08420673001179661
- 0.06970816483959348
- -0.1530962034710843
- 0.01236764325505881
- 0.07420243094544632
- 0.08905349755618586
- -0.1293428263821592
- -0.0263365993699912
- 0.0004047189157212132
- 0.07588363274246439
- -0.008464820354582242
- 0.02020185026750284
- 0.1244787239784793
- 0.0159723831505977
- -0.1982292587525092
- -0.06697682688310315
- -0.03613463148953804
- -0.1652780548885115
- 0.01438819929671103
- 0.0436618379304702
- 0.02491627491504792
- 0.008404475967987952
- 0.1148907444943133
- 0.0311937852377651
- 0.1303962606770908
- 0.002384966791908356
- 0.02716251179498693
- 0.09946937530571996
- 0.1321520060976324
- -0.05438432657939025
- -0.08340889495867501
- 0.1640467519825544
- -0.09103333261515581
- -0.1638472616753343
- -0.2122019615013457
- 0.103203938253611
- 0.2671611132079018
- -0.01586821097307979
- -0.07537445417268018
- -0.1206608893246473
- 0.2694225111514082
- -0.2159889392117946
- 0.1132074492364467
- -0.1044352839100796
- -0.1527095029381632
- -0.0009496288578566223
- -0.06634437061701783
- -0.1224661849351588
- -0.02970341668303083
- -0.006863288596291386
- 0.1175260476012279
- 0.1070414474675595
- 0.03480914513317275
- 0.2048299438497757
- -0.405880839130927
- 0.06268356595061511
- 0.01874398055316319
- 0.04569425390720752
- 0.09017430723950665
- -0.02460268063576581
- 0.05359884760024468
- 0.1460005901313657
- 0.05197464448943807
- -0.03592257968612141
- 0.31299478823909
- -0.07515948363432123
- 0.121321084016924
- 0.01263599841656247
- -0.14858359150611
- 0.1195877374674842
- -0.198524701721824
- 0.1120248835720462
- -0.04162710216587762
- -0.05290302292867322
- -0.02598187473458077
- 0.07997285485503414
- 0.03011143126414827
- -0.06664724864047192
- 0.04072436580352223
- 0.2088715140920505
- 0.04210225486461003
- 0.07918849123899123
- -0.01107329084409914
- 0.131163883735306
- -0.1444678082212088
- -0.06088597297014842
- -0.0919600166476546
- 0.005007240825029527
- -0.2956838950306138
- -0.05916747318376518
- 0.03896048279150401
- -0.02436983603028851
- 0.001561980004824293
- -0.06762785302309214
- -0.07194296837988168
- -0.05202154642029872
- 0.04532706723082909
- 0.0473193172319981
- -0.3924823907934017
- 0.02590495826419959
- 0.05103234693170136
- -0.06220339572621125
- -0.1128683942228634
- 0.003621463285539008
- -0.125072068400005
- -0.2535233192296045
- 0.2237082094153318
- -0.1238662605915766
- 0.2542353893090576
- -0.1260957503641726
- -0.04981271181918571
- 0.04375474922843847
- 0.01519398152190367
- 0.0924876875703777
- 0.04965081377876439
- 0.3962923002924593
- -0.03785891536828403
- 0.09987244387398275
- -0.2329998276014797
- 0.06861596344868606
- -0.1040800953732826
- -0.003137478320763371
- 0.1707473857482956
- 0.1509218157310757
- -0.06206676290586881
- -0.05765075673333001
- 0.1572077571817325
- 0.01517142860401577
- 0.01466221116289312
- 0.3175028771696407
- -0.020441517847501
- 0.2053511851279294
- -0.09067396104122771
- 0.1236767207071872
- -0.1986350982481705
- 0.06298112666774777
- 0.09385591886792403
- -0.1223713511164094
- -0.1147382813740545
- -0.006883009107352202
- -0.2168789477452491
- 0.0524124558261823
- 0.122901070985294
- 0.3646057870511434
- -0.06174545711317331
- -0.2560780266664009
- 0.09921395672527523
- -0.04178700799421948
- 0.1014635597977281
- -0.1169927589196547
- 0.3439174515523335
- 0.01199432919263614
- 0.1304317568047994
- 0.07617103031021842
- 0.1044847840807115
- -0.03219950718320975
- 0.0233797466830066
- -0.5104169205393798
- 0.1534422146750405
- 0.05325027156780688
- 0.07233797786357865
- 0.03979979991638729
- -0.0605452521243781
- 0.2943625825384965
- -0.02289376076416253
- -0.1454518292546651
- -0.005984339002386861
- 0.2320380109932727
- 0.01385619917191731
- -0.05491483316000891
- 0.05316412751874714
- 0.1291916865339855
- -0.07783323568050116
- 0.01374474890451888
- 0.08150744205473696
- 0.03674178822386485
- 0.1262867643310211
- 0.08388804589784947
- 0.07542899814341333
- 0.05635966174022341
- 0.1209635540242566
- -0.2382066524199452
- 0.01826229900511447
- 0.1312058722121623
- 0.05683785886574295
- 0.03431733966086457
- -0.1660524153169268
- 0.2202586177883086
- 0.1049052258434569
- 0.1142853214472117
- -0.1032444775412538
- -0.0968140206878982
- 0.1508012553582358
- 0.002264266730459902
- -0.007063442686006598
- 0.0090916702830316
- -0.1163386870841841
- -0.07373009327495732
- 0.03975460612836063
- 0.009278149561383859
- 0.1248891694484603
- -0.006270014750222492
- -0.1475526597316988
- 0.09901729400060909
- 0.1341875483226759
- -0.1259743022982773
- 0.05049364963162846
- 0.03708603329314558
- 0.02189707412706336
- 0.2416443444012894
- 0.2759794105981593
- -0.02951365353365954
- -0.05623552805001195
- 0.1714076105551529
- -0.03377215056195945
- -0.179444129915509
- 0.006621483580500045
- -0.1737789320240277
- 0.05809024247178902
- 0.03678901531717126
- 0.2776064805277152
- -0.09322912720286203
- 0.01334347063384463
- -0.1053048191767229
- -0.1604358264324766
- -0.03182783823646951
- 0.2033195668781748
- 0.1951645181678192
- 0.03528997505236636
- 0.1158156322771727
- 0.1134184255768755
- -0.1202015647878645
- -0.1186797026720517
- 0.1227052012633174
- -0.1855643716978661
- 0.06526929159457916
- -0.03972420017418311
- 0.07309256877660195
- -0.02977125684102818
- -0.1960654571418668
- 0.05010541748169863
- -0.02077266288446909
- 0.06825575668544
- -0.1751993227568611
- -0.01174347455288575
- 0.1016835056137998
- -0.1499648279313467
- 0.07675604994186601
- 0.1001469772779631
- 0.01564105129620838
- -0.08274643898747935
- -0.08984432890622834
- -0.3080101233397119
- -0.2155884556106073
- 0.1027420961564515
- -0.0110173254277038
- 0.03635824356612569
- -0.1322111365643562
- -0.1998777470782329
- -0.06383138275761953
- -0.07453898800212505
- 0.1504701447139906
- -0.02809264172900187
- -0.126485832782059
- -0.1156208284452664
- -0.03486958474586161
- 0.004898922209548031
- 0.05571979584879586
- 0.03497499654142802
- -0.04493023236790567
- -0.1265547423786091
- 0.1024300437717925
- 0.01267618383161958
- -0.1192666895571647
- -0.06480075713995874
- -0.001726164340527923
- -0.1743831685117497
- 0.01053318863133042
- 0.04032888011964177
- 0.1266044601787064
- 0.06838639787049788
- -0.08669433632776707
- -0.07699315754319193
- 0.05121379958454336
- 0.177834146977162
- 0.1193533926516111
- -0.1111876785928262
- 0.07363127328126198
- -0.001135007801882461
- -0.2334147050506218
- -0.2859990369490872
- -0.04662617214043142
- 0.04719597246866998
- -0.06423162712809483
- 0.1023702529027177
- -0.05550149057601189
- 0.2693097317610041
- -0.2542442786389534
- 0.05427865635843668
- -0.02289077387644598
- -0.06025298323649893
- -0.1004826230504436
- 0.06629417709563243
- -0.03709967089572237
- -0.0169610744075567
- -0.002088483266166478
- 0.1617962286550673
- 0.2761238829078564
- -0.07327915726179524
- 0.1477834362060406
- -0.5167831382879509
- -0.050516045200913
- -0.01625669977431896
- -0.0659940405649726
- 0.1069896895166956
- -0.167874241219339
- -0.07923803197233062
- 0.1513999395028791
- -0.02893003262506223
- -0.02118220407176248
- 0.01372312043503925
- -0.1155447497524999
- 0.1803012487250286
- 0.0009191828994382826
- -0.07906659895908262
- 0.1529982630253779
- -0.2459700679275017
- 0.1745745175499034
- -0.03473127916378869
- -0.2494665077804605
- 0.0942063728583513
- -0.0212656179108913
- -0.08824629408065333
- -0.1727791494378021
- -0.06116186083051743
- 0.1092743183721836
- -0.2118908450576671
- 0.1091442326921763
- 0.01762757150041668
- 0.001492888773122969
- -0.04467862159484848
- 0.1945377072484118
- 0.04372383237405544
- -0.01633997278586273
- -0.5664696917374411
- 0.0900023222205014
- 0.1024327770795413
- 0.03174159051346814
- 0.08168036960112228
- -0.1044473530416468
- -0.03258097577883422
- 0.02656364864392141
- 0.03960718729651969
- -0.06902131912284072
- -0.1923338759869059
- 0.05724682232359244
- 0.1291613069190952
- 0.1402420313973408
- -0.1743034410713866
- -0.01142430155843352
- 0.05379025830105558
- -0.23426665939346
- 0.1518271841478148
- 0.08647099126854747
- 0.2644879890017845
- -0.1792884256069534
- 0.06120768740122252
- 0.03363621005698549
- 0.06779670853307425
- 0.1399725066900526
- 0.07300773670183608
- 0.1497455715168628
- -0.04494168517881443
- -0.1487789330622697
- -0.123329993681653
- 0.09304462616250117
- -0.06260615465801572
- -0.002204251665977467
- 0.2241764656684518
- -0.01380960288266653
- -0.07683569365374116
- -0.1830754405431468
- 0.106624628845378
- -0.2126703228672125
- -0.05020566970742592
- -0.1064108580225708
- -0.1635788154299146
- 0.04654217148564559
- -0.08711541560158394
- 0.06487354608901222
- -0.3541464113397586
- 0.08098879721239594
- 0.2741172343682602
- 0.2319837004703313
- 0.01334847173582528
- 0.3426867530573805
- 0.03286313012828165
- 0.1354787168702271
- 0.1840121160671404
- 0.2179747841712582
- 0.0334435043309843
- 0.04328905383699076
- -0.3506744502335525
- 0.1489702975138629
- 0.1792090461456065
- 0.06675010992872712
- 0.3315298440973751
- 0.07944857640654217
- 0.08142924988923757
- 0.1039971573427152
- 0.02675596677429646
- 0.0932807011511798
- 0.001721874120625488
- 0.2433885293844283
- 0.1179481264819988
- -0.01824308026406813
- 0.04932863627365439
- -0.01607871508351662
- -0.4097972803841568
- 0.1509001197272528
- 0.09915526557508715
- -0.1411358964162583
- 0.00174289224332619
- 0.1476208008607287
- -0.149080629262399
- -0.01223541789522891
- 0.04344856097747963
- -0.06739497831074694
- -0.2958751909125948
- 0.04468156708035222
- 0.01699193206050237
- 0.04294568184329499
- 0.09625891514180991
- -0.003331663309702944
- 0.0394891310617719
- 0.01484353007705631
- 0.1893838285010545
- -0.06588620690023483
- 0.1192407653988873
- -0.03377543229773004
- 0.08055604468975913
- -0.03876485921154274
- -0.1998876806315399
- 0.08351025978705078
- 0.109838030443253
- -0.08342925523216127
- -0.1644979985086071
- 0.03631522039718456
- 0.1652052123374243
- 0.06517262376922202
- 0.02401161081769404
- 0.2358921310858615
- 0.2409577987266139
- -0.0008723446223863749
- -0.1051821186320413
- 0.07279272083909501
- -0.01892806487892615
- -0.005655646006455291
- -0.09895204107660432
- 0.03993877776603263
- 0.02003688466597598
- -0.1455666492089054
- 0.1508200186086192
- 0.1066092633752345
- 0.1408413121989664
- 0.3237896257480205
- -0.01988463626128929
- 0.007512606264929994
- -0.001569961135358605
- 0.2901569209547472
- -0.08937826325723433
- 0.07575379524431722
- 0.05750677176640619
- -0.08419182154470206
- 0.1415199704162118
- -0.007489094542185645
- 0.2833125760955886
- -0.06330825782732212
- -0.08038437758557827
- 0.00335894671541253
- -0.1651660867404519
- 0.005274797456770841
- 0.1451928119028927
- 0.0112763569329058
- 0.04349476330791319
- 0.1755574189852512
- -0.1004799935416272
- -0.08857135678157048
- 0.1016336458639318
- 0.128089002707815
- -0.2033716433497825
- -0.06308347564939616
- -0.0374340770790013
- 0.1611866786641338
- 0.06284520137338571
- -0.1733160160414784
- -0.01277000452815422
- 0.05042123213034332
- -0.07605669574193785
- 0.1541596046567756
- 0.100129475465233
- 0.1502604053306998
- -0.1815341230182427
- 0.05781232623561872
- -0.1404702374844343
- 0.004316962777268882
- -0.1229997303048702
- -0.1008330870514547
- -0.3862619069515442
- 0.208386591312998
- 0.00705287407151345
- -0.1145430834370256
- 0.03117859179772877
- -0.1790100627788533
- -0.317114755779024
- -0.1465073188758438
- -0.05678938881741846
- -0.04631415161620381
- -0.2602796885870445
- -0.1609362113998376
- -0.1564632165577046
- -0.1888152536312644
- -0.03969244829851229
- 0.02612137771711488
- -0.09543246562696969
- -0.2183968199062007
- 0.05932022007254949
- 0.1119422932084073
- -0.05863555273270557
- -0.07311929300317055
- -0.185054570373021
- -0.08111145820914961
- -0.08229595889898869
- -0.08336248446315815
- -0.03355480185186703
- -0.0137739865574326
- 0.01578423759247887
- -0.134280858407766
- -0.05979114807592321
- -0.1359082924315047
- 0.2251368739066763
- 0.1284719551357331
- -0.008720901210605873
- -0.02170581118342002
- 0.03098058198636323
- -0.1516797189958598
- -0.1182644098776825
- -0.1585499139498735
- -0.4004687252549597
- -0.1083307051514876
- -0.02477912039670704
- -0.06401091446007764
- -0.00465289972803625
- -0.04593001902571633
- -0.1553585199910524
- -0.03401223036656075
- 0.02175754426725177
- 0.04032536711263271
- 0.02332800491697365
- -0.07758927803027214
- 0.01505334199605501
- 0.1159277332788187
- 0.2246696640606345
- 0.1821811913622563
- 0.03372106411337247
- 0.003076116559792473
- -0.2321034140537513
- -0.2014303771732046
- -0.005825533774552373
- 0.0003041051573775923
- 0.04380826758018026
- -0.06261541589566881
- 0.09123212191409814
- 0.03155889220687966
- -0.1051582789554929
- -0.019320322679914
- -0.4296919773018761
- -0.1267327090081997
- 0.2460451494795493
- -0.09815740987293466
- -0.112065326760333
- 0.04441953514823409
- -0.1038860449114877
- 0.0006600456433968109
- 0.06011012798096176
- -0.07961303018752405
- 0.06889443179937985
- -0.1722576091260162
- 0.1272105046165272
- -0.246875791317345
- -0.1391520490300331
- 0.1368616549424919
- -0.2561672078639782
- 0.101408160595333
- 0.0632683649049635
- 0.00183405543497394
- 0.01030663525930626
- 0.07710038204783168
- 0.04191756022354327
- -0.1945866467252047
- -0.1956579413332658
- 0.1495908114577365
- 0.02566416481134048
- 0.03281862995472427
- 0.1750041255896567
- -0.03072004489063606
- -0.1180937560974679
- 0.05465825796076283
- -0.1293249330045187
- -0.05106361463711692
- -0.2154063873615947
- -0.00929286894729823
- 0.26662799813664
- 0.2404808370652683
- -0.1074050002949689
- -0.0251094620755515
- 0.06267698473230983
- -0.04101375796257579
- 0.06834772494667074
- 0.08446323900121717
- 0.0007030897104779825
- -0.01788360140019017
- 0.1075996994286616
- 0.03829468072288923
- 0.06483195079665234
- 0.1428459774551653
- 0.03807425408719391
- 0.00172009335770463
- 0.0852300086246448
- -0.1436778649299378
- 0.1547867246446074
- 0.1686405197787893
- 0.02386955669903841
- -0.06969960445004166
- 0.2056324130053931
- 0.04415675901676435
- -0.02879603819070192
- -0.2174676885227549
- 0.02320494759177774
- -0.2064085939414105
- -0.1115869662551407
- -0.369623368937269
- -0.2438690336665204
- 0.01208375588372786
- -0.05335290497420438
- -0.08374412732522361
- -0.002591990189751939
- 0.06159414959258906
- 0.1348096777210641
- 0.2282425738739924
- 0.1991950462659057
- 0.1721361435316378
- 0.03823591687534759
- 0.04599802966822675
- 0.1691568621964841
- -0.08684860820319985
- 0.002458687877128006
- 0.1567772711376126
- -0.6061634130980867
- 0.08482804187365316
- 0.09301007245418171
- 0.02322821426035823
- 0.08833443865908727
- 0.1660776461897365
- 0.02882327432218191
- -0.01120870775886737
- 0.108747179892392
- 0.1909085004504499
- 0.006521111454003459
- -0.5798279730779259
- 0.08115144774162875
- 0.06379528850046974
- 0.06597844236811323
- -0.1150131081562423
- -0.2595789720827441
- -0.03921162143577954
- -0.1889725044114855
- -0.04946176534139222
- -0.1332932698562622
- -0.005483179351226585
- -0.09406593199267928
- 0.07027042011176331
- 0.04140933885974341
- -0.1220306059795954
- -0.1784630885326045
- -0.06183513688957735
- -0.04620779652230963
- 0.01208544382877731
- -0.07593065279451829
- 0.005310123626712982
- -0.0537404178712245
- 0.06509767254169235
- 0.3095656335403331
- 0.06644844505785756
- 0.1046541918591089
- -0.2943514782239701
- -0.07184880984078473
- -0.150286594575941
- -0.05118008547225355
- -0.02902023774849643
- -0.01404467375295322
- -0.2373670524378622
- -0.07702324621789179
- -0.04895588030861381
- 0.06930851900854594
- 0.06091788362428961
- -0.0487272679060729
- 0.1999840920560406
- 0.2847516221314755
- -0.006490807811043483
- -0.1177768050221116
- -0.003928377152762068
- -0.06807953367482994
- 0.00815797407149558
- -0.05876264057938538
- -0.002709513095030907
- -0.01544309942595336
- -0.1921996488157096
- 0.1845996938092963
- 0.08706799328370383
- 0.08714351889716213
- 0.1229346248358035
- -0.3809247883884744
- -0.02418657300916352
- 0.0269583373305321
- 0.1983369226201439
- -0.2709090627460813
- 0.1377633632128844
- -0.07477915185102726
- -0.1271397141138801
- -0.04480297917247535
- 0.003651388956419065
- -0.07738439626008101
- 0.02361201279791315
- 0.09225393181949118
- 0.05340439521830287
- -0.06664910747875021
- 0.07683235450873378
- 0.008829235914813105
- -0.1132187632823483
- 0.03651116945295849
- 0.0251097318352578
- -0.08889740286853948
- -0.1154001052002589
- 0.1594637821987131
- 0.03843906757654038
- 0.1126844002169019
- -0.02670792851573295
- -0.002936827904473006
- 0.1040632719247211
- 0.1279576088824421
- -0.08187550891668971
- 0.01448635428902653
- 0.07365691967003778
- -0.128381333959134
- 0.2507229622342359
- 0.1428853588807213
- 0.2112289983206825
- 0.1112981412679344
- 0.1236019560656137
- -0.1095517469213071
- -0.05610350103106206
- -0.1287765694240627
- -0.2204735393882981
- -0.1947620806931097
- 0.2661820493338552
- -0.05727346964422059
- -0.08777698515797741
- 0.146862217082062
- -0.1211727226851576
- -0.2596105058855678
- 0.03298028440934461
- 0.01695093509570031
- -0.1353865471488698
- -0.2853070334978341
- -0.1076480925415555
- -0.01868969867909531
- -0.2755694635705666
- 0.08654685680010697
- -0.06774074042738799
- -0.04503361833983752
- -0.2858509436932885
- -0.006312798140391423
- -0.1010457793245181
- -0.02194637148278473
- -0.1209844657919036
- -0.09542887781864266
- -0.1665141985613761
- -0.02747941032078098
- 0.06506225651289597
- 0.03138345843500882
- -0.08489390382410648
- -0.001164325447961441
- 0.003842815998187988
- 0.188216079875226
- -0.1172106582364393
- 0.1588972143009124
- 0.1376983275026621
- 0.03625728163813317
- -0.01756119064575194
- -0.07975850805512234
- -0.2525580915069717
- 0.1225771086631814
- -0.001084702257775424
- -0.1828422228590859
- -0.1557494369505046
- 0.07795329534776511
- 0.09472711027862084
- -0.001833963694330049
- -0.00898099402117189
- -0.09376805496078298
- -0.1661632022037644
- 0.1609761058075417
- 0.06938295032553456
- 0.01499141464340691
- -0.09033638416729012
- 0.002273262915752048
- 0.2752084675754887
- 0.03188948749777691
- -0.07466951045328889
- 0.058957066698073
- 0.007381213020779487
- 0.1336484465438573
- -0.1805294252205066
- 0.01016316826432791
- 0.02464567100390933
- 0.02375319672877546
- 0.09395357258690983
- 0.1367843113114702
- -0.09273687404562907
- -0.1147744683144654
- 0.004700225990019173
- -0.2844801236877633
- 0.02943023908257679
- -0.01598638200216662
- -0.141300900576971
- 0.04039618734261058
- -0.1639282340787453
- 0.0765906998646597
- -0.1713311368050122
- -0.01092396053232519
- 0.0114560370981295
- -0.004751009039853939
- -0.2087227424059737
- 0.184480184554378
- 0.001043298209004864
- -0.1037353952645325
- 0.05051265538013455
- -0.1312447302270093
- 0.1809881017891309
- 0.1294350311522487
- 0.07842999109776783
- -0.0164205485729848
- 0.0002513185691293265
- 0.06300828324358586
- -0.21952091989477
- 0.1282120730099955
- 0.09332454855351834
- -0.07347927914594297
- -0.05256809557858914
- 0.02692370545350153
- 0.01463401338307507
- -0.2200433742206598
- -0.1067900811897174
- -0.1218573152310595
- 0.1025261155401048
- -0.4035504024103722
- -0.1237795037065591
- 0.1484483461691831
- 0.2547497308795001
- 0.02793250367947491
- -0.03492943338759393
- -0.1034132879006144
- 0.05232615436444929
- -0.1010810155523437
- 0.03216142504305022
- -0.2088791441861932
- 0.1040330702029325
- 0.05014918700639624
- 0.07862518163601354
- 0.05927749034429172
- 0.02956841065647962
- -0.2012967975789961
- 0.003938353509400875
- 0.09159030727319518
- 0.09432302097877748
- 0.08680770183530477
- -0.04252292014899794
- 0.03696641305128692
- -0.1166550618014055
- 0.01748073416192691
- 0.04089595204065451
- 0.01137504179012836
- -0.05903219959174481
- -0.01818124940614758
- 0.04812882453035804
- 0.2362286934568873
- 0.02034513117836981
- -0.02285896151518186
- 0.005471949281347859
- -0.06798392521056063
- -0.1047102982122652
- 0.3688688592810885
- 0.03035280270697957
- -0.03417058483170611
- 0.0193786406183001
- 0.1661469777636171
- -0.07065347570250144
- 0.007467038833007271
- -0.1502546342421678
- 0.083877329161976
- -0.1661607003447915
- -0.1074311013553391
- 0.1661982342949016
- 0.1979321484652738
- -0.02043711751769698
- 0.03682639398821854
- 0.03644007402503712
- -0.1111992055960391
- 0.2790245162208053
- 0.005369490324460527
- -0.0314882128296991
- -0.01417981232737644
- 0.04828101676321944
- 0.008977275006716955
- 0.2043868592912931
- 0.04365301879191937
- 0.1305156044209719
- -0.01794485993614705
- -0.2384070578414621
- 0.05744150678398646
- -0.09762703357797536
- -0.2678785778945201
- 0.0346727597244921
- -0.2780084831563379
- -0.1499419512722171
- 0.1038933245569644
- 0.03440607454388061
- 0.000274370782536458
- 0.06111310170522111
- 0.08608971642796071
- 0.04987573262615801
- -0.04626504059303834
- 0.1698993704052897
- -0.06281041299806465
- 0.04528977818330598
- -0.123392654940005
- -0.0290676987885179
- 0.107881616484137
- -0.04178073164162893
- -0.03764153500148977
- -0.2824760561583472
- -0.001557878213629696
- -0.1640962383796669
- 0.06850449820069332
- 0.01804390116308751
- -0.105628013732652
- -0.1505808251628635
- -0.08082331342730152
- -0.2008307943952176
- -0.02991474972227747
- -0.04271818230162084
- -0.120879166950042
- 0.065444494307024
- 0.1856453759031841
- 0.04812894538925469
- 0.04440193799295528
- -0.007132304738937823
- 0.02234193396576895
- -0.09070804057526791
- 0.0249839423657245
- -0.01598184712240994
- -0.002039125476166264
- -0.2826860340094195
- 0.1237698069602635
- 0.005176355423163174
- -0.0676378204351348
- -0.102549818025726
- 0.07228683717461937
- -0.03231537860473729
- -0.06025380539328302
- -0.1067148913657218
- -0.1832348624262625
- -0.1186896551549737
- 0.06534932782785902
- -0.04148260038373607
- -0.3297449271049483
- 0.1638800049942212
- -0.1047269438797595
- 0.06573542409555815
- 0.1721605583437557
- -0.1604184367461875
- 0.03905030110637008
- 0.01086051951898515
- -0.01894004518831463
- 0.06860012102710784
- 0.02071178364009996
- -0.07564673142046621
- 0.01194018131385199
- -0.01809349589871487
- 0.06818136240553006
- -0.04702563798760495
- 0.060462037871139
- 0.005590683401130687
- 0.01791891579467166
- 0.05911651275922077
- 0.05864473705533306
- -0.02266784974209638
- -0.06675284352905796
- -0.2306891995624698
- -0.008914613841774933
- 0.08925315177057583
- -0.02838669816570877
- 0.1244219598355526
- 0.1306714961625057
- 0.1190050559289682
- 0.136603365054152
- -0.3123502047995758
- -0.06066587616933178
- -0.04621714114092183
- -0.3003727436883856
- 0.06131468434924262
- 0.08072593320910279
- 0.02622731489628235
- 0.1359507126697057
- -0.1439553612936746
- 0.1419399686336321
- 0.01657293197267144
- 0.05013144712041896
- -0.1174187439667581
- -0.1229456383384699
- -0.07021784461102953
- 0.1760995872620846
- -0.1398593474134106
- 0.2287227549937715
- -0.08096577250908631
- -0.004426402139883642
- -0.06228587044321769
- -0.004607207370818548
- -0.2171647049713261
- -0.0637788403807322
- -0.1596330784798335
- 0.1641262828017135
- -0.09976515128050771
- -0.03789548774364188
- 0.06395283979531464
- 0.1600188622367744
- 0.03074946009474685
- -0.06847802141332188
- 0.03237742488766973
- 0.2120874115856863
- 0.2028964080744353
- 0.04566064630909031
- -0.06389285204871999
- 0.1158669133379179
- -0.07485438195467638
- -0.07265337877706275
- -0.1705058405414504
- 0.07519232883401432
- 0.1138051560296518
- -0.1563016357246378
- -0.04385789255021381
- -0.1160164439433906
- -0.03769613232459991
- 0.1767705713716731
- -0.0563029003721063
- 0.06358569294818638
- -0.07699336081058232
- 0.2111513303382762
- -0.1106989508568593
- 0.02360204026244463
- -0.03494908146075507
- -0.04116963449027391
- 0.2216215630311471
- 0.02908444897091008
- -0.07156157776660475
- -0.2366968827800979
- -0.03163552380653103
- 0.06905817727794072
- -0.002536916526160523
- -0.01466988290168243
- 0.06242703809006644
- -0.06243224614138568
- 0.05271893755065048
- 0.03307773593364672
- -0.001177328042041443
- -0.09278396139545916
- 0.05035883368350171
- 0.029819047035332
- 0.1094461945652439
- -0.3241135950284725
- 0.004440857096820299
- 0.04345434653676448
- -0.2578424316428754
- 0.1058005119317326
- 0.01730233901439584
- -0.01975958618579435
- -0.07025976285183216
- -0.1274311117652878
- -0.09362778358797785
- 0.09640837063806885
- 0.2136431668073824
- 0.0437555628860183
- 0.06372522484508009
- -0.1388022151894868
- 0.1502159361592025
- 0.1066471896792283
- 0.1211316597583722
- -0.006932933763685157
- 0.0433171775255522
- 0.0373504282424748
- -0.10731333442803
- 0.1505106288169171
- -0.05859110059571048
- -0.1658760038288777
- -0.1434988650066946
- -0.07485656307655052
- -0.05611263479659877
- -0.03785225140850908
- -0.2146191449945687
- -0.3329667488273335
- -0.01473046367218078
- -0.2292276084334722
- -0.04867558711499703
- -0.01335061491191113
- -0.09277123822653682
- 0.008395681804528488
- -0.03271414188514318
- -0.1724157876155324
- 0.07512239612503882
- -0.1679458986795618
- 0.05823397020787569
- -0.001364809187555237
- 0.05736041145111728
- -0.003497481747117358
- 0.06560215237059054
- 0.06151686689615499
- -0.05588884299574574
- -0.1634717399528579
- 0.03258400693485732
- -0.06196460148182169
- 0.04743126116872873
- 0.02444569123824265
- 0.2544798947193593
- -0.1394049754197734
- -0.1468492562759236
- 0.1637587461340966
- -0.004307009767128407
- 0.1401029151418366
- -0.0351456964596356
- -0.05604348444296517
- 0.1874162088503692
- 0.3927244262910226
- 0.0290206574198427
- 0.1080021675088202
- -0.1162972538889056
- -0.0699340844992085
- -0.1194181050711391
- 0.2290374918247552
- -0.02681164614921138
- 0.02383497831161389
- 0.06831927803638151
- -0.008059702069016163
- 0.06104288327438496
- -0.04632576978061029
- -0.2150038743409605
- 0.06406761077878008
- -0.03298930021665651
- -0.0984231714940946
- 0.01546269795518636
- -0.3237124964334551
- 0.1349091243788539
- 0.05457026197896756
- 0.05992829615859915
- -0.1010785172308407
- 0.1369516495270364
- -0.01252664320393353
- 0.07598679622006517
- -0.1786265303893693
- -0.1419243011344121
- 0.01485387875768312
- -0.6192285232430708
- -0.04985276818828194
- 0.001997299065577684
- -0.02759831723738511
- -0.3096640531402383
- 0.01003320099005055
- -0.02979157180962045
- -0.1177246713736268
- 0.00709662118902067
- -0.2168238201105701
- -0.3026117749231387
- 0.02963810853696305
- 0.05494398422103806
- 0.02529345646419047
- -0.07776866290509794
- 0.07175586594468458
- 0.1165086935565908
- 0.06424004949363959
- 0.1902396429477159
- 0.02635292144992934
- 0.1245306728893237
- 0.08408404293418334
- -0.08548187456389662
- -0.04378426766670829
- -0.0954651786569372
- -0.08472911189901509
- -0.08527754766534512
- 0.1090545784365619
- 0.1076798762789478
- 0.04082367620288804
- -0.02901521821842885
- -0.1330813856199282
- -0.1030171681011061
- -0.0406970532176619
- -0.2796852145803527
- 0.06635538073306607
- -0.0625645705847102
- -0.09147119235794353
- 0.07438596014907495
- 0.1210580719073444
- 0.104745870946697
- 0.1702391451066284
- -0.1320146753106412
- 0.0299064147546777
- -0.0595403734608253
- -0.01278921150453554
- 0.06103256952223652
- 0.1882550587124597
- -0.1343668802104494
- 0.0631129991253106
- -0.07934019711958883
- 0.01201513672380478
- 0.1172233867072231
- -0.04947633196342413
- -0.07870281870516233
- -0.1435487549226015
- -0.2575348905012878
- -0.03798459066131626
- -0.2727538736801811
- 0.2484974938214449
- -0.05795337692219548
- -0.1999913651242681
- 0.2522798310967101
- 0.02698128233420108
- 0.0833028924986451
- 0.06649185480315546
- -0.2411451832821562
- 0.01633080520325001
- -0.07609859242188781
- -0.04247559909162969
- 0.07738309127212294
- 0.00338504944113374
- 0.02759211327553412
- -0.062832083534875
- 0.04143828656425674
- 0.009073018473040258
- 0.1419465999688319
- 0.07128105459692202
- -0.01848987171334482
- -0.02259148678743529
- 0.02491359839243191
- 0.01783047751925651
- -0.01442395569032092
- -0.2027928721149563
- -0.1598159994989173
- 0.03842714305757287
- -0.008384169377587621
- -0.08880299076422628
- 0.02079037965729929
- -0.03671362409174479
- 0.06973205315710705
- 0.1063069775346068
- 0.1007176612891763
- -0.002547602650709032
- -0.02700922622045116
- -0.09703937804374069
- 0.05950753545508661
- 0.0507485771781551
- 0.07985287074546485
- 0.1817836436376768
- -0.1725753188714505
- 0.2018124545346996
- -0.02125262992036267
- -0.1389955022111425
- -0.004821234830264484
- -0.08821775432205033
- -0.04411838609251255
- 0.2264100411622824
- 0.09577882771570714
- 0.04386820998539865
- -0.03487017916397868
- -0.04453788418018581
- 0.1268747270609243
- 0.07437212842587976
- -0.1334871846804367
- -0.0724059218444012
- -0.05608205535374374
- 0.2326132060190554
- 0.02994092587015976
- -0.2089556167044889
- 0.0307205569385052
- 0.2100329072099038
- 0.1470463822501148
- -0.1108473213221753
- 0.0180421233819202
- 0.1926915008233758
- 0.2834135240492412
- 0.03981386172756802
- -0.1353756782207221
- -0.1316357648682679
- 0.1251917445532366
- -0.07122199797343048
- -0.06843443883418815
- -0.06471799506842645
- 0.04920451919097584
- -0.04966553488209532
- 0.09030407907133559
- -0.009032101019832373
- 0.3329343599524694
- 0.1077140326181361
- 0.2116763535918749
- 0.09572090976537226
- 0.09690546083088047
- 0.2116609787799568
- -0.04686920855405804
- 0.0218607548581237
- 0.02399391243619535
- -0.04534593475778261
- 0.08112859651845519
- 0.2334446290891323
- -0.008582300947611097
- -0.2305722476263238
- -0.0413794517229276
- -0.1110155935673876
- 0.04846596644900134
- 0.009376670702189865
- 0.06371692643620697
- -0.1262177887372313
- 0.002243370830352344
- 0.07522925987672718
- 0.02981543502381082
- -0.09688900661116427
- 0.1187022634635514
- 0.2121937407941616
- 0.1160820564728878
- -0.09145826358985815
- 0.1265546134597996
- 0.1239288672234961
- -0.218873561315173
- 0.06010108458356655
- 0.09184133777890542
- -0.0497281833890348
- -0.0764646030507192
- -0.05102912514365521
- 0.02849400911861337
- -0.05162216662868902
- 0.1932424320654136
- 0.1384606059076061
- -0.08799270097847003
- -0.1878590814284045
- 0.04201339478566018
- -0.0006645564187006181
- 0.01683382078521371
- 0.01262715095198261
- -0.008313080897634438
- 0.009995652060245303
- -0.1694766390039859
- -0.1915939699332303
- -0.08648825821462656
- -0.01825769682471006
- -0.1798777902610145
- -0.09917221514651982
- -0.1076235449927981
- 0.006472931840932583
- -0.1167483437189565
- 0.3296695003306915
- -0.06228780364996593
- -0.002629600483244642
- -0.05191930452281279
- -0.08694977269772103
- -0.2010664198842678
- -0.05648442893616653
- -0.04522512093437937
- -0.03900233986908162
- 0.1111104382835447
- -0.2126954149231985
- 0.1129761193154164
- 0.1494508746293761
- -0.007458460909668881
- -0.01605879162423225
- 0.04782514952142372
- 0.04590636480733407
- -0.1875383910479731
- -0.009154183090342357
- 0.1349569418108101
- -0.2276526472382224
- -0.1071252008719458
- 0.06749302105374287
- 0.1622229300062252
- -0.2781852298265187
- -0.07887328124863414
- 0.2694692883777759
- 0.03607529710022215
- 0.1481183486481567
- -0.06184326053558836
- -0.1730417754804224
- 0.01525077970179209
- 0.1561405994597077
- 0.02678032513693529
- -0.0008197120477443001
- -0.1530898484847645
- -0.001847636302208441
- -0.05110614815450206
- -0.008266118435312478
- -0.02473667511525696
- 0.05569216297511022
- 0.08004609750215154
- -0.1350936797929578
- -0.03104008993202642
- 0.05254690529371065
- -0.07021698690263957
- 0.1619352579102685
- -0.04774013275971477
- 0.08923569540698978
- -0.1007475489639843
- 0.135776142630528
- 0.1150462916600388
- 0.0322451299040322
- -0.01112626971319132
- -0.1604373055729276
- 0.08640957224394968
- 0.007749845426388811
- 0.07092711464746372
- -0.2288341889598747
- -0.1111153620865373
- 0.01284950736467663
- 0.1917962362109962
- -0.121350989274593
- -0.1619193800434921
- 0.009766252230125208
- -0.2185447500102821
- 0.06787029563053804
- 0.05123133944641886
- 0.1560039184081432
- -0.008265993533776123
- 0.05753488765027924
- -0.08931515682119745
- 0.1305485552418335
- 0.08516739237231388
- 0.04417580277271685
- -0.2388817817062562
- 0.01106863756299767
- 0.05034403890828894
- 0.06090714841574685
- 0.07730723735143495
- 0.1005535179537418
- 0.04161994673567664
- 0.1245826338715556
- 0.02590296946129248
- -0.008911236072077382
- -0.1571295891427713
- -0.06433320918472896
- 0.06306623391009464
- 0.02540275442119966
- 0.3067717439195782
- -0.1233173904652815
- -0.2499425266245129
- -0.1910383963171172
- -0.06385514171998863
- 0.03927738558934807
- -0.2231381271681863
- 0.07228567902119459
- 0.04786253900927035
- -0.06429441538918575
- 0.1595981778299712
- 0.08173468092895905
- 0.09811294770320431
- 0.2426138303451038
- -0.05896816906302247
- 0.08631485452582394
- 0.1190720926354649
- 0.02216332510794881
- 0.08027285957578843
- 0.2699765960020123
- 0.1330179192577183
- -0.0129612182607308
- -0.06144857440814451
- 0.1766057604623763
- 0.3637656530206659
- -0.1979580496373715
- -0.1272743278008463
- -0.07403992269645622
- -0.1190820717998966
- -0.05256178829659498
- -0.01743017925042123
- 0.1652132477967278
- -0.08397210979863105
- 0.08678607625537327
- 0.2690269233578607
- 0.004725727569335508
- 0.03657725758925761
- 0.03782683317786107
- -0.01527115734314086
- -0.03748412659968398
- -0.05184529043462635
- -0.08125696378463768
- -0.2044036502827531
- -0.02259796832914181
- 0.2306125846856311
- -0.05166341912758832
- 0.1007686765701985
- 0.02807602496517032
- 0.195397975895692
- 0.2477849475429904
- -0.1578389390132202
- -0.06778967285660908
- -0.06310468894237677
- 0.001152317090581645
- -0.02847159285392959
- -0.1644965691415145
- -0.004422672654226657
- -0.04582338763658627
- -0.03368514007381852
- 0.1036676916041419
- 0.01633088436745846
- -0.11428974481109
- 0.06236689654186239
- 0.01749034359008914
- 0.02853137340479905
- -0.007962212607277726
- -0.07785215475867532
- 0.0838684611198631
- 0.1974969030295401
- 0.1069244217460556
- 0.02422108189175057
- 0.0980456720803683
- -0.03801602309734344
- -0.06111899634518623
- 0.02441623516867221
- -0.2054311974185093
- -0.08081305627872575
- -0.1198518817220182
- 0.04034362071064586
- 0.05207350174491301
- 0.1974377976085911
- -0.06059255574100417
- 0.04792259565886958
- 0.05189266619617966
- 0.06818538193969763
- 0.04047283318606913
- -0.1017936717913432
- -0.04701905901973118
- 0.1229816793201596
- 0.1488015984903939
- 0.09661098734906357
- -0.1003106650446885
- -0.01537647740384916
- 0.1618204180858531
- 0.1571893218096157
- 0.01468400068843958
- -0.04071898294540913
- 0.1132891253111955
- 0.07248743091201217
- 0.01764528037644025
- -0.0004762474921353839
- -0.01498907130076845
- 0.2068601544100429
- -0.09063308846716889
- 0.1941437247094625
- 0.04467296204639865
- -0.1302667460292818
- -0.002833859865354921
- 0.01285906215180063
- -0.1416392433865714
- 0.2047175011079203
- -0.09382372305655916
- -0.01313767646168318
- 0.03970433934773066
- 0.1328275751432367
- 0.2134388558663492
- 0.1225627402109581
- 0.003451648640815798
- 0.1401527089620881
- -0.04527300235533499
- -0.193054067465438
- 0.1054238331143912
- 0.01788711523261599
- -0.04529521126883883
- 0.06890198380905398
- -0.05543757523542746
- -0.0101991607043735
- 0.01275825083093947
- 0.02253753243187137
- -0.1753126479363099
- -0.1147822848040538
- 0.1309585843547272
- 0.1002556185812181
- -0.2081086787839297
- 0.2116069648173263
- 0.09956651148127987
- 0.1299743320765888
- 0.4110092952243196
- 0.07041684155765403
- 0.3398905815046785
- -0.1393176371776856
- -0.06242973752869357
- -0.1127541118411364
- -0.163822215153077
- -0.07486593810902091
- -0.08925537517653959
- -0.02519462318663325
- -0.1019412998506228
- 0.07656450942853596
- 0.1009556665985779
- -0.1472375712627065
- -0.1343660250137771
- -0.07228274980292933
- -0.04125346885099707
- 0.05371791686420851
- 0.03709004327875337
- -0.02518679780258256
- 0.01816502010510537
- -0.09333116525248154
- -0.1540520976940997
- -0.009677170015297052
- 0.1086850257371473
- -0.04767224853616402
- -0.07866697277646326
- -0.1026201482532858
- -0.1248426643213241
- -0.1058664708599378
- 0.004276668663918654
- 0.07863463576625816
- 0.1989887810091926
- -0.008590536044245594
- -0.1580125299978173
- 0.06894884671352351
- -0.06498647477155509
- -0.02366813942660665
- 0.01980482410685396
- 0.06270283885924051
- -0.2245783208372042
- 0.0368732303495489
- 0.112917125763922
- 0.02303314051507049
- 0.07390193209570638
- 0.01927270918394332
- 0.003167073258190915
- -0.2345794733410854
- 0.04019276021469956
- 0.1500701266292118
- -0.1738201281370745
- -0.1746023480455238
- -0.1668196981209678
- -0.3168850573353171
- -0.1396166745089382
- 0.02248267692289839
- 0.08597907809480189
- 0.07027696815144102
- 0.06889223773757996
- 0.08333731872108889
- -0.2542789485294152
- -0.1705164795265574
- -0.1979238045369191
- 0.0092751292395125
- -0.1320156071506114
- -0.08554660199135972
- 0.1188459370298688
- 0.09836029244114676
- -0.1638474906793758
- -0.04079028244245568
- -0.04407160144056942
- 0.05152213855672327
- -0.08458460684698087
- -0.0396813083410299
- 0.1486263767638222
- 0.01916837924119908
- 0.1336541667410552
- -0.05778739849011862
- 0.2143770028388072
- -0.05090937611490887
- 0.2051024723887984
- -0.06596109921606449
- -0.03671618418312173
- -0.009633899450427197
- -0.0502357420293016
- 0.03869518548670069
- -0.06588109165496844
- -0.0002372648040582653
- -0.1344838837015011
- 0.08824977120271739
- 0.02023380208044043
- -0.2607610166480336
- -0.1896671057558585
- -0.1161377337559699
- 0.1078116990834769
- -0.2539078495142086
- 0.1390611389845949
- 0.03025764989567766
- 0.2441343358593851
- -0.06075432376952496
- 0.1638714927798439
- 0.08333511621746084
- 0.139341251156238
- 0.08122900230200247
- 0.04010435527965214
- -0.1361093194232774
- -0.009581375246758578
- 0.05835068359510442
- -0.0167803727525226
- 0.1069419995219412
- 0.07813798279419711
- 0.00305496395478661
- -0.04170405359485424
- 0.04552324600228076
- -0.1193735070676641
- -0.04913753836685447
- -0.1279944407660601
- 0.08368520759372461
- -0.0870273964516674
- 0.2925564735493265
- -0.04436631411929799
- -0.4325624868472523
- -0.2779225986835941
- -0.006550820004269859
- 0.06060604527500229
- -0.07038280030614524
- -0.08319353480795386
- 0.07136178526293338
- -0.04339465701308659
- 0.204003248326082
- -0.0009487078232958978
- 0.01870845547751275
- 0.2031705378869401
- 0.2365902766993048
- 0.06877991216878743
- 0.1016398511557229
- 0.1673681644207744
- 0.04321705461509814
- 0.07449929082525482
- 0.1817454599348936
- -0.01135984112934396
- -0.03818437913488988
- 0.1582163858452817
- 0.3811016510116187
- -0.1252250014542289
- -0.09631212562334079
- 0.01818618526493161
- -0.05960662208571994
- 0.007359280136234205
- 0.1871558156783462
- 0.07312331044671525
- -0.1456346179766477
- 0.2446716360324289
- 0.1719708917792253
- 0.01491675286930497
- 0.07521955767763136
- 0.02916786150315786
- 0.1304426167592564
- 0.03797090938346386
- 0.01617510961590824
- -0.04975631310943084
- -0.1480946570044037
- -0.02668346659829236
- 0.381378370194814
- 0.0298177070073709
- 0.1179477222364818
- -0.04400525973844824
- 0.1085493338157537
- 0.2288621661170312
- -0.2757981230185004
- -0.01523755673373449
- -0.01431038207471042
- 0.04826549588643518
- 0.05453267363123064
- -0.04269700127556757
- 0.1229262179445883
- -0.1920533368192765
- -0.09461837022106229
- 0.1426896986666275
- 0.04224060119750231
- -0.09154617518831577
- 0.06779175164874031
- 0.06389501613452804
- -0.2202272341820416
- -0.03527323064879302
- 0.05008681334841851
- 0.03915929346556274
- 0.2466306441313898
- 0.2175487276657447
- -0.0702961195826572
- -0.1133769134507895
- 0.05712035664435332
- -0.1468854598240673
- -0.008127726597428714
- -0.2111387012471612
- -0.09534085316222254
- -0.1179715420183408
- 0.07478770331190493
- -0.09543178656365206
- 0.2573332836020102
- 0.005664329361901663
- 0.1970935773063416
- 0.2555708058051488
- 0.06714732326758449
- -0.1050173840930746
- -0.03910728643028964
- -0.002382239357700849
- 0.09196459553841493
- 0.110266208869817
- 0.02425982130926525
- 0.09972451984193673
- -0.05897572466172765
- 0.0409776957910722
- 0.01919657049756203
- 0.09647129033428344
- -0.04431197213438134
- -0.05762749156366653
- -0.1347091145517745
- -0.01787318326952005
- -0.1173107653450738
- 0.09166620389002314
- 0.2033492586980972
- -0.02659322882004272
- 0.3761971232577544
- 0.1593763850604364
- -0.2074397253590146
- -0.2513758703019408
- -0.06208733697230294
- 0.1916760986268075
- 0.4126562927340601
- -0.1561244013434285
- 0.02726361886418402
- -0.06725813452732007
- 0.1911862300418384
- 0.1700206863909895
- 0.1340245065273619
- -0.05010860352551059
- 0.1391517181263541
- -0.05930793627674803
- -0.306468854568941
- -0.1765689501858524
- 0.08174207562970164
- 0.06599160790298092
- -0.03493130193206551
- 0.01347445796216553
- -0.01652733799502618
- -0.001956852260735469
- -0.04080464255465879
- -0.2103585828885884
- -0.1368458087668891
- 0.1210339853543174
- 0.1849062331186146
- -0.1678208112269515
- 0.1336501455703188
- -0.09033119301686199
- 0.1588402005151534
- 0.343835781720269
- -0.08379391991734822
- 0.2569230676782887
- -0.07074417413607342
- -0.001564406531799668
- -0.2578841033850046
- -0.153105248388453
- -0.1124828554039798
- -0.1322401275981956
- -0.04426097420023839
- -0.09413123070888091
- 0.07107967680196152
- -0.02634619189135535
- -0.2643060713405422
- -0.01763331333686636
- -0.1270950852171641
- -0.1079467603432847
- 0.1783039333682823
- 0.1207543271149685
- -0.05059305161756707
- 0.0500077937142913
- 0.009541897202125463
- -0.124412542234951
- -0.01147436953372618
- 0.07693826272523507
- 0.1620249097734542
- 0.1157966001753865
- 0.1147717935299196
- -0.08408124390959763
- -0.1293298942019157
- -0.04242673082866534
- 0.1186902819058376
- 0.2224321368384126
- 0.07696883261632403
- -0.1631116558892264
- 0.1767479567279225
- -0.07840055361446482
- 0.02839505756422219
- 0.07383972715911882
- 0.08187559519447593
- 0.04680154185353474
- -0.1435376941711448
- 0.02382519901674786
- 0.07071963415796215
- 0.1762296701831234
- -0.09299753120355189
- -0.1322024888472295
- -0.2312114558839821
- 0.02016332922095946
- 0.1035458150369197
- 0.04342529042108233
- -0.1750804855071811
- -0.3194078612121694
- 0.1141719956452492
- 0.2464973389765306
- 0.1501184810740416
- -0.09359455906567821
- -0.02378597195736246
- 0.05800560093682273
- 0.2130382320837449
- -0.05056426146108154
- -0.00822209520044149
- -0.2433323752339017
- -0.2233756383058302
- -0.2122944943525225
- -0.0952959833859832
- 0.1597547938803872
- 0.1362445073546047
- -0.05701316985566506
- -0.1461995740541905
- -0.1376034373361993
- 0.008042496278329109
- 0.03077801915443431
- 0.01444762445200487
- 0.06989371293157333
- -0.1195582098625064
- -0.0539595424483456
- -0.09423675246358731
- 0.1698144528273044
- -0.02756024565984823
- -0.2882468999634955
- -0.1311759884758881
- -0.01558802061199863
- -0.0224457616778583
- 0.02907233030836371
- -0.05395799508370444
- -0.1899445332674467
- -0.02311089430760213
- 0.007302109219061837
- 0.2752915166647281
- -0.01532451475347351
- 0.217851116547316
- -0.02338133499366784
- -0.08171995479619482
- -0.0004791226349764893
- -0.2444101439153372
- 0.1714245499183974
- -0.008866540346702038
- 0.08737048415801803
- -0.02644242953561731
- 0.1111536904065472
- 0.08042910659688406
- 0.156509008945293
- 0.09430289405471341
- -0.0173655864171539
- -0.09619637023909541
- -0.1687358810229567
- 0.104454167400238
- 0.1452731087699001
- 0.1753857178410687
- 0.04304210489835793
- 0.09367395935134991
- -0.1097771960461433
- 0.09160458976252094
- -0.1088914195400841
- -0.01385401475268408
- -0.08524650642317869
- 0.08987358524852788
- -0.155116293477577
- 0.2141486159536096
- 0.1492092829071457
- -0.2873869227907061
- -0.1694073747984203
- 0.04449343078728286
- 0.103115286333767
- 0.06288168172684462
- -0.2747744061605801
- -0.02297056591049465
- 0.08720444249778733
- 0.08394416890633438
- -0.1327623592578852
- 0.04173458743571703
- 0.152458237731526
- 0.3461122323005446
- -0.002875408825254615
- -0.03282945612781632
- 0.1320450754672017
- 0.02048398137088825
- -0.09582707087929924
- 0.2512733449041238
- 0.05158883104957444
- -0.1141932960377029
- 0.1042398783956235
- 0.4884623213804156
- -0.05533075061414328
- -0.1117222866153927
- 0.005044432789297027
- -0.05612379379222953
- 0.06294914832230025
- 0.1941755675201401
- 0.07906049237207202
- -0.1258082157852301
- 0.2708717596042585
- -0.09760234025734112
- -0.03242665155538724
- 0.1879415201850468
- 0.002820569798620299
- 0.2518511716332236
- 0.0803275582998389
- 0.03773020974465757
- -0.06680397033984264
- 0.1283608406198464
- 0.04153117115381175
- 0.2979617105798933
- -0.03793178634832229
- -0.003891166632917274
- -0.04639749128298016
- 0.1002283441790767
- 0.1168483832261361
- -0.2667430533768174
- -0.01367085281071653
- 0.1019833281797639
- 0.1039271660117523
- -0.03527621991795535
- -0.04624998419492884
- 0.2980837918314331
- -0.2854868315281638
- -0.1598720881523751
- 0.0387280564053207
- 0.03636386449609316
- 0.1232919644120742
- 0.02436843026096497
- 0.105029920398094
- -0.04958909666485345
- 0.1571536440104042
- 0.09413394319090297
- 0.02778480497282315
- 0.242970079969737
- 0.05254355219572528
- -0.1491449572648123
- -0.2470931260985709
- -0.01228434964796932
- 0.06355811607304208
- -0.01801595088186521
- -0.1910898859593492
- 0.1710955844748312
- -0.04559702767684875
- -0.0575111478414921
- -0.1488699793011382
- 0.2160837867296408
- -0.09833048311603559
- 0.2740762243973532
- 0.196460202462964
- -0.04266482443068737
- -0.2423002631251164
- 0.1866997313613146
- 0.05979064644694732
- -0.01414401353868161
- 0.08321797256258102
- -0.06857585315923068
- 0.1715112604644914
- -0.0189034493966019
- -0.07612876755441057
- -0.04571124698200564
- -0.02707626665785414
- -0.06726814877846153
- -0.07933713540823693
- -0.2232363880387216
- -0.1225110647427899
- -0.07901557311162304
- -0.2434038726792088
- 0.04182391231946075
- 0.02040372413535894
- 0.2642931236104718
- 0.065054883743249
- -0.1934153114319666
- -0.1062764570509464
- 0.01285726935331507
- -0.06215941491929874
- 0.1678446925262784
- -0.09865782692429458
- 0.07530151382627132
- -0.1013625340775283
- 0.009583628919469565
- 0.08935997037860935
- 0.001550289089127295
- -0.07335378231021988
- 0.02747888374533144
- -0.05307225774444272
- -0.225229891765628
- -0.2466469657963566
- 0.0622060053526241
- -0.01521296570200277
- -0.1970300499474153
- 0.1215176040584392
- 0.03322006227892838
- -0.04844281483073029
- -0.08415868964479693
- -0.2851960309152597
- -0.02841991724320317
- 0.004328912759733721
- 0.1294844674217196
- 0.02323963952147449
- -0.08702828184693133
- -0.1455058609075093
- 0.1995832547453136
- -0.0963625077337103
- -0.1375888779685707
- -0.005097603978441743
- -0.0871715942930449
- 0.2948677723918121
- -0.1961953557700017
- 0.05063085134576723
- -0.05485224718210201
- -0.02511095975751573
- 0.0738554145551166
- -0.09901626591372396
- 0.06946042014560544
- -0.07429564005875608
- -0.2455272837770868
- 0.03372532696013532
- -0.08439936125553943
- -0.1572832469890588
- 0.1421293893193454
- 0.1350828196257556
- 0.01284495548336082
- 0.02401257811824288
- 0.2376645902786213
- -0.04768422021523566
- 0.008506985254358865
- 0.09221586488938285
- 0.1594568175859658
- 0.2398227844303611
- 0.2217887753200039
- -0.01367038094914552
- -0.06609246442513816
- -0.2536997173938265
- 0.08045561624986598
- 0.1193326939600289
- 0.04853212560949158
- -0.04788513564622857
- 0.09820725089378556
- 0.01490145766813217
- 0.09373763915343922
- 0.0897072289251121
- 0.09499907894080312
- 0.272505682209672
- -0.2857589771181943
- 0.005304615118724173
- 0.05316934366000153
- 0.01670147793074279
- -0.1685523439260301
- -0.1047253643943811
- -0.2014958780552916
- -0.01753126891589298
- 0.04638300742964078
- 0.1865532167008373
- -0.1041550692098078
- -0.2857638552509695
- -0.8394358504816395
- 0.3330390755443413
- 0.173604750818609
- -0.1949895278003864
- -0.11034922746134
- 0.08305215006310965
- 0.1910586669010612
- 0.0624507135870807
- 0.2033769226006744
- -0.1332893388753211
- -0.1665040500810019
- -0.1583995945363945
- -0.0928760555111864
- 0.1046645926228185
- 0.08948613255992462
- 0.1390079420677361
- -0.1168928404998971
- -0.1222877571044974
- 0.02071735304784578
- 0.06101889198176324
- 0.04341097822694753
- -0.1040487411973801
- -0.1930880413023381
- -0.2651315941018598
- -0.06857898767141712
- 0.04354947542368268
- 0.06072415507640783
- -0.2081057198639228
- -0.1170660072676494
- 0.06315832519668199
- -0.01618372455765315
- -0.06229440929331015
- -0.1567795831060125
- -0.139993917471725
- 0.06967841651494464
- -0.01157645040402994
- 0.2714731163939807
- -0.09094984260662788
- 0.1715229016506518
- 0.1123678629388844
- -0.0953055252276355
- -0.2378751782795372
- 0.01218028128948376
- 0.1417061355775053
- -0.09060031938931913
- 0.03143406610038076
- 0.06406970945828171
- 0.00789120192992214
- 0.08503060820804119
- 0.06586642608064781
- 0.01501737721700442
- -0.05287204124357602
- -0.04459814410608586
- -0.2643918429045177
- 0.08606248389917648
- 0.2163985425078364
- 0.2084730316286358
- -0.009923413481752378
- 0.1376473206377184
- -0.1256474104629678
- 0.1797438248182083
- -0.0528458399648412
- 0.06226020372455229
- 0.007729067427583284
- -0.08258941472058653
- -0.1016452553720866
- -0.003163777303716113
- 0.1406984451120088
- 0.06031349150870733
- -0.03691463724772255
- 0.105088024901643
- 0.02358620124652299
- 0.1201299972636165
- -0.3475476490803814
- -0.0742841930401084
- 0.198497449725175
- -0.0633362323960646
- -0.1966852856580519
- 0.08521942360899989
- 0.1506537818464838
- 0.2114699598939301
- -0.01776267690472441
- -0.04440858070327856
- 0.003079306746925076
- 0.007120375745703148
- -0.217518055554508
- 0.2750843488415229
- 0.03434634955464149
- -0.1756095706398672
- 0.03544462957076241
- 0.4709577299861736
- -0.02746333873121611
- -0.08733991476199504
- 0.04348846502484977
- -0.02695563459697091
- 0.1007257842131707
- 0.2036253770829468
- 0.05487190823942002
- 0.05536619806041074
- 0.131265496918509
- -0.2545897950563981
- -0.1813137866248553
- 0.1644956298879932
- 0.03406397304977367
- 0.2742647458265721
- 0.03612786816975609
- 0.05366755624078459
- -0.002242693382883745
- 0.3077909261259039
- 0.07480294633403545
- 0.1038367356579036
- -0.05317065623529878
- -0.03449087402103904
- 0.06688730844735781
- -0.02575597697681738
- 0.03044747743062777
- -0.1353819500594901
- 0.002417498432139633
- 0.1101825131866615
- 0.0919828128933208
- -0.1439948250968756
- -0.1047273023889282
- 0.166282388944002
- -0.2020929261190566
- -0.107451519642646
- -0.05634226151267367
- -0.01853034273477917
- 0.1817293184379292
- -0.003283480805546549
- 0.03667594122847624
- -0.06916593471154825
- 0.307169001970326
- 0.02469560769794513
- 0.09469772985034791
- 0.1867527749713585
- -0.1230908802114091
- -0.1909553472482549
- -0.2204450052591909
- -0.07092543100988956
- 0.2294652216754263
- 0.03816382623221562
- -0.009400920012224982
- 0.1915875431217992
- 0.01820930314708271
- -0.0619969906367219
- -0.1565322933149482
- 0.1157588638822702
- -0.1751806538241918
- 0.2295575250339776
- -0.05884628955432975
- -0.1097375186682496
- -0.1781749429765534
- 0.2162688496726471
- 0.0225355614780918
- -0.07849648776723586
- -0.01547965292772258
- -0.1153197350031277
- 0.07895824076700365
- 0.05065324858367866
- -0.1085494286285821
- -0.0379692199225021
- -0.09879446437686498
- -0.1253687360897433
- -0.04399958723243259
- -0.1327717233439862
- -0.1891844271346936
- 0.1365897278433574
- -0.4072177659113166
- -0.1423190421710968
- 0.002569210771690537
- 0.2874981836456109
- -0.0451481065719694
- -0.1254153236881238
- 0.1173968851598019
- 0.02373553294657881
- 0.3662965379428074
- 0.3346136570276884
- -0.05717662342641277
- 0.03293252356079885
- -0.02784304467878897
- -0.09214284097721631
- -0.002668431416544305
- -0.1347840225293861
- -0.03883720970638058
- 0.0002532185932718686
- -0.04818120634933561
- -0.2334561183354495
- -0.1592639424552839
- 0.02857859370708266
- -0.1001967303563061
- -0.1363043656655723
- 0.1162742307337141
- 0.06110858262281978
- -0.04375289436171732
- 0.0002603326247158308
- -0.2556094979182465
- 0.001616731568954928
- -0.04893769491895026
- 0.0963305594616868
- 0.1536209272985045
- -0.1935464003918078
- -0.09095698386345863
- 0.1534695823746832
- -0.2571331879374995
- -0.03247827224784545
- -0.2176747306769753
- -0.08464400767846247
- 0.369657359737719
- -0.02603595411742499
- 0.1063412520548481
- 0.004150612307143683
- 0.1239008337604071
- 0.1628892741047316
- -0.07768359672987041
- 0.06108909165579486
- 0.003405857181209642
- -0.07765376042059041
- 0.003320485950160026
- -0.01086861632902177
- -0.122078218606576
- 0.02393691286549908
- 0.06713997366639572
- 0.08898611607835161
- -0.02379243913273671
- 0.2949912814331299
- 0.1350614374648974
- 0.04881340104260548
- 0.1313005175892898
- -0.05043049072684099
- 0.1997599225730803
- 0.1331853724035849
- 0.03310678334263119
- -0.09492731892301552
- 0.03823474521755243
- -0.004415351525256783
- 0.112180980330195
- -0.03234104256631049
- 0.1472018282967266
- -0.09018514576631975
- 0.07544746126523917
- 0.1166113632468761
- 0.08275494188757555
- 0.07278778610114685
- 0.2597969514123001
- -0.1841205434537519
- 0.06788021895957397
- 0.002852335989421522
- -0.2493773200438772
- -0.1500862029925856
- 0.03890592159244441
- -0.07527513568205077
- -0.0309070538452651
- -0.0298841983279069
- 0.1440875574115637
- -0.05018906262328114
- -0.06025221539547261
- 0.21401768860684
- 0.1493930142401384
- 0.1333652585828323
- -0.1644513860689316
- -0.1073181293398727
- 0.1917320319030454
- 0.04211720043513827
- -0.03325617410057424
- 0.2358847962085744
- -0.05531576552570384
- 0.05270157556976172
- -0.02204619127250945
- -0.05606127005459256
- 0.02982912792683756
- -0.02712518468388254
- 0.2952018668094087
- -0.009964997687088591
- -0.03046183918404762
- 0.04857529176171757
- 0.03043983288723968
- 0.01194376398546001
- -0.2067805618562731
- -0.1427842314855997
- -0.2869698997130766
- -0.01754440457903484
- -0.1189582216535462
- 0.2111332403638705
- -0.03105682135869399
- -0.04749585051152591
- 0.0946820396112875
- -0.02623963438519194
- -0.2913698748998487
- -0.2527033466974923
- -0.01292672680845454
- 0.167227040710764
- -0.1118497216760054
- 0.1373157790798296
- -0.1064750291744089
- 0.25052084295729
- 0.02332718041178225
- -0.07064340503825219
- -0.3456836491069989
- 0.1611961252647666
- 0.08760562437004332
- -0.1662756750750775
- 0.0526247766559812
- 0.02529274647444501
- -0.09326957765490271
- 0.03959060965422974
- -0.1348052647751649
- -0.1002186676596551
- -0.01269827705926385
- -0.02411956016849976
- -0.262654857829906
- 0.02634585573229658
- 0.03059574017434615
- 0.1334453440583568
- -0.1095658904969446
- 0.1653660058320955
- -0.1136809261605006
- 0.1428038840878058
- -0.05498598280404418
- 0.2294913039841647
- 0.03080683617387336
- -0.3096504146489982
- 0.05558356921026913
- -0.2264985011241068
- 0.03556299064781845
- 0.3678144671983024
- 0.0751761179683321
- 0.08152764270123794
- -0.06493472510581649
- 0.1304829098615351
- -0.1963527938965993
- -0.07529733889630785
- 0.1800076492009783
- -0.1542377218219825
- -0.1451314883212949
- 0.08344166652972178
- 0.05291208484804868
- -0.007913258494954755
- -0.03039124200121655
- 0.04152829385599959
- -0.07994400191575796
- -0.02694551195409341
- -0.2792023304016716
- 0.182922872568378
- -0.04793443758820662
- -0.1988501180364287
- -0.02313241602466044
- 0.3806790349750098
- -0.1087354764359422
- -0.0235633636573383
- 0.05543209692211608
- -0.01119442471601603
- 0.1495509220089313
- 0.1731985277075746
- 0.02608732062190484
- 0.2286027832429134
- -0.06109695995265021
- -0.2236285563540323
- -0.1926920427073123
- -0.03794520281908435
- 0.1075356138273536
- 0.1363843578238267
- 0.05236801337224944
- 0.07315242602667636
- 0.09120667067391078
- 0.2673917413667651
- -0.04928426751819683
- -0.1242584633656258
- -0.07351478269641104
- 0.003555001656605677
- 0.1865312501760474
- -0.2478980546448966
- 0.03891423303705837
- 0.09271232658029689
- 0.09990992167686555
- 0.04975465166628711
- 0.06237688864617102
- -0.1618745567144718
- -0.2072815728074243
- 3.24320887345834e-05
- -0.009324489084374568
- 0.02516269431032846
- -0.05100859800583433
- -0.0671930965950919
- -0.02951213277188766
- -0.06777233683864496
- -0.09339641768732099
- -0.1972348870531456
- 0.3439146165567926
- -0.04434332484378644
- 0.2407616698867662
- 0.07362486219683421
- -0.2782920205084793
- -0.0877032592308811
- -0.06949037920661379
- -0.05722336869839895
- 0.3020109799810665
- 0.1845736443705813
- 0.1639268362941793
- 0.0007454141494778137
- 0.1011307220756484
- 0.05352505760522216
- -0.1124356121406138
- -0.006314398380578822
- -0.1817709975861904
- 0.07690033839008623
- -0.06109448276466303
- -0.1022404490233799
- -0.02667620582706734
- 0.09629110625137843
- -0.02431260261297468
- -0.07644195566754071
- -0.1186587514424158
- -0.1011749903692891
- -0.1564408651720882
- 0.08805601365843475
- -0.07064913600645135
- -0.02635840998600408
- -0.1078314746964917
- -0.1709695145951056
- 0.01479845069411982
- -0.01381638575244491
- -0.1550512932185826
- 0.2503777385827729
- -0.2390248644176812
- -0.2883893597409654
- -0.06181291307901987
- 0.1582364175796699
- -0.02312071621553637
- 0.00217638563547544
- 0.3237854977363662
- -0.03252544620611295
- 0.003750133894739771
- 0.009671642707881114
- -0.009497472747113498
- 0.07116666910192301
- 0.08816537960315252
- -0.06363471414932657
- -0.09448929109059846
- -0.1838435758631711
- 0.03492670834095708
- 0.04311774220442871
- 0.01678837491608537
- -0.08551317416391886
- 0.01579603526355288
- 0.04714940819834743
- -0.06812683188087337
- 0.04021687008946623
- 0.06658770294854371
- 0.04200650408334704
- 0.02648272347175153
- 0.1171065218544724
- -0.1580241793274017
- -0.04345466645506941
- -0.05306499481440482
- 0.07072616774249532
- 0.2393715380477287
- -0.1142803782761256
- 0.007919304164271446
- 0.03903245447045534
- -0.1972537874679361
- 0.1808024692666788
- -0.1496471578524902
- -0.03601188242560322
- 0.2450678955523587
- 0.1267384878365154
- -0.01909164755778832
- 0.01601852906118508
-
-
diff --git a/octave/vq_700c_eq.m b/octave/vq_700c_eq.m
deleted file mode 100644
index 3e57b9a..0000000
--- a/octave/vq_700c_eq.m
+++ /dev/null
@@ -1,366 +0,0 @@
-% vq_700c.m
-% David Rowe May 2019
-%
-% Researching Codec 2 700C VQ equaliser ideas
-% See also scripts/train_700c_quant.sh, tnewamp1.m
-
-melvq;
-newamp_700c;
-
-% general purpose plot function for looking at averages of K-band
-% sequences in scripts dir and VQs:
-% vq_700c_plots({"hts2a.f32" "vk5qi.f32" "train_120_1.txt"})
-
-function vq_700c_plots(fn_array)
- K = 20; rate_K_sample_freqs_kHz = mel_sample_freqs_kHz(K);
- freq_Hz = rate_K_sample_freqs_kHz * 1000;
-
- figure(1); clf; hold on; axis([200 4000 40 90]); title('Max Hold');
- figure(2); clf; hold on; axis([200 4000 0 40]); title('Average');
-
- for i=1:length(fn_array)
- [dir name ext] = fileparts(fn_array{i});
- if strcmp(ext, ".f32")
- % f32 feature file
- fn = sprintf("../build_linux/%s%s", name, ext)
- bands = load_f32(fn , K);
- else
- % text file (e.g. existing VQ)
- bands = load(fn_array{i});
- end
- % for max hold: break into segments of Nsec, find max, average maximums
- % this avoids very rare global peaks setting the max
- Nsec = 10; Tframe = 0.01; frames_per_seg = Nsec/Tframe
- Nsegs = floor(length(bands)/frames_per_seg)
- max_holds = zeros(Nsegs, K);
- if Nsegs == 0
- max_holds = max(bands)
- else
- for s=1:Nsegs
- st = (s-1)*frames_per_seg+1; en = st + frames_per_seg - 1;
- max_holds(s,:) = max(bands(st:en,:));
- end
- max_holds = mean(max_holds);
- end
- figure(1); plot(freq_Hz, max_holds, '+-', 'linewidth', 2);
- figure(2); plot(freq_Hz, mean(bands), '+-', 'linewidth', 2);
- end
- figure(1); legend(fn_array); grid; xlabel('Freq (Hz)'); ylabel('Amp dB');
- figure(2); legend(fn_array); grid; xlabel('Freq (Hz)'); ylabel('Amp dB');
-endfunction
-
-
-% limit mean of each vector to between lower_lim and upper_lim
-function vout = limit_vec(vin, lower_lim, upper_lim)
- m = mean(vin');
- vout = zeros(size(vin));
- for i=1:length(vin)
- vec_no_mean = vin(i,:) - m(i);
- if m(i) < lower_lim
- m(i) = lower_lim;
- end
- if m(i) > upper_lim
- m(i) = upper_lim;
- end
- vout(i,:) = vec_no_mean + m(i);
- end
-endfunction
-
-
-% single stage vq a target matrix
-function errors = vq_targets(vq, targets)
- errors = [];
- for i=1:length(targets)
- [mse_list index_list] = search_vq(vq, targets(i,:), 1);
- error = targets(i,:) - vq(index_list(1),:);
- errors = [errors; error];
- end
-endfunction
-
-
-% single stage vq a target matrix with adaptive EQ, this didn't work
-
-function [errors eqs] = vq_targets_adap_eq(vq, targets, eqs)
- errors = []; gain=0.02;
- eq = eqs(end,:);
- for i=1:length(targets)
- t = targets(i,:) - eq;
- mean(t)
- %t -= mean(t);
- [mse_list index_list] = search_vq(vq, t, 1);
- error = t - vq(index_list(1),:);
- eq = (1-gain)*eq + gain*error;
- errors = [errors; error]; eqs = [eqs; eq];
- end
-endfunction
-
-
-% single stage vq a target matrix with block adaptive EQ, this works
-% well with nblock == 10
-
-function [errors eq] = vq_targets_block_eq(vq, targets, eq, nblock)
- errors = []; n = 0; [tmp K] = size(vq); error_eq = zeros(1,K); gain=0.20;
- for i=1:length(targets)
- t = targets(i,:) - eq;
- [mse_list index_list] = search_vq(vq, t, 1);
- error = t - vq(index_list(1),:);
- error_eq += error;
- errors = [errors; error];
- n++;
- if n == nblock
- eq = 0.99*eq + gain*error_eq/nblock;
- n = 0; error_eq = zeros(1,K);
- end
- end
-endfunction
-
-
-% two stage mbest VQ a target matrix
-
-function [errors targets_] = vq_targets2(vq1, vq2, targets)
- vqset(:,:,1)= vq1; vqset(:,:,2)=vq2; m=5;
- [errors targets_] = mbest(vqset, targets, m);
-endfunction
-
-
-% two stage mbest VQ a target matrix, with adap_eq
-
-function [errors targets_ eq] = vq_targets2_adap_eq(vq1, vq2, targets, eq)
- vqset(:,:,1)= vq1; vqset(:,:,2)=vq2; m=5; gain=0.02;
- errors = []; targets_ = [];
- for i=1:length(targets)
- t = targets(i,:)-eq;
- t -= mean(t')';
- [error target_ indexes] = mbest(vqset, t, m);
- % use first stage VQ as error driving adaptive EQ
- eq_error = t - vq1(indexes(1),:);
- eq = (1-gain)*eq + gain*eq_error;
- errors = [errors; error]; targets_ = [targets_; target_];
- end
-endfunction
-
-
-% Given target and vq matrices, estimate eq via two metrics. First
-% metric seems to work best. Both uses first stage VQ error for EQ
-
-function [eq1 eq2] = est_eq(vq, targets)
- [ntargets K] = size(targets);
- [nvq K] = size(vq);
-
- eq1 = zeros(1,K); eq2 = zeros(1,K);
- for i=1:length(targets)
- [mse_list index_list] = search_vq(vq, targets(i,:), 1);
-
- % eq metric 1: average of error for best VQ entry
- eq1 += targets(i,:) - vq(index_list(1),:);
-
- % eq metric 2: average of error across all VQ entries
- for j=1:nvq
- eq2 += targets(i,:) - vq(j,:);
- end
- end
-
- eq1 /= ntargets;
- eq2 /= (ntargets*nvq);
-endfunction
-
-function [targets e] = load_targets(fn_target_f32)
- nb_features = 41;
- K = 20;
-
- % .f32 files are in scripts directory, first K values rate_K_no_mean vectors
- [dir name ext] = fileparts(fn_target_f32);
- fn = sprintf("../script/%s_feat.f32", name);
- feat = load_f32(fn, nb_features);
- e = feat(:,1);
- targets = feat(:,2:K+1);
-endfunction
-
-% rather simple EQ in front of VQ
-
-function [eqs ideal] = est_eq_front(targets)
- [tmp K] = size(targets);
- ideal = [ 8 10 12 14 14*ones(1,K-1-4) -20];
- eq = zeros(1,K); gain = 0.02;
- eqs = [];
- for i=1:length(targets)
- update = targets(i,:) - ideal;
- eq = (1-gain)*eq + gain*update;
- eq(find(eq < 0)) = 0;
- eqs = [eqs; eq];
- end
-endfunction
-
-function table_across_samples
- K = 20;
-
- % VQ is in .txt file in this directory, we have two to choose from. train_120 is the Codec 2 700C VQ,
- % train_all_speech was trained up from a different, longer database, as a later exercise
- vq_name = "train_120";
- #vq_name = "train_all_speech";
- vq1 = load(sprintf("%s_1.txt", vq_name));
- vq2 = load(sprintf("%s_2.txt", vq_name));
-
- printf("----------------------------------------------------------------------------------\n");
- printf("Sample Initial vq1 vq1_eq2 vq1_eq2 vq2 vq2_eq1 vq2_eq2 \n");
- printf("----------------------------------------------------------------------------------\n");
-
- fn_targets = { "cq_freedv_8k_lfboost" "cq_freedv_8k_hfcut" "cq_freedv_8k" "hts1a" "hts2a" "cq_ref" "ve9qrp_10s" "vk5qi" "c01_01_8k" "ma01_01"};
- #fn_targets = {"cq_freedv_8k_lfboost"};
- figs=1;
- for i=1:length(fn_targets)
-
- % load target and estimate eq
- [targets e] = load_targets(fn_targets{i});
- eq1 = est_eq(vq1, targets);
- eq2s = est_eq_front(targets);
- % for these simulation uses fixed EQ sample, rather than letting it vary frame by frame
- eq2 = eq2s(end,:);
-
- % first stage VQ -----------------
-
- errors1 = vq_targets(vq1, targets);
- errors1_eq1 = vq_targets(vq1, targets-eq1);
- errors1_eq2 = vq_targets(vq1, targets-eq2);
-
- % two stage mbest VQ --------------
-
- [errors2 targets_] = vq_targets2(vq1, vq2, targets);
- [errors2_eq1 targets_eq1_] = vq_targets2(vq1, vq2, targets-eq1);
- [errors2_eq2 targets_eq2_] = vq_targets2(vq1, vq2, targets-eq2);
-
- % save to .f32 files for listening tests
- if strcmp(vq_name,"train_120")
- save_f32(sprintf("../script/%s_vq2.f32", fn_targets{i}), targets_);
- save_f32(sprintf("../script/%s_vq2_eq1.f32", fn_targets{i}), targets_eq1_);
- save_f32(sprintf("../script/%s_vq2_eq2.f32", fn_targets{i}), targets_eq2_);
- else
- save_f32(sprintf("../script/%s_vq2_as.f32", fn_targets{i}), targets_);
- save_f32(sprintf("../script/%s_vq2_as_eq.f32", fn_targets{i}), targets_eq_);
- end
- printf("%-21s %6.2f %6.2f %6.2f %6.2f %6.2f %6.2f %6.2f\n", fn_targets{i},
- var(targets(:)), var(errors1(:)), var(errors1_eq1(:)), var(errors1_eq2(:)),
- var(errors2(:)), var(errors2_eq1(:)), var(errors2_eq2(:)));
-
- figure(figs++); clf;
- %plot(var(errors2'),'b;vq2;'); hold on; plot(var(errors2_eq1'),'g;vq2_eq1;'); plot(var(errors2_eq2'),'r;vq2_eq2;'); hold off;
- plot(mean(targets),'g;mean(targets);'); hold on; plot(mean(vq1),'g;mean(vq1);'); plot(eq2,'r;eq2;'); hold off;
- title(fn_targets{i}); axis([1 K -20 30]);
- end
-endfunction
-
-
-% interactve, menu driven frame by frame plots
-
-function interactive(fn_vq_txt, fn_target_f32)
- K = 20;
- vq = load("train_120_1.txt");
- [targets e] = load_targets(fn_target_f32);
- eq1 = est_eq(vq, targets);
-
- [errors1_eq2 eqs2] = vq_targets_adap_eq(vq, targets, zeros(1,K));
- [errors1_eq2 eqs2] = vq_targets_adap_eq(vq, targets, eqs2(end,:));
- eq2 = eqs2(end,:);
-
- figure(1); clf;
- mesh(e+targets)
- figure(2); clf;
- plot(eq1,'b;eq1;')
- hold on;
- plot(mean(targets),'c;mean(targets);'); plot(eq2,'g;eq2;');
- hold off;
- figure(3); clf; mesh(eqs2); title('eq2 evolving')
-
- % enter single step loop
- f = 20; neq = 0; eq=zeros(1,K);
- do
- figure(4); clf;
- t = targets(f,:) - eq;
- [mse_list index_list] = search_vq(vq, t, 1);
- error = t - vq(index_list(1),:);
- plot(e(f)+t,'b;target;');
- hold on;
- plot(e(f)+vq(index_list,:),'g;vq;');
- plot(error,'r;error;');
- plot(eq,'c;eq;');
- plot([1 K],[e(f) e(f)],'--')
- hold off;
- axis([1 K -20 80])
- % interactive menu
-
- printf("\r f: %2d eq: %d ind: %3d var: %3.1f menu: n-next b-back e-eq q-quit", f, neq, index_list(1), var(error));
- fflush(stdout);
- k = kbhit();
-
- if k == 'n' f+=1; end
- if k == 'e'
- neq++;
- end
- if neq == 3 neq = 0; end
- if neq == 0 eq = zeros(1,K); end
- if neq == 1 eq = eq1; end
- if neq == 2 eq = eqs2(f,:); end
- if k == 'b' f-=1; end
- until (k == 'q')
- printf("\n");
-endfunction
-
-
-% Experiment to test iterative approach of block update and remove
-% mean (ie frame energy), shows some promise at reducing HF energy
-% over several iterations while not affecting already good samples
-
-function experiment_iterate_block(fn_vq_txt, fn_target_f32)
- K = 20;
- vq = load("train_120_1.txt");
- [targets e] = load_targets(fn_target_f32);
-
- figure(1); clf;
- plot(mean(targets),'b;mean(targets);');
- hold on;
- plot(mean(vq), 'g;mean(vq);');
- figure(2); clf; hold on;
- eq = zeros(1,K);
- for i=1:3
- [errors eq] = vq_targets_block_eq(vq, targets, eq, 10);
- figure(1); plot(mean(targets-eq));
- figure(2); plot(eq);
- printf("i: %d %6.2f\n", i, var(errors(:)))
- end
-endfunction
-
-% Experiment to test EQ of input (before) VQ. We set a threshold on
-% when to equalise, so we don't upset already flat-ish samples. This
-% is the algorithm used for C at the time of writing (newamp1.c, newamp_700c.m)
-
-function experiment_front_eq(fn_vq_txt, fn_target_f32)
- K = 20;
- vq = load("train_120_1.txt");
- [targets e] = load_targets(fn_target_f32);
-
- [eqs ideal] = est_eq_front(targets);
-
- figure(1); clf;
- plot(mean(targets),'b;mean(targets);');
- hold on;
- plot(ideal, 'g;ideal;');
- plot(eqs(end,:), 'r;eq;');
- plot(mean(targets)-eqs(end,:), 'c;equalised;');
- plot(mean(vq),'b--;mean(vq);');
- hold off;
- figure(2); clf; mesh(eqs(1:100,:)); title('EQ weights over time');
- ylabel('Time (frames'); xlabel('Freq (mel)');
-endfunction
-
-more off
-
-% choose one of these to run first
-% You'll need to run scripts/train_700C_quant.sh first to generate the .f32 files
-
-%interactive("train_120_1.txt", "cq_freedv_8k_lfboost.f32")
-%table_across_samples;
-%vq_700c_plots({"all_speech_8k.f32" "all_speech_8k_hp300.f32" "dev-clean-8k.f32" "train_8k.f32" } )
-%vq_700c_plots({"ve9qrp_10s.f32" "cq_freedv_8k_lfboost.f32" "cq_ref.f32" "hts1a.f32" "vk5qi.f32"})
-%experiment_iterate_block("train_120_1.txt", "ve9qrp_10s.f32")
-%experiment_iterate_block("train_120_1.txt", "cq_freedv_8k_lfboost.f32")
-%experiment_front_eq("train_120_1.txt", "cq_freedv_8k_lfboost.f32")
diff --git a/octave/vq_binary_switch.m b/octave/vq_binary_switch.m
deleted file mode 100644
index 19b0172..0000000
--- a/octave/vq_binary_switch.m
+++ /dev/null
@@ -1,210 +0,0 @@
-% vq_binary_switch.m
-% David Rowe Sep 2021
-%
-% Experiments in making VQs robust to bit errors, this is an Octave
-% implementation of [1].
-%
-% [1] Pseudo Gray Coding, Zeger & Gersho 1990
-
-1;
-
-% returns indexes of hamming distance 1 neighbours
-function index_neighbours = distance_one_neighbours(N,k)
- log2N = log2(N);
- index_neighbours = [];
- for b=0:log2N-1
- index_neighbour = bitxor(k-1,2.^b) + 1;
- index_neighbours = [index_neighbours index_neighbour];
- end
-end
-
-% equation (33) of [1], for hamming distance 1
-function c = cost_of_distance_one(vq, prob, k, verbose=0)
- [N K] = size(vq);
- log2N = log2(N);
- c = 0;
- for b=0:log2N-1
- index_neighbour = bitxor(k-1,2.^b) + 1;
- diff = vq(k,:) - vq(index_neighbour, :);
- dist = sum(diff*diff');
- c += prob(k)*dist;
- if verbose
- printf("k: %d b: %d index_neighbour: %d dist: %f prob: %f c: %f \n", k, b, index_neighbour, dist, prob(k), c);
- end
- end
-endfunction
-
-% equation (39) of [1]
-function d = distortion_of_current_mapping(vq, prob, verbose=0)
- [N K] = size(vq);
-
- d = 0;
- for k=1:N
- c = cost_of_distance_one(vq, prob, k);
- d += c;
- if verbose
- printf("k: %2d c: %f d: %f\n", k, c, d);
- end
- end
-endfunction
-
-function [vq distortion] = binary_switching(vq, prob, max_iteration, fast_en=1)
- [N K] = size(vq);
- iteration = 0;
- i = 1;
- finished = 0;
- switches = 0;
- distortion0 = distortion_of_current_mapping(vq, prob)
-
- while !finished
-
- % generate a list A(i) of which vectors have the largest cost of bit errors
- c = zeros(1,N);
- for k=1:N
- c(k) = cost_of_distance_one(vq, prob, k);
- end
- [tmp A] = sort(c,"descend");
-
- % Try switching each vector with A(i)
- best_delta = 0;
- for j=2:N
- % we can't switch with ourself
- if j != A(i)
- if fast_en
- delta = -cost_of_distance_one(vq, prob, A(i)) - cost_of_distance_one(vq, prob, j);
- n1 = [distance_one_neighbours(N,A(i)) distance_one_neighbours(N,j)];
- n1(n1 == A(i)) = [];
- n1(n1 == j) = [];
- for l=1:length(n1)
- delta -= cost_of_distance_one(vq, prob, n1(l));
- end
- else
- distortion1 = distortion_of_current_mapping(vq, prob);
- end
-
- % switch vq entries A(i) and j
- tmp = vq(A(i),:);
- vq(A(i),:) = vq(j,:);
- vq(j,:) = tmp;
-
- if fast_en
- delta += cost_of_distance_one(vq, prob, A(i)) + cost_of_distance_one(vq, prob, j);
- for l=1:length(n1)
- delta += cost_of_distance_one(vq, prob, n1(l));
- end
- else
- distortion2 = distortion_of_current_mapping(vq, prob);
- delta = distortion2 - distortion1;
- end
-
- if delta < 0
- if abs(delta) > best_delta
- best_delta = abs(delta);
- best_j = j;
- end
- end
-
- % unswitch
- tmp = vq(A(i),:);
- vq(A(i),:) = vq(j,:);
- vq(j,:) = tmp;
- end
- end % next j
-
- % printf("best_delta: %f best_j: %d\n", best_delta, best_j);
- if best_delta == 0
- % Hmm, no improvement, lets try the next vector in the sorted cost list
- if i == N
- finished = 1;
- else
- i++;
- end
- else
- % OK keep the switch that minimised the distortion
-
- tmp = vq(A(i),:);
- vq(A(i),:) = vq(best_j,:);
- vq(best_j,:) = tmp;
- switches++;
-
- % set up for next iteration
- iteration++;
- distortion = distortion_of_current_mapping(vq, prob);
- printf("it: %3d dist: %f %3.2f i: %3d sw: %3d\n", iteration, distortion,
- distortion/distortion0, i, switches);
- if iteration >= max_iteration, finished = 1, end
- i = 1;
- end
-
- end
-
-endfunction
-
-% return indexes of hamming distance one vectors
-function ind = neighbour_indexes(vq, k)
- [N K] = size(vq);
- log2N = log2(N);
- ind = [];
- for b=0:log2N-1
- index_neighbour = bitxor(k-1,2.^b) + 1;
- ind = [ind index_neighbour];
- end
-endfunction
-
-function test_binary_switch
- vq1 = [1 1; -1 1; -1 -1; 1 -1];
- %f=fopen("vq1.f32","wb"); fwrite(f, vq1, 'float32'); fclose(f);
- [vq2 distortion] = binary_switching(vq1, ones(1,4), 10);
- % algorithm should put hamming distance 1 neighbours in adjacent quadrants
- distance_to_closest_neighbours = 2;
- % there are two hamming distance 1 neighbours
- target_distortion = 2^2*distance_to_closest_neighbours*length(vq1);
- assert(target_distortion == distortion);
- printf("test_binary_switch OK!\n");
-endfunction
-
-function test_fast
- N=16; % Number of VQ codebook vectors
- K=2; % Vector length
- Ntrain=10000;
-
- training_data = randn(Ntrain,K);
- [idx vq1] = kmeans(training_data, N);
- f=fopen("vq1.f32","wb");
- for r=1:rows(vq1)
- fwrite(f,vq1(r,:),"float32");
- end
- fclose(f);
- [vq2 distortion] = binary_switching(vq1, [1 ones(1,N-1)], 1000, fast_en = 0);
- [vq3 distortion] = binary_switching(vq1, [1 ones(1,N-1)], 1000, fast_en = 1);
- assert(vq2 == vq3);
- printf("test_fast OK!\n");
-endfunction
-
-function demo
- N=16; % Number of VQ codebook vectors
- K=2; % Vector length
- Ntrain=10000;
- training_data = randn(Ntrain,K);
- [idx vq1] = kmeans(training_data, N);
- [vq2 distortion] = binary_switching(vq1, [1 ones(1,N-1)], 1000, 1);
-
- figure(1); clf; plot(training_data(:,1), training_data(:,2),'+');
- hold on;
- plot(vq1(:,1), vq1(:,2),'og','linewidth', 2);
- plot(vq2(:,1), vq2(:,2),'or','linewidth', 2);
-
- % plot hamming distance 1 neighbours
- k = 1;
- ind = neighbour_indexes(vq2, k);
- for i=1:length(ind)
- plot([vq2(k,1) vq2(ind(i),1)],[vq2(k,2) vq2(ind(i),2)],'r-','linewidth', 2);
- end
- hold off;
-endfunction
-
-pkg load statistics
-%test_binary_switch;
-test_fast;
-%demo
-
diff --git a/octave/vq_compare.m b/octave/vq_compare.m
deleted file mode 100644
index 0a156c1..0000000
--- a/octave/vq_compare.m
+++ /dev/null
@@ -1,349 +0,0 @@
-% vq_compare.m
-% David Rowe Sep 2021
-%
-% Compare the Eb/No performance of Vector Quantisers (robustness to bit errors) using
-% Spectral Distortion (SD) measure.
-
-#{
- usage:
-
- 1. Generate the initial VQ (vq_stage1.f32) and input test vector file (all_speech_8k_lim.f32):
-
- cd codec2/build_linux
- ../script/train_trellis.sh
-
- 2. Run the Psuedo-Gray binary switch tool to optimise the VQ against single bit errors:
-
- ./misc/vq_binary_switch -d 20 vq_stage1.f32 vq_stage1_bs001.f32 -m 5000 --st 2 --en 16 -f
-
- This can take a while, but if you ctrl-C at any time it will have saved the most recent optimised VQ.
-
- 3. Run this script to compare the two VQs:
-
- octave:34> vq_compare
-#}
-
-
-function vq_compare(action="run_curves", vq_fn, dec=1, EbNodB=3, in_fn, out_fn)
- more off;
- randn('state',1);
- graphics_toolkit("gnuplot");
-
- if strcmp(action, "run_curves")
- run_curves(30*100);
- end
- if strcmp(action, "vq_file")
- vq_file(vq_fn, dec, EbNodB, in_fn, out_fn)
- end
-endfunction
-
-
-% -------------------------------------------------------------------
-
-% converts a decimal value to a soft dec binary value
-function c = dec2sd(dec, nbits)
-
- % convert to binary
-
- c = zeros(1,nbits);
- for j=0:nbits-1
- mask = 2.^j;
- if bitand(dec,mask)
- c(nbits-j) = 1;
- end
- end
-
- % map to +/- 1
-
- c = -1 + 2*c;
-endfunction
-
-% fast version of vector quantiser
-function [indexes target_] = vector_quantiser_fast(vq, target, verbose=1)
- [vq_size K] = size(vq);
- [ntarget tmp] = size(target);
- target_ = zeros(ntarget,K);
- indexes = zeros(1,ntarget);
-
- % pre-compute energy of each VQ vector
- vqsq = zeros(vq_size,1);
- for i=1:vq_size
- vqsq(i) = vq(i,:)*vq(i,:)';
- end
-
- % use efficient matrix multiplies to search for best match to target
- for i=1:ntarget
- best_e = 1E32;
- e = vqsq - 2*(vq * target(i,:)');
- [best_e best_ind] = min(e);
- if verbose printf("best_e: %f best_ind: %d\n", best_e, best_ind), end;
- target_(i,:) = vq(best_ind,:); indexes(i) = best_ind;
- end
-endfunction
-
-
-% VQ a target sequence of frames then run a test using vanilla uncoded/trellis decoder
-function results = run_test(target, vq, EbNo, verbose)
- [frames tmp] = size(target);
- [vq_length tmp] = size(vq);
- nbits = log2(vq_length);
- nerrors = 0;
- tbits = 0;
- nframes = 0;
- nper = 0;
-
- % Vector Quantise target vectors sequence
- [tx_indexes target_ ] = vector_quantiser_fast(vq, target, verbose);
- % use convention of indexes starting from 0
- tx_indexes -= 1;
- % mean SD of VQ with no errors
- diff = target - target_;
- mse_noerrors = mean(diff(:).^2);
-
- % construct tx symbol codewords from VQ indexes
- tx_codewords = zeros(frames, nbits);
- for f=1:frames
- tx_codewords(f,:) = dec2sd(tx_indexes(f), nbits);
- end
-
- rx_codewords = tx_codewords + randn(frames, nbits)*sqrt(1/(2*EbNo));
- rx_indexes = zeros(1,frames);
-
- for f=1:frames
- tx_bits = tx_codewords(f,:) > 0;
- rx_bits = rx_codewords(f,:) > 0;
- rx_indexes(f) = sum(rx_bits .* 2.^(nbits-1:-1:0));
- errors = sum(xor(tx_bits, rx_bits));
- nerrors += errors;
- if errors nper++;, end
- tbits += nbits;
- nframes++;
- end
-
- EbNodB = 10*log10(EbNo);
- target_ = vq(rx_indexes+1,:);
- diff = target - target_;
- mse = mean(diff(:).^2);
- printf("Eb/No: %3.2f dB nframes: %3d nerrors: %4d BER: %4.3f PER: %3.2f mse: %3.2f %3.2f\n",
- EbNodB, nframes, nerrors, nerrors/tbits, nper/nframes, mse_noerrors, mse);
- results.ber = nerrors/tbits;
- results.per = nper/nframes;
- results.mse_noerrors = mse_noerrors;
- results.mse = mse;
- results.tx_indexes = tx_indexes;
- results.rx_indexes = rx_indexes;
-endfunction
-
-% VQ a target sequence of frames then run a test using a LDPC code
-function results = run_test_ldpc(target, vq, EbNo, verbose)
- [frames tmp] = size(target);
- [vq_length tmp] = size(vq);
- nbits = log2(vq_length);
- nerrors = 0;
- tbits = 0;
- nframes = 0;
- nper = 0;
-
- % init LDPC code
- mod_order = 4; bps = 2;
- modulation = 'QPSK';
- mapping = 'gray';
- max_iterations = 100; demod_type = 0; decoder_type = 0;
- ldpc; init_cml();
- tempStruct = load("HRA_56_56.txt");
- b = fieldnames(tempStruct);
- ldpcArrayName = b{1,1};
- % extract the array from the struct
- HRA = tempStruct.(ldpcArrayName);
- [code_param framesize rate] = ldpc_init_user(HRA, modulation, mod_order, mapping);
-
- % set up noise
- EbNodB = 10*log10(EbNo);
- EsNodB = EbNodB + 10*log10(rate) + 10*log10(bps);
- EsNo = 10^(EsNodB/10);
- variance = 1/EsNo;
-
- % Vector Quantise target vectors sequence
- [tx_indexes target_ ] = vector_quantiser_fast(vq, target, verbose);
- % use convention of indexes starting from 0
- tx_indexes -= 1;
- % mean SD of VQ with no errors
- diff = target - target_;
- mse_noerrors = mean(diff(:).^2);
-
- % construct tx frames x nbit matrix using VQ indexes
- tx_bits = zeros(frames, nbits);
- for f=1:frames
- tx_bits(f,:) = dec2sd(tx_indexes(f), nbits) > 0;
- end
-
- % find a superframe size, that has an integer number of nbits and data_bits_per_frame frames
- bits_per_superframe = nbits;
- while mod(bits_per_superframe,nbits) || mod(bits_per_superframe,code_param.data_bits_per_frame)
- bits_per_superframe += nbits;
- end
-
- Nsuperframes = floor(frames*nbits/bits_per_superframe);
- Nldpc_codewords = Nsuperframes*bits_per_superframe/code_param.data_bits_per_frame;
- frames = Nsuperframes*bits_per_superframe/nbits;
- %printf("bits_per_superframe: %d Nldpc_codewords: %d frames: %d\n", bits_per_superframe, Nldpc_codewords, frames);
-
- % reshape tx_bits matrix into Nldpc_codewords x data_bits_per_frame
- tx_bits = tx_bits(1:frames,:);
- tx_bits_ldpc = reshape(tx_bits',code_param.data_bits_per_frame, Nldpc_codewords)';
-
- % modulate tx symbols
- tx_symbols = [];
- for nn=1:Nldpc_codewords
- [tx_codeword atx_symbols] = ldpc_enc(tx_bits_ldpc(nn,:), code_param);
- tx_symbols = [tx_symbols atx_symbols];
- end
-
- noise = sqrt(variance*0.5)*(randn(1,length(tx_symbols)) + j*randn(1,length(tx_symbols)));
- rx_symbols = tx_symbols+noise;
-
- % LDPC decode
- for nn = 1:Nldpc_codewords
- st = (nn-1)*code_param.coded_syms_per_frame + 1;
- en = (nn)*code_param.coded_syms_per_frame;
-
- arx_codeword = ldpc_dec(code_param, max_iterations, demod_type, decoder_type, rx_symbols(st:en), EsNo, ones(1,code_param.coded_syms_per_frame));
- rx_bits_ldpc(nn,:) = arx_codeword(1:code_param.data_bits_per_frame);
- end
-
- % reshape rx_bits_ldpc matrix into frames x nbits
- rx_bits = reshape(rx_bits_ldpc',nbits,frames)';
-
- rx_indexes = tx_indexes;
- for f=1:frames
- rx_indexes(f) = sum(rx_bits(f,:) .* 2.^(nbits-1:-1:0));
- errors = sum(xor(tx_bits(f,:), rx_bits(f,:)));
- nerrors += errors;
- if errors nper++;, end
- tbits += nbits;
- nframes++;
- end
-
- EbNodB = 10*log10(EbNo);
- target_ = vq(rx_indexes+1,:);
- diff = target - target_;
- mse = mean(diff(:).^2);
- printf("Eb/No: %3.2f dB nframes: %4d nerrors: %4d BER: %4.3f PER: %3.2f mse: %3.2f %3.2f\n",
- EbNodB, nframes, nerrors, nerrors/tbits, nper/nframes, mse_noerrors, mse);
- results.ber = nerrors/tbits;
- results.per = nper/nframes;
- results.mse = mse;
- results.tx_indexes = tx_indexes;
- results.rx_indexes = rx_indexes;
-endfunction
-
-% Simulations ---------------------------------------------------------------------
-
-% top level function to set up and run a test with a specific vq
-function [results target_] = run_test_vq(vq_fn, target_fn, nframes=100, dec=1, EbNodB=3, ldpc_en=0, verbose=0)
- K = 20; K_st=2+1; K_en=16+1;
-
- % load VQ
- vq = load_f32(vq_fn, K);
- [vq_size tmp] = size(vq);
- vqsub = vq(:,K_st:K_en);
-
- % load sequence of target vectors we wish to VQ
- target = load_f32(target_fn, K);
-
- % limit test to the first nframes vectors
- if nframes != -1
- last = nframes;
- else
- last = length(target);
- end
- target = target(1:dec:last, K_st:K_en);
-
- % run a test
- EbNo=10^(EbNodB/10);
- if ldpc_en
- results = run_test_ldpc(target, vqsub, EbNo, verbose);
- else
- results = run_test(target, vqsub, EbNo, verbose);
- end
- if verbose
- for f=2:nframes-1
- printf("f: %03d tx_index: %04d rx_index: %04d\n", f, results.tx_indexes(f), results.rx_indexes(f));
- end
- end
-
- % return full band vq-ed vectors
- target_ = zeros(last,K);
- target_(1:dec:last,:) = vq(results.rx_indexes+1,:);
-
- % use linear interpolation to restore original frame rate
- for f=1:dec:last-dec
- prev = f; next = f + dec;
- for g=prev+1:next-1
- cnext = (g-prev)/dec; cprev = 1 - cnext;
- target_(g,:) = cprev*target_(prev,:) + cnext*target_(next,:);
- %printf("f: %d g: %d cprev: %f cnext: %f\n", f, g, cprev, cnext);
- end
- end
-endfunction
-
-% generate sets of curves
-function run_curves(frames=100, dec=1)
- target_fn = "../build_linux/all_speech_8k_lim.f32";
- EbNodB = 0:5;
-
- results1_ldpc_log = [];
- for i=1:length(EbNodB)
- results = run_test_vq("../build_linux/vq_stage1.f32", target_fn, frames, dec, EbNodB(i), ldpc_en=1, verbose=0);
- results1_ldpc_log = [results1_ldpc_log results];
- end
- results4_ldpc_log = [];
- for i=1:length(EbNodB)
- results = run_test_vq("../build_linux/vq_stage1_bs004.f32", target_fn, frames, dec, EbNodB(i), ldpc_en=1, verbose=0);
- results4_ldpc_log = [results4_ldpc_log results];
- end
-
- results1_log = [];
- for i=1:length(EbNodB)
- results = run_test_vq("../build_linux/vq_stage1.f32", target_fn, frames, dec, EbNodB(i), ldpc_en=0, verbose=0);
- results1_log = [results1_log results];
- end
- results4_log = [];
- for i=1:length(EbNodB)
- results = run_test_vq("../build_linux/vq_stage1_bs004.f32", target_fn, frames, dec, EbNodB(i), ldpc_en=0, verbose=0);
- results4_log = [results4_log results];
- end
- for i=1:length(results1_log)
- ber(i) = results1_log(i).ber;
- per(i) = results1_log(i).per;
- mse_noerrors(i) = sqrt(results1_log(i).mse_noerrors);
- mse_vq1(i) = sqrt(results1_log(i).mse);
- mse_vq4(i) = sqrt(results4_log(i).mse);
- mse_vq1_ldpc(i) = sqrt(results1_ldpc_log(i).mse);
- mse_vq4_ldpc(i) = sqrt(results4_ldpc_log(i).mse);
- end
-
- figure(1); clf;
- semilogy(EbNodB, ber, 'g+-;ber;','linewidth', 2); hold on;
- semilogy(EbNodB, per, 'b+-;per;','linewidth', 2);
- grid('minor'); xlabel('Eb/No(dB)');
- hold off;
-
- figure(2); clf;
- plot(EbNodB, mse_noerrors, "b+-;no errors;"); hold on;
- plot(EbNodB, mse_vq1, "g+-;vanilla AWGN;");
- plot(EbNodB, mse_vq4, "b+-;binary switch;");
- plot(EbNodB, mse_vq1_ldpc, "r+-;ldpc (112,56);");
- plot(EbNodB, mse_vq4_ldpc, "k+-;binary switch ldpc (112,56);");
- load trellis_dec3_nstage3.txt
- plot(EbNodB, rms_sd, "c+-;binary switch trellis dec3;");
- hold off; grid; title("RMS SD (dB)"); xlabel('Eb/No(dB)');
-endfunction
-
-
-function vq_file(vq_fn, dec, EbNodB, in_fn, out_fn)
- [results target_] = run_test_vq(vq_fn, in_fn, nframes=-1, dec, EbNodB, verbose=0);
- save_f32(out_fn, target_);
-endfunction
-
-
diff --git a/octave/vq_nm_xx_11_40_hpf150 b/octave/vq_nm_xx_11_40_hpf150
deleted file mode 100644
index bc11f3c..0000000
--- a/octave/vq_nm_xx_11_40_hpf150
+++ /dev/null
@@ -1,1615 +0,0 @@
-# Created by Octave 4.0.0, Wed Jul 26 19:10:53 2017 ACST <david@penetrator>
-# name: vq
-# type: matrix
-# rows: 1608
-# columns: 30
- 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0
- 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0
- 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0
- 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0
- 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0
- 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0
- 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0
- 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0
- 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0
- 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0
- 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0
- 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0
- 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0
- 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0
- 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0
- 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0
- 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0
- 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0
- 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0
- 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0
- 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0
- 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0
- 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0
- 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0
- 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0
- 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0
- 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0
- 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0
- 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0
- 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0
- 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0
- 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0
- 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0
- 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0
- 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0
- 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0
- 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0
- 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0
- 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0
- 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0
- 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0
- 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0
- 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0
- 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0
- 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0
- 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0
- 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0
- 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0
- 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0
- 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0
- 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0
- 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0
- 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0
- 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0
- 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0
- 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0
- 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0
- 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0
- 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0
- 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0
- 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0
- 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0
- 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0
- 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0
- 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0
- 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0
- 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0
- 12 18 12 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 12 18 12 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 12 18 12 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 12 18 12 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 12 18 12 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 12 18 12 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 12 18 12 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 12 18 12 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 12 18 12 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0
- 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0
- 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0
- 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0
- 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0
- 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0
- 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0
- 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0
- 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0
- 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0
- 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0
- 12 18 12 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 12 18 12 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 12 18 12 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 12 18 12 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 12 18 12 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 12 18 12 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 12 18 12 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 12 18 12 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0
- 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0
- 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0
- 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0
- 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0
- 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0
- 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0
- 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0
- 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0
- 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0
- 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0
- 12 18 12 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 12 18 12 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 12 18 12 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 12 18 12 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 12 18 12 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 12 18 12 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 12 18 12 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0
- 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0
- 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0
- 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0
- 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0
- 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0
- 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0
- 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0
- 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0
- 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0
- 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0
- 12 18 12 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 12 18 12 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 12 18 12 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 12 18 12 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 12 18 12 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 12 18 12 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0
- 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0
- 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0
- 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0
- 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0
- 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0
- 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0
- 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0
- 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0
- 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0
- 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0
- 12 18 12 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 12 18 12 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 12 18 12 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 12 18 12 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 12 18 12 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0
- 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0
- 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0
- 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0
- 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0
- 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0
- 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0
- 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0
- 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0
- 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0
- 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0
- 12 18 12 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 12 18 12 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 12 18 12 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 12 18 12 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0
- 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0
- 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0
- 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0
- 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0
- 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0
- 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0
- 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0
- 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0
- 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0
- 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0
- 12 18 12 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 12 18 12 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 12 18 12 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0
- 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0
- 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0
- 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0
- 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0
- 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0
- 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0
- 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0
- 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0
- 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0
- 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0
- 12 18 12 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 12 18 12 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0
- 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0
- 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0
- 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0
- 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0
- 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0
- 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0
- 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0
- 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0
- 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0
- 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0
- 12 18 12 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0
- 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0
- 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0
- 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0
- 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0
- 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0
- 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0
- 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0
- 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0
- 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0
- 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0
- 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0
- 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0
- 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0
- 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0
- 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0
- 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0
- 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0
- 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0
- 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0
- 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0
- 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0
- 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0
- 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0
- 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0
- 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0
- 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0
- 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0
- 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0
- 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0
- 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0
- 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0
- 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0
- 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0
- 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0
- 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0
- 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0
- 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0
- 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0
- 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0
- 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0
- 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0
- 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0
- 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0
- 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0
- 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0
- 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0
- 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0
- 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0
- 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0
- 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0
- 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0
- 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0
- 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0
- 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0
- 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0
- 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0
- 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0
- 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0
- 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0
- 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0
- 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0
- 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0
- 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0
- 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0
- 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0
- 0 12 18 12 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 12 18 12 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 12 18 12 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 12 18 12 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 12 18 12 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 12 18 12 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 12 18 12 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 12 18 12 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0
- 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0
- 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0
- 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0
- 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0
- 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0
- 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0
- 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0
- 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0
- 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0
- 0 12 18 12 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 12 18 12 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 12 18 12 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 12 18 12 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 12 18 12 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 12 18 12 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 12 18 12 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0
- 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0
- 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0
- 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0
- 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0
- 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0
- 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0
- 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0
- 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0
- 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0
- 0 12 18 12 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 12 18 12 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 12 18 12 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 12 18 12 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 12 18 12 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 12 18 12 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0
- 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0
- 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0
- 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0
- 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0
- 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0
- 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0
- 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0
- 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0
- 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0
- 0 12 18 12 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 12 18 12 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 12 18 12 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 12 18 12 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 12 18 12 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0
- 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0
- 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0
- 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0
- 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0
- 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0
- 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0
- 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0
- 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0
- 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0
- 0 12 18 12 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 12 18 12 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 12 18 12 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 12 18 12 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0
- 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0
- 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0
- 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0
- 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0
- 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0
- 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0
- 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0
- 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0
- 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0
- 0 12 18 12 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 12 18 12 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 12 18 12 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0
- 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0
- 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0
- 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0
- 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0
- 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0
- 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0
- 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0
- 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0
- 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0
- 0 12 18 12 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 12 18 12 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0
- 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0
- 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0
- 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0
- 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0
- 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0
- 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0
- 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0
- 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0
- 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0
- 0 12 18 12 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0
- 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0
- 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0
- 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0
- 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0
- 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0
- 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0
- 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0
- 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0
- 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0
- 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0
- 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0
- 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0
- 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0
- 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0
- 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0
- 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0
- 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0
- 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0
- 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0
- 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0
- 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0
- 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0
- 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0
- 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0
- 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0
- 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0
- 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0
- 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0
- 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0
- 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0
- 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0
- 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0
- 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0
- 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0
- 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0
- 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0
- 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0
- 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0
- 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0
- 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0
- 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0
- 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0
- 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0
- 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0
- 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0
- 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0
- 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0
- 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0
- 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0
- 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0
- 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0
- 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0
- 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0
- 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0
- 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0
- 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0
- 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0
- 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0
- 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0
- 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0
- 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0
- 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0
- 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0
- 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0
- 0 0 12 18 12 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 12 18 12 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 12 18 12 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 12 18 12 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 12 18 12 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 12 18 12 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 12 18 12 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0
- 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0
- 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0
- 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0
- 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0
- 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0
- 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0
- 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0
- 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0
- 0 0 12 18 12 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 12 18 12 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 12 18 12 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 12 18 12 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 12 18 12 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 12 18 12 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0
- 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0
- 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0
- 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0
- 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0
- 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0
- 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0
- 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0
- 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0
- 0 0 12 18 12 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 12 18 12 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 12 18 12 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 12 18 12 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 12 18 12 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0
- 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0
- 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0
- 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0
- 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0
- 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0
- 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0
- 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0
- 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0
- 0 0 12 18 12 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 12 18 12 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 12 18 12 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 12 18 12 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0
- 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0
- 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0
- 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0
- 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0
- 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0
- 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0
- 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0
- 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0
- 0 0 12 18 12 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 12 18 12 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 12 18 12 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0
- 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0
- 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0
- 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0
- 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0
- 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0
- 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0
- 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0
- 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0
- 0 0 12 18 12 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 12 18 12 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0
- 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0
- 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0
- 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0
- 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0
- 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0
- 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0
- 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0
- 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0
- 0 0 12 18 12 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0
- 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0
- 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0
- 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0
- 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0
- 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0
- 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0
- 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0
- 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0
- 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0
- 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0
- 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0
- 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0
- 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0
- 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0
- 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0
- 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0
- 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0
- 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0
- 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0
- 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0
- 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0
- 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0
- 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0
- 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0
- 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0
- 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0
- 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0
- 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0
- 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0
- 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0
- 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0
- 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0
- 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0
- 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0
- 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0
- 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0
- 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0
- 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0
- 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0
- 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0
- 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0
- 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0
- 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0
- 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0
- 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0
- 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0
- 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0
- 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0
- 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0
- 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0
- 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0
- 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0
- 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0
- 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0
- 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0
- 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0
- 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0
- 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0
- 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0
- 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0
- 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0
- 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0
- 0 0 0 12 18 12 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 12 18 12 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 12 18 12 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 12 18 12 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 12 18 12 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 12 18 12 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0
- 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0
- 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0
- 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0
- 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0
- 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0
- 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0
- 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0
- 0 0 0 12 18 12 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 12 18 12 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 12 18 12 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 12 18 12 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 12 18 12 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0
- 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0
- 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0
- 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0
- 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0
- 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0
- 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0
- 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0
- 0 0 0 12 18 12 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 12 18 12 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 12 18 12 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 12 18 12 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0
- 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0
- 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0
- 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0
- 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0
- 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0
- 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0
- 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0
- 0 0 0 12 18 12 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 12 18 12 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 12 18 12 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0
- 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0
- 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0
- 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0
- 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0
- 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0
- 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0
- 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0
- 0 0 0 12 18 12 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 12 18 12 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0
- 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0
- 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0
- 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0
- 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0
- 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0
- 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0
- 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0
- 0 0 0 12 18 12 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0
- 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0
- 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0
- 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0
- 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0
- 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0
- 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0
- 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0
- 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0
- 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0
- 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0
- 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0
- 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0
- 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0
- 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0
- 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0
- 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0
- 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0
- 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0
- 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0
- 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0
- 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0
- 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0
- 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0
- 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0
- 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0
- 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0
- 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0
- 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0
- 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0
- 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0
- 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0
- 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0
- 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0
- 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0
- 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0
- 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0
- 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0
- 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0
- 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0
- 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0
- 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0
- 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0
- 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0
- 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0
- 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0
- 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0
- 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0
- 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0
- 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0
- 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0
- 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0
- 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0
- 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0
- 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0
- 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0
- 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0
- 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0
- 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0
- 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0
- 0 0 0 0 12 18 12 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 12 18 12 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 12 18 12 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 12 18 12 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 12 18 12 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0
- 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0
- 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0
- 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0
- 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0
- 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0
- 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0
- 0 0 0 0 12 18 12 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 12 18 12 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 12 18 12 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 12 18 12 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0
- 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0
- 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0
- 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0
- 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0
- 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0
- 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0
- 0 0 0 0 12 18 12 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 12 18 12 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 12 18 12 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0
- 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0
- 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0
- 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0
- 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0
- 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0
- 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0
- 0 0 0 0 12 18 12 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 12 18 12 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0
- 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0
- 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0
- 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0
- 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0
- 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0
- 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0
- 0 0 0 0 12 18 12 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0
- 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0
- 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0
- 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0
- 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0
- 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0
- 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0
- 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0
- 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0
- 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0
- 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0
- 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0
- 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0
- 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0
- 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0
- 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0
- 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0
- 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0
- 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0
- 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0
- 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0
- 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0
- 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0
- 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0
- 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0
- 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0
- 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0
- 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0
- 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0
- 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0
- 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0
- 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0
- 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0
- 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0
- 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0
- 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0
- 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0
- 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0
- 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0
- 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0
- 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0
- 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0
- 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0
- 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0
- 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0
- 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0
- 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0
- 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0
- 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0
- 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0
- 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0
- 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0
- 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0
- 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0
- 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0
- 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0
- 0 0 0 0 0 12 18 12 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 12 18 12 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 12 18 12 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 12 18 12 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0
- 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0
- 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0
- 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0
- 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0
- 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0
- 0 0 0 0 0 12 18 12 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 12 18 12 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 12 18 12 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0
- 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0
- 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0
- 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0
- 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0
- 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0
- 0 0 0 0 0 12 18 12 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 12 18 12 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0
- 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0
- 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0
- 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0
- 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0
- 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0
- 0 0 0 0 0 12 18 12 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0
- 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0
- 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0
- 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0
- 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0
- 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0
- 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0
- 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0
- 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0
- 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0
- 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0
- 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0
- 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0
- 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0
- 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0
- 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0
- 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0
- 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0
- 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0
- 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0
- 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0
- 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0
- 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0
- 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0
- 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0
- 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0
- 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0
- 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0
- 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0
- 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0
- 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0
- 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0
- 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0
- 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0
- 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0
- 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0
- 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0
- 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0
- 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0
- 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0
- 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0
- 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0
- 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0
- 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0
- 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0
- 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0
- 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0
- 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0
- 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0
- 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0
- 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0
- 0 0 0 0 0 0 12 18 12 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 12 18 12 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 12 18 12 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0
- 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0
- 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0
- 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0
- 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0
- 0 0 0 0 0 0 12 18 12 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 12 18 12 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0
- 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0
- 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0
- 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0
- 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0
- 0 0 0 0 0 0 12 18 12 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0
- 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0
- 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0
- 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0
- 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0
- 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0
- 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0
- 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0
- 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0
- 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0
- 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0
- 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0
- 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0
- 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0
- 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0
- 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0
- 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0
- 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0
- 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0
- 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0
- 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0
- 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0
- 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0
- 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0
- 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0
- 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0
- 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0
- 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0
- 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0
- 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0
- 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0
- 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0
- 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0
- 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0
- 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0
- 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0
- 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0
- 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0
- 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0
- 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0
- 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0
- 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0
- 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0
- 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0
- 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0
- 0 0 0 0 0 0 0 12 18 12 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 12 18 12 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0
- 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0
- 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0
- 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0
- 0 0 0 0 0 0 0 12 18 12 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0
- 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0
- 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0
- 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0
- 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0
- 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0
- 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0
- 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0
- 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0
- 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0
- 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0
- 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0
- 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0
- 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0
- 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0
- 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0
- 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0
- 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0
- 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0
- 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0
- 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0
- 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0
- 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0
- 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0
- 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0
- 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0
- 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0
- 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0
- 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0
- 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0
- 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0
- 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0
- 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0
- 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0
- 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0
- 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0
- 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0
- 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0
- 0 0 0 0 0 0 0 0 12 18 12 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0
- 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0
- 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0
- 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0
- 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0
- 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0
- 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0
- 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0
- 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0
- 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0
- 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0
- 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0
- 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0
- 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0
- 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0
- 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0
- 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0
- 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0
- 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0
- 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0
- 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0
- 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0
- 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0
- 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0
- 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0
- 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0
- 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0
- 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0
- 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0
- 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0
- 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0
- 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0
- 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0
- 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0
- 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0
- 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0
- 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0
- 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0
- 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0
- 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0
- 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0
- 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0
- 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0
- 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0
- 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0
- 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0
- 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0
- 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0
- 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0
- 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0
- 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0
- 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0
- 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0
- 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0
- 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0
- 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0
- 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0
- 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 12 18 12 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 12 18 12 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 12 18 12 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 12 18 12 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 12 18 12 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 12 18 12 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 12 18 12 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 12 18 12 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 12 18 12 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 12 18 12 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 12 18 12 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 12 18 12 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 12 18 12 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 12 18 12 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 12 18 12 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 12 18 12 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 12 18 12 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 12 18 12 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 12 18 12 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 12 18 12 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 12 18 12 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 12 18 12 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 12 18 12 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 12 18 12 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 12 18 12 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 12 18 12 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 12 18 12 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 12 18 12 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 12 18 12 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 12 18 12 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 12 18 12 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 12 18 12 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 12 18 12 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 12 18 12 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 12 18 12 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 12 18 12 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 12 18 12 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 12 18 12 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 12 18 12 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 12 18 12 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 12 18 12 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 12 18 12 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 12 18 12 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 12 18 12 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 12 18 12 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 12 18 12 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 12 18 12 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 12 18 12 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 12 18 12 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 12 18 12 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 12 18 12 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 12 18 12 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 12 18 12 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 12 18 12 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 12 18 12 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 12 18 12 0 0 0
-
-
diff --git a/raw/700d_end_over.raw b/raw/700d_end_over.raw
deleted file mode 100644
index 2fe5e77..0000000
--- a/raw/700d_end_over.raw
+++ /dev/null
Binary files differ
diff --git a/raw/big_dog.raw b/raw/big_dog.raw
deleted file mode 100644
index 1716364..0000000
--- a/raw/big_dog.raw
+++ /dev/null
Binary files differ
diff --git a/raw/cq_ref.raw b/raw/cq_ref.raw
deleted file mode 100644
index 485703d..0000000
--- a/raw/cq_ref.raw
+++ /dev/null
Binary files differ
diff --git a/raw/cross.raw b/raw/cross.raw
deleted file mode 100644
index 1b2af6a..0000000
--- a/raw/cross.raw
+++ /dev/null
Binary files differ
diff --git a/raw/f2400.raw b/raw/f2400.raw
deleted file mode 100644
index 5f4427f..0000000
--- a/raw/f2400.raw
+++ /dev/null
Binary files differ
diff --git a/raw/forig.raw b/raw/forig.raw
deleted file mode 100644
index 4ba294d..0000000
--- a/raw/forig.raw
+++ /dev/null
Binary files differ
diff --git a/raw/g3plx.raw b/raw/g3plx.raw
deleted file mode 100644
index 9970c3f..0000000
--- a/raw/g3plx.raw
+++ /dev/null
Binary files differ
diff --git a/raw/hts.raw b/raw/hts.raw
deleted file mode 100644
index 79f869a..0000000
--- a/raw/hts.raw
+++ /dev/null
Binary files differ
diff --git a/raw/hts2.raw b/raw/hts2.raw
deleted file mode 100644
index 0bb9df1..0000000
--- a/raw/hts2.raw
+++ /dev/null
Binary files differ
diff --git a/raw/hts2a.raw b/raw/hts2a.raw
deleted file mode 100644
index 6d9cf17..0000000
--- a/raw/hts2a.raw
+++ /dev/null
Binary files differ
diff --git a/raw/m2400.raw b/raw/m2400.raw
deleted file mode 100644
index 1c0956d..0000000
--- a/raw/m2400.raw
+++ /dev/null
Binary files differ
diff --git a/raw/mmt1.raw b/raw/mmt1.raw
deleted file mode 100644
index 40638a5..0000000
--- a/raw/mmt1.raw
+++ /dev/null
Binary files differ
diff --git a/raw/morig.raw b/raw/morig.raw
deleted file mode 100644
index 4af0e8f..0000000
--- a/raw/morig.raw
+++ /dev/null
Binary files differ
diff --git a/raw/sine1k_2Hz_spread.raw b/raw/sine1k_2Hz_spread.raw
deleted file mode 100644
index 1b8ad9c..0000000
--- a/raw/sine1k_2Hz_spread.raw
+++ /dev/null
Binary files differ
diff --git a/raw/sine1k_2ms_delay_2Hz_spread.raw b/raw/sine1k_2ms_delay_2Hz_spread.raw
deleted file mode 100644
index 4d3e09e..0000000
--- a/raw/sine1k_2ms_delay_2Hz_spread.raw
+++ /dev/null
Binary files differ
diff --git a/raw/speech_orig_16k.wav b/raw/speech_orig_16k.wav
deleted file mode 100644
index 737d9a5..0000000
--- a/raw/speech_orig_16k.wav
+++ /dev/null
Binary files differ
diff --git a/raw/test_datac1_006.raw b/raw/test_datac1_006.raw
deleted file mode 100644
index 72fb20d..0000000
--- a/raw/test_datac1_006.raw
+++ /dev/null
Binary files differ
diff --git a/raw/vk5qi.raw b/raw/vk5qi.raw
deleted file mode 100644
index fdfcd5d..0000000
--- a/raw/vk5qi.raw
+++ /dev/null
Binary files differ
diff --git a/script/gen_phi0 b/script/gen_phi0
deleted file mode 100755
index af01a31..0000000
--- a/script/gen_phi0
+++ /dev/null
@@ -1,136 +0,0 @@
-#!/usr/bin/python3
-
-import math
-
-# Save the points in separate lists
-points_t1 = [] # A list of tuples (x, r)
-points_t2 = [] # A list of tuples (x, r)
-points_t3 = [] # A list of tuples (x, r)
-
-######################################################
-# Generate
-######################################################
-
-adj = 0.50 # Offset ratio for step of 1, estimate
-
-def loop_even(upper, lower, step, ary):
- result = []
- for i in range((int)(upper * step), (int)(lower * step), -1):
- x = i / step
- z = math.exp(x + (adj / step))
- r = math.log((z+1)/(z-1))
- ary.append( (x, r) )
-
-#####
-# Create initial list which will be sorted desending
-
-# Tbl-1 9:5 in linear steps of 0.5
-loop_even(9.999, 4.999, 2, points_t1)
-
-# Tbl-2 5:1 in linear steps of 1/16
-loop_even(4.999, 0.999, 16, points_t2)
-
-# Tbl-3 log steps: 1/(2^0.5), 1/(2^1), 1/(2^1.5), ...
-for i in range(1, 28):
- e = (2 ** (i/2))
- x = 1.0 / e
- z = math.exp(x+ (.19 / e))
- r = math.log((z+1)/(z-1))
- points_t3.append( (x, r) )
-
-
-######################################################
-# Output
-######################################################
-
-print("""
-// phi0.c
-//
-// An approximation of the function
-//
-// This file is generated by the gen_phi0 scripts
-// Any changes should be made to that file, not this one
-
-#include <stdint.h>
-
-#define SI16(f) ((int32_t)(f * (1<<16)))
-
-float phi0( float xf ) {
-
- int32_t x = SI16(xf);
-
- if (x >= SI16(10.0f)) return(0.0f);
-""", end="")
-
-
-##################################
-# Tbl-1 9:5 in linear steps of 0.5 (9.5, 9.0, 8.5, 8.0, .., 5.0)
-print(""" else {
- if (x >= SI16(5.0f)) {
- int i = 19 - (x >> 15);
- switch (i) {
-""", end="")
-for i in range(len(points_t1)):
- #assert(points_t1[i][0] == ((18 - i) / 2))
- print("{}case {}: return({:.9f}f); // ({:.1f})".format(
- (10*" "), i, points_t1[i][1], points_t1[i][0]))
-print("{}}}".format(( 8*" ")))
-print("{}}}".format(( 6*" ")))
-
-
-##################################
-# Tbl-2 5:1 in linear steps of 1/16 (4-15/16, 4-7/7, ... 1)
-print(""" else {
- if (x >= SI16(1.0f)) {
- int i = 79 - (x >> 12);
- switch (i) {
-""", end="")
-for i in range(len(points_t2)):
- #assert(points_t2[i][0] == ((18 - i) / 2))
- print("{}case {}: return({:.9f}f); // ({:.4f})".format(
- (12*" "), i, points_t2[i][1], points_t2[i][0]))
-print("{}}}".format((10*" ")))
-print("{}}}".format(( 8*" ")))
-
-
-##################################
-# Tbl-3 log steps: 1/(2^0.5), 1/(2^1), 1/(2^1.5), ...
-# Output as a balanced search
-
-def prnt_cmp(x, ind):
- print("{}if (x > SI16({:.6f}f)) {{".format((" "*ind), x))
-
-def prnt_rtn(r, ind):
- print("{}return({:.9f}f);".format((" "*ind), r))
-
-def one_level(pts, ind, dft):
- #print("# One_Level({})".format(pts))
- mid = (int)(len(pts)/2)
- lft = pts[:mid]
- rgt = pts[mid+1:]
- x = pts[mid][0]
- r = pts[mid][1]
- #print("## {}, {}, {}".format(lft, x, rgt))
- prnt_cmp(x, ind)
- if (len(lft)):
- one_level(lft, ind+2, r)
- else:
- prnt_rtn(r, (ind+2))
- print("{}}} else {{".format((" "*(ind))))
- if (len(rgt)):
- one_level(rgt, ind+2, dft)
- else:
- prnt_rtn(dft, (ind+2))
- print("{}}}".format((" "*(ind))))
-
-
-# Start recursive process
-print("{}else {{".format((8*" ")))
-indent = 10
-one_level(points_t3, indent, 10)
-print("{}}}".format((8*" "))) # End of tb1_1
-print("{}}}".format((6*" "))) # End of tb1_2
-print("{}}}".format((4*" "))) # End of tb1_3
-print("{}return(10.0f);".format((4*" ")))
-print("}")
-
diff --git a/script/ofdm_stack_use.py b/script/ofdm_stack_use.py
deleted file mode 100755
index 9356cf1..0000000
--- a/script/ofdm_stack_use.py
+++ /dev/null
@@ -1,150 +0,0 @@
-#! /usr/bin/python3
-
-""" Find stack usage using
- - compiler generated tables of stack use per function, *.c.su
- - run time trace output from compiler added enter/exit calls.
-
-Just for ofdm_stack at this point
-
-This script expects to be run in the .../build_linux/unittest directory!
-"""
-
-COMP_DIR = 'CMakeFiles/ofdm_stack.dir'
-EXE_FILE = './ofdm_stack'
-
-import sys
-import os
-import argparse
-import pathlib
-import subprocess
-
-##########################
-# Options
-
-## Trace file (name) or default
-## Use existing trace file or run command
-argparser = argparse.ArgumentParser()
-argparser.add_argument('-f', '--trace_file', action='store', default='function_trace.out',
- help='Name of trace file, (default is "function_trace.out"')
-argparser.add_argument('-x', '--exec', action='store_true', default=False,
- help='Execute program')
-
-args = argparser.parse_args()
-
-
-##########################
-# Checking
-cwd_path = pathlib.Path.cwd()
-# One simple thing we can handle is running from above unittest (in build_linux)
-if ((cwd_path.name != 'unittest') and
- (pathlib.Path('unittest').exists())):
- os.chdir('unittest')
-
-# Required files
-assert(pathlib.Path(COMP_DIR).exists())
-assert(pathlib.Path(COMP_DIR + '/ofdm_stack.c.su').exists())
-assert(pathlib.Path(COMP_DIR + '/__/src/ofdm.c.su').exists())
-
-
-##########################
-# If trace file not found, or option set, run command
-if ( not (pathlib.Path(args.trace_file).exists())):
- print('Trace file "{}" not found, running program'.format(args.trace_file))
- args.exec = True
-
-if (args.exec):
- print('Running program: "{}"'.format(EXE_FILE))
- assert(pathlib.Path(EXE_FILE))
- result = subprocess.run([EXE_FILE],
- stdout=subprocess.PIPE,
- stderr=subprocess.STDOUT)
- if (result.returncode != 0):
- print('Error: traced program failed! Output:\n{}'.format(result.stdout))
-assert(pathlib.Path(args.trace_file).exists())
-
-
-##########################
-# Data Structures
-su_data = {} # <function> : <stack_size>
-funcs_used = {} # <function> : count
-
-##########################
-# Read compiler generated tables of stack use per function, *.c.su
-#
-# ofdm_stack.c:184:6:dummy_code 16 static
-#
-
-p = pathlib.Path(COMP_DIR)
-for fpath in p.rglob('*.c.su'):
- with fpath.open() as f:
- for line in f.readlines():
- try:
- words = line.split()
- size = int(words[1])
- words = words[0].split(':')
- su_data[words[3]] = size
- except: pass # skip this line if there are errors
-
-##########################
-# Read trace file, convert addresses to names, track stack
-
-max_stack_depth = 0
-cur_stack_depth = 0
-stack = [] # List of tuples of (function names, cur_stack_depth)
-last_func = 'start'
-
-def walk_stack():
- trace = ''
- for entry in stack:
- trace += entry[0] + ' '
- return(trace)
-
-# Open trace
-with open(args.trace_file, "r") as tf:
- for line in tf.readlines():
- #print('Line: "{}"'.format(line.strip()))
- words = line.split()
- # Note addr2line needs addr in hex!
- addr = words[1]
- if (words[0] == 'e'):
- # Note: This could be run once with a pipe if needed for faster operation.
- result = subprocess.run(['addr2line', '-f', addr, '-e', EXE_FILE],
- stdout=subprocess.PIPE)
- result.check_returncode()
- # function name is first line of stdout
- if (result.stdout):
- lines = result.stdout.decode().split('\n')
- func = lines[0].strip()
- else: sys.error('unknown function at address {}'.format(addr))
-
- if (func != "??"):
-
- # Push last info
- stack.append((last_func, cur_stack_depth))
- last_func = func
-
- # Update
- cur_stack_depth += su_data[func]
- #print('func: "{}" = {}'.format(func, cur_stack_depth))
- if (cur_stack_depth > max_stack_depth):
- max_stack_depth = cur_stack_depth
- max_stack_trace = walk_stack()
-
- # Save info
- if (func in funcs_used):
- funcs_used[func] += 1
- else:
- funcs_used[func] = 1
-
- # end if (func != "??")
-
- # end if ('e')
- elif (words[0] == 'x'):
- # Only pop functions we pushed
- if (func in funcs_used):
- # Pop
- (last_func, cur_stack_depth) = stack.pop()
- #print('pop: "{}" = {}'.format(last_func, cur_stack_depth))
-
-print('Max Stack Depth = {}'.format(max_stack_depth))
-print('Max Stack at: {}'.format(max_stack_trace))
diff --git a/script/phi0_plot.py b/script/phi0_plot.py
deleted file mode 100755
index 34a436b..0000000
--- a/script/phi0_plot.py
+++ /dev/null
@@ -1,80 +0,0 @@
-#!/usr/bin/python3
-
-""" Plot phi0, and (later) anaylze approximations
-
-"""
-
-import numpy as np
-import matplotlib.pyplot as plt
-
-import math
-import itertools
-import sys
-
-def impl_reference(x):
- if (x< 9.08e-5 ): r = 10
- else:
- z = math.exp(x)
- r = math.log( (z+1) / (z-1) )
- return(r)
-
-####
-# Table T1
-
-t1_tbl = [] # A list of tuples (x, r)
-t1_adj = 0.50 # Offset ratio for step of 1, estimate
-
-def t1_loop(upper, lower, step):
- for i in range((int)(upper * step), (int)(lower * step), -1):
- x = i / step
- z = math.exp(x + (t1_adj / step))
- r = math.log((z+1)/(z-1))
- t1_tbl.append( (x, r) )
- print(x, r)
-
-# 9:5 step 1
-t1_loop(9, 4.999, 2)
-
-# 5:1 step 1/16
-t1_loop(4.999, 0.999, 16)
-
-# 1/(2^0.5), 1/(2^1), 1/(2^1.5), ...
-for i in range(1, 28):
- e = (2 ** (i/2))
- x = 1.0 / e
- z = math.exp(x + (0.19 / e))
- r = math.log((z+1)/(z-1))
- t1_tbl.append( (x, r) )
-
-def impl_t1(x):
- if (x > 10): return(0)
- else:
- for t in t1_tbl:
- if (x > t[0]): return(t[1])
- return(10)
-
-
-
-##########################
-# Plot, scanning from 10 to 0
-x_vals = np.logspace(1, -4, 2000, endpoint=False)
-ref_vals = []
-t1_vals = []
-for x in x_vals:
- ref_vals.append(impl_reference(x))
- t1_vals.append(impl_t1(x))
-
-# Sum errors
-errsum = errsum2 = 0
-for i in range(len(ref_vals)):
- error = t1_vals[i] - ref_vals[i]
- errsum += error
- errsum2 += error * error
-print("Net error {}".format(errsum))
-print("avg error {}".format(errsum/len(ref_vals)))
-print("rms error {}".format(math.sqrt(errsum2/len(ref_vals))))
-
-plt.xscale('log')
-plt.plot(x_vals, ref_vals, 'g', x_vals, t1_vals, 'r')
-plt.show()
-
diff --git a/script/separate_all.sh b/script/separate_all.sh
deleted file mode 100755
index 5fe6d9d..0000000
--- a/script/separate_all.sh
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/sh
-sox $1.wav hts1_$1.wav trim 0 3
-sox $1.wav hts2_$1.wav trim 3 3
-sox $1.wav morig_$1.wav trim 6 2
-sox $1.wav forig_$1.wav trim 8 2
-sox $1.wav ve9qrp_$1.wav trim 10 9.5
-sox $1.wav cq_ref_$1.wav trim 20 9
-sox $1.wav kristoff_$1.wav trim 29.5 4
-sox $1.wav vk5qi_$1.wav trim 33.5 13.5
-sox $1.wav vk5dgr_$1.wav trim 47 10
-
diff --git a/script/subsetvq.sh b/script/subsetvq.sh
deleted file mode 100755
index 562a4e8..0000000
--- a/script/subsetvq.sh
+++ /dev/null
@@ -1,148 +0,0 @@
-#!/bin/bash
-# subsetvq.sh
-# David Rowe August 2021
-#
-# Script to support:
-# 1. Subset VQ training and listening
-# 1. Training Trellis Vector Quantiser for Codec 2 newamp1, supports octave/trellis.m
-# 2. VQ sorting/optimisation experiments, octave/vq_compare.m
-
-TRAIN=~/Downloads/all_speech_8k.sw
-CODEC2_PATH=$HOME/codec2
-PATH=$PATH:$CODEC2_PATH/build_linux/src:$CODEC2_PATH/build_linux/misc
-K=20
-Kst=2
-Ken=16
-
-# train a new VQ and generate quantised training material
-function train() {
- fullfile=$TRAIN
- filename=$(basename -- "$fullfile")
- extension="${filename##*.}"
- filename="${filename%.*}"
-
- c2sim $fullfile --rateK --rateKout ${filename}.f32
- echo "ratek=load_f32('../build_linux/${filename}.f32',20); vq_700c_eq; ratek_lim=limit_vec(ratek, 0, 40); save_f32('../build_linux/${filename}_lim.f32', ratek_lim); quit" | \
- octave -p ${CODEC2_PATH}/octave -qf
- vqtrain ${filename}_lim.f32 $K 4096 vq_stage1.f32 -s 1e-3 --st $Kst --en $Ken
-
- # VQ the training file
- cat ${filename}_lim.f32 | vq_mbest --st $Kst --en $Ken -k $K -q vq_stage1.f32 > ${filename}_test.f32
-}
-
-function listen_vq() {
- vq_fn=$1
- dec=$2
- EbNodB=$3
- fullfile=$4
- filename=$(basename -- "$fullfile")
- extension="${filename##*.}"
- filename="${filename%.*}"
-
- fullfile_out=$5
- do_trellis=$6
- sox_options='-t raw -e signed-integer -b 16'
- sox $fullfile $sox_options - | c2sim - --rateK --rateKout ${filename}.f32
-
- echo "ratek=load_f32('../build_linux/${filename}.f32',20); vq_700c_eq; ratek_lim=limit_vec(ratek, 0, 40); save_f32('../build_linux/${filename}_lim.f32', ratek_lim); quit" | \
- octave -p ${CODEC2_PATH}/octave -qf
-
- if [ "$do_trellis" -eq 0 ]; then
- echo "pkg load statistics; vq_compare(action='vq_file', '${vq_fn}', ${dec}, ${EbNodB}, '${filename}_lim.f32', '${filename}_test.f32'); quit" \ |
- octave -p ${CODEC2_PATH}/octave -qf
- else
- echo "pkg load statistics; trellis; vq_file('${vq_fn}', ${dec}, ${EbNodB}, '${filename}_lim.f32', '${filename}_test.f32'); quit" \ |
- octave -p ${CODEC2_PATH}/octave -qf
- fi
-
- if [ "$fullfile_out" = "aplay" ]; then
- sox $fullfile $sox_options - | c2sim - --rateK --rateKin ${filename}_test.f32 -o - | aplay -f S16_LE
- else
- sox $fullfile $sox_options - | c2sim - --rateK --rateKin ${filename}_test.f32 -o - | sox -t .s16 -r 8000 -c 1 - ${fullfile_out}
- fi
-
-}
-
-function print_help {
- echo
- echo "Trellis/VQ optimisation support script"
- echo
- echo " usage ./train_trellis.sh [-x] [-t] [-v vq.f32 in.wav out.wav] [-e EbNodB] [-d dec]"
- echo
- echo " -x debug mode; trace script execution"
- echo " -t train VQ and generate a fully quantised version of training vectors"
- echo " -v vq.f32 in.wav out.wav synthesise an output file out.wav from in.raw, using the VQ vq.f32"
- echo " -v vq.f32 in.wav aplay synthesise output, play immediately using aplay, using the VQ vq.f32"
- echo " -e EbNodB Eb/No in dB for AWGn channel simulation (error insertion)"
- echo " -d dec decimation/interpolation rate"
- echo " -r use trellis decoder"
- echo
- exit
-}
-
-# command line arguments to select function
-
-if [ $# -lt 1 ]; then
- print_help
-fi
-
-do_train=0
-do_vq=0
-do_trellis=0
-EbNodB=100
-dec=1
-POSITIONAL=()
-while [[ $# -gt 0 ]]
-do
-key="$1"
-case $key in
- -x)
- set -x
- shift
- ;;
- -t)
- do_train=1
- shift
- ;;
- -v)
- do_vq=1
- vq_fn="$2"
- in_wav="$3"
- out_wav="$4"
- shift
- shift
- shift
- shift
- ;;
- -r)
- do_trellis=1
- shift
- ;;
- -d)
- dec="$2"
- shift
- shift
- ;;
- -e)
- EbNodB="$2"
- shift
- shift
- ;;
- -h)
- print_help
- ;;
- *)
- POSITIONAL+=("$1") # save it in an array for later
- shift
- ;;
-esac
-done
-set -- "${POSITIONAL[@]}" # restore positional parameters
-
-if [ $do_train -eq 1 ]; then
- train
-fi
-
-if [ $do_vq -eq 1 ]; then
- listen_vq ${vq_fn} ${dec} ${EbNodB} ${in_wav} ${out_wav} ${do_trellis}
-fi
diff --git a/script/test_2020x.sh b/script/test_2020x.sh
deleted file mode 100755
index 541091c..0000000
--- a/script/test_2020x.sh
+++ /dev/null
@@ -1,166 +0,0 @@
-#!/bin/bash -x
-# test_2020x.sh
-# David Rowe Feb 2022
-#
-# Script to support testing experimental 2020A and 2020B modes and 700E control.
-
-CODEC2_PATH=$HOME/codec2
-PATH=$PATH:$CODEC2_PATH/build_linux/src:$CODEC2_PATH/build_linux/misc
-FADING_DIR=$CODEC2_PATH/build_linux/unittest
-No_AWGN=-20
-No_AWGN_LOW=-17
-No_Multipath=-25
-serial=0
-compressor_gain=6
-
-# Approximation of Hilbert clipper analog compressor
-function analog_compressor {
- input_file=$1
- output_file=$2
- gain=$3
- cat $input_file | ch - - 2>/dev/null | \
- ch - - --No -100 --clip 16384 --gain $gain 2>/dev/null | \
- # final line prints peak and CPAPR for SSB
- ch - - --clip 16384 |
- # manually adjusted to get similar peak levels for SSB and FreeDV
- sox -t .s16 -r 8000 -c 1 -v 0.85 - -t .s16 $output_file
-}
-
-function run_sim_ssb() {
- fullfile=$1
- filename=$(basename -- "$fullfile")
- extension="${filename##*.}"
- filename="${filename%.*}"
- channel=$2
- No=-100
- if [ "$channel" == "awgn" ]; then
- channel_opt=""
- No=$No_AWGN
- fi
- if [ "$channel" == "awgnlow" ]; then
- channel_opt=""
- No=$No_AWGN_LOW
- fi
- if [ "$channel" == "mpp" ] || [ "$channel" == "mpd" ]; then
- channel_opt='--'${channel}
- No=$No_Multipath
- fi
- fn=${filename}_ssb_${channel}.wav
- analog_compressor ${fullfile} ${filename}_ssb.raw ${compressor_gain}
- tmp=$(mktemp)
- ch ${filename}_ssb.raw $tmp --No $No ${channel_opt} --fading_dir ${FADING_DIR} 2>t.txt
- cat $tmp | sox -t .s16 -r 8000 -c 1 - ${fn} trim 0 6
- snr=$(cat t.txt | grep "SNR3k(dB):" | tr -s ' ' | cut -d' ' -f3)
-
- echo "<tr>"
- echo "<td><a href=\"${fn}\">${serial}</a></td><td>ssb</td><td></td><td></td><td>${channel}</td><td>${snr}</td>"
- echo "</tr>"
- serial=$((serial+1))
-}
-
-function run_sim() {
- fullfile=$1
- filename=$(basename -- "$fullfile")
- extension="${filename##*.}"
- filename="${filename%.*}"
- mode=$2
- if [ "$mode" == "700E" ] || [ "$mode" == "700D" ]; then
- rateHz=8000
- else
- rateHz=16000
- fi
- clip=$3
- if [ "$clip" == "clip" ]; then
- clipflag=1
- clip_html="yes"
- else
- clipflag=0
- clip_html="no"
- fi
- channel=$4
- No=-100
- if [ "$channel" == "awgn" ]; then
- channel_opt=""
- No=$No_AWGN
- fi
- if [ "$channel" == "awgnlow" ]; then
- channel_opt=""
- No=$No_AWGN_LOW
- fi
- if [ "$channel" == "mpp" ] || [ "$channel" == "mpd" ]; then
- channel_opt='--'${channel}
- No=$No_Multipath
- fi
-
- indopt=$5
- indopt_flag=""
- indopt_html="no"
- indopt_str=""
- if [ "$indopt" == "indopt" ]; then
- indopt_flag="--indopt 1"
- indopt_str="_indopt"
- indopt_html="yes"
- fi
- if [ "$indopt" == "no_indopt" ]; then
- indopt_flag="--indopt 0"
- indopt_str="_no_indopt"
- fi
-
- fn=${filename}_${mode}_${clip}_${channel}${indopt_str}.wav
- tmp=$(mktemp)
- # note we let ch finish to get SNR stats (trim at end of sox causes an early termination)
- freedv_tx ${mode} ${fullfile} - --clip ${clipflag} ${indopt_flag} | \
- ch - $tmp --No $No ${channel_opt} --fading_dir ${FADING_DIR} 2>t.txt
- freedv_rx ${mode} ${indopt_flag} $tmp - | \
- sox -t .s16 -r ${rateHz} -c 1 - ${fn} trim 0 6
- snr=$(cat t.txt | grep "SNR3k(dB):" | tr -s ' ' | cut -d' ' -f3)
-
- echo "<tr>"
- echo "<td><a href=\"${fn}\">${serial}</a></td><td>${mode}</td><td>${clip_html}</td><td>${indopt_html}</td><td>${channel}</td><td>${snr}</td>"
- echo "</tr>"
- serial=$((serial+1))
-}
-
-# convert speech input file to format we need
-SPEECH_IN_16k_WAV=~/Downloads/speech_orig_16k.wav
-SPEECH_IN_16k_RAW=speech_orig_16k.raw
-SPEECH_IN_8k_RAW=speech_orig_8k.raw
-sox $SPEECH_IN_16k_WAV -t .s16 $SPEECH_IN_16k_RAW
-sox $SPEECH_IN_16k_WAV -t .s16 -r 8000 $SPEECH_IN_8k_RAW
-
-echo "<html><table>"
-echo "<tr><th>Serial</th><th>Mode</th><th>Clip</th><th>index_opt</th><th>Channel</th><th>SNR (dB)</th></tr>"
-
-# run simulations
-
-run_sim_ssb $SPEECH_IN_8k_RAW awgn
-run_sim_ssb $SPEECH_IN_8k_RAW mpp
-run_sim_ssb $SPEECH_IN_8k_RAW mpd
-
-run_sim $SPEECH_IN_16k_RAW 2020 noclip clean
-run_sim $SPEECH_IN_8k_RAW 700E clip clean
-
-run_sim $SPEECH_IN_16k_RAW 2020 noclip awgn
-run_sim $SPEECH_IN_16k_RAW 2020 noclip mpp
-run_sim $SPEECH_IN_16k_RAW 2020 noclip mpd
-run_sim $SPEECH_IN_16k_RAW 2020 clip awgn
-run_sim $SPEECH_IN_16k_RAW 2020 clip mpp
-run_sim $SPEECH_IN_16k_RAW 2020 clip mpd
-
-run_sim $SPEECH_IN_16k_RAW 2020B clip awgn indopt
-run_sim $SPEECH_IN_16k_RAW 2020B clip mpp indopt
-run_sim $SPEECH_IN_16k_RAW 2020B clip mpp no_indopt
-run_sim $SPEECH_IN_16k_RAW 2020B clip mpd indopt
-run_sim $SPEECH_IN_16k_RAW 2020B clip mpd no_indopt
-
-run_sim $SPEECH_IN_8k_RAW 700E clip awgn
-run_sim $SPEECH_IN_8k_RAW 700E clip mpp
-run_sim $SPEECH_IN_8k_RAW 700E clip mpd
-
-# Low SNR samples
-run_sim_ssb $SPEECH_IN_8k_RAW awgnlow
-run_sim $SPEECH_IN_8k_RAW 700E clip awgnlow
-run_sim $SPEECH_IN_16k_RAW 2020 clip awgnlow
-run_sim $SPEECH_IN_16k_RAW 2020A clip awgnlow indopt
-
-exit
diff --git a/script/train_700c_quant.sh b/script/train_700c_quant.sh
deleted file mode 100755
index 4fd0c72..0000000
--- a/script/train_700c_quant.sh
+++ /dev/null
@@ -1,107 +0,0 @@
-#!/bin/bash -x
-# train_700C_quant.sh
-# David Rowe May 2019
-#
-# Training a Vector Quantiser (VQ) for Codec 2 700C
-# This is a two stage VQ with 512 entries (9 bits) per stage
-# Also used to support other VQ experiments, such as the effect of the
-# post filter and an experimental equaliser, see octave/vq_700c_eq.m
-
-SRC=~/Downloads/all_speech_8k.sw
-CODEC2_BUILD=/home/david/codec2/build_linux
-K=20
-SAMPLES=~/tmp/c2vec_pass2
-
-# train a new VQ
-function train() {
- # c2enc can dump "feature vectors" that contain the current VQ input
- $CODEC2_BUILD/src/c2enc 700C $SRC /dev/null --mlfeat feat.f32
- # extract VQ input as training data, then train two stage VQ
- $CODEC2_BUILD/misc/extract -s 1 -e $K -t 41 feat.f32 stage0_in.f32
- $CODEC2_BUILD/misc/vqtrain stage0_in.f32 $K 512 vq_stage1.f32 -s 1e-3 -r stage1_in.f32
- $CODEC2_BUILD/misc/vqtrain stage1_in.f32 $K 512 vq_stage2.f32 -s 1e-3
-}
-
-# encode/decode a file with the stock codec2 700C VQ
-function test_a() {
- b=$(basename "$1" .raw)
- $CODEC2_BUILD/src/c2enc 700C $1'.raw' - --var | $CODEC2_BUILD/src/c2dec 700C - - | sox -q -t .s16 -c 1 -r 8000 -b 16 - $SAMPLES/$b'_a.wav'
-}
-
-# stock 700C VQ like test_a, but no postfilter
-function test_a_nopf() {
- b=$(basename "$1" .raw)
- $CODEC2_BUILD/src/c2enc 700C $1'.raw' - --var | $CODEC2_BUILD/src/c2dec 700C - - --nopf | \
- sox -q -t .s16 -c 1 -r 8000 -b 16 - $SAMPLES/$b'_a_nopf.wav'
-}
-
-# encode/decode a file with the new VQ we just trained above
-function test_b() {
- b=$(basename "$1" .raw)
- $CODEC2_BUILD/src/c2enc 700C $1'.raw' - --loadcb 1 vq_stage1.f32 --loadcb 2 vq_stage2.f32 --var | \
- $CODEC2_BUILD/src/c2dec 700C - - --loadcb 1 vq_stage1.f32 --loadcb 2 vq_stage2.f32 | sox -q -t .s16 -c 1 -r 8000 -b 16 - $SAMPLES/$b'_b.wav'
-}
-
-# just like b but no postfilter
-function test_b_nopf() {
- b=$(basename "$1" .raw)
- $CODEC2_BUILD/src/c2enc 700C $1'.raw' - --loadcb 1 vq_stage1.f32 --loadcb 2 vq_stage2.f32 --var | \
- $CODEC2_BUILD/src/c2dec 700C - - --loadcb 1 vq_stage1.f32 --loadcb 2 vq_stage2.f32 $2 --nopf | \
- sox -q -t .s16 -c 1 -r 8000 -b 16 - $SAMPLES/$b'_b_nopf.wav'
-}
-
-# pass an unquantised rate K vector through to the decoder as a control
-function test_uq() {
- b=$(basename "$1" .raw)
- $CODEC2_BUILD/src/c2enc 700C $1'.raw' $b'.bin' --mlfeat $b'_feat.f32'
- $CODEC2_BUILD/misc/extract -s 1 -e 20 -t 41 $b'_feat.f32' $b'_ratek.f32'
- $CODEC2_BUILD/src/c2dec 700C $b'.bin' - --loadratek $b'_ratek.f32' | sox -q -t .s16 -c 1 -r 8000 -b 16 - $SAMPLES/$b'_uq.wav'
-}
-
-# extract features for use in octave octave/vq_700c_eq.m
-function feat() {
- RAW_FILES="../raw/hts1a ../raw/hts2a ../raw/vk5qi ../raw/cq_ref ../raw/ve9qrp_10s $HOME/Downloads/ma01_01 $HOME/Downloads/c01_01_8k $HOME/Downloads/cq_freedv_8k $HOME/Downloads/cq_freedv_8k_lfboost $HOME/Downloads/cq_freedv_8k_hfcut "
- for f in $RAW_FILES
- do
- b=$(basename "$f" .raw)
- $CODEC2_BUILD/src/c2enc 700C $f'.raw' $b'.bin' --mlfeat $b'_feat.f32'
- done
-}
-
-# generate a bunch of test samples for a listening test
-function listen() {
- RAW_FILES="../raw/hts1a ../raw/hts2a ../raw/vk5qi ../raw/cq_ref ../raw/ve9qrp_10s $HOME/Downloads/ma01_01 $HOME/Downloads/c01_01_8k $HOME/Downloads/cq_freedv_8k"
- for f in $RAW_FILES
- do
- test_a $f
- test_a_nopf $f
- test_b $f
- test_b_nopf $f
- test_uq $f
- done
-}
-
-# Generate a bunch of test samples for VQ equalisation listening tests. Assumes
-# Octave has generated rate K quantised .f32 files
-function listen_vq_eq() {
- FILES="hts1a hts2a vk5qi cq_ref ve9qrp_10s ma01_01 c01_01_8k cq_freedv_8k cq_freedv_8k_lfboost cq_freedv_8k_hfcut"
- for f in $FILES
- do
- # try equaliser wth train_120 VQ
- $CODEC2_BUILD/src/c2dec 700C $f'.bin' - --loadratek $f'_vq2.f32' | sox -q -t .s16 -c 1 -r 8000 -b 16 - $SAMPLES/$f'_vq2.wav'
- $CODEC2_BUILD/src/c2dec 700C $f'.bin' - --loadratek $f'_vq2_eq1.f32' | sox -q -t .s16 -c 1 -r 8000 -b 16 - $SAMPLES/$f'_vq2_eq1.wav'
- $CODEC2_BUILD/src/c2dec 700C $f'.bin' - --loadratek $f'_vq2_eq2.f32' | sox -q -t .s16 -c 1 -r 8000 -b 16 - $SAMPLES/$f'_vq2_eq2.wav'
- # try equaliser wth train_all_speech VQ
- #$CODEC2_BUILD/src/c2dec 700C $f'.bin' - --loadratek $f'_vq2_as.f32' | sox -q -t .s16 -c 1 -r 8000 -b 16 - $SAMPLES/$f'_vq2_as.wav'
- #$CODEC2_BUILD/src/c2dec 700C $f'.bin' - --loadratek $f'_vq2_as_eq.f32' | sox -q -t .s16 -c 1 -r 8000 -b 16 - $SAMPLES/$f'_vq2_as_eq.wav'
- done
-}
-
-mkdir -p $SAMPLES
-
-# choose which function to run here
-#train
-#listen
-#feat
-listen_vq_eq
-
diff --git a/script/train_sub_quant.sh b/script/train_sub_quant.sh
deleted file mode 100755
index e85b098..0000000
--- a/script/train_sub_quant.sh
+++ /dev/null
@@ -1,53 +0,0 @@
-#!/bin/bash -x
-# train_sub_quant.sh
-# David Rowe May 2021
-#
-# Training and testing Vector Quantisers (VQ) for Codec 2 newamp1, in
-# this case training on a subset
-
-TRAIN=~/Downloads/all_speech_8k.sw
-CODEC2_PATH=$HOME/codec2
-PATH=$PATH:$CODEC2_PATH/build_linux/src:$CODEC2_PATH/build_linux/misc
-K=20
-Kst=2
-Ken=16
-
-# train a new VQ
-function train() {
- fullfile=$TRAIN
- filename=$(basename -- "$fullfile")
- extension="${filename##*.}"
- filename="${filename%.*}"
-
- c2sim $fullfile --rateK --rateKout ${filename}.f32
- echo "ratek=load_f32('../build_linux/${filename}.f32',20); vq_700c_eq; ratek_lim=limit_vec(ratek, 0, 40); save_f32('../build_linux/${filename}_lim.f32', ratek_lim); quit" | \
- octave -p ${CODEC2_PATH}/octave -qf
- vqtrain ${filename}_lim.f32 $K 4096 vq_stage1.f32 -s 1e-3 --st $Kst --en $Ken
-}
-
-function listen() {
- fullfile=$1
- filename=$(basename -- "$fullfile")
- extension="${filename##*.}"
- filename="${filename%.*}"
-
- c2sim $fullfile --rateK --rateKout ${filename}.f32
- echo "ratek=load_f32('../build_linux/${filename}.f32',20); vq_700c_eq; ratek_lim=limit_vec(ratek, 0, 40); save_f32('../build_linux/${filename}_lim.f32', ratek_lim); quit" | \
- octave -p ${CODEC2_PATH}/octave -qf
- cat ${filename}_lim.f32 | vq_mbest --st $Kst --en $Ken -k $K -q vq_stage1.f32 > ${filename}_test.f32
- c2sim $fullfile --rateK --rateKin ${filename}_test.f32 -o - | sox -t .s16 -r 8000 -c 1 - ${filename}_sub.wav
- c2sim $fullfile --rateK --newamp1vq -o - | sox -t .s16 -r 8000 -c 1 - ${filename}_newamp1.wav
-}
-
-# choose which function to run here
-train
-# these two samples are inside training database
-listen ~/Downloads/fish_8k.sw
-listen ~/Downloads/cap_8k.sw
-# two samples from outside training database
-listen $CODEC2_PATH/raw/big_dog.raw
-listen $CODEC2_PATH/raw/hts2a.raw
-# these two samples are inside training database, but with LPF at 3400 Hz outside of subset
-listen ~/Downloads/fish_8k_lp.sw
-listen ~/Downloads/cap_8k_lp.sw
-
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 4c7cabc..25081a0 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -321,9 +321,6 @@ target_link_libraries(freedv_mixed_rx codec2)
add_executable(fsk_mod fsk_mod.c)
target_link_libraries(fsk_mod codec2)
-add_executable(fsk_mod_ext_vco fsk_mod_ext_vco.c)
-target_link_libraries(fsk_mod_ext_vco m)
-
add_executable(fsk_demod fsk_demod.c modem_probe.c octave.c)
target_link_libraries(fsk_demod codec2)
@@ -339,9 +336,6 @@ target_link_libraries(framer)
add_executable(deframer deframer.c)
target_link_libraries(deframer)
-add_executable(fm_demod fm_demod.c fm.c)
-target_link_libraries(fm_demod m)
-
add_executable(cohpsk_mod cohpsk_mod.c)
target_link_libraries(cohpsk_mod codec2)
@@ -357,12 +351,6 @@ target_link_libraries(ofdm_mod codec2)
add_executable(ofdm_demod ofdm_demod.c octave.c)
target_link_libraries(ofdm_demod codec2)
-add_executable(fmfsk_mod fmfsk_mod.c)
-target_link_libraries(fmfsk_mod codec2)
-
-add_executable(fmfsk_demod fmfsk_demod.c modem_probe.c octave.c)
-target_link_libraries(fmfsk_demod codec2)
-
add_executable(vhf_deframe_c2 vhf_deframe_c2.c)
target_link_libraries(vhf_deframe_c2 codec2)
diff --git a/src/c2dec.c b/src/c2dec.c
index ad0eea9..176d516 100644
--- a/src/c2dec.c
+++ b/src/c2dec.c
@@ -54,7 +54,7 @@ int main(int argc, char *argv[])
unsigned char *bits;
float *softdec_bits;
char *bitperchar_bits;
- int nsam, nbit, nbyte, i, byte, frames, bits_proc, bit_errors, error_mode;
+ int nsam, nbit, nbyte, i, byte, bits_proc, bit_errors, error_mode;
int nstart_bit, nend_bit, bit_rate;
int state, next_state;
float ber, r, burst_length, burst_period, burst_timer, ber_est;
@@ -173,7 +173,7 @@ int main(int argc, char *argv[])
bits = (unsigned char*)malloc(nbyte*sizeof(char));
softdec_bits = (float*)malloc(nbit*sizeof(float));
bitperchar_bits = (char*)malloc(nbit*sizeof(char));
- frames = bit_errors = bits_proc = 0;
+ bit_errors = bits_proc = 0;
nstart_bit = 0;
nend_bit = nbit-1;
@@ -256,8 +256,6 @@ int main(int argc, char *argv[])
}
while(ret) {
- frames++;
-
// apply bit errors, MSB of byte 0 is bit 0 in frame, only works in packed mode
if ((error_mode == UNIFORM) || (error_mode == UNIFORM_RANGE)) {
diff --git a/src/cohpsk_mod.c b/src/cohpsk_mod.c
index b6e0fb4..5d5443a 100644
--- a/src/cohpsk_mod.c
+++ b/src/cohpsk_mod.c
@@ -55,7 +55,7 @@ int main(int argc, char *argv[])
int tx_bits[2*COHPSK_BITS_PER_FRAME];
COMP tx_fdm[COHPSK_NOM_SAMPLES_PER_FRAME];
short tx_fdm_scaled[COHPSK_NOM_SAMPLES_PER_FRAME];
- int frames, diversity;
+ int diversity;
int i;
if (argc < 3) {
@@ -91,10 +91,7 @@ int main(int argc, char *argv[])
}
fprintf(stderr, "diversity: %d\n", diversity);
- frames = 0;
-
while(fread(tx_bits_char, sizeof(char), COHPSK_BITS_PER_FRAME*diversity, fin) == COHPSK_BITS_PER_FRAME*diversity) {
- frames++;
for(i=0; i<COHPSK_BITS_PER_FRAME*diversity; i++)
tx_bits[i] = tx_bits_char[i];
diff --git a/src/fdmdv_mod.c b/src/fdmdv_mod.c
index b47c543..a87958f 100644
--- a/src/fdmdv_mod.c
+++ b/src/fdmdv_mod.c
@@ -46,7 +46,6 @@ int main(int argc, char *argv[])
int *tx_bits;
COMP tx_fdm[2*FDMDV_NOM_SAMPLES_PER_FRAME];
short tx_fdm_scaled[2*FDMDV_NOM_SAMPLES_PER_FRAME];
- int frames;
int i, bit, byte;
int sync_bit;
int bits_per_fdmdv_frame;
@@ -105,10 +104,7 @@ int main(int argc, char *argv[])
foff_phase_rect.real = 1.0; foff_phase_rect.imag = 0.0;
#endif
- frames = 0;
-
while(fread(packed_bits, sizeof(char), bytes_per_codec_frame, fin) == bytes_per_codec_frame) {
- frames++;
/* unpack bits, MSB first */
diff --git a/src/fm_demod.c b/src/fm_demod.c
deleted file mode 100644
index bf667d1..0000000
--- a/src/fm_demod.c
+++ /dev/null
@@ -1,115 +0,0 @@
-/*---------------------------------------------------------------------------*\
-
- FILE........: fm_demod.c
- AUTHOR......: David Rowe
- DATE CREATED: Feb 24 2015
-
- Given an input raw file (44.4 kHz, 16 bit shorts) with a FM signal centered
- 11.1 kHz, outputs a file of demodulated audio samples.
-
-\*---------------------------------------------------------------------------*/
-
-/*
- Copyright (C) 2015 David Rowe
-
- All rights reserved.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License version 2.1, as
- published by the Free Software Foundation. This program is
- distributed in the hope that it will be useful, but WITHOUT ANY
- WARRANTY; without even the implied warranty of MERCHANTABILITY or
- FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
- License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <assert.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <math.h>
-#include <errno.h>
-
-#include "codec2_fm.h"
-#include "octave.h"
-
-#define N 160
-
-#define TEST_MOD_COMP
-
-int main(int argc, char *argv[])
-{
- FILE *fin, *fout;
- struct FM *fm;
- short buf[N*2];
- float rx[N];
-#if defined(TEST_MODE) && !defined(TEST_MODE_COMP)
- float rx_out[N];
-#endif
- COMP out_comp[N];
- int i;
-
- if (argc < 2) {
- printf("usage: %s InputFMRawFile OutputSpeechRawFile\n", argv[0]);
- printf("e.g %s fm.raw fm_demodulated.raw\n", argv[0]);
- exit(1);
- }
-
- if (strcmp(argv[1], "-") == 0) fin = stdin;
- else if ( (fin = fopen(argv[1],"rb")) == NULL ) {
- fprintf(stderr, "Error opening input file: %s: %s.\n",
- argv[1], strerror(errno));
- exit(1);
- }
-
- if (strcmp(argv[2], "-") == 0) fout = stdout;
- else if ( (fout = fopen(argv[2],"wb")) == NULL ) {
- fprintf(stderr, "Error opening output file: %s: %s.\n",
- argv[2], strerror(errno));
- exit(1);
- }
-
- fm = fm_create(N);
- fm->Fs = 48000.0;
- fm->fm_max = 3000.0;
- fm->fd = 5000.0;
- fm->fc = 0;
-
- while(fread(buf, sizeof(short), N, fin) == N) {
- for(i=0; i<N; i++) {
- rx[i] = ((float)buf[i])/16384;
- }
-#ifdef TEST_MOD
- fm_mod(fm, rx, rx_out);
-#else
-#ifdef TEST_MOD_COMP
- fm_mod_comp(fm, rx, out_comp);
-#else
- fm_demod(fm, rx_out, rx);
-#endif
-#endif
-
-
-#ifdef TEST_MOD_COMP
- for(i=0; i<N; i++) {
- buf[i*2 ] = 16384*out_comp[i].real;
- buf[1+(i*2)] = 16384*out_comp[i].imag;
- }
- fwrite(buf, sizeof(short), N*2, fout);
-#else
- for(i=0; i<N; i++) {
- buf[i] = 16384*rx_out[i];
- }
- fwrite(buf, sizeof(short), N, fout);
-#endif
- }
-
- fm_destroy(fm);
- fclose(fin);
- fclose(fout);
-
- return 0;
-}
diff --git a/src/fmfsk_demod.c b/src/fmfsk_demod.c
deleted file mode 100644
index 5b12fc1..0000000
--- a/src/fmfsk_demod.c
+++ /dev/null
@@ -1,150 +0,0 @@
-/*---------------------------------------------------------------------------*\
-
- FILE........: fsk_demod.c
- AUTHOR......: Brady O'Brien
- DATE CREATED: 8 January 2016
-
- C test driver for fsk_demod in fsk.c. Reads in a stream of 32 bit cpu endian
- floats and writes out the detected bits
-
-
-\*---------------------------------------------------------------------------*/
-
-/*
- Copyright (C) 2016 David Rowe
-
- All rights reserved.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License version 2.1, as
- published by the Free Software Foundation. This program is
- distributed in the hope that it will be useful, but WITHOUT ANY
- WARRANTY; without even the implied warranty of MERCHANTABILITY or
- FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
- License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include "fmfsk.h"
-#include "modem_stats.h"
-#define MODEMPROBE_ENABLE
-#include "modem_probe.h"
-#include "codec2_fdmdv.h"
-
-int main(int argc,char *argv[]){
- struct FMFSK *fmfsk;
- int Fs,Rb;
- struct MODEM_STATS stats;
- float loop_time;
- int enable_stats = 0;
- int stats_ctr = 0;
- int stats_loop = 0;
- FILE *fin,*fout;
- uint8_t *bitbuf;
- int16_t *rawbuf;
- float *modbuf;
- int i,j,t;
-
- if(argc<4){
- fprintf(stderr,"usage: %s SampleFreq BitRate InputModemRawFile OutputOneBitPerCharFile [S]\n",argv[0]);
- exit(1);
- }
-
- /* Extract parameters */
- Fs = atoi(argv[1]);
- Rb = atoi(argv[2]);
-
- /* Open files */
- if(strcmp(argv[3],"-")==0){
- fin = stdin;
- }else{
- fin = fopen(argv[3],"r");
- }
-
- if(strcmp(argv[4],"-")==0){
- fout = stdout;
- }else{
- fout = fopen(argv[4],"w");
- }
-
- /* set up FSK */
- fmfsk = fmfsk_create(Fs,Rb);
-
- if(argc>5){
- if(strcmp(argv[5],"S")==0){
- enable_stats = 1;
- loop_time = ((float)fmfsk_nin(fmfsk))/((float)Fs);
- stats_loop = (int)(.125/loop_time);
- stats_ctr = 0;
- }
- }
-
- if(fin==NULL || fout==NULL || fmfsk==NULL){
- fprintf(stderr,"Couldn't open test vector files\n");
- exit(1);
- }
-
- /* allocate buffers for processing */
- bitbuf = (uint8_t*)malloc(sizeof(uint8_t)*fmfsk->nbit);
- rawbuf = (int16_t*)malloc(sizeof(int16_t)*(fmfsk->N+fmfsk->Ts*2));
- modbuf = (float*)malloc(sizeof(float)*(fmfsk->N+fmfsk->Ts*2));
-
- /* Demodulate! */
- while( fread(rawbuf,sizeof(int16_t),fmfsk_nin(fmfsk),fin) == fmfsk_nin(fmfsk) ){
- for(i=0;i<fmfsk_nin(fmfsk);i++){
- modbuf[i] = ((float)rawbuf[i])/FDMDV_SCALE;
- }
-
- modem_probe_samp_f("t_d_sampin",modbuf,fmfsk_nin(fmfsk));
- fmfsk_demod(fmfsk,bitbuf,modbuf);
-
- for(i=0;i<fmfsk->nbit;i++){
- t = (int)bitbuf[i];
- modem_probe_samp_i("t_d_bitout",&t,1);
- }
-
- fwrite(bitbuf,sizeof(uint8_t),fmfsk->nbit,fout);
-
- if(enable_stats && stats_ctr <= 0){
- fmfsk_get_demod_stats(fmfsk,&stats);
- fprintf(stderr,"{\"EbNodB\": %2.2f,\t\"ppm\": %d,",stats.snr_est,(int)stats.clock_offset);
- fprintf(stderr,"\t\"f1_est\":%.1f,\t\"f2_est\":%.1f",0.0,0.0);
- fprintf(stderr,",\t\"eye_diagram\":[");
- for(i=0;i<stats.neyetr;i++){
- fprintf(stderr,"[");
- for(j=0;j<stats.neyesamp;j++){
- fprintf(stderr,"%f",stats.rx_eye[i][j]);
- if(j<stats.neyesamp-1) fprintf(stderr,",");
- }
- fprintf(stderr,"]");
- if(i<stats.neyetr-1) fprintf(stderr,",");
- }
-
- fprintf(stderr,"]}\n");
- stats_ctr = stats_loop;
- }
- stats_ctr--;
-
- if (fout == stdin) {
- fflush(fout);
- }
- }
-
- modem_probe_close();
-
- free(modbuf);
- free(rawbuf);
- free(bitbuf);
-
- fclose(fin);
- fclose(fout);
- fmfsk_destroy(fmfsk);
-
- exit(0);
-}
-
diff --git a/src/fmfsk_mod.c b/src/fmfsk_mod.c
deleted file mode 100644
index f2826eb..0000000
--- a/src/fmfsk_mod.c
+++ /dev/null
@@ -1,104 +0,0 @@
-/*---------------------------------------------------------------------------*\
-
- FILE........: fmfsk_mod.c
- AUTHOR......: Brady O'Brien
- DATE CREATED: 7 February 2016
-
- C test driver for fmfsk_mod in fmfsk.c. Reads in a set of bits to modulate
- from a file, passed as a parameter, and writes modulated output to
- another file
-
-
-\*---------------------------------------------------------------------------*/
-
-/*
- Copyright (C) 2016 David Rowe
-
- All rights reserved.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License version 2.1, as
- published by the Free Software Foundation. This program is
- distributed in the hope that it will be useful, but WITHOUT ANY
- WARRANTY; without even the implied warranty of MERCHANTABILITY or
- FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
- License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include "fmfsk.h"
-#include "codec2_fdmdv.h"
-
-int main(int argc,char *argv[]){
- struct FMFSK *fmfsk;
- int Fs,Rb;
- int i;
- FILE *fin,*fout;
- uint8_t *bitbuf;
- int16_t *rawbuf;
- float *modbuf;
-
- if(argc<4){
- fprintf(stderr,"usage: %s SampleFreq BitRate InputOneBitPerCharFile OutputModRawFile\n",argv[0]);
- exit(1);
- }
-
- /* Extract parameters */
- Fs = atoi(argv[1]);
- Rb = atoi(argv[2]);
-
- if(strcmp(argv[3],"-")==0){
- fin = stdin;
- }else{
- fin = fopen(argv[3],"r");
- }
-
- if(strcmp(argv[4],"-")==0){
- fout = stdout;
- }else{
- fout = fopen(argv[4],"w");
- }
-
-
- /* set up FMFSK */
- fmfsk = fmfsk_create(Fs,Rb);
-
- if(fin==NULL || fout==NULL || fmfsk==NULL){
- fprintf(stderr,"Couldn't open test vector files\n");
- exit(1);
- }
-
- /* allocate buffers for processing */
- bitbuf = (uint8_t*)malloc(sizeof(uint8_t)*fmfsk->nbit);
- rawbuf = (int16_t*)malloc(sizeof(int16_t)*fmfsk->N);
- modbuf = (float*)malloc(sizeof(float)*fmfsk->N);
-
- /* Modulate! */
- while( fread(bitbuf,sizeof(uint8_t),fmfsk->nbit,fin) == fmfsk->nbit ){
- fmfsk_mod(fmfsk,modbuf,bitbuf);
- for(i=0; i<fmfsk->N; i++){
- rawbuf[i] = (int16_t)(modbuf[i]*(float)FDMDV_SCALE);
- }
- fwrite(rawbuf,sizeof(int16_t),fmfsk->N,fout);
-
- if(fout == stdin){
- fflush(fout);
- }
- }
-
- free(modbuf);
- free(rawbuf);
- free(bitbuf);
-
- fmfsk_destroy(fmfsk);
-
- fclose(fin);
- fclose(fout);
-
- exit(0);
-}
diff --git a/src/fsk_demod.c b/src/fsk_demod.c
index 44ca1db..60b76c0 100644
--- a/src/fsk_demod.c
+++ b/src/fsk_demod.c
@@ -359,7 +359,7 @@ int main(int argc,char *argv[]){
fprintf(stderr,"{");
time_t seconds = time(NULL);
- fprintf(stderr,"\"secs\": %ld, \"EbNodB\": %5.1f, \"ppm\": %4d,",seconds, stats.snr_est, (int)fsk->ppm);
+ fprintf(stderr,"\"secs\": %ld, \"EbNodB\": %5.1f, \"ppm\": %4d,",(long)seconds, stats.snr_est, (int)fsk->ppm);
float *f_est;
if (fsk->freq_est_type)
f_est = fsk->f2_est;
diff --git a/src/fsk_mod_ext_vco.c b/src/fsk_mod_ext_vco.c
deleted file mode 100644
index b4cfd6a..0000000
--- a/src/fsk_mod_ext_vco.c
+++ /dev/null
@@ -1,143 +0,0 @@
-/*---------------------------------------------------------------------------*\
-
- FILE........: fsk_mod_ext_vco.c
- AUTHOR......: David Rowe
- DATE CREATED: Feb 2018
-
- Converts a stream of bits to mFSK raw file of "levels" suitable for
- driving an external VCO, e.g. legacy FM transmitter in data mode.
-
-\*---------------------------------------------------------------------------*/
-
-/*
- Copyright (C) 2018 David Rowe
-
- All rights reserved.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License version 2.1, as
- published by the Free Software Foundation. This program is
- distributed in the hope that it will be useful, but WITHOUT ANY
- WARRANTY; without even the implied warranty of MERCHANTABILITY or
- FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
- License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <assert.h>
-#include <math.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <stdint.h>
-#include <string.h>
-
-#define OVERSAMPLE 100
-
-int main(int argc,char *argv[]){
- int os, m, log2m, i, bit_i, sym, legacy_mode, rpitx_mode;
- float d;
- double shiftHz, symbolRateHz;
- uint32_t time_sample;
- FILE *fin,*fout;
-
- if(argc<5){
- fprintf(stderr, "usage: %s InputOneBitPerCharFile OutputVcoRawFile MbitsPerFSKsymbol\n",argv[0]);
- fprintf(stderr, "[--legacy OutputSamplesPerSymbol deviationPerlevel]\n");
- fprintf(stderr, "[--rpitx ShiftHz SymbolRateHz\n]");
- exit(1);
- }
-
- /* Extract parameters */
-
- if (strcmp(argv[1],"-")==0){
- fin = stdin;
- } else {
- fin = fopen(argv[1],"r");
- }
-
- if (strcmp(argv[2],"-")==0){
- fout = stdout;
- } else {
- fout = fopen(argv[2],"w");
- }
-
- m = atoi(argv[3]); log2m = log2(m);
- printf("log2m: %d\n", log2m);
-
- legacy_mode = rpitx_mode = os = 0;
- if (!strcmp(argv[4],"--legacy")) {
- os = atoi(argv[5]);
- d = atof(argv[6]);
- legacy_mode = 1;
- }
- if (!strcmp(argv[4],"--rpitx")) {
- shiftHz = atof(argv[5]);
- symbolRateHz = atof(argv[6]);
- rpitx_mode = 1;
- time_sample = 1E9/symbolRateHz;
- fprintf(stderr, "time_sample: %d\n", time_sample);
- }
-
- assert(legacy_mode || rpitx_mode);
- fprintf(stderr, "legacy_mode: %d rpitx_mode: %d\n", legacy_mode, rpitx_mode);
-
- uint8_t tx_bits[log2m];
- int16_t rawbuf[os];
-
- /* Modulate m bits to levels to drive external VCO */
-
- while( fread(tx_bits, sizeof(uint8_t), log2m, fin) == log2m ){
-
- /* generate the symbol number from the bit stream,
- e.g. 0,1 for 2FSK, 0,1,2,3 for 4FSK */
-
- sym = bit_i = 0;
- for( i=m; i>>=1; ){
- //fprintf(stderr, "tx_bits[%d] = %d\n", i, tx_bits[bit_i]);
- uint8_t bit = tx_bits[bit_i];
- bit = (bit==1)?1:0;
- sym = (sym<<1)|bit;
- bit_i++;
- }
- //fprintf(stderr, "sym = %d\n", sym);
-
- if (legacy_mode) {
- /* map 'sym' to VCO drive signal symmetrically about 0,
- separate tones by constant "d" */
- /* 2 FSK -d/2, +d/2 */
- /* 4 FSK -3*d/2, -d/2, +d/2, 3*d/2 */
-
- /* note: drive is inverted, a higher tone drives VCO voltage lower */
-
- float symf = sym;
- float level = d*(((float)m-1)*0.5 - symf);
- assert(level <= 32767.0);
- assert(level >= -32768.0);
- short level_short = (short)level;
- //fprintf(stderr, "level = %f level_short = %d\n\n", level, level_short);
- for(i=0; i<os; i++) {
- rawbuf[i] = level_short;
- }
- fwrite(rawbuf, sizeof(int16_t), os, fout);
- }
-
- if (rpitx_mode) {
- short frequencyHz;
- frequencyHz = shiftHz*(sym+1);
- fwrite(&frequencyHz, sizeof(short), 1, fout);
- }
-
- if(fout == stdout){
- fflush(fout);
- }
- }
-
- fclose(fin);
- fclose(fout);
-
- exit(0);
-}
-
-
diff --git a/unittest/CMakeLists.txt b/unittest/CMakeLists.txt
index 080ebc5..656afd0 100644
--- a/unittest/CMakeLists.txt
+++ b/unittest/CMakeLists.txt
@@ -15,9 +15,6 @@ add_executable(tfreedv_data_channel tfreedv_data_channel.c ../src/freedv_data_ch
add_executable(tfmfsk tfmfsk.c ../src/octave.c ../src/modem_probe.c)
target_link_libraries(tfmfsk m)
-add_executable(tdeframer tdeframer.c)
-target_link_libraries(tdeframer m codec2)
-
add_definitions(-DMODEMPROBE_ENABLE -DXXXXX)
add_executable(tofdm tofdm.c ../src/octave.c)
@@ -26,44 +23,18 @@ target_link_libraries(tofdm m codec2)
add_executable(tofdm_acq tofdm_acq.c ../src/octave.c)
target_link_libraries(tofdm_acq m codec2)
-add_executable(tesno_est tesno_est.c)
-target_link_libraries(tesno_est m codec2)
-
if(UNIX) # Uses pthreads
add_executable(tfifo tfifo.c ../src/codec2_fifo.c)
target_link_libraries(tfifo codec2 ${CMAKE_THREAD_LIBS_INIT})
endif()
-add_executable(fdmdv_mem fdmdv_mem.c)
-
-add_executable(ofdm_mem ofdm_mem.c ../src/ofdm.c ../src/octave.c ../src/kiss_fft.c ../src/modem_probe.c ../src/mpdecode_core.c ../src/phi0.c ../src/filter.c)
-target_link_libraries(ofdm_mem m)
-
-add_library(function_trace STATIC ../unittest/function_trace.c)
-
-add_executable(ofdm_stack ofdm_stack.c ../src/ofdm.c ../src/octave.c ../src/kiss_fft.c ../src/modem_probe.c ../src/mpdecode_core.c ../src/phi0.c ../src/filter.c)
-if (CMAKE_C_COMPILER MATCHES "gcc$")
- target_link_libraries(ofdm_stack function_trace m -no-pie "-Wl,-Map=ofdm_stack.map")
- target_compile_options(ofdm_stack PUBLIC -fstack-usage -finstrument-functions)
-else()
- target_link_libraries(ofdm_stack function_trace m -no-pie)
- target_compile_options(ofdm_stack PUBLIC -finstrument-functions)
-endif()
add_definitions(-D__UNITTEST__)
add_executable(tnewamp1 tnewamp1.c ../src/quantise.c ../src/newamp1.c ../src/mbest.c ../src/kiss_fft.c ../src/sine.c ../src/nlp.c ../src/dump.c ../src/octave.c ${CODEBOOKS})
target_link_libraries(tnewamp1 codec2)
add_executable(compare_ints compare_ints.c)
-
add_executable(compare_floats compare_floats.c)
-
-add_executable(test_phi0 test_phi0.c ../src/phi0.c)
-target_link_libraries(test_phi0 m)
-
-add_executable(tst_codec2_fft_init tst_codec2_fft_init.c)
-target_link_libraries(tst_codec2_fft_init m codec2)
-
add_executable(tvq_mbest tvq_mbest.c)
add_executable(tfreedv_800XA_rawdata tfreedv_800XA_rawdata.c)
@@ -141,3 +112,12 @@ target_compile_options(golay23 PUBLIC -DGOLAY23_UNITTEST)
add_executable(golay23_runtime_tables ../src/golay23.c)
target_compile_options(golay23_runtime_tables PUBLIC -DGOLAY23_UNITTEST -DRUN_TIME_TABLES)
+
+add_executable(mksine mksine.c)
+target_link_libraries(mksine m)
+
+add_executable(vq_mbest vq_mbest.c)
+target_link_libraries(vq_mbest codec2)
+
+add_executable(tesno_est tesno_est.c)
+target_link_libraries(tesno_est m codec2) \ No newline at end of file
diff --git a/unittest/fdmdv_mem.c b/unittest/fdmdv_mem.c
deleted file mode 100644
index 6bcc6bc..0000000
--- a/unittest/fdmdv_mem.c
+++ /dev/null
@@ -1,63 +0,0 @@
-/*---------------------------------------------------------------------------*\
-
- FILE........: fdmdv_mem.c
- AUTHOR......: David Rowe
- DATE CREATED: 25 June 2014
-
- Prints out the memory used by the FDMDV modem states. Used to optimise
- memory use for the STM32F4 port.
-
-\*---------------------------------------------------------------------------*/
-
-/*
- Copyright (C) 2014 David Rowe
-
- All rights reserved.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License version 2.1, as
- published by the Free Software Foundation. This program is
- distributed in the hope that it will be useful, but WITHOUT ANY
- WARRANTY; without even the implied warranty of MERCHANTABILITY or
- FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
- License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <assert.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <math.h>
-
-#include "fdmdv_internal.h"
-
-extern float pilot_coeff[];
-
-int main(int argc, char *argv[])
-{
- struct FDMDV *fdmdv;
-
- printf("struct FDMDV..........: %ld\n", sizeof(struct FDMDV));
- printf("prev_tx_symbols.......: %ld\n", sizeof(fdmdv->prev_tx_symbols));
- printf("tx_filter_memory......: %ld\n", sizeof(fdmdv->tx_filter_memory));
- printf("phase_tx..............: %ld\n", sizeof(fdmdv->phase_tx));
- printf("freq..................: %ld\n", sizeof(fdmdv->freq));
- printf("pilot_lut.............: %ld\n", sizeof(fdmdv->pilot_lut));
- printf("pilot_baseband1.......: %ld\n", sizeof(fdmdv->pilot_baseband1));
- printf("pilot_baseband2.......: %ld\n", sizeof(fdmdv->pilot_baseband2));
- printf("pilot_lpf1............: %ld\n", sizeof(fdmdv->pilot_lpf1));
- printf("pilot_lpf2............: %ld\n", sizeof(fdmdv->pilot_lpf2));
- printf("S1....................: %ld\n", sizeof(fdmdv->S1));
- printf("S2....................: %ld\n", sizeof(fdmdv->S2));
- printf("phase_rx..............: %ld\n", sizeof(fdmdv->phase_rx));
- printf("rx_fdm_mem............: %ld\n", sizeof(fdmdv->rx_fdm_mem));
- printf("rx_filter_mem_timing..: %ld\n", sizeof(fdmdv->rx_filter_mem_timing));
- printf("phase_difference......: %ld\n", sizeof(fdmdv->phase_difference));
- printf("prev_rx_symbols.......: %ld\n", sizeof(fdmdv->prev_rx_symbols));
-
- return 0;
-}
-
diff --git a/unittest/function_trace.c b/unittest/function_trace.c
deleted file mode 100644
index 5ed47a9..0000000
--- a/unittest/function_trace.c
+++ /dev/null
@@ -1,36 +0,0 @@
-#include <stdio.h>
-
-static FILE *fp_trace;
-
-void
-__attribute__ ((constructor))
-trace_begin (void)
-{
- fp_trace = fopen("function_trace.out", "w");
-}
-
-void
-__attribute__ ((destructor))
-trace_end (void)
-{
- if(fp_trace != NULL) {
- fclose(fp_trace);
- }
-}
-
-
-void
-__cyg_profile_func_enter (void *func, void *caller)
-{
- if(fp_trace != NULL) {
- fprintf(fp_trace, "e %p %p\n", func, caller);
- }
-}
-
-void
-__cyg_profile_func_exit (void *func, void *caller)
-{
- if(fp_trace != NULL) {
- fprintf(fp_trace, "x %p %p\n", func, caller);
- }
-}
diff --git a/unittest/hts1a_1300.h b/unittest/hts1a_1300.h
deleted file mode 100644
index a254ecc..0000000
--- a/unittest/hts1a_1300.h
+++ /dev/null
@@ -1,8002 +0,0 @@
-short hts1a_1300[] = {
-0,
-1,
-1,
-2,
-2,
-3,
-2,
-2,
-2,
-3,
-2,
-4,
-2,
-2,
--1,
-0,
--2,
-0,
-2,
-2,
--3,
--2,
--5,
--2,
--4,
--1,
--5,
--5,
--10,
--11,
--15,
--9,
--8,
-0,
--4,
--5,
--10,
--5,
-0,
-1,
--3,
-7,
-3,
-2,
-0,
-6,
-10,
-12,
-5,
-8,
-9,
-7,
-13,
-13,
-5,
-19,
-23,
-14,
-3,
-0,
-7,
-10,
-9,
-0,
--11,
--18,
--15,
--16,
--15,
--27,
--37,
--46,
--40,
--37,
--49,
--80,
--73,
--65,
--43,
--10,
-39,
-72,
-88,
-82,
-82,
-66,
-57,
-34,
-38,
-32,
-28,
-17,
-28,
-7,
-1,
--12,
--1,
--13,
--2,
--9,
--11,
--24,
--16,
--26,
--16,
--24,
--11,
--17,
--11,
--21,
--14,
--26,
--11,
--9,
-6,
--11,
--3,
--9,
-2,
--5,
-10,
-11,
-23,
-2,
-8,
-5,
-24,
-14,
-29,
-9,
-21,
-14,
-21,
-11,
-12,
-9,
-22,
-4,
-16,
-0,
-5,
--2,
--1,
--12,
-2,
--6,
--13,
--29,
--22,
--37,
--25,
--32,
--29,
--42,
--45,
--60,
--51,
--59,
--45,
--19,
-23,
-57,
-80,
-69,
-65,
-49,
-40,
-34,
-38,
-20,
-10,
-5,
-5,
--6,
--5,
--10,
--3,
--7,
--15,
--20,
--21,
--16,
--9,
--17,
--18,
--21,
--20,
--9,
--5,
--5,
--7,
--19,
--15,
--4,
-2,
-6,
--3,
--3,
-1,
-8,
-7,
-16,
-12,
-7,
-3,
-5,
-15,
-22,
-15,
-17,
-12,
-16,
-6,
-13,
--3,
-8,
-12,
-9,
-1,
-7,
--1,
-6,
--5,
--1,
--7,
--9,
--20,
--17,
--20,
--3,
--8,
--1,
--27,
--35,
--46,
--36,
--34,
--21,
--23,
-2,
-20,
-43,
-41,
-52,
-41,
-37,
-36,
-41,
-24,
-16,
-7,
-1,
--18,
--14,
--22,
--6,
--4,
--5,
--8,
--7,
--15,
--14,
--20,
--10,
--21,
--13,
--3,
--2,
--7,
-0,
-1,
--4,
--10,
--3,
--1,
--1,
--4,
--2,
-4,
-13,
-15,
-11,
-3,
--4,
-3,
-4,
-2,
-7,
-13,
-9,
-9,
-9,
-6,
-0,
-1,
--1,
--1,
-3,
-5,
-1,
-0,
--5,
--2,
--12,
-4,
--7,
--3,
--11,
--8,
--6,
--10,
--14,
--8,
--16,
--12,
--19,
--19,
--20,
--3,
-0,
-10,
-23,
-25,
-27,
-45,
-30,
-28,
-19,
-24,
-13,
-0,
--15,
--20,
--17,
--4,
--9,
--6,
--5,
--10,
--9,
-0,
--1,
--7,
--14,
--14,
--6,
--6,
-4,
-0,
--5,
-1,
-4,
-6,
-4,
--1,
-3,
--8,
--4,
-1,
-11,
-9,
-12,
-6,
-1,
-1,
-10,
-6,
--2,
--3,
-9,
-7,
-4,
-4,
-0,
--8,
-0,
--3,
--1,
--2,
--1,
--6,
--19,
--10,
--18,
--13,
--15,
--14,
--11,
--6,
--4,
-0,
-7,
-18,
-16,
-38,
-34,
-32,
-23,
-17,
-7,
--6,
--24,
--17,
--16,
--9,
--6,
--5,
--12,
--3,
--12,
--5,
--6,
--5,
--15,
--6,
--3,
-2,
-1,
-13,
-0,
-4,
-0,
-0,
--1,
-7,
-6,
-11,
-4,
-2,
-4,
-9,
-5,
-7,
--4,
--1,
-0,
-7,
--1,
--7,
-1,
-1,
-1,
-0,
--5,
--10,
--9,
--9,
--6,
--13,
--13,
--9,
--7,
--10,
--5,
--3,
-10,
-12,
-27,
-21,
-26,
-17,
-13,
-9,
-2,
--4,
-5,
--10,
--4,
--18,
--11,
--15,
--5,
--6,
-2,
--9,
--5,
--17,
--15,
--4,
-13,
-0,
-0,
-4,
-15,
-7,
-2,
--4,
-0,
--7,
-10,
-5,
-13,
-11,
-8,
-4,
-8,
-0,
--1,
-0,
-3,
--2,
-1,
--3,
-0,
-0,
--12,
--14,
--18,
--15,
--14,
--15,
--16,
--7,
-3,
-9,
-7,
-12,
-17,
-24,
-25,
-27,
-16,
-10,
--8,
--2,
--8,
--8,
--14,
--10,
--13,
--2,
--7,
-2,
--12,
--4,
--9,
-3,
--2,
-4,
--2,
-13,
-1,
-7,
--9,
-1,
-0,
-13,
-6,
-11,
-0,
-9,
--2,
-6,
--9,
-3,
--9,
-10,
--5,
--7,
--4,
-5,
--22,
--8,
--28,
--14,
--23,
--11,
--16,
-7,
-13,
-31,
-24,
-35,
-27,
-33,
-16,
-20,
-5,
-3,
--20,
--6,
--13,
--2,
--17,
--10,
--18,
--2,
--7,
-1,
--10,
--5,
--12,
--2,
--6,
-4,
--5,
-6,
--3,
--2,
--9,
--1,
--5,
-1,
-0,
-3,
--8,
-0,
--5,
-0,
--6,
--13,
--11,
-3,
--4,
--10,
--18,
--4,
-0,
-6,
-4,
-17,
-26,
-35,
-38,
-35,
-34,
-24,
-15,
-6,
--2,
-0,
-0,
-5,
-0,
--6,
--10,
--13,
--12,
--6,
--10,
--6,
--2,
--3,
--13,
--13,
--8,
--9,
--9,
--4,
--10,
--10,
--8,
--7,
--15,
--8,
--8,
--14,
--11,
--8,
--9,
--4,
--20,
--13,
--3,
--4,
--11,
--19,
--16,
-1,
-4,
-15,
-21,
-39,
-45,
-56,
-49,
-48,
-30,
-26,
-8,
-4,
--4,
--5,
--3,
-1,
--5,
--7,
--17,
--8,
--4,
--2,
--11,
--1,
--5,
--4,
--9,
--10,
--7,
--9,
--13,
--7,
--2,
--8,
--10,
--14,
--19,
--12,
--4,
--6,
--10,
--11,
--11,
--14,
--9,
--11,
--4,
--8,
--5,
--11,
--17,
--16,
--6,
--3,
-15,
-15,
-38,
-45,
-56,
-53,
-49,
-32,
-31,
-11,
-14,
--7,
--5,
--10,
-1,
--10,
--8,
--22,
--5,
--10,
--7,
--21,
--2,
--12,
-2,
--13,
--1,
--11,
--4,
--17,
-4,
-0,
-1,
--7,
-0,
--6,
-11,
-5,
-4,
--7,
-2,
--10,
-1,
--8,
--3,
--7,
-1,
--11,
--13,
--26,
--16,
--29,
--11,
--12,
-2,
-11,
-27,
-32,
-37,
-32,
-43,
-27,
-25,
-12,
-9,
--4,
--11,
--25,
--20,
--18,
--11,
--13,
--8,
--8,
--8,
--16,
--14,
--5,
-4,
-6,
-10,
-5,
-8,
-7,
-4,
-16,
-8,
-2,
-4,
-9,
-13,
-15,
-4,
-0,
-0,
--3,
--1,
--2,
--7,
--6,
--1,
--6,
--12,
--20,
--21,
--29,
--29,
--16,
--14,
--3,
-9,
-16,
-26,
-31,
-43,
-37,
-31,
-23,
-15,
-7,
--5,
--22,
--23,
--23,
--18,
--18,
--16,
--18,
--5,
--10,
--9,
--16,
--7,
--6,
-7,
-1,
-12,
-7,
-18,
-9,
-11,
-0,
-5,
-0,
-15,
-8,
-23,
-8,
-7,
--6,
-3,
--8,
-10,
--4,
-6,
--10,
-2,
--18,
--1,
--12,
--13,
--32,
--24,
--28,
--15,
--29,
-1,
--6,
-15,
-21,
-45,
-41,
-47,
-32,
-31,
-14,
-12,
--11,
--9,
--19,
--15,
--23,
--16,
--28,
--10,
--15,
--5,
--19,
--12,
--11,
-3,
--4,
-4,
-1,
-7,
-7,
-1,
--1,
-4,
-6,
-16,
-10,
-14,
-13,
-11,
-8,
-7,
-5,
-7,
-5,
-3,
-4,
-1,
--9,
--7,
--8,
--15,
--11,
--20,
--22,
--26,
--26,
--28,
--23,
--17,
--2,
-5,
-30,
-39,
-56,
-47,
-46,
-29,
-23,
-3,
-7,
--7,
--1,
--22,
--22,
--33,
--25,
--30,
--19,
--17,
--11,
--22,
--2,
--5,
-0,
--6,
-12,
-2,
-19,
-2,
-11,
-8,
-16,
-13,
-16,
-4,
-14,
-5,
-13,
-0,
-7,
--1,
-5,
--3,
-7,
--1,
--2,
--6,
--4,
--16,
--6,
--12,
--7,
--13,
--12,
--23,
--22,
--30,
--20,
--23,
--6,
--1,
-15,
-18,
-29,
-33,
-42,
-36,
-44,
-36,
-34,
-21,
-7,
--7,
--11,
--19,
--28,
--32,
--23,
--25,
--16,
--25,
--23,
--26,
--25,
--12,
--4,
--1,
-0,
-3,
-7,
-4,
-7,
-7,
-12,
-14,
-4,
-15,
-16,
-15,
-15,
-14,
-5,
-8,
-4,
-6,
-4,
-6,
-11,
-4,
-6,
-5,
--4,
--10,
--9,
--4,
--5,
--8,
--12,
--17,
--24,
--30,
--28,
--30,
--32,
--28,
--22,
--16,
--5,
-6,
-15,
-27,
-44,
-52,
-61,
-50,
-46,
-36,
-31,
-17,
-1,
--5,
--9,
--15,
--18,
--28,
--26,
--34,
--34,
--32,
--25,
--24,
--19,
--17,
--12,
--9,
-0,
--6,
-7,
-0,
-13,
-9,
-15,
-12,
-16,
-10,
-14,
-13,
-22,
-14,
-17,
-0,
-9,
-1,
-7,
-7,
-16,
-4,
-9,
--7,
--2,
--7,
-4,
--2,
-3,
--3,
--4,
--22,
--9,
--18,
--11,
--19,
--4,
--16,
--22,
--33,
--31,
--40,
--29,
--32,
--14,
--8,
-17,
-26,
-51,
-45,
-57,
-53,
-60,
-53,
-53,
-36,
-31,
-16,
-12,
--7,
--18,
--32,
--36,
--44,
--39,
--45,
--36,
--41,
--35,
--31,
--24,
--28,
--17,
--14,
--2,
--6,
-0,
-8,
-18,
-18,
-19,
-24,
-18,
-11,
-19,
-12,
-15,
-18,
-20,
-19,
-18,
-13,
-9,
-4,
-8,
-6,
-5,
-0,
-1,
--5,
-0,
-3,
-4,
-6,
-4,
-6,
-3,
--5,
--7,
--16,
--18,
--19,
--12,
--4,
--7,
--14,
--24,
--32,
--42,
--39,
--43,
--39,
--30,
--29,
--25,
--20,
--5,
-3,
-16,
-33,
-49,
-68,
-79,
-81,
-84,
-77,
-70,
-58,
-41,
-26,
-9,
--1,
--16,
--30,
--39,
--49,
--53,
--50,
--52,
--51,
--46,
--40,
--41,
--36,
--33,
--27,
--18,
--10,
-3,
-9,
-9,
-16,
-13,
-14,
-10,
-14,
-14,
-11,
-7,
-10,
-21,
-23,
-19,
-16,
-12,
-7,
-2,
-3,
-7,
-8,
-7,
-10,
-10,
-15,
-14,
-6,
-2,
--5,
--1,
--4,
--3,
--3,
--3,
-1,
--1,
--2,
--3,
--12,
--16,
--18,
--12,
--11,
--10,
--6,
--3,
--12,
--19,
--19,
--23,
--24,
--22,
--22,
--34,
--39,
--33,
--31,
--18,
--2,
-21,
-51,
-69,
-82,
-92,
-87,
-86,
-77,
-61,
-42,
-19,
-0,
--11,
--21,
--33,
--43,
--46,
--50,
--54,
--59,
--53,
--47,
--42,
--34,
--26,
--16,
--10,
--1,
-0,
--2,
--1,
-9,
-10,
-15,
-22,
-27,
-16,
-3,
-7,
-2,
-11,
-16,
-15,
-16,
-11,
-10,
-4,
-3,
-8,
-4,
-10,
-6,
-6,
-8,
-3,
-0,
--1,
-2,
--1,
--2,
--4,
--4,
--3,
-0,
--3,
--6,
--7,
--8,
--13,
--15,
--13,
--12,
--14,
--12,
--15,
--17,
--24,
--32,
--36,
--41,
--40,
--26,
--12,
-7,
-25,
-41,
-63,
-79,
-80,
-82,
-70,
-63,
-50,
-24,
-7,
--6,
--17,
--35,
--38,
--33,
--38,
--40,
--45,
--45,
--31,
--30,
--24,
--17,
--18,
--13,
--5,
-3,
-3,
-6,
-5,
-8,
-7,
-10,
-11,
-9,
-11,
-9,
-8,
-6,
-5,
-10,
-11,
-10,
-10,
-10,
-4,
-6,
-7,
-6,
-5,
-7,
-11,
-9,
-9,
-11,
-9,
-4,
-1,
--2,
--3,
-3,
-4,
-0,
--6,
--13,
--15,
--22,
--26,
--25,
--25,
--19,
--18,
--22,
--27,
--28,
--35,
--36,
--35,
--19,
--1,
-21,
-39,
-64,
-69,
-73,
-70,
-64,
-47,
-34,
-15,
-1,
--13,
--16,
--31,
--30,
--39,
--32,
--29,
--17,
--19,
--21,
--17,
--3,
--16,
--7,
--8,
-3,
--2,
-4,
--4,
-0,
--12,
-0,
-6,
-5,
-0,
-7,
-4,
-9,
-0,
-17,
-6,
-8,
-7,
-12,
-8,
-17,
-2,
-5,
-1,
-6,
-5,
-7,
-5,
-6,
--2,
--3,
--3,
-0,
--11,
-0,
-1,
-0,
--6,
--9,
--18,
--6,
--8,
--9,
--14,
--4,
--14,
--19,
--29,
--28,
--29,
--23,
--22,
--7,
-3,
-25,
-39,
-59,
-66,
-68,
-59,
-51,
-30,
-16,
--2,
--14,
--25,
--26,
--40,
--24,
--25,
--12,
--16,
--13,
--17,
--10,
--21,
--10,
--14,
--1,
--9,
-3,
-0,
-1,
--8,
-5,
--8,
--2,
--3,
-14,
-6,
-17,
-1,
-11,
-5,
-4,
--10,
-15,
-3,
-12,
-7,
-14,
-8,
-15,
-2,
-8,
--4,
-9,
-0,
-5,
--5,
-8,
--6,
-0,
--6,
-0,
--15,
--10,
--23,
--15,
--15,
--6,
--20,
--12,
--20,
--17,
--27,
--18,
--14,
-7,
-13,
-32,
-42,
-56,
-43,
-45,
-34,
-26,
-10,
--2,
--14,
--10,
--25,
--21,
--22,
--12,
--18,
--11,
--9,
--17,
--12,
--7,
--15,
--1,
-0,
--1,
--1,
-1,
--12,
--8,
-2,
-8,
-12,
-7,
-9,
-4,
-4,
-3,
-7,
-4,
-12,
-6,
-10,
-15,
-15,
-3,
--3,
--5,
-3,
-6,
-6,
-0,
-1,
--4,
--3,
--9,
--13,
--10,
--9,
--9,
--4,
--9,
--12,
--20,
--23,
--26,
--27,
--26,
--12,
-2,
-19,
-38,
-45,
-48,
-54,
-44,
-26,
-15,
-6,
--5,
--10,
--17,
--21,
--18,
--18,
--21,
--16,
--12,
--14,
--9,
--9,
--16,
--7,
-3,
-2,
-0,
-1,
--3,
-9,
-12,
-1,
--3,
-0,
-3,
-16,
-10,
-8,
-10,
-13,
-4,
-2,
-7,
-15,
-5,
-5,
-3,
-1,
--6,
-1,
--4,
--6,
--7,
--3,
--20,
--7,
--17,
--12,
--18,
--14,
--21,
--25,
--34,
--20,
--22,
--2,
-18,
-44,
-52,
-70,
-50,
-47,
-22,
-4,
--6,
--12,
--21,
--17,
--20,
--10,
--18,
--16,
--15,
--10,
--11,
--9,
--5,
-0,
--8,
--2,
-0,
--4,
--3,
--1,
-4,
-7,
-13,
-12,
-8,
-0,
-7,
-5,
-10,
-5,
-9,
-9,
-6,
--9,
--1,
-0,
-7,
--1,
-7,
--5,
-0,
--18,
--14,
--14,
-2,
--2,
--9,
--34,
--27,
--34,
--18,
--22,
-4,
-9,
-47,
-47,
-67,
-53,
-50,
-20,
-11,
--18,
--2,
--33,
--14,
--16,
--5,
--14,
-2,
--21,
-0,
--11,
-0,
--21,
-0,
--11,
--1,
--10,
-5,
--17,
-5,
--8,
-13,
--3,
-9,
--1,
-17,
--1,
-18,
-2,
-16,
-2,
-21,
-1,
-18,
--5,
-10,
--7,
-9,
--12,
-8,
--17,
--5,
--29,
--14,
--31,
--3,
--27,
--16,
--35,
--11,
--9,
-32,
-16,
-54,
-43,
-46,
-14,
-20,
--19,
-3,
--11,
-5,
--25,
--2,
--17,
--4,
--25,
-7,
--17,
-2,
--19,
-1,
--6,
-11,
--17,
-0,
--9,
-28,
-1,
-16,
--9,
-9,
-2,
-23,
-7,
-20,
-0,
-13,
--3,
-14,
--7,
-9,
--4,
-3,
--14,
-0,
--21,
-3,
--11,
--12,
--23,
--17,
--42,
--20,
--45,
--46,
--39,
--24,
--22,
-11,
--2,
-39,
-89,
-134,
-120,
-101,
-57,
-24,
-3,
-1,
--50,
--71,
--68,
--47,
--53,
--38,
--30,
--33,
--19,
--9,
--27,
--3,
--3,
--14,
--9,
-11,
-12,
-13,
-0,
-19,
-29,
-13,
-16,
-25,
-19,
-18,
-18,
-24,
-15,
-23,
-26,
-13,
-16,
-18,
-11,
-3,
--4,
--2,
--3,
--28,
--30,
--22,
--42,
--41,
--34,
--50,
--35,
--34,
--69,
--66,
--76,
--101,
--94,
--109,
--80,
-16,
-103,
-192,
-318,
-337,
-259,
-220,
-156,
-64,
-6,
--55,
--127,
--185,
--195,
--185,
--182,
--146,
--143,
--137,
--71,
--18,
-3,
-22,
-42,
-46,
-58,
-66,
-57,
-53,
-44,
-30,
-21,
-11,
-8,
--1,
-6,
-7,
-15,
-24,
-30,
-33,
-39,
-42,
-40,
-47,
-63,
-59,
-47,
-31,
-14,
--5,
--19,
--28,
--45,
--46,
--55,
--55,
--65,
--72,
--87,
--100,
--97,
--100,
--99,
--127,
--147,
--166,
--184,
--204,
--177,
--157,
--17,
-398,
-737,
-863,
-867,
-696,
-510,
-337,
-155,
--43,
--288,
--535,
--694,
--732,
--710,
--658,
--558,
--493,
--392,
--178,
-40,
-186,
-298,
-359,
-366,
-397,
-439,
-372,
-242,
-150,
-30,
--79,
--127,
--173,
--207,
--219,
--151,
--86,
--12,
-69,
-136,
-170,
-198,
-223,
-227,
-212,
-183,
-145,
-68,
-8,
--23,
--56,
--76,
--84,
--104,
--137,
--199,
--222,
--219,
--193,
--154,
--109,
--85,
--48,
--34,
--45,
--79,
--106,
--163,
--189,
--284,
--388,
--491,
--520,
--528,
--492,
--334,
--181,
-337,
-1588,
-2517,
-2790,
-2658,
-2100,
-1398,
-804,
-193,
--514,
--1413,
--2214,
--2762,
--2872,
--2689,
--2341,
--1805,
--1254,
--671,
-197,
-1134,
-1850,
-2271,
-2443,
-2238,
-1863,
-1564,
-1131,
-361,
--457,
--1179,
--1843,
--2236,
--2234,
--2109,
--1937,
--1485,
--755,
--24,
-787,
-1557,
-2039,
-2226,
-2373,
-2324,
-1994,
-1476,
-844,
-37,
--724,
--1258,
--1640,
--1935,
--1977,
--1798,
--1435,
--968,
--344,
-216,
-675,
-1089,
-1400,
-1518,
-1429,
-1249,
-876,
-412,
--33,
--430,
--785,
--1070,
--1170,
--1277,
--1314,
--1269,
--1110,
--978,
--804,
--609,
--641,
--697,
--651,
--552,
--494,
--325,
-135,
-500,
-2215,
-5495,
-6796,
-6052,
-5042,
-3147,
-1215,
-116,
--1002,
--3144,
--5589,
--6520,
--6317,
--5735,
--4288,
--2890,
--2091,
--759,
-1408,
-3363,
-4471,
-4948,
-4826,
-3928,
-3044,
-2389,
-1098,
--649,
--2099,
--3161,
--3899,
--4013,
--3612,
--3199,
--2637,
--1418,
-9,
-1187,
-2276,
-3095,
-3361,
-3341,
-3278,
-2863,
-1960,
-1001,
-31,
--1000,
--1789,
--2155,
--2455,
--2552,
--2271,
--1698,
--1070,
--305,
-507,
-1062,
-1471,
-1806,
-1930,
-1752,
-1427,
-964,
-339,
--303,
--834,
--1274,
--1591,
--1681,
--1594,
--1359,
--1020,
--649,
--326,
--41,
-192,
-413,
-493,
-346,
--75,
--535,
--949,
--1245,
--1428,
--1321,
--980,
--317,
-2528,
-6139,
-7000,
-6364,
-5218,
-3303,
-1706,
-628,
--795,
--3546,
--5920,
--6498,
--6545,
--6103,
--4835,
--3917,
--3066,
--1293,
-1199,
-3039,
-3927,
-4666,
-4768,
-4350,
-4274,
-3789,
-2220,
-377,
--1035,
--2202,
--3198,
--3586,
--3753,
--3980,
--3515,
--2339,
--1137,
--45,
-1100,
-2067,
-2672,
-3234,
-3600,
-3294,
-2586,
-1853,
-987,
-2,
--850,
--1499,
--2112,
--2413,
--2256,
--1928,
--1532,
--945,
--262,
-366,
-972,
-1480,
-1667,
-1590,
-1400,
-1114,
-714,
-239,
--184,
--534,
--877,
--1107,
--1193,
--1275,
--1284,
--1066,
--770,
--586,
--439,
--277,
--199,
--166,
--58,
--137,
--537,
--864,
--1068,
--1254,
--1350,
--1073,
--581,
-291,
-3441,
-7266,
-8090,
-7061,
-5406,
-3345,
-1467,
-10,
--1669,
--4631,
--6887,
--6956,
--6475,
--5812,
--4678,
--3607,
--2441,
--531,
-2202,
-3894,
-4422,
-4836,
-4817,
-4194,
-3508,
-2578,
-947,
--906,
--1956,
--2704,
--3506,
--3806,
--3708,
--3506,
--2837,
--1548,
--261,
-710,
-1659,
-2504,
-2934,
-3179,
-3249,
-2844,
-2061,
-1358,
-616,
--247,
--975,
--1414,
--1790,
--1969,
--1781,
--1391,
--1000,
--548,
-140,
-701,
-1053,
-1344,
-1397,
-1199,
-923,
-652,
-241,
--257,
--572,
--828,
--1058,
--1161,
--1162,
--1141,
--996,
--631,
--296,
--10,
-279,
-423,
-307,
-137,
--64,
--363,
--676,
--897,
--1239,
--1631,
--1853,
--1864,
--1797,
--1355,
--681,
-342,
-2668,
-6898,
-9692,
-9193,
-7285,
-4881,
-2444,
-230,
--1644,
--4223,
--7340,
--8228,
--7415,
--6573,
--5662,
--4441,
--2955,
--1304,
-1388,
-3742,
-4299,
-4524,
-4932,
-4858,
-4111,
-3152,
-1788,
--254,
--1512,
--2051,
--2934,
--3781,
--3890,
--3579,
--3057,
--1982,
--708,
--11,
-683,
-1632,
-2286,
-2472,
-2621,
-2660,
-2229,
-1872,
-1752,
-1188,
-366,
--264,
--774,
--1311,
--1553,
--1552,
--1748,
--1830,
--1453,
--964,
--523,
--8,
-474,
-765,
-1050,
-1356,
-1343,
-1042,
-833,
-623,
-350,
-90,
--155,
--527,
--898,
--1037,
--1049,
--1037,
--957,
--808,
--603,
--439,
--291,
--303,
--458,
--601,
--511,
--491,
--695,
--960,
--1106,
--1124,
--1013,
--616,
--129,
-1213,
-5183,
-8228,
-7688,
-5918,
-3998,
-2165,
-464,
--1063,
--2909,
--5096,
--5447,
--4841,
--4942,
--5007,
--4437,
--3402,
--1980,
--204,
-1295,
-1952,
-2731,
-3668,
-3893,
-3588,
-3107,
-2463,
-1659,
-952,
-248,
--785,
--1655,
--2032,
--2130,
--2199,
--2108,
--1876,
--1482,
--1012,
--360,
-102,
-458,
-793,
-1145,
-1295,
-1284,
-1138,
-1002,
-843,
-739,
-622,
-451,
-377,
-481,
-375,
-155,
--17,
--117,
--238,
--274,
--402,
--593,
--772,
--748,
--776,
--836,
--809,
--643,
--500,
--319,
--144,
-7,
-123,
-323,
-472,
-579,
-574,
-458,
-214,
--122,
--464,
--744,
--859,
--976,
--1160,
--1370,
--1517,
--1518,
--1444,
--982,
--524,
-1029,
-4637,
-6859,
-5961,
-4565,
-3378,
-2129,
-1090,
--15,
--1187,
--2183,
--2343,
--2444,
--3464,
--4397,
--4442,
--4000,
--3218,
--2264,
--1375,
--581,
-369,
-1273,
-1793,
-2064,
-2506,
-2839,
-2890,
-2653,
-2186,
-1589,
-1011,
-404,
--166,
--700,
--1027,
--1311,
--1499,
--1686,
--1744,
--1678,
--1455,
--1118,
--694,
--282,
-102,
-418,
-670,
-812,
-971,
-1153,
-1304,
-1331,
-1250,
-1065,
-836,
-544,
-266,
--3,
--156,
--180,
--268,
--519,
--707,
--805,
--809,
--840,
--840,
--795,
--698,
--521,
--314,
--146,
--32,
-10,
-49,
--12,
--107,
--245,
--376,
--365,
--344,
--348,
--490,
--668,
--736,
--795,
--556,
--286,
-348,
-2825,
-5387,
-5002,
-3315,
-2393,
-1505,
-702,
-211,
--402,
--751,
--684,
--948,
--2080,
--3432,
--3953,
--3680,
--3103,
--2450,
--1818,
--1127,
--419,
--9,
-145,
-370,
-965,
-1734,
-2356,
-2572,
-2423,
-2145,
-1741,
-1238,
-753,
-441,
-293,
-89,
--239,
--724,
--1212,
--1515,
--1602,
--1528,
--1360,
--1120,
--814,
--541,
--344,
--138,
-109,
-394,
-709,
-981,
-1141,
-1192,
-1141,
-1008,
-851,
-720,
-599,
-454,
-287,
-95,
--114,
--311,
--473,
--583,
--621,
--636,
--712,
--775,
--779,
--784,
--771,
--761,
--763,
--783,
--811,
--779,
--618,
--374,
--158,
--116,
--126,
--142,
--180,
--17,
-183,
-843,
-2996,
-4968,
-4288,
-2646,
-1929,
-1208,
-464,
-249,
-54,
-97,
-424,
--99,
--1685,
--3049,
--3497,
--3422,
--3049,
--2480,
--1883,
--1313,
--971,
--995,
--1134,
--862,
--44,
-911,
-1655,
-2068,
-2191,
-2109,
-1843,
-1522,
-1281,
-1239,
-1303,
-1226,
-867,
-312,
--232,
--667,
--949,
--1075,
--1019,
--885,
--784,
--781,
--840,
--844,
--719,
--468,
--182,
-102,
-358,
-515,
-586,
-572,
-552,
-521,
-510,
-525,
-508,
-444,
-316,
-152,
--43,
--233,
--378,
--474,
--520,
--567,
--643,
--757,
--884,
--985,
--1056,
--1022,
--850,
--637,
--464,
--411,
--391,
--371,
--257,
-90,
-368,
-1460,
-3843,
-4975,
-3682,
-2294,
-1470,
-670,
-290,
-146,
--168,
--205,
--298,
--1151,
--2520,
--3381,
--3395,
--2867,
--2241,
--1657,
--1224,
--844,
--576,
--415,
--281,
-229,
-991,
-1680,
-2012,
-2055,
-1855,
-1640,
-1354,
-1090,
-820,
-679,
-499,
-236,
--195,
--618,
--944,
--1077,
--1123,
--1024,
--908,
--695,
--525,
--369,
--278,
--117,
-80,
-334,
-530,
-688,
-723,
-751,
-652,
-579,
-443,
-379,
-294,
-223,
-63,
--111,
--338,
--485,
--601,
--615,
--630,
--594,
--629,
--644,
--725,
--794,
--872,
--788,
--650,
--486,
--471,
--540,
--571,
--526,
--364,
--37,
-309,
-1862,
-4190,
-4600,
-3152,
-2067,
-1274,
-715,
-616,
-523,
-145,
--155,
--547,
--1396,
--2551,
--3151,
--3128,
--2715,
--2181,
--1744,
--1572,
--1324,
--954,
--541,
--102,
-497,
-1104,
-1662,
-1956,
-2016,
-1834,
-1620,
-1420,
-1287,
-1066,
-814,
-492,
-208,
--116,
--426,
--722,
--859,
--916,
--843,
--804,
--724,
--686,
--553,
--410,
--212,
--34,
-169,
-325,
-453,
-488,
-492,
-437,
-464,
-415,
-396,
-282,
-183,
-3,
--131,
--280,
--386,
--526,
--568,
--646,
--701,
--839,
--898,
--980,
--910,
--809,
--687,
--610,
--516,
--430,
--315,
--150,
-167,
-562,
-2306,
-4506,
-4563,
-3127,
-2021,
-1106,
-548,
-416,
-226,
--298,
--721,
--1105,
--1838,
--2796,
--3160,
--2969,
--2491,
--1878,
--1259,
--868,
--516,
--136,
-260,
-592,
-1021,
-1463,
-1763,
-1817,
-1633,
-1225,
-923,
-715,
-559,
-317,
-100,
--186,
--453,
--747,
--894,
--966,
--885,
--728,
--518,
--383,
--221,
--79,
-98,
-282,
-440,
-522,
-588,
-604,
-577,
-468,
-399,
-310,
-258,
-162,
-39,
--141,
--279,
--357,
--398,
--430,
--458,
--513,
--578,
--673,
--753,
--848,
--811,
--683,
--575,
--540,
--541,
--543,
--532,
--355,
--14,
-501,
-2415,
-4789,
-4874,
-3247,
-1809,
-813,
-340,
-298,
-5,
--896,
--1698,
--2031,
--2557,
--3148,
--3246,
--2873,
--2215,
--1395,
--706,
--313,
-16,
-617,
-1239,
-1719,
-2007,
-2086,
-1953,
-1662,
-1308,
-898,
-448,
-0,
--343,
--637,
--864,
--1045,
--1159,
--1080,
--895,
--587,
--272,
-58,
-315,
-587,
-663,
-658,
-714,
-798,
-799,
-685,
-474,
-191,
--66,
--284,
--456,
--592,
--671,
--709,
--692,
--605,
--521,
--430,
--361,
--321,
--307,
--343,
--402,
--452,
--385,
--431,
--538,
--653,
--767,
--798,
--722,
--333,
-74,
-2319,
-6417,
-7237,
-4578,
-1893,
-80,
--534,
--305,
--518,
--2023,
--3525,
--3760,
--3773,
--3936,
--3578,
--2753,
--1490,
-63,
-1233,
-1601,
-1711,
-2132,
-2565,
-2695,
-2518,
-1948,
-1219,
-528,
--152,
--810,
--1410,
--1721,
--1920,
--1947,
--1724,
--1397,
--867,
--186,
-379,
-817,
-1180,
-1475,
-1649,
-1664,
-1540,
-1277,
-916,
-479,
-9,
--409,
--756,
--979,
--1131,
--1198,
--1176,
--971,
--620,
--254,
-26,
-163,
-125,
-128,
-93,
--31,
--292,
--478,
--635,
--953,
--1380,
--1583,
--1644,
--1419,
--1152,
--399,
-251,
-4499,
-10959,
-10640,
-5605,
-940,
--1797,
--1900,
--912,
--1437,
--4530,
--6791,
--6083,
--4884,
--3823,
--2752,
--1802,
--493,
-1411,
-3196,
-3629,
-3332,
-3298,
-3084,
-2571,
-1731,
-518,
--743,
--1456,
--1563,
--1716,
--1912,
--1821,
--1440,
--688,
-139,
-720,
-993,
-1170,
-1393,
-1542,
-1498,
-1215,
-727,
-218,
--303,
--680,
--897,
--986,
--982,
--935,
--801,
--570,
--336,
--50,
-215,
-398,
-461,
-412,
-177,
--178,
--514,
--799,
--1120,
--1238,
--1446,
--1914,
--2206,
--2069,
--1724,
--1218,
--675,
-403,
-1587,
-10391,
-17960,
-12996,
-4106,
--3204,
--5756,
--3983,
--2049,
--4025,
--10017,
--11376,
--7444,
--3275,
--60,
-751,
-750,
-1933,
-5097,
-7442,
-6069,
-3469,
-1246,
-87,
-103,
--526,
--2235,
--4086,
--4202,
--2776,
--1238,
--34,
-354,
-956,
-2050,
-2908,
-3065,
-2242,
-1311,
-557,
--49,
--425,
--1171,
--1757,
--1790,
--1290,
--594,
--357,
--284,
--212,
-122,
-809,
-1042,
-818,
-168,
--69,
-474,
-421,
--452,
--1605,
--2380,
--2274,
--1574,
--1230,
--2216,
--2752,
--2511,
--1407,
--640,
-312,
-676,
-4389,
-19943,
-23784,
-11922,
--2128,
--11491,
--10505,
--5286,
--2405,
--8670,
--16588,
--12890,
--4652,
-2789,
-5901,
-4161,
-3109,
-5802,
-10495,
-9957,
-4443,
--427,
--3507,
--3885,
--3529,
--4689,
--6813,
--7109,
--4011,
--349,
-1936,
-2980,
-3045,
-3496,
-4643,
-5230,
-4065,
-1849,
--118,
--1173,
--1445,
--2042,
--2893,
--3375,
--2894,
--1254,
-274,
-1038,
-1307,
-2290,
-2781,
-2132,
-1267,
-106,
--630,
--884,
--1637,
--2480,
--3193,
--3014,
--2220,
--1334,
--981,
--1771,
--2146,
--1551,
--431,
-200,
-527,
-742,
-3176,
-17053,
-21910,
-10382,
--1289,
--7789,
--6810,
--3716,
--4452,
--11521,
--16921,
--10358,
--1918,
-2356,
-3087,
-1882,
-3618,
-8258,
-11358,
-8237,
-2385,
--273,
--1011,
--759,
--2180,
--5560,
--7378,
--5592,
--2185,
--744,
--524,
-8,
-1316,
-3802,
-5109,
-4298,
-2707,
-1756,
-1418,
-649,
--450,
--1740,
--2189,
--1271,
--1100,
--1679,
--1844,
--1360,
--592,
--325,
--144,
-133,
-745,
-1554,
-1549,
-852,
-513,
-308,
--135,
--795,
--1430,
--1921,
--2655,
--3667,
--3859,
--3421,
--2082,
--855,
-743,
-1367,
-11088,
-21800,
-14144,
-3001,
--2687,
--3697,
--1984,
--3637,
--10176,
--15992,
--11894,
--4093,
--1757,
--1223,
--662,
-2685,
-8279,
-10945,
-8109,
-3635,
-2661,
-2783,
-892,
--2400,
--6211,
--7154,
--4982,
--2746,
--2283,
--2438,
--971,
-1750,
-3884,
-4493,
-3457,
-2951,
-3329,
-2881,
-1281,
--590,
--1789,
--2085,
--2185,
--2296,
--2621,
--2183,
--1219,
--538,
--59,
-510,
-1243,
-1925,
-1929,
-1515,
-982,
-511,
--433,
--1173,
--1845,
--2172,
--2228,
--2871,
--3663,
--3279,
--2056,
--670,
-256,
-1334,
-2850,
-15158,
-19429,
-7039,
--384,
--1970,
--1342,
--1607,
--6796,
--13500,
--14145,
--6652,
--2427,
--3188,
--2202,
-996,
-6164,
-9815,
-8518,
-5061,
-3964,
-4637,
-2691,
--1290,
--4764,
--6237,
--5122,
--3867,
--4382,
--4340,
--2171,
-954,
-2885,
-3430,
-3650,
-4302,
-5176,
-4711,
-2169,
-3,
--958,
--1485,
--2344,
--3327,
--3815,
--3159,
--1939,
--888,
--331,
-405,
-1484,
-2494,
-2693,
-2133,
-1396,
-838,
--47,
--874,
--1956,
--2849,
--2975,
--3277,
--3840,
--3478,
--2275,
--834,
-246,
-1425,
-2537,
-15180,
-18376,
-5188,
-410,
-802,
-554,
--1236,
--7656,
--13700,
--12256,
--5313,
--3930,
--5878,
--3184,
-1356,
-6062,
-8660,
-6908,
-5229,
-6261,
-6295,
-2669,
--1615,
--3864,
--4683,
--4685,
--5191,
--6164,
--4786,
--1257,
-803,
-1647,
-2717,
-4277,
-5751,
-5444,
-3534,
-1693,
-788,
-240,
--1209,
--2868,
--3856,
--3683,
--2945,
--2398,
--2127,
--1237,
-221,
-1625,
-2252,
-2363,
-2177,
-2139,
-1646,
-747,
--682,
--1592,
--1973,
--2640,
--4154,
--4457,
--3691,
--2213,
--1609,
-358,
-9,
-8796,
-19973,
-8801,
-323,
-3725,
-4003,
-1287,
--4158,
--11215,
--12123,
--6560,
--4893,
--8680,
--7000,
--1262,
-2843,
-5584,
-5846,
-5210,
-7061,
-8286,
-5502,
-1735,
-34,
--1179,
--2711,
--4369,
--6004,
--5869,
--4326,
--3324,
--2591,
--387,
-2387,
-3383,
-4066,
-4520,
-4303,
-4319,
-3839,
-1928,
--212,
--929,
--1713,
--3166,
--3950,
--4068,
--3727,
--2636,
--1732,
--858,
-429,
-1712,
-2271,
-2567,
-2489,
-2242,
-1508,
-525,
--534,
--1480,
--3190,
--4176,
--4399,
--3711,
--3319,
--1318,
--1529,
-5824,
-18263,
-8980,
-1129,
-6565,
-5402,
-1529,
--2393,
--8897,
--9751,
--5403,
--5862,
--10492,
--7777,
--1518,
-366,
-2076,
-3696,
-4427,
-7644,
-8718,
-5220,
-2988,
-3238,
-1518,
--1549,
--3359,
--4583,
--5273,
--4773,
--4814,
--4600,
--2655,
--692,
-471,
-2320,
-4827,
-5642,
-5031,
-4951,
-4328,
-3095,
-1691,
--433,
--2141,
--2810,
--3720,
--4751,
--4605,
--3658,
--2743,
--1551,
--321,
-614,
-1792,
-2448,
-2382,
-2240,
-1606,
-743,
-87,
--1379,
--3091,
--3718,
--3446,
--3437,
--2448,
--1598,
-213,
-13754,
-13943,
-1573,
-6057,
-9324,
-2801,
--23,
--4927,
--8617,
--5726,
--5704,
--11215,
--10704,
--3695,
--2220,
--2605,
-1165,
-3401,
-5816,
-8504,
-6316,
-4585,
-6307,
-4747,
-594,
--1023,
--1896,
--3709,
--4527,
--5028,
--5585,
--4224,
--2220,
--1274,
-293,
-1942,
-2965,
-3680,
-4734,
-4718,
-3363,
-2892,
-2290,
-475,
--716,
--1845,
--2946,
--3263,
--3337,
--3567,
--3026,
--1758,
--982,
--436,
-702,
-1028,
-1410,
-1741,
-899,
-309,
-291,
--996,
--2445,
--3047,
--2952,
--3078,
--1523,
--2030,
-2577,
-15559,
-9454,
-1329,
-10378,
-8861,
-812,
--178,
--5162,
--7416,
--4607,
--8367,
--13138,
--8360,
--2930,
--5048,
--4060,
-1923,
-3453,
-5460,
-7466,
-5185,
-6214,
-8049,
-3818,
-813,
-1270,
--554,
--3504,
--4259,
--4876,
--4876,
--3386,
--3386,
--3113,
--156,
-1431,
-1404,
-2648,
-3661,
-3690,
-3786,
-3546,
-2712,
-1647,
-1033,
--233,
--1897,
--2276,
--2634,
--3387,
--2877,
--2404,
--2222,
--1388,
--525,
--72,
-513,
-771,
-515,
-361,
-372,
--1054,
--2250,
--2155,
--2433,
--2983,
--1100,
--1463,
-1833,
-14674,
-9493,
-994,
-11938,
-10503,
--113,
-849,
--2621,
--6603,
--4210,
--8873,
--13590,
--7446,
--3923,
--8350,
--5775,
-1855,
-2051,
-2889,
-6569,
-5468,
-6885,
-9044,
-3845,
-1981,
-4585,
-840,
--3160,
--2258,
--3339,
--4931,
--3915,
--4280,
--4171,
--1115,
--336,
--844,
-1792,
-3382,
-2470,
-3089,
-3456,
-2413,
-2294,
-1580,
--213,
--464,
--689,
--2154,
--2373,
--1735,
--1924,
--1759,
--1042,
--263,
--271,
--470,
-311,
-122,
--736,
--585,
--908,
--1820,
--2145,
--2413,
--2727,
--1706,
--627,
--619,
-4874,
-12214,
-7923,
-4151,
-10217,
-8801,
-1832,
--249,
--2252,
--3941,
--5356,
--8809,
--10597,
--8087,
--4985,
--7232,
--7340,
--455,
-1766,
-511,
-3545,
-5644,
-6035,
-7060,
-5689,
-3666,
-4528,
-4075,
--346,
--2183,
--702,
--2923,
--5332,
--3956,
--3938,
--3891,
--1722,
--1618,
--1007,
-2233,
-3124,
-2092,
-3473,
-4677,
-3158,
-2354,
-2344,
-896,
-13,
--353,
--1920,
--2500,
--1876,
--2429,
--2904,
--1931,
--1548,
--1647,
--1143,
--884,
--587,
--356,
--508,
--603,
--570,
--880,
--1604,
--1523,
--1037,
--233,
-392,
-246,
-7721,
-12282,
-3714,
-4320,
-10768,
-5362,
--326,
--905,
--1597,
--3500,
--6473,
--8522,
--9139,
--6295,
--5259,
--8560,
--4871,
-1286,
-254,
--49,
-3842,
-6419,
-5774,
-5068,
-5505,
-4977,
-4533,
-3102,
--292,
--514,
-212,
--2991,
--5293,
--3514,
--2846,
--4594,
--4048,
--1929,
--1453,
--380,
-842,
-1019,
-2564,
-4031,
-2872,
-2666,
-4105,
-3307,
-1387,
-1469,
-1130,
--486,
--1134,
--1432,
--2295,
--2313,
--2289,
--2707,
--2354,
--1718,
--2015,
--1659,
--910,
--1114,
--1046,
--671,
--781,
--696,
--1066,
--920,
--494,
-630,
--299,
-2946,
-11838,
-6153,
-756,
-9967,
-9690,
-956,
--307,
-1845,
--422,
--4869,
--5636,
--7078,
--7135,
--4922,
--8414,
--8790,
--2391,
--1148,
--3767,
--1233,
-4544,
-4553,
-2606,
-5319,
-6810,
-5740,
-4969,
-3580,
-2641,
-2352,
-620,
--2410,
--2839,
--1672,
--3703,
--5513,
--3556,
--2440,
--3208,
--2349,
--432,
-345,
-1085,
-2191,
-2337,
-2745,
-3717,
-2847,
-1849,
-2422,
-2079,
-335,
--214,
--200,
--1094,
--1711,
--1872,
--2344,
--2092,
--1723,
--2328,
--2458,
--1317,
--1102,
--1879,
--1257,
--123,
--629,
--738,
--453,
--109,
-594,
-1436,
-277,
-2464,
-11940,
-6632,
--1004,
-8264,
-10307,
-345,
--2750,
-2361,
-611,
--7160,
--6461,
--5327,
--7288,
--6340,
--7520,
--7649,
--3079,
--742,
--3018,
--1572,
-5171,
-5207,
-1733,
-5350,
-8233,
-5364,
-3687,
-4600,
-3696,
-1606,
-583,
--1252,
--2373,
--1724,
--3315,
--5337,
--3644,
--2214,
--3828,
--3650,
--742,
-30,
--493,
-992,
-2447,
-2577,
-2805,
-3105,
-2993,
-3033,
-2781,
-1472,
-929,
-1016,
--326,
--1571,
--1491,
--1549,
--2321,
--2736,
--2195,
--1921,
--2231,
--2236,
--1424,
--1151,
--1565,
--1131,
--567,
--966,
--660,
--647,
--512,
-129,
-1163,
--39,
-2185,
-9519,
-3970,
-1406,
-8300,
-7218,
-904,
-922,
-4135,
--220,
--3955,
--2012,
--3738,
--5164,
--4935,
--5977,
--5533,
--3731,
--3711,
--4401,
--1222,
-1074,
--614,
-576,
-3421,
-3648,
-2696,
-3423,
-4231,
-3550,
-2987,
-2061,
-1263,
-1521,
-290,
--1497,
--1411,
--887,
--2235,
--3156,
--2033,
--1655,
--2231,
--1780,
--914,
--406,
--37,
-398,
-721,
-1364,
-1844,
-1608,
-1558,
-1991,
-1915,
-1263,
-920,
-1012,
-455,
--182,
--375,
--600,
--1079,
--1270,
--1304,
--1347,
--1242,
--1019,
--991,
--693,
--437,
--596,
--480,
-54,
--152,
--430,
--113,
-13,
--468,
--500,
--521,
--375,
--321,
-46,
--615,
-1857,
-5276,
-1047,
-1304,
-5364,
-3720,
-427,
-969,
-2866,
-60,
--1980,
--856,
--1994,
--2713,
--2620,
--3138,
--3432,
--2515,
--1677,
--2598,
--1889,
-111,
-16,
--190,
-914,
-1912,
-1649,
-1546,
-2185,
-1917,
-1525,
-1621,
-1180,
-585,
-440,
-444,
--330,
--841,
--637,
--867,
--1331,
--1271,
--1064,
--1109,
--1007,
--648,
--539,
--378,
-38,
-310,
-399,
-644,
-932,
-1043,
-1017,
-1087,
-1034,
-896,
-724,
-493,
-249,
-71,
--7,
--260,
--565,
--549,
--526,
--607,
--669,
--547,
--426,
--399,
--283,
--164,
--120,
--9,
-41,
-53,
--42,
--73,
--112,
--179,
--342,
--426,
--469,
--497,
--554,
--574,
--701,
--484,
--266,
--66,
--354,
-757,
-2832,
-1417,
-142,
-2007,
-3958,
-2079,
-28,
-1105,
-1712,
-464,
--647,
--819,
--992,
--1518,
--1511,
--1828,
--2259,
--1935,
--1445,
--1378,
--1419,
--869,
--216,
--39,
-212,
-606,
-932,
-966,
-1093,
-1317,
-1159,
-923,
-869,
-781,
-471,
-155,
-48,
--163,
--431,
--536,
--624,
--717,
--739,
--679,
--574,
--466,
--297,
--136,
-0,
-162,
-282,
-383,
-443,
-478,
-521,
-500,
-418,
-335,
-257,
-194,
-91,
-7,
--59,
--114,
--170,
--186,
--240,
--312,
--257,
--154,
--145,
--165,
--121,
--32,
--7,
-24,
-81,
-90,
-89,
-174,
-205,
-111,
-67,
-89,
-81,
--9,
--51,
--70,
--155,
--284,
--278,
--327,
--429,
--396,
--341,
--381,
--430,
--352,
--310,
--272,
--204,
--85,
--150,
-80,
-662,
-335,
--1,
-222,
-524,
-319,
-344,
-1942,
-1990,
-525,
-363,
-1053,
-1318,
-421,
-50,
-91,
--476,
--747,
--661,
--791,
--1278,
--1465,
--1063,
--965,
--1033,
--768,
--502,
--304,
--172,
-154,
-401,
-463,
-596,
-731,
-746,
-683,
-622,
-562,
-404,
-269,
-151,
--16,
--163,
--270,
--338,
--409,
--413,
--369,
--398,
--358,
--250,
--188,
--222,
--97,
-60,
-158,
-174,
-248,
-307,
-329,
-325,
-354,
-295,
-217,
-162,
-154,
-78,
-0,
--66,
--86,
--97,
--93,
--119,
--104,
--35,
--4,
--11,
--6,
--69,
--43,
-38,
-41,
--7,
--37,
-0,
--13,
--85,
--68,
--68,
--80,
--107,
--81,
--82,
--74,
--86,
--66,
--92,
--61,
--61,
--33,
--59,
--71,
--122,
--126,
--181,
--217,
--254,
--236,
--270,
--342,
--315,
--291,
--285,
--153,
--35,
-78,
-89,
-1837,
-2562,
-831,
-424,
-1316,
-1760,
-754,
--120,
-26,
--317,
--593,
--716,
--1095,
--1379,
--1373,
--1018,
--1002,
--1129,
--762,
--415,
--179,
--2,
-243,
-478,
-604,
-784,
-838,
-751,
-682,
-608,
-504,
-280,
-35,
--118,
--205,
--323,
--476,
--579,
--561,
--566,
--544,
--427,
--292,
--179,
--49,
-98,
-231,
-332,
-430,
-482,
-485,
-478,
-442,
-392,
-283,
-178,
-82,
-18,
--77,
--143,
--208,
--211,
--224,
--225,
--227,
--167,
--112,
--45,
--15,
-50,
-114,
-161,
-178,
-204,
-219,
-205,
-162,
-106,
-66,
--23,
--155,
--194,
--192,
--254,
--307,
--314,
--257,
--247,
--184,
--157,
--118,
--48,
-35,
-34,
-9,
-0,
-53,
--15,
--101,
--126,
--139,
--229,
--321,
--431,
--343,
--225,
--136,
--203,
-155,
-2249,
-2043,
-292,
-680,
-1780,
-1723,
-370,
--146,
-104,
--212,
--411,
--968,
--1471,
--1388,
--1103,
--1045,
--1383,
--1195,
--536,
--254,
--126,
--31,
-344,
-710,
-860,
-881,
-800,
-822,
-866,
-599,
-316,
-112,
-0,
--205,
--447,
--592,
--660,
--669,
--626,
--625,
--510,
--331,
--112,
-20,
-154,
-307,
-459,
-557,
-569,
-515,
-492,
-464,
-383,
-189,
-70,
-5,
--88,
--218,
--281,
--289,
--290,
--312,
--254,
--188,
--103,
--18,
-89,
-160,
-201,
-248,
-324,
-334,
-307,
-255,
-201,
-125,
-47,
--41,
--146,
--175,
--214,
--290,
--298,
--398,
--399,
--262,
--234,
--263,
--198,
--20,
-69,
-41,
-17,
-59,
-80,
-37,
--109,
--163,
--139,
--217,
--396,
--489,
--464,
--241,
--223,
--132,
--266,
-1765,
-2822,
-428,
-325,
-1911,
-2224,
-731,
--466,
-58,
-90,
--363,
--1061,
--1848,
--1478,
--1048,
--1188,
--1626,
--1425,
--500,
--126,
--120,
-29,
-427,
-983,
-1016,
-846,
-890,
-1003,
-968,
-621,
-321,
-168,
-11,
--203,
--507,
--673,
--695,
--714,
--741,
--820,
--670,
--416,
--267,
--153,
-14,
-262,
-468,
-551,
-629,
-658,
-705,
-676,
-571,
-452,
-333,
-200,
-49,
--106,
--193,
--336,
--439,
--444,
--440,
--429,
--382,
--296,
--193,
--87,
-17,
-78,
-148,
-237,
-288,
-278,
-282,
-280,
-243,
-162,
-95,
-67,
-6,
--62,
--121,
--174,
--228,
--261,
--278,
--309,
--330,
--301,
--278,
--304,
--342,
--329,
--283,
--302,
--329,
--278,
--238,
--245,
--244,
--269,
--78,
-41,
-242,
-97,
-1291,
-2890,
-1483,
-993,
-1982,
-2135,
-1016,
-98,
-475,
-68,
--777,
--1112,
--1511,
--1531,
--1717,
--1782,
--1761,
--1558,
--1042,
--930,
--723,
--176,
-262,
-536,
-698,
-1069,
-1263,
-1231,
-1250,
-1085,
-901,
-696,
-423,
-113,
--206,
--382,
--622,
--836,
--909,
--938,
--898,
--852,
--708,
--503,
--323,
--82,
-121,
-340,
-520,
-672,
-780,
-820,
-838,
-808,
-714,
-614,
-452,
-309,
-124,
--30,
--158,
--280,
--378,
--437,
--465,
--459,
--439,
--386,
--330,
--247,
--164,
--94,
--30,
-20,
-75,
-97,
-72,
-38,
-66,
-56,
-10,
-7,
-24,
--3,
--44,
--31,
-2,
--17,
--43,
--11,
--33,
--65,
--125,
--208,
--261,
--399,
--523,
--590,
--648,
--749,
--865,
--727,
--583,
--399,
--359,
-937,
-2246,
-1545,
-1816,
-2823,
-2789,
-1815,
-1425,
-1819,
-907,
-22,
--344,
--736,
--1228,
--1916,
--2187,
--2283,
--2317,
--2281,
--2329,
--1779,
--1327,
--1049,
--609,
--9,
-603,
-799,
-1139,
-1566,
-1672,
-1679,
-1543,
-1538,
-1309,
-954,
-658,
-360,
-66,
--293,
--625,
--752,
--945,
--1055,
--1136,
--1060,
--938,
--895,
--698,
--484,
--262,
--79,
-125,
-365,
-533,
-654,
-779,
-859,
-933,
-880,
-852,
-803,
-690,
-555,
-394,
-291,
-92,
--95,
--230,
--373,
--524,
--625,
--691,
--729,
--764,
--719,
--680,
--583,
--469,
--351,
--222,
--73,
-79,
-170,
-274,
-392,
-423,
-419,
-417,
-393,
-254,
-117,
--36,
--207,
--402,
--607,
--734,
--940,
--1034,
--1216,
--1324,
--1241,
--1034,
--923,
--557,
-1060,
-1737,
-1615,
-2842,
-3811,
-3578,
-2905,
-3300,
-3178,
-1690,
-955,
-455,
--292,
--1483,
--2319,
--2502,
--3018,
--3353,
--3562,
--3301,
--2792,
--2659,
--2195,
--1426,
--640,
--142,
-273,
-1167,
-1653,
-1841,
-2078,
-2310,
-2408,
-2044,
-1855,
-1622,
-1205,
-717,
-206,
--131,
--533,
--952,
--1217,
--1401,
--1429,
--1527,
--1467,
--1251,
--1021,
--781,
--507,
--138,
-199,
-419,
-710,
-910,
-1082,
-1144,
-1180,
-1166,
-1090,
-978,
-809,
-614,
-444,
-219,
-4,
--204,
--352,
--515,
--653,
--746,
--776,
--825,
--810,
--804,
--699,
--617,
--494,
--373,
--190,
--34,
-102,
-214,
-357,
-438,
-477,
-469,
-458,
-394,
-225,
-28,
--148,
--353,
--602,
--785,
--934,
--1033,
--1142,
--1203,
--1058,
--874,
--612,
--427,
-838,
-1786,
-1645,
-2459,
-3425,
-3408,
-2808,
-2738,
-2832,
-1691,
-673,
-137,
--499,
--1435,
--2395,
--2637,
--2831,
--3168,
--3261,
--2988,
--2361,
--2064,
--1671,
--864,
--100,
-419,
-790,
-1411,
-1924,
-1941,
-1943,
-2017,
-1964,
-1554,
-1104,
-872,
-496,
--29,
--470,
--717,
--911,
--1231,
--1365,
--1308,
--1196,
--1146,
--992,
--667,
--350,
--150,
-119,
-446,
-714,
-840,
-956,
-1107,
-1132,
-1064,
-940,
-850,
-690,
-445,
-212,
-24,
--154,
--367,
--514,
--588,
--630,
--683,
--664,
--595,
--502,
--438,
--322,
--194,
--88,
--28,
-67,
-160,
-192,
-218,
-246,
-253,
-204,
-150,
-101,
-1,
--96,
--193,
--284,
--376,
--455,
--555,
--575,
--631,
--659,
--679,
--651,
--615,
--644,
--561,
--425,
--228,
--130,
-276,
-1386,
-1613,
-1695,
-2525,
-2972,
-2674,
-2279,
-2336,
-2011,
-997,
-342,
--163,
--758,
--1590,
--2268,
--2448,
--2639,
--2927,
--2968,
--2601,
--2099,
--1895,
--1414,
--663,
--21,
-374,
-827,
-1410,
-1787,
-1850,
-1929,
-2002,
-1916,
-1555,
-1215,
-942,
-563,
-49,
--358,
--646,
--900,
--1218,
--1356,
--1331,
--1269,
--1215,
--1025,
--714,
--425,
--201,
-114,
-419,
-671,
-789,
-948,
-1040,
-1053,
-955,
-865,
-756,
-580,
-352,
-185,
-22,
--143,
--317,
--395,
--475,
--535,
--564,
--500,
--483,
--398,
--319,
--195,
--106,
--11,
-86,
-152,
-199,
-219,
-243,
-221,
-140,
-94,
-32,
--51,
--104,
--140,
--202,
--240,
--263,
--294,
--345,
--390,
--409,
--483,
--545,
--577,
--602,
--626,
--699,
--643,
--557,
--392,
--292,
-114,
-1059,
-1328,
-1501,
-2285,
-2720,
-2562,
-2319,
-2336,
-2078,
-1242,
-591,
-88,
--507,
--1320,
--2026,
--2257,
--2474,
--2759,
--2782,
--2435,
--1979,
--1679,
--1182,
--459,
-126,
-549,
-972,
-1433,
-1694,
-1699,
-1649,
-1588,
-1338,
-953,
-553,
-236,
--157,
--557,
--827,
--994,
--1099,
--1142,
--1070,
--878,
--648,
--389,
--78,
-231,
-532,
-746,
-930,
-1044,
-1084,
-1028,
-909,
-732,
-516,
-277,
-1,
--263,
--479,
--645,
--807,
--871,
--828,
--761,
--639,
--472,
--236,
--29,
-175,
-347,
-507,
-612,
-652,
-641,
-584,
-501,
-346,
-180,
-22,
--131,
--285,
--416,
--501,
--560,
--574,
--595,
--565,
--495,
--437,
--411,
--363,
--258,
--217,
--226,
--211,
--226,
--253,
--363,
--472,
--483,
--424,
--340,
--341,
-552,
-1617,
-1454,
-1874,
-2855,
-3002,
-2514,
-2085,
-2061,
-1390,
-268,
--528,
--1234,
--1750,
--2502,
--3167,
--3146,
--2930,
--2789,
--2584,
--1872,
--901,
--282,
-308,
-1085,
-1794,
-2213,
-2289,
-2307,
-2303,
-1969,
-1401,
-756,
-267,
--269,
--938,
--1423,
--1683,
--1786,
--1828,
--1744,
--1412,
--955,
--474,
--38,
-439,
-953,
-1308,
-1472,
-1559,
-1581,
-1441,
-1132,
-752,
-391,
--3,
--410,
--793,
--1044,
--1157,
--1200,
--1179,
--984,
--695,
--328,
--29,
-350,
-698,
-959,
-1087,
-1108,
-1083,
-927,
-662,
-339,
-41,
--276,
--572,
--826,
--957,
--1012,
--1024,
--912,
--762,
--514,
--289,
--55,
-187,
-332,
-428,
-429,
-397,
-275,
-14,
--231,
--469,
--727,
--1018,
--1174,
--1020,
--786,
--613,
--228,
-1364,
-2799,
-2457,
-2788,
-3873,
-3684,
-2460,
-1383,
-960,
--70,
--1527,
--2538,
--3408,
--3453,
--3426,
--3769,
--3360,
--2146,
--960,
--415,
-314,
-1728,
-2548,
-2696,
-2764,
-2677,
-2528,
-1897,
-899,
--2,
--669,
--1177,
--1992,
--2608,
--2448,
--2195,
--1980,
--1628,
--901,
-1,
-661,
-1183,
-1643,
-2036,
-2295,
-2105,
-1691,
-1346,
-916,
-309,
--359,
--841,
--1115,
--1364,
--1512,
--1455,
--1159,
--790,
--458,
--64,
-400,
-781,
-977,
-1072,
-1176,
-1113,
-902,
-624,
-333,
-67,
--243,
--501,
--741,
--848,
--834,
--819,
--831,
--736,
--485,
--307,
--216,
--73,
-114,
-244,
-355,
-353,
-266,
-237,
-286,
-158,
--288,
--453,
--492,
--814,
--1143,
--1383,
--1324,
--1111,
--815,
--615,
-442,
-3114,
-3953,
-3029,
-3919,
-4941,
-3971,
-1878,
-374,
--455,
--1974,
--3286,
--4552,
--5650,
--4570,
--3342,
--3483,
--2641,
--269,
-1946,
-2478,
-2830,
-4030,
-4214,
-3803,
-2888,
-1228,
-136,
--491,
--1700,
--3203,
--3856,
--3201,
--2821,
--2817,
--1903,
--637,
-581,
-1606,
-2167,
-2553,
-2896,
-3040,
-2593,
-1551,
-807,
-272,
--605,
--1460,
--2042,
--2202,
--2015,
--1775,
--1386,
--876,
--132,
-665,
-1150,
-1393,
-1651,
-1797,
-1694,
-1299,
-803,
-318,
--107,
--513,
--923,
--1298,
--1358,
--1289,
--1153,
--1084,
--838,
--447,
--41,
-243,
-441,
-656,
-958,
-981,
-839,
-682,
-511,
-236,
--52,
--445,
--778,
--1174,
--1308,
--1352,
--1558,
--1649,
--1547,
--1278,
--879,
--382,
-161,
-644,
-3348,
-6104,
-4816,
-3648,
-4808,
-4552,
-2078,
--784,
--2182,
--3265,
--4352,
--4702,
--5791,
--6030,
--3554,
--1612,
--1271,
--443,
-1928,
-3939,
-4107,
-4000,
-4064,
-3257,
-2711,
-1724,
--334,
--2045,
--2530,
--2818,
--3814,
--4286,
--3290,
--2251,
--1389,
--186,
-846,
-1714,
-2703,
-3331,
-3093,
-2464,
-2180,
-1666,
-523,
--508,
--1187,
--1812,
--2159,
--2176,
--2015,
--1810,
--1193,
--271,
-366,
-829,
-1396,
-1903,
-2099,
-1994,
-1626,
-1124,
-566,
-139,
--409,
--1054,
--1436,
--1468,
--1292,
--1136,
--1026,
--684,
--200,
-225,
-501,
-562,
-625,
-732,
-705,
-523,
-230,
--65,
--282,
--465,
--752,
--1154,
--1418,
--1247,
--1238,
--1499,
--1622,
--1520,
--1164,
--695,
--34,
-403,
-1638,
-5931,
-7958,
-5384,
-4240,
-4911,
-3894,
-836,
--2312,
--4068,
--5473,
--5637,
--5363,
--6650,
--6603,
--3512,
--852,
--104,
-663,
-2831,
-4675,
-5137,
-5106,
-4149,
-2660,
-2205,
-1551,
--531,
--2750,
--3254,
--2848,
--3218,
--3660,
--3123,
--2255,
--1075,
-296,
-1020,
-1242,
-1997,
-3202,
-3380,
-2502,
-1924,
-1596,
-954,
-119,
--773,
--1635,
--2079,
--1966,
--1815,
--1949,
--1750,
--932,
--103,
-443,
-899,
-1332,
-1814,
-2147,
-2079,
-1638,
-1083,
-677,
-232,
--448,
--1163,
--1623,
--1755,
--1731,
--1606,
--1448,
--1105,
--692,
--98,
-367,
-706,
-901,
-1041,
-1012,
-803,
-544,
-56,
--557,
--990,
--1031,
--1320,
--1806,
--2086,
--1988,
--1453,
--840,
--107,
-286,
-2824,
-8161,
-9177,
-5513,
-3632,
-3567,
-2327,
--794,
--3932,
--6200,
--7500,
--6227,
--4761,
--5838,
--5877,
--2578,
-1103,
-2615,
-3068,
-4186,
-5094,
-5568,
-5778,
-4142,
-1250,
--132,
--349,
--1662,
--3998,
--5143,
--4834,
--4300,
--3396,
--2216,
--1395,
--256,
-1793,
-3508,
-3851,
-3570,
-3620,
-3451,
-2651,
-1641,
-418,
--868,
--1653,
--1907,
--2339,
--2754,
--2446,
--1671,
--1065,
--478,
-139,
-677,
-1196,
-1665,
-1890,
-1696,
-1486,
-1340,
-988,
-343,
--254,
--685,
--994,
--1246,
--1391,
--1430,
--1328,
--1092,
--793,
--525,
--158,
-205,
-559,
-744,
-829,
-829,
-758,
-439,
-9,
--296,
--447,
--813,
--1334,
--1615,
--1731,
--1694,
--1559,
--1055,
--694,
-360,
-3442,
-5109,
-3607,
-2189,
-2785,
-4015,
-3152,
-868,
--642,
--1512,
--1742,
--1879,
--2998,
--4294,
--4178,
--2538,
--1395,
--1552,
--1371,
--211,
-1144,
-1968,
-2197,
-2053,
-1917,
-2172,
-2349,
-1636,
-410,
--250,
--406,
--763,
--1506,
--2096,
--2271,
--2112,
--1695,
--1288,
--1062,
--671,
-160,
-1038,
-1398,
-1487,
-1588,
-1643,
-1513,
-1173,
-665,
-72,
--358,
--595,
--820,
--1083,
--1209,
--1030,
--748,
--424,
--140,
-137,
-405,
-691,
-869,
-882,
-764,
-636,
-514,
-322,
-62,
--196,
--408,
--528,
--545,
--548,
--555,
--450,
--265,
--90,
-79,
-217,
-343,
-400,
-391,
-378,
-302,
-180,
-41,
--105,
--226,
--375,
--435,
--459,
--428,
--381,
--321,
--222,
--149,
--79,
-24,
-158,
-248,
-183,
-112,
-63,
-27,
--49,
--119,
--233,
--176,
-64,
-185,
--62,
--229,
--261,
--200,
--123,
--85,
-126,
-1087,
-1992,
-1942,
-1470,
-1327,
-1169,
-695,
--37,
--706,
--1358,
--1547,
--1428,
--1460,
--1608,
--1364,
--798,
--192,
-143,
-449,
-713,
-959,
-1160,
-1184,
-857,
-537,
-313,
-121,
--207,
--539,
--789,
--843,
--801,
--670,
--573,
--439,
--208,
-123,
-325,
-448,
-530,
-617,
-602,
-526,
-364,
-173,
--17,
--133,
--269,
--377,
--447,
--423,
--353,
--257,
--159,
--41,
-67,
-202,
-275,
-321,
-314,
-294,
-244,
-180,
-84,
--28,
--95,
--131,
--186,
--185,
--179,
--147,
--95,
--25,
-31,
-51,
-111,
-150,
-135,
-146,
-122,
-78,
-61,
-43,
--4,
--43,
--51,
--74,
--81,
--66,
--69,
--64,
--40,
--19,
--7,
-4,
-16,
-29,
-27,
-30,
-28,
-8,
-6,
-6,
--7,
-0,
-12,
-6,
--13,
--22,
--26,
--42,
--54,
--51,
--62,
--59,
--32,
--21,
--21,
--11,
-4,
-12,
-7,
-3,
--21,
--56,
--46,
--42,
--68,
--89,
--95,
--84,
--68,
--46,
--32,
--22,
-67,
-214,
-276,
-221,
-144,
-119,
-94,
-30,
--43,
--81,
--46,
-51,
-136,
-177,
-210,
-244,
-262,
-213,
-106,
--21,
--133,
--221,
--299,
--373,
--413,
--380,
--299,
--201,
--98,
-23,
-134,
-230,
-301,
-309,
-268,
-224,
-184,
-103,
--21,
--121,
--166,
--189,
--204,
--211,
--207,
--174,
--96,
--10,
-44,
-72,
-99,
-126,
-137,
-126,
-96,
-48,
-17,
--6,
--40,
--68,
--83,
--75,
--69,
--73,
--58,
--29,
--1,
-14,
-24,
-41,
-47,
-41,
-39,
-38,
-37,
-23,
-0,
--10,
--6,
--1,
--1,
--4,
--3,
--1,
-5,
-7,
-7,
-15,
-11,
--1,
--3,
-6,
--6,
--8,
-0,
--6,
--5,
-6,
-17,
--1,
--7,
-5,
-4,
--3,
--6,
--10,
--26,
--43,
--37,
--28,
--21,
--18,
--28,
--29,
--15,
--3,
--2,
--17,
--22,
--13,
--31,
--36,
--27,
--33,
--57,
--43,
--15,
-5,
-20,
-60,
-107,
-165,
-197,
-199,
-172,
-144,
-102,
-51,
--28,
--94,
--131,
--139,
--157,
--158,
--149,
--117,
--87,
--39,
--7,
-22,
-43,
-67,
-67,
-56,
-40,
-44,
-25,
-13,
--12,
--28,
--31,
--23,
--25,
--18,
--12,
--8,
--6,
-14,
-12,
-6,
-19,
-35,
-25,
-16,
-5,
-0,
-9,
-7,
-2,
-16,
-18,
-3,
--4,
-8,
-18,
-3,
-9,
-5,
-10,
--3,
--10,
--12,
--10,
--13,
--19,
--29,
--10,
--17,
--18,
--24,
--27,
--27,
--10,
--24,
--29,
--43,
--35,
--39,
--31,
--33,
--21,
--30,
--8,
-21,
-53,
-65,
-103,
-117,
-128,
-120,
-119,
-68,
-36,
-2,
--23,
--55,
--71,
--94,
--88,
--81,
--67,
--63,
--48,
--34,
--8,
-6,
-11,
-10,
-30,
-25,
-15,
-27,
-26,
-15,
--1,
-0,
-3,
--6,
--5,
-9,
-3,
-7,
-4,
-8,
--2,
-9,
-12,
-27,
-13,
-6,
--2,
-6,
--17,
-5,
--4,
-0,
--9,
-4,
--16,
--16,
--26,
--10,
--36,
--18,
--30,
--26,
--33,
--19,
--50,
--38,
--43,
--25,
--16,
-24,
-27,
-71,
-92,
-108,
-94,
-97,
-64,
-52,
-16,
--6,
--33,
--36,
--57,
--57,
--68,
--43,
--43,
--37,
--46,
--20,
--10,
-3,
--7,
-10,
-10,
-11,
-13,
-12,
--1,
-19,
-3,
-4,
-12,
-20,
-12,
-10,
-15,
-14,
--2,
-15,
-19,
-5,
-2,
-2,
-1,
--5,
--16,
--1,
--8,
--16,
--8,
--13,
--29,
--24,
--27,
--28,
--28,
--37,
--30,
--24,
--8,
-26,
-58,
-75,
-81,
-73,
-59,
-51,
-30,
-6,
-3,
--5,
--24,
--22,
--15,
--23,
--34,
--38,
--30,
--21,
--10,
--8,
--4,
-0,
-4,
--12,
--15,
--6,
--9,
-13,
-22,
-18,
-28,
-30,
-15,
-10,
-5,
-6,
--13,
--36,
--34,
--42,
--47,
--25,
--14,
--21,
--17,
-22,
-26,
--5,
-4,
-2,
--24,
--32,
--4,
-5,
-11,
-25,
-7,
-6,
-15,
-23,
-26,
-6,
-11,
-43,
-21,
-8,
-39,
-4,
-21,
-40,
-22,
-60,
-75,
-83,
-122,
-95,
-73,
-26,
--23,
--27,
--92,
--119,
--104,
--92,
--41,
--4,
--4,
--6,
-6,
-15,
-38,
-34,
-23,
-31,
-14,
-9,
--15,
--37,
--33,
--83,
--120,
--100,
--81,
--97,
--64,
--11,
-8,
-10,
-41,
-15,
-46,
-174,
-106,
-55,
-99,
-1,
--18,
--30,
--61,
--61,
--67,
--39,
--33,
--12,
-13,
--1,
-5,
-19,
-3,
-9,
--1,
--5,
--25,
--26,
--15,
--37,
--14,
--3,
--10,
-5,
-15,
-22,
-26,
-39,
-40,
-33,
-37,
-30,
-18,
-22,
-7,
-7,
-0,
--5,
--6,
--15,
--11,
--19,
--17,
--21,
--23,
--27,
--27,
--30,
--35,
--27,
--49,
--45,
--64,
--56,
--74,
--28,
--13,
-15,
-429,
-417,
-80,
-188,
-29,
--101,
--111,
--167,
--162,
--171,
--56,
--91,
--72,
-42,
--18,
-15,
-45,
-11,
-31,
-1,
-23,
--7,
--5,
-21,
--21,
-28,
-12,
-5,
-28,
-7,
-26,
-7,
-15,
-25,
-5,
-25,
-10,
-10,
-22,
--9,
-10,
--17,
--5,
--16,
--17,
--9,
--8,
--21,
--11,
--39,
--23,
--46,
--30,
--46,
--26,
--51,
--67,
--76,
--90,
--80,
--63,
-39,
--30,
-635,
-818,
-46,
-147,
--11,
--278,
--216,
--248,
--194,
--242,
--6,
--63,
--100,
-131,
--11,
-44,
-91,
-17,
--18,
--58,
--5,
--49,
-21,
--33,
-34,
-160,
-61,
-42,
-32,
--2,
--113,
--120,
--192,
--75,
-174,
--143,
--100,
--10,
-1,
-79,
-135,
-266,
--1,
-116,
-120,
--89,
-154,
--22,
-10,
--58,
--38,
--202,
--307,
-432,
-240,
--80,
-320,
--182,
--285,
--252,
--618,
--269,
--89,
-401,
-459,
-347,
-472,
-26,
--18,
--47,
--376,
--223,
--199,
--46,
--93,
-22,
-219,
-196,
-46,
--326,
--160,
-115,
--210,
-144,
-129,
--141,
--8,
-140,
-433,
--12,
--87,
-20,
--10,
-30,
--307,
--261,
--690,
--238,
-822,
-469,
-415,
-320,
--6,
-185,
--219,
--145,
--246,
--420,
--115,
--157,
--84,
--87,
-221,
-0,
--23,
-530,
-4,
--15,
-89,
-9,
--58,
--197,
--96,
--421,
--165,
--13,
--452,
-55,
-171,
-130,
-110,
-311,
-464,
--39,
-43,
-10,
--65,
-28,
--164,
-62,
--60,
--209,
--362,
--272,
-244,
--103,
-209,
-819,
-167,
-68,
--34,
--230,
--100,
--10,
-105,
-170,
-423,
-632,
-119,
--199,
-42,
--178,
--85,
--74,
--344,
--439,
--339,
--216,
-311,
-678,
-582,
-435,
--158,
--175,
-73,
--80,
--464,
--815,
--203,
--323,
--664,
--21,
-26,
-433,
-441,
-246,
-333,
-142,
-171,
--387,
--263,
-148,
-23,
-149,
--126,
-30,
-51,
-117,
-188,
--539,
-29,
-205,
--123,
-155,
-131,
-104,
-19,
-145,
--289,
--431,
-0,
--420,
--218,
-56,
-91,
-195,
--103,
-87,
--3,
-343,
-207,
--281,
-35,
--148,
-138,
-93,
--334,
-63,
-36,
-78,
--302,
--526,
--427,
--660,
--238,
--298,
-21,
-790,
-448,
-472,
-757,
-856,
-389,
--389,
-69,
-103,
--63,
--13,
--557,
--170,
-125,
--4,
--352,
--410,
-315,
--48,
--97,
--124,
--527,
-246,
-647,
-71,
--235,
--228,
--451,
--306,
-363,
-382,
--74,
-108,
-28,
--341,
-37,
-162,
--66,
-183,
-454,
-227,
-187,
-517,
-471,
--139,
--228,
-63,
--170,
--150,
-244,
--64,
--456,
--54,
-461,
-195,
--309,
--326,
--89,
-49,
-50,
--323,
--210,
-435,
-988,
-820,
-218,
--165,
--192,
--175,
--579,
--567,
--365,
--146,
-141,
--662,
--1223,
--704,
-227,
-269,
--448,
-337,
-931,
-673,
-437,
--205,
--176,
--156,
--299,
--386,
--496,
-142,
-116,
--154,
--355,
--491,
-17,
--203,
--499,
--298,
-546,
-1489,
-516,
--241,
-67,
-90,
--223,
--616,
--622,
--157,
-616,
-1075,
-610,
-288,
-676,
-659,
-150,
--342,
--244,
--86,
--320,
--220,
--278,
--543,
--80,
-488,
-247,
--54,
--153,
--207,
--283,
--198,
--170,
--266,
-60,
-153,
--215,
--72,
-120,
-76,
-56,
--87,
-22,
-64,
-141,
-73,
--37,
-277,
-136,
--169,
--203,
--127,
--17,
--145,
--140,
--241,
--175,
-15,
--195,
--212,
--100,
--52,
--12,
--178,
--183,
--149,
--57,
--117,
--392,
--91,
-48,
--216,
--271,
--469,
--397,
--181,
-516,
-777,
-1001,
-3479,
-4115,
-1347,
--222,
--177,
--240,
--1385,
--1635,
--1006,
--1541,
--520,
-485,
--557,
--748,
--38,
-644,
-246,
--252,
-468,
-74,
--220,
-342,
--5,
--595,
--393,
-152,
-8,
--347,
-106,
--23,
--344,
-218,
-493,
-39,
--291,
-56,
-296,
--170,
--123,
--127,
--256,
-22,
-115,
--152,
--373,
-40,
-424,
-4,
--81,
-71,
-149,
-196,
-108,
--52,
--140,
-178,
-398,
-119,
--134,
--9,
-219,
-92,
-44,
--49,
-5,
-156,
-240,
-44,
--224,
--7,
-198,
-46,
--57,
--75,
-82,
-53,
-94,
--147,
--214,
-10,
-142,
--60,
--192,
--55,
-4,
-13,
--20,
--153,
--107,
--17,
--1,
--264,
--153,
-125,
-109,
--43,
--215,
--368,
--192,
--77,
--270,
--476,
--241,
-3,
--343,
--672,
--840,
--735,
--154,
-520,
--118,
-638,
-5110,
-5318,
-313,
--1333,
--315,
--312,
--1728,
--2948,
--3283,
--1999,
-2484,
-2536,
--2013,
--1675,
-2109,
-2863,
-441,
--940,
--163,
-507,
-1163,
-406,
--2538,
--2285,
-789,
-1005,
--1405,
--2044,
-21,
-1110,
-607,
-143,
--524,
--70,
-1636,
-1329,
--636,
--1084,
-522,
-978,
--127,
--706,
--462,
--31,
-667,
-392,
--639,
--636,
-527,
-949,
-183,
--322,
--7,
-503,
-716,
-348,
--298,
--269,
-355,
-505,
--116,
--541,
--312,
-179,
-305,
--33,
--464,
--280,
-277,
-425,
--204,
--549,
--279,
-129,
-80,
--348,
--630,
--332,
-214,
-54,
--792,
--987,
--88,
--51,
--616,
--1227,
--1268,
--659,
--335,
--81,
--718,
-4376,
-11477,
-5778,
--1970,
--272,
-1642,
--973,
--5351,
--7281,
--6891,
--2672,
-3193,
--7,
--4939,
-911,
-7202,
-4919,
-629,
-214,
-1744,
-2296,
-1588,
--2183,
--6087,
--2879,
-1197,
--1255,
--4385,
--1998,
-1583,
-2244,
-1509,
-876,
-599,
-2229,
-3512,
-715,
--1625,
--209,
-943,
--848,
--2156,
--1329,
--394,
-36,
-502,
-56,
--46,
-1476,
-2086,
-549,
--412,
-521,
-1004,
--234,
--1188,
--1288,
--1050,
--434,
--346,
--644,
--305,
-722,
-1109,
-337,
--280,
--52,
-5,
-78,
--1079,
--2736,
--2774,
--1980,
--1476,
--1451,
--969,
-245,
-1501,
-10820,
-16134,
-3358,
--4437,
-1229,
-2611,
--3693,
--10270,
--10079,
--5371,
--873,
-1188,
--4267,
--5509,
-6273,
-12488,
-6174,
-732,
-1904,
-4303,
-3430,
--849,
--7991,
--10784,
--3524,
-1056,
--4652,
--7465
-};
diff --git a/misc/mksine.c b/unittest/mksine.c
index fb5f822..fb5f822 100644
--- a/misc/mksine.c
+++ b/unittest/mksine.c
diff --git a/unittest/ofdm_fade_dpsk.sh b/unittest/ofdm_fade_dpsk.sh
deleted file mode 100755
index 18e38bb..0000000
--- a/unittest/ofdm_fade_dpsk.sh
+++ /dev/null
@@ -1,15 +0,0 @@
-#!/usr/bin/env bash
-#
-# David Sep 2019
-# Tests 2020 OFDM modem fading channel performance in DPSK mode, using a simulated faster (2Hz) high SNR fading channel
-
-fading_dir=$1
-results=$(mktemp)
-
-# Coded BER should be < 1% for this test
-ofdm_mod --in /dev/zero --testframes 300 --mode 2020 --ldpc --verbose 1 --dpsk | \
-ch - - --No -40 -f 10 --ssbfilt 1 --mpd --fading_dir $fading_dir --multipath_delay 2 | \
-ofdm_demod --out /dev/null --testframes --mode 2020 --verbose 1 --ldpc --dpsk 2> $results
-cat $results
-cber=$(cat $results | sed -n "s/^Coded BER.* \([0-9..]*\) Tbits.*/\1/p")
-python3 -c "import sys; sys.exit(0) if $cber<=0.05 else sys.exit(1)"
diff --git a/unittest/ofdm_mem.c b/unittest/ofdm_mem.c
deleted file mode 100644
index c87f067..0000000
--- a/unittest/ofdm_mem.c
+++ /dev/null
@@ -1,107 +0,0 @@
-/*---------------------------------------------------------------------------*\
-
- FILE........: ofdm_mem.c
- AUTHOR......: Don Reid
- DATE CREATED: 11 June 2018
-
- Prints out the memory used by the OFDM modem states. Used to optimise
- memory use for the STM32F4 port.
-
-\*---------------------------------------------------------------------------*/
-
-/*
- Copyright (C) 2018 Don Reid
-
- All rights reserved.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License version 2.1, as
- published by the Free Software Foundation. This program is
- distributed in the hope that it will be useful, but WITHOUT ANY
- WARRANTY; without even the implied warranty of MERCHANTABILITY or
- FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
- License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <assert.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <math.h>
-#include <complex.h>
-
-#include "codec2_ofdm.h"
-#include "ofdm_internal.h"
-
-int main()
-{
- struct OFDM_CONFIG *ofdm_config;
- struct OFDM *ofdm;
-
- ofdm = ofdm_create(NULL);
- assert(ofdm != NULL);
-
- /* Get a copy of the actual modem config */
- ofdm_config = ofdm_get_config_param(ofdm);
-
- int ofdm_m = (int) (ofdm_config->fs / ofdm_config->rs); /* 144 */
- int ofdm_ncp = (int) (ofdm_config->tcp * ofdm_config->fs); /* 16 */
- int ofdm_bitsperframe = (ofdm_config->ns - 1) * (ofdm_config->nc * ofdm_config->bps);
- int ofdm_rowsperframe = ofdm_bitsperframe / (ofdm_config->nc * ofdm_config->bps);
- int ofdm_samplesperframe = ofdm_config->ns * (ofdm_m + ofdm_ncp);
- int ofdm_rxbuf = 3 * ofdm_samplesperframe + 3 * (ofdm_m + ofdm_ncp);
- int ofdm_nuwbits = (ofdm_config->ns - 1) * ofdm_config->bps - ofdm_config->txtbits;
-
- int used = 0;
-
- printf("struct OFDM.................: %zd\n", sizeof(struct OFDM));
- printf("config......................: %zd\n", sizeof(struct OFDM_CONFIG));
- used += sizeof(struct OFDM_CONFIG);
- printf("pilot_samples...............: %zd\n", sizeof (complex float) * (ofdm_m + ofdm_ncp));
- used += sizeof (complex float) * (ofdm_m + ofdm_ncp);
- printf("rxbuf.......................: %zd\n", sizeof (complex float) * ofdm_rxbuf);
- used += sizeof (complex float) * ofdm_rxbuf;
- printf("pilots......................: %zd\n", sizeof (complex float) * (ofdm_config->nc + 2));
- used += sizeof (complex float) * (ofdm_config->nc + 2);
-
- size_t rxsym_size = sizeof (complex float) * (ofdm_config->ns + 3) * (ofdm_config->nc + 2);
-
- printf("rx_sym......................: %zd\n", rxsym_size);
- used += rxsym_size;
- printf("rx_np.......................: %zd\n", sizeof (complex float) * (ofdm_rowsperframe * ofdm_config->nc));
- used += sizeof (complex float) * (ofdm_rowsperframe * ofdm_config->nc);
- printf("rx_amp......................: %zd\n", sizeof (float) * (ofdm_rowsperframe * ofdm_config->nc));
- used += sizeof (float) * (ofdm_rowsperframe * ofdm_config->nc);
- printf("aphase_est_pilot_log........: %zd\n", sizeof (float) * (ofdm_rowsperframe * ofdm_config->nc));
- used += sizeof (float) * (ofdm_rowsperframe * ofdm_config->nc);
- printf("tx_uw.......................: %zd\n", sizeof (int) * ofdm_nuwbits);
- used += sizeof (int) * ofdm_nuwbits;
- printf("sync_state..................: %zd\n", sizeof (State));
- used += sizeof (State);
- printf("last_sync_state.............: %zd\n", sizeof (State));
- used += sizeof (State);
- printf("sync_state_interleaver......: %zd\n", sizeof (State));
- used += sizeof (State);
- printf("last_sync_state_interleaver.: %zd\n", sizeof (State));
- used += sizeof (State);
-
- // add in non-array sizes
- int single = 0;
- single += 8 * sizeof(int);
- single += 13 * sizeof(float);
- single += 1 * sizeof(complex float);
- single += 1 * sizeof(float *);
- single += 4 * sizeof(bool);
- printf("single values...............: %d\n", single);
- used += single;
-
- printf("Total used .................: %zd\n", (size_t) used);
-
- ofdm_destroy(ofdm);
-
- return 0;
-}
-
diff --git a/unittest/ofdm_stack.c b/unittest/ofdm_stack.c
deleted file mode 100644
index aef6f42..0000000
--- a/unittest/ofdm_stack.c
+++ /dev/null
@@ -1,229 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <complex.h>
-#include <unistd.h>
-#include <assert.h>
-
-#include "comp.h"
-#include "ofdm_internal.h"
-#include "codec2_ofdm.h"
-#include "test_bits_ofdm.h" /* payload_data_bits */
-#include "mpdecode_core.h"
-
-#define MAX_ERRORS 32
-
-static int ofdm_bitsperframe;
-static int ofdm_rowsperframe;
-static int ofdm_nuwbits;
-static int ofdm_ntxtbits;
-static int ofdm_rx_offset;
-static int ofdm_data_bitsperframe;
-static int ofdm_samplesperframe;
-static int ofdm_max_samplesperframe;
-static int ofdm_rxbuf;
-static int ofdm_m;
-static int ofdm_ncp;
-
-// Forwards
-void run_modem(struct OFDM *ofdm, int tx_bits[], int rx_bits[], COMP tx_rx[]);
-void dummy_code();
-
-/////////////////////////////////////////////////////////////
-/// MAIN()
-int main(int argc, char *argv[]) {
- // Options
- int f, i, opt;
- int dummy = 0; // flag to use dummy code
- int frames = 1; // how many frames
- int print = 0; // flag to print all bits
- struct OFDM *ofdm;
- struct OFDM_CONFIG *ofdm_config;
-
- ofdm = ofdm_create(NULL);
- assert(ofdm != NULL);
-
- /* Get a copy of the actual modem config */
-
- ofdm_config = ofdm_get_config_param(ofdm);
-
- ofdm_m = (int) (ofdm_config->fs / ofdm_config->rs);
- ofdm_ncp = (int) (ofdm_config->tcp * ofdm_config->fs);
- ofdm_bitsperframe = ofdm_get_bits_per_frame(ofdm);
- ofdm_rowsperframe = ofdm_bitsperframe / (ofdm_config->nc * ofdm_config->bps);
- ofdm_samplesperframe = ofdm_get_samples_per_frame(ofdm);
- ofdm_max_samplesperframe = ofdm_get_max_samples_per_frame(ofdm);
- ofdm_rxbuf = 3 * ofdm_samplesperframe + 3 * (ofdm_m + ofdm_ncp);
- ofdm_nuwbits = (ofdm_config->ns - 1) * ofdm_config->bps - ofdm_config->txtbits;
- ofdm_ntxtbits = ofdm_config->txtbits;
- ofdm_rx_offset = (ofdm_nuwbits + ofdm_ntxtbits);
- ofdm_data_bitsperframe = (ofdm_bitsperframe - ofdm_rx_offset);
-
- int tx_bits[ofdm_data_bitsperframe];
- int rx_bits[ofdm_data_bitsperframe];
- COMP tx_rx[ofdm_samplesperframe];
-
- while ((opt = getopt(argc, argv, "df:p")) != -1) {
- switch (opt) {
- case 'd':
- dummy = 1;
- break;
- case 'f':
- frames = atoi(optarg);
- break;
- case 'p':
- print = 1;
- break;
- default:
- fprintf(stderr, "Usage: %s [-e] [-f <frames>] [-p]\n", argv[0]);
- }
- }
-
- for (f = 0; f < frames; f++) {
- ////////
- // Prep inputs
-
- for(i=0; i<ofdm_data_bitsperframe; i++) {
- tx_bits[i] = payload_data_bits[(i % (sizeof(payload_data_bits)/sizeof(payload_data_bits[0])))];
- }
-
- ////////
- // Modem (or dummy)
-
- if (dummy) {
- dummy_code(tx_bits, rx_bits);
- } else {
- run_modem(ofdm, tx_bits, rx_bits, tx_rx);
- }
-
- ////////
- // Compare results (or print)
- int errors = 0;
-
- if (print) {
- for(i=0; i<ofdm_data_bitsperframe; i++) {
- fprintf(stderr, "bit %3d: tx = %1d, rx = %1d",
- i, tx_bits[i], rx_bits[i + ofdm_rx_offset]);
-
- if (tx_bits[i] != rx_bits[i + ofdm_rx_offset]) {
- fprintf(stderr, " Error");
- errors ++;
- }
-
- fprintf(stderr, "\n");
- }
- } else {
- for(i=0; i<ofdm_data_bitsperframe; i++) {
- if (tx_bits[i] != rx_bits[i + ofdm_rx_offset]) {
- if (errors < MAX_ERRORS) {
- fprintf(stderr, "Error in bit %3d: tx = %1d, rx = %1d\n",
- i, tx_bits[i], rx_bits[i + ofdm_rx_offset]);
- }
-
- errors++;
- }
- }
- }
-
- fprintf(stderr, "%d Errors\n", errors);
-
- } // for (f<frames
-
- ofdm_destroy(ofdm);
-
-} // end main()
-
-
-//////////////////////////////////
-void run_modem(struct OFDM *ofdm, int tx_bits[], int rx_bits[], COMP tx_rx[]) {
- int mod_bits[ofdm_samplesperframe];
- int i, j;
-
- ///////////
- // Mod
- ///////////
-
- for(i=0; i<ofdm_nuwbits; i++) {
- mod_bits[i] = ofdm->tx_uw[i];
- }
-
- for(i=ofdm_nuwbits; i<ofdm_nuwbits+ofdm_ntxtbits; i++) {
- mod_bits[i] = 0;
- }
-
- for(j=0, i=ofdm_nuwbits+ofdm_ntxtbits; j<ofdm_data_bitsperframe; i++,j++) {
- mod_bits[i] = tx_bits[j];
- }
-
- for(j=0; j<ofdm_data_bitsperframe; i++,j++) {
- mod_bits[i] = tx_bits[j];
- }
-
- ofdm_mod(ofdm, tx_rx, mod_bits);
-
- ///////////
- // DeMod
- ///////////
-
- int Nsam = ofdm_samplesperframe;
- int prx = 0;
- int nin = ofdm_samplesperframe + 2 * (ofdm_m + ofdm_ncp);
-
- int lnew;
- COMP rxbuf_in[ofdm_max_samplesperframe];
-
- for (i=0; i<ofdm_samplesperframe ; i++,prx++) {
- ofdm->rxbuf[ofdm_rxbuf-nin+i] = tx_rx[prx].real + tx_rx[prx].imag * I;
- }
-
- for (i=ofdm_samplesperframe ; i<nin; i++) {
- ofdm->rxbuf[ofdm_rxbuf-nin+i] = 0.0 + 0.0 * I;
- }
-
- /* disable estimators for initial testing */
- ofdm_set_verbose(ofdm, false);
- ofdm_set_timing_enable(ofdm, true);
- ofdm_set_foff_est_enable(ofdm, true);
- ofdm_set_phase_est_enable(ofdm, true);
-
- ofdm->mean_amp = 1.0;
-
- nin = ofdm_get_nin(ofdm);
-
- /* Insert samples at end of buffer, set to zero if no samples
- available to disable phase estimation on future pilots on
- last frame of simulation. */
-
- if ((Nsam-prx) < nin) {
- lnew = Nsam-prx;
- } else {
- lnew = nin;
- }
- for(i=0; i<nin; i++) {
- rxbuf_in[i].real = 0.0;
- rxbuf_in[i].imag = 0.0;
- }
-
- if (lnew) {
- for(i=0; i<lnew; i++, prx++) {
- rxbuf_in[i] = tx_rx[prx];
- }
- }
-
- ofdm_demod(ofdm, rx_bits, rxbuf_in);
-
-
-} // end run_modem()
-
-
-//////////////////////////////////
-void dummy_code(int tx_bits[], int rx_bits[]) {
- int i;
-
- for(i=0; i<ofdm_data_bitsperframe; i++) {
- rx_bits[i] = tx_bits[i];
- }
-
-} // end dummy_code()
-
-/* vi:set ts=4 sts=4 et: */
diff --git a/unittest/ota_auto.sh b/unittest/ota_auto.sh
deleted file mode 100755
index b6355ba..0000000
--- a/unittest/ota_auto.sh
+++ /dev/null
@@ -1,15 +0,0 @@
-#!/usr/bin/env bash
-# ota_auto.sh
-#
-# Run a single automated test and log results
-
-timestamp=$(date +"%F-%T")
-mkdir -p $timestamp
-start_dir=$(pwd)
-cd $timestamp
-../ota_test.sh "$@" >> log.txt 2>&1
-cd $start_dir
-kiwi_sdr=$(head -n 1 ${timestamp}/log.txt)
-mode=$(head -n 2 ${timestamp}/log.txt | tail -n 1)
-result=$(awk '/FrmGd/{getline; print}' ${timestamp}/log.txt)
-printf "%s %-25s %s %s\n" $timestamp $kiwi_sdr $mode "$result" >> log.txt
diff --git a/unittest/ota_last.sh b/unittest/ota_last.sh
deleted file mode 100755
index 31efa1c..0000000
--- a/unittest/ota_last.sh
+++ /dev/null
@@ -1,70 +0,0 @@
-#!/usr/bin/env bash
-#
-# Present summary info from the n-th latest OTA HF data test
-
-function print_help {
- echo
- echo "Summary of last automated Over The Air (OTA) test"
- echo
- echo " usage ./ota_last.sh [options]"
- echo
- echo " -a show scatter diagram"
- echo " -p play the received wave file"
- echo " -n N select N-th from last file"
- echo " -s display spectrogram"
-}
-
-show_spec=0
-show_scatter=0
-play_file=0
-N=1
-
-while [[ $# -gt 0 ]]
-do
-key="$1"
-case $key in
- -n)
- N="$2"
- shift
- shift
- ;;
- -a)
- show_scatter=1
- shift
- ;;
- -s)
- show_spec=1
- shift
- ;;
- -p)
- play_file=1
- shift
- ;;
- -h)
- print_help
- ;;
-esac
-done
-
-# cat the log from the selected test
-directory=$(ls -td 2021* | head -n ${N} | tail -n 1)
-echo ${directory}
-cat ${directory}/log.txt
-
-# optionally show a few plots
-
-if [ $show_spec -eq 1 ]; then
- if [ -f ${directory}/spec.png ]; then
- eog ${directory}/spec.png
- else
- eog ${directory}/spec.jpg
- fi
-fi
-
-if [ $show_scatter -eq 1 ]; then
- eog ${directory}/scatter.png
-fi
-
-if [ $play_file -eq 1 ]; then
- play ${directory}/rx.wav
-fi
diff --git a/unittest/ota_summary.sh b/unittest/ota_summary.sh
deleted file mode 100755
index 5e028e3..0000000
--- a/unittest/ota_summary.sh
+++ /dev/null
@@ -1,55 +0,0 @@
-#!/usr/bin/env bash
-#
-# Summarise tests to date
-
-CODEC2=${HOME}/codec2
-
-function print_help {
- echo
- echo "Automated Over The Air (OTA) data test for FreeDV OFDM HF data modems"
- echo
- echo " usage ./ota_summary.sh [-t]"
- echo
- echo " -t create/update thumbnail directory"
- exit 0
-}
-
-thumbnails=0
-while [[ $# -gt 0 ]]
-do
-key="$1"
-case $key in
- -t)
- thumbnails=1
- shift
- ;;
- -h)
- print_help
- ;;
-esac
-done
-
-total_bytes=$(cat log.txt | tr -s ' ' | cut -f6 -d' ' | awk '$0==($0+0)' | paste -sd+ | bc)
-printf "total bytes: %'d\n" ${total_bytes}
-
-# collect SNR averages from log.txt and generate a histogram
-ota_snrs=mktemp
-cat log.txt | tr -s ' ' | cut -f7 -d' ' | awk '$0==($0+0)'| sed '/-nan/d' > ${ota_snrs}
-echo "warning('off', 'all'); \
- snr=load('${ota_snrs}'); \
- hist(snr); \
- print('snr_hist.png','-dpng'); \
- quit" | octave-cli -qf > /dev/null
-
-# option to put small versions of spec/scatter in one dir
-
-if [ $thumbnails -ne 0 ]; then
- mkdir -p thumbnails
- spec_files=$(find . -name spec.jpg -o -name spec.png)
- for f in $spec_files
- do
- d=$(echo $f | sed -r 's/\.(.*)\//\1_/')
- echo $f thumbnails${d}
- cp $f thumbnails${d}
- done
-fi
diff --git a/unittest/ota_test.sh b/unittest/ota_test.sh
deleted file mode 100755
index 37b6ac0..0000000
--- a/unittest/ota_test.sh
+++ /dev/null
@@ -1,161 +0,0 @@
-#!/usr/bin/env bash
-# ota_test.sh
-#
-# Automated Over The Air (OTA) data test for FreeDV OFDM HF data modems
-#
-# 1. Build codec2
-# 2. Install kiwclient:
-# cd ~ && git clone [email protected]:jks-prv/kiwiclient.git
-# 3. Install Hamlib cli tools
-
-PATH=${PATH}:${HOME}/codec2/build_linux/src:${HOME}/kiwiclient
-CODEC2=${HOME}/codec2
-
-kiwi_url=""
-port=8073
-freq_kHz="7177"
-tx_only=0
-Nbursts=5
-mode="datac0"
-model=361
-
-function print_help {
- echo
- echo "Automated Over The Air (OTA) data test for FreeDV OFDM HF data modems"
- echo
- echo " usage ./ota_test.sh [-d] [-f freq_kHz] [-t] [-n Nbursts] [-o model] [-p port] kiwi_url"
- echo
- echo " -d debug mode; trace script execution"
- echo " -o model select radio model number ('rigctl -l' to list)"
- echo " -m mode datac0|datac1|datac3"
- echo " -t Tx only, useful for manually observing SDRs which block multiple sessions from one IP"
- echo
- exit
-}
-
-function run_rigctl {
- command=$1
- model=$2
- echo $command | rigctl -m $model -r /dev/ttyUSB0 > /dev/null
- if [ $? -ne 0 ]; then
- echo "Can't talk to Tx"
- exit 1
- fi
-}
-
-POSITIONAL=()
-while [[ $# -gt 0 ]]
-do
-key="$1"
-case $key in
- -d)
- set -x
- shift
- ;;
- -f)
- freq_kHz="$2"
- shift
- shift
- ;;
- -o)
- model="$2"
- shift
- shift
- ;;
- -m)
- mode="$2"
- shift
- shift
- ;;
- -n)
- Nbursts="$2"
- shift
- shift
- ;;
- -p)
- port="$2"
- shift
- shift
- ;;
- -t)
- tx_only=1
- shift
- ;;
- -h)
- print_help
- ;;
- *)
- POSITIONAL+=("$1") # save it in an array for later
- shift
- ;;
-esac
-done
-set -- "${POSITIONAL[@]}" # restore positional parameters
-
-if [ $tx_only -eq 0 ]; then
- if [ $# -lt 1 ]; then
- print_help
- fi
- kiwi_url="$1"
- echo $kiwi_url
-fi
-
-# create test Tx file
-echo $mode
-freedv_data_raw_tx -q --framesperburst 1 --bursts ${Nbursts} --testframes ${Nbursts} ${mode} /dev/zero test_datac0.raw
-
-usb_lsb=$(python3 -c "print('usb') if ${freq_kHz} >= 10000 else print('lsb')")
-
-if [ $tx_only -eq 0 ]; then
- echo -n "waiting for KiwiSDR "
- # start recording from remote kiwisdr
- kiwi_stdout=$(mktemp)
- kiwirecorder.py -s $kiwi_url -p ${port} -f $freq_kHz -m ${usb_lsb} -r 8000 --filename=rx --time-limit=300 >$kiwi_stdout &
- kiwi_pid=$!
-
- # wait for kiwi to start recording
- timeout_counter=0
- until grep -q -i 'Block: ' $kiwi_stdout
- do
- timeout_counter=$((timeout_counter+1))
- if [ $timeout_counter -eq 10 ]; then
- echo "can't connect to ${kiwi_url}"
- exit 1
- fi
- echo -n "."
- sleep 1
- done
- echo
-fi
-
-# transmit using local SSB radio
-echo "Tx data signal"
-freq_Hz=$((freq_kHz*1000))
-usb_lsb_upper=$(echo ${usb_lsb} | awk '{print toupper($0)}')
-run_rigctl "\\set_mode PKT${usb_lsb_upper} 0" $model
-run_rigctl "\\set_freq ${freq_Hz}" $model
-run_rigctl "\\set_ptt 1" $model
-aplay --device="plughw:CARD=CODEC,DEV=0" -f S16_LE test_datac0.raw 2>/dev/null
-run_rigctl "\\set_ptt 0" $model
-
-if [ $tx_only -eq 0 ]; then
- sleep 2
- echo "Stopping KiwiSDR"
- kill ${kiwi_pid}
- wait ${kiwi_pid} 2>/dev/null
-
- echo "Process receiver sample"
- # generate spectrogram
- echo "pkg load signal; warning('off', 'all'); \
- s=load_raw('rx.wav'); \
- plot_specgram(s, 8000, 500, 2500); print('spec.jpg', '-djpg'); \
- quit" | octave-cli -p ${CODEC2}/octave -qf > /dev/null
- # attempt to demodulate
- freedv_data_raw_rx -q --framesperburst 1 --testframes ${mode} -v --scatter scatter.txt --singleline rx.wav /dev/null
- # render scatter plot (if we get any frames)
- scatter_sz=$(ls -l scatter.txt | cut -f 5 -d' ')
- if [ $scatter_sz -ne 0 ]; then
- echo "pkg load signal; warning('off', 'all'); pl_scatter('scatter.txt'); quit" | octave-cli -p ${CODEC2}/octave -qf > /dev/null
- fi
-fi
-
diff --git a/unittest/ota_voice_auto.sh b/unittest/ota_voice_auto.sh
deleted file mode 100755
index c741f2d..0000000
--- a/unittest/ota_voice_auto.sh
+++ /dev/null
@@ -1,23 +0,0 @@
-#!/usr/bin/env bash
-# ota_voice_auto.sh
-#
-# Run a single automated voice test, files are put in a time stamped
-# directory, and summarised in single line in the log file
-# log_voice.txt. Designed to be used from cron.
-
-# use crontab -e to edit cron for current user, sample entry:
-
-# m h dom mon dow command
-# */10 6-12 24 4 * cd codec2/unittest; ./ota_voice_auto.sh ~/your_speech_file.s16 your.kiwi.sdr
-
-timestamp=$(date +"%F-%T")
-mkdir -p $timestamp
-start_dir=$(pwd)
-cd $timestamp
-../ota_voice_test.sh "$@" > log.txt 2>&1
-cd $start_dir
-kiwi_sdr=$(head -n 1 ${timestamp}/log.txt)
-mode=$(head -n 2 ${timestamp}/log.txt | tail -n 1)
-Nsync=$(cat ${timestamp}/log.txt | grep Nsync | tr -s ' ' | cut -d' ' -f2)
-SNRav=$(cat ${timestamp}/log.txt | grep SNRav | tr -s ' ' | cut -d' ' -f2)
-printf "%s %-25s %s %3d %5.2f\n" $timestamp $kiwi_sdr $mode $Nsync $SNRav >> log_voice.txt
diff --git a/unittest/ota_voice_summary.sh b/unittest/ota_voice_summary.sh
deleted file mode 100755
index 62014fd..0000000
--- a/unittest/ota_voice_summary.sh
+++ /dev/null
@@ -1,80 +0,0 @@
-#!/usr/bin/env bash
-#
-# Summarise tests to date into one directory to allow easy browsing
-
-src=/home/david/Downloads/speech_orig_16k.wav
-length_src=$(sox $src -n stat 2>&1 | grep Length | sed -r 's/.*\:\s*//')
-
-dir=voice_summary
-mkdir -p ${dir}
-time_snr_files=$(find . -name time_snr.jpg | sort)
-p=$(pwd)
-serial=0
-
-echo "<table>"
-echo "<tr>"
-echo "<th>Serial</th><th>Mode</th><th>KiwiSDR</th><th>Rx</th><th>AnDV</th><th>DV</th><th>Spectrogram</th><th>SNR</th>"
-echo "</tr>"
-
-for f in $time_snr_files
-do
- d=$(echo $f | sed -r 's/\.\/(.*)\/time_snr.jpg/\1/')
- sdr_url=$(head ${d}/log.txt -n 1)
- sdr="unk"
- case $sdr_url in
- "kiwisdr.areg.org.au")
- sdr="areg"
- ;;
- "sdr-amradioantennas.com")
- sdr="am"
- ;;
- "vk6qs.proxy.kiwisdr.com")
- sdr="vk6qs"
- ;;
- "sdr.ironstonerange.com")
- sdr="iron"
- ;;
- "kk6pr.ddns.net")
- sdr="kk6pr"
- ;;
- "kiwisdr.owdjim.gen.nz")
- sdr="marahau"
- ;;
- "kiwisdrzl1kfm.ddns.net")
- sdr="zl1kfm"
- ;;
- *)
- echo "Unknown Kiwi SDR"
- ;;
- esac
- mode=$(head ${d}/log.txt -n 2 | tail -n 1)
- serial_str=$(printf "%04d" $serial)
- #echo $serial_str $d $sdr $mode
- echo "<tr>"
- echo "<td>$serial</td>"
- echo "<td>$mode</td>"
- echo "<td>$sdr</td>"
-
- f=${dir}/${serial_str}_${d}_${sdr}_${mode}
- f1=${serial_str}_${d}_${sdr}_${mode}
-
- cp ${d}/rx.wav ${f}_rx.wav
- echo "<td><a href=\"${f1}_rx.wav\">Rx</td>"
-
- cp ${d}/rx_freedv.wav ${f}_rx_freedv.wav
- echo "<td><a href=\"${f1}_rx_freedv.wav\">AnDV</td>"
-
- length_f=$(sox ${f}_rx_freedv.wav -n stat 2>&1 | grep Length | sed -r 's/.*\:\s*//')
- start_dv=$(python -c "print(${length_f}-${length_src}-2)")
- sox ${d}/rx_freedv.wav ${f}_rx_freedv_dv.wav trim $start_dv $length_src
- echo "<td><a href=\"${f1}_rx_freedv_dv.wav\">DV</td>"
-
- cp ${d}/spec.jpg ${f}_spec.jpg
- echo "<td><img src=\"${f1}_spec.jpg\" width="200" height="200" /></td>"
- cp ${d}/time_snr.jpg ${f}_time_snr.jpg
- echo "<td><img src=\"${f1}_time_snr.jpg\" width="200" height="200" /></td>"
- echo "</tr>"
- serial=$((serial + 1))
-done
-
-echo "</table>"
diff --git a/unittest/ota_voice_test.sh b/unittest/ota_voice_test.sh
deleted file mode 100755
index 4f502ec..0000000
--- a/unittest/ota_voice_test.sh
+++ /dev/null
@@ -1,309 +0,0 @@
-#!/usr/bin/env bash
-# ota_voice_test.sh
-#
-# Automated Over The Air (OTA) voice test for FreeDV HF voice modes
-#
-# 1. Build codec2
-# 2. Install kiwclient:
-# cd ~ && git clone [email protected]:jks-prv/kiwiclient.git
-# 3. Install Hamlib cli tools, and add user to dialout group:
-# sudo adduser david dialout
-# 4. To test rigctl:
-# echo "m" | rigctl -m 361 -r /dev/ttyUSB0
-# 5. Adjust Tx drive so ALC is just being tickled, set desired RF power:
-# ../build_linux/src/freedv_tx 2020 ~/Downloads/speech_orig_16k.wav - | aplay -f S16_LE --device="plughw:CARD=CODEC,DEV=0"
-# 6. Sample command line:
-# ./ota_voice_test.sh ~/Downloads/speech_orig_16k.wav -m 700E -i ~/Downloads/vk5dgr_testing_8k.wav sdr.ironstonerange.com -p 8074
-
-MY_PATH=`dirname $0`
-BUILD_PATH=`echo $MY_PATH/../build_*/src`
-PATH=${PATH}:${BUILD_PATH}:${HOME}/kiwiclient
-CODEC2=${MY_PATH}/..
-
-kiwi_url=""
-port=8074
-freq_kHz="7177"
-tx_only=0
-Nbursts=5
-mode="700D"
-model=361
-gain=6
-serialPort="/dev/ttyUSB0"
-rxwavefile=0
-soundDevice="plughw:CARD=CODEC,DEV=0"
-txstats=0
-stationid=""
-
-function print_help {
- echo
- echo "Automated Over The Air (OTA) voice test for FreeDV HF voice modes"
- echo
- echo " usage ./ota_voice_test.sh [options] SpeechWaveFile [kiwi_url]"
- echo " or:"
- echo " usage ./ota_voice_test.sh -r rxWaveFile"
- echo
- echo " -c dev The sound device (in ALSA format on Linux, CoreAudio for macOS)"
- echo " -d debug mode; trace script execution"
- echo " -f Frequency (kHz)"
- echo " -g SSB (analog) compressor gain"
- echo " -i StationIDWaveFile Prepend this file to identify transmission (should be 8KHz mono)"
- echo " -m mode 700c|700d|700e"
- echo " -o model select radio model number ('rigctl -l' to list)"
- echo " -p port kiwi_url port to use (default 8073)."
- echo " -r Rx wave file mode: Rx process supplied rx wave file"
- echo " -s SerialPort The serial port (or hostname:port) to control SSB radio,"
- echo " default /dev/ttyUSB0"
- echo " -t Tx only, useful for manually observing SDRs"
- echo " -x Generate tx.wav file and exit"
- echo
- exit
-}
-
-# Approximation of Hilbert clipper type compressor. Could do with some HF boost
-function analog_compressor {
- input_file=$1
- output_file=$2
- gain=$3
- cat $input_file | ch - - 2>/dev/null | \
- ch - - --No -100 --clip 16384 --gain $gain 2>/dev/null | \
- # final line prints peak and CPAPR for SSB
- ch - - --clip 16384 |
- # manually adjusted to get similar peak levels for SSB and FreeDV
- sox -t .s16 -r 8000 -c 1 -v 0.85 - -t .s16 $output_file
-}
-
-function run_rigctl {
- command=$1
- model=$2
- echo $command | rigctl -m $model -r $serialPort > /dev/null
- if [ $? -ne 0 ]; then
- echo "Can't talk to Tx"
- clean_up
- exit 1
- fi
-}
-
-function clean_up {
- echo "killing KiwiSDR process"
- kill ${kiwi_pid}
- wait ${kiwi_pid} 2>/dev/null
- exit 1
-}
-
-function process_rx {
- echo "Process receiver sample"
- rx=$1
- # generate spectrogram
- echo "pkg load signal; warning('off', 'all'); \
- s=load_raw('${rx}'); \
- plot_specgram(s, 8000, 200, 3000); print('spec.jpg', '-djpg'); \
- quit" | octave-cli -p ${CODEC2}/octave -qf > /dev/null
- # attempt to decode
- freedv_rx ${mode} ${rx} - -v --passthroughgain 1.0 2>rx_stats.txt | sox -t .s16 -r $speechFs -c 1 - rx_freedv.wav
- cat rx_stats.txt | tr -s ' ' | cut -f5 -d' ' | awk '$0==($0+0)' > sync.txt
- cat rx_stats.txt | tr -s ' ' | cut -f10 -d' ' | awk '$0==($0+0)' > snr.txt
- # time domain plot of output speech, SNR, and sync
- echo "pkg load signal; warning('off', 'all'); \
- s=load_raw('rx_freedv.wav'); snr=load('snr.txt'); sync=load('sync.txt'); \
- subplot(211); plot(s); subplot(212); x=1:length(sync); plotyy(x,snr,x,sync); \
- ylim([-5 15]); ylabel('SNR (dB)'); grid; \
- print('time_snr.jpg', '-djpg'); \
- printf('Nsync: %3d\n', sum(sync)); \
- snr_valid = snr(find(snr != -5.0)); \
- if length(snr_valid) printf('SNRav: %5.2f\n', mean(snr_valid)); else printf('SNRav: %5.2f\n', -5); end;
- quit" | octave-cli -p ${CODEC2}/octave -qf
-}
-
-POSITIONAL=()
-while [[ $# -gt 0 ]]
-do
-key="$1"
-case $key in
- -d)
- set -x
- shift
- ;;
- -f)
- freq_kHz="$2"
- shift
- shift
- ;;
- -g)
- gain="$2"
- shift
- shift
- ;;
- -i)
- stationid="$2"
- shift
- shift
- ;;
- -o)
- model="$2"
- shift
- shift
- ;;
- -m)
- mode="$2"
- shift
- shift
- ;;
- -p)
- port="$2"
- shift
- shift
- ;;
- -t)
- tx_only=1
- shift
- ;;
- -r)
- rxwavefile=1
- shift
- ;;
- -x)
- txstats=1
- shift
- ;;
- -c)
- soundDevice="$2"
- shift
- shift
- ;;
- -s)
- serialPort="$2"
- shift
- shift
- ;;
- -h)
- print_help
- ;;
- *)
- POSITIONAL+=("$1") # save it in an array for later
- shift
- ;;
-esac
-done
-set -- "${POSITIONAL[@]}" # restore positional parameters
-
-# determine sample rate of freedv_tx/freedv_rx
-speechFs=8000
-if [ "$mode" == "2020" ] || [ "$mode" == "2020B" ] || [ "$mode" == "2020C" ]; then
- speechFs=16000
-fi
-
-if [ $rxwavefile -eq 1 ]; then
- process_rx $1
- exit 0
-fi
-
-speechfile="$1"
-if [ ! -f $speechfile ]; then
- echo "Can't find input speech wave file: ${speechfile}!"
- exit 1
-fi
-
-if [ $tx_only -eq 0 ]; then
- if [ $# -lt 1 ]; then
- print_help
- fi
- kiwi_url="$2"
- echo $kiwi_url
-fi
-
-# create Tx file ------------------------
-echo $mode
-
-# create compressed analog
-speechfile_raw_8k=$(mktemp)
-comp_in=$(mktemp)
-speech_comp=$(mktemp)
-speech_freedv=$(mktemp)
-# If 16kHz input files for 2020x, we need an 8kHz version for SSB
-sox $speechfile -r 8000 -t .s16 -c 1 $speechfile_raw_8k
-if [ -z $stationid ]; then
- cp $speechfile_raw_8k $comp_in
-else
- # append station ID and apply analog compression
- stationid_raw_8k=$(mktemp)
- sox $stationid -r 8000 -t .s16 -c 1 $stationid_raw_8k
- cat $stationid_raw_8k $speechfile_raw_8k> $comp_in
-fi
-analog_compressor $comp_in $speech_comp $gain
-
-# create modulated FreeDV, with compressor enabled
-sox $speechfile -t .s16 -r $speechFs - | freedv_tx $mode - $speech_freedv --clip 1
-cat $speech_comp $speech_freedv > tx.raw
-sox -t .s16 -r 8000 -c 1 tx.raw tx.wav
-
-if [ $txstats -eq 1 ]; then
- # ch just used to monitor observe peak and RMS level
- ch $speech_freedv /dev/null
- # time domain plot of tx signal
- echo "pkg load signal; warning('off', 'all'); \
- s=load_raw('tx.raw'); plot(s); \
- print('tx.jpg', '-djpg'); \
- quit" | octave-cli -p ${CODEC2}/octave -qf > /dev/null
- exit 0
-fi
-
-# kick off KiwiSDR ----------------------------
-
-usb_lsb=$(python3 -c "print('usb') if ${freq_kHz} >= 10000 else print('lsb')")
-if [ $tx_only -eq 0 ]; then
- # clean up any kiwiSDR processes if we get a ctrl-C
- trap clean_up SIGHUP SIGINT SIGTERM
-
- echo -n "waiting for KiwiSDR "
- # start recording from remote kiwisdr
- kiwi_stdout=$(mktemp)
- kiwirecorder.py -s $kiwi_url -p ${port} -f $freq_kHz -m ${usb_lsb} -r 8000 --filename=rx --time-limit=300 >$kiwi_stdout &
- kiwi_pid=$!
-
- # wait for kiwi to start recording
- timeout_counter=0
- until grep -q -i 'Block: ' $kiwi_stdout
- do
- timeout_counter=$((timeout_counter+1))
- if [ $timeout_counter -eq 10 ]; then
- echo "can't connect to ${kiwi_url}"
- kill ${kiwi_pid}
- wait ${kiwi_pid} 2>/dev/null
- exit 1
- fi
- echo -n "."
- sleep 1
- done
- echo
-fi
-
-# transmit using local SSB radio
-echo "Tx data signal"
-freq_Hz=$((freq_kHz*1000))
-usb_lsb_upper=$(echo ${usb_lsb} | awk '{print toupper($0)}')
-run_rigctl "\\set_mode PKT${usb_lsb_upper} 0" $model
-run_rigctl "\\set_freq ${freq_Hz}" $model
-run_rigctl "\\set_ptt 1" $model
-if [ `uname` == "Darwin" ]; then
- AUDIODEV="${soundDevice}" play -t raw -b 16 -c 1 -r 8000 -e signed-integer --endian little tx.raw
-else
- aplay --device="${soundDevice}" -f S16_LE tx.raw 2>/dev/null
-fi
-if [ $? -ne 0 ]; then
- run_rigctl "\\set_ptt 0" $model
- clean_up
- echo "Problem running aplay!"
- echo "Is ${soundDevice} configured as the default sound device in Settings-Sound?"
- exit 1
-fi
-run_rigctl "\\set_ptt 0" $model
-
-if [ $tx_only -eq 0 ]; then
- sleep 2
- echo "Stopping KiwiSDR"
- kill ${kiwi_pid}
- wait ${kiwi_pid} 2>/dev/null
-
- process_rx rx.wav
-fi
-
diff --git a/unittest/raw_data_curves/Makefile b/unittest/raw_data_curves/Makefile
deleted file mode 100644
index 9f13d1f..0000000
--- a/unittest/raw_data_curves/Makefile
+++ /dev/null
@@ -1,132 +0,0 @@
-# Makefile
-# Dec 2022
-#
-# Automates PER/BER curve generation for raw data mode:
-#
-# 1. Compare "ch" noise injection/SNR measurement against reference Octave Tx
-# 2. Compare C Tx against Octave Tx (with and without compression)
-# 3. Plot curves for SNR estimated from C Rx against actual SNR
-# 4. Plot AWGN/PER C Tx curves for end user documentation
-
-SHELL := /bin/bash
-CODEC2 := $(HOME)/codec2
-
-all: test \
- octave_ch_noise_awgn.png octave_c_tx_awgn.png octave_c_tx_comp_awgn.png \
- octave_ch_noise_mpp.png octave_c_tx_mpp.png octave_c_tx_comp_mpp.png \
- snrest_snr_ctx.png snrest_snr_ctxc.png \
- c_tx_comp.png c_tx_comp_thruput.png
-
-clean:
- rm -f *.txt *.png *.raw
-
-# run this first, traps common CML setup error
-test:
- source snr_curves.sh; test_ldpc
-
-# subset of files generated, but enough to set up Makefile dependencies
-snr_oct = snr_oct_datac0_awgn.txt snr_oct_datac1_awgn.txt snr_oct_datac3_awgn.txt
-snr_ch = snr_ch_datac0_awgn.txt snr_ch_datac1_awgn.txt snr_ch_datac3_awgn.txt
-snr_ctx = snr_ctx_datac0_awgn.txt snr_ctx_datac1_awgn.txt snr_ctx_datac3_awgn.txt
-snr_ctxc = snr_ctxc_datac0_awgn.txt snr_ctxc_datac3_awgn.txt
-
-snr_oct_mpp = snr_oct_datac0_mpp.txt snr_oct_datac1_mpp.txt snr_oct_datac3_mpp.txt
-snr_ch_mpp = snr_ch_datac0_mpp.txt snr_ch_datac1_mpp.txt snr_ch_datac3_mpp.txt
-snr_ctx_mpp = snr_ctx_datac0_mpp.txt snr_ctx_datac1_mpp.txt snr_ctx_datac3_mpp.txt
-snr_ctxc_mpp = snr_ctxc_datac0_mpp.txt snr_ctxc_datac3_mpp.txt
-
-$(snr_oct):
- source snr_curves.sh; generate_octave_tx_data datac0 awgn
- source snr_curves.sh; generate_octave_tx_data datac1 awgn
- source snr_curves.sh; generate_octave_tx_data datac3 awgn
-
-$(snr_oct_mpp):
- source snr_curves.sh; generate_octave_tx_data datac0 mpp
- source snr_curves.sh; generate_octave_tx_data datac1 mpp
- source snr_curves.sh; generate_octave_tx_data datac3 mpp
-
-$(snr_ch):
- source snr_curves.sh; generate_ch_data datac0 awgn
- source snr_curves.sh; generate_ch_data datac1 awgn
- source snr_curves.sh; generate_ch_data datac3 awgn
-
-$(snr_ch_mpp):
- source snr_curves.sh; generate_ch_data datac0 mpp
- source snr_curves.sh; generate_ch_data datac1 mpp
- source snr_curves.sh; generate_ch_data datac3 mpp
-
-# C without compression
-
-$(snr_ctx):
- source snr_curves.sh; generate_snrest_v_snr_data datac0 awgn
- source snr_curves.sh; generate_snrest_v_snr_data datac1 awgn
- source snr_curves.sh; generate_snrest_v_snr_data datac3 awgn
- source snr_curves.sh; generate_snrest_v_snr_data datac4 awgn
- source snr_curves.sh; generate_snrest_v_snr_data datac13 awgn
-
-$(snr_ctx_mpp):
- source snr_curves.sh; generate_snrest_v_snr_data datac0 mpp
- source snr_curves.sh; generate_snrest_v_snr_data datac1 mpp
- source snr_curves.sh; generate_snrest_v_snr_data datac3 mpp
- source snr_curves.sh; generate_snrest_v_snr_data datac4 mpp
- source snr_curves.sh; generate_snrest_v_snr_data datac13 mpp
-
-# C with compression
-
-$(snr_ctxc):
- source snr_curves.sh; generate_snrest_v_snr_data datac0 awgn 1
- source snr_curves.sh; generate_snrest_v_snr_data datac1 awgn 1
- source snr_curves.sh; generate_snrest_v_snr_data datac3 awgn 1
- source snr_curves.sh; generate_snrest_v_snr_data datac4 awgn 1
- source snr_curves.sh; generate_snrest_v_snr_data datac13 awgn 1
-
-$(snr_ctxc_mpp):
- source snr_curves.sh; generate_snrest_v_snr_data datac0 mpp 1
- source snr_curves.sh; generate_snrest_v_snr_data datac1 mpp 1
- source snr_curves.sh; generate_snrest_v_snr_data datac3 mpp 1
- source snr_curves.sh; generate_snrest_v_snr_data datac4 mpp 1
- source snr_curves.sh; generate_snrest_v_snr_data datac13 mpp 1
-
-# Octave and C curves should be on top of each other, indicating Octave
-# and ch noise injection/SNR measurement are equivalent
-octave_ch_noise_awgn.png: $(snr_oct) $(snr_ch)
- echo "snr_curves_plot; octave_ch_noise_print('awgn'); quit" | \
- octave-cli -p $(CODEC2)/octave
-octave_ch_noise_mpp.png: $(snr_oct_mpp) $(snr_ch_mpp)
- echo "snr_curves_plot; octave_ch_noise_print('mpp'); quit" | \
- octave-cli -p $(CODEC2)/octave
-
-# Octave Tx and C Tx curves should be on top of each other
-octave_c_tx_awgn.png: $(snr_oct) $(snr_ctx)
- echo "snr_curves_plot; octave_c_tx_print('awgn'); quit" | \
- octave-cli -p $(CODEC2)/octave
-octave_c_tx_mpp.png: $(snr_oct_mpp) $(snr_ctx_mpp)
- echo "snr_curves_plot; octave_c_tx_print('mpp'); quit" | \
- octave-cli -p $(CODEC2)/octave
-
-# Octave Tx and C Tx (compressed) curves should be close, but C may be 1dB
-# poorer
-octave_c_tx_comp_awgn.png: $(snr_oc) $(snr_ctxc)
- echo "snr_curves_plot; octave_c_tx_comp_print('awgn'); quit" | \
- octave-cli -p $(CODEC2)/octave
-octave_c_tx_comp_mpp.png: $(snr_oct_mpp) $(snr_ctxc_mpp)
- echo "snr_curves_plot; octave_c_tx_comp_print('mpp'); quit" | \
- octave-cli -p $(CODEC2)/octave
-
-# combined AWGN and MPP from C Tx (compressed) - what end users would run
-c_tx_comp.png: $(snr_ctxc) $(snr_ctxc_mpp)
- echo "snr_curves_plot; c_tx_comp_print; quit" | \
- octave-cli -p $(CODEC2)/octave
-
-# Curves of SNR estimates from C Rx compared to actual SNR, useful for "gear shifting"
-snrest_snr_ctx.png: $(snr_ctx)
- echo "snr_curves_plot; snrest_snr_print('ctx', 'awgn'); quit" | \
- octave-cli -p $(CODEC2)/octave
-snrest_snr_ctxc.png: $(snr_ctxc)
- echo "snr_curves_plot; snrest_snr_print('ctxc', 'awgn'); quit" | \
- octave-cli -p $(CODEC2)/octave
-
-# Throughput of payload data in bits/s of modes against SNR
-c_tx_comp_thruput.png: $(snr_ctxc) $(snr_ctxc_mpp)
- echo "snr_curves_plot; c_tx_comp_thruput_print; quit" | \
- octave-cli -p $(CODEC2)/octave
diff --git a/unittest/raw_data_curves/snr_curves.sh b/unittest/raw_data_curves/snr_curves.sh
deleted file mode 100755
index 6da671c..0000000
--- a/unittest/raw_data_curves/snr_curves.sh
+++ /dev/null
@@ -1,184 +0,0 @@
-# snr_curves.sh
-#
-# Library of bash functions to generate data for SNR curves.
-#
-# testing a function example:
-# $ bash -c "source ./snr_curves.sh; generate_octave_tx_data datac0 awgn"
-
-set -x
-
-PATH=${PATH}:${HOME}/codec2/build_linux/src
-CODEC2=${HOME}/codec2
-FADING_DIR=${CODEC2}/build_linux/unittest
-
-snr_list='-5 -4 -3 -2 0 1 2 4'
-No_list='-13 -14 -15 -16 -18 -20 -22 -24 -26'
-Nbursts_awgn=20
-Nbursts_mpp=100
-
-# Octave Tx injects noise and is source of truth for SNR, measure BER/PER v SNR
-function generate_octave_tx_data {
- mode=$1
- channel=$2
-
- Nbursts=$Nbursts_awgn
- snr_nudge=0
- if [ "$channel" == "mpp" ]; then
- Nbursts=$Nbursts_mpp
- snr_nudge=4
- fi
-
- rx_log=$(mktemp)
-
- i=1
- rm -f snr_oct_${mode}_${channel}*.txt
- rm -f ber_oct_${mode}_${channel}*.txt
- rm -f per_oct_${mode}_${channel}*.txt
- for snr in $snr_list
- do
- snr_adj=$((${snr}+${snr_nudge}))
- echo "warning ('off', 'Octave:data-file-in-path');
- ofdm_ldpc_tx('test_${mode}.raw','${mode}',1,${snr_adj},'${channel}','bursts',${Nbursts},'crc');
- quit" | DISPLAY="" octave-cli -p ${CODEC2}/octave
- freedv_data_raw_rx --testframes $mode test_${mode}.raw /dev/null 2>${rx_log} -v
- BERmeas=$(cat ${rx_log} | grep 'BER......:' | cut -d' ' -f2)
- PERmeas=$(cat ${rx_log} | grep 'Coded FER' | cut -d' ' -f3)
-
- echo ${snr_adj} >> snr_oct_${mode}_${channel}.txt
- echo ${BERmeas} >> ber_oct_${mode}_${channel}.txt
- echo ${PERmeas} >> per_oct_${mode}_${channel}.txt
- i=$((i+1))
- done
- echo 0 > offset_oct_${mode}_${channel}.txt
-}
-
-# ch injects noise and is source of truth for SNR, measure BER/PER v SNR
-# Octave Tx
-function generate_ch_data {
- mode=$1
- channel=$2
-
- ch_multipath=''
- Nbursts=$Nbursts_awgn
- snr_nudge=0
- if [ "$channel" == "mpp" ]; then
- ch_multipath='--mpp'
- Nbursts=$Nbursts_mpp
- snr_nudge=4
- fi
-
- octave_log=$(mktemp)
- ch_log=$(mktemp)
- rx_log=$(mktemp)
-
- i=1
- rm -f snr_ch_${mode}_${channel}*.txt
- rm -f ber_ch_${mode}_${channel}*.txt
- rm -f per_ch_${mode}_${channel}*.txt
- for No in $No_list
- do
- No_adj=$((${No}-${snr_nudge}))
- echo "warning ('off', 'Octave:data-file-in-path');
- ofdm_ldpc_tx('test_${mode}.raw','${mode}',1,100,'awgn','bursts',${Nbursts},'crc');
- quit" | DISPLAY="" octave-cli -p ${CODEC2}/octave 1>${octave_log}
- SNRoffset=$(cat ${octave_log} | grep 'Burst offset:' | cut -d' ' -f5)
-
- ch test_${mode}.raw - --No $No_adj ${ch_multipath} --fading_dir ${FADING_DIR} 2>>${ch_log} | \
- freedv_data_raw_rx --testframes $mode - /dev/null -v 2>${rx_log}
- BERmeas=$(cat ${rx_log} | grep 'BER......:' | cut -d' ' -f2)
- PERmeas=$(cat ${rx_log} | grep 'Coded FER' | cut -d' ' -f3)
-
- echo ${BERmeas} >> ber_ch_${mode}_${channel}.txt
- echo ${PERmeas} >> per_ch_${mode}_${channel}.txt
- i=$((i+1))
- done
-
- echo ${SNRoffset} > offset_ch_${mode}_${channel}.txt
- SNRch=$(cat ${ch_log} | grep SNR3k | tr -s ' ' | cut -d' ' -f3)
- echo ${SNRch} > snr_ch_${mode}_${channel}.txt
-}
-
-# ch injects noise and is source of truth for SNR, measure BER/PER v SNR and
-# SNR estimates v SNR from rx, C Tx
-function generate_snrest_v_snr_data {
- mode=$1
- channel=$2
-
- snr_nudge=0
- aNo_list=$No_list
-
- # nudge SNR test range to get meaningful results for these tests
- if [ "$mode" == "datac1" ]; then
- snr_nudge=4
- fi
- if [[ "$mode" == "datac4" || "$mode" == "datac13" ]]; then
- snr_nudge=-6
- fi
-
- ch_multipath=''
- Nbursts=$Nbursts_awgn
- if [ "$channel" == "mpp" ]; then
- ch_multipath='--mpp'
- Nbursts=$Nbursts_mpp
- snr_nudge=$((${snr_nudge}+4))
- fi
-
- clip=0
- id='ctx'
- if [ "$#" -eq 3 ]; then
- clip=$3
- id='ctxc'
- snr_nudge=$((${snr_nudge}-4))
- fi
-
- tx_log=$(mktemp)
- ch_log=$(mktemp)
- rx_log=$(mktemp)
-
- i=1
- rm -f snrest_${id}_${mode}_${channel}*.txt
- rm -f ber_${id}_${mode}_${channel}*.txt
- rm -f per_${id}_${mode}_${channel}*.txt
- for No in $aNo_list
- do
- No_adj=$((${No}-${snr_nudge}))
- freedv_data_raw_tx --clip ${clip} --delay 1000 --txbpf ${clip} --bursts $Nbursts --testframes $Nbursts $mode /dev/zero - 2>${tx_log} | \
- ch - - --No $No_adj ${ch_multipath} --fading_dir ${FADING_DIR} 2>>${ch_log} | \
- freedv_data_raw_rx --testframes $mode - /dev/null 2>${rx_log} -v
- SNRoffset=$(cat ${tx_log} | grep "mark:space" | tr -s ' ' | cut -d' ' -f 5)
-
- SNRest=$(cat ${rx_log} | grep '\-BS\-' | tr -s ' ' | cut -d' ' -f17)
- if [ ! -z "$SNRest" ]; then
- echo ${SNRest} > snrest_${id}_${mode}_${channel}_${i}.txt
- fi
- BERmeas=$(cat ${rx_log} | grep 'BER......:' | cut -d' ' -f2)
- PERmeas=$(cat ${rx_log} | grep 'Coded FER' | cut -d' ' -f3)
- echo ${BERmeas} >> ber_${id}_${mode}_${channel}.txt
- echo ${PERmeas} >> per_${id}_${mode}_${channel}.txt
- i=$((i+1))
- done
-
- echo ${SNRoffset} > offset_${id}_${mode}_${channel}.txt
-
- # trap not enough fading file samples (with mpp)
- grep "Fading file finished" ${ch_log}
- if [ $? -eq 0 ]; then
- cat ${ch_log}
- exit 1
- fi
- SNRch=$(cat ${ch_log} | grep SNR3k | tr -s ' ' | cut -d' ' -f3)
- echo ${SNRch} > snr_${id}_${mode}_${channel}.txt
-}
-
-# Sanity check to make sure Octave/CML is set up OK
-function test_ldpc {
- echo "ldpcut; quit" | DISPLAY="" octave-cli -p ${CODEC2}/octave
- if [ "$?" -ne 0 ]; then
- echo "basic octave test failed, you may need to"
- echo "(a) run ctests to create build_xxx/cml"
- echo "(b) set up ~/.octaverc as per octave/ldpc.m"
- exit 1
- else
- echo "OK"
- fi
-}
diff --git a/unittest/sd.c b/unittest/sd.c
deleted file mode 100644
index 1d1a628..0000000
--- a/unittest/sd.c
+++ /dev/null
@@ -1,84 +0,0 @@
-/*--------------------------------------------------------------------------*\
-
- FILE........: sd.c
- AUTHOR......: David Rowe
- DATE CREATED: 20/7/93
-
- Function to determine spectral distortion between two sets of LPCs.
-
-\*--------------------------------------------------------------------------*/
-
-/*
- Copyright (C) 2009 David Rowe
-
- All rights reserved.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License version 2.1, as
- published by the Free Software Foundation. This program is
- distributed in the hope that it will be useful, but WITHOUT ANY
- WARRANTY; without even the implied warranty of MERCHANTABILITY or
- FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
- License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#define MAX_N 2048 /* maximum DFT size */
-
-#include <math.h>
-#include "four1.h"
-#include "comp.h"
-#include "sd.h"
-
-/*---------------------------------------------------------------------------*\
-
- FUNCTION....: spectral_dist()
-
- AUTHOR......: David Rowe
- DATE CREATED: 20/7/93
-
- This function returns the soectral distoertion between two
- sets of LPCs.
-
-\*---------------------------------------------------------------------------*/
-
-float spectral_dist(float ak1[], float ak2[], int p, int n)
-/* float ak1[]; unquantised set of p+1 LPCs */
-/* float ak2[]; quantised set of p+1 LPCs */
-/* int p; LP order */
-/* int n; DFT size to use for SD calculations (power of 2) */
-{
- COMP A1[MAX_N]; /* DFT of ak1[] */
- COMP A2[MAX_N]; /* DFT of ak2[] */
- float P1,P2; /* power of current bin */
- float sd;
- int i;
-
- for(i=0; i<n; i++) {
- A1[i].real = 0.0;
- A1[i].imag = 0.0;
- A2[i].real = 0.0;
- A2[i].imag = 0.0;
- }
-
- for(i=0; i<p+1; i++) {
- A1[i].real = ak1[i];
- A2[i].real = ak2[i];
- }
-
- #warn Array index -1 is out of bounds
- four1(&A1[-1].imag,n,-1);
- four1(&A2[-1].imag,n,-1);
-
- sd = 0.0;
- for(i=0; i<n; i++) {
- P1 = A1[i].real*A1[i].real + A1[i].imag*A1[i].imag;
- P2 = A2[i].real*A2[i].real + A2[i].imag*A2[i].imag;
- sd += pow(log10(P2/P1),2.0);
- }
- sd = 10.0*sqrt(sd/n); /* sd in dB */
-
- return(sd);
-}
diff --git a/unittest/sd.h b/unittest/sd.h
deleted file mode 100644
index 866b95b..0000000
--- a/unittest/sd.h
+++ /dev/null
@@ -1,33 +0,0 @@
-/*--------------------------------------------------------------------------*\
-
- FILE........: sd.h
- AUTHOR......: David Rowe
- DATE CREATED: 22/7/93
-
- Function to determine spectral distortion between two sets of LPCs.
-
-\*--------------------------------------------------------------------------*/
-
-/*
- Copyright (C) 2009 David Rowe
-
- All rights reserved.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License version 2.1, as
- published by the Free Software Foundation. This program is
- distributed in the hope that it will be useful, but WITHOUT ANY
- WARRANTY; without even the implied warranty of MERCHANTABILITY or
- FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
- License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef __SD__
-#define __SD__
-
-float spectral_dist(float ak1[], float ak2[], int p, int n);
-
-#endif /* __SD__ */
diff --git a/unittest/spectrogram.sh b/unittest/spectrogram.sh
deleted file mode 100755
index 87d3fa2..0000000
--- a/unittest/spectrogram.sh
+++ /dev/null
@@ -1,17 +0,0 @@
-#!/usr/bin/env bash
-# spectrogram.sh
-#
-# Render a spectrogram from a wave file.
-
-PATH=${PATH}:${HOME}/codec2/build_linux/src
-CODEC2=${HOME}/codec2
-
-fullfile=$1
-filename=$(basename -- "$fullfile")
-extension="${filename##*.}"
-filename="${filename%.*}"
-
-echo "pkg load signal; warning('off', 'all'); \
- s=load_raw('${fullfile}'); \
- plot_specgram(s, 8000, 500, 2500); print('${filename}.jpg', '-djpg'); \
- quit" | octave-cli -p ${CODEC2}/octave -qf > /dev/null
diff --git a/unittest/t_helpers.c b/unittest/t_helpers.c
deleted file mode 100644
index 4f20743..0000000
--- a/unittest/t_helpers.c
+++ /dev/null
@@ -1,38 +0,0 @@
-#include <assert.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "t_helpers.h"
-
-void test(char * tfn)
-{
- fn = tfn;
- printf("========================================\n");
- printf("test function: %s\n", fn);
- printf("========================================\n");
-}
-
-void test_failed()
-{
- printf("Failed to calculate %s.\n", fn);
- exit(1);
-}
-
-void test_failed_s(char * expected, char * res)
-{
-
- printf("Failed to calculate %s.\n", fn);
-
- printf("expected: %s\ngot: %s\n", expected, res);
- exit(1);
-}
-
-void test_failed_f(float expected, float res)
-{
-
- printf("Failed to calculate %s.\n", fn);
- printf("expected: %f\ngot: %f\n", expected, res);
- exit(1);
-}
-
diff --git a/unittest/t_helpers.h b/unittest/t_helpers.h
deleted file mode 100644
index 2dfcbef..0000000
--- a/unittest/t_helpers.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*---------------------------------------------------------------------------*\
-
- FILE........: t_helpers.c
- AUTHOR......: Phil Ayres
- DATE CREATED: July 2017
-
- * Simple helper functions for unit tests
- *
-\*---------------------------------------------------------------------------*/
-
-/*
- Copyright David Rowe 2017
-
- All rights reserved.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License version 2.1, as
- published by the Free Software Foundation. This program is
- distributed in the hope that it will be useful, but WITHOUT ANY
- WARRANTY; without even the implied warranty of MERCHANTABILITY or
- FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
- License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program; if not, see <http://www.gnu.org/licenses/>.
-
- */
-
-#ifndef T_HELPERS_H
-#define T_HELPERS_H
-
-void test(char * tfn);
-void test_failed();
-void test_failed_s(char * expected, char * res);
-void test_failed_f(float expected, float res);
-
-char *fn;
-
-
-#endif /* T_HELPERS_H */
-
diff --git a/unittest/tcontphase.c b/unittest/tcontphase.c
deleted file mode 100644
index 02e51b2..0000000
--- a/unittest/tcontphase.c
+++ /dev/null
@@ -1,186 +0,0 @@
-/*---------------------------------------------------------------------------*\
-
- FILE........: tcontphase.c
- AUTHOR......: David Rowe
- DATE CREATED: 11/9/09
-
- Test program for developing continuous phase track synthesis algorithm.
- However while developing this it was discovered that synthesis_mixed()
- worked just as well.
-
-\*---------------------------------------------------------------------------*/
-
-/*
- Copyright (C) 2009 David Rowe
-
- All rights reserved.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License version 2.1, as
- published by the Free Software Foundation. This program is
- distributed in the hope that it will be useful, but WITHOUT ANY
- WARRANTY; without even the implied warranty of MERCHANTABILITY or
- FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
- License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#define N 80 /* frame size */
-#define F 160 /* frames to synthesis */
-#define P 10 /* LPC order */
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <math.h>
-#include "sine.h"
-#include "dump.h"
-#include "synth.h"
-#include "phase.h"
-
-int frames;
-
-float ak[] = {
- 1.000000,
--1.455836,
- 1.361841,
--0.879267,
- 0.915985,
--1.002202,
- 0.944103,
--0.743094,
- 1.053356,
--0.817491,
- 0.431222
-};
-
-
-/*---------------------------------------------------------------------------*\
-
- switch_present()
-
- Searches the command line arguments for a "switch". If the switch is
- found, returns the command line argument where it ws found, else returns
- NULL.
-
-\*---------------------------------------------------------------------------*/
-
-int switch_present(sw,argc,argv)
- char sw[]; /* switch in string form */
- int argc; /* number of command line arguments */
- char *argv[]; /* array of command line arguments in string form */
-{
- int i; /* loop variable */
-
- for(i=1; i<argc; i++)
- if (!strcmp(sw,argv[i]))
- return(i);
-
- return 0;
-}
-
-/*---------------------------------------------------------------------------*\
-
- MAIN
-
-\*---------------------------------------------------------------------------*/
-
-int main(argc,argv)
-int argc;
-char *argv[];
-{
- FILE *fout;
- short buf[N];
- int i,j;
- int dump;
- float phi_prev[MAX_AMP];
- float Wo_prev, ex_phase, G;
- //float ak[P+1];
- COMP H[MAX_AMP];
- float f0;
-
- if (argc < 3) {
- printf("\nusage: %s OutputRawSpeechFile F0\n", argv[0]);
- exit(1);
- }
-
- /* Output file */
-
- if ((fout = fopen(argv[1],"wb")) == NULL) {
- printf("Error opening output speech file: %s\n",argv[1]);
- exit(1);
- }
-
- f0 = atof(argv[2]);
-
- dump = switch_present("--dump",argc,argv);
- if (dump)
- dump_on(argv[dump+1]);
-
- init_decoder();
-
- for(i=0; i<MAX_AMP; i++)
- phi_prev[i] = 0.0;
- Wo_prev = 0.0;
-
- model.Wo = PI*(f0/4000.0);
- G = 1000.0;
- model.L = floor(PI/model.Wo);
-
- //aks_to_H(&model, ak, G , H, P);
- //for(i=1; i<=model.L; i++)
- model.A[i] = sqrt(H[i].real*H[i].real + H[i].imag*H[i].imag);
- //printf("L = %d\n", model.L);
- //model.L = 10;
- for(i=1; i<=model.L; i++) {
- model.A[i] = 1000/model.L;
- model.phi[i] = 0;
- H[i].real = 1.0; H[i].imag = 0.0;
- }
-
- //ak[0] = 1.0;
- //for(i=1; i<=P; i++)
- // ak[i] = 0.0;
-
- frames = 0;
- for(j=0; j<F; j++) {
- frames++;
-
- #ifdef SWAP
- /* lets make phases bounce around from frame to frame. This
- could happen if H[m] is varying, for example due to frame
- to frame Wo variations, or non-stationary speech.
- Continuous model generally results in smooth phase track
- under these circumstances. */
- if (j%2){
- H[1].real = 1.0; H[1].imag = 0.0;
- model.phi[1] = 0.0;
- }
- else {
- H[1].real = 0.0; H[1].imag = 1.0;
- model.phi[1] = PI/2;
- }
- #endif
-
- //#define CONT
- #ifdef CONT
- synthesise_continuous_phase(Pn, &model, Sn_, 1, &Wo_prev, phi_prev);
- #else
- phase_synth_zero_order(5.0, H, &Wo_prev, &ex_phase);
- synthesise_mixed(Pn,&model,Sn_,1);
- #endif
-
- for(i=0; i<N; i++)
- buf[i] = Sn_[i];
- fwrite(buf,sizeof(short),N,fout);
- }
-
- fclose(fout);
- if (dump) dump_off();
-
- return 0;
-}
-
-
diff --git a/unittest/tdeframer.c b/unittest/tdeframer.c
deleted file mode 100644
index 03e8bb1..0000000
--- a/unittest/tdeframer.c
+++ /dev/null
@@ -1,148 +0,0 @@
-/*---------------------------------------------------------------------------*\
-
- FILE........: tdeframer.c
- AUTHOR......: Brady O'Brien
- DATE CREATED: 8 April 2016
-
- C unit test for the VHF framer/deframer used by modes 2400A and 2400B.
- The deframer should sync up within one frame at a BER of 10e-3
-\*---------------------------------------------------------------------------*/
-
-/*
- Copyright (C) 2016 David Rowe
-
- All rights reserved.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License version 2.1, as
- published by the Free Software Foundation. This program is
- distributed in the hope that it will be useful, but WITHOUT ANY
- WARRANTY; without even the implied warranty of MERCHANTABILITY or
- FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
- License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-/* BER of test */
-#define TESTBER 0.01
-
-/* Frame count */
-#define FRCNT 1500
-
-/* Random bits leading frame */
-#define LRCNT 44
-
-#include <stdio.h>
-#include <math.h>
-#include <stdint.h>
-#include <freedv_vhf_framing.h>
-#include <golay23.h>
-#include <string.h>
-
-/* The main loop of the test driver */
-int main(int argc,char *argv[]){
- uint8_t * bit_buffer;
- uint8_t c2_buffer[10];
- struct freedv_vhf_deframer * fvd;
- int i,p,k;
- int bitbufferlen;
- int fsize;
- int ftype;
- int first_tol;
-
- if(argc<2){
- fprintf(stderr,"Usage: %s [A|B]\n",argv[0]);
- exit(1);
- }
-
- if(strcmp(argv[1],"A")==0){
- ftype = FREEDV_VHF_FRAME_A;
- first_tol = 2;
- }else if(strcmp(argv[1],"B")==0){
- ftype = FREEDV_HF_FRAME_B;
- first_tol = 5;
- }else{
- fprintf(stderr,"Usage: %s [A|B]\n",argv[0]);
- exit(1);
- }
-
- srand(1);
- golay23_init();
-
- /* Set up the deframer */
- fvd = fvhff_create_deframer(ftype,1);
-
- fsize = fvhff_get_frame_size(fvd);
- bitbufferlen = (LRCNT+fsize*FRCNT);
-
- /* Allocate bit buffer */
- bit_buffer = (uint8_t *) malloc(sizeof(uint8_t)*bitbufferlen);
- p = 0;
-
- /* Fill out front of buffer */
- for(i=0; i<LRCNT; i++){
- bit_buffer[p++] = rand()&0x1;
- }
-
- /* Place frames */
- for(i=0; i<FRCNT; i++){
- /* Encode frame index into golay codeword to protect from test BER*/
- k = golay23_encode((i+1)&0x0FFF);
- c2_buffer[5] = (k )&0xFF;
- c2_buffer[1] = (k>>8 )&0xFF;
- c2_buffer[0] = (k>>16)&0x7F;
- /* Frame the bits */
- fvhff_frame_bits(ftype, &bit_buffer[p+(i*fsize)], c2_buffer,NULL,NULL);
- }
-
- /* Flip bits */
- for(i=0; i<bitbufferlen; i++){
- if( (rand()&0xFFFFFF) < (int)(TESTBER*0xFFFFFF)){
- bit_buffer[i] = bit_buffer[i]?0:1;
- }
- }
-
- p=0;
- int first_extract = 0;
- int total_extract = 0;
- int err_count = 0;
- printf("\n");
- /* Deframe some bits */
- for(i=0; i<bitbufferlen; i+=fsize){
- if( fvhff_deframe_bits(fvd, c2_buffer, NULL, NULL, &bit_buffer[i])){
- /* Extract golay23 codeword */
- k = ((int)c2_buffer[5]) ;
- k |= ((int)c2_buffer[1])<<8 ;
- k |= ((int)c2_buffer[0])<<16;
- k = k & 0x7FFFFF;
- /* Decode frame index */
- p = golay23_decode(k);
- err_count += golay23_count_errors(k,p);
- p = p>>11;
-
- printf("%d,\t",p);
- total_extract++;
- if(first_extract==0)
- first_extract=p;
- }
- }
- printf("\n");
- float measured_ber = (float)err_count/(float)(23*total_extract);
-
- printf("First extracted frame %d\n",first_extract);
- printf("Extracted %d frames of %d, %f hit rate\n",total_extract,FRCNT,((float)total_extract/(float)FRCNT));
- printf("Bit error rate %f measured from golay code\n",measured_ber);
- printf("Bit error rate %f measured by deframer\n",fvd->ber_est);
- printf("Bit error rate %f measured by deframer\n",(float)fvd->total_uw_err/(float)fvd->total_uw_bits);
- /* Check test condition */
- if(first_extract<first_tol){
- printf("Test passed at test BER of %f!\n",TESTBER);
- exit(0);
- }else{
- printf("** Test failed at test BER of %f!\n",TESTBER);
- exit(1);
- }
- fvhff_destroy_deframer(fvd);
-}
diff --git a/unittest/test_phi0.c b/unittest/test_phi0.c
deleted file mode 100644
index 8063843..0000000
--- a/unittest/test_phi0.c
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- FILE...: test_phi0.c
- AUTHOR.: Matthew C. Valenti, Rohit Iyer Seshadri, David Rowe, Don Reid
- CREATED: Sep 2018
-
- Compare new generated phi0 function to what was originally in mpdecode_core.c
-*/
-
-#include <math.h>
-#include <stdlib.h>
-#include <stdio.h>
-
-#include "phi0.h"
-
-
-/* Original Phi function */
-static float phi0_orig( float x ) {
- float z;
-
- if (x>10)
- return( 0 );
- else if (x< 9.08e-5 )
- return( 10 );
- else if (x > 9)
- return( 1.6881e-4 );
- /* return( 1.4970e-004 ); */
- else if (x > 8)
- return( 4.5887e-4 );
- /* return( 4.0694e-004 ); */
- else if (x > 7)
- return( 1.2473e-3 );
- /* return( 1.1062e-003 ); */
- else if (x > 6)
- return( 3.3906e-3 );
- /* return( 3.0069e-003 ); */
- else if (x > 5)
- return( 9.2168e-3 );
- /* return( 8.1736e-003 ); */
- else {
- z = (float) exp(x);
- return( (float) log( (z+1)/(z-1) ) );
- }
-}
-
-////////////////////////////////////////////////////
-// Main
-int main(void) {
-
- float xf;
- float error;
- int errsum = 0;
- int errsum2 = 0;
- int errcnt = 0;
-
- for (xf=10.5f; xf>5e-5f; xf = xf * 0.9) {
-
- float orig = phi0_orig(xf);
- float new = phi0(xf);
-
- error = new - orig;
- printf("%10.4f: %10.6f - %10.6f = %10.6f", xf, new, orig, error);
- if ((error >= 0.001) && (error >= (orig * 0.1))) printf(" ****");
- printf("\n");
-
- errsum += error;
- errsum2 += error * error;
- errcnt ++;
-
- }
-
- printf("Net error %f\n", (double)errsum);
- printf("avg error %f\n", (double)errsum/errcnt);
- printf("rms error %f\n", (double)sqrt(errsum2/errcnt));
-
- return(0);
-}
-
-/* vi:set ts=4 et sts=4: */
diff --git a/unittest/tfreedv_2400A_rawdata.c b/unittest/tfreedv_2400A_rawdata.c
index ed65501..8007793 100644
--- a/unittest/tfreedv_2400A_rawdata.c
+++ b/unittest/tfreedv_2400A_rawdata.c
@@ -74,7 +74,6 @@ int main(int argc, char **argv)
printf("freedv_rawdatatx()/freedv_rawdatarx() ");
int frames = 0;
- int fails = 0;
{
short mod[nom_samples * 10];
/* Note: A codec frame is only 6.5 bytes!
@@ -94,7 +93,6 @@ int main(int argc, char **argv)
for (b = 0; b < 7; b++) {
if (payload[b] != payload_rx[b]) {
printf("Received codec bits 0x%02x do not match expected 0x%02x\n", payload_rx[b], payload[b]);
- fails++;
}
}
frames++;
diff --git a/unittest/tfreedv_2400B_rawdata.c b/unittest/tfreedv_2400B_rawdata.c
index 888ba83..0af4e8e 100644
--- a/unittest/tfreedv_2400B_rawdata.c
+++ b/unittest/tfreedv_2400B_rawdata.c
@@ -74,7 +74,6 @@ int main(int argc, char **argv)
printf("freedv_rawdatatx()/freedv_rawdatarx() ");
int frames = 0;
- int fails = 0;
{
short mod[nom_samples * 10];
/* Note: A codec frame is only 6.5 bytes!
@@ -94,7 +93,6 @@ int main(int argc, char **argv)
for (b = 0; b < 7; b++) {
if (payload[b] != payload_rx[b]) {
printf("Received codec bits 0x%02x do not match expected 0x%02x\n", payload_rx[b], payload[b]);
- fails++;
}
}
frames++;
diff --git a/unittest/tnc1_high_snr.sh b/unittest/tnc1_high_snr.sh
deleted file mode 100755
index e9a028a..0000000
--- a/unittest/tnc1_high_snr.sh
+++ /dev/null
@@ -1,103 +0,0 @@
-#!/usr/bin/env bash
-# tnc1_high_snr.sh
-#
-# HF TNC use case test 1
-# + Send unidirectional frames at high SNR over an alsa loopback virtual sound card
-# + Using the sound card can take some time, so implemented as a service to run automatically in background
-
-NAME=tnc1
-CODEC2_PATH=${HOME}/codec2
-PIDFILE_TX=/tmp/${NAME}_tx.pid
-PIDFILE_RX=/tmp/${NAME}_rx.pid
-LOGFILE=${NAME}.log
-PATH=${CODEC2_PATH}/build_linux/src:${PATH}
-DELAY="${DELAY:-500}"
-MAX_RUN_TIME=3600
-# we use single frame bursts, so BURSTS==FRAME
-BURSTS=$2
-
-function run_tx {
- bursts=$1
- delay=$2
- freedv_data_raw_tx DATAC0 /dev/zero - --testframes ${bursts} --bursts ${bursts} --delay ${delay} | aplay --device="plughw:CARD=CHAT2,DEV=1" -f S16_LE
-}
-
-function start_rx_background {
- arecord --device="plughw:CARD=CHAT2,DEV=0" -f S16_LE -d $MAX_RUN_TIME | freedv_data_raw_rx DATAC0 - /dev/null --framesperburst 1 --vv --testframes &
- echo $!>${PIDFILE_RX}
-}
-
-function stop_service {
- echo "service stopping - bye!" 1>&2
- if [ -e ${PIDFILE_RX} ]; then
- pid_rx=$(cat ${PIDFILE_RX})
- rm ${PIDFILE_RX}
- kill ${pid_rx}
- fi
-
- if [ -e ${PIDFILE_TX} ]; then
- pid_tx=$(cat ${PIDFILE_TX})
- rm ${PIDFILE_TX}
- kill ${pid_tx}
- fi
-}
-
-function check_running {
- if [ -e ${PIDFILE_TX} ]; then
- echo "Tx already running... pid: ${PIDFILE_TX}"
- exit 1
- fi
- if [ -e ${PIDFILE_RX} ]; then
- echo "Rx already running... pid: ${PIDFILE_RX}"
- exit 1
- fi
-}
-
-function check_alsa_loopback {
- lsmod | grep snd_aloop >> /dev/null
- if [ $? -eq 1 ]; then
- echo "ALSA loopback device not present. Please install with:"
- echo
- echo " sudo modprobe snd-aloop index=1,2 enable=1,1 pcm_substreams=1,1 id=CHAT1,CHAT2"
- exit 1
- fi
-}
-
-case "$1" in
- start)
- check_running
- check_alsa_loopback
- ( start_rx_background && sleep 1 && run_tx ${BURSTS} ${DELAY} && stop_service ) 2>${LOGFILE} &
- echo $!>${PIDFILE_TX}
- echo "Results in ${LOGFILE}"
- ;;
- start_verbose)
- set -x
- check_running
- check_alsa_loopback
- # Show all outputs and log output to stderr rather than logfile
- verbose=1
- start_rx_background && sleep 1 && run_tx ${BURSTS} ${DELAY} && stop_service
- ;;
- stop)
- stop_service
- ;;
- restart)
- $0 stop
- $0 start
- ;;
- status)
- if [ -e ${PIDFILE_TX} ]; then
- echo ${NAME} is running, pid=`cat ${PIDFILE_TX}`
- else
- echo ${NAME} is NOT running
- exit 1
- fi
- ;;
- *)
- echo "Usage: $0 {start|start_verbose|stop|restart|status} NumFrames"
- echo " $0 start_verbose 1 - 1 frame packet verbose, logs to stderr"
- echo " $0 start 5 - 5 frames, run as service in background, logs sent to ${LOGFILE}"
-esac
-
-exit 0
diff --git a/unittest/tnc4_high_snr_ping.sh b/unittest/tnc4_high_snr_ping.sh
deleted file mode 100755
index d9bee07..0000000
--- a/unittest/tnc4_high_snr_ping.sh
+++ /dev/null
@@ -1,114 +0,0 @@
-#!/usr/bin/env bash
-# tnc4_high_snr_ping.sh
-#
-# HF TNC use case test 4
-# + Terminal 1 sends frames to Terminal 2
-# + Terminal 2 receives frames and re-transmits them back to Terminal 1
-# + Terminal 1 and 2 count number of frames received (see logfiles)
-# + The modem samples are sent over virtual sound cards, this runs in real time, which
-# can be slow for tests involving many packets. Therefore this test is implemented as a
-# service script.
-
-NAME=tnc4
-CODEC2_PATH=${HOME}/codec2
-PIDFILE_TX1=/tmp/${NAME}_tx1.pid
-PIDFILE_RX1=/tmp/${NAME}_rx1.pid
-PIDFILE_RX2=/tmp/${NAME}_rx2.pid
-LOGFILE1=${NAME}_1.log
-LOGFILE2=${NAME}_2.log
-PATH=${CODEC2_PATH}/build_linux/src:${PATH}
-DELAY="${DELAY:-500}"
-MAX_RUN_TIME=3600
-# in this version we use single frame bursts, so BURSTS==FRAMES
-BURSTS=$2
-MODE=DATAC0
-
-function tx1 {
- freedv_data_raw_tx ${MODE} /dev/zero - --testframes ${BURSTS} --bursts ${BURSTS} --delay ${DELAY} | aplay --device="plughw:CARD=CHAT2,DEV=1" -f S16_LE
-}
-
-function rx2_background {
- # re-transmit any frames we receive
- ( arecord --device="plughw:CARD=CHAT2,DEV=0" -f S16_LE -d $MAX_RUN_TIME | \
- freedv_data_raw_rx ${MODE} - - --framesperburst 1 --vv --testframes | \
- freedv_data_raw_tx ${MODE} - - --delay ${DELAY} | \
- aplay --device="plughw:CARD=CHAT1,DEV=1" -f S16_LE ) 2>${LOGFILE2} &
- # killing arecord kills the entire pipeline
- echo $(pidof arecord)>${PIDFILE_RX2}
-}
-
-function rx1_background {
- arecord --device="plughw:CARD=CHAT1,DEV=0" -f S16_LE -d $MAX_RUN_TIME | freedv_data_raw_rx ${MODE} - /dev/null --framesperburst 1 --vv --testframes &
- echo $!>${PIDFILE_RX1}
-}
-
-function stop_process {
- if [ -e ${1} ]; then
- pid=$(cat ${1})
- rm ${1}
- kill ${pid}
- fi
-}
-
-function stop_service {
- echo "service stopping - bye!" 1>&2
- stop_process ${PIDFILE_RX1}
- stop_process ${PIDFILE_RX2}
- stop_process ${PIDFILE_TX1}
-}
-
-function check_running {
- if [ -e ${PIDFILE_TX1} ]; then
- echo "Tx already running... pid: ${PIDFILE_TX1}"
- exit 1
- fi
- if [ -e ${PIDFILE_RX1} ]; then
- echo "Rx1 already running... pid: ${PIDFILE_RX1}"
- exit 1
- fi
- if [ -e ${PIDFILE_RX2} ]; then
- echo "Rx2 already running... pid: ${PIDFILE_RX2}"
- exit 1
- fi
-}
-
-function check_alsa_loopback {
- lsmod | grep snd_aloop >> /dev/null
- if [ $? -eq 1 ]; then
- echo "ALSA loopback device not present. Please install with:"
- echo
- echo " sudo modprobe snd-aloop index=1,2 enable=1,1 pcm_substreams=1,1 id=CHAT1,CHAT2"
- exit 1
- fi
-}
-
-case "$1" in
- start)
- check_running
- check_alsa_loopback
- rx2_background
- ( rx1_background && sleep 1 && tx1 && sleep 5 && stop_service ) 2>${LOGFILE1} &
- echo $!>${PIDFILE_TX1}
- echo "Results for terminal 1 in ${LOGFILE1} and terminal 2 in ${LOGFILE2}"
- ;;
- stop)
- stop_service
- ;;
- restart)
- $0 stop
- $0 start
- ;;
- status)
- if [ -e ${PIDFILE_TX1} ]; then
- echo ${NAME} is running, pid=`cat ${PIDFILE_TX1}`
- else
- echo ${NAME} is NOT running
- exit 1
- fi
- ;;
- *)
- echo "Usage: $0 {start|start_verbose|stop|restart|status} NumFrames"
- echo " $0 start 5 - test ping over 5 frames; logs sent to ${LOGFILE1} and ${LOGFILE2}"
-esac
-
-exit 0
diff --git a/unittest/tprede.c b/unittest/tprede.c
deleted file mode 100644
index 4d3d09c..0000000
--- a/unittest/tprede.c
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- tpre_de.c
- David Rowe
- Sep 24 2012
-
- Unit test to generate the combined impulse response of pre & de-emphasis filters.
-
- pl("../unittest/out48.raw",1,3000)
- pl("../unittest/out8.raw",1,3000)
-
- Listening to it also shows up anything nasty:
-
- $ play -s -2 -r 48000 out48.raw
- $ play -s -2 -r 8000 out8.raw
-
- */
-
-#include <assert.h>
-#include <math.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include "lpc.h"
-
-#define N 10
-#define F 10
-
-int main() {
- FILE *fprede;
- float Sn[N], Sn_pre[N], Sn_de[N];
- float pre_mem = 0.0, de_mem = 0.0;
- int i, f;
-
- fprede = fopen("prede.txt", "wt");
- assert(fprede != NULL);
-
- for(i=0; i<N; i++)
- Sn[i] = 0.0;
-
- Sn[0]= 1.0;
-
- for(f=0; f<F; f++) {
- pre_emp(Sn_pre, Sn, &pre_mem, N);
- de_emp(Sn_de, Sn_pre, &de_mem, N);
- for(i=0; i<N; i++) {
- fprintf(fprede, "%f\n", Sn_de[i]);
- }
- Sn[0] = 0.0;
- }
-
- fclose(fprede);
-
- return 0;
-}
diff --git a/unittest/tquisk_filter.c b/unittest/tquisk_filter.c
index d6c7529..f31e6bd 100644
--- a/unittest/tquisk_filter.c
+++ b/unittest/tquisk_filter.c
@@ -25,7 +25,6 @@ int main() {
complex float buf[N];
struct quisk_cfFilter *bpf;
int i;
- int n = 0;
bpf = malloc(sizeof(struct quisk_cfFilter));
assert(bpf != NULL);
@@ -39,7 +38,7 @@ int main() {
/* we only output the real part in this test */
for(i=0; i<N; i++)
buf_short[i] = creal(buf[i]);
- n += fwrite(buf_short, sizeof(short), N, stdout);
+ fwrite(buf_short, sizeof(short), N, stdout);
}
quisk_filt_destroy(bpf);
diff --git a/unittest/tst_codec2_fft_init.c b/unittest/tst_codec2_fft_init.c
deleted file mode 100644
index 71ddc38..0000000
--- a/unittest/tst_codec2_fft_init.c
+++ /dev/null
@@ -1,97 +0,0 @@
-/*---------------------------------------------------------------------------*\
-
- FILE........: tst_codec2_fft_init.c,
- AUTHOR......: David Rowe, Don Reid
- DATE CREATED: 30 May 2013, Oct 2018, Feb 2018
-
- Test FFT Window initialization in Codec2_create
-
-\*---------------------------------------------------------------------------*/
-
-/*
- Copyright (C) 2014 David Rowe
-
- All rights reserved.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License version 2.1, as
- published by the Free Software Foundation. This program is
- distributed in the hope that it will be useful, but WITHOUT ANY
- WARRANTY; without even the implied warranty of MERCHANTABILITY or
- FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
- License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <stdint.h>
-#include <math.h>
-
-#include "codec2.h"
-#include "codec2_internal.h"
-#include "defines.h"
-
-#include "machdep.h"
-
-static const float expect_w[] = {
- 0.004293, 0.004301, 0.004309, 0.004315,
- 0.004320, 0.004323, 0.004326, 0.004328,
- 0.004328, 0.004328, 0.004326, 0.004323,
- 0.004320, 0.004315, 0.004309, 0.004301};
-
-
-static const float expect_W[] = {
- -0.002176, 0.002195, 0.004429, -0.008645,
- -0.012196, 0.065359, 0.262390, 0.495616,
- 0.601647, 0.495616, 0.262390, 0.065359,
- -0.012196, -0.008645, 0.004429, 0.002195};
-
-
-int float_cmp(float a, float b) {
- if ( fabsf(a - b) < 1e-6f ) return 1;
- else return 0;
- }
-
-int main(int argc, char *argv[]) {
-
- struct CODEC2 *codec2;
- int i, j;
-
- ////////
- codec2 = codec2_create(CODEC2_MODE_700C);
-
- j = (codec2->c2const.m_pitch / 2) - 8;
- for (i=0; i<16; i++) {
- printf("w[%d] = %f", j+i,
- (double)codec2->w[j+i]);
- if (!float_cmp(codec2->w[j+i], expect_w[i])) {
- printf(" Error, expected %f", (double)expect_w[i]);
- }
- printf("\n");
- }
-
- printf("\n");
-
- j = (FFT_ENC / 2) - 8;
- for (i=0; i<16; i++) {
- printf("W[%d] = %f", j+i,
- (double)codec2->W[j+i]);
- if (!float_cmp(codec2->W[j+i], expect_W[i])) {
- printf(" Error, expected %f", (double)expect_W[i]);
- }
- printf("\n");
- }
-
- codec2_destroy(codec2);
-
- printf("\nEnd of Test\n");
- fclose(stdout);
- fclose(stderr);
-
- return(0);
-}
-
-/* vi:set ts=4 et sts=4: */
diff --git a/misc/vq_mbest.c b/unittest/vq_mbest.c
index a247f61..a247f61 100644
--- a/misc/vq_mbest.c
+++ b/unittest/vq_mbest.c
diff --git a/wav/all.wav b/wav/all.wav
deleted file mode 100644
index ba37838..0000000
--- a/wav/all.wav
+++ /dev/null
Binary files differ
diff --git a/wav/big_dog.wav b/wav/big_dog.wav
deleted file mode 100644
index 22100f4..0000000
--- a/wav/big_dog.wav
+++ /dev/null
Binary files differ
diff --git a/wav/cross.wav b/wav/cross.wav
deleted file mode 100644
index f9f2d04..0000000
--- a/wav/cross.wav
+++ /dev/null
Binary files differ
diff --git a/wav/f2400.wav b/wav/f2400.wav
deleted file mode 100644
index 35c41d9..0000000
--- a/wav/f2400.wav
+++ /dev/null
Binary files differ
diff --git a/wav/forig.wav b/wav/forig.wav
deleted file mode 100644
index 81f3f9f..0000000
--- a/wav/forig.wav
+++ /dev/null
Binary files differ
diff --git a/wav/hts1a.wav b/wav/hts1a.wav
deleted file mode 100644
index f605089..0000000
--- a/wav/hts1a.wav
+++ /dev/null
Binary files differ
diff --git a/wav/hts2a.wav b/wav/hts2a.wav
deleted file mode 100644
index 644b536..0000000
--- a/wav/hts2a.wav
+++ /dev/null
Binary files differ
diff --git a/wav/m2400.wav b/wav/m2400.wav
deleted file mode 100644
index a1fe1a5..0000000
--- a/wav/m2400.wav
+++ /dev/null
Binary files differ
diff --git a/wav/mmt1.wav b/wav/mmt1.wav
deleted file mode 100644
index b0526cb..0000000
--- a/wav/mmt1.wav
+++ /dev/null
Binary files differ
diff --git a/wav/morig.wav b/wav/morig.wav
deleted file mode 100644
index eaf52d1..0000000
--- a/wav/morig.wav
+++ /dev/null
Binary files differ
diff --git a/wav/ve9qrp.wav b/wav/ve9qrp.wav
deleted file mode 100644
index 38454a5..0000000
--- a/wav/ve9qrp.wav
+++ /dev/null
Binary files differ
diff --git a/wav/vk5qi.wav b/wav/vk5qi.wav
deleted file mode 100644
index b1aaed9..0000000
--- a/wav/vk5qi.wav
+++ /dev/null
Binary files differ