From: hobbes1069 Date: Fri, 11 Sep 2015 21:21:26 +0000 (+0000) Subject: Update codec2 0.4 branch to include txt bit fix and tag 0.4.1. X-Git-Url: http://git.whiteaudio.com/gitweb/?a=commitdiff_plain;h=9ce7fc8b0bf2bfc5d8ffaff35ea8a326e857413c;p=freetel-svn-tracking.git Update codec2 0.4 branch to include txt bit fix and tag 0.4.1. git-svn-id: https://svn.code.sf.net/p/freetel/code@2313 01035d8c-6547-0410-b346-abe4f91aad63 --- diff --git a/codec2-dev/CMakeLists.txt b/codec2-dev/CMakeLists.txt index 8c5b00f1..f3d55c66 100644 --- a/codec2-dev/CMakeLists.txt +++ b/codec2-dev/CMakeLists.txt @@ -37,7 +37,7 @@ endif("${CMAKE_SOURCE_DIR}" STREQUAL "${CMAKE_BINARY_DIR}") set(CODEC2_VERSION_MAJOR 0) set(CODEC2_VERSION_MINOR 4) # Set to patch level if needed, otherwise leave FALSE. -set(CODEC2_VERSION_PATCH FALSE) +set(CODEC2_VERSION_PATCH 1) set(CODEC2_VERSION "${CODEC2_VERSION_MAJOR}.${CODEC2_VERSION_MINOR}") # Patch level version bumps should not change API/ABI. set(SOVERSION "${CODEC2_VERSION_MAJOR}.${CODEC2_VERSION_MINOR}") @@ -48,7 +48,7 @@ message(STATUS "codec2 version: ${CODEC2_VERSION}") # Set default build type if(NOT CMAKE_BUILD_TYPE) - set(CMAKE_BUILD_TYPE "Debug") + set(CMAKE_BUILD_TYPE "Release") endif() # Set default C++ flags. @@ -100,7 +100,9 @@ endif(MINGW) option(BUILD_SHARED_LIBS "Build shared library. Set to OFF for static library." ON) # Unittest should be on for dev builds and off for releases. -if(IS_DIRECTORY ${CMAKE_SOURCE_DIR}/unittest) +if(CMAKE_BUILD_TYPE MATCHES "Release") + option(UNITTEST "Build unittest binaries." OFF) +else() option(UNITTEST "Build unittest binaries." ON) endif() option(INSTALL_EXAMPLES "Install example code." OFF) diff --git a/codec2/branches/0.4/CMakeLists.txt b/codec2/branches/0.4/CMakeLists.txt index a88cf810..f3d55c66 100644 --- a/codec2/branches/0.4/CMakeLists.txt +++ b/codec2/branches/0.4/CMakeLists.txt @@ -37,7 +37,7 @@ endif("${CMAKE_SOURCE_DIR}" STREQUAL "${CMAKE_BINARY_DIR}") set(CODEC2_VERSION_MAJOR 0) set(CODEC2_VERSION_MINOR 4) # Set to patch level if needed, otherwise leave FALSE. -set(CODEC2_VERSION_PATCH FALSE) +set(CODEC2_VERSION_PATCH 1) set(CODEC2_VERSION "${CODEC2_VERSION_MAJOR}.${CODEC2_VERSION_MINOR}") # Patch level version bumps should not change API/ABI. set(SOVERSION "${CODEC2_VERSION_MAJOR}.${CODEC2_VERSION_MINOR}") @@ -100,7 +100,9 @@ endif(MINGW) option(BUILD_SHARED_LIBS "Build shared library. Set to OFF for static library." ON) # Unittest should be on for dev builds and off for releases. -if(IS_DIRECTORY ${CMAKE_SOURCE_DIR}/unittest) +if(CMAKE_BUILD_TYPE MATCHES "Release") + option(UNITTEST "Build unittest binaries." OFF) +else() option(UNITTEST "Build unittest binaries." ON) endif() option(INSTALL_EXAMPLES "Install example code." OFF) diff --git a/codec2/branches/0.4/INSTALL b/codec2/branches/0.4/INSTALL index 4500c4c2..bcdcf4c0 100644 --- a/codec2/branches/0.4/INSTALL +++ b/codec2/branches/0.4/INSTALL @@ -8,6 +8,11 @@ NOTES: rely on 'make install' as the packages (RPM & DEB) created by CPack are questionable. +To compile codec2, the packages build-essential and cmake are required. +If they are not installed, at a command prompt, type + +$ sudo apt-get install build-essential cmake + To test the cmake build make a directory anywhere underneath (or outside of) the source directory. diff --git a/codec2/branches/0.4/debian/changelog b/codec2/branches/0.4/debian/changelog new file mode 100644 index 00000000..214efcf9 --- /dev/null +++ b/codec2/branches/0.4/debian/changelog @@ -0,0 +1,5 @@ +codec2 (0.4-150830) unstable; urgency=low + + * Subversion snapshot of tag 0.4. + + -- Stuart Longland Sun, 30 Aug 2015 08:57:09 +1000 diff --git a/codec2/branches/0.4/debian/codec2.doc-base.EX b/codec2/branches/0.4/debian/codec2.doc-base.EX new file mode 100644 index 00000000..58360877 --- /dev/null +++ b/codec2/branches/0.4/debian/codec2.doc-base.EX @@ -0,0 +1,20 @@ +Document: codec2 +Title: Debian codec2 Manual +Author: +Abstract: This manual describes what codec2 is + and how it can be used to + manage online manuals on Debian systems. +Section: unknown + +Format: debiandoc-sgml +Files: /usr/share/doc/codec2/codec2.sgml.gz + +Format: postscript +Files: /usr/share/doc/codec2/codec2.ps.gz + +Format: text +Files: /usr/share/doc/codec2/codec2.text.gz + +Format: HTML +Index: /usr/share/doc/codec2/html/index.html +Files: /usr/share/doc/codec2/html/*.html diff --git a/codec2/branches/0.4/debian/codec2.install b/codec2/branches/0.4/debian/codec2.install new file mode 100644 index 00000000..1df36c61 --- /dev/null +++ b/codec2/branches/0.4/debian/codec2.install @@ -0,0 +1 @@ +usr/bin/* diff --git a/codec2/branches/0.4/debian/codec21.dirs b/codec2/branches/0.4/debian/codec21.dirs new file mode 100644 index 00000000..68457717 --- /dev/null +++ b/codec2/branches/0.4/debian/codec21.dirs @@ -0,0 +1 @@ +usr/lib diff --git a/codec2/branches/0.4/debian/codec21.install b/codec2/branches/0.4/debian/codec21.install new file mode 100644 index 00000000..d0dbfd18 --- /dev/null +++ b/codec2/branches/0.4/debian/codec21.install @@ -0,0 +1 @@ +usr/lib/lib*.so.* diff --git a/codec2/branches/0.4/debian/compat b/codec2/branches/0.4/debian/compat new file mode 100644 index 00000000..ec635144 --- /dev/null +++ b/codec2/branches/0.4/debian/compat @@ -0,0 +1 @@ +9 diff --git a/codec2/branches/0.4/debian/control b/codec2/branches/0.4/debian/control new file mode 100644 index 00000000..de9aa3bf --- /dev/null +++ b/codec2/branches/0.4/debian/control @@ -0,0 +1,36 @@ +Source: codec2 +Priority: optional +Maintainer: Stuart Longland +Build-Depends: debhelper (>= 9), cmake, libspeexdsp-dev +Standards-Version: 3.9.5 +Section: libs +Homepage: http://www.freedv.org + +Package: libcodec2-dev +Section: libdevel +Architecture: any +Depends: libcodec2 (= ${binary:Version}), ${misc:Depends} +Description: Codec 2: ultra-low bitrate voice codec. Headers. + Codec 2 is an ultra-low bitrate (sub 4kbps) voice codec + for use in radio frequency communications applications. + . + This package provides the headers. + +Package: libcodec2 +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends}, libspeexdsp1 +Description: Codec 2: ultra-low bitrate voice codec. Library. + Codec 2 is an ultra-low bitrate (sub 4kbps) voice codec + for use in radio frequency communications applications. + . + This package provides the runtime library. + +Package: codec2 +Architecture: any +Depends: libcodec2 (= ${binary:Version}), ${shlibs:Depends}, ${misc:Depends} +Description: Codec 2: ultra-low bitrate voice codec. Utilities. + Codec 2 is an ultra-low bitrate (sub 4kbps) voice codec + for use in radio frequency communications applications. + . + This package provides some command line utilities for encoding + and decoding codec2. diff --git a/codec2/branches/0.4/debian/copyright b/codec2/branches/0.4/debian/copyright new file mode 100644 index 00000000..598dd85a --- /dev/null +++ b/codec2/branches/0.4/debian/copyright @@ -0,0 +1,38 @@ +Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ +Upstream-Name: codec2 +Source: + +Files: * +Copyright: + +License: + + + . + + +# If you want to use GPL v2 or later for the /debian/* files use +# the following clauses, or change it to suit. Delete these two lines +Files: debian/* +Copyright: 2015 unknown +License: GPL-2+ + This package is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + . + This package 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 General Public License + along with this program. If not, see + . + On Debian systems, the complete text of the GNU General + Public License version 2 can be found in "/usr/share/common-licenses/GPL-2". + +# Please also look if there are files or directories which have a +# different copyright/license attached and list them here. +# Please avoid to pick license terms that are more restrictive than the +# packaged work, as it may make Debian's contributions unacceptable upstream. diff --git a/codec2/branches/0.4/debian/docs b/codec2/branches/0.4/debian/docs new file mode 100644 index 00000000..8e229a37 --- /dev/null +++ b/codec2/branches/0.4/debian/docs @@ -0,0 +1,6 @@ +NEWS +README +README_fdmdv.txt +AUTHORS +ChangeLog +INSTALL diff --git a/codec2/branches/0.4/debian/libcodec2-dev.dirs b/codec2/branches/0.4/debian/libcodec2-dev.dirs new file mode 100644 index 00000000..44188162 --- /dev/null +++ b/codec2/branches/0.4/debian/libcodec2-dev.dirs @@ -0,0 +1,2 @@ +usr/lib +usr/include diff --git a/codec2/branches/0.4/debian/libcodec2-dev.install b/codec2/branches/0.4/debian/libcodec2-dev.install new file mode 100644 index 00000000..41a14144 --- /dev/null +++ b/codec2/branches/0.4/debian/libcodec2-dev.install @@ -0,0 +1 @@ +usr/include/* diff --git a/codec2/branches/0.4/debian/libcodec2.install b/codec2/branches/0.4/debian/libcodec2.install new file mode 100644 index 00000000..f1d0181f --- /dev/null +++ b/codec2/branches/0.4/debian/libcodec2.install @@ -0,0 +1 @@ +usr/lib/* diff --git a/codec2/branches/0.4/debian/rules b/codec2/branches/0.4/debian/rules new file mode 100644 index 00000000..c6cdbe71 --- /dev/null +++ b/codec2/branches/0.4/debian/rules @@ -0,0 +1,24 @@ +#!/usr/bin/make -f +# See debhelper(7) (uncomment to enable) +# output every command that modifies files on the build system. +#DH_VERBOSE = 1 + +# see EXAMPLES in dpkg-buildflags(1) and read /usr/share/dpkg/* +DPKG_EXPORT_BUILDFLAGS = 1 +include /usr/share/dpkg/default.mk + +# see FEATURE AREAS in dpkg-buildflags(1) +#export DEB_BUILD_MAINT_OPTIONS = hardening=+all + +# see ENVIRONMENT in dpkg-buildflags(1) +# package maintainers to append CFLAGS +#export DEB_CFLAGS_MAINT_APPEND = -Wall -pedantic +# package maintainers to append LDFLAGS +#export DEB_LDFLAGS_MAINT_APPEND = -Wl,--as-needed + + +# main packaging script based on dh7 syntax +%: + dh $@ --buildsystem=cmake + + diff --git a/codec2/branches/0.4/debian/source/format b/codec2/branches/0.4/debian/source/format new file mode 100644 index 00000000..163aaf8d --- /dev/null +++ b/codec2/branches/0.4/debian/source/format @@ -0,0 +1 @@ +3.0 (quilt) diff --git a/codec2/branches/0.4/octave/adc_sfdr_ut.m b/codec2/branches/0.4/octave/adc_sfdr_ut.m new file mode 100644 index 00000000..c2363ed9 --- /dev/null +++ b/codec2/branches/0.4/octave/adc_sfdr_ut.m @@ -0,0 +1,28 @@ +% adc_sfdr_ut.m +% David Rowe Aug 2015 +% +% Processes data collected from STM32F4 or SFDR testing of ADC + +s = load_raw("~/stlink/adc.raw"); +Fs = 2E6; +N = 1024; +num_frames = length(s)/N; +h = hanning(N); +XdB = zeros(N/2,1); + +for i=1:num_frames + x = s((i-1)*N+1:i*N); + X = fft(x .* h); + XdB += 20*log10(abs(X(1:N/2))); +end + +XdB /= num_frames; +XdB -= max(XdB); + +figure(1) +plot((0:N/2-1)*Fs/(1000*N), XdB) +grid +ylabel('Amplitude dB') +xlabel('Frequency (kHz)'); +axis([0 Fs/(2*1000) -80 0]) + diff --git a/codec2/branches/0.4/octave/cml.patch b/codec2/branches/0.4/octave/cml.patch new file mode 100644 index 00000000..c7cadd0c --- /dev/null +++ b/codec2/branches/0.4/octave/cml.patch @@ -0,0 +1,24 @@ +diff -ruN -x '*.o' -x '*.dll' -x '*.mex' -x '*.mat' cml-orig/CmlStartup.m cml/CmlStartup.m +--- cml-orig/CmlStartup.m 2007-09-08 23:12:26.000000000 +0930 ++++ cml/CmlStartup.m 2015-09-04 07:21:14.218455223 +0930 +@@ -41,7 +41,7 @@ + addpath( strcat( cml_home, '/mex'), ... + strcat( cml_home, '/mat'), ... + strcat( cml_home, '/matalt' ), ... +- strcat( cml_home, '/mexhelp'), ... ++ %strcat( cml_home, '/mexhelp'), ... + strcat( cml_home, '/demos' ), ... + strcat( cml_home, '/scenarios'), ... + strcat( cml_home, '/localscenarios'),... +@@ -59,4 +59,4 @@ + save_directory = strcat( cml_home, '/scenarios/CmlHome.mat' ); + end + +-save( save_directory, save_flag, 'cml_home' ); +\ No newline at end of file ++save( save_directory, save_flag, 'cml_home' ); +diff -ruN -x '*.o' -x '*.dll' -x '*.mex' -x '*.mat' cml-orig/source/matrix.h cml/source/matrix.h +--- cml-orig/source/matrix.h 1970-01-01 09:30:00.000000000 +0930 ++++ cml/source/matrix.h 2015-09-04 07:06:46.907248420 +0930 +@@ -0,0 +1 @@ ++#include diff --git a/codec2/branches/0.4/octave/ldpc.m b/codec2/branches/0.4/octave/ldpc.m index 7ce4a87a..9a10d93e 100644 --- a/codec2/branches/0.4/octave/ldpc.m +++ b/codec2/branches/0.4/octave/ldpc.m @@ -1,5 +1,18 @@ % ldpc.m -% LDPC functions +% +% David Rowe 2013 +% Octave functions to help us use the CML LDPC code. +% +% Installing CML library +% ---------------------- +% +% $ sudo apt-get install liboctave-dev +% $ wget http://www.iterativesolutions.com/user/image/cml.1.10.zip +% $ unzip cml.1.10.zip +% $ patch < ~/codec2-dev/octave/cml.patch +% $ cd source +% $ octave +% octave:> make 1; diff --git a/codec2/branches/0.4/octave/ldpcut.m b/codec2/branches/0.4/octave/ldpcut.m index 9dfdc94e..f6d787ef 100644 --- a/codec2/branches/0.4/octave/ldpcut.m +++ b/codec2/branches/0.4/octave/ldpcut.m @@ -1,69 +1,157 @@ -% LDPC unit test script +% ldpcut.m +% % David Rowe 18 Dec 2013 -% Based on siulation by Bill Cowley +% +% Octave LDPC unit test script, based on simulation by Bill Cowley VK5DSP +% -% Start CML library +% Start CML library (see CML set up instructions in ldpc.m) currentdir = pwd; addpath '/home/david/tmp/cml/mat' % assume the source files stored here cd /home/david/tmp/cml -CmlStartup % note that this is not in the cml path! +CmlStartup % note that this is not in the cml path! cd(currentdir) % Our LDPC library ldpc; -% Start simulation +function sim_out = run_simulation(sim_in) -rate = 3/4; -framesize = 576; + rate = sim_in.rate; + framesize = sim_in.framesize; + Ntrials = sim_in.Ntrials; + EsNodBvec = sim_in.EsNodBvec; + verbose = sim_in.verbose; + + % Start simulation + + mod_order = 4; + modulation = 'QPSK'; + mapping = 'gray'; + + demod_type = 0; + decoder_type = 0; + max_iterations = 100; + + code_param = ldpc_init(rate, framesize, modulation, mod_order, mapping); + + for ne = 1:length(EsNodBvec) + EsNodB = EsNodBvec(ne); + EsNo = 10^(EsNodB/10); + variance = 1/EsNo; + + Tbits = Terrs = Ferrs = 0; + + tx_bits = []; + tx_symbols = []; + rx_symbols = []; + + % Encode a bunch of frames + + for nn = 1: Ntrials + atx_bits = round(rand( 1, code_param.data_bits_per_frame)); + tx_bits = [tx_bits atx_bits]; + [tx_codeword atx_symbols] = ldpc_enc(atx_bits, code_param); + tx_symbols = [tx_symbols atx_symbols]; + end + + % Add AWGN noise, 0.5 factor ensures var(noise) == variance , i.e. splits power between Re & Im + + noise = sqrt(variance*0.5)*(randn(1,length(tx_symbols)) + j*randn(1,length(tx_symbols))); + rx_symbols = tx_symbols + noise; + + % Decode a bunch of frames + + for nn = 1: Ntrials + st = (nn-1)*code_param.symbols_per_frame + 1; + en = (nn)*code_param.symbols_per_frame; + arx_codeword = ldpc_dec(code_param, max_iterations, demod_type, decoder_type, rx_symbols(st:en), EsNo, ones(1,code_param.symbols_per_frame)); + st = (nn-1)*code_param.data_bits_per_frame + 1; + en = (nn)*code_param.data_bits_per_frame; + error_positions = xor(arx_codeword(1:code_param.data_bits_per_frame), tx_bits(st:en)); + Nerrs = sum( error_positions); + + if verbose == 2 + % print "." if frame decoded without errors, 'x' if we can't decode + + if Nerrs > 0, printf('x'), else printf('.'), end + if (rem(nn, 50)==0), printf('\n'), end + end + + if Nerrs > 0, Ferrs = Ferrs + 1; end + Terrs = Terrs + Nerrs; + Tbits = Tbits + code_param.data_bits_per_frame; + end + + if verbose + printf("\nEsNodB: %3.2f BER: %f Tbits: %d Terrs: %d Ferrs: %d\n", EsNodB, Terrs/Tbits, Tbits, Terrs, Ferrs) + end + + sim_out.Tbits(ne) = Tbits; + sim_out.Terrs(ne) = Terrs; + sim_out.Ferrs(ne) = Ferrs; + sim_out.BER(ne) = Terrs/Tbits; + sim_out.FER(ne) = Ferrs/Ntrials; + end + +endfunction + +% START SIMULATIONS --------------------------------------------------------------- + +more off; + +% 1/ Simplest possible one frame simulation --------------------------------------- + +printf("Test 1\n------\n"); mod_order = 4; modulation = 'QPSK'; mapping = 'gray'; - +framesize = 576; % CML library has a bunch of different framesizes available +rate = 1/2; demod_type = 0; decoder_type = 0; max_iterations = 100; +EsNo = 10; % decoder needs an estimated channel EsNo (linear ratio, not dB) code_param = ldpc_init(rate, framesize, modulation, mod_order, mapping); +tx_bits = round(rand(1, code_param.data_bits_per_frame)); +[tx_codeword, qpsk_symbols] = ldpc_enc(tx_bits, code_param); +rx_codeword = ldpc_dec(code_param, max_iterations, demod_type, decoder_type, qpsk_symbols, EsNo); -Ntrials = 84; -EsNo=10; +errors_positions = xor(tx_bits, rx_codeword(1:framesize*rate)); +Nerr = sum(errors_positions); +printf("Nerr: %d\n\n", Nerr); -Tbits = Terrs = Ferrs = 0; - -data = []; -r = []; - -% Encode a bunch of frames - -for nn = 1: Ntrials - d = round( rand( 1, code_param.data_bits_per_frame ) ); - data = [data d]; - [codeword, s] = ldpc_enc(d, code_param); - code_param.code_bits_per_frame = length(codeword); - code_param.symbols_per_frame = length(s); - r = [r s]; -end - -% Decode a bunch of frames - -for nn = 1: Ntrials - st = (nn-1)*code_param.symbols_per_frame + 1; - en = (nn)*code_param.symbols_per_frame; - detected_data = ldpc_dec(code_param, max_iterations, demod_type, decoder_type, r(st:en), EsNo, ones(1,code_param.symbols_per_frame)); - st = (nn-1)*code_param.data_bits_per_frame + 1; - en = (nn)*code_param.data_bits_per_frame; - error_positions = xor( detected_data(1:code_param.data_bits_per_frame), data(st:en) ); - Nerrs = sum( error_positions); - - if Nerrs>0, fprintf(1,'x'), else fprintf(1,'.'), end - if (rem(nn, 50)==0), fprintf(1,'\n'), end - if Nerrs>0, Ferrs = Ferrs +1; end - Terrs = Terrs + Nerrs; - Tbits = Tbits + code_param.data_bits_per_frame; -end -fprintf(1,'\n') +% 2/ Run a bunch of trials at just one EsNo point -------------------------------------- + +printf("Test 2\n------\n"); + +sim_in.rate = 0.5; +sim_in.framesize = 2*576; +sim_in.verbose = 2; +sim_in.Ntrials = 100; +sim_in.EsNodBvec = 5; +run_simulation(sim_in); + +% 3/ Lets draw a Eb/No versus BER curve ------------------------------------------------- + +printf("\n\nTest 3\n------\n"); + +sim_in.EsNodBvec = -2:10; +sim_out = run_simulation(sim_in); + +EbNodB = sim_in.EsNodBvec - 10*log10(2); % QPSK has two bits/symbol +uncoded_BER_theory = 0.5*erfc(sqrt(10.^(EbNodB/10))); +figure(1) +clf +semilogy(EbNodB, uncoded_BER_theory,'r;uncoded QPSK theory;') +hold on; +semilogy(EbNodB-10*log10(sim_in.rate), sim_out.BER,'g;LDPC coded QPSK simulation;'); +hold off; +grid('minor') +xlabel('Eb/No (dB)') +ylabel('BER') diff --git a/codec2/branches/0.4/octave/newamp.m b/codec2/branches/0.4/octave/newamp.m index c6bc3e9f..7d6a39bb 100644 --- a/codec2/branches/0.4/octave/newamp.m +++ b/codec2/branches/0.4/octave/newamp.m @@ -38,6 +38,19 @@ % [ ] return data for plotting, like slope m % [ ] quantise m +% dealing with UV, BG noise. Prob is flat spectra. When we fit a low +% freq masking model it's formant shaped rather than flat. So we get +% these gaps in spectra that come and go - waterfall noises. In +% particular at low frequencies. Good news is they don't need to be +% quantised too finely. This model has the disadvantage of not having +% variable bandwidths. +% when do waterfall noises appear? +% idea: we could add the ability to have wider bands +% Add some sort of slope or floor +% increase spacing of samples? Like min spacing in bark dimension + +% can we fit a different shape? + function [decmaskdB local_maxima_sort] = make_decmask(maskdB, AmdB, Wo, L, mask_sample_freqs_kHz) % band pass filter: limit search to 250 to 3800 Hz @@ -117,6 +130,123 @@ function [decmaskdB local_maxima_sort] = make_decmask(maskdB, AmdB, Wo, L, mask_ endfunction +% Alternative way to come up with a decimated mask model, using +% analysis by synthesis to determine the best place to put samples. +% Ahh, takes me back to when I was a slip of a speech coder, playing +% with my first CELP codec! + +function [decmaskdB dec_samples error_log candidate_log target_log] = make_decmask_abys(maskdB, AmdB, Wo, L, mask_sample_freqs_kHz) + + % band pass filter: limit search to 250 to 3800 Hz + + %m_st = max(1,floor((pi*250/4000)/Wo)); + %m_en = floor((pi*3800/4000)/Wo); + m_st = 1; + m_en = L; + + target = maskdB; + decmaskdB = zeros(1,L); + dec_samples = []; + error_log = []; + candidate_log = []; + + for sample=1:4 + + target_log = target; + + % find best position for sample to minimise distance to target + + min_mse = 1E32; + for m=m_st:m_en + single_mask_m = schroeder(m*Wo*4/pi, mask_sample_freqs_kHz) + AmdB(m); + candidate = max(decmaskdB, single_mask_m); + error = target - candidate; + mse = sum(abs(error)); % MSE in log domain + error_log = [error_log; error]; + candidate_log = [candidate_log; candidate]; + %printf("m: %d f: %f error: %f\n", m, m*Wo*4/pi, mse); + + too_close = 0; + for x=1:sample-1 + if abs(dec_samples(x,2) - m) < 2 + too_close = 1; + end + end + + if (mse < min_mse) && (too_close == 0) + min_mse = mse; + min_mse_m = m; + min_candidate = candidate; + end + end + + decmaskdB = min_candidate; + dec_samples = [dec_samples; AmdB(min_mse_m) min_mse_m]; + %printf("sample: %d min_mse_m: %d\n", sample, min_mse_m); + end + + if 0 + % add floor to mask - unsuccessful attempt at fixing tinkle noises + min_AmdB = max(dec_samples(:,1)); + decmaskdB = max(decmaskdB, min_AmdB - 20); + end + + % simulate quantisation of amplitudes by adding some noise + + if 0 + masker_amps_dB = dec_samples(:,1); + masker_amps_dB += 3*(1 - 2*rand(4,1)); + masker_freqs_kHz = dec_samples(:,2)*Wo*4/pi; + decmaskdB = determine_mask(masker_amps_dB, masker_freqs_kHz, mask_sample_freqs_kHz); + end + + % quantisation of amplitudes. Determine and subtract mean. Quantise difference + % from mean to 4 levels (2 bits), at 6dB/level: + % + % Level + % 0 -9 + % 1 -3 + % 2 +3 + % 3 +9 + + if 0 + masker_amps_dB = dec_samples(:,1); + masker_freqs_kHz = dec_samples(:,2)*Wo*4/pi; + + energy_dB = mean(masker_amps_dB); + masker_amps_dB -= energy_dB; + for i=1:4 + masker_amps_dB(i) = quantise([-9 -3 3 9], masker_amps_dB(i)); + end + masker_amps_dB += energy_dB; + decmaskdB = determine_mask(masker_amps_dB, masker_freqs_kHz, mask_sample_freqs_kHz); + end + + % fit straight line to amplitudes (sounds bad, still a bug somewhere) + + if 0 + [gradient intercept] = linreg(dec_samples(:,2), dec_samples(:,1), 4); + masker_amps_dB = dec_samples(:,2)*gradient + intercept; + masker_freqs_kHz = dec_samples(:,2)*Wo*4/pi; + decmaskdB = determine_mask(masker_amps_dB, masker_freqs_kHz, mask_sample_freqs_kHz); + end +endfunction + + +% quantise input sample to nearest value in table + +function quant_out = quantise(levels, quant_in) + best_se = 1E32; + for i=1:length(levels) + se = (levels(i) - quant_in)^2; + if se < best_se + quant_out = levels(i); + best_se = se; + end + end +endfunction + + % determine cumulative mask, using amplitude of each harmonic. Mask is % sampled across L points in the linear domain @@ -131,19 +261,12 @@ function maskdB = determine_mask(masker_amps_dB, masker_freqs_kHz, mask_sample_f end -% Sample mask as model for Am, tweaked a bit to enhance -% the formants:antiformant radtio, like the LPC postfilter +% Sample mask as model for Am -function [maskdB_pf Am_freqs_kHz peaks_kHz] = mask_model(AmdB, Wo, L) +function [maskdB Am_freqs_kHz] = mask_model(AmdB, Wo, L) Am_freqs_kHz = (1:L)*Wo*4/pi; maskdB = determine_mask(AmdB, Am_freqs_kHz, Am_freqs_kHz); - non_masked_m = find(maskdB < AmdB); - peaks_kHz = non_masked_m*Wo*4/pi; - maskdB_pf = maskdB; - %maskdB_pf = zeros(1,L); - %maskdB_pf(non_masked_m) = maskdB(non_masked_m) + 6; - endfunction @@ -166,14 +289,19 @@ function maskdB = schroeder(freq_tone_kHz, mask_sample_freqs_kHz, modified_bark_ % beneath 1.5kHz wider to match the width of F1 and % "fill in" the spectra better for UV sounds. - if freq_tone_kHz <= 0.5 - y = 0.5; + x1 = 0.5; x2 = 1.5; + y1 = 0.5; y2 = 1; + grad = (y2 - y1)/(x2 - x1); + y_int = y1 - grad*x1; + + if freq_tone_kHz <= x1 + y = y1; end - if (freq_tone_kHz > 0.5) && (freq_tone_kHz < 1.5) - y = 0.5*freq_tone_kHz + 0.25; + if (freq_tone_kHz > x1) && (freq_tone_kHz < x2) + y = grad*freq_tone_kHz + y_int; end - if freq_tone_kHz >= 1.5 - y = 1; + if freq_tone_kHz >= x2 + y = y2; end dz = y*(bark(freq_tone_kHz*1000) - bark(f_Hz)); else @@ -192,6 +320,16 @@ function b=bark(f) endfunction +% -12dB/octave mask to model speech articulation + +function maskdB = resonator(freq_tone_kHz, mask_sample_freqs_kHz) + maskdB = zeros(1, length(mask_sample_freqs_kHz)); + for m=1:length(mask_sample_freqs_kHz) + maskdB(m) = -24*abs(log2(freq_tone_kHz/mask_sample_freqs_kHz(m))); + %printf("m: %d ft: %f fm: %f ft/fm: %f maskdB: %f\n", m, freq_tone_kHz, mask_sample_freqs_kHz(m), freq_tone_kHz/mask_sample_freqs_kHz(m), maskdB(m)); + end +endfunction + % plot some masking curves, used for working on masking filter changes function plot_masking @@ -199,26 +337,27 @@ function plot_masking figure(1) mask_sample_freqs_kHz = 0.1:0.1:(Fs/1000)/2; - maskdB = schroeder(0.5, mask_sample_freqs_kHz, 0); - plot(mask_sample_freqs_kHz, maskdB); + maskdB_cb = schroeder(0.5, mask_sample_freqs_kHz, 1); + plot(mask_sample_freqs_kHz, maskdB_cb); hold on; - maskdB = schroeder(0.5, mask_sample_freqs_kHz, 1); - plot(mask_sample_freqs_kHz, maskdB,'g'); - - for f=1:0.5:3 - maskdB = schroeder(f, mask_sample_freqs_kHz, 0); - plot(mask_sample_freqs_kHz, maskdB); - maskdB = schroeder(f, mask_sample_freqs_kHz, 1); - plot(mask_sample_freqs_kHz, maskdB,'g'); + maskdB_res = resonator(0.5, mask_sample_freqs_kHz); + plot(mask_sample_freqs_kHz, maskdB_res,'g'); + + for f=0.5:0.5:3 + maskdB_cb = schroeder(f, mask_sample_freqs_kHz, 1); + plot(mask_sample_freqs_kHz, maskdB_cb); + maskdB_res = resonator(f, mask_sample_freqs_kHz); + plot(mask_sample_freqs_kHz, maskdB_res,'g'); end hold off; axis([0.1 4 -30 0]) + grid figure(2) - plot(mask_sample_freqs_kHz, bark(mask_sample_freqs_kHz*1000)) - hold on; - plot(mask_sample_freqs_kHz, modified_bark(mask_sample_freqs_kHz*1000),'g') - hold off; + clf; + w = pi/4; beta = 0.9; + X = freqz(1,[1 -2*beta*cos(w) beta*beta],4000); + plot(10*log10(abs(X))) grid endfunction diff --git a/codec2/branches/0.4/octave/newamp_batch.m b/codec2/branches/0.4/octave/newamp_batch.m index 62db3779..715ca1e7 100644 --- a/codec2/branches/0.4/octave/newamp_batch.m +++ b/codec2/branches/0.4/octave/newamp_batch.m @@ -15,36 +15,58 @@ % process a whole file and write results -function newamp_batch(samname) +function newamp_batch(samname, optional_Am_out_name) newamp; more off; + max_amp = 80; + use_decmask = 1; + postfilter_en = 1; + decimate = 1; + model_name = strcat(samname,"_model.txt"); model = load(model_name); [frames nc] = size(model); - max_amp = 80; - Am_out_name = sprintf("%s_am.out", samname); + if nargin == 1 + Am_out_name = sprintf("%s_am.out", samname); + end + if nargin == 2 + Am_out_name = optional_Am_out_name; + end + fam = fopen(Am_out_name,"wb"); for f=1:frames - + printf("\rframe: %d", f); L = min([model(f,2) max_amp-1]); Wo = model(f,1); Am = model(f,3:(L+2)); + AmdB = 20*log10(Am); - maskdB = mask_model(AmdB, Wo, L); + % find mask and decimated mask + mask_sample_freqs_kHz = (1:L)*Wo*4/pi; - [newmaskdB local_maxima] = make_decmask(maskdB, AmdB, Wo, L, mask_sample_freqs_kHz); + maskdB = mask_model(AmdB, Wo, L); + [decmaskdB decmasksamples] = make_decmask_abys(maskdB, AmdB, Wo, L, mask_sample_freqs_kHz); - [nlm tmp] = size(local_maxima); - non_masked_m = local_maxima(1:min(4,nlm),2); + if use_decmask + non_masked_m = decmasksamples(:,2); + maskdB_ = decmaskdB; + else + maskdB_ = maskdB; + non_masked_m = find(AmdB > maskdB); + end % post filter - bump up samples by 6dB, reduce mask by same level to normalise gain - maskdB_pf = newmaskdB - 6; - maskdB_pf(non_masked_m) = maskdB_pf(non_masked_m) + 6; + if postfilter_en + maskdB_pf = maskdB_ - 6; + maskdB_pf(non_masked_m) = maskdB_pf(non_masked_m) + 6; + else + maskdB_pf = maskdB_; + end if 0 % Early work as per blog post part 1 @@ -59,13 +81,13 @@ function newamp_batch(samname) end Am_ = zeros(1,max_amp); - Am_(2:L) = 10 .^ (maskdB_pf(1:L-1)/20); - - % save to file + Am_(2:L) = 10 .^ (maskdB_pf(1:L-1)/20); % C array doesnt use A[0] fwrite(fam, Am_, "float32"); end fclose(fam); + printf("\n"); + endfunction diff --git a/codec2/branches/0.4/octave/newamp_fbf.m b/codec2/branches/0.4/octave/newamp_fbf.m index 44a16cef..04050323 100644 --- a/codec2/branches/0.4/octave/newamp_fbf.m +++ b/codec2/branches/0.4/octave/newamp_fbf.m @@ -14,6 +14,7 @@ function newamp_fbf(samname, f) + more off; newamp; sn_name = strcat(samname,"_sn.txt"); @@ -51,7 +52,7 @@ function newamp_fbf(samname, f) plot((0:255)*4000/256, Sw(f,:),";Sw;"); [maskdB Am_freqs_kHz] = mask_model(AmdB, Wo, L); - %plot(Am_freqs_kHz*1000, maskdB, 'g'); + plot(Am_freqs_kHz*1000, maskdB, 'g'); % optionally show harmonics that are not masked @@ -72,7 +73,7 @@ function newamp_fbf(samname, f) % estimate low rate samples mask_sample_freqs_kHz = (1:L)*Wo*4/pi; - [decmaskdB local_maxima] = make_decmask(maskdB, AmdB, Wo, L, mask_sample_freqs_kHz); + [decmaskdB local_maxima error_log candidate_log target_log] = make_decmask_abys(maskdB, AmdB, Wo, L, mask_sample_freqs_kHz); [nlm tmp] = size(local_maxima(:,2)); nlm = min(nlm,4); @@ -99,6 +100,15 @@ function newamp_fbf(samname, f) hold off; + figure(3) + plot(target_log,'g') + hold on; + plot(candidate_log(3,:),'b'); + plot(candidate_log(5,:),'b'); + plot(error_log(3,:),'r'); + plot(error_log(5,:),'r'); + hold off; + % interactive menu printf("\rframe: %d menu: n-next b-back p-png q-quit m-all", f); diff --git a/codec2/branches/0.4/src/codec2.c b/codec2/branches/0.4/src/codec2.c index a41827e0..56cea011 100644 --- a/codec2/branches/0.4/src/codec2.c +++ b/codec2/branches/0.4/src/codec2.c @@ -277,10 +277,12 @@ void codec2_encode(struct CODEC2 *c2, unsigned char *bits, short speech[]) codec2_encode_1300(c2, bits, speech); if (c2->mode == CODEC2_MODE_1200) codec2_encode_1200(c2, bits, speech); +#ifndef CORTEX_M4 if (c2->mode == CODEC2_MODE_700) codec2_encode_700(c2, bits, speech); if (c2->mode == CODEC2_MODE_700B) codec2_encode_700b(c2, bits, speech); +#endif } void codec2_decode(struct CODEC2 *c2, short speech[], const unsigned char *bits) @@ -314,10 +316,12 @@ void codec2_decode_ber(struct CODEC2 *c2, short speech[], const unsigned char *b codec2_decode_1300(c2, speech, bits, ber_est); if (c2->mode == CODEC2_MODE_1200) codec2_decode_1200(c2, speech, bits); +#ifndef CORTEX_M4 if (c2->mode == CODEC2_MODE_700) codec2_decode_700(c2, speech, bits); if (c2->mode == CODEC2_MODE_700B) codec2_decode_700b(c2, speech, bits); +#endif } @@ -1334,6 +1338,7 @@ void codec2_decode_1200(struct CODEC2 *c2, short speech[], const unsigned char * } +#ifndef CORTEX_M4 /*---------------------------------------------------------------------------*\ FUNCTION....: codec2_encode_700 @@ -1741,7 +1746,7 @@ void codec2_decode_700b(struct CODEC2 *c2, short speech[], const unsigned char * for(i=0; iprev_lsps_dec[i] = lsps[3][i]; } - +#endif /*---------------------------------------------------------------------------*\ @@ -1915,7 +1920,7 @@ int codec2_get_spare_bit_index(struct CODEC2 *c2) return 26; // bits 26 and 27 are spare break; case CODEC2_MODE_700B: - return 26; // bits 26 and 27 are spare + return 27; // bit 27 is spare break; } diff --git a/codec2/branches/0.4/src/freedv_api.c b/codec2/branches/0.4/src/freedv_api.c index 06058604..e8e62c8c 100644 --- a/codec2/branches/0.4/src/freedv_api.c +++ b/codec2/branches/0.4/src/freedv_api.c @@ -41,8 +41,10 @@ #include "freedv_api_internal.h" #include "comp_prim.h" -#define VERSION 10 /* The API version number. The first version is 10. Increment if the API changes - in a way that would require changes by the API user. */ +#define VERSION 10 /* The API version number. The first version + is 10. Increment if the API changes in a + way that would require changes by the API + user. */ /* * Version 10 Initial version August 2, 2015. * Version 11 September @@ -107,6 +109,7 @@ struct freedv *freedv_open(int mode) { f->sz_error_pattern = fdmdv_error_pattern_size(f->fdmdv); } +#ifndef CORTEX_M4 if ((mode == FREEDV_MODE_700) || (mode == FREEDV_MODE_700B)) { f->snr_squelch_thresh = 0.0; f->squelch_en = 0; @@ -126,6 +129,7 @@ struct freedv *freedv_open(int mode) { return NULL; f->sz_error_pattern = cohpsk_error_pattern_size(); } +#endif f->test_frame_sync_state = 0; f->total_bits = 0; @@ -183,8 +187,10 @@ void freedv_close(struct freedv *freedv) { free(freedv->tx_bits); if (freedv->mode == FREEDV_MODE_1600) fdmdv_destroy(freedv->fdmdv); +#ifndef CORTEX_M4 if (freedv->mode == FREEDV_MODE_700) cohpsk_destroy(freedv->cohpsk); +#endif codec2_destroy(freedv->codec2); free(freedv); } @@ -195,28 +201,40 @@ void freedv_close(struct freedv *freedv) { AUTHOR......: David Rowe DATE CREATED: 3 August 2014 - Takes a frame of input speech samples, encodes and modulates them to produce - a frame of modem samples that can be sent to the transmitter. + Takes a frame of input speech samples, encodes and modulates them to + produce a frame of modem samples that can be sent to the + transmitter. See freedv_tx.c for an example. - speech_in[] is sampled at 8 kHz, the user must supply - f->n_speech_samples. The speech_in[] level should be such that the - peak speech level is between +/16384 and +/- 32767. + speech_in[] is sampled at 8000 Hz, and the user must supply a block + of exactly freedv_get_n_speech_samples(). The speech_in[] level + should be such that the peak speech level is between +/- 16384 and + +/- 32767. - The FDM modem signal mod_out[] is sampled at f->modem_sample_rate - and is f->n_modem_samples long. mod_out[] will be scaled such that - the peak level is just less than +/-32767. + The FDM modem signal mod_out[] is sampled at + freedv_get_modem_sample_rate() Hz and is + freedv_get_n_nom_modem_samples() long. mod_out[] will be scaled + such that the peak level is just less than +/-32767. + + Note that freedv_get_modem_sample_rate() is 8000 Hz for 1600 mode + but 7500 Hz for 700 and 700B mode. You must convert sample rates as + required. + + The complex-valued output can directly drive an I/Q modulator to + produce a single sideband signal. To generate the other sideband, + take the complex conjugate of mod_out[]. The FreeDV 1600 modem has a high crest factor (around 12dB), however the energy and duration of the peaks is small. FreeDV 1600 is - usually operated at a "backoff" of 8dB. Adjust the power - amplifier drive so that the average power is 8dB less than the - peak power of the PA. For example, on a radio rated at 100W PEP for - SSB, the average FreeDV power is typically 20W. + usually operated at a "backoff" of 8dB. Adjust the power amplifier + drive so that the average power is 8dB less than the peak power of + the PA. For example, on a radio rated at 100W PEP for SSB, the + average FreeDV power is typically 20W. - The FreeDV 900 modem has a crest factor of about 5dB (with f->clip=1, the - default), so if your PA can handle it, it can be driven harder than - FreeDV 1600. Caution - some PAs cannot handle a high continuous - power. A conservative level is 20W average for a 100W PEP rated PA. + The FreeDV 700 modem has a crest factor of about 8dB (with + f->clip=1, the default), so if your PA can handle it, it can be + driven harder than FreeDV 1600. Caution - some PAs cannot handle a + high continuous power. A conservative level is 20W average for a + 100W PEP rated PA. \*---------------------------------------------------------------------------*/ @@ -335,6 +353,7 @@ void freedv_comptx(struct freedv *f, COMP mod_out[], short speech_in[]) { } +#ifndef CORTEX_M4 if ((f->mode == FREEDV_MODE_700) || (f->mode == FREEDV_MODE_700B)) { bits_per_codec_frame = codec2_bits_per_frame(f->codec2); bits_per_modem_frame = COHPSK_BITS_PER_FRAME; @@ -399,6 +418,7 @@ void freedv_comptx(struct freedv *f, COMP mod_out[], short speech_in[]) { for(i=0; in_nom_modem_samples; i++) mod_out[i] = fcmult(FDMDV_SCALE*NORM_PWR, tx_fdm[i]); } +#endif } int freedv_nin(struct freedv *f) { @@ -411,33 +431,43 @@ int freedv_nin(struct freedv *f) { AUTHOR......: David Rowe DATE CREATED: 3 August 2014 - Takes a frame of samples from the radio receiver, demodulates them, - then decodes them, producing a frame of decoded speech samples. + Takes a frame of samples from the radio receiver, demodulates and + decodes them, producing a frame of decoded speech samples. See + freedv_rx.c for an example. - Both demod_in[] and speech_out[] are 16 bit shorts sampled at 8 kHz. - The peak level of demod_in[] is not critical, as the demod works - well over a wide range of amplitude scaling. However it is best to - avoid clipping (overload, or samples pinned to +/- 32767). Suggest - scaling so the peak (modem signal plus noise) is between +/-16384 - and +/-32767. speech_out[] will peak at just less than +/-32767. + demod_in[] is a variable length block of received samples at the + modem sample rate given by freedv_get_n_max_modem_samples(). To + account for difference in the transmit and receive sample clock + frequencies, the number of demod_in[] samples is time varying. You + MUST call freedv_nin() BEFORE each call to freedv_rx() and pass + exactly that many samples to this function. + + To help set your buffer sizes, The maximum value of freedv_nin() is + freedv_get_n_max_modem_samples(). - To account for difference in the transmit and receive sample clock - frequencies, the number of demod_in[] samples is time varying. It - is the responsibility of the caller to supply the correct number of - samples. Call freedv_nin() before each call to freedv_rx() to - determine how many samples to pass to this function (see example). + freedv_rx() returns the number of output speech samples available in + speech_out[], which is sampled at 8000 Hz. You should ALWAYS check + the return value of freedv_rx(), and read EXACTLY that number of + speech samples from speech_out[]. - The maximum vlaue of freedv_nin is set by f->n_max_modem_samples, - allocate this much storage to your buffers. + 1600 mode: When out of sync, it the number of output speech samples + returned will be freedv_nin(). When in sync to a valid FreeDV 1600 + signal, the number of output speech samples will alternate between + freedv_get_n_speech_samples() and 0. - Returns the number of output speech samples available in - speech_out[]. When in sync this will typically alternate between 0 - and f->n_speech_samples. When out of sync, this will be f->nin. + 700 and 700B mode: The number of output speech samples returned will + is always be freedv_get_n_speech_samples(), regardless of sync. + + The peak level of demod_in[] is not critical, as the demod works + well over a wide range of amplitude scaling. However avoid clipping + (overload, or samples pinned to +/- 32767). speech_out[] will peak + at just less than +/-32767. When out of sync, this function echoes the demod_in[] samples to speech_out[]. This allows the user to listen to the channel, which is useful for tuning FreeDV signals or reception of non-FreeDV - signals. + signals. Setting the squelch with freedv_set_squelch_en(1) will + return zero-valued samples instead. \*---------------------------------------------------------------------------*/ @@ -653,6 +683,7 @@ int freedv_comprx(struct freedv *f, short speech_out[], COMP demod_in[]) { } +#ifndef CORTEX_M4 if ((f->mode == FREEDV_MODE_700) || (f->mode == FREEDV_MODE_700B)) { float rx_bits[COHPSK_BITS_PER_FRAME]; int sync; @@ -781,9 +812,9 @@ int freedv_comprx(struct freedv *f, short speech_out[], COMP demod_in[]) { //fprintf(stderr, "%d %d %d\n", f->n_speech_samples, speech_out[0], speech_out[nin_prev-1]); } } - } +#endif //fprintf(stderr,"f->stats.sync: %d reliable_sync_bit: %d evenframe: %d nout: %d\n", f->stats.sync, reliable_sync_bit, f->evenframe, nout); return nout; @@ -845,8 +876,10 @@ void freedv_get_modem_stats(struct freedv *f, int *sync, float *snr_est) { if (f->mode == FREEDV_MODE_1600) fdmdv_get_demod_stats(f->fdmdv, &f->stats); +#ifndef CORTEX_M4 if (f->mode == FREEDV_MODE_700) cohpsk_get_demod_stats(f->cohpsk, &f->stats); +#endif if (sync) *sync = f->stats.sync; if (snr_est) *snr_est = f->stats.snr_est; } @@ -865,6 +898,7 @@ void freedv_get_modem_stats(struct freedv *f, int *sync, float *snr_est) // Set integers void freedv_set_test_frames (struct freedv *f, int val) {f->smooth_symbols = val;} void freedv_set_squelch_en (struct freedv *f, int val) {f->squelch_en = val;} +void freedv_zero_total_bit_errors (struct freedv *f) {f->total_bit_errors = 0;} // Set floats void freedv_set_snr_squelch_thresh (struct freedv *f, float val) {f->snr_squelch_thresh = val;} @@ -882,9 +916,11 @@ void freedv_set_snr_squelch_thresh (struct freedv *f, float val) {f->snr_squelc // Get integers int freedv_get_test_frames (struct freedv *f) {return f->test_frames;} int freedv_get_n_speech_samples (struct freedv *f) {return f->n_speech_samples;} +int freedv_get_modem_sample_rate (struct freedv *f) {return f->modem_sample_rate;} int freedv_get_n_max_modem_samples (struct freedv *f) {return f->n_max_modem_samples;} int freedv_get_n_nom_modem_samples (struct freedv *f) {return f->n_nom_modem_samples;} int freedv_get_total_bits (struct freedv *f) {return f->total_bits;} int freedv_get_total_bit_errors (struct freedv *f) {return f->total_bit_errors;} +int freedv_get_sync (struct freedv *f) {return f->stats.sync;} // Get floats diff --git a/codec2/branches/0.4/src/freedv_api.h b/codec2/branches/0.4/src/freedv_api.h index 7f1825c0..efb87b91 100644 --- a/codec2/branches/0.4/src/freedv_api.h +++ b/codec2/branches/0.4/src/freedv_api.h @@ -69,10 +69,13 @@ int freedv_get_version(void); void freedv_get_modem_stats(struct freedv *freedv, int *sync, float *snr_est); int freedv_get_test_frames (struct freedv *freedv); int freedv_get_n_speech_samples (struct freedv *freedv); +int freedv_get_modem_sample_rate (struct freedv *freedv); int freedv_get_n_max_modem_samples (struct freedv *freedv); int freedv_get_n_nom_modem_samples (struct freedv *freedv); int freedv_get_total_bits (struct freedv *freedv); int freedv_get_total_bit_errors (struct freedv *freedv); +void freedv_zero_total_bit_errors (struct freedv *freedv); +int freedv_get_sync (struct freedv *freedv); #endif #ifdef __cplusplus diff --git a/codec2/branches/0.4/src/lpc.c b/codec2/branches/0.4/src/lpc.c index 4622dc37..bfe33050 100644 --- a/codec2/branches/0.4/src/lpc.c +++ b/codec2/branches/0.4/src/lpc.c @@ -42,7 +42,7 @@ Pre-emphasise (high pass filter with zero close to 0 Hz) a frame of speech samples. Helps reduce dynamic range of LPC spectrum, giving - greater weight and hensea better match to low energy formants. + greater weight and hense a better match to low energy formants. Should be balanced by de-emphasis of the output speech. @@ -69,7 +69,7 @@ void pre_emp( de_emp() - De-emphasis filter (low pass filter with polse close to 0 Hz). + De-emphasis filter (low pass filter with a pole close to 0 Hz). \*---------------------------------------------------------------------------*/ diff --git a/codec2/branches/0.4/src/quantise.c b/codec2/branches/0.4/src/quantise.c index c7222800..fe1ebe78 100644 --- a/codec2/branches/0.4/src/quantise.c +++ b/codec2/branches/0.4/src/quantise.c @@ -65,6 +65,7 @@ int lspd_bits(int i) { return lsp_cbd[i].log2m; } +#ifndef CORTEX_M4 int mel_bits(int i) { return mel_cb[i].log2m; } @@ -72,6 +73,7 @@ int mel_bits(int i) { int lspmelvq_cb_bits(int i) { return lspmelvq_cb[i].log2m; } +#endif #ifdef __EXPERIMENTAL__ int lspdt_bits(int i) { @@ -539,6 +541,7 @@ void lspjvm_quantise(float *x, float *xq, int order) } +#ifndef CORTEX_M4 /* simple (non mbest) 6th order LSP MEL VQ quantiser. Returns MSE of result */ float lspmelvq_quantise(float *x, float *xq, int order) @@ -781,6 +784,7 @@ void lspmelvq_decode(int *indexes, float *xq, int ndim) xq[i] = codebook1[ndim*n1+i] + codebook2[ndim*n2+i] + codebook3[ndim*n3+i]; } } +#endif int check_lsp_order(float lsp[], int order) @@ -1366,6 +1370,8 @@ void decode_lsps_scalar(float lsp[], int indexes[], int order) } +#ifndef CORTEX_M4 + /*---------------------------------------------------------------------------*\ FUNCTION....: encode_mels_scalar() @@ -1433,6 +1439,7 @@ void decode_mels_scalar(float mels[], int indexes[], int order) } +#endif #ifdef __EXPERIMENTAL__ diff --git a/codec2/branches/0.4/stm32/Makefile b/codec2/branches/0.4/stm32/Makefile index 95b9316b..ba9ceeb1 100644 --- a/codec2/branches/0.4/stm32/Makefile +++ b/codec2/branches/0.4/stm32/Makefile @@ -6,14 +6,14 @@ FLOAT_TYPE=hard ################################################### -BINPATH=/opt/gcc-arm-none-eabi-4_7-2013q1/bin -CC=$(BINPATH)/arm-none-eabi-gcc -OBJCOPY=$(BINPATH)/arm-none-eabi-objcopy -SIZE=$(BINPATH)/arm-none-eabi-size +BINPATH= +CC=$(BINPATH)arm-none-eabi-gcc +OBJCOPY=$(BINPATH)arm-none-eabi-objcopy +SIZE=$(BINPATH)arm-none-eabi-size ################################################### -CFLAGS = -std=gnu99 -O0 -g -Wall -Tstm32_flash.ld -DSTM32F4XX -DCORTEX_M4 +CFLAGS = -std=gnu99 -O0 -g -Wall -Tstm32_flash.ld -DSTM32F40_41xxx -DCORTEX_M4 CFLAGS += -mlittle-endian -mthumb -mthumb-interwork -nostartfiles -mcpu=cortex-m4 ifeq ($(FLOAT_TYPE), hard) @@ -30,7 +30,7 @@ endif PERIPHLIBURL = http://www.st.com/st-web-ui/static/active/en/st_prod_software_internet/resource/technical/software/firmware/ PERIPHLIBZIP = stm32f4_dsp_stdperiph_lib.zip -PERIPHLIBVER = V1.5.0 +PERIPHLIBVER = V1.4.0 PERIPHLIBNAME = STM32F4xx_DSP_StdPeriph_Lib PERIPHLIBDIR = $(PERIPHLIBNAME) CMSIS = $(PERIPHLIBDIR)/Libraries/CMSIS @@ -79,7 +79,7 @@ CFLAGS += -I../unittest CFLAGS += -Iinc FFT_TEST_SRCS = \ -$(DSPLIB)/Examples/arm_fft_bin_example/ARM/arm_fft_bin_data.c \ +$(DSPLIB)/Examples/arm_fft_bin_example/arm_fft_bin_data.c \ fft_test.c \ src/startup_stm32f4xx.s \ stm32f4_machdep.c \ @@ -109,7 +109,7 @@ OBJS = $(SRCS:.c=.o) ################################################### -all: libstm32f4.a codec2_profile.elf fft_test.elf dac_ut.elf dac_play.elf adc_rec.elf pwm_ut.elf fdmdv_profile.elf sm1000_leds_switches_ut.elf sm1000.elf adcdac_ut.elf freedv_tx_profile.elf freedv_rx_profile.elf adc_sd.elf usb_vcp_ut.elf fdmdv_dump_rt.elf tuner_ut.elf fast_dac_ut.elf +all: libstm32f4.a codec2_profile.elf fft_test.elf dac_ut.elf dac_play.elf adc_rec.elf pwm_ut.elf fdmdv_profile.elf sm1000_leds_switches_ut.elf sm1000.elf adcdac_ut.elf freedv_tx_profile.elf freedv_rx_profile.elf adc_sd.elf usb_vcp_ut.elf tuner_ut.elf fast_dac_ut.elf adc_sfdr_ut.elf dl/$(PERIPHLIBZIP): mkdir -p dl @@ -117,7 +117,7 @@ dl/$(PERIPHLIBZIP): $(PERIPHLIBDIR): dl/$(PERIPHLIBZIP) cd dl; unzip $(PERIPHLIBZIP) - mv dl/$(PERIPHLIBDIR) $(PERIPHLIBDIR) + mv dl/$(PERIPHLIBDIR)_$(PERIPHLIBVER) $(PERIPHLIBDIR) libstm32f4.a: $(PERIPHLIBDIR) $(MAKE) $(STM32F4TEMPLATE)/system_stm32f4xx.o @@ -390,6 +390,29 @@ tuner_ut.elf: $(TUNER_UT_SRCS) src/stm32f4_adc_tuner.o $(CC) $(CFLAGS) -O3 $^ -o $@ $(LIBPATHS) $(LIBS) $(OBJCOPY) -O binary tuner_ut.elf tuner_ut.bin +# --------------------------------------------------------------------------- + +ADC_SFDR_UT_SRCS=\ +src/adc_sfdr_ut.c \ +gdb_stdio.c \ +../src/fifo.c \ +src/iir_tuner.c \ +src/sm1000_leds_switches.c \ +src/debugblinky.c \ +src/system_stm32f4xx.c \ +src/startup_stm32f4xx.s \ +src/init.c \ + +# this needs to be compiled without the optimiser or ugly things happen +# would be nice to work out why as ISRs need to run fast + +src/stm32f4_adc_tuner.o: src/stm32f4_adc_tuner.c + $(CC) $(CFLAGS) $^ -c -o $@ + +adc_sfdr_ut.elf: $(ADC_SFDR_UT_SRCS) src/stm32f4_adc_tuner.o + $(CC) $(CFLAGS) -O3 $^ -o $@ $(LIBPATHS) $(LIBS) + $(OBJCOPY) -O binary adc_sfdr_ut.elf adc_sfdr_ut.bin + # --------------------------------------------------------------------------------- clean: diff --git a/codec2/branches/0.4/stm32/README.txt b/codec2/branches/0.4/stm32/README.txt index 82eda8b0..aa0572b4 100644 --- a/codec2/branches/0.4/stm32/README.txt +++ b/codec2/branches/0.4/stm32/README.txt @@ -1,14 +1,38 @@ README.txt codec2 support for the stm32f4 -David Rowe May 2013 +David Rowe August 2015 -Introduction ------------- +Quickstart +========== -The Makefile generates several unit tests, stm32f4_codec2.elf is the -most important. It's is equivalent to c2demo.c and runs the encoder -and decoder on raw speech files. It also gathers and prints profiling -information and can dump the codec states to compare changes. +The Makefile generates several programs used in Codec 2 development on +the STM32F4, including sm1000.bin, the firmware for the SM1000. + +1. Find stm32f4_dsp_stdperiph_lib.zip on the InterWebs and place it in + codec2-dev/stm32/dl. The latest version is available from st.com, + however this may not compile cleanly. Here is how to obtain + version 1.4: + + $ cd codec-dev/stm32 + $ mkdir dl + $ cd dl + $ wget http://rowetel.com/downloads/codec2/smartmic/stm32f4_dsp_stdperiph_lib.zip + +2. Install the toolchain, on Ubuntu 14 this is: + + $ sudo apt-get install gcc-arm-none-eabi + +3. $ make (and cross your fingers) + +You may need to mess about with the Makefile to get it to work, +e.g. BINPATH, PERIPHLIBURL. A better build system is hopefully on +it's way. Contact me if you can help. + +Not quite so Quickstart +======================= + +Note: This section needs some editing. It deals with the running the +semi-hosting used for development system. gdb_stdio system ---------------- diff --git a/codec2/branches/0.4/stm32/inc/stm32f4_adc_tuner.h b/codec2/branches/0.4/stm32/inc/stm32f4_adc_tuner.h index 88f16a14..6c7c7559 100644 --- a/codec2/branches/0.4/stm32/inc/stm32f4_adc_tuner.h +++ b/codec2/branches/0.4/stm32/inc/stm32f4_adc_tuner.h @@ -35,5 +35,6 @@ void adc_open(int fifo_sz); int adc1_read(short buf[], int n); /* ADC1 Pin PA1 */ +void adc_set_tuner_en(short flag); /* disable tuner to get raw ADC samples written to fifo */ #endif diff --git a/codec2/branches/0.4/stm32/src/adc_sfdr_ut.c b/codec2/branches/0.4/stm32/src/adc_sfdr_ut.c new file mode 100644 index 00000000..2b3a1165 --- /dev/null +++ b/codec2/branches/0.4/stm32/src/adc_sfdr_ut.c @@ -0,0 +1,90 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: adc_sfdr_ut.c + AUTHOR......: David Rowe + DATE CREATED: August 2015 + + Unit test for high speed ADC SFDR testing. Samples ADC1 from in PA1 at + Fs=2 MHz and write raw samples to a file, in discontinuus blocks of + ADC_TUNER_BUF_SZ/2 samples. The blocks are discontinuous as we + don'thave the bandwitdh back to the host to support continuous sampling. + + To process the blocks, fread() ADC_TUNER_BUF_SZ/2 samples at a time, + abs(fft) and sum results from next block. + +\*---------------------------------------------------------------------------*/ + +/* + 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 . +*/ + +#include +#include +#include "gdb_stdio.h" +#include "stm32f4_dac.h" +#include "stm32f4_adc_tuner.h" +#include "iir_tuner.h" +#include "sm1000_leds_switches.h" +#include "../src/codec2_fm.h" +#include "stm32f4xx.h" + +#define BUFS 10 +#define FS 2E6 +#define N 1024 + +extern int adc_overflow1; + +int main(void) { + unsigned short unsigned_buf[N]; + short buf[N]; + int sam; + int i, j, fifo_sz; + FILE *fadc; + + fadc = fopen("adc.raw", "wb"); + if (fadc == NULL) { + printf("Error opening output file: adc.raw\n\nTerminating....\n"); + exit(1); + } + fifo_sz = ADC_TUNER_BUF_SZ; + printf("Starting! bufs: %d %d\n", BUFS, fifo_sz); + + adc_open(fifo_sz); + adc_set_tuner_en(0); /* dump raw samples, no tuner */ + + sm1000_leds_switches_init(); + + for (i=0; iODR |= (1 << 3); + fwrite(buf, sizeof(short), N, fadc); + GPIOE->ODR &= ~(1 << 3); + } + fclose(fadc); + + printf("Finished!\n"); +} + diff --git a/codec2/branches/0.4/stm32/src/fdmdv_profile.c b/codec2/branches/0.4/stm32/src/fdmdv_profile.c index 06dc5129..05b8d623 100644 --- a/codec2/branches/0.4/stm32/src/fdmdv_profile.c +++ b/codec2/branches/0.4/stm32/src/fdmdv_profile.c @@ -90,7 +90,7 @@ int main(int argc, char *argv[]) { COMP rx_fdm[FDMDV_NOM_SAMPLES_PER_FRAME]; int i, j, nin, reliable_sync_bit[2], sync_bit, bit_errors, ntest_bits, test_frame_sync; short *error_pattern; - struct FDMDV_STATS stats; + struct MODEM_STATS stats; PROFILE_VAR(mod_start, demod_start); machdep_profile_init (); diff --git a/codec2/branches/0.4/stm32/src/freedv_rx_profile.c b/codec2/branches/0.4/stm32/src/freedv_rx_profile.c index 5c0d216b..65b43ae1 100644 --- a/codec2/branches/0.4/stm32/src/freedv_rx_profile.c +++ b/codec2/branches/0.4/stm32/src/freedv_rx_profile.c @@ -53,18 +53,24 @@ int main(int argc, char *argv[]) { struct freedv *f; - short adc16k[FDMDV_OS_TAPS_16K+FREEDV_NSAMPLES_16K]; - short dac16k[FREEDV_NSAMPLES_16K]; - short adc8k[FREEDV_NSAMPLES]; - short dac8k[FDMDV_OS_TAPS_8K+FREEDV_NSAMPLES]; FILE *fin, *fout, *ftotal; int frame, nin_16k, nin, i, nout = 0; - struct FDMDV_STATS stats; + int n_samples, n_samples_16k; + int sync; + float snr_est; + PROFILE_VAR(fdmdv_16_to_8_start, freedv_rx_start, fdmdv_8_to_16_start); machdep_profile_init(); f = freedv_open(FREEDV_MODE_1600); + n_samples = freedv_get_n_speech_samples(f); + n_samples_16k = 2*n_samples; + + short adc16k[FDMDV_OS_TAPS_16K+n_samples_16k]; + short dac16k[n_samples_16k]; + short adc8k[n_samples]; + short dac8k[FDMDV_OS_TAPS_8K+n_samples]; // Receive --------------------------------------------------------------------- @@ -105,7 +111,6 @@ int main(int argc, char *argv[]) { nout = freedv_rx(f, &dac8k[FDMDV_OS_TAPS_8K], adc8k); nin = freedv_nin(f); nin_16k = 2*nin; - fdmdv_get_demod_stats(f->fdmdv, &stats); PROFILE_SAMPLE_AND_LOG(fdmdv_8_to_16_start, freedv_rx_start, " freedv_rx"); @@ -117,9 +122,9 @@ int main(int argc, char *argv[]) { machdep_profile_print_logged_samples(); fwrite(dac16k, sizeof(short), 2*nout, fout); - fdmdv_get_demod_stats(f->fdmdv, &stats); + freedv_get_modem_stats(f, &sync, &snr_est); printf("frame: %d nin_16k: %d sync: %d SNR: %3.2f \n", - ++frame, nin_16k, stats.sync, (double)stats.snr_est); + ++frame, nin_16k, sync, (double)snr_est); } fclose(fin); diff --git a/codec2/branches/0.4/stm32/src/freedv_tx_profile.c b/codec2/branches/0.4/stm32/src/freedv_tx_profile.c index 7391c521..54b58915 100644 --- a/codec2/branches/0.4/stm32/src/freedv_tx_profile.c +++ b/codec2/branches/0.4/stm32/src/freedv_tx_profile.c @@ -46,14 +46,15 @@ int main(int argc, char *argv[]) { struct freedv *f; - short inbuf[FREEDV_NSAMPLES], outbuf[FREEDV_NSAMPLES]; FILE *fin, *fout; - int frame; + int frame, n_samples; PROFILE_VAR(freedv_start); machdep_profile_init(); f = freedv_open(FREEDV_MODE_1600); + n_samples = freedv_get_n_speech_samples(f); + short inbuf[n_samples], outbuf[n_samples]; // Transmit --------------------------------------------------------------------- @@ -71,12 +72,12 @@ int main(int argc, char *argv[]) { frame = 0; - while (fread(inbuf, sizeof(short), FREEDV_NSAMPLES, fin) == FREEDV_NSAMPLES) { + while (fread(inbuf, sizeof(short), n_samples, fin) == n_samples) { PROFILE_SAMPLE(freedv_start); freedv_tx(f, outbuf, inbuf); PROFILE_SAMPLE_AND_LOG2(freedv_start, " freedv_tx"); - fwrite(outbuf, sizeof(short), FREEDV_NSAMPLES, fout); + fwrite(outbuf, sizeof(short), n_samples, fout); printf("frame: %d\n", ++frame); machdep_profile_print_logged_samples(); } diff --git a/codec2/branches/0.4/stm32/src/sm1000_main.c b/codec2/branches/0.4/stm32/src/sm1000_main.c index b40fa516..56a2b951 100644 --- a/codec2/branches/0.4/stm32/src/sm1000_main.c +++ b/codec2/branches/0.4/stm32/src/sm1000_main.c @@ -75,12 +75,9 @@ short aSine[] = { int main(void) { struct freedv *f; - short adc16k[FDMDV_OS_TAPS_16K+FREEDV_NSAMPLES_16K]; - short dac16k[FREEDV_NSAMPLES_16K]; - short adc8k[FREEDV_NSAMPLES]; - short dac8k[FDMDV_OS_TAPS_8K+FREEDV_NSAMPLES]; SWITCH_STATE ss; int nin, nout, i; + int n_samples, n_samples_16k; /* init all the drivers for various peripherals */ @@ -89,6 +86,13 @@ int main(void) { dac_open(4*DAC_BUF_SZ); adc_open(4*ADC_BUF_SZ); f = freedv_open(FREEDV_MODE_1600); + n_samples = freedv_get_n_speech_samples(f); + n_samples_16k = 2*n_samples; + + short adc16k[FDMDV_OS_TAPS_16K+n_samples_16k]; + short dac16k[n_samples_16k]; + short adc8k[n_samples]; + short dac8k[FDMDV_OS_TAPS_8K+n_samples]; /* put outputs into a known state */ @@ -114,35 +118,35 @@ int main(void) { /* ADC2 is the SM1000 microphone, DAC1 is the modulator signal we send to radio tx */ - if (adc2_read(&adc16k[FDMDV_OS_TAPS_16K], FREEDV_NSAMPLES_16K) == 0) { + if (adc2_read(&adc16k[FDMDV_OS_TAPS_16K], n_samples_16k) == 0) { GPIOE->ODR = (1 << 3); /* clipping indicator */ led_err(0); - for (i=0; i 28000) led_err(1); } - fdmdv_16_to_8_short(adc8k, &adc16k[FDMDV_OS_TAPS_16K], FREEDV_NSAMPLES); + fdmdv_16_to_8_short(adc8k, &adc16k[FDMDV_OS_TAPS_16K], n_samples); if (ss.mode == ANALOG) { - for(i=0; itotal_bit_errors = 0; + freedv_zero_total_bit_errors(f); if (adc1_read(&adc16k[FDMDV_OS_TAPS_16K], 2*nin) == 0) { GPIOE->ODR = (1 << 3); @@ -187,7 +189,7 @@ int main(void) { nout = freedv_rx(f, &dac8k[FDMDV_OS_TAPS_8K], adc8k); fdmdv_8_to_16_short(dac16k, &dac8k[FDMDV_OS_TAPS_8K], nout); dac2_write(dac16k, 2*nout); - led_rt(f->fdmdv_stats.sync); led_err(f->total_bit_errors); + led_rt(freedv_get_sync(f)); led_err(freedv_get_total_bit_errors(f)); GPIOE->ODR &= ~(1 << 3); } } diff --git a/codec2/branches/0.4/stm32/src/stm32f4_adc_tuner.c b/codec2/branches/0.4/stm32/src/stm32f4_adc_tuner.c index d083c599..9d74130b 100644 --- a/codec2/branches/0.4/stm32/src/stm32f4_adc_tuner.c +++ b/codec2/branches/0.4/stm32/src/stm32f4_adc_tuner.c @@ -45,6 +45,7 @@ struct FIFO *adc1_fifo; unsigned short adc_buf[ADC_TUNER_BUF_SZ]; int adc_overflow1; int half,full; +static short tuner_en = 1; #define ADCx_DR_ADDRESS ((uint32_t)0x4001204C) #define DMA_CHANNELx DMA_Channel_0 @@ -73,6 +74,11 @@ int adc1_read(short buf[], int n) { } +void adc_set_tuner_en(short flag) +{ + tuner_en = flag; +} + static void tim2_config(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; @@ -232,14 +238,18 @@ void DMA2_Stream0_IRQHandler(void) { if(DMA_GetITStatus(DMA2_Stream0, DMA_IT_HTIF0) != RESET) { half++; - iir_tuner(dec_buf, adc_buf); + if (tuner_en) { + iir_tuner(dec_buf, adc_buf); - /* write first half to fifo */ + /* write first half to fifo */ - if (fifo_write(adc1_fifo, (short*)dec_buf, ADC_TUNER_N) == -1) { - adc_overflow1++; + if (fifo_write(adc1_fifo, (short*)dec_buf, ADC_TUNER_N) == -1) { + adc_overflow1++; + } } - + else + fifo_write(adc1_fifo, (short*)adc_buf, ADC_TUNER_BUF_SZ/2); + /* Clear DMA Stream Transfer Complete interrupt pending bit */ DMA_ClearITPendingBit(DMA2_Stream0, DMA_IT_HTIF0); @@ -250,14 +260,18 @@ void DMA2_Stream0_IRQHandler(void) { if(DMA_GetITStatus(DMA2_Stream0, DMA_IT_TCIF0) != RESET) { full++; - iir_tuner(dec_buf, &adc_buf[ADC_TUNER_BUF_SZ/2]); + if (tuner_en) { + iir_tuner(dec_buf, &adc_buf[ADC_TUNER_BUF_SZ/2]); - /* write second half to fifo */ + /* write second half to fifo */ - if (fifo_write(adc1_fifo, (short*)dec_buf, ADC_TUNER_N) == -1) { - adc_overflow1++; + if (fifo_write(adc1_fifo, (short*)dec_buf, ADC_TUNER_N) == -1) { + adc_overflow1++; + } } - + else + fifo_write(adc1_fifo, (short*)&adc_buf[ADC_TUNER_BUF_SZ/2], ADC_TUNER_BUF_SZ/2); + /* Clear DMA Stream Transfer Complete interrupt pending bit */ DMA_ClearITPendingBit(DMA2_Stream0, DMA_IT_TCIF0); diff --git a/codec2/tags/.gitignore b/codec2/tags/.gitignore deleted file mode 100644 index e69de29b..00000000 diff --git a/codec2/tags/0.4.1/AUTHORS b/codec2/tags/0.4.1/AUTHORS new file mode 100644 index 00000000..e69de29b diff --git a/codec2/tags/0.4.1/CMakeLists.txt b/codec2/tags/0.4.1/CMakeLists.txt new file mode 100644 index 00000000..f3d55c66 --- /dev/null +++ b/codec2/tags/0.4.1/CMakeLists.txt @@ -0,0 +1,209 @@ +# +# Codec2 - Next-Generation Digital Voice for Two-Way Radio +# +# CMake configuration contributed by Richard Shaw (KF5OIM) +# Please report questions, comments, problems, or patches to the freetel +# mailing list: https://lists.sourceforge.net/lists/listinfo/freetel-codec2 +# +project(codec2 C) + +cmake_minimum_required(VERSION 2.8) + +include(GNUInstallDirs) +mark_as_advanced(CLEAR + CMAKE_INSTALL_BINDIR + CMAKE_INSTALL_INCLUDEDIR + CMAKE_INSTALL_LIBDIR +) + +# +# Prevent in-source builds +# If an in-source build is attempted, you will still need to clean up a few +# files manually. +# +set(CMAKE_DISABLE_SOURCE_CHANGES ON) +set(CMAKE_DISABLE_IN_SOURCE_BUILD ON) +if("${CMAKE_SOURCE_DIR}" STREQUAL "${CMAKE_BINARY_DIR}") + message(FATAL_ERROR "In-source builds in ${CMAKE_BINARY_DIR} are not " + "allowed, please remove ./CMakeCache.txt and ./CMakeFiles/, create a " + "separate build directory and run cmake from there.") +endif("${CMAKE_SOURCE_DIR}" STREQUAL "${CMAKE_BINARY_DIR}") + + +# +# Set project version information. This should probably be done via external +# file at some point. +# +set(CODEC2_VERSION_MAJOR 0) +set(CODEC2_VERSION_MINOR 4) +# Set to patch level if needed, otherwise leave FALSE. +set(CODEC2_VERSION_PATCH 1) +set(CODEC2_VERSION "${CODEC2_VERSION_MAJOR}.${CODEC2_VERSION_MINOR}") +# Patch level version bumps should not change API/ABI. +set(SOVERSION "${CODEC2_VERSION_MAJOR}.${CODEC2_VERSION_MINOR}") +if(CODEC2_VERSION_PATCH) + set(CODEC2_VERSION "${CODEC2_VERSION}.${CODEC2_VERSION_PATCH}") +endif() +message(STATUS "codec2 version: ${CODEC2_VERSION}") + +# Set default build type +if(NOT CMAKE_BUILD_TYPE) + set(CMAKE_BUILD_TYPE "Release") +endif() + +# Set default C++ flags. +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall") +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -g -O2") +set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS}") +set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS}") +set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS}") +set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS}") + +# -fPIC is implied on MinGW... +if(NOT WIN32) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC") +endif() + +message(STATUS "Build type is: " ${CMAKE_BUILD_TYPE}) +string(TOUPPER ${CMAKE_BUILD_TYPE} _FLAGS) +if(NOT "_FLAGS" STREQUAL "NONE") + set(BUILD_FLAGS "${CMAKE_C_FLAGS_${_FLAGS}}") +endif() +message(STATUS "Compiler Flags: " ${BUILD_FLAGS}) + +# +# Setup Windows/MinGW specifics here. +# +if(MINGW) + message(STATUS "System is MinGW.") +endif(MINGW) + + +# +# Find the svn revision if this is a working copy. +# WORK IN PROGRESS +# Works ok if it is a working copy but errors out if not. +# +#find_package(Subversion) +#if(Subversion_FOUND) +# Subversion_WC_INFO(${CMAKE_CURRENT_SOURCE_DIR} CODEC2) +# message(STATUS "codec2 svn revision: ${CODEC2_WC_REVISION}") +#else(SUBVERSION_FOUND) +# message(WARNING "Subversion not found. Can not determine svn revision.") +#endif(SUBVERSION_FOUND) + + +# +# Default options +# +option(BUILD_SHARED_LIBS + "Build shared library. Set to OFF for static library." ON) +# Unittest should be on for dev builds and off for releases. +if(CMAKE_BUILD_TYPE MATCHES "Release") + option(UNITTEST "Build unittest binaries." OFF) +else() + option(UNITTEST "Build unittest binaries." ON) +endif() +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() + + +# Math library is automatic on windows +if(UNIX) + set(CMAKE_REQUIRED_INCLUDES math.h) + set(CMAKE_REQUIRED_LIBRARIES m) +endif(UNIX) + +include(CheckIncludeFiles) +check_include_files("stdlib.h" HAVE_STDLIB_H) +check_include_files("string.h" HAVE_STRING_H) + +include(CheckFunctionExists) +check_function_exists(floor HAVE_FLOOR) +check_function_exists(ceil HAVE_CEIL) +check_function_exists(pow HAVE_POW) +check_function_exists(sqrt HAVE_SQRT) +check_function_exists(sin HAVE_SIN) +check_function_exists(cos HAVE_COS) +check_function_exists(atan2 HAVE_ATAN2) +check_function_exists(log10 HAVE_LOG10) +check_function_exists(round HAVE_ROUND) +check_function_exists(getopt HAVE_GETOPT) + +configure_file ("${PROJECT_SOURCE_DIR}/cmake/config.h.in" + "${PROJECT_BINARY_DIR}/config.h" ) +include_directories(${PROJECT_BINARY_DIR}) + +# CMake Package setup +#include(CMakePackageConfigHelpers) +#configure_package_config_file(cmake/codec2-config.cmake.in +# ${CMAKE_CURRENT_BINARY_DIR}/codec2-config.cmake +# INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/codec2 +# PATH_VARS CMAKE_INSTALL_INCLUDEDIR +#) + +# +# codec2 library +# +add_subdirectory(src) + +if(UNITTEST) + # Pthread Library + find_package(Threads REQUIRED) + message(STATUS "Threads library flags: ${CMAKE_THREAD_LIBS_INIT}") + + # + # Find speex library + # + message(STATUS "Looking for Speex DSP library.") + find_path(SPEEXDSP_INCLUDE_DIR speex/speex.h) + find_library(SPEEXDSP_LIBRARY speexdsp) + message(STATUS " Speex DSP headers: ${SPEEXDSP_INCLUDE_DIR}") + message(STATUS " Speex DSP library: ${SPEEXDSP_LIBRARY}") + if(NOT SPEEXDSP_INCLUDE_DIR AND NOT SPEEXDSP_LIBRARY) + message(FATAL_ERROR "Speex DSP library not found!") + endif() + + add_subdirectory(unittest) +endif(UNITTEST) + +# +# Cpack NSIS installer configuration for Windows. +# See: http://nsis.sourceforge.net/Download +# +# *nix systems should use "make install" and/or appropriate +# distribution packaging tools. +# +if(WIN32) + # Detect if we're doing a 32-bit or 64-bit windows build. + if(${CMAKE_SIZEOF_VOID_P} EQUAL 8) + set(CMAKE_CL_64 TRUE) + endif() + + configure_file(cmake/GetDependencies.cmake.in cmake/GetDependencies.cmake + @ONLY + ) + install(SCRIPT ${CMAKE_BINARY_DIR}/cmake/GetDependencies.cmake) + set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Next-Generation Digital Voice for Two-Way Radio") + set(CPACK_PACKAGE_VENDOR "CMake") + set(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_CURRENT_SOURCE_DIR}/README") + set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/COPYING") + set(CPACK_PACKAGE_VERSION_MAJOR ${CODEC2_VERSION_MAJOR}) + set(CPACK_PACKAGE_VERSION_MINOR ${CODEC2_VERSION_MINOR}) + if(CODEC2_VERSION_PATCH) + set(CPACK_PACKAGE_VERSION_PATCH ${CODEC2_VERSION_PATCH}) + else() + set(CPACK_PACKAGE_VERSION_PATCH 0) + endif() + set(CPACK_PACKAGE_INSTALL_DIRECTORY "Codec2") + set(CPACK_CREATE_DESKTOP_LINKS "") + set(CPACK_NSIS_DISPLAY_NAME "${CPACK_PACKAGE_INSTALL_DIRECTORY}") + set(CPACK_NSIS_URL_INFO_ABOUT "http://codec2.org") + set(CPACK_NSIS_MODIFY_PATH ON) + include(CPack) +endif(WIN32) diff --git a/codec2/tags/0.4.1/COPYING b/codec2/tags/0.4.1/COPYING new file mode 100644 index 00000000..cc40a468 --- /dev/null +++ b/codec2/tags/0.4.1/COPYING @@ -0,0 +1,502 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, see + . + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! diff --git a/codec2/tags/0.4.1/ChangeLog b/codec2/tags/0.4.1/ChangeLog new file mode 100644 index 00000000..e69de29b diff --git a/codec2/tags/0.4.1/INSTALL b/codec2/tags/0.4.1/INSTALL new file mode 100644 index 00000000..bcdcf4c0 --- /dev/null +++ b/codec2/tags/0.4.1/INSTALL @@ -0,0 +1,52 @@ +========================== + Building and Installing +========================== + +NOTES: + - Builds against system libraries by default. + - Has NSIS packaing support for Windows (WIN32) targets. *nix systems should + rely on 'make install' as the packages (RPM & DEB) created by CPack are + questionable. + +To compile codec2, the packages build-essential and cmake are required. +If they are not installed, at a command prompt, type + +$ sudo apt-get install build-essential cmake + +To test the cmake build make a directory anywhere underneath (or outside of) +the source directory. + +Linux command line example: + +$ cd /path/to/codec2 +$ mkdir build_linux +$ cd build_linux +$ cmake ../ + +Install prefix defaults to /usr/local, use CMAKE_INSTALL_PREFIX to override. + +(if no errors) +$ make +(as root) +$ make install + +===================== + Windows +===================== + +Unlike FreeDV (fdmdv2), codec2 is not currently provided as a separate +installer, instead the windows version uses a static build of codec2. + +Additionally, while MSYS2+MinGW should work, windows builds are produces by +cross compiling from linux. + +Install MinGW & the mysys shell + + pwd -W prints true Win32 directory + + I also installed emacs, "tortise svn", and "cmake", and built and installed speex + +$ cd codec2-dev +$ mkdir build_win32 +$ cd build_win32 +$ cmake -DSPEEXDSP_INCLUDE_DIR=/usr/local/include/ -G "MSYS Makefiles" .. +$ make +$ make package diff --git a/codec2/tags/0.4.1/NEWS b/codec2/tags/0.4.1/NEWS new file mode 100644 index 00000000..e69de29b diff --git a/codec2/tags/0.4.1/README b/codec2/tags/0.4.1/README new file mode 100644 index 00000000..a2a822d7 --- /dev/null +++ b/codec2/tags/0.4.1/README @@ -0,0 +1,134 @@ +Codec 2 README +-------------- + +Codec 2 is an open source (LGPL licensed) speech codec for 3200 bit/s +and below. For more information please see: + + http://rowetel.com/codec2.html + +Also included is a FDMDV modem (README_fdmdv.txt), a coherent PSK +modem and an API for embedding FreeDV in other programs (see example +below). For more information on building Codec 2 see README.cmake + +SVN Repository +-------------- + +Check out the latest (development branch) code using: + + $ svn co https://svn.code.sf.net/p/freetel/code/codec2-dev codec2-dev + +There are 3rd party GIT mirrors of Codec2 and FreeDV. Use Git at your +own risk. + + GIT IS NOT SUPPORTED!!! + +All patches, support questions etc, need to be against the SVN +repository above. + +Please do not email me (David), or the codec2-dev mailing list +suggesting we change to Git. I get these emails every week. Really, +I understand the arguments, but am content with SVN for now. + +Quickstart +---------- + +Refer to INSTALL for more general building and installing instructions. + +NOTE: You may not have the necessary speex libraries installed. Some + distributions may have packages available + i.e. sudo apt-get install speex-* + alternatively, visit http://www.speex.org and follow the instructions + +1/ Listen to Codec 2: + + $ cd codec2-dev + $ mkdir build_linux + $ cd build_linux + $ cmake .. + $ make + $ ./src/c2demo ../raw/hts1a.raw hts1a_c2.raw + $ play -t raw -r 8000 -e signed-integer -b 16 ../raw/hts1a.raw + $ play -t raw -r 8000 -e signed-integer -b 16 ./hts1a_c2.raw + +2/ Compress, Decompress and then play a file: + + using 2400 bps bit rate encoding + + $ ./src/c2enc 2400 ../raw/hts1a.raw hts1a_c2.bit + $ ./src/c2dec 2400 hts1a_c2.bit hts1a_c2_2400.raw + + which can be played with + + $ play -t raw -r 8000 -e signed-integer -b 16 ./hts1a_c2_2400.raw + + using 700 bps bit rate encoding + + $ ./src/c2enc 700 ../raw/hts1a.raw hts1a_c2.bit + $ ./src/c2dec 700 hts1a_c2.bit hts1a_c2_700.raw + + which can be played with + + $ play -t raw -r 8000 -e signed-integer -b 16 ./hts1a_c2_700.raw + +3/ Same thing with pipes: + + $ ./src/c2enc 1300 ../raw/hts1a.raw - | ./src/c2dec 1300 - - | play -t raw -r 8000 -s -2 - + +Embedded FreeDV API +------------------- + +See freedv_api.h and freedv_api.c, and the demo programs freedv_tx & +freedv_rx. Quickstart: + + $ ./freedv_tx 1600 ../../raw/hts1.raw - | ./freedv_rx 1600 - - | play -t raw -r 8000 -s -2 -q - + $ cat freedv_rx_log.txt + +Programs +-------- + +1/ c2demo encodes a file of speech samples, then decodes them and +saves the result. + +2/ c2enc encodes a file of speech samples to a compressed file of +encoded bits. + +3/ c2dec decodes a compressed file of bits to a file of speech +samples. + +4/ c2sim is a simulation/development version of Codec 2. It allows +selective use of the various Codec 2 algorithms. For example +switching phase modelling or LSP quantisation on and off. + +Debugging +--------- + +1/ To compile with debug symbols for using gdb: + + $ cd ~/codec2 + $ rm -Rf build_linux && mkdir build_linux + $ cd build_linux + $ CFLAGS=-g cmake .. + $ make + +2/ For dump file support: + + $ cd ~/codec2 + $ rm -Rf build_linux && mkdir build_linux + $ cd build_linux + $ CFLAGS=-DDUMP cmake .. + $ make + +Directories +----------- + + asterisk & - unmaintained Asterisk support + asterisk-11 + cmake - cmake support files + octave - Octave scripts used to support development + script - shell scripts for playing and converting raw files + 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 - Support for the STM32F4 microcontroller and SM1000 FreeDV Adaptor + unittest - unit test source code + wav - speech files in wave file format + diff --git a/codec2/tags/0.4.1/README_fdmdv.txt b/codec2/tags/0.4.1/README_fdmdv.txt new file mode 100644 index 00000000..0aec27f7 --- /dev/null +++ b/codec2/tags/0.4.1/README_fdmdv.txt @@ -0,0 +1,201 @@ + +README_fdmdv.txt +David Rowe +Created March 2012 + +Introduction +------------ + +A 1400 bit/s (nominal) Frequency Division Multiplexed Digital Voice +(FDMDV) modem based on [1]. Used for digital audio over HF SSB. + +The FDMDV modem was first implemented in GNU Octave, then ported to C. +Algorithm development is generally easier in Octave, but for real time +work we need the C version. Automated units tests ensure the +operation of the Octave and C versions are identical. + +Quickstart +---------- + +Built as part of codec2-dev, see README for build instructions. + +1. Generate some test bits and modulate them: + + $ ./fdmdv_get_test_bits test.c2 1400 + $ ./fdmdv_mod test.c2 test.raw + $ play -r 8000 -s -2 test.raw + +2. Two seconds of test frame data modulated and sent out of sound device: + + $ ./fdmdv_get_test_bits - 2800 | ./fdmdv_mod - - | play -t raw -r 8000 -s -2 - + +3. Send 14000 modulated bits (10 seconds) to the demod and count errors: + + $ ./fdmdv_get_test_bits - 14000 | ./fdmdv_mod - - | ./fdmdv_demod - - 14 demod_dump.txt | ./fdmdv_put_test_bits - + + Use Octave to look at plots of 1 second (1400 bits) of modem operation: + + $ cd ../octave + $ octave + octave:1> fdmdv_demod_c("../src/demod_dump.txt",1400) + +4. Run Octave simulation of entire modem and AWGN channel: + + $ cd ../octave + $ octave + octave:1> fdmdv_ut + +5. NOTE: If you would like to play modem samples over the air please + convert the 8 kHz samples to 48 kHz. Many PC sound cards have + wildly inaccurate sample clock rates when set to 8 kHz, but seem to + perform OK when set for 48 kHz. If playing and recording files you + can use the sox utility: + + $ sox -r 8000 -s -2 modem_sample_8kHz.raw -r 48000 modem_sample_48kHz.wav + + For real time applications, the fdmdv.[ch] library includes functions to + convert between 48 and 8 kHz sample rates. + +6. Send 20 seconds at 2000 bit/s (20 carriers) to demod and count errors: + + $ ./fdmdv_get_test_bits - 20000 20 | ./fdmdv_mod - - 20 | ./fdmdv_demod - - 20 | ./fdmdv_put_test_bits - 20 + +References +---------- + +[1] http://n1su.com/fdmdv/FDMDV_Docs_Rel_1_4b.pdf +[2] http://n1su.com/fdmdv/ +[3] http://www.rowetel.com/blog/?p=2433 "Testing a FDMDV Modem" +[4] http://www.rowetel.com/blog/?p=2458 "FDMDV Modem Page" on David's web site + +C Code +------ + +src/fdmdv_mod.c - C version of modulator that takes a file of bits and + converts it to a raw file of modulated samples. + +src/fdmdv_demod.c - C version of demodulator that takes a raw file of + modulated samples and outputs a file of bits. + Optionally dumps demod states to a text file which + can be plotted using the Octave script + fdmdv_demod_c.m + +src/fdmdv.h - Header file that exposes FDMDV C API functions. Include + this file in your application program. + +src/fdmdv.c - C functions that implement the FDMDV modem. + +src/fdmdv-internal.h - internal states and constants for FDMDV modem, + shouldn't be exposed to application program. + + +unittest/tfdmdv.c - Used to conjunction with unittest/tfdmdv.m to + automatically test C FDMDV functions against + Octave versions. + +Octave Scripts +-------------- + +(Note these require some Octave packages to be installed, see +octave/README.txt). + +fdmdv.m - Functions and variables that implement the Octave version of + the FDMDV modem. + +fdmdv_ut.m - Unit test for fdmdv Octave code, useful while + developing algorithm. Includes tx/rx plus basic channel + simulation. + + Typical run: + + octave:6> fdmdv_ut + Eb/No (meas): 7.30 (8.29) dB + bits........: 2464 + errors......: 20 + BER.........: 0.0081 + PAPR........: 13.54 dB + SNR.........: 4.0 dB + + It also outputs lots of nice plots that show the + operation of the modem. + + For a 1400 bit/s DQPSK modem we expect about 1% BER for + Eb/No = 7.3dB, which corresponds to SNR = 4dB (3kHz + noise BW). The extra dB of measured power is due to the + DBPSK pilot. Currently the noise generation code + doesn't take the pilot power into account, so in this + example the real SNR is actually 5dB. + +fdmdv_mod.m - Octave version of modulator that outputs a raw file. + The modulator is driven by a test frame of bits. This + can then be played over a real channel or through a + channel simulator like PathSim. The sample rate can be + changed using "sox" to simulate differences in tx/rx + sample clocks. + + To generate 10 seconds of modulated signal: + + octave:8> fdmdv_mod("test.raw",1400*10); + +fdmdv_demod.m - Demodulator program that takes a raw file as input, + and works out the bit error rate using the known test + frame. Can be used to test the demod performs with + off-air signals, or signals that have been passed + through a channel simulator. + + To demodulate 2 seconds of the test.raw file generated + above: + + octave:9> fdmdv_demod("test.raw",1400*2); + 2464 bits 0 errors BER: 0.0000 + + It also produces several plots showing the internal + states of the demod. Useful for debugging and + observing what happens with various channels. + +fdmdv_demod_c.m - Takes an output text file from the C demod + fdmdv_demod.c and produces plots and measures BER. + Useful for evaluating fdmdv_demod.c performance. + The plots produced are identical to the Octave + version fdmdv_demod.m, allowing direct comparison of + the C and Octave versions. + +tfdmdv.m - Automatic tests that compare the Octave and C versions of + the FDMDV modem functions. First run unittest/tfdmdv, this + will generate a text file with test vectors from the C + version. Then run the Octave script tfdmdv and it will + generate Octave versions of the test vectors and compare + each vector with the C equivalent. Its plots the vectors + and and errors (green). Its also produces an automatic + check list based on test results. If the Octave or C modem + code is changed, this script should be used to ensure the + C and Octave versions remain identical. + +Modelling sample clock errors using sox +--------------------------------------- + +This introduces a simulated 1000ppm error: + + sox -r 8000 -s -2 mod_dqpsk.raw -s -2 mod_dqpsk_8008hz.raw rate -h 8008 + +TODO +---- + +[ ] implement ppm measurements in fdmdv_get_demod_stats() +[ ] try interfering sine wave + + maybe swept + + does modem fall over? +[ ] try non-flat channel, e.g. 3dB difference between hi and low tones + + make sure all estimators keep working +[ ] test rx level sensitivity, i.e. 0 to 20dB attenuation +[ ] make fine freq indep of amplitude + + use angle rather than imag coord +[ ] document use of fdmdv_ut and fdmdv_demod + PathSim +[ ] more positive form of sync reqd for DV frames? + + like using coarse_fine==1 to decode valid DV frame bit? + + when should we start decoding? +[ ] more robust track/acquite state machine? + + e.g. hang on thru the fades? +[ ] PAPR idea + + automatically tweak phases to reduce PAPR, e.g. slow variations in freq... +[ ] why is pilot noise_est twice as big as other carriers diff --git a/codec2/tags/0.4.1/asterisk-11/README.md b/codec2/tags/0.4.1/asterisk-11/README.md new file mode 100644 index 00000000..6f5b2442 --- /dev/null +++ b/codec2/tags/0.4.1/asterisk-11/README.md @@ -0,0 +1,19 @@ +#Asterisk 11 Codec 2 support +=========================== + +##Description +These patches add Codec 2 2400 support to Asterisk 11. +The following patches are provided: + +* asterisk-11.8.1-codec2.patch: plain Asterisk 11. +* asterisk-11.8.1-opus-codec2.patch: Asterisk patched with Meetecho's Opus codec support. + +##Building +Building and installing are integrated within Asterisk building environment. libcodec2 must be installed beforehand. + +##Credits +I've followed the example of [asterisk-opus](https://github.com/meetecho/asterisk-opus), by [@meetecho](https://github.com/meetecho), to adapt Codec2 Asterisk 1.8 patch to version 11. + +Many thanks to the [Codec2](http://www.rowetel.com/blog/codec2.html) team for developing such great codec! + +Developed by [Antonio Eugenio Burriel](https://github.com/aeburriel) diff --git a/codec2/tags/0.4.1/asterisk-11/asterisk-11.8.1-codec2.patch b/codec2/tags/0.4.1/asterisk-11/asterisk-11.8.1-codec2.patch new file mode 100644 index 00000000..a2fa0db0 --- /dev/null +++ b/codec2/tags/0.4.1/asterisk-11/asterisk-11.8.1-codec2.patch @@ -0,0 +1,384 @@ +diff -urN asterisk-11.8.1-orig/build_tools/menuselect-deps.in asterisk-11.8.1-codec2/build_tools/menuselect-deps.in +--- asterisk-11.8.1-orig/build_tools/menuselect-deps.in 2013-04-11 21:59:35.000000000 +0200 ++++ asterisk-11.8.1-codec2/build_tools/menuselect-deps.in 2014-04-01 10:24:29.368859813 +0200 +@@ -4,6 +4,7 @@ + CRYPTO=@PBX_CRYPTO@ + BFD=@PBX_BFD@ + BISON=@PBX_BISON@ ++CODEC2=@PBX_CODEC2@ + CURL=@PBX_CURL@ + DAHDI=@PBX_DAHDI@ + DLADDR=@PBX_DLADDR@ +diff -urN asterisk-11.8.1-orig/codecs/codec_codec2.c asterisk-11.8.1-codec2/codecs/codec_codec2.c +--- asterisk-11.8.1-orig/codecs/codec_codec2.c 1970-01-01 01:00:00.000000000 +0100 ++++ asterisk-11.8.1-codec2/codecs/codec_codec2.c 2014-04-01 01:28:47.000000000 +0200 +@@ -0,0 +1,190 @@ ++/* ++ * Codec 2 module for Asterisk. ++ * ++ * Credit: codec_gsm.c used as a starting point. ++ * ++ * Copyright (C) 2012 Ed W and David Rowe ++ * ++ * This program is free software, distributed under the terms of ++ * the GNU General Public License Version 2. See the LICENSE file ++ * at the top of the source tree. ++ */ ++ ++/*! \file ++ * ++ * \brief Translate between signed linear and Codec 2 ++ * ++ * \ingroup codecs ++ */ ++ ++/*** MODULEINFO ++ codec2 ++ core ++ ***/ ++ ++#include "asterisk.h" ++ ++#include "asterisk/translate.h" ++#include "asterisk/config.h" ++#include "asterisk/module.h" ++#include "asterisk/utils.h" ++ ++#include ++ ++#define BUFFER_SAMPLES 8000 ++#define CODEC2_SAMPLES 160 ++#define CODEC2_FRAME_LEN 6 ++ ++/* Sample frame data */ ++ ++#include "asterisk/slin.h" ++#include "ex_codec2.h" ++ ++struct codec2_translator_pvt { /* both codec2tolin and codec2togsm */ ++ struct CODEC2 *codec2; ++ int16_t buf[BUFFER_SAMPLES]; /* lintocodec2, temporary storage */ ++}; ++ ++static int codec2_new(struct ast_trans_pvt *pvt) ++{ ++ struct codec2_translator_pvt *tmp = pvt->pvt; ++ ++ tmp->codec2 = codec2_create(CODEC2_MODE_2400); ++ if (!tmp) ++ return -1; ++ ++ return 0; ++} ++ ++/*! \brief decode and store in outbuf. */ ++static int codec2tolin_framein(struct ast_trans_pvt *pvt, struct ast_frame *f) ++{ ++ struct codec2_translator_pvt *tmp = pvt->pvt; ++ int x; ++ int16_t *dst = pvt->outbuf.i16; ++ int flen = CODEC2_FRAME_LEN; ++ ++ for (x=0; x < f->datalen; x += flen) { ++ unsigned char *src; ++ int len; ++ len = CODEC2_SAMPLES; ++ src = f->data.ptr + x; ++ ++ codec2_decode(tmp->codec2, dst + pvt->samples, src); ++ ++ pvt->samples += CODEC2_SAMPLES; ++ pvt->datalen += 2 * CODEC2_SAMPLES; ++ } ++ return 0; ++} ++ ++/*! \brief store samples into working buffer for later decode */ ++static int lintocodec2_framein(struct ast_trans_pvt *pvt, struct ast_frame *f) ++{ ++ struct codec2_translator_pvt *tmp = pvt->pvt; ++ ++ if (pvt->samples + f->samples > BUFFER_SAMPLES) { ++ ast_log(LOG_WARNING, "Out of buffer space\n"); ++ return -1; ++ } ++ memcpy(tmp->buf + pvt->samples, f->data.ptr, f->datalen); ++ pvt->samples += f->samples; ++ return 0; ++} ++ ++/*! \brief encode and produce a frame */ ++static struct ast_frame *lintocodec2_frameout(struct ast_trans_pvt *pvt) ++{ ++ struct codec2_translator_pvt *tmp = pvt->pvt; ++ int datalen = 0; ++ int samples = 0; ++ ++ /* We can't work on anything less than a frame in size */ ++ if (pvt->samples < CODEC2_SAMPLES) ++ return NULL; ++ while (pvt->samples >= CODEC2_SAMPLES) { ++ /* Encode a frame of data */ ++ codec2_encode(tmp->codec2, (unsigned char*)(pvt->outbuf.c + datalen), tmp->buf + samples); ++ datalen += CODEC2_FRAME_LEN; ++ samples += CODEC2_SAMPLES; ++ pvt->samples -= CODEC2_SAMPLES; ++ } ++ ++ /* Move the data at the end of the buffer to the front */ ++ if (pvt->samples) ++ memmove(tmp->buf, tmp->buf + samples, pvt->samples * 2); ++ ++ return ast_trans_frameout(pvt, datalen, samples); ++} ++ ++static void codec2_destroy_stuff(struct ast_trans_pvt *pvt) ++{ ++ struct codec2_translator_pvt *tmp = pvt->pvt; ++ if (tmp->codec2) ++ codec2_destroy(tmp->codec2); ++} ++ ++static struct ast_translator codec2tolin = { ++ .name = "codec2tolin", ++ .newpvt = codec2_new, ++ .framein = codec2tolin_framein, ++ .destroy = codec2_destroy_stuff, ++ .sample = codec2_sample, ++ .buffer_samples = BUFFER_SAMPLES, ++ .buf_size = BUFFER_SAMPLES * 2, ++ .desc_size = sizeof (struct codec2_translator_pvt ), ++}; ++ ++static struct ast_translator lintocodec2 = { ++ .name = "lintocodec2", ++ .newpvt = codec2_new, ++ .framein = lintocodec2_framein, ++ .frameout = lintocodec2_frameout, ++ .destroy = codec2_destroy_stuff, ++ .sample = slin8_sample, ++ .desc_size = sizeof (struct codec2_translator_pvt ), ++ .buf_size = (BUFFER_SAMPLES * CODEC2_FRAME_LEN + CODEC2_SAMPLES - 1)/CODEC2_SAMPLES, ++}; ++ ++/*! \brief standard module glue */ ++static int reload(void) ++{ ++ return AST_MODULE_LOAD_SUCCESS; ++} ++ ++static int unload_module(void) ++{ ++ int res; ++ ++ res = ast_unregister_translator(&lintocodec2); ++ if (!res) ++ res = ast_unregister_translator(&codec2tolin); ++ ++ return res; ++} ++ ++static int load_module(void) ++{ ++ int res; ++ ++ ast_format_set(&codec2tolin.src_format, AST_FORMAT_CODEC2, 0); ++ ast_format_set(&codec2tolin.dst_format, AST_FORMAT_SLINEAR, 0); ++ ++ ast_format_set(&lintocodec2.src_format, AST_FORMAT_SLINEAR, 0); ++ ast_format_set(&lintocodec2.dst_format, AST_FORMAT_CODEC2, 0); ++ ++ res = ast_register_translator(&codec2tolin); ++ if (!res) ++ res=ast_register_translator(&lintocodec2); ++ else ++ ast_unregister_translator(&codec2tolin); ++ if (res) ++ return AST_MODULE_LOAD_FAILURE; ++ return AST_MODULE_LOAD_SUCCESS; ++} ++ ++AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_DEFAULT, "Codec 2 Coder/Decoder", ++ .load = load_module, ++ .unload = unload_module, ++ .reload = reload, ++ ); +diff -urN asterisk-11.8.1-orig/codecs/ex_codec2.h asterisk-11.8.1-codec2/codecs/ex_codec2.h +--- asterisk-11.8.1-orig/codecs/ex_codec2.h 1970-01-01 01:00:00.000000000 +0100 ++++ asterisk-11.8.1-codec2/codecs/ex_codec2.h 2014-04-01 01:30:29.000000000 +0200 +@@ -0,0 +1,29 @@ ++/*! \file ++ * \brief 8-bit raw data ++ * ++ * Copyright (C) 2012, 2012 Ed W and David Rowe ++ * ++ * Distributed under the terms of the GNU General Public License ++ * ++ */ ++ ++static uint8_t ex_codec2[] = { ++ 0xea,0xca,0x14,0x85,0x91,0x78 ++}; ++ ++static struct ast_frame *codec2_sample(void) ++{ ++ static struct ast_frame f = { ++ .frametype = AST_FRAME_VOICE, ++ .datalen = sizeof(ex_codec2), ++ .samples = CODEC2_SAMPLES, ++ .mallocd = 0, ++ .offset = 0, ++ .src = __PRETTY_FUNCTION__, ++ .data.ptr = ex_codec2, ++ }; ++ ++ ast_format_set(&f.subclass.format, AST_FORMAT_CODEC2, 0); ++ ++ return &f; ++} +diff -urN asterisk-11.8.1-orig/configure.ac asterisk-11.8.1-codec2/configure.ac +--- asterisk-11.8.1-orig/configure.ac 2014-01-08 17:17:32.000000000 +0100 ++++ asterisk-11.8.1-codec2/configure.ac 2014-04-01 10:27:08.503390997 +0200 +@@ -384,6 +384,7 @@ + AST_EXT_LIB_SETUP([BKTR], [Stack Backtrace], [execinfo]) + AST_EXT_LIB_SETUP([BLUETOOTH], [Bluetooth], [bluetooth]) + AST_EXT_LIB_SETUP([CAP], [POSIX 1.e capabilities], [cap]) ++AST_EXT_LIB_SETUP([CODEC2], [Codec 2], [codec2]) + AST_EXT_LIB_SETUP([COROSYNC], [Corosync], [cpg]) + AST_EXT_LIB_SETUP_OPTIONAL([COROSYNC_CFG_STATE_TRACK], [A callback only in corosync 1.x], [COROSYNC], [cfg]) + AST_EXT_LIB_SETUP([CURSES], [curses], [curses]) +@@ -2116,6 +2117,8 @@ + + AST_EXT_LIB_CHECK([RADIUS], [radiusclient-ng], [rc_read_config], [radiusclient-ng.h]) + ++AST_EXT_LIB_CHECK([CODEC2], [codec2], [codec2_create], [codec2/codec2.h]) ++ + AST_EXT_LIB_CHECK([COROSYNC], [cpg], [cpg_join], [corosync/cpg.h], [-lcfg]) + AST_EXT_LIB_CHECK([COROSYNC_CFG_STATE_TRACK], [cfg], [corosync_cfg_state_track], [corosync/cfg.h], [-lcfg]) + +diff -urN asterisk-11.8.1-orig/include/asterisk/format.h asterisk-11.8.1-codec2/include/asterisk/format.h +--- asterisk-11.8.1-orig/include/asterisk/format.h 2012-07-13 20:41:07.000000000 +0200 ++++ asterisk-11.8.1-codec2/include/asterisk/format.h 2014-04-01 10:03:16.120355835 +0200 +@@ -101,6 +101,7 @@ + AST_FORMAT_SLINEAR192 = 27 + AST_FORMAT_TYPE_AUDIO, + AST_FORMAT_SPEEX32 = 28 + AST_FORMAT_TYPE_AUDIO, + AST_FORMAT_CELT = 29 + AST_FORMAT_TYPE_AUDIO, ++ AST_FORMAT_CODEC2 = 31 + AST_FORMAT_TYPE_AUDIO, + + /*! H.261 Video */ + AST_FORMAT_H261 = 1 + AST_FORMAT_TYPE_VIDEO, +diff -urN asterisk-11.8.1-orig/main/channel.c asterisk-11.8.1-codec2/main/channel.c +--- asterisk-11.8.1-orig/main/channel.c 2013-12-31 00:16:04.000000000 +0100 ++++ asterisk-11.8.1-codec2/main/channel.c 2014-04-01 10:06:55.659929991 +0200 +@@ -918,6 +918,8 @@ + AST_FORMAT_SILK, + /*! CELT supports crazy high sample rates */ + AST_FORMAT_CELT, ++ /* Codec 2 */ ++ AST_FORMAT_CODEC2, + /*! Ick, LPC10 sounds terrible, but at least we have code for it, if you're tacky enough + to use it */ + AST_FORMAT_LPC10, +diff -urN asterisk-11.8.1-orig/main/format.c asterisk-11.8.1-codec2/main/format.c +--- asterisk-11.8.1-orig/main/format.c 2013-06-12 04:25:23.000000000 +0200 ++++ asterisk-11.8.1-codec2/main/format.c 2014-04-01 10:11:05.319972320 +0200 +@@ -430,6 +430,9 @@ + /*! SpeeX Wideband (16kHz) Free Compression */ + case AST_FORMAT_SPEEX16: + return (1ULL << 33); ++ /*! Codec 2 (8KHz) */ ++ case AST_FORMAT_CODEC2: ++ return (1ULL << 35); + /*! Raw mu-law data (G.711) */ + case AST_FORMAT_TESTLAW: + return (1ULL << 47); +@@ -532,6 +535,9 @@ + /*! SpeeX Wideband (16kHz) Free Compression */ + case (1ULL << 33): + return ast_format_set(dst, AST_FORMAT_SPEEX16, 0); ++ /*! Codec 2 (8KHz) */ ++ case (1ULL << 35): ++ return ast_format_set(dst, AST_FORMAT_CODEC2, 0); + /*! Raw mu-law data (G.711) */ + case (1ULL << 47): + return ast_format_set(dst, AST_FORMAT_TESTLAW, 0); +@@ -1071,6 +1077,8 @@ + format_list_add_static(ast_format_set(&tmpfmt, AST_FORMAT_SLINEAR48, 0), "slin48", 48000, "16 bit Signed Linear PCM (48kHz)", 960, 10, 70, 10, 20, AST_SMOOTHER_FLAG_BE, 0);/*!< Signed linear (48kHz) */ + format_list_add_static(ast_format_set(&tmpfmt, AST_FORMAT_SLINEAR96, 0), "slin96", 96000, "16 bit Signed Linear PCM (96kHz)", 1920, 10, 70, 10, 20, AST_SMOOTHER_FLAG_BE, 0);/*!< Signed linear (96kHz) */ + format_list_add_static(ast_format_set(&tmpfmt, AST_FORMAT_SLINEAR192, 0), "slin192", 192000, "16 bit Signed Linear PCM (192kHz)", 3840, 10, 70, 10, 20, AST_SMOOTHER_FLAG_BE, 0);/*!< Signed linear (192kHz) */ ++ /* Codec 2 */ ++ format_list_add_static(ast_format_set(&tmpfmt, AST_FORMAT_CODEC2, 0), "codec2", 8000, "Codec 2", 6, 20, 20, 20, 20, 0, 0); /*!< codec_codec2.c */ + + return 0; + } +diff -urN asterisk-11.8.1-orig/main/frame.c asterisk-11.8.1-codec2/main/frame.c +--- asterisk-11.8.1-orig/main/frame.c 2012-07-24 18:54:26.000000000 +0200 ++++ asterisk-11.8.1-codec2/main/frame.c 2014-04-01 10:13:35.626395684 +0200 +@@ -1083,6 +1083,10 @@ + /* TODO The assumes 20ms delivery right now, which is incorrect */ + samples = ast_format_rate(&f->subclass.format) / 50; + break; ++ /* Codec 2 */ ++ case AST_FORMAT_CODEC2: ++ samples = 160 * (f->datalen / 6); ++ break; + default: + ast_log(LOG_WARNING, "Unable to calculate samples for format %s\n", ast_getformatname(&f->subclass.format)); + } +@@ -1134,6 +1138,10 @@ + /* 48,000 samples per second at 64kbps is 8,000 bytes per second */ + len = (int) samples / ((float) 48000 / 8000); + break; ++ /* Codec 2 */ ++ case AST_FORMAT_CODEC2: ++ len = (samples / 160) * 6; ++ break; + default: + ast_log(LOG_WARNING, "Unable to calculate sample length for format %s\n", ast_getformatname(format)); + } +diff -urN asterisk-11.8.1-orig/main/rtp_engine.c asterisk-11.8.1-codec2/main/rtp_engine.c +--- asterisk-11.8.1-orig/main/rtp_engine.c 2013-12-18 00:35:07.000000000 +0100 ++++ asterisk-11.8.1-codec2/main/rtp_engine.c 2014-04-01 10:17:00.121681465 +0200 +@@ -2289,6 +2289,8 @@ + set_next_mime_type(ast_format_set(&tmpfmt, AST_FORMAT_SIREN7, 0), 0, "audio", "G7221", 16000); + set_next_mime_type(ast_format_set(&tmpfmt, AST_FORMAT_SIREN14, 0), 0, "audio", "G7221", 32000); + set_next_mime_type(ast_format_set(&tmpfmt, AST_FORMAT_G719, 0), 0, "audio", "G719", 48000); ++ /* Codec 2 */ ++ set_next_mime_type(ast_format_set(&tmpfmt, AST_FORMAT_CODEC2, 0), 0, "audio", "CODEC2", 8000); + + /* Define the static rtp payload mappings */ + add_static_payload(0, ast_format_set(&tmpfmt, AST_FORMAT_ULAW, 0), 0); +@@ -2330,6 +2332,8 @@ + add_static_payload(118, ast_format_set(&tmpfmt, AST_FORMAT_SLINEAR16, 0), 0); /* 16 Khz signed linear */ + add_static_payload(119, ast_format_set(&tmpfmt, AST_FORMAT_SPEEX32, 0), 0); + add_static_payload(121, NULL, AST_RTP_CISCO_DTMF); /* Must be type 121 */ ++ /* Codec 2 */ ++ add_static_payload(121, ast_format_set(&tmpfmt, AST_FORMAT_CODEC2, 0), 0); + + return 0; + } +diff -urN asterisk-11.8.1-orig/makeopts.in asterisk-11.8.1-codec2/makeopts.in +--- asterisk-11.8.1-orig/makeopts.in 2013-04-11 21:59:35.000000000 +0200 ++++ asterisk-11.8.1-codec2/makeopts.in 2014-04-01 10:28:49.424993462 +0200 +@@ -120,6 +120,9 @@ + BLUETOOTH_INCLUDE=@BLUETOOTH_INCLUDE@ + BLUETOOTH_LIB=@BLUETOOTH_LIB@ + ++CODEC2_INCLUDE=@CODEC2_INCLUDE@ ++CODEC2_LIB=@CODEC2_LIB@ ++ + CURL_INCLUDE=@CURL_INCLUDE@ + CURL_LIB=@CURL_LIB@ + +diff -urN asterisk-11.8.1-orig/res/res_rtp_asterisk.c asterisk-11.8.1-codec2/res/res_rtp_asterisk.c +--- asterisk-11.8.1-orig/res/res_rtp_asterisk.c 2014-02-27 22:39:30.000000000 +0100 ++++ asterisk-11.8.1-codec2/res/res_rtp_asterisk.c 2014-04-01 10:19:18.727901747 +0200 +@@ -2738,6 +2738,8 @@ + case AST_FORMAT_SIREN7: + case AST_FORMAT_SIREN14: + case AST_FORMAT_G719: ++ /* Codec 2 */ ++ case AST_FORMAT_CODEC2: + /* these are all frame-based codecs and cannot be safely run through + a smoother */ + break; diff --git a/codec2/tags/0.4.1/asterisk-11/asterisk-11.8.1-opus-codec2.patch b/codec2/tags/0.4.1/asterisk-11/asterisk-11.8.1-opus-codec2.patch new file mode 100644 index 00000000..a90d3d60 --- /dev/null +++ b/codec2/tags/0.4.1/asterisk-11/asterisk-11.8.1-opus-codec2.patch @@ -0,0 +1,384 @@ +diff -urN asterisk-11.8.1-opus/build_tools/menuselect-deps.in asterisk-11.8.1-opus-codec2/build_tools/menuselect-deps.in +--- asterisk-11.8.1-opus/build_tools/menuselect-deps.in 2014-04-01 10:58:52.127106070 +0200 ++++ asterisk-11.8.1-opus-codec2/build_tools/menuselect-deps.in 2014-04-01 10:50:21.490079146 +0200 +@@ -4,6 +4,7 @@ + CRYPTO=@PBX_CRYPTO@ + BFD=@PBX_BFD@ + BISON=@PBX_BISON@ ++CODEC2=@PBX_CODEC2@ + CURL=@PBX_CURL@ + DAHDI=@PBX_DAHDI@ + DLADDR=@PBX_DLADDR@ +diff -urN asterisk-11.8.1-opus/codecs/codec_codec2.c asterisk-11.8.1-opus-codec2/codecs/codec_codec2.c +--- asterisk-11.8.1-opus/codecs/codec_codec2.c 1970-01-01 01:00:00.000000000 +0100 ++++ asterisk-11.8.1-opus-codec2/codecs/codec_codec2.c 2014-04-01 10:50:21.490079146 +0200 +@@ -0,0 +1,190 @@ ++/* ++ * Codec 2 module for Asterisk. ++ * ++ * Credit: codec_gsm.c used as a starting point. ++ * ++ * Copyright (C) 2012 Ed W and David Rowe ++ * ++ * This program is free software, distributed under the terms of ++ * the GNU General Public License Version 2. See the LICENSE file ++ * at the top of the source tree. ++ */ ++ ++/*! \file ++ * ++ * \brief Translate between signed linear and Codec 2 ++ * ++ * \ingroup codecs ++ */ ++ ++/*** MODULEINFO ++ codec2 ++ core ++ ***/ ++ ++#include "asterisk.h" ++ ++#include "asterisk/translate.h" ++#include "asterisk/config.h" ++#include "asterisk/module.h" ++#include "asterisk/utils.h" ++ ++#include ++ ++#define BUFFER_SAMPLES 8000 ++#define CODEC2_SAMPLES 160 ++#define CODEC2_FRAME_LEN 6 ++ ++/* Sample frame data */ ++ ++#include "asterisk/slin.h" ++#include "ex_codec2.h" ++ ++struct codec2_translator_pvt { /* both codec2tolin and codec2togsm */ ++ struct CODEC2 *codec2; ++ int16_t buf[BUFFER_SAMPLES]; /* lintocodec2, temporary storage */ ++}; ++ ++static int codec2_new(struct ast_trans_pvt *pvt) ++{ ++ struct codec2_translator_pvt *tmp = pvt->pvt; ++ ++ tmp->codec2 = codec2_create(CODEC2_MODE_2400); ++ if (!tmp) ++ return -1; ++ ++ return 0; ++} ++ ++/*! \brief decode and store in outbuf. */ ++static int codec2tolin_framein(struct ast_trans_pvt *pvt, struct ast_frame *f) ++{ ++ struct codec2_translator_pvt *tmp = pvt->pvt; ++ int x; ++ int16_t *dst = pvt->outbuf.i16; ++ int flen = CODEC2_FRAME_LEN; ++ ++ for (x=0; x < f->datalen; x += flen) { ++ unsigned char *src; ++ int len; ++ len = CODEC2_SAMPLES; ++ src = f->data.ptr + x; ++ ++ codec2_decode(tmp->codec2, dst + pvt->samples, src); ++ ++ pvt->samples += CODEC2_SAMPLES; ++ pvt->datalen += 2 * CODEC2_SAMPLES; ++ } ++ return 0; ++} ++ ++/*! \brief store samples into working buffer for later decode */ ++static int lintocodec2_framein(struct ast_trans_pvt *pvt, struct ast_frame *f) ++{ ++ struct codec2_translator_pvt *tmp = pvt->pvt; ++ ++ if (pvt->samples + f->samples > BUFFER_SAMPLES) { ++ ast_log(LOG_WARNING, "Out of buffer space\n"); ++ return -1; ++ } ++ memcpy(tmp->buf + pvt->samples, f->data.ptr, f->datalen); ++ pvt->samples += f->samples; ++ return 0; ++} ++ ++/*! \brief encode and produce a frame */ ++static struct ast_frame *lintocodec2_frameout(struct ast_trans_pvt *pvt) ++{ ++ struct codec2_translator_pvt *tmp = pvt->pvt; ++ int datalen = 0; ++ int samples = 0; ++ ++ /* We can't work on anything less than a frame in size */ ++ if (pvt->samples < CODEC2_SAMPLES) ++ return NULL; ++ while (pvt->samples >= CODEC2_SAMPLES) { ++ /* Encode a frame of data */ ++ codec2_encode(tmp->codec2, (unsigned char*)(pvt->outbuf.c + datalen), tmp->buf + samples); ++ datalen += CODEC2_FRAME_LEN; ++ samples += CODEC2_SAMPLES; ++ pvt->samples -= CODEC2_SAMPLES; ++ } ++ ++ /* Move the data at the end of the buffer to the front */ ++ if (pvt->samples) ++ memmove(tmp->buf, tmp->buf + samples, pvt->samples * 2); ++ ++ return ast_trans_frameout(pvt, datalen, samples); ++} ++ ++static void codec2_destroy_stuff(struct ast_trans_pvt *pvt) ++{ ++ struct codec2_translator_pvt *tmp = pvt->pvt; ++ if (tmp->codec2) ++ codec2_destroy(tmp->codec2); ++} ++ ++static struct ast_translator codec2tolin = { ++ .name = "codec2tolin", ++ .newpvt = codec2_new, ++ .framein = codec2tolin_framein, ++ .destroy = codec2_destroy_stuff, ++ .sample = codec2_sample, ++ .buffer_samples = BUFFER_SAMPLES, ++ .buf_size = BUFFER_SAMPLES * 2, ++ .desc_size = sizeof (struct codec2_translator_pvt ), ++}; ++ ++static struct ast_translator lintocodec2 = { ++ .name = "lintocodec2", ++ .newpvt = codec2_new, ++ .framein = lintocodec2_framein, ++ .frameout = lintocodec2_frameout, ++ .destroy = codec2_destroy_stuff, ++ .sample = slin8_sample, ++ .desc_size = sizeof (struct codec2_translator_pvt ), ++ .buf_size = (BUFFER_SAMPLES * CODEC2_FRAME_LEN + CODEC2_SAMPLES - 1)/CODEC2_SAMPLES, ++}; ++ ++/*! \brief standard module glue */ ++static int reload(void) ++{ ++ return AST_MODULE_LOAD_SUCCESS; ++} ++ ++static int unload_module(void) ++{ ++ int res; ++ ++ res = ast_unregister_translator(&lintocodec2); ++ if (!res) ++ res = ast_unregister_translator(&codec2tolin); ++ ++ return res; ++} ++ ++static int load_module(void) ++{ ++ int res; ++ ++ ast_format_set(&codec2tolin.src_format, AST_FORMAT_CODEC2, 0); ++ ast_format_set(&codec2tolin.dst_format, AST_FORMAT_SLINEAR, 0); ++ ++ ast_format_set(&lintocodec2.src_format, AST_FORMAT_SLINEAR, 0); ++ ast_format_set(&lintocodec2.dst_format, AST_FORMAT_CODEC2, 0); ++ ++ res = ast_register_translator(&codec2tolin); ++ if (!res) ++ res=ast_register_translator(&lintocodec2); ++ else ++ ast_unregister_translator(&codec2tolin); ++ if (res) ++ return AST_MODULE_LOAD_FAILURE; ++ return AST_MODULE_LOAD_SUCCESS; ++} ++ ++AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_DEFAULT, "Codec 2 Coder/Decoder", ++ .load = load_module, ++ .unload = unload_module, ++ .reload = reload, ++ ); +diff -urN asterisk-11.8.1-opus/codecs/ex_codec2.h asterisk-11.8.1-opus-codec2/codecs/ex_codec2.h +--- asterisk-11.8.1-opus/codecs/ex_codec2.h 1970-01-01 01:00:00.000000000 +0100 ++++ asterisk-11.8.1-opus-codec2/codecs/ex_codec2.h 2014-04-01 10:50:21.490079146 +0200 +@@ -0,0 +1,29 @@ ++/*! \file ++ * \brief 8-bit raw data ++ * ++ * Copyright (C) 2012, 2012 Ed W and David Rowe ++ * ++ * Distributed under the terms of the GNU General Public License ++ * ++ */ ++ ++static uint8_t ex_codec2[] = { ++ 0xea,0xca,0x14,0x85,0x91,0x78 ++}; ++ ++static struct ast_frame *codec2_sample(void) ++{ ++ static struct ast_frame f = { ++ .frametype = AST_FRAME_VOICE, ++ .datalen = sizeof(ex_codec2), ++ .samples = CODEC2_SAMPLES, ++ .mallocd = 0, ++ .offset = 0, ++ .src = __PRETTY_FUNCTION__, ++ .data.ptr = ex_codec2, ++ }; ++ ++ ast_format_set(&f.subclass.format, AST_FORMAT_CODEC2, 0); ++ ++ return &f; ++} +diff -urN asterisk-11.8.1-opus/configure.ac asterisk-11.8.1-opus-codec2/configure.ac +--- asterisk-11.8.1-opus/configure.ac 2014-04-01 10:58:52.143106352 +0200 ++++ asterisk-11.8.1-opus-codec2/configure.ac 2014-04-01 10:50:21.494079217 +0200 +@@ -384,6 +384,7 @@ + AST_EXT_LIB_SETUP([BKTR], [Stack Backtrace], [execinfo]) + AST_EXT_LIB_SETUP([BLUETOOTH], [Bluetooth], [bluetooth]) + AST_EXT_LIB_SETUP([CAP], [POSIX 1.e capabilities], [cap]) ++AST_EXT_LIB_SETUP([CODEC2], [Codec 2], [codec2]) + AST_EXT_LIB_SETUP([COROSYNC], [Corosync], [cpg]) + AST_EXT_LIB_SETUP_OPTIONAL([COROSYNC_CFG_STATE_TRACK], [A callback only in corosync 1.x], [COROSYNC], [cfg]) + AST_EXT_LIB_SETUP([CURSES], [curses], [curses]) +@@ -2117,6 +2118,8 @@ + + AST_EXT_LIB_CHECK([RADIUS], [radiusclient-ng], [rc_read_config], [radiusclient-ng.h]) + ++AST_EXT_LIB_CHECK([CODEC2], [codec2], [codec2_create], [codec2/codec2.h]) ++ + AST_EXT_LIB_CHECK([COROSYNC], [cpg], [cpg_join], [corosync/cpg.h], [-lcfg]) + AST_EXT_LIB_CHECK([COROSYNC_CFG_STATE_TRACK], [cfg], [corosync_cfg_state_track], [corosync/cfg.h], [-lcfg]) + +diff -urN asterisk-11.8.1-opus/include/asterisk/format.h asterisk-11.8.1-opus-codec2/include/asterisk/format.h +--- asterisk-11.8.1-opus/include/asterisk/format.h 2014-04-01 10:58:52.143106352 +0200 ++++ asterisk-11.8.1-opus-codec2/include/asterisk/format.h 2014-04-01 10:53:25.961351185 +0200 +@@ -103,6 +103,7 @@ + AST_FORMAT_CELT = 29 + AST_FORMAT_TYPE_AUDIO, + /*! Opus */ + AST_FORMAT_OPUS = 30 + AST_FORMAT_TYPE_AUDIO, ++ AST_FORMAT_CODEC2 = 31 + AST_FORMAT_TYPE_AUDIO, + + /*! H.261 Video */ + AST_FORMAT_H261 = 1 + AST_FORMAT_TYPE_VIDEO, +diff -urN asterisk-11.8.1-opus/main/channel.c asterisk-11.8.1-opus-codec2/main/channel.c +--- asterisk-11.8.1-opus/main/channel.c 2014-04-01 10:58:52.147106422 +0200 ++++ asterisk-11.8.1-opus-codec2/main/channel.c 2014-04-01 10:50:21.498079289 +0200 +@@ -920,6 +920,8 @@ + AST_FORMAT_SILK, + /*! CELT supports crazy high sample rates */ + AST_FORMAT_CELT, ++ /* Codec 2 */ ++ AST_FORMAT_CODEC2, + /*! Ick, LPC10 sounds terrible, but at least we have code for it, if you're tacky enough + to use it */ + AST_FORMAT_LPC10, +diff -urN asterisk-11.8.1-opus/main/format.c asterisk-11.8.1-opus-codec2/main/format.c +--- asterisk-11.8.1-opus/main/format.c 2014-04-01 10:58:52.147106422 +0200 ++++ asterisk-11.8.1-opus-codec2/main/format.c 2014-04-01 10:52:23.820250398 +0200 +@@ -433,6 +433,9 @@ + /*! Opus audio (8kHz, 16kHz, 24kHz, 48Khz) */ + case AST_FORMAT_OPUS: + return (1ULL << 34); ++ /*! Codec 2 (8KHz) */ ++ case AST_FORMAT_CODEC2: ++ return (1ULL << 35); + /*! Raw mu-law data (G.711) */ + case AST_FORMAT_TESTLAW: + return (1ULL << 47); +@@ -541,6 +544,9 @@ + /*! Opus audio (8kHz, 16kHz, 24kHz, 48Khz) */ + case (1ULL << 34): + return ast_format_set(dst, AST_FORMAT_OPUS, 0); ++ /*! Codec 2 (8KHz) */ ++ case (1ULL << 35): ++ return ast_format_set(dst, AST_FORMAT_CODEC2, 0); + /*! Raw mu-law data (G.711) */ + case (1ULL << 47): + return ast_format_set(dst, AST_FORMAT_TESTLAW, 0); +@@ -1090,6 +1096,8 @@ + format_list_add_static(ast_format_set(&tmpfmt, AST_FORMAT_OPUS, 0), "opus", 48000, "Opus Codec", 10, 20, 60, 20, 20, 0, 0); /*!< codec_opus.c */ + /* VP8 (passthrough) */ + format_list_add_static(ast_format_set(&tmpfmt, AST_FORMAT_VP8, 0), "vp8", 0, "VP8 Video", 0, 0, 0, 0 ,0 ,0, 0); /*!< Passthrough support, see format_h263.c */ ++ /* Codec 2 */ ++ format_list_add_static(ast_format_set(&tmpfmt, AST_FORMAT_CODEC2, 0), "codec2", 8000, "Codec 2", 6, 20, 20, 20, 20, 0, 0); /*!< codec_codec2.c */ + + return 0; + } +diff -urN asterisk-11.8.1-opus/main/frame.c asterisk-11.8.1-opus-codec2/main/frame.c +--- asterisk-11.8.1-opus/main/frame.c 2014-04-01 10:58:52.151106493 +0200 ++++ asterisk-11.8.1-opus-codec2/main/frame.c 2014-04-01 10:50:21.502079360 +0200 +@@ -1121,6 +1121,10 @@ + case AST_FORMAT_OPUS: + samples = opus_samples(f->data.ptr, f->datalen); + break; ++ /* Codec 2 */ ++ case AST_FORMAT_CODEC2: ++ samples = 160 * (f->datalen / 6); ++ break; + default: + ast_log(LOG_WARNING, "Unable to calculate samples for format %s\n", ast_getformatname(&f->subclass.format)); + } +@@ -1172,6 +1176,10 @@ + /* 48,000 samples per second at 64kbps is 8,000 bytes per second */ + len = (int) samples / ((float) 48000 / 8000); + break; ++ /* Codec 2 */ ++ case AST_FORMAT_CODEC2: ++ len = (samples / 160) * 6; ++ break; + default: + ast_log(LOG_WARNING, "Unable to calculate sample length for format %s\n", ast_getformatname(format)); + } +diff -urN asterisk-11.8.1-opus/main/rtp_engine.c asterisk-11.8.1-opus-codec2/main/rtp_engine.c +--- asterisk-11.8.1-opus/main/rtp_engine.c 2014-04-01 10:58:52.151106493 +0200 ++++ asterisk-11.8.1-opus-codec2/main/rtp_engine.c 2014-04-01 10:51:17.367071621 +0200 +@@ -2292,6 +2292,8 @@ + /* Opus and VP8 */ + set_next_mime_type(ast_format_set(&tmpfmt, AST_FORMAT_OPUS, 0), 0, "audio", "opus", 48000); + set_next_mime_type(ast_format_set(&tmpfmt, AST_FORMAT_VP8, 0), 0, "video", "VP8", 90000); ++ /* Codec 2 */ ++ set_next_mime_type(ast_format_set(&tmpfmt, AST_FORMAT_CODEC2, 0), 0, "audio", "CODEC2", 8000); + + /* Define the static rtp payload mappings */ + add_static_payload(0, ast_format_set(&tmpfmt, AST_FORMAT_ULAW, 0), 0); +@@ -2336,6 +2338,8 @@ + /* Opus and VP8 */ + add_static_payload(100, ast_format_set(&tmpfmt, AST_FORMAT_VP8, 0), 0); + add_static_payload(107, ast_format_set(&tmpfmt, AST_FORMAT_OPUS, 0), 0); ++ /* Codec 2 */ ++ add_static_payload(121, ast_format_set(&tmpfmt, AST_FORMAT_CODEC2, 0), 0); + + return 0; + } +diff -urN asterisk-11.8.1-opus/makeopts.in asterisk-11.8.1-opus-codec2/makeopts.in +--- asterisk-11.8.1-opus/makeopts.in 2014-04-01 10:58:52.151106493 +0200 ++++ asterisk-11.8.1-opus-codec2/makeopts.in 2014-04-01 10:50:21.538079999 +0200 +@@ -120,6 +120,9 @@ + BLUETOOTH_INCLUDE=@BLUETOOTH_INCLUDE@ + BLUETOOTH_LIB=@BLUETOOTH_LIB@ + ++CODEC2_INCLUDE=@CODEC2_INCLUDE@ ++CODEC2_LIB=@CODEC2_LIB@ ++ + CURL_INCLUDE=@CURL_INCLUDE@ + CURL_LIB=@CURL_LIB@ + +diff -urN asterisk-11.8.1-opus/res/res_rtp_asterisk.c asterisk-11.8.1-opus-codec2/res/res_rtp_asterisk.c +--- asterisk-11.8.1-opus/res/res_rtp_asterisk.c 2014-04-01 10:58:52.151106493 +0200 ++++ asterisk-11.8.1-opus-codec2/res/res_rtp_asterisk.c 2014-04-01 10:53:02.292932085 +0200 +@@ -2780,6 +2780,8 @@ + case AST_FORMAT_G719: + /* Opus */ + case AST_FORMAT_OPUS: ++ /* Codec 2 */ ++ case AST_FORMAT_CODEC2: + /* these are all frame-based codecs and cannot be safely run through + a smoother */ + break; diff --git a/codec2/tags/0.4.1/asterisk/README b/codec2/tags/0.4.1/asterisk/README new file mode 100644 index 00000000..a2d3b512 --- /dev/null +++ b/codec2/tags/0.4.1/asterisk/README @@ -0,0 +1,109 @@ +README for codec2/asterisk +Asterisk Codec 2 support + +Test Configuration +------------------ + +Codec 2 is used to trunk calls between two Asterisk boxes: + + A - SIP phone - Asterisk A - Codec2 - Asterisk B - SIP Phone - B + +The two SIP phones are configured for mulaw. + +Building +--------- + +Asterisk must be patched so that the core understand Codec 2 frames. + +1/ First install Codec 2: + + david@cool:~$ svn co https://freetel.svn.sourceforge.net/svnroot/freetel/codec2-dev codec2-dev + david@cool:~/codec2-dev$ cd codec2-dev + david@cool:~/codec2-dev$ ./configure && make && sudo make install + david@bear:~/codec2-dev$ sudo ldconfig -v + david@cool:~/codec2-dev$ cd ~ + +2/ Then build Asterisk with Codec 2 support: + + david@cool:~$ tar xvzf asterisk-1.8.9.0.tar.gz + david@cool:~/asterisk-1.8.9.0$ patch -p4 < ~/codec2-dev/asterisk/asterisk-codec2.patch + david@cool:~/asterisk-1.8.9.0$ cp ~/codec2-dev/asterisk/codec_codec2.c . + david@cool:~/asterisk-1.8.9.0$ cp ~/codec2-dev/asterisk/ex_codec2.h ./codecs + david@cool:~/asterisk-1.8.9.0$ ./configure && make ASTLDFLAGS=-lcodec2 + david@cool:~/asterisk-1.8.9.0$ sudo make install + david@cool:~/asterisk-1.8.9.0$ sudo make samples + +3/ Add this to the end of sip.conf on Asterisk A: + + [6013] + type=friend + context=default + host=dynamic + user=6013 + secret=6013 + canreinvite=no + callerid=6013 + disallow=all + allow=ulaw + + [potato] + type=peer + username=potato + fromuser=potato + secret=password + context=default + disallow=all + dtmfmode=rfc2833 + callerid=server + canreinvite=no + host=cool + allow=codec2 + +3/ Add this to the end of sip.conf on Asterisk B: + + [6014] + type=friend + context=default + host=dynamic + user=6014 + secret=6014 + canreinvite=no + callerid=6014 + disallow=all + allow=ulaw + + [potato] + type=peer + username=potato + fromuser=potato + secret=password + context=default + disallow=all + dtmfmode=rfc2833 + callerid=server + canreinvite=no + host=bear + allow=codec2 + +4/ Here is the [default] section of extensions.conf on Asterisk B: + + [default] + + exten => 6013,1,Dial(SIP/potato/6013) + ; + ; By default we include the demo. In a production system, you + ; probably don't want to have the demo there. + ; + ;include => demo + +5/ After booting see if the codec2_codec2.so module is loaded with "core show translate" + +6/ To make a test call dial 6013 on the SIP phone connected to Asterisk B + +7/ If codec_codec2.so won't load and you see "can't find codec2_create" try: + + david@cool:~/asterisk-1.8.9.0$ touch codecs/codec_codec2.c + david@cool:~/asterisk-1.8.9.0$ make ASTLDFLAGS=-lcodec2 + david@cool:~/asterisk-1.8.9.0$ sudo cp codecs/codec_codec2.so /usr/lib/asterisk/modules + david@cool:~/asterisk-1.8.9.0$ sudo asterisk -vvvcn + diff --git a/codec2/tags/0.4.1/asterisk/asterisk-codec2.patch b/codec2/tags/0.4.1/asterisk/asterisk-codec2.patch new file mode 100644 index 00000000..53569ff9 --- /dev/null +++ b/codec2/tags/0.4.1/asterisk/asterisk-codec2.patch @@ -0,0 +1,68 @@ +--- /home/david/asterisk-1.8.9.0-orig/include/asterisk/frame.h 2011-12-23 05:08:46.000000000 +1030 ++++ /home/david/asterisk-1.8.9.0-codec2/include/asterisk/frame.h 2012-03-27 13:16:55.623452431 +1030 +@@ -299,6 +299,7 @@ + #define AST_FORMAT_G719 (1ULL << 32) + /*! SpeeX Wideband (16kHz) Free Compression */ + #define AST_FORMAT_SPEEX16 (1ULL << 33) ++#define AST_FORMAT_CODEC2 (1ULL << 34) + /*! Raw mu-law data (G.711) */ + #define AST_FORMAT_TESTLAW (1ULL << 47) + /*! Reserved bit - do not use */ +--- /home/david/asterisk-1.8.9.0-orig/main/frame.c 2010-06-18 02:53:43.000000000 +0930 ++++ /home/david/asterisk-1.8.9.0-codec2/main/frame.c 2012-03-28 15:16:16.975581316 +1030 +@@ -102,6 +102,7 @@ + { AST_FORMAT_ADPCM, "adpcm" , 8000, "ADPCM", 40, 10, 300, 10, 20 }, /*!< codec_adpcm.c */ + { AST_FORMAT_SLINEAR, "slin", 8000, "16 bit Signed Linear PCM", 160, 10, 70, 10, 20, AST_SMOOTHER_FLAG_BE }, /*!< Signed linear */ + { AST_FORMAT_LPC10, "lpc10", 8000, "LPC10", 7, 20, 20, 20, 20 }, /*!< codec_lpc10.c */ ++ { AST_FORMAT_CODEC2, "codec2", 8000, "Codec 2", 6, 20, 20, 20, 20 }, /*!< codec_codec2.c */ + { AST_FORMAT_G729A, "g729", 8000, "G.729A", 10, 10, 230, 10, 20, AST_SMOOTHER_FLAG_G729 }, /*!< Binary commercial distribution */ + { AST_FORMAT_SPEEX, "speex", 8000, "SpeeX", 10, 10, 60, 10, 20 }, /*!< codec_speex.c */ + { AST_FORMAT_SPEEX16, "speex16", 16000, "SpeeX 16khz", 10, 10, 60, 10, 20 }, /*!< codec_speex.c */ +@@ -1475,6 +1476,9 @@ + samples = 22 * 8; + samples += (((char *)(f->data.ptr))[7] & 0x1) * 8; + break; ++ case AST_FORMAT_CODEC2: ++ samples = 160 * (f->datalen / 6); ++ break; + case AST_FORMAT_ULAW: + case AST_FORMAT_ALAW: + case AST_FORMAT_TESTLAW: +@@ -1519,6 +1523,9 @@ + case AST_FORMAT_GSM: + len = (samples / 160) * 33; + break; ++ case AST_FORMAT_CODEC2: ++ len = (samples / 160) * 6; ++ break; + case AST_FORMAT_G729A: + len = samples / 8; + break; +--- /home/david/asterisk-1.8.9.0-orig/main/channel.c 2011-12-17 10:21:13.000000000 +1030 ++++ /home/david/asterisk-1.8.9.0-codec2/main/channel.c 2012-03-28 15:05:22.395293391 +1030 +@@ -1075,6 +1075,7 @@ + /*! Ick, LPC10 sounds terrible, but at least we have code for it, if you're tacky enough + to use it */ + AST_FORMAT_LPC10, ++ AST_FORMAT_CODEC2, + /*! G.729a is faster than 723 and slightly less expensive */ + AST_FORMAT_G729A, + /*! Down to G.723.1 which is proprietary but at least designed for voice */ +--- /home/david/asterisk-1.8.9.0-orig/main/rtp_engine.c 2011-12-30 01:43:03.000000000 +1030 ++++ /home/david/asterisk-1.8.9.0-codec2/main/rtp_engine.c 2012-03-28 16:42:02.880872891 +1030 +@@ -101,6 +101,7 @@ + {{1, AST_FORMAT_SLINEAR}, "audio", "L16", 8000}, + {{1, AST_FORMAT_SLINEAR16}, "audio", "L16", 16000}, + {{1, AST_FORMAT_LPC10}, "audio", "LPC", 8000}, ++ {{1, AST_FORMAT_CODEC2}, "audio", "CODEC2", 8000}, + {{1, AST_FORMAT_G729A}, "audio", "G729", 8000}, + {{1, AST_FORMAT_G729A}, "audio", "G729A", 8000}, + {{1, AST_FORMAT_G729A}, "audio", "G.729", 8000}, +@@ -178,6 +179,7 @@ + [117] = {1, AST_FORMAT_SPEEX16}, + [118] = {1, AST_FORMAT_SLINEAR16}, /* 16 Khz signed linear */ + [121] = {0, AST_RTP_CISCO_DTMF}, /* Must be type 121 */ ++ [121] = {1, AST_FORMAT_CODEC2}, + }; + + int ast_rtp_engine_register2(struct ast_rtp_engine *engine, struct ast_module *module) diff --git a/codec2/tags/0.4.1/asterisk/codec_codec2.c b/codec2/tags/0.4.1/asterisk/codec_codec2.c new file mode 100644 index 00000000..d161be7e --- /dev/null +++ b/codec2/tags/0.4.1/asterisk/codec_codec2.c @@ -0,0 +1,187 @@ +/* + * Codec 2 module for Asterisk. + * + * Credit: codec_gsm.c used as a starting point. + * + * Copyright (C) 2012 Ed W and David Rowe + * + * This program is free software, distributed under the terms of + * the GNU General Public License Version 2. See the LICENSE file + * at the top of the source tree. + */ + +/*! \file + * + * \brief Translate between signed linear and Codec 2 + * + * \ingroup codecs + */ + +/*** MODULEINFO + core + ***/ + +#include "asterisk.h" + +#include "asterisk/translate.h" +#include "asterisk/config.h" +#include "asterisk/module.h" +#include "asterisk/utils.h" + +#include + +#define BUFFER_SAMPLES 8000 +#define CODEC2_SAMPLES 160 +#define CODEC2_FRAME_LEN 6 + +/* Sample frame data */ + +#include "asterisk/slin.h" +#include "ex_codec2.h" + +struct codec2_translator_pvt { /* both codec2tolin and codec2togsm */ + struct CODEC2 *codec2; + int16_t buf[BUFFER_SAMPLES]; /* lintocodec2, temporary storage */ +}; + +static int codec2_new(struct ast_trans_pvt *pvt) +{ + struct codec2_translator_pvt *tmp = pvt->pvt; + + tmp->codec2 = codec2_create(CODEC2_MODE_2400); + if (!tmp->codec2) + return -1; + + return 0; +} + +/*! \brief decode and store in outbuf. */ +static int codec2tolin_framein(struct ast_trans_pvt *pvt, struct ast_frame *f) +{ + struct codec2_translator_pvt *tmp = pvt->pvt; + int x; + int16_t *dst = pvt->outbuf.i16; + int flen = CODEC2_FRAME_LEN; + + for (x=0; x < f->datalen; x += flen) { + unsigned char *src; + int len; + len = CODEC2_SAMPLES; + src = f->data.ptr + x; + + codec2_decode(tmp->codec2, dst + pvt->samples, src); + + pvt->samples += CODEC2_SAMPLES; + pvt->datalen += 2 * CODEC2_SAMPLES; + } + return 0; +} + +/*! \brief store samples into working buffer for later decode */ +static int lintocodec2_framein(struct ast_trans_pvt *pvt, struct ast_frame *f) +{ + struct codec2_translator_pvt *tmp = pvt->pvt; + + if (pvt->samples + f->samples > BUFFER_SAMPLES) { + ast_log(LOG_WARNING, "Out of buffer space\n"); + return -1; + } + memcpy(tmp->buf + pvt->samples, f->data.ptr, f->datalen); + pvt->samples += f->samples; + return 0; +} + +/*! \brief encode and produce a frame */ +static struct ast_frame *lintocodec2_frameout(struct ast_trans_pvt *pvt) +{ + struct codec2_translator_pvt *tmp = pvt->pvt; + int datalen = 0; + int samples = 0; + + /* We can't work on anything less than a frame in size */ + if (pvt->samples < CODEC2_SAMPLES) + return NULL; + while (pvt->samples >= CODEC2_SAMPLES) { + /* Encode a frame of data */ + codec2_encode(tmp->codec2, (unsigned char*)(pvt->outbuf.c + datalen), tmp->buf + samples); + datalen += CODEC2_FRAME_LEN; + samples += CODEC2_SAMPLES; + pvt->samples -= CODEC2_SAMPLES; + } + + /* Move the data at the end of the buffer to the front */ + if (pvt->samples) + memmove(tmp->buf, tmp->buf + samples, pvt->samples * 2); + + return ast_trans_frameout(pvt, datalen, samples); +} + +static void codec2_destroy_stuff(struct ast_trans_pvt *pvt) +{ + struct codec2_translator_pvt *tmp = pvt->pvt; + if (tmp->codec2) + codec2_destroy(tmp->codec2); +} + +static struct ast_translator codec2tolin = { + .name = "codec2tolin", + .srcfmt = AST_FORMAT_CODEC2, + .dstfmt = AST_FORMAT_SLINEAR, + .newpvt = codec2_new, + .framein = codec2tolin_framein, + .destroy = codec2_destroy_stuff, + .sample = codec2_sample, + .buffer_samples = BUFFER_SAMPLES, + .buf_size = BUFFER_SAMPLES * 2, + .desc_size = sizeof (struct codec2_translator_pvt ), +}; + +static struct ast_translator lintocodec2 = { + .name = "lintocodec2", + .srcfmt = AST_FORMAT_SLINEAR, + .dstfmt = AST_FORMAT_CODEC2, + .newpvt = codec2_new, + .framein = lintocodec2_framein, + .frameout = lintocodec2_frameout, + .destroy = codec2_destroy_stuff, + .sample = slin8_sample, + .desc_size = sizeof (struct codec2_translator_pvt ), + .buf_size = (BUFFER_SAMPLES * CODEC2_FRAME_LEN + CODEC2_SAMPLES - 1)/CODEC2_SAMPLES, +}; + +/*! \brief standard module glue */ +static int reload(void) +{ + return AST_MODULE_LOAD_SUCCESS; +} + +static int unload_module(void) +{ + int res; + + res = ast_unregister_translator(&lintocodec2); + if (!res) + res = ast_unregister_translator(&codec2tolin); + + return res; +} + +static int load_module(void) +{ + int res; + + res = ast_register_translator(&codec2tolin); + if (!res) + res=ast_register_translator(&lintocodec2); + else + ast_unregister_translator(&codec2tolin); + if (res) + return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_SUCCESS; +} + +AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_DEFAULT, "Codec 2 Coder/Decoder", + .load = load_module, + .unload = unload_module, + .reload = reload, + ); diff --git a/codec2/tags/0.4.1/asterisk/ex_codec2.h b/codec2/tags/0.4.1/asterisk/ex_codec2.h new file mode 100644 index 00000000..ac5782dd --- /dev/null +++ b/codec2/tags/0.4.1/asterisk/ex_codec2.h @@ -0,0 +1,28 @@ +/*! \file + * \brief 8-bit raw data + * + * Copyright (C) 2012, 2012 Ed W and David Rowe + * + * Distributed under the terms of the GNU General Public License + * + */ + +static uint8_t ex_codec2[] = { + 0xea,0xca,0x14,0x85,0x91,0x78 +}; + +static struct ast_frame *codec2_sample(void) +{ + static struct ast_frame f = { + .frametype = AST_FRAME_VOICE, + .subclass.codec = AST_FORMAT_CODEC2, + .datalen = sizeof(ex_codec2), + .samples = CODEC2_SAMPLES, + .mallocd = 0, + .offset = 0, + .src = __PRETTY_FUNCTION__, + .data.ptr = ex_codec2, + }; + + return &f; +} diff --git a/codec2/tags/0.4.1/asterisk/make_asterisk_patch.sh b/codec2/tags/0.4.1/asterisk/make_asterisk_patch.sh new file mode 100755 index 00000000..a642bf7f --- /dev/null +++ b/codec2/tags/0.4.1/asterisk/make_asterisk_patch.sh @@ -0,0 +1,11 @@ +#!/bin/sh +# Create patch for Codec 2 support inside Asterisk + +ORIG=~/asterisk-1.8.9.0-orig +CODEC2=~/asterisk-1.8.9.0-codec2 +diff -ruN $ORIG/include/asterisk/frame.h $CODEC2/include/asterisk/frame.h > asterisk-codec2.patch +diff -ruN $ORIG/main/frame.c $CODEC2/main/frame.c >> asterisk-codec2.patch +diff -ruN $ORIG/main/channel.c $CODEC2/main/channel.c >> asterisk-codec2.patch +diff -ruN $ORIG/main/rtp_engine.c $CODEC2/main/rtp_engine.c >> asterisk-codec2.patch + + diff --git a/codec2/tags/0.4.1/cmake/GetDependencies.cmake.in b/codec2/tags/0.4.1/cmake/GetDependencies.cmake.in new file mode 100644 index 00000000..067ad5e8 --- /dev/null +++ b/codec2/tags/0.4.1/cmake/GetDependencies.cmake.in @@ -0,0 +1,24 @@ +# As this script is run in a new cmake instance, it does not have access to +# the existing cache variables. Pass them in via the configure_file command. +set(CMAKE_BINARY_DIR @CMAKE_BINARY_DIR@) +set(CMAKE_SOURCE_DIR @CMAKE_SOURCE_DIR@) +set(UNIX @UNIX@) +set(WIN32 @WIN32@) +set(CMAKE_CROSSCOMPILING @CMAKE_CROSSCOMPILING@) +set(CMAKE_FIND_LIBRARY_SUFFIXES @CMAKE_FIND_LIBRARY_SUFFIXES@) +set(CMAKE_FIND_LIBRARY_PREFIXES @CMAKE_FIND_LIBRARY_PREFIXES@) +set(CMAKE_SYSTEM_LIBRARY_PATH @CMAKE_SYSTEM_LIBRARY_PATH@) +set(CMAKE_FIND_ROOT_PATH @CMAKE_FIND_ROOT_PATH@) +set(CODEC2_DLL ${CMAKE_BINARY_DIR}/src/libcodec2.dll) + +include(GetPrerequisites) +get_prerequisites(${CODEC2_DLL} _deps 1 1 "" "") +foreach(_runtime ${_deps}) + message("Looking for ${_runtime}") + find_library(RUNTIME_${_runtime} ${_runtime}) + message("${RUNTIME_${_runtime}}") + if(RUNTIME_${_runtime}) + file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/bin" + TYPE EXECUTABLE FILES "${RUNTIME_${_runtime}}") + endif() +endforeach() diff --git a/codec2/tags/0.4.1/cmake/config.h.in b/codec2/tags/0.4.1/cmake/config.h.in new file mode 100644 index 00000000..60ee7d62 --- /dev/null +++ b/codec2/tags/0.4.1/cmake/config.h.in @@ -0,0 +1,23 @@ +/*-------------------------------------------------------------------------- + ** This file is autogenerated from config.h.in + ** during the cmake configuration of your project. If you need to make changes + ** edit the original file NOT THIS FILE. + ** --------------------------------------------------------------------------*/ +#ifndef _CONFIGURATION_HEADER_GUARD_H_ +#define _CONFIGURATION_HEADER_GUARD_H_ + +#define SIZEOF_INT @SIZEOF_INT@ +#cmakedefine HAVE_STDLIB_H @HAVE_STDLIB_H@ +#cmakedefine HAVE_STRING_H @HAVE_STRING_H@ +#cmakedefine HAVE_FLOOR @HAVE_FLOOR@ +#cmakedefine HAVE_CEIL @HAVE_CEIL@ +#cmakedefine HAVE_MEMSET @HAVE_MEMSET@ +#cmakedefine HAVE_POW @HAVE_POW@ +#cmakedefine HAVE_SQRT @HAVE_SQRT@ +#cmakedefine HAVE_SIN @HAVE_SIN@ +#cmakedefine HAVE_COS @HAVE_COS@ +#cmakedefine HAVE_ATAN2 @HAVE_ATAN2@ +#cmakedefine HAVE_LOG10 @HAVE_LOG10@ +#cmakedefine HAVE_ROUND @HAVE_ROUND@ +#cmakedefine HAVE_GETOPT @HAVE_GETOPT@ +#endif diff --git a/codec2/tags/0.4.1/debian/changelog b/codec2/tags/0.4.1/debian/changelog new file mode 100644 index 00000000..214efcf9 --- /dev/null +++ b/codec2/tags/0.4.1/debian/changelog @@ -0,0 +1,5 @@ +codec2 (0.4-150830) unstable; urgency=low + + * Subversion snapshot of tag 0.4. + + -- Stuart Longland Sun, 30 Aug 2015 08:57:09 +1000 diff --git a/codec2/tags/0.4.1/debian/codec2.doc-base.EX b/codec2/tags/0.4.1/debian/codec2.doc-base.EX new file mode 100644 index 00000000..58360877 --- /dev/null +++ b/codec2/tags/0.4.1/debian/codec2.doc-base.EX @@ -0,0 +1,20 @@ +Document: codec2 +Title: Debian codec2 Manual +Author: +Abstract: This manual describes what codec2 is + and how it can be used to + manage online manuals on Debian systems. +Section: unknown + +Format: debiandoc-sgml +Files: /usr/share/doc/codec2/codec2.sgml.gz + +Format: postscript +Files: /usr/share/doc/codec2/codec2.ps.gz + +Format: text +Files: /usr/share/doc/codec2/codec2.text.gz + +Format: HTML +Index: /usr/share/doc/codec2/html/index.html +Files: /usr/share/doc/codec2/html/*.html diff --git a/codec2/tags/0.4.1/debian/codec2.install b/codec2/tags/0.4.1/debian/codec2.install new file mode 100644 index 00000000..1df36c61 --- /dev/null +++ b/codec2/tags/0.4.1/debian/codec2.install @@ -0,0 +1 @@ +usr/bin/* diff --git a/codec2/tags/0.4.1/debian/codec21.dirs b/codec2/tags/0.4.1/debian/codec21.dirs new file mode 100644 index 00000000..68457717 --- /dev/null +++ b/codec2/tags/0.4.1/debian/codec21.dirs @@ -0,0 +1 @@ +usr/lib diff --git a/codec2/tags/0.4.1/debian/codec21.install b/codec2/tags/0.4.1/debian/codec21.install new file mode 100644 index 00000000..d0dbfd18 --- /dev/null +++ b/codec2/tags/0.4.1/debian/codec21.install @@ -0,0 +1 @@ +usr/lib/lib*.so.* diff --git a/codec2/tags/0.4.1/debian/compat b/codec2/tags/0.4.1/debian/compat new file mode 100644 index 00000000..ec635144 --- /dev/null +++ b/codec2/tags/0.4.1/debian/compat @@ -0,0 +1 @@ +9 diff --git a/codec2/tags/0.4.1/debian/control b/codec2/tags/0.4.1/debian/control new file mode 100644 index 00000000..de9aa3bf --- /dev/null +++ b/codec2/tags/0.4.1/debian/control @@ -0,0 +1,36 @@ +Source: codec2 +Priority: optional +Maintainer: Stuart Longland +Build-Depends: debhelper (>= 9), cmake, libspeexdsp-dev +Standards-Version: 3.9.5 +Section: libs +Homepage: http://www.freedv.org + +Package: libcodec2-dev +Section: libdevel +Architecture: any +Depends: libcodec2 (= ${binary:Version}), ${misc:Depends} +Description: Codec 2: ultra-low bitrate voice codec. Headers. + Codec 2 is an ultra-low bitrate (sub 4kbps) voice codec + for use in radio frequency communications applications. + . + This package provides the headers. + +Package: libcodec2 +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends}, libspeexdsp1 +Description: Codec 2: ultra-low bitrate voice codec. Library. + Codec 2 is an ultra-low bitrate (sub 4kbps) voice codec + for use in radio frequency communications applications. + . + This package provides the runtime library. + +Package: codec2 +Architecture: any +Depends: libcodec2 (= ${binary:Version}), ${shlibs:Depends}, ${misc:Depends} +Description: Codec 2: ultra-low bitrate voice codec. Utilities. + Codec 2 is an ultra-low bitrate (sub 4kbps) voice codec + for use in radio frequency communications applications. + . + This package provides some command line utilities for encoding + and decoding codec2. diff --git a/codec2/tags/0.4.1/debian/copyright b/codec2/tags/0.4.1/debian/copyright new file mode 100644 index 00000000..598dd85a --- /dev/null +++ b/codec2/tags/0.4.1/debian/copyright @@ -0,0 +1,38 @@ +Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ +Upstream-Name: codec2 +Source: + +Files: * +Copyright: + +License: + + + . + + +# If you want to use GPL v2 or later for the /debian/* files use +# the following clauses, or change it to suit. Delete these two lines +Files: debian/* +Copyright: 2015 unknown +License: GPL-2+ + This package is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + . + This package 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 General Public License + along with this program. If not, see + . + On Debian systems, the complete text of the GNU General + Public License version 2 can be found in "/usr/share/common-licenses/GPL-2". + +# Please also look if there are files or directories which have a +# different copyright/license attached and list them here. +# Please avoid to pick license terms that are more restrictive than the +# packaged work, as it may make Debian's contributions unacceptable upstream. diff --git a/codec2/tags/0.4.1/debian/docs b/codec2/tags/0.4.1/debian/docs new file mode 100644 index 00000000..8e229a37 --- /dev/null +++ b/codec2/tags/0.4.1/debian/docs @@ -0,0 +1,6 @@ +NEWS +README +README_fdmdv.txt +AUTHORS +ChangeLog +INSTALL diff --git a/codec2/tags/0.4.1/debian/libcodec2-dev.dirs b/codec2/tags/0.4.1/debian/libcodec2-dev.dirs new file mode 100644 index 00000000..44188162 --- /dev/null +++ b/codec2/tags/0.4.1/debian/libcodec2-dev.dirs @@ -0,0 +1,2 @@ +usr/lib +usr/include diff --git a/codec2/tags/0.4.1/debian/libcodec2-dev.install b/codec2/tags/0.4.1/debian/libcodec2-dev.install new file mode 100644 index 00000000..41a14144 --- /dev/null +++ b/codec2/tags/0.4.1/debian/libcodec2-dev.install @@ -0,0 +1 @@ +usr/include/* diff --git a/codec2/tags/0.4.1/debian/libcodec2.install b/codec2/tags/0.4.1/debian/libcodec2.install new file mode 100644 index 00000000..f1d0181f --- /dev/null +++ b/codec2/tags/0.4.1/debian/libcodec2.install @@ -0,0 +1 @@ +usr/lib/* diff --git a/codec2/tags/0.4.1/debian/rules b/codec2/tags/0.4.1/debian/rules new file mode 100644 index 00000000..c6cdbe71 --- /dev/null +++ b/codec2/tags/0.4.1/debian/rules @@ -0,0 +1,24 @@ +#!/usr/bin/make -f +# See debhelper(7) (uncomment to enable) +# output every command that modifies files on the build system. +#DH_VERBOSE = 1 + +# see EXAMPLES in dpkg-buildflags(1) and read /usr/share/dpkg/* +DPKG_EXPORT_BUILDFLAGS = 1 +include /usr/share/dpkg/default.mk + +# see FEATURE AREAS in dpkg-buildflags(1) +#export DEB_BUILD_MAINT_OPTIONS = hardening=+all + +# see ENVIRONMENT in dpkg-buildflags(1) +# package maintainers to append CFLAGS +#export DEB_CFLAGS_MAINT_APPEND = -Wall -pedantic +# package maintainers to append LDFLAGS +#export DEB_LDFLAGS_MAINT_APPEND = -Wl,--as-needed + + +# main packaging script based on dh7 syntax +%: + dh $@ --buildsystem=cmake + + diff --git a/codec2/tags/0.4.1/debian/source/format b/codec2/tags/0.4.1/debian/source/format new file mode 100644 index 00000000..163aaf8d --- /dev/null +++ b/codec2/tags/0.4.1/debian/source/format @@ -0,0 +1 @@ +3.0 (quilt) diff --git a/codec2/tags/0.4.1/octave/README.txt b/codec2/tags/0.4.1/octave/README.txt new file mode 100644 index 00000000..05d63f20 --- /dev/null +++ b/codec2/tags/0.4.1/octave/README.txt @@ -0,0 +1,17 @@ +README.txt +For codec2/octave directory +Created 24 June 2012 by David Rowe + +1/ To support some of the Octave scripts (in particular fdmdv) in this + directory the following Octave packages need to be installed: + + control image miscellaneous optim signal specfun struct + +2/ Download these tar balls from: + + http://octave.sourceforge.net/packages.php + +3/ Install each package from the Octave command line with: + + octave:3> pkg install package_file_name.tar.gz + diff --git a/codec2/tags/0.4.1/octave/adc_sfdr_ut.m b/codec2/tags/0.4.1/octave/adc_sfdr_ut.m new file mode 100644 index 00000000..c2363ed9 --- /dev/null +++ b/codec2/tags/0.4.1/octave/adc_sfdr_ut.m @@ -0,0 +1,28 @@ +% adc_sfdr_ut.m +% David Rowe Aug 2015 +% +% Processes data collected from STM32F4 or SFDR testing of ADC + +s = load_raw("~/stlink/adc.raw"); +Fs = 2E6; +N = 1024; +num_frames = length(s)/N; +h = hanning(N); +XdB = zeros(N/2,1); + +for i=1:num_frames + x = s((i-1)*N+1:i*N); + X = fft(x .* h); + XdB += 20*log10(abs(X(1:N/2))); +end + +XdB /= num_frames; +XdB -= max(XdB); + +figure(1) +plot((0:N/2-1)*Fs/(1000*N), XdB) +grid +ylabel('Amplitude dB') +xlabel('Frequency (kHz)'); +axis([0 Fs/(2*1000) -80 0]) + diff --git a/codec2/tags/0.4.1/octave/adcres.m b/codec2/tags/0.4.1/octave/adcres.m new file mode 100644 index 00000000..f4f04ac0 --- /dev/null +++ b/codec2/tags/0.4.1/octave/adcres.m @@ -0,0 +1,56 @@ +% adcres.m +% David Rowe 18 Feb 2015 +% +% ADC resamping simulation + +% [ ] quantisation of ADC +% [ ] SNR at ADC input, SNR at resampler output +% [X] decimation to 50 kHz +% [X] 40dB ish rejection (test) +% [X] visualise pass band flatness + +graphics_toolkit ("gnuplot"); + +fs = 2E6; +f1 = 500E3; +f2 = f1 + 8E3; +f3 = f1 - 7E3; +f4 = f1 - 207E3; +t = (0:(fs-1)); +M = 45; +beta1 = 0.999; +beta2 = 1 - (1-0.999)*M; + +s1 = [fs zeros(1,fs-1)]; % noise floor, continuous interferers +s2 = 100*4*cos(t*2*pi*f2/fs); % wanted signal 40dB above interferers +s3 = 100*2*cos(t*2*pi*f3/fs); +s4 = 100*2*cos(t*2*pi*f4/fs); % interferer at same level +s = s1 + s2 + s3 + s4; + +s2 = filter(1,[1 0 beta1],s); % BPF at fs/4 +s3 = s2(1:M:length(s2)); % decimate +s4 = filter([1 0 beta2],1,s3); % flatten filter response again + +figure(1) +subplot(211) +plot(20*log10(abs(fft(s)/fs))) +grid +axis([0 fs/2 -10 50]) +title('Input to ADC'); +subplot(212) +plot(20*log10(abs(fft(s2/fs)))) +grid +axis([0 fs/2 -10 70]) +title('After BPF'); + +figure(2) +subplot(211) +plot(20*log10(abs(fft(s3)/fs))) +grid +axis([0 fs/2/M -10 50]) +title('After Decimation'); +subplot(212) +plot(20*log10(abs(fft(s4)/fs))) +grid +title('After Equaliser'); +axis([0 fs/2/M -10 50]) diff --git a/codec2/tags/0.4.1/octave/autotest.m b/codec2/tags/0.4.1/octave/autotest.m new file mode 100644 index 00000000..b6623d8a --- /dev/null +++ b/codec2/tags/0.4.1/octave/autotest.m @@ -0,0 +1,78 @@ +% autotest.m +% David Rowe Mar 2015 +% +% Helper functions to plot output of C verson and difference between Octave and C versions + +1; + +function stem_sig_and_error(plotnum, subplotnum, sig, error, titlestr, axisvec) + global no_plot_list; + + if find(no_plot_list == plotnum) + return; + end + figure(plotnum) + subplot(subplotnum) + stem(sig,'g;Octave version;'); + hold on; + stem(error,'r;Octave - C version (hopefully 0);'); + hold off; + if nargin == 6 + axis(axisvec); + end + title(titlestr); +endfunction + + +function plot_sig_and_error(plotnum, subplotnum, sig, error, titlestr, axisvec) + global no_plot_list; + + if find(no_plot_list == plotnum) + return; + end + + figure(plotnum) + subplot(subplotnum) + plot(sig,'g;Octave version;'); + hold on; + plot(error,'r;Octave - C version (hopefully 0);'); + hold off; + if nargin == 6 + axis(axisvec); + end + title(titlestr); +endfunction + + +function check(a, b, test_name, tol) + global passes; + global fails; + + if nargin == 3 + tol = 1E-3; + end + + [m n] = size(a); + if m > n + ll = m; + else + ll = n; + end + + printf("%s", test_name); + for i=1:(25-length(test_name)) + printf("."); + end + printf(": "); + + e = sum(sum(abs(a - b))/ll); + if e < tol + printf("OK\n"); + passes++; + else + printf("FAIL (%f)\n",e); + fails++; + end +endfunction + + diff --git a/codec2/tags/0.4.1/octave/av_imp.m b/codec2/tags/0.4.1/octave/av_imp.m new file mode 100644 index 00000000..8b7fa608 --- /dev/null +++ b/codec2/tags/0.4.1/octave/av_imp.m @@ -0,0 +1,43 @@ +% av_imp.m +% David Rowe Aug 2012 +% Averages the impulse response samples + +function imp = av_imp(imp_filename, period_in_secs, st, en) + f = fopen(imp_filename,"rb"); + s = fread(f, Inf, "short")'; + + Fs = 8000; + n = period_in_secs * Fs; + + [r c] = size(s); + + imp = zeros(1,n); + for i=1:n:c-n + imp = imp + s(i:i+n-1); + endfor + + % user supplies start and end samples after viweing plot + + if (nargin == 4) + imp = imp(st:en); + end + + % normalise + + imp /= sqrt(sum(imp .^ 2)); + + [h w] = freqz(imp, 1, 4000); + + figure(1); + clf; + plot(imp); + + figure(2); + clf; + subplot(211) + plot(10*log10(abs(h))) + subplot(212) + plot(angle(h)) + +endfunction + diff --git a/codec2/tags/0.4.1/octave/bandpasssampling.m b/codec2/tags/0.4.1/octave/bandpasssampling.m new file mode 100644 index 00000000..9a2a4efc --- /dev/null +++ b/codec2/tags/0.4.1/octave/bandpasssampling.m @@ -0,0 +1,34 @@ +% bandpasssampling.m +% David Rowe 23 Feb 2015 +% +% Band pass sampling example + +graphics_toolkit ("gnuplot"); + +t = 0:1E-3:1-1E-3; +f1 = 5; +f2 = 105; + +x = 1:10:length(s1); + +s1 = cos(2*pi*f1*t); +s1_sampled = s1(x); + +s2 = cos(2*pi*f2*t); +s2_sampled = s2(x); + +figure(1) +subplot(211) +plot(t,s1) +title('5Hz signal sampled at 100 Hz'); +subplot(212) +stem(x*1E-3, s1_sampled,'r') +xlabel('Time (s)'); + +figure(2) +subplot(211) +plot(t,s2) +title('105Hz signal sampled at 100 Hz'); +subplot(212) +stem(x*1E-3, s2_sampled,'r') +xlabel('Time (s)'); diff --git a/codec2/tags/0.4.1/octave/bpf.m b/codec2/tags/0.4.1/octave/bpf.m new file mode 100644 index 00000000..9e0af8fb --- /dev/null +++ b/codec2/tags/0.4.1/octave/bpf.m @@ -0,0 +1,31 @@ +% bpf.m +% David Rowe April 2015 +% +% Design 400-2600 Hz BPF and save coeffs + +1; + +function write_c_array(filename, arrayname, vec) + + m = length(vec); + + f=fopen(filename,"wt"); + fprintf(f,"#define %s_N %d\n\n", toupper(arrayname), m); + fprintf(f,"float %s[]={\n", arrayname); + for r=1:m + if r < m + fprintf(f, " %f,\n", vec(r)); + else + fprintf(f, " %f\n};", vec(r)); + end + end + + fclose(f); +endfunction + +b=firls(100,[0 250 300 2600 2700 4000]/4000,[0.01 0.01 1 1 0.01 0.01]); +freqz(b) +write_c_array("../src/bpfb.h", "bpfb", b) + +% C header file of noise samples so C version gives extacly the same results + diff --git a/codec2/tags/0.4.1/octave/cbphase.m b/codec2/tags/0.4.1/octave/cbphase.m new file mode 100644 index 00000000..8e82da1c --- /dev/null +++ b/codec2/tags/0.4.1/octave/cbphase.m @@ -0,0 +1,98 @@ +% cbphase.m +% David Rowe Aug 2012 +% Used to experiment with critical band phase perception and smoothing + +function cbphase + + Wo = 100.0*pi/4000; + L = floor(pi/Wo); + + A = zeros(1,L); + phi = zeros(1,L); + + % three harmonics in this band + + b = 4; a = b-1; c = b+1; + + % set up phases and mags for 2nd order system (see phasesecord.m) + + wres = b*Wo; + phi(a) = 3*pi/4 + wres; + phi(b) = pi/2 + wres; + phi(c) = pi/4 + wres; + + A(a) = 0.707; + A(b) = 1; + A(c) = 0.707; + + % add linear component + + phi(1) = pi; + phi(2:L) = phi(2:L) + (2:L)*phi(1); + phi = phi - 2*pi*(floor(phi/(2*pi)) + 0.5); + + N = 16000; + Nplot = 250; + s = zeros(1,N); + + for m=a:c + s_m = A(m)*cos(m*Wo*(0:(N-1)) + phi(m)); + s = s + s_m; + endfor + + figure(2); + clf; + subplot(211) + plot((1:L)*Wo*4000/pi, A,'+'); + subplot(212) + plot((1:L)*Wo*4000/pi, phi,'+'); + + %v = A(a)*exp(j*phi(a)) + A(b)*exp(j*phi(b)) + A(c)*exp(j*phi(c)); + %compass(v,"r") + %hold off; + + % est phi1 + + diff = phi(b) - phi(a) + sumi = sin(diff); + sumr = cos(diff); + diff = phi(c) - phi(b) + sumi += sin(diff); + sumr += cos(diff); + phi1_ = atan2(sumi, sumr) + s_v = cos(Wo*(0:(N-1)) + phi1_); + + figure(1); + clf; + subplot(211) + plot(s(1:Nplot)); + hold on; + plot(s_v(1:Nplot),"r"); + hold off; + + % build (hopefully) perceptually similar phase + + phi_(a) = a*phi1_; + phi_(b) = b*phi1_; + phi_(c) = c*phi1_; + + s_ = zeros(1,N); + + for m=a:c + s_m = A(m)*cos(m*Wo*(0:(N-1)) + phi_(m)); + s_ = s_ + s_m; + endfor + + subplot(212) + plot(s_(1:Nplot)); + + gain = 8000; + fs=fopen("orig_ph.raw","wb"); + fwrite(fs,gain*s,"short"); + fclose(fs); + fs=fopen("mod_ph.raw","wb"); + fwrite(fs,gain*s_,"short"); + fclose(fs); + +endfunction + diff --git a/codec2/tags/0.4.1/octave/cellmodem.m b/codec2/tags/0.4.1/octave/cellmodem.m new file mode 100644 index 00000000..37005399 --- /dev/null +++ b/codec2/tags/0.4.1/octave/cellmodem.m @@ -0,0 +1,137 @@ +% cellmodem.m +% David Rowe May 2005 +% +% Simulation of modem for low rate date through a cell phone codec +% +% Ideas: +% + insert low rate codec +% + generate bunch of symbols, run through codec, measure MSE, choose best set +% + measure probablility of error, "distance" from other symbols +% + can we use VQ training algorithm for this? Start with 2 symbols, +% pass through channel, measure MSE, split again? +% + start with cmd line version of codec, frame synchronous +% + add symbol timing estimator later +% + try different frame rates +% + simulate impairments like HP/LP filtering. Can we correct for this? +% + pilots symbols so we can use energy as well? +% + set of F0 as well +% + LSP quantisers preferrentially preserve peaks, so three peaks is a +% reasonable signal set. Modulate position and bandwidth to creat +% symbol set. Maybe 50 or 100 Hz grid for LSPs, evaluate that some how. + +graphics_toolkit ("gnuplot"); +rand('state',1); +lsp; + +% given a vector of LSP symbols, constructs a synthesised speech signals +% anfd runs it through a codec + +function [w__log mse] = run_sim(sim_in, w_log) + N = sim_in.N; + Wo = sim_in.Wo; + frames = sim_in.frames; + lpc_order = sim_in.lpc_order; + + s = []; + w__log = []; + L = floor(pi/Wo); + phi = zeros(1,L); + + for f=1:frames + + % synthesise speech signal + + a=lsptoa(w_log(f,:)); + + ex = zeros(1,N); + for m=1:L + phi(m) += Wo*m*N; + ex += cos(phi(m) + Wo*m*(0:N-1)); + end + + s = [s filter(1, a, ex)]; + end + + % play through codec + + s *= sim_in.gain; + f=fopen("in.raw","wb"); + fwrite(f,s,"short"); + fclose(f); + system(sim_in.codec_cmd); + f=fopen("out.raw","rb"); + s_ = fread(f,Inf,"short"); + fclose(f); + + % extract received symbols from channel and evaluate + + mse = zeros(1,frames); + for f=1:frames + a_ = lpcauto(s_((f-1)*sim_in.N+1:f*N), lpc_order); + w_ = atolsp(a_); + w__log = [w__log; w_]; + error = w__log(f,:) - w_log(f,:); + mse(f) = error*error'; + end +endfunction + +% constants ----------------------------------------------------- + +sim_in.codec_cmd = "speexenc --bitrate 4000 in.raw - | speexdec - out.raw"; + +lpc_order = sim_in.lpc_order = 6; +Fs = sim_in.Fs = 8000; + sim_in.Fo = 100; % pitch frequency of voice + sim_in.Wo = 2*pi*Fo/Fs; % pitch in rads +N = sim_in.N = Fs*0.04; % frame length +frames = sim_in.frames = 1000; % frames to play through codec + sim_in.gain = 100; +Nsym = 8; % number of symbols to find + +% start with some LSP random vectors +% for stable filter most be monotonically increasing on 0..pi + +w_log = []; +for f=1:frames; + w = sort(rand(1,lpc_order)*pi); + w_log = [w_log; w]; +end +[w__log mse] = run_sim(sim_in, w_log); + +% sort by MSE to get the best symbols + +[sort_mse sort_ind] = sort(mse); +symbols = w_log(sort_ind(1:Nsym),:) + +% Play these symbols through the codec in random order + +w_log = []; +symb_ind = []; +for f=1:frames + symb_ind(f) = floor(1 + rand(1,1)*Nsym); + w_log = [w_log; symbols(symb_ind,:)]; +end + +[w__log mse] = run_sim(sim_in, w_log); + +% now see if we can "detect" them + +for f=1:frames + + % check received symbol against codebook of symbols + + min_e = 1E6; + for i=1:Nsym + e = w__log(f,:)*symbols(i,:)'; + if e < min_e + min_e = e; + min_ind = i; + end + end + + symb_ind_out(f) = min_ind; +end + +figure(1) +clf +plot(symb_ind,'g',symb_ind_out,'r'); diff --git a/codec2/tags/0.4.1/octave/ciccomp.m b/codec2/tags/0.4.1/octave/ciccomp.m new file mode 100644 index 00000000..936a1013 --- /dev/null +++ b/codec2/tags/0.4.1/octave/ciccomp.m @@ -0,0 +1,70 @@ +% ciccomp.m +% Brady O'Brien 9 Mar 2015 +% CIC Filter compensation helper + +graphics_toolkit ("gnuplot"); + +cicn = 10; %delay for CIC filter +N = 10; %input interpolation rate +csf = 256; %scaling factor for CIC filter conversion +fd = 80e3; %DAC frequency +fs = fd/N; %Input sampling frequency +fi= fd; %freq of DSP +fc1 = fi/4; %Frequency of initial upconversion +ciccb=[-0.029626 0.252638 -2.304683 16.332166 -2.304683 0.252638 -0.029626]; +%ciccb = ciccb(1:2:length(ciccb)) +t = (1:fs); + +fdin = zeros(1,length(t)); +fdin(1)=1; +fdin=fdin+sin(pi*t*(2000/fs)); +%fdin = filter(b,1,fdin); + +figure(4) +plot(20*log10(abs(fft(fdin)))) +fdcout = zeros(1,length(t)); +fdin = int64(fdin*1024); + +combout1=0; +combout2=0; +combout3=0; +%combout4=0; +ccbuf1=zeros(1,cicn/N); +ccbuf2=zeros(1,cicn/N); +ccbuf3=zeros(1,cicn/N); +%ccbuf4=zeros(1,cicn); + +for ii=1:length(fdin) + combout1 = fdin(ii) - ccbuf1(end); + combout2 = combout1 - ccbuf2(end); + combout3 = combout2 - ccbuf3(end); + %combout4 = combout3 - ccbuf4(end); + ccbuf1(2:end)=ccbuf1(1:end-1); + ccbuf2(2:end)=ccbuf2(1:end-1); + ccbuf3(2:end)=ccbuf3(1:end-1); + %ccbuf4(2:end)=ccbuf4(1:end-1); + ccbuf1(1)=fdin(ii); + ccbuf2(1)=combout1; + ccbuf3(1)=combout2; + %ccbuf4(1)=combout3; + fdcout(ii)=combout3; +end + +intout1=0; +intout2=0; +intout3=0; +%intout4=0; +fdnext = zeros(1,length(t)*N); +fdnext(1:N:length(t)*N) = fdcout; %Interpolate +fdi1 = fdnext; + +for ii=1:length(fdnext) + intout1 = fdnext(ii) + intout1; + intout2 = intout1 + intout2; + intout3 = intout2 + intout3; + %intout4 = intout3 + intout4; + fdnext(ii)=intout3; +end + +figure(5) +plot(20*log10(abs(fft(fdnext)))) diff --git a/codec2/tags/0.4.1/octave/cml.patch b/codec2/tags/0.4.1/octave/cml.patch new file mode 100644 index 00000000..c7cadd0c --- /dev/null +++ b/codec2/tags/0.4.1/octave/cml.patch @@ -0,0 +1,24 @@ +diff -ruN -x '*.o' -x '*.dll' -x '*.mex' -x '*.mat' cml-orig/CmlStartup.m cml/CmlStartup.m +--- cml-orig/CmlStartup.m 2007-09-08 23:12:26.000000000 +0930 ++++ cml/CmlStartup.m 2015-09-04 07:21:14.218455223 +0930 +@@ -41,7 +41,7 @@ + addpath( strcat( cml_home, '/mex'), ... + strcat( cml_home, '/mat'), ... + strcat( cml_home, '/matalt' ), ... +- strcat( cml_home, '/mexhelp'), ... ++ %strcat( cml_home, '/mexhelp'), ... + strcat( cml_home, '/demos' ), ... + strcat( cml_home, '/scenarios'), ... + strcat( cml_home, '/localscenarios'),... +@@ -59,4 +59,4 @@ + save_directory = strcat( cml_home, '/scenarios/CmlHome.mat' ); + end + +-save( save_directory, save_flag, 'cml_home' ); +\ No newline at end of file ++save( save_directory, save_flag, 'cml_home' ); +diff -ruN -x '*.o' -x '*.dll' -x '*.mex' -x '*.mat' cml-orig/source/matrix.h cml/source/matrix.h +--- cml-orig/source/matrix.h 1970-01-01 09:30:00.000000000 +0930 ++++ cml/source/matrix.h 2015-09-04 07:06:46.907248420 +0930 +@@ -0,0 +1 @@ ++#include diff --git a/codec2/tags/0.4.1/octave/codec2_demo.m b/codec2/tags/0.4.1/octave/codec2_demo.m new file mode 100644 index 00000000..0f3950bf --- /dev/null +++ b/codec2/tags/0.4.1/octave/codec2_demo.m @@ -0,0 +1,108 @@ +% 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/codec2/tags/0.4.1/octave/cohpsk.m b/codec2/tags/0.4.1/octave/cohpsk.m new file mode 100644 index 00000000..34abfa7d --- /dev/null +++ b/codec2/tags/0.4.1/octave/cohpsk.m @@ -0,0 +1,992 @@ +% cohpsk.m +% David Rowe Mar 2015 +% +% Coherent PSK modem functions, with support for LDPC and DSSS +% (diversity). + +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) + 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 + + +% init function for symbol rate processing -------------------------------------------------------- + +function sim_in = symbol_rate_init(sim_in) + sim_in.Fs = Fs = 8000; + + modulation = sim_in.modulation; + 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; + Nc = sim_in.Nc; + + hf_sim = sim_in.hf_sim; + nhfdelay = sim_in.hf_delay_ms*Rs/1000; + hf_mag_only = sim_in.hf_mag_only; + + Nd = sim_in.Nd; % diveristy + Ns = sim_in.Ns; % step size between pilots + ldpc_code = sim_in.ldpc_code; + rate = sim_in.ldpc_code_rate; + + sim_in.bps = bps = 2; + + sim_in.Nsymb = Nsymb = framesize/bps; + sim_in.Nsymbrow = Nsymbrow = Nsymb/Nc; + sim_in.Npilotsframe = Npilotsframe = 2; + sim_in.Nsymbrowpilot = Nsymbrowpilot = Nsymbrow + Npilotsframe; + + if verbose == 2 + printf("Each frame contains %d data bits or %d data symbols, transmitted as %d symbols by %d carriers.", framesize, Nsymb, Nsymbrow, Nc); + printf(" There are %d pilot symbols in each carrier together at the start of each frame, then %d data symbols.", Npilotsframe, Ns); + printf(" Including pilots, the frame is %d symbols long by %d carriers.\n\n", Nsymbrowpilot, Nc); + end + + sim_in.prev_sym_tx = qpsk_mod([0 0])*ones(1,Nc*Nd); + sim_in.prev_sym_rx = qpsk_mod([0 0])*ones(1,Nc*Nd); + + sim_in.rx_symb_buf = zeros(3*Nsymbrow, Nc*Nd); + sim_in.rx_pilot_buf = zeros(3*Npilotsframe,Nc*Nd); + sim_in.tx_bits_buf = zeros(1,2*framesize); + + % pilot sequence is used for phase and amplitude estimation, and frame sync + + pilot = 1 - 2*(rand(Npilotsframe,Nc) > 0.5); + sim_in.pilot = pilot; + sim_in.tx_pilot_buf = [pilot; pilot; pilot]; + if sim_in.do_write_pilot_file + write_pilot_file(pilot, Nsymbrowpilot, Ns, Nsymbrow, Npilotsframe, Nc); + end + + % we use first 2 pilots of next frame to help with frame sync and fine freq + + sim_in.Nct_sym_buf = 2*Nsymbrowpilot + 2; + sim_in.ct_symb_buf = zeros(sim_in.Nct_sym_buf, Nc*Nd); + + sim_in.ff_phase = 1; + + sim_in.ct_symb_ff_buf = zeros(Nsymbrowpilot + 2, Nc*Nd); + + % Init LDPC -------------------------------------------------------------------- + + if ldpc_code + % Start CML library + + currentdir = pwd; + addpath '/home/david/tmp/cml/mat' % assume the source files stored here + cd /home/david/tmp/cml + CmlStartup % note that this is not in the cml path! + cd(currentdir) + + % Our LDPC library + + ldpc; + + mod_order = 4; + modulation2 = 'QPSK'; + mapping = 'gray'; + + sim_in.demod_type = 0; + sim_in.decoder_type = 0; + sim_in.max_iterations = 100; + + code_param = ldpc_init(rate, framesize, modulation2, mod_order, mapping); + code_param.code_bits_per_frame = framesize; + code_param.symbols_per_frame = framesize/bps; + sim_in.code_param = code_param; + else + sim_in.rate = 1; + sim_in.code_param = []; + end +endfunction + + +% Symbol rate processing for tx side (modulator) ------------------------------------------------------- + +% legacy DQPSK mod for comparative testing + +function [tx_symb prev_tx_symb] = bits_to_dqpsk_symbols(sim_in, tx_bits, prev_tx_symb) + Nc = sim_in.Nc; + Nsymbrow = sim_in.Nsymbrow; + + tx_symb = zeros(Nsymbrow,Nc); + + for c=1:Nc + for r=1:Nsymbrow + i = (c-1)*Nsymbrow + r; + tx_symb(r,c) = qpsk_mod(tx_bits(2*(i-1)+1:2*i)); + tx_symb(r,c) *= prev_tx_symb(c); + prev_tx_symb(c) = tx_symb(r,c); + end + end + +endfunction + + +% legacy DQPSK demod for comparative testing + +function [rx_symb rx_bits rx_symb_linear prev_rx_symb] = dqpsk_symbols_to_bits(sim_in, rx_symb, prev_rx_symb) + Nc = sim_in.Nc; + Nsymbrow = sim_in.Nsymbrow; + + tx_symb = zeros(Nsymbrow,Nc); + + for c=1:Nc + for r=1:Nsymbrow + tmp = rx_symb(r,c); + rx_symb(r,c) *= conj(prev_rx_symb(c))/abs(prev_rx_symb(c)); + prev_rx_symb(c) = tmp; + i = (c-1)*Nsymbrow + r; + rx_symb_linear(i) = rx_symb(r,c); + rx_bits((2*(i-1)+1):(2*i)) = qpsk_demod(rx_symb(r,c)); + end + end + +endfunction + + +function [tx_symb tx_bits] = bits_to_qpsk_symbols(sim_in, tx_bits, code_param) + ldpc_code = sim_in.ldpc_code; + rate = sim_in.ldpc_code_rate; + framesize = sim_in.framesize; + Nsymbrow = sim_in.Nsymbrow; + Nsymbrowpilot = sim_in.Nsymbrowpilot; + Nc = sim_in.Nc; + Npilotsframe = sim_in.Npilotsframe; + Ns = sim_in.Ns; + modulation = sim_in.modulation; + pilot = sim_in.pilot; + Nd = sim_in.Nd; + + if ldpc_code + [tx_bits, tmp] = ldpc_enc(tx_bits, code_param); + end + + % modulate -------------------------------------------- + + % organise symbols into a Nsymbrow rows by Nc cols + % data and parity bits are on separate carriers + + tx_symb = zeros(Nsymbrow,Nc); + + for c=1:Nc + for r=1:Nsymbrow + i = (c-1)*Nsymbrow + r; + tx_symb(r,c) = qpsk_mod(tx_bits(2*(i-1)+1:2*i)); + end + end + + % insert pilots at start of frame + + tx_symb = [pilot(1,:); pilot(2,:); tx_symb;]; + + % copy to other carriers (diversity) + + tmp = tx_symb; + for d=1:Nd-1 + tmp = [tmp tx_symb]; + end + tx_symb = tmp; + + % ensures energy/symbol is normalised with diversity + + tx_symb = tx_symb/sqrt(Nd); +end + + +% Symbol rate processing for rx side (demodulator) ------------------------------------------------------- + +function [rx_symb rx_bits rx_symb_linear amp_ phi_ sig_rms noise_rms cohpsk] = qpsk_symbols_to_bits(cohpsk, ct_symb_buf) + framesize = cohpsk.framesize; + Nsymb = cohpsk.Nsymb; + Nsymbrow = cohpsk.Nsymbrow; + Nsymbrowpilot = cohpsk.Nsymbrowpilot; + Nc = cohpsk.Nc; + Nd = cohpsk.Nd; + Npilotsframe = cohpsk.Npilotsframe; + pilot = cohpsk.pilot; + verbose = cohpsk.verbose; + coh_en = cohpsk.coh_en; + + % Use pilots to get phase and amplitude estimates We assume there + % are two samples at the start of each frame and two at the end + % Note: correlation (averging) method was used initially, but was + % poor at tracking fast phase changes that we experience on fading + % channels. Linear regression (fitting a straight line) works + % better on fading channels, but increases BER slighlty for AWGN + % channels. + + sampling_points = [1 2 cohpsk.Nsymbrow+3 cohpsk.Nsymbrow+4]; + pilot2 = [cohpsk.pilot(1,:); cohpsk.pilot(2,:); cohpsk.pilot(1,:); cohpsk.pilot(2,:);]; + phi_ = zeros(Nsymbrow, Nc*Nd); + amp_ = zeros(Nsymbrow, Nc*Nd); + + for c=1:Nc*Nd + %corr = pilot2(:,c)' * ct_symb_buf(sampling_points,c); + %phi_(:, c) = angle(corr); + + y = ct_symb_buf(sampling_points,c) .* pilot2(:,c-Nc*floor((c-1)/Nc)); + [m b] = linreg(sampling_points, y, length(sampling_points)); + yfit = m*[3 4 5 6] + b; + phi_(:, c) = angle(yfit); + %for r=1:Nsymbrow + % printf(" %f", phi_(r,c)); + %end + %printf("\n"); + mag = sum(abs(ct_symb_buf(sampling_points,c))); + amp_(:, c) = mag/length(sampling_points); + end + + % now correct phase of data symbols + + rx_symb = zeros(Nsymbrow, Nc); + rx_symb_linear = zeros(1, Nsymbrow*Nc*Nd); + rx_bits = zeros(1, framesize); + for c=1:Nc*Nd + for r=1:Nsymbrow + if coh_en == 1 + rx_symb(r,c) = ct_symb_buf(2+r,c)*exp(-j*phi_(r,c)); + else + rx_symb(r,c) = ct_symb_buf(2+r,c); + end + i = (c-1)*Nsymbrow + r; + rx_symb_linear(i) = rx_symb(r,c); + %printf("phi_ %d %d %f %f\n", r,c,real(exp(-j*phi_(r,c))), imag(exp(-j*phi_(r,c)))); + end + end + + % and finally optional diversity combination and make decn on bits + + for c=1:Nc + for r=1:Nsymbrow + i = (c-1)*Nsymbrow + r; + div_symb = rx_symb(r,c); + for d=1:Nd-1 + div_symb += rx_symb(r,c + Nc*d); + end + rx_bits((2*(i-1)+1):(2*i)) = qpsk_demod(div_symb); + end + end + + % Estimate noise power from demodulated symbols. One method is to + % calculate the distance of each symbol from the average symbol + % position. However this is complicated by fading, which means the + % amplitude of the symbols is constantly changing. + + % Now the scatter diagram in a fading channel is a X or cross + % shape. The noise can be resolved into two components at right + % angles to each other. The component along the the "thickness" + % of the arms is proportional to the noise power and not affected + % by fading. We only use points further along the real axis than + % the mean amplitude so we keep out of the central nosiey blob + + sig_rms = mean(abs(rx_symb_linear)); + + sum_x = 0; + sum_xx = 0; + n = 0; + for i=1:Nsymb*Nd + s = rx_symb_linear(i); + if abs(real(s)) > sig_rms + sum_x += imag(s); + sum_xx += imag(s)*imag(s); + n++; + end + end + + noise_var = 0; + if n > 1 + noise_var = (n*sum_xx - sum_x*sum_x)/(n*(n-1)); + end + noise_rms = sqrt(noise_var); + +endfunction + + +% Compression, John Gibbs pointed out it's best to perform non-linear +% operations on an oversampled signals as they tend to generate +% broadband noise that will be aliased into passband if bandwidth is +% too low + +function y = compress(x, power) + + % oversample by a factor of M + + M = 4; + Ntap = 47; + n = length(x); + + b = fir1(Ntap,1/M); + xM = zeros(1,M*n); + for i=1:n + xM(i*M) = M*x(i); + end + + xM = filter(b,1,xM); + + % non linearity + + yM = sign(xM).*(abs(xM) .^ power); + + % decimate by a factor of M + + yM = filter(b,1,yM); + y = yM(1:M:n*M); + +endfunction + + +% Init HF channel model from stored sample files of spreading signal ---------------------------------- + +function [spread spread_2ms hf_gain] = init_hf_model(Fs, nsam) + + % convert "spreading" samples from 1kHz carrier at Fss 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; Fss = 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/Fss)*(1:length(spread1k))'); + spreadbb_2ms = spread1k_2ms.*exp(-j*(2*pi*Fc/Fss)*(1:length(spread1k_2ms))'); + + % remove -2000 Hz image + b = fir1(50, 5/Fss); + 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)); + + % change output samples so they are at rate Fs reqd by caller + + spread = resample(spread, Fs, Fss); + spread_2ms = resample(spread_2ms, Fs, Fss); + + % 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(1:nsam))+var(spread_2ms(1:nsam))); +endfunction + + +function write_pilot_file(pilot, Nsymbrowpilot, Ns, Nsymrow, Npilotsframe, Nc); + + filename = sprintf("../src/cohpsk_defs.h", Npilotsframe, Nc); + f=fopen(filename,"wt"); + fprintf(f,"/* Generated by write_pilot_file() Octave function */\n\n"); + fprintf(f,"#define NSYMROW %d /* number of data symbols on each row (i.e. each carrier) */\n", Nsymrow); + fprintf(f,"#define NS %d /* number of data symbols between pilots */\n", Ns); + fprintf(f,"#define NPILOTSFRAME %d /* number of pilot symbols on each row */\n", Npilotsframe); + fprintf(f,"#define PILOTS_NC %d /* number of carriers */\n\n", Nc); + fprintf(f,"#define NSYMROWPILOT %d /* length of row after pilots inserted */\n\n", Nsymbrowpilot); + fclose(f); + + filename = sprintf("../src/pilots_coh.h", Npilotsframe, Nc); + f=fopen(filename,"wt"); + fprintf(f,"/* Generated by write_pilot_file() Octave function */\n\n"); + fprintf(f,"float pilots_coh[][PILOTS_NC]={\n"); + for r=1:Npilotsframe + fprintf(f, " {"); + for c=1:Nc-1 + fprintf(f, " %f,", pilot(r, c)); + end + if r < Npilotsframe + fprintf(f, " %f},\n", pilot(r, Nc)); + else + fprintf(f, " %f}\n};", pilot(r, Nc)); + end + end + fclose(f); +endfunction + + +% Save test bits frame to a text file in the form of a C array + +function test_bits_coh_file(test_bits_coh) + + f=fopen("../src/test_bits_coh.h","wt"); + fprintf(f,"/* Generated by test_bits_coh_file() Octave function */\n\n"); + fprintf(f,"const int test_bits_coh[]={\n"); + for m=1:length(test_bits_coh)-1 + fprintf(f," %d,\n",test_bits_coh(m)); + endfor + fprintf(f," %d\n};\n",test_bits_coh(length(test_bits_coh))); + fclose(f); + +endfunction + + +function [ch_symb rx_timing rx_filt rx_baseband afdmdv f_est] = rate_Fs_rx_processing(afdmdv, ch_fdm_frame, f_est, nsymb, nin, freq_track) + M = afdmdv.M; + + rx_baseband = []; + rx_filt = []; + rx_timing = []; + + ch_fdm_frame_index = 1; + + for r=1:nsymb + % shift signal to nominal baseband, this will put Nc/2 carriers either side of 0 Hz + + [rx_fdm_frame_bb afdmdv.fbb_phase_rx] = freq_shift(ch_fdm_frame(ch_fdm_frame_index:ch_fdm_frame_index + nin - 1), -f_est, afdmdv.Fs, afdmdv.fbb_phase_rx); + ch_fdm_frame_index += nin; + + % downconvert each FDM carrier to Nc separate baseband signals + + [arx_baseband afdmdv] = fdm_downconvert(afdmdv, rx_fdm_frame_bb, nin); + [arx_filt afdmdv] = rx_filter(afdmdv, arx_baseband, nin); + [rx_onesym arx_timing env afdmdv] = rx_est_timing(afdmdv, arx_filt, nin); + + rx_baseband = [rx_baseband arx_baseband]; + rx_filt = [rx_filt arx_filt]; + rx_timing = [rx_timing arx_timing]; + + ch_symb(r,:) = rx_onesym; + + % we only allow a timing shift on one symbol per frame + + if nin != M + nin = M; + end + + % freq tracking, see test_ftrack.m for unit test. Placed in + % this function as it needs to work on a symbol by symbol basis + % rather than frame by frame. This means the control loop + % operates at a sample rate of Rs = 50Hz for say 1 Hz/s drift. + + if freq_track + beta = 0.005; + g = 0.2; + + % combine difference on phase from last symbol over Nc carriers + + mod_strip = 0; + for c=1:afdmdv.Nc+1 + adiff = rx_onesym(c) .* conj(afdmdv.prev_rx_symb(c)); + afdmdv.prev_rx_symb(c) = rx_onesym(c); + + % 4th power strips QPSK modulation, by multiplying phase by 4 + % Using the abs value of the real coord was found to help + % non-linear issues when noise power was large + + amod_strip = adiff.^4; + amod_strip = abs(real(amod_strip)) + j*imag(amod_strip); + mod_strip += amod_strip; + end + %plot(mod_strip) + %printf("modstrip: %f %f\n", real(mod_strip), imag(mod_strip)); + + % loop filter made up of 1st order IIR plus integrator. Integerator + % was found to be reqd + + afdmdv.filt = (1-beta)*afdmdv.filt + beta*angle(mod_strip); + f_est += g*afdmdv.filt; + %printf("filt: %f angle: %f\n", afdmdv.filt, angle(mod_strip)); + + end + end +endfunction + + +function ct_symb_buf = update_ct_symb_buf(ct_symb_buf, ch_symb, Nct_sym_buf, Nsymbrowpilot) + + % update memory in symbol buffer + + for r=1:Nct_sym_buf-Nsymbrowpilot + ct_symb_buf(r,:) = ct_symb_buf(r+Nsymbrowpilot,:); + end + i = 1; + for r=Nct_sym_buf-Nsymbrowpilot+1:Nct_sym_buf + ct_symb_buf(r,:) = ch_symb(i,:); + i++; + end +endfunction + + +% returns index of start of frame and fine freq offset + +function [next_sync cohpsk] = frame_sync_fine_freq_est(cohpsk, ch_symb, sync, next_sync) + ct_symb_buf = cohpsk.ct_symb_buf; + Nct_sym_buf = cohpsk.Nct_sym_buf; + Rs = cohpsk.Rs; + Nsymbrowpilot = cohpsk.Nsymbrowpilot; + Nc = cohpsk.Nc; + Nd = cohpsk.Nd; + + ct_symb_buf = update_ct_symb_buf(ct_symb_buf, ch_symb, Nct_sym_buf, Nsymbrowpilot); + cohpsk.ct_symb_buf = ct_symb_buf; + + % sample pilots at start of this frame and start of next frame + + sampling_points = [1 2 cohpsk.Nsymbrow+3 cohpsk.Nsymbrow+4]; + pilot2 = [ cohpsk.pilot(1,:); cohpsk.pilot(2,:); cohpsk.pilot(1,:); cohpsk.pilot(2,:);]; + + if sync == 0 + + % sample correlation over 2D grid of time and fine freq points + + max_corr = 0; + for f_fine=-20:0.25:20 +% for f_fine=-1:0.25:1 + f_fine_rect = exp(-j*f_fine*2*pi*sampling_points/Rs)'; % note: this could be pre-computed at init or compile time + for t=0:cohpsk.Nsymbrowpilot-1 + corr = 0; mag = 0; + for c=1:Nc*Nd + f_corr_vec = f_fine_rect .* ct_symb_buf(t+sampling_points,c); % note: this could be pre-computed at init or compile time + acorr = 0.0; + for p=1:length(sampling_points) + acorr += pilot2(p,c-Nc*floor((c-1)/Nc)) * f_corr_vec(p); + mag += abs(f_corr_vec(p)); + end + corr += abs(acorr); + end + %printf(" f: %f t: %d corr: %f mag: %f ratio: %f\n", f_fine, t, corr, mag, corr/mag); + if corr >= max_corr + max_corr = corr; + max_mag = mag; + cohpsk.ct = t; + cohpsk.f_fine_est = f_fine; + cohpsk.ff_rect = exp(-j*f_fine*2*pi/Rs); + end + end + end + + printf(" [%d] fine freq f: %f max_ratio: %f ct: %d\n", cohpsk.frame, cohpsk.f_fine_est, abs(max_corr)/max_mag, cohpsk.ct); + if abs(max_corr/max_mag) > 0.9 + printf(" [%d] encouraging sync word! ratio: %f\n", cohpsk.frame, abs(max_corr/max_mag)); + cohpsk.sync_timer = 0; + next_sync = 1; + else + next_sync = 0; + %printf(" [%d] back to coarse freq offset est...\n", cohpsk.frame) ; + end + cohpsk.ratio = abs(max_corr/max_mag); + end + + % single point correlation just to see if we are still in sync + + if sync == 1 + corr = 0; mag = 0; + f_fine_rect = exp(-j*cohpsk.f_fine_est*2*pi*sampling_points/Rs)'; + for c=1:Nc*Nd + f_corr_vec = f_fine_rect .* ct_symb_buf(cohpsk.ct+sampling_points,c); + acorr = 0; + for p=1:length(sampling_points) + acorr += pilot2(p, c-Nc*floor((c-1)/Nc)) * f_corr_vec(p); + mag += abs(f_corr_vec(p)); + end + corr += abs(acorr); + end + cohpsk.ratio = abs(corr)/mag; + %printf("f_fine_est: %f ratio: %f\n", cohpsk.f_fine_est, cohpsk.ratio); + end + +endfunction + + +% misc sync state machine code, just wanted it in a function + +function [sync cohpsk] = sync_state_machine(cohpsk, sync, next_sync) + + if sync == 1 + + % check that sync is still good, fall out of sync on consecutive bad frames */ + + if cohpsk.ratio < 0.8 + cohpsk.sync_timer++; + else + cohpsk.sync_timer = 0; + end + % printf(" ratio: %f sync timer: %d\n", cohpsk.ratio, cohpsk.sync_timer); + + if cohpsk.sync_timer == 10 + printf(" [%d] lost sync ....\n", cohpsk.frame); + next_sync = 0; + end + end + + sync = next_sync; +endfunction + + +% Rate Rs BER tests ------------------------------------------------------------------------------ + +function sim_out = ber_test(sim_in) + sim_in = symbol_rate_init(sim_in); + + Fs = sim_in.Fs; + Rs = sim_in.Rs; + Ntrials = sim_in.Ntrials; + verbose = sim_in.verbose; + plot_scatter = sim_in.plot_scatter; + framesize = sim_in.framesize; + bps = sim_in.bps; + + Esvec = sim_in.Esvec; + ldpc_code = sim_in.ldpc_code; + rate = sim_in.ldpc_code_rate; + code_param = sim_in.code_param; + tx_bits_buf = sim_in.tx_bits_buf; + Nsymb = sim_in.Nsymb; + Nsymbrow = sim_in.Nsymbrow; + Nsymbrowpilot = sim_in.Nsymbrowpilot; + Nc = sim_in.Nc; + Npilotsframe = sim_in.Npilotsframe; + Ns = sim_in.Ns; + Np = sim_in.Np; + Nd = sim_in.Nd; + modulation = sim_in.modulation; + pilot = sim_in.pilot; + prev_sym_tx = sim_in.prev_sym_tx; + prev_sym_rx = sim_in.prev_sym_rx; + rx_symb_buf = sim_in.rx_symb_buf; + tx_pilot_buf = sim_in.tx_pilot_buf; + rx_pilot_buf = sim_in.rx_pilot_buf; + + hf_sim = sim_in.hf_sim; + nhfdelay = sim_in.hf_delay_ms*Rs/1000; + hf_mag_only = sim_in.hf_mag_only; + f_off = sim_in.f_off; + div_time_shift = sim_in.div_timeshift; + + [spread spread_2ms hf_gain] = init_hf_model(Rs, Nsymbrowpilot*(Ntrials+2)); + + if strcmp(modulation,'dqpsk') + Nsymbrowpilot = Nsymbrow; + end + + % Start Simulation ---------------------------------------------------------------- + + for ne = 1:length(Esvec) + EsNodB = Esvec(ne); + EsNo = 10^(EsNodB/10); + + variance = 1/EsNo; + if verbose > 1 + printf("EsNo (dB): %f EsNo: %f variance: %f\n", EsNodB, EsNo, variance); + end + + Terrs = 0; Tbits = 0; + + s_ch_tx_log = []; + rx_symb_log = []; + noise_log = []; + errors_log = []; + Nerrs_log = []; + phi_log = []; + amp_log = []; + EsNo__log = []; + + ldpc_errors_log = []; ldpc_Nerrs_log = []; + + Terrsldpc = Tbitsldpc = Ferrsldpc = 0; + + % init HF channel + + hf_n = 1; + + phase_offset_rect = 1; + w_offset = 2*pi*f_off/Rs; + w_offset_rect = exp(j*w_offset); + + ct_symb_buf = zeros(2*Nsymbrowpilot, Nc*Nd); + prev_tx_symb = prev_rx_symb = ones(1, Nc*Nd); + + % simulation starts here----------------------------------- + + for nn = 1:Ntrials+2 + + if ldpc_code + tx_bits = round(rand(1,framesize*rate)); + else + tx_bits = round(rand(1,framesize)); + end + + if strcmp(modulation,'qpsk') + + [tx_symb tx_bits] = bits_to_qpsk_symbols(sim_in, tx_bits, code_param); + + % one frame delay on bits for qpsk + + tx_bits_buf(1:framesize) = tx_bits_buf(framesize+1:2*framesize); + tx_bits_buf(framesize+1:2*framesize) = tx_bits; + + end + if strcmp(modulation, 'dqpsk') + [tx_symb prev_tx_symb] = bits_to_dqpsk_symbols(sim_in, tx_bits, prev_tx_symb); + tx_bits_buf(1:framesize) = tx_bits; + end + + s_ch = tx_symb; + + % HF channel simulation ------------------------------------ + + hf_fading = ones(1,Nsymb); + if hf_sim + + % separation between carriers. Note this effectively + % under samples at Rs, I dont think this matters. + % Equivalent to doing freq shift at Fs, then + % decimating to Rs. + + wsep = 2*pi*(1+0.5); % e.g. 75Hz spacing at Rs=50Hz, alpha=0.5 filters + + hf_model(hf_n, :) = zeros(1,Nc*Nd); + + for r=1:Nsymbrowpilot + for c=1:Nd*Nc + if c > Nc + time_shift = sim_in.div_timeshift; + else + time_shift = 1; + end + ahf_model = hf_gain*(spread(hf_n+time_shift) + exp(-j*c*wsep*nhfdelay)*spread_2ms(hf_n+time_shift)); + + if hf_mag_only + s_ch(r,c) *= abs(ahf_model); + else + s_ch(r,c) *= ahf_model; + end + hf_model(hf_n, c) = ahf_model; + end + hf_n++; + end + end + + % keep a record of each tx symbol so we can check average power + + for r=1:Nsymbrow + for c=1:Nd*Nc + s_ch_tx_log = [s_ch_tx_log s_ch(r,c)]; + end + end + + % 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(Nsymbrowpilot,Nc*Nd) + j*randn(Nsymbrowpilot,Nc*Nd)); + noise_log = [noise_log noise]; + + for r=1:Nsymbrowpilot + s_ch(r,:) *= phase_offset_rect; + phase_offset_rect *= w_offset_rect; + end + s_ch += noise; + + ct_symb_buf(1:Nsymbrowpilot,:) = ct_symb_buf(Nsymbrowpilot+1:2*Nsymbrowpilot,:); + ct_symb_buf(Nsymbrowpilot+1:2*Nsymbrowpilot,:) = s_ch; + + if strcmp(modulation,'qpsk') + [rx_symb rx_bits rx_symb_linear amp_ phi_ EsNo_ sim_in] = qpsk_symbols_to_bits(sim_in, ct_symb_buf(1:Nsymbrowpilot+Npilotsframe,:)); + phi_log = [phi_log; phi_]; + amp_log = [amp_log; amp_]; + end + if strcmp(modulation,'dqpsk') + [rx_symb rx_bits rx_symb_linear prev_rx_symb] = dqpsk_symbols_to_bits(sim_in, s_ch, prev_rx_symb); + end + + % Wait until we have enough frames to do pilot assisted phase estimation + + if nn > 1 + rx_symb_log = [rx_symb_log rx_symb_linear]; + %EsNo__log = [EsNo__log EsNo_]; + + % Measure BER + + error_positions = xor(rx_bits, tx_bits_buf(1:framesize)); + Nerrs = sum(error_positions); + Terrs += Nerrs; + Tbits += length(tx_bits); + errors_log = [errors_log error_positions]; + Nerrs_log = [Nerrs_log Nerrs]; + + % Optionally LDPC decode + + if ldpc_code + detected_data = ldpc_dec(code_param, sim_in.max_iterations, sim_in.demod_type, sim_in.decoder_type, ... + rx_symb_linear, min(100,EsNo_), amp_linear); + error_positions = xor( detected_data(1:framesize*rate), tx_bits_buf(1:framesize*rate) ); + Nerrs = sum(error_positions); + ldpc_Nerrs_log = [ldpc_Nerrs_log Nerrs]; + ldpc_errors_log = [ldpc_errors_log error_positions]; + if Nerrs + Ferrsldpc++; + end + Terrsldpc += Nerrs; + Tbitsldpc += framesize*rate; + end + end + end + + TERvec(ne) = Terrs; + BERvec(ne) = Terrs/Tbits; + + if verbose + av_tx_pwr = (s_ch_tx_log * s_ch_tx_log')/length(s_ch_tx_log); + + printf("EsNo (dB): %3.1f Terrs: %d Tbits: %d BER %5.3f QPSK BER theory %5.3f av_tx_pwr: %3.2f", + EsNodB, Terrs, Tbits, + Terrs/Tbits, 0.5*erfc(sqrt(EsNo/2)), av_tx_pwr); + if ldpc_code + printf("\n LDPC: Terrs: %d BER: %4.2f Ferrs: %d FER: %4.2f", + Terrsldpc, Terrsldpc/Tbitsldpc, Ferrsldpc, Ferrsldpc/Ntrials); + end + printf("\n"); + end + end + + Ebvec = Esvec - 10*log10(bps); + sim_out.BERvec = BERvec; + sim_out.Ebvec = Ebvec; + sim_out.TERvec = TERvec; + sim_out.errors_log = errors_log; + sim_out.ldpc_errors_log = ldpc_errors_log; + + if plot_scatter + figure(2); + clf; + scat = rx_symb_log .* exp(j*pi/4); + plot(real(scat), imag(scat),'+'); + title('Scatter plot'); + a = 1.5*max(real(scat)); b = 1.5*max(imag(scat)); + axis([-a a -b b]); + + if hf_sim + figure(3); + clf; + + y = 1:(hf_n-1); + x = 1:Nc*Nd; + EsNodBSurface = 20*log10(abs(hf_model(y,:))) - 10*log10(variance); + EsNodBSurface(find(EsNodBSurface < -5)) = -5; + EsNodBSurface(find(EsNodBSurface > 25)) = 25; + mesh(x,y,EsNodBSurface); + grid + axis([1 Nc*Nd 1 Rs*5 -5 25]) + title('HF Channel Es/No'); + + if verbose + [m n] = size(hf_model); + av_hf_pwr = sum(sum(abs(hf_model(:,:)).^2))/(m*n); + printf("average HF power: %3.2f over %d symbols\n", av_hf_pwr, m*n); + end + + end + + if strcmp(modulation,'qpsk') + % set up time axis to include gaps for pilots + + [m1 n1] = size(phi_log); + phi_x = []; + phi_x_counter = 1; + p = Ns; + for r=1:m1 + if p == Ns + phi_x_counter += Npilotsframe; + p = 0; + end + p++; + phi_x = [phi_x phi_x_counter++]; + end + + phi_x -= Nsymbrowpilot; % account for delay in pilot buffer + + figure(5); + clf + subplot(211) + [m n] = size(phi_log); + plot(phi_x, phi_log(:,2),'r+;Estimated HF channel phase;') + if hf_sim + hold on; + [m n] = size(hf_model); + plot(angle(hf_model(1:m,2)),'g;HF channel phase;') + hold off; + end + ylabel('Phase (rads)'); + legend('boxoff'); + axis([1 m -1.1*pi 1.1*pi]) + + subplot(212) + plot(phi_x, amp_log(:,2),'r+;Estimated HF channel amp;') + if hf_sim + hold on; + plot(abs(hf_model(1:m,2))) + hold off; + end + ylabel('Amplitude'); + xlabel('Time (symbols)'); + legend('boxoff'); + axis([1 m 0 3]) + end + + figure(4) + clf + stem(Nerrs_log) + axis([1 length(Nerrs_log) 0 max(Nerrs_log)+1]) + end + +endfunction + + + +function sim_in = standard_init + sim_in.verbose = 1; + sim_in.do_write_pilot_file = 0; + sim_in.plot_scatter = 0; + + sim_in.Esvec = 50; + sim_in.Ntrials = 30; + sim_in.framesize = 2; + sim_in.Rs = 50; + + 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_mag_only = 0; + + sim_in.Nd = 1; +endfunction diff --git a/codec2/tags/0.4.1/octave/cohpsk_demod_plot.m b/codec2/tags/0.4.1/octave/cohpsk_demod_plot.m new file mode 100644 index 00000000..44376bac --- /dev/null +++ b/codec2/tags/0.4.1/octave/cohpsk_demod_plot.m @@ -0,0 +1,159 @@ +% cohpsk_demod_plot.m +% David Rowe May 2015 +% +% Plot Octave outputs from cohpsk_demod, c2dec, to visualise whats going on +% when errors hit the system + +% $ ./c2enc 700 ../../raw/ve9qrp_10s.raw - | ./cohpsk_mod - - | ./cohpsk_ch - - -60 50 1 1 | ./cohpsk_demod - - cohpsk_demod.txt | ./c2dec 700 - - --dump ve9qrp | play -t raw -r 8000 -s -2 - -q + +% ./c2enc 700 ../../raw/ve9qrp_10s.raw - | ./cohpsk_mod - - | ./cohpsk_ch - - -30 50 1 1 | ./cohpsk_demod - - cohpsk_demod.txt | ./c2dec 700 - - --dump ve9qrp_snr3 | play -t raw -r 8000 -s -2 - -q + +graphics_toolkit ("gnuplot"); + +Nc=7; Nd=2; Ns=6; + +load ../build_linux/src/cohpsk_demod.txt +load ../build_linux/src/cohpsk_put_test_bits.txt +load ../build_linux/src/ve9qrp_lsp_.txt +load ../build_linux/src/ve9qrp_snr3_lsp_.txt +load ../build_linux/src/ve9qrp_ak_.txt +load ../build_linux/src/ve9qrp_snr3_ak_.txt +load ../build_linux/src/ve9qrp_model.txt +load ../build_linux/src/ve9qrp_snr3_model.txt +load ../build_linux/src/ve9qrp_snr3_softdec.txt + +Ncf = 50; % number of codec frames to plot +Nmf = Ncf/2; % number of modem frames to plot +Nms = Nmf*Ns; % number of modem symbols to plot + +figure(1) +clf; + +% plot combined signals to show diversity gains + +combined = rx_symb_log_c(:,1:Nc); +for d=2:Nd + combined += rx_symb_log_c(:, (d-1)*Nc+1:d*Nc); +end +plot(combined*exp(j*pi/4)/sqrt(Nd),'+') +title('Scatter'); +axis([-2 2 -2 2]) + +figure(2) +clf; +subplot(211) +plot(rx_phi_log_c(1:Nms,:)) +title('phase') +axis([1 Nms -pi pi]) +subplot(212) +plot(rx_amp_log_c(1:Nms,:)) +title('amplitude') +axis([1 Nms 0 1]) + +figure(3) +subplot(211) +plot(rx_timing_log_c) +title('rx timing'); +subplot(212) +stem(ratio_log_c) +title('Sync ratio'); + +figure(4); +clf; +plot(nerr_log_c(1:Ncf)); +title('Bit Errors'); +xlabel('Codec Frame') + +figure(5); +clf; +plot(error_positions_hist_c); +title('Error Position Histogram'); + +figure(6) +y = 1:Nms; +x = 1:Nc*Nd; +z = 20*log10(rx_amp_log_c(1:Nms,:)); +mesh(x,y,z); +grid +title('Channel Amplitude dB'); +a = min(min(z)); +b = max(max(z)); +axis([1 Nc*Nd 1 Nms a b]) + +% work out alignment, as they sync at different times + +min_e = 1E6; +for i=1:10 + l1 = length(ve9qrp_lsp_); + l2 = length(ve9qrp_snr3_lsp_); + st = i; en = min(l1+i-1,l2); + d = ve9qrp_lsp_(st:en, 1:6) - ve9qrp_snr3_lsp_(1:en-st+1, 1:6); + e = sum(sum(abs(d))); + if e < min_e + min_e = e; + min_i = i; + end +end +printf("time offset between clean and 3dB is %d codec frames\n", min_i); + +% LSP trajectories + +figure(7) +clf +st = min_i; en = 50; +plot(ve9qrp_snr3_lsp_(1:en-st+1, 1:6),'r--') +hold on +plot(ve9qrp_lsp_(st:en, 1:6),'g') +hold off + +% Spectral distortion of LPCs + +figure(8) +clf; +f1=1./fft(ve9qrp_ak_(st:en,:)',128); +f2=1./fft(ve9qrp_snr3_ak_(1:en-st+1,:)',128); +%d = (20*log10(abs(f1)) - 20*log10(abs(f2))); +d = 20*log10(abs(f2)); +sdsq = mean(d.^2); +plot(sdsq) +title('spectral distortion clean and channel SNR=3dB') + +figure(9) +clf; +y = 1:en-st+1; +x = 1:40; +%mesh(y,x,-20*log10(abs(f2(1:40,:)))); +mesh(y,x,d(x,:)); +grid +title('Synthesis filter difference between clean and channel SNR=3dB'); +xlabel('Time (codec frames)') +ylabel('Frequency 0 to 2500Hz'); +zlabel('Difference (dB)'); + +% map soft decn information to LSPs + +mel1 = ve9qrp_snr3_softdec(:,10:12); +mel2 = ve9qrp_snr3_softdec(:,13:14); +mel3 = ve9qrp_snr3_softdec(:,15:18); +mel4 = ve9qrp_snr3_softdec(:,19:21); +mel5 = ve9qrp_snr3_softdec(:,22:24); +mel6 = ve9qrp_snr3_softdec(:,25:26); +softdec_mel = [sum(mel1'.^2); sum(mel2'.^2); sum(mel3'.^2); sum(mel4'.^2); sum(mel5'.^2); sum(mel6'.^2)]; + +figure(10) +clf; +y = 1:en-st+1; +x = 1:6; +%mesh(y,x,-20*log10(abs(f2(1:40,:)))); +mesh(y, x, softdec_mel(:,y)); +grid +xlabel('Codec frame') +ylabel('LSP') +zlabel('Power') +%axis([1 (en-st+1) 1 6 -10 5]) + +% plot symbol energy against SD + +figure(11) +semilogx(mean(softdec_mel(:,1:en-st+1)), sdsq,'+') +grid diff --git a/codec2/tags/0.4.1/octave/cohpsk_frame_design.ods b/codec2/tags/0.4.1/octave/cohpsk_frame_design.ods new file mode 100644 index 00000000..91d16ad4 Binary files /dev/null and b/codec2/tags/0.4.1/octave/cohpsk_frame_design.ods differ diff --git a/codec2/tags/0.4.1/octave/cspec.m b/codec2/tags/0.4.1/octave/cspec.m new file mode 100644 index 00000000..e0ca15b6 --- /dev/null +++ b/codec2/tags/0.4.1/octave/cspec.m @@ -0,0 +1,54 @@ +% cspec.m +% David Rowe Aug 2012 +% Used to compare spectromgrams while experimenting with phase + +function cspec(s1,s2) + f1 = fopen(s1,"rb"); + s1 = fread(f1,Inf,"short"); + f2 = fopen(s2,"rb"); + s2 = fread(f2,Inf,"short"); + + Fs = 8000; + spec_win = 512; + + state = 's1'; + do + if strcmp(state,'s1') + spec(s1,Fs,spec_win); + %title(s1); + end + if strcmp(state,'s2') + spec(s2,Fs,spec_win); + %title(s2); + end + if strcmp(state,'diff') + spec(s1-s2,Fs,spec_win); + %title("difference"); + end + + printf("\rstate: %s space-toggle d-diff q-quit", state); + fflush(stdout); + k = kbhit(); + + if k == ' ' + if strcmp(state,"diff") + next_state = 's1'; + end + if strcmp(state,"s1") + next_state = 's2'; + end + if strcmp(state,'s2') + next_state = 's1'; + end + end + + if k == 'd' + next_state = 'diff'; + end + + state = next_state; + until (k == 'q') + + printf("\n"); + +endfunction diff --git a/codec2/tags/0.4.1/octave/dacres.m b/codec2/tags/0.4.1/octave/dacres.m new file mode 100644 index 00000000..6d429362 --- /dev/null +++ b/codec2/tags/0.4.1/octave/dacres.m @@ -0,0 +1,165 @@ +% dacres.m +% David Rowe 18 Feb 2015 +% Brady O'Brien 5 Mar 2015 +% DAC upconversion simulation + +graphics_toolkit ("gnuplot"); + +cicn = 5; %delay for CIC filter +N = 5; %input interpolation rate +M = 25; %dac interpolation rate +csf = 1024; %scaling factor for CIC filter conversion +fd = 2E6; %DAC frequency +fs = 2E6/M/N; %Input sampling frequency +fi = 2E6/M; %freq of first interpolation +fb = 7E5; %Bandpass frequency +fc1 = fi/4; %Frequency of initial upconversion +ciccb=[-0.029626 0.252638 -2.304683 16.332166 -2.304683 0.252638 -0.029626]; %CIC Compensation FIR +pcicfb = fir1(41,.5); %Interpolation LPF Fir +s1fir = filter(ciccb,1,pcicfb); %Combine compensation and LPF +%s1fir = [-0.00000215, -0.00008715, 0.00073915, -0.00674415, 0.05618415, 0.01629015, -0.19074815, -0.04231615, 0.53620515, 0.09933915, -1.32978715, -0.38797815, 3.97887715, 6.70888315, 3.97887715, -0.38797815, -1.32978715, 0.09933915, 0.53620515, -0.04231615, -0.19074815, ]; + +t = (1:fs/2); +scpin = e.^(i*(t*pi*2*(3000/8000))); % initial complex input +%scpin = zeros(1,length(t)); +scpin(1) = 1+i; + +intstage1 = zeros(1,2*length(scpin)); %First stage of interpolation, 2x +intstage1(1:2:2*length(scpin))=scpin; + +scireal = int32(filter(s1fir,1,real(intstage1))*csf); %separate input into real and imiginary and apply pre-distortion +sciimag = int32(filter(s1fir,1,imag(intstage1))*csf); % also convert to integer. CIC integrator needs integer to work properly + +%Apply 3 stage comb to real +fdin = scireal; +combout1=0; +combout2=0; +combout3=0; +combout4=0; +ccbuf1=zeros(1,cicn/N); +ccbuf2=zeros(1,cicn/N); +ccbuf3=zeros(1,cicn/N); +ccbuf4=zeros(1,cicn/N); + +for ii=1:length(fdin) + combout1 = fdin(ii) - ccbuf1(end); + combout2 = combout1 - ccbuf2(end); + combout3 = combout2 - ccbuf3(end); + combout4 = combout3 - ccbuf4(end); + ccbuf1(2:end)=ccbuf1(1:end-1); + ccbuf2(2:end)=ccbuf2(1:end-1); + ccbuf3(2:end)=ccbuf3(1:end-1); + ccbuf4(2:end)=ccbuf4(1:end-1); + ccbuf1(1)=fdin(ii); + ccbuf2(1)=combout1; + ccbuf3(1)=combout2; + ccbuf4(1)=combout3; + fdcout(ii)=combout4; +end + +intout1=0; +intout2=0; +intout3=0; +intout4=0; +fdnext = zeros(1,length(fdcout)*N); +fdnext(1:N:length(fdcout)*N) = fdcout; %Interpolate + +for ii=1:length(fdnext) + intout1 = fdnext(ii) + intout1; + intout2 = intout1 + intout2; + intout3 = intout2 + intout3; + intout4 = intout3 + intout4; + fdnext(ii)=intout4; +end +scoreal=single(fdnext/(2**20)); + +fdin=sciimag; + +%Apply 3 stage comb to imag +combout1=0; +combout2=0; +combout3=0; +combout4=0; +ccbuf1=zeros(1,cicn/N); +ccbuf2=zeros(1,cicn/N); +ccbuf3=zeros(1,cicn/N); +ccbuf4=zeros(1,cicn/N); + +for ii=1:length(fdin) + combout1 = fdin(ii) - ccbuf1(end); + combout2 = combout1 - ccbuf2(end); + combout3 = combout2 - ccbuf3(end); + combout4 = combout3 - ccbuf4(end); + ccbuf1(2:end)=ccbuf1(1:end-1); + ccbuf2(2:end)=ccbuf2(1:end-1); + ccbuf3(2:end)=ccbuf3(1:end-1); + ccbuf4(2:end)=ccbuf4(1:end-1); + ccbuf1(1)=fdin(ii); + ccbuf2(1)=combout1; + ccbuf3(1)=combout2; + ccbuf4(1)=combout3; + fdcout(ii)=combout4; +end + +intout1=0; +intout2=0; +intout3=0; +intout4=0; +fdnext = zeros(1,length(fdcout)*N); +fdnext(1:N:length(fdcout)*N) = fdcout; %Interpolate + +for ii=1:length(fdnext) + intout1 = fdnext(ii) + intout1; + intout2 = intout1 + intout2; + intout3 = intout2 + intout3; + intout4 = intout3 + intout4; + fdnext(ii)=intout4; +end +scoimag=single(fdnext/(2**20)); + +%Convert complex to real and shift up to Fs/4 +ssout = scoreal.*cos(pi*.5*(1:length(scoreal))) + scoimag.*sin(pi*.5*(1:length(scoimag))); + + +t = (0:(fi-1)); + +beta1 = 0.999; +b1x = -2*sqrt(beta1)*cos(2*pi*(fb/fd)) +beta2 = beta1 - (1-beta1)*M; + +sducin = ssout; +%sducin = cos(pi*.5*t); + +sduceq = filter([1 0 beta2],1,sducin); %pre interpolation notch filter to equalize bandpass after interpolation +sducinterp = zeros(1,length(sduceq)*M); %interpolate by zero-stuffing +sducinterp(1:M:length(sduceq)*M) = sduceq; +sdac = filter(1,[1 b1x beta1],sducinterp); %select wanted signal + +sdac = sdac + median(sdac); %Center above zero +sdac = sdac / max(sdac); %normalize +sdac = int32(sdac*2000); %integerize +sdac = sdac + sdac .^ 5; + +figure(1) +subplot(211) +plot(20*log10(abs(fft(sducin)/fi))) +grid +axis([0 fi/2 -20 50]) +title('Output from modem'); +subplot(212) +plot(20*log10(abs(fft(sduceq/fi)))) +grid +axis([0 fi/2 -20 70]) +title('After Pre-eq'); + +figure(2) +subplot(211) +plot(20*log10(abs(fft(sducinterp)/fd))) +grid +axis([0 (fd/2) -20 80]) +title('After interpolation'); +subplot(212) +plot(20*log10(abs(fft(sdac)/fd))) +grid +title('After bandpass'); +%axis([0 (fd/2) -20 80]) diff --git a/codec2/tags/0.4.1/octave/diff_codec.m b/codec2/tags/0.4.1/octave/diff_codec.m new file mode 100644 index 00000000..2ad204ff --- /dev/null +++ b/codec2/tags/0.4.1/octave/diff_codec.m @@ -0,0 +1,96 @@ +% diff_codec.m +% +% Plots differences between two states in two runs of the codec, +% e.g. x86 and embedded. +% +% Copyright David Rowe 2013 +% +% This program is distributed under the terms of the GNU General Public License +% Version 2 + +function diff_codec(samname1, samname2, model1_prefix, model2_prefix) + + fs1=fopen(samname1,"rb"); + s1=fread(fs1,Inf,"short"); + fs2=fopen(samname2,"rb"); + s2=fread(fs2,Inf,"short"); + + st = 1; + en = length(s1); + + figure(1); + clf; + subplot(211); + l1 = strcat("r;",samname1,";"); + plot(s1(st:en), l1); + axis([1 en-st min(s1(st:en)) max(s1(st:en))]); + subplot(212); + l2 = strcat("r;",samname2,";"); + plot(s2(st:en),l2); + axis([1 en-st min(s1(st:en)) max(s1(st:en))]); + + figure(2) + plot(s1(st:en)-s2(st:en)); + max(s1(st:en)-s2(st:en)); + + model_name1 = strcat(model1_prefix,"_model.txt"); + model1 = load(model_name1); + model_name1q = strcat(model1_prefix,"_qmodel.txt"); + model1q = load(model_name1q); + + model_name2 = strcat(model2_prefix,"_model.txt"); + model2 = load(model_name2); + model_name2q = strcat(model2_prefix,"_qmodel.txt"); + model2q = load(model_name2q); + + Wo1 = model1(:,1); + L1 = model1(:,2); + Am1 = model1(:,3:82); + Wo1q = model1q(:,1); + L1q = model1q(:,2); + Am1q = model1q(:,3:82); + + Wo2 = model2(:,1); + L2 = model2(:,2); + Am2 = model2(:,3:82); + Wo2q = model2q(:,1); + L2q = model2q(:,2); + Am2q = model2q(:,3:82); + + figure(3) + subplot(211) + plot(Wo1) + title('Wo1'); + subplot(212) + plot(Wo1-Wo2) + figure(4) + subplot(211) + plot(Wo1q) + title('Wo1q'); + subplot(212) + plot(Wo1q-Wo2q) + + figure(5) + subplot(211) + plot(L1) + title('L1'); + subplot(212) + plot(L1-L2) + figure(6) + subplot(211) + plot(L1q) + title('L1q'); + subplot(212) + plot(L1q-L2q) + + figure(7) + l=length(L1q); + sm=zeros(1,l); + for f=1:l + %printf("f %d L1q %d L2q %d\n",f,L1q(f),L2q(f)); + sm(f) = sum(10*log10(Am1q(f,1:L1q(f))) - 10*log10(Am2q(f,1:L2q(f)))); + end + plot(sm) + title('Am1q - Am2q'); + +endfunction diff --git a/codec2/tags/0.4.1/octave/fdmdv.m b/codec2/tags/0.4.1/octave/fdmdv.m new file mode 100644 index 00000000..e36e4d2a --- /dev/null +++ b/codec2/tags/0.4.1/octave/fdmdv.m @@ -0,0 +1,1259 @@ +% fdmdv.m +% +% Functions that implement a Frequency Divison Multiplexed Modem for +% Digital Voice (FDMDV) over HF channels. +% +% Copyright David Rowe 2012 +% This program is distributed under the terms of the GNU General Public License +% Version 2 +% + +% reqd to make sure we get same random bits at mod and demod + +rand('state',1); +randn('state',1); + +% Constants + +if 0 +global Fs = 8000; % sample rate in Hz +global T = 1/Fs; % sample period in seconds +global Rs; + Rs = 50; % symbol rate in Hz +global Nc; % number of carriers +if exist("NumCarriers") == 0 + Nc = 14; +else + Nc = NumCarriers; +end +global Nb; + Nb = 2; % Bits/symbol for PSK modulation +global Rb; + Rb = Nc*Rs*Nb; % bit rate +global M = Fs/Rs; % oversampling factor +global Nsym = 6; % number of symbols to filter over +global Fsep; + Fsep = 75; % Separation between carriers (Hz) +global Fcentre = 1500; % Centre frequency, Nc/2 carriers below this, N/c carriers above (Hz) +global Nt = 5; % number of symbols we estimate timing over +global P = 4; % oversample factor used for rx symbol filtering +global Nfilter = Nsym*M; +global Nfiltertiming = M+Nfilter+M; +alpha = 0.5; +global snr_coeff; + snr_coeff = 0.9;% SNR est averaging filter coeff +global Nph; + Nph = 9; % number of symbols to estimate phase over + % must be odd number as we take centre symbol +global Nsync_mem = 6 +global sync_uw = [1 -1 1 -1 1 -1]; + +% root raised cosine (Root Nyquist) filter + +global gt_alpha5_root; +gt_alpha5_root = gen_rn_coeffs(alpha, T, Rs, Nsym, M); + +% rx decimation filter + +global Nrxdec; + Nrxdec=31; +global rxdec_coeff; + rxdec_coeff = fir1(Nrxdec-1, 0.25); +end +if 0 + % tmp code to plot freq resp. 20dB attn of any aliases should be fine + % not real sensitive to in-band attn, e.g. outer tones a dB down should be OK + % in terms of BER + figure(1) + [h,f]=freqz(rxdec,1,4000); + hdB=20*log10(abs(h)); + plot(hdB(1:1200)) + grid +end + +% Converts gray code to natural binary + +global m4_gray_to_binary = [ + bin2dec("00") + bin2dec("01") + bin2dec("11") + bin2dec("10") + ]; +global m8_gray_to_binary = [ + bin2dec("000") + bin2dec("001") + bin2dec("011") + bin2dec("010") + bin2dec("111") + bin2dec("110") + bin2dec("100") + bin2dec("101") + ]; + +% Convert natural binary to gray code + +global m4_binary_to_gray = [ + bin2dec("00") + bin2dec("01") + bin2dec("11") + bin2dec("10") + ]; + +global m8_binary_to_gray = [ + bin2dec("000") + bin2dec("001") + bin2dec("011") + bin2dec("010") + bin2dec("110") + bin2dec("111") + bin2dec("101") + bin2dec("100") + ]; + +% temp logging stuff + +% Functions ---------------------------------------------------- + + +% generate Nc+1 PSK symbols from vector of (1,Nc*Nb) input bits. The +% Nc+1 symbol is the +1 -1 +1 .... BPSK sync carrier + +function tx_symbols = bits_to_psk(prev_tx_symbols, tx_bits) + global Nc; + global Nb; + global pilot_bit; + global m4_gray_to_binary; + global m8_gray_to_binary; + + assert(length(tx_bits) == Nc*Nb, "Incorrect number of bits"); + + m = 2 .^ Nb; + assert((m == 4) || (m == 8)); + + for c=1:Nc + + % extract bits for this symbol + + bits_binary = tx_bits((c-1)*Nb+1:c*Nb); + bits_decimal = sum(bits_binary .* 2.^(Nb-1:-1:0)); + + % determine phase shift using gray code mapping + + if m == 4 + phase_shift = (2*pi/m)*m4_gray_to_binary(bits_decimal+1); + else + phase_shift = (2*pi/m)*m8_gray_to_binary(bits_decimal+1); + end + + % apply phase shift from previous symbol + + tx_symbols(c) = exp(j*phase_shift) * prev_tx_symbols(c); + end + + % +1 -1 +1 -1 BPSK sync carrier, once filtered becomes two spectral + % lines at +/- Rs/2 + + if pilot_bit + tx_symbols(Nc+1) = -prev_tx_symbols(Nc+1); + else + tx_symbols(Nc+1) = prev_tx_symbols(Nc+1); + end + if pilot_bit + pilot_bit = 0; + else + pilot_bit = 1; + end + +endfunction + + +% Given Nc symbols construct M samples (1 symbol) of Nc filtered +% symbols streams + +function [tx_baseband fdmdv] = tx_filter(fdmdv, tx_symbols) + Nc = fdmdv.Nc; + M = fdmdv.M; + tx_filter_memory = fdmdv.tx_filter_memory; + Nfilter = fdmdv.Nfilter; + gt_alpha5_root = fdmdv.gt_alpha5_root; + + tx_baseband = zeros(Nc+1,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) = sqrt(2)/2*tx_symbols; + + for i=1:M + tx_baseband(:,i) = M*tx_filter_memory(:,M:M:Nfilter) * gt_alpha5_root(M-i+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+1,M); + + fdmdv.tx_filter_memory = tx_filter_memory; +endfunction + + +% Construct FDM signal by frequency shifting each filtered symbol +% stream. Returns complex signal so we can apply frequency offsets +% easily. + +function [tx_fdm fdmdv] = fdm_upconvert(fdmdv, tx_filt) + Fs = fdmdv.Fs; + M = fdmdv.M; + Nc = fdmdv.Nc; + Fsep = fdmdv.Fsep; + phase_tx = fdmdv.phase_tx; + freq = fdmdv.freq; + fbb_rect = fdmdv.fbb_rect; + fbb_phase_tx = fdmdv.fbb_phase_tx; + + tx_fdm = zeros(1,M); + + % Nc+1 tones + + for c=1:Nc+1 + for i=1:M + phase_tx(c) = phase_tx(c) * freq(c); + tx_fdm(i) = tx_fdm(i) + tx_filt(c,i)*phase_tx(c); + end + end + + % shift up to carrier freq + + for i=1:M + fbb_phase_tx *= fbb_rect; + tx_fdm(i) = tx_fdm(i) * fbb_phase_tx; + end + + % Scale such that total Carrier power C of real(tx_fdm) = Nc. This + % excludes the power of the pilot tone. + % We return the complex (single sided) signal to make frequency + % shifting for the purpose of testing easier + + tx_fdm = 2*tx_fdm; + + % normalise digital oscillators as the magnitude can drift over time + + for c=1:Nc+1 + mag = abs(phase_tx(c)); + phase_tx(c) /= mag; + end + mag = abs(fbb_phase_tx); + fbb_phase_tx /= mag; + + fdmdv.fbb_phase_tx = fbb_phase_tx; + fdmdv.phase_tx = phase_tx; +endfunction + + +% Frequency shift each modem carrier down to Nc+1 baseband signals + +function [rx_baseband fdmdv] = fdm_downconvert(fdmdv, rx_fdm, nin) + Fs = fdmdv.Fs; + M = fdmdv.M; + Nc = fdmdv.Nc; + phase_rx = fdmdv.phase_rx; + freq = fdmdv.freq; + + rx_baseband = zeros(Nc+1,nin); + + for c=1:Nc+1 + for i=1:nin + phase_rx(c) = phase_rx(c) * freq(c); + rx_baseband(c,i) = rx_fdm(i)*phase_rx(c)'; + end + end + + for c=1:Nc+1 + mag = abs(phase_rx(c)); + phase_rx(c) /= mag; + end + + fdmdv.phase_rx = phase_rx; +endfunction + + +% Receive filter each baseband signal at oversample rate P + +function [rx_filt fdmdv] = rx_filter(fdmdv, rx_baseband, nin) + Nc = fdmdv.Nc; + M = fdmdv.M; + P = fdmdv.P; + rx_filter_memory = fdmdv.rx_filter_memory; + Nfilter = fdmdv.Nfilter; + gt_alpha5_root = fdmdv.gt_alpha5_root; + + rx_filt = zeros(Nc+1,nin*P/M); + + % rx filter each symbol, generate P filtered output samples for each symbol. + % Note we keep memory at rate M, it's just the filter output at rate P + + N=M/P; + j=1; + for i=1:N:nin + rx_filter_memory(:,Nfilter-N+1:Nfilter) = rx_baseband(:,i:i-1+N); + rx_filt(:,j) = rx_filter_memory * gt_alpha5_root'; + rx_filter_memory(:,1:Nfilter-N) = rx_filter_memory(:,1+N:Nfilter); + j+=1; + end + + fdmdv.rx_filter_memory = rx_filter_memory; +endfunction + + +% LP filter +/- 1000 Hz, allows us to perfrom rx filtering at a lower rate saving CPU + +function [rx_fdm_filter fdmdv] = rxdec_filter(fdmdv, rx_fdm, nin) + M = fdmdv.M; + Nrxdec = fdmdv.Nrxdec; + rxdec_coeff = fdmdv.rxdec_coeff; + rxdec_lpf_mem = fdmdv.rxdec_lpf_mem; + + rxdec_lpf_mem(1:Nrxdec-1+M-nin) = rxdec_lpf_mem(nin+1:Nrxdec-1+M); + rxdec_lpf_mem(Nrxdec-1+M-nin+1:Nrxdec-1+M) = rx_fdm(1:nin); + + rx_fdm_filter = zeros(1,nin); + for i=1:nin + rx_fdm_filter(i) = rxdec_lpf_mem(i:Nrxdec-1+i) * rxdec_coeff; + end + + fdmdv.rxdec_lpf_mem = rxdec_lpf_mem; +end + + +% Combined down convert and rx filter, more memory efficient but less intuitive design +% TODO: Decimate mem update and downconversion, this will save some more CPU and memory +% note phase would have to advance 4 times as fast + +function [rx_filt fdmdv] = down_convert_and_rx_filter(fdmdv, rx_fdm, nin, dec_rate) + Nc = fdmdv.Nc; + M = fdmdv.M; + P = fdmdv.P; + rx_fdm_mem = fdmdv.rx_fdm_mem; + phase_rx = fdmdv.phase_rx; + freq = fdmdv.freq; + freq_pol = fdmdv.freq_pol; + Nfilter = fdmdv.Nfilter; + gt_alpha5_root = fdmdv.gt_alpha5_root; + Q = fdmdv.Q; + + % update memory of rx_fdm + + rx_fdm_mem(1:Nfilter+M-nin) = rx_fdm_mem(nin+1:Nfilter+M); + rx_fdm_mem(Nfilter+M-nin+1:Nfilter+M) = rx_fdm(1:nin); + + for c=1:Nc+1 + + % now downconvert using current freq offset to get Nfilter+nin + % baseband samples. + % + % Nfilter nin + % |--------------------------|---------| + % | + % phase_rx(c) + % + % This means winding phase(c) back from this point + % to ensure phase continuity + + wind_back_phase = -freq_pol(c)*Nfilter; + phase_rx(c) = phase_rx(c)*exp(j*wind_back_phase); + + % down convert all samples in buffer + + rx_baseband = zeros(1,Nfilter+M); + st = Nfilter+M; % end of buffer + st -= nin-1; % first new sample + st -= Nfilter; % first sample used in filtering + + f_rect = freq(c) .^ dec_rate; + + for i=st:dec_rate:Nfilter+M + phase_rx(c) = phase_rx(c) * f_rect; + rx_baseband(i) = rx_fdm_mem(i)*phase_rx(c)'; + end + + % now we can filter this carrier's P symbols. Due to filtering of rx_fdm we can filter at rate at rate M/Q + + N=M/P; k = 1; + for i=1:N:nin + rx_filt(c,k) = (M/Q)*rx_baseband(st+i-1:dec_rate:st+i-1+Nfilter-1) * gt_alpha5_root(1:dec_rate:length(gt_alpha5_root))'; + k+=1; + end + end + + fdmdv.phase_rx = phase_rx; + fdmdv.rx_fdm_mem = rx_fdm_mem; +endfunction + + +% LPF and peak pick part of freq est, put in a function as we call it twice + +function [foff imax pilot_lpf_out S] = lpf_peak_pick(pilot_baseband, pilot_lpf, nin, do_fft) + global M; + global Npilotlpf; + global Npilotbaseband; + global Npilotcoeff; + global Fs; + global Mpilotfft; + global pilot_coeff; + + % LPF cutoff 200Hz, so we can handle max +/- 200 Hz freq offset + + pilot_lpf(1:Npilotlpf-nin) = pilot_lpf(nin+1:Npilotlpf); + k = Npilotbaseband-nin+1;; + for i = Npilotlpf-nin+1:Npilotlpf + pilot_lpf(i) = pilot_baseband(k-Npilotcoeff+1:k) * pilot_coeff'; + k++; + end + + imax = 0; + foff = 0; + S = zeros(1, Mpilotfft); + + if do_fft + % decimate to improve DFT resolution, window and DFT + + Mpilot = Fs/(2*200); % calc decimation rate given new sample rate is twice LPF freq + h = hanning(Npilotlpf); + s = pilot_lpf(1:Mpilot:Npilotlpf) .* h(1:Mpilot:Npilotlpf)'; + s = [s zeros(1,Mpilotfft-Npilotlpf/Mpilot)]; + S = fft(s, Mpilotfft); + + % peak pick and convert to Hz + + [imax ix] = max(abs(S)); + r = 2*200/Mpilotfft; % maps FFT bin to frequency in Hz + + if ix > Mpilotfft/2 + foff = (ix - Mpilotfft - 1)*r; + else + foff = (ix - 1)*r; + endif + end + + pilot_lpf_out = pilot_lpf; + +endfunction + + +% Estimate frequency offset of FDM signal using BPSK pilot. This is quite +% sensitive to pilot tone level wrt other carriers + +function [foff S1 S2] = rx_est_freq_offset(rx_fdm, pilot, pilot_prev, nin, do_fft) + global M; + global Npilotbaseband; + global pilot_baseband1; + global pilot_baseband2; + global pilot_lpf1; + global pilot_lpf2; + + % down convert latest nin samples of pilot by multiplying by ideal + % BPSK pilot signal we have generated locally. The peak of the DFT + % of the resulting signal is sensitive to the time shift between the + % received and local version of the pilot, so we do it twice at + % different time shifts and choose the maximum. + + pilot_baseband1(1:Npilotbaseband-nin) = pilot_baseband1(nin+1:Npilotbaseband); + pilot_baseband2(1:Npilotbaseband-nin) = pilot_baseband2(nin+1:Npilotbaseband); + for i=1:nin + pilot_baseband1(Npilotbaseband-nin+i) = rx_fdm(i) * conj(pilot(i)); + pilot_baseband2(Npilotbaseband-nin+i) = rx_fdm(i) * conj(pilot_prev(i)); + end + + [foff1 max1 pilot_lpf1 S1] = lpf_peak_pick(pilot_baseband1, pilot_lpf1, nin, do_fft); + [foff2 max2 pilot_lpf2 S2] = lpf_peak_pick(pilot_baseband2, pilot_lpf2, nin, do_fft); + + if max1 > max2 + foff = foff1; + else + foff = foff2; + end +endfunction + + +% Estimate optimum timing offset, re-filter receive symbols + +function [rx_symbols rx_timing_M env fdmdv] = rx_est_timing(fdmdv, rx_filt, nin) + M = fdmdv.M; + Nt = fdmdv.Nt; + Nc = fdmdv.Nc; + rx_filter_mem_timing = fdmdv.rx_filter_mem_timing; + P = fdmdv.P; + Nfilter = fdmdv.Nfilter; + Nfiltertiming = fdmdv.Nfiltertiming; + + % nin adjust + % -------------------------------- + % 120 -1 (one less rate P sample) + % 160 0 (nominal) + % 200 1 (one more rate P sample) + + adjust = P - nin*P/M; + + % update buffer of Nt rate P filtered symbols + + rx_filter_mem_timing(:,1:(Nt-1)*P+adjust) = rx_filter_mem_timing(:,P+1-adjust:Nt*P); + rx_filter_mem_timing(:,(Nt-1)*P+1+adjust:Nt*P) = rx_filt(:,:); + + % sum envelopes of all carriers + + env = sum(abs(rx_filter_mem_timing(:,:))); % use all Nc+1 carriers for timing + %env = abs(rx_filter_mem_timing(Nc+1,:)); % just use BPSK pilot + [n m] = size(env); + + % The envelope has a frequency component at the symbol rate. The + % phase of this frequency component indicates the timing. So work out + % single DFT at frequency 2*pi/P + + x = env * exp(-j*2*pi*(0:m-1)/P)'; + + norm_rx_timing = angle(x)/(2*pi); + rx_timing = norm_rx_timing*P + P/4; + if (rx_timing > P) + rx_timing -= P; + end + if (rx_timing < -P) + rx_timing += P; + end + + % rx_filter_mem_timing contains Nt*P samples (Nt symbols at rate P), + % where Nt is odd. Lets use linear interpolation to resample in the + % centre of the timing estimation window + + rx_timing += floor(Nt/2)*P; + low_sample = floor(rx_timing); + fract = rx_timing - low_sample; + high_sample = ceil(rx_timing); + %printf("rx_timing: %f low_sample: %f high_sample: %f fract: %f\n", rx_timing, low_sample, high_sample, fract); + + rx_symbols = rx_filter_mem_timing(:,low_sample)*(1-fract) + rx_filter_mem_timing(:,high_sample)*fract; + % rx_symbols = rx_filter_mem_timing(:,high_sample+1); + + rx_timing_M = norm_rx_timing*M; + + fdmdv.rx_filter_mem_timing = rx_filter_mem_timing; +endfunction + + +% Experimental "feed forward" phase estimation function - estimates +% phase over a windows of Nph (e.g. Nph = 9) symbols. May not work +% well on HF channels but lets see. Has a phase ambiguity of m(pi/4) +% where m=0,1,2 which needs to be corrected outside of this function + +function [phase_offsets ferr] = rx_est_phase(rx_symbols) + global rx_symbols_mem; + global prev_phase_offsets; + global phase_amb; + global Nph; + global Nc; + + % keep record of Nph symbols + + rx_symbols_mem(:,1:Nph-1) = rx_symbols_mem(:,2:Nph); + rx_symbols_mem(:,Nph) = rx_symbols; + + % estimate and correct phase offset based of modulation stripped samples + + phase_offsets = zeros(Nc+1,1); + for c=1:Nc+1 + + % rotate QPSK constellation to a single point + mod_stripped = abs(rx_symbols_mem(c,:)) .* exp(j*4*angle(rx_symbols_mem(c,:))); + + % find average phase offset, which will be on -pi/4 .. pi/4 + sum_real = sum(real(mod_stripped)); + sum_imag = sum(imag(mod_stripped)); + phase_offsets(c) = atan2(sum_imag, sum_real)/4; + + % determine if phase has jumped from - -> + + if (prev_phase_offsets(c) < -pi/8) && (phase_offsets(c) > pi/8) + phase_amb(c) -= pi/2; + if (phase_amb(c) < -pi) + phase_amb(c) += 2*pi; + end + end + + % determine if phase has jumped from + -> - + if (prev_phase_offsets(c) > pi/8) && (phase_offsets(c) < -pi/8) + phase_amb(c) += pi/2; + if (phase_amb(c) > pi) + phase_amb(c) -= 2*pi; + end + end + end + + ferr = mean(phase_offsets - prev_phase_offsets); + prev_phase_offsets = phase_offsets; + +endfunction + + +% convert symbols back to an array of bits + +function [rx_bits sync_bit f_err phase_difference] = psk_to_bits(prev_rx_symbols, rx_symbols, modulation) + global Nc; + global Nb; + global m4_binary_to_gray; + global m8_binary_to_gray; + + m = 2 .^ Nb; + assert((m == 4) || (m == 8)); + + phase_difference = zeros(Nc+1,1); + for c=1:Nc + norm = 1/(1E-6+abs(prev_rx_symbols(c))); + phase_difference(c) = rx_symbols(c) .* conj(prev_rx_symbols(c)) * norm; + end + + for c=1:Nc + phase_difference(c) *= exp(j*pi/4); + + if m == 4 + + % to get a good match between C and Octave during start up use same as C code + + d = phase_difference(c); + if (real(d) >= 0) && (imag(d) >= 0) + msb = 0; lsb = 0; + end + if (real(d) < 0) && (imag(d) >= 0) + msb = 0; lsb = 1; + end + if (real(d) < 0) && (imag(d) < 0) + msb = 1; lsb = 1; + end + if (real(d) >= 0) && (imag(d) < 0) + msb = 1; lsb = 0; + end + + rx_bits(2*(c-1)+1) = msb; + rx_bits(2*c) = lsb; + else + % determine index of constellation point received 0,1,...,m-1 + + index = floor(angle(phase_difference(c))*m/(2*pi) + 0.5); + + if index < 0 + index += m; + end + + % map to decimal version of bits encoded in symbol + + if m == 4 + bits_decimal = m4_binary_to_gray(index+1); + else + bits_decimal = m8_binary_to_gray(index+1); + end + + % convert back to an array of received bits + + for i=1:Nb + if bitand(bits_decimal, 2.^(Nb-i)) + rx_bits((c-1)*Nb+i) = 1; + else + rx_bits((c-1)*Nb+i) = 0; + end + end + end + end + + assert(length(rx_bits) == Nc*Nb); + + % Extract DBPSK encoded Sync bit + + norm = 1/(1E-6+abs(prev_rx_symbols(Nc+1))); + phase_difference(Nc+1) = rx_symbols(Nc+1) * conj(prev_rx_symbols(Nc+1)) * norm; + if (real(phase_difference(Nc+1)) < 0) + sync_bit = 1; + f_err = imag(phase_difference(Nc+1))*norm; % make f_err magnitude insensitive + else + sync_bit = 0; + f_err = -imag(phase_difference(Nc+1))*norm; + end + + % extra pi/4 rotation as we need for snr_update and scatter diagram + + phase_difference(Nc+1) *= exp(j*pi/4); + +endfunction + + +% given phase differences update estimates of signal and noise levels + +function [sig_est noise_est] = snr_update(sig_est, noise_est, phase_difference) + global snr_coeff; + global Nc; + + % mag of each symbol is distance from origin, this gives us a + % vector of mags, one for each carrier. + + s = abs(phase_difference); + + % signal mag estimate for each carrier is a smoothed version + % of instantaneous magntitude, this gives us a vector of smoothed + % mag estimates, one for each carrier. + + sig_est = snr_coeff*sig_est + (1 - snr_coeff)*s; + + %printf("s: %f sig_est: %f snr_coeff: %f\n", s(1), sig_est(1), snr_coeff); + + % noise mag estimate is distance of current symbol from average + % location of that symbol. We reflect all symbols into the first + % quadrant for convenience. + + refl_symbols = abs(real(phase_difference)) + j*abs(imag(phase_difference)); + n = abs(exp(j*pi/4)*sig_est - refl_symbols); + + % noise mag estimate for each carrier is a smoothed version of + % instantaneous noise mag, this gives us a vector of smoothed + % noise power estimates, one for each carrier. + + noise_est = snr_coeff*noise_est + (1 - snr_coeff)*n; + +endfunction + + +% calculate current sig estimate for eeach carrier + +function snr_dB = calc_snr(sig_est, noise_est) + global Rs; + + % find total signal power by summing power in all carriers + + S = sum(sig_est .^2); + SdB = 10*log10(S); + + % Average noise mag across all carriers and square to get an average + % noise power. This is an estimate of the noise power in Rs = 50Hz of + % BW (note for raised root cosine filters Rs is the noise BW of the + % filter) + + N50 = mean(noise_est).^2; + N50dB = 10*log10(N50); + + % Now multiply by (3000 Hz)/(50 Hz) to find the total noise power in + % 3000 Hz + + N3000dB = N50dB + 10*log10(3000/Rs); + + snr_dB = SdB - N3000dB; + +endfunction + + +% returns nbits from a repeating sequence of random data + +function bits = get_test_bits(nbits) + global Ntest_bits; % length of test sequence + global current_test_bit; + global test_bits; + + for i=1:nbits + bits(i) = test_bits(current_test_bit++); + %if (mod(i,2) == 0) + % bits(i) = 1; + %else + % bits(i) = 0; + %end + + if (current_test_bit > Ntest_bits) + current_test_bit = 1; + endif + end + +endfunction + + +% Accepts nbits from rx and attempts to sync with test_bits sequence. +% if sync OK measures bit errors + +function [sync bit_errors error_pattern] = put_test_bits(test_bits, rx_bits) + global Ntest_bits; % length of test sequence + global rx_test_bits_mem; + + % Append to our memory + + [m n] = size(rx_bits); + rx_test_bits_mem(1:Ntest_bits-n) = rx_test_bits_mem(n+1:Ntest_bits); + rx_test_bits_mem(Ntest_bits-n+1:Ntest_bits) = rx_bits; + + % see how many bit errors we get when checked against test sequence + + error_pattern = xor(test_bits,rx_test_bits_mem); + bit_errors = sum(error_pattern); + + % if less than a thresh we are aligned and in sync with test sequence + + ber = bit_errors/Ntest_bits; + + sync = 0; + if (ber < 0.2) + sync = 1; + endif +endfunction + +% Generate M samples of DBPSK pilot signal for Freq offset estimation + +function [pilot_fdm bit symbol filter_mem phase] = generate_pilot_fdm(bit, symbol, filter_mem, phase, freq) + global M; + global Nfilter; + global gt_alpha5_root; + + % +1 -1 +1 -1 DBPSK sync carrier, once filtered becomes two spectral + % lines at +/- Rs/2 + + if bit + symbol = -symbol; + else + symbol = symbol; + end + if bit + bit = 0; + else + bit = 1; + end + + % filter DPSK symbol to create M baseband samples + + filter_mem(Nfilter) = (sqrt(2)/2)*symbol; + for i=1:M + tx_baseband(i) = M*filter_mem(M:M:Nfilter) * gt_alpha5_root(M-i+1:M:Nfilter)'; + end + filter_mem(1:Nfilter-M) = filter_mem(M+1:Nfilter); + filter_mem(Nfilter-M+1:Nfilter) = zeros(1,M); + + % upconvert + + for i=1:M + phase = phase * freq; + pilot_fdm(i) = sqrt(2)*2*tx_baseband(i)*phase; + end + +endfunction + + +% Generate a 4M sample vector of DBPSK pilot signal. As the pilot signal +% is periodic in 4M samples we can then use this vector as a look up table +% for pilot signal generation in the demod. + +function pilot_lut = generate_pilot_lut() + global Nc; + global Nfilter; + global M; + global freq; + + % pilot states + + pilot_rx_bit = 0; + pilot_symbol = sqrt(2); + pilot_freq = freq(Nc+1); + pilot_phase = 1; + pilot_filter_mem = zeros(1, Nfilter); + %prev_pilot = zeros(M,1); + + pilot_lut = []; + + F=8; + + for f=1:F + [pilot pilot_rx_bit pilot_symbol pilot_filter_mem pilot_phase] = generate_pilot_fdm(pilot_rx_bit, pilot_symbol, pilot_filter_mem, pilot_phase, pilot_freq); + %prev_pilot = pilot; + pilot_lut = [pilot_lut pilot]; + end + + % discard first 4 symbols as filter memory is filling, just keep last + % four symbols + + pilot_lut = pilot_lut(4*M+1:M*F); + +endfunction + + +% grab next pilot samples for freq offset estimation at demod + +function [pilot prev_pilot pilot_lut_index prev_pilot_lut_index] = get_pilot(pilot_lut_index, prev_pilot_lut_index, nin) + global M; + global pilot_lut; + + for i=1:nin + pilot(i) = pilot_lut(pilot_lut_index); + pilot_lut_index++; + if pilot_lut_index > 4*M + pilot_lut_index = 1; + end + prev_pilot(i) = pilot_lut(prev_pilot_lut_index); + prev_pilot_lut_index++; + if prev_pilot_lut_index > 4*M + prev_pilot_lut_index = 1; + end + end +endfunction + +if 0 +% want to use Octave resample function! + +% Change the sample rate by a small amount, for example 1000ppm (ratio +% = 1.001). Always returns nout samples in buf_out, but uses a +% variable number of input samples nin to accomodate the change in +% sample rate. nin is nominally set to nout, but may use nout +/- 2 +% samples to accomodate the different sample rates. buf_in should be +% of length nout+6 samples to accomodate this, and buf_in should be +% updated externally based on the nin returned each time. "ratio" is +% Fs_in/Fs_out, for example 48048/48000 = 1.001 (+1000ppm) or +% 47952/48000 = 0.999 (-1000ppm). Uses linear interpolation to +% perform the resampling. This requires a highly over-sampled signal, +% for example 48000Hz sample rate for the modem signal centred on +% 1kHz, otherwise linear interpolation will have a low pass filter effect +% (for example an 8000Hz sample rate for modem signal centred on 1kHz +% would cause problems). + +function [buf_out t nin] = resample(buf_in, t, ratio, nout) + + for i=1:nout + c = floor(t); + a = t - c; + b = 1 - a; + buf_out(i) = buf_in(c)*b + buf_in(c+1)*a; + t += ratio; + end + + t -= nout; + + % adjust nin and t so that on next call we start with 3 < t < 4, + % this gives us +/- 2 samples room to move before we hit start or + % end of buf_in + + delta = floor(t - 3); + nin = nout + delta; + t -= delta; + +endfunction +end + +% freq offset state machine. Moves between acquire and track states based +% on BPSK pilot sequence. Freq offset estimator occasionally makes mistakes +% when used continuously. So we use it until we have acquired the BPSK pilot, +% then switch to a more robust tracking algorithm. If we lose sync we switch +% back to acquire mode for fast-requisition. + +function [sync reliable_sync_bit state timer sync_mem] = freq_state(sync_bit, state, timer, sync_mem) + global Nsync_mem; + global sync_uw; + + % look for 6 symbol (120ms) 010101 of sync sequence + + unique_word = 0; + for i=1:Nsync_mem-1 + sync_mem(i) = sync_mem(i+1); + end + sync_mem(Nsync_mem) = 1 - 2*sync_bit; + corr = 0; + for i=1:Nsync_mem + corr += sync_mem(i)*sync_uw(i); + end + if abs(corr) == Nsync_mem + unique_word = 1; + end + reliable_sync_bit = (corr == Nsync_mem); + + % iterate state machine + + next_state = state; + if state == 0 + if unique_word + next_state = 1; + timer = 0; + end + end + if state == 1 + if unique_word + timer++; + if timer == 25 % sync has been good for 500ms + next_state = 2; + end + else + next_state = 0; + end + end + if state == 2 % good sync state + if unique_word == 0 + timer = 0; + next_state = 3; + end + end + if state == 3 % tenative bad state, but could be a fade + if unique_word + next_state = 2; + else + timer++; + if timer == 50 % wait for 1000ms in case sync comes back + next_state = 0; + end + end + end + + %printf("corr: % -d state: %d next_state: %d uw: %d timer: %d\n", corr, state, next_state, unique_word, timer); + state = next_state; + + if state + sync = 1; + else + sync = 0; + end +endfunction + + +% complex freq shifting helper function + +function [out phase] = freq_shift(in, freqHz, Fs, phase) + freq_rect = exp(j*2*pi*freqHz/Fs); + + out = zeros(1, length(in)); + for r=1:length(in) + phase *= freq_rect; + out(r) = in(r)*phase; + end + + mag = abs(phase); + phase /= mag; +endfunction + + +% Save test bits to a text file in the form of a C array + +function test_bits_file(filename) + global test_bits; + global Ntest_bits; + + f=fopen(filename,"wt"); + fprintf(f,"/* Generated by test_bits_file() Octave function */\n\n"); + fprintf(f,"const int test_bits[]={\n"); + for m=1:Ntest_bits-1 + fprintf(f," %d,\n",test_bits(m)); + endfor + fprintf(f," %d\n};\n",test_bits(Ntest_bits)); + fclose(f); +endfunction + + +% Saves RN filter coeffs to a text file in the form of a C array + +function rn_file(gt_alpha5_root, filename) + Nfilter = length(gt_alpha5_root); + + f=fopen(filename,"wt"); + fprintf(f,"/* Generated by rn_file() Octave function */\n\n"); + fprintf(f,"const float gt_alpha5_root[]={\n"); + for m=1:Nfilter-1 + fprintf(f," %g,\n",gt_alpha5_root(m)); + endfor + fprintf(f," %g\n};\n",gt_alpha5_root(Nfilter)); + fclose(f); +endfunction + + +% Saves rx decimation filter coeffs to a text file in the form of a C array + +function rxdec_file(filename) + global rxdec_coeff; + global Nrxdec; + + f=fopen(filename,"wt"); + fprintf(f,"/* Generated by rxdec_file() Octave function */\n\n"); + fprintf(f,"const float rxdec_coeff[]={\n"); + for m=1:Nrxdec-1 + fprintf(f," %g,\n",rxdec_coeff(m)); + endfor + fprintf(f," %g\n};\n",rxdec_coeff(Nrxdec)); + fclose(f); +endfunction + +function pilot_coeff_file(filename) + global pilot_coeff; + global Npilotcoeff; + + f=fopen(filename,"wt"); + fprintf(f,"/* Generated by pilot_coeff_file() Octave function */\n\n"); + fprintf(f,"const float pilot_coeff[]={\n"); + for m=1:Npilotcoeff-1 + fprintf(f," %g,\n",pilot_coeff(m)); + endfor + fprintf(f," %g\n};\n",pilot_coeff(Npilotcoeff)); + fclose(f); +endfunction + + +% Saves hanning window coeffs to a text file in the form of a C array + +function hanning_file(filename) + global Npilotlpf; + + h = hanning(Npilotlpf); + + f=fopen(filename,"wt"); + fprintf(f,"/* Generated by hanning_file() Octave function */\n\n"); + fprintf(f,"const float hanning[]={\n"); + for m=1:Npilotlpf-1 + fprintf(f," %g,\n", h(m)); + endfor + fprintf(f," %g\n};\n", h(Npilotlpf)); + fclose(f); +endfunction + + +function png_file(fig, pngfilename) + figure(fig); + + pngname = sprintf("%s.png",pngfilename); + print(pngname, '-dpng', "-S500,500") + pngname = sprintf("%s_large.png",pngfilename); + print(pngname, '-dpng', "-S800,600") +endfunction + + +% dump rx_bits in hex + +function dump_bits(rx_bits) + + % pack into bytes, MSB first + + packed = zeros(1,floor(length(rx_bits)+7)/8); + bit = 7; byte = 1; + for i=1:length(rx_bits) + packed(byte) = bitor(packed(byte), bitshift(rx_bits(i),bit)); + bit--; + if (bit < 0) + bit = 7; + byte++; + end + end + + for i=1:length(packed) + printf("0x%02x ", packed(i)); + end + printf("\n"); + +endfunction + +if 0 +% Initialise ---------------------------------------------------- + +global pilot_bit; +pilot_bit = 0; % current value of pilot bit + +global tx_filter_memory; +tx_filter_memory = zeros(Nc+1, Nfilter); +global rx_filter_memory; +rx_filter_memory = zeros(Nc+1, Nfilter); + +global rx_fdm_mem; + rx_fdm_mem = zeros(1,Nfilter+M); + +% phasors used for up and down converters + +global freq; + freq = zeros(Nc+1,1); +global freq_pol; + freq_pol = zeros(Nc+1,1); +for c=1:Nc/2 + %carrier_freq = (-Nc/2 - 1 + c)*Fsep + Fcentre; + carrier_freq = (-Nc/2 - 1 + c)*Fsep; + freq_pol(c) = 2*pi*carrier_freq/Fs; + freq(c) = exp(j*freq_pol(c)); +end +for c=floor(Nc/2)+1:Nc + %carrier_freq = (-Nc/2 + c)*Fsep + Fcentre; + carrier_freq = (-Nc/2 + c)*Fsep; + freq_pol(c) = 2*pi*carrier_freq/Fs; + freq(c) = exp(j*freq_pol(c)); +end + +%freq_pol(Nc+1) = 2*pi*Fcentre/Fs; +freq_pol(Nc+1) = 2*pi*0/Fs; +freq(Nc+1) = exp(j*freq_pol(Nc+1)); + +global fbb_rect; + fbb_rect = exp(j*2*pi*Fcentre/Fs); +global fbb_phase_tx; + fbb_phase_tx = 1; +global fbb_phase_rx; + fbb_phase_rx = 1; +global rxdec_lpf_mem; + rxdec_lpf_mem = zeros(1,Nrxdec-1+M); +global Q=M/4; + +% Spread initial FDM carrier phase out as far as possible. This +% helped PAPR for a few dB. We don't need to adjust rx phase as DQPSK +% takes care of that. + +global phase_tx; +phase_tx = ones(Nc+1,1); +phase_tx = exp(j*2*pi*(0:Nc)/(Nc+1)); +%phase_tx = exp(j*2*pi*(0:Nc)/4); +%phase_tx(Nc+1) = -1; +global phase_rx; +phase_rx = ones(Nc+1,1); + +% Freq offset estimator constants + +global Mpilotfft = 256; + +global Npilotcoeff; % number of pilot LPF coeffs + Npilotcoeff = 30; +global pilot_coeff; + pilot_coeff = fir1(Npilotcoeff-1, 200/(Fs/2))';% 200Hz LPF +global Npilotbaseband = Npilotcoeff + M + M/P; % number of pilot baseband samples reqd for pilot LPF +global Npilotlpf; % number of symbols we DFT pilot over, pilot est window + Npilotlpf = 4*M; + +% pilot LUT, used for copy of pilot at rx + +global pilot_lut; +pilot_lut = generate_pilot_lut(); +global pilot_lut_index; + pilot_lut_index = 1; +global prev_pilot_lut_index; + prev_pilot_lut_index = 3*M+1; + +% Freq offset estimator states + +global pilot_baseband1; +global pilot_baseband2; +pilot_baseband1 = zeros(1, Npilotbaseband); % pilot baseband samples +pilot_baseband2 = zeros(1, Npilotbaseband); % pilot baseband samples +global pilot_lpf1 +global pilot_lpf2 +pilot_lpf1 = zeros(1, Npilotlpf); % LPF pilot samples +pilot_lpf2 = zeros(1, Npilotlpf); % LPF pilot samples + +% Timing estimator states + +global rx_filter_mem_timing; +rx_filter_mem_timing = zeros(Nc+1, Nt*P); +global rx_baseband_mem_timing; +rx_baseband_mem_timing = zeros(Nc+1, Nfiltertiming); + +% Test bit stream constants + +global Ntest_bits; + Ntest_bits = Nc*Nb*4; % length of test sequence +global test_bits; + test_bits = rand(1,Ntest_bits) > 0.5; + +% Test bit stream state variables + +global current_test_bit = 1; +current_test_bit = 1; +global rx_test_bits_mem; +rx_test_bits_mem = zeros(1,Ntest_bits); + +% Experimental phase estimator states ---------------------- + +global rx_symbols_mem; +rx_symbols_mem = zeros(Nc+1, Nph); +global prev_phase_offsets; +prev_phase_offsets = zeros(Nc+1, 1); +global phase_amb; +phase_amb = zeros(Nc+1, 1); +end diff --git a/codec2/tags/0.4.1/octave/fdmdv_demod.m b/codec2/tags/0.4.1/octave/fdmdv_demod.m new file mode 100644 index 00000000..6b5c0a23 --- /dev/null +++ b/codec2/tags/0.4.1/octave/fdmdv_demod.m @@ -0,0 +1,353 @@ +% fdmdv_demod.m +% +% Demodulator function for FDMDV modem (Octave version). Requires +% 8kHz sample rate raw files as input +% +% Copyright David Rowe 2012 +% This program is distributed under the terms of the GNU General Public License +% Version 2 +% + +function fdmdv_demod(rawfilename, nbits, NumCarriers, errorpatternfilename, symbolfilename) + + fdmdv; % include modem code + + modulation = 'dqpsk'; + + fin = fopen(rawfilename, "rb"); + gain = 1000; + frames = nbits/(Nc*Nb); + + prev_rx_symbols = ones(Nc+1,1); + foff_phase_rect = 1; + + % BER stats + + total_bit_errors = 0; + total_bits = 0; + bit_errors_log = []; + sync_log = []; + test_frame_sync_log = []; + test_frame_sync_state = 0; + error_pattern_log = []; + + % SNR states + + sig_est = zeros(Nc+1,1); + noise_est = zeros(Nc+1,1); + + % logs of various states for plotting + + rx_symbols_log = []; + rx_timing_log = []; + foff_coarse_log = []; + foff_log = []; + rx_fdm_log = []; + snr_est_log = []; + + % misc states + + nin = M; % timing correction for sample rate differences + foff = 0; + + fest_state = 0; + fest_timer = 0; + sync_mem = zeros(1,Nsync_mem); + sync = 0; + sync_log = []; + + % spectrum states + + Nspec=1024; + spec_mem=zeros(1,Nspec); + SdB = zeros(1,Nspec); + + % optionally save output symbols + + if nargin == 5 + fm = fopen(symbolfilename,"wb"); + dual_rx_symbols = zeros(1, 2*Nc); + dual_rx_bits = zeros(1,2*Nc*Nb); + end + + % Main loop ---------------------------------------------------- + + for f=1:frames + + % obtain nin samples of the test input signal + + for i=1:nin + rx_fdm(i) = fread(fin, 1, "short")/gain; + end + + rx_fdm_log = [rx_fdm_log rx_fdm(1:nin)]; + + % update spectrum + + l=length(rx_fdm); + spec_mem(1:Nspec-l) = spec_mem(l+1:Nspec); + spec_mem(Nspec-l+1:Nspec) = rx_fdm; + S=fft(spec_mem.*hanning(Nspec)',Nspec); + SdB = 0.9*SdB + 0.1*20*log10(abs(S)); + + % shift down to complex baseband + + for i=1:nin + fbb_phase_rx = fbb_phase_rx*fbb_rect'; + rx_fdm(i) = rx_fdm(i)*fbb_phase_rx; + end + mag = abs(fbb_phase_rx); + fbb_phase_rx /= mag; + + % frequency offset estimation and correction + + [pilot prev_pilot pilot_lut_index prev_pilot_lut_index] = get_pilot(pilot_lut_index, prev_pilot_lut_index, nin); + [foff_coarse S1 S2] = rx_est_freq_offset(rx_fdm, pilot, prev_pilot, nin, !sync ); + + if sync == 0 + foff = foff_coarse; + end + foff_coarse_log = [foff_coarse_log foff_coarse]; + + foff_rect = exp(j*2*pi*foff/Fs); + + for i=1:nin + foff_phase_rect *= foff_rect'; + rx_fdm_fcorr(i) = rx_fdm(i)*foff_phase_rect; + end + + % baseband processing + + rx_fdm_filter = rxdec_filter(rx_fdm_fcorr, nin); + rx_filt = down_convert_and_rx_filter(rx_fdm_filter, nin, M/Q); + [rx_symbols rx_timing] = rx_est_timing(rx_filt, nin); + rx_timing_log = [rx_timing_log rx_timing]; + + nin = M; + if rx_timing > 2*M/P + nin += M/P; + end + if rx_timing < 0; + nin -= M/P; + end + + rx_symbols_log = [rx_symbols_log rx_symbols.*conj(prev_rx_symbols./abs(prev_rx_symbols))*exp(j*pi/4)]; + [rx_bits sync_bit f_err pd] = psk_to_bits(prev_rx_symbols, rx_symbols, modulation); + + % optionally save output symbols + + if (nargin == 5) + + % this free runs, and is reset by an "entered sync" state + + if (sync_track == 0) + sync_track = 1; + else + sync_track = 0; + end + + if (track == 1) && (sync_track == 1) + dual_rx_symbols(Nc+1:2*Nc) = rx_symbols(1:Nc).*conj(prev_rx_symbols(1:Nc)./abs(prev_rx_symbols(1:Nc))); + dual_rx_symbols_float32 = []; k = 1; + for i=1:2*Nc + dual_rx_symbols_float32(k++) = real(dual_rx_symbols(i)); + dual_rx_symbols_float32(k++) = imag(dual_rx_symbols(i)); + end + fwrite(fm, dual_rx_symbols_float32, "float32"); + dual_rx_bits(Nc*Nb+1:2*Nc*Nb) = rx_bits; + %dump_bits(dual_rx_bits); + else + dual_rx_symbols(1:Nc) = rx_symbols(1:Nc).*conj(prev_rx_symbols(1:Nc)./abs(prev_rx_symbols(1:Nc))); + dual_rx_bits(1:Nc*Nb) = rx_bits; + end + end + + % update some states + + prev_rx_symbols = rx_symbols; + [sig_est noise_est] = snr_update(sig_est, noise_est, pd); + snr_est = calc_snr(sig_est, noise_est); + snr_est_log = [snr_est_log snr_est]; + foff -= 0.5*f_err; + foff_log = [foff_log foff]; + + % freq est state machine + + [sync reliable_sync_bit fest_state fest_timer sync_mem] = freq_state(sync_bit, fest_state, fest_timer, sync_mem); + sync_log = [sync_log sync]; + + % count bit errors if we find a test frame + + [test_frame_sync bit_errors error_pattern] = put_test_bits(test_bits, rx_bits); + if (test_frame_sync == 1) + total_bit_errors = total_bit_errors + bit_errors; + total_bits = total_bits + Ntest_bits; + bit_errors_log = [bit_errors_log bit_errors/Ntest_bits]; + else + bit_errors_log = [bit_errors_log 0]; + end + + % test frame sync state machine, just for more informative plots + + next_test_frame_sync_state = test_frame_sync_state; + if (test_frame_sync_state == 0) + if (test_frame_sync == 1) + next_test_frame_sync_state = 1; + test_frame_count = 0; + end + end + + if (test_frame_sync_state == 1) + % we only expect another test_frame_sync pulse every 4 symbols + test_frame_count++; + if (test_frame_count == 4) + test_frame_count = 0; + if ((test_frame_sync == 0)) + next_test_frame_sync_state = 0; + else + error_pattern_log = [error_pattern_log error_pattern]; + end + end + end + + test_frame_sync_state = next_test_frame_sync_state; + test_frame_sync_log = [test_frame_sync_log test_frame_sync_state]; + end + + if nargin == 5 + fclose(fm); + etfilename = strcat(strtok(symbolfilename,"."),"_et.bin"); + fet = fopen(etfilename, "wb"); + fwrite(fet, entered_track_log, "short"); + fclose(fet); + end + + % --------------------------------------------------------------------- + % Print Stats + % --------------------------------------------------------------------- + + % Peak to Average Power Ratio calcs from http://www.dsplog.com + + papr = max(rx_fdm_log.*conj(rx_fdm_log)) / mean(rx_fdm_log.*conj(rx_fdm_log)); + papr_dB = 10*log10(papr); + + ber = total_bit_errors / total_bits; + printf("%d bits %d errors BER: %1.4f PAPR(rx): %1.2f dB\n",total_bits, total_bit_errors, ber, papr_dB); + + % --------------------------------------------------------------------- + % Plots + % --------------------------------------------------------------------- + + xt = (1:frames)/Rs; + secs = frames/Rs; + + figure(1) + clf; + [n m] = size(rx_symbols_log); + plot(real(rx_symbols_log(1:Nc+1,15:m)),imag(rx_symbols_log(1:Nc+1,15:m)),'+') + axis([-2 2 -2 2]); + title('Scatter Diagram'); + + figure(2) + clf; + subplot(211) + plot(xt, rx_timing_log) + title('timing offset (samples)'); + subplot(212) + plot(xt, foff_log, '-;freq offset;') + hold on; + plot(xt, sync_log*75, 'r;course-fine;'); + hold off; + title('Freq offset (Hz)'); + grid + + figure(3) + clf; + spec(rx_fdm_log,8000); + + figure(4) + clf; + subplot(311) + stem(xt, sync_log) + axis([0 secs 0 1.5]); + title('BPSK Sync') + subplot(312) + stem(xt, bit_errors_log); + title('Bit Errors for test frames') + subplot(313) + plot(xt, test_frame_sync_log); + axis([0 secs 0 1.5]); + title('Test Frame Sync') + + figure(5) + clf; + subplot(211); + plot(xt, snr_est_log); + title('SNR Estimates') + subplot(212) + snrdB_pc = 20*log10(sig_est(1:Nc+1)) - 20*log10(noise_est(1:Nc+1)); + bar(snrdB_pc(1:Nc) - mean(snrdB_pc(1:Nc))) + axis([0 Nc+1 -3 3]); + + figure(6) + clf; + hold on; + lep = length(error_pattern_log); + if lep != 0 + for p=1:Nc + plot(p + 0.25*error_pattern_log((p-1)*2+1:Nc*Nb:lep)); + plot(0.30 + p + 0.25*error_pattern_log(p*2:Nc*Nb:lep),'r') + end + hold off; + axis([1 lep/(Nc*Nb) 0 Nc]) + end + + figure(7) + clf; + subplot(211) + [a b] = size(rx_fdm_log); + xt1 = (1:b)/Fs; + plot(xt1, rx_fdm_log); + title('Rx FDM Signal'); + subplot(212) + plot((0:Nspec/2-1)*Fs/Nspec, SdB(1:Nspec/2) - 20*log10(Nspec/2)) + axis([0 Fs/2 -40 0]) + grid + title('FDM Rx Spectrum'); + +if 0 + % interleaving tests + + load ../unittest/inter560.txt + lep = length(error_pattern_log); + lep = floor(lep/560)*560; + error_pattern_log_inter = zeros(1,lep); + for i=1:560:lep + for j=1:560 + %printf("i: %4d j: %4d inter560(j): %4d\n", i,j,inter560(j)); + index = inter560(j); + error_pattern_log_inter(i-1+index+1) = error_pattern_log(i-1+j); + end + end + + figure(8) + clf; + hold on; + for p=1:Nc + plot(p + 0.25*error_pattern_log_inter((p-1)*2+1:Nc*Nb:lep)); + plot(0.30 + p + 0.25*error_pattern_log_inter(p*2:Nc*Nb:lep),'r') + end + hold off; + axis([1 lep/(Nc*Nb) 0 Nc]) +end + + % optionally save error pattern file + + if nargin == 4 + fout = fopen(errorpatternfilename, "wb"); + fwrite(fout, error_pattern_log, "short"); + fclose(fout); + end + + +endfunction diff --git a/codec2/tags/0.4.1/octave/fdmdv_demod_c.m b/codec2/tags/0.4.1/octave/fdmdv_demod_c.m new file mode 100644 index 00000000..b5c75334 --- /dev/null +++ b/codec2/tags/0.4.1/octave/fdmdv_demod_c.m @@ -0,0 +1,132 @@ +% fdmdv_demod_c.m +% +% Plots Octave dump file information from C FDMDV demodulator program, +% to give a similar set of plots to fdmdv_demod.m. Useful for off +% line analysis of demod performance. +% +% Copyright David Rowe 2012 +% This program is distributed under the terms of the GNU General Public License +% Version 2 +% + +function fdmdv_demod_c(dumpfilename, bits, NumCarriers) + + fdmdv; % include modem code + + frames = bits/(Nc*Nb); + + load(dumpfilename); + + % BER stats + + total_bit_errors = 0; + total_bits = 0; + bit_errors_log = []; + sync_log = []; + test_frame_sync_log = []; + test_frame_sync_state = 0; + + % Run thru received bits to look for test pattern + + bits_per_frame = Nc*Nb; + + for f=1:frames + + rx_bits = rx_bits_log_c((f-1)*bits_per_frame+1:f*bits_per_frame); + + % count bit errors if we find a test frame + + [test_frame_sync bit_errors] = put_test_bits(test_bits, rx_bits); + if (test_frame_sync == 1) + total_bit_errors = total_bit_errors + bit_errors; + total_bits = total_bits + Ntest_bits; + bit_errors_log = [bit_errors_log bit_errors/Ntest_bits]; + else + bit_errors_log = [bit_errors_log 0]; + end + + % test frame sync state machine, just for more informative plots + + next_test_frame_sync_state = test_frame_sync_state; + if (test_frame_sync_state == 0) + if (test_frame_sync == 1) + next_test_frame_sync_state = 1; + test_frame_count = 0; + end + end + + if (test_frame_sync_state == 1) + % we only expect another test_frame_sync pulse every 4 symbols + test_frame_count++; + if (test_frame_count == 4) + test_frame_count = 0; + if ((test_frame_sync == 0)) + next_test_frame_sync_state = 0; + end + end + end + test_frame_sync_state = next_test_frame_sync_state; + test_frame_sync_log = [test_frame_sync_log test_frame_sync_state]; + end + + ber = total_bit_errors / total_bits; + printf("%d bits %d errors BER: %1.4f\n",total_bits, total_bit_errors, ber); + + % --------------------------------------------------------------------- + % Plots + % --------------------------------------------------------------------- + + xt = (1:frames)/Rs; + secs = frames/Rs; + + figure(1) + clf; + plot(real(rx_symbols_log_c(1:Nc+1,15:frames)),imag(rx_symbols_log_c(1:Nc+1,15:frames)),'+') + %plot(real(rx_symbols_log_c(Nc+1,15:frames)),imag(rx_symbols_log_c(Nc+1,15:frames)),'+') + axis([-2 2 -2 2]); + title('Scatter Diagram'); + + figure(2) + clf; + subplot(211) + plot(xt, rx_timing_log_c(1:frames)) + title('timing offset (samples)'); + subplot(212) + plot(xt, foff_log_c(1:frames), '-;freq offset;') + hold on; + plot(xt, sync_log_c(1:frames)*75, 'r;course-fine;'); + hold off; + title('Freq offset (Hz)'); + grid + + figure(3) + clf; + subplot(211) + b = M*frames; + xt1 = (1:b)/Fs; + plot(xt1, rx_fdm_log_c(1:b)); + title('Rx FDM Signal'); + subplot(212) + spec(rx_fdm_log_c(1:b),8000); + title('FDM Rx Spectrogram'); + + figure(4) + clf; + subplot(311) + stem(xt, sync_bit_log_c(1:frames)) + axis([0 secs 0 1.5]); + title('BPSK Sync') + subplot(312) + stem(xt, bit_errors_log); + title('Bit Errors for test frames') + subplot(313) + plot(xt, test_frame_sync_log); + axis([0 secs 0 1.5]); + title('Test Frame Sync') + + figure(5) + clf; + plot(xt, snr_est_log_c(1:frames)); + title('SNR Estimates') + +endfunction diff --git a/codec2/tags/0.4.1/octave/fdmdv_demod_coh.m b/codec2/tags/0.4.1/octave/fdmdv_demod_coh.m new file mode 100644 index 00000000..94b08802 --- /dev/null +++ b/codec2/tags/0.4.1/octave/fdmdv_demod_coh.m @@ -0,0 +1,253 @@ +% fdmdv_demod_coh.m +% +% Demodulator function for FDMDV modem (Octave version). Requires +% 8kHz sample rate raw files as input. This version uses experimental +% psuedo coherent demodulation. +% +% Copyright David Rowe 2013 +% This program is distributed under the terms of the GNU General Public License +% Version 2 +% + +function fdmdv_demod_coh(rawfilename, nbits, pngname) + + fdmdv; % include modem code + + modulation = 'dqpsk'; + + fin = fopen(rawfilename, "rb"); + gain = 1000; + frames = nbits/(Nc*Nb); + + prev_rx_symbols = ones(Nc+1,1); + foff_phase = 1; + + % BER stats + + total_bit_errors = 0; + total_bits = 0; + bit_errors_log = []; + sync_log = []; + test_frame_sync_log = []; + test_frame_sync_state = 0; + + % SNR states + + sig_est = zeros(Nc+1,1); + noise_est = zeros(Nc+1,1); + + % logs of various states for plotting + + rx_symbols_log = []; + rx_timing_log = []; + foff_log = []; + rx_fdm_log = []; + snr_est_log = []; + + % misc states + + nin = M; % timing correction for sample rate differences + foff = 0; + track_log = []; + track = 0; + fest_state = 0; + + % psuedo coherent demod states + + rx_symbols_ph_log = []; + prev_rx_symbols_ph = ones(Nc+1,1); + rx_phase_offsets_log = []; + phase_amb_log = []; + + % Main loop ---------------------------------------------------- + + for f=1:frames + + % obtain nin samples of the test input signal + + for i=1:nin + rx_fdm(i) = fread(fin, 1, "short")/gain; + end + + rx_fdm_log = [rx_fdm_log rx_fdm(1:nin)]; + + % frequency offset estimation and correction + + [pilot prev_pilot pilot_lut_index prev_pilot_lut_index] = get_pilot(pilot_lut_index, prev_pilot_lut_index, nin); + [foff_coarse S1 S2] = rx_est_freq_offset(rx_fdm, pilot, prev_pilot, nin); + + if track == 0 + foff = foff_coarse; + end + foff_log = [ foff_log foff ]; + foff_rect = exp(j*2*pi*foff/Fs); + + for i=1:nin + foff_phase *= foff_rect'; + rx_fdm(i) = rx_fdm(i)*foff_phase; + end + + % baseband processing + + rx_baseband = fdm_downconvert(rx_fdm, nin); + rx_filt = rx_filter(rx_baseband, nin); + + [rx_symbols rx_timing] = rx_est_timing(rx_filt, rx_baseband, nin); + rx_timing_log = [rx_timing_log rx_timing]; + + nin = M; + if rx_timing > 2*M/P + nin += M/P; + end + if rx_timing < 0; + nin -= M/P; + end + + rx_symbols_log = [rx_symbols_log rx_symbols.*(conj(prev_rx_symbols)./abs(prev_rx_symbols))*exp(j*pi/4)]; + + % coherent phase offset estimation ------------------------------------ + + [rx_phase_offsets ferr] = rx_est_phase(rx_symbols); + rx_phase_offsets_log = [rx_phase_offsets_log rx_phase_offsets]; + phase_amb_log = [phase_amb_log phase_amb]; + rx_symbols_ph = rx_symbols_mem(:,floor(Nph/2)+1) .* exp(-j*(rx_phase_offsets + phase_amb)); + rx_symbols_ph_log = [rx_symbols_ph_log rx_symbols_ph .* exp(j*pi/4)]; + rx_symbols_ph = -1 + 2*(real(rx_symbols_ph .* exp(j*pi/4)) > 0) + j*(-1 + 2*(imag(rx_symbols_ph .* exp(j*pi/4)) > 0)); + + % Std differential (used for freq offset est and BPSK sync) and psuedo coherent detection ----------------------- + + [rx_bits_unused sync f_err pd ] = qpsk_to_bits(prev_rx_symbols, rx_symbols, modulation); + [rx_bits sync_unused ferr_unused pd_unused] = qpsk_to_bits(prev_rx_symbols_ph, rx_symbols_ph, 'dqpsk'); + + foff -= 0.5*f_err; + prev_rx_symbols = rx_symbols; + prev_rx_symbols_ph = rx_symbols_ph; + sync_log = [sync_log sync]; + + [sig_est noise_est] = snr_update(sig_est, noise_est, pd); + snr_est = calc_snr(sig_est, noise_est); + snr_est_log = [snr_est_log snr_est]; + + % freq est state machine + + [track fest_state] = freq_state(sync, fest_state); + track_log = [track_log track]; + + % count bit errors if we find a test frame + + [test_frame_sync bit_errors] = put_test_bits(test_bits, rx_bits); + if (test_frame_sync == 1) + total_bit_errors = total_bit_errors + bit_errors; + total_bits = total_bits + Ntest_bits; + bit_errors_log = [bit_errors_log bit_errors/Ntest_bits]; + else + bit_errors_log = [bit_errors_log 0]; + end + + % test frame sync state machine, just for more informative plots + + next_test_frame_sync_state = test_frame_sync_state; + if (test_frame_sync_state == 0) + if (test_frame_sync == 1) + next_test_frame_sync_state = 1; + test_frame_count = 0; + end + end + + if (test_frame_sync_state == 1) + % we only expect another test_frame_sync pulse every 4 symbols + test_frame_count++; + if (test_frame_count == 4) + test_frame_count = 0; + if ((test_frame_sync == 0)) + next_test_frame_sync_state = 0; + end + end + end + test_frame_sync_state = next_test_frame_sync_state; + test_frame_sync_log = [test_frame_sync_log test_frame_sync_state]; + + end + + % --------------------------------------------------------------------- + % Print Stats + % --------------------------------------------------------------------- + + ber = total_bit_errors / total_bits; + + printf("%d bits %d errors BER: %1.4f\n",total_bits, total_bit_errors, ber); + + % --------------------------------------------------------------------- + % Plots + % --------------------------------------------------------------------- + + xt = (1:frames)/Rs; + secs = frames/Rs; + + figure(1) + clf; + [n m] = size(rx_symbols_log); + plot(real(rx_symbols_log(1:Nc+1,15:m)),imag(rx_symbols_log(1:Nc+1,15:m)),'+') + axis([-2 2 -2 2]); + title('Scatter Diagram'); + + figure(2) + clf; + subplot(211) + plot(xt, rx_timing_log) + title('timing offset (samples)'); + subplot(212) + plot(xt, foff_log, '-;freq offset;') + hold on; + plot(xt, track_log*75, 'r;course-fine;'); + hold off; + title('Freq offset (Hz)'); + grid + + figure(3) + clf; + subplot(211) + [a b] = size(rx_fdm_log); + xt1 = (1:b)/Fs; + plot(xt1, rx_fdm_log); + title('Rx FDM Signal'); + subplot(212) + spec(rx_fdm_log,8000); + title('FDM Rx Spectrogram'); + + figure(4) + clf; + subplot(311) + stem(xt, sync_log) + axis([0 secs 0 1.5]); + title('BPSK Sync') + subplot(312) + stem(xt, bit_errors_log); + title('Bit Errors for test frames') + subplot(313) + plot(xt, test_frame_sync_log); + axis([0 secs 0 1.5]); + title('Test Frame Sync') + + figure(5) + clf; + plot(xt, snr_est_log); + title('SNR Estimates') + + figure(6) + clf; + [n m] = size(rx_symbols_ph_log); + plot(real(rx_symbols_ph_log(1:Nc+1,15:m)),imag(rx_symbols_ph_log(1:Nc+1,15:m)),'+') + %plot(real(rx_symbols_ph_log(2,15:m)),imag(rx_symbols_ph_log(2,15:m)),'+') + axis([-2 2 -2 2]); + title('Scatter Diagram - after phase correction'); + + figure(7) + clf; + subplot(211) + plot(rx_phase_offsets_log(1,:)) + subplot(212) + plot(phase_amb_log(1,:)) + title('Rx Phase Offset Est') + +endfunction diff --git a/codec2/tags/0.4.1/octave/fdmdv_mod.m b/codec2/tags/0.4.1/octave/fdmdv_mod.m new file mode 100644 index 00000000..8d132264 --- /dev/null +++ b/codec2/tags/0.4.1/octave/fdmdv_mod.m @@ -0,0 +1,32 @@ +% fdmdv_mod.m +% +% Modulator function for FDMDV modem, uses test frames as input and +% outputs a raw file of 16 bit shorts at a sample rate of 8 kHz. +% +% Copyright David Rowe 2012 +% This program is distributed under the terms of the GNU General Public License +% Version 2 +% + +function tx_fdm = fdmdv_mod(rawfilename, nbits) + + fdmdv; % include modem code + + frames = floor(nbits/(Nc*Nb)) + tx_fdm = []; + gain = 1000; % Scale up to 16 bit shorts + prev_tx_symbols = ones(Nc+1,1); prev_tx_symbols(Nc+1) = 2; + + for i=1:frames + tx_bits = get_test_bits(Nc*Nb); + tx_symbols = bits_to_qpsk(prev_tx_symbols, tx_bits,'dqpsk'); + prev_tx_symbols = tx_symbols; + tx_baseband = tx_filter(tx_symbols); + tx_fdm = [tx_fdm real(fdm_upconvert(tx_baseband))]; + end + + tx_fdm *= gain; + fout = fopen(rawfilename,"wb"); + fwrite(fout, tx_fdm, "short"); + fclose(fout); +endfunction diff --git a/codec2/tags/0.4.1/octave/fdmdv_sweep.m b/codec2/tags/0.4.1/octave/fdmdv_sweep.m new file mode 100644 index 00000000..fd617431 --- /dev/null +++ b/codec2/tags/0.4.1/octave/fdmdv_sweep.m @@ -0,0 +1,30 @@ +% fdmdv_sweep.m +% David Rowe Feb 2013 +% Produces a raw file that sweeps between 1000 and 2000 Hz to test freq +% response of transmitters. + +secs=10; +fmin=1000; +fmax=2000; +Fs=8000; +rms = 4200; % roughly RMS value of fdmdv signal +amp = sqrt(2)*rms; +nsamples=Fs*secs; +theta = 0; +s=zeros(1,nsamples); + +for i=1:nsamples + f(i) = fmin + i*(fmax-fmin)/nsamples; + w = 2*pi*f(i)/Fs; + theta += w; + theta -= 2*pi*floor(theta/(2*pi)); + s(i) = amp*cos(theta); +end + +figure(1) +clf +plot(s(1:100)); +fout = fopen("1k_2k_sweep.raw", "wb"); +fwrite(fout, s, "short"); +fclose(fout); + diff --git a/codec2/tags/0.4.1/octave/fdmdv_ut.m b/codec2/tags/0.4.1/octave/fdmdv_ut.m new file mode 100644 index 00000000..3ee5b4de --- /dev/null +++ b/codec2/tags/0.4.1/octave/fdmdv_ut.m @@ -0,0 +1,352 @@ +% fdmdv_ut.m +% +% Unit Test program for FDMDV modem. Useful for general development as it has +% both tx and rx sides, and basic AWGN channel simulation. +% +% Copyright David Rowe 2012 +% This program is distributed under the terms of the GNU General Public License +% Version 2 +% + +fdmdv; % load modem code + +% Simulation Parameters -------------------------------------- + +frames = 100; +EbNo_dB = 6.3; +Foff_hz = -100; +modulation = 'dqpsk'; +hpa_clip = 150; + +% ------------------------------------------------------------ + +more off; +tx_filt = zeros(Nc,M); +rx_symbols_log = []; +rx_phase_log = 0; +rx_timing_log = 0; +tx_pwr = 0; +noise_pwr = 0; +rx_fdm_log = []; +rx_baseband_log = []; +rx_bits_offset = zeros(Nc*Nb*2); +prev_tx_symbols = ones(Nc+1,1); prev_tx_symbols(Nc+1) = 2; +prev_rx_symbols = ones(Nc+1,1); +ferr = 0; +foff = 0; +foff_log = []; +tx_baseband_log = []; +tx_fdm_log = []; + +% BER stats + +total_bit_errors = 0; +total_bits = 0; +bit_errors_log = []; +sync_bit_log = []; +test_frame_sync_log = []; +test_frame_sync_state = 0; + +% SNR estimation states + +sig_est = zeros(Nc+1,1); +noise_est = zeros(Nc+1,1); + +% fixed delay simuation + +Ndelay = M+20; +rx_fdm_delay = zeros(Ndelay,1); + +% --------------------------------------------------------------------- +% Eb/No calculations. We need to work out Eb/No for each FDM carrier. +% Total power is sum of power in all FDM carriers +% --------------------------------------------------------------------- + +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); +Ngain = 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 + +B = 3000; +SNR = CNo_dB - 10*log10(B); + +% freq offset simulation states + +phase_offset = 1; +freq_offset = exp(j*2*pi*Foff_hz/Fs); +foff_phase = 1; +t = 0; +foff = 0; +fest_state = 0; +fest_timer = 0; +sync_mem = zeros(1,Nsync_mem); +sync = 0; +sync_log = []; + +snr_log = []; + +Nspec=1024; +spec_mem=zeros(1,Nspec); +SdB = zeros(1,Nspec); + +% --------------------------------------------------------------------- +% Main loop +% --------------------------------------------------------------------- + +for f=1:frames + + % ------------------- + % Modulator + % ------------------- + + tx_bits = get_test_bits(Nc*Nb); + tx_symbols = bits_to_psk(prev_tx_symbols, tx_bits, modulation); + prev_tx_symbols = tx_symbols; + tx_baseband = tx_filter(tx_symbols); + tx_baseband_log = [tx_baseband_log tx_baseband]; + tx_fdm = fdm_upconvert(tx_baseband); + tx_pwr = 0.9*tx_pwr + 0.1*real(tx_fdm)*real(tx_fdm)'/(M); + + % ------------------- + % Channel simulation + % ------------------- + + % frequency offset + + %Foff_hz += 1/Rs; + Foff = Foff_hz; + for i=1:M + % Time varying freq offset + %Foff = Foff_hz + 100*sin(t*2*pi/(300*Fs)); + %t++; + freq_offset = exp(j*2*pi*Foff/Fs); + phase_offset *= freq_offset; + tx_fdm(i) = phase_offset*tx_fdm(i); + end + + tx_fdm = real(tx_fdm); + + % HPA non-linearity + + tx_fdm(find(abs(tx_fdm) > hpa_clip)) = hpa_clip; + tx_fdm_log = [tx_fdm_log tx_fdm]; + + rx_fdm = tx_fdm; + + % AWGN noise + + noise = Ngain*randn(1,M); + noise_pwr = 0.9*noise_pwr + 0.1*noise*noise'/M; + rx_fdm += noise; + rx_fdm_log = [rx_fdm_log rx_fdm]; + + % update spectrum + + l=length(rx_fdm); + spec_mem(1:Nspec-l) = spec_mem(l+1:Nspec); + spec_mem(Nspec-l+1:Nspec) = rx_fdm; + S=fft(spec_mem.*hanning(Nspec)',Nspec); + SdB = 0.9*SdB + 0.1*20*log10(abs(S)); + + + % ------------------- + % Demodulator + % ------------------- + + % shift down to complex baseband + + for i=1:M + fbb_phase_rx = fbb_phase_rx*fbb_rect'; + rx_fdm(i) = rx_fdm(i)*fbb_phase_rx; + end + mag = abs(fbb_phase_rx); + fbb_phase_rx /= mag; + + % frequency offset estimation and correction, need to call rx_est_freq_offset even in sync + % 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_coarse S1 S2] = rx_est_freq_offset(rx_fdm, pilot, prev_pilot, M, !sync); + + if sync == 0 + foff = foff_coarse; + end + + foff_log = [ foff_log foff ]; + foff_rect = exp(j*2*pi*foff/Fs); + + for i=1:M + foff_phase *= foff_rect'; + rx_fdm(i) = rx_fdm(i)*foff_phase; + end + + rx_fdm_filter = rxdec_filter(rx_fdm, M); + rx_filt = down_convert_and_rx_filter(rx_fdm_filter, M, M/Q); + + [rx_symbols rx_timing] = rx_est_timing(rx_filt, M); + rx_timing_log = [rx_timing_log rx_timing]; + + %rx_phase = rx_est_phase(rx_symbols); + %rx_phase_log = [rx_phase_log rx_phase]; + %rx_symbols = rx_symbols*exp(j*rx_phase); + + [rx_bits sync_bit foff_fine pd] = psk_to_bits(prev_rx_symbols, rx_symbols, modulation); + if strcmp(modulation,'dqpsk') + rx_symbols_log = [rx_symbols_log pd]; + else + rx_symbols_log = [rx_symbols_log rx_symbols]; + endif + foff -= 0.5*foff_fine; + + prev_rx_symbols = rx_symbols; + sync_bit_log = [sync_bit_log sync_bit]; + + % freq est state machine + + [sync reliable_sync_bit fest_state fest_timer sync_mem] = freq_state(sync_bit, fest_state, fest_timer, sync_mem); + sync_log = [sync_log sync]; + + % Update SNR est + + [sig_est noise_est] = snr_update(sig_est, noise_est, pd); + snr_log = [snr_log calc_snr(sig_est, noise_est)]; + + % count bit errors if we find a test frame + % Allow 15 frames for filter memories to fill and time est to settle + + [test_frame_sync bit_errors] = put_test_bits(test_bits, rx_bits); + + if test_frame_sync == 1 + total_bit_errors = total_bit_errors + bit_errors; + total_bits = total_bits + Ntest_bits; + bit_errors_log = [bit_errors_log bit_errors]; + else + bit_errors_log = [bit_errors_log 0]; + end + + % test frame sync state machine, just for more informative plots + + next_test_frame_sync_state = test_frame_sync_state; + if (test_frame_sync_state == 0) + if (test_frame_sync == 1) + next_test_frame_sync_state = 1; + test_frame_count = 0; + end + end + + if (test_frame_sync_state == 1) + % we only expect another test_frame_sync pulse every 4 symbols + test_frame_count++; + if (test_frame_count == 4) + test_frame_count = 0; + if ((test_frame_sync == 0)) + next_test_frame_sync_state = 0; + end + end + end + test_frame_sync_state = next_test_frame_sync_state; + test_frame_sync_log = [test_frame_sync_log test_frame_sync_state]; +end + +% --------------------------------------------------------------------- +% Print Stats +% --------------------------------------------------------------------- + +ber = total_bit_errors / total_bits; + +% Peak to Average Power Ratio calcs from http://www.dsplog.com + +papr = max(tx_fdm_log.*conj(tx_fdm_log)) / mean(tx_fdm_log.*conj(tx_fdm_log)); +papr_dB = 10*log10(papr); + +% Note Eb/No set point is for Nc data carriers only, excluding pilot. +% This is convenient for testing BER versus Eb/No. Measured SNR & +% Eb/No includes power of pilot. Similar for SNR, first number is SNR +% excluding pilot pwr for Eb/No set point, 2nd value is measured SNR +% which will be a little higher as pilot power is included. Note current SNR +% est algorithm only works for QPSK, gives silly values for 8PSK. + +printf("Bits/symbol.: %d\n", Nb); +printf("Num carriers: %d\n", Nc); +printf("Bit Rate....: %d bits/s\n", Rb); +printf("Eb/No (meas): %2.2f (%2.2f) dB\n", EbNo_dB, 10*log10(0.25*tx_pwr*Fs/(Rs*Nc*noise_pwr))); +printf("bits........: %d\n", total_bits); +printf("errors......: %d\n", total_bit_errors); +printf("BER.........: %1.4f\n", ber); +printf("PAPR........: %1.2f dB\n", papr_dB); +printf("SNR...(meas): %2.2f (%2.2f) dB\n", SNR, calc_snr(sig_est, noise_est)); + +% --------------------------------------------------------------------- +% Plots +% --------------------------------------------------------------------- + +figure(1) +clf; +[n m] = size(rx_symbols_log); +plot(real(rx_symbols_log(1:Nc+1,15:m)),imag(rx_symbols_log(1:Nc+1,15:m)),'+') +axis([-3 3 -3 3]); +title('Scatter Diagram'); + +figure(2) +clf; +subplot(211) +plot(rx_timing_log) +title('timing offset'); +subplot(212) +plot(foff_log, '-;freq offset;') +hold on; +plot(sync_log*75, 'r;Sync State & course(0) fine(1) freq tracking;'); +hold off; +title('Freq offset (Hz)'); + +figure(3) +clf; +subplot(211) +plot(real(tx_fdm_log)); +title('FDM Tx Signal'); +subplot(212) +plot((0:Nspec/2-1)*Fs/Nspec, SdB(1:Nspec/2) - 20*log10(Nspec/2)) +axis([0 Fs/2 -40 0]) +grid +title('FDM Rx Spectrum'); + +figure(4) +clf; +subplot(311) +stem(sync_bit_log) +axis([0 frames 0 1.5]); +title('BPSK Sync') +subplot(312) +stem(bit_errors_log); +title('Bit Errors for test frames') +subplot(313) +plot(test_frame_sync_log); +axis([0 frames 0 1.5]); +title('Test Frame Sync') + +figure(5) +clf +subplot(211) +plot(snr_log) +subplot(212) +%plot(20*log10(sig_est(1:Nc))-20*log10(sig_est(Nc+1))+6) +%axis([1 Nc -6 6]); +sdB_pc = 20*log10(sig_est(1:Nc+1)); +bar(sdB_pc(1:Nc) - mean(sdB_pc(1:Nc))) +axis([0 Nc+1 -3 3]); diff --git a/codec2/tags/0.4.1/octave/fdmdv_ut_coh.m b/codec2/tags/0.4.1/octave/fdmdv_ut_coh.m new file mode 100644 index 00000000..a1598878 --- /dev/null +++ b/codec2/tags/0.4.1/octave/fdmdv_ut_coh.m @@ -0,0 +1,341 @@ +% fdmdv_ut_coh.m +% + +% Unit Test program for coherent version of FDMDV modem. Used to +% build up the ability to test coherent demodulation of FDMDV +% signals sampled off air. These signals are differentially encoded +% but we can treat the symbols after the diff encoder as PSK symbols. +% +% We keep most of the existing DPSK modem to handle acquisition, frame sync, +% and just the the PSK demo in parallel. The goal here is to measure the BER +% of the test data using coherent PSK, it's not actually a practical modem. + +% Copyright David Rowe 2012 +% This program is distributed under the terms of the GNU General Public License +% Version 2 +% + +fdmdv; % load modem code + +% Simulation Parameters -------------------------------------- + +frames = 200; +EbNo_dB = 7; +Foff_hz = -100; +hpa_clip = 150; + +% ------------------------------------------------------------ + +tx_filt = zeros(Nc,M); +rx_symbols_log = []; +rx_phase_log = 0; +rx_timing_log = 0; +tx_pwr = 0; +noise_pwr = 0; +rx_fdm_log = []; +rx_baseband_log = []; +rx_bits_offset = zeros(Nc*Nb*2); +prev_tx_symbols = ones(Nc+1,1); +prev_rx_symbols = ones(Nc+1,1); +ferr = 0; +foff = 0; +foff_log = []; +tx_baseband_log = []; +tx_fdm_log = []; + +% BER stats + +total_bit_errors = 0; +total_bits = 0; +bit_errors_log = []; +sync_log = []; +test_frame_sync_log = []; +test_frame_sync_state = 0; + +% SNR estimation states + +sig_est = zeros(Nc+1,1); +noise_est = zeros(Nc+1,1); + +% fixed delay simuation + +Ndelay = M+20; +rx_fdm_delay = zeros(Ndelay,1); + +% --------------------------------------------------------------------- +% Eb/No calculations. We need to work out Eb/No for each FDM carrier. +% Total power is sum of power in all FDM carriers +% --------------------------------------------------------------------- + +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) / 2 +Eb_dB = 10*log10(C) - 10*log10(Rs) - 10*log10(2); + +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); +Ngain = 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 + +B = 3000; +SNR = CNo_dB - 10*log10(B); + +% freq offset simulation states + +phase_offset = exp(j*0); +freq_offset = exp(j*2*pi*Foff_hz/Fs); +foff_phase = 1; +t = 0; +foff = 0; +fest_state = 0; +track = 0; +track_log = []; + +snr_log = []; + +rx_symbols_ph_log = []; +prev_rx_symbols_ph = ones(Nc+1,1); +rx_phase_offsets_log = []; +phase_amb_log = []; + +% --------------------------------------------------------------------- +% Main loop +% --------------------------------------------------------------------- + +for f=1:frames + + % ------------------- + % Modulator + % ------------------- + + tx_bits = get_test_bits(Nc*Nb); + tx_symbols = bits_to_qpsk(prev_tx_symbols, tx_bits, 'dqpsk'); + prev_tx_symbols = tx_symbols; + tx_baseband = tx_filter(tx_symbols); + tx_baseband_log = [tx_baseband_log tx_baseband]; + tx_fdm = fdm_upconvert(tx_baseband); + tx_pwr = 0.9*tx_pwr + 0.1*real(tx_fdm)*real(tx_fdm)'/(M); + + % ------------------- + % Channel simulation + % ------------------- + + % frequency offset + + %Foff_hz += 1/Rs; + Foff = Foff_hz; + for i=1:M + % Time varying freq offset + %Foff = Foff_hz + 100*sin(t*2*pi/(300*Fs)); + %t++; + freq_offset = exp(j*2*pi*Foff/Fs); + phase_offset *= freq_offset; + tx_fdm(i) = phase_offset*tx_fdm(i); + end + + tx_fdm = real(tx_fdm); + + % HPA non-linearity + + tx_fdm(find(abs(tx_fdm) > hpa_clip)) = hpa_clip; + tx_fdm_log = [tx_fdm_log tx_fdm]; + + rx_fdm = tx_fdm; + + % AWGN noise + + noise = Ngain*randn(1,M); + noise_pwr = 0.9*noise_pwr + 0.1*noise*noise'/M; + rx_fdm += noise; + rx_fdm_log = [rx_fdm_log rx_fdm]; + + % Delay + + %rx_fdm_delay(1:Ndelay-M) = rx_fdm_delay(M+1:Ndelay); + %rx_fdm_delay(Ndelay-M+1:Ndelay) = rx_fdm; + rx_fdm_delay = rx_fdm; + + % ------------------- + % Demodulator + % ------------------- + + % 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_course S1 S2] = rx_est_freq_offset(rx_fdm_delay, pilot, prev_pilot, M); + if track == 0 + foff = foff_course; + end + + %foff = 0; % disable for now + + foff_log = [ foff_log foff ]; + foff_rect = exp(j*2*pi*foff/Fs); + + for i=1:M + foff_phase *= foff_rect'; + rx_fdm_delay(i) = rx_fdm_delay(i)*foff_phase; + end + + % baseband processing + + rx_baseband = fdm_downconvert(rx_fdm_delay(1:M), M); + rx_baseband_log = [rx_baseband_log rx_baseband]; + rx_filt = rx_filter(rx_baseband, M); + + [rx_symbols rx_timing] = rx_est_timing(rx_filt, rx_baseband, M); + rx_symbols_log = [rx_symbols_log rx_symbols.*(conj(prev_rx_symbols)./abs(prev_rx_symbols))*exp(j*pi/4)]; + rx_timing_log = [rx_timing_log rx_timing]; + + % coherent phase offset estimation ------------------------------------ + + [rx_phase_offsets ferr] = rx_est_phase(rx_symbols); + rx_phase_offsets_log = [rx_phase_offsets_log rx_phase_offsets]; + phase_amb_log = [phase_amb_log phase_amb]; + rx_symbols_ph = rx_symbols_mem(:,floor(Nph/2)+1) .* exp(-j*(rx_phase_offsets + phase_amb)); + rx_symbols_ph_log = [rx_symbols_ph_log rx_symbols_ph .* exp(j*pi/4)]; + rx_symbols_ph = -1 + 2*(real(rx_symbols_ph .* exp(j*pi/4)) > 0) + j*(-1 + 2*(imag(rx_symbols_ph .* exp(j*pi/4)) > 0)); + + % Std differential (used for freq offset est and BPSK sync) and psuedo coherent detection ----------------------- + + [rx_bits_unused sync ferr pd] = qpsk_to_bits(prev_rx_symbols, rx_symbols, 'dqpsk'); + [rx_bits sync_unused ferr_unused pd] = qpsk_to_bits(prev_rx_symbols_ph, rx_symbols_ph, 'dqpsk'); + + %---------------------------------------------------------------------- + + foff -= 0.5*ferr; + prev_rx_symbols = rx_symbols; + prev_rx_symbols_ph = rx_symbols_ph; + sync_log = [sync_log sync]; + + % freq est state machine + + [track fest_state] = freq_state(sync, fest_state); + track_log = [track_log track]; + + % Update SNR est + + [sig_est noise_est] = snr_update(sig_est, noise_est, pd); + snr_log = [snr_log calc_snr(sig_est, noise_est)]; + + % count bit errors if we find a test frame + + [test_frame_sync bit_errors] = put_test_bits(test_bits, rx_bits); + + if (test_frame_sync == 1) && (f > 15) + total_bit_errors = total_bit_errors + bit_errors; + total_bits = total_bits + Ntest_bits; + bit_errors_log = [bit_errors_log bit_errors]; + else + bit_errors_log = [bit_errors_log 0]; + end + + % test frame sync state machine, just for more informative plots + + next_test_frame_sync_state = test_frame_sync_state; + if (test_frame_sync_state == 0) + if (test_frame_sync == 1) + next_test_frame_sync_state = 1; + test_frame_count = 0; + end + end + + if (test_frame_sync_state == 1) + % we only expect another test_frame_sync pulse every 4 symbols + test_frame_count++; + if (test_frame_count == 4) + test_frame_count = 0; + if ((test_frame_sync == 0)) + next_test_frame_sync_state = 0; + end + end + end + test_frame_sync_state = next_test_frame_sync_state; + test_frame_sync_log = [test_frame_sync_log test_frame_sync_state]; +end + +% --------------------------------------------------------------------- +% Print Stats +% --------------------------------------------------------------------- + +ber = total_bit_errors / total_bits; + +% Note Eb/No set point is for Nc data carriers only, excluding pilot. +% This is convenient for testing BER versus Eb/No. Measured Eb/No +% includes power of pilot. Similar for SNR, first number is SNR excluding +% pilot pwr for Eb/No set point, 2nd value is measured SNR which will be a little +% higher as pilot power is included. + +printf("\n"); +printf("Eb/No (meas): %2.2f (%2.2f) dB\n", EbNo_dB, 10*log10(0.25*tx_pwr*Fs/(Rs*Nc*noise_pwr))); +printf("SNR...(meas): %2.2f (%2.2f) dB\n", SNR, calc_snr(sig_est, noise_est)); +printf("\nDPSK\n"); +printf(" bits......: %d\n", total_bits); +printf(" errors....: %d\n", total_bit_errors); +printf(" BER.......: %1.4f\n", ber); + +% --------------------------------------------------------------------- +% Plots +% --------------------------------------------------------------------- + +figure(1) +clf; +[n m] = size(rx_symbols_log); +plot(real(rx_symbols_log(1:Nc+1,15:m)),imag(rx_symbols_log(1:Nc+1,15:m)),'+') +%plot(real(rx_symbols_log(2,15:m)),imag(rx_symbols_log(2,15:m)),'+') +axis([-3 3 -3 3]); +title('Scatter Diagram'); + +figure(2) +clf; +subplot(211) +plot(rx_timing_log) +title('timing offset (samples)'); +subplot(212) +plot(foff_log, '-;freq offset;') +hold on; +plot(track_log*75, 'r;course-fine;'); +hold off; +title('Freq offset (Hz)'); + +figure(3) +clf; +subplot(311) +stem(sync_log) +axis([0 frames 0 1.5]); +title('BPSK Sync') +subplot(312) +stem(bit_errors_log); +title('Bit Errors for test frames') +subplot(313) +plot(test_frame_sync_log); +axis([0 frames 0 1.5]); +title('Test Frame Sync') + +figure(4) +clf; +[n m] = size(rx_symbols_ph_log); +plot(real(rx_symbols_ph_log(1:Nc+1,15:m)),imag(rx_symbols_ph_log(1:Nc+1,15:m)),'+') +%plot(real(rx_symbols_ph_log(2,15:m)),imag(rx_symbols_ph_log(2,15:m)),'+') +axis([-3 3 -3 3]); +title('Scatter Diagram - after phase correction'); + +figure(5) +clf; +subplot(211) +plot(rx_phase_offsets_log(1,:)) +subplot(212) +plot(phase_amb_log(1,:)) +title('Rx Phase Offset Est') diff --git a/codec2/tags/0.4.1/octave/fdmdv_ut_freq_off.m b/codec2/tags/0.4.1/octave/fdmdv_ut_freq_off.m new file mode 100644 index 00000000..395bcc5b --- /dev/null +++ b/codec2/tags/0.4.1/octave/fdmdv_ut_freq_off.m @@ -0,0 +1,489 @@ +% 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/codec2/tags/0.4.1/octave/fm.m b/codec2/tags/0.4.1/octave/fm.m new file mode 100644 index 00000000..765aae12 --- /dev/null +++ b/codec2/tags/0.4.1/octave/fm.m @@ -0,0 +1,423 @@ +% 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 + + % 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 + + rx_out(find(rx_out > wd)) = wd; + rx_out(find(rx_out < -wd)) = -wd; + + 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) + 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); + + nsam = fm_states.Fs * 10; + t = 0:(nsam-1); + fm = 1000; wm = 2*pi*fm/fm_states.Fs; + mod = sin(wm*t); + tx = analog_fm_mod(fm_states, mod); + + 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 Intput 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 + + +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"); diff --git a/codec2/tags/0.4.1/octave/fsk.m b/codec2/tags/0.4.1/octave/fsk.m new file mode 100644 index 00000000..d91ba303 --- /dev/null +++ b/codec2/tags/0.4.1/octave/fsk.m @@ -0,0 +1,251 @@ +% fsk.m +% David Rowe Nov 2014 + +% Simulation to test FSK demod +% +% TODO +% [X] Code up mod/non-coh demod/AWGN channel simulation +% [X] Eb/No verses BER curves +% [X] test analog FM with pre/de-emphahsis +% + this will introduce delay, use fir filter, group delay +% [X] channel simulation of HT/FM radio +% + filtering, varying modulation index +% [ ] GMSK +% [X] refactor to plot analog FM demod curves +% [X] SSB curves +% [-] different modn index beta curves, +% + not really important for now +% [ ] plot to illustrate harmonic dist, +% [X] integration with AFSK, AFSK-FM, v AFSK-SSB (ie FSK) +% [-] fine timing offset for pre/de filters? +% + do we need interpolation as well? +% + might leave this as pre/de not significant now +% [X] C/No curves? +% [X] spectrum plots or analog FM and FSK +% [ ] figures + +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 + + +%run_fsk_curves +run_fsk_single + diff --git a/codec2/tags/0.4.1/octave/fuzzy_gray.m b/codec2/tags/0.4.1/octave/fuzzy_gray.m new file mode 100644 index 00000000..425f8d7c --- /dev/null +++ b/codec2/tags/0.4.1/octave/fuzzy_gray.m @@ -0,0 +1,586 @@ +% fuzzy_gray.m +% David Rowe +% 10 April 2014 +% +% Various experiments in fuzzy gray codes and quantising and +% transmitting scalars. + +1; + +% fuzzy gray coding idea: use an extra parity bit, if we get a single +% bit error the value will be "close: to the original, so effect of +% error will be soft. Unlike data we don't need 0 bit errors. I +% struggled to extend this to larger m. + +function three_bit_code + m=4; + log2_m=2; + value_to_codeword = ["000"; "001"; "101"; "111"]; + codeword_to_value = [0 1 1 2 1 2 2 3 3]; + + printf("tx_value tx_codeword rx_codeword rx_value distance\n"); + for i=1:m + tx_codeword = bin2dec(value_to_codeword(i,:)); + tx_codeword_bin = value_to_codeword(i,:); + rx_value = codeword_to_value(tx_codeword+1); + distance = abs((i-1) - rx_value); + printf("%8d %11s %11s %8d %8d\n", i-1, tx_codeword_bin, tx_codeword_bin, ... + rx_value, distance ); + end + printf("\n"); + for i=1:m + tx_codeword = bin2dec(value_to_codeword(i,:)); + tx_codeword_bin = value_to_codeword(i,:); + for j=1:(log2_m+1) + rx_codeword = bitxor(tx_codeword, bitset(0,j)); + rx_codeword_bin = dec2bin(rx_codeword, 3); + rx_value = codeword_to_value(rx_codeword+1); + distance = abs((i-1) - rx_value); + printf("%8d %11s %11s %8d %8d\n", i-1, tx_codeword_bin, rx_codeword_bin, ... + rx_value, distance ); + end + end +endfunction + +% regular natural binary quantiser + +function index = quantise_value(value, min_value, max_value, num_levels) + norm = (value - min_value)/(max_value - min_value); + index = floor(num_levels * norm + 0.5); + if (index < 0 ) + index = 0; + end + if (index > (num_levels-1)) + index = num_levels-1; + end +endfunction + +function value = unquantise_value(index, min_value, max_value, num_levels) + step = (max_value - min_value)/num_levels; + value = min_value + step*(index); +endfunction + +% converting natural binary to gray + +function gray = binary_to_gray(natural) + gray = bitxor(bitshift(natural,-1),natural); +endfunction + +function natural = gray_to_binary(gray) + for i=1:length(gray) + mask = bitshift(gray(i),-1); + num = gray(i); + while(mask) + num = bitxor(num, mask); + mask = bitshift(mask,-1); + end + natural(i) = num; + end +endfunction + +function sim_out = test_baseline_uncoded(Ebvec, Nbits, Ntrials, enable_error_log, enable_gray) + Nlevels = 2.^ Nbits; powersOfTwo = 2 .^ fliplr(0:(Nbits-1)); + Nsymb = Nbits; + + sim_out.qnoise_log = zeros(length(Ebvec),Ntrials); + sim_out.error_log = []; + + for ne = 1:length(Ebvec) + EbNodB = Ebvec(ne); + EbNo = 10^(EbNodB/10); + + variance = 1/EbNo; + + Terrs = 0; Tbits = 0; + qsignal = qnoise = 0; + + for nn = 1:Ntrials + + tx_value = rand(1,1); + tx_index = quantise_value(tx_value, 0, 1, Nlevels); + if enable_gray + tx_index = binary_to_gray(tx_index); + end + tx_bits = dec2bin(tx_index, Nbits) - '0'; + tx_symbols = -1 + 2*tx_bits; + + % 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,Nsymb) + j*randn(1,Nsymb)); + rx_symbols = tx_symbols + noise; + + rx_bits = rx_symbols > 0; + + error_positions = xor(rx_bits, tx_bits); + Nerrs = sum(error_positions); + Terrs += Nerrs; + Tbits += length(tx_bits); + if enable_error_log + sim_out.error_log = [sim_out.error_log error_positions]; + end + + rx_index = (powersOfTwo * rx_bits'); + if enable_gray + rx_index = gray_to_binary(rx_index); + end + rx_value = unquantise_value(rx_index, 0, 1, Nlevels); + + qsignal += tx_value*tx_value; + qnoise += (tx_value - rx_value) .^ 2; + sim_out.qnoise_log(ne,nn) = tx_value - rx_value; + end + + sim_out.TERvec(ne) = Terrs; + sim_out.BERvec(ne) = Terrs/Tbits; + sim_out.QSNRvec(ne) = 10*log10(qsignal/qnoise); + printf("EbNo (dB): %3.2f Terrs: %6d BER %1.4f QSNR (dB): %3.2f\n", + EbNodB, Terrs, Terrs/Tbits, 10*log10(qsignal/qnoise)); + end + +endfunction + +function sim_out = test_varpower(Ebvec, Nbits, Ntrials, amps, enable_error_log) + Nlevels = 2.^ Nbits; powersOfTwo = 2 .^ fliplr(0:(Nbits-1)); + Nsymb = Nbits; + + sim_out.qnoise_log = zeros(length(Ebvec), Ntrials); + sim_out.error_log = []; + + for ne = 1:length(Ebvec) + EbNodB = Ebvec(ne); + EbNo = 10^(EbNodB/10); + + variance = 1/EbNo; + + Terrs = 0; Tbits = 0; + qsignal = qnoise = 0; + + for nn = 1:Ntrials + + tx_value = rand(1,1); + tx_index = quantise_value(tx_value, 0, 1, Nlevels); + tx_bits = dec2bin(tx_index, Nbits) - '0'; + tx_symbols = (-1 + 2*tx_bits) .* amps; + + % 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,Nsymb) + j*randn(1,Nsymb)); + rx_symbols = tx_symbols + noise; + + rx_bits = rx_symbols > 0; + + error_positions = xor(rx_bits, tx_bits); + if enable_error_log + sim_out.error_log = [sim_out.error_log error_positions]; + end + Nerrs = sum(error_positions); + Terrs += Nerrs; + Tbits += length(tx_bits); + + rx_index = (powersOfTwo * rx_bits'); + rx_value = unquantise_value(rx_index, 0, 1, Nlevels); + + qsignal += tx_value*tx_value; + qnoise += (tx_value - rx_value) .^ 2; + sim_out.qnoise_log(ne,nn) = tx_value - rx_value; + end + + sim_out.TERvec(ne) = Terrs; + sim_out.BERvec(ne) = Terrs/Tbits; + sim_out.QSNRvec(ne) = 10*log10(qsignal/qnoise); + printf("EbNo (dB): %3.2f Terrs: %6d BER %1.4f QSNR (dB): %3.2f\n", + EbNodB, Terrs, Terrs/Tbits, 10*log10(qsignal/qnoise)); + end + +endfunction + +% gray codes with specified number of data and parity bits. Soft +% decision decoding. Didn't really work out. + +function valid_codewords = fuzzy_code_create(ndata,nparity) + Nbits = ndata + nparity; + Nvalid = 2 .^ ndata; + codewords = binary_to_gray(0:(2 .^ Nbits)-1); + valid_codewords = dec2bin(codewords(1:2:(2 .^ Nbits)), Nbits) - '0'; + + % check all valid codewords have a hamming distance of at least 2^nparity + + bad_distance = 0; + for i=1:Nvalid + for k=i+1:Nvalid + distance = sum(bitxor(valid_codewords(i,:), valid_codewords(k,:))); + if distance < 2 + bad_distance++; + end + end + end + if bad_distance != 0 + printf("Error: Nvalid: %d bad_distance: %d\n", Nvalid, bad_distance); + return; + end + +endfunction + +function tx_codeword = fuzzy_code_encode(codewords, value) + tx_codeword = codewords(value+1,:); +endfunction + +function [value, best_codeword] = fuzzy_code_decode(codewords, rx_symbols) + max_corr = 0; + value = 0; + [rows,cols] = size(codewords); + for i=1:rows + corr = (-1 + 2*codewords(i,:)) * transpose(rx_symbols); + if (corr > max_corr) + max_corr = corr; + value = i-1; + best_codeword = codewords(i,:); + end + end +endfunction + + +function sim_out = test_fuzzy_code(Ebvec, Ndata, Nparity, Ntrials) + Nbits = Ndata + Nparity; + Nlevels = 2 .^ Ndata; + Nsymb = Nbits; + powersOfTwo = 2 .^ fliplr(0:(Nbits-1)); + + codewords = fuzzy_code_create(Ndata,Nparity); + sim_out.qnoise_log = zeros(length(Ebvec), Ntrials); + + for ne = 1:length(Ebvec) + EbNodB = Ebvec(ne); + EbNo = 10^(EbNodB/10); + + variance = 1/EbNo; + + Terrs = 0; Terrs_coded = 0; Tbits = 0; + Nsingle = Nsingle_corrected = 0; + qsignal = qnoise = 0; + + for nn = 1:Ntrials + + tx_value = rand(1,1); + tx_index = quantise_value(tx_value, 0, 1, Nlevels); + tx_codeword = fuzzy_code_encode(codewords, tx_index); + tx_symbols = -1 + 2*tx_codeword; + + % 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,Nsymb) + j*randn(1,Nsymb)); + rx_symbols = tx_symbols + noise; + + % uncoded BER + + rx_bits = rx_symbols > 0; + error_positions = xor(rx_bits(1:Ndata), tx_codeword(1:Ndata)); + Nerrs = sum(error_positions); + Terrs += Nerrs; + Tbits += Ndata; + + % decode and determine QSNR + + [rx_index, rx_codeword] = fuzzy_code_decode(codewords, rx_symbols); + rx_value = unquantise_value(rx_index, 0, 1, Nlevels); + qsignal += tx_value*tx_value; + qnoise += (tx_value - rx_value) .^ 2; + sim_out.qnoise_log(ne,nn) = tx_value - rx_value; + + % coded BER + + error_positions = xor(rx_codeword(1:Ndata), tx_codeword(1:Ndata)); + Nerrs_coded = sum(error_positions); + if Nerrs == 1 + Nsingle++; + if Nerrs_coded == 0 + Nsingle_corrected++; + end + end + Terrs_coded += Nerrs_coded; + + end + + sim_out.BERvec(ne) = Terrs/Tbits; + sim_out.BERvec_coded(ne) = Terrs_coded/Tbits; + sim_out.Nsingle(ne) = Nsingle; + sim_out.Nsingle_corrected(ne) = Nsingle_corrected; + + sim_out.QSNRvec(ne) = 10*log10(qsignal/qnoise); + printf("EbNo (dB): %3.2f Terrs: %6d BER %1.4f Terrs_coded: %6d BER_coded %1.4f QSNR (dB): %3.2f", + EbNodB, Terrs, Terrs/Tbits, Terrs_coded, Terrs_coded/Tbits, sim_out.QSNRvec(ne)); + printf(" Nsingle: %d Nsingle_corrected: %d corrected: %3.1f\n", Nsingle, Nsingle_corrected, Nsingle_corrected*100/Nsingle); + end +endfunction + +function compare_baseline_fuzzy + Ebvec = 0:3; + Ntrials = 5000; + Nbits = 4; Nparity = 1; + + baseline = test_baseline_uncoded(Ebvec, Nbits, Ntrials, 0, 0); + fuzzy = test_fuzzy_code(Ebvec, Nbits, Nparity, Ntrials); + + figure(1); + clf; + semilogy(Ebvec, baseline.BERvec) + xlabel('Eb/N0') + ylabel('BER') + grid("minor") + + figure(2); + clf; + plot(Ebvec, baseline.QSNRvec,'b;baseline;') + hold on; + plot(Ebvec, fuzzy.QSNRvec,'r;fuzzy;') + hold off; + xlabel('Eb/N0') + ylabel('SNR') + grid("minor") + + figure(3); + subplot(211) + hist(baseline.qnoise_log(4,:),50); + subplot(212) + hist(fuzzy.qnoise_log(4,:),50); + + figure(4) + subplot(211) + plot(baseline.qnoise_log(4,1:250),'b;baseline;') + subplot(212) + plot(fuzzy.qnoise_log(4,1:250),'r;fuzzy;') +endfunction + +% compare baseline and variable power schemes and make plots + +function compare_baseline_varpower_plot + Ebvec = -2:5; + Ntrials = 5000; + Nbits = 5; + + baseline = test_baseline_uncoded(Ebvec, Nbits, Ntrials, 0, 0); + amps = [2 1.5 1.0 0.5 0.5]; + av_pwr = (amps*amps')/length(amps); + amps_norm = amps/sqrt(av_pwr); + varpower = test_varpower(Ebvec, Nbits, Ntrials, amps_norm, 0); + + figure(1); + clf; + semilogy(Ebvec, baseline.BERvec) + xlabel('Eb/No (dB)') + ylabel('BER') + grid("minor") + title('BER versus Eb/No') + + figure(2); + clf; + plot(Ebvec, baseline.QSNRvec,'b;baseline;') + hold on; + plot(Ebvec, varpower.QSNRvec,'r;varpower;') + hold off; + xlabel('Eb/No (dB)') + ylabel('SNR (dB)') + grid("minor") + title('Quantiser SNR versus Eb/No') + + figure(3); + subplot(211) + hist(baseline.qnoise_log(1,:),50); + title('Baseline and Variable Power Error Histograms') + subplot(212) + hist(varpower.qnoise_log(1,:),50); + + figure(4) + subplot(211) + plot(baseline.qnoise_log(1,1:250),'b;baseline;') + title('Baseline and Variable Power Error plots for Eb/No = -2dB') + subplot(212) + plot(varpower.qnoise_log(1,1:250),'r;varpower;') +endfunction + +% Compare baseline and variable power schemes and make error pattern +% files for inserting into codec bit stream so we can listen to +% result. + +function compare_baseline_varpower_error_files + Ebvec = -2; + Fs = 25; % number of samples per second + Nsec = 15; % seconds to simulate + Ntrials = Fs*Nsec; + Nbits = 5; + bits_per_frame = 52; + bits_per_frame_rounded = ceil(bits_per_frame/8)*8; % c2enc uses integer number of bytes/frame + start_bit = 12; % first energy bit (after 4 voicing, 7 Wo bits) + + baseline = test_baseline_uncoded(Ebvec, Nbits, Ntrials, 1, 0); + amps = [2 1.5 1.0 0.5 0.5]; + av_pwr = (amps*amps')/length(amps); + amps_norm = amps/sqrt(av_pwr); + varpower = test_varpower(Ebvec, Nbits, Ntrials, amps_norm, 1); + + % construct error patterns to apply to c2enc bit stream + + baseline_errors = []; + for i=1:Ntrials + error_positions = baseline.error_log(Nbits*(i-1)+1:Nbits*i); + baseline_errors = [baseline_errors zeros(1,start_bit-1) error_positions ... + zeros(1, bits_per_frame_rounded - Nbits - (start_bit-1))]; + end + + varpower_errors = []; + for i=1:Ntrials + error_positions = varpower.error_log(Nbits*(i-1)+1:Nbits*i); + varpower_errors = [varpower_errors zeros(1,start_bit-1) error_positions ... + zeros(1, bits_per_frame_rounded - Nbits - (start_bit-1))]; + end + + % save error patterns + + fep=fopen("energy_errors_baseline.bin","wb"); fwrite(fep, baseline_errors, "short"); fclose(fep); + fep=fopen("energy_errors_varpower.bin","wb"); fwrite(fep, varpower_errors, "short"); fclose(fep); +endfunction + +% compare natural and gray coding and make plots + +function compare_natural_gray_plot + Ebvec = -2:10; + Ntrials = 5000; + Nbits = 7; + + natural = test_baseline_uncoded(Ebvec, Nbits, Ntrials, 0, 0); + gray = test_baseline_uncoded(Ebvec, Nbits, Ntrials, 0, 1); + + figure(1); + clf; + semilogy(Ebvec, natural.BERvec) + xlabel('Eb/No (dB)') + ylabel('BER') + grid("minor") + title('BER versus Eb/No') + + figure(2); + clf; + plot(Ebvec, natural.QSNRvec,'b;natural;') + hold on; + plot(Ebvec, gray.QSNRvec,'r;gray;') + hold off; + xlabel('Eb/No (dB)') + ylabel('SNR (dB)') + grid("minor") + title('Quantiser SNR versus Eb/No') + + figure(3); + subplot(211) + hist(natural.qnoise_log(1,:),50); + title('Natural and Gray coded Error Histograms') + subplot(212) + hist(gray.qnoise_log(1,:),50); + + figure(4) + subplot(211) + plot(natural.qnoise_log(1,1:250),'b;natural;') + axis([0 250 -1 1]) + title('Natural and Gray coded Error plots for Eb/No = -2dB') + subplot(212) + plot(gray.qnoise_log(1,1:250),'r;gray;') + axis([0 250 -1 1]) +endfunction + +% compare natural at different Eb/No and Nbitsmake plots + +function compare_natural_nbit_plot + Ebvec = -2:10; + Ntrials = 5000; + + figure(1); + clf; + for n = 2:7 + natural = test_baseline_uncoded(Ebvec, n, Ntrials, 0, 0); + plot(Ebvec, natural.QSNRvec) + if n == 2 + hold on; + end + end + hold off; + + xlabel('Eb/No (dB)') + ylabel('SNR (dB)') + grid("minor") + title('Quantiser SNR versus Eb/No') +endfunction + +function generate_varpower_error_files(EbNo, start_bit, end_bit, amps, error_file_name) + Fs = 25; % number of samples per second + Nsec = 3; % seconds to simulate + Ntrials = Fs*Nsec; + Nbits = end_bit - start_bit + 1; + bits_per_frame = 52; + bits_per_frame_rounded = ceil(bits_per_frame/8)*8; % c2enc uses integer number of bytes/frame + % first energy bit (after 4 voicing, 7 Wo bits) + + % normalise powers and run test + + av_pwr = (amps*amps')/length(amps); + amps_norm = amps/sqrt(av_pwr); + av_pwr2 = (amps_norm*amps_norm')/length(amps_norm) + varpower = test_varpower(EbNo, Nbits, Ntrials, amps_norm, 1); + + % construct error patterns to apply to c2enc bit stream + + varpower_errors = []; + for i=1:Ntrials + error_positions = varpower.error_log(Nbits*(i-1)+1:Nbits*i); + + if 0 + % reset single errors to tes effect of ideal single bit error correcting code + for i=1:7 + st = 4*(i-1)+1 + en = 4*i + if sum(error_positions(st:en)) == 1 + error_positions(st:en) = 0; + end + end + for i=1:2 + st = 7*4+3*(i-1)+1 + en = 7*4+3*i + if sum(error_positions(st:en)) == 1 + error_positions(st:en) = 0; + end + end + st = 7*4+3*2+1 + en = 7*4+3*2+2 + if sum(error_positions(st:en)) == 1 + error_positions(st:en) = 0; + end + end + + num_errors(i) = sum(error_positions); + varpower_errors = [varpower_errors zeros(1,start_bit-1) error_positions ... + zeros(1, bits_per_frame_rounded - Nbits - (start_bit-1))]; + end + + % save error pattern to file + + fep=fopen(error_file_name,"wb"); fwrite(fep, varpower_errors, "short"); fclose(fep); + + figure(1) + clf + hist(num_errors) +endfunction + +more off; + +%generate_varpower_error_files(0, 17, 52, ones(1,36), "lsp_baseline_errors_0dB.bin") +%amps = [1 1 1 0 1 1 1 0 1 1 1 0 1 1 1 0 1 1 1 0 1 1 1 0 1 1 1 0 1 1 1 1 1 1 1 1 ]; +%generate_varpower_error_files(0, 17, 52, amps, "lsp_varpower_errors_0dB.bin") + +%compare_natural_nbit_plot +%compare_natural_gray_plot +%compare_baseline_varpower_plot +%compare_baseline_varpower_error_files + +compare_baseline_fuzzy +%fuzzy_code_create(3,1) diff --git a/codec2/tags/0.4.1/octave/gen_rn_coeffs.m b/codec2/tags/0.4.1/octave/gen_rn_coeffs.m new file mode 100644 index 00000000..bfc214e0 --- /dev/null +++ b/codec2/tags/0.4.1/octave/gen_rn_coeffs.m @@ -0,0 +1,40 @@ +% gen_rn_coeffs.m +% David Rowe 13 april 2012 +% +% Generate root raised cosine (Root Nyquist) filter coefficients +% thanks http://www.dsplog.com/db-install/wp-content/uploads/2008/05/raised_cosine_filter.m + +function coeffs = gen_rn_coeffs(alpha, T, Rs, Nsym, M) + + Ts = 1/Rs; + + n = -Nsym*Ts/2:T:Nsym*Ts/2; + Nfilter = Nsym*M; + Nfiltertiming = M+Nfilter+M; + + sincNum = sin(pi*n/Ts); % numerator of the sinc function + sincDen = (pi*n/Ts); % denominator of the sinc function + sincDenZero = find(abs(sincDen) < 10^-10); + sincOp = sincNum./sincDen; + sincOp(sincDenZero) = 1; % sin(pix/(pix) =1 for x =0 + + cosNum = cos(alpha*pi*n/Ts); + cosDen = (1-(2*alpha*n/Ts).^2); + cosDenZero = find(abs(cosDen)<10^-10); + cosOp = cosNum./cosDen; + cosOp(cosDenZero) = pi/4; + gt_alpha5 = sincOp.*cosOp; + Nfft = 4096; + GF_alpha5 = fft(gt_alpha5,Nfft)/M; + + % sqrt causes stop band to be amplified, this hack pushes it down again + + for i=1:Nfft + if (abs(GF_alpha5(i)) < 0.02) + GF_alpha5(i) *= 0.001; + endif + end + GF_alpha5_root = sqrt(abs(GF_alpha5)) .* exp(j*angle(GF_alpha5)); + ifft_GF_alpha5_root = ifft(GF_alpha5_root); + coeffs = real((ifft_GF_alpha5_root(1:Nfilter))); +endfunction diff --git a/codec2/tags/0.4.1/octave/glottal.m b/codec2/tags/0.4.1/octave/glottal.m new file mode 100644 index 00000000..46675e7d --- /dev/null +++ b/codec2/tags/0.4.1/octave/glottal.m @@ -0,0 +1,29 @@ +% glottal.m +% David Rowe 12 Sep 2009 +% Matlab script to generate the phase spectra of a glottal pulse + +% lpc10 pulse from spandsp. When the file glottal.c was used as a part of the +% excitation phase component in phase.c, phase_synth_zero_order(), no difference +% in speech quality was apparent. So left out of code for now. + +sh=12 +kexc = [ 8, -16, 26, -48, 86, -162, 294, -502, 718, -728, 184 672, -610, -672, 184, 728, 718, 502, 294, 162, 86, 48, 26, 16, 8]; +kexc = shift(kexc,sh); +kexc = [kexc(1:sh) zeros(1,512-25) kexc(sh+1:25)]; +figure(1) +clf +plot(kexc) +figure(2) +G = fft(kexc); +subplot(211) +plot((1:256)*(4000/256),unwrap(angle(G(1:256)))) +subplot(212) +plot(20*log10(abs(G))) + +f=fopen("glottal.c","wt"); +fprintf(f,"const float glottal[]={\n"); +for m=1:255 + fprintf(f," %f,\n",angle(G(m))); +endfor +fprintf(f," %f};\n",angle(G(256))); +fclose(f); diff --git a/codec2/tags/0.4.1/octave/gmsk.m b/codec2/tags/0.4.1/octave/gmsk.m new file mode 100644 index 00000000..5f07d444 --- /dev/null +++ b/codec2/tags/0.4.1/octave/gmsk.m @@ -0,0 +1,1021 @@ +% 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 doesnt + % 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 betwen 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/codec2/tags/0.4.1/octave/hf_sim.m b/codec2/tags/0.4.1/octave/hf_sim.m new file mode 100644 index 00000000..c9105c00 --- /dev/null +++ b/codec2/tags/0.4.1/octave/hf_sim.m @@ -0,0 +1,78 @@ +% 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/codec2/tags/0.4.1/octave/hfper.m b/codec2/tags/0.4.1/octave/hfper.m new file mode 100644 index 00000000..b3396342 --- /dev/null +++ b/codec2/tags/0.4.1/octave/hfper.m @@ -0,0 +1,57 @@ +% hfper.m +% David Rowe 2 June 2014 +% Quick and dirty HF PER calculator/simulator + +function hfper(ber, nbits, ntrials) + + % Raw PER with no FEC -------------------------------------- + + nper = 0; + for i=1:ntrials + nerr = sum(rand(1,nbits) < ber); + if nerr >0 + nper++; + end + end + printf("Raw PER..................: %0.3f\n", nper/ntrials); + + % Half rate block code, e.g. Golay (23,12) with 3 bit error + % correcting capability + + % Golay (23,12) that can correct 3 errors (fails at 4) ------ + + ncodeword = 23; + ncorrect = 3; + nper = 0; + for i=1:ntrials + nerr = sum(rand(1,ncodeword) < ber); + if nerr > ncorrect + nper++; + end + end + printf("One Golay codeword.......: %0.3f\n", nper/ntrials); + + % Several Golay codewords concatenated ---------------------- + + m = floor(nbits/12); % number of codewords + + nper = 0; + for i=1:ntrials + + % test each codeword in packet, if any of the codewords has > 4 + % errors, entire packet is a dud + + no_errors = 1; + for k=1:m + nerr = sum(rand(1,ncodeword) < ber); + if (nerr > ncorrect) && no_errors + nper++; + no_errors = 0; + end + end + + end + printf("Packet protected by Golay: %0.3f\n", nper/ntrials); + +endfunction + diff --git a/codec2/tags/0.4.1/octave/hp_filt.m b/codec2/tags/0.4.1/octave/hp_filt.m new file mode 100644 index 00000000..1087bb91 --- /dev/null +++ b/codec2/tags/0.4.1/octave/hp_filt.m @@ -0,0 +1,12 @@ +% 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/codec2/tags/0.4.1/octave/ldpc.m b/codec2/tags/0.4.1/octave/ldpc.m new file mode 100644 index 00000000..9a10d93e --- /dev/null +++ b/codec2/tags/0.4.1/octave/ldpc.m @@ -0,0 +1,222 @@ +% ldpc.m +% +% David Rowe 2013 +% Octave functions to help us use the CML LDPC code. +% +% Installing CML library +% ---------------------- +% +% $ sudo apt-get install liboctave-dev +% $ wget http://www.iterativesolutions.com/user/image/cml.1.10.zip +% $ unzip cml.1.10.zip +% $ patch < ~/codec2-dev/octave/cml.patch +% $ cd source +% $ octave +% octave:> make + +1; + + +function code_param = ldpc_init(rate, framesize, modulation, mod_order, mapping) + [code_param.H_rows, code_param.H_cols, code_param.P_matrix] = InitializeWiMaxLDPC( rate, framesize, 0 ); + code_param.data_bits_per_frame = length(code_param.H_cols) - length( code_param.P_matrix ); + code_param.S_matrix = CreateConstellation( modulation, mod_order, mapping ); + code_param.bits_per_symbol = log2(mod_order); +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) + bit0 = real(symbol*exp(j*pi/4)) < 0; + bit1 = imag(symbol*exp(j*pi/4)) < 0; + two_bits = [bit1 bit0]; +endfunction + + +% inserts a unique word into a frame of bits. The UW bits are spread +% throughout the input frame 2 bits at a time. + +function frameout = insert_uw(framein, uw) + + luw = length(uw); + lframein = length(framein); + spacing = 2*lframein/luw; + + frameout = []; + + pin = 1; pout = 1; puw = 1; + while (luw) + %printf("pin %d pout %d puw %d luw %d\n", pin, pout, puw, luw); + frameout(pout:pout+spacing-1) = framein(pin:pin+spacing-1); + pin += spacing; + pout += spacing; + frameout(pout:pout+1) = uw(puw:puw+1); + puw += 2; + pout += 2; + luw -= 2; + end +endfunction + +% removes a unique word from a frame of bits. The UW bits are spread +% throughout the input frame 2 bits at a time. + +function frameout = remove_uw(framein, lvd, luw) + + spacing = 2*lvd/luw; + + frameout = []; + + pin = 1; pout = 1; + while (luw) + %printf("pin %d pout %d luw %d ", pin, pout, luw); + %printf("pin+spacing-1 %d lvd %d lframein: %d\n", pin+spacing-1, lvd, length(framein)); + frameout(pout:pout+spacing-1) = framein(pin:pin+spacing-1); + pin += spacing + 2; + pout += spacing; + luw -= 2; + end + +endfunction + + +% removes a unique word from a frame of symbols. The UW symbols are spread +% throughout the input frame 1 symbol at a time. + +function framesymbolsout = remove_uw_symbols(framesymbolsin, ldatasymbols, luwsymbols) + + spacing = ldatasymbols/luwsymbols; + + framesymbolsout = []; + + pin = 1; pout = 1; + while (luwsymbols) + %printf("pin %d pout %d luw %d ", pin, pout, luwsymbols); + %printf("pin+spacing-1 %d ldatasymbols %d lframein: %d\n", pin+spacing-1, ldatasymbols, length(framesymbolsin)); + framesymbolsout(pout:pout+spacing-1) = framesymbolsin(pin:pin+spacing-1); + pin += spacing + 1; + pout += spacing; + luwsymbols--; + end + +endfunction + + + +% builds up a sparse QPSK modulated version version of the UW for use +% in UW sync at the rx + +function mod_uw = build_mod_uw(uw, spacing) + luw = length(uw); + + mod_uw = []; + + pout = 1; puw = 1; + while (luw) + %printf("pin %d pout %d puw %d luw %d\n", pin, pout, puw, luw); + pout += spacing/2; + mod_uw(pout) = qpsk_mod(uw(puw:puw+1)); + puw += 2; + pout += 1; + luw -= 2; + end +endfunction + + +% Uses the UW to determine when we have a full codeword ready for decoding + +function [found_uw corr] = look_for_uw(mem_rx_symbols, mod_uw) + sparse_mem_rx_symbols = mem_rx_symbols(find(mod_uw)); + + % correlate with ref UW + + num = (mem_rx_symbols * mod_uw') .^ 2; + den = (sparse_mem_rx_symbols * sparse_mem_rx_symbols') * (mod_uw * mod_uw'); + + corr = abs(num/(den+1E-6)); + found_uw = corr > 0.8; +endfunction + + +function [codeword s] = ldpc_enc(data, code_param) + codeword = LdpcEncode( data, code_param.H_rows, code_param.P_matrix ); + s = Modulate( codeword, code_param.S_matrix ); +endfunction + + +function detected_data = ldpc_dec(code_param, max_iterations, demod_type, decoder_type, r, EsNo, fading) + symbol_likelihood = Demod2D( r, code_param.S_matrix, EsNo, fading); + + % initialize the extrinsic decoder input + input_somap_c = zeros(1, code_param.code_bits_per_frame ); + bit_likelihood = Somap( symbol_likelihood, demod_type, input_somap_c ); + + input_decoder_c = bit_likelihood(1:code_param.code_bits_per_frame); + + x_hat= MpDecode( -input_decoder_c, code_param.H_rows, code_param.H_cols, ... + max_iterations, decoder_type, 1, 1); + detected_data = x_hat(max_iterations,:); +endfunction + + +% Packs a binary array into an array of 8 bit bytes, MSB first + +function packed = packmsb(unpacked) + packed = zeros(1,floor(length(unpacked)+7)/8); + bit = 7; byte = 1; + for i=1:length(unpacked) + packed(byte) = bitor(packed(byte), bitshift(unpacked(i),bit)); + bit--; + if (bit < 0) + bit = 7; + byte++; + end + end +endfunction + + +% unpacks an array of 8 bit bytes into a binary array of unpacked bits, MSB first + +function unpacked = unpackmsb(packed) + bit = 7; byte = 1; + for i=1:length(packed)*8 + unpacked(i) = bitand(bitshift(packed(byte), -bit), 1); + bit--; + if (bit < 0) + bit = 7; + byte++; + end + end +endfunction + + +% symbol interleaver that acts on bits 2 at a time + +function y = interleave_bits(interleaver, x) + y = zeros(1,length(x)); + for i = 1:length(interleaver) + dst = interleaver(i); + y(2*(dst-1)+1:2*dst) = x(2*(i-1)+1:2*(i)); + end +endfunction + +% symbol de-interleaver + +function x = deinterleave_symbols(interleaver, y) + for i = 1:length(interleaver) + x(i) = y(interleaver(i)); + end +endfunction diff --git a/codec2/tags/0.4.1/octave/ldpcdec.m b/codec2/tags/0.4.1/octave/ldpcdec.m new file mode 100644 index 00000000..6f71f832 --- /dev/null +++ b/codec2/tags/0.4.1/octave/ldpcdec.m @@ -0,0 +1,300 @@ +% ldpcdec.m +% David Rowe 31 Dec 2013 +% +% LDPC decoder test program, given a file of QPSK symbols (IQIQ floats), +% performs frame sync, decodes, and measures BER. + +function ldpcdec(filename, Eprob) + + % Start CML library + + currentdir = pwd; + addpath '/home/david/tmp/cml/mat' % assume the source files stored here + cd /home/david/tmp/cml + CmlStartup % note that this is not in the cml path! + cd(currentdir) + + % Our LDPC library + + ldpc; + + % Start simulation + + rand('state',1); + + rate = 3/4; + framesize = 576; + + mod_order = 4; + modulation = 'QPSK'; + mapping = 'gray'; + + demod_type = 0; + decoder_type = 0; + max_iterations = 100; + EsNo = 4; + if (nargin == 1) + Eprob = 0.0; + end + + nbitspervocoderframe = 52; + nvocoderframes = 8; + nbitspermodemframe = 72; + + code_param = ldpc_init(rate, framesize, modulation, mod_order, mapping); + code_param.code_bits_per_frame = 576; + + data = []; + r = []; + load interleaver.txt + interleaver = interleaver + 1; + + Nframes = 100; + uw = [1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0]; + + Nc = 18; + + % repeat same simulated vocoder data to ease testing + + vd = round( rand( 1, nbitspervocoderframe*nvocoderframes) ); + + % Decoder: Sync with LDPC frames, de-interleave, LDPC decode, strip off UW, measure BER ------- + + mcwfilename = strcat(filename,"_modcodeword.bin"); + fm=fopen(mcwfilename,"rb"); + etfilename = strcat(filename,"_modcodeword_et.bin"); + fet=fopen(etfilename ,"rb"); + epfilename = strcat(filename,".err"); + fep=fopen(epfilename ,"wb"); + printf("Input QPSK symbols: %s\n", mcwfilename); + if (fet == -1) + printf("Input entered track file: none\n"); + else + printf("Input entered track file: %s\n", etfilename); + end + printf("Output error pattern file: %s\n", epfilename); + + mod_uw = build_mod_uw(uw, 2*length(vd)/length(uw)); + + mod_codeword = zeros(1, code_param.code_bits_per_frame/2); + lmod_codeword = code_param.code_bits_per_frame/2; + + Terrs = 0; Trawerrs = 0; Ferrs = 0; Tbits = 0; Tframes = 0; nerr = []; nrawerr = []; + corr = []; n = 0; + sync_state = 0; sync_count = 0; + mod_unpackedmodem_log = []; + sync_state_log = []; + entered_track_log = []; + sig_pwr_log = []; + + symbols = erasures = 0; + + [mod_unpackedmodem_float32, count] = fread(fm,nbitspermodemframe, "float32"); + if (fet == -1) + entered_track = 0; + else + entered_track = fread(fet, 1, "int"); + end + + while (count == nbitspermodemframe) + n++; + + mod_unpackedmodem = mod_unpackedmodem_float32(1:2:nbitspermodemframe) + j*mod_unpackedmodem_float32(2:2:nbitspermodemframe); + mod_unpackedmodem_log = [mod_unpackedmodem_log mod_unpackedmodem]; + %erasures = rand(1,length(mod_unpackedmodem)) < Eprob; + %mod_unpackedmodem(erasures) = 0; + + % keep buffer of one entire codeword + + mod_codeword(1:lmod_codeword-length(mod_unpackedmodem)) = mod_codeword(length(mod_unpackedmodem)+1:lmod_codeword); + mod_codeword(lmod_codeword-length(mod_unpackedmodem)+1:lmod_codeword) = mod_unpackedmodem; + + [uw_sync corr(n)] = look_for_uw(mod_codeword(1:length(mod_uw)), mod_uw); + + next_sync_state = sync_state; + if ((sync_state == 0) && (uw_sync == 1)) + next_sync_state = 1; + sync_count = 0; + end + if ((sync_state == 1) && (entered_track != 0)) + next_sync_state = 0; + end + sync_state = next_sync_state; + sync_state_log = [sync_state_log sync_state]; + entered_track_log = [entered_track_log entered_track]; + + if (sync_state && (sync_count == 0)) + Tframes++; + + % remove UW symbols + + mod_codeword_no_uw = remove_uw_symbols(mod_codeword, code_param.data_bits_per_frame/2 - length(uw)/2, length(uw)/2); + mod_codeword_no_uw = [mod_codeword_no_uw mod_codeword((code_param.data_bits_per_frame/2+1):code_param.code_bits_per_frame/2)]; + + % de-interleave + + tmp = deinterleave_symbols(interleaver, mod_codeword_no_uw); + + % insert known symbols at end of data + + mod_codeword_deinter = [ tmp(1:(code_param.data_bits_per_frame/2 - length(uw)/2)) ... + ones(1,length(uw)/2) * qpsk_mod([0 0]) ... + tmp((code_param.data_bits_per_frame/2 - length(uw)/2+1):length(tmp)) ]; + + % determine BER stats of raw data before decoding + + raw_bits = zeros(1, code_param.data_bits_per_frame - length(uw)); + for i=1:(code_param.data_bits_per_frame - length(uw))/2 + raw_bits(2*(i-1)+1:2*i) = qpsk_demod(mod_codeword_deinter(i)); + end + error_positions = xor(vd, raw_bits); + Nerrs = sum(error_positions); + Trawerrs += Nerrs; + nrawerr(Tframes) = Nerrs; + + % Determine Es/N for each carrier. For this codeword we assume + % across codeword (currently 320ms) signal is stationary. + % So for each carrier signal level is constant, so we can + % average across all symols of that carrier to get a better + % estimate of the carrier power. The spectral noise density + % No will be the same for the bandwidth of each carrier. So + % we can use noise samples from all symbols together to get + % a better estimate of the noise power. + + sig_pwr(Tframes,:) = zeros(1,Nc); + noise_samples = []; + for n=1:Nc + + % extract a vector of one carrier's symbols for this codeword + % rotate so that decision boundaries are now real and imag axis + + r = mod_codeword(n:Nc:length(mod_codeword)) .* exp(j*pi/4); + + sig_est = mean(abs(r)); + + % The noise is the variance of symbols (samples) about the actual symbol position + % we reflect all symbols into the first quadrant to simplify things, as the actual + % received symbol isn't matter, just the noise around it. We model the received + % symbol based on the estimated signal level. + + refl_symbols = abs(real(r)) + j*abs(imag(r)); + est_symbols = exp(j*pi/4)*sig_est*ones(1,length(r)); + noise_samples = [ noise_samples (est_symbols - refl_symbols)]; + + sig_pwr(Tframes,n) = sig_est .^ 2; + end + noise_pwr(Tframes) = var(noise_samples); + %plot(real(refl_symbols), imag(refl_symbols), '+'); + %hold on; + %plot(real(exp(j*pi/4)*sig_est*ones(1,length(r))), imag(exp(j*pi/4)*sig_est*ones(1,length(r))), 'r+'); + %hold off; + %printf("SNR: %f\n", 10*log10(sig_est*sig_est/noise_pwr(Tframes))); + + % Set erasures for carrier beneath a certain Es/N + + for n=1:Nc + symbols++; + EsN(n) = 10*log10(sig_pwr(Tframes,n)/noise_pwr(Tframes)); + if (EsN(n) < 1) + %mod_codeword(n:Nc:length(mod_codeword)) = 0; + %printf("Tframes: %d n: %d EsN = %3.2fdB\n", Tframes, n, EsN(n)); + erasures++; + end + end + + % De-interleave again with erasures set ---------------------- + + % remove UW symbols + + mod_codeword_no_uw = remove_uw_symbols(mod_codeword, code_param.data_bits_per_frame/2 - length(uw)/2, length(uw)/2); + mod_codeword_no_uw = [mod_codeword_no_uw mod_codeword((code_param.data_bits_per_frame/2+1):code_param.code_bits_per_frame/2)]; + + tmp = deinterleave_symbols(interleaver, mod_codeword_no_uw); + + % insert known symbols at end of data + + mod_codeword_deinter = [ tmp(1:(code_param.data_bits_per_frame/2 - length(uw)/2)) ... + ones(1,length(uw)/2) * qpsk_mod([0 0]) ... + tmp((code_param.data_bits_per_frame/2 - length(uw)/2+1):length(tmp)) ]; + + % LDPC decode ------------------------------------------------ + + detected_data = ldpc_dec(code_param, max_iterations, demod_type, decoder_type, mod_codeword_deinter, EsNo); + + % unpack payload data, removing UW + + vd_rx = detected_data(1:(code_param.data_bits_per_frame - length(uw))); + + % measure coded BER + + error_positions = xor(vd, vd_rx); + Nerrs = sum(error_positions); + if Nerrs>0, fprintf(1,'x'); Ferrs++; , else fprintf(1,'.'), end + Tbits += length(vd); + Terrs += Nerrs; + nerr(Tframes) = Nerrs; + + % save error patterns is simulated vocoder data to disk + + fwrite(fep, error_positions, "short"); + + end + + if (sync_state) + sync_count++; + if (sync_count == 8) + sync_count = 0; + end + end + + % read in one modulated modem frame at a time + + [mod_unpackedmodem_float32, count] = fread(fm, nbitspermodemframe, "float32"); + if (fet == -1) + entered_track = 0; + else + entered_track = fread(fet, 1, "int"); + end + end + + fclose(fep); + + printf("\nFrames: %d bits: %d errors: %d Raw BER = %f Coded BER = %f FER = %f\n", Tframes, Tbits, Terrs, Trawerrs/Tbits, Terrs/Tbits, Ferrs/Tframes); + printf("Symbols: %d Erasures: %d %f\n", symbols, erasures, erasures/symbols); + figure(8) + clf; + [n m] = size(mod_unpackedmodem_log); + plot( real(mod_unpackedmodem_log), imag(mod_unpackedmodem_log), '+') + axis([-2 2 -2 2]); + title('Scatter Diagram'); + + figure(9) + subplot(311) + plot(sync_state_log); + subplot(312) + plot(nrawerr); + subplot(313) + plot(nerr); + + figure(10); + plot(10*log10(sig_pwr(:,3)./noise_pwr(:)),'b'); + hold on; + plot(10+10*log10(noise_pwr(:))); + plot(10+10*log10(sig_pwr(:,3)),'r'); +% for n=2:Nc +% plot(n*10+10*log10(sig_pwr(:,n)./noise_pwr(:,n))); +% plot(n*10+10*log10(sig_pwr(:,n)),'r'); +% end + hold off; + + y = 1:Tframes; + x = 1:Nc; + z = 10*log10(sig_pwr(:,:)./((noise_pwr(:)*ones(1, Nc)))); + %printf("mean SNR = %3.2fdB\n", mean(z)); + figure(11); + imagesc(x,y,z); + figure(12); + mesh(x,y,z); + axis([1 Nc 1 Tframes 5 15]); + +endfunction diff --git a/codec2/tags/0.4.1/octave/ldpcenc.m b/codec2/tags/0.4.1/octave/ldpcenc.m new file mode 100644 index 00000000..023c5172 --- /dev/null +++ b/codec2/tags/0.4.1/octave/ldpcenc.m @@ -0,0 +1,125 @@ +% ldpcenc.m +% David Rowe 20 Dec 2013 +% +% LDPC encoder function. Takes a random data pattern, LDPC Encodes and +% inserts Unique Word (UW) sync bits and ouputs this as a packed +% binary file suitable for the Nc=18 carrier FDMDV modulator, +% fdmdv_mod. Also produces a "modulated" output file of QPSK +% symbols, suitable for feeding into ldpcdec for testing. + +function ldpcenc(filename) + + % Start CML library + + currentdir = pwd; + addpath '/home/david/tmp/cml/mat' % assume the source files stored here + cd /home/david/tmp/cml + CmlStartup % note that this is not in the cml path! + cd(currentdir) + + % Our LDPC library + + ldpc; + + % Start simulation + + rand('state',1); + + rate = 3/4; + framesize = 576; + + mod_order = 4; + modulation = 'QPSK'; + mapping = 'gray'; + + demod_type = 0; + decoder_type = 0; + max_iterations = 100; + + nbitspervocoderframe = 52; + nvocoderframes = 8; + nbitspermodemframe = 72; + + code_param = ldpc_init(rate, framesize, modulation, mod_order, mapping); + + data = []; + r = []; + load interleaver.txt + interleaver = interleaver + 1; + + % Encoder: Generate simulated vocoder data + % LPDC encode + % interleave + % insert UW bits + + Nframes = 100; + uw = [1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0]; + + % repeat same simulated vocoder data to ease testing + + vd = round( rand( 1, nbitspervocoderframe*nvocoderframes) ); + + % pad data with zeros the size of UW + + vdpad = [vd zeros(1, length(uw))]; + + % LDPC encode + + [codewordpad, s] = ldpc_enc(vdpad, code_param); + code_param.code_bits_per_frame = length(codewordpad); + code_param.symbols_per_frame = length(s); + + % remove padded zeros after encoding to leave room for UW bits (code + % is systematic) + + codeword = [ codewordpad(1:length(vd)) codewordpad((length(vd)+length(uw)+1):length(codewordpad)) ]; + + % interleave, insert UW bits, and pack bits (as C modulator likes packed bits) + + codeword_interleaved = interleave_bits(interleaver, codeword); + codeword_interleaved_uw = [insert_uw(codeword_interleaved(1:length(vd)), uw) codeword_interleaved(length(vd)+1:length(codeword_interleaved)) ]; + packedcodeword = packmsb(codeword_interleaved_uw); + + cwfilename = strcat(filename,"_codeword.bin"); + fc=fopen(cwfilename,"wb"); + for nn = 1: Nframes + fwrite(fc,packedcodeword,"uchar"); + end + fclose(fc); + + %printf("framesize: %d data_bits_per_frame: %d code_bits_per_frame: %d\n", ... + % framesize, code_param.data_bits_per_frame, code_param.code_bits_per_frame); + + printf("Encoded %d LDPC codewords, saved in packed file: %s\n", Nframes, cwfilename); + + % Modulator: Modulate to QPSK symbols ------------------------------------------ + + nbytespackedcodeword=length(packedcodeword); + fc=fopen(cwfilename,"rb"); + mcwfilename = strcat(filename,"_modcodeword.bin"); + fm=fopen(mcwfilename,"wb"); + nbytespackedmodemframe = nbitspermodemframe/8; + n = 0; + + [packedmodem, count] = fread(fc,nbytespackedmodemframe,"uchar"); + while (count == nbytespackedmodemframe) + n++; + unpackedmodem = unpackmsb(packedmodem); + + ii = 1; + for i=1:2:length(unpackedmodem) + mod_unpackedmodem(ii) = qpsk_mod(unpackedmodem(i:i+1)); + mod_unpackedmodem_float32(i) = real(mod_unpackedmodem(ii)); + mod_unpackedmodem_float32(i+1) = imag(mod_unpackedmodem(ii)); + ii += 1; + end + + fwrite(fm, mod_unpackedmodem_float32, "float32"); + [packedmodem, count] = fread(fc,nbytespackedmodemframe,"uchar"); + end + fclose(fc); + fclose(fm); + printf("Modulated %d modem frames to file: %s\n", n, mcwfilename); +endfunction + + diff --git a/codec2/tags/0.4.1/octave/ldpcut.m b/codec2/tags/0.4.1/octave/ldpcut.m new file mode 100644 index 00000000..f6d787ef --- /dev/null +++ b/codec2/tags/0.4.1/octave/ldpcut.m @@ -0,0 +1,157 @@ +% ldpcut.m +% +% David Rowe 18 Dec 2013 +% +% Octave LDPC unit test script, based on simulation by Bill Cowley VK5DSP +% + +% Start CML library (see CML set up instructions in ldpc.m) + +currentdir = pwd; +addpath '/home/david/tmp/cml/mat' % assume the source files stored here +cd /home/david/tmp/cml +CmlStartup % note that this is not in the cml path! +cd(currentdir) + +% Our LDPC library + +ldpc; + +function sim_out = run_simulation(sim_in) + + rate = sim_in.rate; + framesize = sim_in.framesize; + Ntrials = sim_in.Ntrials; + EsNodBvec = sim_in.EsNodBvec; + verbose = sim_in.verbose; + + % Start simulation + + mod_order = 4; + modulation = 'QPSK'; + mapping = 'gray'; + + demod_type = 0; + decoder_type = 0; + max_iterations = 100; + + code_param = ldpc_init(rate, framesize, modulation, mod_order, mapping); + + for ne = 1:length(EsNodBvec) + EsNodB = EsNodBvec(ne); + EsNo = 10^(EsNodB/10); + variance = 1/EsNo; + + Tbits = Terrs = Ferrs = 0; + + tx_bits = []; + tx_symbols = []; + rx_symbols = []; + + % Encode a bunch of frames + + for nn = 1: Ntrials + atx_bits = round(rand( 1, code_param.data_bits_per_frame)); + tx_bits = [tx_bits atx_bits]; + [tx_codeword atx_symbols] = ldpc_enc(atx_bits, code_param); + tx_symbols = [tx_symbols atx_symbols]; + end + + % Add AWGN noise, 0.5 factor ensures var(noise) == variance , i.e. splits power between Re & Im + + noise = sqrt(variance*0.5)*(randn(1,length(tx_symbols)) + j*randn(1,length(tx_symbols))); + rx_symbols = tx_symbols + noise; + + % Decode a bunch of frames + + for nn = 1: Ntrials + st = (nn-1)*code_param.symbols_per_frame + 1; + en = (nn)*code_param.symbols_per_frame; + arx_codeword = ldpc_dec(code_param, max_iterations, demod_type, decoder_type, rx_symbols(st:en), EsNo, ones(1,code_param.symbols_per_frame)); + st = (nn-1)*code_param.data_bits_per_frame + 1; + en = (nn)*code_param.data_bits_per_frame; + error_positions = xor(arx_codeword(1:code_param.data_bits_per_frame), tx_bits(st:en)); + Nerrs = sum( error_positions); + + if verbose == 2 + % print "." if frame decoded without errors, 'x' if we can't decode + + if Nerrs > 0, printf('x'), else printf('.'), end + if (rem(nn, 50)==0), printf('\n'), end + end + + if Nerrs > 0, Ferrs = Ferrs + 1; end + Terrs = Terrs + Nerrs; + Tbits = Tbits + code_param.data_bits_per_frame; + end + + if verbose + printf("\nEsNodB: %3.2f BER: %f Tbits: %d Terrs: %d Ferrs: %d\n", EsNodB, Terrs/Tbits, Tbits, Terrs, Ferrs) + end + + sim_out.Tbits(ne) = Tbits; + sim_out.Terrs(ne) = Terrs; + sim_out.Ferrs(ne) = Ferrs; + sim_out.BER(ne) = Terrs/Tbits; + sim_out.FER(ne) = Ferrs/Ntrials; + end + +endfunction + +% START SIMULATIONS --------------------------------------------------------------- + +more off; + +% 1/ Simplest possible one frame simulation --------------------------------------- + +printf("Test 1\n------\n"); + +mod_order = 4; +modulation = 'QPSK'; +mapping = 'gray'; +framesize = 576; % CML library has a bunch of different framesizes available +rate = 1/2; +demod_type = 0; +decoder_type = 0; +max_iterations = 100; +EsNo = 10; % decoder needs an estimated channel EsNo (linear ratio, not dB) + +code_param = ldpc_init(rate, framesize, modulation, mod_order, mapping); +tx_bits = round(rand(1, code_param.data_bits_per_frame)); +[tx_codeword, qpsk_symbols] = ldpc_enc(tx_bits, code_param); +rx_codeword = ldpc_dec(code_param, max_iterations, demod_type, decoder_type, qpsk_symbols, EsNo); + +errors_positions = xor(tx_bits, rx_codeword(1:framesize*rate)); +Nerr = sum(errors_positions); +printf("Nerr: %d\n\n", Nerr); + +% 2/ Run a bunch of trials at just one EsNo point -------------------------------------- + +printf("Test 2\n------\n"); + +sim_in.rate = 0.5; +sim_in.framesize = 2*576; +sim_in.verbose = 2; +sim_in.Ntrials = 100; +sim_in.EsNodBvec = 5; +run_simulation(sim_in); + +% 3/ Lets draw a Eb/No versus BER curve ------------------------------------------------- + +printf("\n\nTest 3\n------\n"); + +sim_in.EsNodBvec = -2:10; +sim_out = run_simulation(sim_in); + +EbNodB = sim_in.EsNodBvec - 10*log10(2); % QPSK has two bits/symbol +uncoded_BER_theory = 0.5*erfc(sqrt(10.^(EbNodB/10))); + +figure(1) +clf +semilogy(EbNodB, uncoded_BER_theory,'r;uncoded QPSK theory;') +hold on; +semilogy(EbNodB-10*log10(sim_in.rate), sim_out.BER,'g;LDPC coded QPSK simulation;'); +hold off; +grid('minor') +xlabel('Eb/No (dB)') +ylabel('BER') diff --git a/codec2/tags/0.4.1/octave/linreg.m b/codec2/tags/0.4.1/octave/linreg.m new file mode 100644 index 00000000..666b65c6 --- /dev/null +++ b/codec2/tags/0.4.1/octave/linreg.m @@ -0,0 +1,35 @@ +% linreg.m +% David Rowe April 2015 +% +% Based on: +% http://stackoverflow.com/questions/5083465/fast-efficient-least-squares-fit-algorithm-in-c +% +% finds y = mx + b to best fit n points x and y + +function [m b] = linreg(x,y,n) + sumx = 0.0; % sum of x + sumx2 = 0.0; % sum of x^2 + sumxy = 0.0; % sum of x * y + sumy = 0.0; % sum of y + sumy2 = 0.0; % sum of y**2 + + for i=1:n + sumx += x(i); + sumx2 += x(i)^2; + sumxy += x(i) * y(i); + sumy += y(i); + sumy2 += y(i)^2; + end + + denom = (n * sumx2 - sumx*sumx); + + if denom == 0 + % singular matrix. can't solve the problem. + m = 0; + b = 0; + else + m = (n * sumxy - sumx * sumy) / denom; + b = (sumy * sumx2 - sumx * sumxy) / denom; + end + +endfunction diff --git a/codec2/tags/0.4.1/octave/load_raw.m b/codec2/tags/0.4.1/octave/load_raw.m new file mode 100644 index 00000000..1f7868d4 --- /dev/null +++ b/codec2/tags/0.4.1/octave/load_raw.m @@ -0,0 +1,8 @@ +% load_raw.m +% David Rowe 7 Oct 2009 + +function s = load_raw(fn) + fs=fopen(fn,"rb"); + s = fread(fs,Inf,"short"); + plot(s) +endfunction diff --git a/codec2/tags/0.4.1/octave/lpcauto.m b/codec2/tags/0.4.1/octave/lpcauto.m new file mode 100644 index 00000000..6895ca23 --- /dev/null +++ b/codec2/tags/0.4.1/octave/lpcauto.m @@ -0,0 +1,116 @@ +function [ar,e,k]=lpcauto(s,p,t) +%LPCAUTO performs autocorrelation LPC analysis [AR,E,K]=(S,P,T) +% Inputs: +% s(ns) is the input signal +% p is the order (default: 12) +% t(nf,3) specifies the frames size details: each row specifies +% up to three values per frame: [len anal skip] where: +% len is the length of the frame (default: length(s)) +% anal is the analysis length (default: len) +% skip is the number of samples to skip at the beginning (default: 0) +% If t contains only one row, it will be used repeatedly +% until there are no more samples left in s. +% +% Outputs: +% ar(nf,p+1) are the AR coefficients with ar(1) = 1 +% e(nf) is the energy in the residual. +% sqrt(e) is often called the 'gain' of the filter. +% k(nf,2) gives the first and last sample of the analysis interval + +% Notes: +% +% (1) The first frame always starts at sample s(1) and the analysis window starts at s(t(1,3)+1). +% (2) The elements of t need not be integers. +% (3) The analysis interval is always multiplied by a hamming window +% (4) As an example, if p=3 and t=[10 5 2], then the illustration below shows +% successive frames labelled a, b, c, ... with capitals for the +% analysis regions. Note that the first frame starts at s(1) +% +% a a A A A A A a a a b b B B B B B b b b c c C C C C C c c c d ... +% +% For speech processing, it can be advantageous to restrict the analysis regions +% to time intervals when the glottis is closed. +% +% (5) Frames can overlap: e.g. t=[10 20] will use analysis frames of +% length 20 overlapped by 10 samples. +% (6) For speech processing p should be at least 2*f*l/c where f is the sampling +% frequency, l the vocal tract length and c the speed of sound. For a typical +% male (l=17 cm) this gives f/1000. + +% Copyright (C) Mike Brookes 1997 +% Version: $Id: lpcauto.m 713 2011-10-16 14:45:43Z dmb $ +% +% VOICEBOX is a MATLAB toolbox for speech processing. +% Home page: http://www.ee.ic.ac.uk/hp/staff/dmb/voicebox/voicebox.html +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% This program is free software; you can redistribute it and/or modify +% it under the terms of the GNU General Public License as published by +% the Free Software Foundation; either version 2 of the License, or +% (at your option) any later version. +% +% 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 can obtain a copy of the GNU General Public License from +% http://www.gnu.org/copyleft/gpl.html or by writing to +% Free Software Foundation, Inc.,675 Mass Ave, Cambridge, MA 02139, USA. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +s = s(:); % make it a column vector +if nargin < 2 p=12; end; +if nargin < 3 t=length(s); end; +%if nargin < 4 w='ham'; end; +[nf,ng]=size(t); +if ng<2 t=[t t]; end; +if ng<3 t=[t zeros(nf,1)]; end; +if nf==1 + nf=floor(1+(length(s)-t(2)-t(3))/t(1)); + tr=0; +else + tr=1; +end; + +ar=zeros(nf,p+1); +ar(:,1)=1; +e=zeros(nf,1); + +t1=1; +it=1; +nw=-1; +zp=zeros(1,p); +r=(0:p); +for jf=1:nf + k(jf,1) = ceil(t1+t(it,3)); + k(jf,2) = ceil(t1+t(it,3)+t(it,2)-1); + cs = (k(jf,1):k(jf,2)).'; + nc = length(cs); + pp=min(p,nc); + dd=s(cs); + if nc~=nw + % possibly we should have a window whose square integral equals unity + ww=hamming(nc); nw=nc; + y=zeros(1,nc+p); + c=(1:nc)'; + end + wd=dd(:).*ww; % windowed data vector + y(1:nc)=wd; % data vector with p appended zeros + z=zeros(nc,pp+1); % data matrix + % was previously z(:)=y(c(:,ones(1,pp+1))+r(ones(nc,1),1:pp+1)); + z(:)=y(repmat(c,1,pp+1)+repmat(r,nc,1)); + rr=wd'*z; + rm=toeplitz(rr(1:pp)); + rk=rank(rm); + if rk + if rk n + a = a'; + end + m = length(a)-1; + pz = [a,0] - [0 fliplr(a)]; + qz = [a,0] + [0 fliplr(a)]; + angpz = sort(angle(roots(pz))); + angpz = angpz(find(angpz > 0)); + angqz = sort(angle(roots(qz))); + angqz = angqz(find(angqz > 0 & angqz < pi)); + w = zeros(1,m); + j = 1:(m/2); + w(2*j) = angpz'; + w(2*j-1) = angqz'; +endfunction + +% +% Given input Line spectral pair (LSP) parameters of an AR filter, +% this function calculates the corresponding AR filter parameters +% +% Author : Madhukar Budagavi +% + +function a=lsptoa(w) + + [m,n] = size(w); + if m > n + w = w'; + end + m = length(w); + pz = 1; + qz = 1; + for j = 1:(m/2), + pz = conv(pz,[1 -2*cos(w(2*j)) 1]); + qz = conv(qz,[1 -2*cos(w(2*j-1)) 1]); + end + pz = conv([1 -1],pz); + qz = conv([1 1],qz); + a = (pz+qz)/2; + a = a(1:(m+1)); + +endfunction diff --git a/codec2/tags/0.4.1/octave/lsp_pdf.m b/codec2/tags/0.4.1/octave/lsp_pdf.m new file mode 100644 index 00000000..4fc1359a --- /dev/null +++ b/codec2/tags/0.4.1/octave/lsp_pdf.m @@ -0,0 +1,91 @@ +% lsp_pdf.m +% David Rowe 2 Oct 2009 +% Plots histograms (PDF estimates) of LSP training data + +function lsp_pdf(lsp) + [r,c] = size(lsp); + + % LSPs + + figure(1); + clf; + [x,y] = hist(lsp(:,1),100); + plot(y*4000/pi,x,"+;1;"); + hold on; + for i=2:5 + [x,y] = hist(lsp(:,i),100); + legend = sprintf("+%d;%d;",i,i); + plot(y*4000/pi,x,legend); + endfor + for i=6:c + [x,y] = hist(lsp(:,i),100); + legend = sprintf("+%d;%d;",i-5,i); + plot(y*4000/pi,x,legend); + endfor + hold off; + grid; + + % LSP differences + + figure(2); + clf; + subplot(211) + [x,y] = hist(lsp(:,1),100); + plot(y*4000/pi,x,"1;1;"); + hold on; + for i=2:5 + [x,y] = hist(lsp(:,i) - lsp(:,i-1),100); + legend = sprintf("%d;%d;",i,i); + plot(y*4000/pi,x,legend); + endfor + hold off; + grid; + + subplot(212) + [x,y] = hist(lsp(:,6)-lsp(:,5),100); + plot(y*4000/pi,x,"1;6;"); + hold on; + for i=7:c + [x,y] = hist(lsp(:,i) - lsp(:,i-1),100); + legend = sprintf("%d;%d;",i-5,i); + plot(y*4000/pi,x,legend); + endfor + hold off; + grid; + + % LSP differences delta from last frame + + lspd(:,1) = lsp(:,1); + lspd(:,2:10) = lsp(:,2:10) - lsp(:,1:9); + + [m,n] = size(lspd); + lspdd = lspd(5:m,:) - lspd(1:m-4,:); + + figure(3); + clf; + subplot(211) + for i=1:5 + [x,y] = hist(lspdd(:,i),100); + legend = sprintf("%d;%d;",i,i); + plot(y*4000/pi,x,legend); + hold on; + endfor + hold off; + grid; + axis([-200 200 0 35000]); + + subplot(212) + for i=6:10 + [x,y] = hist(lspdd(:,i),100); + legend = sprintf("%d;%d;",i-5,i); + plot(y*4000/pi,x,legend); + hold on; + endfor + hold off; + grid; + axis([-200 200 0 16000]); + + figure(4); + clf; + plot((4000/pi)*(lsp(2:r,3)-lsp(1:r-1,3))) +endfunction diff --git a/codec2/tags/0.4.1/octave/lspvar.m b/codec2/tags/0.4.1/octave/lspvar.m new file mode 100644 index 00000000..aa4e245a --- /dev/null +++ b/codec2/tags/0.4.1/octave/lspvar.m @@ -0,0 +1,57 @@ +% lspvar.m +% David Rowe 8 Feb 2015 +% +% Experiments in reducing LSP variance in order to make quantisation easier + +lsp; +close all; +graphics_toolkit ("gnuplot"); + +function v = det_var(s) + p = 10; + ak=lpcauto(s,p,[160 80]); + [rows cols] = size(ak); + w = zeros(rows,p); + for r=1:rows + w(r,:) = atolsp(ak(r,:)); + end + v = sum(var(w)); + figure; + plot(w) +end + +s=load_raw("../raw/cq_ref.raw"); +det_var(s) + +if 1 + Fs = 8000; + [b a] = cheby2(6,40,[300 2600]/(Fs/2)); + s1 = filter(b,a,s); + det_var(s1) +end + +% + Equalise to remove spectral slope, this reduces variance of spectral +% envelope +% + Can probably get rid of energy for many vectors too, except flat ones? +% + Or have some sort of correlation of gain with peakiness of vectors? +% + Once flattened try slicing out low energy harmonics, like post filter. How +% does this sound? Any artefacts of harmonics coming and going near +% thresholds? +% + BPF as well, it's all abt minimal information. +% + What's left? Look at it. How can it be represented? Look at tol distort, +% what quantiser will deliver that? Just position of clipped peaks? +% + fall back HF mode, no energy, voicing, just spectral information. Diveristy +% compared to FEC? Test with simulation of ideal code. Aux carrier with +% extra information to get 1300-ish quality. Coherent, pilot assisted demod. +% Low PAPR as extra carriers at lower power level. Essentially for free in +% terms of TX power. +% + What is a viable plan to get this going in a mon month or so? +% + Octave equlaisation of input files +% + take model files, simulate quantisation, back to C for synth? +% + Coherent FDM modem port to C + + + + + + diff --git a/codec2/tags/0.4.1/octave/lspwarp.m b/codec2/tags/0.4.1/octave/lspwarp.m new file mode 100644 index 00000000..2d2f2c99 --- /dev/null +++ b/codec2/tags/0.4.1/octave/lspwarp.m @@ -0,0 +1,40 @@ +% lspwarp.m +% David Rowe Sep 2012 +% +% Experimenting with non-linear LSP frequency axis for LSP quantisation +% Plots a scaled mel axis. + +1; + +function mel = freq2mel(f) + mel = 70*log10(1 + f/700); +endfunction + +function freq = mel2freq(m) + freq = 700*(10 ^ (m/70) - 1); +endfunction + +x = []; y = []; + +for freq = 100:25:4000 + mel = freq2mel(freq); + x = [x freq]; + y = [y mel]; +end + +plot(x,y) +grid + +mel_start = floor(freq2mel(100)); +mel_end = floor(freq2mel(4000)); + +x = []; y = []; +for mel=mel_start:mel_end + freq = mel2freq(mel); + x = [x freq]; + y = [y mel]; +end + +hold on; +plot(x,y, '+') +hold off; diff --git a/codec2/tags/0.4.1/octave/make_hilb.m b/codec2/tags/0.4.1/octave/make_hilb.m new file mode 100644 index 00000000..35d4e55e --- /dev/null +++ b/codec2/tags/0.4.1/octave/make_hilb.m @@ -0,0 +1,51 @@ +% make_hilb.m +% David Rowe May 2015 +% +% creates Hilber Transformer FIR coeffs + +graphics_toolkit ("gnuplot"); + +ht_n = 100; +imp = [1 zeros(1,ht_n-1)]; +ht_coeff = fftshift(hilbert(imp)) .* hanning(ht_n)'; + +figure(1) +subplot(211) +plot(real(ht_coeff)) +subplot(212) +plot(imag(ht_coeff)) + +figure(2) +plot(20*log10(abs(fft(ht_coeff)))) + +% test it + +n=1:8000; +w = 2*pi/4; +x = cos(n*w); +figure(3) +y = filter(ht_coeff,1,x); +figure(3) +subplot(211) +plot(y(800:8000)) +subplot(212) +plot(20*log10(abs(fft(y(800:8000))))) + +% 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", ht_n); + +fprintf(f,"COMP ht_coeff[]={\n"); +for r=1:ht_n + if r < ht_n + fprintf(f, " {%f,%f},\n", real(ht_coeff(r)), imag(ht_coeff(r))); + else + fprintf(f, " {%f,%f}\n};", real(ht_coeff(r)), imag(ht_coeff(r))); + end +end + +fclose(f); diff --git a/codec2/tags/0.4.1/octave/make_ssbfilt.m b/codec2/tags/0.4.1/octave/make_ssbfilt.m new file mode 100644 index 00000000..b1bb3474 --- /dev/null +++ b/codec2/tags/0.4.1/octave/make_ssbfilt.m @@ -0,0 +1,36 @@ +% make_ssbfilt.m +% David Rowe May 2015 +% +% creates SSB filter FIR coeffs + +graphics_toolkit ("gnuplot"); + +ssbfilt_n = 100; +Fs = 8000; + +ssbfilt_coeff = fir2(ssbfilt_n,[0 400 600 2200 2600 4000]/(Fs/2),[0.001 0.001 1 1 0.001 0.001]); + +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,"/* 600 - 2600 Hz FIR filter coeffs */\n"); +fprintf(f,"/* Generated by make_ssbfilt Octave script */\n"); + +fprintf(f,"\n#define SSBFILT_N %d\n\n", ssbfilt_n); + +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/codec2/tags/0.4.1/octave/melstats.m b/codec2/tags/0.4.1/octave/melstats.m new file mode 100644 index 00000000..d3735597 --- /dev/null +++ b/codec2/tags/0.4.1/octave/melstats.m @@ -0,0 +1,49 @@ +% melstats.m +% David Rowe April 2015 +% +% plots some stats of mel/lsp quantisers + +function melstats(filename) + + mel = load(filename); + [m n] = size(mel); + nbins = 10; + + % histograms of each value + + figure(1) + clf + subplot(211) + [h x] = hist(mel(:,1),nbins); + plot(x,h,"1"); + hold on + + for i=2:n + [h x] = hist(mel(:,i),nbins); + colour = sprintf("%d",i); + plot(x,h,colour); + end + hold off + + % histograms differences + + subplot(212) + [h x] = hist(mel(:,1),nbins); + plot(x,h,"1"); + hold on + + for i=2:n + [h x] = hist(mel(:,i)-mel(:,i-1),nbins); + colour = sprintf("%d",i); + plot(x,h, colour); + end + hold off + + figure(2) + plot(mel(:,1),mel(:,2),'r+') + hold on; + plot(mel(:,3),mel(:,4),'g+') + plot(mel(:,5),mel(:,6),'b+') + hold off; + +endfunction diff --git a/codec2/tags/0.4.1/octave/melvq.m b/codec2/tags/0.4.1/octave/melvq.m new file mode 100644 index 00000000..b31d1cb6 --- /dev/null +++ b/codec2/tags/0.4.1/octave/melvq.m @@ -0,0 +1,168 @@ +% melvq.m +% David Rowe Aug 2015 +% +% Experimenting with VQ design for mel LSPs + +% todo: +% [ ] Sorting inside search what happens if we get a order issue, fix and calc SD +% [ ] Search to avoid a worst case error rather than average? This could be included +% in training. +% [ ] nested/staged search + +1; + +% train up multi-stage VQ +% ~/codec2-dev/build_linux/src$ sox -r 8000 -s -2 ../../wav/all.wav -t raw -r 8000 -s -2 - sinc 300 sinc -2600 | ./c2sim - --lpc 6 --lpcpf --lspmel --dump all -o - | play -t raw -r 8000 -s -2 - vol 3 +% +% octave:> load ../build_linux/src/all_mel.txt +% octave:> melvq; vq = trainvq(all_mel, 64, 3); +% octave:> save vq + +function vq = trainvq(training_data, Nvec, stages) + + vq = []; + for i=1:stages + [idx centers] = kmeans(training_data, Nvec); + quant_error = centers(idx,:) - training_data; + printf("mse stage %d: %f\n", i, mean(std(quant_error))); + training_data = quant_error; + vq(:,:,i) = centers; + end + +end + + +function [mse_list index_list] = search_vq(vq, target, m) + + [Nvec order] = size(vq); + + mse = zeros(1, Nvec); + + % find mse for each vector + + for i=1:Nvec + mse(i) = sum((target - vq(i,:)) .^2); + end + + % sort and keep top m matches + + [mse_list index_list ] = sort(mse); + + mse_list = mse_list(1:m); + index_list = index_list(1:m); + +endfunction + + +% Search multi-stage VQ, retaining m best candidates at each stage + +function [res output_vecs ind] = mbest(vqset, input_vecs, m) + + [Nvec order stages] = size(vqset); + [Ninput tmp] = size(input_vecs); + + res = []; % residual error after VQ + output_vecs = []; % quantised ouput vectors + ind = []; % index of vqs + + for i=1:Ninput + + % first stage, find mbest candidates + + [mse_list index_list] = search_vq(vqset(:,:,1), input_vecs(i,:), m); + cand_list = [mse_list' index_list']; + cand_list = sortrows(cand_list,1); + + % subsequent stages ........... + + for s=2:stages + + % compute m targets for next stage, and update path + + prev_indexes = zeros(m,s-1); + for t=1:m + target(t,:) = input_vecs(i,:); + for v=1:s-1 + target(t,:) -= vqset(cand_list(t,v+1),:,v); + end + prev_indexes(t,:) = cand_list(t,2:s); + end + + % search stage s using m targets from stage s-1 + % with m targets, we do m searches which return the m best possibilities + % so we get a matrix with one row per candidate, m*m rows total + % prev_indexes provides us with the path through the VQs for each candidate row + + avq = vqset(:,:,s); + cand_list = []; + for t=1:m + [mse_list index_list] = search_vq(avq, target(t,:), m); + x = ones(m,1)*prev_indexes(t,:); + cand_row = [mse_list' x index_list']; + cand_list = [cand_list; cand_row]; + end + + % sort into m best rows + + cand_list = sortrows(cand_list,1); + cand_list = cand_list(1:m,:); + + end + + % final residual + target(1,:) = input_vecs(i,:); + out = zeros(1,order); + for v=1:stages + target(1,:) -= vqset(cand_list(1,v+1),:,v); + out += vqset(cand_list(1,v+1),:,v); + end + res = [res; target(1,:)]; + output_vecs = [output_vecs; out]; + ind = [ind; cand_list(1,2:1+stages)]; + end + +endfunction + + +% Quantises a set of mel-lsps and saves back to disk so they can be read in by c2sim +% assumes we have a vq saved to disk called vq +% +% ~/codec2-dev/build_linux/src$ sox -r 8000 -s -2 ../../wav/vk5qi.wav -t raw -r 8000 -s -2 - sinc 300 sinc -2600 | ./c2sim - --lpc 6 --lpcpf --lspmel --dump vk5qi -o - | play -t raw -r 8000 -s -2 - vol 3 +% +% octave:> test_run("vk5qi") +% +% ~/codec2-dev/build_linux/src$ sox -r 8000 -s -2 ../../wav/vk5qi.wav -t raw -r 8000 -s -2 - sinc 300 sinc -2600 | ./c2sim - --lpc 6 --lpcpf --phase0 --dec 4 --postfilter --lspmel --lspmelread ../../octave/vk5qi_mel_.out -o - | play -t raw -r 8000 -s -2 - vol 3 + +function ind = test_run(samplename) + + more off; + input_vecs_name = sprintf("../build_linux/src/%s_mel.txt", samplename); + input_vecs_name + mel = load(input_vecs_name); + load vq; + [res mel_ ind] = mbest(vq, mel, 5); + mean(std(res)) + + output_vecs_name = sprintf("%s_mel_.out", samplename); + fmel_ = fopen(output_vecs_name,"wb"); + [r c] = size(mel_); + for i=1:r + fwrite(fmel_, mel_(i,:), "float32"); + end + fclose(fmel_); +end + +ind = test_run("hts1a"); + +%load "../build_linux/src/all_mel.txt" +%vq = trainvq(all_mel, 64, 3); +%save vq; + +% [X] save text file of "vq quantised mels" +% [X] load back into c2sim at run time +% [X] train on continuous mels +% [X] sorting/stability +% [X] see how it sounds +% [X] Goal is to get VQ sounding OK, similar to UQ at 20 or 40ms dec, +% [X] sig better than current 700 +% [X] check all indexes used with hist diff --git a/codec2/tags/0.4.1/octave/newamp.m b/codec2/tags/0.4.1/octave/newamp.m new file mode 100644 index 00000000..7d6a39bb --- /dev/null +++ b/codec2/tags/0.4.1/octave/newamp.m @@ -0,0 +1,404 @@ +% newamp.m +% +% Copyright David Rowe 2015 +% This program is distributed under the terms of the GNU General Public License +% Version 2 +% +% Library of Octave functions to explore new ideas in amplitude +% (spectral envelope) modelling. See newamp_fby (frame by frame +% analysis) and newamp_batch (batch processing for listening tests) +% +% we don't care about +% + spectral tilt, in can vary on input and our model shouldnt care. +% We can vary it on output and the listener won't care +% + absolute energy of entire signal +% + harmonics beneath the masking curve +% we do care about: +% + clearly defined formant formation +% + some relative amplitude info, like dominance of HF for UV sounds +% +% TODO: +% [ ] waterfall sounds +% [X] tweak CB bandwidths at LF to be wider +% [ ] consider a floor in mask to interpolate missing bits +% [ ] some sort of filter on min amp/diff from previous peak, e.g. vk5qi:161, 172 +% + min spacing in bark? Make larger at higher freq? +% + or some other measure, like making sure choice minimises MSE +% [ ] way to output at various processing steps, like PF initial mask, pre PF +% [ ] BPF at all? +% [ ] phase model? Fit LPC, just swing phase at peaks? Try no phase tweaks + +1; + +% Create a "decimated mask" model using just a few samples of +% critical band filter centre frequencies. For voiced speech, +% we fit the amplitude of these samples to a straight line. +% TODO: +% [ ] track down bg noises on vk5qi and kristoff +% [ ] return data for plotting, like slope m +% [ ] quantise m + +% dealing with UV, BG noise. Prob is flat spectra. When we fit a low +% freq masking model it's formant shaped rather than flat. So we get +% these gaps in spectra that come and go - waterfall noises. In +% particular at low frequencies. Good news is they don't need to be +% quantised too finely. This model has the disadvantage of not having +% variable bandwidths. +% when do waterfall noises appear? +% idea: we could add the ability to have wider bands +% Add some sort of slope or floor +% increase spacing of samples? Like min spacing in bark dimension + +% can we fit a different shape? + +function [decmaskdB local_maxima_sort] = make_decmask(maskdB, AmdB, Wo, L, mask_sample_freqs_kHz) + + % band pass filter: limit search to 250 to 3800 Hz + + m_st = max(1,floor((pi*250/4000)/Wo)); + m_en = floor((pi*3800/4000)/Wo); + + % We start off by assuming that the local maxima in the masking + % curve are the centres of the samples we want to keep. + + local_maxima = []; + if maskdB(m_st) > maskdB(m_st+1) + local_maxima = [local_maxima; AmdB(m_st) m_st]; + end + for m=m_st+1:m_en-1 + if (maskdB(m-1) < maskdB(m)) && (maskdB(m) > maskdB(m+1)) + local_maxima = [local_maxima; AmdB(m) m]; + end + end + [nlm tmp] = size(local_maxima); + + % Occasionally there are no local maxima so pop one in + + if nlm == 0 + local_maxima = [AmdB(m_st) m_st]; + nlm = 1; + end + + % fit a straight line to the amplitudes of our candidate samples, + % this will help us later when we code and transmit the amplitude + % of each sample + + if nlm > 1 + [m b] = linreg(local_maxima(:,2), local_maxima(:,1), nlm); + local_maxima_fit = local_maxima(:,2)*m + b; + else + local_maxima_fit = local_maxima(1,1); + end + + % Remove any outliers to the straight line fit: Sometimes local + % maxima appear in an antiformant regions, say if F1 and F2 are a + % long way apart. After a straight line fit the anti-format + % amplitide sample will be way off the straight line, which will + % cause a spike of spectral energy right where we don't want it - + % in the middle of an antiformat. So lets test the fit of each + % sample, and only include those that work well with the straight + % line fit. For voiced frames, m < 0. For UV frames, we don't + % care about the straight line fit as unvoiced speech is all over + % the place in amplitude anyway. + + local_maxima2 = []; + for i=1:nlm + if (local_maxima_fit(i) - local_maxima(i,1) < 6) || (m > 0) + local_maxima2 = [local_maxima2; local_maxima(i,1) local_maxima(i,2)]; + end + end + + % now sort and keep the top 4 samples + + local_maxima_sort = flipud(sortrows(local_maxima2,1)); + [nlm tmp] = size(local_maxima_sort); + nlm = min(nlm,4); + local_maxima_sort = local_maxima_sort(1:nlm,:); + + % fit straight line again, this time with outliers removed + + [m b] = linreg(local_maxima_sort(:,2), local_maxima_sort(:,1), nlm); + masker_amps_dB = local_maxima_sort(:,2)*m + b; + masker_freqs_kHz = local_maxima_sort(:,2)*Wo*4/pi; + %masker_amps_dB = local_maxima_sort(:,1); + %masker_freqs_kHz = local_maxima_sort(:,2)*Wo*4/pi; + + % and construct new, decimated mask using our small set of + % samples, with amplitudes fitted to a linear line + + decmaskdB = determine_mask(masker_amps_dB, masker_freqs_kHz, mask_sample_freqs_kHz); +endfunction + + +% Alternative way to come up with a decimated mask model, using +% analysis by synthesis to determine the best place to put samples. +% Ahh, takes me back to when I was a slip of a speech coder, playing +% with my first CELP codec! + +function [decmaskdB dec_samples error_log candidate_log target_log] = make_decmask_abys(maskdB, AmdB, Wo, L, mask_sample_freqs_kHz) + + % band pass filter: limit search to 250 to 3800 Hz + + %m_st = max(1,floor((pi*250/4000)/Wo)); + %m_en = floor((pi*3800/4000)/Wo); + m_st = 1; + m_en = L; + + target = maskdB; + decmaskdB = zeros(1,L); + dec_samples = []; + error_log = []; + candidate_log = []; + + for sample=1:4 + + target_log = target; + + % find best position for sample to minimise distance to target + + min_mse = 1E32; + for m=m_st:m_en + single_mask_m = schroeder(m*Wo*4/pi, mask_sample_freqs_kHz) + AmdB(m); + candidate = max(decmaskdB, single_mask_m); + error = target - candidate; + mse = sum(abs(error)); % MSE in log domain + error_log = [error_log; error]; + candidate_log = [candidate_log; candidate]; + %printf("m: %d f: %f error: %f\n", m, m*Wo*4/pi, mse); + + too_close = 0; + for x=1:sample-1 + if abs(dec_samples(x,2) - m) < 2 + too_close = 1; + end + end + + if (mse < min_mse) && (too_close == 0) + min_mse = mse; + min_mse_m = m; + min_candidate = candidate; + end + end + + decmaskdB = min_candidate; + dec_samples = [dec_samples; AmdB(min_mse_m) min_mse_m]; + %printf("sample: %d min_mse_m: %d\n", sample, min_mse_m); + end + + if 0 + % add floor to mask - unsuccessful attempt at fixing tinkle noises + min_AmdB = max(dec_samples(:,1)); + decmaskdB = max(decmaskdB, min_AmdB - 20); + end + + % simulate quantisation of amplitudes by adding some noise + + if 0 + masker_amps_dB = dec_samples(:,1); + masker_amps_dB += 3*(1 - 2*rand(4,1)); + masker_freqs_kHz = dec_samples(:,2)*Wo*4/pi; + decmaskdB = determine_mask(masker_amps_dB, masker_freqs_kHz, mask_sample_freqs_kHz); + end + + % quantisation of amplitudes. Determine and subtract mean. Quantise difference + % from mean to 4 levels (2 bits), at 6dB/level: + % + % Level + % 0 -9 + % 1 -3 + % 2 +3 + % 3 +9 + + if 0 + masker_amps_dB = dec_samples(:,1); + masker_freqs_kHz = dec_samples(:,2)*Wo*4/pi; + + energy_dB = mean(masker_amps_dB); + masker_amps_dB -= energy_dB; + for i=1:4 + masker_amps_dB(i) = quantise([-9 -3 3 9], masker_amps_dB(i)); + end + masker_amps_dB += energy_dB; + decmaskdB = determine_mask(masker_amps_dB, masker_freqs_kHz, mask_sample_freqs_kHz); + end + + % fit straight line to amplitudes (sounds bad, still a bug somewhere) + + if 0 + [gradient intercept] = linreg(dec_samples(:,2), dec_samples(:,1), 4); + masker_amps_dB = dec_samples(:,2)*gradient + intercept; + masker_freqs_kHz = dec_samples(:,2)*Wo*4/pi; + decmaskdB = determine_mask(masker_amps_dB, masker_freqs_kHz, mask_sample_freqs_kHz); + end +endfunction + + +% quantise input sample to nearest value in table + +function quant_out = quantise(levels, quant_in) + best_se = 1E32; + for i=1:length(levels) + se = (levels(i) - quant_in)^2; + if se < best_se + quant_out = levels(i); + best_se = se; + end + end +endfunction + + +% determine cumulative mask, using amplitude of each harmonic. Mask is +% sampled across L points in the linear domain + +function maskdB = determine_mask(masker_amps_dB, masker_freqs_kHz, mask_sample_freqs_kHz) + + % calculate and plot masking curve + + maskdB = zeros(1,length(mask_sample_freqs_kHz)); + for m=1:length(masker_freqs_kHz) + maskdB = max(maskdB, schroeder(masker_freqs_kHz(m), mask_sample_freqs_kHz) + masker_amps_dB(m)); + end +end + + +% Sample mask as model for Am + +function [maskdB Am_freqs_kHz] = mask_model(AmdB, Wo, L) + + Am_freqs_kHz = (1:L)*Wo*4/pi; + maskdB = determine_mask(AmdB, Am_freqs_kHz, Am_freqs_kHz); +endfunction + + +% +% Masking functions from http://www.perceptualentropy.com/coder.html#C +% Thanks Jon Boley! +% + +% Calculate the Schroeder masking spectrum for a given frequency and SPL + +function maskdB = schroeder(freq_tone_kHz, mask_sample_freqs_kHz, modified_bark_en=1) + f_kHz = mask_sample_freqs_kHz; + f_Hz = f_kHz*1000; + + % Schroeder Spreading Function + + if modified_bark_en == 1 + + % Modification by DR: Piecewise linear model that makes bands + % beneath 1.5kHz wider to match the width of F1 and + % "fill in" the spectra better for UV sounds. + + x1 = 0.5; x2 = 1.5; + y1 = 0.5; y2 = 1; + grad = (y2 - y1)/(x2 - x1); + y_int = y1 - grad*x1; + + if freq_tone_kHz <= x1 + y = y1; + end + if (freq_tone_kHz > x1) && (freq_tone_kHz < x2) + y = grad*freq_tone_kHz + y_int; + end + if freq_tone_kHz >= x2 + y = y2; + end + dz = y*(bark(freq_tone_kHz*1000) - bark(f_Hz)); + else + dz = bark(freq_tone_kHz*1000)-bark(f_Hz); + end + + maskdB = 15.81 + 7.5*(dz+0.474) - 17.5*sqrt(1 + (dz+0.474).^2); +endfunction + + +% Converts frequency to bark scale +% Frequency should be specified in Hertz + +function b=bark(f) + b = 13*atan(0.76*f/1000) + 3.5*atan((f/7500).^2); +endfunction + + +% -12dB/octave mask to model speech articulation + +function maskdB = resonator(freq_tone_kHz, mask_sample_freqs_kHz) + maskdB = zeros(1, length(mask_sample_freqs_kHz)); + for m=1:length(mask_sample_freqs_kHz) + maskdB(m) = -24*abs(log2(freq_tone_kHz/mask_sample_freqs_kHz(m))); + %printf("m: %d ft: %f fm: %f ft/fm: %f maskdB: %f\n", m, freq_tone_kHz, mask_sample_freqs_kHz(m), freq_tone_kHz/mask_sample_freqs_kHz(m), maskdB(m)); + end +endfunction + +% plot some masking curves, used for working on masking filter changes + +function plot_masking + Fs = 8000; + + figure(1) + mask_sample_freqs_kHz = 0.1:0.1:(Fs/1000)/2; + maskdB_cb = schroeder(0.5, mask_sample_freqs_kHz, 1); + plot(mask_sample_freqs_kHz, maskdB_cb); + hold on; + maskdB_res = resonator(0.5, mask_sample_freqs_kHz); + plot(mask_sample_freqs_kHz, maskdB_res,'g'); + + for f=0.5:0.5:3 + maskdB_cb = schroeder(f, mask_sample_freqs_kHz, 1); + plot(mask_sample_freqs_kHz, maskdB_cb); + maskdB_res = resonator(f, mask_sample_freqs_kHz); + plot(mask_sample_freqs_kHz, maskdB_res,'g'); + end + hold off; + axis([0.1 4 -30 0]) + grid + + figure(2) + clf; + w = pi/4; beta = 0.9; + X = freqz(1,[1 -2*beta*cos(w) beta*beta],4000); + plot(10*log10(abs(X))) + grid +endfunction + + +% produce a scatter diagram of amplitudes + +function amp_scatter(samname) + + model_name = strcat(samname,"_model.txt"); + model = load(model_name); + [frames nc] = size(model); + max_amp = 80; + + Am_out_name = sprintf("%s_am.out", samname); + freqs = []; + ampsdB = []; + + for f=1:frames + + L = min([model(f,2) max_amp-1]); + Wo = model(f,1); + Am = model(f,3:(L+2)); + AmdB = 20*log10(Am); + + maskdB = mask_model(AmdB, Wo, L); + mask_sample_freqs_kHz = (1:L)*Wo*4/pi; + [newmaskdB local_maxima] = make_newmask(maskdB, AmdB, Wo, L, mask_sample_freqs_kHz); + + [nlm tmp] = size(local_maxima); + freqs = [freqs (local_maxima(1:min(4,nlm),2)*Wo*4000/pi)']; + an_ampsdB = local_maxima(1:min(4,nlm),1)'; + ampsdB = [ampsdB an_ampsdB-mean(an_ampsdB)]; + end + + figure(1) + plot(freqs, ampsdB,'+'); + figure(2) + subplot(211) + hist(freqs,20) + subplot(212) + hist(ampsdB,20) +endfunction + +%amp_scatter("../build_linux/src/all") diff --git a/codec2/tags/0.4.1/octave/newamp_batch.m b/codec2/tags/0.4.1/octave/newamp_batch.m new file mode 100644 index 00000000..715ca1e7 --- /dev/null +++ b/codec2/tags/0.4.1/octave/newamp_batch.m @@ -0,0 +1,93 @@ +% newamp_batch.m +% +% Copyright David Rowe 2015 +% This program is distributed under the terms of the GNU General Public License +% Version 2 +% +% Octave script to batch process model parameters using the new +% amplitude model. Used for generating samples we can listen to. +% +% Usage: +% ~/codec2-dev/build_linux/src$ ./c2sim ../../raw/hts1a.raw --dump hts1a +% $ cd ~/codec2-dev/octave +% octave:14> newamp_batch("../build_linux/src/hts1a") +% ~/codec2-dev/build_linux/src$ ./c2sim ../../raw/hts1a.raw --amread hts1a_am.out -o - | play -t raw -r 8000 -s -2 - + +% process a whole file and write results + +function newamp_batch(samname, optional_Am_out_name) + newamp; + more off; + + max_amp = 80; + use_decmask = 1; + postfilter_en = 1; + decimate = 1; + + model_name = strcat(samname,"_model.txt"); + model = load(model_name); + [frames nc] = size(model); + + if nargin == 1 + Am_out_name = sprintf("%s_am.out", samname); + end + if nargin == 2 + Am_out_name = optional_Am_out_name; + end + + fam = fopen(Am_out_name,"wb"); + + for f=1:frames + printf("\rframe: %d", f); + L = min([model(f,2) max_amp-1]); + Wo = model(f,1); + Am = model(f,3:(L+2)); + + AmdB = 20*log10(Am); + + % find mask and decimated mask + + mask_sample_freqs_kHz = (1:L)*Wo*4/pi; + maskdB = mask_model(AmdB, Wo, L); + [decmaskdB decmasksamples] = make_decmask_abys(maskdB, AmdB, Wo, L, mask_sample_freqs_kHz); + + if use_decmask + non_masked_m = decmasksamples(:,2); + maskdB_ = decmaskdB; + else + maskdB_ = maskdB; + non_masked_m = find(AmdB > maskdB); + end + + % post filter - bump up samples by 6dB, reduce mask by same level to normalise gain + + if postfilter_en + maskdB_pf = maskdB_ - 6; + maskdB_pf(non_masked_m) = maskdB_pf(non_masked_m) + 6; + else + maskdB_pf = maskdB_; + end + + if 0 + % Early work as per blog post part 1 + % Attempt 1 + maskdB_pf = zeros(1,L); + maskdB_pf(non_masked_m) = maskdB(non_masked_m); + % Attempt 2 + %maskdB_pf = maskdB; + % Attempt 3 + %maskdB_pf = maskdB; + %maskdB_pf(non_masked_m) += 6; + end + + Am_ = zeros(1,max_amp); + Am_(2:L) = 10 .^ (maskdB_pf(1:L-1)/20); % C array doesnt use A[0] + fwrite(fam, Am_, "float32"); + end + + fclose(fam); + + printf("\n"); + +endfunction + diff --git a/codec2/tags/0.4.1/octave/newamp_fbf.m b/codec2/tags/0.4.1/octave/newamp_fbf.m new file mode 100644 index 00000000..04050323 --- /dev/null +++ b/codec2/tags/0.4.1/octave/newamp_fbf.m @@ -0,0 +1,134 @@ +% newamp_fbf.m +% +% Copyright David Rowe 2015 +% 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 new amplitude +% modelling model. +% +% Usage: +% ~/codec2-dev/build_linux/src$ ./c2sim ../../raw/hts1a.raw --dump hts1a +% $ cd ~/codec2-dev/octave +% octave:14> newamp_fbf("../build_linux/src/hts1a",50) + +function newamp_fbf(samname, f) + + more off; + newamp; + + 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); + + plot_all_masks = 0; + 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)); + AmdB = 20*log10(Am); + + % plotting + + plot((1:L)*Wo*4000/pi, AmdB,";Am;r"); + axis([1 4000 0 80]); + hold on; + plot((1:L)*Wo*4000/pi, AmdB,";Am;r+"); + plot((0:255)*4000/256, Sw(f,:),";Sw;"); + + [maskdB Am_freqs_kHz] = mask_model(AmdB, Wo, L); + plot(Am_freqs_kHz*1000, maskdB, 'g'); + + % optionally show harmonics that are not masked + + not_masked_m = find(maskdB < AmdB); + if 0 + plot(not_masked_m*Wo*4000/pi, 70*ones(1,length(not_masked_m)), 'bk+'); + end + + % optionally plot synthesised spectrum (early simple model) + + if 0 + AmdB_ = maskdB; + AmdB_(not_masked_m) += 6; + plot(Am_freqs_kHz*1000, AmdB_, 'g'); + plot(Am_freqs_kHz*1000, AmdB_, 'g+'); + end + + % estimate low rate samples + + mask_sample_freqs_kHz = (1:L)*Wo*4/pi; + [decmaskdB local_maxima error_log candidate_log target_log] = make_decmask_abys(maskdB, AmdB, Wo, L, mask_sample_freqs_kHz); + + [nlm tmp] = size(local_maxima(:,2)); + nlm = min(nlm,4); + tonef_kHz = local_maxima(1:nlm,2)*Wo*4/pi; + toneamp_dB = local_maxima(1:nlm,1); + plot(tonef_kHz*1000, 70*ones(1,nlm), 'bk+'); + plot(mask_sample_freqs_kHz*1000, decmaskdB, 'm'); + + % fit a line to amplitudes + + %[m b] = linreg(tonef_kHz, toneamp_dB, nlm); + %plot(tonef_kHz*1000, tonef_kHz*m + b, "bk"); + %plot(tonef_kHz*1000, 60 + toneamp_dB - (tonef_kHz*m + b), "r+"); + + % optionally plot all masking curves + + if plot_all_masks + mask_sample_freqs_kHz = (1:L)*Wo*4/pi; + for m=1:L + maskdB = schroeder(m*Wo*4/pi, mask_sample_freqs_kHz) + AmdB(m); + plot(mask_sample_freqs_kHz*1000, maskdB, "k--"); + end + end + + hold off; + + figure(3) + plot(target_log,'g') + hold on; + plot(candidate_log(3,:),'b'); + plot(candidate_log(5,:),'b'); + plot(error_log(3,:),'r'); + plot(error_log(5,:),'r'); + hold off; + + % interactive menu + + printf("\rframe: %d menu: n-next b-back p-png q-quit m-all", f); + fflush(stdout); + k = kbhit(); + if (k == 'n') + f = f + 1; + endif + if (k == 'b') + f = f - 1; + endif + if k == 'm' + if plot_all_masks == 0 + plot_all_masks = 1; + else + plot_all_masks = 0; + end + end + until (k == 'q') + printf("\n"); + +endfunction + diff --git a/codec2/tags/0.4.1/octave/phase.m b/codec2/tags/0.4.1/octave/phase.m new file mode 100644 index 00000000..f9735903 --- /dev/null +++ b/codec2/tags/0.4.1/octave/phase.m @@ -0,0 +1,56 @@ +% phase.m +% David Rowe August 2009 +% experiments with phase for sinusoidal codecs + +function phase(samname, F0, png) + Wo=2*pi*F0/8000; + P=2*pi/Wo; + L = floor(pi/Wo); + Nsam = 16000; + N = 80; + F = Nsam/N; + A = 10000/L; + phi = zeros(1,L); + s = zeros(1,Nsam); + + for m=floor(L/2):L + phi_off(m) = -m*Wo*8; + end + + for f=1:F + phi(1) = phi(1) + Wo*N; + phi(1) = mod(phi(1),2*pi); + + for m=1:L + phi(m) = m*phi(1); + end + + x = zeros(1,N); + for m=1:L + x = x + A*cos(m*Wo*(0:(N-1)) + phi(m)); + endfor + s((f-1)*N+1:f*N) = x; + endfor + + figure(1); + clf; + plot(s(1:250)); + + fs=fopen(samname,"wb"); + fwrite(fs,s,"short"); + fclose(fs); + + if (nargin == 3) + % small image to fit blog + + __gnuplot_set__ terminal png size 450,300 + ss = sprintf("__gnuplot_set__ output \"%s.png\"", samname); + eval(ss) + replot; + + % for some reason I need this to stop large plot getting wiped + __gnuplot_set__ output "/dev/null" + endif + +endfunction + diff --git a/codec2/tags/0.4.1/octave/phase2.m b/codec2/tags/0.4.1/octave/phase2.m new file mode 100644 index 00000000..5c148f38 --- /dev/null +++ b/codec2/tags/0.4.1/octave/phase2.m @@ -0,0 +1,57 @@ +% phase2.m +% David Rowe Sep 2009 +% experiments with phase for sinusoidal codecs, looking at phase +% of excitation with real Am samples from hts1 + +function phase2(samname, png) + N = 16000; + + f=43; + model = load("../src/hts1a_phase_model.txt"); + phase = load("../src/hts1a_phase_phase.txt"); + Wo = model(f,1); + P=2*pi/Wo; + L = model(f,2); + A = model(f,3:(L+2)); + phi = phase(f,1:L); + phi = zeros(1,L); + phi(3) = -pi/2; + phi(4) = -pi/4; + phi(5) = pi/2; + + s = zeros(1,N); + + for m=3:5 + s_m = A(m)*cos(m*Wo*(0:(N-1)) + phi(m)); + s = s + s_m; + endfor + + figure(1); + clf; + plot(s(1:250)); + + figure(2); + clf; + subplot(211) + plot((1:L)*Wo*4000/pi, 20*log10(A),'+'); + subplot(212) + plot((1:L)*Wo*4000/pi, phi,'+'); + + fs=fopen(samname,"wb"); + fwrite(fs,s,"short"); + fclose(fs); + + if (nargin == 2) + % small image to fit blog + + __gnuplot_set__ terminal png size 450,300 + ss = sprintf("__gnuplot_set__ output \"%s.png\"", samname); + eval(ss) + replot; + + % for some reason I need this to stop large plot getting wiped + __gnuplot_set__ output "/dev/null" + endif + +endfunction + diff --git a/codec2/tags/0.4.1/octave/phasesecord.m b/codec2/tags/0.4.1/octave/phasesecord.m new file mode 100644 index 00000000..a3cf2516 --- /dev/null +++ b/codec2/tags/0.4.1/octave/phasesecord.m @@ -0,0 +1,47 @@ +% phasesecord.m +% David Rowe Aug 2012 +% Used to experiment with aproximations of phase of 2nd order systems + +function phasesecord(w,beta) + + a = [1 -2*cos(w)*beta beta*beta]; + b = 1; + + [h w1] = freqz(b,a); + + figure(1) + subplot(211) + plot(abs(h)) + subplot(212) + plot(angle(h)) + + % for beta close to 1, we approximate 3 dB points as 1-beta above + % and below the resonance freq. Note this fails if w=0 as there is a + % double pole. Lets sample the freq response at the 3dB points and + % w: + + ws = [w-(1-beta) w w+(1-beta)]; + [h w1] = freqz(b,a,ws); + + % gain as a fraction of max, should be 3dB. Within 1.3 dB or for w > pi/8, + % gets innacurate near w=0 due to 2nd pole + + printf("mag measured...:"); printf("% 4.3f ", abs(h)/max(abs(h))); + + % measured angle, 45 deg from angle at w + + printf("\nangle measured.: "); printf("% 5.3f ", angle(h)); + + % Our estimate of angle, (pi+w) is phase at resonance, at lower 3dB + % phase is pi/4 ahead, at upper 3B pi/4 behind. -pi/2 is contribution of + % other pole at at -w to phase + + ph_lower = (pi+w) + pi/4 - pi/2; + ph_res =(pi+w) - pi/2; + ph_upper = (pi+w) - pi/4 - pi/2; + ph_ests = [ph_lower ph_res ph_upper]; + ph_ests = ph_ests - 2*pi*(floor(ph_ests/(2*pi)) + 0.5); + printf("\nangle estimated:"); printf("% 5.3f ", ph_ests); + printf("\n"); +endfunction + diff --git a/codec2/tags/0.4.1/octave/pitch_test.m b/codec2/tags/0.4.1/octave/pitch_test.m new file mode 100644 index 00000000..3fe0d1ad --- /dev/null +++ b/codec2/tags/0.4.1/octave/pitch_test.m @@ -0,0 +1,39 @@ +% 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/codec2/tags/0.4.1/octave/pl.m b/codec2/tags/0.4.1/octave/pl.m new file mode 100644 index 00000000..0d547882 --- /dev/null +++ b/codec2/tags/0.4.1/octave/pl.m @@ -0,0 +1,45 @@ +% 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/codec2/tags/0.4.1/octave/pl2.m b/codec2/tags/0.4.1/octave/pl2.m new file mode 100644 index 00000000..c7af10cc --- /dev/null +++ b/codec2/tags/0.4.1/octave/pl2.m @@ -0,0 +1,44 @@ +% 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); + axis([1 en1-st1 min(s1(st1:en1)) max(s1(st1:en1))]); + subplot(212); + l2 = strcat("r;",samname2,";"); + plot(s2(st2:en2),l2); + axis([1 en2-st2 min(s1(st2:en2)) max(s1(st2:en2))]); + + figure(2) + plot(s1(st1:en1)-s2(st2:en2)); + + f=fopen("diff.raw","wb"); + d = s1(st1:en1)-s2(st2:en2); + fwrite(f,d,"short"); + +endfunction diff --git a/codec2/tags/0.4.1/octave/plamp.m b/codec2/tags/0.4.1/octave/plamp.m new file mode 100644 index 00000000..62b6893a --- /dev/null +++ b/codec2/tags/0.4.1/octave/plamp.m @@ -0,0 +1,197 @@ +% 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_lsp = 0; + plot_snr = 0; + plot_vsnr = 0; + plot_sw = 0; + plot_pw = 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 + + model2q_name = " "; + if nargin == 3 + model2q_name = strcat(samname2,"_qmodel.txt"); + if file_in_path(".",modelq_name) + model2q = load(model2q_name); + end + end + + Ew_on = 1; + k = ' '; + do + figure(1); + clf; +% s = [ Sn(2*(f-2)-1,:) Sn(2*(f-2),:) ]; + s = [ Sn(2*f-1,:) Sn(2*f,:) ]; + size(s); + plot(s); + axis([1 length(s) -20000 20000]); + + 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;r"); + 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)); + plot((1:L)*Wo*4000/pi, 20*log10(Amq),";Amq;g" ); + if (file_in_path(".",pw_name) && plot_pw) + plot((0:255)*4000/256, 10*log10(Pw(f,:)),";Pw;c"); + 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); + plot((1:L)*Wo*4000/pi, 20*log10(Amq) - 20*log10(Am), Am_err_label); + endif + + if file_in_path(".",model2q_name) + Amq2 = model2q(f,3:(L+2)); + plot((1:L)*Wo*4000/pi, 20*log10(Amq2),";Amq2;m" ); + end + + if (file_in_path(".",snr_name) && plot_vsnr) + snr_label = sprintf(";Voicing 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(";phase_err SNR %4.2f dB;",snr_phase); + %plot((1:L)*Wo*4000/pi, 20*log10(orig-synth), phase_err_label); + endif + + if (file_in_path(".",lsp_name) && plot_lsp) + for l=1:10 + plot([lsp(f,l)*4000/pi lsp(f,l)*4000/pi], [60 80], 'r'); + endfor + endif + + hold off; + + %if (file_in_path(".",phase_name)) + %figure(3); + %plot((1:L)*Wo*4000/pi, phase(f,1:L), ";phase;"); + %axis; + %if (file_in_path(".",phase_name_)) + %hold on; + %plot((1:L)*Wo*4000/pi, phase_(f,1:L), ";phase_;"); + %hold off; + %endif + %figure(2); + %endif + + % interactive menu + + printf("\rframe: %d menu: n-next b-back p-png q-quit e-toggle Ew", f); + fflush(stdout); + k = kbhit(); + if (k == 'n') + f = f + 1; + endif + if (k == 'b') + f = f - 1; + endif + if (k == 'e') + if (Ew_on == 1) + Ew_on = 0; + else + Ew_on = 1; + endif + 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/codec2/tags/0.4.1/octave/plinterp.m b/codec2/tags/0.4.1/octave/plinterp.m new file mode 100644 index 00000000..794a0853 --- /dev/null +++ b/codec2/tags/0.4.1/octave/plinterp.m @@ -0,0 +1,11 @@ +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/codec2/tags/0.4.1/octave/pllpcpf.m b/codec2/tags/0.4.1/octave/pllpcpf.m new file mode 100644 index 00000000..924e045a --- /dev/null +++ b/codec2/tags/0.4.1/octave/pllpcpf.m @@ -0,0 +1,150 @@ +% 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/codec2/tags/0.4.1/octave/pllsp.m b/codec2/tags/0.4.1/octave/pllsp.m new file mode 100644 index 00000000..0606d3ca --- /dev/null +++ b/codec2/tags/0.4.1/octave/pllsp.m @@ -0,0 +1,46 @@ +% 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/codec2/tags/0.4.1/octave/pllspdt.m b/codec2/tags/0.4.1/octave/pllspdt.m new file mode 100644 index 00000000..c711aa46 --- /dev/null +++ b/codec2/tags/0.4.1/octave/pllspdt.m @@ -0,0 +1,27 @@ +% 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/codec2/tags/0.4.1/octave/plnlp.m b/codec2/tags/0.4.1/octave/plnlp.m new file mode 100644 index 00000000..01b49311 --- /dev/null +++ b/codec2/tags/0.4.1/octave/plnlp.m @@ -0,0 +1,134 @@ +% 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/codec2/tags/0.4.1/octave/plphase.m b/codec2/tags/0.4.1/octave/plphase.m new file mode 100644 index 00000000..c12422ea --- /dev/null +++ b/codec2/tags/0.4.1/octave/plphase.m @@ -0,0 +1,198 @@ +% 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/codec2/tags/0.4.1/octave/plpitch.m b/codec2/tags/0.4.1/octave/plpitch.m new file mode 100644 index 00000000..69ad5338 --- /dev/null +++ b/codec2/tags/0.4.1/octave/plpitch.m @@ -0,0 +1,36 @@ +% 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/codec2/tags/0.4.1/octave/plppe.m b/codec2/tags/0.4.1/octave/plppe.m new file mode 100644 index 00000000..cbc5b562 --- /dev/null +++ b/codec2/tags/0.4.1/octave/plppe.m @@ -0,0 +1,65 @@ +% Copyright David Rowe 2009 +% This program is distributed under the terms of the GNU General Public License +% Version 2 +% +% Plot two sparse phase prediction error text files. +% Generate data from print_pred_error, print_pred_error_sparse_wo_correction1 etc + +function plppe(ppe1_file, ppe2_file, f) + + ppe1 = load(ppe1_file); + ppe2 = load(ppe2_file); + + std1 = std(nonzeros(ppe1(:,40:80))); + std2 = std(nonzeros(ppe2(:,40:80))); + + printf("std dev for %s is %4.3f\n", ppe1_file, std1); + printf("std dev for %s is %4.3f\n", ppe2_file, std2); + + figure(1); + clf; + subplot(211) + hist(nonzeros(ppe1(:,40:80)),20); + subplot(212) + hist(nonzeros(ppe2(:,40:80)),20); + + k = ' '; + do + figure(2); + clf; + subplot(211) + L = length(nonzeros(ppe1(f,:))); + x = (1:L)*4000/L; + std1 = std(nonzeros(ppe1(f,:))); + legend = sprintf(";std dev %4.3f;", std1); + plot(x, nonzeros(ppe1(f,:)),legend); + axis([0 4000 -pi pi]); + subplot(212) + std2 = std(nonzeros(ppe2(f,:))); + legend = sprintf(";std dev %4.3f;", std2); + plot(x, nonzeros(ppe2(f,:)),legend); + axis([0 4000 -pi pi]); + + % 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/codec2/tags/0.4.1/octave/plsub.m b/codec2/tags/0.4.1/octave/plsub.m new file mode 100644 index 00000000..6e2bc1ea --- /dev/null +++ b/codec2/tags/0.4.1/octave/plsub.m @@ -0,0 +1,35 @@ +% Copyright David Rowe 2010 +% This program is distributed under the terms of the GNU General Public License +% Version 2 +% plots the difference of two files + +function plsub(samname1, samname2, start_sam, end_sam, pngname) + + fs1=fopen(samname1,"rb"); + s1=fread(fs1,Inf,"short"); + fs2=fopen(samname2,"rb"); + s2=fread(fs2,Inf,"short"); + + st = 1; + en = length(s1); + if (nargin >= 3) + st = start_sam; + endif + if (nargin >= 4) + en = end_sam; + endif + + figure(1); + clf; + l1 = strcat("r;",samname1,";"); + plot(s1(st:en) - s2(st:en), l1); + %axis([1 en-st min(s1(st:en)) max(s1(st:en))]); + + if (nargin == 5) + pngname = sprintf("%s.png",pngname); + print(pngname, '-dpng', "-S500,500") + pngname = sprintf("%s_large.png",pngname); + print(pngname, '-dpng', "-S800,600") + endif + +endfunction diff --git a/codec2/tags/0.4.1/octave/plvoicing.m b/codec2/tags/0.4.1/octave/plvoicing.m new file mode 100644 index 00000000..a5317476 --- /dev/null +++ b/codec2/tags/0.4.1/octave/plvoicing.m @@ -0,0 +1,89 @@ +% 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/codec2/tags/0.4.1/octave/png.m b/codec2/tags/0.4.1/octave/png.m new file mode 100644 index 00000000..09a79968 --- /dev/null +++ b/codec2/tags/0.4.1/octave/png.m @@ -0,0 +1,25 @@ +% 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/codec2/tags/0.4.1/octave/postfilter.m b/codec2/tags/0.4.1/octave/postfilter.m new file mode 100644 index 00000000..84f7dfc7 --- /dev/null +++ b/codec2/tags/0.4.1/octave/postfilter.m @@ -0,0 +1,24 @@ +% Copyright David Rowe 2009 +% This program is distributed under the terms of the GNU General Public License +% Version 2 +% +% Plot postfilter doing its thing + +function postfilter(samname) + p = load(samname); + figure(1); + plot(p(:,1),";energy;"); + hold on; + plot(p(:,2),";bg_est;"); + hold off; + grid; + pngname=sprintf("%s_postfilter_1", samname); + png(pngname); + + figure(2); + plot(p(:,3),";% unvoiced;"); + grid; + pngname=sprintf("%s_postfilter_2", samname); + png(pngname); +endfunction + diff --git a/codec2/tags/0.4.1/octave/pulse.m b/codec2/tags/0.4.1/octave/pulse.m new file mode 100644 index 00000000..223389e7 --- /dev/null +++ b/codec2/tags/0.4.1/octave/pulse.m @@ -0,0 +1,37 @@ +% 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/codec2/tags/0.4.1/octave/save_raw.m b/codec2/tags/0.4.1/octave/save_raw.m new file mode 100644 index 00000000..7f17277e --- /dev/null +++ b/codec2/tags/0.4.1/octave/save_raw.m @@ -0,0 +1,7 @@ +% 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/codec2/tags/0.4.1/octave/sd.m b/codec2/tags/0.4.1/octave/sd.m new file mode 100644 index 00000000..a5352928 --- /dev/null +++ b/codec2/tags/0.4.1/octave/sd.m @@ -0,0 +1,170 @@ +% sd.m +% David Rowe Aug 2012 +% Plots the spectal distorion between twofiles of LPCs. Used for LSP +% quantisation tuning. + +function sd(raw_filename, dump_file_prefix, f) + + graphics_toolkit ("gnuplot"); + + e_filename = sprintf("%s_E.txt", dump_file_prefix); + e = load(e_filename); + ak1_filename = sprintf("%s_ak.txt", dump_file_prefix); + ak2_filename = sprintf("%s_ak_.txt", dump_file_prefix); + ak1 = load(ak1_filename); + ak2 = load(ak2_filename); + + [ak1_r, ak1_c] = size(ak1) + [ak2_r, ak2_c] = size(ak2) + + frames = max([ak1_r ak2_r]); printf("%d frames\n", frames); + sd = zeros(1,frames); + Ndft = 512; + A1 = zeros(frames, Ndft); + A2 = zeros(frames, Ndft); + + % initial helicopter view of all frames + + spec_err = zeros(1, Ndft); + for i = 1:frames + A1(i,:) = -20*log10(abs(fft(ak1(i,:),Ndft))); + A2(i,:) = -20*log10(abs(fft(ak2(i,:),Ndft))); + sd(i) = sum((A1(i,:) - A2(i,:)).^2)/Ndft; + spec_err += (A1(i,:) - A2(i,:)).^2; + end + spec_err /= frames; + printf("sd av %3.2f dB*dB\n", sum(sd)/frames); + + % work out worst frames with sig energy + + ind = find(e < 0); + sd(ind) = 0; + [largest largest_ind] = sort(sd,"descend"); + printf("largest SD frames....: %3.2f\n", largest(1:5)); + printf("largest SD frames ind: %d\n", largest_ind(1:5)); + + figure(1); + clf; + subplot(211) + fs=fopen(raw_filename,"rb"); + s = fread(fs,Inf,"short"); + plot(s); + axis([1 length(s) -20E3 20E3]) + subplot(212) + [a b c] = plotyy(1:frames, sd, 1:frames, e); + %axis(a, [1 frames 0 10]) + + lsp1_filename = sprintf("%s_lsp.txt", dump_file_prefix); + lsp2_filename = sprintf("%s_lsp_.txt", dump_file_prefix); + lsp1 = load(lsp1_filename); + lsp2 = load(lsp2_filename); + + mel_filename = sprintf("%s_mel.txt", dump_file_prefix); + mel = load(mel_filename); + + weights_filename = sprintf("%s_weights.txt", dump_file_prefix); + if file_in_path(".",weights_filename) + weights = load(weights_filename); + end + + figure(4) + plot(e,sd,'+') + axis([0 50 0 10]) + xlabel('LPC energy dB') + ylabel('SD dB*dB'); + + figure(5) + subplot(211) + ind = find(e > 0); + hist(sd(ind)) + title('Histogram of SD'); + subplot(212) + plot((1:Ndft)*8000/Ndft, spec_err) + axis([300 3000 0 max(spec_err)]) + title('Average error across spectrum') + + mel_indexes_filename = sprintf("%s_mel_indexes.txt", dump_file_prefix); + if 0 %file_in_path(".", mel_indexes_filename) + mel_indexes = load(mel_indexes_filename); + figure(6) + bins = [15, 7, 15, 7, 7, 7]; + ind = find(e > 5); % ignore silence frames + for i=1:6 + subplot(3,2,i) + hist(mel_indexes(ind,i),0:bins(i)) + ylab = sprintf("index %d", i); + ylabel(ylab); + end + end + + % now enter single step mode so we can analyse each frame + k = ' '; + largest_mode = 0; + do + if largest_mode + fr = largest_ind(f); + else + fr = f; + endif + + figure(2); + clf; + plot((4000/pi)*lsp1((fr-2:fr+2),:)); + hold on; + plot((4000/pi)*lsp2((fr-2:fr+2),:),'+-'); + hold off; + + figure(3); + clf; + + plot((1:Ndft/2)*4000/(Ndft/2), A1(fr,1:(Ndft/2)),";A enc;r"); + axis([1 4000 -20 40]); + hold on; + plot((1:Ndft/2)*4000/(Ndft/2), A2(fr,1:(Ndft/2)),";A dec;"); + if file_in_path(".",weights_filename) + plot(lsp1(fr,:)*4000/pi, weights(fr,:),";weights;g+"); + end + + printf("\n"); + for l=1:10 + plot([lsp1(fr,l)*4000/pi lsp1(fr,l)*4000/pi], [0 -10], 'r'); + plot([lsp2(fr,l)*4000/pi lsp2(fr,l)*4000/pi], [-10 -20], 'b'); + plot([mel(fr,l) mel(fr,l)], [0 10], 'g'); + printf("%d ", mel(fr,l)); + endfor + printf("\n"); + + plot(0,0,';lsp enc;r'); + plot(0,0,';lsp dec;b'); + plot(0,0,';mel dec;g'); + sd_str = sprintf(";sd %3.2f dB*dB;", sd(f)); + plot(0,0,sd_str); + + hold off; + + % interactive menu + + printf("\rframe: %d menu: n-next b-back l-largest mode q-quit", fr); + fflush(stdout); + k = kbhit(); + if (k == 'n') + f = f + 1; + endif + if (k == 'b') + f = f - 1; + endif + + if (k == 'l') + if largest_mode + largest_mode = 0; + else + largest_mode = 1; + f = 1; + endif + endif + + until (k == 'q') + printf("\n"); + +endfunction + diff --git a/codec2/tags/0.4.1/octave/spec.m b/codec2/tags/0.4.1/octave/spec.m new file mode 100644 index 00000000..d556b906 --- /dev/null +++ b/codec2/tags/0.4.1/octave/spec.m @@ -0,0 +1,86 @@ +% spec.m +% Jean Marc Valin +% +% Spectrogram function for Octave +% +% Copyright (c) John-Marc Valin 2012 +% +% Redistribution and use in source and binary forms, with or without +% modification, are permitted provided that the following conditions +% are met: +% +% - Redistributions of source code must retain the above copyright +% notice, this list of conditions and the following disclaimer. +% +% - Redistributions in binary form must reproduce the above copyright +% notice, this list of conditions and the following disclaimer in the +% documentation and/or other materials provided with the distribution. +% +% - Neither the name of Jean Marc Valin nor the names of its +% contributors may be used to endorse or promote products derived from +% this software without specific prior written permission. +% +% THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +% ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +% LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +% A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR +% CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +% EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +% PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +% PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +% LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +% NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +% SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +function X = spec(x, Fs, framesize, start, stop) + + +gr=[zeros(1024,1),[0:1023]'/1023,.68*[0:1023]'/1023]; + +%gr=[.4*[0:1023]'/1023,[0:1023]'/1023,.68*[0:1023]'/1023]; + +%t=[0:1023]'/1023; +%t=(1+.25*t-cos(pi*t))/2.25; +%gr = [zeros(1024,1),t,.68*t]; + + +%colormap(gr); + +if nargin < 2 || isempty(Fs) + Fs = 44100; +end + +if nargin < 3 || isempty(framesize) + framesize = 2048; +endif + +offset = framesize/8; + +X = 20*log10(abs(specgram(x, framesize, 48000, blackmanharris(framesize)', framesize-offset))); + +XM=max(max(X)); +X = max(XM-30,X); +%size(X) +F = -[framesize/2-1:-1:0]/framesize*Fs; +%F = [0:127]/128*24000; +T=[1:size(X,2)]/Fs*offset; +%imagesc(X(end:-1:1,:)); + +if nargin < 4 || isempty(start) + istart=1; +else + istart = round(start*Fs/offset); +end + +if nargin < 5 || isempty(stop) + istop = size(X,2); +else + istop = round(stop*Fs/offset); +endif + +istart = max(1,istart); +istop = min(istop, size(X,2)); + +imagesc(T(1+istart:istop), F, X(end:-1:1,1+istart:istop)); + +X = X(:,1+istart:istop); diff --git a/codec2/tags/0.4.1/octave/tcohpsk.m b/codec2/tags/0.4.1/octave/tcohpsk.m new file mode 100644 index 00000000..e6c2db24 --- /dev/null +++ b/codec2/tags/0.4.1/octave/tcohpsk.m @@ -0,0 +1,753 @@ +% tcohpsk.m +% David Rowe Oct 2014 +% +% Octave coherent PSK modem script that hs 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 +% the reference versions of the same modem written in Octave. +% + +% (ii) Runs the Octave version of the cohpsk modem to tune and develop +% it, including extensive channel simulations such as AWGN noise, +% fading/HF, frequency offset, frequency drift, and tx/rx sample +% rate differences. + +% TODO: +% +% [X] Test +% [X] AWGN channel +% [X] freq offset +% [X] fading channel +% [X] freq drift +% [X] timing drift +% [X] tune perf/impl loss to get closer to ideal +% [X] linear interp of phase for better fading perf +% [X] freq offset/drift feedback loop +% [X] PAPR measurement and reduction +% [X] false sync +% [X] doesn't sync up on noise (used EsNo = -12) +% [X] similar but invalid signal like huge f off +% [X] ability to "unsync" when signal dissapears +% [ ] some calibrated tests against FreeDV 1600 +% + compare sound quality at various Es/Nos +% [ ] sync +% + set some req & implement +% [ ] way to handle eom w/o nasties +% + like mute ouput when signal has gone or v low snr +% + instantaneous snr +% [X] ssb tx filter with 3dB passband ripple +% + diverisity helped for AWGN BER 0.024 down to 0.016 +% + Only a small change in fading perf with filter on/off +% + however other filters may have other effects, should test this, +% e.g. scatter plots, some sort of BER metric? +% [X] EsNo estimation +% [ ] filter reqd with compression? +% + make sure not too much noise passed into noise floor +% [X] different diversity combination +% + taking largest symbol didn't help +% [X] histogram of bit errors +% + lot of data +% + ssb filter +% + compression +% + make sure it's flat with many errors + +graphics_toolkit ("gnuplot"); +more off; + +cohpsk; +fdmdv; +autotest; + +rand('state',1); +randn('state',1); + +% select which test ---------------------------------------------------------- + +%test = 'compare to c'; +test = 'awgn'; +%test = 'fading'; + +% some parameters that can be over ridden, e.g. to disable parts of modem + +initial_sync = 0; % setting this to 1 put us straight into sync w/o freq offset est +ftrack_en = 1; % set to 1 to enable freq tracking +ssb_tx_filt = 0; % set to 1 to to simulate SSB tx filter with passband ripple +Fs = 7500; + +% predefined tests .... + +if strcmp(test, 'compare to c') + frames = 100; + foff = 58.7; + dfoff = -0.5/Fs; + EsNodB = 8; + fading_en = 0; + hf_delay_ms = 2; + compare_with_c = 1; + sample_rate_ppm = -1500; + ssb_tx_filt = 0; +end + +% should be BER around 0.015 to 0.02 + +if strcmp(test, 'awgn') + frames = 100; + foff = 58.7; + dfoff = -0.5/Fs; + EsNodB = 8; + fading_en = 0; + hf_delay_ms = 2; + compare_with_c = 0; + sample_rate_ppm = 0; +end + +% Similar to AWGN - should be BER around 0.015 to 0.02 + +if strcmp(test, 'fading'); + frames = 100; + foff = -25; + dfoff = 0.5/Fs; + EsNodB = 12; + fading_en = 1; + hf_delay_ms = 2; + compare_with_c = 0; + sample_rate_ppm = 0; +end + +EsNo = 10^(EsNodB/10); + +% modem constants ---------------------------------------------------------- + +Rs = 75; % symbol rate in Hz +Nc = 7; % number of carriers +Nd = 2; % diveristy factor +framesize = 56; % number of payload data bits in the frame + +Nsw = 4; % frames we demod for initial sync window +afdmdv.Nsym = 6; % size of tx/tx root nyquist filter in symbols +afdmdv.Nt = 5; % number of symbols we estimate timing over + +clip = 6.5; % Clipping of tx signal to reduce PAPR. Adjust by + % experiment as Nc and Nd change. Check out no noise + % scatter diagram and AWGN/fading BER perf + % at operating points + +% FDMDV init --------------------------------------------------------------- + +afdmdv.Fs = Fs; +afdmdv.Nc = Nd*Nc-1; +afdmdv.Rs = Rs; +if Fs/afdmdv.Rs != floor(Fs/afdmdv.Rs) + printf("\n Oops, Fs/Rs must be an integer!\n\n"); + return +end + +M = afdmdv.M = afdmdv.Fs/afdmdv.Rs; +afdmdv.Nfilter = afdmdv.Nsym*M; +afdmdv.tx_filter_memory = zeros(afdmdv.Nc+1, afdmdv.Nfilter); +excess_bw = 0.5; +afdmdv.gt_alpha5_root = gen_rn_coeffs(excess_bw, 1/Fs, Rs, afdmdv.Nsym, afdmdv.M); + +Fcentre = afdmdv.Fcentre = 1500; +afdmdv.Fsep = afdmdv.Rs*(1+excess_bw); +afdmdv.phase_tx = ones(afdmdv.Nc+1,1); +% non linear carrier spacing, combined with clip, helps PAPR a lot! +freq_hz = afdmdv.Fsep*( -Nc*Nd/2 - 0.5 + (1:Nc*Nd).^0.98 ) +afdmdv.freq_pol = 2*pi*freq_hz/Fs; +afdmdv.freq = exp(j*afdmdv.freq_pol); +afdmdv.Fcentre = 1500; + +afdmdv.fbb_rect = exp(j*2*pi*Fcentre/Fs); +afdmdv.fbb_phase_tx = 1; +afdmdv.fbb_phase_rx = 1; + +afdmdv.Nrxdec = 31; +afdmdv.rxdec_coeff = fir1(afdmdv.Nrxdec-1, 0.25)'; +afdmdv.rxdec_lpf_mem = zeros(1,afdmdv.Nrxdec-1+afdmdv.M); + +P = afdmdv.P = 4; +afdmdv.phase_rx = ones(afdmdv.Nc+1,1); +afdmdv.Nfilter = afdmdv.Nsym*afdmdv.M; +afdmdv.rx_fdm_mem = zeros(1,afdmdv.Nfilter + afdmdv.M); +Q = afdmdv.Q = afdmdv.M/4; +if Q != floor(Q) + printf("\n Yeah .... if (Fs/Rs)/4 = M/4 isn't an integer we will just go and break things.\n\n"); +end + +afdmdv.rx_filter_mem_timing = zeros(afdmdv.Nc+1, afdmdv.Nt*afdmdv.P); +afdmdv.Nfiltertiming = afdmdv.M + afdmdv.Nfilter + afdmdv.M; + +afdmdv.rx_filter_memory = zeros(afdmdv.Nc+1, afdmdv.Nfilter); + +afdmdv.filt = 0; +afdmdv.prev_rx_symb = ones(1,afdmdv.Nc+1); + +% COHPSK Init -------------------------------------------------------- + +acohpsk = standard_init(); +acohpsk.framesize = framesize; +acohpsk.ldpc_code = 0; +acohpsk.ldpc_code_rate = 1; +acohpsk.Nc = Nc; +acohpsk.Rs = Rs; +acohpsk.Ns = 4; +acohpsk.coh_en = 1; +acohpsk.Nd = Nd; +acohpsk.modulation = 'qpsk'; +acohpsk.do_write_pilot_file = 1; % enable this to dump pilot symbols to C .h file, e.g. if frame params change +acohpsk = symbol_rate_init(acohpsk); +acohpsk.Ndft = 1024; +acohpsk.f_est = afdmdv.Fcentre; + +ch_fdm_frame_buf = zeros(1, Nsw*acohpsk.Nsymbrowpilot*afdmdv.M); + +% ----------------------------------------------------------- + +tx_bits_log = []; +tx_symb_log = []; +rx_amp_log = []; +rx_phi_log = []; +ch_symb_log = []; +rx_symb_log = []; +rx_bits_log = []; +tx_bits_prev_log = []; +uvnoise_log = []; +nerr_log = []; +tx_baseband_log = []; +tx_fdm_frame_log = []; +ch_fdm_frame_log = []; +rx_fdm_frame_bb_log = []; +rx_filt_log = []; +rx_fdm_filter_log = []; +rx_baseband_log = []; +rx_fdm_frame_log = []; +ct_symb_ff_log = []; +rx_timing_log = []; +ratio_log = []; +foff_log = []; +f_est_log = []; +sig_rms_log = []; +noise_rms_log = []; +noise_rms_filt_log = []; + +% Channel modeling and BER measurement ---------------------------------------- + +rand('state',1); +tx_bits_coh = round(rand(1,framesize*10)); +ptx_bits_coh = 1; + +Nerrs = Tbits = 0; +prev_tx_bits = prev_tx_bits2 = []; +error_positions_hist = zeros(1,framesize); + +phase_ch = 1; +sync = initial_sync; +acohpsk.f_est = Fcentre; +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); + +% simulated SSB tx filter + +[b, a] = cheby1(4, 3, [600, 2600]/(Fs/2)); +[y filt_states] = filter(b,a,0); +h = freqz(b,a,(600:2600)/(Fs/(2*pi))); +filt_gain = (2600-600)/sum(abs(h) .^ 2); % ensures power after filter == before filter + +noise_rms_filt = 0; + +% main loop -------------------------------------------------------------------- + +% run mod and channel as aseparate loop so we can resample to simulate sample rate differences + +for f=1:frames + tx_bits = tx_bits_coh(ptx_bits_coh:ptx_bits_coh+framesize-1); + ptx_bits_coh += framesize; + if ptx_bits_coh > length(tx_bits_coh) + ptx_bits_coh = 1; + end + + tx_bits_log = [tx_bits_log tx_bits]; + + [tx_symb tx_bits] = bits_to_qpsk_symbols(acohpsk, tx_bits, [], []); + tx_symb_log = [tx_symb_log; tx_symb]; + + tx_fdm_frame = []; + for r=1:acohpsk.Nsymbrowpilot + tx_onesymb = tx_symb(r,:); + [tx_baseband afdmdv] = tx_filter(afdmdv, tx_onesymb); + tx_baseband_log = [tx_baseband_log tx_baseband]; + [tx_fdm afdmdv] = fdm_upconvert(afdmdv, tx_baseband); + tx_fdm_frame = [tx_fdm_frame tx_fdm]; + end + + % clipping, which along with non-linear carrier spacing, improves PAPR + % The value of clip is a function of Nc and is adjusted experimentally + % such that the BER hit over no clipping at Es/No=8dB is small. + + ind = find(abs(tx_fdm_frame) > clip); + tx_fdm_frame(ind) = clip*exp(j*angle(tx_fdm_frame(ind))); + + tx_fdm_frame_log = [tx_fdm_frame_log tx_fdm_frame]; + + % + % Channel -------------------------------------------------------------------- + % + + % simulate tx SSB filter with ripple + + if ssb_tx_filt + [tx_fdm_frame filt_states] = filter(b,a,sqrt(filt_gain)*tx_fdm_frame, filt_states); + end + + % frequency offset and frequency drift + + ch_fdm_frame = zeros(1,acohpsk.Nsymbrowpilot*M); + for i=1:acohpsk.Nsymbrowpilot*M + foff_rect = exp(j*2*pi*foff/Fs); + foff += dfoff; + phase_ch *= foff_rect; + ch_fdm_frame(i) = tx_fdm_frame(i) * phase_ch; + end + foff_log = [foff_log foff]; + phase_ch /= abs(phase_ch); + % printf("foff: %f ", foff); + + % optional fading + + if fading_en + ch_fdm_delay(1:nhfdelay) = ch_fdm_delay(acohpsk.Nsymbrowpilot*M+1:nhfdelay+acohpsk.Nsymbrowpilot*M); + ch_fdm_delay(nhfdelay+1:nhfdelay+acohpsk.Nsymbrowpilot*M) = ch_fdm_frame; + + for i=1:acohpsk.Nsymbrowpilot*M + ahf_model = hf_gain*(spread(hf_n)*ch_fdm_frame(i) + spread_2ms(hf_n)*ch_fdm_delay(i)); + ch_fdm_frame(i) = ahf_model; + hf_n++; + end + end + + % each carrier has power = 2, total power 2Nc, total symbol rate NcRs, noise BW B=Fs + % Es/No = (C/Rs)/(N/B), N = var = 2NcFs/NcRs(Es/No) = 2Fs/Rs(Es/No) + + variance = 2*Fs/(acohpsk.Rs*EsNo); + uvnoise = sqrt(0.5)*(randn(1,acohpsk.Nsymbrowpilot*M) + j*randn(1,acohpsk.Nsymbrowpilot*M)); + uvnoise_log = [uvnoise_log uvnoise]; + noise = sqrt(variance)*uvnoise; + + ch_fdm_frame += noise; + + ch_fdm_frame_log = [ch_fdm_frame_log ch_fdm_frame]; +end + +% simulate difference in sample clocks + +%ch_fdm_frame_log = resample(ch_fdm_frame_log, (1E6 + sample_rate_ppm), 1E6); + +tin=1; +tout=1; +ch_fdm_frame_log_out = zeros(1,length(ch_fdm_frame_log)); +while tin < length(ch_fdm_frame_log) + t1 = floor(tin); + t2 = ceil(tin); + f = tin - t1; + ch_fdm_frame_log_out(tout) = (1-f)*ch_fdm_frame_log(t1) + f*ch_fdm_frame_log(t2); + tout += 1; + tin += 1+sample_rate_ppm/1E6; + %printf("tin: %f tout: %f f: %f\n", tin, tout, f); +end +ch_fdm_frame_log = ch_fdm_frame_log_out(1:tout-1); +%ch_fdm_frame_log *= 5000; + +%ch_fdm_frame_log = real(ch_fdm_frame_log); + +% Now run demod ---------------------------------------------------------------- + +%ch_fdm_frame_log = load_raw("~/fdmdv2-dev/build_linux/tmp.raw"); +%ch_fdm_frame_log = ch_fdm_frame_log(M:length(ch_fdm_frame_log)); +%ch_fdm_frame_log /= 5000; + +%frames = floor(acohpsk.Nsymbrowpilot*M); + +ch_fdm_frame_log_index = 1; +nin = M; +f = 0; +nin_frame = acohpsk.Nsymbrowpilot*M; + +%while (ch_fdm_frame_log_index + acohpsk.Nsymbrowpilot*M+M/P) < length(ch_fdm_frame_log) +for f=1:frames; + acohpsk.frame = f; + + ch_fdm_frame = ch_fdm_frame_log(ch_fdm_frame_log_index:ch_fdm_frame_log_index + nin_frame - 1); + ch_fdm_frame_log_index += nin_frame; + + % + % Demod ---------------------------------------------------------------------- + % + + % store two frames of received samples so we can rewind if we get a good candidate + + ch_fdm_frame_buf(1:Nsw*acohpsk.Nsymbrowpilot*M-nin_frame) = ch_fdm_frame_buf(nin_frame+1:Nsw*acohpsk.Nsymbrowpilot*M); + ch_fdm_frame_buf(Nsw*acohpsk.Nsymbrowpilot*M-nin_frame+1:Nsw*acohpsk.Nsymbrowpilot*M) = ch_fdm_frame; + + next_sync = sync; + + % if out of sync do Initial Freq offset estimation over NSW frames to flush out memories + + if (sync == 0) + + % we can test +/- 20Hz, so we break this up into 3 tests to cover +/- 60Hz + + max_ratio = 0; + for acohpsk.f_est = Fcentre-40:40:Fcentre+40 +% for acohpsk.f_est = Fcentre + + printf(" [%d] acohpsk.f_est: %f +/- 20\n", f, acohpsk.f_est); + + % we are out of sync so reset f_est and process two frames to clean out memories + + [ch_symb rx_timing rx_filt rx_baseband afdmdv acohpsk.f_est] = rate_Fs_rx_processing(afdmdv, ch_fdm_frame_buf, acohpsk.f_est, Nsw*acohpsk.Nsymbrowpilot, nin, 0); + rx_baseband_log = [rx_baseband_log rx_baseband]; + + rx_filt_log = [rx_filt_log rx_filt]; + ch_symb_log = [ch_symb_log; ch_symb]; + rx_timing_log = [rx_timing_log rx_timing]; + + for i=1:Nsw-1 + acohpsk.ct_symb_buf = update_ct_symb_buf(acohpsk.ct_symb_buf, ch_symb((i-1)*acohpsk.Nsymbrowpilot+1:i*acohpsk.Nsymbrowpilot,:), acohpsk.Nct_sym_buf, acohpsk.Nsymbrowpilot); + end + [anext_sync acohpsk] = frame_sync_fine_freq_est(acohpsk, ch_symb((Nsw-1)*acohpsk.Nsymbrowpilot+1:Nsw*acohpsk.Nsymbrowpilot,:), sync, next_sync); + + if anext_sync == 1 + %printf(" [%d] acohpsk.ratio: %f\n", f, acohpsk.ratio); + if acohpsk.ratio > max_ratio + max_ratio = acohpsk.ratio; + f_est = acohpsk.f_est - acohpsk.f_fine_est; + next_sync = anext_sync; + end + end + end + + if next_sync == 1 + + % we've found a sync candidate! + % re-process last two frames with adjusted f_est then check again + + acohpsk.f_est = f_est; + + printf(" [%d] trying sync and f_est: %f\n", f, acohpsk.f_est); + + [ch_symb rx_timing rx_filt rx_baseband afdmdv f_est] = rate_Fs_rx_processing(afdmdv, ch_fdm_frame_buf, acohpsk.f_est, Nsw*acohpsk.Nsymbrowpilot, nin, 0); + rx_baseband_log = [rx_baseband_log rx_baseband]; + rx_filt_log = [rx_filt_log rx_filt]; + ch_symb_log = [ch_symb_log; ch_symb]; + rx_timing_log = [rx_timing_log rx_timing]; + + for i=1:Nsw-1 + acohpsk.ct_symb_buf = update_ct_symb_buf(acohpsk.ct_symb_buf, ch_symb((i-1)*acohpsk.Nsymbrowpilot+1:i*acohpsk.Nsymbrowpilot,:), acohpsk.Nct_sym_buf, acohpsk.Nsymbrowpilot); + end + [next_sync acohpsk] = frame_sync_fine_freq_est(acohpsk, ch_symb((Nsw-1)*acohpsk.Nsymbrowpilot+1:Nsw*acohpsk.Nsymbrowpilot,:), sync, next_sync); + if abs(acohpsk.f_fine_est) > 2 + printf(" [%d] Hmm %f is a bit big so back to coarse est ...\n", f, acohpsk.f_fine_est); + next_sync = 0; + end + + if acohpsk.ratio < 0.9 + next_sync = 0; + end + if next_sync == 1 + % OK we are in sync! + % demodulate first frame (demod completed below) + + printf(" [%d] in sync! f_est: %f ratio: %f \n", f, f_est, acohpsk.ratio); + acohpsk.ct_symb_ff_buf(1:acohpsk.Nsymbrowpilot+2,:) = acohpsk.ct_symb_buf(acohpsk.ct+1:acohpsk.ct+acohpsk.Nsymbrowpilot+2,:); + end + end + end + + % If in sync just do sample rate processing on latest frame + + if sync == 1 + [ch_symb rx_timing rx_filt rx_baseband afdmdv acohpsk.f_est] = rate_Fs_rx_processing(afdmdv, ch_fdm_frame, acohpsk.f_est, acohpsk.Nsymbrowpilot, nin, acohpsk.ftrack_en); + [next_sync acohpsk] = frame_sync_fine_freq_est(acohpsk, ch_symb, sync, next_sync); + + acohpsk.ct_symb_ff_buf(1:2,:) = acohpsk.ct_symb_ff_buf(acohpsk.Nsymbrowpilot+1:acohpsk.Nsymbrowpilot+2,:); + acohpsk.ct_symb_ff_buf(3:acohpsk.Nsymbrowpilot+2,:) = acohpsk.ct_symb_buf(acohpsk.ct+3:acohpsk.ct+acohpsk.Nsymbrowpilot+2,:); + + rx_baseband_log = [rx_baseband_log rx_baseband]; + rx_filt_log = [rx_filt_log rx_filt]; + ch_symb_log = [ch_symb_log; ch_symb]; + rx_timing_log = [rx_timing_log rx_timing]; + f_est_log = [f_est_log acohpsk.f_est]; + %printf("%f\n", acohpsk.f_est); + end + + % if we are in sync complete demodulation with symbol rate processing + + if (next_sync == 1) || (sync == 1) + [rx_symb rx_bits rx_symb_linear amp_ phi_ sig_rms noise_rms] = qpsk_symbols_to_bits(acohpsk, acohpsk.ct_symb_ff_buf); + rx_symb_log = [rx_symb_log; rx_symb]; + rx_amp_log = [rx_amp_log; amp_]; + rx_phi_log = [rx_phi_log; phi_]; + rx_bits_log = [rx_bits_log rx_bits]; + tx_bits_prev_log = [tx_bits_prev_log prev_tx_bits2]; + ratio_log = [ratio_log acohpsk.ratio]; + ct_symb_ff_log = [ct_symb_ff_log; acohpsk.ct_symb_ff_buf(1:acohpsk.Nsymbrowpilot,:)]; + sig_rms_log = [sig_rms_log sig_rms]; + noise_rms_log = [noise_rms_log noise_rms]; + noise_rms_filt = 0.9*noise_rms_filt + 0.1*noise_rms; + noise_rms_filt_log = [noise_rms_filt_log noise_rms_filt]; + + % BER stats + + if f > 2 + error_positions = xor(tx_bits_log((f-3)*framesize+1:(f-2)*framesize), rx_bits); + Nerrs += sum(error_positions); + nerr_log = [nerr_log sum(error_positions)]; + Tbits += length(error_positions); + error_positions_hist += error_positions; + end + printf("\r [%d]", f); + end + + % reset BER stats if we lose sync + + if sync == 1 + %Nerrs = 0; + %Tbits = 0; + %nerr_log = []; + end + + [sync acohpsk] = sync_state_machine(acohpsk, sync, next_sync); + + % work out how many samples we need for next time + + nin = M; + if sync == 1 + if rx_timing(length(rx_timing)) > M/P + nin = M + M/P; + end + if rx_timing(length(rx_timing)) < -M/P + nin = M - M/P; + end + end + nin_frame = (acohpsk.Nsymbrowpilot-1)*M + nin; + %printf("%f %d %d\n", rx_timing(length(rx_timing)), nin, nin_frame); + + prev_tx_bits2 = prev_tx_bits; + prev_tx_bits = tx_bits; + +end + +ber = Nerrs/Tbits; +printf("\nOctave EsNodB: %4.1f ber..: %4.3f Nerrs..: %d Tbits..: %d\n", EsNodB, ber, Nerrs, Tbits); + +if compare_with_c + + % Output vectors from C port --------------------------------------------------- + + load ../build_linux/unittest/tcohpsk_out.txt + + % Determine bit error rate + + + sz = length(rx_bits_log_c); + Nerrs_c = sum(xor(tx_bits_log(1:sz-framesize), rx_bits_log_c(framesize+1:sz))); + Tbits_c = length(tx_bits_prev_log); + ber_c = Nerrs_c/Tbits_c; + printf("C EsNodB.....: %4.1f ber_c: %4.3f Nerrs_c: %d Tbits_c: %d\n", EsNodB, ber_c, Nerrs_c, Tbits_c); + + stem_sig_and_error(1, 111, tx_bits_log_c, tx_bits_log - tx_bits_log_c, 'tx bits', [1 length(tx_bits_log) -1.5 1.5]) + + stem_sig_and_error(2, 211, real(tx_symb_log_c), real(tx_symb_log - tx_symb_log_c), 'tx symb re', [1 length(tx_symb_log_c) -1.5 1.5]) + stem_sig_and_error(2, 212, imag(tx_symb_log_c), imag(tx_symb_log - tx_symb_log_c), 'tx symb im', [1 length(tx_symb_log_c) -1.5 1.5]) + + stem_sig_and_error(3, 211, real(tx_fdm_frame_log_c), real(tx_fdm_frame_log - tx_fdm_frame_log_c), 'tx fdm frame re', [1 length(tx_fdm_frame_log) -10 10]) + stem_sig_and_error(3, 212, imag(tx_fdm_frame_log_c), imag(tx_fdm_frame_log - tx_fdm_frame_log_c), 'tx fdm frame im', [1 length(tx_fdm_frame_log) -10 10]) + stem_sig_and_error(4, 211, real(ch_fdm_frame_log_c), real(ch_fdm_frame_log - ch_fdm_frame_log_c), 'ch fdm frame re', [1 length(ch_fdm_frame_log) -10 10]) + stem_sig_and_error(4, 212, imag(ch_fdm_frame_log_c), imag(ch_fdm_frame_log - ch_fdm_frame_log_c), 'ch fdm frame im', [1 length(ch_fdm_frame_log) -10 10]) + + c = 1; + stem_sig_and_error(5, 211, real(rx_baseband_log_c(c,:)), real(rx_baseband_log(c,:) - rx_baseband_log_c(c,:)), 'rx baseband re', [1 length(rx_baseband_log) -10 10]) + stem_sig_and_error(5, 212, imag(rx_baseband_log_c(c,:)), imag(rx_baseband_log(c,:) - rx_baseband_log_c(c,:)), 'rx baseband im', [1 length(rx_baseband_log) -10 10]) + stem_sig_and_error(6, 211, real(rx_filt_log_c(c,:)), real(rx_filt_log(c,:) - rx_filt_log_c(c,:)), 'rx filt re', [1 length(rx_filt_log) -1 1]) + stem_sig_and_error(6, 212, imag(rx_filt_log_c(c,:)), imag(rx_filt_log(c,:) - rx_filt_log_c(c,:)), 'rx filt im', [1 length(rx_filt_log) -1 1]) + + [n m] = size(ch_symb_log); + stem_sig_and_error(7, 211, real(ch_symb_log_c), real(ch_symb_log - ch_symb_log_c), 'ch symb re', [1 n -1.5 1.5]) + stem_sig_and_error(7, 212, imag(ch_symb_log_c), imag(ch_symb_log - ch_symb_log_c), 'ch symb im', [1 n -1.5 1.5]) + + [n m] = size(rx_symb_log); + stem_sig_and_error(8, 211, rx_amp_log_c, rx_amp_log - rx_amp_log_c, 'Amp Est', [1 n -1.5 1.5]) + phi_log_diff = rx_phi_log - rx_phi_log_c; + phi_log_diff(find(phi_log_diff > pi)) -= 2*pi; + phi_log_diff(find(phi_log_diff < -pi)) += 2*pi; + stem_sig_and_error(8, 212, rx_phi_log_c, phi_log_diff, 'Phase Est', [1 n -4 4]) + stem_sig_and_error(9, 211, real(rx_symb_log_c), real(rx_symb_log - rx_symb_log_c), 'rx symb re', [1 n -1.5 1.5]) + stem_sig_and_error(9, 212, imag(rx_symb_log_c), imag(rx_symb_log - rx_symb_log_c), 'rx symb im', [1 n -1.5 1.5]) + + stem_sig_and_error(10, 111, rx_bits_log_c, rx_bits_log - rx_bits_log_c, 'rx bits', [1 length(rx_bits_log) -1.5 1.5]) + stem_sig_and_error(11, 111, f_est_log_c - Fcentre - foff, f_est_log - f_est_log_c, 'f est', [1 length(f_est_log) -5 5]) + stem_sig_and_error(12, 111, rx_timing_log_c, rx_timing_log_c - rx_timing_log, 'rx timing', [1 length(rx_timing_log) -M M]) + + check(tx_bits_log, tx_bits_log_c, 'tx_bits'); + check(tx_symb_log, tx_symb_log_c, 'tx_symb'); + check(tx_fdm_frame_log, tx_fdm_frame_log_c, 'tx_fdm_frame',0.01); + check(ch_fdm_frame_log, ch_fdm_frame_log_c, 'ch_fdm_frame',0.01); + %check(rx_fdm_frame_bb_log, rx_fdm_frame_bb_log_c, 'rx_fdm_frame_bb', 0.01); + + check(ch_symb_log, ch_symb_log_c, 'ch_symb',0.05); + %check(ct_symb_ff_log, ct_symb_ff_log_c, 'ct_symb_ff',0.01); + check(rx_amp_log, rx_amp_log_c, 'rx_amp_log',0.01); + check(phi_log_diff, zeros(length(phi_log_diff), Nc*Nd), 'rx_phi_log',0.1); + check(rx_symb_log, rx_symb_log_c, 'rx_symb',0.01); + check(rx_timing_log, rx_timing_log_c, 'rx_timing',0.005); + check(rx_bits_log, rx_bits_log_c, 'rx_bits'); + check(f_est_log, f_est_log_c, 'f_est'); + check(sig_rms_log, sig_rms_log_c, 'sig_rms'); + check(noise_rms_log, noise_rms_log_c, 'noise_rms'); + + +else + + papr = max(tx_fdm_frame_log.*conj(tx_fdm_frame_log)) / mean(tx_fdm_frame_log.*conj(tx_fdm_frame_log)); + papr_dB = 10*log10(papr); + printf("av tx pwr: %4.2f PAPR: %4.2f av rx pwr: %4.2f\n", var(tx_fdm_frame_log), papr_dB, var(ch_fdm_frame_log)); + + % some other useful plots + + figure(1) + clf + subplot(211) + plot(real(tx_fdm_frame_log)) + title('tx fdm real'); + subplot(212) + plot(imag(tx_fdm_frame_log)) + title('tx fdm imag'); + + figure(2) + clf + spec = 20*log10(abs(fft(tx_fdm_frame_log))); + l = length(spec); + plot((Fs/l)*(1:l), spec) + axis([1 Fs/2 0 max(spec)]); + title('tx spectrum'); + ylabel('Amplitude (dB)') + xlabel('Frequency (Hz)') + grid; + + figure(3) + clf; + % plot combined signals to show diversity gains + combined = rx_symb_log(:,1:Nc); + for d=2:Nd + combined += rx_symb_log(:, (d-1)*Nc+1:d*Nc); + end + plot(combined*exp(j*pi/4)/sqrt(Nd),'+') + title('Scatter'); + ymax = abs(max(max(combined))); + axis([-ymax ymax -ymax ymax]) + + figure(4) + clf; + subplot(211) + plot(rx_phi_log) + subplot(212) + plot(rx_amp_log) + + figure(5) + clf; + subplot(211) + plot(rx_timing_log) + title('rx timing'); + subplot(212) + stem(ratio_log) + title('Sync ratio'); + + figure(6) + clf; + subplot(211) + stem(nerr_log) + title('Bit Errors'); + subplot(212) + plot(noise_rms_filt_log,'r', sig_rms_log,'g'); + title('Est rms signal and noise') + + figure(7); + clf; + subplot(211) + plot(foff_log,';freq offset;'); + hold on; + plot(f_est_log - Fcentre,'g;freq offset est;'); + hold off; + title('freq offset'); + legend("boxoff"); + subplot(212) + plot(foff_log(1:length(f_est_log)) - f_est_log + Fcentre) + title('freq offset estimation error'); + + figure(8) + clf + h = freqz(b,a,Fs/2); + plot(20*log10(abs(h))) + axis([1 Fs/2 -20 0]) + grid + title('SSB tx filter') + + figure(9) + clf + plot(error_positions_hist) + title('histogram of bit errors') + + +end + + +% function to write C header file of noise samples so C version gives +% extactly the same results + +function write_noise_file(uvnoise_log) + + m = length(uvnoise_log); + + filename = sprintf("../unittest/noise_samples.h"); + f=fopen(filename,"wt"); + fprintf(f,"/* unit variance complex noise samples */\n\n"); + fprintf(f,"/* Generated by write_noise_file() Octave function */\n\n"); + fprintf(f,"COMP noise[]={\n"); + for r=1:m + if r < m + fprintf(f, " {%f,%f},\n", real(uvnoise_log(r)), imag(uvnoise_log(r))); + else + fprintf(f, " {%f,%f}\n};", real(uvnoise_log(r)), imag(uvnoise_log(r))); + end + end + + fclose(f); +endfunction + + +% function to write float fading samples for use by C programs + +function write_noise_file(raw_file_name, Fs, len_samples) + [spread spread_2ms hf_gain] = init_hf_model(Fs, len_samples); + hf_gain + % interleave real imag samples + + inter = zeros(1,len_samples*4); + inter(1:4) = hf_gain; + for i=1:len_samples + inter(i*4+1) = real(spread(i)); + inter(i*4+2) = imag(spread(i)); + inter(i*4+3) = real(spread_2ms(i)); + inter(i*4+4) = imag(spread_2ms(i)); + end + f = fopen(raw_file_name,"wb"); + fwrite(f, inter, "float32"); + fclose(f); +endfunction diff --git a/codec2/tags/0.4.1/octave/test_cohpsk.m b/codec2/tags/0.4.1/octave/test_cohpsk.m new file mode 100644 index 00000000..6864488e --- /dev/null +++ b/codec2/tags/0.4.1/octave/test_cohpsk.m @@ -0,0 +1,563 @@ +% test_cohpsk.m +% David Rowe Oct 2014 +% + +% Bunch of simulations to test coherent FDM QPSK with pilot based +% coherent detection, DSSS (diversity), and rate 1/2 LDPC + +% TODO +% [X] Nc carriers, 588 bit frames +% [X] FEC +% [X] pilot insertion and removal +% [ ] delay on parity carriers +% [X] pilot based phase est +% [ ] uncoded and coded frame sync +% [X] timing estimation, RN filtering, carrier FDM +% [ ] this file getting too big - refactor +% [ ] robust coarse timing +% [ ] Np knob on GUI +% [ ] experimental tuning on EnNo_, fading[], to optimise LDPC dec perf + +% reqd to make sure we can repeat tests exactly + +rand('state',1); +randn('state',1); +graphics_toolkit ("gnuplot"); + +cohpsk; + +function test_curves + + sim_in = standard_init(); + sim_in.do_write_pilot_file = 0; + + % single test point --------------------------------------- + + sim_in.verbose = 1; + sim_in.plot_scatter = 1; + + sim_in.Esvec = 20; + sim_in.framesize = 32; + sim_in.Ntrials = 400; + sim_in.Rs = 50; + sim_in.Nc = 4; + sim_in.Np = 2; + sim_in.Ns = 4; + sim_in.Nd = 1; + sim_in.modulation = 'qpsk'; + sim_in.ldpc_code_rate = 1; + sim_in.ldpc_code = 0; + sim_in.coh_en = 1; + + sim_in.hf_sim = 1; + sim_in.hf_mag_only = 0; + sim_in.f_off = 0; + sim_in.div_timeshift = 1; + + sim_qpsk = ber_test(sim_in); + + % AWGN curves ---------------------------------------------------- + + sim_in.Ntrials = 400; + sim_in.hf_sim = 0; + sim_in.plot_scatter = 0; + sim_in.Esvec = 5:10; + + Ebvec = sim_in.Esvec - 10*log10(2); + BER_theory = 0.5*erfc(sqrt(10.^(Ebvec/10))); + + sim_in.modulation = 'dqpsk'; + sim_dqpsk = ber_test(sim_in, 'dqpsk'); + + sim_in.modulation = 'qpsk'; + sim_qpsk_pilot = ber_test(sim_in, 'qpsk'); + + % HF curves ---------------------------------------------------- + + sim_in.Ntrials = 400; + sim_in.hf_sim = 1; + sim_in.plot_scatter = 0; + sim_in.Esvec = 5:20; + sim_in.modulation = 'dqpsk'; + sim_dqpsk_hf = ber_test(sim_in, 'dqpsk'); + + sim_in.modulation = 'qpsk'; + sim_in.coh_en = 0; + sim_in.hf_mag_only = 1; + sim_qpsk_hf = ber_test(sim_in, 'qpsk'); + + sim_in.coh_en = 1; + sim_in.hf_mag_only = 0; + sim_qpsk_pilot_hf = ber_test(sim_in, 'qpsk'); + + sim_in.Nd = 2; + sim_in.div_timeshift = 1; + sim_qpsk_pilot_hf_div = ber_test(sim_in, 'qpsk'); + + sim_in.div_timeshift = sim_in.Rs; + sim_qpsk_pilot_hf_div2 = ber_test(sim_in, 'qpsk'); + + sim_in.modulation = 'qpsk'; + sim_in.coh_en = 0; + sim_in.hf_mag_only = 1; + sim_in.div_timeshift = 1; + sim_qpsk_hf_div = ber_test(sim_in, 'qpsk'); + + % plot results --------------------------------------------------- + + figure(1); + clf; + semilogy(Ebvec, BER_theory,'r;QPSK theory;') + hold on; + + semilogy(sim_dqpsk.Ebvec, sim_dqpsk.BERvec,'c;DQPSK AWGN;') + semilogy(sim_qpsk_pilot.Ebvec, sim_qpsk_pilot.BERvec,'b;QPSK pilot AWGN;') + + semilogy(sim_qpsk_hf.Ebvec, sim_qpsk_hf.BERvec,'r;QPSK HF ideal;') + semilogy(sim_qpsk_hf_div.Ebvec, sim_qpsk_hf_div.BERvec,'r;QPSK HF ideal div;') + semilogy(sim_qpsk_pilot_hf.Ebvec, sim_qpsk_pilot_hf.BERvec,'b;QPSK pilot HF;') + semilogy(sim_qpsk_pilot_hf_div.Ebvec, sim_qpsk_pilot_hf_div.BERvec,'g;QPSK pilot Nd=2 HF;') + semilogy(sim_qpsk_pilot_hf_div2.Ebvec, sim_qpsk_pilot_hf_div2.BERvec,'g;QPSK pilot Nd=2 Rs HF;') + semilogy(sim_dqpsk_hf.Ebvec, sim_dqpsk_hf.BERvec,'c;DQPSK HF;') + + hold off; + + xlabel('Eb/N0') + ylabel('BER') + grid("minor") + axis([min(sim_qpsk_hf.Ebvec) max(sim_qpsk_hf.Ebvec) 1E-3 1]) + legend("boxoff"); +endfunction + + +function test_single + + sim_in = standard_init(); + + sim_in.verbose = 1; + sim_in.plot_scatter = 1; + + sim_in.framesize = 32; + sim_in.Nc = 4; + sim_in.Rs = 50; + sim_in.Ns = 4; + sim_in.Np = 2; + sim_in.Nd = 2; + sim_in.ldpc_code_rate = 1; + sim_in.ldpc_code = 0; + + sim_in.Ntrials = 400; + sim_in.Esvec = 12; + sim_in.hf_sim = 1; + sim_in.hf_mag_only = 0; + sim_in.modulation = 'qpsk'; + sim_in.coh_en = 1; + sim_in.f_off = 0; + + sim_in.div_timeshift = 1; + + %sim_in.modulation = 'dqpsk'; + + sim_qpsk_hf = ber_test(sim_in); + + %fep=fopen("errors_450.bin","wb"); fwrite(fep, sim_qpsk_hf.ldpc_errors_log, "short"); fclose(fep); +endfunction + + +% Rate Fs test funcs ----------------------------------------------------------- + +function rate_Fs_tx(tx_filename) + sim_in = standard_init(); + + sim_in.verbose = 1; + sim_in.plot_scatter = 1; + + sim_in.framesize = 160; + sim_in.Nc = 4; + sim_in.Rs = 50; + sim_in.Ns = 4; + sim_in.Np = 2; + sim_in.Nchip = 1; + sim_in.ldpc_code_rate = 1; + sim_in.ldpc_code = 0; + + sim_in.Ntrials = 20; + sim_in.Esvec = 7; + sim_in.hf_sim = 1; + sim_in.hf_mag_only = 0; + sim_in.modulation = 'qpsk'; + + sim_in = symbol_rate_init(sim_in); + + prev_sym_tx = sim_in.prev_sym_tx; + code_param = sim_in.code_param; + tx_bits_buf = sim_in.tx_bits_buf; + framesize = sim_in.framesize; + rate = sim_in.ldpc_code_rate; + Ntrials = sim_in.Ntrials; + Rs = sim_in.Rs; + Fs = sim_in.Fs; + Nc = sim_in.Nc; + + M = Fs/Rs; + + EsNodB = sim_in.Esvec(1); + EsNo = 10^(EsNodB/10); + + rx_symb_log = []; av_tx_pwr = []; + + rn_coeff = gen_rn_coeffs(0.5, 1/Fs, Rs, 6, M); + tx_symb_buf = []; + + tx_bits = round(rand(1,framesize*rate)); + + for nn=1:Ntrials+2 + + [tx_symb tx_bits_out prev_sym_tx] = symbol_rate_tx(sim_in, tx_bits, code_param, prev_sym_tx); + tx_bits_buf(1:framesize) = tx_bits_buf(framesize+1:2*framesize); + tx_bits_buf(framesize+1:2*framesize) = tx_bits_out; + tx_symb_buf = [tx_symb_buf; tx_symb]; + end + + % zero pad and tx filter + + [m n] = size(tx_symb_buf); + zp = []; + for i=1:m + zrow = M*tx_symb_buf(i,:); + zp = [zp; zrow; zeros(M-1,Nc)]; + end + + for c=1:Nc + tx_filt(:,c) = filter(rn_coeff, 1, zp(:,c)); + end + + % upconvert to real IF and save to disk + + [m n] = size(tx_filt); + tx_fdm = zeros(1,m); + Fc = 1500; + for c=1:Nc + freq(c) = exp(j*2*pi*(Fc - c*Rs*1.5)/Fs); + end + phase_tx = ones(1,Nc); + %phase_tx = exp(j*2*pi*(0:Nc)/(Nc+1)); + + for c=1:Nc + for i=1:m + phase_tx(c) = phase_tx(c) * freq(c); + tx_fdm(i) = tx_fdm(i) + tx_filt(i,c)*phase_tx(c); + end + end + + tx_fdm = real(tx_fdm); + + %tx_fdm = compress(tx_fdm, 0.4); + %tx_fdm = sign(tx_fdm) .* (abs(tx_fdm) .^ 0.4); + %hpa_clip = max(abs(tx_fdm))*0.8 + %tx_fdm(find(abs(tx_fdm) > hpa_clip)) = hpa_clip; + + papr = max(tx_fdm.*conj(tx_fdm)) / mean(tx_fdm.*conj(tx_fdm)); + papr_dB = 10*log10(papr); + printf("PAPR: %4.2f dB\n", papr_dB); + + Ascale = 2000; + figure(1); + clf; + plot(Ascale*tx_fdm(1:8000)) + + ftx=fopen(tx_filename,"wb"); fwrite(ftx, Ascale*real(tx_fdm), "short"); fclose(ftx); + +endfunction + + +function rate_Fs_rx(rx_filename) + sim_in = standard_init(); + + sim_in.verbose = 1; + sim_in.plot_scatter = 1; + + sim_in.framesize = 160; + sim_in.Nc = 4; + sim_in.Rs = 50; + sim_in.Ns = 4; + sim_in.Np = 4; + sim_in.Nchip = 1; + sim_in.ldpc_code_rate = 1; + sim_in.ldpc_code = 0; + + sim_in.Ntrials = 10; + sim_in.Esvec = 40; + sim_in.hf_sim = 1; + sim_in.hf_mag_only = 0; + sim_in.modulation = 'qpsk'; + + sim_in = symbol_rate_init(sim_in); + + prev_sym_tx = sim_in.prev_sym_tx; + prev_sym_rx = sim_in.prev_sym_rx; + code_param = sim_in.code_param; + tx_bits_buf = sim_in.tx_bits_buf; + framesize = sim_in.framesize; + rate = sim_in.ldpc_code_rate; + Ntrials = sim_in.Ntrials; + Rs = sim_in.Rs; + Fs = sim_in.Fs; + Nc = sim_in.Nc; + Nsymbrowpilot = sim_in.Nsymbrowpilot; + pilot = sim_in.pilot; + Ns = sim_in.Ns; + Npilotsframe = sim_in.Npilotsframe; + + M = Fs/Rs; + + EsNodB = sim_in.Esvec(1); + EsNo = 10^(EsNodB/10); + + phi_log = []; amp_log = []; EsNo__log = []; + rx_symb_log = []; av_tx_pwr = []; + Terrs = Tbits = 0; + errors_log = []; Nerrs_log = []; + ldpc_Nerrs_log = []; ldpc_errors_log = []; + Ferrsldpc = Terrsldpc = Tbitsldpc = 0; + + rn_coeff = gen_rn_coeffs(0.5, 1/Fs, Rs, 6, M); + + tx_bits = round(rand(1,framesize*rate)); + + % read from disk + + Ascale = 2000; + frx=fopen(rx_filename,"rb"); rx_fdm = fread(frx, "short")/Ascale; fclose(frx); + + rx_fdm=sqrt(2)*rx_fdm; + + if 0 + % optionally add AWGN noise for testing calibration of Es//No measurement + + snr_3000Hz_dB = -9; + snr_4000Hz_lin = 10 ^ (snr_3000Hz_dB/10); + snr_4000Hz_lin *= (3000/4000); + variance = var(rx_fdm)/snr_4000Hz_lin; + rx_fdm += sqrt(variance)*randn(length(rx_fdm),1); + end + + figure(1) + plot(rx_fdm(800:1200)); + + % freq offset estimation + + printf("Freq offset and coarse timing est...\n"); + [f_max max_s_Fs] = test_freq_off_est(rx_filename, 1,5*6400); + f_max = 0; max_s_Fs = 4; + max_s = floor(max_s_Fs/M + 6); + + printf("Downconverting...\n"); + + [m n] = size(rx_fdm); + rx_symb = zeros(m,Nc); + Fc = 1500; + for c=1:Nc + freq(c) = exp(-j*2*pi*(f_max + Fc - c*Rs*1.5)/Fs); + end + phase_rx = ones(1,Nc); + rx_bb = zeros(m,Nc); + + for c=1:Nc + for i=1:m + phase_rx(c) = phase_rx(c) * freq(c); + rx_bb(i,c) = rx_fdm(i)*phase_rx(c); + end + end + + printf("Filtering...\n"); + for c=1:Nc + rx_filt(:,c) = filter(rn_coeff, 1, rx_bb(:,c)); + end + + %subplot(211); + %plot(real(rx_filt(1:10*M,9))); + %subplot(212); + %plot(imag(rx_filt(1:10*M,9))); + + % Fine timing estimation and decimation to symbol rate Rs. Break rx + % signal into ft sample blocks. If clock offset is 1000ppm, + % that's one more/less sample over Ft samples at Fs=8000 Hz. + + printf("Fine timing estimation....\n"); + ft = M*10; + [nsam m] = size(rx_filt); + rx_symb_buf = []; rx_timing_log = []; + + for st=1:ft:floor(nsam/ft - 1)*ft + % fine timing and decimation + + env = zeros(ft,1); + for c=1:Nc + env = env + abs(rx_filt(st:st+ft-1,c)); + end + + % The envelope has a frequency component at the symbol rate. The + % phase of this frequency component indicates the timing. So work out + % single DFT at frequency 2*pi/M + + x = exp(-j*2*pi*(0:ft-1)/M) * env; + + norm_rx_timing = angle(x)/(2*pi); + %norm_rx_timing = -0.4; + if norm_rx_timing < 0 + rx_timing = -floor(norm_rx_timing*M+0.5) + M; + else + rx_timing = -floor(norm_rx_timing*M+0.5) + 2*M; + end + rx_timing_log = [rx_timing_log norm_rx_timing]; + + % printf("%d %d\n", st+rx_timing, st+rx_timing+ft-1); + rx_symb_buf = [rx_symb_buf; rx_filt(st+rx_timing:M:st+rx_timing+ft-1,:)]; + end + + figure(2) + clf; + plot(rx_timing_log) + axis([1 length(rx_timing_log) -0.5 0.5 ]) + title('fine timing') + + printf("Symbol rate demodulation....\n"); + phase_off = 1; + Ntrials = floor((nsam/M)/Nsymbrowpilot) - 2; + %max_s = 6; + + for nn=1:Ntrials + + s_ch = rx_symb_buf((nn-1)*Nsymbrowpilot+max_s:nn*Nsymbrowpilot+max_s-1,:); + [rx_symb rx_bits rx_symb_linear amp_linear amp_ phi_ EsNo_ prev_sym_rx sim_in] = symbol_rate_rx(sim_in, s_ch, prev_sym_rx); + + rx_symb_log = [rx_symb_log rx_symb_linear]; + phi_log = [phi_log; phi_]; + amp_log = [amp_log; amp_]; + + if nn > 1 + EsNo__log = [EsNo__log EsNo_]; + + % Measure BER + + error_positions = xor(rx_bits(1:framesize*rate), tx_bits(1:framesize*rate)); + Nerrs = sum(error_positions); + Terrs += Nerrs; + Tbits += framesize*rate; + errors_log = [errors_log error_positions]; + Nerrs_log = [Nerrs_log Nerrs]; + + if sim_in.ldpc_code + % LDPC decode + + detected_data = ldpc_dec(code_param, sim_in.max_iterations, sim_in.demod_type, sim_in.decoder_type, ... + rx_symb_linear, min(100,EsNo_), amp_linear); + error_positions = xor(detected_data(1:framesize*rate), tx_bits(1:framesize*rate) ); + Nerrs = sum(error_positions); + ldpc_Nerrs_log = [ldpc_Nerrs_log Nerrs]; + ldpc_errors_log = [ldpc_errors_log error_positions]; + if Nerrs + Ferrsldpc++; + end + Terrsldpc += Nerrs; + Tbitsldpc += framesize*rate; + end + end + end + + EsNo_av = mean(10*log10(EsNo__log)); + printf("EsNo est (dB): %3.1f SNR est: %3.2f Terrs: %d BER %4.2f QPSK BER theory %4.2f av_tx_pwr: %3.2f", + EsNo_av, mean(EsNo_to_SNR(10*log10(EsNo__log))), + Terrs, + Terrs/Tbits, 0.5*erfc(sqrt(EsNo/2)), av_tx_pwr); + if sim_in.ldpc_code + printf("\n LDPC: Terrs: %d BER: %4.2f Ferrs: %d FER: %4.2f\n", + Terrsldpc, Terrsldpc/Tbitsldpc, Ferrsldpc, Ferrsldpc/Ntrials); + end + + figure(3); + clf; + scat = rx_symb_log .* exp(j*pi/4); + scat = scat((framesize):length(scat)); + plot(real(scat), imag(scat),'+'); + title('Scatter plot'); + + figure(4) + clf + subplot(211) + stem(Nerrs_log) + axis([0 Ntrials+1 0 max(Nerrs_log)+1]) + title('Uncoded Errors/Frame'); + if sim_in.ldpc_code + subplot(212) + stem(ldpc_Nerrs_log) + axis([0 Ntrials+1 0 max(ldpc_Nerrs_log)+1]) + title('Coded Errors/Frame'); + end + + figure(5) + clf + [m1 n1] = size(phi_log); + phi_x = []; + phi_x_counter = 1; + p = Ns; + for r=1:m1 + if p == Ns + phi_x_counter++; + p = 0; + end + p++; + phi_x = [phi_x phi_x_counter++]; + end + + subplot(211) + plot(phi_x, phi_log(:,1),'r+;Estimated HF channel phase;') + ylabel('Phase (rads)'); + legend('boxoff'); + + subplot(212) + plot(phi_x, amp_log(:,1),'r+;Estimated HF channel amp;') + ylabel('Amplitude'); + xlabel('Time (symbols)'); + legend('boxoff'); + + figure(6); + clf + plot(EsNo_to_SNR(10*log10(EsNo__log))); + title('SNR est (dB)') + + fep=fopen("errors_450.bin","wb"); fwrite(fep, ldpc_errors_log, "short"); fclose(fep); + +endfunction + + + + +function snr = EsNo_to_SNR(EsNo) + snr = interp1([20 11.8 9.0 6.7 4.9 3.3 -10], [ 3 3 0 -3 -6 -9 -9], EsNo); +endfunction + + +function gen_test_bits() + sim_in = standard_init(); + framesize = 32*10; + tx_bits = round(rand(1,framesize)); + test_bits_coh_file(tx_bits); +endfunction + + + + +% Start simulations --------------------------------------- + +more off; +%close all; +%test_curves(); +test_single(); +%rate_Fs_tx("tx_zero.raw"); +%rate_Fs_tx("tx.raw"); +%rate_Fs_rx("tx_-4dB.wav") +%rate_Fs_rx("tx.raw") +%gen_test_bits(); + diff --git a/codec2/tags/0.4.1/octave/test_cohpsk_ch.m b/codec2/tags/0.4.1/octave/test_cohpsk_ch.m new file mode 100644 index 00000000..19634ddf --- /dev/null +++ b/codec2/tags/0.4.1/octave/test_cohpsk_ch.m @@ -0,0 +1,21 @@ +% test_cohpsk_ch.m +% David Rowe May 2015 +% +% Plot outputs from test_coh_psk_ch.c + +Nc=7; Nd=2; + +load ../build_linux/src/test_cohpsk_ch_out.txt + +figure(3) +clf; + +% plot combined signals to show diversity gains + +combined = rx_symb_log_c(:,1:Nc); +for d=2:Nd + combined += rx_symb_log_c(:, (d-1)*Nc+1:d*Nc); +end +plot(combined*exp(j*pi/4)/sqrt(Nd),'+') +title('Scatter'); +axis([-2 2 -2 2]) diff --git a/codec2/tags/0.4.1/octave/test_dqpsk.m b/codec2/tags/0.4.1/octave/test_dqpsk.m new file mode 100644 index 00000000..76beaf9c --- /dev/null +++ b/codec2/tags/0.4.1/octave/test_dqpsk.m @@ -0,0 +1,394 @@ +% test_dqpsk.m +% David Rowe March 2014 +% +% Single sample/symbol DQPSK modem simulation to test modulating modem +% tx power based on speech energy. + +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 = sim_in.hf_delay_ms*Rs/1000; + hf_phase_only = sim_in.hf_phase_only; + hf_mag_only = sim_in.hf_mag_only; + 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 + + rate = 1; + + % Init HF channel model from stored sample files of spreading signal ---------------------------------- + + % 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; M = Fs/Rs; + 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)); + + % decimate down to Rs + + spread = spread(1:M:length(spread)); + spread_2ms = spread_2ms(1:M: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 = 1/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 = []; + + % init HF channel + + hf_n = 1; + hf_angle_log = []; + hf_fading = ones(1,Nsymb); % default input for ldpc dec + hf_model = ones(Ntrials*Nsymb/Nc, Nc); % defaults for plotting surface + + sim_out.errors_log = []; + sim_out.Nerrs = []; + sim_out.snr_log = []; + sim_out.hf_model_pwr = []; + + symbol_amp_index = 1; + + for nn = 1: Ntrials + + tx_bits = round( rand( 1, framesize*rate ) ); + + % 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))); + 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 + s_ch = s; + symbol_amp_index++; + + % HF channel simulation ------------------------------------ + + if hf_sim + + % separation between carriers. Note this is + % effectively under samples at Rs, I dont think this + % matters. Equivalent to doing freq shift at Fs, then + % decimating to Rs. + + wsep = 2*pi*(1+0.5); % e.g. 75Hz spacing at Rs=50Hz, alpha=0.5 filters + + if Nsymb/Nc != floor(Nsymb/Nc) + printf("Error: Nsymb/Nc must be an integrer\n") + return; + end + + % arrange symbols in Nsymb/Nc by Nc matrix + + for i=1:Nc:Nsymb + + % Determine HF channel at each carrier for this symbol + + for k=1:Nc + hf_model(hf_n, k) = hf_gain*(spread(hf_n) + exp(-j*k*wsep*nhfdelay)*spread_2ms(hf_n)); + hf_fading(i+k-1) = abs(hf_model(hf_n, k)); + if hf_mag_only + s_ch(i+k-1) *= abs(hf_model(hf_n, k)); + else + s_ch(i+k-1) *= hf_model(hf_n, k); + end + end + hf_n++; + end + end + + tx_symb_log = [tx_symb_log s_ch]; + + % "genie" SNR estimate + + snr = (s_ch*s_ch')/(Nsymb*variance); + sim_out.snr_log = [sim_out.snr_log snr]; + sim_out.hf_model_pwr = [sim_out.hf_model_pwr mean(hf_fading.^2)]; + + % 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,Nsymb) + j*randn(1,Nsymb)); + noise_log = [noise_log noise]; + + % organise into carriers to apply frequency and phase offset + + for i=1:Nc:Nsymb + for k=1:Nc + s_ch(i+k-1) = s_ch(i+k-1)*exp(j*phase_offset) + noise(i+k-1); + end + phase_offset += w_offset; + end + + % 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 + + error_positions = xor(rx_bits, tx_bits); + Nerrs = sum(error_positions); + sim_out.Nerrs = [sim_out.Nerrs Nerrs]; + Terrs += Nerrs; + Tbits += length(tx_bits); + + sim_out.errors_log = [sim_out.errors_log error_positions]; + 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(tx_symb_log), var(noise_log), + var(tx_symb_log), var(noise_log), var(tx_symb_log)/var(noise_log)); + 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 .* exp(j*pi/4); + plot(real(scat), imag(scat),'+'); + title('Scatter plot'); + + figure(3); + clf; + y = 1:Rs*2; + x = 1:Nc; + EsNodBSurface = 20*log10(abs(hf_model(y,:))) - 10*log10(variance); + mesh(x,y,EsNodBSurface); + grid + title('HF Channel Es/No'); + + if 0 + figure(4); + clf; + subplot(211) + plot(y,abs(hf_model(y,1))) + title('HF Channel Carrier 1 Mag'); + subplot(212) + plot(y,angle(hf_model(y,1))) + title('HF Channel Carrier 1 Phase'); + end + 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]; +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_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 +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]); + +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:sim_in.Ntrials)*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/codec2/tags/0.4.1/octave/test_dqpsk2.m b/codec2/tags/0.4.1/octave/test_dqpsk2.m new file mode 100644 index 00000000..08787510 --- /dev/null +++ b/codec2/tags/0.4.1/octave/test_dqpsk2.m @@ -0,0 +1,465 @@ +% 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/codec2/tags/0.4.1/octave/test_dsss.m b/codec2/tags/0.4.1/octave/test_dsss.m new file mode 100644 index 00000000..78ed90bc --- /dev/null +++ b/codec2/tags/0.4.1/octave/test_dsss.m @@ -0,0 +1,410 @@ +% test_dsss.m +% David Rowe Oct 2014 +% + +% Simulation to test FDM QPSK combined with DSSS. A low rate Codec +% (e.g. 450 bit/s) is transmitted on Nc=4 FDM carriers. This same +% information is repeated Nchip=4 times on bocks of carriers that are +% delayed by up to Rs symbols. It's like spread spectrum with a +% spreading code of 1111. Turns out this goes a long way to +% converting a fading channel into an AWGN one. Good scatter diagram +% and BER curve results. Disadvantage is more bandwidth is required. + +% When output error files used to simulate codec provided a few dB +% drop to 1dB SNR for intelligable speech for 450 codec combined with +% DSSS compared with legacy 1600 bit/s mode that has FEC. Improvement +% not as great as hoped as 1600 codec can cope with higher BER. + +1; + +% main test function + +function sim_out = ber_test(sim_in, modulation) + 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 = sim_in.hf_delay_ms*Rs/1000; + hf_mag_only = sim_in.hf_mag_only; + Nchip = sim_in.Nchip; + + bps = 2; + Nc = Nsymb = framesize/bps; + prev_sym_tx = qpsk_mod([0 0])*ones(1,Nc*Nchip); + prev_sym_rx = qpsk_mod([0 0])*ones(1,Nc*Nchip); + + tx_bits_buf = zeros(1,2*framesize); + rx_bits_buf = zeros(1,2*framesize); + rx_symb_buf = zeros(1,2*Nsymb); + + % Init HF channel model from stored sample files of spreading signal ---------------------------------- + + % 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; M = Fs/Rs; + 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)); + + % decimate down to Rs + + spread = spread(1:M:length(spread)); + spread_2ms = spread_2ms(1:M: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 = 1/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 = []; + errors_log = []; + Nerrs_log = []; + + % init HF channel + + hf_n = 1; + + % simulation starts here----------------------------------- + + for nn = 1: Ntrials + + tx_bits = round( rand( 1, framesize) ); + + % modulate -------------------------------------------- + + tx_symb=zeros(1,Nc*Nchip); + + for i=1:Nc + tx_symb(i) = qpsk_mod(tx_bits(2*(i-1)+1:2*i)); + end + + % Optionally copy to other carriers (spreading) + + for i=Nc+1:Nc:Nc*Nchip + tx_symb(i:i+Nc-1) = tx_symb(1:Nc); + end + + % Optionally DQPSK encode + + if strcmp(modulation,'dqpsk') + for i=1:Nc*Nchip + tx_symb(i) *= prev_sym_tx(i); + prev_sym_tx(i) = tx_symb(i); + end + end + + s_ch = tx_symb/sqrt(Nchip); + + % HF channel simulation ------------------------------------ + + if hf_sim + + % separation between carriers. Note this effectively + % under samples at Rs, I dont think this matters. + % Equivalent to doing freq shift at Fs, then + % decimating to Rs. + + wsep = 2*pi*(1+0.5); % e.g. 75Hz spacing at Rs=50Hz, alpha=0.5 filters + + hf_model(hf_n, :) = zeros(1,Nc); + + for i=1:Nchip + time_shift = floor(i*Rs/4); + for k=1:Nc + ahf_model = hf_gain*(spread(hf_n+time_shift) + exp(-j*k*wsep*nhfdelay)*spread_2ms(hf_n+time_shift)); + if hf_mag_only + s_ch((i-1)*Nc+k) *= abs(ahf_model); + else + s_ch((i-1)*Nc+k) *= ahf_model; + end + hf_model(hf_n, k) += ahf_model/Nchip; + end + end + hf_n++; + end + + tx_symb_log = [tx_symb_log s_ch]; + + % 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,Nsymb*Nchip) + j*randn(1,Nsymb*Nchip)); + noise_log = [noise_log noise]; + + s_ch = s_ch + noise; + + % de-modulate + + for i=1:Nc*Nchip + rx_symb(i) = s_ch(i); + if strcmp(modulation,'dqpsk') + tmp = rx_symb(i); + rx_symb(i) *= conj(prev_sym_rx(i)/abs(prev_sym_rx(i))); + prev_sym_rx(i) = tmp; + end + end + + % de-spread + + for i=Nc+1:Nc:Nchip*Nc + rx_symb(1:Nc) = rx_symb(1:Nc) + rx_symb(i:i+Nc-1); + end + + % demodulate + + rx_bits = zeros(1, framesize); + for i=1:Nc + rx_bits((2*(i-1)+1):(2*i)) = qpsk_demod(rx_symb(i)); + end + rx_symb_log = [rx_symb_log rx_symb(1:Nc)]; + + % Measure BER + + error_positions = xor(rx_bits, tx_bits); + Nerrs = sum(error_positions); + Terrs += Nerrs; + Tbits += length(tx_bits); + errors_log = [errors_log error_positions]; + Nerrs_log = [Nerrs_log Nerrs]; + end + + TERvec(ne) = Terrs; + BERvec(ne) = Terrs/Tbits; + + if verbose + av_tx_pwr = (tx_symb_log * tx_symb_log')/length(tx_symb_log); + + printf("EsNo (dB): %f Terrs: %d BER %4.2f QPSK BER theory %4.2f av_tx_pwr: %3.2f", EsNodB, Terrs, + Terrs/Tbits, 0.5*erfc(sqrt(EsNo/2)), av_tx_pwr); + printf("\n"); + end + if verbose > 1 + printf("Terrs: %d BER %f BER theory %f C %f N %f Es %f No %f Es/No %f\n\n", Terrs, + Terrs/Tbits, 0.5*erfc(sqrt(EsNo/2)), var(tx_symb_log), var(noise_log), + var(tx_symb_log), var(noise_log), var(tx_symb_log)/var(noise_log)); + end + end + + Ebvec = Esvec - 10*log10(bps); + sim_out.BERvec = BERvec; + sim_out.Ebvec = Ebvec; + sim_out.TERvec = TERvec; + sim_out.errors_log = errors_log; + + if plot_scatter + figure(2); + clf; + scat = rx_symb_log .* exp(j*pi/4); + plot(real(scat), imag(scat),'+'); + title('Scatter plot'); + + if hf_sim + figure(3); + clf; + + y = 1:(hf_n-1); + x = 1:Nc; + EsNodBSurface = 20*log10(abs(hf_model(y,:))) - 10*log10(variance); + EsNodBSurface(find(EsNodBSurface < -5)) = -5; + mesh(x,y,EsNodBSurface); + grid + axis([1 Nc 1 Rs*5 -5 15]) + title('HF Channel Es/No'); + + if verbose + av_hf_pwr = sum(abs(hf_model(y)).^2)/(hf_n-1); + printf("average HF power: %3.2f over %d symbols\n", av_hf_pwr, hf_n-1); + end + end + + figure(4) + clf + stem(Nerrs_log) + 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; + sim_in.Ntrials = 30; + sim_in.framesize = 8; + sim_in.Rs = 50; + sim_in.Nc = 4; + + 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_mag_only = 0; + + sim_in.Nchip = 1; +endfunction + +function test_curves + + sim_in = standard_init(); + + sim_in.verbose = 1; + sim_in.plot_scatter = 1; + + sim_in.Esvec = 50; + sim_in.hf_sim = 0; + sim_in.Ntrials = 1000; + + sim_qpsk_hf = ber_test(sim_in, 'qpsk'); + + sim_in.hf_sim = 0; + sim_in.plot_scatter = 0; + sim_in.Esvec = 5:15; + Ebvec = sim_in.Esvec - 10*log10(2); + BER_theory = 0.5*erfc(sqrt(10.^(Ebvec/10))); + sim_dqpsk = ber_test(sim_in, 'dqpsk'); + sim_in.hf_sim = 1; + sim_in.hf_mag_only = 1; + sim_qpsk_hf = ber_test(sim_in, 'qpsk'); + sim_dqpsk_hf = ber_test(sim_in, 'dqpsk'); + sim_in.Nchip = 4; + sim_dqpsk_hf_dsss = ber_test(sim_in, 'dqpsk'); + sim_in.hf_mag_only = 1; + sim_qpsk_hf_dsss = ber_test(sim_in, 'qpsk'); + + figure(1); + clf; + semilogy(Ebvec, BER_theory,'r;QPSK theory;') + hold on; + semilogy(sim_dqpsk.Ebvec, sim_dqpsk.BERvec,'c;DQPSK AWGN;') + semilogy(sim_qpsk_hf.Ebvec, sim_qpsk_hf.BERvec,'b;QPSK HF;') + semilogy(sim_dqpsk_hf.Ebvec, sim_dqpsk_hf.BERvec,'k;DQPSK HF;') + semilogy(sim_dqpsk_hf_dsss.Ebvec, sim_dqpsk_hf_dsss.BERvec,'g;DQPSK DSSS HF;') + semilogy(sim_qpsk_hf_dsss.Ebvec, sim_qpsk_hf_dsss.BERvec,'r;QPSK DSSS HF;') + hold off; + + xlabel('Eb/N0') + ylabel('BER') + grid("minor") + axis([min(Ebvec) max(Ebvec) 1E-3 1]) +endfunction + +function test_single + + sim_in = standard_init(); + + sim_in.verbose = 1; + sim_in.plot_scatter = 1; + + sim_in.Esvec = 10; + sim_in.hf_sim = 1; + sim_in.Nchip = 4; + sim_in.Ntrials = 500; + + sim_qpsk_hf = ber_test(sim_in, 'dqpsk'); +endfunction + +function test_1600_v_450 + + sim_in = standard_init(); + + sim_in.verbose = 1; + sim_in.plot_scatter = 1; + sim_in.Ntrials = 500; + sim_in.hf_sim = 1; + + sim_in.framesize = 32; + sim_in.Nc = 16; + sim_in.Esvec = 7; + sim_in.Nchip = 1; + + sim_dqpsk_hf_1600 = ber_test(sim_in, 'dqpsk'); + + sim_in.framesize = 8; + sim_in.Nc = 4; + sim_in.Esvec = sim_in.Esvec + 10*log10(1600/450); + sim_in.Nchip = 4; + + sim_dqpsk_hf_450 = ber_test(sim_in, 'dqpsk'); + + fep=fopen("errors_1600.bin","wb"); fwrite(fep, sim_dqpsk_hf_1600.errors_log, "short"); fclose(fep); + fep=fopen("errors_450.bin","wb"); fwrite(fep, sim_dqpsk_hf_450.errors_log, "short"); fclose(fep); + +endfunction + + +% Start simulations --------------------------------------- + +more off; + +%test_1600_v_450(); +test_curves(); diff --git a/codec2/tags/0.4.1/octave/test_dsss_pilot.m b/codec2/tags/0.4.1/octave/test_dsss_pilot.m new file mode 100644 index 00000000..1d3ec169 --- /dev/null +++ b/codec2/tags/0.4.1/octave/test_dsss_pilot.m @@ -0,0 +1,437 @@ +% test_dsss_pilot.m +% David Rowe Oct 2014 +% + +% Simulation to test FDM QPSK with pilot based coherent detection +% combined with DSSS. + +% reqd to make sure we can repeat tests exactly + +rand('state',1); +randn('state',1); + +1; + +% main test function + +function sim_out = ber_test(sim_in, modulation) + 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 = sim_in.hf_delay_ms*Rs/1000; + hf_mag_only = sim_in.hf_mag_only; + Nchip = sim_in.Nchip; + Np = sim_in.Np; + Ns = sim_in.Ns; + + bps = 2; + Nc = Nsymb = framesize/bps; + + prev_sym_tx = qpsk_mod([0 0])*ones(1,Nc*Nchip); + prev_sym_rx = qpsk_mod([0 0])*ones(1,Nc*Nchip); + + tx_bits_mem = zeros(Np*Ns+1, framesize); + tx_symb_mem = zeros(Np*Ns+1, Nc*Nchip); + s_ch_mem = zeros(Np*Ns+1, Nc*Nchip); + + % Init HF channel model from stored sample files of spreading signal ---------------------------------- + + % 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; M = Fs/Rs; + 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)); + + % decimate down to Rs + + spread = spread(1:M:length(spread)); + spread_2ms = spread_2ms(1:M: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(1:Ntrials))+var(spread_2ms(1:Ntrials))); + + % Start Simulation ---------------------------------------------------------------- + + for ne = 1:length(Esvec) + EsNodB = Esvec(ne); + EsNo = 10^(EsNodB/10); + + variance = 1/EsNo; + if verbose > 1 + printf("EsNo (dB): %f EsNo: %f variance: %f\n", EsNodB, EsNo, variance); + end + + Terrs = 0; Tbits = 0; + + s_ch_tx_log = []; + rx_symb_log = []; + noise_log = []; + errors_log = []; + Nerrs_log = []; + + % init HF channel + + hf_n = 1; + phi_ = zeros(Ntrials+Np*Ns, Nc*Nchip); + + phase_offset = 0; + w_offset = 0; + + % simulation starts here----------------------------------- + + for nn = 1:Ntrials+Np*Ns + + tx_bits = round( rand( 1, framesize) ); + tx_bits_mem(1:Np*Ns,:) = tx_bits_mem(2:Np*Ns+1,:); + for b=1:framesize + tx_bits_mem(Np*Ns+1,b) = tx_bits(b); + end + + % modulate -------------------------------------------- + + tx_symb = zeros(1,Nc*Nchip); + + for i=1:Nc + tx_symb(i) = qpsk_mod(tx_bits(2*(i-1)+1:2*i)); + end + + % Optionally copy to other carriers (spreading) + + for i=Nc+1:Nc:Nc*Nchip + tx_symb(i:i+Nc-1) = tx_symb(1:Nc); + end + + % Optionally DQPSK encode + + if strcmp(modulation,'dqpsk') + for c=1:Nc*Nchip + tx_symb(c) *= prev_sym_tx(c); + prev_sym_tx(c) = tx_symb(c); + end + end + + tx_symb_mem(1:Np*Ns,:) = tx_symb_mem(2:Np*Ns+1,:); + for c=1:Nc*Nchip + tx_symb_mem(Np*Ns+1,c) = tx_symb(c); + end + + s_ch = tx_symb/sqrt(Nchip); + + % HF channel simulation ------------------------------------ + + if hf_sim + + % separation between carriers. Note this effectively + % under samples at Rs, I dont think this matters. + % Equivalent to doing freq shift at Fs, then + % decimating to Rs. + + wsep = 2*pi*(1+0.5); % e.g. 75Hz spacing at Rs=50Hz, alpha=0.5 filters + + hf_model(hf_n, :) = zeros(1,Nc*Nchip); + + for i=1:Nchip + time_shift = floor(i*Rs/4); + for k=1:Nc + ahf_model = hf_gain*(spread(hf_n+time_shift) + exp(-j*k*wsep*nhfdelay)*spread_2ms(hf_n+time_shift)); + if hf_mag_only + s_ch((i-1)*Nc+k) *= abs(ahf_model); + else + s_ch((i-1)*Nc+k) *= ahf_model; + end + hf_model(hf_n, (i-1)*Nc+k) = ahf_model; + end + end + hf_n++; + end + + s_ch_tx_log = [s_ch_tx_log s_ch]; + + % 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,Nsymb*Nchip) + j*randn(1,Nsymb*Nchip)); + noise_log = [noise_log noise]; + + s_ch = s_ch.*exp(j*phase_offset) + noise; + phase_offset += w_offset; + + s_ch_mem(1:Np*Ns,:) = s_ch_mem(2:Np*Ns+1,:); + for c=1:Nc*Nchip + s_ch_mem(Np*Ns+1,c) = s_ch(c); + end + + % pilot based phase estimation and correction + + if Np + for c=1:Nc*Nchip + pilots = tx_symb_mem(:,c); + pilots(floor(Np*Ns/2)+1) = 0; + phi_(nn,c) = angle(pilots(1:Ns:Np*Ns+1)'*s_ch_mem(1:Ns:Np*Ns+1,c)); + end + end + + % demodulate stage 1 + + for c=1:Nc*Nchip + rx_symb(c) = s_ch_mem(floor(Np*Ns/2)+1,c) *exp(-j*phi_(nn,c)); + if strcmp(modulation,'dqpsk') + tmp = rx_symb(c); + rx_symb(c) *= conj(prev_sym_rx(c)/abs(prev_sym_rx(c))); + prev_sym_rx(c) = tmp; + end + end + + % de-spread + + for i=Nc+1:Nc:Nchip*Nc + rx_symb(1:Nc) = rx_symb(1:Nc) + rx_symb(i:i+Nc-1); + end + + % demodulate stage 2 (start when we have Np*Ns symbols in memories) + + if nn > Np*Ns + rx_bits = zeros(1, framesize); + for c=1:Nc + rx_bits((2*(c-1)+1):(2*c)) = qpsk_demod(rx_symb(c)); + tx_bits((2*(c-1)+1):(2*c)) = tx_bits_mem(floor(Np*Ns/2)+1,(2*(c-1)+1):(2*c)); + end + rx_symb_log = [rx_symb_log rx_symb(1:Nc)]; + + % Measure BER + + error_positions = xor(rx_bits, tx_bits); + Nerrs = sum(error_positions); + Terrs += Nerrs; + Tbits += length(tx_bits); + errors_log = [errors_log error_positions]; + Nerrs_log = [Nerrs_log Nerrs]; + end + end + + TERvec(ne) = Terrs; + BERvec(ne) = Terrs/Tbits; + if verbose + av_tx_pwr = (s_ch_tx_log * s_ch_tx_log')/length(s_ch_tx_log); + + printf("EsNo (dB): %3.1f Terrs: %d BER %4.2f QPSK BER theory %4.2f av_tx_pwr: %3.2f", EsNodB, Terrs, + Terrs/Tbits, 0.5*erfc(sqrt(EsNo/2)), av_tx_pwr); + printf("\n"); + end + if verbose > 1 + printf("Terrs: %d BER %f BER theory %f C %f N %f Es %f No %f Es/No %f\n\n", Terrs, + Terrs/Tbits, 0.5*erfc(sqrt(EsNo/2)), var(tx_symb_log), var(noise_log), + var(tx_symb_log), var(noise_log), var(tx_symb_log)/var(noise_log)); + end + end + + Ebvec = Esvec - 10*log10(bps); + sim_out.BERvec = BERvec; + sim_out.Ebvec = Ebvec; + sim_out.TERvec = TERvec; + sim_out.errors_log = errors_log; + + if plot_scatter + figure(2); + clf; + scat = rx_symb_log .* exp(j*pi/4); + plot(real(scat), imag(scat),'+'); + title('Scatter plot'); + + if hf_sim + figure(3); + clf; + + y = 1:(hf_n-1); + x = 1:Nc*Nchip; + EsNodBSurface = 20*log10(abs(hf_model(y,:))) - 10*log10(variance); + EsNodBSurface(find(EsNodBSurface < -5)) = -5; + mesh(x,y,EsNodBSurface); + grid + axis([1 (Nc+1)*Nchip 1 Rs*5 -5 15]) + title('HF Channel Es/No'); + + if verbose + [m n] = size(hf_model); + av_hf_pwr = sum(sum(abs(hf_model(:,:)).^2))/(m*n); + printf("average HF power: %3.2f over %d symbols\n", av_hf_pwr, m*n); + end + + figure(5); + clf + subplot(211) + [m n] = size(hf_model); + plot(angle(hf_model(1:m,1)),'g;HF channel phase;') + hold on; + lphi_ = length(phi_); + plot(phi_(1+floor(Ns*Np/2):lphi_),'r+;Estimated HF channel phase;') + ylabel('Phase (rads)'); + subplot(212) + plot(abs(hf_model(1:m,1))) + ylabel('Amplitude'); + xlabel('Time (symbols)'); + end + + figure(4) + clf + stem(Nerrs_log) + 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; + sim_in.Ntrials = 30; + sim_in.framesize = 2; + sim_in.Rs = 50; + + 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_mag_only = 0; + + sim_in.Nchip = 1; +endfunction + +function test_curves + + sim_in = standard_init(); + + sim_in.verbose = 1; + sim_in.plot_scatter = 1; + + sim_in.Esvec = 10; + sim_in.hf_sim = 1; + sim_in.Ntrials = 1000; + sim_in.Rs = 200; + sim_in.Np = 4; + sim_in.Ns = 8; + sim_in.Nchip = 1; + + sim_qpsk = ber_test(sim_in, 'qpsk'); + + sim_in.hf_sim = 0; + sim_in.plot_scatter = 0; + sim_in.Esvec = 10:20; + Ebvec = sim_in.Esvec - 10*log10(2); + BER_theory = 0.5*erfc(sqrt(10.^(Ebvec/10))); + + sim_in.Np = 0; + sim_in.Nchip = 1; + + sim_dqpsk = ber_test(sim_in, 'dqpsk'); + sim_in.hf_sim = 1; + sim_in.hf_mag_only = 1; + sim_qpsk_hf_ideal = ber_test(sim_in, 'qpsk'); + sim_in.hf_mag_only = 0; + sim_dqpsk_hf = ber_test(sim_in, 'dqpsk'); + sim_in.Np = 6; + sim_qpsk_hf_pilot = ber_test(sim_in, 'qpsk'); + sim_in.Nchip = 2; + sim_qpsk_hf_pilot_dsss = ber_test(sim_in, 'qpsk'); + + figure(1); + clf; + semilogy(Ebvec, BER_theory,'r;QPSK theory;') + hold on; + semilogy(sim_dqpsk.Ebvec, sim_dqpsk.BERvec,'c;DQPSK AWGN;') + semilogy(sim_qpsk_hf_ideal.Ebvec, sim_qpsk_hf_ideal.BERvec,'b;QPSK HF ideal;') + semilogy(sim_dqpsk_hf.Ebvec, sim_dqpsk_hf.BERvec,'k;DQPSK HF;') + semilogy(sim_qpsk_hf_pilot.Ebvec, sim_qpsk_hf_pilot.BERvec,'r;QPSK Np=6 HF;') + semilogy(sim_qpsk_hf_pilot_dsss.Ebvec, sim_qpsk_hf_pilot_dsss.BERvec,'g;QPSK Np=6 Nchip=2 HF;') + hold off; + + xlabel('Eb/N0') + ylabel('BER') + grid("minor") + axis([min(Ebvec) max(Ebvec) 1E-3 1]) +endfunction + +function test_single + + sim_in = standard_init(); + + sim_in.verbose = 1; + sim_in.plot_scatter = 1; + + sim_in.Ntrials = 1000; + sim_in.Esvec = 2; + sim_in.hf_sim = 0; + sim_in.hf_mag_only = 0; + sim_in.Nchip = 2; + sim_in.Np = 6; + sim_in.Ns = 8; + sim_in.Rs = 200; + + sim_qpsk_hf = ber_test(sim_in, 'qpsk'); +endfunction + + +% Start simulations --------------------------------------- + +more off; +test_curves(); +%test_single(); diff --git a/codec2/tags/0.4.1/octave/test_fec.m b/codec2/tags/0.4.1/octave/test_fec.m new file mode 100644 index 00000000..710ec490 --- /dev/null +++ b/codec2/tags/0.4.1/octave/test_fec.m @@ -0,0 +1,406 @@ +% test_fec.m +% David Rowe Oct 2014 +% + +% Simulation to test FDM QPSK combined with FEC. A low rate Codec +% (e.g. 450 bit/s) is transmitted on Nc=4 FDM carriers. FEC parity +% bits are repeated on a seperate block of 4 carriers that is delayed +% in time by Rs symbols (1 second). A (n,k) Read Solomon code that can +% correct (n-k)/2 errors is simulated. + +1; + +% main test function + +function sim_out = ber_test(sim_in, modulation) + Fs = 8000; + + verbose = sim_in.verbose; + 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 = sim_in.hf_delay_ms*Rs/1000; + hf_mag_only = sim_in.hf_mag_only; + n = sim_in.n; + k = sim_in.k; % k message bits + Nc = sim_in.Nc; % number of carriers + + bps = 2; + Nsymb = n/bps; % total number of symbols + Nb = Nsymb/Nc; % length of block of symbols + assert(Nb == floor(Nb), "Nb must be an integer"); + + Nck = (k/n)*Nc; % Number of carriers for data symbols + Ncp = ((n-k)/n)*Nc; % Number of carriers for parity symbols + assert(Nck == floor(Nck), "Number of carriers for data symbols must be an integer"); + assert(Ncp == floor(Ncp), "Number of carriers for parity symbols must be an integer"); + + printf("(n,k)=(%d,%d) Nsymb: %d Nc: %d Nb: %d Nck: %d Ncp: %d\n",n,k,Nsymb,Nc,Nb,Nck,Ncp); + + prev_sym_tx = qpsk_mod([0 0])*ones(1,Nc); + prev_sym_rx = qpsk_mod([0 0])*ones(1,Nc); + + % Init HF channel model from stored sample files of spreading signal ---------------------------------- + + % 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; M = Fs/Rs; + 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)); + + % decimate down to Rs + + spread = spread(1:M:length(spread)); + spread_2ms = spread_2ms(1:M: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 = 1/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 = []; + errors_log = []; + Nerrs_log = []; + + % init HF channel + + hf_n = 1; + + % simulation starts here----------------------------------- + + for nn = 1: Ntrials + + tx_bits = round(rand(1,n)); + + % modulate -------------------------------------------- + + tx_symb=zeros(Nc,Nb); + + for b=1:Nb + for c=1:Nc + i = (b-1)*Nc + c; + tx_symb(c,b) = qpsk_mod(tx_bits(2*(i-1)+1:2*i)); + if strcmp(modulation,'dqpsk') + tx_symb(c,b) *= prev_sym_tx(c); + prev_sym_tx(c) = tx_symb(c,b); + end + end + end + s_ch = tx_symb; + + % HF channel simulation ------------------------------------ + + if hf_sim + + % separation between carriers. Note this effectively + % under samples at Rs, I dont think this matters. + % Equivalent to doing freq shift at Fs, then + % decimating to Rs. + + wsep = 2*pi*(1+0.5); % e.g. 75Hz spacing at Rs=50Hz, alpha=0.5 filters + + for b=1:Nb + + % apply HF model to data symbol carriers + + for c=1:Nck + ahf_model = hf_gain*(spread(hf_n) + exp(-j*k*wsep*nhfdelay)*spread_2ms(hf_n)); + if hf_mag_only + s_ch(c,b) *= abs(ahf_model); + else + s_ch(c,b) *= ahf_model; + end + hf_model(hf_n, c) = ahf_model; + end + + % apply HF model (time shifted into the future) to parity symbol carriers + + for c=1:Ncp + ahf_model = hf_gain*(spread(hf_n+Rs) + exp(-j*k*wsep*nhfdelay)*spread_2ms(hf_n+Rs)); + if hf_mag_only + s_ch(Nck+c,b) *= abs(ahf_model); + else + s_ch(Nck+c,b) *= ahf_model; + end + hf_model(hf_n, Nck+c) = ahf_model; + end + + hf_n++; + end + end + + for b=1:Nb + for c=1:Nc + tx_symb_log = [tx_symb_log s_ch(c,b)]; + end + end + + % 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(Nc,Nb) + j*randn(Nc,Nb)); + + s_ch = s_ch + noise; + + % de-modulate + + rx_bits = zeros(1, n); + for b=1:Nb + for c=1:Nc + rx_symb(c,b) = s_ch(c,b); + if strcmp(modulation,'dqpsk') + tmp = rx_symb(c,b); + rx_symb(c,b) *= conj(prev_sym_rx(c)/abs(prev_sym_rx(c))); + prev_sym_rx(c) = tmp; + end + i = (b-1)*Nc + c; + rx_bits((2*(i-1)+1):(2*i)) = qpsk_demod(rx_symb(c,b)); + rx_symb_log = [rx_symb_log rx_symb(c,b)]; + end + end + + % Measure BER + + error_positions = xor(rx_bits, tx_bits); + Nerrs = sum(error_positions); + Terrs += Nerrs; + Tbits += length(tx_bits); + errors_log = [errors_log error_positions]; + Nerrs_log = [Nerrs_log Nerrs]; + end + + TERvec(ne) = Terrs; + BERvec(ne) = Terrs/Tbits; + + if verbose + av_tx_pwr = (tx_symb_log * tx_symb_log')/length(tx_symb_log) + + printf("EsNo (dB): %3.1f Terrs: %d BER %4.3f QPSK BER theory %4.3f av_tx_pwr: %3.2f", EsNodB, Terrs, + Terrs/Tbits, 0.5*erfc(sqrt(EsNo/2)), av_tx_pwr); + printf("\n"); + end + if verbose > 1 + printf("Terrs: %d BER %f BER theory %f C %f N %f Es %f No %f Es/No %f\n\n", Terrs, + Terrs/Tbits, 0.5*erfc(sqrt(EsNo/2)), var(tx_symb_log), var(noise_log), + var(tx_symb_log), var(noise_log), var(tx_symb_log)/var(noise_log)); + end + end + + Ebvec = Esvec - 10*log10(bps); + sim_out.BERvec = BERvec; + sim_out.Ebvec = Ebvec; + sim_out.TERvec = TERvec; + sim_out.errors_log = errors_log; + + if plot_scatter + figure(2); + clf; + scat = rx_symb_log .* exp(j*pi/4); + plot(real(scat), imag(scat),'+'); + title('Scatter plot'); + + if hf_sim + figure(3); + clf; + + y = 1:(hf_n-1); + x = 1:Nc; + EsNodBSurface = 20*log10(abs(hf_model(y,:))) - 10*log10(variance); + EsNodBSurface(find(EsNodBSurface < -5)) = -5; + mesh(x,y,EsNodBSurface); + grid + axis([1 Nc 1 Rs*5 -5 15]) + title('HF Channel Es/No'); + + if verbose + av_hf_pwr = sum(abs(hf_model(y)).^2)/(hf_n-1); + printf("average HF power: %3.2f over %d symbols\n", av_hf_pwr, hf_n-1); + end + end + + figure(4) + clf + stem(Nerrs_log) + 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; + sim_in.Ntrials = 30; + sim_in.Rs = 50; + 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_mag_only = 0; +endfunction + +function test_curves + + sim_in = standard_init(); + + sim_in.verbose = 1; + sim_in.plot_scatter = 1; + + sim_in.Esvec = 50; + sim_in.hf_sim = 0; + sim_in.Ntrials = 1000; + + sim_qpsk_hf = ber_test(sim_in, 'qpsk'); + + sim_in.hf_sim = 0; + sim_in.plot_scatter = 0; + sim_in.Esvec = 5:15; + Ebvec = sim_in.Esvec - 10*log10(2); + BER_theory = 0.5*erfc(sqrt(10.^(Ebvec/10))); + sim_dqpsk = ber_test(sim_in, 'dqpsk'); + sim_in.hf_sim = 1; + sim_in.hf_mag_only = 1; + sim_qpsk_hf = ber_test(sim_in, 'qpsk'); + sim_in.hf_mag_only = 0; + sim_dqpsk_hf = ber_test(sim_in, 'dqpsk'); + sim_in.Nchip = 4; + sim_dqpsk_hf_dsss = ber_test(sim_in, 'dqpsk'); + + figure(1); + clf; + semilogy(Ebvec, BER_theory,'r;QPSK theory;') + hold on; + semilogy(sim_dqpsk.Ebvec, sim_dqpsk.BERvec,'c;DQPSK AWGN;') + semilogy(sim_qpsk_hf.Ebvec, sim_qpsk_hf.BERvec,'b;QPSK HF;') + semilogy(sim_dqpsk_hf.Ebvec, sim_dqpsk_hf.BERvec,'k;DQPSK HF;') + semilogy(sim_dqpsk_hf_dsss.Ebvec, sim_dqpsk_hf_dsss.BERvec,'g;DQPSK DSSS HF;') + hold off; + + xlabel('Eb/N0') + ylabel('BER') + grid("minor") + axis([min(Ebvec) max(Ebvec) 1E-3 1]) +endfunction + +function test_1600_v_450 + + sim_in = standard_init(); + + sim_in.verbose = 1; + sim_in.plot_scatter = 1; + sim_in.Ntrials = 500; + sim_in.hf_sim = 1; + + sim_in.framesize = 32; + sim_in.Nc = 16; + sim_in.Esvec = 7; + sim_in.Nchip = 1; + + sim_dqpsk_hf_1600 = ber_test(sim_in, 'dqpsk'); + + sim_in.framesize = 8; + sim_in.Nc = 4; + sim_in.Esvec = sim_in.Esvec + 10*log10(1600/450); + sim_in.Nchip = 4; + + sim_dqpsk_hf_450 = ber_test(sim_in, 'dqpsk'); + + fep=fopen("errors_1600.bin","wb"); fwrite(fep, sim_dqpsk_hf_1600.errors_log, "short"); fclose(fep); + fep=fopen("errors_450.bin","wb"); fwrite(fep, sim_dqpsk_hf_450.errors_log, "short"); fclose(fep); + +endfunction + +function test_single + + sim_in = standard_init(); + + sim_in.verbose = 1; + sim_in.plot_scatter = 1; + + sim_in.n = 48*8; + sim_in.k = 24*8; + snr = 1; + sim_in.Esvec = snr + 10*log10(3000/400); + sim_in.hf_sim = 1; + sim_in.Ntrials = 100; + + sim_qpsk_hf = ber_test(sim_in, 'dqpsk'); +endfunction + + +% Start simulations --------------------------------------- + +more off; + +%test_1600_v_450(); +%test_curves(); +test_single(); diff --git a/codec2/tags/0.4.1/octave/test_foff.m b/codec2/tags/0.4.1/octave/test_foff.m new file mode 100644 index 00000000..3d26e89e --- /dev/null +++ b/codec2/tags/0.4.1/octave/test_foff.m @@ -0,0 +1,402 @@ +% test_foff.m +% David Rowe April 2015 +% +% Octave script for testing the cohpsk freq offset estimator + +graphics_toolkit ("gnuplot"); +more off; + +cohpsk; +fdmdv; +autotest; + +rand('state',1); +randn('state',1); + + +% Core function for testing frequency offset estimator. Performs one test + +function sim_out = freq_off_est_test(sim_in) + global Nfilter; + global M; + + Rs = 100; + Nc = 4; + Nd = 2; + framesize = 32; + Fs = 8000; + Fcentre = 1500; + + Nsw = 3; % numbers of sync window frames we process over. Set based + % on Nsym to flush filter memory by final frame in windw + + afdmdv.Nsym = 5; + afdmdv.Nt = 5; + + afdmdv.Fs = 8000; + afdmdv.Nc = Nd*Nc-1; + afdmdv.Rs = Rs; + M = afdmdv.M = afdmdv.Fs/afdmdv.Rs; + afdmdv.Nfilter = afdmdv.Nsym*M; + afdmdv.tx_filter_memory = zeros(afdmdv.Nc+1, afdmdv.Nfilter); + excess_bw = 0.5; + afdmdv.gt_alpha5_root = gen_rn_coeffs(excess_bw, 1/Fs, Rs, afdmdv.Nsym, afdmdv.M); + afdmdv.Fsep = afdmdv.Rs*(1+excess_bw); + afdmdv.phase_tx = ones(afdmdv.Nc+1,1); + freq_hz = afdmdv.Fsep*( -Nc*Nd/2 - 0.5 + (1:Nc*Nd).^1.1 ); + afdmdv.freq_pol = 2*pi*freq_hz/Fs; + afdmdv.freq = exp(j*afdmdv.freq_pol); + afdmdv.Fcentre = 1500; + + afdmdv.fbb_rect = exp(j*2*pi*Fcentre/Fs); + afdmdv.fbb_phase_tx = 1; + afdmdv.fbb_phase_rx = 1; + %afdmdv.phase_rx = ones(afdmdv.Nc+1,1); + afdmdv.phase_rx = 1 - 2*(mod(1:Nc*Nd,2)); + nin = M; + + P = afdmdv.P = 4; + afdmdv.Nfilter = afdmdv.Nsym*afdmdv.M; + afdmdv.rx_filter_mem_timing = zeros(afdmdv.Nc+1, afdmdv.Nt*afdmdv.P); + afdmdv.Nfiltertiming = afdmdv.M + afdmdv.Nfilter + afdmdv.M; + afdmdv.rx_filter_memory = zeros(afdmdv.Nc+1, afdmdv.Nfilter); + + acohpsk = standard_init(); + acohpsk.framesize = framesize; + acohpsk.ldpc_code = 0; + acohpsk.ldpc_code_rate = 1; + acohpsk.Nc = Nc; + acohpsk.Rs = Rs; + acohpsk.Ns = 4; + acohpsk.Nd = Nd; + acohpsk.modulation = 'qpsk'; + acohpsk.do_write_pilot_file = 0; + acohpsk = symbol_rate_init(acohpsk); + acohpsk.Ncm = 10*acohpsk.Nsymbrowpilot*M; + acohpsk.coarse_mem = zeros(1,acohpsk.Ncm); + acohpsk.Ndft = 2^(ceil(log2(acohpsk.Ncm))); + + ch_fdm_frame_buf = zeros(1, Nsw*acohpsk.Nsymbrowpilot*M); + + frames = sim_in.frames; + EsNodB = sim_in.EsNodB; + foff = sim_in.foff; + dfoff = sim_in.dfoff; + fading_en = sim_in.fading_en; + + EsNo = 10^(EsNodB/10); + hf_delay_ms = 2; + phase_ch = 1; + + rand('state',1); + tx_bits_coh = round(rand(1,framesize*10)); + ptx_bits_coh = 1; + [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); + + sync = 0; next_sync = 1; + sync_start = 1; + freq_offset_log = []; + sync_time_log = []; + ch_fdm_frame_log = []; + ch_symb_log = []; + tx_fdm_frame_log = []; + ratio_log = []; + + for f=1:frames + + acohpsk.frame = f; + + % + % Mod -------------------------------------------------------------------- + % + + tx_bits = tx_bits_coh(ptx_bits_coh:ptx_bits_coh+framesize-1); + ptx_bits_coh += framesize; + if ptx_bits_coh > length(tx_bits_coh) + ptx_bits_coh = 1; + end + + [tx_symb tx_bits] = bits_to_qpsk_symbols(acohpsk, tx_bits, [], []); + + tx_fdm_frame = []; + for r=1:acohpsk.Nsymbrowpilot + tx_onesymb = tx_symb(r,:); + [tx_baseband afdmdv] = tx_filter(afdmdv, tx_onesymb); + [tx_fdm afdmdv] = fdm_upconvert(afdmdv, tx_baseband); + tx_fdm_frame = [tx_fdm_frame tx_fdm]; + end + tx_fdm_frame_log = [tx_fdm_frame_log tx_fdm_frame]; + + % + % Channel -------------------------------------------------------------------- + % + + ch_fdm_frame = zeros(1,acohpsk.Nsymbrowpilot*M); + for i=1:acohpsk.Nsymbrowpilot*M + foff_rect = exp(j*2*pi*foff/Fs); + foff += dfoff; + phase_ch *= foff_rect; + ch_fdm_frame(i) = tx_fdm_frame(i) * phase_ch; + end + phase_ch /= abs(phase_ch); + + if fading_en + ch_fdm_delay(1:nhfdelay) = ch_fdm_delay(acohpsk.Nsymbrowpilot*M+1:nhfdelay+acohpsk.Nsymbrowpilot*M); + ch_fdm_delay(nhfdelay+1:nhfdelay+acohpsk.Nsymbrowpilot*M) = ch_fdm_frame; + + for i=1:acohpsk.Nsymbrowpilot*M + ahf_model = hf_gain*(spread(hf_n)*ch_fdm_frame(i) + spread_2ms(hf_n)*ch_fdm_delay(i)); + ch_fdm_frame(i) = ahf_model; + hf_n++; + end + end + + % each carrier has power = 2, total power 2Nc, total symbol rate NcRs, noise BW B=Fs + % Es/No = (C/Rs)/(N/B), N = var = 2NcFs/NcRs(Es/No) = 2Fs/Rs(Es/No) + + variance = 2*Fs/(acohpsk.Rs*EsNo); + uvnoise = sqrt(0.5)*(randn(1,acohpsk.Nsymbrowpilot*M) + j*randn(1,acohpsk.Nsymbrowpilot*M)); + noise = sqrt(variance)*uvnoise; + + ch_fdm_frame += noise; + ch_fdm_frame_log = [ch_fdm_frame_log ch_fdm_frame]; + + % + % Try to achieve sync -------------------------------------------------------------------- + % + + % store Nsw frames so we can rewind if we get a good candidate + + ch_fdm_frame_buf(1:(Nsw-1)*acohpsk.Nsymbrowpilot*M) = ch_fdm_frame_buf(acohpsk.Nsymbrowpilot*M+1:Nsw*acohpsk.Nsymbrowpilot*M); + ch_fdm_frame_buf((Nsw-1)*acohpsk.Nsymbrowpilot*M+1:Nsw*acohpsk.Nsymbrowpilot*M) = ch_fdm_frame; + + next_sync = sync; + sync = 0; + + if sync == 0 + + % we can test +/- 20Hz, so we break this up into 3 tests to cover +/- 60Hz + + max_ratio = 0; + for acohpsk.f_est = Fcentre-40:40:Fcentre+40 + %for acohpsk.f_est = Fcentre + + printf(" [%d] acohpsk.f_est: %f +/- 20\n", f, acohpsk.f_est); + [ch_symb rx_timing rx_filt rx_baseband afdmdv acohpsk.f_est ] = rate_Fs_rx_processing(afdmdv, ch_fdm_frame_buf, acohpsk.f_est, Nsw*acohpsk.Nsymbrowpilot, nin, 0); + + % coarse timing (frame sync) and initial fine freq est --------------------------------------------- + + for i=1:Nsw-1 + acohpsk.ct_symb_buf = update_ct_symb_buf(acohpsk.ct_symb_buf, ch_symb((i-1)*acohpsk.Nsymbrowpilot+1:i*acohpsk.Nsymbrowpilot,:), acohpsk.Nct_sym_buf, acohpsk.Nsymbrowpilot); + end + [anext_sync acohpsk] = frame_sync_fine_freq_est(acohpsk, ch_symb((Nsw-1)*acohpsk.Nsymbrowpilot+1:Nsw*acohpsk.Nsymbrowpilot,:), sync, next_sync); + + if anext_sync == 1 + printf(" [%d] acohpsk.ratio: %f\n", f, acohpsk.ratio); + if acohpsk.ratio > max_ratio + max_ratio = acohpsk.ratio; + f_est = acohpsk.f_est - acohpsk.f_fine_est; + next_sync = anext_sync; + end + end + end + end + + % we've found a sync candidate + + if (next_sync == 1) + + % rewind and re-process last few frames with f_est + + acohpsk.f_est = f_est; + printf(" [%d] trying sync and f_est: %f\n", f, acohpsk.f_est); + [ch_symb rx_timing rx_filt rx_baseband afdmdv acohpsk.f_est] = rate_Fs_rx_processing(afdmdv, ch_fdm_frame_buf, acohpsk.f_est, Nsw*acohpsk.Nsymbrowpilot, nin, 0); + ch_symb_log = ch_symb; + for i=1:Nsw-1 + acohpsk.ct_symb_buf = update_ct_symb_buf(acohpsk.ct_symb_buf, ch_symb((i-1)*acohpsk.Nsymbrowpilot+1:i*acohpsk.Nsymbrowpilot,:), acohpsk.Nct_sym_buf, acohpsk.Nsymbrowpilot); + end + [next_sync acohpsk] = frame_sync_fine_freq_est(acohpsk, ch_symb((Nsw-1)*acohpsk.Nsymbrowpilot+1:Nsw*acohpsk.Nsymbrowpilot,:), sync, next_sync); + if abs(acohpsk.f_fine_est) > 2 + printf(" [%d] Hmm %f is a bit big so back to coarse est ...\n", f, acohpsk.f_fine_est); + next_sync = 0; + end + + % candidate checks out so log stats + + if (next_sync == 1) + printf(" [%d] in sync!\n", f); + freq_offset_log = [freq_offset_log Fcentre+foff-acohpsk.f_est]; + sync_time_log = [sync_time_log f-sync_start]; + ratio_log = [ratio_log max_ratio]; + next_sync = 0; sync_start = f; + end + end + + %printf("f: %d sync: %d next_sync: %d\n", f, sync, next_sync); + [sync acohpsk] = sync_state_machine(acohpsk, sync, next_sync); + + end + + % ftx=fopen("coarse_tx.raw","wb"); fwrite(ftx, 1000*ch_fdm_frame_log, "short"); fclose(ftx); + + sim_out.freq_offset_log = freq_offset_log; + sim_out.sync_time_log = sync_time_log; + sim_out.ch_fdm_frame_log = ch_fdm_frame_log; + sim_out.ch_symb_log = ch_symb_log; + sim_out.tx_fdm_frame_log = tx_fdm_frame_log; + sim_out.ratio_log = ratio_log; +endfunction + + +function freq_off_est_test_single + sim_in.frames = 5; + sim_in.EsNodB = 120; + sim_in.foff = 0; + sim_in.dfoff = 0; + sim_in.fading_en = 0; + + sim_out = freq_off_est_test(sim_in); + + figure(1) + subplot(211) + plot(sim_out.freq_offset_log) + ylabel('f est error') + xlabel('time') + + subplot(212) + if length(sim_out.freq_offset_log) > 0 + hist(sim_out.freq_offset_log) + xlabel('f est error') + ylabel('histogram'); + end + + figure(2) + subplot(211) + plot(sim_out.sync_time_log) + ylabel('time to sync (frames)') + subplot(212) + if length(sim_out.sync_time_log) > 0 + hist(sim_out.sync_time_log) + xlabel('time to sync (frames)') + ylabel('histogram') + end + + figure(3) + subplot(211) + plot(real(sim_out.tx_fdm_frame_log(1:2*960))) + grid; + subplot(212) + plot(real(sim_out.ch_symb_log),'+') + grid; + + figure(4) + clf; + plot(sim_out.ch_symb_log,'+') + + figure(5) + clf; + plot(sim_out.ratio_log) + xlabel('time') + ylabel('ratio for sync') +endfunction + + +function [freq_off_log EsNodBSet] = freq_off_est_test_curves + EsNodBSet = [20 12 8]; + + sim_in.frames = 100; + sim_in.foff = -40; + sim_in.dfoff = 0; + sim_in.fading_en = 1; + freq_off_log = 1E6*ones(sim_in.frames, length(EsNodBSet) ); + sync_time_log = 1E6*ones(sim_in.frames, length(EsNodBSet) ); + + for i=1:length(EsNodBSet) + sim_in.EsNodB = EsNodBSet(i); + printf("%f\n", sim_in.EsNodB); + + sim_out = freq_off_est_test(sim_in); + freq_off_log(1:length(sim_out.freq_offset_log),i) = sim_out.freq_offset_log; + sync_time_log(1:length(sim_out.sync_time_log),i) = sim_out.sync_time_log; + end + + figure(1) + clf + hold on; + for i=1:length(EsNodBSet) + data = freq_off_log(find(freq_off_log(:,i) < 1E6),i); + s = std(data); + m = mean(data); + stdbar = [m-s; m+s]; + plot(EsNodBSet(i), data, '+') + plot([EsNodBSet(i) EsNodBSet(i)]+0.5, stdbar,'+-') + end + hold off + + axis([6 22 -25 25]) + if sim_in.fading_en + title_str = sprintf('foff = %d Hz Fading', sim_in.foff); + else + title_str = sprintf('foff = %d Hz AWGN', sim_in.foff); + end + title(title_str); + xlabel('Es/No (dB)') + ylabel('freq offset error (Hz)'); + + figure(2) + clf + hold on; + for i=1:length(EsNodBSet) + leg = sprintf("%d;%d dB;", i, EsNodBSet(i)); + plot(freq_off_log(find(freq_off_log(:,i) < 1E6),i),leg) + end + hold off; + title(title_str); + xlabel('test'); + ylabel('freq offset error (Hz)'); + legend('boxoff'); + + figure(3) + clf + hold on; + for i=1:length(EsNodBSet) + data = sync_time_log(find(sync_time_log(:,i) < 1E6),i); + if length(data) + s = std(data); + m = mean(data); + stdbar = [m-s; m+s]; + plot(EsNodBSet(i), data, '+') + plot([EsNodBSet(i) EsNodBSet(i)]+0.5, stdbar,'+-') + end + end + hold off; + axis([6 22 0 10]) + ylabel('sync time (frames)') + xlabel('Es/No (dB)'); + title(title_str); + + figure(4) + clf + hold on; + for i=1:length(EsNodBSet) + leg = sprintf("%d;%d dB;", i, EsNodBSet(i)); + plot(sync_time_log(find(sync_time_log(:,i) < 1E6),i),leg) + end + hold off; + title(title_str); + xlabel('test'); + ylabel('sync time (frames)'); + legend('boxoff'); + +endfunction + + +% select on of these to run: + +freq_off_est_test_single; +%freq_off_est_test_curves; + diff --git a/codec2/tags/0.4.1/octave/test_ftrack.m b/codec2/tags/0.4.1/octave/test_ftrack.m new file mode 100644 index 00000000..5082c443 --- /dev/null +++ b/codec2/tags/0.4.1/octave/test_ftrack.m @@ -0,0 +1,197 @@ +% test_ftrack.m +% +% David Rowe May 2015 +% +% Octave script that to test and develop symbol rate frequency offset +% tracking +% +% [X] add Es/No noise and measure BER +% [X] QPSK mod of random symbols +% [X] tracking 1 Hz/s freq drift shiel staying in lock +% [X] simulate R/N filter delay through filter + +rand('state',1); +randn('state',1); +graphics_toolkit ("gnuplot"); + +Fs = 8000; % sample rate +Rs = 50; % QPSK modem symbol rate +Nbits = 5000; % number of bits to simulute over +Nsymb = Nbits/2; +foff = 1; % initial freq offset +dfoff = -1/Fs; % rate of change of frequency offset in Hz/sample +M = Fs/Rs; % oversampling rate + +EsNodB = 8; % noise level +EsNo = 10^(EsNodB/10); +variance = 1/EsNo; + +Nsym = 5; % simulated delay of root nyquist filter in symbols + +% control system constants, these can be tweaked + +beta = 0.005; +g = 0.2; + +% init state variables + +phase_ch = 1; +prev_rx_symb = 1; +ftrack = 0; +filt = 0; + +% QPSK symbols ------> x -------> x ----------G(z) ------------\ +% | | | +% exp(j*w_off*n) | | +% | | +% exp(-j*w_track*n) | +% \____________________________/ +% +% for small phase/freq errors, where phase/freq detector is linear: +% +% -1 beta 1 1 +% G(z) = 1 - z g --------------- -------- ------- +% -1 -1 -1 +% 1 - (1-beta)z 1 - z 1 - z +% +% (1) (2) (3) (4) +% +% (1) - differentiator that gives us an error based on frequency difference +% (2) - first order IIR loop filter +% (3) - integrator I added so loop could track ramp inputs (i.e. freq drift) +% (4) - frequency to phase integrator implicit in VCO +% +% Note (1) and (3) cancel out, H(z) = 1, so we get a 2nd order loop. We need to keep (1) +% in the time domain implementation to make the modulation stripper work, it likes angles +% near 0. +% +% Transfer function, derived with pencil and paper: +% +% G(z) g*beta +% ------------ = ---------- * ------------------------------------ +% 1 + G(z)H(z) 1 + g*beta 2 - beta -1 1 - beta -2 +% 1 - ---------- z + ----------- z +% 1 + g*beta 1 + g*beta + +% Second order IIR filter coeffs + +a1 = (2-beta)/(1+g*beta); +a2 = (1-beta)/(1+g*beta); + +% Which can be used to work out the polar coordinates of the pole + +gamma = sqrt(a2); % radius (distance from origin) +w = acos(a1/(2*gamma)); % angular frequency + +printf("2nd order loop w: %f gamma: %f\n", w, gamma); + + +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 + + +% modulator + +tx_bits = rand(1, Nbits) > 0.5; +tx_symb = zeros(1, Nsymb); +for i=1:Nsymb + tx_symb(i) = qpsk_mod(tx_bits(2*(i-1)+1:2*i)); +end + +% run rest of simulation symbol by symbol + +rx_symb = zeros(1, Nsymb); +rx_filt = zeros(1,Nsym); + +diff_log = []; +foff_log = []; +ftrack_log = []; +mod_strip_log = []; + +for i=1:Nsymb + + % channel + + foff_rect = exp(j*2*pi*(foff-ftrack)*M/Fs); + foff += M*dfoff; + phase_ch *= foff_rect; + rx_symb(i) = tx_symb(i) * phase_ch; + noise = sqrt(variance*0.5)*(randn(1,1) + j*randn(1, 1)); + rx_symb(i) += noise; + + % simulate delay of root nyquist filter + + rx_filt(1:Nsym-1) = rx_filt(2:Nsym); + rx_filt(Nsym) = rx_symb(i); + + % freq tracking loop + + diff = rx_filt(1) .* conj(prev_rx_symb); + prev_rx_symb = rx_filt(1); + + % 4th power strips QPSK modulation, by multiplying phase by 4 + % Using the abs value of the real coord was found to help + % non-linear issues when noise power was large + + mod_strip = diff.^4; + mod_strip = abs(real(mod_strip)) + j*imag(mod_strip); + + % loop filter made up of 1st order IIR plus integrator plus gain + % term. Integrator was found to be reqd to track ramp inputs + % (i.e. freq drift) + + filt = ((1-beta)*filt + beta*angle(mod_strip)); + ftrack += g*filt; + + diff_log = [diff_log diff]; + foff_log = [foff_log foff]; + ftrack_log = [ftrack_log ftrack]; + mod_strip_log = [mod_strip_log mod_strip]; +end + +% plot results + +figure(1) +clf +plot(angle(mod_strip_log)) +title('mod stripping phase'); + +figure(2); +clf +plot(mod_strip_log,'+') +axis([-2 2 -2 2]) +title('mod stripping scatter'); + +figure(3) +clf +subplot(211) +plot(real(mod_strip_log)) +title('mod stripping real and imag'); +subplot(212) +plot(imag(mod_strip_log)) + +figure(4) +clf +subplot(211) +plot(foff_log,';foff;') +hold on +plot(ftrack_log,'g+;ftrack;') +hold off; +legend("boxoff"); +ylabel('Freq Offset Hz'); + +subplot(212) +plot(foff_log-ftrack_log,';foff-ftrack;' ) +ylabel('Freq Offset Tracking Error Hz'); +xlabel('symbols') +legend("boxoff"); + +figure(5) +freqz(g*beta/(1+g*beta), [1 -2*gamma*cos(w) gamma*gamma]) diff --git a/codec2/tags/0.4.1/octave/test_ml.m b/codec2/tags/0.4.1/octave/test_ml.m new file mode 100644 index 00000000..a735264b --- /dev/null +++ b/codec2/tags/0.4.1/octave/test_ml.m @@ -0,0 +1,361 @@ +% test_ml.m +% David Rowe Oct 2014 +% + +% Simulation to test FDM DQPSK with maximum likelihood detection on +% fading channels. Based on JPL publication 89-38 "Multiple Symbol +% Differential Detection of Uncoded and Trellis Coded MPSK" by +% Divsalar, Simon, Shahshahani. Thanks Johhn Gibbs NN7F for advice. + +% reqd to make sure we can repeat tests exactly + +rand('state',1); +randn('state',1); + +% main test function + +function sim_out = ber_test(sim_in, modulation) + Fs = 8000; + + verbose = sim_in.verbose; + Ntrials = sim_in.Ntrials; + Esvec = sim_in.Esvec; + plot_scatter = sim_in.plot_scatter; + Rs = sim_in.Rs; + hf_sim = sim_in.hf_sim; + nhfdelay = sim_in.hf_delay_ms*Rs/1000; + hf_mag_only = sim_in.hf_mag_only; + framesize = sim_in.framesize; + ml = sim_in.ml; + + bps = 2; + Nc = Nsymb = framesize/bps; % total number of symbols + + prev_sym_tx = qpsk_mod([0 0])*ones(1,Nc); + prev_sym_rx = qpsk_mod([0 0])*ones(1,Nc); + r = qpsk_mod([0 0])*ones(Nc,4); + + % Init HF channel model from stored sample files of spreading signal ---------------------------------- + + % 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; M = Fs/Rs; + 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)); + + % decimate down to Rs + + spread = spread(1:M:length(spread)); + spread_2ms = spread_2ms(1:M: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 = 1/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 = []; + errors_log = []; + Nerrs_log = []; + + % init HF channel + + hf_n = 1; + + % simulation starts here----------------------------------- + + for nn = 1: Ntrials + + tx_bits = round(rand(1,framesize)); + + % modulate -------------------------------------------- + + for c=1:Nc + tx_symb(c) = qpsk_mod(tx_bits((2*(c-1)+1):(2*c))); + if strcmp(modulation,'dqpsk') + tx_symb(c) *= prev_sym_tx(c); + prev_sym_tx(c) = tx_symb(c); + end + end + s_ch = tx_symb; + + % HF channel simulation ------------------------------------ + + if hf_sim + + % separation between carriers. Note this effectively + % under samples at Rs, I dont think this matters. + % Equivalent to doing freq shift at Fs, then + % decimating to Rs. + + wsep = 2*pi*(1+0.5); % e.g. 75Hz spacing at Rs=50Hz, alpha=0.5 filters + + for c=1:Nc + ahf_model = hf_gain*(spread(hf_n) + exp(-j*c*wsep*nhfdelay)*spread_2ms(hf_n)); + if hf_mag_only + s_ch(c) *= abs(ahf_model); + else + s_ch(c) *= ahf_model; + end + hf_model(hf_n, c) = ahf_model; + end + hf_n++; + end + + tx_symb_log = [tx_symb_log s_ch]; + + % 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,Nc) + j*randn(1,Nc)); + + s_ch = s_ch + noise; + + % de-modulate + + rx_bits = zeros(1, framesize); + for c=1:Nc + + r(c,2:4) = r(c, 1:3); + r(c,1) = s_ch(c); + + rx_symb(c) = s_ch(c); + if strcmp(modulation,'dqpsk') + tmp = rx_symb(c); + rx_symb(c) *= conj(prev_sym_rx(c)/abs(prev_sym_rx(c))); + prev_sym_rx(c) = tmp; + end + + if ml == 0 + rx_bits((2*(c-1)+1):(2*c)) = qpsk_demod(rx_symb(c)); + else + tx = [1 j -j -1]; + max_eta = 0; max_symb = tx(1); + for k=1:4 + for k_1=1:4 + for k_2=1:4 + if ml == 3 + eta = abs(r(c,3) + r(c,1)*tx(k)'*tx(k_1)' + r(c,2)*tx(k_1)')^2; + end + if ml == 4 + eta = abs(r(c,4) + r(c,1)*tx(k)'*tx(k_1)'*tx(k_2)' + r(c,2)*tx(k_1)'*tx(k_2)' + r(c,3)*tx(k_2)')^2; + end + %printf(" %d %d %f \n", k_1, k, eta); + if eta > max_eta + max_eta = eta; + max_symb = tx(k); + end + end + end + end + rx_bits((2*(c-1)+1):(2*c)) = qpsk_demod(max_symb); + end + + rx_symb_log = [rx_symb_log rx_symb(c)]; + end + + % Measure BER + + error_positions = xor(rx_bits, tx_bits); + Nerrs = sum(error_positions); + Terrs += Nerrs; + Tbits += length(tx_bits); + errors_log = [errors_log error_positions]; + Nerrs_log = [Nerrs_log Nerrs]; + end + + TERvec(ne) = Terrs; + BERvec(ne) = Terrs/Tbits; + + if verbose + av_tx_pwr = (tx_symb_log * tx_symb_log')/length(tx_symb_log); + + printf("EsNo (dB): %3.1f Terrs: %d BER %4.3f QPSK BER theory %4.3f av_tx_pwr: %3.2f", EsNodB, Terrs, + Terrs/Tbits, 0.5*erfc(sqrt(EsNo/2)), av_tx_pwr); + printf("\n"); + end + end + + Ebvec = Esvec - 10*log10(bps); + sim_out.BERvec = BERvec; + sim_out.Ebvec = Ebvec; + sim_out.TERvec = TERvec; + sim_out.errors_log = errors_log; + + if plot_scatter + figure(2); + clf; + scat = rx_symb_log .* exp(j*pi/4); + plot(real(scat), imag(scat),'+'); + title('Scatter plot'); + + if hf_sim + figure(3); + clf; + + y = 1:(hf_n-1); + x = 1:Nc; + EsNodBSurface = 20*log10(abs(hf_model(y,:))) - 10*log10(variance); + EsNodBSurface(find(EsNodBSurface < -5)) = -5; + mesh(x,y,EsNodBSurface); + grid + axis([1 Nc 1 Rs*5 -5 15]) + title('HF Channel Es/No'); + + if verbose + av_hf_pwr = sum(abs(hf_model(y)).^2)/(hf_n-1); + printf("average HF power: %3.2f over %d symbols\n", av_hf_pwr, hf_n-1); + end + end + + figure(4) + clf + stem(Nerrs_log) + 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; + sim_in.Ntrials = 30; + sim_in.Rs = 50; + sim_in.framesize = 8; + sim_in.ml = 0; + + sim_in.hf_delay_ms = 2; + sim_in.hf_sim = 0; + sim_in.hf_mag_only = 0; +endfunction + + +function test_curves + + sim_in = standard_init(); + + sim_in.Ntrials = 1000; + + sim_in.hf_sim = 0; + sim_in.plot_scatter = 0; + sim_in.Esvec = 5:15; + Ebvec = sim_in.Esvec - 10*log10(2); + BER_theory = 0.5*erfc(sqrt(10.^(Ebvec/10))); + sim_in.ml = 0; + %sim_dqpsk = ber_test(sim_in, 'dqpsk'); + sim_in.ml = 3; + %sim_dqpsk_ml3 = ber_test(sim_in, 'dqpsk'); + sim_in.ml = 4; + %sim_dqpsk_ml4 = ber_test(sim_in, 'dqpsk'); + sim_in.hf_sim = 1; + sim_in.hf_mag_only = 1; + sim_in.ml = 0; + sim_dqpsk_hf = ber_test(sim_in, 'dqpsk'); + sim_in.ml = 4; + sim_dqpsk_ml_hf3 = ber_test(sim_in, 'dqpsk'); + sim_in.ml = 4; + sim_dqpsk_ml_hf4 = ber_test(sim_in, 'dqpsk'); + + figure(1); + clf; + semilogy(Ebvec, BER_theory,'r;QPSK theory;') + hold on; + %semilogy(sim_dqpsk.Ebvec, sim_dqpsk.BERvec,'c;DQPSK AWGN;') + %semilogy(sim_dqpsk_ml3.Ebvec, sim_dqpsk_ml3.BERvec,'k;DQPSK ML N=3 AWGN;') + %semilogy(sim_dqpsk_ml4.Ebvec, sim_dqpsk_ml4.BERvec,'g;DQPSK ML N=4 AWGN;') + semilogy(sim_dqpsk_hf.Ebvec, sim_dqpsk_hf.BERvec,'c;DQPSK HF;') + semilogy(sim_dqpsk_ml_hf3.Ebvec, sim_dqpsk_ml_hf3.BERvec,'k;DQPSK ML N=3 HF;') + semilogy(sim_dqpsk_ml_hf4.Ebvec, sim_dqpsk_ml_hf4.BERvec,'g;DQPSK ML N=4 HF;') + hold off; + + xlabel('Eb/N0') + ylabel('BER') + grid("minor") + axis([min(Ebvec) max(Ebvec) 1E-3 1]) +endfunction + + +function test_single + sim_in = standard_init(); + + sim_in.verbose = 1; + sim_in.plot_scatter = 1; + sim_in.Ntrials = 500; + + sim_in.hf_mag_only = 0; + sim_in.hf_sim = 0; + sim_in.ml = 0; + sim_in.Esvec = 10; + + sim_qpsk_hf = ber_test(sim_in, 'dqpsk'); +endfunction + + +% Start simulations --------------------------------------- + +more off; + +test_curves(); +%test_single(); diff --git a/codec2/tags/0.4.1/octave/test_pilot.m b/codec2/tags/0.4.1/octave/test_pilot.m new file mode 100644 index 00000000..0117541b --- /dev/null +++ b/codec2/tags/0.4.1/octave/test_pilot.m @@ -0,0 +1,388 @@ +% test_pilot_.m +% David Rowe Oct 2014 +% + +% Simulation to test pilot assisted coherent FDM QPSK. QPSK performs +% about 4dB better than DQPSK on HF fading channels, even half of that +% would be very useful. + +% reqd to make sure we can repeat tests exactly + +rand('state',1); +randn('state',1); + +% main test function + +function sim_out = ber_test(sim_in, modulation) + Fs = 8000; + + verbose = sim_in.verbose; + Ntrials = sim_in.Ntrials; + Esvec = sim_in.Esvec; + plot_scatter = sim_in.plot_scatter; + Rs = sim_in.Rs; + hf_sim = sim_in.hf_sim; + nhfdelay = sim_in.hf_delay_ms*Rs/1000; + hf_mag_only = sim_in.hf_mag_only; + framesize = sim_in.framesize; + Np = sim_in.Np; + Ns = sim_in.Ns; + coh = sim_in.coh; + + bps = 2; + Nc = Nsymb = framesize/bps; % total number of symbols + + prev_sym_tx = qpsk_mod([0 0])*ones(1,Nc); + prev_sym_rx = qpsk_mod([0 0])*ones(1,Nc); + + % Init HF channel model from stored sample files of spreading signal ---------------------------------- + + % 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; M = Fs/Rs; + 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)); + + % decimate down to Rs + + spread = spread(1:M:length(spread)); + spread_2ms = spread_2ms(1:M: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 = 1/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 = []; + errors_log = []; + Nerrs_log = []; + + % simulation starts here----------------------------------- + + % generate all tx symbols and simulate on HF channel so we can + % use future and past samples for phase estimation. We + % simulate Ntrials+Np so we have enough samples for looking + % forward and backwards for phase estimation + + tx_bits = zeros(Ntrials+Np*Ns, framesize); + tx_symb = zeros(1, Nc); + s_ch = zeros(Ntrials+Np*Ns, Nc); + + for nn = 1: Ntrials+Np*Ns + tx_bits(nn,:) = round(rand(1,framesize)); + + % modulate -------------------------------------------- + + for c=1:Nc + tx_symb(c) = qpsk_mod(tx_bits(nn,(2*(c-1)+1):(2*c))); + if strcmp(modulation,'dqpsk') + tx_symb(c) *= prev_sym_tx(c); + prev_sym_tx(c) = tx_symb(c); + end + end + s_ch(nn,:) = tx_symb; + tx_symb_log = [tx_symb_log tx_symb]; + + if hf_sim + % separation between carriers. Note this effectively + % under samples at Rs, I dont think this matters. + % Equivalent to doing freq shift at Fs, then + % decimating to Rs. + + wsep = 2*pi*(1+0.5); % e.g. 75Hz spacing at Rs=50Hz, alpha=0.5 filters + + for c=1:Nc + hf_model(nn,c) = hf_gain*(spread(nn) + exp(-j*c*wsep*nhfdelay)*spread_2ms(nn)); + %hf_model(nn,c) = 1; + if hf_mag_only + s_ch(nn,c) *= abs(hf_model(nn,c)); + else + s_ch(nn,c) *= hf_model(nn,c); + end + end + end + end + + % add channel noise + + noise = sqrt(variance*0.5)*(randn(Ntrials+Np*Ns,Nc) + j*randn(Ntrials+Np*Ns,Nc)); + s_ch += noise; + if hf_sim + hf_model_noise = hf_model + noise; + end + + % phase estimation and demodulation + + phi_ = zeros(Ntrials+Np*Ns, Nc); + + for nn = floor(Np*Ns/2)+1:floor(Np*Ns/2)+Ntrials + + % pilot assisted phase estimation + + if coh + for c=1:Nc + k = 1; + for i = -floor(Np*Ns/2):Ns:floor(Np*Ns/2) + % ignore centre sample as that is the current symbol + if i != 0 + phase_samples(k) = hf_model_noise(nn+i,c); + %printf("i: %d symb phase: %f\n", i, angle(phase_samples(k))); + k++; + end + end + phi_(nn,c) = angle(sum(phase_samples)); + %printf("phi: %f phi_: %f\n", angle(hf_model(nn,c)), phi_(nn,c)); + s_ch(nn,c) *= exp(-j*phi_(nn,c)); + end + end + + % de-modulate + + rx_bits = zeros(1, framesize); + for c=1:Nc + rx_symb(c) = s_ch(nn,c); + if strcmp(modulation,'dqpsk') + tmp = rx_symb(c); + rx_symb(c) *= conj(prev_sym_rx(c)/abs(prev_sym_rx(c))); + prev_sym_rx(c) = tmp; + end + rx_bits((2*(c-1)+1):(2*c)) = qpsk_demod(rx_symb(c)); + rx_symb_log = [rx_symb_log rx_symb(c)]; + end + + % Measure BER + + error_positions = xor(rx_bits, tx_bits(nn,:)); + Nerrs = sum(error_positions); + Terrs += Nerrs; + Tbits += framesize; + errors_log = [errors_log error_positions]; + Nerrs_log = [Nerrs_log Nerrs]; + end + + TERvec(ne) = Terrs; + BERvec(ne) = Terrs/Tbits; + + if verbose + av_tx_pwr = (tx_symb_log * tx_symb_log')/length(tx_symb_log); + + printf("EsNo (dB): %3.1f Terrs: %d BER %4.3f QPSK BER theory %4.3f av_tx_pwr: %3.2f", EsNodB, Terrs, + Terrs/Tbits, 0.5*erfc(sqrt(EsNo/2)), av_tx_pwr); + printf("\n"); + end + end + + Ebvec = Esvec - 10*log10(bps); + sim_out.BERvec = BERvec; + sim_out.Ebvec = Ebvec; + sim_out.TERvec = TERvec; + sim_out.errors_log = errors_log; + + if plot_scatter + figure(2); + clf; + scat = rx_symb_log .* exp(j*pi/4); + plot(real(scat), imag(scat),'+'); + title('Scatter plot'); + + if hf_sim + figure(3); + clf; + + y = 1:Ntrials+floor(Np/2); + x = 1:Nc; + EsNodBSurface = 20*log10(abs(hf_model(y,:))) - 10*log10(variance); + EsNodBSurface(find(EsNodBSurface < -5)) = -5; + mesh(x,y,EsNodBSurface); + grid + axis([1 Nc 1 Rs*5 -5 15]) + title('HF Channel Es/No'); + + if verbose + [m n] = size(hf_model); + av_hf_pwr = sum(sum(abs(hf_model(:,:)).^2))/(m*n); + printf("average HF power: %3.2f over %d symbols\n", av_hf_pwr, m*n); + end + + figure(5); + clf + subplot(211) + [m n] = size(hf_model); + plot(angle(hf_model(1:m,1)),'g;HF channel phase;') + hold on; + plot(phi_(1:m,1),'r+;Estimated HF channel phase;') + ylabel('Phase (rads)'); + subplot(212) + plot(abs(hf_model(1:m,1))) + ylabel('Amplitude'); + xlabel('Time (symbols)'); + end + + figure(4) + clf + stem(Nerrs_log) + + 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; + sim_in.Ntrials = 30; + sim_in.Rs = 50; + sim_in.framesize = 8; + sim_in.ml = 0; + + sim_in.hf_delay_ms = 2; + sim_in.hf_sim = 0; + sim_in.hf_mag_only = 0; +endfunction + + +function test_curves + + sim_in = standard_init(); + + sim_in.Ntrials = 2000; + + sim_in.hf_sim = 0; + sim_in.plot_scatter = 0; + sim_in.Esvec = 5:15; + Ebvec = sim_in.Esvec - 10*log10(2); + BER_theory = 0.5*erfc(sqrt(10.^(Ebvec/10))); + + sim_in.coh = 0; + sim_in.Np = 2; + sim_in.Ns = 8; + sim_in.Rs = 100; + + sim_dqpsk = ber_test(sim_in, 'dqpsk'); + sim_in.hf_sim = 1; + sim_dqpsk_hf = ber_test(sim_in, 'dqpsk'); + + sim_in.hf_mag_only = 1; + sim_qpsk_hf_ideal = ber_test(sim_in, 'qpsk'); + sim_in.hf_mag_only = 0; + sim_in.coh = 1; + sim_in.Np = 2; + sim_in.Ns = 4; + sim_in.Rs = 100; + sim_qpsk_hf_coh1 = ber_test(sim_in, 'qpsk'); + sim_in.Np = 4; + sim_in.Ns = 4; + sim_in.Rs = 200; + sim_qpsk_hf_coh2 = ber_test(sim_in, 'qpsk'); + sim_in.Np = 4; + sim_in.Ns = 8; + sim_in.Rs = 200; + sim_qpsk_hf_coh3 = ber_test(sim_in, 'qpsk'); + + figure(1); + clf; + semilogy(Ebvec, BER_theory,'r;QPSK theory;') + hold on; + semilogy(sim_dqpsk.Ebvec, sim_dqpsk.BERvec,'k;DQPSK AWGN;') + semilogy(sim_dqpsk_hf.Ebvec, sim_dqpsk_hf.BERvec,'k;DQPSK HF;') + semilogy(sim_qpsk_hf_ideal.Ebvec, sim_qpsk_hf_ideal.BERvec,'c;QPSK HF ideal;') + semilogy(sim_qpsk_hf_coh1.Ebvec, sim_qpsk_hf_coh1.BERvec,'g;QPSK HF Rs=100 Np=2 Ns=4;') + semilogy(sim_qpsk_hf_coh2.Ebvec, sim_qpsk_hf_coh2.BERvec,'r;QPSK HF Rs=200 Np=4 Ns=4;') + semilogy(sim_qpsk_hf_coh3.Ebvec, sim_qpsk_hf_coh3.BERvec,'b;QPSK HF Rs=200 Np=4 Ns=8;') + hold off; + + xlabel('Eb/N0') + ylabel('BER') + grid("minor") + axis([min(Ebvec) max(Ebvec) 1E-3 1]) +endfunction + + +function test_single + sim_in = standard_init(); + + sim_in.verbose = 1; + sim_in.plot_scatter = 1; + sim_in.Ntrials = 1000; + + sim_in.hf_mag_only = 0; + sim_in.hf_sim = 1; + sim_in.Esvec = 10; + sim_in.coh = 1; + sim_in.Rs = 100; + sim_in.Np = 2; + sim_in.Ns = 1; + + sim_qpsk_hf = ber_test(sim_in, 'qpsk'); +endfunction + + +% Start simulations --------------------------------------- + +more off; + +test_curves(); +%test_single(); diff --git a/codec2/tags/0.4.1/octave/test_qpsk.m b/codec2/tags/0.4.1/octave/test_qpsk.m new file mode 100644 index 00000000..6d8796e0 --- /dev/null +++ b/codec2/tags/0.4.1/octave/test_qpsk.m @@ -0,0 +1,516 @@ +% test_qpsk.m +% David Rowe Feb 2014 +% +% QPSK modem simulation, initially based on code by Bill Cowley +% Generates curves BER versus E/No curves for different modems. +% Design to test coherent demodulation ideas on HF channels without +% building a full blown modem. Uses 'genie provided' estimates for +% timing estimation, frame sync. +% + +1; + +% main test function + +function sim_out = ber_test(sim_in, modulation) + Fs = 8000; + + verbose = sim_in.verbose; + framesize = sim_in.framesize; + Ntrials = sim_in.Ntrials; + Esvec = sim_in.Esvec; + phase_offset = sim_in.phase_offset; + phase_est = sim_in.phase_est; + 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*1000/Fs); + hf_phase_only = sim_in.hf_phase_only; + hf_mag_only = sim_in.hf_mag_only; + + bps = 2; + Nsymb = framesize/bps; + prev_sym_tx = qpsk_mod([0 0]); + prev_sym_rx = qpsk_mod([0 0]); + rx_symb_log = []; + + Np = sim_in.Np; % number of pilot symbols to use in phase est + Ns = sim_in.Ns; % spacing of pilot symbols, so (Nps-1) data symbols between every pilot + Nps = Np*Ns; + r_delay_line = zeros(1,Nps+1); + s_delay_line = zeros(1,Nps+1); + spread_main_phi = 0; + spread_delay_phi = 0; + spread_main_phi_log = []; + + ldpc_code = sim_in.ldpc_code; + + if ldpc_code + % Start CML library + + currentdir = pwd; + addpath '/home/david/tmp/cml/mat' % assume the source files stored here + cd /home/david/tmp/cml + CmlStartup % note that this is not in the cml path! + cd(currentdir) + + % Our LDPC library + + ldpc; + + rate = 3/4; + mod_order = 4; + modulation = 'QPSK'; + mapping = 'gray'; + + demod_type = 0; + decoder_type = 0; + max_iterations = 100; + + code_param = ldpc_init(rate, framesize, modulation, mod_order, mapping); + code_param.code_bits_per_frame = framesize; + code_param.symbols_per_frame = framesize/bps; + else + rate = 1; + end + + % 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 + + spread = spread(1000:length(spread)); + spread_2ms = 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)); + + % 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); + tx_filter_memory = zeros(1, Nfilter); + rx_filter_memory = zeros(1, Nfilter); + s_delay_line_filt = zeros(1,Nfiltsym); + tx_bits_delay_line_filt = zeros(1,Nfiltsym*bps); + hf_sim_delay_line = zeros(1,M+Nhfdelay); + + for ne = 1:length(Esvec) + Es = Esvec(ne); + EsNo = 10^(Es/10); + + % Given Es/No, determine the variance of a normal noise source: + % + % Es = C/Rs where C is carrier power (energy per unit time) and Rs is the symbole rate + % N = NoB where N is the total noise power, No is the Noise spectral density is W/Hz + % and B is the bandwidth of the noise which is Fs + % No = N/Fs + % + % equating Es/No we get: + % + % Es/No = (C/Rs)/(No/Fs) + % No = CFs/(Rs(Es/No)) + + variance = Fs/(Rs*EsNo); + Terrs = 0; Tbits = 0; Terrsldpc = 0; Tbitsldpc = 0; Ferrsldpc = 0; + if verbose > 1 + printf("EsNo (dB): %f EsNo: %f variance: %f\n", Es, EsNo, variance); + end + + % init HF channel + sc = 1; + + tx_filt_log = []; + rx_filt_log = []; + rx_baseband_log = []; + tx_baseband_log = []; + noise_log = []; + hf_angle_log = []; + tx_phase = rx_phase = 0; + tx_data_buffer = zeros(1,2*framesize); + s_data_buffer = zeros(1,2*Nsymb); + C_log = []; + + for nn = 1: Ntrials + + tx_bits = round( rand( 1, framesize*rate ) ); + %tx_bits = [1 0 zeros(1,framesize*rate-2)]; + + % modulate + + if ldpc_code + [tx_bits, s] = ldpc_enc(tx_bits, code_param); + t2 = tx_bits; + s2 = s; + else + s = zeros(1, Nsymb); + for i=1:Nsymb + tx_symb = qpsk_mod(tx_bits(2*(i-1)+1:2*i)); + %printf("shift: %f prev_sym: %f ", tx_symb, prev_sym_tx); + if strcmp(modulation,'dqpsk') + tx_symb *= prev_sym_tx; + %printf("tx_symb: %f\n", tx_symb); + prev_sym_tx = tx_symb; + end + s(i) = tx_symb; + end + end + s_ch = s; + + % root nyquist filter symbols + + for k=1:Nsymb + + % tx filter symbols + + tx_filt = zeros(1,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_ch(k); + + for i=1:M + tx_filt(i) = M*tx_filter_memory(M:M:Nfilter) * hrn(M-i+1:M:Nfilter)'; + end + tx_filter_memory(1:Nfilter-M) = tx_filter_memory(M+1:Nfilter); + tx_filter_memory(Nfilter-M+1:Nfilter) = zeros(1,M); + + % HF channel simulation + + 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_filt; + + % disable as a wrap around will cause a nasty phase jump. Best to generate + % longer files + %if ((sc+M) > length(spread)) || ((sc+M) > length(spread_2ms)) + % sc =1 ; + %end + comb = conj(spread(sc:sc+M-1))' + conj(spread_2ms(sc:sc+M-1))'; + if hf_phase_only + tx_filt = tx_filt.*exp(j*angle(comb)); + else + if hf_mag_only + comb = conj(spread(sc:sc+M-1))' + conj(spread_2ms(sc:sc+M-1))'; + tx_filt = tx_filt.*abs(comb); + else + % regular HF channel sim + tx_filt = tx_filt.*conj(spread(sc:sc+M-1))' + hf_sim_delay_line(1:M).*conj(spread_2ms(sc:sc+M-1))'; + end + end + sc += M; + + % normalise so average HF power C=1 + + if hf_phase_only == 0 % C already 1 if we are just tweaking phase + tx_filt *= hf_gain; + end + C_log = [C_log abs(comb)*hf_gain]; + end + tx_filt_log = [tx_filt_log tx_filt]; + hf_angle_log = [hf_angle_log angle(comb)]; + + % 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]; + rx_baseband = tx_filt.*exp(j*phase_offset) + noise; + phase_offset += w_offset; + + % rx filter symbol + + 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); + rx_filt_log = [rx_filt_log rx_filt]; + + % delay in tx symbols to compensate for filtering + % delay, as tx symbols are used as pilot symbols input + % to phase est + + s_delay_line_filt(1:Nfiltsym-1) = s_delay_line_filt(2:Nfiltsym); + s_delay_line_filt(Nfiltsym) = s(k); + s(k) = s_delay_line_filt(1); + + % delay in tx bits to compensate for filtering delay + + tx_bits_delay_line_filt(1:(Nfiltsym-1)*bps) = tx_bits_delay_line_filt(bps+1:Nfiltsym*bps); + tx_bits_delay_line_filt((Nfiltsym-1)*bps+1:Nfiltsym*bps) = tx_bits((k-1)*bps+1:k*bps); + tx_bits((k-1)*bps+1:k*bps) = tx_bits_delay_line_filt(1:bps); + + s_ch(k) = rx_filt; + end + + % coherent demod phase estimation and correction using pilot symbols + % cheating a bit here, we use fact that all tx-ed symbols are known + + if phase_est + for i=1:Nsymb + + % delay line for phase est window + + r_delay_line(1:Nps-1) = r_delay_line(2:Nps); + r_delay_line(Nps) = s_ch(i); + + % delay in tx data to compensate data for phase est window + + s_delay_line(1:Nps-1) = s_delay_line(2:Nps); + s_delay_line(Nps) = s(i); + tx_bits(2*(i-1)+1:2*i) = qpsk_demod(s_delay_line(floor(Nps/2)+1)); + + % estimate phase from surrounding known pilot symbols and correct + + corr = 0; centre = floor(Nps/2)+1; + for k=1:Ns:(Nps+1) + if (k != centre) + corr += s_delay_line(k) * r_delay_line(k)'; + end + end + s_ch(i) = r_delay_line(centre).*exp(j*angle(corr)); + end + %printf("corr: %f angle: %f\n", corr, angle(corr)); + end + + % de-modulate + + rx_bits = zeros(1, framesize); + for i=1:Nsymb + rx_symb = s_ch(i); + if strcmp(modulation,'dqpsk') + tmp = rx_symb; + rx_symb *= conj(prev_sym_rx/abs(prev_sym_rx)); + prev_sym_rx = tmp; + end + rx_bits((2*(i-1)+1):(2*i)) = qpsk_demod(rx_symb); + rx_symb_log = [rx_symb_log rx_symb]; + end + + % Measure BER + + % discard bits from first 2*Nfiltsym+Nps+1 symbols as tx + % and rx filter and phase est memories not full + + skip = bps*(2*Nfiltsym+1+Nps+1); + if nn == 1 + tx_bits_tmp = tx_bits(skip:length(tx_bits)); + rx_bits_tmp = rx_bits(skip:length(rx_bits)); + else + tx_bits_tmp = tx_bits; + rx_bits_tmp = rx_bits; + end + + error_positions = xor( rx_bits_tmp, tx_bits_tmp ); + Nerrs = sum(error_positions); + Terrs += Nerrs; + Tbits += length(tx_bits_tmp); + + % Optionally LDPC decode + + if ldpc_code + % filter memories etc screw up frame alignment so we need to buffer a frame + + tx_data_buffer(1:framesize) = tx_data_buffer(framesize+1:2*framesize); + s_data_buffer(1:Nsymb) = s_data_buffer(Nsymb+1:2*Nsymb); + tx_data_buffer(framesize+1:2*framesize) = tx_bits; + s_data_buffer(Nsymb+1:2*Nsymb) = s_ch; + + offset = Nfiltsym-1; + if (phase_est) + offset += floor(Nps/2); + end + st_tx = offset*bps+1; + st_s = offset; + + detected_data = ldpc_dec(code_param, max_iterations, demod_type, decoder_type, ... + s_data_buffer(st_s+1:st_s+Nsymb), min(100,EsNo)); + + % ignore first frame as filter, phase est memories filling up + if nn != 1 + error_positions = xor( detected_data(1:framesize*rate), ... + tx_data_buffer(st_tx:st_tx+framesize*rate-1) ); + Nerrs = sum(error_positions); + if Nerrs + Ferrsldpc++; + end + Terrsldpc += Nerrs; + Tbitsldpc += framesize*rate; + end + end + + end + + TERvec(ne) = Terrs; + BERvec(ne) = Terrs/Tbits; + if ldpc_code + TERldpcvec(ne) = Terrsldpc; + FERldpcvec(ne) = Ferrsldpc; + BERldpcvec(ne) = Terrsldpc/Tbitsldpc; + end + + if verbose + printf("EsNo (dB): %f Terrs: %d BER %f BER theory %f", Es, Terrs, + Terrs/Tbits, 0.5*erfc(sqrt(EsNo/2))); + if ldpc_code + printf(" LDPC: Terrs: %d BER: %f Ferrs: %d FER: %f", + Terrsldpc, Terrsldpc/Tbitsldpc, Ferrsldpc, Ferrsldpc/(Ntrials-1)); + end + printf("\n"); + end + if verbose > 1 + printf("Terrs: %d BER %f BER theory %f C %f N %f Es %f No %f Es/No %f\n\n", Terrs, + Terrs/Tbits, 0.5*erfc(sqrt(EsNo/2)), var(tx_filt_log), var(noise_log), + var(tx_filt_log)/Rs, var(noise_log)/Fs, (var(tx_filt_log)/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 ldpc_code + sim_out.BERldpcvec = BERldpcvec; + sim_out.TERldpcvec = TERldpcvec; + sim_out.FERldpcvec = FERldpcvec; + end + + if plot_scatter + figure(2); + clf; + scat = rx_symb_log(2*Nfiltsym:length(rx_symb_log)) .* exp(j*pi/4); + plot(real(scat), imag(scat),'+'); + + figure(3); + clf; + + subplot(211) + plot(C_log); + subplot(212) + plot(hf_angle_log); + axis([1 10000 min(hf_angle_log) max(hf_angle_log)]) + 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 + +% Start simulations --------------------------------------- + +more off; +sim_in.verbose = 2; + +sim_in.Esvec = 5; +sim_in.Ntrials = 100; +sim_in.framesize = 100; +sim_in.Rs = 400; +sim_in.phase_offset = 0; +sim_in.phase_est = 0; +sim_in.w_offset = 0; +sim_in.plot_scatter = 1; +sim_in.hf_delay_ms = 2; +sim_in.hf_sim = 1; +sim_in.Np = 6; +sim_in.Ns = 5; +sim_in.hf_phase_only = 0; +sim_in.hf_mag_only = 1; +sim_in.ldpc_code = 0; + +Ebvec = sim_in.Esvec - 10*log10(2); +BER_theory = 0.5*erfc(sqrt(10.^(Ebvec/10))); + +sim_qpsk = ber_test(sim_in, 'qpsk'); + +figure(1); +clf; +semilogy(Ebvec, BER_theory,'r;QPSK theory;') +hold on; +semilogy(sim_qpsk.Ebvec, sim_qpsk.BERvec,'g;QPSK;') +hold off; +xlabel('Eb/N0') +ylabel('BER') +grid("minor") + + +if 0 +sim_in.hf_mag_only = 1; +sim_qpsk_mag = ber_test(sim_in, 'qpsk'); + +sim_in.hf_mag_only = 0; +sim_in.hf_phase_only = 1; +sim_in.phase_est = 1; +sim_qpsk_phase = ber_test(sim_in, 'qpsk'); + +sim_in.hf_phase_only = 0; +sim_qpsk_coh_6_5 = ber_test(sim_in, 'qpsk'); + +sim_in.phase_est = 0; +sim_dqpsk = ber_test(sim_in, 'dqpsk'); + +figure(1); +clf; +semilogy(Ebvec, BER_theory,'r;QPSK theory;') +hold on; +semilogy(sim_qpsk_mag.Ebvec, sim_qpsk_mag.BERvec,'g;QPSK CCIR poor mag;') +semilogy(sim_qpsk_phase.Ebvec, sim_qpsk_phase.BERvec,'k;QPSK CCIR poor phase;') +semilogy(sim_qpsk_coh_6_5.Ebvec, sim_qpsk_coh_6_5.BERvec,'c;QPSK CCIR poor Np=6 Ns=5;') +semilogy(sim_dqpsk.Ebvec, sim_dqpsk.BERvec,'b;DQPSK CCIR poor;') +%semilogy(sim_qpsk_coh_5_24.Ebvec, sim_qpsk_coh_5_24.BERvec,'k;QPSK Ns=5 Np=24;') +%semilogy(sim_qpsk_coh_2_12.Ebvec, sim_qpsk_coh_2_12.BERvec,'c;QPSK Ns=2 Np=12;') +hold off; +xlabel('Eb/N0') +ylabel('BER') +grid("minor") +axis([min(Ebvec)-1 max(Ebvec)+1 1E-2 1]) +end diff --git a/codec2/tags/0.4.1/octave/test_qpsk2.m b/codec2/tags/0.4.1/octave/test_qpsk2.m new file mode 100644 index 00000000..bf7bd8e9 --- /dev/null +++ b/codec2/tags/0.4.1/octave/test_qpsk2.m @@ -0,0 +1,635 @@ +% test_qps2k.m +% David Rowe Feb 2014 +% +% QPSK modem simulation, version 2. Simplifed version of +% test_qpsk. initially based on code by Bill Cowley Generates curves +% BER versus E/No curves for different modems. Design to test +% coherent demodulation ideas on HF channels without building a full +% blown modem. Uses 'genie provided' estimates for timing estimation, +% frame sync. + +1; + +% main test function + +function sim_out = ber_test(sim_in, modulation) + Fs = 8000; + + verbose = sim_in.verbose; + framesize = sim_in.framesize; + Ntrials = sim_in.Ntrials; + Esvec = sim_in.Esvec; + phase_offset = sim_in.phase_offset; + phase_est = sim_in.phase_est; + w_offset = sim_in.w_offset; + plot_scatter = sim_in.plot_scatter; + Rs = sim_in.Rs; + hf_sim = sim_in.hf_sim; + nhfdelay = sim_in.hf_delay_ms*Rs/1000; + hf_phase_only = sim_in.hf_phase_only; + hf_mag_only = sim_in.hf_mag_only; + Nc = sim_in.Nc; + + bps = 2; + Nsymb = framesize/bps; + prev_sym_tx = qpsk_mod([0 0]); + prev_sym_rx = qpsk_mod([0 0]); + + phase_est_method = sim_in.phase_est_method; + if phase_est_method == 1 + Nps = sim_in.Np; + else + Np = sim_in.Np; + Ns = sim_in.Ns; + if Np/2 == floor(Np/2) + printf("Np must be odd\n"); + return; + end + Nps = (Np-1)*Ns+1; + end + r_delay_line = zeros(Nc, Nps); + s_delay_line = zeros(Nc, Nps); + ph_est_log = []; + + phase_noise_amp = sim_in.phase_noise_amp; + + ldpc_code = sim_in.ldpc_code; + + tx_bits_buf = zeros(1,2*framesize); + rx_bits_buf = zeros(1,2*framesize); + rx_symb_buf = zeros(1,2*Nsymb); + + % Init LDPC -------------------------------------------------------------------- + + if ldpc_code + % Start CML library + + currentdir = pwd; + addpath '/home/david/tmp/cml/mat' % assume the source files stored here + cd /home/david/tmp/cml + CmlStartup % note that this is not in the cml path! + cd(currentdir) + + % Our LDPC library + + ldpc; + + rate = sim_in.ldpc_code_rate; + mod_order = 4; + modulation = 'QPSK'; + mapping = 'gray'; + + demod_type = 0; + decoder_type = 0; + max_iterations = 100; + + code_param = ldpc_init(rate, framesize, modulation, mod_order, mapping); + code_param.code_bits_per_frame = framesize; + code_param.symbols_per_frame = framesize/bps; + else + rate = 1; + end + + % Init HF channel model from stored sample files of spreading signal ---------------------------------- + + % 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; M = Fs/Rs; + 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)); + + % decimate down to Rs + + spread = spread(1:M:length(spread)); + spread_2ms = spread_2ms(1:M: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 = 1/EsNo; + if verbose > 1 + printf("EsNo (dB): %f EsNo: %f variance: %f\n", EsNodB, EsNo, variance); + end + + Terrs = 0; Tbits = 0; Terrsldpc = 0; Tbitsldpc = 0; Ferrsldpc = 0; + + tx_symb_log = []; + rx_symb_log = []; + noise_log = []; + mod_strip_log = []; + + % init HF channel + + hf_n = 1; + hf_angle_log = []; + hf_fading = ones(1,Nsymb); % default input for ldpc dec + hf_model = ones(Ntrials*Nsymb/Nc, Nc); % defaults for plotting surface + + for nn = 1: Ntrials + + tx_bits = round( rand( 1, framesize*rate ) ); + + % modulate -------------------------------------------- + + if ldpc_code + [tx_bits, s] = ldpc_enc(tx_bits, code_param); + else + s = zeros(1, Nsymb); + for i=1:Nsymb + tx_symb = qpsk_mod(tx_bits(2*(i-1)+1:2*i)); + if strcmp(modulation,'dqpsk') + tx_symb *= prev_sym_tx; + prev_sym_tx = tx_symb; + end + s(i) = tx_symb; + end + end + tx_bits_buf(1:framesize) = tx_bits_buf(framesize+1:2*framesize); + tx_bits_buf(framesize+1:2*framesize) = tx_bits; + s_ch = s; + + % HF channel simulation ------------------------------------ + + if hf_sim + + % separation between carriers. Note this is + % effectively under samples at Rs, I dont think this + % matters. Equivalent to doing freq shift at Fs, then + % decimating to Rs. + + wsep = 2*pi*(1+0.5); % e.g. 75Hz spacing at Rs=50Hz, alpha=0.5 filters + + if Nsymb/Nc != floor(Nsymb/Nc) + printf("Error: Nsymb/Nc must be an integrer\n") + return; + end + + % arrange symbols in Nsymb/Nc by Nc matrix + + for i=1:Nc:Nsymb + + % Determine HF channel at each carrier for this symbol + + for k=1:Nc + hf_model(hf_n, k) = hf_gain*(spread(hf_n) + exp(-j*k*wsep*nhfdelay)*spread_2ms(hf_n)); + hf_fading(i+k-1) = abs(hf_model(hf_n, k)); + if hf_mag_only + s_ch(i+k-1) *= abs(hf_model(hf_n, k)); + else + s_ch(i+k-1) *= hf_model(hf_n, k); + end + end + hf_n++; + end + end + + tx_symb_log = [tx_symb_log s_ch]; + + % 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,Nsymb) + j*randn(1,Nsymb)); + noise_log = [noise_log noise]; + phase_noise = phase_noise_amp*(2.0*rand(1,Nsymb)-1.0); + + % organise into carriers to apply frequency and phase offset + + for i=1:Nc:Nsymb + for k=1:Nc + s_ch(i+k-1) = s_ch(i+k-1)*exp(j*(phase_offset+phase_noise(i+k-1))) + noise(i+k-1); + end + phase_offset += w_offset; + end + + % phase estimation + + ph_est = zeros(Nc,1); + + if phase_est + + % organise into carriers + + for i=1:Nc:Nsymb + + for k=1:Nc + centre = floor(Nps/2)+1; + + % delay line for phase est window + + r_delay_line(k,1:Nps-1) = r_delay_line(k,2:Nps); + r_delay_line(k,Nps) = s_ch(i+k-1); + + % delay in tx data to compensate data for phase est window + + s_delay_line(k,1:Nps-1) = s_delay_line(k,2:Nps); + s_delay_line(k,Nps) = s(i+k-1); + %tx_bits(2*(i+k-1-1)+1:2*(i+k-1)) = qpsk_demod(s_delay_line(k,centre)); + + if phase_est_method == 1 + % QPSK modulation strip and phase est + + mod_strip_pol = angle(r_delay_line(k,:)) * 4; + mod_strip_rect = exp(j*mod_strip_pol); + + ph_est_pol = atan2(sum(imag(mod_strip_rect)),sum(real(mod_strip_rect)))/4; + ph_est(k) = exp(j*ph_est_pol); + + s_ch(i+k-1) = r_delay_line(k,centre).*exp(-j*ph_est_pol); + else + + % estimate phase from surrounding known pilot symbols and correct + + corr = 0; + for m=1:Ns:Nps + if (m != centre) + corr += s_delay_line(k,m) * r_delay_line(k,m)'; + end + end + ph_est(k) = conj(corr/(1E-6+abs(corr))); + s_ch(i+k-1) = r_delay_line(k,centre).*exp(j*angle(corr)); + end + + end + + ph_est_log = [ph_est_log ph_est]; + end + %printf("corr: %f angle: %f\n", corr, angle(corr)); + end + + % de-modulate + + rx_bits = zeros(1, framesize); + for i=1:Nsymb + rx_symb = s_ch(i); + if strcmp(modulation,'dqpsk') + tmp = rx_symb; + rx_symb *= conj(prev_sym_rx/abs(prev_sym_rx)); + prev_sym_rx = tmp; + end + rx_bits((2*(i-1)+1):(2*i)) = qpsk_demod(rx_symb); + rx_symb_log = [rx_symb_log rx_symb]; + end + + rx_bits_buf(1:framesize) = rx_bits_buf(framesize+1:2*framesize); + rx_bits_buf(framesize+1:2*framesize) = rx_bits; + rx_symb_buf(1:Nsymb) = rx_symb_buf(Nsymb+1:2*Nsymb); + rx_symb_buf(Nsymb+1:2*Nsymb) = s_ch; + + % determine location of start and end of frame depending on processing delays + + if phase_est + st_rx_bits = 1+(floor(Nps/2)+1-1)*Nc*2; + st_rx_symb = 1+(floor(Nps/2)+1-1)*Nc; + else + st_rx_bits = 1; + st_rx_symb = 1; + end + en_rx_bits = st_rx_bits+framesize-1; + en_rx_symb = st_rx_symb+Nsymb-1; + + if nn > 1 + % Measure BER + + %printf("nn: %d centre: %d\n", nn, floor(Nps/2)+1); + %tx_bits_buf(1:20) + %rx_bits_buf(st_rx_bits:st_rx_bits+20-1) + error_positions = xor(rx_bits_buf(st_rx_bits:en_rx_bits), tx_bits_buf(1:framesize)); + Nerrs = sum(error_positions); + Terrs += Nerrs; + Tbits += length(tx_bits); + + % Optionally LDPC decode + + if ldpc_code + detected_data = ldpc_dec(code_param, max_iterations, demod_type, decoder_type, rx_symb_buf(st_rx_symb:en_rx_symb), min(100,EsNo), hf_fading); + %for m=1:20 + % printf("%f ", qpsk_demod(rx_symb_buf(m))); + %end + %detected_data(1:19) + error_positions = xor( detected_data(1:framesize*rate), tx_bits_buf(1:framesize*rate) ); + Nerrs = sum(error_positions); + if Nerrs + Ferrsldpc++; + end + Terrsldpc += Nerrs; + Tbitsldpc += framesize*rate; + end + end + end + + TERvec(ne) = Terrs; + BERvec(ne) = Terrs/Tbits; + if ldpc_code + TERldpcvec(ne) = Terrsldpc; + FERldpcvec(ne) = Ferrsldpc; + BERldpcvec(ne) = Terrsldpc/Tbitsldpc; + end + + if verbose + printf("EsNo (dB): %f Terrs: %d BER %f BER theory %f", EsNodB, Terrs, + Terrs/Tbits, 0.5*erfc(sqrt(EsNo/2))); + if ldpc_code + printf(" LDPC: Terrs: %d BER: %f Ferrs: %d FER: %f", + Terrsldpc, Terrsldpc/Tbitsldpc, Ferrsldpc, Ferrsldpc/(Ntrials-1)); + end + printf("\n"); + end + if verbose > 1 + printf("Terrs: %d BER %f BER theory %f C %f N %f Es %f No %f Es/No %f\n\n", Terrs, + Terrs/Tbits, 0.5*erfc(sqrt(EsNo/2)), var(tx_symb_log), var(noise_log), + var(tx_symb_log), var(noise_log), var(tx_symb_log)/var(noise_log)); + end + end + + Ebvec = Esvec - 10*log10(bps); + sim_out.BERvec = BERvec; + sim_out.Ebvec = Ebvec; + sim_out.TERvec = TERvec; + if ldpc_code + sim_out.BERldpcvec = BERldpcvec; + sim_out.TERldpcvec = TERldpcvec; + sim_out.FERldpcvec = FERldpcvec; + end + + if plot_scatter + figure(2); + clf; + scat = rx_symb_log .* exp(j*pi/4); + plot(real(scat(Nps*Nc:length(scat))), imag(scat(Nps*Nc:length(scat))),'+'); + title('Scatter plot'); + + figure(3); + clf; + + y = 1:Rs*2; + x = 1:Nc; + EsNodBSurface = 20*log10(abs(hf_model(y,:))) - 10*log10(variance); + mesh(x,y,EsNodBSurface); + grid + %axis([1 Nc 1 Rs*2 -10 10]) + title('HF Channel Es/No'); + + figure(4); + clf; + %mesh(x,y,unwrap(angle(hf_model(y,:)))); + subplot(211) + plot(y,abs(hf_model(y,1))) + title('HF Channel Carrier 1 Mag'); + subplot(212) + plot(y,angle(hf_model(y,1))) + title('HF Channel Carrier 1 Phase'); + + if phase_est + scat = ph_est_log(1,floor(Nps/2):Rs*2+floor(Nps/2)-1); + hold on; + plot(angle(scat),'r'); + hold off; + + figure(5) + clf; + scat = ph_est_log(1,y); + plot(real(scat), imag(scat),'+'); + title('Carrier 1 Phase Est'); + axis([-1 1 -1 1]) + end +if 0 + figure(5); + clf; + subplot(211) + plot(real(spread)); + hold on; + plot(imag(spread),'g'); + hold off; + subplot(212) + plot(real(spread_2ms)); + hold on; + plot(imag(spread_2ms),'g'); + hold off; + + figure(6) + tmp = []; + for i = 1:hf_n-1 + tmp = [tmp abs(hf_model(i,:))]; + end + hist(tmp); +end + 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; + sim_in.Ntrials = 30; + sim_in.framesize = 576; + 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 = 1; + + sim_in.phase_est = 0; + sim_in.phase_est_method = 1; + sim_in.Np = 5; + sim_in.Ns = 5; + + sim_in.ldpc_code_rate = 1/2; + sim_in.ldpc_code = 1; +endfunction + +function ideal + + sim_in = standard_init(); + + sim_in.verbose = 1; + sim_in.plot_scatter = 1; + + sim_in.Esvec = 5; + sim_in.hf_sim = 1; + sim_in.Ntrials = 30; + + sim_qpsk_hf = ber_test(sim_in, 'qpsk'); + + sim_in.hf_sim = 0; + sim_in.plot_scatter = 0; + sim_in.Esvec = 2:10; + sim_in.ldpc_code = 0; + Ebvec = sim_in.Esvec - 10*log10(2); + BER_theory = 0.5*erfc(sqrt(10.^(Ebvec/10))); + sim_qpsk = ber_test(sim_in, 'qpsk'); + sim_dqpsk = ber_test(sim_in, 'dqpsk'); + + sim_in.hf_sim = 1; + sim_qpsk_hf = ber_test(sim_in, 'qpsk'); + sim_dqpsk_hf = ber_test(sim_in, 'dqpsk'); + sim_in.ldpc_code_rate = 1/2; + sim_in.ldpc_code = 1; + sim_qpsk_hf_ldpc = ber_test(sim_in, 'qpsk'); + sim_in.hf_mag_only = 0; + sim_dqpsk_hf_ldpc = ber_test(sim_in, 'dqpsk'); + + figure(1); + clf; + semilogy(Ebvec, BER_theory,'r;QPSK theory;') + hold on; + semilogy(sim_qpsk.Ebvec, sim_qpsk.BERvec,'g;QPSK AWGN;') + semilogy(sim_qpsk_hf.Ebvec, sim_qpsk_hf.BERvec,'r;QPSK HF;') + semilogy(sim_dqpsk.Ebvec, sim_dqpsk.BERvec,'g;DQPSK AWGN;') + semilogy(sim_dqpsk_hf.Ebvec, sim_dqpsk_hf.BERvec,'r;DQPSK HF;') + semilogy(sim_qpsk_hf_ldpc.Ebvec, sim_qpsk_hf_ldpc.BERldpcvec,'b;QPSK HF LDPC 1/2;') + semilogy(sim_dqpsk_hf_ldpc.Ebvec, sim_dqpsk_hf_ldpc.BERldpcvec,'b;DQPSK HF LDPC 1/2;') + + hold off; + xlabel('Eb/N0') + ylabel('BER') + grid("minor") + axis([min(Ebvec) max(Ebvec) 1E-3 1]) +endfunction + +function phase_noise + sim_in = standard_init(); + + sim_in.verbose = 1; + sim_in.plot_scatter = 1; + + sim_in.Esvec = 100; + sim_in.Ntrials = 30; + + sim_in.ldpc_code_rate = 1/2; + sim_in.ldpc_code = 1; + + sim_in.phase_noise_amp = pi/16; + tmp = ber_test(sim_in, 'qpsk'); + + sim_in.plot_scatter = 0; + sim_in.Esvec = 2:8; + sim_qpsk_hf = ber_test(sim_in, 'qpsk'); + + Ebvec = sim_in.Esvec - 10*log10(2); + BER_theory = 0.5*erfc(sqrt(10.^(Ebvec/10))); + + sim_in.phase_noise_amp = 0; + sim_qpsk = ber_test(sim_in, 'qpsk'); + sim_in.phase_noise_amp = pi/8; + sim_qpsk_pn8 = ber_test(sim_in, 'qpsk'); + sim_in.phase_noise_amp = pi/16; + sim_qpsk_pn16 = ber_test(sim_in, 'qpsk'); + sim_in.phase_noise_amp = pi/32; + sim_qpsk_pn32 = ber_test(sim_in, 'qpsk'); + + figure(1); + clf; + semilogy(sim_qpsk.Ebvec, sim_qpsk.BERvec,'g;QPSK phase noise 0;') + hold on; + semilogy(sim_qpsk_pn8.Ebvec, sim_qpsk_pn8.BERvec,'c;QPSK phase noise +/- pi/8;') + semilogy(sim_qpsk_pn16.Ebvec, sim_qpsk_pn16.BERvec,'b;QPSK phase noise +/- pi/16;') + semilogy(sim_qpsk_pn32.Ebvec, sim_qpsk_pn32.BERvec,'k;QPSK phase noise +/- pi/32;') + + semilogy(sim_qpsk.Ebvec, sim_qpsk.BERldpcvec,'g;QPSK phase noise 0 ldpc;') + semilogy(sim_qpsk_pn8.Ebvec, sim_qpsk_pn8.BERldpcvec,'c;QPSK phase noise +/- pi/8 ldpc;') + semilogy(sim_qpsk_pn16.Ebvec, sim_qpsk_pn16.BERldpcvec,'b;QPSK phase noise +/- pi/16 ldpc;') + semilogy(sim_qpsk_pn32.Ebvec, sim_qpsk_pn32.BERldpcvec,'k;QPSK phase noise +/- pi/32 ldpc;') + + hold off; + xlabel('Eb/N0') + ylabel('BER') + grid("minor") + axis([min(Ebvec) max(Ebvec) 1E-2 1]) +endfunction + +function test_phase_est + sim_in = standard_init(); + + sim_in.Rs = 100; + sim_in.Nc = 8; + + sim_in.verbose = 1; + sim_in.plot_scatter = 1; + + sim_in.Esvec = 5; + sim_in.Ntrials = 30; + + sim_in.ldpc_code_rate = 1/2; + sim_in.ldpc_code = 1; + + sim_in.phase_est = 1; + sim_in.phase_est_method = 2; + sim_in.Np = 3; + sim_in.phase_offset = 0; + sim_in.w_offset = 0; + + sim_in.hf_sim = 1; + sim_in.hf_mag_only = 0; + + tmp = ber_test(sim_in, 'qpsk'); + +endfunction + +% Start simulations --------------------------------------- + +more off; + +ideal(); diff --git a/codec2/tags/0.4.1/octave/test_qpsk3.m b/codec2/tags/0.4.1/octave/test_qpsk3.m new file mode 100644 index 00000000..eaf69995 --- /dev/null +++ b/codec2/tags/0.4.1/octave/test_qpsk3.m @@ -0,0 +1,957 @@ +% test_qps3k.m +% David Rowe March 2014 +% +% QPSK modem simulation, version 2. Simplifed version of +% test_qpsk. Initially based on code by Bill Cowley Generates curves +% BER versus E/No curves for different modems. Design to test +% coherent demodulation ideas on HF channels without building a full +% blown modem. Uses 'genie provided' estimates for timing estimation, +% frame sync. +% +% Compared to test_qsk2.m this version supports phase estimation +% (coherent demod) + +1; + +% main test function + +function sim_out = ber_test(sim_in, modulation) + Fs = 8000; + + newldpc = sim_in.newldpc; + verbose = sim_in.verbose; + framesize = sim_in.framesize; + Ntrials = sim_in.Ntrials; + Esvec = sim_in.Esvec; + phase_offset = sim_in.phase_offset; + phase_est = sim_in.phase_est; + w_offset = sim_in.w_offset; + plot_scatter = sim_in.plot_scatter; + Rs = sim_in.Rs; + hf_sim = sim_in.hf_sim; + nhfdelay = sim_in.hf_delay_ms*Rs/1000; + hf_phase_only = sim_in.hf_phase_only; + hf_mag_only = sim_in.hf_mag_only; + Nc = sim_in.Nc; + sim_coh_dpsk = sim_in.sim_coh_dpsk; + + 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 + + phase_est_method = sim_in.phase_est_method; + if phase_est_method == 2 + Np = sim_in.Np; + Ns = sim_in.Ns; + if Np/2 == floor(Np/2) + printf("Np must be odd\n"); + return; + end + Nps = (Np-1)*Ns+1; + else + Nps = sim_in.Np; + end + r_delay_line = zeros(Nc, Nps); + s_delay_line = zeros(Nc, Nps); + ph_est_log = []; + + phase_noise_amp = sim_in.phase_noise_amp; + + ldpc_code = sim_in.ldpc_code; + + tx_bits_buf = zeros(1,2*framesize); + rx_bits_buf = zeros(1,2*framesize); + rx_symb_buf = zeros(1,2*Nsymb); + hf_fading_buf = zeros(1,2*Nsymb); + + % Init LDPC -------------------------------------------------------------------- + + if ldpc_code + % Start CML library + + currentdir = pwd; + addpath '/home/david/tmp/cml/mat' % assume the source files stored here + cd /home/david/tmp/cml + CmlStartup % note that this is not in the cml path! + cd(currentdir) + + % Our LDPC library + + ldpc; + + rate = sim_in.ldpc_code_rate; + mod_order = 4; + modulation2 = 'QPSK'; + mapping = 'gray'; + + demod_type = 0; + decoder_type = 0; + max_iterations = 100; + + code_param = ldpc_init(rate, framesize, modulation2, mod_order, mapping); + code_param.code_bits_per_frame = framesize; + code_param.symbols_per_frame = framesize/bps; + else + rate = 1; + end + + % Init HF channel model from stored sample files of spreading signal ---------------------------------- + + % 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; M = Fs/Rs; + 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)); + + % decimate down to Rs + + spread = spread(1:M:length(spread)); + spread_2ms = spread_2ms(1:M: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 = 1/EsNo; + if verbose > 1 + printf("EsNo (dB): %f EsNo: %f variance: %f\n", EsNodB, EsNo, variance); + end + + Terrs = 0; Tbits = 0; Terrsldpc = 0; Tbitsldpc = 0; Ferrsldpc = 0; + + tx_symb_log = []; + rx_symb_log = []; + noise_log = []; + mod_strip_log = []; + + % init HF channel + + hf_n = 1; + hf_angle_log = []; + hf_fading = ones(1,Nsymb); % default input for ldpc dec + hf_model = ones(Ntrials*Nsymb/Nc, Nc); % defaults for plotting surface + + sim_out.errors_log = []; + sim_out.ldpc_errors_log = []; + + for nn = 1: Ntrials + + tx_bits = round( rand( 1, framesize*rate ) ); + + % modulate -------------------------------------------- + + if ldpc_code + [tx_bits, s] = ldpc_enc(tx_bits, code_param); + end + 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))); + if strcmp(modulation,'dqpsk') + tx_symb *= prev_sym_tx(k); + prev_sym_tx(k) = tx_symb; + end + s(i+k-1) = tx_symb; + end + end + tx_bits_buf(1:framesize) = tx_bits_buf(framesize+1:2*framesize); + tx_bits_buf(framesize+1:2*framesize) = tx_bits; + s_ch = s; + + % HF channel simulation ------------------------------------ + + if hf_sim + + % separation between carriers. Note this is + % effectively under samples at Rs, I dont think this + % matters. Equivalent to doing freq shift at Fs, then + % decimating to Rs. + + wsep = 2*pi*(1+0.5); % e.g. 75Hz spacing at Rs=50Hz, alpha=0.5 filters + + if Nsymb/Nc != floor(Nsymb/Nc) + printf("Error: Nsymb/Nc must be an integrer\n") + return; + end + + % arrange symbols in Nsymb/Nc by Nc matrix + + for i=1:Nc:Nsymb + + % Determine HF channel at each carrier for this symbol + + for k=1:Nc + hf_model(hf_n, k) = hf_gain*(spread(hf_n) + exp(-j*k*wsep*nhfdelay)*spread_2ms(hf_n)); + hf_fading(i+k-1) = abs(hf_model(hf_n, k)); + if hf_mag_only + s_ch(i+k-1) *= abs(hf_model(hf_n, k)); + else + s_ch(i+k-1) *= hf_model(hf_n, k); + end + end + hf_n++; + end + end + + tx_symb_log = [tx_symb_log s_ch]; + + % 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,Nsymb) + j*randn(1,Nsymb)); + noise_log = [noise_log noise]; + phase_noise = phase_noise_amp*(2.0*rand(1,Nsymb)-1.0); + + % organise into carriers to apply frequency and phase offset + + for i=1:Nc:Nsymb + for k=1:Nc + s_ch(i+k-1) = s_ch(i+k-1)*exp(j*(phase_offset+phase_noise(i+k-1))) + noise(i+k-1); + end + phase_offset += w_offset; + end + + % phase estimation + + ph_est = zeros(Nc,1); + + if phase_est + + % organise into carriers + + for i=1:Nc:Nsymb + + for k=1:Nc + centre = floor(Nps/2)+1; + + % delay line for phase est window + + r_delay_line(k,1:Nps-1) = r_delay_line(k,2:Nps); + r_delay_line(k,Nps) = s_ch(i+k-1); + + % delay in tx data to compensate data for phase est window + + s_delay_line(k,1:Nps-1) = s_delay_line(k,2:Nps); + s_delay_line(k,Nps) = s(i+k-1); + + if phase_est_method == 1 + % QPSK modulation strip and phase est + + mod_strip_pol = angle(r_delay_line(k,:)) * 4; + mod_strip_rect = exp(j*mod_strip_pol); + + ph_est_pol = atan2(sum(imag(mod_strip_rect)),sum(real(mod_strip_rect)))/4; + ph_est(k) = exp(j*ph_est_pol); + + s_ch(i+k-1) = r_delay_line(k,centre).*exp(-j*ph_est_pol); + % s_ch(i+k-1) = r_delay_line(k,centre); + end + + if phase_est_method == 3 + % QPSK modulation strip and phase est with original symbol mags + + mod_strip_pol = angle(r_delay_line(k,:)) * 4; + mod_strip_rect = abs(r_delay_line(k,:)) .* exp(j*mod_strip_pol); + + ph_est_pol = atan2(sum(imag(mod_strip_rect)),sum(real(mod_strip_rect)))/4; + ph_est(k) = exp(j*ph_est_pol); + + s_ch(i+k-1) = r_delay_line(k,centre).*exp(-j*ph_est_pol); + % s_ch(i+k-1) = r_delay_line(k,centre); + end + + if phase_est_method == 2 + + % estimate phase from surrounding known pilot symbols and correct + + corr = 0; + for m=1:Ns:Nps + if (m != centre) + corr += s_delay_line(k,m) * r_delay_line(k,m)'; + end + end + ph_est(k) = conj(corr/(1E-6+abs(corr))); + s_ch(i+k-1) = r_delay_line(k,centre).*exp(j*angle(corr)); + %s_ch(i+k-1) = r_delay_line(k,centre); + end + + end + + ph_est_log = [ph_est_log ph_est]; + end + %printf("corr: %f angle: %f\n", corr, angle(corr)); + end + + % de-modulate + + rx_bits = zeros(1, framesize); + for i=1:Nc:Nsymb + for k=1:Nc + rx_symb = s_ch(i+k-1); + if strcmp(modulation,'dqpsk') + tmp = rx_symb; + rx_symb *= conj(prev_sym_rx(k)/abs(prev_sym_rx(k))); + if sim_coh_dpsk + prev_sym_rx(k) = qpsk_mod(qpsk_demod(tmp)); + else + prev_sym_rx(k) = tmp; + end + s_ch(i+k-1) = rx_symb; + end + 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 + +if newldpc + rx_bits_buf(1:framesize) = rx_bits_buf(framesize+1:2*framesize); + rx_bits_buf(framesize+1:2*framesize) = rx_bits; + rx_symb_buf(1:Nsymb) = rx_symb_buf(Nsymb+1:2*Nsymb); + rx_symb_buf(Nsymb+1:2*Nsymb) = s_ch; + hf_fading_buf(1:Nsymb) = hf_fading_buf(Nsymb+1:2*Nsymb); + hf_fading_buf(Nsymb+1:2*Nsymb) = hf_fading; + + % determine location of start and end of frame depending on processing delays + + if phase_est + st_rx_bits = 1+(floor(Nps/2)+1-1)*Nc*2; + st_rx_symb = 1+(floor(Nps/2)+1-1)*Nc; + else + st_rx_bits = 1; + st_rx_symb = 1; + end + en_rx_bits = st_rx_bits+framesize-1; + en_rx_symb = st_rx_symb+Nsymb-1; + + if nn > 1 + % Measure BER + + %printf("nn: %d centre: %d\n", nn, floor(Nps/2)+1); + %tx_bits_buf(1:20) + %rx_bits_buf(st_rx_bits:st_rx_bits+20-1) + error_positions = xor(rx_bits_buf(st_rx_bits:en_rx_bits), tx_bits_buf(1:framesize)); + Nerrs = sum(error_positions); + sim_out.errors_log = [sim_out.errors_log error_positions]; + Terrs += Nerrs; + Tbits += length(tx_bits); + + % Optionally LDPC decode + + if ldpc_code + detected_data = ldpc_dec(code_param, max_iterations, demod_type, decoder_type, ... + rx_symb_buf(st_rx_symb:en_rx_symb), min(100,EsNo), hf_fading_buf(1:Nsymb)); + error_positions = xor( detected_data(1:framesize*rate), tx_bits_buf(1:framesize*rate) ); + %detected_data = ldpc_dec(code_param, max_iterations, demod_type, decoder_type, s_ch, min(100,EsNo), hf_fading); + %error_positions = xor( detected_data(1:framesize*rate), tx_bits(1:framesize*rate) ); + Nerrs = sum(error_positions); + sim_out.ldpc_errors_log = [sim_out.ldpc_errors_log error_positions]; + if Nerrs + Ferrsldpc++; + end + Terrsldpc += Nerrs; + Tbitsldpc += framesize*rate; + end + end + +else + error_positions = xor(rx_bits, tx_bits); + Nerrs = sum(error_positions); + Terrs += Nerrs; + Tbits += length(tx_bits); + + % Optionally LDPC decode + + if ldpc_code + detected_data = ldpc_dec(code_param, max_iterations, demod_type, decoder_type, s_ch, min(100,EsNo), hf_fading); + error_positions = xor( detected_data(1:framesize*rate), tx_bits(1:framesize*rate) ); + Nerrs = sum(error_positions); + if Nerrs + Ferrsldpc++; + end + Terrsldpc += Nerrs; + Tbitsldpc += framesize*rate; + + end + end +end + + TERvec(ne) = Terrs; + BERvec(ne) = Terrs/Tbits; + if ldpc_code + TERldpcvec(ne) = Terrsldpc; + FERldpcvec(ne) = Ferrsldpc; + BERldpcvec(ne) = Terrsldpc/Tbitsldpc; + end + + if verbose + printf("EsNo (dB): %f Terrs: %d BER %f BER theory %f", EsNodB, Terrs, + Terrs/Tbits, 0.5*erfc(sqrt(EsNo/2))); + if ldpc_code + printf(" LDPC: Terrs: %d BER: %f Ferrs: %d FER: %f", + Terrsldpc, Terrsldpc/Tbitsldpc, Ferrsldpc, Ferrsldpc/(Ntrials-1)); + end + printf("\n"); + end + if verbose > 1 + printf("Terrs: %d BER %f BER theory %f C %f N %f Es %f No %f Es/No %f\n\n", Terrs, + Terrs/Tbits, 0.5*erfc(sqrt(EsNo/2)), var(tx_symb_log), var(noise_log), + var(tx_symb_log), var(noise_log), var(tx_symb_log)/var(noise_log)); + end + end + + Ebvec = Esvec - 10*log10(bps); + + % account for extra power rqd for pilot symbols + + if (phase_est_method == 2) && (phase_est) + Ebvec += 10*log10(Ns/(Ns-1)); + end + + sim_out.BERvec = BERvec; + sim_out.Ebvec = Ebvec; + sim_out.TERvec = TERvec; + if ldpc_code + sim_out.BERldpcvec = BERldpcvec; + sim_out.TERldpcvec = TERldpcvec; + sim_out.FERldpcvec = FERldpcvec; + end + + if plot_scatter + figure(2); + clf; + scat = rx_symb_log .* exp(j*pi/4); + plot(real(scat(Nps*Nc:length(scat))), imag(scat(Nps*Nc:length(scat))),'+'); + title('Scatter plot'); + + figure(3); + clf; + + y = 1:Rs*2; + x = 1:Nc; + EsNodBSurface = 20*log10(abs(hf_model(y,:))) - 10*log10(variance); + mesh(x,y,EsNodBSurface); + grid + %axis([1 Nc 1 Rs*2 -10 10]) + title('HF Channel Es/No'); + + figure(4); + clf; + %mesh(x,y,unwrap(angle(hf_model(y,:)))); + subplot(211) + plot(y,abs(hf_model(y,1))) + title('HF Channel Carrier 1 Mag'); + subplot(212) + plot(y,angle(hf_model(y,1))) + title('HF Channel Carrier 1 Phase'); + + if phase_est + scat = ph_est_log(1,floor(Nps/2):Rs*2+floor(Nps/2)-1); + hold on; + plot(angle(scat),'r'); + hold off; + + figure(5) + clf; + scat = ph_est_log(1,y); + plot(real(scat), imag(scat),'+'); + title('Carrier 1 Phase Est'); + axis([-1 1 -1 1]) + end +if 0 + figure(5); + clf; + subplot(211) + plot(real(spread)); + hold on; + plot(imag(spread),'g'); + hold off; + subplot(212) + plot(real(spread_2ms)); + hold on; + plot(imag(spread_2ms),'g'); + hold off; + + figure(6) + tmp = []; + for i = 1:hf_n-1 + tmp = [tmp abs(hf_model(i,:))]; + end + hist(tmp); +end + end + +size(sim_out.errors_log) + +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; + sim_in.Ntrials = 30; + sim_in.framesize = 576; + 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 = 1; + + sim_in.phase_est = 0; + sim_in.phase_est_method = 1; + sim_in.Np = 5; + sim_in.Ns = 5; + + sim_in.ldpc_code_rate = 1/2; + sim_in.ldpc_code = 1; +endfunction + +function ideal + + sim_in = standard_init(); + + sim_in.sim_coh_dpsk = 0; + sim_in.newldpc = 1; + sim_in.verbose = 2; + sim_in.plot_scatter = 1; + + sim_in.Esvec = 5; + sim_in.hf_sim = 1; + sim_in.Ntrials = 30; + + sim_qpsk_hf = ber_test(sim_in, 'qpsk'); + + sim_in.hf_sim = 0; + sim_in.plot_scatter = 0; + sim_in.Esvec = 2:15; + sim_in.ldpc_code = 0; + Ebvec = sim_in.Esvec - 10*log10(2); + BER_theory = 0.5*erfc(sqrt(10.^(Ebvec/10))); + sim_qpsk = ber_test(sim_in, 'qpsk'); + sim_dqpsk = ber_test(sim_in, 'dqpsk'); + + sim_in.hf_sim = 1; + sim_in.Esvec = 2:15; + sim_qpsk_hf = ber_test(sim_in, 'qpsk'); + sim_dqpsk_hf = ber_test(sim_in, 'dqpsk'); + sim_in.ldpc_code = 1; + sim_in.ldpc_code_rate = 3/4; + sim_qpsk_hf_ldpc1 = ber_test(sim_in, 'qpsk'); + sim_in.ldpc_code_rate = 1/2; + sim_qpsk_hf_ldpc2 = ber_test(sim_in, 'qpsk'); + sim_in.ldpc_code_rate = 3/4; + sim_in.hf_sim = 0; + sim_qpsk_awgn_ldpc = ber_test(sim_in, 'qpsk'); + + figure(1); + clf; + semilogy(Ebvec, BER_theory,'r;QPSK theory;') + hold on; + semilogy(sim_qpsk.Ebvec, sim_qpsk.BERvec,'g;QPSK AWGN;') + semilogy(sim_qpsk_hf.Ebvec, sim_qpsk_hf.BERvec,'r;QPSK HF;') + semilogy(sim_dqpsk.Ebvec, sim_dqpsk.BERvec,'c;DQPSK AWGN;') + semilogy(sim_dqpsk_hf.Ebvec, sim_dqpsk_hf.BERvec,'m;DQPSK HF;') + semilogy(sim_qpsk_hf_ldpc1.Ebvec, sim_qpsk_hf_ldpc1.BERldpcvec,'k;QPSK HF LDPC 3/4;') + semilogy(sim_qpsk_hf_ldpc2.Ebvec, sim_qpsk_hf_ldpc2.BERldpcvec,'b;QPSK HF LDPC 1/2;') + semilogy(sim_qpsk_awgn_ldpc.Ebvec, sim_qpsk_awgn_ldpc.BERldpcvec,'k;QPSK AWGN LDPC 3/4;') + + hold off; + xlabel('Eb/N0') + ylabel('BER') + grid("minor") + axis([min(Ebvec) max(Ebvec) 1E-3 1]) +endfunction + +function phase_noise + sim_in = standard_init(); + + sim_in.verbose = 1; + sim_in.plot_scatter = 1; + + sim_in.Esvec = 100; + sim_in.Ntrials = 100; + + sim_in.ldpc_code_rate = 1/2; + sim_in.ldpc_code = 1; + + sim_in.phase_noise_amp = pi/16; + tmp = ber_test(sim_in, 'qpsk'); + + sim_in.plot_scatter = 0; + sim_in.Esvec = 2:8; + sim_qpsk_hf = ber_test(sim_in, 'qpsk'); + + Ebvec = sim_in.Esvec - 10*log10(2); + BER_theory = 0.5*erfc(sqrt(10.^(Ebvec/10))); + + sim_in.phase_noise_amp = 0; + sim_qpsk = ber_test(sim_in, 'qpsk'); + sim_in.phase_noise_amp = pi/8; + sim_qpsk_pn8 = ber_test(sim_in, 'qpsk'); + sim_in.phase_noise_amp = pi/16; + sim_qpsk_pn16 = ber_test(sim_in, 'qpsk'); + sim_in.phase_noise_amp = pi/32; + sim_qpsk_pn32 = ber_test(sim_in, 'qpsk'); + + figure(1); + clf; + semilogy(sim_qpsk.Ebvec, sim_qpsk.BERvec,'g;QPSK phase noise 0;') + hold on; + semilogy(sim_qpsk_pn8.Ebvec, sim_qpsk_pn8.BERvec,'c;QPSK phase noise +/- pi/8;') + semilogy(sim_qpsk_pn16.Ebvec, sim_qpsk_pn16.BERvec,'b;QPSK phase noise +/- pi/16;') + semilogy(sim_qpsk_pn32.Ebvec, sim_qpsk_pn32.BERvec,'k;QPSK phase noise +/- pi/32;') + + semilogy(sim_qpsk.Ebvec, sim_qpsk.BERldpcvec,'g;QPSK phase noise 0 ldpc;') + semilogy(sim_qpsk_pn8.Ebvec, sim_qpsk_pn8.BERldpcvec,'c;QPSK phase noise +/- pi/8 ldpc;') + semilogy(sim_qpsk_pn16.Ebvec, sim_qpsk_pn16.BERldpcvec,'b;QPSK phase noise +/- pi/16 ldpc;') + semilogy(sim_qpsk_pn32.Ebvec, sim_qpsk_pn32.BERldpcvec,'k;QPSK phase noise +/- pi/32 ldpc;') + + hold off; + xlabel('Eb/N0') + ylabel('BER') + grid("minor") + axis([min(Ebvec) max(Ebvec) 1E-2 1]) +endfunction + +function phase_est_hf + sim_in = standard_init(); + + sim_in.Rs = 100; + sim_in.Nc = 8; + + sim_in.verbose = 1; + sim_in.plot_scatter = 0; + + sim_in.Esvec = 5:15; + sim_in.Ntrials = 100; + + sim_in.newldpc = 1; + sim_in.ldpc_code_rate = 1/2; + sim_in.ldpc_code = 1; + + sim_in.phase_est = 0; + sim_in.sim_coh_dpsk = 0; + sim_in.phase_est_method = 2; + sim_in.Np = 3; + sim_in.phase_offset = 0; + sim_in.w_offset = 0; + + sim_in.hf_sim = 1; + sim_in.hf_mag_only = 1; + + Ebvec = sim_in.Esvec - 10*log10(2); + + baseline = ber_test(sim_in, 'qpsk'); + + sim_in.hf_mag_only = 0; + sim_in.phase_est_method = 2; + sim_in.phase_est = 1; + sim_in.Np = 3; + pilot_3 = ber_test(sim_in, 'qpsk'); + sim_in.Np = 5; + pilot_5 = ber_test(sim_in, 'qpsk'); + sim_in.Np = 7; + pilot_7 = ber_test(sim_in, 'qpsk'); + +if 1 + sim_in.phase_est = 0; + dqpsk = ber_test(sim_in, 'dqpsk'); + + figure(1); + clf; + semilogy(baseline.Ebvec, baseline.BERvec,'r;QPSK CCIR poor;') + hold on; + semilogy(baseline.Ebvec, baseline.BERldpcvec,'r;QPSK CCIR poor ldpc;') + semilogy(pilot_3.Ebvec, pilot_3.BERvec,'b;QPSK CCIR poor ldpc pilot 3;') + semilogy(pilot_3.Ebvec, pilot_3.BERldpcvec,'b;QPSK CCIR poor ldpc pilot 3;') + semilogy(pilot_5.Ebvec, pilot_5.BERvec,'g;QPSK CCIR poor ldpc pilot 5;') + semilogy(pilot_5.Ebvec, pilot_5.BERldpcvec,'g;QPSK CCIR poor ldpc pilot 5;') + semilogy(pilot_7.Ebvec, pilot_7.BERvec,'m;QPSK CCIR poor ldpc pilot 7;') + semilogy(pilot_7.Ebvec, pilot_7.BERldpcvec,'m;QPSK CCIR poor ldpc pilot 7;') + semilogy(dqpsk.Ebvec, dqpsk.BERvec,'k;DQPSK CCIR poor ldpc;') + semilogy(dqpsk.Ebvec, dqpsk.BERldpcvec,'k;DQPSK CCIR poor ldpc;') + + hold off; + xlabel('Eb/N0') + ylabel('BER') + grid("minor") + axis([min(Ebvec) max(Ebvec) 1E-2 1]) +end +endfunction + +function phase_est_awgn + sim_in = standard_init(); + + sim_in.Rs = 100; + sim_in.Nc = 8; + + sim_in.verbose = 1; + sim_in.plot_scatter = 0; + + sim_in.Esvec = 0:0.5:3; + sim_in.Ntrials = 30; + + sim_in.newldpc = 1; + sim_in.ldpc_code_rate = 1/2; + sim_in.ldpc_code = 1; + + sim_in.phase_est = 0; + sim_in.phase_est_method = 1; + sim_in.Np = 3; + sim_in.phase_offset = 0; + sim_in.w_offset = 0; + + sim_in.hf_sim = 0; + sim_in.hf_mag_only = 1; + + ideal = ber_test(sim_in, 'qpsk'); + + sim_in.phase_est = 1; + sim_in.Np = 21; + sim_in.phase_est_method = 3; + strip_21_mag = ber_test(sim_in, 'qpsk'); + + sim_in.Np = 41; + strip_41_mag = ber_test(sim_in, 'qpsk'); + + sim_in.phase_est_method = 1; + sim_in.Np = 21; + strip_21 = ber_test(sim_in, 'qpsk'); + + sim_in.Np = 41; + strip_41 = ber_test(sim_in, 'qpsk'); + + sim_in.Np = 7; + sim_in.phase_est_method = 2; + pilot_7 = ber_test(sim_in, 'qpsk'); + + Ebvec = sim_in.Esvec - 10*log10(2); + + figure(1); + clf; + semilogy(ideal.Ebvec, ideal.BERvec,'r;QPSK;') + hold on; + semilogy(ideal.Ebvec, ideal.BERldpcvec,'r;QPSK LDPC;') + semilogy(strip_21.Ebvec, strip_21.BERvec,'g;QPSK strip 21;') + semilogy(strip_21.Ebvec, strip_21.BERldpcvec,'g;QPSK LDPC strip 21;') + semilogy(strip_41.Ebvec, strip_41.BERvec,'b;QPSK strip 41;') + semilogy(strip_41.Ebvec, strip_41.BERldpcvec,'b;QPSK LDPC strip 41;') + semilogy(strip_21_mag.Ebvec, strip_21_mag.BERvec,'m;QPSK strip 21 mag;') + semilogy(strip_21_mag.Ebvec, strip_21_mag.BERldpcvec,'m;QPSK LDPC strip 21 mag;') + semilogy(strip_41_mag.Ebvec, strip_41_mag.BERvec,'c;QPSK strip 41 mag;') + semilogy(strip_41_mag.Ebvec, strip_41_mag.BERldpcvec,'c;QPSK LDPC strip 41 mag;') + semilogy(pilot_7.Ebvec, pilot_7.BERvec,'k;QPSK pilot 7;') + semilogy(pilot_7.Ebvec, pilot_7.BERldpcvec,'k;QPSK LDPC pilot 7;') + + hold off; + xlabel('Eb/N0') + ylabel('BER') + grid("minor") + axis([min(Ebvec) max(Ebvec) 1E-2 1]) +endfunction + +function test_dpsk + sim_in = standard_init(); + + sim_in.Rs = 100; + sim_in.Nc = 8; + + sim_in.verbose = 1; + sim_in.plot_scatter = 0; + + sim_in.Esvec = 5; + sim_in.Ntrials = 30; + + sim_in.newldpc = 1; + sim_in.ldpc_code_rate = 1/2; + sim_in.ldpc_code = 1; + + sim_in.phase_est = 0; + sim_in.phase_est_method = 3; + sim_in.Np = 41; + sim_in.phase_offset = 0; + sim_in.w_offset = 0; + sim_in.sim_coh_dpsk = 0; + + sim_in.hf_sim = 0; + sim_in.hf_mag_only = 1; + + Ebvec = sim_in.Esvec - 10*log10(2); + + baseline = ber_test(sim_in, 'qpsk'); + sim_in.phase_est = 0; + dqpsk = ber_test(sim_in, 'dqpsk'); + + sim_in.phase_est = 1; + sim_in.phase_est_method = 3; + sim_in.sim_coh_dpsk = 1; + sim_in.Np = 41; + dqpsk_strip_41 = ber_test(sim_in, 'dqpsk'); + + figure(1); + clf; + semilogy(baseline.Ebvec, baseline.BERvec,'r;QPSK CCIR poor;') + hold on; + semilogy(baseline.Ebvec, baseline.BERldpcvec,'r;QPSK CCIR poor ldpc;') + semilogy(dqpsk.Ebvec, dqpsk.BERvec,'c;DQPSK CCIR poor ldpc;') + semilogy(dqpsk.Ebvec, dqpsk.BERldpcvec,'c;DQPSK CCIR poor ldpc;') + semilogy(dqpsk_strip_41.Ebvec, dqpsk_strip_41.BERvec,'m;DQPSK CCIR poor ldpc strip 41;') + semilogy(dqpsk_strip_41.Ebvec, dqpsk_strip_41.BERldpcvec,'m;DQPSK CCIR poor ldpc strip 41;') + + hold off; + xlabel('Eb/N0') + ylabel('BER') + grid("minor") + axis([min(Ebvec) max(Ebvec) 1E-2 1]) + +endfunction + +function gen_error_pattern_qpsk() + sim_in = standard_init(); + + % model codec and uncoded streams as 1000 bit/s each + + sim_in.Rs = 100; + sim_in.Nc = 4; + + sim_in.verbose = 1; + sim_in.plot_scatter = 0; + + sim_in.Esvec = 10; % Eb/No=2dB + sim_in.Ntrials = 30; + + sim_in.newldpc = 1; + sim_in.ldpc_code_rate = 1/2; + sim_in.ldpc_code = 1; + + sim_in.phase_est = 1; + sim_in.phase_est_method = 2; + sim_in.Np = 5; + sim_in.phase_offset = 0; + sim_in.w_offset = 0; + sim_in.sim_coh_dpsk = 0; + + sim_in.hf_sim = 1; + sim_in.hf_mag_only = 0; + + qpsk = ber_test(sim_in, 'qpsk'); + + length(qpsk.errors_log) + length(qpsk.ldpc_errors_log) + % multiplex errors into prot and unprot halves of 52 bit codec frames + + error_pattern = []; + for i=1:26:length(qpsk.ldpc_errors_log)-52 + error_pattern = [error_pattern qpsk.ldpc_errors_log(i:i+25) qpsk.errors_log(i:i+25) zeros(1,4)]; + %error_pattern = [error_pattern qpsk.ldpc_errors_log(i:i+25) zeros(1,26) zeros(1,4)]; + %error_pattern = [error_pattern zeros(1,26) qpsk.errors_log(i:i+25) zeros(1,4)]; + end + + fep=fopen("qpsk_errors_2dB.bin","wb"); fwrite(fep, error_pattern, "short"); fclose(fep); + +endfunction + +function gen_error_pattern_dpsk() + sim_in = standard_init(); + + sim_in.Rs = 50; + sim_in.Nc = 16; + + sim_in.verbose = 1; + sim_in.plot_scatter = 1; + + sim_in.Esvec = 10; % Eb/No=Es/No-3 + sim_in.Ntrials = 30; + + sim_in.newldpc = 1; + sim_in.ldpc_code_rate = 1/2; + sim_in.ldpc_code = 0; + + sim_in.phase_est = 0; + sim_in.phase_est_method = 3; + sim_in.Np = 41; + sim_in.phase_offset = 0; + sim_in.w_offset = 0; + sim_in.sim_coh_dpsk = 0; + + sim_in.hf_sim = 1; + sim_in.hf_mag_only = 1; + + dqpsk = ber_test(sim_in, 'dqpsk'); + + fep=fopen("dqpsk_errors_12dB.bin","wb"); fwrite(fep, dqpsk.errors_log, "short"); fclose(fep); + +endfunction + +% Start simulations --------------------------------------- + +more off; + +ideal(); +%phase_est_hf(); +%phase_est_awgn(); +%test_dpsk(); +%gen_error_pattern_qpsk diff --git a/codec2/tags/0.4.1/octave/tfdmdv.m b/codec2/tags/0.4.1/octave/tfdmdv.m new file mode 100644 index 00000000..ab20e21e --- /dev/null +++ b/codec2/tags/0.4.1/octave/tfdmdv.m @@ -0,0 +1,271 @@ +% tfdmdv.m +% +% Octave script that tests the C port of the FDMDV modem. This script loads +% the output of unittest/tfdmdv.c and compares it to the output of the +% reference versions of the same functions written in Octave. +% +% Copyright David Rowe 2012 +% This program is distributed under the terms of the GNU General Public License +% Version 2 +% + +more off +NumCarriers = 14; +fdmdv; % load modem code +autotest; + +% Generate reference vectors using Octave implementation of FDMDV modem + +global passes; +global fails; +passes = fails = 0; +frames = 35; +prev_tx_symbols = ones(Nc+1,1); prev_tx_symbols(Nc+1) = 2; +prev_rx_symbols = ones(Nc+1,1); +foff_phase_rect = 1; +channel = []; +channel_count = 0; +next_nin = M; +sig_est = zeros(Nc+1,1); +noise_est = zeros(Nc+1,1); + +sync = 0; +fest_state = 0; +fest_timer = 0; +sync_mem = zeros(1,Nsync_mem); + +% Octave outputs we want to collect for comparison to C version + +tx_bits_log = []; +tx_symbols_log = []; +tx_baseband_log = []; +tx_fdm_log = []; +pilot_baseband1_log = []; +pilot_baseband2_log = []; +pilot_lpf1_log = []; +pilot_lpf2_log = []; +S1_log = []; +S2_log = []; +foff_coarse_log = []; +foff_fine_log = []; +foff_log = []; +rx_baseband_log = []; +rx_filt_log = []; +env_log = []; +rx_timing_log = []; +phase_difference_log = []; +rx_symbols_log = []; +rx_bits_log = []; +sync_bit_log = []; +sync_log = []; +nin_log = []; +sig_est_log = []; +noise_est_log = []; + +% adjust this if the screen is getting a bit cluttered + +global no_plot_list; +no_plot_list = [1 2 3 4 5 6 7 8 11 12 13 14 15 16]; + +for f=1:frames + + % modulator + + tx_bits = get_test_bits(Nc*Nb); + tx_bits_log = [tx_bits_log tx_bits]; + tx_symbols = bits_to_psk(prev_tx_symbols, tx_bits, 'dqpsk'); + prev_tx_symbols = tx_symbols; + tx_symbols_log = [tx_symbols_log tx_symbols]; + tx_baseband = tx_filter(tx_symbols); + tx_baseband_log = [tx_baseband_log tx_baseband]; + tx_fdm = fdm_upconvert(tx_baseband); + tx_fdm_log = [tx_fdm_log tx_fdm]; + + % channel + + nin = next_nin; + + %nin = M; % when debugging good idea to uncomment this to "open loop" + + channel = [channel real(tx_fdm)]; + channel_count += M; + rx_fdm = channel(1:nin); + channel = channel(nin+1:channel_count); + channel_count -= nin; + + % demodulator -------------------------------------------- + + % shift down to complex baseband + + for i=1:nin + fbb_phase_rx = fbb_phase_rx*fbb_rect'; + rx_fdm(i) = rx_fdm(i)*fbb_phase_rx; + end + mag = abs(fbb_phase_rx); + fbb_phase_rx /= mag; + + [pilot prev_pilot pilot_lut_index prev_pilot_lut_index] = get_pilot(pilot_lut_index, prev_pilot_lut_index, nin); + [foff_coarse S1 S2] = rx_est_freq_offset(rx_fdm, pilot, prev_pilot, nin, !sync); + + %sync = 0; % when debugging good idea to uncomment this to "open loop" + + if sync == 0 + foff = foff_coarse; + end + foff_coarse_log = [foff_coarse_log foff_coarse]; + + pilot_baseband1_log = [pilot_baseband1_log pilot_baseband1]; + pilot_baseband2_log = [pilot_baseband2_log pilot_baseband2]; + pilot_lpf1_log = [pilot_lpf1_log pilot_lpf1]; + pilot_lpf2_log = [pilot_lpf2_log pilot_lpf2]; + S1_log = [S1_log S1]; + S2_log = [S2_log S2]; + + foff_rect = exp(j*2*pi*foff/Fs); + + for i=1:nin + foff_phase_rect *= foff_rect'; + rx_fdm_fcorr(i) = rx_fdm(i)*foff_phase_rect; + end + + rx_fdm_filter = rxdec_filter(rx_fdm_fcorr, nin); + rx_filt = down_convert_and_rx_filter(rx_fdm_filter, nin, M/Q); + + rx_filt_log = [rx_filt_log rx_filt]; + + [rx_symbols rx_timing env] = rx_est_timing(rx_filt, nin); + env_log = [env_log env]; + rx_timing_log = [rx_timing_log rx_timing]; + rx_symbols_log = [rx_symbols_log rx_symbols]; + + next_nin = M; + if rx_timing > 2*M/P + next_nin += M/P; + end + if rx_timing < 0; + next_nin -= M/P; + end + nin_log = [nin_log nin]; + + [rx_bits sync_bit foff_fine pd] = psk_to_bits(prev_rx_symbols, rx_symbols, 'dqpsk'); + phase_difference_log = [phase_difference_log pd]; + + foff_fine_log = [foff_fine_log foff_fine]; + foff -= 0.5*foff_fine; + foff_log = [foff_log foff]; + + [sig_est noise_est] = snr_update(sig_est, noise_est, pd); + sig_est_log = [sig_est_log sig_est]; + noise_est_log = [noise_est_log noise_est]; + + prev_rx_symbols = rx_symbols; + rx_bits_log = [rx_bits_log rx_bits]; + sync_bit_log = [sync_bit_log sync_bit]; + + % freq est state machine + + [sync reliable_sync_bit fest_state fest_timer sync_mem] = freq_state(sync_bit, fest_state, fest_timer, sync_mem); + sync_log = [sync_log sync]; +end + +% Compare to the output from the C version + +load ../unittest/tfdmdv_out.txt + + +% --------------------------------------------------------------------------------------- +% Plot output and test each C function +% --------------------------------------------------------------------------------------- + +% fdmdv_get_test_bits() & bits_to_dqpsk_symbols() + +n = 28; +stem_sig_and_error(1, 211, tx_bits_log_c(1:n), tx_bits_log(1:n) - tx_bits_log_c(1:n), 'tx bits', [1 n -1.5 1.5]) +stem_sig_and_error(1, 212, real(tx_symbols_log_c(1:n/2)), real(tx_symbols_log(1:n/2) - tx_symbols_log_c(1:n/2)), 'tx symbols real', [1 n/2 -1.5 1.5]) + +% fdm_upconvert() + +plot_sig_and_error(3, 211, real(tx_fdm_log_c), real(tx_fdm_log - tx_fdm_log_c), 'tx fdm real') +plot_sig_and_error(3, 212, imag(tx_fdm_log_c), imag(tx_fdm_log - tx_fdm_log_c), 'tx fdm imag') + +% generate_pilot_lut() + +plot_sig_and_error(4, 211, real(pilot_lut_c), real(pilot_lut - pilot_lut_c), 'pilot lut real') +plot_sig_and_error(4, 212, imag(pilot_lut_c), imag(pilot_lut - pilot_lut_c), 'pilot lut imag') + +% rx_est_freq_offset() + +st=1; en = 5*Npilotbaseband; +plot_sig_and_error(5, 211, real(pilot_baseband1_log(st:en)), real(pilot_baseband1_log(st:en) - pilot_baseband1_log_c(st:en)), 'pilot baseband1 real' ) +plot_sig_and_error(5, 212, real(pilot_baseband2_log(st:en)), real(pilot_baseband2_log(st:en) - pilot_baseband2_log_c(st:en)), 'pilot baseband2 real' ) + +st=1; en = 5*Npilotlpf; +plot_sig_and_error(6, 211, real(pilot_lpf1_log(st:en)), real(pilot_lpf1_log(st:en) - pilot_lpf1_log_c(st:en)), 'pilot lpf1 real' ) +plot_sig_and_error(6, 212, real(pilot_lpf2_log(st:en)), real(pilot_lpf2_log(st:en) - pilot_lpf2_log_c(st:en)), 'pilot lpf2 real' ) + +plot_sig_and_error(7, 211, real(S1_log), real(S1_log - S1_log_c), 'S1 real' ) +plot_sig_and_error(7, 212, imag(S1_log), imag(S1_log - S1_log_c), 'S1 imag' ) + +plot_sig_and_error(8, 211, real(S2_log), real(S2_log - S2_log_c), 'S2 real' ) +plot_sig_and_error(8, 212, imag(S2_log), imag(S2_log - S2_log_c), 'S2 imag' ) + +plot_sig_and_error(9, 211, foff_coarse_log, foff_coarse_log - foff_coarse_log_c, 'Coarse Freq Offset' ) +plot_sig_and_error(9, 212, foff_fine_log, foff_fine_log - foff_fine_log_c, 'Fine Freq Offset' ) + +plot_sig_and_error(10, 211, foff_log, foff_log - foff_log_c, 'Freq Offset' ) +plot_sig_and_error(10, 212, sync_log, sync_log - sync_log_c, 'Sync & Freq Est Coarse(0) Fine(1)', [1 frames -1.5 1.5] ) + +c=1; +if 0 +plot_sig_and_error(11, 211, real(rx_baseband_log(c,:)), real(rx_baseband_log(c,:) - rx_baseband_log_c(c,:)), 'Rx baseband real' ) +plot_sig_and_error(11, 212, imag(rx_baseband_log(c,:)), imag(rx_baseband_log(c,:) - rx_baseband_log_c(c,:)), 'Rx baseband imag' ) +end + +plot_sig_and_error(12, 211, real(rx_filt_log(c,:)), real(rx_filt_log(c,:) - rx_filt_log_c(c,:)), 'Rx filt real' ) +plot_sig_and_error(12, 212, imag(rx_filt_log(c,:)), imag(rx_filt_log(c,:) - rx_filt_log_c(c,:)), 'Rx filt imag' ) + +st=1*28; +en = 3*28; +plot_sig_and_error(14, 211, rx_timing_log, rx_timing_log - rx_timing_log_c, 'Rx Timing' ) +stem_sig_and_error(14, 212, sync_bit_log_c, sync_bit_log - sync_bit_log_c, 'Sync bit', [1 n -1.5 1.5]) + +stem_sig_and_error(15, 211, rx_bits_log_c(st:en), rx_bits_log(st:en) - rx_bits_log_c(st:en), 'RX bits', [1 en-st -1.5 1.5]) +stem_sig_and_error(15, 212, nin_log_c, nin_log - nin_log_c, 'nin') + +c = 12; +plot_sig_and_error(16, 211, sig_est_log(c,:), sig_est_log(c,:) - sig_est_log_c(c,:), 'sig est for SNR' ) +plot_sig_and_error(16, 212, noise_est_log(c,:), noise_est_log(c,:) - noise_est_log_c(c,:), 'noise est for SNR' ) + +f=12; + +stem_sig_and_error(13, 211, real(rx_symbols_log(:,f)), real(rx_symbols_log(:,f) - rx_symbols_log_c(:,f)), 'rx symbols real' ) +stem_sig_and_error(13, 212, imag(rx_symbols_log(:,f)), imag(rx_symbols_log(:,f) - rx_symbols_log_c(:,f)), 'rx symbols imag' ) + +stem_sig_and_error(17, 211, real(phase_difference_log(:,f)), real(phase_difference_log(:,f) - phase_difference_log_c(:,f)), 'phase difference real' ) +stem_sig_and_error(17, 212, imag(phase_difference_log(:,f)), imag(phase_difference_log(:,f) - phase_difference_log_c(:,f)), 'phase difference imag' ) + + +check(tx_bits_log, tx_bits_log_c, 'tx_bits'); +check(tx_symbols_log, tx_symbols_log_c, 'tx_symbols'); +check(tx_fdm_log, tx_fdm_log_c, 'tx_fdm'); +check(pilot_lut, pilot_lut_c, 'pilot_lut'); +check(pilot_coeff, pilot_coeff_c, 'pilot_coeff'); +check(pilot_baseband1_log, pilot_baseband1_log_c, 'pilot lpf1'); +check(pilot_baseband2_log, pilot_baseband2_log_c, 'pilot lpf2'); +check(S1_log, S1_log_c, 'S1'); +check(S2_log, S2_log_c, 'S2'); +check(foff_coarse_log, foff_coarse_log_c, 'foff_coarse'); +check(foff_fine_log, foff_fine_log_c, 'foff_fine'); +check(foff_log, foff_log_c, 'foff'); +%check(rx_baseband_log, rx_baseband_log_c, 'rx baseband'); +check(rx_filt_log, rx_filt_log_c, 'rx filt'); +check(env_log, env_log_c, 'env'); +check(rx_timing_log, rx_timing_log_c, 'rx_timing'); +check(rx_symbols_log, rx_symbols_log_c, 'rx_symbols'); +check(rx_bits_log, rx_bits_log_c, 'rx bits'); +check(sync_bit_log, sync_bit_log_c, 'sync bit'); +check(sync_log, sync_log_c, 'sync'); +check(nin_log, nin_log_c, 'nin'); +check(sig_est_log, sig_est_log_c, 'sig_est'); +check(noise_est_log, noise_est_log_c, 'noise_est'); +printf("\npasses: %d fails: %d\n", passes, fails); diff --git a/codec2/tags/0.4.1/octave/tget_spec.m b/codec2/tags/0.4.1/octave/tget_spec.m new file mode 100644 index 00000000..e46c1ea0 --- /dev/null +++ b/codec2/tags/0.4.1/octave/tget_spec.m @@ -0,0 +1,49 @@ +% tget-spec.m +% +% Used in conjunction with src/fdmdv_demod to test the +% fdmdv_get_rx_spectrum() function. +% +% codec2-dev/src$ ./fdmdv_demod fdmdv_mod.raw tmp.c2 dump.txt +% octave:3> tget_spec("../src/dump.txt") +% +% Copyright David Rowe 2012 +% This program is distributed under the terms of the GNU General Public License +% Version 2 +% + +function tfft_log(dumpfilename) + + load(dumpfilename); + + [rows cols] = size(rx_spec_log_c); + Fs = 8000; low_freq = 0; high_freq = 2500; + res = (Fs/2)/cols; + st_bin = low_freq/res + 1; + en_bin = high_freq/res; + xaxis = (st_bin:en_bin)*res; + + f_start = 2; f_end = 100; + beta = 0.1; + + av = zeros(f_end, en_bin-st_bin+1); + for r=f_start:f_end + x = (1-beta)*av(r-1,:) + beta*rx_spec_log_c(r,st_bin:en_bin); + av(r,:) = x; + end + + % spectrogram (waterfall) + + figure(1) + clf; + imagesc(av,[-40 0]); + + % animated spectrum display + + figure(2) + clf; + for r=f_start:f_end + plot(xaxis, av(r,:)) + axis([ low_freq high_freq -40 0]) + sleep(0.1) + end +endfunction diff --git a/codec2/tags/0.4.1/octave/tlinreg.m b/codec2/tags/0.4.1/octave/tlinreg.m new file mode 100644 index 00000000..1cde350d --- /dev/null +++ b/codec2/tags/0.4.1/octave/tlinreg.m @@ -0,0 +1,14 @@ +% tlinreg +% David Rowe April 2015 +% +% Unit test for linear regression + +x = [1 2 7 8]; +y = [ -0.70702 + 0.70708i 0.77314 - 0.63442i -0.98083 + 0.19511i 0.99508 - 0.09799i] .* [1 -1 1 -1]; +[m b] = linreg(x,y,4); + +x = [1 2 3 4 5 6 7 8]; +yFit = m * x + b; +figure(1) +plot(yFit,'r*') +axis([-1.5 1.5 -1.5 1.5]) diff --git a/codec2/tags/0.4.1/octave/tpapr.m b/codec2/tags/0.4.1/octave/tpapr.m new file mode 100644 index 00000000..194d9a7d --- /dev/null +++ b/codec2/tags/0.4.1/octave/tpapr.m @@ -0,0 +1,35 @@ +% tpapr.m +% David Rowe +% 18 May 2015 + +graphics_toolkit ("gnuplot"); +rand('state',1); + +Fs = 8000; +Rs = 50; +Nc = 8; +Fc = 1500; +Fsep = ((1:Nc).^1.2)*75; +%Fsep = (1:Nc)*75 + 5 - 20*rand(1,Nc) +n = 80000; +t = 1:n; +tx = zeros(1,n); +phi = ones(1,Nc); + +figure(1) +clf + +for m=1:Nc + s = cos(phi(m)+t*2*pi*(Rs/2 + Fc + Fsep(m))/Fs); + tx += s; + subplot(Nc,1,m); + plot(s) +end + +figure(2) +plot(tx) + +tx = tx(length(tx)*0.5:length(tx)); +papr = max(tx.*conj(tx)) / mean(tx.*conj(tx)); +papr_dB = 10*log10(papr); +printf("PAPR: %4.2f dB\n", papr_dB); diff --git a/codec2/tags/0.4.1/octave/trellis.m b/codec2/tags/0.4.1/octave/trellis.m new file mode 100644 index 00000000..3838fd37 --- /dev/null +++ b/codec2/tags/0.4.1/octave/trellis.m @@ -0,0 +1,523 @@ +% trellis.m +% David Rowe June 2015 +% +% Testing ideas for trellis decoding of codec parameters. Uses +% soft decision information, probablility of state transitions, +% and left over redundancy to correct errors on codec parameter +% reception. +% +% [X] Add probability of transition +% [X] Will this mess up a perfectly received signal, i.e. all +% codewords perfectly received. This should dominate prob +% calc (with small No) +% [ ] can we measure erroneous decodes? Whn it makes it worse? +% + like all FEC, at some point, it will get a poorer BER +% + can we drawa curve of coded versus uncoded errors? +% [ ] test with actual data, add errors, see if it corrects any +% [ ] can we draw a trellis with actual values? +% +% Note we need SD bits and natural binary order encoding, for example +% ./c2enc 700 ../../raw/ve9qrp_10s.raw ../../octave/ve9qrp_10s.bit --softdec --natural + +graphics_toolkit ("gnuplot"); +more off; +randn('state',1); + +% Before I couldn't even sp3ll functional programmer. Now I are one ;) + +function [bits_per_frame bit_fields] = codec2_700_bit_fields + bits_per_frame = 28; % number of bits/frame for "700" mode + bit_fields = [1 5 3 3 2 4 3 3 2 2]; % number of bits in each field for "700" mode + % voiced, Wo, energy, LSP 1..6, 2 spare +endfunction + +% builds a metric of trasnition probablilities for each codec field (model parameter) + +function [tp codewords] = build_tp(bitstream_filename) + [bits_per_frame bit_fields] = codec2_700_bit_fields; + nfields = length(bit_fields); + + % load encoded speech file (one float per bit) + + fbitstream = fopen(bitstream_filename, "rb"); + bitstream = fread(fbitstream, "float32"); + fclose(fbitstream); + nframes = floor(length(bitstream)/bits_per_frame); + bitstream = bitstream < 0; + + % extract each field (model parameter) for bit stream + + codewords = zeros(nframes,nfields); + for f=1:nframes + aframe = bitstream((f-1)*bits_per_frame+1:f*bits_per_frame); + field = 1; + st = bit_fields(field); + for l=1:nfields + nbits = bit_fields(field); + %printf("st: %d %d\n", st, st+nbits-1); + codeword = aframe(st:st+nbits-1)'; + %printf("codeword: %d\n", codeword); + codewords(f,l) = sum(codeword .* 2.^(nbits-1:-1:0)); + %printf("nbits: %d lsp(%d, %d) = %d\n", nbits, f, l, codewords(f,l)); + st += nbits; + field++; + end + end + + % determine transition probablilities of each codeword + % state at time n, state a time n+1 + % prob must add to 1 + % so for every state, of every codeword, compute histogram of + % transition probabilities + + tp = zeros(32,32,nfields); + for f=1:nframes-1 + for l=1:nfields + acodeword = codewords(f,l); + bcodeword = codewords(f+1,l); + %printf("%d %d %d %d\n", f, l, acodeword, bcodeword); + tp(acodeword+1,bcodeword+1,l)++; + end + end +endfunction + + +% converts a decimal vlaue 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 +/- 1 soft decision values for 0,1 transmitted bits + +function lnp = ln_prob_of_tx_codeword_c_given_rx_codeword_y(y) + nbits = length(y); + np = 2.^nbits; + + % work through all possible received codeworks and determine probability + % given a number of bits + + lnp = zeros(1,np); + for i=0:np-1 + + c = dec2sd(i,nbits); + + % probability calculation for this i + + lnp(i+1) = sum(y .* c); + end + +endfunction + + +% y is the received soft decision codedwords, each row is one codeword in time +% tp is the transition probabilities, each row is the start state +% returns the most likely transitted codeword c + +function c = find_most_likely_codeword(y, tp, nstages, verbose) + [ncodewords nbits] = size(y); + nstates = 2^nbits; + n = ones(1,nstages); + + lnp = zeros(nstages, nstates); + for s=1:nstages + lnp(s,:) = ln_prob_of_tx_codeword_c_given_rx_codeword_y(y(s,:)); + end + + if verbose + % printf received codewords + + printf("rx_codewords:\n"); + for r=1:ncodewords + for c=1:nbits + printf("%7.2f", y(r,c)); + end + printf("\n"); + end + + % print probability of each rx codeword table + + printf("\nProbability of each tx codeword:\n"); + printf("tx_codeword stage\n"); + printf("bin dec "); + for s=1:nstages + printf(" %9d", s); + end + printf("\n"); + + for i=1:nstates + printf("%3s %2d ", dec2bin(i-1,nbits), i-1); + for s=1:nstages + printf(" %9.2f", lnp(s, i)); + end + printf("\n"); + end + printf("\n"); + + printf("\nTransition Probability table:\n"); + printf("state/next_state\n"); + for r=1:nstates + for c=1:nstates + printf("%7.2f", tp(r,c)); + end + printf("\n"); + end + printf("\n"); + end + + % determine probability of each path + % (prob of start state)(prob of transition)(prob of next state) + % cycle through all possibilities of states + % state variable for possible state + % step through them exhaustively + + if verbose + printf("Evaulation of all possible paths:\n"); + printf("tx codewords\n"); + printf(" n"); + for s=1:nstages-1 + printf(" n+%d", s); + end + printf(" "); + for s=1:nstages + printf(" lnp(%d) ", s-1); + if s < nstages + printf(" tp(%d,%d) ", s-1,s); + end + end + printf(" prob max_prob\n"); + end + + max_prob = -100; + + do + + % add up probabilities for this path + + if verbose + for s=1:nstages + printf("%4d", n(s)-1); + end + printf(" "); + end + + prob = 0; + for s=1:nstages + prob += lnp(s, n(s)); + if verbose + printf("%8.2f ", lnp(s, n(s))); + end + if s < nstages + prob += tp(n(s),n(s+1)); + if verbose + printf("%8.2f ", tp(n(s),n(s+1))); + end + end + end + + if (prob > max_prob) + max_prob = prob; + max_n = n; + end + + if verbose + printf("%9.2f %9.2f\n", prob, max_prob); + end + + % next path + + s = nstages; + n(s)++; + while (s && (n(s) == (nstates+1))) + n(s) = 1; + s--; + if s > 0 + n(s)++; + end + end + until (sum(n) == nstages) + + c = max_n((nstages+1)/2) - 1; + if verbose + printf("\nMost likely path....: "); + for s=1:nstages + printf("%4d", max_n(s)-1); + end + printf("\nMost likely codeword: %4d\n", c); + end +endfunction + + +% Simulations --------------------------- + +function [dec_hat dec_simple_hat dec_tx_codewords] = run_test(tx_codewords, transition_probabilities, nstages, var, verbose) + [frames nbits] = size(tx_codewords); + nerrors = 0; + nerrors_simple = 0; + tbits = 0; + nstates = 2.^nbits; + + rx_codewords = tx_codewords + sqrt(var)*randn(frames, nbits); + dec_hat = dec_simple_hat = dec_tx_codewords = zeros(1,frames); + + ns2 = floor(nstages/2); + for f=ns2+1:frames-ns2 + tx_bits = tx_codewords(f,:) < 0; + dec_tx_codewords(f) = sum(tx_bits .* 2.^(nbits-1:-1:0)); + dec_hat(f) = find_most_likely_codeword(rx_codewords(f-ns2:f+ns2,:)/(2*var),log(transition_probabilities+0.001), nstages, verbose); + rx_bits = dec2sd(dec_hat(f), nbits) < 0; + rx_bits_simple = rx_codewords(f,:) < 0; + dec_simple_hat(f) = sum(rx_bits_simple .* 2.^(nbits-1:-1:0)); + + nerrors += sum(xor(tx_bits, rx_bits)); + nerrors_simple += sum(xor(tx_bits, rx_bits_simple)); + if verbose + printf("[%d] %d %d\n", f, nerrors, nerrors_simple); + end + tbits += nbits; + end + + EbNodB = 10*log10(1/(2*var)); + printf("Eb/No: %3.2f dB nerrors %d %d BER: %3.2f %3.2f std dev: %3.2f %3.2f\n", + EbNodB, nerrors, nerrors_simple, nerrors/tbits, nerrors_simple/tbits, + std(dec_tx_codewords - dec_hat), std(dec_tx_codewords - dec_simple_hat)); + +endfunction + + +% Single point test, print out tables + +function test_single + tp = [1 0 0 0; 1 0 0 0; 1 0 0 0; 1 0 0 0]; + nstages = 3; + var = 0.5; + verbose = 1; + + tx_codewords = [1 1; 1 1; 1 1]; + run_test(tx_codewords, tp, nstages, var, verbose); +endfunction + + +% plot a trajectory of codewords, to help test "distance" is better using trellis than simple decoding + +function test_traj(tx_codewords, tp, nstages, var, verbose) + [frames nbits] = size(tx_codewords); + nstates = 2.^nbits; + + s = sum(tp+0.001,2); + [r c] = size(tp); + for i=1:r + tp(i,:) /= s(i); + end + + [dec_hat dec_simple_hat dec_tx_codewords] = run_test(tx_codewords, tp, nstages, var, verbose); + + figure(1); + subplot(211) + stem(dec_tx_codewords - dec_hat) + axis([1 frames -nstates/2 nstates/2]); + title('Trellis Decoding'); + subplot(212) + stem(dec_tx_codewords - dec_simple_hat); + axis([1 frames -nstates/2 nstates/2]); + title('Simple Decoding'); + + figure(2) + tp + length(1:nstates) + mesh(1:nstates,1:nstates,tp) + ylabel('current state'); + xlabel('next state'); +endfunction + + +% A contrived trajectories to check out the idea + +function simple_traj + %tp = [1 0 0 0; 1 0 0 0; 1 0 0 0; 1 0 0 0]; + tp = [0.5 0.25 0 0; 0.25 0.5 0.25 0; 0 0.25 0.5 0.25; 0 0 0.25 0.5]; + nstages = 3; + var = 0.5; + verbose = 0; + nbits = 2; + frames = 25; + + tx_codewords = ones(frames, nbits); + test_traj(tx_codewords, tp, nstages, var, verbose) +endfunction + + +% Run through a trajectory, say from a different file to what we +% trained with. Plot trajectory before and after passing through +% our decoder. Try first with no noise, then with noise. + +function test_codec_model_parameter(bitstream_filename, model_param) + [bits_per_frame bit_fields] = codec2_700_bit_fields; + + % load training data + + printf("loading training database and generating tp .... "); + [tp codewords_train] = build_tp("hts.bit"); + printf("done\n"); + + % load test data + + printf("loading test database .... "); + [tp_test codewords_test] = build_tp(bitstream_filename); + printf("done\n"); + + % run test data through + + nbits = bit_fields(model_param); + nstates = 2.^nbits; + nstages = 3; + var = 0.25; + verbose = 0; + frames = length(codewords_test); + %frames = 100; + + tx_codewords = zeros(frames, nbits); + for f=1:frames + dec = codewords_test(f, model_param); + tx_codewords(f,:) = dec2sd(dec, nbits); + end + + test_traj(tx_codewords, tp(1:nstates,1:nstates,model_param), nstages, var, verbose); + + figure(3) + plot(codewords_test(1:frames, model_param)) + +if 0 + figure(4); + fs=fopen("../raw/ve9qrp_10s.raw","rb"); + s = fread(fs,Inf,"short"); + plot(s(1:320*frames)) + axis([1 320*frames -3E4 3E4 ]) +end +endfunction + + +% writes an output bitsream file with errors corrected +% replay with something like: +% $ ./c2dec 700 ../../octave/ve9qrp_10s_trellis.bit - --softdec --natural | play -t raw -r 8000 -s -2 - + +function process_test_file(bitstream_filename) + [bits_per_frame bit_fields] = codec2_700_bit_fields; + + % load training data + + printf("loading training database and generating tp .... "); + [tp codewords_train] = build_tp("hts.bit"); + printf("done\n"); + + % load test data + + printf("loading test database .... "); + [tp_test codewords_test] = build_tp(bitstream_filename); + printf("done\n"); + + nstages = 3; + var = 0.5; + verbose = 0; + frames = length(codewords_test); + %frames = 150; + + % set up output frames + + frames_out = zeros(1,frames*bits_per_frame); + frames_out_simple = zeros(1,frames*bits_per_frame); + + % run test data through model and trellis decoder + + % just pass these fields straight through + + %for mp=1:10 + for mp=[1 2 3 10] + nbits = bit_fields(mp); + + % pack parameters in SD format into output frame + + for i=1:frames + en = (i-1)*bits_per_frame + sum(bit_fields(1:mp)); + st = en - (nbits-1); + %printf("fr st: %d offset: %d st: %d en: %d\n", (i-1)*bits_per_frame, sum(bit_fields(1:mp)), st, en); + frames_out(st:en) = dec2sd(codewords_test(i, mp), nbits); + frames_out_simple(st:en) = dec2sd(codewords_test(i, mp), nbits); + %p += bit_fields(i); + end + end + + + % trellis decode these fields + + for mp=4:9 + nbits = bit_fields(mp); + nstates = 2.^nbits; + + printf("processing parameter: %d nbits: %d\n", mp, nbits); + + % normalise transition probability rows + + tpmp = tp(1:nstates,1:nstates, mp); + s = sum(tpmp+0.001,2); + [r c] = size(tpmp); + for i=1:r + tpmp(i,:) /= s(i); + end + + tx_codewords = zeros(frames, nbits); + for f=1:frames + dec = codewords_test(f, mp); + tx_codewords(f,:) = dec2sd(dec, nbits); + end + + [dec_hat dec_simple_hat dec_tx_codewords] = run_test(tx_codewords, tpmp, nstages, var, verbose); + + % pack decoded parameter in SD format into output frame + + for i=1:frames + en = (i-1)*bits_per_frame + sum(bit_fields(1:mp)); + st = en - (nbits-1); + frames_out(st:en) = dec2sd(dec_hat(i), nbits); + frames_out_simple(st:en) = dec2sd(dec_simple_hat(i), nbits); + end + + end + + % save frames out + + [tok rem] = strtok(bitstream_filename,"."); + fn_trellis = sprintf("%s_%3.2f_trellis%s",tok,var,rem); + fn_simple = sprintf("%s_%3.2f_simple%s",tok,var,rem); + printf("writing output files: %s %s for your listening pleasure!\n", fn_trellis, fn_simple); + + fbitstream = fopen(fn_trellis,"wb"); + fwrite(fbitstream, frames_out,"float32"); + fclose(fbitstream); + + fbitstream = fopen(fn_simple,"wb"); + fwrite(fbitstream, frames_out_simple,"float32"); + fclose(fbitstream); + +endfunction + +% uncomment one of the below to run a simulation + +%test_single +%simple_traj; +test_codec_model_parameter("ve9qrp_10s.bit", 6); +%process_test_file("ve9qrp_10s.bit") + diff --git a/codec2/tags/0.4.1/octave/twomixer.m b/codec2/tags/0.4.1/octave/twomixer.m new file mode 100644 index 00000000..0a718cb5 --- /dev/null +++ b/codec2/tags/0.4.1/octave/twomixer.m @@ -0,0 +1,38 @@ +% twomixer.m +% David Rowe Feb 2015 +% +% test program for combining signals from two mixers + +fc=1024; +Fs=8192; +[b a] = cheby2(6,40,[200 3000]/(Fs/2)); + +w1 = 2*pi*(fc/2)/(Fs/2); +w2 = 2*pi*(3*fc/2)/(Fs/2); +w3 = 2*pi*(5*fc/2)/(Fs/2); +wc = 2*pi*fc/(Fs/2); + +t = 0:(Fs-1); +s1 = cos(w1.*t); +s2 = cos(w2.*t); +s3 = cos(w3.*t); +s = s1 + s2 + s3; + +lo1 = cos(wc*t); +lo2 = cos(2*wc*t); +out1 = filter(b,a,s .* lo1); +out2 = filter(b,a,s .* lo2); + +S = fft(s); + +figure(1) +subplot(211) +plot(abs(S)); +subplot(212) +plot(angle(S)) + +figure(2) +subplot(211) +plot(abs(fft(out1))) +subplot(212) +plot(abs(fft(out2))) diff --git a/codec2/tags/0.4.1/octave/twotone.m b/codec2/tags/0.4.1/octave/twotone.m new file mode 100644 index 00000000..a20c5c5a --- /dev/null +++ b/codec2/tags/0.4.1/octave/twotone.m @@ -0,0 +1,52 @@ +% twotone.m +% David Rowe Aug 2012 +% Used to experiment with combining phase of two tones + +function cbphase + + Wo = 100.0*pi/4000; + L = floor(pi/Wo); + phi = zeros(1,L); + + % two harmonics + + a = 20; b = 21; + + % set up phases to whatever + + phi(a) = -pi; + phi(b) = -pi/2; + + % synthesis the two-tone signal + + N = 16000; + Nplot = 250; + s = zeros(1,N); + + for m=a:b + s_m = cos(m*Wo*(0:(N-1)) + phi(m)); + s = s + s_m; + endfor + + % now our theory says that this signal should be the same perceptually + + phi_(a) = (phi(a) - phi(b))/2; + phi_(b) = (phi(b) - phi(a))/2; + + s_ = zeros(1,N); + for m=a:b + s_m = cos(m*Wo*(0:(N-1)) + phi_(m)); + s_ = s_ + s_m; + endfor + + % plot them and see if envelope has the same phase, but "carriers" + % have different phase + + figure(1); + clf; + subplot(211); + plot(s(1:Nplot)); + subplot(212); + plot(s_(1:Nplot),'r'); +endfunction + diff --git a/codec2/tags/0.4.1/octave/twotone1.m b/codec2/tags/0.4.1/octave/twotone1.m new file mode 100644 index 00000000..9f36c68d --- /dev/null +++ b/codec2/tags/0.4.1/octave/twotone1.m @@ -0,0 +1,76 @@ +% twotone1.m +% David Rowe Aug 17 2012 +% +% Used to experiment with combining phase of two tones. This version +% sets up a complete synthetic speech signal then tries to combine the +% phase of high frequency tones. Lets see if we can do this and keep perceptual +% nature of signal the same. + +function twotone1 + + % hts1a frame 47 + + Wo = 0.093168; + L = 33; + %A = [69.626907 460.218536 839.677429 2577.498047 972.647888 712.755066 489.048553 364.830536 409.230652 371.767487 489.112854 893.127014 2447.596680 752.878113 475.720520 234.452271 248.161606 232.171051 202.669891 323.914490 678.749451 362.958038 211.652512 170.764435 148.631790 169.261673 272.254150 176.872375 67.344391 99.022301 60.812035 34.319073 14.864757]; + A = zeros(1,L)*100; + phi = [1.560274 1.508063 -1.565184 1.289117 -2.547365 1.412528 -1.303992 3.121130 1.087573 -1.158161 -2.928007 0.995093 -2.614023 0.246136 -2.267406 2.143802 -0.273431 -2.266897 1.685171 -0.668712 2.699722 -1.151891 2.406379 -0.046192 -2.718611 0.761067 -2.305014 0.133172 -1.428978 1.492630 -1.668385 1.539734 -1.336615]; + %phi = zeros(1,L); + st = floor(L/2); + %st = 1; + + A(st:st+5) = 1000; + + % now set up phase of signal with phase of upper frequency harmonic + % pairs combined + + phi_ = phi; + for m=floor(L/2):2:L + phi_(m) = (phi(m) - phi(m+1))/2; + phi_(m+1) = (phi(m+1) - phi(m))/2; + %phi_(m+1) = 0; + end + + % synthesise the signals + + N = 16000; + Nplot = 250; + + s = zeros(1,N); + for m=st:L + s_m = A(m)*cos(m*Wo*(0:(N-1)) + phi(m)); + s = s + s_m; + endfor + + s_ = zeros(1,N); + for m=st:L + s_m = A(m)*cos(m*Wo*(0:(N-1)) + phi_(m)); + s_ = s_ + s_m; + endfor + + % plot them, expect to see similar time domain waveforms + + figure(1); + clf; + subplot(211); + plot(s(1:Nplot)); + subplot(212); + plot(s_(1:Nplot),'r'); + + figure(2); + clf; + subplot(211); + plot(s(1:Nplot)-s_(1:Nplot)); + + % save to disk + + gain = 1; + fs=fopen("twotone1_orig.raw","wb"); + fwrite(fs,gain*s,"short"); + fclose(fs); + fs=fopen("twotone1_comb.raw","wb"); + fwrite(fs,gain*s_,"short"); + fclose(fs); + +endfunction + diff --git a/codec2/tags/0.4.1/octave/undersample.m b/codec2/tags/0.4.1/octave/undersample.m new file mode 100644 index 00000000..1bfbf38b --- /dev/null +++ b/codec2/tags/0.4.1/octave/undersample.m @@ -0,0 +1,26 @@ +% undersample.m +% David Rowe 5 Nov 2012 +% Testing algorithms for plotting undersampled data for fdmdv2 waveform displays + +fs=fopen("../raw/hts1a.raw","rb"); +s = fread(fs,Inf,"short"); + +Fs1=8000; +Fs2=200; + +M=Fs1/Fs2; + +samples=length(s)/M; +s1=zeros(1,2*samples); +for b=1:samples + st = (b-1)*M + 1; + en = b*M; + s1(2*b-1) = max(s(st:en)); + s1(2*b) = min(s(st:en)); +end + +subplot(211) +plot(s) +subplot(212) +plot(s1); + diff --git a/codec2/tags/0.4.1/raw/b0067.raw b/codec2/tags/0.4.1/raw/b0067.raw new file mode 100644 index 00000000..3aea9cda Binary files /dev/null and b/codec2/tags/0.4.1/raw/b0067.raw differ diff --git a/codec2/tags/0.4.1/raw/cq_ref.raw b/codec2/tags/0.4.1/raw/cq_ref.raw new file mode 100644 index 00000000..485703d9 Binary files /dev/null and b/codec2/tags/0.4.1/raw/cq_ref.raw differ diff --git a/codec2/tags/0.4.1/raw/cross.raw b/codec2/tags/0.4.1/raw/cross.raw new file mode 100644 index 00000000..1b2af6a9 Binary files /dev/null and b/codec2/tags/0.4.1/raw/cross.raw differ diff --git a/codec2/tags/0.4.1/raw/cross_melp2400.raw b/codec2/tags/0.4.1/raw/cross_melp2400.raw new file mode 100644 index 00000000..439012ca Binary files /dev/null and b/codec2/tags/0.4.1/raw/cross_melp2400.raw differ diff --git a/codec2/tags/0.4.1/raw/f2400.raw b/codec2/tags/0.4.1/raw/f2400.raw new file mode 100644 index 00000000..5f4427f2 Binary files /dev/null and b/codec2/tags/0.4.1/raw/f2400.raw differ diff --git a/codec2/tags/0.4.1/raw/forig.raw b/codec2/tags/0.4.1/raw/forig.raw new file mode 100644 index 00000000..4ba294d7 Binary files /dev/null and b/codec2/tags/0.4.1/raw/forig.raw differ diff --git a/codec2/tags/0.4.1/raw/forig_ambe2000.raw b/codec2/tags/0.4.1/raw/forig_ambe2000.raw new file mode 100644 index 00000000..91143579 Binary files /dev/null and b/codec2/tags/0.4.1/raw/forig_ambe2000.raw differ diff --git a/codec2/tags/0.4.1/raw/forig_g729a.raw b/codec2/tags/0.4.1/raw/forig_g729a.raw new file mode 100644 index 00000000..fbca567b Binary files /dev/null and b/codec2/tags/0.4.1/raw/forig_g729a.raw differ diff --git a/codec2/tags/0.4.1/raw/forig_gsm13k.raw b/codec2/tags/0.4.1/raw/forig_gsm13k.raw new file mode 100644 index 00000000..71cbe6f6 Binary files /dev/null and b/codec2/tags/0.4.1/raw/forig_gsm13k.raw differ diff --git a/codec2/tags/0.4.1/raw/forig_speex_8k.raw b/codec2/tags/0.4.1/raw/forig_speex_8k.raw new file mode 100644 index 00000000..e95302ef Binary files /dev/null and b/codec2/tags/0.4.1/raw/forig_speex_8k.raw differ diff --git a/codec2/tags/0.4.1/raw/g3plx.raw b/codec2/tags/0.4.1/raw/g3plx.raw new file mode 100644 index 00000000..9970c3fb Binary files /dev/null and b/codec2/tags/0.4.1/raw/g3plx.raw differ diff --git a/codec2/tags/0.4.1/raw/hts.raw b/codec2/tags/0.4.1/raw/hts.raw new file mode 100644 index 00000000..79f869ad Binary files /dev/null and b/codec2/tags/0.4.1/raw/hts.raw differ diff --git a/codec2/tags/0.4.1/raw/hts1.raw b/codec2/tags/0.4.1/raw/hts1.raw new file mode 100644 index 00000000..3369387e Binary files /dev/null and b/codec2/tags/0.4.1/raw/hts1.raw differ diff --git a/codec2/tags/0.4.1/raw/hts1a.raw b/codec2/tags/0.4.1/raw/hts1a.raw new file mode 100644 index 00000000..7332f936 Binary files /dev/null and b/codec2/tags/0.4.1/raw/hts1a.raw differ diff --git a/codec2/tags/0.4.1/raw/hts1a_ambe2000.raw b/codec2/tags/0.4.1/raw/hts1a_ambe2000.raw new file mode 100644 index 00000000..ab72ba2f Binary files /dev/null and b/codec2/tags/0.4.1/raw/hts1a_ambe2000.raw differ diff --git a/codec2/tags/0.4.1/raw/hts1a_g729a.raw b/codec2/tags/0.4.1/raw/hts1a_g729a.raw new file mode 100644 index 00000000..130f1ddc Binary files /dev/null and b/codec2/tags/0.4.1/raw/hts1a_g729a.raw differ diff --git a/codec2/tags/0.4.1/raw/hts1a_gsm13k.raw b/codec2/tags/0.4.1/raw/hts1a_gsm13k.raw new file mode 100644 index 00000000..dd102f59 Binary files /dev/null and b/codec2/tags/0.4.1/raw/hts1a_gsm13k.raw differ diff --git a/codec2/tags/0.4.1/raw/hts1a_melp.raw b/codec2/tags/0.4.1/raw/hts1a_melp.raw new file mode 100644 index 00000000..a4040d29 Binary files /dev/null and b/codec2/tags/0.4.1/raw/hts1a_melp.raw differ diff --git a/codec2/tags/0.4.1/raw/hts1a_speex_8k.raw b/codec2/tags/0.4.1/raw/hts1a_speex_8k.raw new file mode 100644 index 00000000..9289e1c9 Binary files /dev/null and b/codec2/tags/0.4.1/raw/hts1a_speex_8k.raw differ diff --git a/codec2/tags/0.4.1/raw/hts2.raw b/codec2/tags/0.4.1/raw/hts2.raw new file mode 100644 index 00000000..0bb9df10 Binary files /dev/null and b/codec2/tags/0.4.1/raw/hts2.raw differ diff --git a/codec2/tags/0.4.1/raw/hts2a.raw b/codec2/tags/0.4.1/raw/hts2a.raw new file mode 100644 index 00000000..6d9cf17b Binary files /dev/null and b/codec2/tags/0.4.1/raw/hts2a.raw differ diff --git a/codec2/tags/0.4.1/raw/hts2a_ambe2000.raw b/codec2/tags/0.4.1/raw/hts2a_ambe2000.raw new file mode 100644 index 00000000..7225f60a Binary files /dev/null and b/codec2/tags/0.4.1/raw/hts2a_ambe2000.raw differ diff --git a/codec2/tags/0.4.1/raw/hts2a_g729a.raw b/codec2/tags/0.4.1/raw/hts2a_g729a.raw new file mode 100644 index 00000000..9199b0ad Binary files /dev/null and b/codec2/tags/0.4.1/raw/hts2a_g729a.raw differ diff --git a/codec2/tags/0.4.1/raw/hts2a_gsm13k.raw b/codec2/tags/0.4.1/raw/hts2a_gsm13k.raw new file mode 100644 index 00000000..f0a58505 Binary files /dev/null and b/codec2/tags/0.4.1/raw/hts2a_gsm13k.raw differ diff --git a/codec2/tags/0.4.1/raw/hts2a_melp.raw b/codec2/tags/0.4.1/raw/hts2a_melp.raw new file mode 100644 index 00000000..5138e494 Binary files /dev/null and b/codec2/tags/0.4.1/raw/hts2a_melp.raw differ diff --git a/codec2/tags/0.4.1/raw/hts2a_speex_8k.raw b/codec2/tags/0.4.1/raw/hts2a_speex_8k.raw new file mode 100644 index 00000000..c421bb4e Binary files /dev/null and b/codec2/tags/0.4.1/raw/hts2a_speex_8k.raw differ diff --git a/codec2/tags/0.4.1/raw/k6hx.raw b/codec2/tags/0.4.1/raw/k6hx.raw new file mode 100644 index 00000000..35e6df71 Binary files /dev/null and b/codec2/tags/0.4.1/raw/k6hx.raw differ diff --git a/codec2/tags/0.4.1/raw/kristoff.raw b/codec2/tags/0.4.1/raw/kristoff.raw new file mode 100644 index 00000000..9b0b4655 Binary files /dev/null and b/codec2/tags/0.4.1/raw/kristoff.raw differ diff --git a/codec2/tags/0.4.1/raw/m2400.raw b/codec2/tags/0.4.1/raw/m2400.raw new file mode 100644 index 00000000..1c0956da Binary files /dev/null and b/codec2/tags/0.4.1/raw/m2400.raw differ diff --git a/codec2/tags/0.4.1/raw/mmt1.raw b/codec2/tags/0.4.1/raw/mmt1.raw new file mode 100644 index 00000000..40638a5a Binary files /dev/null and b/codec2/tags/0.4.1/raw/mmt1.raw differ diff --git a/codec2/tags/0.4.1/raw/mmt1_ambe2000.raw b/codec2/tags/0.4.1/raw/mmt1_ambe2000.raw new file mode 100644 index 00000000..e38955c3 Binary files /dev/null and b/codec2/tags/0.4.1/raw/mmt1_ambe2000.raw differ diff --git a/codec2/tags/0.4.1/raw/mmt1_g729a.raw b/codec2/tags/0.4.1/raw/mmt1_g729a.raw new file mode 100644 index 00000000..196716e0 Binary files /dev/null and b/codec2/tags/0.4.1/raw/mmt1_g729a.raw differ diff --git a/codec2/tags/0.4.1/raw/mmt1_gsm13k.raw b/codec2/tags/0.4.1/raw/mmt1_gsm13k.raw new file mode 100644 index 00000000..a9965af3 Binary files /dev/null and b/codec2/tags/0.4.1/raw/mmt1_gsm13k.raw differ diff --git a/codec2/tags/0.4.1/raw/mmt1_speex_8k.raw b/codec2/tags/0.4.1/raw/mmt1_speex_8k.raw new file mode 100644 index 00000000..769a49cd Binary files /dev/null and b/codec2/tags/0.4.1/raw/mmt1_speex_8k.raw differ diff --git a/codec2/tags/0.4.1/raw/morig.raw b/codec2/tags/0.4.1/raw/morig.raw new file mode 100644 index 00000000..4af0e8f9 Binary files /dev/null and b/codec2/tags/0.4.1/raw/morig.raw differ diff --git a/codec2/tags/0.4.1/raw/morig_ambe2000.raw b/codec2/tags/0.4.1/raw/morig_ambe2000.raw new file mode 100644 index 00000000..99642756 Binary files /dev/null and b/codec2/tags/0.4.1/raw/morig_ambe2000.raw differ diff --git a/codec2/tags/0.4.1/raw/morig_g729a.raw b/codec2/tags/0.4.1/raw/morig_g729a.raw new file mode 100644 index 00000000..636ecfdc Binary files /dev/null and b/codec2/tags/0.4.1/raw/morig_g729a.raw differ diff --git a/codec2/tags/0.4.1/raw/morig_gsm13k.raw b/codec2/tags/0.4.1/raw/morig_gsm13k.raw new file mode 100644 index 00000000..660368fe Binary files /dev/null and b/codec2/tags/0.4.1/raw/morig_gsm13k.raw differ diff --git a/codec2/tags/0.4.1/raw/morig_speex_8k.raw b/codec2/tags/0.4.1/raw/morig_speex_8k.raw new file mode 100644 index 00000000..ab667a1b Binary files /dev/null and b/codec2/tags/0.4.1/raw/morig_speex_8k.raw differ diff --git a/codec2/tags/0.4.1/raw/sine1k_2Hz_spread.raw b/codec2/tags/0.4.1/raw/sine1k_2Hz_spread.raw new file mode 100644 index 00000000..1b8ad9ca Binary files /dev/null and b/codec2/tags/0.4.1/raw/sine1k_2Hz_spread.raw differ diff --git a/codec2/tags/0.4.1/raw/sine1k_2ms_delay_2Hz_spread.raw b/codec2/tags/0.4.1/raw/sine1k_2ms_delay_2Hz_spread.raw new file mode 100644 index 00000000..4d3e09ec Binary files /dev/null and b/codec2/tags/0.4.1/raw/sine1k_2ms_delay_2Hz_spread.raw differ diff --git a/codec2/tags/0.4.1/raw/ve9qrp.raw b/codec2/tags/0.4.1/raw/ve9qrp.raw new file mode 100644 index 00000000..489e9427 Binary files /dev/null and b/codec2/tags/0.4.1/raw/ve9qrp.raw differ diff --git a/codec2/tags/0.4.1/raw/ve9qrp_10s.raw b/codec2/tags/0.4.1/raw/ve9qrp_10s.raw new file mode 100644 index 00000000..0d3bd3b9 Binary files /dev/null and b/codec2/tags/0.4.1/raw/ve9qrp_10s.raw differ diff --git a/codec2/tags/0.4.1/script/menu.sh b/codec2/tags/0.4.1/script/menu.sh new file mode 100755 index 00000000..c0335d27 --- /dev/null +++ b/codec2/tags/0.4.1/script/menu.sh @@ -0,0 +1,80 @@ +#!/bin/bash +# ./menu.sh +# +# David Rowe +# Created August 2009 +# +# Presents a menu of sound files, press 1 to play file1, 2 to play file2 etc +# +# The aim is to make comparing files with different processing easier than +# using up-arrow on the command line. Based on cdialog. +# +# usage: +# menu.sh file1.raw file2.raw ........ [-d playbackdevice] +# +# for example: +# +# ../script/menu.sh hts1a.raw hts1a_uq.raw +# +# or: +# +# ../script/menu.sh hts1a.raw hts1a_uq.raw -d /dev/dsp1 +# + +# Copyright (C) 2007 David Rowe +# +# All rights reserved. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 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 General Public License +# along with this program; if not, see . + +files=0 +items="Q-Quit\n" +while [ ! -z "$1" ] +do + case "$1" in + -d) dsp="${1} ${2}"; shift;; + *) files=`expr 1 + $files`; + new_file=$1; + file[$files]=$new_file; + items="${items} ${files}-${new_file}\n";; + esac + shift +done + +echo -n -e "\r" $items"- " +while true ; do + echo -n -e "\r -" + stty cbreak # or stty raw. Stty uses file descriptor 0, not /dev/tty. + readchar=`dd bs=1 count=1 2>/dev/null` + stty -cbreak + if [ -n "$readchar" ] ; then + if [ x$readchar == 'xq' -o x$readchar == 'xQ' ] ; then + echo + exit 0 + fi + if [ -z ${file[$readchar]} ] ; then + echo -n -e "\nUnknown input\n" $items"- " + continue + fi + if ( play --version ) >/dev/null 2>&1; then + play -r 8000 -s -2 ${file[$readchar]} $dsp 2> /dev/null + elif ( aplay --version ) > /dev/null 2>&1; then + aplay -r 8000 -f S16_LE ${file[$readchar]} 2> /dev/null + elif ( ossplay -f? ) > /dev/null 2>&1; then + ossplay -s8000 -fS16_LE ${file[$readchar]} 2> /dev/null + else + echo "could not find play, aplay or ossplay program" + fi + fi +done +echo diff --git a/codec2/tags/0.4.1/script/playraw.sh b/codec2/tags/0.4.1/script/playraw.sh new file mode 100755 index 00000000..683cbaa1 --- /dev/null +++ b/codec2/tags/0.4.1/script/playraw.sh @@ -0,0 +1,6 @@ +#!/bin/sh +# Plays a raw file +# usage: +# playraw file.raw +# playraw file.raw -d /dev/dsp1 (e.g. for USB headphones) +play -r 8000 -s -2 $1 $2 $3 diff --git a/codec2/tags/0.4.1/script/raw2wav.sh b/codec2/tags/0.4.1/script/raw2wav.sh new file mode 100755 index 00000000..a05efb72 --- /dev/null +++ b/codec2/tags/0.4.1/script/raw2wav.sh @@ -0,0 +1,3 @@ +#!/bin/sh +# Converts 16 bit signed short 8 kHz raw (headerless) files to wave +sox -r 8000 -s -2 $1 $2 diff --git a/codec2/tags/0.4.1/script/wav2raw.sh b/codec2/tags/0.4.1/script/wav2raw.sh new file mode 100755 index 00000000..39c0f1ae --- /dev/null +++ b/codec2/tags/0.4.1/script/wav2raw.sh @@ -0,0 +1,3 @@ +#!/bin/sh +# Converts wave files to raw (headerless) files +sox $1 -t raw $2 diff --git a/codec2/tags/0.4.1/src/CMakeLists.txt b/codec2/tags/0.4.1/src/CMakeLists.txt new file mode 100644 index 00000000..68241b89 --- /dev/null +++ b/codec2/tags/0.4.1/src/CMakeLists.txt @@ -0,0 +1,279 @@ +# +# Generated sources +# + +set(D ${CMAKE_CURRENT_SOURCE_DIR}/codebook) + +# lsp quantisers + +set(CODEBOOKS + ${D}/lsp1.txt + ${D}/lsp2.txt + ${D}/lsp3.txt + ${D}/lsp4.txt + ${D}/lsp5.txt + ${D}/lsp6.txt + ${D}/lsp7.txt + ${D}/lsp8.txt + ${D}/lsp9.txt + ${D}/lsp10.txt +) + +# lspd quantisers + +set(CODEBOOKSD + ${D}/dlsp1.txt + ${D}/dlsp2.txt + ${D}/dlsp3.txt + ${D}/dlsp4.txt + ${D}/dlsp5.txt + ${D}/dlsp6.txt + ${D}/dlsp7.txt + ${D}/dlsp8.txt + ${D}/dlsp9.txt + ${D}/dlsp10.txt +) + +set(CODEBOOKSJVM + ${D}/lspjvm1.txt + ${D}/lspjvm2.txt + ${D}/lspjvm3.txt +) + +set(CODEBOOKSMEL + ${D}/mel1.txt + ${D}/mel2.txt + ${D}/mel3.txt + ${D}/mel4.txt + ${D}/mel5.txt + ${D}/mel6.txt +) + +set(CODEBOOKSLSPMELVQ + ${D}/lspmelvq1.txt + ${D}/lspmelvq2.txt + ${D}/lspmelvq3.txt +) + +set(CODEBOOKSGE ${D}/gecb.txt) + +# when crosscompiling we need a native executable +if(CMAKE_CROSSCOMPILING) + include(ExternalProject) + ExternalProject_Add(codec2_native + SOURCE_DIR ${CMAKE_SOURCE_DIR} + BUILD_COMMAND $(MAKE) generate_codebook + INSTALL_COMMAND ${CMAKE_COMMAND} -E copy src/generate_codebook ${CMAKE_CURRENT_BINARY_DIR} + ) + add_executable(generate_codebook IMPORTED) + set_target_properties(generate_codebook PROPERTIES + IMPORTED_LOCATION ${CMAKE_CURRENT_BINARY_DIR}/generate_codebook) + add_dependencies(generate_codebook codec2_native) +else(CMAKE_CROSSCOMPILING) +# Build code generator binaries. These do not get installed. + # generate_codebook + add_executable(generate_codebook generate_codebook.c) + target_link_libraries(generate_codebook ${CMAKE_REQUIRED_LIBRARIES}) + # genlspdtcb + add_executable(genlspdtcb genlspdtcb.c) + target_link_libraries(genlspdtcb ${CMAKE_REQUIRED_LIBRARIES}) + # Make native builds available for cross-compiling. + export(TARGETS generate_codebook genlspdtcb + FILE ${CMAKE_BINARY_DIR}/ImportExecutables.cmake) +endif(CMAKE_CROSSCOMPILING) + + +# codebook.c +add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/codebook.c + COMMAND generate_codebook lsp_cb ${CODEBOOKS} > ${CMAKE_CURRENT_BINARY_DIR}/codebook.c + DEPENDS generate_codebook ${CODEBOOKS} +) + +# codebookd.c +add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/codebookd.c + COMMAND generate_codebook lsp_cbd ${CODEBOOKSD} > ${CMAKE_CURRENT_BINARY_DIR}/codebookd.c + DEPENDS generate_codebook ${CODEBOOKSD} +) + +# codebookjvm.c +add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/codebookjvm.c + COMMAND generate_codebook lsp_cbjvm ${CODEBOOKSJVM} > ${CMAKE_CURRENT_BINARY_DIR}/codebookjvm.c + DEPENDS generate_codebook ${CODEBOOKSJVM} +) + + +# codebookmel.c +add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/codebookmel.c + COMMAND generate_codebook mel_cb ${CODEBOOKSMEL} > ${CMAKE_CURRENT_BINARY_DIR}/codebookmel.c + DEPENDS generate_codebook ${CODEBOOKSMEL} +) + +# codebooklspmelvq.c +add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/codebooklspmelvq.c + COMMAND generate_codebook lspmelvq_cb ${CODEBOOKSLSPMELVQ} > ${CMAKE_CURRENT_BINARY_DIR}/codebooklspmelvq.c + DEPENDS generate_codebook ${CODEBOOKSLSPMELVQ} +) + +# codebookge.c +add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/codebookge.c + COMMAND generate_codebook ge_cb ${CODEBOOKSGE} > ${CMAKE_CURRENT_BINARY_DIR}/codebookge.c + DEPENDS generate_codebook ${CODEBOOKSGE} +) + +# +# codec2 library sources +# + +set(CODEC2_SRCS + dump.c + lpc.c + nlp.c + postfilter.c + sine.c + codec2.c + cohpsk.c + fifo.c + fdmdv.c + fm.c + kiss_fft.c + linreg.c + interp.c + lsp.c + phase.c + quantise.c + pack.c + codebook.c + codebookd.c + codebookjvm.c + codebookmel.c + codebooklspmelvq.c + codebookge.c + golay23.c + freedv_api.c + varicode.c + modem_stats.c +) + +set(CODEC2_PUBLIC_HEADERS + golay23.h + codec2.h + codec2_fdmdv.h + codec2_cohpsk.h + codec2_fm.h + codec2_fifo.h + comp.h + comp_prim.h + modem_stats.h + kiss_fft.h + freedv_api.h + varicode.h + freedv_api_internal.h +) + +# +# Setup the codec2 library +# +add_library(codec2 ${CODEC2_SRCS}) +include_directories(${CMAKE_CURRENT_SOURCE_DIR}) +target_link_libraries(codec2 ${CMAKE_REQUIRED_LIBRARIES}) +set_target_properties(codec2 PROPERTIES + SOVERSION ${SOVERSION} + PUBLIC_HEADER "${CODEC2_PUBLIC_HEADERS}" +) + +add_executable(c2demo c2demo.c) +target_link_libraries(c2demo ${CMAKE_REQUIRED_LIBRARIES} codec2) + +add_executable(c2enc c2enc.c) +target_link_libraries(c2enc ${CMAKE_REQUIRED_LIBRARIES} codec2) + +add_executable(c2dec c2dec.c) +target_link_libraries(c2dec ${CMAKE_REQUIRED_LIBRARIES} codec2) + +add_executable(c2sim c2sim.c ampexp.c phaseexp.c) +target_link_libraries(c2sim ${CMAKE_REQUIRED_LIBRARIES} codec2) + +add_executable(fdmdv_get_test_bits fdmdv_get_test_bits.c fdmdv.c kiss_fft.c) +target_link_libraries(fdmdv_get_test_bits ${CMAKE_REQUIRED_LIBRARIES}) + +add_executable(fdmdv_mod fdmdv_mod.c fdmdv.c kiss_fft.c) +target_link_libraries(fdmdv_mod ${CMAKE_REQUIRED_LIBRARIES}) + +add_executable(fdmdv_demod fdmdv_demod.c fdmdv.c kiss_fft.c octave.c modem_stats.c) +target_link_libraries(fdmdv_demod ${CMAKE_REQUIRED_LIBRARIES}) + +add_executable(fdmdv_put_test_bits fdmdv_put_test_bits.c fdmdv.c kiss_fft.c) +target_link_libraries(fdmdv_put_test_bits ${CMAKE_REQUIRED_LIBRARIES}) + +add_executable(fdmdv_channel fdmdv_channel.c) +target_link_libraries(fdmdv_channel ${CMAKE_REQUIRED_LIBRARIES} codec2) + +add_executable(fdmdv_interleave fdmdv_interleave.c) +target_link_libraries(fdmdv_interleave ${CMAKE_REQUIRED_LIBRARIES}) + +add_executable(insert_errors insert_errors.c) +target_link_libraries(insert_errors ${CMAKE_REQUIRED_LIBRARIES}) + +add_executable(fec_enc fec_enc.c golay23.c) +target_link_libraries(fec_enc ${CMAKE_REQUIRED_LIBRARIES} codec2) + +add_executable(fec_dec fec_dec.c golay23.c) +target_link_libraries(fec_dec ${CMAKE_REQUIRED_LIBRARIES} codec2) + +add_executable(freedv_tx freedv_tx.c) +target_link_libraries(freedv_tx ${CMAKE_REQUIRED_LIBRARIES} codec2) + +add_executable(freedv_rx freedv_rx.c) +target_link_libraries(freedv_rx ${CMAKE_REQUIRED_LIBRARIES} codec2) + +add_executable(fm_demod fm_demod.c fm.c) +target_link_libraries(fm_demod ${CMAKE_REQUIRED_LIBRARIES}) + +add_executable(cohpsk_mod cohpsk_mod.c) +target_link_libraries(cohpsk_mod ${CMAKE_REQUIRED_LIBRARIES} codec2) + +add_executable(cohpsk_demod cohpsk_demod.c octave.c) +target_link_libraries(cohpsk_demod ${CMAKE_REQUIRED_LIBRARIES} codec2) + +add_executable(cohpsk_get_test_bits cohpsk_get_test_bits.c) +target_link_libraries(cohpsk_get_test_bits ${CMAKE_REQUIRED_LIBRARIES} codec2) + +add_executable(cohpsk_put_test_bits cohpsk_put_test_bits.c octave.c) +target_link_libraries(cohpsk_put_test_bits ${CMAKE_REQUIRED_LIBRARIES} codec2) + +add_executable(cohpsk_ch cohpsk_ch.c) +target_link_libraries(cohpsk_ch ${CMAKE_REQUIRED_LIBRARIES} codec2) + +install(TARGETS codec2 EXPORT codec2-config + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/codec2 +) + +#install(EXPORT codec2-config +# DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/codec2 +#) + +install(TARGETS + c2demo + c2demo + c2enc + c2dec + c2sim + fdmdv_get_test_bits + fdmdv_mod fdmdv_demod + fm_demod + fdmdv_put_test_bits + fdmdv_interleave + insert_errors + fec_enc + fec_dec + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} +) diff --git a/codec2/tags/0.4.1/src/_kiss_fft_guts.h b/codec2/tags/0.4.1/src/_kiss_fft_guts.h new file mode 100644 index 00000000..64bc1d11 --- /dev/null +++ b/codec2/tags/0.4.1/src/_kiss_fft_guts.h @@ -0,0 +1,164 @@ +/* +Copyright (c) 2003-2010, Mark Borgerding + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + * Neither the author nor the names of any contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* kiss_fft.h + defines kiss_fft_scalar as either short or a float type + and defines + typedef struct { kiss_fft_scalar r; kiss_fft_scalar i; }kiss_fft_cpx; */ +#include "kiss_fft.h" +#include + +#define MAXFACTORS 32 +/* e.g. an fft of length 128 has 4 factors + as far as kissfft is concerned + 4*4*4*2 + */ + +struct kiss_fft_state{ + int nfft; + int inverse; + int factors[2*MAXFACTORS]; + kiss_fft_cpx twiddles[1]; +}; + +/* + Explanation of macros dealing with complex math: + + C_MUL(m,a,b) : m = a*b + C_FIXDIV( c , div ) : if a fixed point impl., c /= div. noop otherwise + C_SUB( res, a,b) : res = a - b + C_SUBFROM( res , a) : res -= a + C_ADDTO( res , a) : res += a + * */ +#ifdef FIXED_POINT +#if (FIXED_POINT==32) +# define FRACBITS 31 +# define SAMPPROD int64_t +#define SAMP_MAX 2147483647 +#else +# define FRACBITS 15 +# define SAMPPROD int32_t +#define SAMP_MAX 32767 +#endif + +#define SAMP_MIN -SAMP_MAX + +#if defined(CHECK_OVERFLOW) +# define CHECK_OVERFLOW_OP(a,op,b) \ + if ( (SAMPPROD)(a) op (SAMPPROD)(b) > SAMP_MAX || (SAMPPROD)(a) op (SAMPPROD)(b) < SAMP_MIN ) { \ + fprintf(stderr,"WARNING:overflow @ " __FILE__ "(%d): (%d " #op" %d) = %ld\n",__LINE__,(a),(b),(SAMPPROD)(a) op (SAMPPROD)(b) ); } +#endif + + +# define smul(a,b) ( (SAMPPROD)(a)*(b) ) +# define sround( x ) (kiss_fft_scalar)( ( (x) + (1<<(FRACBITS-1)) ) >> FRACBITS ) + +# define S_MUL(a,b) sround( smul(a,b) ) + +# define C_MUL(m,a,b) \ + do{ (m).r = sround( smul((a).r,(b).r) - smul((a).i,(b).i) ); \ + (m).i = sround( smul((a).r,(b).i) + smul((a).i,(b).r) ); }while(0) + +# define DIVSCALAR(x,k) \ + (x) = sround( smul( x, SAMP_MAX/k ) ) + +# define C_FIXDIV(c,div) \ + do { DIVSCALAR( (c).r , div); \ + DIVSCALAR( (c).i , div); }while (0) + +# define C_MULBYSCALAR( c, s ) \ + do{ (c).r = sround( smul( (c).r , s ) ) ;\ + (c).i = sround( smul( (c).i , s ) ) ; }while(0) + +#else /* not FIXED_POINT*/ + +# define S_MUL(a,b) ( (a)*(b) ) +#define C_MUL(m,a,b) \ + do{ (m).r = (a).r*(b).r - (a).i*(b).i;\ + (m).i = (a).r*(b).i + (a).i*(b).r; }while(0) +# define C_FIXDIV(c,div) /* NOOP */ +# define C_MULBYSCALAR( c, s ) \ + do{ (c).r *= (s);\ + (c).i *= (s); }while(0) +#endif + +#ifndef CHECK_OVERFLOW_OP +# define CHECK_OVERFLOW_OP(a,op,b) /* noop */ +#endif + +#define C_ADD( res, a,b)\ + do { \ + CHECK_OVERFLOW_OP((a).r,+,(b).r)\ + CHECK_OVERFLOW_OP((a).i,+,(b).i)\ + (res).r=(a).r+(b).r; (res).i=(a).i+(b).i; \ + }while(0) +#define C_SUB( res, a,b)\ + do { \ + CHECK_OVERFLOW_OP((a).r,-,(b).r)\ + CHECK_OVERFLOW_OP((a).i,-,(b).i)\ + (res).r=(a).r-(b).r; (res).i=(a).i-(b).i; \ + }while(0) +#define C_ADDTO( res , a)\ + do { \ + CHECK_OVERFLOW_OP((res).r,+,(a).r)\ + CHECK_OVERFLOW_OP((res).i,+,(a).i)\ + (res).r += (a).r; (res).i += (a).i;\ + }while(0) + +#define C_SUBFROM( res , a)\ + do {\ + CHECK_OVERFLOW_OP((res).r,-,(a).r)\ + CHECK_OVERFLOW_OP((res).i,-,(a).i)\ + (res).r -= (a).r; (res).i -= (a).i; \ + }while(0) + + +#ifdef FIXED_POINT +# define KISS_FFT_COS(phase) floorf(.5+SAMP_MAX * cosf (phase)) +# define KISS_FFT_SIN(phase) floorf(.5+SAMP_MAX * sinf (phase)) +# define HALF_OF(x) ((x)>>1) +#elif defined(USE_SIMD) +# define KISS_FFT_COS(phase) _mm_set1_ps( cosf(phase) ) +# define KISS_FFT_SIN(phase) _mm_set1_ps( sinf(phase) ) +# define HALF_OF(x) ((x)*_mm_set1_ps(.5)) +#else +# define KISS_FFT_COS(phase) (kiss_fft_scalar) cosf(phase) +# define KISS_FFT_SIN(phase) (kiss_fft_scalar) sinf(phase) +# define HALF_OF(x) ((x)*.5) +#endif + +#define kf_cexp(x,phase) \ + do{ \ + (x)->r = KISS_FFT_COS(phase);\ + (x)->i = KISS_FFT_SIN(phase);\ + }while(0) + + +/* a debugging function */ +#define pcpx(c)\ + fprintf(stderr,"%g + %gi\n",(double)((c)->r),(double)((c)->i) ) + + +#ifdef KISS_FFT_USE_ALLOCA +// define this to allow use of alloca instead of malloc for temporary buffers +// Temporary buffers are used in two case: +// 1. FFT sizes that have "bad" factors. i.e. not 2,3 and 5 +// 2. "in-place" FFTs. Notice the quotes, since kissfft does not really do an in-place transform. +#include +#define KISS_FFT_TMP_ALLOC(nbytes) alloca(nbytes) +#define KISS_FFT_TMP_FREE(ptr) +#else +#define KISS_FFT_TMP_ALLOC(nbytes) KISS_FFT_MALLOC(nbytes) +#define KISS_FFT_TMP_FREE(ptr) KISS_FFT_FREE(ptr) +#endif diff --git a/codec2/tags/0.4.1/src/ampexp.c b/codec2/tags/0.4.1/src/ampexp.c new file mode 100644 index 00000000..94e2184c --- /dev/null +++ b/codec2/tags/0.4.1/src/ampexp.c @@ -0,0 +1,1093 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: ampexp.c + AUTHOR......: David Rowe + DATE CREATED: 7 August 2012 + + Functions for experimenting with amplitude quantisation. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2012 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 . +*/ + + +#include +#include +#include +#include +#include +#include + +#include "ampexp.h" + + +#define PRED_COEFF 0.9 + +/* states for amplitude experiments */ + +struct codebook { + unsigned int k; + unsigned int log2m; + unsigned int m; + float *cb; + unsigned int offset; +}; + +struct AEXP { + float A_prev[MAX_AMP]; + int frames; + float snr; + int snr_n; + float var; + int var_n; + float vq_var; + int vq_var_n; + struct codebook *vq1,*vq2,*vq3,*vq4,*vq5; + + int indexes[5][3]; + MODEL model[3]; + float mag[3]; + MODEL model_uq[3]; +}; + + +/*---------------------------------------------------------------------------*\ + + Bruce Perens' funcs to load codebook files + +\*---------------------------------------------------------------------------*/ + + +static const char format[] = +"The table format must be:\n" +"\tTwo integers describing the dimensions of the codebook.\n" +"\tThen, enough numbers to fill the specified dimensions.\n"; + +static float get_float(FILE * in, const char * name, char * * cursor, char * buffer, int size) +{ + for ( ; ; ) { + char * s = *cursor; + char c; + + while ( (c = *s) != '\0' && !isdigit(c) && c != '-' && c != '.' ) + s++; + + /* Comments start with "#" and continue to the end of the line. */ + if ( c != '\0' && c != '#' ) { + char * end = 0; + float f = 0; + + f = strtod(s, &end); + + if ( end != s ) + *cursor = end; + return f; + } + + if ( fgets(buffer, size, in) == NULL ) { + fprintf(stderr, "%s: Format error. %s\n", name, format); + exit(1); + } + *cursor = buffer; + } +} + +static struct codebook *load(const char * name) +{ + FILE *file; + char line[2048]; + char *cursor = line; + struct codebook *b = malloc(sizeof(struct codebook)); + int i; + int size; + + file = fopen(name, "rt"); + assert(file != NULL); + + *cursor = '\0'; + + b->k = (int)get_float(file, name, &cursor, line, sizeof(line)); + b->m = (int)get_float(file, name ,&cursor, line, sizeof(line)); + size = b->k * b->m; + + b->cb = (float *)malloc(size * sizeof(float)); + + for ( i = 0; i < size; i++ ) { + b->cb[i] = get_float(file, name, &cursor, line, sizeof(line)); + } + + fclose(file); + + return b; +} + + +/*---------------------------------------------------------------------------* \ + + amp_experiment_create() + + Inits states for amplitude quantisation experiments. + +\*---------------------------------------------------------------------------*/ + +struct AEXP *amp_experiment_create() { + struct AEXP *aexp; + int i,j,m; + + aexp = (struct AEXP *)malloc(sizeof(struct AEXP)); + assert (aexp != NULL); + + for(i=0; iA_prev[i] = 1.0; + aexp->frames = 0; + aexp->snr = 0.0; + aexp->snr_n = 0; + aexp->var = 0.0; + aexp->var_n = 0; + aexp->vq_var = 0.0; + aexp->vq_var_n = 0; + + //aexp->vq1 = load("amp_1_80_1024a.txt"); + //aexp->vq1 = load("../unittest/st1_10_1024.txt"); + //aexp->vq1 = load("../unittest/amp41_80_1024.txt"); + //aexp->vq1->offset = 40; + aexp->vq1 = load("../unittest/amp1_10_1024.txt"); + aexp->vq1->offset = 0; + aexp->vq2 = load("../unittest/amp11_20_1024.txt"); + aexp->vq2->offset = 10; + + aexp->vq3 = load("../unittest/amp21_40_1024.txt"); + aexp->vq3->offset = 20; + aexp->vq4 = load("../unittest/amp41_60_1024.txt"); + aexp->vq4->offset = 40; + aexp->vq5 = load("../unittest/amp61_80_256.txt"); + aexp->vq5->offset = 60; + + #ifdef CAND2_GS + //aexp->vq1 = load("../unittest/t1_amp1_20_1024.txt"); + //aexp->vq1 = load("../unittest/t2_amp1_20_1024.txt"); + aexp->vq1 = load("../unittest/amp1_20_1024.txt"); + aexp->vq1->offset = 0; + aexp->vq2 = load("../unittest/amp21_40_1024.txt"); + aexp->vq2->offset = 20; + aexp->vq3 = load("../unittest/amp41_60_1024.txt"); + aexp->vq3->offset = 40; + aexp->vq4 = load("../unittest/amp61_80_32.txt"); + aexp->vq4->offset = 60; + #endif + + //#define CAND2_GS + #ifdef CAND2_GS + aexp->vq1 = load("../unittest/amp1_20_1024.txt"); + aexp->vq2 = load("../unittest/amp21_40_1024.txt"); + aexp->vq3 = load("../unittest/amp41_80_1024.txt"); + aexp->vq4 = load("../unittest/amp61_80_32.txt"); + aexp->vq1->offset = 0; + aexp->vq2->offset = 20; + aexp->vq3->offset = 40; + aexp->vq4->offset = 60; + #endif + + //#define CAND1 + #ifdef CAND1 + aexp->vq1 = load("../unittest/amp1_10_128.txt"); + aexp->vq2 = load("../unittest/amp11_20_512.txt"); + aexp->vq3 = load("../unittest/amp21_40_1024.txt"); + aexp->vq4 = load("../unittest/amp41_60_1024.txt"); + aexp->vq5 = load("../unittest/amp61_80_32.txt"); + aexp->vq1->offset = 0; + aexp->vq2->offset = 10; + aexp->vq3->offset = 20; + aexp->vq4->offset = 40; + aexp->vq5->offset = 60; + #endif + + for(i=0; i<3; i++) { + for(j=0; j<5; j++) + aexp->indexes[j][i] = 0; + aexp->mag[i] = 1.0; + aexp->model[i].Wo = TWO_PI*100.0/8000.0; + aexp->model[i].L = floor(PI/aexp->model[i].Wo); + for(m=1; m<=MAX_AMP; m++) + aexp->model[i].A[m] = 10.0; + aexp->model_uq[i] = aexp->model[i]; + } + + return aexp; +} + + +/*---------------------------------------------------------------------------* \ + + amp_experiment_destroy() + +\*---------------------------------------------------------------------------*/ + +void amp_experiment_destroy(struct AEXP *aexp) { + assert(aexp != NULL); + if (aexp->snr != 0.0) + printf("snr: %4.2f dB\n", aexp->snr/aexp->snr_n); + if (aexp->var != 0.0) + printf("var...: %4.3f std dev...: %4.3f (%d amplitude samples)\n", + aexp->var/aexp->var_n, sqrt(aexp->var/aexp->var_n), aexp->var_n); + if (aexp->vq_var != 0.0) + printf("vq var: %4.3f std dev...: %4.3f (%d amplitude samples)\n", + aexp->vq_var/aexp->vq_var_n, sqrt(aexp->vq_var/aexp->vq_var_n), aexp->vq_var_n); + free(aexp); +} + + +/*---------------------------------------------------------------------------*\ + + Various test and experimental functions ................ + +\*---------------------------------------------------------------------------*/ + +/* + Quantisation noise simulation. Assume noise on amplitudes is a uniform + distribution, of +/- x dB. This means x = sqrt(3)*sigma. + + Note: for uniform distribution var = = sigma * sigma = (b-a)*(b-a)/12. +*/ + +static void add_quant_noise(struct AEXP *aexp, MODEL *model, int start, int end, float sigma_dB) +{ + int m; + float x_dB; + float noise_sam_dB; + float noise_sam_lin; + + x_dB = sqrt(3.0) * sigma_dB; + + for(m=start; m<=end; m++) { + noise_sam_dB = x_dB*(1.0 - 2.0*rand()/RAND_MAX); + //printf("%f\n", noise_sam_dB); + noise_sam_lin = pow(10.0, noise_sam_dB/20.0); + model->A[m] *= noise_sam_lin; + aexp->var += noise_sam_dB*noise_sam_dB; + aexp->var_n++; + } + +} + +/* + void print_sparse_pred_error() + + use to check pred error stats (e.g. of first 1kHz) in Octave: + + $ ./c2sim ../raw/hts1a.raw --ampexp > amppe.txt + + octave> load ../src/amppe.txt + octave> std(nonzeros(amppe(:,1:20))) + octave> hist(nonzeros(amppe(:,1:20)),20); + + */ + + +static void print_sparse_pred_error(struct AEXP *aexp, MODEL *model, float mag_thresh) +{ + int m, index; + float mag, error; + float sparse_pe[MAX_AMP]; + + mag = 0.0; + for(m=1; m<=model->L; m++) + mag += model->A[m]*model->A[m]; + mag = 10*log10(mag/model->L); + + if (mag > mag_thresh) { + for(m=0; mL; m++) { + assert(model->A[m] > 0.0); + error = PRED_COEFF*20.0*log10(aexp->A_prev[m]) - 20.0*log10(model->A[m]); + //error = 20.0*log10(model->A[m]) - mag; + + index = MAX_AMP*m*model->Wo/PI; + assert(index < MAX_AMP); + sparse_pe[index] = error; + } + + /* dump sparse amp vector */ + + for(m=0; mL; m++) + e += model->A[m]*model->A[m]; + edB = 10*log10(e); + + #define VER_E0 + + #ifdef VER_E0 + *enormdB = 10*log10(e/model->L); /* make high and low pitches have similar amps */ + #endif + + #ifdef VER_E1 + e = 0.0; + for(m=1; m<=model->L; m++) + e += 10*log10(model->A[m]*model->A[m]); + *enormdB = e; + #endif + + #ifdef VER_E2 + e = 0.0; + for(m=1; m<=model->L; m++) + e += 10*log10(model->A[m]*model->A[m]); + *enormdB = e/model->L; + #endif + //printf("%f\n", enormdB); + + return edB; +} + +static void print_sparse_amp_error(struct AEXP *aexp, MODEL *model, float edB_thresh) +{ + int m, index; + float edB, enormdB, error, dWo; + float sparse_pe[MAX_AMP]; + + edB = frame_energy(model, &enormdB); + //printf("%f\n", enormdB); + dWo = fabs((aexp->model_uq[2].Wo - aexp->model_uq[1].Wo)/aexp->model_uq[2].Wo); + + if ((edB > edB_thresh) && (dWo < 0.1)) { + for(m=0; mL; m++) { + assert(model->A[m] > 0.0); + error = 20.0*log10(model->A[m]) - enormdB; + + index = MAX_AMP*m*model->Wo/PI; + assert(index < MAX_AMP); + sparse_pe[index] = error; + } + + /* dump sparse amp vector */ + + for(m=0; mcb, &sparse_pe_in[vq->offset], &weights[vq->offset], vq->k, vq->m, &se); + printf("\n offset %d k %d m %d vq_ind %d j: ", vq->offset, vq->k, vq->m, vq_ind); + + non_zero = 0; + for(i=0, j=vq->offset; ik; i++,j++) { + if (sparse_pe_in[j] != 0.0) { + printf("%d ", j); + sparse_pe_in[j] -= vq->cb[vq->k * vq_ind + i]; + sparse_pe_out[j] += vq->cb[vq->k * vq_ind + i]; + non_zero++; + } + } + aexp->vq_var_n += non_zero; + return vq_ind; +} + + +static void sparse_vq_pred_error(struct AEXP *aexp, + MODEL *model +) +{ + int m, index; + float error, amp_dB, edB, enormdB; + float sparse_pe_in[MAX_AMP]; + float sparse_pe_out[MAX_AMP]; + float weights[MAX_AMP]; + + edB = frame_energy(model, &enormdB); + + for(m=0; mL; m++) { + assert(model->A[m] > 0.0); + error = PRED_COEFF*20.0*log10(aexp->A_prev[m]) - 20.0*log10(model->A[m]); + + index = MAX_AMP*m*model->Wo/PI; + assert(index < MAX_AMP); + sparse_pe_in[index] = error; + weights[index] = model->A[m]; + } + + /* vector quantise */ + + for(m=0; mvq1, weights, sparse_pe_in); + #else + for(m=aexp->vq->offset; mvq->offset+aexp->vq->k; m++) { + if (sparse_pe_in[m] != 0.0) { + float error = 8*(1.0 - 2.0*rand()/RAND_MAX); + aexp->vq_var += error*error; + aexp->vq_var_n++; + sparse_pe_out[m] = sparse_pe_in[m] + error; + } + } + #endif + + if (edB > -100.0) + for(m=0; mvq_var += pow(sparse_pe_out[m] - sparse_pe_in[m], 2.0); + } + + /* transform quantised amps back */ + + for(m=1; m<=model->L; m++) { + index = MAX_AMP*m*model->Wo/PI; + assert(index < MAX_AMP); + amp_dB = PRED_COEFF*20.0*log10(aexp->A_prev[m]) - sparse_pe_out[index]; + //printf("in: %f out: %f\n", sparse_pe_in[index], sparse_pe_out[index]); + //printf("amp_dB: %f A[m] (dB) %f\n", amp_dB, 20.0*log10(model->A[m])); + model->A[m] = pow(10.0, amp_dB/20.0); + } + //exit(0); +} + + +static void split_error(struct AEXP *aexp, struct codebook *vq, float sparse_pe_in[], int ind) +{ + int i, j; + + for(i=0, j=vq->offset; ik; i++,j++) { + if (sparse_pe_in[j] != 0.0) { + sparse_pe_in[j] -= vq->cb[vq->k * ind + i]; + } + } +} + + +static void sparse_vq_amp(struct AEXP *aexp, MODEL *model) +{ + int m, index; + float error, amp_dB, enormdB; + float sparse_pe_in[MAX_AMP]; + float sparse_pe_out[MAX_AMP]; + float weights[MAX_AMP]; + + frame_energy(model, &enormdB); + + aexp->mag[2] = enormdB; + + for(m=0; mL; m++) { + assert(model->A[m] > 0.0); + error = 20.0*log10(model->A[m]) - enormdB; + + index = MAX_AMP*m*model->Wo/PI; + assert(index < MAX_AMP); + sparse_pe_in[index] = error; + weights[index] = pow(model->A[m],0.8); + } + + /* vector quantise */ + + for(m=0; mindexes[0][2] = split_vq(sparse_pe_out, aexp, aexp->vq1, weights, sparse_pe_in); + + aexp->indexes[1][2] = split_vq(sparse_pe_out, aexp, aexp->vq2, weights, sparse_pe_in); + aexp->indexes[2][2] = split_vq(sparse_pe_out, aexp, aexp->vq3, weights, sparse_pe_in); + aexp->indexes[3][2] = split_vq(sparse_pe_out, aexp, aexp->vq4, weights, sparse_pe_in); + aexp->indexes[4][2] = split_vq(sparse_pe_out, aexp, aexp->vq5, weights, sparse_pe_in); + #endif + //#define MULTISTAGE + #ifdef MULTISTAGE + aexp->indexes[0][2] = split_vq(sparse_pe_out, aexp, aexp->vq1, weights, sparse_pe_in); + aexp->indexes[1][2] = split_vq(sparse_pe_out, aexp, aexp->vq2, weights, sparse_pe_in); + aexp->indexes[2][2] = split_vq(sparse_pe_out, aexp, aexp->vq3, weights, sparse_pe_in); + //aexp->indexes[3][2] = split_vq(sparse_pe_out, aexp, aexp->vq4, weights, sparse_pe_in); + #endif + + for(m=0; mvq_var += pow(sparse_pe_out[m] - sparse_pe_in[m], 2.0); + } + + /* transform quantised amps back */ + + for(m=1; m<=model->L; m++) { + index = MAX_AMP*m*model->Wo/PI; + assert(index < MAX_AMP); + amp_dB = sparse_pe_out[index] + enormdB; + model->A[m] = pow(10.0, amp_dB/20.0); + } + //exit(0); +} + + +static void update_snr_calc(struct AEXP *aexp, MODEL *m1, MODEL *m2) +{ + int m; + float signal, noise, signal_dB; + + assert(m1->L == m2->L); + + signal = 0.0; noise = 1E-32; + for(m=1; m<=m1->L; m++) { + signal += m1->A[m]*m1->A[m]; + noise += pow(m1->A[m] - m2->A[m], 2.0); + //printf("%f %f\n", before[m], model->phi[m]); + } + signal_dB = 10*log10(signal); + if (signal_dB > -100.0) { + aexp->snr += 10.0*log10(signal/noise); + aexp->snr_n++; + } +} + + +/* gain/shape vq search. Returns index of best gain. Gain is additive (as we use log quantisers) */ + +int gain_shape_vq_amp(float cb[], float vec[], float weights[], int d, int e, float *se, float *best_gain) +{ + float error; /* current error */ + int besti; /* best index so far */ + float best_error; /* best error so far */ + int i,j,m; + float diff, metric, best_metric, gain, sumAm, sumCb; + + besti = 0; + best_metric = best_error = 1E32; + for(j=0; jcb, &sparse_pe_in[vq->offset], &weights[vq->offset], vq->k, vq->m, &se, best_gain); + //printf("\n offset %d k %d m %d vq_ind %d gain: %4.2f j: ", vq->offset, vq->k, vq->m, vq_ind, *best_gain); + + non_zero = 0; + for(i=0, j=vq->offset; ik; i++,j++) { + if (sparse_pe_in[j] != 0.0) { + //printf("%d ", j); + sparse_pe_out[j] = vq->cb[vq->k * vq_ind + i] + *best_gain; + non_zero++; + } + } + aexp->vq_var_n += non_zero; +} + + +static void gain_shape_sparse_vq_amp(struct AEXP *aexp, MODEL *model) +{ + int m, index; + float amp_dB, best_gain; + float sparse_pe_in[MAX_AMP]; + float sparse_pe_out[MAX_AMP]; + float weights[MAX_AMP]; + + for(m=0; mL; m++) { + assert(model->A[m] > 0.0); + + index = MAX_AMP*m*model->Wo/PI; + assert(index < MAX_AMP); + sparse_pe_in[index] = 20.0*log10(model->A[m]); + weights[index] = model->A[m]; + } + + /* vector quantise */ + + for(m=0; mvq1, weights, sparse_pe_in, &best_gain); + gain_shape_split_vq(sparse_pe_out, aexp, aexp->vq2, weights, sparse_pe_in, &best_gain); + gain_shape_split_vq(sparse_pe_out, aexp, aexp->vq3, weights, sparse_pe_in, &best_gain); + gain_shape_split_vq(sparse_pe_out, aexp, aexp->vq4, weights, sparse_pe_in, &best_gain); + + for(m=0; mvq_var += pow(sparse_pe_out[m] - sparse_pe_in[m], 2.0); + } + + /* transform quantised amps back */ + + for(m=1; m<=model->L; m++) { + index = MAX_AMP*m*model->Wo/PI; + assert(index < MAX_AMP); + amp_dB = sparse_pe_out[index]; + model->A[m] = pow(10.0, amp_dB/20.0); + } + //exit(0); +} + + +static void interp_split_vq(float sparse_pe_out[], struct AEXP *aexp, struct codebook *vq, float sparse_pe_in[], int ind) +{ + int i, j; + float amp_dB; + + for(i=0, j=vq->offset; ik; i++,j++) { + if (sparse_pe_in[j] != 0.0) { + amp_dB = 0.5*(aexp->mag[0] + vq->cb[vq->k * aexp->indexes[ind][0] + i]); + amp_dB += 0.5*(aexp->mag[2] + vq->cb[vq->k * aexp->indexes[ind][2] + i]); + sparse_pe_out[j] = amp_dB; + } + } +} + + +static void vq_interp(struct AEXP *aexp, MODEL *model, int on) +{ + int i, j, m, index; + float amp_dB; + //struct codebook *vq = aexp->vq1; + float sparse_pe_in[MAX_AMP]; + float sparse_pe_out[MAX_AMP]; + + /* replace odd frames with interp */ + /* once we get an even input frame we can interpolate and output odd */ + /* using VQ to interpolate. This assumes some correlation in + adjacent VQ samples */ + + memcpy(&aexp->model[2], model, sizeof(MODEL)); + + /* once we get an even input frame we have enough information to + replace prev odd frame with interpolated version */ + + if (on && ((aexp->frames % 2) == 0)) { + + /* copy Wo, L, and phases */ + + memcpy(model, &aexp->model[1], sizeof(MODEL)); + //printf("mags: %4.2f %4.2f %4.2f Am: \n", aexp->mag[0], aexp->mag[1], aexp->mag[2]); + + /* now replace Am by interpolation, use similar design to VQ + to handle different bands */ + + for(m=1; m<=model->L; m++) { + assert(model->A[m] > 0.0); + + index = MAX_AMP*m*model->Wo/PI; + assert(index < MAX_AMP); + sparse_pe_in[index] = 20.0*log10(model->A[m]); + } + + /* this can be used for when just testing partial interpolation */ + + for(m=0; mvq1, sparse_pe_in, 0); + interp_split_vq(sparse_pe_out, aexp, aexp->vq2, sparse_pe_in, 1); + interp_split_vq(sparse_pe_out, aexp, aexp->vq3, sparse_pe_in, 2); + interp_split_vq(sparse_pe_out, aexp, aexp->vq4, sparse_pe_in, 3); + interp_split_vq(sparse_pe_out, aexp, aexp->vq5, sparse_pe_in, 4); + + for(m=1; m<=model->L; m++) { + index = MAX_AMP*m*model->Wo/PI; + assert(index < MAX_AMP); + amp_dB = sparse_pe_out[index]; + //printf(" %4.2f", 10.0*log10(model->A[m])); + model->A[m] = pow(10.0, amp_dB/20.0); + //printf(" %4.2f\n", 10.0*log10(model->A[m])); + } + + #ifdef INITIAL_VER + + for(m=1; m<=model->L; m++) { + index = MAX_AMP*m*model->Wo/PI; + assert(index < MAX_AMP); + + if (index < vq->k) { + amp_dB = 0.5*(aexp->mag[0] + vq->cb[vq->k * aexp->indexes[0] + index]); + amp_dB += 0.5*(aexp->mag[2] + vq->cb[vq->k * aexp->indexes[2] + index]); + //printf(" %4.2f", 10.0*log10(model->A[m])); + //amp_dB = 10; + model->A[m] = pow(10.0, amp_dB/20.0); + printf(" %4.2f\n", 10.0*log10(model->A[m])); + } + } + + #endif + } + else + memcpy(model, &aexp->model[1], sizeof(MODEL)); + + /* update memories */ + + for(i=0; i<2; i++) { + memcpy(&aexp->model[i], &aexp->model[i+1], sizeof(MODEL)); + for(j=0; j<5; j++) + aexp->indexes[j][i] = aexp->indexes[j][i+1]; + aexp->mag[i] = aexp->mag[i+1]; + } + +} + + +/* + This functions tests theory that some bands can be combined together + due to less frequency resolution at higher frequencies. This will + reduce the amount of information we need to encode. +*/ + +void smooth_samples(struct AEXP *aexp, MODEL *model, int mode) +{ + int m, i, j, index, step, nav, v, en; + float sparse_pe_in[MAX_AMP], av, amp_dB; + float sparse_pe_out[MAX_AMP]; + float smoothed[MAX_AMP], smoothed_out[MAX_AMP]; + float weights[MAX_AMP]; + float enormdB; + + frame_energy(model, &enormdB); + + for(m=0; mL; m++) { + assert(model->A[m] > 0.0); + + index = MAX_AMP*m*model->Wo/PI; + assert(index < MAX_AMP); + sparse_pe_out[index] = sparse_pe_in[index] = 20.0*log10(model->A[m]) - enormdB; + } + + /* now combine samples at high frequencies to reduce dimension */ + + step=4; + for(i=MAX_AMP/2,v=0; i (MAX_AMP-1)) + en = MAX_AMP-1; + for(j=i; jvq1, weights, smoothed); + for(i=0; i (MAX_AMP-1)) + en = MAX_AMP-1; + for(j=i; jL; m++) { + index = MAX_AMP*m*model->Wo/PI; + assert(index < MAX_AMP); + amp_dB = sparse_pe_out[index] + enormdB; + //printf("%d %4.2f %4.2f\n", m, 10.0*log10(model->A[m]), amp_dB); + model->A[m] = pow(10.0, amp_dB/20.0); + } + +} + +#define MAX_BINS 40 +static float bins[] = { + /*1000.0, 1200.0, 1400.0, 1600.0, 1800,*/ + 2000.0, 2400.0, 2800.0, + 3000.0, 3400.0, 3600.0, 4000.0}; + +void smooth_amp(struct AEXP *aexp, MODEL *model) { + int m, i; + int nbins; + int b; + float f; + float av[MAX_BINS]; + int nav[MAX_BINS]; + + nbins = sizeof(bins)/sizeof(float); + + /* clear all bins */ + + for(i=0; iL; m++) { + f = m*model->Wo*FS/TWO_PI; + if (f > bins[0]) { + + /* find bin */ + + for(i=0; i bins[i]) && (f <= bins[i+1])) + b = i; + assert(b < MAX_BINS); + + av[b] += model->A[m]*model->A[m]; + nav[b]++; + } + + } + + /* use averages to est amps */ + + for(m=1; m<=model->L; m++) { + f = m*model->Wo*FS/TWO_PI; + if (f > bins[0]) { + + /* find bin */ + + for(i=0; i bins[i]) && (f <= bins[i+1])) + b = i; + assert(b < MAX_BINS); + + /* add predicted phase error to this bin */ + + printf("L %d m %d f %4.f b %d\n", model->L, m, f, b); + + printf(" %d: %4.3f -> ", m, 20*log10(model->A[m])); + model->A[m] = sqrt(av[b]/nav[b]); + printf("%4.3f\n", 20*log10(model->A[m])); + } + } + printf("\n"); +} + +/*---------------------------------------------------------------------------* \ + + amp_experiment() + + Amplitude quantisation experiments. + +\*---------------------------------------------------------------------------*/ + +void amp_experiment(struct AEXP *aexp, MODEL *model, char *arg) { + int m,i; + + memcpy(&aexp->model_uq[2], model, sizeof(MODEL)); + + if (strcmp(arg, "qn") == 0) { + add_quant_noise(aexp, model, 1, model->L, 1); + update_snr_calc(aexp, &aexp->model_uq[2], model); + } + + /* print training samples that can be > train.txt for training VQ */ + + if (strcmp(arg, "train") == 0) + print_sparse_amp_error(aexp, model, 00.0); + + /* VQ of amplitudes, no interpolation (ie 10ms rate) */ + + if (strcmp(arg, "vq") == 0) { + sparse_vq_amp(aexp, model); + vq_interp(aexp, model, 0); + update_snr_calc(aexp, &aexp->model_uq[1], model); + } + + /* VQ of amplitudes, interpolation (ie 20ms rate) */ + + if (strcmp(arg, "vqi") == 0) { + sparse_vq_amp(aexp, model); + vq_interp(aexp, model, 1); + update_snr_calc(aexp, &aexp->model_uq[1], model); + } + + /* gain/shape VQ of amplitudes, 10ms rate (doesn't work that well) */ + + if (strcmp(arg, "gsvq") == 0) { + gain_shape_sparse_vq_amp(aexp, model); + vq_interp(aexp, model, 0); + update_snr_calc(aexp, &aexp->model_uq[1], model); + } + + if (strcmp(arg, "smooth") == 0) { + smooth_samples(aexp, model, 0); + update_snr_calc(aexp, &aexp->model_uq[2], model); + } + + if (strcmp(arg, "smoothtrain") == 0) { + smooth_samples(aexp, model, 1); + //update_snr_calc(aexp, &aexp->model_uq[2], model); + } + + if (strcmp(arg, "smoothvq") == 0) { + smooth_samples(aexp, model, 2); + update_snr_calc(aexp, &aexp->model_uq[2], model); + } + + if (strcmp(arg, "smoothamp") == 0) { + smooth_amp(aexp, model); + update_snr_calc(aexp, &aexp->model_uq[2], model); + } + + /* update states */ + + for(m=1; m<=model->L; m++) + aexp->A_prev[m] = model->A[m]; + aexp->frames++; + for(i=0; i<3; i++) + aexp->model_uq[i] = aexp->model_uq[i+1]; +} + diff --git a/codec2/tags/0.4.1/src/ampexp.h b/codec2/tags/0.4.1/src/ampexp.h new file mode 100644 index 00000000..313abb15 --- /dev/null +++ b/codec2/tags/0.4.1/src/ampexp.h @@ -0,0 +1,39 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: ampexp.h + AUTHOR......: David Rowe + DATE CREATED: & August 2012 + + Functions for experimenting with amplitude quantisation. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2012 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 . +*/ + +#ifndef __AMPEX__ +#define __AMPEXP__ + +#include "defines.h" + +struct AEXP; + +struct AEXP *amp_experiment_create(); +void amp_experiment_destroy(struct AEXP *aexp); +void amp_experiment(struct AEXP *aexp, MODEL *model, char *arg); + +#endif diff --git a/codec2/tags/0.4.1/src/bpf.h b/codec2/tags/0.4.1/src/bpf.h new file mode 100644 index 00000000..0b0a6e27 --- /dev/null +++ b/codec2/tags/0.4.1/src/bpf.h @@ -0,0 +1,106 @@ +#define BPF_N 101 + +float bpf[]={ + 0.002174, + 0.003245, + 0.002147, + 0.001866, + 0.002764, + 0.000567, + -0.001641, + -0.000565, + -0.002415, + -0.005837, + -0.003620, + -0.002828, + -0.006268, + -0.002787, + 0.001963, + -0.001234, + 0.001446, + 0.009200, + 0.005331, + 0.003521, + 0.011821, + 0.006951, + -0.002015, + 0.005137, + 0.001828, + -0.013390, + -0.007058, + -0.003273, + -0.020458, + -0.014321, + 0.001751, + -0.012891, + -0.009730, + 0.018993, + 0.008544, + 0.000534, + 0.035755, + 0.029074, + -0.001192, + 0.030852, + 0.030983, + -0.029834, + -0.009550, + 0.011945, + -0.081971, + -0.082875, + 0.000423, + -0.133526, + -0.211778, + 0.182628, + 0.514906, + 0.182628, + -0.211778, + -0.133526, + 0.000423, + -0.082875, + -0.081971, + 0.011945, + -0.009550, + -0.029834, + 0.030983, + 0.030852, + -0.001192, + 0.029074, + 0.035755, + 0.000534, + 0.008544, + 0.018993, + -0.009730, + -0.012891, + 0.001751, + -0.014321, + -0.020458, + -0.003273, + -0.007058, + -0.013390, + 0.001828, + 0.005137, + -0.002015, + 0.006951, + 0.011821, + 0.003521, + 0.005331, + 0.009200, + 0.001446, + -0.001234, + 0.001963, + -0.002787, + -0.006268, + -0.002828, + -0.003620, + -0.005837, + -0.002415, + -0.000565, + -0.001641, + 0.000567, + 0.002764, + 0.001866, + 0.002147, + 0.003245, + 0.002174 +}; + diff --git a/codec2/tags/0.4.1/src/bpfb.h b/codec2/tags/0.4.1/src/bpfb.h new file mode 100644 index 00000000..73b1a691 --- /dev/null +++ b/codec2/tags/0.4.1/src/bpfb.h @@ -0,0 +1,105 @@ +#define BPFB_N 101 + +float bpfb[]={ + 0.003795, + 0.006827, + 0.002261, + 0.002523, + 0.005758, + -0.000264, + -0.000674, + 0.003113, + -0.004144, + -0.004923, + 0.000043, + -0.008017, + -0.008711, + -0.001802, + -0.010210, + -0.010428, + -0.000899, + -0.009413, + -0.009072, + 0.003469, + -0.005335, + -0.004828, + 0.010724, + 0.000941, + 0.000708, + 0.018957, + 0.007084, + 0.004825, + 0.025418, + 0.010147, + 0.004452, + 0.027434, + 0.007550, + -0.002861, + 0.023483, + -0.001944, + -0.018138, + 0.014122, + -0.017583, + -0.040768, + 0.002598, + -0.036604, + -0.069541, + -0.004273, + -0.054876, + -0.107289, + 0.010068, + -0.068052, + -0.200119, + 0.207287, + 0.597150, + 0.207287, + -0.200119, + -0.068052, + 0.010068, + -0.107289, + -0.054876, + -0.004273, + -0.069541, + -0.036604, + 0.002598, + -0.040768, + -0.017583, + 0.014122, + -0.018138, + -0.001944, + 0.023483, + -0.002861, + 0.007550, + 0.027434, + 0.004452, + 0.010147, + 0.025418, + 0.004825, + 0.007084, + 0.018957, + 0.000708, + 0.000941, + 0.010724, + -0.004828, + -0.005335, + 0.003469, + -0.009072, + -0.009413, + -0.000899, + -0.010428, + -0.010210, + -0.001802, + -0.008711, + -0.008017, + 0.000043, + -0.004923, + -0.004144, + 0.003113, + -0.000674, + -0.000264, + 0.005758, + 0.002523, + 0.002261, + 0.006827, + 0.003795 +}; \ No newline at end of file diff --git a/codec2/tags/0.4.1/src/c2dec.c b/codec2/tags/0.4.1/src/c2dec.c new file mode 100644 index 00000000..a6d9348c --- /dev/null +++ b/codec2/tags/0.4.1/src/c2dec.c @@ -0,0 +1,327 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: c2dec.c + AUTHOR......: David Rowe + DATE CREATED: 23/8/2010 + + Decodes a file of bits to a file of raw speech samples using codec2. + +\*---------------------------------------------------------------------------*/ + +/* + 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 . +*/ + +#include "codec2.h" +#include "dump.h" + +#include +#include +#include +#include +#include +#include + +#define NONE 0 /* no bit errors */ +#define UNIFORM 1 /* random bit errors */ +#define TWO_STATE 2 /* Two state error model */ +#define UNIFORM_RANGE 3 /* random bit errors over a certain range */ + +void print_help(const struct option *long_options, int num_opts, char* argv[]); + +int main(int argc, char *argv[]) +{ + int mode; + void *codec2; + FILE *fin; + FILE *fout; + FILE *fber = NULL; + short *buf; + unsigned char *bits; + float *softdec_bits; + int nsam, nbit, nbyte, i, byte, frames, 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; + unsigned char mask; + int natural, dump, softdec, bit, ret; + + char* opt_string = "h:"; + struct option long_options[] = { + { "ber", required_argument, NULL, 0 }, + { "startbit", required_argument, NULL, 0 }, + { "endbit", required_argument, NULL, 0 }, + { "berfile", required_argument, NULL, 0 }, + { "natural", no_argument, &natural, 1 }, + { "softdec", no_argument, &softdec, 1 }, + #ifdef DUMP + { "dump", required_argument, &dump, 1 }, + #endif + { "help", no_argument, NULL, 'h' }, + { NULL, no_argument, NULL, 0 } + }; + int num_opts=sizeof(long_options)/sizeof(struct option); + + if (argc < 4) + print_help(long_options, num_opts, argv); + + if (strcmp(argv[1],"3200") == 0) + mode = CODEC2_MODE_3200; + else if (strcmp(argv[1],"2400") == 0) + mode = CODEC2_MODE_2400; + else if (strcmp(argv[1],"1600") == 0) + mode = CODEC2_MODE_1600; + else if (strcmp(argv[1],"1400") == 0) + mode = CODEC2_MODE_1400; + else if (strcmp(argv[1],"1300") == 0) + mode = CODEC2_MODE_1300; + else if (strcmp(argv[1],"1200") == 0) + mode = CODEC2_MODE_1200; + else if (strcmp(argv[1],"700") == 0) + mode = CODEC2_MODE_700; + else if (strcmp(argv[1],"700B") == 0) + mode = CODEC2_MODE_700B; + else { + fprintf(stderr, "Error in mode: %s. Must be 3200, 2400, 1600, 1400, 1300, 1200, 700 or 700B\n", argv[1]); + exit(1); + } + bit_rate = atoi(argv[1]); + + if (strcmp(argv[2], "-") == 0) fin = stdin; + else if ( (fin = fopen(argv[2],"rb")) == NULL ) { + fprintf(stderr, "Error opening input bit file: %s: %s.\n", + argv[2], strerror(errno)); + exit(1); + } + + if (strcmp(argv[3], "-") == 0) fout = stdout; + else if ( (fout = fopen(argv[3],"wb")) == NULL ) { + fprintf(stderr, "Error opening output speech file: %s: %s.\n", + argv[3], strerror(errno)); + exit(1); + } + + error_mode = NONE; + ber = 0.0; + burst_length = burst_period = 0.0; + burst_timer = 0.0; + dump = natural = softdec = 0; + + codec2 = codec2_create(mode); + nsam = codec2_samples_per_frame(codec2); + nbit = codec2_bits_per_frame(codec2); + buf = (short*)malloc(nsam*sizeof(short)); + nbyte = (nbit + 7) / 8; + bits = (unsigned char*)malloc(nbyte*sizeof(char)); + softdec_bits = (float*)malloc(nbit*sizeof(float)); + frames = bit_errors = bits_proc = 0; + nstart_bit = 0; + nend_bit = nbit-1; + + while(1) { + int option_index = 0; + int opt = getopt_long(argc, argv, opt_string, + long_options, &option_index); + if (opt == -1) + break; + + switch (opt) { + case 0: + if(strcmp(long_options[option_index].name, "ber") == 0) { + ber = atof(optarg); + error_mode = UNIFORM; + } else if(strcmp(long_options[option_index].name, "startbit") == 0) { + nstart_bit = atoi(optarg); + } else if(strcmp(long_options[option_index].name, "endbit") == 0) { + nend_bit = atoi(optarg); + } else if(strcmp(long_options[option_index].name, "berfile") == 0) { + if ((fber = fopen(optarg,"wt")) == NULL) { + fprintf(stderr, "Error opening BER file: %s %s.\n", + optarg, strerror(errno)); + exit(1); + } + + } + #ifdef DUMP + else if(strcmp(long_options[option_index].name, "dump") == 0) { + if (dump) + dump_on(optarg); + } + #endif + break; + + case 'h': + print_help(long_options, num_opts, argv); + break; + + default: + /* This will never be reached */ + break; + } + } + assert(nend_bit <= nbit); + codec2_set_natural_or_gray(codec2, !natural); + //printf("%d %d\n", nstart_bit, nend_bit); + + //fprintf(stderr, "softdec: %d natural: %d\n", softdec, natural); + if (softdec) + ret = (fread(softdec_bits, sizeof(float), nbit, fin) == (size_t)nbit); + else + ret = (fread(bits, sizeof(char), nbyte, fin) == (size_t)nbyte); + + 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)) { + assert(softdec == 0); + for(i=nstart_bit; i (burst_period - burst_length)) + next_state = 1; + break; + + case 1: + + /* burst error state - 50% bit error rate */ + + for(i=nstart_bit; i burst_period) { + burst_timer = 0.0; + next_state = 0; + } + break; + + } + + state = next_state; + } + + if (fber != NULL) { + if (fread(&ber_est, sizeof(float), 1, fber) != 1) { + fprintf(stderr, "ran out of BER estimates!\n"); + exit(1); + } + //fprintf(stderr, "ber_est: %f\n", ber_est); + } + else + ber_est = 0.0; + + if (softdec) { + /* pack bits, MSB received first */ + + bit = 7; byte = 0; + memset(bits, 0, nbyte); + for(i=0; i. +*/ + +#include "codec2.h" +#include "sine.h" +#include "dump.h" + +#include +#include +#include +#include + +int main(int argc, char *argv[]) +{ + struct CODEC2 *codec2; + FILE *fin; + FILE *fout; + short *buf; + unsigned char *bits; + int nsam, nbit, i, r; + + for(i=0; i<10; i++) { + r = codec2_rand(); + printf("[%d] r = %d\n", i, r); + } + + if (argc != 3) { + printf("usage: %s InputRawSpeechFile OutputRawSpeechFile\n", argv[0]); + exit(1); + } + + if ( (fin = fopen(argv[1],"rb")) == NULL ) { + fprintf(stderr, "Error opening input speech file: %s: %s.\n", + argv[1], strerror(errno)); + exit(1); + } + + if ( (fout = fopen(argv[2],"wb")) == NULL ) { + fprintf(stderr, "Error opening output speech file: %s: %s.\n", + argv[2], strerror(errno)); + exit(1); + } + + #ifdef DUMP + dump_on("c2demo"); + #endif + + /* Note only one set of Codec 2 states is required for an encoder + and decoder pair. */ + + codec2 = codec2_create(CODEC2_MODE_1300); + nsam = codec2_samples_per_frame(codec2); + buf = (short*)malloc(nsam*sizeof(short)); + nbit = codec2_bits_per_frame(codec2); + bits = (unsigned char*)malloc(nbit*sizeof(char)); + + while(fread(buf, sizeof(short), nsam, fin) == (size_t)nsam) { + codec2_encode(codec2, bits, buf); + codec2_decode(codec2, buf, bits); + fwrite(buf, sizeof(short), nsam, fout); + } + + free(buf); + free(bits); + codec2_destroy(codec2); + + fclose(fin); + fclose(fout); + + return 0; +} diff --git a/codec2/tags/0.4.1/src/c2enc.c b/codec2/tags/0.4.1/src/c2enc.c new file mode 100644 index 00000000..2037dd72 --- /dev/null +++ b/codec2/tags/0.4.1/src/c2enc.c @@ -0,0 +1,149 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: c2enc.c + AUTHOR......: David Rowe + DATE CREATED: 23/8/2010 + + Encodes a file of raw speech samples using codec2 and outputs a file + of bits. + +\*---------------------------------------------------------------------------*/ + +/* + 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 . +*/ + +#include "codec2.h" + +#include +#include +#include +#include + +int main(int argc, char *argv[]) +{ + int mode; + void *codec2; + FILE *fin; + FILE *fout; + short *buf; + unsigned char *bits; + int nsam, nbit, nbyte, gray, softdec; + float *unpacked_bits; + int bit, byte,i; + + if (argc < 4) { + printf("usage: c2enc 3200|2400|1600|1400|1300|1200|700|700B InputRawspeechFile OutputBitFile [--natural] [--softdec]\n"); + printf("e.g c2enc 1400 ../raw/hts1a.raw hts1a.c2\n"); + printf("e.g c2enc 1300 ../raw/hts1a.raw hts1a.c2 --natural\n"); + exit(1); + } + + if (strcmp(argv[1],"3200") == 0) + mode = CODEC2_MODE_3200; + else if (strcmp(argv[1],"2400") == 0) + mode = CODEC2_MODE_2400; + else if (strcmp(argv[1],"1600") == 0) + mode = CODEC2_MODE_1600; + else if (strcmp(argv[1],"1400") == 0) + mode = CODEC2_MODE_1400; + else if (strcmp(argv[1],"1300") == 0) + mode = CODEC2_MODE_1300; + else if (strcmp(argv[1],"1200") == 0) + mode = CODEC2_MODE_1200; + else if (strcmp(argv[1],"700") == 0) + mode = CODEC2_MODE_700; + else if (strcmp(argv[1],"700B") == 0) + mode = CODEC2_MODE_700B; + else { + fprintf(stderr, "Error in mode: %s. Must be 3200, 2400, 1600, 1400, 1300, 1200, 700 or 700B\n", argv[1]); + exit(1); + } + + if (strcmp(argv[2], "-") == 0) fin = stdin; + else if ( (fin = fopen(argv[2],"rb")) == NULL ) { + fprintf(stderr, "Error opening input speech file: %s: %s.\n", + argv[2], strerror(errno)); + exit(1); + } + + if (strcmp(argv[3], "-") == 0) fout = stdout; + else if ( (fout = fopen(argv[3],"wb")) == NULL ) { + fprintf(stderr, "Error opening output compressed bit file: %s: %s.\n", + argv[3], strerror(errno)); + exit(1); + } + + codec2 = codec2_create(mode); + nsam = codec2_samples_per_frame(codec2); + nbit = codec2_bits_per_frame(codec2); + buf = (short*)malloc(nsam*sizeof(short)); + nbyte = (nbit + 7) / 8; + + bits = (unsigned char*)malloc(nbyte*sizeof(char)); + unpacked_bits = (float*)malloc(nbit*sizeof(float)); + + gray = 1; + softdec = 0; + for (i=4; i> bit) & 0x1); + bit--; + if (bit < 0) { + bit = 7; + byte++; + } + } + fwrite(unpacked_bits, sizeof(float), nbit, fout); + } + else + fwrite(bits, sizeof(char), nbyte, fout); + + // if this is in a pipeline, we probably don't want the usual + // buffering to occur + + if (fout == stdout) fflush(stdout); + if (fin == stdin) fflush(stdin); + } + + codec2_destroy(codec2); + + free(buf); + free(bits); + free(unpacked_bits); + fclose(fin); + fclose(fout); + + return 0; +} diff --git a/codec2/tags/0.4.1/src/c2sim.c b/codec2/tags/0.4.1/src/c2sim.c new file mode 100644 index 00000000..6cfeedc4 --- /dev/null +++ b/codec2/tags/0.4.1/src/c2sim.c @@ -0,0 +1,908 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: c2sim.c + AUTHOR......: David Rowe + DATE CREATED: 20/8/2010 + + Codec2 simulation. Combines encoder and decoder and allows + switching in and out various algorithms and quantisation steps. Used + for algorithm development. + +\*---------------------------------------------------------------------------*/ + +/* + 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 . +*/ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "defines.h" +#include "sine.h" +#include "nlp.h" +#include "dump.h" +#include "lpc.h" +#include "lsp.h" +#include "quantise.h" +#include "phase.h" +#include "postfilter.h" +#include "interp.h" +#include "ampexp.h" +#include "phaseexp.h" +#include "bpf.h" +#include "bpfb.h" + +void synth_one_frame(kiss_fft_cfg fft_inv_cfg, short buf[], MODEL *model, float Sn_[], float Pn[], int prede, float *de_mem, float gain); +void print_help(const struct option *long_options, int num_opts, char* argv[]); + + +/*---------------------------------------------------------------------------*\ + + MAIN + +\*---------------------------------------------------------------------------*/ + +int main(int argc, char *argv[]) +{ + FILE *fout = NULL; /* output speech file */ + FILE *fin; /* input speech file */ + short buf[N]; /* input/output buffer */ + float buf_float[N]; + float buf_float_bpf[N]; + float Sn[M]; /* float input speech samples */ + float Sn_pre[N]; /* pre-emphasised input speech samples */ + COMP Sw[FFT_ENC]; /* DFT of Sn[] */ + kiss_fft_cfg fft_fwd_cfg; + kiss_fft_cfg fft_inv_cfg; + float w[M]; /* time domain hamming window */ + COMP W[FFT_ENC]; /* DFT of w[] */ + MODEL model; + float Pn[2*N]; /* trapezoidal synthesis window */ + float Sn_[2*N]; /* synthesised speech */ + int i,m; /* loop variable */ + int frames; + float prev_Wo, prev__Wo, prev_uq_Wo; + float pitch; + char out_file[MAX_STR]; + char ampexp_arg[MAX_STR]; + char phaseexp_arg[MAX_STR]; + float snr; + float sum_snr; + int orderi; + int lpc_model = 0, order = LPC_ORD; + int lsp = 0, lspd = 0, lspvq = 0; + int lspres = 0; + int lspjvm = 0, lspjnd = 0, lspmel = 0, lspmelvq = 0; + #ifdef __EXPERIMENTAL__ + int lspanssi = 0, + #endif + int prede = 0; + float pre_mem = 0.0, de_mem = 0.0; + float ak[order]; + COMP Sw_[FFT_ENC]; + COMP Ew[FFT_ENC]; + + int phase0 = 0; + float ex_phase[MAX_AMP+1]; + + int postfilt; + float bg_est = 0.0; + + int hand_voicing = 0, phaseexp = 0, ampexp = 0, hi = 0, simlpcpf = 0, lspmelread = 0; + int lpcpf = 0; + FILE *fvoicing = 0; + FILE *flspmel = 0; + + MODEL prev_model; + int dec; + int decimate = 1; + float lsps[order]; + float e, prev_e; + int lsp_indexes[order]; + float lsps_[order]; + float Woe_[2]; + + float lsps_dec[4][LPC_ORD], e_dec[4], weight, weight_inc, ak_dec[4][LPC_ORD]; + MODEL model_dec[4], prev_model_dec; + float prev_lsps_dec[order], prev_e_dec; + + void *nlp_states; + float hpf_states[2]; + int scalar_quant_Wo_e = 0; + int scalar_quant_Wo_e_low = 0; + int vector_quant_Wo_e = 0; + int dump_pitch_e = 0; + FILE *fjvm = NULL; + #ifdef DUMP + int dump; + #endif + struct PEXP *pexp = NULL; + struct AEXP *aexp = NULL; + float gain = 1.0; + int bpf_en = 0; + int bpfb_en = 0; + float bpf_buf[BPF_N+N]; + float lspmelvq_mse = 0.0; + int amread; + FILE *fam; + + char* opt_string = "ho:"; + struct option long_options[] = { + { "lpc", required_argument, &lpc_model, 1 }, + { "lspjnd", no_argument, &lspjnd, 1 }, + { "lspmel", no_argument, &lspmel, 1 }, + { "lspmelread", required_argument, &lspmelread, 1 }, + { "lspmelvq", no_argument, &lspmelvq, 1 }, + { "lsp", no_argument, &lsp, 1 }, + { "lspd", no_argument, &lspd, 1 }, + { "lspvq", no_argument, &lspvq, 1 }, + { "lspres", no_argument, &lspres, 1 }, + { "lspjvm", no_argument, &lspjvm, 1 }, + #ifdef __EXPERIMENTAL__ + { "lspanssi", no_argument, &lspanssi, 1 }, + #endif + { "phase0", no_argument, &phase0, 1 }, + { "phaseexp", required_argument, &phaseexp, 1 }, + { "ampexp", required_argument, &exp, 1 }, + { "postfilter", no_argument, &postfilt, 1 }, + { "hand_voicing", required_argument, &hand_voicing, 1 }, + { "dec", required_argument, &dec, 1 }, + { "hi", no_argument, &hi, 1 }, + { "simlpcpf", no_argument, &simlpcpf, 1 }, + { "lpcpf", no_argument, &lpcpf, 1 }, + { "prede", no_argument, &prede, 1 }, + { "dump_pitch_e", required_argument, &dump_pitch_e, 1 }, + { "sq_pitch_e", no_argument, &scalar_quant_Wo_e, 1 }, + { "sq_pitch_e_low", no_argument, &scalar_quant_Wo_e_low, 1 }, + { "vq_pitch_e", no_argument, &vector_quant_Wo_e, 1 }, + { "rate", required_argument, NULL, 0 }, + { "gain", required_argument, NULL, 0 }, + { "bpf", no_argument, &bpf_en, 1 }, + { "bpfb", no_argument, &bpfb_en, 1 }, + { "amread", required_argument, &amread, 1 }, + #ifdef DUMP + { "dump", required_argument, &dump, 1 }, + #endif + { "help", no_argument, NULL, 'h' }, + { NULL, no_argument, NULL, 0 } + }; + int num_opts=sizeof(long_options)/sizeof(struct option); + COMP Aw[FFT_ENC]; + + for(i=0; i order)) { + fprintf(stderr, "Error in LPC order (4 to %d): %s\n", order, optarg); + exit(1); + } + order = orderi; + #ifdef DUMP + } else if(strcmp(long_options[option_index].name, "dump") == 0) { + if (dump) + dump_on(optarg); + #endif + } else if(strcmp(long_options[option_index].name, "lsp") == 0 + || strcmp(long_options[option_index].name, "lspd") == 0 + || strcmp(long_options[option_index].name, "lspvq") == 0) { + assert(order == LPC_ORD); + } else if(strcmp(long_options[option_index].name, "dec") == 0) { + + decimate = atoi(optarg); + if ((decimate != 2) && (decimate != 3) && (decimate != 4)) { + fprintf(stderr, "Error in --dec, must be 2, 3, or 4\n"); + exit(1); + } + + if (!phase0) { + printf("needs --phase0 to resample phase when using --dec\n"); + exit(1); + } + if (!lpc_model) { + printf("needs --lpc [order] to resample amplitudes when using --dec\n"); + exit(1); + } + + } else if(strcmp(long_options[option_index].name, "hand_voicing") == 0) { + if ((fvoicing = fopen(optarg,"rt")) == NULL) { + fprintf(stderr, "Error opening voicing file: %s: %s.\n", + optarg, strerror(errno)); + exit(1); + } + } else if(strcmp(long_options[option_index].name, "lspmelread") == 0) { + if ((flspmel = fopen(optarg,"rb")) == NULL) { + fprintf(stderr, "Error opening float lspmel file: %s: %s.\n", + optarg, strerror(errno)); + exit(1); + } + } else if(strcmp(long_options[option_index].name, "amread") == 0) { + if ((fam = fopen(optarg,"rb")) == NULL) { + fprintf(stderr, "Error opening float Am file: %s: %s.\n", + optarg, strerror(errno)); + exit(1); + } + } else if(strcmp(long_options[option_index].name, "dump_pitch_e") == 0) { + if ((fjvm = fopen(optarg,"wt")) == NULL) { + fprintf(stderr, "Error opening pitch & energy dump file: %s: %s.\n", + optarg, strerror(errno)); + exit(1); + } + } else if(strcmp(long_options[option_index].name, "phaseexp") == 0) { + strcpy(phaseexp_arg, optarg); + } else if(strcmp(long_options[option_index].name, "ampexp") == 0) { + strcpy(ampexp_arg, optarg); + } else if(strcmp(long_options[option_index].name, "gain") == 0) { + gain = atof(optarg); + } else if(strcmp(long_options[option_index].name, "rate") == 0) { + if(strcmp(optarg,"3200") == 0) { + lpc_model = 1; + scalar_quant_Wo_e = 1; + lspd = 1; + phase0 = 1; + postfilt = 1; + decimate = 1; + lpcpf = 1; + } else if(strcmp(optarg,"2400") == 0) { + lpc_model = 1; + vector_quant_Wo_e = 1; + lsp = 1; + phase0 = 1; + postfilt = 1; + decimate = 2; + lpcpf = 1; + } else if(strcmp(optarg,"1400") == 0) { + lpc_model = 1; + vector_quant_Wo_e = 1; + lsp = 1; + phase0 = 1; + postfilt = 1; + decimate = 4; + lpcpf = 1; + } else if(strcmp(optarg,"1300") == 0) { + lpc_model = 1; + scalar_quant_Wo_e = 1; + lsp = 1; + phase0 = 1; + postfilt = 1; + decimate = 4; + lpcpf = 1; + } else if(strcmp(optarg,"1200") == 0) { + lpc_model = 1; + scalar_quant_Wo_e = 1; + lspjvm = 1; + phase0 = 1; + postfilt = 1; + decimate = 4; + lpcpf = 1; + } else { + fprintf(stderr, "Error: invalid output rate (3200|2400|1400|1200) %s\n", optarg); + exit(1); + } + } + break; + + case 'h': + print_help(long_options, num_opts, argv); + break; + + case 'o': + if (strcmp(optarg, "-") == 0) fout = stdout; + else if ((fout = fopen(optarg,"wb")) == NULL) { + fprintf(stderr, "Error opening output speech file: %s: %s.\n", + optarg, strerror(errno)); + exit(1); + } + strcpy(out_file,optarg); + break; + + default: + /* This will never be reached */ + break; + } + } + + /* Input file */ + + if (strcmp(argv[optind], "-") == 0) fin = stdin; + else if ((fin = fopen(argv[optind],"rb")) == NULL) { + fprintf(stderr, "Error opening input speech file: %s: %s.\n", + argv[optind], strerror(errno)); + exit(1); + } + + ex_phase[0] = 0; + Woe_[0] = Woe_[1] = 1.0; + + /* + printf("lspd: %d lspdt: %d lspdt_mode: %d phase0: %d postfilt: %d " + "decimate: %d dt: %d\n",lspd,lspdt,lspdt_mode,phase0,postfilt, + decimate,dt); + */ + + /* Initialise ------------------------------------------------------------*/ + + fft_fwd_cfg = kiss_fft_alloc(FFT_ENC, 0, NULL, NULL); /* fwd FFT,used in several places */ + fft_inv_cfg = kiss_fft_alloc(FFT_DEC, 1, NULL, NULL); /* inverse FFT, used just for synth */ + make_analysis_window(fft_fwd_cfg, w, W); + make_synthesis_window(Pn); + quantise_init(); + if (phaseexp) + pexp = phase_experiment_create(); + if (ampexp) + aexp = amp_experiment_create(); + + if (bpfb_en) + bpf_en = 1; + if (bpf_en) { + for(i=0; i 32767.0) + buf[i] = 32767; + else if (Sn_[i] < -32767.0) + buf[i] = -32767; + else + buf[i] = Sn_[i]; + } + +} + +void print_help(const struct option* long_options, int num_opts, char* argv[]) +{ + int i; + char *option_parameters; + + fprintf(stderr, "\nCodec2 - low bit rate speech codec - Simulation Program\n" + "\thttp://rowetel.com/codec2.html\n\n" + "usage: %s [OPTIONS] \n\n" + "Options:\n" + "\t-o \n", argv[0]); + for(i=0; i. +*/ + +#include +#include +#include +#include +#include + +#include "defines.h" +#include "sine.h" +#include "nlp.h" +#include "dump.h" +#include "lpc.h" +#include "quantise.h" +#include "phase.h" +#include "interp.h" +#include "postfilter.h" +#include "codec2.h" +#include "lsp.h" +#include "codec2_internal.h" +#include "machdep.h" +#include "bpf.h" +#include "bpfb.h" + +/*---------------------------------------------------------------------------*\ + + FUNCTION HEADERS + +\*---------------------------------------------------------------------------*/ + +void analyse_one_frame(struct CODEC2 *c2, MODEL *model, short speech[]); +void synthesise_one_frame(struct CODEC2 *c2, short speech[], MODEL *model, + COMP Aw[]); +void codec2_encode_3200(struct CODEC2 *c2, unsigned char * bits, short speech[]); +void codec2_decode_3200(struct CODEC2 *c2, short speech[], const unsigned char * bits); +void codec2_encode_2400(struct CODEC2 *c2, unsigned char * bits, short speech[]); +void codec2_decode_2400(struct CODEC2 *c2, short speech[], const unsigned char * bits); +void codec2_encode_1600(struct CODEC2 *c2, unsigned char * bits, short speech[]); +void codec2_decode_1600(struct CODEC2 *c2, short speech[], const unsigned char * bits); +void codec2_encode_1400(struct CODEC2 *c2, unsigned char * bits, short speech[]); +void codec2_decode_1400(struct CODEC2 *c2, short speech[], const unsigned char * bits); +void codec2_encode_1300(struct CODEC2 *c2, unsigned char * bits, short speech[]); +void codec2_decode_1300(struct CODEC2 *c2, short speech[], const unsigned char * bits, float ber_est); +void codec2_encode_1200(struct CODEC2 *c2, unsigned char * bits, short speech[]); +void codec2_decode_1200(struct CODEC2 *c2, short speech[], const unsigned char * bits); +void codec2_encode_700(struct CODEC2 *c2, unsigned char * bits, short speech[]); +void codec2_decode_700(struct CODEC2 *c2, short speech[], const unsigned char * bits); +void codec2_encode_700b(struct CODEC2 *c2, unsigned char * bits, short speech[]); +void codec2_decode_700b(struct CODEC2 *c2, short speech[], const unsigned char * bits); +static void ear_protection(float in_out[], int n); + +/*---------------------------------------------------------------------------*\ + + FUNCTIONS + +\*---------------------------------------------------------------------------*/ + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: codec2_create + AUTHOR......: David Rowe + DATE CREATED: 21/8/2010 + + Create and initialise an instance of the codec. Returns a pointer + to the codec states or NULL on failure. One set of states is + sufficient for a full duuplex codec (i.e. an encoder and decoder). + You don't need separate states for encoders and decoders. See + c2enc.c and c2dec.c for examples. + +\*---------------------------------------------------------------------------*/ + +struct CODEC2 * codec2_create(int mode) +{ + struct CODEC2 *c2; + int i,l; + + c2 = (struct CODEC2*)malloc(sizeof(struct CODEC2)); + if (c2 == NULL) + return NULL; + + assert( + (mode == CODEC2_MODE_3200) || + (mode == CODEC2_MODE_2400) || + (mode == CODEC2_MODE_1600) || + (mode == CODEC2_MODE_1400) || + (mode == CODEC2_MODE_1300) || + (mode == CODEC2_MODE_1200) || + (mode == CODEC2_MODE_700) || + (mode == CODEC2_MODE_700B) + ); + c2->mode = mode; + for(i=0; iSn[i] = 1.0; + c2->hpf_states[0] = c2->hpf_states[1] = 0.0; + for(i=0; i<2*N; i++) + c2->Sn_[i] = 0; + c2->fft_fwd_cfg = kiss_fft_alloc(FFT_ENC, 0, NULL, NULL); + make_analysis_window(c2->fft_fwd_cfg, c2->w,c2->W); + make_synthesis_window(c2->Pn); + c2->fft_inv_cfg = kiss_fft_alloc(FFT_DEC, 1, NULL, NULL); + quantise_init(); + c2->prev_Wo_enc = 0.0; + c2->bg_est = 0.0; + c2->ex_phase = 0.0; + + for(l=1; l<=MAX_AMP; l++) + c2->prev_model_dec.A[l] = 0.0; + c2->prev_model_dec.Wo = TWO_PI/P_MAX; + c2->prev_model_dec.L = PI/c2->prev_model_dec.Wo; + c2->prev_model_dec.voiced = 0; + + for(i=0; iprev_lsps_dec[i] = i*PI/(LPC_ORD+1); + } + c2->prev_e_dec = 1; + + c2->nlp = nlp_create(M); + if (c2->nlp == NULL) { + free (c2); + return NULL; + } + + if (mode == CODEC2_MODE_700B) + c2->gray = 0; // natural binary better for trellis decoding (hopefully added later) + else + c2->gray = 1; + + c2->lpc_pf = 1; c2->bass_boost = 1; c2->beta = LPCPF_BETA; c2->gamma = LPCPF_GAMMA; + + c2->xq_enc[0] = c2->xq_enc[1] = 0.0; + c2->xq_dec[0] = c2->xq_dec[1] = 0.0; + + c2->smoothing = 0; + + c2->bpf_buf = (float*)malloc(sizeof(float)*(BPF_N+4*N)); + assert(c2->bpf_buf != NULL); + for(i=0; ibpf_buf[i] = 0.0; + + c2->softdec = NULL; + + return c2; +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: codec2_destroy + AUTHOR......: David Rowe + DATE CREATED: 21/8/2010 + + Destroy an instance of the codec. + +\*---------------------------------------------------------------------------*/ + +void codec2_destroy(struct CODEC2 *c2) +{ + assert(c2 != NULL); + free(c2->bpf_buf); + nlp_destroy(c2->nlp); + KISS_FFT_FREE(c2->fft_fwd_cfg); + KISS_FFT_FREE(c2->fft_inv_cfg); + free(c2); +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: codec2_bits_per_frame + AUTHOR......: David Rowe + DATE CREATED: Nov 14 2011 + + Returns the number of bits per frame. + +\*---------------------------------------------------------------------------*/ + +int codec2_bits_per_frame(struct CODEC2 *c2) { + if (c2->mode == CODEC2_MODE_3200) + return 64; + if (c2->mode == CODEC2_MODE_2400) + return 48; + if (c2->mode == CODEC2_MODE_1600) + return 64; + if (c2->mode == CODEC2_MODE_1400) + return 56; + if (c2->mode == CODEC2_MODE_1300) + return 52; + if (c2->mode == CODEC2_MODE_1200) + return 48; + if (c2->mode == CODEC2_MODE_700) + return 28; + if (c2->mode == CODEC2_MODE_700B) + return 28; + + return 0; /* shouldn't get here */ +} + + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: codec2_samples_per_frame + AUTHOR......: David Rowe + DATE CREATED: Nov 14 2011 + + Returns the number of speech samples per frame. + +\*---------------------------------------------------------------------------*/ + +int codec2_samples_per_frame(struct CODEC2 *c2) { + if (c2->mode == CODEC2_MODE_3200) + return 160; + if (c2->mode == CODEC2_MODE_2400) + return 160; + if (c2->mode == CODEC2_MODE_1600) + return 320; + if (c2->mode == CODEC2_MODE_1400) + return 320; + if (c2->mode == CODEC2_MODE_1300) + return 320; + if (c2->mode == CODEC2_MODE_1200) + return 320; + if (c2->mode == CODEC2_MODE_700) + return 320; + if (c2->mode == CODEC2_MODE_700B) + return 320; + + return 0; /* shouldnt get here */ +} + +void codec2_encode(struct CODEC2 *c2, unsigned char *bits, short speech[]) +{ + assert(c2 != NULL); + assert( + (c2->mode == CODEC2_MODE_3200) || + (c2->mode == CODEC2_MODE_2400) || + (c2->mode == CODEC2_MODE_1600) || + (c2->mode == CODEC2_MODE_1400) || + (c2->mode == CODEC2_MODE_1300) || + (c2->mode == CODEC2_MODE_1200) || + (c2->mode == CODEC2_MODE_700) || + (c2->mode == CODEC2_MODE_700B) + ); + + if (c2->mode == CODEC2_MODE_3200) + codec2_encode_3200(c2, bits, speech); + if (c2->mode == CODEC2_MODE_2400) + codec2_encode_2400(c2, bits, speech); + if (c2->mode == CODEC2_MODE_1600) + codec2_encode_1600(c2, bits, speech); + if (c2->mode == CODEC2_MODE_1400) + codec2_encode_1400(c2, bits, speech); + if (c2->mode == CODEC2_MODE_1300) + codec2_encode_1300(c2, bits, speech); + if (c2->mode == CODEC2_MODE_1200) + codec2_encode_1200(c2, bits, speech); +#ifndef CORTEX_M4 + if (c2->mode == CODEC2_MODE_700) + codec2_encode_700(c2, bits, speech); + if (c2->mode == CODEC2_MODE_700B) + codec2_encode_700b(c2, bits, speech); +#endif +} + +void codec2_decode(struct CODEC2 *c2, short speech[], const unsigned char *bits) +{ + codec2_decode_ber(c2, speech, bits, 0.0); +} + +void codec2_decode_ber(struct CODEC2 *c2, short speech[], const unsigned char *bits, float ber_est) +{ + assert(c2 != NULL); + assert( + (c2->mode == CODEC2_MODE_3200) || + (c2->mode == CODEC2_MODE_2400) || + (c2->mode == CODEC2_MODE_1600) || + (c2->mode == CODEC2_MODE_1400) || + (c2->mode == CODEC2_MODE_1300) || + (c2->mode == CODEC2_MODE_1200) || + (c2->mode == CODEC2_MODE_700) || + (c2->mode == CODEC2_MODE_700B) + ); + + if (c2->mode == CODEC2_MODE_3200) + codec2_decode_3200(c2, speech, bits); + if (c2->mode == CODEC2_MODE_2400) + codec2_decode_2400(c2, speech, bits); + if (c2->mode == CODEC2_MODE_1600) + codec2_decode_1600(c2, speech, bits); + if (c2->mode == CODEC2_MODE_1400) + codec2_decode_1400(c2, speech, bits); + if (c2->mode == CODEC2_MODE_1300) + codec2_decode_1300(c2, speech, bits, ber_est); + if (c2->mode == CODEC2_MODE_1200) + codec2_decode_1200(c2, speech, bits); +#ifndef CORTEX_M4 + if (c2->mode == CODEC2_MODE_700) + codec2_decode_700(c2, speech, bits); + if (c2->mode == CODEC2_MODE_700B) + codec2_decode_700b(c2, speech, bits); +#endif +} + + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: codec2_encode_3200 + AUTHOR......: David Rowe + DATE CREATED: 13 Sep 2012 + + Encodes 160 speech samples (20ms of speech) into 64 bits. + + The codec2 algorithm actually operates internally on 10ms (80 + sample) frames, so we run the encoding algorithm twice. On the + first frame we just send the voicing bits. On the second frame we + send all model parameters. Compared to 2400 we use a larger number + of bits for the LSPs and non-VQ pitch and energy. + + The bit allocation is: + + Parameter bits/frame + -------------------------------------- + Harmonic magnitudes (LSPs) 50 + Pitch (Wo) 7 + Energy 5 + Voicing (10ms update) 2 + TOTAL 64 + +\*---------------------------------------------------------------------------*/ + +void codec2_encode_3200(struct CODEC2 *c2, unsigned char * bits, short speech[]) +{ + MODEL model; + float ak[LPC_ORD+1]; + float lsps[LPC_ORD]; + float e; + int Wo_index, e_index; + int lspd_indexes[LPC_ORD]; + int i; + unsigned int nbit = 0; + + assert(c2 != NULL); + + memset(bits, '\0', ((codec2_bits_per_frame(c2) + 7) / 8)); + + /* first 10ms analysis frame - we just want voicing */ + + analyse_one_frame(c2, &model, speech); + pack(bits, &nbit, model.voiced, 1); + + /* second 10ms analysis frame */ + + analyse_one_frame(c2, &model, &speech[N]); + pack(bits, &nbit, model.voiced, 1); + Wo_index = encode_Wo(model.Wo, WO_BITS); + pack(bits, &nbit, Wo_index, WO_BITS); + + e = speech_to_uq_lsps(lsps, ak, c2->Sn, c2->w, LPC_ORD); + e_index = encode_energy(e, E_BITS); + pack(bits, &nbit, e_index, E_BITS); + + encode_lspds_scalar(lspd_indexes, lsps, LPC_ORD); + for(i=0; iprev_model_dec, &model[1]); + e[0] = interp_energy(c2->prev_e_dec, e[1]); + + /* LSPs are sampled every 20ms so we interpolate the frame in + between, then recover spectral amplitudes */ + + interpolate_lsp_ver2(&lsps[0][0], c2->prev_lsps_dec, &lsps[1][0], 0.5, LPC_ORD); + + for(i=0; i<2; i++) { + lsp_to_lpc(&lsps[i][0], &ak[i][0], LPC_ORD); + aks_to_M2(c2->fft_fwd_cfg, &ak[i][0], LPC_ORD, &model[i], e[i], &snr, 0, 0, + c2->lpc_pf, c2->bass_boost, c2->beta, c2->gamma, Aw); + apply_lpc_correction(&model[i]); + synthesise_one_frame(c2, &speech[N*i], &model[i], Aw); + } + + /* update memories for next frame ----------------------------*/ + + c2->prev_model_dec = model[1]; + c2->prev_e_dec = e[1]; + for(i=0; iprev_lsps_dec[i] = lsps[1][i]; +} + + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: codec2_encode_2400 + AUTHOR......: David Rowe + DATE CREATED: 21/8/2010 + + Encodes 160 speech samples (20ms of speech) into 48 bits. + + The codec2 algorithm actually operates internally on 10ms (80 + sample) frames, so we run the encoding algorithm twice. On the + first frame we just send the voicing bit. On the second frame we + send all model parameters. + + The bit allocation is: + + Parameter bits/frame + -------------------------------------- + Harmonic magnitudes (LSPs) 36 + Joint VQ of Energy and Wo 8 + Voicing (10ms update) 2 + Spare 2 + TOTAL 48 + +\*---------------------------------------------------------------------------*/ + +void codec2_encode_2400(struct CODEC2 *c2, unsigned char * bits, short speech[]) +{ + MODEL model; + float ak[LPC_ORD+1]; + float lsps[LPC_ORD]; + float e; + int WoE_index; + int lsp_indexes[LPC_ORD]; + int i; + int spare = 0; + unsigned int nbit = 0; + + assert(c2 != NULL); + + memset(bits, '\0', ((codec2_bits_per_frame(c2) + 7) / 8)); + + /* first 10ms analysis frame - we just want voicing */ + + analyse_one_frame(c2, &model, speech); + pack(bits, &nbit, model.voiced, 1); + + /* second 10ms analysis frame */ + + analyse_one_frame(c2, &model, &speech[N]); + pack(bits, &nbit, model.voiced, 1); + + e = speech_to_uq_lsps(lsps, ak, c2->Sn, c2->w, LPC_ORD); + WoE_index = encode_WoE(&model, e, c2->xq_enc); + pack(bits, &nbit, WoE_index, WO_E_BITS); + + encode_lsps_scalar(lsp_indexes, lsps, LPC_ORD); + for(i=0; ixq_dec, WoE_index); + + for(i=0; iprev_model_dec, &model[1]); + e[0] = interp_energy(c2->prev_e_dec, e[1]); + + /* LSPs are sampled every 20ms so we interpolate the frame in + between, then recover spectral amplitudes */ + + interpolate_lsp_ver2(&lsps[0][0], c2->prev_lsps_dec, &lsps[1][0], 0.5, LPC_ORD); + for(i=0; i<2; i++) { + lsp_to_lpc(&lsps[i][0], &ak[i][0], LPC_ORD); + aks_to_M2(c2->fft_fwd_cfg, &ak[i][0], LPC_ORD, &model[i], e[i], &snr, 0, 0, + c2->lpc_pf, c2->bass_boost, c2->beta, c2->gamma, Aw); + apply_lpc_correction(&model[i]); + synthesise_one_frame(c2, &speech[N*i], &model[i], Aw); + } + + /* update memories for next frame ----------------------------*/ + + c2->prev_model_dec = model[1]; + c2->prev_e_dec = e[1]; + for(i=0; iprev_lsps_dec[i] = lsps[1][i]; +} + + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: codec2_encode_1600 + AUTHOR......: David Rowe + DATE CREATED: Feb 28 2013 + + Encodes 320 speech samples (40ms of speech) into 64 bits. + + The codec2 algorithm actually operates internally on 10ms (80 + sample) frames, so we run the encoding algorithm 4 times: + + frame 0: voicing bit + frame 1: voicing bit, Wo and E + frame 2: voicing bit + frame 3: voicing bit, Wo and E, scalar LSPs + + The bit allocation is: + + Parameter frame 2 frame 4 Total + ------------------------------------------------------- + Harmonic magnitudes (LSPs) 0 36 36 + Pitch (Wo) 7 7 14 + Energy 5 5 10 + Voicing (10ms update) 2 2 4 + TOTAL 14 50 64 + +\*---------------------------------------------------------------------------*/ + +void codec2_encode_1600(struct CODEC2 *c2, unsigned char * bits, short speech[]) +{ + MODEL model; + float lsps[LPC_ORD]; + float ak[LPC_ORD+1]; + float e; + int lsp_indexes[LPC_ORD]; + int Wo_index, e_index; + int i; + unsigned int nbit = 0; + + assert(c2 != NULL); + + memset(bits, '\0', ((codec2_bits_per_frame(c2) + 7) / 8)); + + /* frame 1: - voicing ---------------------------------------------*/ + + analyse_one_frame(c2, &model, speech); + pack(bits, &nbit, model.voiced, 1); + + /* frame 2: - voicing, scalar Wo & E -------------------------------*/ + + analyse_one_frame(c2, &model, &speech[N]); + pack(bits, &nbit, model.voiced, 1); + + Wo_index = encode_Wo(model.Wo, WO_BITS); + pack(bits, &nbit, Wo_index, WO_BITS); + + /* need to run this just to get LPC energy */ + e = speech_to_uq_lsps(lsps, ak, c2->Sn, c2->w, LPC_ORD); + e_index = encode_energy(e, E_BITS); + pack(bits, &nbit, e_index, E_BITS); + + /* frame 3: - voicing ---------------------------------------------*/ + + analyse_one_frame(c2, &model, &speech[2*N]); + pack(bits, &nbit, model.voiced, 1); + + /* frame 4: - voicing, scalar Wo & E, scalar LSPs ------------------*/ + + analyse_one_frame(c2, &model, &speech[3*N]); + pack(bits, &nbit, model.voiced, 1); + + Wo_index = encode_Wo(model.Wo, WO_BITS); + pack(bits, &nbit, Wo_index, WO_BITS); + + e = speech_to_uq_lsps(lsps, ak, c2->Sn, c2->w, LPC_ORD); + e_index = encode_energy(e, E_BITS); + pack(bits, &nbit, e_index, E_BITS); + + encode_lsps_scalar(lsp_indexes, lsps, LPC_ORD); + for(i=0; iprev_model_dec, &model[1]); + e[0] = interp_energy(c2->prev_e_dec, e[1]); + interp_Wo(&model[2], &model[1], &model[3]); + e[2] = interp_energy(e[1], e[3]); + + /* LSPs are sampled every 40ms so we interpolate the 3 frames in + between, then recover spectral amplitudes */ + + for(i=0, weight=0.25; i<3; i++, weight += 0.25) { + interpolate_lsp_ver2(&lsps[i][0], c2->prev_lsps_dec, &lsps[3][0], weight, LPC_ORD); + } + for(i=0; i<4; i++) { + lsp_to_lpc(&lsps[i][0], &ak[i][0], LPC_ORD); + aks_to_M2(c2->fft_fwd_cfg, &ak[i][0], LPC_ORD, &model[i], e[i], &snr, 0, 0, + c2->lpc_pf, c2->bass_boost, c2->beta, c2->gamma, Aw); + apply_lpc_correction(&model[i]); + synthesise_one_frame(c2, &speech[N*i], &model[i], Aw); + } + + /* update memories for next frame ----------------------------*/ + + c2->prev_model_dec = model[3]; + c2->prev_e_dec = e[3]; + for(i=0; iprev_lsps_dec[i] = lsps[3][i]; + +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: codec2_encode_1400 + AUTHOR......: David Rowe + DATE CREATED: May 11 2012 + + Encodes 320 speech samples (40ms of speech) into 56 bits. + + The codec2 algorithm actually operates internally on 10ms (80 + sample) frames, so we run the encoding algorithm 4 times: + + frame 0: voicing bit + frame 1: voicing bit, joint VQ of Wo and E + frame 2: voicing bit + frame 3: voicing bit, joint VQ of Wo and E, scalar LSPs + + The bit allocation is: + + Parameter frame 2 frame 4 Total + ------------------------------------------------------- + Harmonic magnitudes (LSPs) 0 36 36 + Energy+Wo 8 8 16 + Voicing (10ms update) 2 2 4 + TOTAL 10 46 56 + +\*---------------------------------------------------------------------------*/ + +void codec2_encode_1400(struct CODEC2 *c2, unsigned char * bits, short speech[]) +{ + MODEL model; + float lsps[LPC_ORD]; + float ak[LPC_ORD+1]; + float e; + int lsp_indexes[LPC_ORD]; + int WoE_index; + int i; + unsigned int nbit = 0; + + assert(c2 != NULL); + + memset(bits, '\0', ((codec2_bits_per_frame(c2) + 7) / 8)); + + /* frame 1: - voicing ---------------------------------------------*/ + + analyse_one_frame(c2, &model, speech); + pack(bits, &nbit, model.voiced, 1); + + /* frame 2: - voicing, joint Wo & E -------------------------------*/ + + analyse_one_frame(c2, &model, &speech[N]); + pack(bits, &nbit, model.voiced, 1); + + /* need to run this just to get LPC energy */ + e = speech_to_uq_lsps(lsps, ak, c2->Sn, c2->w, LPC_ORD); + + WoE_index = encode_WoE(&model, e, c2->xq_enc); + pack(bits, &nbit, WoE_index, WO_E_BITS); + + /* frame 3: - voicing ---------------------------------------------*/ + + analyse_one_frame(c2, &model, &speech[2*N]); + pack(bits, &nbit, model.voiced, 1); + + /* frame 4: - voicing, joint Wo & E, scalar LSPs ------------------*/ + + analyse_one_frame(c2, &model, &speech[3*N]); + pack(bits, &nbit, model.voiced, 1); + + e = speech_to_uq_lsps(lsps, ak, c2->Sn, c2->w, LPC_ORD); + WoE_index = encode_WoE(&model, e, c2->xq_enc); + pack(bits, &nbit, WoE_index, WO_E_BITS); + + encode_lsps_scalar(lsp_indexes, lsps, LPC_ORD); + for(i=0; ixq_dec, WoE_index); + + model[2].voiced = unpack(bits, &nbit, 1); + + model[3].voiced = unpack(bits, &nbit, 1); + WoE_index = unpack(bits, &nbit, WO_E_BITS); + decode_WoE(&model[3], &e[3], c2->xq_dec, WoE_index); + + for(i=0; iprev_model_dec, &model[1]); + e[0] = interp_energy(c2->prev_e_dec, e[1]); + interp_Wo(&model[2], &model[1], &model[3]); + e[2] = interp_energy(e[1], e[3]); + + /* LSPs are sampled every 40ms so we interpolate the 3 frames in + between, then recover spectral amplitudes */ + + for(i=0, weight=0.25; i<3; i++, weight += 0.25) { + interpolate_lsp_ver2(&lsps[i][0], c2->prev_lsps_dec, &lsps[3][0], weight, LPC_ORD); + } + for(i=0; i<4; i++) { + lsp_to_lpc(&lsps[i][0], &ak[i][0], LPC_ORD); + aks_to_M2(c2->fft_fwd_cfg, &ak[i][0], LPC_ORD, &model[i], e[i], &snr, 0, 0, + c2->lpc_pf, c2->bass_boost, c2->beta, c2->gamma, Aw); + apply_lpc_correction(&model[i]); + synthesise_one_frame(c2, &speech[N*i], &model[i], Aw); + } + + /* update memories for next frame ----------------------------*/ + + c2->prev_model_dec = model[3]; + c2->prev_e_dec = e[3]; + for(i=0; iprev_lsps_dec[i] = lsps[3][i]; + +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: codec2_encode_1300 + AUTHOR......: David Rowe + DATE CREATED: March 14 2013 + + Encodes 320 speech samples (40ms of speech) into 52 bits. + + The codec2 algorithm actually operates internally on 10ms (80 + sample) frames, so we run the encoding algorithm 4 times: + + frame 0: voicing bit + frame 1: voicing bit, + frame 2: voicing bit + frame 3: voicing bit, Wo and E, scalar LSPs + + The bit allocation is: + + Parameter frame 2 frame 4 Total + ------------------------------------------------------- + Harmonic magnitudes (LSPs) 0 36 36 + Pitch (Wo) 0 7 7 + Energy 0 5 5 + Voicing (10ms update) 2 2 4 + TOTAL 2 50 52 + +\*---------------------------------------------------------------------------*/ + +void codec2_encode_1300(struct CODEC2 *c2, unsigned char * bits, short speech[]) +{ + MODEL model; + float lsps[LPC_ORD]; + float ak[LPC_ORD+1]; + float e; + int lsp_indexes[LPC_ORD]; + int Wo_index, e_index; + int i; + unsigned int nbit = 0; + #ifdef PROFILE + unsigned int quant_start; + #endif + + assert(c2 != NULL); + + memset(bits, '\0', ((codec2_bits_per_frame(c2) + 7) / 8)); + + /* frame 1: - voicing ---------------------------------------------*/ + + analyse_one_frame(c2, &model, speech); + pack_natural_or_gray(bits, &nbit, model.voiced, 1, c2->gray); + + /* frame 2: - voicing ---------------------------------------------*/ + + analyse_one_frame(c2, &model, &speech[N]); + pack_natural_or_gray(bits, &nbit, model.voiced, 1, c2->gray); + + /* frame 3: - voicing ---------------------------------------------*/ + + analyse_one_frame(c2, &model, &speech[2*N]); + pack_natural_or_gray(bits, &nbit, model.voiced, 1, c2->gray); + + /* frame 4: - voicing, scalar Wo & E, scalar LSPs ------------------*/ + + analyse_one_frame(c2, &model, &speech[3*N]); + pack_natural_or_gray(bits, &nbit, model.voiced, 1, c2->gray); + + Wo_index = encode_Wo(model.Wo, WO_BITS); + pack_natural_or_gray(bits, &nbit, Wo_index, WO_BITS, c2->gray); + + #ifdef PROFILE + quant_start = machdep_profile_sample(); + #endif + e = speech_to_uq_lsps(lsps, ak, c2->Sn, c2->w, LPC_ORD); + e_index = encode_energy(e, E_BITS); + pack_natural_or_gray(bits, &nbit, e_index, E_BITS, c2->gray); + + encode_lsps_scalar(lsp_indexes, lsps, LPC_ORD); + for(i=0; igray); + } + #ifdef PROFILE + machdep_profile_sample_and_log(quant_start, " quant/packing"); + #endif + + assert(nbit == (unsigned)codec2_bits_per_frame(c2)); +} + + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: codec2_decode_1300 + AUTHOR......: David Rowe + DATE CREATED: 11 May 2012 + + Decodes frames of 52 bits into 320 samples (40ms) of speech. + +\*---------------------------------------------------------------------------*/ +static int frames; +void codec2_decode_1300(struct CODEC2 *c2, short speech[], const unsigned char * bits, float ber_est) +{ + MODEL model[4]; + int lsp_indexes[LPC_ORD]; + float lsps[4][LPC_ORD]; + int Wo_index, e_index; + float e[4]; + float snr; + float ak[4][LPC_ORD+1]; + int i,j; + unsigned int nbit = 0; + float weight; + COMP Aw[FFT_ENC]; + PROFILE_VAR(recover_start); + + assert(c2 != NULL); + frames+= 4; + /* only need to zero these out due to (unused) snr calculation */ + + for(i=0; i<4; i++) + for(j=1; j<=MAX_AMP; j++) + model[i].A[j] = 0.0; + + /* unpack bits from channel ------------------------------------*/ + + /* this will partially fill the model params for the 4 x 10ms + frames */ + + model[0].voiced = unpack_natural_or_gray(bits, &nbit, 1, c2->gray); + model[1].voiced = unpack_natural_or_gray(bits, &nbit, 1, c2->gray); + model[2].voiced = unpack_natural_or_gray(bits, &nbit, 1, c2->gray); + model[3].voiced = unpack_natural_or_gray(bits, &nbit, 1, c2->gray); + + Wo_index = unpack_natural_or_gray(bits, &nbit, WO_BITS, c2->gray); + model[3].Wo = decode_Wo(Wo_index, WO_BITS); + model[3].L = PI/model[3].Wo; + + e_index = unpack_natural_or_gray(bits, &nbit, E_BITS, c2->gray); + e[3] = decode_energy(e_index, E_BITS); + + for(i=0; igray); + } + decode_lsps_scalar(&lsps[3][0], lsp_indexes, LPC_ORD); + check_lsp_order(&lsps[3][0], LPC_ORD); + bw_expand_lsps(&lsps[3][0], LPC_ORD, 50.0, 100.0); + + if (ber_est > 0.15) { + model[0].voiced = model[1].voiced = model[2].voiced = model[3].voiced = 0; + e[3] = decode_energy(10, E_BITS); + bw_expand_lsps(&lsps[3][0], LPC_ORD, 200.0, 200.0); + fprintf(stderr, "soft mute\n"); + } + + /* interpolate ------------------------------------------------*/ + + /* Wo, energy, and LSPs are sampled every 40ms so we interpolate + the 3 frames in between */ + + PROFILE_SAMPLE(recover_start); + for(i=0, weight=0.25; i<3; i++, weight += 0.25) { + interpolate_lsp_ver2(&lsps[i][0], c2->prev_lsps_dec, &lsps[3][0], weight, LPC_ORD); + interp_Wo2(&model[i], &c2->prev_model_dec, &model[3], weight); + e[i] = interp_energy2(c2->prev_e_dec, e[3],weight); + } + + /* then recover spectral amplitudes */ + + for(i=0; i<4; i++) { + lsp_to_lpc(&lsps[i][0], &ak[i][0], LPC_ORD); + aks_to_M2(c2->fft_fwd_cfg, &ak[i][0], LPC_ORD, &model[i], e[i], &snr, 0, 0, + c2->lpc_pf, c2->bass_boost, c2->beta, c2->gamma, Aw); + apply_lpc_correction(&model[i]); + synthesise_one_frame(c2, &speech[N*i], &model[i], Aw); + } + /* + for(i=0; i<4; i++) { + printf("%d Wo: %f L: %d v: %d\n", frames, model[i].Wo, model[i].L, model[i].voiced); + } + if (frames == 4*50) + exit(0); + */ + PROFILE_SAMPLE_AND_LOG2(recover_start, " recover"); + #ifdef DUMP + dump_lsp_(&lsps[3][0]); + dump_ak_(&ak[3][0], LPC_ORD); + #endif + + /* update memories for next frame ----------------------------*/ + + c2->prev_model_dec = model[3]; + c2->prev_e_dec = e[3]; + for(i=0; iprev_lsps_dec[i] = lsps[3][i]; + +} + + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: codec2_encode_1200 + AUTHOR......: David Rowe + DATE CREATED: Nov 14 2011 + + Encodes 320 speech samples (40ms of speech) into 48 bits. + + The codec2 algorithm actually operates internally on 10ms (80 + sample) frames, so we run the encoding algorithm four times: + + frame 0: voicing bit + frame 1: voicing bit, joint VQ of Wo and E + frame 2: voicing bit + frame 3: voicing bit, joint VQ of Wo and E, VQ LSPs + + The bit allocation is: + + Parameter frame 2 frame 4 Total + ------------------------------------------------------- + Harmonic magnitudes (LSPs) 0 27 27 + Energy+Wo 8 8 16 + Voicing (10ms update) 2 2 4 + Spare 0 1 1 + TOTAL 10 38 48 + +\*---------------------------------------------------------------------------*/ + +void codec2_encode_1200(struct CODEC2 *c2, unsigned char * bits, short speech[]) +{ + MODEL model; + float lsps[LPC_ORD]; + float lsps_[LPC_ORD]; + float ak[LPC_ORD+1]; + float e; + int lsp_indexes[LPC_ORD]; + int WoE_index; + int i; + int spare = 0; + unsigned int nbit = 0; + + assert(c2 != NULL); + + memset(bits, '\0', ((codec2_bits_per_frame(c2) + 7) / 8)); + + /* frame 1: - voicing ---------------------------------------------*/ + + analyse_one_frame(c2, &model, speech); + pack(bits, &nbit, model.voiced, 1); + + /* frame 2: - voicing, joint Wo & E -------------------------------*/ + + analyse_one_frame(c2, &model, &speech[N]); + pack(bits, &nbit, model.voiced, 1); + + /* need to run this just to get LPC energy */ + e = speech_to_uq_lsps(lsps, ak, c2->Sn, c2->w, LPC_ORD); + + WoE_index = encode_WoE(&model, e, c2->xq_enc); + pack(bits, &nbit, WoE_index, WO_E_BITS); + + /* frame 3: - voicing ---------------------------------------------*/ + + analyse_one_frame(c2, &model, &speech[2*N]); + pack(bits, &nbit, model.voiced, 1); + + /* frame 4: - voicing, joint Wo & E, scalar LSPs ------------------*/ + + analyse_one_frame(c2, &model, &speech[3*N]); + pack(bits, &nbit, model.voiced, 1); + + e = speech_to_uq_lsps(lsps, ak, c2->Sn, c2->w, LPC_ORD); + WoE_index = encode_WoE(&model, e, c2->xq_enc); + pack(bits, &nbit, WoE_index, WO_E_BITS); + + encode_lsps_vq(lsp_indexes, lsps, lsps_, LPC_ORD); + for(i=0; ixq_dec, WoE_index); + + model[2].voiced = unpack(bits, &nbit, 1); + + model[3].voiced = unpack(bits, &nbit, 1); + WoE_index = unpack(bits, &nbit, WO_E_BITS); + decode_WoE(&model[3], &e[3], c2->xq_dec, WoE_index); + + for(i=0; iprev_model_dec, &model[1]); + e[0] = interp_energy(c2->prev_e_dec, e[1]); + interp_Wo(&model[2], &model[1], &model[3]); + e[2] = interp_energy(e[1], e[3]); + + /* LSPs are sampled every 40ms so we interpolate the 3 frames in + between, then recover spectral amplitudes */ + + for(i=0, weight=0.25; i<3; i++, weight += 0.25) { + interpolate_lsp_ver2(&lsps[i][0], c2->prev_lsps_dec, &lsps[3][0], weight, LPC_ORD); + } + for(i=0; i<4; i++) { + lsp_to_lpc(&lsps[i][0], &ak[i][0], LPC_ORD); + aks_to_M2(c2->fft_fwd_cfg, &ak[i][0], LPC_ORD, &model[i], e[i], &snr, 0, 0, + c2->lpc_pf, c2->bass_boost, c2->beta, c2->gamma, Aw); + apply_lpc_correction(&model[i]); + synthesise_one_frame(c2, &speech[N*i], &model[i], Aw); + } + + /* update memories for next frame ----------------------------*/ + + c2->prev_model_dec = model[3]; + c2->prev_e_dec = e[3]; + for(i=0; iprev_lsps_dec[i] = lsps[3][i]; +} + + +#ifndef CORTEX_M4 +/*---------------------------------------------------------------------------*\ + + FUNCTION....: codec2_encode_700 + AUTHOR......: David Rowe + DATE CREATED: April 2015 + + Encodes 320 speech samples (40ms of speech) into 28 bits. + + The codec2 algorithm actually operates internally on 10ms (80 + sample) frames, so we run the encoding algorithm four times: + + frame 0: nothing + frame 1: nothing + frame 2: nothing + frame 3: voicing bit, scalar Wo and E, 17 bit LSP MEL scalar, 2 spare + + The bit allocation is: + + Parameter frames 1-3 frame 4 Total + ----------------------------------------------------------- + Harmonic magnitudes (LSPs) 0 17 17 + Energy 0 3 3 + log Wo 0 5 5 + Voicing 0 1 1 + spare 0 2 2 + TOTAL 0 28 28 + +\*---------------------------------------------------------------------------*/ + +void codec2_encode_700(struct CODEC2 *c2, unsigned char * bits, short speech[]) +{ + MODEL model; + float lsps[LPC_ORD_LOW]; + float mel[LPC_ORD_LOW]; + float ak[LPC_ORD_LOW+1]; + float e, f; + int indexes[LPC_ORD_LOW]; + int Wo_index, e_index, i; + unsigned int nbit = 0; + float bpf_out[4*N]; + short bpf_speech[4*N]; + int spare = 0; + + assert(c2 != NULL); + + memset(bits, '\0', ((codec2_bits_per_frame(c2) + 7) / 8)); + + /* band pass filter */ + + for(i=0; ibpf_buf[i] = c2->bpf_buf[4*N+i]; + for(i=0; i<4*N; i++) + c2->bpf_buf[BPF_N+i] = speech[i]; + inverse_filter(&c2->bpf_buf[BPF_N], bpf, 4*N, bpf_out, BPF_N); + for(i=0; i<4*N; i++) + bpf_speech[i] = bpf_out[i]; + + /* frame 1 --------------------------------------------------------*/ + + analyse_one_frame(c2, &model, bpf_speech); + + /* frame 2 --------------------------------------------------------*/ + + analyse_one_frame(c2, &model, &bpf_speech[N]); + + /* frame 3 --------------------------------------------------------*/ + + analyse_one_frame(c2, &model, &bpf_speech[2*N]); + + /* frame 4: - voicing, scalar Wo & E, scalar LSPs -----------------*/ + + analyse_one_frame(c2, &model, &bpf_speech[3*N]); + pack(bits, &nbit, model.voiced, 1); + Wo_index = encode_log_Wo(model.Wo, 5); + pack_natural_or_gray(bits, &nbit, Wo_index, 5, c2->gray); + + e = speech_to_uq_lsps(lsps, ak, c2->Sn, c2->w, LPC_ORD_LOW); + e_index = encode_energy(e, 3); + pack_natural_or_gray(bits, &nbit, e_index, 3, c2->gray); + + for(i=0; igray); + } + + pack_natural_or_gray(bits, &nbit, spare, 2, c2->gray); + + assert(nbit == (unsigned)codec2_bits_per_frame(c2)); +} + + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: codec2_decode_700 + AUTHOR......: David Rowe + DATE CREATED: April 2015 + + Decodes frames of 28 bits into 320 samples (40ms) of speech. + +\*---------------------------------------------------------------------------*/ + +void codec2_decode_700(struct CODEC2 *c2, short speech[], const unsigned char * bits) +{ + MODEL model[4]; + int indexes[LPC_ORD_LOW]; + float mel[LPC_ORD_LOW]; + float lsps[4][LPC_ORD_LOW]; + int Wo_index, e_index; + float e[4]; + float snr, f_; + float ak[4][LPC_ORD_LOW+1]; + int i,j; + unsigned int nbit = 0; + float weight; + COMP Aw[FFT_ENC]; + + assert(c2 != NULL); + + /* only need to zero these out due to (unused) snr calculation */ + + for(i=0; i<4; i++) + for(j=1; j<=MAX_AMP; j++) + model[i].A[j] = 0.0; + + /* unpack bits from channel ------------------------------------*/ + + model[3].voiced = unpack(bits, &nbit, 1); + model[0].voiced = model[1].voiced = model[2].voiced = model[3].voiced; + + Wo_index = unpack_natural_or_gray(bits, &nbit, 5, c2->gray); + model[3].Wo = decode_log_Wo(Wo_index, 5); + model[3].L = PI/model[3].Wo; + + e_index = unpack_natural_or_gray(bits, &nbit, 3, c2->gray); + e[3] = decode_energy(e_index, 3); + + for(i=0; igray); + } + + decode_mels_scalar(mel, indexes, LPC_ORD_LOW); + for(i=0; isoftdec) { + float e = 0.0; + for(i=9; i<9+17; i++) + e += c2->softdec[i]*c2->softdec[i]; + e /= 6.0; + //fprintf(stderr, "e: %f\n", e); + //if (e < 0.3) + // bw_expand_lsps(&lsps[3][0], LPC_ORD_LOW, 150.0, 300.0); + } + #endif + + /* interpolate ------------------------------------------------*/ + + /* LSPs, Wo, and energy are sampled every 40ms so we interpolate + the 3 frames in between, then recover spectral amplitudes */ + + for(i=0, weight=0.25; i<3; i++, weight += 0.25) { + interpolate_lsp_ver2(&lsps[i][0], c2->prev_lsps_dec, &lsps[3][0], weight, LPC_ORD_LOW); + interp_Wo2(&model[i], &c2->prev_model_dec, &model[3], weight); + e[i] = interp_energy2(c2->prev_e_dec, e[3],weight); + } + for(i=0; i<4; i++) { + lsp_to_lpc(&lsps[i][0], &ak[i][0], LPC_ORD_LOW); + aks_to_M2(c2->fft_fwd_cfg, &ak[i][0], LPC_ORD_LOW, &model[i], e[i], &snr, 0, 0, + c2->lpc_pf, c2->bass_boost, c2->beta, c2->gamma, Aw); + apply_lpc_correction(&model[i]); + synthesise_one_frame(c2, &speech[N*i], &model[i], Aw); + } + + #ifdef DUMP + dump_lsp_(&lsps[3][0]); + dump_ak_(&ak[3][0], LPC_ORD_LOW); + dump_model(&model[3]); + if (c2->softdec) + dump_softdec(c2->softdec, nbit); + #endif + + /* update memories for next frame ----------------------------*/ + + c2->prev_model_dec = model[3]; + c2->prev_e_dec = e[3]; + for(i=0; iprev_lsps_dec[i] = lsps[3][i]; +} + + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: codec2_encode_700b + AUTHOR......: David Rowe + DATE CREATED: August 2015 + + Version b of 700 bit/s codec. After some experiments over the air I + wanted was unhappy with the rate 700 codec so spent a few weeks + trying to improve the speech quality. This version uses a wider BPF + and vector quantised mel-lsps. + + Encodes 320 speech samples (40ms of speech) into 28 bits. + + The codec2 algorithm actually operates internally on 10ms (80 + sample) frames, so we run the encoding algorithm four times: + + frame 0: nothing + frame 1: nothing + frame 2: nothing + frame 3: voicing bit, 5 bit scalar Wo and 3 bit E, 18 bit LSP MEL VQ, + 1 spare + + The bit allocation is: + + Parameter frames 1-3 frame 4 Total + ----------------------------------------------------------- + Harmonic magnitudes (LSPs) 0 18 18 + Energy 0 3 3 + log Wo 0 5 5 + Voicing 0 1 1 + spare 0 1 1 + TOTAL 0 28 28 + +\*---------------------------------------------------------------------------*/ + +void codec2_encode_700b(struct CODEC2 *c2, unsigned char * bits, short speech[]) +{ + MODEL model; + float lsps[LPC_ORD_LOW]; + float mel[LPC_ORD_LOW]; + float mel_[LPC_ORD_LOW]; + float ak[LPC_ORD_LOW+1]; + float e, f; + int indexes[3]; + int Wo_index, e_index, i; + unsigned int nbit = 0; + float bpf_out[4*N]; + short bpf_speech[4*N]; + int spare = 0; + + assert(c2 != NULL); + + memset(bits, '\0', ((codec2_bits_per_frame(c2) + 7) / 8)); + + /* band pass filter */ + + for(i=0; ibpf_buf[i] = c2->bpf_buf[4*N+i]; + for(i=0; i<4*N; i++) + c2->bpf_buf[BPF_N+i] = speech[i]; + inverse_filter(&c2->bpf_buf[BPF_N], bpfb, 4*N, bpf_out, BPF_N); + for(i=0; i<4*N; i++) + bpf_speech[i] = bpf_out[i]; + + /* frame 1 --------------------------------------------------------*/ + + analyse_one_frame(c2, &model, bpf_speech); + + /* frame 2 --------------------------------------------------------*/ + + analyse_one_frame(c2, &model, &bpf_speech[N]); + + /* frame 3 --------------------------------------------------------*/ + + analyse_one_frame(c2, &model, &bpf_speech[2*N]); + + /* frame 4: - voicing, scalar Wo & E, VQ mel LSPs -----------------*/ + + analyse_one_frame(c2, &model, &bpf_speech[3*N]); + pack(bits, &nbit, model.voiced, 1); + Wo_index = encode_log_Wo(model.Wo, 5); + pack_natural_or_gray(bits, &nbit, Wo_index, 5, c2->gray); + + e = speech_to_uq_lsps(lsps, ak, c2->Sn, c2->w, LPC_ORD_LOW); + e_index = encode_energy(e, 3); + pack_natural_or_gray(bits, &nbit, e_index, 3, c2->gray); + + for(i=0; igray); + } + + pack_natural_or_gray(bits, &nbit, spare, 1, c2->gray); + + assert(nbit == (unsigned)codec2_bits_per_frame(c2)); +} + + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: codec2_decode_700b + AUTHOR......: David Rowe + DATE CREATED: August 2015 + + Decodes frames of 28 bits into 320 samples (40ms) of speech. + +\*---------------------------------------------------------------------------*/ + +void codec2_decode_700b(struct CODEC2 *c2, short speech[], const unsigned char * bits) +{ + MODEL model[4]; + int indexes[3]; + float mel[LPC_ORD_LOW]; + float lsps[4][LPC_ORD_LOW]; + int Wo_index, e_index; + float e[4]; + float snr, f_; + float ak[4][LPC_ORD_LOW+1]; + int i,j; + unsigned int nbit = 0; + float weight; + COMP Aw[FFT_ENC]; + + assert(c2 != NULL); + + /* only need to zero these out due to (unused) snr calculation */ + + for(i=0; i<4; i++) + for(j=1; j<=MAX_AMP; j++) + model[i].A[j] = 0.0; + + /* unpack bits from channel ------------------------------------*/ + + model[3].voiced = unpack(bits, &nbit, 1); + model[0].voiced = model[1].voiced = model[2].voiced = model[3].voiced; + + Wo_index = unpack_natural_or_gray(bits, &nbit, 5, c2->gray); + model[3].Wo = decode_log_Wo(Wo_index, 5); + model[3].L = PI/model[3].Wo; + + e_index = unpack_natural_or_gray(bits, &nbit, 3, c2->gray); + e[3] = decode_energy(e_index, 3); + + for(i=0; i<3; i++) { + indexes[i] = unpack_natural_or_gray(bits, &nbit, lspmelvq_cb_bits(i), c2->gray); + } + + lspmelvq_decode(indexes, mel, LPC_ORD_LOW); + + #define MEL_ROUND 10 + for(i=1; iprev_lsps_dec, &lsps[3][0], weight, LPC_ORD_LOW); + interp_Wo2(&model[i], &c2->prev_model_dec, &model[3], weight); + e[i] = interp_energy2(c2->prev_e_dec, e[3],weight); + } + for(i=0; i<4; i++) { + lsp_to_lpc(&lsps[i][0], &ak[i][0], LPC_ORD_LOW); + aks_to_M2(c2->fft_fwd_cfg, &ak[i][0], LPC_ORD_LOW, &model[i], e[i], &snr, 0, 0, + c2->lpc_pf, c2->bass_boost, c2->beta, c2->gamma, Aw); + apply_lpc_correction(&model[i]); + synthesise_one_frame(c2, &speech[N*i], &model[i], Aw); + } + + #ifdef DUMP + dump_lsp_(&lsps[3][0]); + dump_ak_(&ak[3][0], LPC_ORD_LOW); + dump_model(&model[3]); + if (c2->softdec) + dump_softdec(c2->softdec, nbit); + #endif + + /* update memories for next frame ----------------------------*/ + + c2->prev_model_dec = model[3]; + c2->prev_e_dec = e[3]; + for(i=0; iprev_lsps_dec[i] = lsps[3][i]; +} +#endif + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: synthesise_one_frame() + AUTHOR......: David Rowe + DATE CREATED: 23/8/2010 + + Synthesise 80 speech samples (10ms) from model parameters. + +\*---------------------------------------------------------------------------*/ + +void synthesise_one_frame(struct CODEC2 *c2, short speech[], MODEL *model, COMP Aw[]) +{ + int i; + PROFILE_VAR(phase_start, pf_start, synth_start); + + #ifdef DUMP + dump_quantised_model(model); + #endif + + PROFILE_SAMPLE(phase_start); + + phase_synth_zero_order(c2->fft_fwd_cfg, model, &c2->ex_phase, Aw); + + PROFILE_SAMPLE_AND_LOG(pf_start, phase_start, " phase_synth"); + + postfilter(model, &c2->bg_est); + + PROFILE_SAMPLE_AND_LOG(synth_start, pf_start, " postfilter"); + + synthesise(c2->fft_inv_cfg, c2->Sn_, model, c2->Pn, 1); + + PROFILE_SAMPLE_AND_LOG2(synth_start, " synth"); + + ear_protection(c2->Sn_, N); + + for(i=0; iSn_[i] > 32767.0) + speech[i] = 32767; + else if (c2->Sn_[i] < -32767.0) + speech[i] = -32767; + else + speech[i] = c2->Sn_[i]; + } + +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: analyse_one_frame() + AUTHOR......: David Rowe + DATE CREATED: 23/8/2010 + + Extract sinusoidal model parameters from 80 speech samples (10ms of + speech). + +\*---------------------------------------------------------------------------*/ + +void analyse_one_frame(struct CODEC2 *c2, MODEL *model, short speech[]) +{ + COMP Sw[FFT_ENC]; + COMP Sw_[FFT_ENC]; + COMP Ew[FFT_ENC]; + float pitch; + int i; + PROFILE_VAR(dft_start, nlp_start, model_start, two_stage, estamps); + + /* Read input speech */ + + for(i=0; iSn[i] = c2->Sn[i+N]; + for(i=0; iSn[i+M-N] = speech[i]; + + PROFILE_SAMPLE(dft_start); + dft_speech(c2->fft_fwd_cfg, Sw, c2->Sn, c2->w); + PROFILE_SAMPLE_AND_LOG(nlp_start, dft_start, " dft_speech"); + + /* Estimate pitch */ + + nlp(c2->nlp,c2->Sn,N,P_MIN,P_MAX,&pitch,Sw, c2->W, &c2->prev_Wo_enc); + PROFILE_SAMPLE_AND_LOG(model_start, nlp_start, " nlp"); + + model->Wo = TWO_PI/pitch; + model->L = PI/model->Wo; + + /* estimate model parameters */ + + two_stage_pitch_refinement(model, Sw); + PROFILE_SAMPLE_AND_LOG(two_stage, model_start, " two_stage"); + estimate_amplitudes(model, Sw, c2->W, 0); + PROFILE_SAMPLE_AND_LOG(estamps, two_stage, " est_amps"); + est_voicing_mbe(model, Sw, c2->W, Sw_, Ew); + c2->prev_Wo_enc = model->Wo; + PROFILE_SAMPLE_AND_LOG2(estamps, " est_voicing"); + #ifdef DUMP + dump_model(model); + #endif +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: ear_protection() + AUTHOR......: David Rowe + DATE CREATED: Nov 7 2012 + + Limits output level to protect ears when there are bit errors or the input + is overdriven. This doesn't correct or mask bit errors, just reduces the + worst of their damage. + +\*---------------------------------------------------------------------------*/ + +static void ear_protection(float in_out[], int n) { + float max_sample, over, gain; + int i; + + /* find maximum sample in frame */ + + max_sample = 0.0; + for(i=0; i max_sample) + max_sample = in_out[i]; + + /* determine how far above set point */ + + over = max_sample/30000.0; + + /* If we are x dB over set point we reduce level by 2x dB, this + attenuates major excursions in amplitude (likely to be caused + by bit errors) more than smaller ones */ + + if (over > 1.0) { + gain = 1.0/(over*over); + //fprintf(stderr, "gain: %f\n", gain); + for(i=0; i= 0.0) && (beta <= 1.0)); + assert((gamma >= 0.0) && (gamma <= 1.0)); + c2->lpc_pf = enable; + c2->bass_boost = bass_boost; + c2->beta = beta; + c2->gamma = gamma; +} + +/* + Allows optional stealing of one of the voicing bits for use as a + spare bit, only 1300 & 1400 & 1600 bit/s supported for now. + Experimental method of sending voice/data frames for FreeDV. +*/ + +int codec2_get_spare_bit_index(struct CODEC2 *c2) +{ + assert(c2 != NULL); + + switch(c2->mode) { + case CODEC2_MODE_1300: + return 2; // bit 2 (3th bit) is v2 (third voicing bit) + break; + case CODEC2_MODE_1400: + return 10; // bit 10 (11th bit) is v2 (third voicing bit) + break; + case CODEC2_MODE_1600: + return 15; // bit 15 (16th bit) is v2 (third voicing bit) + break; + case CODEC2_MODE_700: + return 26; // bits 26 and 27 are spare + break; + case CODEC2_MODE_700B: + return 27; // bit 27 is spare + break; + } + + return -1; +} + +/* + Reconstructs the spare voicing bit. Note works on unpacked bits + for convenience. +*/ + +int codec2_rebuild_spare_bit(struct CODEC2 *c2, int unpacked_bits[]) +{ + int v1,v3; + + assert(c2 != NULL); + + v1 = unpacked_bits[1]; + + switch(c2->mode) { + case CODEC2_MODE_1300: + + v3 = unpacked_bits[1+1+1]; + + /* if either adjacent frame is voiced, make this one voiced */ + + unpacked_bits[2] = (v1 || v3); + + return 0; + + break; + + case CODEC2_MODE_1400: + + v3 = unpacked_bits[1+1+8+1]; + + /* if either adjacent frame is voiced, make this one voiced */ + + unpacked_bits[10] = (v1 || v3); + + return 0; + + break; + + case CODEC2_MODE_1600: + v3 = unpacked_bits[1+1+8+5+1]; + + /* if either adjacent frame is voiced, make this one voiced */ + + unpacked_bits[15] = (v1 || v3); + + return 0; + + break; + } + + return -1; +} + +void codec2_set_natural_or_gray(struct CODEC2 *c2, int gray) +{ + assert(c2 != NULL); + c2->gray = gray; +} + +void codec2_set_softdec(struct CODEC2 *c2, float *softdec) +{ + assert(c2 != NULL); + c2->softdec = softdec; +} + diff --git a/codec2/tags/0.4.1/src/codec2.h b/codec2/tags/0.4.1/src/codec2.h new file mode 100644 index 00000000..65cfb65e --- /dev/null +++ b/codec2/tags/0.4.1/src/codec2.h @@ -0,0 +1,66 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: codec2.h + AUTHOR......: David Rowe + DATE CREATED: 21 August 2010 + + Codec 2 fully quantised encoder and decoder functions. If you want use + Codec 2, these are the functions you need to call. + +\*---------------------------------------------------------------------------*/ + +/* + 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 . +*/ + +#ifdef __cplusplus + extern "C" { +#endif + +#ifndef __CODEC2__ +#define __CODEC2__ + +#define CODEC2_MODE_3200 0 +#define CODEC2_MODE_2400 1 +#define CODEC2_MODE_1600 2 +#define CODEC2_MODE_1400 3 +#define CODEC2_MODE_1300 4 +#define CODEC2_MODE_1200 5 +#define CODEC2_MODE_700 6 +#define CODEC2_MODE_700B 7 + +struct CODEC2; + +struct CODEC2 * codec2_create(int mode); +void codec2_destroy(struct CODEC2 *codec2_state); +void codec2_encode(struct CODEC2 *codec2_state, unsigned char * bits, short speech_in[]); +void codec2_decode(struct CODEC2 *codec2_state, short speech_out[], const unsigned char *bits); +void codec2_decode_ber(struct CODEC2 *codec2_state, short speech_out[], const unsigned char *bits, float ber_est); +int codec2_samples_per_frame(struct CODEC2 *codec2_state); +int codec2_bits_per_frame(struct CODEC2 *codec2_state); + +void codec2_set_lpc_post_filter(struct CODEC2 *codec2_state, int enable, int bass_boost, float beta, float gamma); +int codec2_get_spare_bit_index(struct CODEC2 *codec2_state); +int codec2_rebuild_spare_bit(struct CODEC2 *codec2_state, int unpacked_bits[]); +void codec2_set_natural_or_gray(struct CODEC2 *codec2_state, int gray); +void codec2_set_softdec(struct CODEC2 *c2, float *softdec); + +#endif + +#ifdef __cplusplus +} +#endif + diff --git a/codec2/tags/0.4.1/src/codec2_cohpsk.h b/codec2/tags/0.4.1/src/codec2_cohpsk.h new file mode 100644 index 00000000..3731aad2 --- /dev/null +++ b/codec2/tags/0.4.1/src/codec2_cohpsk.h @@ -0,0 +1,61 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: cohpsk.h + AUTHOR......: David Rowe + DATE CREATED: March 2015 + + Functions that implement a coherent PSK FDM modem. + +\*---------------------------------------------------------------------------*/ + +/* + 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 . +*/ + +#ifndef __CODEC2_COHPSK__ +#define __CODEC2_COHPSK__ + +#define COHPSK_BITS_PER_FRAME 56 /* hard coded for now */ +#define COHPSK_NC 7 /* hard coded for now */ +#define COHPSK_NOM_SAMPLES_PER_FRAME 600 +#define COHPSK_MAX_SAMPLES_PER_FRAME 625 +#define COHPSK_RS 75 +#define COHPSK_FS 7500 /* note this is a wierd + value to get an integer + oversampling rate */ + +#include "comp.h" +#include "modem_stats.h" + +struct COHPSK; + +extern const int test_bits_coh[]; + +struct COHPSK *cohpsk_create(void); +void cohpsk_destroy(struct COHPSK *coh); +void cohpsk_mod(struct COHPSK *cohpsk, COMP tx_fdm[], int tx_bits[]); +void cohpsk_clip(COMP tx_fdm[]); +void cohpsk_demod(struct COHPSK *cohpsk, float rx_bits[], int *sync, COMP rx_fdm[], int *nin_frame); +void cohpsk_get_demod_stats(struct COHPSK *cohpsk, struct MODEM_STATS *stats); +void cohpsk_set_verbose(struct COHPSK *coh, int verbose); +void cohpsk_get_test_bits(struct COHPSK *coh, int rx_bits[]); +void cohpsk_put_test_bits(struct COHPSK *coh, int *state, short error_pattern[], + int *bit_errors, float rx_bits_sd[]); +int cohpsk_error_pattern_size(void); +void cohpsk_set_frame(struct COHPSK *coh, int frame); +void fdmdv_freq_shift_coh(COMP rx_fdm_fcorr[], COMP rx_fdm[], float foff, float Fs, + COMP *foff_phase_rect, int nin); +#endif diff --git a/codec2/tags/0.4.1/src/codec2_fdmdv.h b/codec2/tags/0.4.1/src/codec2_fdmdv.h new file mode 100644 index 00000000..334696c9 --- /dev/null +++ b/codec2/tags/0.4.1/src/codec2_fdmdv.h @@ -0,0 +1,113 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: codec2_fdmdv.h + AUTHOR......: David Rowe + DATE CREATED: April 14 2012 + + A 1400 bit/s (nominal) Frequency Division Multiplexed Digital Voice + (FDMDV) modem. Used for digital audio over HF SSB. See + README_fdmdv.txt for more information, and fdmdv_mod.c and + fdmdv_demod.c for example usage. + + The name codec2_fdmdv.h is used to make it unique when "make + installed". + + References: + + [1] http://n1su.com/fdmdv/FDMDV_Docs_Rel_1_4b.pdf + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2012 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 . +*/ + +#ifndef __FDMDV__ +#define __FDMDV__ + +#ifdef __cplusplus +extern "C" { +#endif + +/* set up the calling convention for DLL function import/export for + WIN32 cross compiling */ + +#ifdef __CODEC2_WIN32__ +#ifdef __CODEC2_BUILDING_DLL__ +#define CODEC2_WIN32SUPPORT __declspec(dllexport) __stdcall +#else +#define CODEC2_WIN32SUPPORT __declspec(dllimport) __stdcall +#endif +#else +#define CODEC2_WIN32SUPPORT +#endif + +#include "comp.h" +#include "modem_stats.h" + +#define FDMDV_NC 14 /* default number of data carriers */ +#define FDMDV_NC_MAX 20 /* maximum number of data carriers */ +#define FDMDV_BITS_PER_FRAME 28 /* 20ms frames, for nominal 1400 bit/s */ +#define FDMDV_NOM_SAMPLES_PER_FRAME 160 /* modulator output samples/frame and nominal demod samples/frame */ + /* at 8000 Hz sample rate */ +#define FDMDV_MAX_SAMPLES_PER_FRAME 200 /* max demod samples/frame, use this to allocate storage */ +#define FDMDV_SCALE 1000 /* suggested scaling for 16 bit shorts */ +#define FDMDV_FCENTRE 1500 /* Centre frequency, Nc/2 carriers below this, Nc/2 carriers above (Hz) */ + +/* 8 to 48 kHz sample rate conversion */ + +#define FDMDV_OS 2 /* oversampling rate */ +#define FDMDV_OS_TAPS_16K 48 /* number of OS filter taps at 16kHz */ +#define FDMDV_OS_TAPS_8K (FDMDV_OS_TAPS_16K/FDMDV_OS) /* number of OS filter taps at 8kHz */ + +/* FDMDV states and stats structures */ + +struct FDMDV; + +struct FDMDV * fdmdv_create(int Nc); +void fdmdv_destroy(struct FDMDV *fdmdv_state); +void fdmdv_use_old_qpsk_mapping(struct FDMDV *fdmdv_state); +int fdmdv_bits_per_frame(struct FDMDV *fdmdv_state); +float fdmdv_get_fsep(struct FDMDV *fdmdv_state); +void fdmdv_set_fsep(struct FDMDV *fdmdv_state, float fsep); + +void fdmdv_mod(struct FDMDV *fdmdv_state, COMP tx_fdm[], int tx_bits[], int *sync_bit); +void fdmdv_demod(struct FDMDV *fdmdv_state, int rx_bits[], int *reliable_sync_bit, COMP rx_fdm[], int *nin); + +void fdmdv_get_test_bits(struct FDMDV *fdmdv_state, int tx_bits[]); +int fdmdv_error_pattern_size(struct FDMDV *fdmdv_state); +void fdmdv_put_test_bits(struct FDMDV *f, int *sync, short error_pattern[], int *bit_errors, int *ntest_bits, int rx_bits[]); + +void fdmdv_get_demod_stats(struct FDMDV *fdmdv_state, struct MODEM_STATS *stats); + +void fdmdv_8_to_16(float out16k[], float in8k[], int n); +void fdmdv_8_to_16_short(short out16k[], short in8k[], int n); +void fdmdv_16_to_8(float out8k[], float in16k[], int n); +void fdmdv_16_to_8_short(short out8k[], short in16k[], int n); + +void fdmdv_freq_shift(COMP rx_fdm_fcorr[], COMP rx_fdm[], float foff, COMP *foff_phase_rect, int nin); + +/* debug/development function(s) */ + +void fdmdv_dump_osc_mags(struct FDMDV *f); +void fdmdv_simulate_channel(float *sig_pwr_av, COMP samples[], int nin, float target_snr); + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/codec2/tags/0.4.1/src/codec2_fifo.h b/codec2/tags/0.4.1/src/codec2_fifo.h new file mode 100644 index 00000000..dc93e157 --- /dev/null +++ b/codec2/tags/0.4.1/src/codec2_fifo.h @@ -0,0 +1,51 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: codec2_fifo.h + AUTHOR......: David Rowe + DATE CREATED: Oct 15 2012 + + A FIFO design useful in gluing the FDMDV modem and codec together in + integrated applications. + + The name codec2_fifo.h is used to make it unique when "make + installed". + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2012 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 . +*/ + +#ifndef __FIFO__ +#define __FIFO__ + +#ifdef __cplusplus +extern "C" { +#endif + +struct FIFO; + +struct FIFO *fifo_create(int nshort); +void fifo_destroy(struct FIFO *fifo); +int fifo_write(struct FIFO *fifo, short data[], int n); +int fifo_read(struct FIFO *fifo, short data[], int n); +int fifo_used(struct FIFO *fifo); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/codec2/tags/0.4.1/src/codec2_fm.h b/codec2/tags/0.4.1/src/codec2_fm.h new file mode 100644 index 00000000..92457ecf --- /dev/null +++ b/codec2/tags/0.4.1/src/codec2_fm.h @@ -0,0 +1,50 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: codec2_fm.h + AUTHOR......: David Rowe + DATE CREATED: February 2015 + + Functions that implement analog FM, see also octave/fm.m. + +\*---------------------------------------------------------------------------*/ + +/* + 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 . +*/ + +#ifndef __CODEC2_FM__ +#define __CODEC2_FM__ + +#include "comp.h" + +struct FM { + float Fs; /* setme: sample rate */ + float fm_max; /* setme: maximum modulation frequency */ + float fd; /* setme: maximum deviation */ + float fc; /* setme: carrier frequency */ + COMP *rx_bb; + COMP rx_bb_filt_prev; + float *rx_dem_mem; + int nsam; + COMP lo_phase; +}; + +struct FM *fm_create(int nsam); +void fm_destroy(struct FM *fm_states); +void fm_demod(struct FM *fm, float rx_out[], float rx[]); + +#endif + diff --git a/codec2/tags/0.4.1/src/codec2_internal.h b/codec2/tags/0.4.1/src/codec2_internal.h new file mode 100644 index 00000000..44ff177f --- /dev/null +++ b/codec2/tags/0.4.1/src/codec2_internal.h @@ -0,0 +1,65 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: codec2_internal.h + AUTHOR......: David Rowe + DATE CREATED: April 16 2012 + + Header file for Codec2 internal states, exposed via this header + file to assist in testing. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2012 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 . +*/ + +#ifndef __CODEC2_INTERNAL__ +#define __CODEC2_INTERNAL__ + +struct CODEC2 { + int mode; + kiss_fft_cfg fft_fwd_cfg; /* forward FFT config */ + float w[M]; /* time domain hamming window */ + COMP W[FFT_ENC]; /* DFT of w[] */ + float Pn[2*N]; /* trapezoidal synthesis window */ + float *bpf_buf; /* buffer for band pass filter */ + float Sn[M]; /* input speech */ + float hpf_states[2]; /* high pass filter states */ + void *nlp; /* pitch predictor states */ + int gray; /* non-zero for gray encoding */ + + kiss_fft_cfg fft_inv_cfg; /* inverse FFT config */ + 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_enc; /* previous frame's pitch estimate */ + MODEL prev_model_dec; /* previous frame's model parameters */ + float prev_lsps_dec[LPC_ORD]; /* previous frame's LSPs */ + float prev_e_dec; /* previous frame's LPC energy */ + + int lpc_pf; /* LPC post filter on */ + int bass_boost; /* LPC post filter bass boost */ + float beta; /* LPC post filter parameters */ + float gamma; + + float xq_enc[2]; /* joint pitch and energy VQ states */ + float xq_dec[2]; + + int smoothing; /* enable smoothing for channels with errors */ + float *softdec; /* optional soft decn bits from demod */ +}; + +#endif diff --git a/codec2/tags/0.4.1/src/cohpsk.c b/codec2/tags/0.4.1/src/cohpsk.c new file mode 100644 index 00000000..25425734 --- /dev/null +++ b/codec2/tags/0.4.1/src/cohpsk.c @@ -0,0 +1,1263 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: cohpsk.c + AUTHOR......: David Rowe + DATE CREATED: March 2015 + + Functions that implement a coherent PSK FDM modem. + +\*---------------------------------------------------------------------------*/ + +/* + 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 . +*/ + +/*---------------------------------------------------------------------------*\ + + INCLUDES + +\*---------------------------------------------------------------------------*/ + +#include +#include +#include +#include +#include + +#include "codec2_cohpsk.h" +#include "cohpsk_defs.h" +#include "cohpsk_internal.h" +#include "fdmdv_internal.h" +#include "pilots_coh.h" +#include "comp_prim.h" +#include "kiss_fft.h" +#include "linreg.h" +#include "rn_coh.h" +#include "test_bits_coh.h" + +static COMP qpsk_mod[] = { + { 1.0, 0.0}, + { 0.0, 1.0}, + { 0.0,-1.0}, + {-1.0, 0.0} +}; + +static int sampling_points[] = {0, 1, 6, 7}; + +void corr_with_pilots(float *corr_out, float *mag_out, struct COHPSK *coh, int t, float f_fine); +void update_ct_symb_buf(COMP ct_symb_buf[][COHPSK_NC*ND], COMP ch_symb[][COHPSK_NC*ND]); + +/*---------------------------------------------------------------------------*\ + + FUNCTIONS + +\*---------------------------------------------------------------------------*/ + + +/*--------------------------------------------------------------------------* \ + + FUNCTION....: cohpsk_create + AUTHOR......: David Rowe + DATE CREATED: Marcg 2015 + + Create and initialise an instance of the modem. Returns a pointer + to the modem states or NULL on failure. One set of states is + sufficient for a full duplex modem. + +\*---------------------------------------------------------------------------*/ + +struct COHPSK *cohpsk_create(void) +{ + struct COHPSK *coh; + struct FDMDV *fdmdv; + int r,c,p,i; + float freq_hz; + + assert(COHPSK_NC == PILOTS_NC); + assert(COHPSK_NOM_SAMPLES_PER_FRAME == (COHPSK_M*NSYMROWPILOT)); + assert(COHPSK_MAX_SAMPLES_PER_FRAME == (COHPSK_M*NSYMROWPILOT+COHPSK_M/P)); + assert(COHPSK_ND == ND); + assert(COHPSK_NSYM == NSYM); /* as we want to use the tx sym mem on fdmdv */ + assert(COHPSK_NT == NT); + + coh = (struct COHPSK*)malloc(sizeof(struct COHPSK)); + if (coh == NULL) + return NULL; + + /* set up buffer of tx pilot symbols for coh demod on rx */ + + for(r=0; r<2*NPILOTSFRAME; ) { + for(p=0; ppilot2[r][c] = pilots_coh[p][c]; + } + } + } + + /* Clear symbol buffer memory */ + + for (r=0; rct_symb_buf[r][c].real = 0.0; + coh->ct_symb_buf[r][c].imag = 0.0; + } + } + + coh->ff_phase.real = 1.0; coh->ff_phase.imag = 0.0; + coh->sync = 0; + coh->frame = 0; + coh->ratio = 0.0; + coh->nin = COHPSK_M; + + /* clear sync window buffer */ + + for (i=0; ich_fdm_frame_buf[i].real = 0.0; + coh->ch_fdm_frame_buf[i].imag = 0.0; + } + + /* set up fdmdv states so we can use those modem functions */ + + fdmdv = fdmdv_create(COHPSK_NC*ND - 1); + fdmdv->fsep = COHPSK_RS*(1.0 + COHPSK_EXCESS_BW); + for(c=0; cphase_tx[c].real = 1.0; + fdmdv->phase_tx[c].imag = 0.0; + + /* note non-linear carrier spacing to help PAPR, works v well in conjunction with CLIP */ + + freq_hz = fdmdv->fsep*( -(COHPSK_NC*ND)/2 - 0.5 + pow(c + 1.0, 0.98) ); + + fdmdv->freq[c].real = cosf(2.0*M_PI*freq_hz/COHPSK_FS); + fdmdv->freq[c].imag = sinf(2.0*M_PI*freq_hz/COHPSK_FS); + fdmdv->freq_pol[c] = 2.0*M_PI*freq_hz/COHPSK_FS; + + //printf("c: %d %f %f\n",c,freq_hz,fdmdv->freq_pol[c]); + for(i=0; irx_filter_memory[c][i].real = 0.0; + coh->rx_filter_memory[c][i].imag = 0.0; + } + } + fdmdv->fbb_rect.real = cosf(2.0*PI*FDMDV_FCENTRE/COHPSK_FS); + fdmdv->fbb_rect.imag = sinf(2.0*PI*FDMDV_FCENTRE/COHPSK_FS); + fdmdv->fbb_pol = 2.0*PI*FDMDV_FCENTRE/COHPSK_FS; + + coh->fdmdv = fdmdv; + + coh->sig_rms = coh->noise_rms = 0.0; + + for(c=0; crx_symb[r][c].real = 0.0; + coh->rx_symb[r][c].imag = 0.0; + } + } + + coh->verbose = 0; + + /* disable optional logging by default */ + + coh->rx_baseband_log = NULL; + coh->rx_baseband_log_col_index = 0; + coh->rx_filt_log = NULL; + coh->rx_filt_log_col_index = 0; + coh->ch_symb_log = NULL; + coh->ch_symb_log_r = 0; + coh->rx_timing_log = NULL; + coh->rx_timing_log_index = 0; + + /* test frames */ + + coh->ptest_bits_coh_tx = coh->ptest_bits_coh_rx = (int*)test_bits_coh; + coh->ptest_bits_coh_end = (int*)test_bits_coh + sizeof(test_bits_coh)/sizeof(int); + + return coh; +} + + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: cohpsk_destroy + AUTHOR......: David Rowe + DATE CREATED: March 2015 + + Destroy an instance of the modem. + +\*---------------------------------------------------------------------------*/ + +void cohpsk_destroy(struct COHPSK *coh) +{ + fdmdv_destroy(coh->fdmdv); + assert(coh != NULL); + free(coh); +} + + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: bits_to_qpsk_symbols() + AUTHOR......: David Rowe + DATE CREATED: March 2015 + + Rate Rs modulator. Maps bits to parallel DQPSK symbols and inserts pilot symbols. + +\*---------------------------------------------------------------------------*/ + +void bits_to_qpsk_symbols(COMP tx_symb[][COHPSK_NC*ND], int tx_bits[], int nbits) +{ + int i, r, c, p_r, data_r, d; + short bits; + + /* check number of bits supplied matchs number of QPSK symbols in the frame */ + + assert((NSYMROW*COHPSK_NC)*2 == nbits); + + /* + Insert two rows of Nc pilots at beginning of data frame. + + Organise QPSK symbols into a NSYMBROWS rows by PILOTS_NC*ND cols matrix, + each column is a carrier, time flows down the cols...... + + Note: the "& 0x1" prevents and non binary tx_bits[] screwing up + our lives. Call me defensive. + + sqrtf(ND) term ensures the same energy/symbol for different + diversity factors. + */ + + r = 0; + for(p_r=0; p_r<2; p_r++) { + for(c=0; cpilot2[p][pc], ct_symb_buf[sampling_points[p]][c]); + } + + linreg(&m, &b, x, y, NPILOTSFRAME+2); + for(r=0; rphi_[r][c] = atan2(yfit.imag, yfit.real); + } + + /* amplitude estimation */ + + mag = 0.0; + for(p=0; pamp_[r][c] = amp_; + } + } + + /* now correct phase of data symbols */ + + for(c=0; cphi_[r][c]); phi_rect.imag = -sinf(coh->phi_[r][c]); + coh->rx_symb[r][c] = cmult(ct_symb_buf[NPILOTSFRAME + r][c], phi_rect); + i = c*NSYMROW + r; + rx_symb_linear[i] = coh->rx_symb[r][c]; + } + } + + /* and finally optional diversity combination, note output is soft decn a "1" is < 0 */ + + for(c=0; crx_symb[r][c]; + for (d=1; drx_symb[r][c + COHPSK_NC*d]); + } + rot = cmult(div_symb, pi_on_4); + i = c*NSYMROW + r; + rx_bits[2*i+1] = rot.real; + rx_bits[2*i] = rot.imag; + } + } + + + /* estimate RMS signal and noise */ + + mag = 0.0; + for(i=0; isig_rms = mag/(NSYMROW*COHPSK_NC*ND); + + sum_x = 0; + sum_xx = 0; + n = 0; + for (i=0; i coh->sig_rms) { + sum_x += s.imag; + sum_xx += s.imag*s.imag; + n++; + } + } + + noise_var = 0; + if (n > 1) { + noise_var = (n*sum_xx - sum_x*sum_x)/(n*(n-1)); + } + coh->noise_rms = sqrtf(noise_var); + +} + + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: tx_filter_and_upconvert_coh() + AUTHOR......: David Rowe + DATE CREATED: May 2015 + + Given NC symbols construct M samples (1 symbol) of NC filtered + and upconverted symbols. + + TODO: work out a way to merge with fdmdv version, e.g. run time define M/NSYM, + and run unittests on fdmdv and cohpsk modem afterwards. + +\*---------------------------------------------------------------------------*/ + +void tx_filter_and_upconvert_coh(COMP tx_fdm[], int Nc, COMP tx_symbols[], + COMP tx_filter_memory[COHPSK_NC*ND][COHPSK_NSYM], + COMP phase_tx[], COMP freq[], + COMP *fbb_phase, COMP fbb_rect) +{ + int c; + int i,j,k; + float acc; + COMP gain; + COMP tx_baseband; + COMP two = {2.0, 0.0}; + float mag; + + gain.real = sqrtf(2.0)/2.0; + gain.imag = 0.0; + + for(i=0; ireal /= mag; + fbb_phase->imag /= mag; + + /* shift memory, inserting zeros at end */ + + for(i=0; ict_symb_buf[t+sampling_points[p]][c]); + pc = c % COHPSK_NC; + acorr = cadd(acorr, fcmult(coh->pilot2[p][pc], f_corr)); + mag += cabsolute(f_corr); + } + corr += cabsolute(acorr); + } + + *corr_out = corr; + *mag_out = mag; +} + + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: frame_sync_fine_freq_est() + AUTHOR......: David Rowe + DATE CREATED: April 2015 + + Returns an estimate of frame sync (coarse timing) offset and fine + frequency offset, advances to next sync state if we have a reliable + match for frame sync. + +\*---------------------------------------------------------------------------*/ + +void frame_sync_fine_freq_est(struct COHPSK *coh, COMP ch_symb[][COHPSK_NC*ND], int sync, int *next_sync) +{ + int t; + float f_fine, mag, max_corr, max_mag, corr; + + update_ct_symb_buf(coh->ct_symb_buf, ch_symb); + + /* sample pilots at start of this frame and start of next frame */ + + if (sync == 0) { + + /* sample correlation over 2D grid of time and fine freq points */ + + max_corr = max_mag = 0; + for (f_fine=-20; f_fine<=20; f_fine+=0.25) { + for (t=0; t= max_corr) { + max_corr = corr; + max_mag = mag; + coh->ct = t; + coh->f_fine_est = f_fine; + } + } + } + + + coh->ff_rect.real = cosf(coh->f_fine_est*2.0*M_PI/COHPSK_RS); + coh->ff_rect.imag = -sinf(coh->f_fine_est*2.0*M_PI/COHPSK_RS); + if (coh->verbose) + fprintf(stderr, " [%d] fine freq f: %6.2f max_ratio: %f ct: %d\n", coh->frame, coh->f_fine_est, max_corr/max_mag, coh->ct); + + if (max_corr/max_mag > 0.9) { + if (coh->verbose) + fprintf(stderr, " [%d] encouraging sync word!\n", coh->frame); + coh->sync_timer = 0; + *next_sync = 1; + } + else { + *next_sync = 0; + } + coh->ratio = max_corr/max_mag; + } +} + + +void update_ct_symb_buf(COMP ct_symb_buf[][COHPSK_NC*ND], COMP ch_symb[][COHPSK_NC*ND]) +{ + int r, c, i; + + /* update memory in symbol buffer */ + + for(r=0; rct, coh->f_fine_est); + coh->ratio = fabsf(corr)/mag; + + // printf("%f\n", cabsolute(corr)/mag); + + if (fabsf(corr)/mag < 0.8) + coh->sync_timer++; + else + coh->sync_timer = 0; + + if (coh->sync_timer == 10) { + if (coh->verbose) + fprintf(stderr," [%d] lost sync ....\n", coh->frame); + next_sync = 0; + } + } + + sync = next_sync; + + return sync; +} + + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: cohpsk_mod() + AUTHOR......: David Rowe + DATE CREATED: 5/4/2015 + + COHPSK modulator, take a frame of COHPSK_BITS_PER_FRAME bits and + generates a frame of COHPSK_NOM_SAMPLES_PER_FRAME modulated symbols. + + The output signal is complex to support single sided frequency + shifting, for example when testing frequency offsets in channel + simulation. + +\*---------------------------------------------------------------------------*/ + +void cohpsk_mod(struct COHPSK *coh, COMP tx_fdm[], int tx_bits[]) +{ + struct FDMDV *fdmdv = coh->fdmdv; + COMP tx_symb[NSYMROWPILOT][COHPSK_NC*ND]; + COMP tx_onesym[COHPSK_NC*ND]; + int r,c; + + bits_to_qpsk_symbols(tx_symb, tx_bits, COHPSK_BITS_PER_FRAME); + + for(r=0; rtx_filter_memory, + fdmdv->phase_tx, fdmdv->freq, &fdmdv->fbb_phase_tx, fdmdv->fbb_rect); + } +} + + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: cohpsk_clip() + AUTHOR......: David Rowe + DATE CREATED: May 2015 + + Hard clips a cohpsk modulator signal to improve PAPR, CLIP threshold + hard coded and will need to be changed if NC*ND does. + +\*---------------------------------------------------------------------------*/ + +void cohpsk_clip(COMP tx_fdm[]) +{ + COMP sam; + float mag; + int i; + + for(i=0; i COHPSK_CLIP) { + sam = fcmult( COHPSK_CLIP/mag, sam); + } + tx_fdm[i] = sam; + } + } + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: fdm_downconvert_coh + AUTHOR......: David Rowe + DATE CREATED: May 2015 + + Frequency shift each modem carrier down to NC baseband signals. + + TODO: try to combine with fdmdv version, carefully re-test fdmdv modem. + +\*---------------------------------------------------------------------------*/ + +void fdm_downconvert_coh(COMP rx_baseband[COHPSK_NC][COHPSK_M+COHPSK_M/P], int Nc, COMP rx_fdm[], COMP phase_rx[], COMP freq[], int nin) +{ + int i,c; + float mag; + + /* maximum number of input samples to demod */ + + assert(nin <= (COHPSK_M+COHPSK_M/P)); + + /* downconvert */ + + for (c=0; creal /= mag; + foff_phase_rect->imag /= mag; +} + + +void rate_Fs_rx_processing(struct COHPSK *coh, COMP ch_symb[][COHPSK_NC*ND], COMP ch_fdm_frame[], float *f_est, int nsymb, int nin, int freq_track) +{ + struct FDMDV *fdmdv = coh->fdmdv; + int r, c, i, ch_fdm_frame_index; + COMP rx_fdm_frame_bb[COHPSK_M+COHPSK_M/P]; + COMP rx_baseband[COHPSK_NC*ND][COHPSK_M+COHPSK_M/P]; + COMP rx_filt[COHPSK_NC*ND][P+1]; + float env[NT*P], rx_timing; + COMP rx_onesym[COHPSK_NC*ND]; + float beta, g; + COMP adiff, amod_strip, mod_strip; + + ch_fdm_frame_index = 0; + rx_timing = 0; + + for (r=0; rfbb_phase_rx, nin); + ch_fdm_frame_index += nin; + fdm_downconvert_coh(rx_baseband, COHPSK_NC*ND, rx_fdm_frame_bb, fdmdv->phase_rx, fdmdv->freq, nin); + rx_filter_coh(rx_filt, COHPSK_NC*ND, rx_baseband, coh->rx_filter_memory, nin); + rx_timing = rx_est_timing(rx_onesym, fdmdv->Nc, rx_filt, fdmdv->rx_filter_mem_timing, env, nin, COHPSK_M); + + for(c=0; cNc+1; c++) { + //printf("rx_onesym[%d] %f %f prev_rx_symbols[%d] %f %f\n", c, rx_onesym[c].real, rx_onesym[c].imag, + // fdmdv->prev_rx_symbols[c].real, fdmdv->prev_rx_symbols[c].imag); + adiff = cmult(rx_onesym[c], cconj(fdmdv->prev_rx_symbols[c])); + fdmdv->prev_rx_symbols[c] = rx_onesym[c]; + + /* 4th power strips QPSK modulation, by multiplying phase by 4 + Using the abs value of the real coord was found to help + non-linear issues when noise power was large. */ + + amod_strip = cmult(adiff, adiff); + amod_strip = cmult(amod_strip, amod_strip); + amod_strip.real = fabsf(amod_strip.real); + mod_strip = cadd(mod_strip, amod_strip); + } + //printf("modstrip: %f %f\n", mod_strip.real, mod_strip.imag); + + /* loop filter made up of 1st order IIR plus integrator. Integerator + was found to be reqd */ + + fdmdv->filt = (1.0-beta)*fdmdv->filt + beta*atan2(mod_strip.imag, mod_strip.real); + //printf("filt: %f angle: %f\n", fdmdv->filt, atan2(mod_strip.imag, mod_strip.real)); + *f_est += g*fdmdv->filt; + } + + /* Optional logging used for testing against Octave version */ + + if (coh->rx_baseband_log) { + assert(nin <= (COHPSK_M+COHPSK_M/P)); + for(c=0; crx_baseband_log[c*coh->rx_baseband_log_col_sz + coh->rx_baseband_log_col_index + i] = rx_baseband[c][i]; + } + } + coh->rx_baseband_log_col_index += nin; + assert(coh->rx_baseband_log_col_index <= coh->rx_baseband_log_col_sz); + } + + if (coh->rx_filt_log) { + for(c=0; crx_filt_log[c*coh->rx_filt_log_col_sz + coh->rx_filt_log_col_index + i] = rx_filt[c][i]; + } + } + coh->rx_filt_log_col_index += nin/(COHPSK_M/P); + } + + if (coh->ch_symb_log) { + for(c=0; cch_symb_log[coh->ch_symb_log_r*COHPSK_NC*ND + c] = ch_symb[r][c]; + } + coh->ch_symb_log_r++; + } + + if (coh->rx_timing_log) { + coh->rx_timing_log[coh->rx_timing_log_index] = rx_timing; + coh->rx_timing_log_index++; + //printf("rx_timing_log_index: %d\n", coh->rx_timing_log_index); + } + + /* we only allow a timing shift on one symbol per frame */ + + if (nin != COHPSK_M) + nin = COHPSK_M; + } + + coh->rx_timing = rx_timing; +} + + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: cohpsk_demod() + AUTHOR......: David Rowe + DATE CREATED: 5/4/2015 + + COHPSK demodulator, takes an array of (nominally) nin_frame = + COHPSK_NOM_SAMPLES_PER_FRAME modulated samples, returns an array of + COHPSK_BITS_PER_FRAME bits. + + The input signal is complex to support single sided frequency shifting + before the demod input (e.g. click to tune feature). + +\*---------------------------------------------------------------------------*/ + +void cohpsk_demod(struct COHPSK *coh, float rx_bits[], int *sync_good, COMP rx_fdm[], int *nin_frame) +{ + COMP ch_symb[NSW*NSYMROWPILOT][COHPSK_NC*ND]; + int i, j, sync, anext_sync, next_sync, nin, r, c; + float max_ratio, f_est; + + assert(*nin_frame <= COHPSK_MAX_SAMPLES_PER_FRAME); + + next_sync = sync = coh->sync; + + for (i=0; ich_fdm_frame_buf[i] = coh->ch_fdm_frame_buf[i+*nin_frame]; + //printf("nin_frame: %d i: %d i+nin_frame: %d\n", *nin_frame, i, i+*nin_frame); + for (j=0; ich_fdm_frame_buf[i] = rx_fdm[j]; + //printf("i: %d j: %d rx_fdm[0]: %f %f\n", i,j, rx_fdm[0].real, rx_fdm[0].imag); + + /* if out of sync do Initial Freq offset estimation using NSW frames to flush out filter memories */ + + if (sync == 0) { + + /* we can test +/- 20Hz, so we break this up into 3 tests to cover +/- 60Hz */ + + max_ratio = 0.0; + f_est = 0.0; + for (coh->f_est = FDMDV_FCENTRE-40.0; coh->f_est <= FDMDV_FCENTRE+40.0; coh->f_est += 40.0) { + + if (coh->verbose) + fprintf(stderr, " [%d] acohpsk.f_est: %f +/- 20\n", coh->frame, coh->f_est); + + /* we are out of sync so reset f_est and process two frames to clean out memories */ + + rate_Fs_rx_processing(coh, ch_symb, coh->ch_fdm_frame_buf, &coh->f_est, NSW*NSYMROWPILOT, COHPSK_M, 0); + for (i=0; ict_symb_buf, &ch_symb[i*NSYMROWPILOT]); + } + frame_sync_fine_freq_est(coh, &ch_symb[(NSW-1)*NSYMROWPILOT], sync, &anext_sync); + + if (anext_sync == 1) { + //printf(" [%d] acohpsk.ratio: %f\n", f, coh->ratio); + if (coh->ratio > max_ratio) { + max_ratio = coh->ratio; + f_est = coh->f_est - coh->f_fine_est; + next_sync = anext_sync; + } + } + } + + if (next_sync == 1) { + + /* we've found a sync candidate! + re-process last NSW frames with adjusted f_est then check again */ + + coh->f_est = f_est; + + if (coh->verbose) + fprintf(stderr, " [%d] trying sync and f_est: %f\n", coh->frame, coh->f_est); + + rate_Fs_rx_processing(coh, ch_symb, coh->ch_fdm_frame_buf, &coh->f_est, NSW*NSYMROWPILOT, COHPSK_M, 0); + for (i=0; ict_symb_buf, &ch_symb[i*NSYMROWPILOT]); + } + /* + for(i=0; ict_symb_buf[i][0].real, coh->ct_symb_buf[i][0].imag); + } + */ + frame_sync_fine_freq_est(coh, &ch_symb[(NSW-1)*NSYMROWPILOT], sync, &next_sync); + + if (fabs(coh->f_fine_est) > 2.0) { + if (coh->verbose) + fprintf(stderr, " [%d] Hmm %f is a bit big :(\n", coh->frame, coh->f_fine_est); + next_sync = 0; + } + } + + if (next_sync == 1) { + /* OK we are in sync! + demodulate first frame (demod completed below) */ + + if (coh->verbose) + fprintf(stderr, " [%d] in sync! f_est: %f ratio: %f \n", coh->frame, coh->f_est, coh->ratio); + for(r=0; rct_symb_ff_buf[r][c] = coh->ct_symb_buf[coh->ct+r][c]; + } + } + + /* If in sync just do sample rate processing on latest frame */ + + if (sync == 1) { + rate_Fs_rx_processing(coh, ch_symb, rx_fdm, &coh->f_est, NSYMROWPILOT, coh->nin, 1); + frame_sync_fine_freq_est(coh, ch_symb, sync, &next_sync); + + for(r=0; r<2; r++) + for(c=0; cct_symb_ff_buf[r][c] = coh->ct_symb_ff_buf[r+NSYMROWPILOT][c]; + for(; rct_symb_ff_buf[r][c] = coh->ct_symb_buf[coh->ct+r][c]; + } + + /* if we are in sync complete demodulation with symbol rate processing */ + + *sync_good = 0; + if ((next_sync == 1) || (sync == 1)) { + qpsk_symbols_to_bits(coh, rx_bits, coh->ct_symb_ff_buf); + *sync_good = 1; + } + + sync = sync_state_machine(coh, sync, next_sync); + coh->sync = sync; + + /* work out how many samples we need for the next call to account + for differences in tx and rx sample clocks */ + + nin = COHPSK_M; + if (sync == 1) { + if (coh->rx_timing > COHPSK_M/P) + nin = COHPSK_M + COHPSK_M/P; + if (coh->rx_timing < -COHPSK_M/P) + nin = COHPSK_M - COHPSK_M/P; + } + coh->nin = nin; + *nin_frame = (NSYMROWPILOT-1)*COHPSK_M + nin; + //if (coh->verbose) + // fprintf(stderr, "%f %d %d\n", coh->rx_timing, nin, *nin_frame); +} + + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: cohpsk_fs_offset() + AUTHOR......: David Rowe + DATE CREATED: May 2015 + + Simulates small Fs offset between mod and demod. + +\*---------------------------------------------------------------------------*/ + +int cohpsk_fs_offset(COMP out[], COMP in[], int n, float sample_rate_ppm) +{ + double tin, f; + int tout, t1, t2; + + tin = 0.0; tout = 0; + while (tin < n) { + t1 = floor(tin); + t2 = ceil(tin); + f = tin - t1; + out[tout].real = (1.0-f)*in[t1].real + f*in[t2].real; + out[tout].imag = (1.0-f)*in[t1].imag + f*in[t2].imag; + tout += 1; + tin += 1.0 + sample_rate_ppm/1E6; + //printf("tin: %f tout: %d f: %f\n", tin, tout, f); + } + + return tout; +} + + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: cohpsk_get_demod_stats() + AUTHOR......: David Rowe + DATE CREATED: 14 June 2015 + + Fills stats structure with a bunch of demod information. + +\*---------------------------------------------------------------------------*/ + +void cohpsk_get_demod_stats(struct COHPSK *coh, struct MODEM_STATS *stats) +{ + int c,r; + COMP pi_4; + float new_snr_est; + + pi_4.real = cosf(M_PI/4.0); + pi_4.imag = sinf(M_PI/4.0); + + stats->Nc = COHPSK_NC*ND; + assert(stats->Nc <= MODEM_STATS_NC_MAX); + new_snr_est = 20*log10((coh->sig_rms+1E-6)/(coh->noise_rms+1E-6)) - 10*log10(3000.0/700.0); + stats->snr_est = 0.9*stats->snr_est + 0.1*new_snr_est; + + //fprintf(stderr, "sig_rms: %f noise_rms: %f snr_est: %f\n", coh->sig_rms, coh->noise_rms, stats->snr_est); + stats->sync = coh->sync; + stats->foff = coh->f_est - FDMDV_FCENTRE; + stats->rx_timing = coh->rx_timing; + stats->clock_offset = 0.0; /* TODO - implement clock offset estimation */ + + assert(NSYMROW <= MODEM_STATS_NR_MAX); + stats->nr = NSYMROW; + for(c=0; crx_symbols[r][c] = cmult(coh->rx_symb[r][c], pi_4); + } + } +} + + +void cohpsk_set_verbose(struct COHPSK *coh, int verbose) +{ + assert(coh != NULL); + coh->verbose = verbose; +} + + +void cohpsk_set_frame(struct COHPSK *coh, int frame) +{ + assert(coh != NULL); + coh->frame = frame; +} + + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: cohpsk_get_test_bits() + AUTHOR......: David Rowe + DATE CREATED: June 2015 + + Returns a frame of known test bits. + +\*---------------------------------------------------------------------------*/ + +void cohpsk_get_test_bits(struct COHPSK *coh, int rx_bits[]) +{ + memcpy(rx_bits, coh->ptest_bits_coh_tx, sizeof(int)*COHPSK_BITS_PER_FRAME); + coh->ptest_bits_coh_tx += COHPSK_BITS_PER_FRAME; + if (coh->ptest_bits_coh_tx >=coh->ptest_bits_coh_end) { + coh->ptest_bits_coh_tx = (int*)test_bits_coh; + } +} + + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: cohpsk_put_test_bits() + AUTHOR......: David Rowe + DATE CREATED: June 2015 + + Accepts bits from demod and attempts to sync with the known + test_bits sequence. When synced measures bit errors. + +\*---------------------------------------------------------------------------*/ + +void cohpsk_put_test_bits(struct COHPSK *coh, int *state, short error_pattern[], + int *bit_errors, float rx_bits_sd[]) +{ + int i, next_state, anerror; + int rx_bits[COHPSK_BITS_PER_FRAME]; + + for(i=0; iptest_bits_coh_rx[i]; + if ((anerror < 0) || (anerror > 1)) { + fprintf(stderr, "i: %d rx_bits: %d ptest_bits_coh_rx: %d\n", i, rx_bits[i], coh->ptest_bits_coh_rx[i]); + } + *bit_errors += anerror; + error_pattern[i] = anerror; + } + + /* state logic */ + + next_state = *state; + + if (*state == 0) { + if (*bit_errors < 4) { + next_state = 1; + coh->ptest_bits_coh_rx += COHPSK_BITS_PER_FRAME; + if (coh->ptest_bits_coh_rx >= coh->ptest_bits_coh_end) { + coh->ptest_bits_coh_rx = (int*)test_bits_coh; + } + } + } + + /* if 5 frames with large BER reset test frame sync */ + + if (*state > 0) { + if (*bit_errors > 8) { + if (*state == 6) + next_state = 0; + else + next_state = *state+1; + } + else + next_state = 1; + } + + if (*state > 0) { + coh->ptest_bits_coh_rx += COHPSK_BITS_PER_FRAME; + if (coh->ptest_bits_coh_rx >= coh->ptest_bits_coh_end) { + coh->ptest_bits_coh_rx = (int*)test_bits_coh; + } + } + + //fprintf(stderr, "state: %d next_state: %d bit_errors: %d\n", *state, next_state, *bit_errors); + + *state = next_state; +} + +int cohpsk_error_pattern_size(void) { + return COHPSK_BITS_PER_FRAME; +} + + diff --git a/codec2/tags/0.4.1/src/cohpsk_ch.c b/codec2/tags/0.4.1/src/cohpsk_ch.c new file mode 100644 index 00000000..c263639d --- /dev/null +++ b/codec2/tags/0.4.1/src/cohpsk_ch.c @@ -0,0 +1,339 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: cohpsk_ch.c + AUTHOR......: David Rowe + DATE CREATED: May 2015 + + Channel impairment program for testing command line versions of + cohpsk modem. + + TODO: + [ ] measure and prints pwrs to check, prints warning + [ ] SNR in 3000Hz input + [ ] example operation with sox for sample rate change + [ ] way to calibrate for different input pwrs + [ ] HT to do real->complex + [ ] check no BER hit just through HT + [ ] unit test HT + [ ] clipping detect + +\*---------------------------------------------------------------------------*/ + +/* + 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, 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 . +*/ + +#include +#include +#include +#include +#include +#include + +#include "codec2_cohpsk.h" +#include "comp_prim.h" +#include "noise_samples.h" +#include "ht_coeff.h" +#include "ssbfilt_coeff.h" +#include "codec2_fdmdv.h" + +#define BUF_N 160 +#define FAST_FADING_DELAY_MS 2.0 +#define SLOW_FADING_DELAY_MS 0.5 +#define PAPR_TARGET 7.0 + +/* This file gets generated using the function write_noise_file in tcohpsk.m. You have to run + tcohpsk first (any variant) to load the function into Octave, e.g.: + + octave:17> tcohpsk + octave:18> write_noise_file("../raw/fading_samples.float", 7500, 7500*60) +*/ + +#define FAST_FADING_FILE_NAME "../../raw/fast_fading_samples.float" +#define SLOW_FADING_FILE_NAME "../../raw/slow_fading_samples.float" + +int main(int argc, char *argv[]) +{ + FILE *fin, *ffading, *fout; + float NodB, foff_hz; + int fading_en, nhfdelay; + + short buf[BUF_N]; + float htbuf[HT_N+BUF_N]; + COMP ch_in[BUF_N]; + COMP ch_fdm[BUF_N]; + float ssbfiltbuf[SSBFILT_N+BUF_N]; + float ssbfiltout[BUF_N]; + + COMP phase_ch; + int noise_r, noise_end; + float No, variance; + COMP scaled_noise; + float hf_gain; + COMP *ch_fdm_delay, aspread, aspread_2ms, delayed, direct; + float tx_pwr, tx_pwr_fade, noise_pwr; + int frames, i, j, k, ret, clipped; + float sam, peak, inclip, papr, CNo, snr3k, EbNo700; + + if (argc == 7) { + if (strcmp(argv[1], "-") == 0) fin = stdin; + else if ( (fin = fopen(argv[1],"rb")) == NULL ) { + fprintf(stderr, "Error opening input modem raw 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 modem raw file: %s: %s.\n", + argv[2], strerror(errno)); + exit(1); + } + + NodB = atof(argv[3]); + foff_hz = atof(argv[4]); + fading_en = atoi(argv[5]); + inclip = atof(argv[6]); + } + else { + fprintf(stderr, "usage: %s InputRealModemRawFileFs7500Hz OutputRealModemRawFileFs7500Hz No(dB/Hz) FoffHz Fading[0-none 1-fast 2-slow] InputClip0to1\n", argv[0]); + exit(1); + } + fprintf(stderr, "NodB: %4.2f foff: %4.2f Hz fading: %d inclip: %4.2f\n", NodB, foff_hz, fading_en, inclip); + + phase_ch.real = 1.0; phase_ch.imag = 0.0; + noise_r = 0; + noise_end = sizeof(noise)/sizeof(COMP); + + /* N = var = NoFs */ + + No = pow(10.0, NodB/10.0); + variance = COHPSK_FS*No; + + tx_pwr = tx_pwr_fade = noise_pwr = 0.0; + clipped = 0; + peak = 0.0; + + /* init HF fading model */ + + if (fading_en) { + if (fading_en == 1) { + ffading = fopen(FAST_FADING_FILE_NAME, "rb"); + if (ffading == NULL) { + printf("Can't find fast fading file: %s\n", FAST_FADING_FILE_NAME); + exit(1); + } + nhfdelay = floor(FAST_FADING_DELAY_MS*COHPSK_FS/1000); + } + + if (fading_en == 2) { + ffading = fopen(SLOW_FADING_FILE_NAME, "rb"); + if (ffading == NULL) { + printf("Can't find slow fading file: %s\n", SLOW_FADING_FILE_NAME); + exit(1); + } + nhfdelay = floor(SLOW_FADING_DELAY_MS*COHPSK_FS/1000); + } + + ch_fdm_delay = (COMP*)malloc((nhfdelay+COHPSK_NOM_SAMPLES_PER_FRAME)*sizeof(COMP)); + assert(ch_fdm_delay != NULL); + for(i=0; i inclip*32767.0) + sam = inclip*32767.0; + if (sam < -inclip*32767.0) + sam = -inclip*32767.0; + //printf("sam: %f\n", sam); + htbuf[j] = sam/FDMDV_SCALE; + + if (fabs(htbuf[j]) > peak) { + peak = fabs(htbuf[j]); + } + tx_pwr += pow(htbuf[j], 2.0); + + /* FIR filter with HT to get imag, just delay to get real */ + + ch_in[i].real = 0.0; + ch_in[i].imag = 0.0; + for(k=0; k noise_end) { + noise_r = 0; + //fprintf(stderr, " [%d] noise wrap\n", f); + } + } + + /* FIR filter to simulate (a rather flat) SSB filter. Might + be useful to have an option for a filter with a few dB + ripple too, to screw up the modem. This is mainly so analog + SSB sounds realistic. */ + + for(i=0, j=SSBFILT_N; i 32767.0) { + clipped++; + sam = 32767.0; + } + if (sam < -32767.0) { + clipped++; + sam = -32767.0; + } + buf[i] = sam; + } + + fwrite(buf, sizeof(short), BUF_N, fout); + + /* if this is in a pipeline, we probably don't want the usual + buffering to occur */ + + if (fout == stdout) fflush(stdout); + if (fin == stdin) fflush(stdin); + } + + fclose(fin); + fclose(fout); + + fprintf(stderr, "peak pwr.....: %7.2f\nav input pwr.: %7.2f\nav pwr fading: %7.2f\nnoise pwr....: %7.2f\nclipping.....: %7.2f %%\n", + peak*peak, + tx_pwr/(frames*BUF_N), + tx_pwr_fade/(frames*BUF_N), + noise_pwr/(frames*BUF_N), + 100.0*clipped/frames + ); + papr = 10*log10(peak*peak/(tx_pwr/(frames*BUF_N))); + CNo = 10*log10(tx_pwr/(noise_pwr/(COHPSK_FS/2))); // single sided spctrum magic IDFK! + snr3k = CNo - 10*log10(3000); + EbNo700 = CNo - 10*log10(700) - 10*log10(6.0/4.0); // divide by bit rate and pilot overhead + fprintf(stderr, "PAPR (dB)....: %7.2f (target %3.2f)\nC/No (dB)....: %7.2f\nSNR3k........: %7.2f\nEb/No(Rb=700): %7.2f\n", + papr, + PAPR_TARGET, + CNo, + snr3k, + EbNo700 + ); + + return 0; +} + diff --git a/codec2/tags/0.4.1/src/cohpsk_defs.h b/codec2/tags/0.4.1/src/cohpsk_defs.h new file mode 100644 index 00000000..a03bfe79 --- /dev/null +++ b/codec2/tags/0.4.1/src/cohpsk_defs.h @@ -0,0 +1,9 @@ +/* Generated by write_pilot_file() Octave function */ + +#define NSYMROW 4 /* number of data symbols on each row (i.e. each carrier) */ +#define NS 4 /* number of data symbols between pilots */ +#define NPILOTSFRAME 2 /* number of pilot symbols on each row */ +#define PILOTS_NC 7 /* number of carriers */ + +#define NSYMROWPILOT 6 /* length of row after pilots inserted */ + diff --git a/codec2/tags/0.4.1/src/cohpsk_demod.c b/codec2/tags/0.4.1/src/cohpsk_demod.c new file mode 100644 index 00000000..fcac69d2 --- /dev/null +++ b/codec2/tags/0.4.1/src/cohpsk_demod.c @@ -0,0 +1,169 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: cohpsk_demod.c + AUTHOR......: David Rowe + DATE CREATED: April 6 2015 + + Given an input file of raw file (8kHz, 16 bit shorts) of COHPSK modem samples, + outputs a file of bits (note one bit per int, not compressed). + +\*---------------------------------------------------------------------------*/ + +/* + 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, 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 . +*/ + +#include +#include +#include +#include +#include +#include + +#include "codec2_cohpsk.h" +#include "cohpsk_defs.h" +#include "cohpsk_internal.h" +#include "codec2_fdmdv.h" +#include "octave.h" + +#define LOG_FRAMES 100 +#define SYNC_FRAMES 12 /* sync state uses up extra log storage as we reprocess several times */ + +int main(int argc, char *argv[]) +{ + FILE *fin, *fout, *foct; + struct COHPSK *cohpsk; + float rx_bits[COHPSK_BITS_PER_FRAME]; + COMP rx_fdm[COHPSK_MAX_SAMPLES_PER_FRAME]; + short rx_fdm_scaled[COHPSK_MAX_SAMPLES_PER_FRAME]; + int frames, sync, nin_frame; + float *rx_amp_log; + float *rx_phi_log; + COMP *rx_symb_log; + float f_est_log[LOG_FRAMES], ratio_log[LOG_FRAMES]; + int i, r, c, log_data_r, oct, logframes; + + if (argc < 3) { + printf("usage: %s InputModemRawFile OutputOneBitPerIntFile [OctaveLogFile]\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 modem sample 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); + } + + foct = NULL; + oct = 0; + if (argc == 4) { + if ( (foct = fopen(argv[3],"wt")) == NULL ) { + fprintf(stderr, "Error opening output Octave file: %s: %s.\n", + argv[3], strerror(errno)); + exit(1); + } + oct = 1; + } + + cohpsk = cohpsk_create(); + cohpsk_set_verbose(cohpsk, 1); + + if (oct) { + logframes = LOG_FRAMES; + rx_amp_log = (float *)malloc(sizeof(float)*logframes*NSYMROW*COHPSK_NC*ND); + assert(rx_amp_log != NULL); + rx_phi_log = (float *)malloc(sizeof(float)*logframes*NSYMROW*COHPSK_NC*ND); + assert(rx_phi_log != NULL); + rx_symb_log = (COMP *)malloc(sizeof(COMP)*logframes*NSYMROW*COHPSK_NC*ND); + assert(rx_symb_log != NULL); + cohpsk->rx_timing_log = (float*)malloc(sizeof(float)*SYNC_FRAMES*logframes*NSYMROWPILOT); + assert(cohpsk->rx_timing_log != NULL); + } + + log_data_r = 0; + frames = 0; + + nin_frame = COHPSK_NOM_SAMPLES_PER_FRAME; + while(fread(rx_fdm_scaled, sizeof(short), nin_frame, fin) == nin_frame) { + frames++; + cohpsk_set_frame(cohpsk, frames); + + /* scale and demod */ + + for(i=0; iamp_[r][c]; + rx_phi_log[log_data_r*COHPSK_NC*ND+c] = cohpsk->phi_[r][c]; + rx_symb_log[log_data_r*COHPSK_NC*ND+c] = cohpsk->rx_symb[r][c]; + } + } + + f_est_log[frames-1] = cohpsk->f_est; + ratio_log[frames-1] = cohpsk->ratio; + //fprintf(stderr,"ratio: %f\n", cohpsk->ratio); + + //printf("frames: %d log_data_r: %d\n", frames, log_data_r); + if (frames == logframes) + oct = 0; + } + } + + /* if this is in a pipeline, we probably don't want the usual + buffering to occur */ + + if (fout == stdout) fflush(stdout); + if (fin == stdin) fflush(stdin); + } + + fclose(fin); + fclose(fout); + + /* optionally dump Octave files */ + + if (foct != NULL) { + octave_save_float(foct, "rx_amp_log_c", (float*)rx_amp_log, log_data_r, COHPSK_NC*ND, COHPSK_NC*ND); + octave_save_float(foct, "rx_phi_log_c", (float*)rx_phi_log, log_data_r, COHPSK_NC*ND, COHPSK_NC*ND); + octave_save_complex(foct, "rx_symb_log_c", (COMP*)rx_symb_log, log_data_r, COHPSK_NC*ND, COHPSK_NC*ND); + octave_save_float(foct, "rx_timing_log_c", (float*)cohpsk->rx_timing_log, 1, cohpsk->rx_timing_log_index, cohpsk->rx_timing_log_index); + octave_save_float(foct, "f_est_log_c", f_est_log, 1, logframes, logframes); + octave_save_float(foct, "ratio_log_c", ratio_log, 1, logframes, logframes); + fclose(foct); + } + + cohpsk_destroy(cohpsk); + + + return 0; +} diff --git a/codec2/tags/0.4.1/src/cohpsk_get_test_bits.c b/codec2/tags/0.4.1/src/cohpsk_get_test_bits.c new file mode 100644 index 00000000..ed4f5473 --- /dev/null +++ b/codec2/tags/0.4.1/src/cohpsk_get_test_bits.c @@ -0,0 +1,87 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: cohpsk_put_test_bits.c + AUTHOR......: David Rowe + DATE CREATED: April 2015 + + Generates a file of test bits, useful for input to cohpsk_mod. + +\*---------------------------------------------------------------------------*/ + + +/* + 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, 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 . +*/ + +#include +#include +#include +#include +#include +#include + +#include "codec2_cohpsk.h" +#include "test_bits_coh.h" + +int main(int argc, char *argv[]) +{ + FILE *fout; + int tx_bits[COHPSK_BITS_PER_FRAME]; + float sd_tx_bits[COHPSK_BITS_PER_FRAME]; + int numBits, nFrames, n; + int *ptest_bits_coh, *ptest_bits_coh_end, i; + + if (argc < 2) { + printf("usage: %s OutputOneFloatPerBitFile numBits\n", argv[0]); + exit(1); + } + + if (strcmp(argv[1], "-") == 0) fout = stdout; + else if ( (fout = fopen(argv[1],"wb")) == NULL ) { + fprintf(stderr, "Error opening output file: %s: %s.\n", + argv[1], strerror(errno)); + exit(1); + } + + ptest_bits_coh = (int*)test_bits_coh; + ptest_bits_coh_end = (int*)test_bits_coh + sizeof(test_bits_coh)/sizeof(int); + numBits = atoi(argv[2]); + nFrames = numBits/COHPSK_BITS_PER_FRAME; + + for(n=0; n= ptest_bits_coh_end) { + ptest_bits_coh = (int*)test_bits_coh; + } + + for(i=0; i. +*/ + +#ifndef __COHPSK_INTERNAL__ +#define __COHPSK_INTERNAL__ + +#define NCT_SYMB_BUF (2*NSYMROWPILOT+2) +#define ND 2 /* diversity factor ND 1 is no diveristy, ND we have orginal plus + one copy */ +#define NSW 4 /* number of sync window frames */ +#define COHPSK_ND 2 /* diversity factor */ +#define COHPSK_M 100 /* oversampling rate */ +#define COHPSK_NSYM 6 +#define COHPSK_NFILTER (COHPSK_NSYM*COHPSK_M) +#define COHPSK_EXCESS_BW 0.5 /* excess BW factor of root nyq filter */ +#define COHPSK_NT 5 /* number of symbols we estimate timing over */ +#define COHPSK_CLIP 6.5 /* hard clipping for Nc*Nc=14 to reduce PAPR */ + +#include "fdmdv_internal.h" +#include "kiss_fft.h" + +struct COHPSK { + COMP ch_fdm_frame_buf[NSW*NSYMROWPILOT*COHPSK_M]; /* buffer of several frames of symbols from channel */ + float pilot2[2*NPILOTSFRAME][COHPSK_NC]; + float phi_[NSYMROW][COHPSK_NC*ND]; /* phase estimates for this frame of rx data symbols */ + float amp_[NSYMROW][COHPSK_NC*ND]; /* amplitude estimates for this frame of rx data symbols */ + COMP rx_symb[NSYMROW][COHPSK_NC*ND]; /* demodulated symbols */ + float f_est; + COMP rx_filter_memory[COHPSK_NC*ND][COHPSK_NFILTER]; + COMP ct_symb_buf[NCT_SYMB_BUF][COHPSK_NC*ND]; + int ct; /* coarse timing offset in symbols */ + float rx_timing; /* fine timing for last symbol in frame */ + int nin; /* number of samples to input for next symbol */ + float f_fine_est; + COMP ff_rect; + COMP ff_phase; + COMP ct_symb_ff_buf[NSYMROWPILOT+2][COHPSK_NC*ND]; + int sync; + int sync_timer; + + int frame; + float ratio; + + float sig_rms; + float noise_rms; + + struct FDMDV *fdmdv; + + int verbose; + + int *ptest_bits_coh_tx; + int *ptest_bits_coh_rx; + int *ptest_bits_coh_end; + + /* optional log variables used for testing Octave to C port */ + + COMP *rx_baseband_log; + int rx_baseband_log_col_index; + int rx_baseband_log_col_sz; + + COMP *rx_filt_log; + int rx_filt_log_col_index; + int rx_filt_log_col_sz; + + COMP *ch_symb_log; + int ch_symb_log_r; + int ch_symb_log_col_sz; + + float *rx_timing_log; + int rx_timing_log_index; +}; + +void bits_to_qpsk_symbols(COMP tx_symb[][COHPSK_NC*COHPSK_ND], int tx_bits[], int nbits); +void qpsk_symbols_to_bits(struct COHPSK *coh, float rx_bits[], COMP ct_symb_buf[][COHPSK_NC*COHPSK_ND]); +void tx_filter_and_upconvert_coh(COMP tx_fdm[], int Nc, COMP tx_symbols[], + COMP tx_filter_memory[COHPSK_NC][COHPSK_NSYM], + COMP phase_tx[], COMP freq[], + COMP *fbb_phase, COMP fbb_rect); +void fdm_downconvert_coh(COMP rx_baseband[COHPSK_NC][COHPSK_M+COHPSK_M/P], int Nc, COMP rx_fdm[], COMP phase_rx[], COMP freq[], int nin); +void rx_filter_coh(COMP rx_filt[COHPSK_NC+1][P+1], int Nc, COMP rx_baseband[COHPSK_NC+1][COHPSK_M+COHPSK_M/P], COMP rx_filter_memory[COHPSK_NC+1][COHPSK_NFILTER], int nin); +void frame_sync_fine_freq_est(struct COHPSK *coh, COMP ch_symb[][COHPSK_NC*COHPSK_ND], int sync, int *next_sync); +void fine_freq_correct(struct COHPSK *coh, int sync, int next_sync); +int sync_state_machine(struct COHPSK *coh, int sync, int next_sync); +int cohpsk_fs_offset(COMP out[], COMP in[], int n, float sample_rate_ppm); + +#endif diff --git a/codec2/tags/0.4.1/src/cohpsk_mod.c b/codec2/tags/0.4.1/src/cohpsk_mod.c new file mode 100644 index 00000000..3678d273 --- /dev/null +++ b/codec2/tags/0.4.1/src/cohpsk_mod.c @@ -0,0 +1,101 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: cohpsk_mod.c + AUTHOR......: David Rowe + DATE CREATED: April 5 2015 + + Given an input file of bits (note one bit per float, soft decision format), + outputs a raw file (8kHz, 16 bit shorts) of COHPSK modem samples + ready to send over a HF radio channel. + +\*---------------------------------------------------------------------------*/ + +/* + 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, 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 . +*/ + +#include +#include +#include +#include +#include +#include + +#include "codec2_cohpsk.h" +#include "codec2_fdmdv.h" + +int main(int argc, char *argv[]) +{ + FILE *fin, *fout; + struct COHPSK *cohpsk; + float tx_bits_sd[COHPSK_BITS_PER_FRAME]; + int tx_bits[COHPSK_BITS_PER_FRAME]; + COMP tx_fdm[COHPSK_NOM_SAMPLES_PER_FRAME]; + short tx_fdm_scaled[COHPSK_NOM_SAMPLES_PER_FRAME]; + int frames; + int i; + + if (argc < 3) { + printf("usage: %s InputOneFloatPerBitFile OutputModemRawFile\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 modem sample file: %s: %s.\n", + argv[2], strerror(errno)); + exit(1); + } + + cohpsk = cohpsk_create(); + + frames = 0; + + while(fread(tx_bits_sd, sizeof(float), COHPSK_BITS_PER_FRAME, fin) == COHPSK_BITS_PER_FRAME) { + frames++; + + for(i=0; i. +*/ + +#include +#include +#include +#include +#include +#include + +#include "codec2_cohpsk.h" +#include "octave.h" + +#define LOG_FRAMES 100 + +int main(int argc, char *argv[]) +{ + FILE *fin, *foct; + float rx_bits_sd[COHPSK_BITS_PER_FRAME]; + int state, i, nbits, bit_errors, nerrors; + short error_pattern[COHPSK_BITS_PER_FRAME]; + int error_positions_hist[COHPSK_BITS_PER_FRAME], logframes; + int nerr_log[LOG_FRAMES]; + struct COHPSK *coh; + + for(i=0; i. +*/ + +#ifndef __COMP__ +#define __COMP__ + +/* Complex number */ + +typedef struct { + float real; + float imag; +} COMP; + +#endif diff --git a/codec2/tags/0.4.1/src/comp_prim.h b/codec2/tags/0.4.1/src/comp_prim.h new file mode 100644 index 00000000..41fe8178 --- /dev/null +++ b/codec2/tags/0.4.1/src/comp_prim.h @@ -0,0 +1,92 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: comp_prim.h + AUTHOR......: David Rowe + DATE CREATED: Marh 2015 + + Complex number maths primitives. + +\*---------------------------------------------------------------------------*/ + +/* + 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 . +*/ + +#ifndef __COMP_PRIM__ +#define __COMP_PRIM__ + +/*---------------------------------------------------------------------------*\ + + FUNCTIONS + +\*---------------------------------------------------------------------------*/ + +inline static COMP cneg(COMP a) +{ + COMP res; + + res.real = -a.real; + res.imag = -a.imag; + + return res; +} + +inline static COMP cconj(COMP a) +{ + COMP res; + + res.real = a.real; + res.imag = -a.imag; + + return res; +} + +inline static COMP cmult(COMP a, COMP b) +{ + COMP res; + + res.real = a.real*b.real - a.imag*b.imag; + res.imag = a.real*b.imag + a.imag*b.real; + + return res; +} + +inline static COMP fcmult(float a, COMP b) +{ + COMP res; + + res.real = a*b.real; + res.imag = a*b.imag; + + return res; +} + +inline static COMP cadd(COMP a, COMP b) +{ + COMP res; + + res.real = a.real + b.real; + res.imag = a.imag + b.imag; + + return res; +} + +inline static float cabsolute(COMP a) +{ + return sqrtf(powf(a.real, 2.0) + powf(a.imag, 2.0)); +} + +#endif diff --git a/codec2/tags/0.4.1/src/defines.h b/codec2/tags/0.4.1/src/defines.h new file mode 100644 index 00000000..5275ad7f --- /dev/null +++ b/codec2/tags/0.4.1/src/defines.h @@ -0,0 +1,96 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: defines.h + AUTHOR......: David Rowe + DATE CREATED: 23/4/93 + + Defines and structures used throughout the codec. + +\*---------------------------------------------------------------------------*/ + +/* + 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 . +*/ + +#ifndef __DEFINES__ +#define __DEFINES__ + +/*---------------------------------------------------------------------------*\ + + DEFINES + +\*---------------------------------------------------------------------------*/ + +/* General defines */ + +#define N 80 /* number of samples per frame */ +#define MAX_AMP 80 /* maximum number of harmonics */ +#define PI 3.141592654 /* mathematical constant */ +#define TWO_PI 6.283185307 /* mathematical constant */ +#define FS 8000 /* sample rate in Hz */ +#define MAX_STR 256 /* maximum string size */ + +#define NW 279 /* analysis window size */ +#define FFT_ENC 512 /* size of FFT used for encoder */ +#define FFT_DEC 512 /* size of FFT used in decoder */ +#define TW 40 /* Trapezoidal synthesis window overlap */ +#define V_THRESH 6.0 /* voicing threshold in dB */ +#define LPC_ORD 10 /* LPC order */ +#define LPC_ORD_LOW 6 /* LPC order for lower rates */ + +/* Pitch estimation defines */ + +#define M 320 /* pitch analysis frame size */ +#define P_MIN 20 /* minimum pitch */ +#define P_MAX 160 /* maximum pitch */ + +/*---------------------------------------------------------------------------*\ + + TYPEDEFS + +\*---------------------------------------------------------------------------*/ + +/* Structure to hold model parameters for one frame */ + +typedef struct { + float Wo; /* fundamental frequency estimate in radians */ + int L; /* number of harmonics */ + float A[MAX_AMP+1]; /* amplitiude of each harmonic */ + float phi[MAX_AMP+1]; /* phase of each harmonic */ + int voiced; /* non-zero if this frame is voiced */ +} MODEL; + +/* describes each codebook */ + +struct lsp_codebook { + int k; /* dimension of vector */ + int log2m; /* number of bits in m */ + int m; /* elements in codebook */ + const float * cb; /* The elements */ +}; + +extern const struct lsp_codebook lsp_cb[]; +extern const struct lsp_codebook lsp_cbd[]; +extern const struct lsp_codebook lsp_cbvq[]; +extern const struct lsp_codebook lsp_cbjnd[]; +extern const struct lsp_codebook lsp_cbdt[]; +extern const struct lsp_codebook lsp_cbjvm[]; +extern const struct lsp_codebook lsp_cbvqanssi[]; +extern const struct lsp_codebook mel_cb[]; +extern const struct lsp_codebook ge_cb[]; +extern const struct lsp_codebook lspmelvq_cb[]; + +#endif diff --git a/codec2/tags/0.4.1/src/dump.c b/codec2/tags/0.4.1/src/dump.c new file mode 100644 index 00000000..f172424d --- /dev/null +++ b/codec2/tags/0.4.1/src/dump.c @@ -0,0 +1,670 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: dump.c + AUTHOR......: David Rowe + DATE CREATED: 25/8/09 + + Routines to dump data to text files for Octave analysis. + +\*---------------------------------------------------------------------------*/ + +/* + 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 . +*/ + +#include "defines.h" +#include "comp.h" +#include "dump.h" +#include +#include +#include +#include +#include + +#ifdef __EMBEDDED__ +#include "gdb_stdio.h" +#define fprintf gdb_stdio_fprintf +#define fopen gdb_stdio_fopen +#define fclose gdb_stdio_fclose +#endif + +#ifdef DUMP +static int dumpon = 0; + +static FILE *fsn = NULL; +static FILE *fsw = NULL; +static FILE *few = NULL; +static FILE *fsw_ = NULL; +static FILE *fsoftdec = NULL; +static FILE *fmodel = NULL; +static FILE *fqmodel = NULL; +static FILE *fpwb = NULL; +static FILE *fpw = NULL; +static FILE *frw = NULL; +static FILE *flsp = NULL; +static FILE *fweights = NULL; +static FILE *flsp_ = NULL; +static FILE *fmel = NULL; +static FILE *fmel_indexes = NULL; +static FILE *fphase = NULL; +static FILE *fphase_ = NULL; +static FILE *ffw = NULL; +static FILE *fe = NULL; +static FILE *fsq = NULL; +static FILE *fdec = NULL; +static FILE *fsnr = NULL; +static FILE *flpcsnr = NULL; +static FILE *fak = NULL; +static FILE *fak_ = NULL; +static FILE *fbg = NULL; +static FILE *fE = NULL; +static FILE *frk = NULL; +static FILE *fhephase = NULL; + +static char prefix[MAX_STR]; + +void dump_on(char p[]) { + dumpon = 1; + strcpy(prefix, p); +} + +void dump_off(){ + if (fsn != NULL) + fclose(fsn); + if (fsw != NULL) + fclose(fsw); + if (fsw_ != NULL) + fclose(fsw_); + if (few != NULL) + fclose(few); + if (fmodel != NULL) + fclose(fmodel); + if (fsoftdec != NULL) + fclose(fsoftdec); + if (fqmodel != NULL) + fclose(fqmodel); + if (fpwb != NULL) + fclose(fpwb); + if (fpw != NULL) + fclose(fpw); + if (frw != NULL) + fclose(frw); + if (flsp != NULL) + fclose(flsp); + if (fweights != NULL) + fclose(fweights); + if (flsp_ != NULL) + fclose(flsp_); + if (fmel != NULL) + fclose(fmel); + if (fmel_indexes != NULL) + fclose(fmel_indexes); + if (fphase != NULL) + fclose(fphase); + if (fphase_ != NULL) + fclose(fphase_); + if (ffw != NULL) + fclose(ffw); + if (fe != NULL) + fclose(fe); + if (fsq != NULL) + fclose(fsq); + if (fdec != NULL) + fclose(fdec); + if (fsnr != NULL) + fclose(fsnr); + if (flpcsnr != NULL) + fclose(flpcsnr); + if (fak != NULL) + fclose(fak); + if (fak_ != NULL) + fclose(fak_); + if (fbg != NULL) + fclose(fbg); + if (fE != NULL) + fclose(fE); + if (frk != NULL) + fclose(frk); + if (fhephase != NULL) + fclose(fhephase); +} + +void dump_Sn(float Sn[]) { + int i; + char s[MAX_STR]; + + if (!dumpon) return; + + if (fsn == NULL) { + sprintf(s,"%s_sn.txt", prefix); + fsn = fopen(s, "wt"); + assert(fsn != NULL); + } + + /* split across two lines to avoid max line length problems */ + /* reconstruct in Octave */ + + for(i=0; iWo, model->L); + for(l=1; l<=model->L; l++) { + sprintf(s,"%12f ",model->A[l]); + strcat(line, s); + } + for(l=model->L+1; l<=MAX_AMP; l++) { + sprintf(s,"%12f ", 0.0); + strcat(line,s); + } + + sprintf(s,"%d\n",model->voiced); + strcat(line,s); + fprintf(fmodel,"%s",line); +} + +void dump_quantised_model(MODEL *model) { + int l; + char s[MAX_STR]; + char line[2048]; + + if (!dumpon) return; + + if (fqmodel == NULL) { + sprintf(s,"%s_qmodel.txt", prefix); + fqmodel = fopen(s, "wt"); + assert(fqmodel != NULL); + } + + sprintf(line,"%12f %12d ", model->Wo, model->L); + for(l=1; l<=model->L; l++) { + sprintf(s,"%12f ",model->A[l]); + strcat(line, s); + } + for(l=model->L+1; l<=MAX_AMP; l++) { + sprintf(s,"%12f ", 0.0); + strcat(line, s); + } + + sprintf(s,"%d\n",model->voiced); + strcat(line, s); + fprintf(fqmodel, "%s", line); +} + +void dump_phase(float phase[], int L) { + int l; + char s[MAX_STR]; + + if (!dumpon) return; + + if (fphase == NULL) { + sprintf(s,"%s_phase.txt", prefix); + fphase = fopen(s, "wt"); + assert(fphase != NULL); + } + + for(l=1; l<=L; l++) + fprintf(fphase,"%f\t",phase[l]); + for(l=L+1; l<=MAX_AMP; l++) + fprintf(fphase,"%f\t",0.0); + fprintf(fphase,"\n"); +} + +void dump_phase_(float phase_[], int L) { + int l; + char s[MAX_STR]; + + if (!dumpon) return; + + if (fphase_ == NULL) { + sprintf(s,"%s_phase_.txt", prefix); + fphase_ = fopen(s, "wt"); + assert(fphase_ != NULL); + } + + for(l=1; l<=L; l++) + fprintf(fphase_,"%f\t",phase_[l]); + for(l=L+1; l. +*/ + +#ifndef __DUMP__ +#define __DUMP__ + +#include "defines.h" +#include "comp.h" +#include "kiss_fft.h" +#include "codec2_internal.h" + +void dump_on(char filename_prefix[]); +void dump_off(); + +void dump_Sn(float Sn[]); +void dump_Sw(COMP Sw[]); +void dump_Sw_(COMP Sw_[]); +void dump_Ew(COMP Ew[]); +void dump_softdec(float *softdec, int n); + +/* amplitude modelling */ + +void dump_model(MODEL *m); +void dump_quantised_model(MODEL *m); +void dump_Pwn(COMP Pw[]); +void dump_Pw(COMP Pw[]); +void dump_Rw(float Rw[]); +void dump_lsp(float lsp[]); +void dump_weights(float w[], int ndim); +void dump_lsp_(float lsp_[]); +void dump_mel(float mel[], int order); +void dump_mel_indexes(int mel_indexes[], int order); +void dump_ak(float ak[], int order); +void dump_ak_(float ak[], int order); +void dump_E(float E); +void dump_lpc_snr(float snr); + +/* phase modelling */ + +void dump_snr(float snr); +void dump_phase(float phase[], int L); +void dump_phase_(float phase[], int L); +void dump_hephase(int ind[], int dim); + +/* NLP states */ + +void dump_sq(float sq[]); +void dump_dec(COMP Fw[]); +void dump_Fw(COMP Fw[]); +void dump_e(float e_hz[]); +void dump_Rk(float Rk[]); + +/* post filter */ + +void dump_bg(float e, float bg_est, float percent_uv); +void dump_Pwb(COMP Pwb[]); + +#endif diff --git a/codec2/tags/0.4.1/src/fdmdv.c b/codec2/tags/0.4.1/src/fdmdv.c new file mode 100644 index 00000000..bab288d5 --- /dev/null +++ b/codec2/tags/0.4.1/src/fdmdv.c @@ -0,0 +1,1863 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: fdmdv.c + AUTHOR......: David Rowe + DATE CREATED: April 14 2012 + + Functions that implement the FDMDV modem. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2012 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 . +*/ + +/*---------------------------------------------------------------------------*\ + + INCLUDES + +\*---------------------------------------------------------------------------*/ + +#include +#include +#include +#include +#include + +#include "fdmdv_internal.h" +#include "codec2_fdmdv.h" +#include "comp_prim.h" +#include "rn.h" +#include "rxdec_coeff.h" +#include "test_bits.h" +#include "pilot_coeff.h" +#include "kiss_fft.h" +#include "hanning.h" +#include "os.h" +#include "machdep.h" + +static int sync_uw[] = {1,-1,1,-1,1,-1}; + +#ifdef __EMBEDDED__ +#define printf gdb_stdio_printf +#endif + +/*--------------------------------------------------------------------------* \ + + FUNCTION....: fdmdv_create + AUTHOR......: David Rowe + DATE CREATED: 16/4/2012 + + Create and initialise an instance of the modem. Returns a pointer + to the modem states or NULL on failure. One set of states is + sufficient for a full duplex modem. + +\*---------------------------------------------------------------------------*/ + +struct FDMDV * fdmdv_create(int Nc) +{ + struct FDMDV *f; + int c, i, k; + + assert(NC == FDMDV_NC_MAX); /* check public and private #defines match */ + assert(Nc <= NC); + assert(FDMDV_NOM_SAMPLES_PER_FRAME == M); + assert(FDMDV_MAX_SAMPLES_PER_FRAME == (M+M/P)); + + f = (struct FDMDV*)malloc(sizeof(struct FDMDV)); + if (f == NULL) + return NULL; + + f->Nc = Nc; + + f->ntest_bits = Nc*NB*4; + f->current_test_bit = 0; + f->rx_test_bits_mem = (int*)malloc(sizeof(int)*f->ntest_bits); + assert(f->rx_test_bits_mem != NULL); + for(i=0; intest_bits; i++) + f->rx_test_bits_mem[i] = 0; + assert((sizeof(test_bits)/sizeof(int)) >= f->ntest_bits); + + f->old_qpsk_mapping = 0; + + f->tx_pilot_bit = 0; + + for(c=0; cprev_tx_symbols[c].real = 1.0; + f->prev_tx_symbols[c].imag = 0.0; + f->prev_rx_symbols[c].real = 1.0; + f->prev_rx_symbols[c].imag = 0.0; + + for(k=0; ktx_filter_memory[c][k].real = 0.0; + f->tx_filter_memory[c][k].imag = 0.0; + } + + /* Spread initial FDM carrier phase out as far as possible. + This helped PAPR for a few dB. We don't need to adjust rx + phase as DQPSK takes care of that. */ + + f->phase_tx[c].real = cosf(2.0*PI*c/(Nc+1)); + f->phase_tx[c].imag = sinf(2.0*PI*c/(Nc+1)); + + f->phase_rx[c].real = 1.0; + f->phase_rx[c].imag = 0.0; + + for(k=0; krx_filter_mem_timing[c][k].real = 0.0; + f->rx_filter_mem_timing[c][k].imag = 0.0; + } + } + f->prev_tx_symbols[Nc].real = 2.0; + + fdmdv_set_fsep(f, FSEP); + f->freq[Nc].real = cosf(2.0*PI*0.0/FS); + f->freq[Nc].imag = sinf(2.0*PI*0.0/FS); + f->freq_pol[Nc] = 2.0*PI*0.0/FS; + + f->fbb_rect.real = cosf(2.0*PI*FDMDV_FCENTRE/FS); + f->fbb_rect.imag = sinf(2.0*PI*FDMDV_FCENTRE/FS); + f->fbb_pol = 2.0*PI*FDMDV_FCENTRE/FS; + f->fbb_phase_tx.real = 1.0; + f->fbb_phase_tx.imag = 0.0; + f->fbb_phase_rx.real = 1.0; + f->fbb_phase_rx.imag = 0.0; + + /* Generate DBPSK pilot Look Up Table (LUT) */ + + generate_pilot_lut(f->pilot_lut, &f->freq[Nc]); + + /* freq Offset estimation states */ + + f->fft_pilot_cfg = kiss_fft_alloc (MPILOTFFT, 0, NULL, NULL); + assert(f->fft_pilot_cfg != NULL); + + for(i=0; ipilot_baseband1[i].real = f->pilot_baseband2[i].real = 0.0; + f->pilot_baseband1[i].imag = f->pilot_baseband2[i].imag = 0.0; + } + f->pilot_lut_index = 0; + f->prev_pilot_lut_index = 3*M; + + for(i=0; irxdec_lpf_mem[i].real = 0.0; + f->rxdec_lpf_mem[i].imag = 0.0; + } + + for(i=0; ipilot_lpf1[i].real = f->pilot_lpf2[i].real = 0.0; + f->pilot_lpf1[i].imag = f->pilot_lpf2[i].imag = 0.0; + } + + f->foff = 0.0; + f->foff_phase_rect.real = 1.0; + f->foff_phase_rect.imag = 0.0; + + for(i=0; irx_fdm_mem[i].real = 0.0; + f->rx_fdm_mem[i].imag = 0.0; + } + + f->fest_state = 0; + f->sync = 0; + f->timer = 0; + for(i=0; isync_mem[i] = 0; + + for(c=0; csig_est[c] = 0.0; + f->noise_est[c] = 0.0; + } + + f->sig_pwr_av = 0.0; + + return f; +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: fdmdv_destroy + AUTHOR......: David Rowe + DATE CREATED: 16/4/2012 + + Destroy an instance of the modem. + +\*---------------------------------------------------------------------------*/ + +void fdmdv_destroy(struct FDMDV *fdmdv) +{ + assert(fdmdv != NULL); + KISS_FFT_FREE(fdmdv->fft_pilot_cfg); + free(fdmdv->rx_test_bits_mem); + free(fdmdv); +} + + +void fdmdv_use_old_qpsk_mapping(struct FDMDV *fdmdv) { + fdmdv->old_qpsk_mapping = 1; +} + + +int fdmdv_bits_per_frame(struct FDMDV *fdmdv) +{ + return (fdmdv->Nc * NB); +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: fdmdv_get_test_bits() + AUTHOR......: David Rowe + DATE CREATED: 16/4/2012 + + Generate a frame of bits from a repeating sequence of random data. OK so + it's not very random if it repeats but it makes syncing at the demod easier + for test purposes. + +\*---------------------------------------------------------------------------*/ + +void fdmdv_get_test_bits(struct FDMDV *f, int tx_bits[]) +{ + int i; + int bits_per_frame = fdmdv_bits_per_frame(f); + + for(i=0; icurrent_test_bit]; + f->current_test_bit++; + if (f->current_test_bit > (f->ntest_bits-1)) + f->current_test_bit = 0; + } +} + +float fdmdv_get_fsep(struct FDMDV *f) +{ + return f->fsep; +} + +void fdmdv_set_fsep(struct FDMDV *f, float fsep) { + int c; + float carrier_freq; + + f->fsep = fsep; + + /* Set up frequency of each carrier */ + + for(c=0; cNc/2; c++) { + carrier_freq = (-f->Nc/2 + c)*f->fsep; + f->freq[c].real = cosf(2.0*PI*carrier_freq/FS); + f->freq[c].imag = sinf(2.0*PI*carrier_freq/FS); + f->freq_pol[c] = 2.0*PI*carrier_freq/FS; + } + + for(c=f->Nc/2; cNc; c++) { + carrier_freq = (-f->Nc/2 + c + 1)*f->fsep; + f->freq[c].real = cosf(2.0*PI*carrier_freq/FS); + f->freq[c].imag = sinf(2.0*PI*carrier_freq/FS); + f->freq_pol[c] = 2.0*PI*carrier_freq/FS; + } +} + + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: bits_to_dqpsk_symbols() + AUTHOR......: David Rowe + DATE CREATED: 16/4/2012 + + Maps bits to parallel DQPSK symbols. Generate Nc+1 QPSK symbols from + vector of (1,Nc*Nb) input tx_bits. The Nc+1 symbol is the +1 -1 +1 + .... BPSK sync carrier. + +\*---------------------------------------------------------------------------*/ + +void bits_to_dqpsk_symbols(COMP tx_symbols[], int Nc, COMP prev_tx_symbols[], int tx_bits[], int *pilot_bit, int old_qpsk_mapping) +{ + int c, msb, lsb; + COMP j = {0.0,1.0}; + + /* Map tx_bits to to Nc DQPSK symbols. Note legacy support for + old (suboptimal) V0.91 FreeDV mapping */ + + for(c=0; creal /= mag; + fbb_phase->imag /= mag; + + /* shift memory, inserting zeros at end */ + + for(i=0; ireal /= mag; + fbb_phase->imag /= mag; +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: fdmdv_mod() + AUTHOR......: David Rowe + DATE CREATED: 26/4/2012 + + FDMDV modulator, take a frame of FDMDV_BITS_PER_FRAME bits and + generates a frame of FDMDV_SAMPLES_PER_FRAME modulated symbols. + Sync bit is returned to aid alignment of your next frame. + + The sync_bit value returned will be used for the _next_ frame. + + The output signal is complex to support single sided frequency + shifting, for example when testing frequency offsets in channel + simulation. + +\*---------------------------------------------------------------------------*/ + +void fdmdv_mod(struct FDMDV *fdmdv, COMP tx_fdm[], int tx_bits[], int *sync_bit) +{ + COMP tx_symbols[NC+1]; + PROFILE_VAR(mod_start, tx_filter_and_upconvert_start); + + PROFILE_SAMPLE(mod_start); + bits_to_dqpsk_symbols(tx_symbols, fdmdv->Nc, fdmdv->prev_tx_symbols, tx_bits, &fdmdv->tx_pilot_bit, fdmdv->old_qpsk_mapping); + memcpy(fdmdv->prev_tx_symbols, tx_symbols, sizeof(COMP)*(fdmdv->Nc+1)); + PROFILE_SAMPLE_AND_LOG(tx_filter_and_upconvert_start, mod_start, " bits_to_dqpsk_symbols"); + tx_filter_and_upconvert(tx_fdm, fdmdv->Nc, tx_symbols, fdmdv->tx_filter_memory, + fdmdv->phase_tx, fdmdv->freq, &fdmdv->fbb_phase_tx, fdmdv->fbb_rect); + PROFILE_SAMPLE_AND_LOG2(tx_filter_and_upconvert_start, " tx_filter_and_upconvert"); + + *sync_bit = fdmdv->tx_pilot_bit; +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: generate_pilot_fdm() + AUTHOR......: David Rowe + DATE CREATED: 19/4/2012 + + Generate M samples of DBPSK pilot signal for Freq offset estimation. + +\*---------------------------------------------------------------------------*/ + +void generate_pilot_fdm(COMP *pilot_fdm, int *bit, float *symbol, + float *filter_mem, COMP *phase, COMP *freq) +{ + int i,j,k; + float tx_baseband[M]; + + /* +1 -1 +1 -1 DBPSK sync carrier, once filtered becomes (roughly) + two spectral lines at +/- RS/2 */ + + if (*bit) + *symbol = -*symbol; + + if (*bit) + *bit = 0; + else + *bit = 1; + + /* filter DPSK symbol to create M baseband samples */ + + filter_mem[NFILTER-1] = (sqrtf(2)/2) * *symbol; + for(i=0; ireal; + pilot_fdm[i].imag = sqrtf(2)*2*tx_baseband[i] * phase->imag; + } +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: generate_pilot_lut() + AUTHOR......: David Rowe + DATE CREATED: 19/4/2012 + + Generate a 4M sample vector of DBPSK pilot signal. As the pilot signal + is periodic in 4M samples we can then use this vector as a look up table + for pilot signal generation in the demod. + +\*---------------------------------------------------------------------------*/ + +void generate_pilot_lut(COMP pilot_lut[], COMP *pilot_freq) +{ + int pilot_rx_bit = 0; + float pilot_symbol = sqrtf(2.0); + COMP pilot_phase = {1.0, 0.0}; + float pilot_filter_mem[NFILTER]; + COMP pilot[M]; + int i,f; + + for(i=0; i= 4) + memcpy(&pilot_lut[M*(f-4)], pilot, M*sizeof(COMP)); + } + +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: lpf_peak_pick() + AUTHOR......: David Rowe + DATE CREATED: 20/4/2012 + + LPF and peak pick part of freq est, put in a function as we call it twice. + +\*---------------------------------------------------------------------------*/ + +void lpf_peak_pick(float *foff, float *max, COMP pilot_baseband[], + COMP pilot_lpf[], kiss_fft_cfg fft_pilot_cfg, COMP S[], int nin, + int do_fft) +{ + int i,j,k; + int mpilot; + COMP s[MPILOTFFT]; + float mag, imax; + int ix; + float r; + + /* LPF cutoff 200Hz, so we can handle max +/- 200 Hz freq offset */ + + for(i=0; i imax) { + imax = mag; + ix = i; + } + } + r = 2.0*200.0/MPILOTFFT; /* maps FFT bin to frequency in Hz */ + + if (ix >= MPILOTFFT/2) + *foff = (ix - MPILOTFFT)*r; + else + *foff = (ix)*r; + } + + *max = imax; + +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: rx_est_freq_offset() + AUTHOR......: David Rowe + DATE CREATED: 19/4/2012 + + Estimate frequency offset of FDM signal using BPSK pilot. Note that + this algorithm is quite sensitive to pilot tone level wrt other + carriers, so test variations to the pilot amplitude carefully. + +\*---------------------------------------------------------------------------*/ + +float rx_est_freq_offset(struct FDMDV *f, COMP rx_fdm[], int nin, int do_fft) +{ + int i,j; + COMP pilot[M+M/P]; + COMP prev_pilot[M+M/P]; + float foff, foff1, foff2; + float max1, max2; + + assert(nin <= M+M/P); + + /* get pilot samples used for correlation/down conversion of rx signal */ + + for (i=0; ipilot_lut[f->pilot_lut_index]; + f->pilot_lut_index++; + if (f->pilot_lut_index >= 4*M) + f->pilot_lut_index = 0; + + prev_pilot[i] = f->pilot_lut[f->prev_pilot_lut_index]; + f->prev_pilot_lut_index++; + if (f->prev_pilot_lut_index >= 4*M) + f->prev_pilot_lut_index = 0; + } + + /* + Down convert latest M samples of pilot by multiplying by ideal + BPSK pilot signal we have generated locally. The peak of the + resulting signal is sensitive to the time shift between the + received and local version of the pilot, so we do it twice at + different time shifts and choose the maximum. + */ + + for(i=0; ipilot_baseband1[i] = f->pilot_baseband1[i+nin]; + f->pilot_baseband2[i] = f->pilot_baseband2[i+nin]; + } + + for(i=0,j=NPILOTBASEBAND-nin; ipilot_baseband1[j] = cmult(rx_fdm[i], cconj(pilot[i])); + f->pilot_baseband2[j] = cmult(rx_fdm[i], cconj(prev_pilot[i])); + } + + lpf_peak_pick(&foff1, &max1, f->pilot_baseband1, f->pilot_lpf1, f->fft_pilot_cfg, f->S1, nin, do_fft); + lpf_peak_pick(&foff2, &max2, f->pilot_baseband2, f->pilot_lpf2, f->fft_pilot_cfg, f->S2, nin, do_fft); + + if (max1 > max2) + foff = foff1; + else + foff = foff2; + + return foff; +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: fdmdv_freq_shift() + AUTHOR......: David Rowe + DATE CREATED: 26/4/2012 + + Frequency shift modem signal. The use of complex input and output allows + single sided frequency shifting (no images). + +\*---------------------------------------------------------------------------*/ + +void fdmdv_freq_shift(COMP rx_fdm_fcorr[], COMP rx_fdm[], float foff, + COMP *foff_phase_rect, int nin) +{ + COMP foff_rect; + float mag; + int i; + + foff_rect.real = cosf(2.0*PI*foff/FS); + foff_rect.imag = sinf(2.0*PI*foff/FS); + for(i=0; ireal /= mag; + foff_phase_rect->imag /= mag; +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: fdm_downconvert + AUTHOR......: David Rowe + DATE CREATED: 22/4/2012 + + Frequency shift each modem carrier down to Nc+1 baseband signals. + +\*---------------------------------------------------------------------------*/ + +void fdm_downconvert(COMP rx_baseband[NC+1][M+M/P], int Nc, COMP rx_fdm[], COMP phase_rx[], COMP freq[], int nin) +{ + int i,c; + float mag; + + /* maximum number of input samples to demod */ + + assert(nin <= (M+M/P)); + + /* downconvert */ + + for (c=0; c P) + rx_timing -= P; + if (rx_timing < -P) + rx_timing += P; + + /* rx_filter_mem_timing contains Nt*P samples (Nt symbols at rate + P), where Nt is odd. Lets use linear interpolation to resample + in the centre of the timing estimation window .*/ + + rx_timing += floorf(NT/2.0)*P; + low_sample = floorf(rx_timing); + fract = rx_timing - low_sample; + high_sample = ceilf(rx_timing); + + //printf("rx_timing: %f low_sample: %d high_sample: %d fract: %f\n", rx_timing, low_sample, high_sample, fract); + + for(c=0; c= 0) && (d.imag >= 0)) { + msb = 0; lsb = 0; + } + if ((d.real < 0) && (d.imag >= 0)) { + msb = 0; lsb = 1; + } + if ((d.real < 0) && (d.imag < 0)) { + if (old_qpsk_mapping) { + msb = 1; lsb = 0; + } else { + msb = 1; lsb = 1; + } + } + if ((d.real >= 0) && (d.imag < 0)) { + if (old_qpsk_mapping) { + msb = 1; lsb = 1; + } else { + msb = 1; lsb = 0; + } + } + rx_bits[2*c] = msb; + rx_bits[2*c+1] = lsb; + } + + /* Extract DBPSK encoded Sync bit and fine freq offset estimate */ + + norm = 1.0/(cabsolute(prev_rx_symbols[Nc])+1E-6); + phase_difference[Nc] = cmult(rx_symbols[Nc], fcmult(norm, cconj(prev_rx_symbols[Nc]))); + if (phase_difference[Nc].real < 0) { + *sync_bit = 1; + ferr = phase_difference[Nc].imag*norm; /* make f_err magnitude insensitive */ + } + else { + *sync_bit = 0; + ferr = -phase_difference[Nc].imag*norm; + } + + /* pilot carrier gets an extra pi/4 rotation to make it consistent + with other carriers, as we need it for snr_update and scatter + diagram */ + + phase_difference[Nc] = cmult(phase_difference[Nc], pi_on_4); + + return ferr; +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: snr_update() + AUTHOR......: David Rowe + DATE CREATED: 17 May 2012 + + Given phase differences update estimates of signal and noise levels. + +\*---------------------------------------------------------------------------*/ + +void snr_update(float sig_est[], float noise_est[], int Nc, COMP phase_difference[]) +{ + float s[NC+1]; + COMP refl_symbols[NC+1]; + float n[NC+1]; + COMP pi_on_4; + int c; + + pi_on_4.real = cosf(PI/4.0); + pi_on_4.imag = sinf(PI/4.0); + + /* mag of each symbol is distance from origin, this gives us a + vector of mags, one for each carrier. */ + + for(c=0; cntest_bits; +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: fdmdv_put_test_bits() + AUTHOR......: David Rowe + DATE CREATED: 24/4/2012 + + Accepts nbits from rx and attempts to sync with test_bits sequence. + If sync OK measures bit errors. + +\*---------------------------------------------------------------------------*/ + +void fdmdv_put_test_bits(struct FDMDV *f, int *sync, short error_pattern[], + int *bit_errors, int *ntest_bits, int rx_bits[]) +{ + int i,j; + float ber; + int bits_per_frame = fdmdv_bits_per_frame(f); + + /* Append to our memory */ + + for(i=0,j=bits_per_frame; intest_bits-bits_per_frame; i++,j++) + f->rx_test_bits_mem[i] = f->rx_test_bits_mem[j]; + for(i=f->ntest_bits-bits_per_frame,j=0; intest_bits; i++,j++) + f->rx_test_bits_mem[i] = rx_bits[j]; + + /* see how many bit errors we get when checked against test sequence */ + + *bit_errors = 0; + for(i=0; intest_bits; i++) { + error_pattern[i] = test_bits[i] ^ f->rx_test_bits_mem[i]; + *bit_errors += error_pattern[i]; + //printf("%d %d %d %d\n", i, test_bits[i], f->rx_test_bits_mem[i], test_bits[i] ^ f->rx_test_bits_mem[i]); + } + + /* if less than a thresh we are aligned and in sync with test sequence */ + + ber = (float)*bit_errors/f->ntest_bits; + + *sync = 0; + if (ber < 0.2) + *sync = 1; + + *ntest_bits = f->ntest_bits; + +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: freq_state(() + AUTHOR......: David Rowe + DATE CREATED: 24/4/2012 + + Freq offset state machine. Moves between coarse and fine states + based on BPSK pilot sequence. Freq offset estimator occasionally + makes mistakes when used continuously. So we use it until we have + acquired the BPSK pilot, then switch to a more robust "fine" + tracking algorithm. If we lose sync we switch back to coarse mode + for fast re-acquisition of large frequency offsets. + + The sync state is also useful for higher layers to determine when + there is valid FDMDV data for decoding. We want to reliably and + quickly get into sync, stay in sync even on fading channels, and + fall out of sync quickly if tx stops or it's a false sync. + + In multipath fading channels the BPSK sync carrier may be pushed + down in the noise, despite other carriers being at full strength. + We want to avoid loss of sync in these cases. + +\*---------------------------------------------------------------------------*/ + +int freq_state(int *reliable_sync_bit, int sync_bit, int *state, int *timer, int *sync_mem) +{ + int next_state, sync, unique_word, i, corr; + + /* look for 6 symbols (120ms) 101010 of sync sequence */ + + unique_word = 0; + for(i=0; ifbb_phase_rx, *nin); + + /* freq offset estimation and correction */ + + PROFILE_SAMPLE(demod_start); + foff_coarse = rx_est_freq_offset(fdmdv, rx_fdm_bb, *nin, !fdmdv->sync); + PROFILE_SAMPLE_AND_LOG(fdmdv_freq_shift_start, demod_start, " rx_est_freq_offset"); + + if (fdmdv->sync == 0) + fdmdv->foff = foff_coarse; + fdmdv_freq_shift(rx_fdm_fcorr, rx_fdm_bb, -fdmdv->foff, &fdmdv->foff_phase_rect, *nin); + PROFILE_SAMPLE_AND_LOG(down_convert_and_rx_filter_start, fdmdv_freq_shift_start, " fdmdv_freq_shift"); + + /* baseband processing */ + + rxdec_filter(rx_fdm_filter, rx_fdm_fcorr, fdmdv->rxdec_lpf_mem, *nin); + down_convert_and_rx_filter(rx_filt, fdmdv->Nc, rx_fdm_filter, fdmdv->rx_fdm_mem, fdmdv->phase_rx, fdmdv->freq, + fdmdv->freq_pol, *nin, M/Q); + PROFILE_SAMPLE_AND_LOG(rx_est_timing_start, down_convert_and_rx_filter_start, " down_convert_and_rx_filter"); + fdmdv->rx_timing = rx_est_timing(rx_symbols, fdmdv->Nc, rx_filt, fdmdv->rx_filter_mem_timing, env, *nin, M); + PROFILE_SAMPLE_AND_LOG(qpsk_to_bits_start, rx_est_timing_start, " rx_est_timing"); + + /* Adjust number of input samples to keep timing within bounds */ + + *nin = M; + + if (fdmdv->rx_timing > 2*M/P) + *nin += M/P; + + if (fdmdv->rx_timing < 0) + *nin -= M/P; + + foff_fine = qpsk_to_bits(rx_bits, &sync_bit, fdmdv->Nc, fdmdv->phase_difference, fdmdv->prev_rx_symbols, rx_symbols, + fdmdv->old_qpsk_mapping); + memcpy(fdmdv->prev_rx_symbols, rx_symbols, sizeof(COMP)*(fdmdv->Nc+1)); + PROFILE_SAMPLE_AND_LOG(snr_update_start, qpsk_to_bits_start, " qpsk_to_bits"); + snr_update(fdmdv->sig_est, fdmdv->noise_est, fdmdv->Nc, fdmdv->phase_difference); + PROFILE_SAMPLE_AND_LOG(freq_state_start, snr_update_start, " snr_update"); + + /* freq offset estimation state machine */ + + fdmdv->sync = freq_state(reliable_sync_bit, sync_bit, &fdmdv->fest_state, &fdmdv->timer, fdmdv->sync_mem); + PROFILE_SAMPLE_AND_LOG2(freq_state_start, " freq_state"); + fdmdv->foff -= TRACK_COEFF*foff_fine; +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: calc_snr() + AUTHOR......: David Rowe + DATE CREATED: 17 May 2012 + + Calculate current SNR estimate (3000Hz noise BW) + +\*---------------------------------------------------------------------------*/ + +float calc_snr(int Nc, float sig_est[], float noise_est[]) +{ + float S, SdB; + float mean, N50, N50dB, N3000dB; + float snr_dB; + int c; + + S = 0.0; + for(c=0; cNc <= MODEM_STATS_NC_MAX); + + stats->Nc = fdmdv->Nc; + stats->snr_est = calc_snr(fdmdv->Nc, fdmdv->sig_est, fdmdv->noise_est); + stats->sync = fdmdv->sync; + stats->foff = fdmdv->foff; + stats->rx_timing = fdmdv->rx_timing; + stats->clock_offset = 0.0; /* TODO - implement clock offset estimation */ + + stats->nr = 1; + for(c=0; cNc+1; c++) { + stats->rx_symbols[0][c] = fdmdv->phase_difference[c]; + } +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: fdmdv_8_to_16() + AUTHOR......: David Rowe + DATE CREATED: 9 May 2012 + + Changes the sample rate of a signal from 8 to 16 kHz. Support function for + SM1000. + +\*---------------------------------------------------------------------------*/ + +void fdmdv_8_to_16(float out16k[], float in8k[], int n) +{ + int i,k,l; + float acc; + + /* make sure n is an integer multiple of the oversampling rate, ow + this function breaks */ + + assert((n % FDMDV_OS) == 0); + + /* this version unrolled for specific FDMDV_OS */ + + assert(FDMDV_OS == 2); + + for(i=0; iNc; i++) + fprintf(stderr," %1.3f", (double)cabsolute(f->phase_tx[i])); + fprintf(stderr,"\nfreq[]:\n"); + for(i=0; i<=f->Nc; i++) + fprintf(stderr," %1.3f", (double)cabsolute(f->freq[i])); + fprintf(stderr,"\nfoff_phase_rect: %1.3f", (double)cabsolute(f->foff_phase_rect)); + fprintf(stderr,"\nphase_rx[]:\n"); + for(i=0; i<=f->Nc; i++) + fprintf(stderr," %1.3f", (double)cabsolute(f->phase_rx[i])); + fprintf(stderr, "\n\n"); +} + + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: randn() + AUTHOR......: David Rowe + DATE CREATED: 2 August 2014 + + Simple approximation to normal (gaussian) random number generator + with 0 mean and unit variance. + +\*---------------------------------------------------------------------------*/ + +#define RANDN_IT 12 /* This magic number of iterations gives us a + unit variance. I think beacuse var = + (b-a)^2/12 for one uniform random variable, so + for a sum of n random variables it's + n(b-a)^2/12, or for b=1, a = 0, n=12, we get + var = 12(1-0)^2/12 = 1 */ + +static float randn() { + int i; + float rn = 0.0; + + for(i=0; isig_pwr_av: %e target_snr_linear: %f noise_pwr_4000Hz: %e noise_gain: %e\n", + sig_pwr, f->sig_pwr_av, target_snr_linear, noise_pwr_4000Hz, noise_gain); + */ +} diff --git a/codec2/tags/0.4.1/src/fdmdv_channel.c b/codec2/tags/0.4.1/src/fdmdv_channel.c new file mode 100644 index 00000000..e4d87cbe --- /dev/null +++ b/codec2/tags/0.4.1/src/fdmdv_channel.c @@ -0,0 +1,103 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: fdmdv_channel.c + AUTHOR......: David Rowe + DATE CREATED: 2 August 2014 + + Given an input raw file (8kHz, 16 bit shorts) of FDMDV modem + samples, adds channel impairments and outputs to another raw file. + +\*---------------------------------------------------------------------------*/ + +/* + 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, 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 . +*/ + +#include +#include +#include +#include +#include +#include + +#include "codec2_fdmdv.h" + +int main(int argc, char *argv[]) +{ + FILE *fin, *fout; + short rx_fdm_buf[FDMDV_NOM_SAMPLES_PER_FRAME]; + COMP rx_fdm[FDMDV_NOM_SAMPLES_PER_FRAME]; + struct FDMDV *fdmdv; + float snrdB, sam; + int i; + + if (argc < 3) { + printf("usage: %s InputModemRawFile OutputModemRawFile SNRdB\n", argv[0]); + printf("e.g %s test_in.raw test_out.raw 4\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 modem sample 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 modem sample file: %s: %s.\n", + argv[2], strerror(errno)); + exit(1); + } + + snrdB = atof(argv[3]); + fdmdv = fdmdv_create(FDMDV_NC); + + while(fread(rx_fdm_buf, sizeof(short), FDMDV_NOM_SAMPLES_PER_FRAME, fin) == FDMDV_NOM_SAMPLES_PER_FRAME) { + + for(i=0; i 32767.0) sam = 32767.0; + if (sam < -32767.0) sam = -32767.0; + rx_fdm_buf[i] = sam; + } + + fwrite(rx_fdm_buf, sizeof(short), FDMDV_NOM_SAMPLES_PER_FRAME, fout); + + /* if this is in a pipeline, we probably don't want the usual + buffering to occur */ + + if (fout == stdout) fflush(stdout); + if (fin == stdin) fflush(stdin); + } + + fclose(fin); + fclose(fout); + fdmdv_destroy(fdmdv); + + return 0; +} + diff --git a/codec2/tags/0.4.1/src/fdmdv_demod.c b/codec2/tags/0.4.1/src/fdmdv_demod.c new file mode 100644 index 00000000..98762ee0 --- /dev/null +++ b/codec2/tags/0.4.1/src/fdmdv_demod.c @@ -0,0 +1,246 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: fdmdv_demod.c + AUTHOR......: David Rowe + DATE CREATED: April 30 2012 + + Given an input raw file (8kHz, 16 bit shorts) of FDMDV modem samples + outputs a file of bits. The output file is assumed to be arranged + as codec frames of 56 bits (7 bytes) which are received as two 28 + bit modem frames. + + Demod states can be optionally logged to an Octave file for display + using the Octave script fdmdv_demod_c.m. This is useful for + checking demod performance. + +\*---------------------------------------------------------------------------*/ + + +/* + Copyright (C) 2012 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, 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 . +*/ + +#include +#include +#include +#include +#include +#include + +#include "codec2_fdmdv.h" +#include "octave.h" +#include "freedv_api.h" + +/* lof of information we want to dump to Octave */ + +#define MAX_FRAMES 50*60 /* 1 minute at 50 symbols/s */ + +int main(int argc, char *argv[]) +{ + FILE *fin, *fout; + struct FDMDV *fdmdv; + char *packed_bits; + int *rx_bits; + int *codec_bits; + COMP rx_fdm[FDMDV_MAX_SAMPLES_PER_FRAME]; + short rx_fdm_scaled[FDMDV_MAX_SAMPLES_PER_FRAME]; + int i, bit, byte, c; + int nin, nin_prev; + int sync_bit = 0, reliable_sync_bit; + int sync = 0; + int f; + FILE *foct = NULL; + struct MODEM_STATS stats; + COMP *rx_fdm_log; + int rx_fdm_log_col_index; + COMP *rx_symbols_log; + int sync_log[MAX_FRAMES]; + float rx_timing_log[MAX_FRAMES]; + float foff_log[MAX_FRAMES]; + int sync_bit_log[MAX_FRAMES]; + int rx_bits_log[FDMDV_BITS_PER_FRAME*MAX_FRAMES]; + float snr_est_log[MAX_FRAMES]; + float *rx_spec_log; + int max_frames_reached; + int bits_per_fdmdv_frame; + int bits_per_codec_frame; + int bytes_per_codec_frame; + int Nc; + + if (argc < 2) { + printf("usage: %s InputModemRawFile OutputBitFile [Nc [OctaveDumpFile]]\n", argv[0]); + printf("e.g %s hts1a_fdmdv.raw hts1a.c2\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 modem sample 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 bit file: %s: %s.\n", + argv[2], strerror(errno)); + exit(1); + } + + if (argc >= 4) { + Nc = atoi(argv[3]); + + if ((Nc < 2) || (Nc > FDMDV_NC_MAX) ) { + fprintf(stderr, "Error number of carriers must be between 2 and %d\n", FDMDV_NC_MAX); + exit(1); + } + } + else + Nc = FDMDV_NC; + + fdmdv = fdmdv_create(Nc); + modem_stats_open(&stats); + + bits_per_fdmdv_frame = fdmdv_bits_per_frame(fdmdv); + bits_per_codec_frame = 2*fdmdv_bits_per_frame(fdmdv); + bytes_per_codec_frame = (bits_per_codec_frame+7)/8; + + /* malloc some buffers that are dependant on Nc */ + + packed_bits = (char*)malloc(bytes_per_codec_frame); assert(packed_bits != NULL); + rx_bits = (int*)malloc(sizeof(int)*bits_per_codec_frame); assert(rx_bits != NULL); + codec_bits = (int*)malloc(2*sizeof(int)*bits_per_fdmdv_frame); assert(codec_bits != NULL); + + /* malloc some of the larger variables to prevent out of stack problems */ + + rx_fdm_log = (COMP*)malloc(sizeof(COMP)*FDMDV_MAX_SAMPLES_PER_FRAME*MAX_FRAMES); + assert(rx_fdm_log != NULL); + rx_spec_log = (float*)malloc(sizeof(float)*MODEM_STATS_NSPEC*MAX_FRAMES); + assert(rx_spec_log != NULL); + rx_symbols_log = (COMP*)malloc(sizeof(COMP)*(Nc+1)*MAX_FRAMES); + assert(rx_fdm_log != NULL); + + f = 0; + nin = FDMDV_NOM_SAMPLES_PER_FRAME; + rx_fdm_log_col_index = 0; + max_frames_reached = 0; + + while(fread(rx_fdm_scaled, sizeof(short), nin, fin) == nin) + { + for(i=0; i. +*/ + +#include +#include +#include +#include +#include +#include + +#include "codec2_fdmdv.h" + +int main(int argc, char *argv[]) +{ + FILE *fout; + struct FDMDV *fdmdv; + char *packed_bits; + int *tx_bits; + int n, i, bit, byte; + int numBits, nCodecFrames; + int bits_per_fdmdv_frame; + int bits_per_codec_frame; + int bytes_per_codec_frame; + int Nc; + + if (argc < 3) { + printf("usage: %s OutputBitFile numBits [Nc]\n", argv[0]); + printf("e.g %s test.c2 1400\n", argv[0]); + exit(1); + } + + if (strcmp(argv[1], "-") == 0) fout = stdout; + else if ( (fout = fopen(argv[1],"wb")) == NULL ) { + fprintf(stderr, "Error opening output bit file: %s: %s.\n", + argv[1], strerror(errno)); + exit(1); + } + + numBits = atoi(argv[2]); + + if (argc == 4) { + Nc = atoi(argv[3]); + if ((Nc < 2) || (Nc > FDMDV_NC_MAX) ) { + fprintf(stderr, "Error number of carriers must be btween 2 and %d\n", FDMDV_NC_MAX); + exit(1); + } + } + else + Nc = FDMDV_NC; + + fdmdv = fdmdv_create(Nc); + + bits_per_fdmdv_frame = fdmdv_bits_per_frame(fdmdv); + bits_per_codec_frame = 2*fdmdv_bits_per_frame(fdmdv); + bytes_per_codec_frame = (bits_per_codec_frame+7)/8; + fprintf(stderr, "bits_per_fdmdv_frame: %d bits_per_codec_frame: %d bytes_per_codec_frame: %d\n", + bits_per_fdmdv_frame, bits_per_codec_frame, bytes_per_codec_frame); + + packed_bits = (char*)malloc(bytes_per_codec_frame); + assert(packed_bits != NULL); + tx_bits = (int*)malloc(sizeof(int)*bits_per_codec_frame); + assert(tx_bits != NULL); + + nCodecFrames = numBits/bits_per_codec_frame; + + for(n=0; n. +*/ + +#include +#include +#include +#include +#include +#include + +#include "codec2_fdmdv.h" + +#define MAX_INTERLEAVER 10000 + +int main(int argc, char *argv[]) +{ + FILE *fin, *fout, *finter; + int interleaver[MAX_INTERLEAVER]; + char *packed_bits; + int *bits; + int *interleaved_bits; + int i, bit, byte, m, mpacked, frames, interleave, src_bit, dest_bit; + + if (argc < 4) { + printf("usage: %s InputBitFile OutputBitFile InterleaverFile [de]\n", argv[0]); + printf("e.g %s hts1a.c2 hts1a_interleaved.c2 interleaver.txt\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 bit 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 bit file: %s: %s.\n", + argv[2], strerror(errno)); + exit(1); + } + + if ((finter = fopen(argv[3],"rt")) == NULL ) { + fprintf(stderr, "Error opening interleaver file: %s: %s.\n", + argv[3], strerror(errno)); + exit(1); + } + + if (argc == 5) + interleave = 1; + else + interleave = 0; + + /* load interleaver, size determines block size we will process */ + + src_bit = 0; + while(fscanf(finter, "%d\n", &dest_bit) == 1) { + if (interleave) + interleaver[dest_bit] = src_bit; + else + interleaver[src_bit] = dest_bit; + + src_bit++; + if (src_bit == MAX_INTERLEAVER) { + fprintf(stderr, "Error interleaver too big\n"); + exit(1); + } + } + fclose(finter); + + m = src_bit; + fprintf(stderr, "Interleaver size m = %d interleave = %d\n", m, interleave); + assert((m%8) == 0); + mpacked = m/8; + + packed_bits = (char*)malloc(mpacked*sizeof(char)); + assert(packed_bits != NULL); + bits = (int*)malloc(m*sizeof(int)); + assert(bits != NULL); + interleaved_bits = (int*)malloc(m*sizeof(int)); + assert(interleaved_bits != NULL); + + frames = 0; + + while(fread(packed_bits, sizeof(char), mpacked, fin) == mpacked) { + frames++; + + /* unpack bits, MSB first */ + + bit = 7; byte = 0; + for(i=0; i> bit) & 0x1; + bit--; + if (bit < 0) { + bit = 7; + byte++; + } + } + assert(byte == mpacked); + + /* (de) interleave */ + + for(i=0; i. +*/ + +#ifndef __FDMDV_INTERNAL__ +#define __FDMDV_INTERNAL__ + +#include "comp.h" +#include "codec2_fdmdv.h" +#include "kiss_fft.h" + +/*---------------------------------------------------------------------------*\ + + DEFINES + +\*---------------------------------------------------------------------------*/ + +#define PI 3.141592654 +#define FS 8000 /* sample rate in Hz */ +#define T (1.0/FS) /* sample period in seconds */ +#define RS 50 /* symbol rate in Hz */ +#define NC 20 /* max number of data carriers (plus one pilot in the centre) */ +#define NB 2 /* Bits/symbol for QPSK modulation */ +#define RB (NC*RS*NB) /* bit rate */ +#define M (FS/RS) /* oversampling factor */ +#define NSYM 6 /* number of symbols to filter over */ +#define NFILTER (NSYM*M) /* size of tx/rx filters at sample rate M */ + +#define FSEP 75 /* Default separation between carriers (Hz) */ + +#define NT 5 /* number of symbols we estimate timing over */ +#define P 4 /* oversample factor used for initial rx symbol filtering output */ +#define Q (M/4) /* oversample factor used for initial rx symbol filtering input */ +#define NRXDEC 31 /* number of taps in the rx decimation filter */ + +#define NPILOT_LUT (4*M) /* number of pilot look up table samples */ +#define NPILOTCOEFF 30 /* number of FIR filter coeffs in LP filter */ +#define NPILOTBASEBAND (NPILOTCOEFF+M+M/P) /* number of pilot baseband samples reqd for pilot LPF */ +#define NPILOTLPF (4*M) /* number of samples we DFT pilot over, pilot est window */ +#define MPILOTFFT 256 + +#define NSYNC_MEM 6 + +/* averaging filter coeffs */ + +#define TRACK_COEFF 0.5 +#define SNR_COEFF 0.9 /* SNR est averaging filter coeff */ + +/*---------------------------------------------------------------------------*\ + + STRUCT for States + +\*---------------------------------------------------------------------------*/ + +struct FDMDV { + + int Nc; + float fsep; + + /* test data (test frame) states */ + + int ntest_bits; + int current_test_bit; + int *rx_test_bits_mem; + + /* Modulator */ + + int old_qpsk_mapping; + int tx_pilot_bit; + COMP prev_tx_symbols[NC+1]; + COMP tx_filter_memory[NC+1][NSYM]; + COMP phase_tx[NC+1]; + COMP freq[NC+1]; + float freq_pol[NC+1]; + + /* Pilot generation at demodulator */ + + COMP pilot_lut[NPILOT_LUT]; + int pilot_lut_index; + int prev_pilot_lut_index; + + /* freq offset estimation states */ + + kiss_fft_cfg fft_pilot_cfg; + COMP pilot_baseband1[NPILOTBASEBAND]; + COMP pilot_baseband2[NPILOTBASEBAND]; + COMP pilot_lpf1[NPILOTLPF]; + COMP pilot_lpf2[NPILOTLPF]; + COMP S1[MPILOTFFT]; + COMP S2[MPILOTFFT]; + + /* baseband to low IF carrier states */ + + COMP fbb_rect; + float fbb_pol; + COMP fbb_phase_tx; + COMP fbb_phase_rx; + + /* freq offset correction states */ + + float foff; + COMP foff_phase_rect; + float filt; + + /* Demodulator */ + + COMP rxdec_lpf_mem[NRXDEC-1+M]; + COMP rx_fdm_mem[NFILTER+M]; + COMP phase_rx[NC+1]; + COMP rx_filter_mem_timing[NC+1][NT*P]; + float rx_timing; + COMP phase_difference[NC+1]; + COMP prev_rx_symbols[NC+1]; + + /* sync state machine */ + + int sync_mem[NSYNC_MEM]; + int fest_state; + int sync; + int timer; + + /* SNR estimation states */ + + float sig_est[NC+1]; + float noise_est[NC+1]; + + /* channel simulation */ + + float sig_pwr_av; +}; + +/*---------------------------------------------------------------------------*\ + + FUNCTION PROTOTYPES + +\*---------------------------------------------------------------------------*/ + +void bits_to_dqpsk_symbols(COMP tx_symbols[], int Nc, COMP prev_tx_symbols[], int tx_bits[], int *pilot_bit, int old_qpsk_mapping); +void tx_filter(COMP tx_baseband[NC+1][M], int Nc, COMP tx_symbols[], COMP tx_filter_memory[NC+1][NSYM]); +void fdm_upconvert(COMP tx_fdm[], int Nc, COMP tx_baseband[NC+1][M], COMP phase_tx[], COMP freq_tx[], + COMP *fbb_phase, COMP fbb_rect); +void tx_filter_and_upconvert(COMP tx_fdm[], int Nc, COMP tx_symbols[], + COMP tx_filter_memory[NC+1][NSYM], + COMP phase_tx[], COMP freq[], COMP *fbb_phase, COMP fbb_rect); +void generate_pilot_fdm(COMP *pilot_fdm, int *bit, float *symbol, float *filter_mem, COMP *phase, COMP *freq); +void generate_pilot_lut(COMP pilot_lut[], COMP *pilot_freq); +float rx_est_freq_offset(struct FDMDV *f, COMP rx_fdm[], int nin, int do_fft); +void lpf_peak_pick(float *foff, float *max, COMP pilot_baseband[], COMP pilot_lpf[], kiss_fft_cfg fft_pilot_cfg, COMP S[], int nin, int do_fft); +void fdm_downconvert(COMP rx_baseband[NC+1][M+M/P], int Nc, COMP rx_fdm[], COMP phase_rx[], COMP freq[], int nin); +void rxdec_filter(COMP rx_fdm_filter[], COMP rx_fdm[], COMP rxdec_lpf_mem[], int nin); +void rx_filter(COMP rx_filt[NC+1][P+1], int Nc, COMP rx_baseband[NC+1][M+M/P], COMP rx_filter_memory[NC+1][NFILTER], int nin); +void down_convert_and_rx_filter(COMP rx_filt[NC+1][P+1], int Nc, COMP rx_fdm[], + COMP rx_fdm_mem[], COMP phase_rx[], COMP freq[], + float freq_pol[], int nin, int dec_rate); +float rx_est_timing(COMP rx_symbols[], int Nc, + COMP rx_filt[NC+1][P+1], + COMP rx_filter_mem_timing[NC+1][NT*P], + float env[], + int nin, + int m); +float qpsk_to_bits(int rx_bits[], int *sync_bit, int Nc, COMP phase_difference[], COMP prev_rx_symbols[], COMP rx_symbols[], int old_qpsk_mapping); +void snr_update(float sig_est[], float noise_est[], int Nc, COMP phase_difference[]); +int freq_state(int *reliable_sync_bit, int sync_bit, int *state, int *timer, int *sync_mem); +float calc_snr(int Nc, float sig_est[], float noise_est[]); + +#endif diff --git a/codec2/tags/0.4.1/src/fdmdv_mod.c b/codec2/tags/0.4.1/src/fdmdv_mod.c new file mode 100644 index 00000000..5fac650a --- /dev/null +++ b/codec2/tags/0.4.1/src/fdmdv_mod.c @@ -0,0 +1,159 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: fdmdv_mod.c + AUTHOR......: David Rowe + DATE CREATED: April 28 2012 + + Given an input file of bits outputs a raw file (8kHz, 16 bit shorts) + of FDMDV modem samples ready to send over a HF radio channel. The + input file is assumed to be arranged as codec frames of 56 bits (7 + bytes) which we send as two 28 bit modem frames. + +\*---------------------------------------------------------------------------*/ + + +/* + Copyright (C) 2012 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, 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 . +*/ + +#include +#include +#include +#include +#include +#include + +#include "codec2_fdmdv.h" + +int main(int argc, char *argv[]) +{ + FILE *fin, *fout; + struct FDMDV *fdmdv; + char *packed_bits; + 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; + int bits_per_codec_frame; + int bytes_per_codec_frame; + int Nc; + COMP foff_phase_rect; + float foff; + + if (argc < 3) { + printf("usage: %s InputBitFile OutputModemRawFile [Nc]\n", argv[0]); + printf("e.g %s hts1a.c2 hts1a_fdmdv.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 bit 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 modem sample file: %s: %s.\n", + argv[2], strerror(errno)); + exit(1); + } + + if (argc == 4) { + Nc = atoi(argv[3]); + + if ((Nc < 2) || (Nc > FDMDV_NC_MAX) ) { + fprintf(stderr, "Error number of carriers must be btween 2 and %d\n", FDMDV_NC_MAX); + exit(1); + } + } + else + Nc = FDMDV_NC; + + fdmdv = fdmdv_create(Nc); + + bits_per_fdmdv_frame = fdmdv_bits_per_frame(fdmdv); + bits_per_codec_frame = 2*fdmdv_bits_per_frame(fdmdv); + bytes_per_codec_frame = (bits_per_codec_frame+7)/8; + + packed_bits = (char*)malloc(bytes_per_codec_frame); + assert(packed_bits != NULL); + tx_bits = (int*)malloc(sizeof(int)*bits_per_codec_frame); + assert(tx_bits != NULL); + + foff = -100; + foff_phase_rect.real = 1.0; foff_phase_rect.imag = 0.0; + + frames = 0; + + while(fread(packed_bits, sizeof(char), bytes_per_codec_frame, fin) == bytes_per_codec_frame) { + frames++; + + /* unpack bits, MSB first */ + + bit = 7; byte = 0; + for(i=0; i> bit) & 0x1; + bit--; + if (bit < 0) { + bit = 7; + byte++; + } + } + + /* modulate even and odd frames */ + + fdmdv_mod(fdmdv, tx_fdm, tx_bits, &sync_bit); + assert(sync_bit == 1); + + fdmdv_mod(fdmdv, &tx_fdm[FDMDV_NOM_SAMPLES_PER_FRAME], &tx_bits[bits_per_fdmdv_frame], &sync_bit); + assert(sync_bit == 0); + + #ifdef CHANNEL_SIM + /* optional freq shift and channel simulation */ + + fdmdv_freq_shift(tx_fdm, tx_fdm, foff, &foff_phase_rect, 2*FDMDV_NOM_SAMPLES_PER_FRAME); + fdmdv_simulate_channel(&sig_pwr_av, tx_fdm, 2*FDMDV_NOM_SAMPLES_PER_FRAME, 10.0); + #endif + + /* scale and save to disk as shorts */ + + for(i=0; i<2*FDMDV_NOM_SAMPLES_PER_FRAME; i++) + tx_fdm_scaled[i] = FDMDV_SCALE * tx_fdm[i].real; + + fwrite(tx_fdm_scaled, sizeof(short), 2*FDMDV_NOM_SAMPLES_PER_FRAME, fout); + + /* if this is in a pipeline, we probably don't want the usual + buffering to occur */ + + if (fout == stdout) fflush(stdout); + if (fin == stdin) fflush(stdin); + } + + //fdmdv_dump_osc_mags(fdmdv); + + free(tx_bits); + free(packed_bits); + fclose(fin); + fclose(fout); + fdmdv_destroy(fdmdv); + + return 0; +} diff --git a/codec2/tags/0.4.1/src/fdmdv_put_test_bits.c b/codec2/tags/0.4.1/src/fdmdv_put_test_bits.c new file mode 100644 index 00000000..5add4ab5 --- /dev/null +++ b/codec2/tags/0.4.1/src/fdmdv_put_test_bits.c @@ -0,0 +1,169 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: fdmdv_put_test_bits.c + AUTHOR......: David Rowe + DATE CREATED: 1 May 2012 + + Using a file of packed test bits as input, determines bit error + rate. Useful for testing fdmdv_demod. + +\*---------------------------------------------------------------------------*/ + + +/* + Copyright (C) 2012 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, 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 . +*/ + +#include +#include +#include +#include +#include +#include + +#include "codec2_fdmdv.h" + +int main(int argc, char *argv[]) +{ + FILE *fin; + struct FDMDV *fdmdv; + char *packed_bits; + int *rx_bits; + int i, bit, byte; + int test_frame_sync, bit_errors, total_bit_errors, total_bits, ntest_bits; + int test_frame_sync_state, test_frame_count; + int bits_per_fdmdv_frame; + int bits_per_codec_frame; + int bytes_per_codec_frame; + int Nc; + short *error_pattern; + + if (argc < 2) { + printf("usage: %s InputBitFile [Nc]\n", argv[0]); + printf("e.g %s test.c2\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 bit file: %s: %s.\n", + argv[1], strerror(errno)); + exit(1); + } + + if (argc == 3) { + Nc = atoi(argv[2]); + if ((Nc < 2) || (Nc > FDMDV_NC_MAX) ) { + fprintf(stderr, "Error number of carriers must be between 2 and %d\n", FDMDV_NC_MAX); + exit(1); + } + } + else + Nc = FDMDV_NC; + + fdmdv = fdmdv_create(Nc); + + bits_per_fdmdv_frame = fdmdv_bits_per_frame(fdmdv); + bits_per_codec_frame = 2*fdmdv_bits_per_frame(fdmdv); + bytes_per_codec_frame = (bits_per_codec_frame+7)/8; + fprintf(stderr, "bits_per_fdmdv_frame: %d bits_per_codec_frame: %d bytes_per_codec_frame: %d\n", + bits_per_fdmdv_frame, bits_per_codec_frame, bytes_per_codec_frame); + + packed_bits = (char*)malloc(bytes_per_codec_frame); + assert(packed_bits != NULL); + rx_bits = (int*)malloc(sizeof(int)*bits_per_codec_frame); + assert(rx_bits != NULL); + + error_pattern = (short*)malloc(fdmdv_error_pattern_size(fdmdv)*sizeof(int)); + assert(error_pattern != NULL); + + total_bit_errors = 0; + total_bits = 0; + test_frame_sync_state = 0; + test_frame_count = 0; + + while(fread(packed_bits, sizeof(char), bytes_per_codec_frame, fin) == bytes_per_codec_frame) { + /* unpack bits, MSB first */ + + bit = 7; byte = 0; + for(i=0; i> bit) & 0x1; + //printf("%d 0x%x %d\n", i, packed_bits[byte], rx_bits[i]); + bit--; + if (bit < 0) { + bit = 7; + byte++; + } + } + + fdmdv_put_test_bits(fdmdv, &test_frame_sync, error_pattern, &bit_errors, &ntest_bits, rx_bits); + + if (test_frame_sync == 1) { + test_frame_sync_state = 1; + test_frame_count = 0; + } + + if (test_frame_sync_state) { + if (test_frame_count == 0) { + total_bit_errors += bit_errors; + total_bits = total_bits + ntest_bits; + printf("+"); + } + else + printf("-"); + test_frame_count++; + if (test_frame_count == 4) + test_frame_count = 0; + } + else + printf("-"); + + fdmdv_put_test_bits(fdmdv, &test_frame_sync, error_pattern, &bit_errors, &ntest_bits, &rx_bits[bits_per_fdmdv_frame]); + + if (test_frame_sync == 1) { + test_frame_sync_state = 1; + test_frame_count = 0; + } + + if (test_frame_sync_state) { + if (test_frame_count == 0) { + total_bit_errors += bit_errors; + total_bits = total_bits + ntest_bits; + printf("+"); + } + else + printf("-"); + test_frame_count++; + if (test_frame_count == 4) + test_frame_count = 0; + } + else + printf("-"); + + /* if this is in a pipeline, we probably don't want the usual + buffering to occur */ + + if (fin == stdin) fflush(stdin); + } + + fclose(fin); + free(error_pattern); + fdmdv_destroy(fdmdv); + + printf("\nbits %d errors %d BER %1.4f\n", total_bits, total_bit_errors, (float)total_bit_errors/(1E-6+total_bits) ); + return 0; +} + diff --git a/codec2/tags/0.4.1/src/fec_dec.c b/codec2/tags/0.4.1/src/fec_dec.c new file mode 100644 index 00000000..350b0119 --- /dev/null +++ b/codec2/tags/0.4.1/src/fec_dec.c @@ -0,0 +1,307 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: fec_dec.c + AUTHOR......: David Rowe + DATE CREATED: 4 march 2013 + + FEC decoder for data from modem containing compressed Codec 2 data + and FEC. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2013 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 . +*/ + +#include "codec2.h" +#include "codec2_fdmdv.h" +#include "golay23.h" + +#include +#include +#include +#include +#include + +#define MODE_1600 0 +#define MODE_1850 1 +#define MODE_2000 2 + +int main(int argc, char *argv[]) +{ + void *codec2, *fdmdv; + FILE *fin; + FILE *fout; + int bits_per_input_frame, bytes_per_input_frame; + unsigned char *packed_input_bits; + int *unpacked_input_bits; + int bits_per_output_frame, bytes_per_output_frame; + unsigned char *packed_output_bits; + int *unpacked_output_bits; + int codec2_mode, mode, Nc, bit, byte; + int i,j; + int recd_codeword, codeword1, codeword2; + + if (argc < 3) { + printf("%s InputFromModemWithFECFile OutputToCodec2File [2000|1600]\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 from Demod: %s: %s.\n", + argv[2], 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 to Codec : %s: %s.\n", + argv[3], strerror(errno)); + exit(1); + } + + /* input parameters and buffers. Note data is split into two 20ms + frames for transmission over modem. */ + + if ((argc != 4) || (strcmp(argv[3],"2000") == 0)) { + /* 2000 bit/s with FEC */ + mode = MODE_2000; + codec2_mode = CODEC2_MODE_1400; + Nc = 20; + } else if ((strcmp(argv[3],"1850") == 0)) { + /* 1850 bit/s with FEC */ + mode = MODE_1850; + codec2_mode = CODEC2_MODE_1300; + Nc = 20; + } + else if (strcmp(argv[3],"1600") == 0) { + /* 1600 bit/s with FEC (actually 1575 with one spare) */ + mode = MODE_1600; + codec2_mode = CODEC2_MODE_1300; + Nc = 16; + } + else { + fprintf(stderr, "Error in mode: %s. Must be 2000 or 1600\n", argv[3]); + exit(1); + } + + fdmdv = fdmdv_create(Nc); + + bits_per_input_frame = 2*fdmdv_bits_per_frame(fdmdv); + bytes_per_input_frame = bits_per_input_frame / 8; + assert((bits_per_input_frame % 8) == 0); /* make sure integer number of bytes per frame */ + + packed_input_bits = (unsigned char*)malloc(bytes_per_input_frame*sizeof(char)); + assert(packed_input_bits != NULL); + unpacked_input_bits = (int*)malloc(bits_per_input_frame*sizeof(int)); + assert(unpacked_input_bits != NULL); + + /* + Output parameters and buffers. + */ + + codec2 = codec2_create(codec2_mode); + + bits_per_output_frame = codec2_bits_per_frame(codec2); + bytes_per_output_frame = (bits_per_output_frame+7)/8; + + packed_output_bits = (unsigned char*)malloc(bytes_per_output_frame*sizeof(char)); + assert(packed_output_bits != NULL); + unpacked_output_bits = (int*)malloc(bits_per_output_frame*sizeof(int)); + assert(unpacked_output_bits != NULL); + + fprintf(stderr, "input bits: %d input_bytes: %d output_bits: %d output_bytes: %d\n", + bits_per_input_frame, bytes_per_input_frame, bits_per_output_frame, bytes_per_output_frame); + + /* main loop */ + + golay23_init(); + + while(fread(packed_input_bits, sizeof(char), bytes_per_input_frame, fin) == (size_t)bytes_per_input_frame) { + + /* unpack bits, MSB first */ + + bit = 7; byte = 0; + for(i=0; i> bit) & 0x1; + bit--; + if (bit < 0) { + bit = 7; + byte++; + } + } + + #ifdef TEST + /* Some test bit errors (not comprehesnive) */ + unpacked_input_bits[0] = (unpacked_input_bits[0] ^ 1) & 0x1; + unpacked_input_bits[23] = (unpacked_input_bits[23] ^ 1) & 0x1; + #endif + + if (mode == MODE_2000) { + /* decode first codeword */ + + recd_codeword = 0; + for(i=0; i<12; i++) { + recd_codeword <<= 1; + recd_codeword |= unpacked_input_bits[i]; + } + for(i=bits_per_output_frame; i> (22-i)) & 0x1; + } + + /* decode second codeword */ + + recd_codeword = 0; + for(i=12; i<24; i++) { + recd_codeword <<= 1; + recd_codeword |= unpacked_input_bits[i]; + } + for(i=bits_per_output_frame+11; i> (22-i)) & 0x1; + } + + /* unprotected bits */ + + for(i=24; i> (22-i)) & 0x1; + } + for(i=8,j=11; i<12; i++,j++) { + unpacked_output_bits[j] = (codeword1 >> (22-i)) & 0x1; + } + } + + if (mode == MODE_1850) { + recd_codeword = 0; + for(i=0; i<8; i++) { + recd_codeword <<= 1; + recd_codeword |= unpacked_input_bits[i]; + } + for(i=11; i<15; i++) { + recd_codeword <<= 1; + recd_codeword |= unpacked_input_bits[i]; + } + for(i=bits_per_output_frame; i> (22-i)) & 0x1; + } + for(i=8,j=11; i<12; i++,j++) { + unpacked_output_bits[j] = (codeword1 >> (22-i)) & 0x1; + } + for(i=0,j=16; i<12; i++,j++) { + unpacked_output_bits[j] = (codeword2 >> (22-i)) & 0x1; + } + + } + + /* pack bits, MSB first */ + + bit = 7; byte = 0; + memset(packed_output_bits, 0, bytes_per_output_frame); + for(i=0; i. +*/ + +#include "codec2.h" +#include "codec2_fdmdv.h" +#include "golay23.h" + +#include +#include +#include +#include +#include + +#define MODE_1600 0 +#define MODE_1850 1 +#define MODE_2000 2 + +int main(int argc, char *argv[]) +{ + void *codec2, *fdmdv; + FILE *fin; + FILE *fout; + int bits_per_input_frame, bytes_per_input_frame; + unsigned char *packed_input_bits; + int *unpacked_input_bits; + int bits_per_output_frame, bytes_per_output_frame; + unsigned char *packed_output_bits; + int *unpacked_output_bits; + int codec2_mode, mode, Nc, bit, byte; + int i,j; + int data, codeword1, codeword2; + + if (argc < 3) { + printf("%s InputFromCodecFile OutputToModemWithFECFile [2000|1850|1600]\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 from Codec: %s: %s.\n", + argv[2], 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[3], strerror(errno)); + exit(1); + } + + if ((argc != 4) || (strcmp(argv[3],"2000") == 0)) { + /* 2000 bit/s with FEC */ + mode = MODE_2000; + codec2_mode = CODEC2_MODE_1400; + Nc = 20; + } else if ((strcmp(argv[3],"1850") == 0)) { + /* 1850 bit/s with FEC */ + mode = MODE_1850; + codec2_mode = CODEC2_MODE_1300; + Nc = 20; + } + else if (strcmp(argv[3],"1600") == 0) { + /* 1600 bit/s with FEC (actually 1575 with one spare) */ + mode = MODE_1600; + codec2_mode = CODEC2_MODE_1300; + Nc = 16; + } + else { + fprintf(stderr, "Error in mode: %s. Must be 2000, 1850, or 1600\n", argv[3]); + exit(1); + } + + /* input parameters and buffers */ + + codec2 = codec2_create(codec2_mode); + + bits_per_input_frame = codec2_bits_per_frame(codec2); + bytes_per_input_frame = (bits_per_input_frame + 7)/8; + + packed_input_bits = (unsigned char*)malloc(bytes_per_input_frame*sizeof(char)); + assert(packed_input_bits != NULL); + unpacked_input_bits = (int*)malloc(bits_per_input_frame*sizeof(int)); + assert(unpacked_input_bits != NULL); + + /* + Output parameters and buffers. Data is split into two 20ms + frames for transmission over modem, but this doesn't really + bother us here, as fdmdv_mod takes care of that. + */ + + fdmdv = fdmdv_create(Nc); + + bits_per_output_frame = 2*fdmdv_bits_per_frame(fdmdv); + bytes_per_output_frame = (bits_per_output_frame+7)/8; + + packed_output_bits = (unsigned char*)malloc(bytes_per_output_frame*sizeof(char)); + assert(packed_output_bits != NULL); + unpacked_output_bits = (int*)malloc(bits_per_output_frame*sizeof(int)); + assert(unpacked_output_bits != NULL); + + fprintf(stderr, "mode: %d Nc: %d\n", mode, Nc); + fprintf(stderr, "input bits: %d input_bytes: %d output_bits: %d output_bytes: %d\n", + bits_per_input_frame, bytes_per_input_frame, bits_per_output_frame, bytes_per_output_frame); + + /* main loop */ + + golay23_init(); + + while(fread(packed_input_bits, sizeof(char), bytes_per_input_frame, fin) == (size_t)bytes_per_input_frame) { + + /* unpack bits, MSB first */ + + bit = 7; byte = 0; + for(i=0; i> bit) & 0x1; + bit--; + if (bit < 0) { + bit = 7; + byte++; + } + } + + /* add FEC ---------------------------------------------------------*/ + + if (mode == MODE_2000) { + /* Protect first 24 bits with (23,12) Golay Code. The first + 24 bits are the most sensitive, as they contain the + pitch/energy VQ and voicing bits. This uses 56 + 11 + 11 = + 78 bits, so we have two spare in 80 bit frame sent to + modem. */ + + /* first codeword */ + + data = 0; + for(i=0; i<12; i++) { + data <<= 1; + data |= unpacked_input_bits[i]; + } + codeword1 = golay23_encode(data); + //fprintf(stderr, "data1: 0x%x codeword1: 0x%x\n", data, codeword1); + + /* second codeword */ + + data = 0; + for(i=12; i<24; i++) { + data <<= 1; + data |= unpacked_input_bits[i]; + } + codeword2 = golay23_encode(data); + //fprintf(stderr, "data: 0x%x codeword2: 0x%x\n", data, codeword2); + + /* now pack output frame with parity bits at end to make them + as far apart as possible from the data the protect. Parity + bits are LSB of the Golay codeword */ + + for(i=0; i> (10-j)) & 0x1; + } + for(j=0; i> (10-j)) & 0x1; + } + } + + if (mode == MODE_1850) { + + /* Protect first 12 out of first 16 excitation bits with (23,12) Golay Code: + + 0,1,2,3: v[0]..v[1] + 4,5,6,7: MSB of pitch + 11,12,13,14: MSB of energy + + */ + + data = 0; + for(i=0; i<8; i++) { + data <<= 1; + data |= unpacked_input_bits[i]; + } + for(i=11; i<15; i++) { + data <<= 1; + data |= unpacked_input_bits[i]; + } + codeword1 = golay23_encode(data); + + /* Protect first 12 LSP bits with (23,12) Golay Code */ + + data = 0; + for(i=16; i<28; i++) { + data <<= 1; + data |= unpacked_input_bits[i]; + } + codeword2 = golay23_encode(data); + fprintf(stderr, "codeword2: 0x0%x\n", codeword2); + + /* now pack output frame with parity bits at end to make them + as far apart as possible from the data they protect. Parity + bits are LSB of the Golay codeword */ + + for(i=0; i> (10-j)) & 0x1; + unpacked_output_bits[i+11] = (codeword2 >> (10-j)) & 0x1; + } + for(i=bits_per_input_frame+11+11; i> (10-j)) & 0x1; + } + unpacked_output_bits[i] = 0; /* spare bit */ + + //for(i=0; i. +*/ + +#include +#include +#include +#include "codec2_fifo.h" + +struct FIFO { + short *buf; + short *pin; + short *pout; + int nshort; +}; + +struct FIFO *fifo_create(int nshort) { + struct FIFO *fifo; + + fifo = (struct FIFO *)malloc(sizeof(struct FIFO)); + assert(fifo != NULL); + + fifo->buf = (short*)malloc(sizeof(short)*nshort); + assert(fifo->buf != NULL); + fifo->pin = fifo->buf; + fifo->pout = fifo->buf; + fifo->nshort = nshort; + + return fifo; +} + +void fifo_destroy(struct FIFO *fifo) { + assert(fifo != NULL); + free(fifo->buf); + free(fifo); +} + +int fifo_write(struct FIFO *fifo, short data[], int n) { + int i; + int fifo_free; + short *pdata; + short *pin = fifo->pin; + + assert(fifo != NULL); + assert(data != NULL); + + // available storage is one less than nshort as prd == pwr + // is reserved for empty rather than full + + fifo_free = fifo->nshort - fifo_used(fifo) - 1; + + if (n > fifo_free) { + return -1; + } + else { + + /* This could be made more efficient with block copies + using memcpy */ + + pdata = data; + for(i=0; ibuf + fifo->nshort)) + pin = fifo->buf; + } + fifo->pin = pin; + } + + return 0; +} + +int fifo_read(struct FIFO *fifo, short data[], int n) +{ + int i; + short *pdata; + short *pout = fifo->pout; + + assert(fifo != NULL); + assert(data != NULL); + + if (n > fifo_used(fifo)) { + return -1; + } + else { + + /* This could be made more efficient with block copies + using memcpy */ + + pdata = data; + for(i=0; ibuf + fifo->nshort)) + pout = fifo->buf; + } + fifo->pout = pout; + } + + return 0; +} + +int fifo_used(struct FIFO *fifo) +{ + short *pin = fifo->pin; + short *pout = fifo->pout; + unsigned int used; + + assert(fifo != NULL); + if (pin >= pout) + used = pin - pout; + else + used = fifo->nshort + (unsigned int)(pin - pout); + + return used; +} + diff --git a/codec2/tags/0.4.1/src/fm.c b/codec2/tags/0.4.1/src/fm.c new file mode 100644 index 00000000..bdccd8a8 --- /dev/null +++ b/codec2/tags/0.4.1/src/fm.c @@ -0,0 +1,195 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: fm.c + AUTHOR......: David Rowe + DATE CREATED: February 2015 + + Functions that implement analog FM modulation and demodulation, see + also octave/fm.m. + +\*---------------------------------------------------------------------------*/ + +/* + 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 . +*/ + +/*---------------------------------------------------------------------------*\ + + DEFINES + +\*---------------------------------------------------------------------------*/ + +#define FILT_MEM 200 + +/*---------------------------------------------------------------------------*\ + + INCLUDES + +\*---------------------------------------------------------------------------*/ + +#include +#include +#include +#include +#include + +#include "codec2_fm.h" +#include "fm_fir_coeff.h" +#include "comp_prim.h" + +/*---------------------------------------------------------------------------*\ + + FUNCTIONS + +\*---------------------------------------------------------------------------*/ + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: fm_create + AUTHOR......: David Rowe + DATE CREATED: 24 Feb 2015 + + Create and initialise an instance of the "modem". Returns a pointer + to the modem states or NULL on failure. One set of states is + sufficient for a full duplex modem. + +\*---------------------------------------------------------------------------*/ + +struct FM *fm_create(int nsam) +{ + struct FM *fm; + + fm = (struct FM*)malloc(sizeof(struct FM)); + if (fm == NULL) + return NULL; + fm->rx_bb = (COMP*)malloc(sizeof(COMP)*(FILT_MEM+nsam)); + assert(fm->rx_bb != NULL); + + fm->rx_bb_filt_prev.real = 0.0; + fm->rx_bb_filt_prev.imag = 0.0; + fm->lo_phase.real = 1.0; + fm->lo_phase.imag = 0.0; + + fm->rx_dem_mem = (float*)malloc(sizeof(float)*(FILT_MEM+nsam)); + assert(fm->rx_dem_mem != NULL); + + fm->nsam = nsam; + + return fm; +} + + +void fm_destroy(struct FM *fm_states) +{ + free(fm_states->rx_bb); + free(fm_states->rx_dem_mem); + free(fm_states); +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: fm_demod + AUTHOR......: David Rowe + DATE CREATED: 24 Feb 2015 + + Demodulate a FM signal to baseband audio. + +\*---------------------------------------------------------------------------*/ + +void fm_demod(struct FM *fm_states, float rx_out[], float rx[]) +{ + float Fs = fm_states->Fs; + float fc = fm_states->fc; + float wc = 2*M_PI*fc/Fs; + float fd = fm_states->fd; + float wd = 2*M_PI*fd/Fs; + COMP *rx_bb = fm_states->rx_bb + FILT_MEM; + COMP wc_rect, rx_bb_filt, rx_bb_diff; + float rx_dem, acc; + float *rx_dem_mem = fm_states->rx_dem_mem + FILT_MEM; + int nsam = fm_states->nsam; + float mag; + int i,k; + + wc_rect.real = cosf(wc); wc_rect.imag = -sinf(wc); + + for(i=0; ilo_phase = cmult(fm_states->lo_phase, wc_rect); + rx_bb[i] = fcmult(rx[i], fm_states->lo_phase); + + /* input FIR filter */ + + rx_bb_filt.real = 0.0; rx_bb_filt.imag = 0.0; + + for(k=0; klo_phase.real, fm_states->lo_phase.imag); + //printf("%f %f %f\n", rx[i], rx_bb[i].real, rx_bb[i].imag); + //printf("%f %f\n", rx_bb_filt.real, rx_bb_filt.imag); + /* + Differentiate first, in rect domain, then find angle, this + puts signal on the positive side of the real axis and helps + atan2() behaive. + */ + + rx_bb_diff = cmult(rx_bb_filt, cconj(fm_states->rx_bb_filt_prev)); + fm_states->rx_bb_filt_prev = rx_bb_filt; + + rx_dem = atan2f(rx_bb_diff.imag, rx_bb_diff.real); + + /* limit maximum phase jumps, to remove static type noise at low SNRs */ + + if (rx_dem > wd) + rx_dem = wd; + if (rx_dem < -wd) + rx_dem = -wd; + + rx_dem *= (1/wd); + //printf("%f %f\n", rx_bb_diff.real, rx_bb_diff.imag); + rx_dem_mem[i] = rx_dem; + acc = 0; + /* + for(k=0; klo_phase); + fm_states->lo_phase.real /= mag; + fm_states->lo_phase.imag /= mag; + +} diff --git a/codec2/tags/0.4.1/src/fm_demod.c b/codec2/tags/0.4.1/src/fm_demod.c new file mode 100644 index 00000000..8042df65 --- /dev/null +++ b/codec2/tags/0.4.1/src/fm_demod.c @@ -0,0 +1,92 @@ +/*---------------------------------------------------------------------------*\ + + 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, 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 . +*/ + +#include +#include +#include +#include +#include +#include + +#include "codec2_fm.h" +#include "octave.h" + +#define N 160 + +int main(int argc, char *argv[]) +{ + FILE *fin, *fout; + struct FM *fm; + short buf[N]; + float rx[N]; + float rx_out[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 = 44400.0; + fm->fm_max = 3000.0; + fm->fd = 5000.0; + fm->fc = fm->Fs/4; + + while(fread(buf, sizeof(short), N, fin) == N) { + for(i=0; i. +*/ + +#include +#include +#include +#include +#include + +#include "codec2.h" +#include "codec2_fdmdv.h" +#include "fdmdv_internal.h" +#include "golay23.h" +#include "varicode.h" +#include "freedv_api.h" +#include "freedv_api_internal.h" +#include "comp_prim.h" + +#define VERSION 10 /* The API version number. The first version + is 10. Increment if the API changes in a + way that would require changes by the API + user. */ +/* + * Version 10 Initial version August 2, 2015. + * Version 11 September + * Changes go here. + * + */ + +#define NORM_PWR 1.74 /* experimentally derived fudge factor so 1600 and + 700 mode have the same tx power */ + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: freedv_open + AUTHOR......: David Rowe + DATE CREATED: 3 August 2014 + + Call this first to initialise. Returns NULL if initialisation fails + (e.g. out of memory or mode not supported). + +\*---------------------------------------------------------------------------*/ + +struct freedv *freedv_open(int mode) { + struct freedv *f; + int Nc, codec2_mode, nbit, nbyte; + + if ((mode != FREEDV_MODE_1600) && (mode != FREEDV_MODE_700) && (mode != FREEDV_MODE_700B)) + return NULL; + + f = (struct freedv*)malloc(sizeof(struct freedv)); + if (f == NULL) + return NULL; + + f->mode = mode; + f->test_frames = f->smooth_symbols = 0; + f->freedv_put_error_pattern = NULL; + f->error_pattern_callback_state = NULL; + + if (mode == FREEDV_MODE_1600) { + f->snr_squelch_thresh = 2.0; + f->squelch_en = 1; + Nc = 16; + f->tx_sync_bit = 0; + codec2_mode = CODEC2_MODE_1300; + f->fdmdv = fdmdv_create(Nc); + if (f->fdmdv == NULL) + return NULL; + golay23_init(); + f->nin = FDMDV_NOM_SAMPLES_PER_FRAME; + f->n_nom_modem_samples = 2*FDMDV_NOM_SAMPLES_PER_FRAME; + f->n_max_modem_samples = FDMDV_NOM_SAMPLES_PER_FRAME+FDMDV_MAX_SAMPLES_PER_FRAME; + f->modem_sample_rate = FS; + nbit = fdmdv_bits_per_frame(f->fdmdv); + f->fdmdv_bits = (int*)malloc(nbit*sizeof(int)); + if (f->fdmdv_bits == NULL) + return NULL; + nbit = 2*fdmdv_bits_per_frame(f->fdmdv); + f->tx_bits = (int*)malloc(nbit*sizeof(int)); + f->rx_bits = (int*)malloc(nbit*sizeof(int)); + if ((f->tx_bits == NULL) || (f->rx_bits == NULL)) + return NULL; + f->evenframe = 0; + f->sz_error_pattern = fdmdv_error_pattern_size(f->fdmdv); + } + +#ifndef CORTEX_M4 + if ((mode == FREEDV_MODE_700) || (mode == FREEDV_MODE_700B)) { + f->snr_squelch_thresh = 0.0; + f->squelch_en = 0; + if (mode == FREEDV_MODE_700) + codec2_mode = CODEC2_MODE_700; + else + codec2_mode = CODEC2_MODE_700B; + f->cohpsk = cohpsk_create(); + f->nin = COHPSK_NOM_SAMPLES_PER_FRAME; + f->n_nom_modem_samples = COHPSK_NOM_SAMPLES_PER_FRAME; + f->n_max_modem_samples = COHPSK_MAX_SAMPLES_PER_FRAME; + f->modem_sample_rate = COHPSK_FS; /* note wierd sample rate */ + f->clip = 1; + nbit = COHPSK_BITS_PER_FRAME; + f->tx_bits = (int*)malloc(nbit*sizeof(int)); + if (f->tx_bits == NULL) + return NULL; + f->sz_error_pattern = cohpsk_error_pattern_size(); + } +#endif + + f->test_frame_sync_state = 0; + f->total_bits = 0; + f->total_bit_errors = 0; + + f->codec2 = codec2_create(codec2_mode); + if (f->codec2 == NULL) + return NULL; + if (mode == FREEDV_MODE_1600) + f->n_speech_samples = codec2_samples_per_frame(f->codec2); + if ((mode == FREEDV_MODE_700) || (mode == FREEDV_MODE_700B)) + f->n_speech_samples = 2*codec2_samples_per_frame(f->codec2); + f->prev_rx_bits = (float*)malloc(sizeof(float)*2*codec2_bits_per_frame(f->codec2)); + if (f->prev_rx_bits == NULL) + return NULL; + + nbit = codec2_bits_per_frame(f->codec2); + nbyte = (nbit + 7) / 8; + f->packed_codec_bits = (unsigned char*)malloc(nbyte*sizeof(char)); + if (mode == FREEDV_MODE_1600) + f->codec_bits = (int*)malloc(nbit*sizeof(int)); + if ((mode == FREEDV_MODE_700) || (mode == FREEDV_MODE_700B)) + f->codec_bits = (int*)malloc(COHPSK_BITS_PER_FRAME*sizeof(int)); + + if ((f->packed_codec_bits == NULL) || (f->codec_bits == NULL)) + return NULL; + + varicode_decode_init(&f->varicode_dec_states, 1); + f->nvaricode_bits = 0; + f->varicode_bit_index = 0; + f->freedv_get_next_tx_char = NULL; + f->freedv_put_next_rx_char = NULL; + + f->total_bit_errors = 0; + + return f; +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: freedv_close + AUTHOR......: David Rowe + DATE CREATED: 3 August 2014 + + Frees up memory. + +\*---------------------------------------------------------------------------*/ + +void freedv_close(struct freedv *freedv) { + assert(freedv != NULL); + + free(freedv->prev_rx_bits); + free(freedv->packed_codec_bits); + free(freedv->codec_bits); + free(freedv->tx_bits); + if (freedv->mode == FREEDV_MODE_1600) + fdmdv_destroy(freedv->fdmdv); +#ifndef CORTEX_M4 + if (freedv->mode == FREEDV_MODE_700) + cohpsk_destroy(freedv->cohpsk); +#endif + codec2_destroy(freedv->codec2); + free(freedv); +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: freedv_tx + AUTHOR......: David Rowe + DATE CREATED: 3 August 2014 + + Takes a frame of input speech samples, encodes and modulates them to + produce a frame of modem samples that can be sent to the + transmitter. See freedv_tx.c for an example. + + speech_in[] is sampled at 8000 Hz, and the user must supply a block + of exactly freedv_get_n_speech_samples(). The speech_in[] level + should be such that the peak speech level is between +/- 16384 and + +/- 32767. + + The FDM modem signal mod_out[] is sampled at + freedv_get_modem_sample_rate() Hz and is + freedv_get_n_nom_modem_samples() long. mod_out[] will be scaled + such that the peak level is just less than +/-32767. + + Note that freedv_get_modem_sample_rate() is 8000 Hz for 1600 mode + but 7500 Hz for 700 and 700B mode. You must convert sample rates as + required. + + The complex-valued output can directly drive an I/Q modulator to + produce a single sideband signal. To generate the other sideband, + take the complex conjugate of mod_out[]. + + The FreeDV 1600 modem has a high crest factor (around 12dB), however + the energy and duration of the peaks is small. FreeDV 1600 is + usually operated at a "backoff" of 8dB. Adjust the power amplifier + drive so that the average power is 8dB less than the peak power of + the PA. For example, on a radio rated at 100W PEP for SSB, the + average FreeDV power is typically 20W. + + The FreeDV 700 modem has a crest factor of about 8dB (with + f->clip=1, the default), so if your PA can handle it, it can be + driven harder than FreeDV 1600. Caution - some PAs cannot handle a + high continuous power. A conservative level is 20W average for a + 100W PEP rated PA. + +\*---------------------------------------------------------------------------*/ + +/* real-valued short sample output, useful for going straight to DAC */ + +void freedv_tx(struct freedv *f, short mod_out[], short speech_in[]) { + assert(f != NULL); + COMP tx_fdm[f->n_nom_modem_samples]; + int i; + + freedv_comptx(f, tx_fdm, speech_in); + + for(i=0; in_nom_modem_samples; i++) + mod_out[i] = tx_fdm[i].real; +} + +/* complex valued output, useful for suitable for single sided freq shifting */ + +void freedv_comptx(struct freedv *f, COMP mod_out[], short speech_in[]) { + assert(f != NULL); + int bit, byte, i, j, k; + int bits_per_codec_frame, bits_per_modem_frame; + int data, codeword1, data_flag_index, nspare; + COMP tx_fdm[f->n_nom_modem_samples]; + + assert((f->mode == FREEDV_MODE_1600) || (f->mode == FREEDV_MODE_700) || (f->mode == FREEDV_MODE_700B)); + + if (f->mode == FREEDV_MODE_1600) { + bits_per_codec_frame = codec2_bits_per_frame(f->codec2); + bits_per_modem_frame = fdmdv_bits_per_frame(f->fdmdv); + + codec2_encode(f->codec2, f->packed_codec_bits, speech_in); + + /* unpack bits, MSB first */ + + bit = 7; byte = 0; + for(i=0; icodec_bits[i] = (f->packed_codec_bits[byte] >> bit) & 0x1; + bit--; + if (bit < 0) { + bit = 7; + byte++; + } + } + + // spare bit in frame that codec defines. Use this 1 + // bit/frame to send txt messages + + data_flag_index = codec2_get_spare_bit_index(f->codec2); + + if (f->nvaricode_bits) { + f->codec_bits[data_flag_index] = f->tx_varicode_bits[f->varicode_bit_index++]; + f->nvaricode_bits--; + } + + if (f->nvaricode_bits == 0) { + /* get new char and encode */ + char s[2]; + if (f->freedv_get_next_tx_char != NULL) { + s[0] = (*f->freedv_get_next_tx_char)(f->callback_state); + f->nvaricode_bits = varicode_encode(f->tx_varicode_bits, s, VARICODE_MAX_BITS, 1, 1); + f->varicode_bit_index = 0; + } + } + + /* Protect first 12 out of first 16 excitation bits with (23,12) Golay Code: + + 0,1,2,3: v[0]..v[1] + 4,5,6,7: MSB of pitch + 11,12,13,14: MSB of energy + + */ + + data = 0; + for(i=0; i<8; i++) { + data <<= 1; + data |= f->codec_bits[i]; + } + for(i=11; i<15; i++) { + data <<= 1; + data |= f->codec_bits[i]; + } + codeword1 = golay23_encode(data); + + /* now pack output frame with parity bits at end to make them + as far apart as possible from the data they protect. Parity + bits are LSB of the Golay codeword */ + + for(i=0; itx_bits[i] = f->codec_bits[i]; + for(j=0; itx_bits[i] = (codeword1 >> (10-j)) & 0x1; + } + f->tx_bits[i] = 0; /* spare bit */ + + /* optionally overwrite with test frames */ + + if (f->test_frames) { + fdmdv_get_test_bits(f->fdmdv, f->tx_bits); + fdmdv_get_test_bits(f->fdmdv, &f->tx_bits[bits_per_modem_frame]); + //fprintf(stderr, "test frames on tx\n"); + } + + /* modulate even and odd frames */ + + fdmdv_mod(f->fdmdv, tx_fdm, f->tx_bits, &f->tx_sync_bit); + assert(f->tx_sync_bit == 1); + + fdmdv_mod(f->fdmdv, &tx_fdm[FDMDV_NOM_SAMPLES_PER_FRAME], &f->tx_bits[bits_per_modem_frame], &f->tx_sync_bit); + assert(f->tx_sync_bit == 0); + + assert(2*FDMDV_NOM_SAMPLES_PER_FRAME == f->n_nom_modem_samples); + + for(i=0; in_nom_modem_samples; i++) + mod_out[i] = fcmult(FDMDV_SCALE, tx_fdm[i]); + } + + +#ifndef CORTEX_M4 + if ((f->mode == FREEDV_MODE_700) || (f->mode == FREEDV_MODE_700B)) { + bits_per_codec_frame = codec2_bits_per_frame(f->codec2); + bits_per_modem_frame = COHPSK_BITS_PER_FRAME; + + for (j=0; jcodec2, f->packed_codec_bits, speech_in); + speech_in += codec2_samples_per_frame(f->codec2); + + /* unpack bits, MSB first */ + + bit = 7; byte = 0; + for(i=0; icodec_bits[j+i] = (f->packed_codec_bits[byte] >> bit) & 0x1; + bit--; + if (bit < 0) { + bit = 7; + byte++; + } + } + + // spare bits in frame that codec defines. Use these spare + // bits/frame to send txt messages + + if (f->mode == FREEDV_MODE_700) + nspare = 2; + else + nspare = 1; // Just one spare bit for FREEDV_MODE_700B + + data_flag_index = codec2_get_spare_bit_index(f->codec2); + + for(k=0; knvaricode_bits) { + f->codec_bits[j+data_flag_index+k] = f->tx_varicode_bits[f->varicode_bit_index++]; + //fprintf(stderr, "%d %d\n", j+data_flag_index+k, f->codec_bits[j+data_flag_index+k]); + f->nvaricode_bits--; + } + + if (f->nvaricode_bits == 0) { + /* get new char and encode */ + char s[2]; + if (f->freedv_get_next_tx_char != NULL) { + s[0] = (*f->freedv_get_next_tx_char)(f->callback_state); + f->nvaricode_bits = varicode_encode(f->tx_varicode_bits, s, VARICODE_MAX_BITS, 1, 1); + f->varicode_bit_index = 0; + } + } + } + + } + + /* optionally ovwerwrite the codec bits with test frames */ + + if (f->test_frames) { + cohpsk_get_test_bits(f->cohpsk, f->codec_bits); + } + + /* cohpsk modulator */ + + cohpsk_mod(f->cohpsk, tx_fdm, f->codec_bits); + if (f->clip) + cohpsk_clip(tx_fdm); + for(i=0; in_nom_modem_samples; i++) + mod_out[i] = fcmult(FDMDV_SCALE*NORM_PWR, tx_fdm[i]); + } +#endif +} + +int freedv_nin(struct freedv *f) { + return f->nin; +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: freedv_rx + AUTHOR......: David Rowe + DATE CREATED: 3 August 2014 + + Takes a frame of samples from the radio receiver, demodulates and + decodes them, producing a frame of decoded speech samples. See + freedv_rx.c for an example. + + demod_in[] is a variable length block of received samples at the + modem sample rate given by freedv_get_n_max_modem_samples(). To + account for difference in the transmit and receive sample clock + frequencies, the number of demod_in[] samples is time varying. You + MUST call freedv_nin() BEFORE each call to freedv_rx() and pass + exactly that many samples to this function. + + To help set your buffer sizes, The maximum value of freedv_nin() is + freedv_get_n_max_modem_samples(). + + freedv_rx() returns the number of output speech samples available in + speech_out[], which is sampled at 8000 Hz. You should ALWAYS check + the return value of freedv_rx(), and read EXACTLY that number of + speech samples from speech_out[]. + + 1600 mode: When out of sync, it the number of output speech samples + returned will be freedv_nin(). When in sync to a valid FreeDV 1600 + signal, the number of output speech samples will alternate between + freedv_get_n_speech_samples() and 0. + + 700 and 700B mode: The number of output speech samples returned will + is always be freedv_get_n_speech_samples(), regardless of sync. + + The peak level of demod_in[] is not critical, as the demod works + well over a wide range of amplitude scaling. However avoid clipping + (overload, or samples pinned to +/- 32767). speech_out[] will peak + at just less than +/-32767. + + When out of sync, this function echoes the demod_in[] samples to + speech_out[]. This allows the user to listen to the channel, which + is useful for tuning FreeDV signals or reception of non-FreeDV + signals. Setting the squelch with freedv_set_squelch_en(1) will + return zero-valued samples instead. + +\*---------------------------------------------------------------------------*/ + + +// short version + +int freedv_rx(struct freedv *f, short speech_out[], short demod_in[]) { + assert(f != NULL); + COMP rx_fdm[f->n_max_modem_samples]; + int i; + + assert(f->nin <= f->n_max_modem_samples); + + for(i=0; inin; i++) { + rx_fdm[i].real = (float)demod_in[i]; + rx_fdm[i].imag = 0.0; + } + + return freedv_comprx(f, speech_out, rx_fdm); +} + + +// float input samples version + +int freedv_floatrx(struct freedv *f, short speech_out[], float demod_in[]) { + assert(f != NULL); + COMP rx_fdm[f->n_max_modem_samples]; + int i; + + assert(f->nin <= f->n_max_modem_samples); + + for(i=0; inin; i++) { + rx_fdm[i].real = demod_in[i]; + rx_fdm[i].imag = 0; + } + + return freedv_comprx(f, speech_out, rx_fdm); +} + +// complex input samples version + +int freedv_comprx(struct freedv *f, short speech_out[], COMP demod_in[]) { + assert(f != NULL); + int bits_per_codec_frame, bytes_per_codec_frame, bits_per_fdmdv_frame; + int i, j, bit, byte, nin_prev, nout, k; + int recd_codeword, codeword1, data_flag_index, n_ascii, nspare; + short abit[1]; + char ascii_out; + int reliable_sync_bit; + + assert(f->nin <= f->n_max_modem_samples); + + for(i=0; inin; i++) + demod_in[i] = fcmult(1.0/FDMDV_SCALE, demod_in[i]); + + bits_per_codec_frame = codec2_bits_per_frame(f->codec2); + bytes_per_codec_frame = (bits_per_codec_frame + 7) / 8; + nout = f->n_speech_samples; + + if (f->mode == FREEDV_MODE_1600) { + + bits_per_fdmdv_frame = fdmdv_bits_per_frame(f->fdmdv); + + nin_prev = f->nin; + fdmdv_demod(f->fdmdv, f->fdmdv_bits, &reliable_sync_bit, demod_in, &f->nin); + fdmdv_get_demod_stats(f->fdmdv, &f->stats); + f->sync = f->fdmdv->sync; + f->snr_est = f->stats.snr_est; + + if (reliable_sync_bit == 1) { + f->evenframe = 1; + } + + if (f->stats.sync) { + if (f->evenframe == 0) { + memcpy(f->rx_bits, f->fdmdv_bits, bits_per_fdmdv_frame*sizeof(int)); + nout = 0; + } + else { + memcpy(&f->rx_bits[bits_per_fdmdv_frame], f->fdmdv_bits, bits_per_fdmdv_frame*sizeof(int)); + + if (f->test_frames == 0) { + recd_codeword = 0; + for(i=0; i<8; i++) { + recd_codeword <<= 1; + recd_codeword |= (f->rx_bits[i] & 0x1); + } + for(i=11; i<15; i++) { + recd_codeword <<= 1; + recd_codeword |= (f->rx_bits[i] & 0x1); + } + for(i=bits_per_codec_frame; irx_bits[i] & 0x1); + } + codeword1 = golay23_decode(recd_codeword); + f->total_bit_errors += golay23_count_errors(recd_codeword, codeword1); + f->total_bits += 23; + + //codeword1 = recd_codeword; + //fprintf(stderr, "received codeword1: 0x%x decoded codeword1: 0x%x\n", recd_codeword, codeword1); + + for(i=0; icodec_bits[i] = f->rx_bits[i]; + + for(i=0; i<8; i++) { + f->codec_bits[i] = (codeword1 >> (22-i)) & 0x1; + } + for(i=8,j=11; i<12; i++,j++) { + f->codec_bits[j] = (codeword1 >> (22-i)) & 0x1; + } + + // extract txt msg data bit ------------------------------------------------------------ + + data_flag_index = codec2_get_spare_bit_index(f->codec2); + abit[0] = f->codec_bits[data_flag_index]; + + n_ascii = varicode_decode(&f->varicode_dec_states, &ascii_out, abit, 1, 1); + if (n_ascii && (f->freedv_put_next_rx_char != NULL)) { + (*f->freedv_put_next_rx_char)(f->callback_state, ascii_out); + } + + // reconstruct missing bit we steal for data bit and decode speech + + codec2_rebuild_spare_bit(f->codec2, f->codec_bits); + + // pack bits, MSB received first + + bit = 7; + byte = 0; + memset(f->packed_codec_bits, 0, bytes_per_codec_frame); + for(i=0; ipacked_codec_bits[byte] |= (f->codec_bits[i] << bit); + bit--; + if(bit < 0) { + bit = 7; + byte++; + } + } + + codec2_decode(f->codec2, speech_out, f->packed_codec_bits); + } + else { + int test_frame_sync, bit_errors, ntest_bits, k; + short error_pattern[fdmdv_error_pattern_size(f->fdmdv)]; + + for(k=0; k<2; k++) { + /* test frames, so lets sync up to the test frames and count any errors */ + fdmdv_put_test_bits(f->fdmdv, &test_frame_sync, error_pattern, &bit_errors, &ntest_bits, &f->rx_bits[k*bits_per_fdmdv_frame]); + + if (test_frame_sync == 1) { + f->test_frame_sync_state = 1; + f->test_frame_count = 0; + } + + if (f->test_frame_sync_state) { + if (f->test_frame_count == 0) { + f->total_bit_errors += bit_errors; + f->total_bits += ntest_bits; + if (f->freedv_put_error_pattern != NULL) { + (*f->freedv_put_error_pattern)(f->error_pattern_callback_state, error_pattern, fdmdv_error_pattern_size(f->fdmdv)); + } + } + f->test_frame_count++; + if (f->test_frame_count == 4) + f->test_frame_count = 0; + } + + //fprintf(stderr, "test_frame_sync: %d test_frame_sync_state: %d bit_errors: %d ntest_bits: %d\n", + // test_frame_sync, f->test_frame_sync_state, bit_errors, ntest_bits); + } + } + + + /* squelch if beneath SNR threshold or test frames enabled */ + + if ((f->squelch_en && (f->stats.snr_est < f->snr_squelch_thresh)) || f->test_frames) { + //fprintf(stderr,"squelch %f %f !\n", f->stats.snr_est, f->snr_squelch_thresh); + for(i=0; in_speech_samples; i++) + speech_out[i] = 0; + } + + nout = f->n_speech_samples; + + } + + /* note this freewheels if reliable sync dissapears on bad channels */ + + if (f->evenframe) + f->evenframe = 0; + else + f->evenframe = 1; + //fprintf(stderr,"%d\n", f->evenframe); + + } /* if (sync) .... */ + else { + /* if not in sync pass through analog samples */ + /* this lets us "hear" whats going on, e.g. during tuning */ + + //fprintf(stderr, "out of sync\n"); + + if (f->squelch_en == 0) { + for(i=0; imode == FREEDV_MODE_700) || (f->mode == FREEDV_MODE_700B)) { + float rx_bits[COHPSK_BITS_PER_FRAME]; + int sync; + + nin_prev = f->nin; + cohpsk_demod(f->cohpsk, rx_bits, &sync, demod_in, &f->nin); + f->sync = sync; + cohpsk_get_demod_stats(f->cohpsk, &f->stats); + f->snr_est = f->stats.snr_est; + + if (sync) { + + if (f->test_frames == 0) { + data_flag_index = codec2_get_spare_bit_index(f->codec2); + + /* optional smoothing of codec symbols */ + + if (f->smooth_symbols) { + + for(i=0; imode == FREEDV_MODE_700) + nspare = 2; + else + nspare = 1; + + for(k=0; kvaricode_dec_states, &ascii_out, abit, 1, 1); + if (n_ascii && (f->freedv_put_next_rx_char != NULL)) { + (*f->freedv_put_next_rx_char)(f->callback_state, ascii_out); + } + } + + /* pack bits, MSB received first */ + + bit = 7; byte = 0; + memset(f->packed_codec_bits, 0, bytes_per_codec_frame); + for(i=0; ipacked_codec_bits[byte] |= ((rx_bits[j+i] < 0.0) << bit); + bit--; + if (bit < 0) { + bit = 7; + byte++; + } + } + + codec2_decode(f->codec2, speech_out, f->packed_codec_bits); + + if (f->squelch_en && (f->stats.snr_est < f->snr_squelch_thresh)) { + for(i=0; in_speech_samples; i++) + speech_out[i] = 0; + } + speech_out += codec2_samples_per_frame(f->codec2); + } + nout = f->n_speech_samples; + } + else { + short error_pattern[COHPSK_BITS_PER_FRAME]; + int bit_errors; + + /* test data, lets see if we can sync to the test data sequence */ + + cohpsk_put_test_bits(f->cohpsk, &f->test_frame_sync_state, error_pattern, &bit_errors, rx_bits); + if (f->test_frame_sync_state) { + f->total_bit_errors += bit_errors; + f->total_bits += COHPSK_BITS_PER_FRAME; + if (f->freedv_put_error_pattern != NULL) { + (*f->freedv_put_error_pattern)(f->error_pattern_callback_state, error_pattern, COHPSK_BITS_PER_FRAME); + } + } + + for(i=0; in_speech_samples; i++) + speech_out[i] = 0; + nout = f->n_speech_samples; + } + + } + + if (sync == 0) { + if (f->squelch_en) { + for(i=0; in_speech_samples; i++) + speech_out[i] = 0; + nout = f->n_speech_samples; + } + else { + float t,a,b,s; + int t1; + + /* if not in sync pass through analog samples */ + /* this lets us "hear" whats going on, e.g. during tuning */ + /* need to linearly interp as Fs in and out slightly different */ + /* this is a bit crude (compared to analog FreeDV mode) + but it's probably OK for a tuning aid off air signals */ + + for(i=0, t=0.0; in_speech_samples; i++, t+=(float)f->modem_sample_rate/FS) { + t1 = floor(t); + a = t - t1; + b = 1.0 - a; + + /* avoid running past end of input array */ + + if (t1 < (f->nin-1)) + s = b*demod_in[t1].real + a*demod_in[t1+1].real; + else + s = b*demod_in[t1].real; + + speech_out[i] = FDMDV_SCALE*s; + /* + if ((i < 10) || (i > 590)) { + printf("i: %d t: %f t1: %d a: %f b: %f s[t1]: %f s[t2]: %f s: %f\n", + i,t,t1,a,b,demod_in[t1].real, demod_in[t1+1].real, s); + } + */ + } + nout = f->n_speech_samples; + //fprintf(stderr, "%d %d %d\n", f->n_speech_samples, speech_out[0], speech_out[nin_prev-1]); + } + } + + } +#endif + + //fprintf(stderr,"f->stats.sync: %d reliable_sync_bit: %d evenframe: %d nout: %d\n", f->stats.sync, reliable_sync_bit, f->evenframe, nout); + return nout; +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: freedv_get_version + AUTHOR......: Jim Ahlstrom + DATE CREATED: 28 July 2015 + + Return the version of the FreeDV API. This is meant to help API users determine when + incompatible changes have occurred. + +\*---------------------------------------------------------------------------*/ + +int freedv_get_version(void) +{ + return VERSION; +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: freedv_set_callback_txt + AUTHOR......: Jim Ahlstrom + DATE CREATED: 28 July 2015 + + Set the callback functions and the callback state pointer that will be used + for the aux txt channel. The freedv_callback_rx is a function pointer that + will be called to return received characters. The freedv_callback_tx is a + function pointer that will be called to send transmitted characters. The callback + state is a user-defined void pointer that will be passed to the callback functions. + Any or all can be NULL, and the default is all NULL. + The function signatures are: + void receive_char(void *callback_state, char c); + char transmit_char(void *callback_state); + +\*---------------------------------------------------------------------------*/ + +void freedv_set_callback_txt(struct freedv *f, freedv_callback_rx rx, freedv_callback_tx tx, void *state) +{ + f->freedv_put_next_rx_char = rx; + f->freedv_get_next_tx_char = tx; + f->callback_state = state; +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: freedv_get_modem_stats + AUTHOR......: Jim Ahlstrom + DATE CREATED: 28 July 2015 + + Return data from the modem. The arguments are pointers to the data items. The + pointers can be NULL if the data item is not wanted. + +\*---------------------------------------------------------------------------*/ + +void freedv_get_modem_stats(struct freedv *f, int *sync, float *snr_est) +{ + if (f->mode == FREEDV_MODE_1600) + fdmdv_get_demod_stats(f->fdmdv, &f->stats); +#ifndef CORTEX_M4 + if (f->mode == FREEDV_MODE_700) + cohpsk_get_demod_stats(f->cohpsk, &f->stats); +#endif + if (sync) *sync = f->stats.sync; + if (snr_est) *snr_est = f->stats.snr_est; +} + +/*---------------------------------------------------------------------------*\ + + FUNCTIONS...: freedv_set_* + AUTHOR......: Jim Ahlstrom + DATE CREATED: 28 July 2015 + + Set some parameters used by FreeDV. It is possible to write a macro using ## for + this, but I wasn't sure it would be 100% portable. + +\*---------------------------------------------------------------------------*/ + +// Set integers +void freedv_set_test_frames (struct freedv *f, int val) {f->smooth_symbols = val;} +void freedv_set_squelch_en (struct freedv *f, int val) {f->squelch_en = val;} +void freedv_zero_total_bit_errors (struct freedv *f) {f->total_bit_errors = 0;} +// Set floats +void freedv_set_snr_squelch_thresh (struct freedv *f, float val) {f->snr_squelch_thresh = val;} + +/*---------------------------------------------------------------------------*\ + + FUNCTIONS...: freedv_get_* + AUTHOR......: Jim Ahlstrom + DATE CREATED: 28 July 2015 + + Get some parameters from FreeDV. It is possible to write a macro using ## for + this, but I wasn't sure it would be 100% portable. + +\*---------------------------------------------------------------------------*/ + +// Get integers +int freedv_get_test_frames (struct freedv *f) {return f->test_frames;} +int freedv_get_n_speech_samples (struct freedv *f) {return f->n_speech_samples;} +int freedv_get_modem_sample_rate (struct freedv *f) {return f->modem_sample_rate;} +int freedv_get_n_max_modem_samples (struct freedv *f) {return f->n_max_modem_samples;} +int freedv_get_n_nom_modem_samples (struct freedv *f) {return f->n_nom_modem_samples;} +int freedv_get_total_bits (struct freedv *f) {return f->total_bits;} +int freedv_get_total_bit_errors (struct freedv *f) {return f->total_bit_errors;} +int freedv_get_sync (struct freedv *f) {return f->stats.sync;} +// Get floats + diff --git a/codec2/tags/0.4.1/src/freedv_api.h b/codec2/tags/0.4.1/src/freedv_api.h new file mode 100644 index 00000000..efb87b91 --- /dev/null +++ b/codec2/tags/0.4.1/src/freedv_api.h @@ -0,0 +1,83 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: freedv_api.h + AUTHOR......: David Rowe + DATE CREATED: August 2014 + + Library of API functions that implement FreeDV "modes", useful for + embedding FreeDV in other programs. Please see the documentation + for each function in freedv_api.c, and the sample freedv_tx.c and + freedv_rx.c programs. + +\*---------------------------------------------------------------------------*/ + +/* + 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 . +*/ + +#ifdef __cplusplus + extern "C" { +#endif + +#ifndef __FREEDV__ + +// This declares a single-precision (float) complex number +#include "comp.h" + +#define FREEDV_MODE_1600 0 +#define FREEDV_MODE_700 1 +#define FREEDV_MODE_700B 2 + +struct freedv; + +typedef void (*freedv_callback_rx)(void *, char); +typedef char (*freedv_callback_tx)(void *); + +// FreeDV API functions: +// open, close +struct freedv *freedv_open(int mode); +void freedv_close(struct freedv *freedv); +// Transmit +void freedv_tx(struct freedv *freedv, short mod_out[], short speech_in[]); +void freedv_comptx(struct freedv *freedv, COMP mod_out[], short speech_in[]); +// Receive +int freedv_nin(struct freedv *freedv); +int freedv_rx(struct freedv *freedv, short speech_out[], short demod_in[]); +int freedv_floatrx(struct freedv *freedv, short speech_out[], float demod_in[]); +int freedv_comprx(struct freedv *freedv, short speech_out[], COMP demod_in[]); +// Set parameters +void freedv_set_callback_txt(struct freedv *freedv, freedv_callback_rx rx, freedv_callback_tx tx, void *callback_state); +void freedv_set_test_frames (struct freedv *freedv, int test_frames); +void freedv_set_smooth_symbols (struct freedv *freedv, int smooth_symbols); +void freedv_set_squelch_en (struct freedv *freedv, int squelch_en); +void freedv_set_snr_squelch_thresh (struct freedv *freedv, float snr_squelch_thresh); +// Get parameters +int freedv_get_version(void); +void freedv_get_modem_stats(struct freedv *freedv, int *sync, float *snr_est); +int freedv_get_test_frames (struct freedv *freedv); +int freedv_get_n_speech_samples (struct freedv *freedv); +int freedv_get_modem_sample_rate (struct freedv *freedv); +int freedv_get_n_max_modem_samples (struct freedv *freedv); +int freedv_get_n_nom_modem_samples (struct freedv *freedv); +int freedv_get_total_bits (struct freedv *freedv); +int freedv_get_total_bit_errors (struct freedv *freedv); +void freedv_zero_total_bit_errors (struct freedv *freedv); +int freedv_get_sync (struct freedv *freedv); +#endif + +#ifdef __cplusplus +} +#endif diff --git a/codec2/tags/0.4.1/src/freedv_api_internal.h b/codec2/tags/0.4.1/src/freedv_api_internal.h new file mode 100644 index 00000000..ac486ea1 --- /dev/null +++ b/codec2/tags/0.4.1/src/freedv_api_internal.h @@ -0,0 +1,109 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: freedv_api_internal.h + AUTHOR......: David Rowe + DATE CREATED: August 2014 + + This declares the structure freedv. A pointer to this structure is + returned by the FreeDV API freedv_open() function. The pointer is used + by the other FreeDV API functions declared in freedv_api.h. This + structure is intended to be internal to the FreeDV API. The public + functions are declared in freedv_api.h. Changes to this structure + are expected. Changes (except additions) to freedv_api.h are + discouraged. + +\*---------------------------------------------------------------------------*/ + +/* + 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 . +*/ + +#ifdef __cplusplus + extern "C" { +#endif + +#ifndef __FREEDV__ + +#include "varicode.h" +#include "codec2_fdmdv.h" +#include "codec2_cohpsk.h" + +struct freedv { + int mode; + + struct CODEC2 *codec2; + struct FDMDV *fdmdv; + struct MODEM_STATS stats; + struct COHPSK *cohpsk; + + int n_speech_samples; + int n_nom_modem_samples; // size of tx and most rx modem sample buffers + int n_max_modem_samples; // make your rx modem sample buffers this big + + int modem_sample_rate; // ATM caller is responsible for meeting this (TBC) + int clip; // non-zero for cohpsk modem output clipping for low PAPR + + unsigned char *packed_codec_bits; + int *codec_bits; + int *tx_bits; + int *fdmdv_bits; + int *rx_bits; + int tx_sync_bit; + int smooth_symbols; + float *prev_rx_bits; + + int *ptest_bits_coh; + int *ptest_bits_coh_end; + + int test_frames; // set this baby for 1 to tx/rx test frames to look at bit error stats + int test_frame_sync_state; + int test_frame_count; + int total_bits; + int total_bit_errors; + int sz_error_pattern; + + /* optional user defined function to pass error pattern when a test frame is received */ + + void *error_pattern_callback_state; + void (*freedv_put_error_pattern)(void *error_pattern_callback_state, short error_pattern[], int sz_error_pattern); + + int sync; + int evenframe; + float snr_est; + float snr_squelch_thresh; + int squelch_en; + int nin; + + struct VARICODE_DEC varicode_dec_states; + short tx_varicode_bits[VARICODE_MAX_BITS]; + int nvaricode_bits; + int varicode_bit_index; + + /* user defined function ptrs to produce and consume ASCII + characters using aux txt channel */ + + char (*freedv_get_next_tx_char)(void *callback_state); + void (*freedv_put_next_rx_char)(void *callback_state, char c); + + void *callback_state; + +}; + +#endif + +#ifdef __cplusplus +} +#endif diff --git a/codec2/tags/0.4.1/src/freedv_rx.c b/codec2/tags/0.4.1/src/freedv_rx.c new file mode 100644 index 00000000..bcf3f981 --- /dev/null +++ b/codec2/tags/0.4.1/src/freedv_rx.c @@ -0,0 +1,164 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: freedv_rx.c + AUTHOR......: David Rowe + DATE CREATED: August 2014 + + Demo receive program for FreeDV API functions, some side information + written to freedv_rx_log.txt + + Example usage (all one line): + + codec2-dev/build_linux/src$ ./freedv_tx 1600 ../../raw/ve9qrp_10s.raw - | + ./freedv_rx 1600 - - | play -t raw -r 8000 -s -2 - + +\*---------------------------------------------------------------------------*/ + +/* + 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 . +*/ + +#include +#include +#include +#include +#include +#include +#include + +#include "freedv_api.h" + +struct my_callback_state { + FILE *ftxt; +}; + +void my_put_next_rx_char(void *callback_state, char c) { + struct my_callback_state* pstate = (struct my_callback_state*)callback_state; + if (pstate->ftxt != NULL) { + fprintf(pstate->ftxt, "%c\n", c); + } +} + +int main(int argc, char *argv[]) { + FILE *fin, *fout, *ftxt; + short *speech_out; + short *demod_in; + struct freedv *freedv; + int nin, nout, frame = 0; + struct my_callback_state my_cb_state; + int mode; + int sync; + int total_bits; + int total_bit_errors; + float snr_est; + int n_speech_samples; + int n_max_modem_samples; + + if (argc < 4) { + printf("usage: %s 1600|700|700B InputModemSpeechFile OutputSpeechRawFile [--test_frames]\n", argv[0]); + printf("e.g %s 1600 hts1a_fdmdv.raw hts1a_out.raw txtLogFile\n", argv[0]); + exit(1); + } + + mode = -1; + if (!strcmp(argv[1],"1600")) + mode = FREEDV_MODE_1600; + if (!strcmp(argv[1],"700")) + mode = FREEDV_MODE_700; + if (!strcmp(argv[1],"700B")) + mode = FREEDV_MODE_700B; + assert(mode != -1); + + if (strcmp(argv[2], "-") == 0) fin = stdin; + else if ( (fin = fopen(argv[2],"rb")) == NULL ) { + fprintf(stderr, "Error opening input raw modem sample file: %s: %s.\n", + argv[2], strerror(errno)); + exit(1); + } + + if (strcmp(argv[3], "-") == 0) fout = stdout; + else if ( (fout = fopen(argv[3],"wb")) == NULL ) { + fprintf(stderr, "Error opening output speech sample file: %s: %s.\n", + argv[3], strerror(errno)); + exit(1); + } + + freedv = freedv_open(mode); + assert(freedv != NULL); + + if ( (argc > 4) && (strcmp(argv[4], "--testframes") == 0) ) { + freedv_set_test_frames(freedv, 1); + } + freedv_set_snr_squelch_thresh(freedv, -100.0); + freedv_set_squelch_en(freedv, 1); + + n_speech_samples = freedv_get_n_speech_samples(freedv); + n_max_modem_samples = freedv_get_n_max_modem_samples(freedv); + speech_out = (short*)malloc(sizeof(short)*n_speech_samples); + assert(speech_out != NULL); + demod_in = (short*)malloc(sizeof(short)*n_max_modem_samples); + assert(demod_in != NULL); + + ftxt = fopen("freedv_rx_log.txt","wt"); + assert(ftxt != NULL); + my_cb_state.ftxt = ftxt; + freedv_set_callback_txt(freedv, &my_put_next_rx_char, NULL, &my_cb_state); + + /* Note we need to work out how many samples demod needs on each + call (nin). This is used to adjust for differences in the tx and rx + sample clock frequencies. Note also the number of output + speech samples is time varying (nout). */ + + nin = freedv_nin(freedv); + while(fread(demod_in, sizeof(short), nin, fin) == nin) { + frame++; + + nout = freedv_rx(freedv, speech_out, demod_in); + nin = freedv_nin(freedv); + + fwrite(speech_out, sizeof(short), nout, fout); + freedv_get_modem_stats(freedv, &sync, &snr_est); + total_bit_errors = freedv_get_total_bit_errors(freedv); + + /* log some side info to the txt file */ + + if (ftxt != NULL) { + fprintf(ftxt, "frame: %d demod sync: %d demod snr: %3.2f dB bit errors: %d\n", frame, + sync, snr_est, total_bit_errors); + } + + /* if this is in a pipeline, we probably don't want the usual + buffering to occur */ + + if (fout == stdout) fflush(stdout); + if (fin == stdin) fflush(stdin); + } + + if (freedv_get_test_frames(freedv)) { + total_bits = freedv_get_total_bits(freedv); + total_bit_errors = freedv_get_total_bit_errors(freedv); + fprintf(stderr, "bits: %d errors: %d BER: %3.2f\n", total_bits, total_bit_errors, (float)total_bit_errors/total_bits); + } + + free(speech_out); + free(demod_in); + freedv_close(freedv); + fclose(fin); + fclose(fout); + + return 0; +} + diff --git a/codec2/tags/0.4.1/src/freedv_tx.c b/codec2/tags/0.4.1/src/freedv_tx.c new file mode 100644 index 00000000..ee3f07f5 --- /dev/null +++ b/codec2/tags/0.4.1/src/freedv_tx.c @@ -0,0 +1,134 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: freedv_tx.c + AUTHOR......: David Rowe + DATE CREATED: August 2014 + + Demo transmit program for FreeDV API functions. + +\*---------------------------------------------------------------------------*/ + +/* + 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 . +*/ + +#include +#include +#include +#include +#include + +#include "freedv_api.h" + +struct my_callback_state { + char tx_str[80]; + char *ptx_str; +}; + +char my_get_next_tx_char(void *callback_state) { + struct my_callback_state* pstate = (struct my_callback_state*)callback_state; + char c = *pstate->ptx_str++; + + if (*pstate->ptx_str == 0) { + pstate->ptx_str = pstate->tx_str; + } + + return c; +} + +int main(int argc, char *argv[]) { + FILE *fin, *fout; + short *speech_in; + short *mod_out; + struct freedv *freedv; + struct my_callback_state my_cb_state; + int mode; + int n_speech_samples; + int n_nom_modem_samples; + + if (argc < 4) { + printf("usage: %s 1600|700|700B InputRawSpeechFile OutputModemRawFile [--testframes]\n", argv[0]); + printf("e.g %s 1600 hts1a.raw hts1a_fdmdv.raw\n", argv[0]); + exit(1); + } + + mode = -1; + if (!strcmp(argv[1],"1600")) + mode = FREEDV_MODE_1600; + if (!strcmp(argv[1],"700")) + mode = FREEDV_MODE_700; + if (!strcmp(argv[1],"700B")) + mode = FREEDV_MODE_700B; + assert(mode != -1); + + if (strcmp(argv[2], "-") == 0) fin = stdin; + else if ( (fin = fopen(argv[2],"rb")) == NULL ) { + fprintf(stderr, "Error opening input raw speech sample file: %s: %s.\n", + argv[2], strerror(errno)); + exit(1); + } + + if (strcmp(argv[3], "-") == 0) fout = stdout; + else if ( (fout = fopen(argv[3],"wb")) == NULL ) { + fprintf(stderr, "Error opening output modem sample file: %s: %s.\n", + argv[3], strerror(errno)); + exit(1); + } + + freedv = freedv_open(mode); + assert(freedv != NULL); + + if ((argc > 4) && (strcmp(argv[4], "--testframes") == 0)) { + freedv_set_test_frames(freedv, 1); + } + freedv_set_snr_squelch_thresh(freedv, -100.0); + freedv_set_squelch_en(freedv, 1); + + n_speech_samples = freedv_get_n_speech_samples(freedv); + n_nom_modem_samples = freedv_get_n_nom_modem_samples(freedv); + speech_in = (short*)malloc(sizeof(short)*n_speech_samples); + assert(speech_in != NULL); + mod_out = (short*)malloc(sizeof(short)*n_nom_modem_samples); + assert(mod_out != NULL); + + /* set up callback for txt msg chars */ + + sprintf(my_cb_state.tx_str, "cq cq cq hello world\n"); + my_cb_state.ptx_str = my_cb_state.tx_str; + freedv_set_callback_txt(freedv, NULL, &my_get_next_tx_char, &my_cb_state); + + /* OK main loop */ + + while(fread(speech_in, sizeof(short), n_speech_samples, fin) == n_speech_samples) { + freedv_tx(freedv, mod_out, speech_in); + fwrite(mod_out, sizeof(short), n_nom_modem_samples, fout); + + /* if this is in a pipeline, we probably don't want the usual + buffering to occur */ + + if (fout == stdout) fflush(stdout); + if (fin == stdin) fflush(stdin); + } + + free(speech_in); + free(mod_out); + freedv_close(freedv); + fclose(fin); + fclose(fout); + + return 0; +} + diff --git a/codec2/tags/0.4.1/src/generate_codebook.c b/codec2/tags/0.4.1/src/generate_codebook.c new file mode 100644 index 00000000..0bea80d8 --- /dev/null +++ b/codec2/tags/0.4.1/src/generate_codebook.c @@ -0,0 +1,179 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: generate_codebook.c + AUTHOR......: Bruce Perens + DATE CREATED: 29 Sep 2010 + + Generate header files containing LSP quantisers, runs at compile time. + +\*---------------------------------------------------------------------------*/ + +/* + 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 . +*/ + +#include +#include +#include +#include + +static const char usage[] = +"Usage: %s filename array_name [filename ...]\n" +"\tCreate C code for codebook tables.\n"; + +static const char format[] = +"The table format must be:\n" +"\tTwo integers describing the dimensions of the codebook.\n" +"\tThen, enough numbers to fill the specified dimensions.\n"; + +static const char header[] = +"/* THIS IS A GENERATED FILE. Edit generate_codebook.c and its input */\n\n" +"/*\n" +" * This intermediary file and the files that used to create it are under \n" +" * The LGPL. See the file COPYING.\n" +" */\n\n" +"#include \"defines.h\"\n\n"; + +struct codebook { + unsigned int k; + unsigned int log2m; + unsigned int m; + float * cb; +}; + +static void +dump_array(const struct codebook * b, int index) +{ + int limit = b->k * b->m; + int i; + + printf("static const float codes%d[] = {\n", index); + for ( i = 0; i < limit; i++ ) { + printf(" %g", b->cb[i]); + if ( i < limit - 1 ) + printf(","); + + /* organise VQs by rows, looks prettier */ + if ( ((i+1) % b->k) == 0 ) + printf("\n"); + } + printf("};\n"); +} + +static void +dump_structure(const struct codebook * b, int index) +{ + printf(" {\n"); + printf(" %d,\n", b->k); + printf(" %g,\n", log(b->m) / log(2)); + printf(" %d,\n", b->m); + printf(" codes%d\n", index); + printf(" }"); +} + +float +get_float(FILE * in, const char * name, char * * cursor, char * buffer, + int size) +{ + for ( ; ; ) { + char * s = *cursor; + char c; + + while ( (c = *s) != '\0' && !isdigit(c) && c != '-' && c != '.' ) + s++; + + /* Comments start with "#" and continue to the end of the line. */ + if ( c != '\0' && c != '#' ) { + char * end = 0; + float f = 0; + + f = strtod(s, &end); + + if ( end != s ) + *cursor = end; + return f; + } + + if ( fgets(buffer, size, in) == NULL ) { + fprintf(stderr, "%s: Format error. %s\n", name, format); + exit(1); + } + *cursor = buffer; + } +} + +static struct codebook * +load(FILE * file, const char * name) +{ + char line[1024]; + char * cursor = line; + struct codebook * b = malloc(sizeof(struct codebook)); + int i; + int size; + + *cursor = '\0'; + + b->k = (int)get_float(file, name, &cursor, line, sizeof(line)); + b->m = (int)get_float(file, name ,&cursor, line, sizeof(line)); + size = b->k * b->m; + + b->cb = (float *)malloc(size * sizeof(float)); + + for ( i = 0; i < size; i++ ) + b->cb[i] = get_float(file, name, &cursor, line, sizeof(line)); + + return b; +} + +int +main(int argc, char * * argv) +{ + struct codebook * * cb = malloc(argc * sizeof(struct codebook *)); + int i; + + if ( argc < 2 ) { + fprintf(stderr, usage, argv[0]); + fprintf(stderr, format); + exit(1); + } + + for ( i = 0; i < argc - 2; i++ ) { + FILE * in = fopen(argv[i + 2], "r"); + + if ( in == NULL ) { + perror(argv[i + 2]); + exit(1); + } + + cb[i] = load(in, argv[i + 2]); + + fclose(in); + } + + printf(header); + for ( i = 0; i < argc - 2; i++ ) { + printf(" /* %s */\n", argv[i + 2]); + dump_array(cb[i], i); + } + printf("\nconst struct lsp_codebook %s[] = {\n", argv[1]); + for ( i = 0; i < argc - 2; i++ ) { + printf(" /* %s */\n", argv[i + 2]); + dump_structure(cb[i], i); + printf(",\n"); + } + printf(" { 0, 0, 0, 0 }\n"); + printf("};\n"); + + return 0; +} diff --git a/codec2/tags/0.4.1/src/genlspdtcb.c b/codec2/tags/0.4.1/src/genlspdtcb.c new file mode 100644 index 00000000..efac19c5 --- /dev/null +++ b/codec2/tags/0.4.1/src/genlspdtcb.c @@ -0,0 +1,90 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: genlspdtcb.c + AUTHOR......: David Rowe + DATE CREATED: 2 Nov 2011 + + Generates codebooks (quantisation tables) for LSP delta-T VQ. + +\*---------------------------------------------------------------------------*/ + +/* + 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 . + +*/ + +#define MAX_ROWS 10 + +float lsp1to4[] = { + -25,0,25, + -25,0,25, + -50,0,50, + -50,0,50 +}; + +float lsp5to10[] = { + -50,0,50, + -50,0,50, + -50,0,50, + -50,0,50, + -50,0,50, + -50,0,50 +}; + +#include +#include +#include +#include +#include + +void create_codebook_text_file(char filename[], float lsp[], + int rows, int cols); + +int main(void) { + create_codebook_text_file("codebook/lspdt1-4.txt", lsp1to4, 4, 3); + create_codebook_text_file("codebook/lspdt5-10.txt", lsp5to10, 6, 3); + return 0; +} + +void create_codebook_text_file(char filename[], float lsp[], + int rows, int cols) +{ + FILE *f; + int i, digits[MAX_ROWS]; + + f = fopen(filename, "wt"); + if (f == NULL) { + printf("Can't open codebook text file %s\n", filename); + exit(0); + } + + for(i=0; i +#include +#include +#define X22 0x00400000 /* vector representation of X^{22} */ +#define X11 0x00000800 /* vector representation of X^{11} */ +#define MASK12 0xfffff800 /* auxiliary vector for testing */ +#define GENPOL 0x00000c75 /* generator polinomial, g(x) */ + +/* Global variables: + * + * pattern = error pattern, or information, or received vector + * encoding_table[] = encoding table + * decoding_table[] = decoding table + * data = information bits, i(x) + * codeword = code bits = x^{11}i(x) + (x^{11}i(x) mod g(x)) + * numerr = number of errors = Hamming weight of error polynomial e(x) + * position[] = error positions in the vector representation of e(x) + * recd = representation of corrupted received polynomial r(x) = c(x) + e(x) + * decerror = number of decoding errors + * a[] = auxiliary array to generate correctable error patterns + */ + +static int inited = 0; + +#ifdef RUN_TIME_TABLES +static int encoding_table[4096], decoding_table[2048]; +#else +#include "golayenctable.h" +#include "golaydectable.h" +#endif + +#ifdef GOLAY23_UNITTEST +static int position[23] = { 0x00000001, 0x00000002, 0x00000004, 0x00000008, + 0x00000010, 0x00000020, 0x00000040, 0x00000080, + 0x00000100, 0x00000200, 0x00000400, 0x00000800, + 0x00001000, 0x00002000, 0x00004000, 0x00008000, + 0x00010000, 0x00020000, 0x00040000, 0x00080000, + 0x00100000, 0x00200000, 0x00400000 }; +#endif + +#ifdef RUN_TIME_TABLES +static int arr2int(int a[], int r) +/* + * Convert a binary vector of Hamming weight r, and nonzero positions in + * array a[1]...a[r], to a long integer \sum_{i=1}^r 2^{a[i]-1}. + */ +{ + int i; + long mul, result = 0, temp; + + for (i=1; i<=r; i++) { + mul = 1; + temp = a[i]-1; + while (temp--) + mul = mul << 1; + result += mul; + } + return(result); +} +#endif + +void nextcomb(int n, int r, int a[]) +/* + * Calculate next r-combination of an n-set. + */ +{ + int i, j; + + a[r]++; + if (a[r] <= n) + return; + j = r - 1; + while (a[j] == n - r + j) + j--; + for (i = r; i >= j; i--) + a[i] = a[j] + i - j + 1; + return; +} + +int get_syndrome(int pattern) +/* + * Compute the syndrome corresponding to the given pattern, i.e., the + * remainder after dividing the pattern (when considering it as the vector + * representation of a polynomial) by the generator polynomial, GENPOL. + * In the program this pattern has several meanings: (1) pattern = infomation + * bits, when constructing the encoding table; (2) pattern = error pattern, + * when constructing the decoding table; and (3) pattern = received vector, to + * obtain its syndrome in decoding. + */ +{ + int aux = X22; + + if (pattern >= X11) + while (pattern & MASK12) { + while (!(aux & pattern)) + aux = aux >> 1; + pattern ^= (aux/X11) * GENPOL; + } + return(pattern); +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: golay23_init() + AUTHOR......: David Rowe + DATE CREATED: 3 March 2013 + + Call this once when you start your program to init the Golay tables. + +\*---------------------------------------------------------------------------*/ + +void golay23_init(void) { +#ifdef RUN_TIME_TABLES + int i; + long temp; + int a[4]; + int pattern; + + /* + * --------------------------------------------------------------------- + * Generate ENCODING TABLE + * + * An entry to the table is an information vector, a 32-bit integer, + * whose 12 least significant positions are the information bits. The + * resulting value is a codeword in the (23,12,7) Golay code: A 32-bit + * integer whose 23 least significant bits are coded bits: Of these, the + * 12 most significant bits are information bits and the 11 least + * significant bits are redundant bits (systematic encoding). + * --------------------------------------------------------------------- + */ + for (pattern = 0; pattern < 4096; pattern++) { + temp = pattern << 11; /* multiply information by X^{11} */ + encoding_table[pattern] = temp + get_syndrome(temp);/* add redundancy */ + } + + /* + * --------------------------------------------------------------------- + * Generate DECODING TABLE + * + * An entry to the decoding table is a syndrome and the resulting value + * is the most likely error pattern. First an error pattern is generated. + * Then its syndrome is calculated and used as a pointer to the table + * where the error pattern value is stored. + * --------------------------------------------------------------------- + * + * (1) Error patterns of WEIGHT 1 (SINGLE ERRORS) + */ + decoding_table[0] = 0; + decoding_table[1] = 1; + temp = 1; + for (i=2; i<= 23; i++) { + temp *= 2; + decoding_table[get_syndrome(temp)] = temp; + } + /* + * (2) Error patterns of WEIGHT 2 (DOUBLE ERRORS) + */ + a[1] = 1; a[2] = 2; + temp = arr2int(a,2); + decoding_table[get_syndrome(temp)] = temp; + for (i=1; i<253; i++) { + nextcomb(23,2,a); + temp = arr2int(a,2); + decoding_table[get_syndrome(temp)] = temp; + } + /* + * (3) Error patterns of WEIGHT 3 (TRIPLE ERRORS) + */ + a[1] = 1; a[2] = 2; a[3] = 3; + temp = arr2int(a,3); + decoding_table[get_syndrome(temp)] = temp; + for (i=1; i<1771; i++) { + nextcomb(23,3,a); + temp = arr2int(a,3); + decoding_table[get_syndrome(temp)] = temp; + } +#endif + inited = 1; +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: golay23_encode() + AUTHOR......: David Rowe + DATE CREATED: 3 March 2013 + + Given 12 bits of data retiurns a 23 bit codeword for transmission + over the channel. + +\*---------------------------------------------------------------------------*/ + +int golay23_encode(int data) { + assert(inited); + assert(data <= 0xfff); + + //printf("data: 0x%x\n", data); + return encoding_table[data]; +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: golay23_decode() + AUTHOR......: David Rowe + DATE CREATED: 3 March 2013 + + Given a 23 bit received codeword, returns the 12 bit corrected data. + +\*---------------------------------------------------------------------------*/ + +int golay23_decode(int received_codeword) { + assert(inited); + assert((received_codeword < (1<<23)) && (received_codeword >= 0)); + + //printf("syndrome: 0x%x\n", get_syndrome(received_codeword)); + return received_codeword ^= decoding_table[get_syndrome(received_codeword)]; +} + +int golay23_count_errors(int recd_codeword, int corrected_codeword) +{ + int errors = 0; + int diff, i; + + diff = recd_codeword ^ corrected_codeword; + for(i=0; i<23; i++) { + if (diff & 0x1) + errors++; + diff >>= 1; + } + + return errors; +} + +#ifdef GOLAY23_UNITTEST + +static int golay23_test(int error_pattern) { + int data; + int codeword; + int recd; + int pattern; + int decerror; + int i, tests; + + decerror = 0; + tests = 0; + + for (data = 0; data<(1<<12); data++) { + + codeword = golay23_encode(data); + recd = codeword ^ error_pattern; + recd = golay23_decode(recd); + pattern = (recd ^ codeword) >> 11; + for (i=0; i<12; i++) + if (pattern & position[i]) + decerror++; + if (decerror) { + printf("data: 0x%x codeword: 0x%x recd: 0x%x\n", data, codeword, recd); + printf("there were %d decoding errors\n", decerror); + exit(1); + } + tests++; + } + + return tests; +} + +int main(void) +{ + int i; + int tests; + int a[4]; + int error_pattern; + + golay23_init(); + + /* --------------------------------------------------------------------- + * Generate DATA + * --------------------------------------------------------------------- + */ + + /* Test all combinations of data and 1,2 or 3 errors */ + + tests = 0; + error_pattern = 1; + for (i=0; i< 23; i++) { + //printf("error_pattern: 0x%x\n", error_pattern); + tests += golay23_test(error_pattern); + error_pattern *= 2; + } + printf("%d 1 bit error tests performed OK!\n", tests); + + tests = 0; + a[1] = 1; a[2] = 2; + error_pattern = arr2int(a,2); + tests += golay23_test(error_pattern); + for (i=1; i<253; i++) { + nextcomb(23,2,a); + error_pattern = arr2int(a,2); + //printf("error_pattern: 0x%x\n", error_pattern); + tests += golay23_test(error_pattern); + } + printf("%d 2 bit error tests performed OK!\n", tests); + + tests = 0; + a[1] = 1; a[2] = 2; a[3] = 3; + error_pattern = arr2int(a,3); + tests += golay23_test(error_pattern); + for (i=1; i<1771; i++) { + nextcomb(23,3,a); + error_pattern = arr2int(a,3); + //printf("error_pattern: 0x%x\n", error_pattern); + tests += golay23_test(error_pattern); + } + printf("%d 3 bit error tests performed OK!\n", tests); + + return 0; +} +#endif + +#ifdef GOLAY23_MAKETABLES +int main(int argc, char *argv[]) { + FILE *f; + int i; + + golay23_init(); + + f=fopen("golayenctable.h","wt"); + assert(f != NULL); + + fprintf(f,"/* Generated by golay23.c -DGOLAY23_MAKETABLE */\n\n"); + fprintf(f,"const int static encoding_table[]={\n"); + + for (i=0; i<4095; i++) + fprintf(f," 0x%x,\n", encoding_table[i]); + fprintf(f, " 0x%x\n};\n", encoding_table[i]); + fclose(f); + + f=fopen("golaydectable.h","wt"); + assert(f != NULL); + + fprintf(f,"/* Generated by golay23.c -DGOLAY23_MAKETABLE */\n\n"); + fprintf(f,"const int static decoding_table[]={\n"); + + for (i=0; i<2047; i++) + fprintf(f," 0x%x,\n", decoding_table[i]); + fprintf(f, " 0x%x\n};\n", decoding_table[i]); + fclose(f); + + return 0; +} + +#endif + + diff --git a/codec2/tags/0.4.1/src/golay23.h b/codec2/tags/0.4.1/src/golay23.h new file mode 100644 index 00000000..a916d29f --- /dev/null +++ b/codec2/tags/0.4.1/src/golay23.h @@ -0,0 +1,44 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: golay23.h + AUTHOR......: David Rowe + DATE CREATED: 3 March 2013 + + Header file for Golay FEC. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2013 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 . +*/ + +#ifndef __GOLAY23__ +#define __GOLAY23__ + +#ifdef __cplusplus +extern "C" { +#endif + +void golay23_init(void); +int golay23_encode(int data); +int golay23_decode(int received_codeword); +int golay23_count_errors(int recd_codeword, int corrected_codeword); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/codec2/tags/0.4.1/src/golaydectable.h b/codec2/tags/0.4.1/src/golaydectable.h new file mode 100644 index 00000000..bfc76704 --- /dev/null +++ b/codec2/tags/0.4.1/src/golaydectable.h @@ -0,0 +1,2052 @@ +/* Generated by golay23.c -DGOLAY23_MAKETABLE */ + +const int static decoding_table[]={ + 0x0, + 0x1, + 0x2, + 0x3, + 0x4, + 0x5, + 0x6, + 0x7, + 0x8, + 0x9, + 0xa, + 0xb, + 0xc, + 0xd, + 0xe, + 0x24020, + 0x10, + 0x11, + 0x12, + 0x13, + 0x14, + 0x15, + 0x16, + 0x412000, + 0x18, + 0x19, + 0x1a, + 0x180800, + 0x1c, + 0x200300, + 0x48040, + 0x1480, + 0x20, + 0x21, + 0x22, + 0x23, + 0x24, + 0x25, + 0x26, + 0x24008, + 0x28, + 0x29, + 0x2a, + 0x24004, + 0x2c, + 0x24002, + 0x24001, + 0x24000, + 0x30, + 0x31, + 0x32, + 0x8180, + 0x34, + 0xc40, + 0x301000, + 0xc0200, + 0x38, + 0x43000, + 0x400600, + 0x210040, + 0x90080, + 0x508000, + 0x2900, + 0x24010, + 0x40, + 0x41, + 0x42, + 0x43, + 0x44, + 0x45, + 0x46, + 0x280080, + 0x48, + 0x49, + 0x4a, + 0x2500, + 0x4c, + 0x111000, + 0x48010, + 0x400a00, + 0x50, + 0x51, + 0x52, + 0x21200, + 0x54, + 0xc20, + 0x48008, + 0x104100, + 0x58, + 0x404080, + 0x48004, + 0x210020, + 0x48002, + 0xa2000, + 0x48000, + 0x48001, + 0x60, + 0x61, + 0x62, + 0x540000, + 0x64, + 0xc10, + 0x10300, + 0xb000, + 0x68, + 0x88200, + 0x1880, + 0x210010, + 0x602000, + 0x40180, + 0x180400, + 0x24040, + 0x70, + 0xc04, + 0x86000, + 0x210008, + 0xc01, + 0xc00, + 0x420080, + 0xc02, + 0x120100, + 0x210002, + 0x210001, + 0x210000, + 0x5200, + 0xc08, + 0x48020, + 0x210004, + 0x80, + 0x81, + 0x82, + 0x83, + 0x84, + 0x85, + 0x86, + 0x280040, + 0x88, + 0x89, + 0x8a, + 0x50200, + 0x8c, + 0xa800, + 0x500100, + 0x1410, + 0x90, + 0x91, + 0x92, + 0x8120, + 0x94, + 0x160000, + 0x4a00, + 0x1408, + 0x98, + 0x404040, + 0x222000, + 0x1404, + 0x90020, + 0x1402, + 0x1401, + 0x1400, + 0xa0, + 0xa1, + 0xa2, + 0x8110, + 0xa4, + 0x401200, + 0x42400, + 0x110800, + 0xa8, + 0x300400, + 0x1840, + 0x482000, + 0x90010, + 0x40140, + 0x208200, + 0x24080, + 0xb0, + 0x8102, + 0x8101, + 0x8100, + 0x90008, + 0x206000, + 0x420040, + 0x8104, + 0x90004, + 0x20a00, + 0x144000, + 0x8108, + 0x90000, + 0x90001, + 0x90002, + 0x1420, + 0xc0, + 0xc1, + 0xc2, + 0x280004, + 0xc4, + 0x280002, + 0x280001, + 0x280000, + 0xc8, + 0x404010, + 0x1820, + 0x128000, + 0x20600, + 0x40120, + 0x16000, + 0x280008, + 0xd0, + 0x404008, + 0x110400, + 0x42800, + 0x3100, + 0x18200, + 0x420020, + 0x280010, + 0x404001, + 0x404000, + 0x80300, + 0x404002, + 0x300800, + 0x404004, + 0x48080, + 0x1440, + 0xe0, + 0x32000, + 0x1808, + 0x4600, + 0x10c000, + 0x40108, + 0x420010, + 0x280020, + 0x1802, + 0x40104, + 0x1800, + 0x1801, + 0x40101, + 0x40100, + 0x1804, + 0x40102, + 0x240200, + 0x181000, + 0x420004, + 0x8140, + 0x420002, + 0xc80, + 0x420000, + 0x420001, + 0xa400, + 0x404020, + 0x1810, + 0x210080, + 0x90040, + 0x40110, + 0x420008, + 0x102200, + 0x100, + 0x101, + 0x102, + 0x103, + 0x104, + 0x105, + 0x106, + 0x41800, + 0x108, + 0x109, + 0x10a, + 0x2440, + 0x10c, + 0x200210, + 0x500080, + 0x98000, + 0x110, + 0x111, + 0x112, + 0x80a0, + 0x114, + 0x200208, + 0xa0400, + 0x104040, + 0x118, + 0x200204, + 0x15000, + 0x460000, + 0x200201, + 0x200200, + 0x2820, + 0x200202, + 0x120, + 0x121, + 0x122, + 0x8090, + 0x124, + 0x182000, + 0x10240, + 0x600400, + 0x128, + 0x410800, + 0x2c0000, + 0x101200, + 0x9400, + 0x400c0, + 0x2810, + 0x24100, + 0x130, + 0x8082, + 0x8081, + 0x8080, + 0x444000, + 0x31000, + 0x2808, + 0x8084, + 0x120040, + 0x84400, + 0x2804, + 0x8088, + 0x2802, + 0x200220, + 0x2800, + 0x2801, + 0x140, + 0x141, + 0x142, + 0x2408, + 0x144, + 0x428000, + 0x10220, + 0x104010, + 0x148, + 0x2402, + 0x2401, + 0x2400, + 0x84800, + 0x400a0, + 0x221000, + 0x2404, + 0x150, + 0xd0000, + 0x600800, + 0x104004, + 0x3080, + 0x104002, + 0x104001, + 0x104000, + 0x120020, + 0x9800, + 0x80280, + 0x2410, + 0x410400, + 0x200240, + 0x48100, + 0x104008, + 0x160, + 0x205000, + 0x10204, + 0xa0800, + 0x10202, + 0x40088, + 0x10200, + 0x10201, + 0x120010, + 0x40084, + 0x40c000, + 0x2420, + 0x40081, + 0x40080, + 0x10208, + 0x40082, + 0x120008, + 0x402200, + 0x41400, + 0x80c0, + 0x288000, + 0xd00, + 0x10210, + 0x104020, + 0x120000, + 0x120001, + 0x120002, + 0x210100, + 0x120004, + 0x40090, + 0x2840, + 0x481000, + 0x180, + 0x181, + 0x182, + 0x8030, + 0x184, + 0x14400, + 0x500008, + 0x22200, + 0x188, + 0xa1000, + 0x500004, + 0x204800, + 0x500002, + 0x40060, + 0x500000, + 0x500001, + 0x190, + 0x8022, + 0x8021, + 0x8020, + 0x3040, + 0x480800, + 0x250000, + 0x8024, + 0x40c00, + 0x112000, + 0x80240, + 0x8028, + 0x2c000, + 0x200280, + 0x500010, + 0x1500, + 0x1a0, + 0x8012, + 0x8011, + 0x8010, + 0x220800, + 0x40048, + 0x85000, + 0x8014, + 0x6200, + 0x40044, + 0x30400, + 0x8018, + 0x40041, + 0x40040, + 0x500020, + 0x40042, + 0x8003, + 0x8002, + 0x8001, + 0x8000, + 0x100600, + 0x8006, + 0x8005, + 0x8004, + 0x601000, + 0x800a, + 0x8009, + 0x8008, + 0x90100, + 0x40050, + 0x2880, + 0x800c, + 0x1c0, + 0x100a00, + 0x64000, + 0x411000, + 0x3010, + 0x40028, + 0x8c00, + 0x280100, + 0x218000, + 0x40024, + 0x80210, + 0x2480, + 0x40021, + 0x40020, + 0x500040, + 0x40022, + 0x3004, + 0x220400, + 0x80208, + 0x8060, + 0x3000, + 0x3001, + 0x3002, + 0x104080, + 0x80202, + 0x404100, + 0x80200, + 0x80201, + 0x3008, + 0x40030, + 0x80204, + 0x30800, + 0x480400, + 0x4000c, + 0x302000, + 0x8050, + 0x40009, + 0x40008, + 0x10280, + 0x4000a, + 0x40005, + 0x40004, + 0x1900, + 0x40006, + 0x40001, + 0x40000, + 0x40003, + 0x40002, + 0x14800, + 0x8042, + 0x8041, + 0x8040, + 0x3020, + 0x40018, + 0x420100, + 0x8044, + 0x120080, + 0x40014, + 0x80220, + 0x8048, + 0x40011, + 0x40010, + 0x204400, + 0x40012, + 0x200, + 0x201, + 0x202, + 0x203, + 0x204, + 0x205, + 0x206, + 0x108400, + 0x208, + 0x209, + 0x20a, + 0x50080, + 0x20c, + 0x200110, + 0x83000, + 0x400840, + 0x210, + 0x211, + 0x212, + 0x21040, + 0x214, + 0x200108, + 0x4880, + 0xc0020, + 0x218, + 0x200104, + 0x400420, + 0xe000, + 0x200101, + 0x200100, + 0x130000, + 0x200102, + 0x220, + 0x221, + 0x222, + 0x202800, + 0x224, + 0x401080, + 0x10140, + 0xc0010, + 0x228, + 0x88040, + 0x400410, + 0x101100, + 0x140800, + 0x12400, + 0x208080, + 0x24200, + 0x230, + 0x114000, + 0x400408, + 0xc0004, + 0x2a000, + 0xc0002, + 0xc0001, + 0xc0000, + 0x400402, + 0x20880, + 0x400400, + 0x400401, + 0x5040, + 0x200120, + 0x400404, + 0xc0008, + 0x240, + 0x241, + 0x242, + 0x21010, + 0x244, + 0x46000, + 0x10120, + 0x400808, + 0x248, + 0x88020, + 0x304000, + 0x400804, + 0x20480, + 0x400802, + 0x400801, + 0x400800, + 0x250, + 0x21002, + 0x21001, + 0x21000, + 0x580000, + 0x18080, + 0x202400, + 0x21004, + 0x12800, + 0x140400, + 0x80180, + 0x21008, + 0x5020, + 0x200140, + 0x48200, + 0x400810, + 0x260, + 0x88008, + 0x10104, + 0x4480, + 0x10102, + 0x320000, + 0x10100, + 0x10101, + 0x88001, + 0x88000, + 0x62000, + 0x88002, + 0x5010, + 0x88004, + 0x10108, + 0x400820, + 0x240080, + 0x402100, + 0x108800, + 0x21020, + 0x5008, + 0xe00, + 0x10110, + 0xc0040, + 0x5004, + 0x88010, + 0x400440, + 0x210200, + 0x5000, + 0x5001, + 0x5002, + 0x102080, + 0x280, + 0x281, + 0x282, + 0x50008, + 0x284, + 0x401020, + 0x4810, + 0x22100, + 0x288, + 0x50002, + 0x50001, + 0x50000, + 0x20440, + 0x184000, + 0x208020, + 0x50004, + 0x290, + 0x82400, + 0x4804, + 0x700000, + 0x4802, + 0x18040, + 0x4800, + 0x4801, + 0x109000, + 0x20820, + 0x80140, + 0x50010, + 0x442000, + 0x200180, + 0x4808, + 0x1600, + 0x2a0, + 0x401004, + 0x1a0000, + 0x4440, + 0x401001, + 0x401000, + 0x208008, + 0x401002, + 0x6100, + 0x20810, + 0x208004, + 0x50020, + 0x208002, + 0x401008, + 0x208000, + 0x208001, + 0x240040, + 0x20808, + 0x13000, + 0x8300, + 0x100500, + 0x401010, + 0x4820, + 0xc0080, + 0x20801, + 0x20800, + 0x400480, + 0x20802, + 0x90200, + 0x20804, + 0x208010, + 0x102040, + 0x2c0, + 0x100900, + 0x40a000, + 0x4420, + 0x20408, + 0x18010, + 0x141000, + 0x280200, + 0x20404, + 0x203000, + 0x80110, + 0x50040, + 0x20400, + 0x20401, + 0x20402, + 0x400880, + 0x240020, + 0x18004, + 0x80108, + 0x21080, + 0x18001, + 0x18000, + 0x4840, + 0x18002, + 0x80102, + 0x404200, + 0x80100, + 0x80101, + 0x20410, + 0x18008, + 0x80104, + 0x102020, + 0x240010, + 0x4402, + 0x4401, + 0x4400, + 0x82800, + 0x401040, + 0x10180, + 0x4404, + 0x510000, + 0x88080, + 0x1a00, + 0x4408, + 0x20420, + 0x40300, + 0x208040, + 0x102010, + 0x240000, + 0x240001, + 0x240002, + 0x4410, + 0x240004, + 0x18020, + 0x420200, + 0x102008, + 0x240008, + 0x20840, + 0x80120, + 0x102004, + 0x5080, + 0x102002, + 0x102001, + 0x102000, + 0x300, + 0x301, + 0x302, + 0x484000, + 0x304, + 0x200018, + 0x10060, + 0x22080, + 0x308, + 0x200014, + 0x28800, + 0x101020, + 0x200011, + 0x200010, + 0x44400, + 0x200012, + 0x310, + 0x20000c, + 0x142000, + 0x10c00, + 0x200009, + 0x200008, + 0x409000, + 0x20000a, + 0x200005, + 0x200004, + 0x800c0, + 0x200006, + 0x200001, + 0x200000, + 0x200003, + 0x200002, + 0x320, + 0x60400, + 0x10044, + 0x101008, + 0x10042, + 0xc800, + 0x10040, + 0x10041, + 0x6080, + 0x101002, + 0x101001, + 0x101000, + 0x4a0000, + 0x200030, + 0x10048, + 0x101004, + 0x81800, + 0x402040, + 0x224000, + 0x8280, + 0x100480, + 0x200028, + 0x10050, + 0xc0100, + 0x58000, + 0x200024, + 0x400500, + 0x101010, + 0x200021, + 0x200020, + 0x2a00, + 0x200022, + 0x340, + 0x100880, + 0x10024, + 0x248000, + 0x10022, + 0x81400, + 0x10020, + 0x10021, + 0x441000, + 0x34000, + 0x80090, + 0x2600, + 0x10a000, + 0x200050, + 0x10028, + 0x400900, + 0xc400, + 0x402020, + 0x80088, + 0x21100, + 0x60800, + 0x200048, + 0x10030, + 0x104200, + 0x80082, + 0x200044, + 0x80080, + 0x80081, + 0x200041, + 0x200040, + 0x80084, + 0x200042, + 0x10006, + 0x402010, + 0x10004, + 0x10005, + 0x10002, + 0x10003, + 0x10000, + 0x10001, + 0x200c00, + 0x88100, + 0x1000c, + 0x101040, + 0x1000a, + 0x40280, + 0x10008, + 0x10009, + 0x402001, + 0x402000, + 0x10014, + 0x402002, + 0x10012, + 0x402004, + 0x10010, + 0x10011, + 0x120200, + 0x402008, + 0x800a0, + 0x44800, + 0x5100, + 0x200060, + 0x10018, + 0x28400, + 0x380, + 0x100840, + 0x201400, + 0x22004, + 0xc8000, + 0x22002, + 0x22001, + 0x22000, + 0x6020, + 0x408400, + 0x80050, + 0x50100, + 0x11800, + 0x200090, + 0x500200, + 0x22008, + 0x430000, + 0x45000, + 0x80048, + 0x8220, + 0x100420, + 0x200088, + 0x4900, + 0x22010, + 0x80042, + 0x200084, + 0x80040, + 0x80041, + 0x200081, + 0x200080, + 0x80044, + 0x200082, + 0x6008, + 0x290000, + 0x440800, + 0x8210, + 0x100410, + 0x401100, + 0x100c0, + 0x22020, + 0x6000, + 0x6001, + 0x6002, + 0x101080, + 0x6004, + 0x40240, + 0x208100, + 0x80c00, + 0x100404, + 0x8202, + 0x8201, + 0x8200, + 0x100400, + 0x100401, + 0x100402, + 0x8204, + 0x6010, + 0x20900, + 0x80060, + 0x8208, + 0x100408, + 0x2000a0, + 0x61000, + 0x414000, + 0x100801, + 0x100800, + 0x80018, + 0x100802, + 0x604000, + 0x100804, + 0x100a0, + 0x22040, + 0x80012, + 0x100808, + 0x80010, + 0x80011, + 0x20500, + 0x40220, + 0x80014, + 0xd000, + 0x8000a, + 0x100810, + 0x80008, + 0x80009, + 0x3200, + 0x18100, + 0x8000c, + 0x440400, + 0x80002, + 0x80003, + 0x80000, + 0x80001, + 0x80006, + 0x2000c0, + 0x80004, + 0x80005, + 0x29000, + 0x100820, + 0x10084, + 0x4500, + 0x10082, + 0x40208, + 0x10080, + 0x10081, + 0x6040, + 0x40204, + 0x80030, + 0x620000, + 0x40201, + 0x40200, + 0x10088, + 0x40202, + 0x240100, + 0x402080, + 0x80028, + 0x8240, + 0x100440, + 0xa4000, + 0x10090, + 0x201800, + 0x80022, + 0x11400, + 0x80020, + 0x80021, + 0x408800, + 0x40210, + 0x80024, + 0x102100, + 0x400, + 0x401, + 0x402, + 0x403, + 0x404, + 0x405, + 0x406, + 0x108200, + 0x408, + 0x409, + 0x40a, + 0x2140, + 0x40c, + 0x4c0000, + 0x210800, + 0x1090, + 0x410, + 0x411, + 0x412, + 0x244000, + 0x414, + 0x860, + 0xa0100, + 0x1088, + 0x418, + 0x38000, + 0x400220, + 0x1084, + 0x106000, + 0x1082, + 0x1081, + 0x1080, + 0x420, + 0x421, + 0x422, + 0x91000, + 0x424, + 0x850, + 0x42080, + 0x600100, + 0x428, + 0x300080, + 0x400210, + 0x48800, + 0x9100, + 0x12200, + 0x180040, + 0x24400, + 0x430, + 0x844, + 0x400208, + 0x122000, + 0x841, + 0x840, + 0x1c000, + 0x842, + 0x400202, + 0x84100, + 0x400200, + 0x400201, + 0x260000, + 0x848, + 0x400204, + 0x10a0, + 0x440, + 0x441, + 0x442, + 0x2108, + 0x444, + 0x830, + 0x405000, + 0x70000, + 0x448, + 0x2102, + 0x2101, + 0x2100, + 0x20280, + 0x20c000, + 0x180020, + 0x2104, + 0x450, + 0x824, + 0x110080, + 0x488000, + 0x821, + 0x820, + 0x202200, + 0x822, + 0x281000, + 0x140200, + 0x24800, + 0x2110, + 0x410100, + 0x828, + 0x48400, + 0x10c0, + 0x460, + 0x814, + 0x228000, + 0x4280, + 0x811, + 0x810, + 0x180008, + 0x812, + 0x54000, + 0x421000, + 0x180004, + 0x2120, + 0x180002, + 0x818, + 0x180000, + 0x180001, + 0x805, + 0x804, + 0x41100, + 0x806, + 0x801, + 0x800, + 0x803, + 0x802, + 0xa080, + 0x80c, + 0x400240, + 0x210400, + 0x809, + 0x808, + 0x180010, + 0x80a, + 0x480, + 0x481, + 0x482, + 0x420800, + 0x484, + 0x14100, + 0x42020, + 0x1018, + 0x488, + 0x300020, + 0x8c000, + 0x1014, + 0x20240, + 0x1012, + 0x1011, + 0x1010, + 0x490, + 0x82200, + 0x110040, + 0x100c, + 0x608000, + 0x100a, + 0x1009, + 0x1008, + 0x40900, + 0x1006, + 0x1005, + 0x1004, + 0x1003, + 0x1002, + 0x1001, + 0x1000, + 0x4a0, + 0x300008, + 0x42004, + 0x4240, + 0x42002, + 0xa8000, + 0x42000, + 0x42001, + 0x300001, + 0x300000, + 0x30100, + 0x300002, + 0x404800, + 0x300004, + 0x42008, + 0x1030, + 0x25000, + 0x450000, + 0x280800, + 0x8500, + 0x100300, + 0x8c0, + 0x42010, + 0x1028, + 0xa040, + 0x300010, + 0x400280, + 0x1024, + 0x90400, + 0x1022, + 0x1021, + 0x1020, + 0x4c0, + 0x49000, + 0x110010, + 0x4220, + 0x20208, + 0x502000, + 0x8900, + 0x280400, + 0x20204, + 0x90800, + 0x640000, + 0x2180, + 0x20200, + 0x20201, + 0x20202, + 0x1050, + 0x110002, + 0x220100, + 0x110000, + 0x110001, + 0xc4000, + 0x8a0, + 0x110004, + 0x1048, + 0xa020, + 0x404400, + 0x110008, + 0x1044, + 0x20210, + 0x1042, + 0x1041, + 0x1040, + 0x480100, + 0x4202, + 0x4201, + 0x4200, + 0x211000, + 0x890, + 0x42040, + 0x4204, + 0xa010, + 0x300040, + 0x1c00, + 0x4208, + 0x20220, + 0x40500, + 0x180080, + 0x418000, + 0xa008, + 0x884, + 0x110020, + 0x4210, + 0x881, + 0x880, + 0x420400, + 0x882, + 0xa000, + 0xa001, + 0xa002, + 0xe0000, + 0xa004, + 0x888, + 0x204100, + 0x1060, + 0x500, + 0x501, + 0x502, + 0x2048, + 0x504, + 0x14080, + 0xa0010, + 0x600020, + 0x508, + 0x2042, + 0x2041, + 0x2040, + 0x9020, + 0x120800, + 0x44200, + 0x2044, + 0x510, + 0x501000, + 0xa0004, + 0x10a00, + 0xa0002, + 0x4a000, + 0xa0000, + 0xa0001, + 0x40880, + 0x84020, + 0x308000, + 0x2050, + 0x410040, + 0x200600, + 0xa0008, + 0x1180, + 0x520, + 0x60200, + 0x104800, + 0x600004, + 0x9008, + 0x600002, + 0x600001, + 0x600000, + 0x9004, + 0x84010, + 0x30080, + 0x2060, + 0x9000, + 0x9001, + 0x9002, + 0x600008, + 0x212000, + 0x84008, + 0x41040, + 0x8480, + 0x100280, + 0x940, + 0xa0020, + 0x600010, + 0x84001, + 0x84000, + 0x400300, + 0x84002, + 0x9010, + 0x84004, + 0x2c00, + 0x150000, + 0x540, + 0x200a, + 0x2009, + 0x2008, + 0x340000, + 0x81200, + 0x8880, + 0x200c, + 0x2003, + 0x2002, + 0x2001, + 0x2000, + 0x410010, + 0x2006, + 0x2005, + 0x2004, + 0xc200, + 0x220080, + 0x41020, + 0x2018, + 0x410008, + 0x920, + 0xa0040, + 0x104400, + 0x410004, + 0x2012, + 0x2011, + 0x2010, + 0x410000, + 0x410001, + 0x410002, + 0x2014, + 0x480080, + 0x118000, + 0x41010, + 0x2028, + 0x26000, + 0x910, + 0x10600, + 0x600040, + 0x200a00, + 0x2022, + 0x2021, + 0x2020, + 0x9040, + 0x40480, + 0x180100, + 0x2024, + 0x41002, + 0x904, + 0x41000, + 0x41001, + 0x901, + 0x900, + 0x41004, + 0x902, + 0x120400, + 0x84040, + 0x41008, + 0x2030, + 0x410020, + 0x908, + 0x204080, + 0x28200, + 0x580, + 0x14004, + 0x201200, + 0x1c0000, + 0x14001, + 0x14000, + 0x8840, + 0x14002, + 0x40810, + 0x408200, + 0x30020, + 0x20c0, + 0x282000, + 0x14008, + 0x500400, + 0x1110, + 0x40808, + 0x220040, + 0x406000, + 0x8420, + 0x100220, + 0x14010, + 0xa0080, + 0x1108, + 0x40800, + 0x40801, + 0x40802, + 0x1104, + 0x40804, + 0x1102, + 0x1101, + 0x1100, + 0x480040, + 0x3800, + 0x30008, + 0x8410, + 0x100210, + 0x14020, + 0x42100, + 0x600080, + 0x30002, + 0x300100, + 0x30000, + 0x30001, + 0x9080, + 0x40440, + 0x30004, + 0x80a00, + 0x100204, + 0x8402, + 0x8401, + 0x8400, + 0x100200, + 0x100201, + 0x100202, + 0x8404, + 0x40820, + 0x84080, + 0x30010, + 0x8408, + 0x100208, + 0x422000, + 0x204040, + 0x1120, + 0x480020, + 0x220010, + 0x8804, + 0x2088, + 0x8802, + 0x14040, + 0x8800, + 0x8801, + 0x105000, + 0x2082, + 0x2081, + 0x2080, + 0x20300, + 0x40420, + 0x8808, + 0x2084, + 0x220001, + 0x220000, + 0x110100, + 0x220002, + 0x3400, + 0x220004, + 0x8810, + 0x440200, + 0x40840, + 0x220008, + 0x80600, + 0x2090, + 0x410080, + 0x188000, + 0x204020, + 0x1140, + 0x480000, + 0x480001, + 0x480002, + 0x4300, + 0x480004, + 0x40408, + 0x8820, + 0x121000, + 0x480008, + 0x40404, + 0x30040, + 0x20a0, + 0x40401, + 0x40400, + 0x204010, + 0x40402, + 0x480010, + 0x220020, + 0x41080, + 0x8440, + 0x100240, + 0x980, + 0x204008, + 0x92000, + 0xa100, + 0x11200, + 0x204004, + 0x500800, + 0x204002, + 0x40410, + 0x204000, + 0x204001, + 0x600, + 0x601, + 0x602, + 0x108004, + 0x604, + 0x108002, + 0x108001, + 0x108000, + 0x608, + 0x5800, + 0x400030, + 0x2a0000, + 0x200c0, + 0x12020, + 0x44100, + 0x108008, + 0x610, + 0x82080, + 0x400028, + 0x10900, + 0x51000, + 0x424000, + 0x202040, + 0x108010, + 0x400022, + 0x140040, + 0x400020, + 0x400021, + 0x88800, + 0x200500, + 0x400024, + 0x1280, + 0x620, + 0x60100, + 0x400018, + 0x40c0, + 0x284000, + 0x12008, + 0x21800, + 0x108020, + 0x400012, + 0x12004, + 0x400010, + 0x400011, + 0x12001, + 0x12000, + 0x400014, + 0x12002, + 0x40000a, + 0x209000, + 0x400008, + 0x400009, + 0x100180, + 0xa40, + 0x40000c, + 0xc0400, + 0x400002, + 0x400003, + 0x400000, + 0x400001, + 0x400006, + 0x12010, + 0x400004, + 0x400005, + 0x640, + 0x610000, + 0xc0800, + 0x40a0, + 0x20088, + 0x81100, + 0x202010, + 0x108040, + 0x20084, + 0x140010, + 0x19000, + 0x2300, + 0x20080, + 0x20081, + 0x20082, + 0x400c00, + 0xc100, + 0x140008, + 0x202004, + 0x21400, + 0x202002, + 0xa20, + 0x202000, + 0x202001, + 0x140001, + 0x140000, + 0x400060, + 0x140002, + 0x20090, + 0x140004, + 0x202008, + 0x94000, + 0x103000, + 0x4082, + 0x4081, + 0x4080, + 0x448000, + 0xa10, + 0x10500, + 0x4084, + 0x200900, + 0x88400, + 0x400050, + 0x4088, + 0x200a0, + 0x12040, + 0x180200, + 0x241000, + 0xb0000, + 0xa04, + 0x400048, + 0x4090, + 0xa01, + 0xa00, + 0x202020, + 0xa02, + 0x400042, + 0x140020, + 0x400040, + 0x400041, + 0x5400, + 0xa08, + 0x400044, + 0x28100, + 0x680, + 0x82010, + 0x201100, + 0x4060, + 0x20048, + 0x240800, + 0x490000, + 0x108080, + 0x20044, + 0x408100, + 0x102800, + 0x50400, + 0x20040, + 0x20041, + 0x20042, + 0x1210, + 0x82001, + 0x82000, + 0x68000, + 0x82002, + 0x100120, + 0x82004, + 0x4c00, + 0x1208, + 0x214000, + 0x82008, + 0x4000a0, + 0x1204, + 0x20050, + 0x1202, + 0x1201, + 0x1200, + 0x18800, + 0x4042, + 0x4041, + 0x4040, + 0x100110, + 0x401400, + 0x42200, + 0x4044, + 0xc1000, + 0x300200, + 0x400090, + 0x4048, + 0x20060, + 0x12080, + 0x208400, + 0x80900, + 0x100104, + 0x82020, + 0x400088, + 0x4050, + 0x100100, + 0x100101, + 0x100102, + 0x230000, + 0x400082, + 0x20c00, + 0x400080, + 0x400081, + 0x100108, + 0x4c000, + 0x400084, + 0x1220, + 0x2000c, + 0x4022, + 0x4021, + 0x4020, + 0x20008, + 0x20009, + 0x2000a, + 0x4024, + 0x20004, + 0x20005, + 0x20006, + 0x4028, + 0x20000, + 0x20001, + 0x20002, + 0x20003, + 0x401800, + 0x82040, + 0x110200, + 0x4030, + 0x20018, + 0x18400, + 0x202080, + 0x440100, + 0x20014, + 0x140080, + 0x80500, + 0x208800, + 0x20010, + 0x20011, + 0x20012, + 0x1240, + 0x4003, + 0x4002, + 0x4001, + 0x4000, + 0x20028, + 0x4006, + 0x4005, + 0x4004, + 0x20024, + 0x400a, + 0x4009, + 0x4008, + 0x20020, + 0x20021, + 0x20022, + 0x400c, + 0x240400, + 0x4012, + 0x4011, + 0x4010, + 0x100140, + 0xa80, + 0x89000, + 0x4014, + 0xa200, + 0x11100, + 0x4000c0, + 0x4018, + 0x20030, + 0x680000, + 0x50800, + 0x102400, + 0x700, + 0x60020, + 0x201080, + 0x10810, + 0x402800, + 0x81040, + 0x44008, + 0x108100, + 0x190000, + 0x408080, + 0x44004, + 0x2240, + 0x44002, + 0x200410, + 0x44000, + 0x44001, + 0xc040, + 0x10802, + 0x10801, + 0x10800, + 0x1000a0, + 0x200408, + 0xa0200, + 0x10804, + 0x23000, + 0x200404, + 0x400120, + 0x10808, + 0x200401, + 0x200400, + 0x44010, + 0x200402, + 0x60001, + 0x60000, + 0x8a000, + 0x60002, + 0x100090, + 0x60004, + 0x10440, + 0x600200, + 0x200840, + 0x60008, + 0x400110, + 0x101400, + 0x9200, + 0x12100, + 0x44020, + 0x80880, + 0x100084, + 0x60010, + 0x400108, + 0x10820, + 0x100080, + 0x100081, + 0x100082, + 0x7000, + 0x400102, + 0x84200, + 0x400100, + 0x400101, + 0x100088, + 0x200420, + 0x400104, + 0x28040, + 0xc010, + 0x81004, + 0x520000, + 0x2208, + 0x81001, + 0x81000, + 0x10420, + 0x81002, + 0x200820, + 0x2202, + 0x2201, + 0x2200, + 0x20180, + 0x81008, + 0x44040, + 0x2204, + 0xc000, + 0xc001, + 0xc002, + 0x10840, + 0xc004, + 0x81010, + 0x202100, + 0x440080, + 0xc008, + 0x140100, + 0x80480, + 0x2210, + 0x410200, + 0x200440, + 0x101800, + 0x28020, + 0x200808, + 0x60040, + 0x10404, + 0x4180, + 0x10402, + 0x81020, + 0x10400, + 0x10401, + 0x200800, + 0x200801, + 0x200802, + 0x2220, + 0x200804, + 0x504000, + 0x10408, + 0x28010, + 0xc020, + 0x402400, + 0x41200, + 0x380000, + 0x1000c0, + 0xb00, + 0x10410, + 0x28008, + 0x200810, + 0x11080, + 0x400140, + 0x28004, + 0xc2000, + 0x28002, + 0x28001, + 0x28000, + 0x201002, + 0x408008, + 0x201000, + 0x201001, + 0x100030, + 0x14200, + 0x201004, + 0x22400, + 0x408001, + 0x408000, + 0x201008, + 0x408002, + 0x20140, + 0x408004, + 0x44080, + 0x80820, + 0x100024, + 0x82100, + 0x201010, + 0x10880, + 0x100020, + 0x100021, + 0x100022, + 0x440040, + 0x40a00, + 0x408010, + 0x80440, + 0x124000, + 0x100028, + 0x200480, + 0x1a000, + 0x1300, + 0x100014, + 0x60080, + 0x201020, + 0x4140, + 0x100010, + 0x100011, + 0x100012, + 0x80808, + 0x6400, + 0x408020, + 0x30200, + 0x80804, + 0x100018, + 0x80802, + 0x80801, + 0x80800, + 0x100004, + 0x100005, + 0x100006, + 0x8600, + 0x100000, + 0x100001, + 0x100002, + 0x100003, + 0x10000c, + 0x11040, + 0x400180, + 0x242000, + 0x100008, + 0x100009, + 0x10000a, + 0x80810, + 0x52000, + 0x100c00, + 0x201040, + 0x4120, + 0x20108, + 0x81080, + 0x8a00, + 0x440010, + 0x20104, + 0x408040, + 0x80410, + 0x2280, + 0x20100, + 0x20101, + 0x20102, + 0x310000, + 0xc080, + 0x220200, + 0x80408, + 0x440004, + 0x100060, + 0x440002, + 0x440001, + 0x440000, + 0x80402, + 0x11020, + 0x80400, + 0x80401, + 0x20110, + 0x6800, + 0x80404, + 0x440008, + 0x480200, + 0x4102, + 0x4101, + 0x4100, + 0x100050, + 0x20a000, + 0x10480, + 0x4104, + 0x200880, + 0x11010, + 0x148000, + 0x4108, + 0x20120, + 0x40600, + 0x403000, + 0x80840, + 0x100044, + 0x11008, + 0x22800, + 0x4110, + 0x100040, + 0x100041, + 0x100042, + 0x440020, + 0x11001, + 0x11000, + 0x80420, + 0x11002, + 0x100048, + 0x11004, + 0x204200, + 0x28080 +}; diff --git a/codec2/tags/0.4.1/src/golayenctable.h b/codec2/tags/0.4.1/src/golayenctable.h new file mode 100644 index 00000000..048cee88 --- /dev/null +++ b/codec2/tags/0.4.1/src/golayenctable.h @@ -0,0 +1,4100 @@ +/* Generated by golay23.c -DGOLAY23_MAKETABLE */ + +const int static encoding_table[]={ + 0x0, + 0xc75, + 0x149f, + 0x18ea, + 0x254b, + 0x293e, + 0x31d4, + 0x3da1, + 0x46e3, + 0x4a96, + 0x527c, + 0x5e09, + 0x63a8, + 0x6fdd, + 0x7737, + 0x7b42, + 0x81b3, + 0x8dc6, + 0x952c, + 0x9959, + 0xa4f8, + 0xa88d, + 0xb067, + 0xbc12, + 0xc750, + 0xcb25, + 0xd3cf, + 0xdfba, + 0xe21b, + 0xee6e, + 0xf684, + 0xfaf1, + 0x10366, + 0x10f13, + 0x117f9, + 0x11b8c, + 0x1262d, + 0x12a58, + 0x132b2, + 0x13ec7, + 0x14585, + 0x149f0, + 0x1511a, + 0x15d6f, + 0x160ce, + 0x16cbb, + 0x17451, + 0x17824, + 0x182d5, + 0x18ea0, + 0x1964a, + 0x19a3f, + 0x1a79e, + 0x1abeb, + 0x1b301, + 0x1bf74, + 0x1c436, + 0x1c843, + 0x1d0a9, + 0x1dcdc, + 0x1e17d, + 0x1ed08, + 0x1f5e2, + 0x1f997, + 0x206cc, + 0x20ab9, + 0x21253, + 0x21e26, + 0x22387, + 0x22ff2, + 0x23718, + 0x23b6d, + 0x2402f, + 0x24c5a, + 0x254b0, + 0x258c5, + 0x26564, + 0x26911, + 0x271fb, + 0x27d8e, + 0x2877f, + 0x28b0a, + 0x293e0, + 0x29f95, + 0x2a234, + 0x2ae41, + 0x2b6ab, + 0x2bade, + 0x2c19c, + 0x2cde9, + 0x2d503, + 0x2d976, + 0x2e4d7, + 0x2e8a2, + 0x2f048, + 0x2fc3d, + 0x305aa, + 0x309df, + 0x31135, + 0x31d40, + 0x320e1, + 0x32c94, + 0x3347e, + 0x3380b, + 0x34349, + 0x34f3c, + 0x357d6, + 0x35ba3, + 0x36602, + 0x36a77, + 0x3729d, + 0x37ee8, + 0x38419, + 0x3886c, + 0x39086, + 0x39cf3, + 0x3a152, + 0x3ad27, + 0x3b5cd, + 0x3b9b8, + 0x3c2fa, + 0x3ce8f, + 0x3d665, + 0x3da10, + 0x3e7b1, + 0x3ebc4, + 0x3f32e, + 0x3ff5b, + 0x401ed, + 0x40d98, + 0x41572, + 0x41907, + 0x424a6, + 0x428d3, + 0x43039, + 0x43c4c, + 0x4470e, + 0x44b7b, + 0x45391, + 0x45fe4, + 0x46245, + 0x46e30, + 0x476da, + 0x47aaf, + 0x4805e, + 0x48c2b, + 0x494c1, + 0x498b4, + 0x4a515, + 0x4a960, + 0x4b18a, + 0x4bdff, + 0x4c6bd, + 0x4cac8, + 0x4d222, + 0x4de57, + 0x4e3f6, + 0x4ef83, + 0x4f769, + 0x4fb1c, + 0x5028b, + 0x50efe, + 0x51614, + 0x51a61, + 0x527c0, + 0x52bb5, + 0x5335f, + 0x53f2a, + 0x54468, + 0x5481d, + 0x550f7, + 0x55c82, + 0x56123, + 0x56d56, + 0x575bc, + 0x579c9, + 0x58338, + 0x58f4d, + 0x597a7, + 0x59bd2, + 0x5a673, + 0x5aa06, + 0x5b2ec, + 0x5be99, + 0x5c5db, + 0x5c9ae, + 0x5d144, + 0x5dd31, + 0x5e090, + 0x5ece5, + 0x5f40f, + 0x5f87a, + 0x60721, + 0x60b54, + 0x613be, + 0x61fcb, + 0x6226a, + 0x62e1f, + 0x636f5, + 0x63a80, + 0x641c2, + 0x64db7, + 0x6555d, + 0x65928, + 0x66489, + 0x668fc, + 0x67016, + 0x67c63, + 0x68692, + 0x68ae7, + 0x6920d, + 0x69e78, + 0x6a3d9, + 0x6afac, + 0x6b746, + 0x6bb33, + 0x6c071, + 0x6cc04, + 0x6d4ee, + 0x6d89b, + 0x6e53a, + 0x6e94f, + 0x6f1a5, + 0x6fdd0, + 0x70447, + 0x70832, + 0x710d8, + 0x71cad, + 0x7210c, + 0x72d79, + 0x73593, + 0x739e6, + 0x742a4, + 0x74ed1, + 0x7563b, + 0x75a4e, + 0x767ef, + 0x76b9a, + 0x77370, + 0x77f05, + 0x785f4, + 0x78981, + 0x7916b, + 0x79d1e, + 0x7a0bf, + 0x7acca, + 0x7b420, + 0x7b855, + 0x7c317, + 0x7cf62, + 0x7d788, + 0x7dbfd, + 0x7e65c, + 0x7ea29, + 0x7f2c3, + 0x7feb6, + 0x803da, + 0x80faf, + 0x81745, + 0x81b30, + 0x82691, + 0x82ae4, + 0x8320e, + 0x83e7b, + 0x84539, + 0x8494c, + 0x851a6, + 0x85dd3, + 0x86072, + 0x86c07, + 0x874ed, + 0x87898, + 0x88269, + 0x88e1c, + 0x896f6, + 0x89a83, + 0x8a722, + 0x8ab57, + 0x8b3bd, + 0x8bfc8, + 0x8c48a, + 0x8c8ff, + 0x8d015, + 0x8dc60, + 0x8e1c1, + 0x8edb4, + 0x8f55e, + 0x8f92b, + 0x900bc, + 0x90cc9, + 0x91423, + 0x91856, + 0x925f7, + 0x92982, + 0x93168, + 0x93d1d, + 0x9465f, + 0x94a2a, + 0x952c0, + 0x95eb5, + 0x96314, + 0x96f61, + 0x9778b, + 0x97bfe, + 0x9810f, + 0x98d7a, + 0x99590, + 0x999e5, + 0x9a444, + 0x9a831, + 0x9b0db, + 0x9bcae, + 0x9c7ec, + 0x9cb99, + 0x9d373, + 0x9df06, + 0x9e2a7, + 0x9eed2, + 0x9f638, + 0x9fa4d, + 0xa0516, + 0xa0963, + 0xa1189, + 0xa1dfc, + 0xa205d, + 0xa2c28, + 0xa34c2, + 0xa38b7, + 0xa43f5, + 0xa4f80, + 0xa576a, + 0xa5b1f, + 0xa66be, + 0xa6acb, + 0xa7221, + 0xa7e54, + 0xa84a5, + 0xa88d0, + 0xa903a, + 0xa9c4f, + 0xaa1ee, + 0xaad9b, + 0xab571, + 0xab904, + 0xac246, + 0xace33, + 0xad6d9, + 0xadaac, + 0xae70d, + 0xaeb78, + 0xaf392, + 0xaffe7, + 0xb0670, + 0xb0a05, + 0xb12ef, + 0xb1e9a, + 0xb233b, + 0xb2f4e, + 0xb37a4, + 0xb3bd1, + 0xb4093, + 0xb4ce6, + 0xb540c, + 0xb5879, + 0xb65d8, + 0xb69ad, + 0xb7147, + 0xb7d32, + 0xb87c3, + 0xb8bb6, + 0xb935c, + 0xb9f29, + 0xba288, + 0xbaefd, + 0xbb617, + 0xbba62, + 0xbc120, + 0xbcd55, + 0xbd5bf, + 0xbd9ca, + 0xbe46b, + 0xbe81e, + 0xbf0f4, + 0xbfc81, + 0xc0237, + 0xc0e42, + 0xc16a8, + 0xc1add, + 0xc277c, + 0xc2b09, + 0xc33e3, + 0xc3f96, + 0xc44d4, + 0xc48a1, + 0xc504b, + 0xc5c3e, + 0xc619f, + 0xc6dea, + 0xc7500, + 0xc7975, + 0xc8384, + 0xc8ff1, + 0xc971b, + 0xc9b6e, + 0xca6cf, + 0xcaaba, + 0xcb250, + 0xcbe25, + 0xcc567, + 0xcc912, + 0xcd1f8, + 0xcdd8d, + 0xce02c, + 0xcec59, + 0xcf4b3, + 0xcf8c6, + 0xd0151, + 0xd0d24, + 0xd15ce, + 0xd19bb, + 0xd241a, + 0xd286f, + 0xd3085, + 0xd3cf0, + 0xd47b2, + 0xd4bc7, + 0xd532d, + 0xd5f58, + 0xd62f9, + 0xd6e8c, + 0xd7666, + 0xd7a13, + 0xd80e2, + 0xd8c97, + 0xd947d, + 0xd9808, + 0xda5a9, + 0xda9dc, + 0xdb136, + 0xdbd43, + 0xdc601, + 0xdca74, + 0xdd29e, + 0xddeeb, + 0xde34a, + 0xdef3f, + 0xdf7d5, + 0xdfba0, + 0xe04fb, + 0xe088e, + 0xe1064, + 0xe1c11, + 0xe21b0, + 0xe2dc5, + 0xe352f, + 0xe395a, + 0xe4218, + 0xe4e6d, + 0xe5687, + 0xe5af2, + 0xe6753, + 0xe6b26, + 0xe73cc, + 0xe7fb9, + 0xe8548, + 0xe893d, + 0xe91d7, + 0xe9da2, + 0xea003, + 0xeac76, + 0xeb49c, + 0xeb8e9, + 0xec3ab, + 0xecfde, + 0xed734, + 0xedb41, + 0xee6e0, + 0xeea95, + 0xef27f, + 0xefe0a, + 0xf079d, + 0xf0be8, + 0xf1302, + 0xf1f77, + 0xf22d6, + 0xf2ea3, + 0xf3649, + 0xf3a3c, + 0xf417e, + 0xf4d0b, + 0xf55e1, + 0xf5994, + 0xf6435, + 0xf6840, + 0xf70aa, + 0xf7cdf, + 0xf862e, + 0xf8a5b, + 0xf92b1, + 0xf9ec4, + 0xfa365, + 0xfaf10, + 0xfb7fa, + 0xfbb8f, + 0xfc0cd, + 0xfccb8, + 0xfd452, + 0xfd827, + 0xfe586, + 0xfe9f3, + 0xff119, + 0xffd6c, + 0x1007b4, + 0x100bc1, + 0x10132b, + 0x101f5e, + 0x1022ff, + 0x102e8a, + 0x103660, + 0x103a15, + 0x104157, + 0x104d22, + 0x1055c8, + 0x1059bd, + 0x10641c, + 0x106869, + 0x107083, + 0x107cf6, + 0x108607, + 0x108a72, + 0x109298, + 0x109eed, + 0x10a34c, + 0x10af39, + 0x10b7d3, + 0x10bba6, + 0x10c0e4, + 0x10cc91, + 0x10d47b, + 0x10d80e, + 0x10e5af, + 0x10e9da, + 0x10f130, + 0x10fd45, + 0x1104d2, + 0x1108a7, + 0x11104d, + 0x111c38, + 0x112199, + 0x112dec, + 0x113506, + 0x113973, + 0x114231, + 0x114e44, + 0x1156ae, + 0x115adb, + 0x11677a, + 0x116b0f, + 0x1173e5, + 0x117f90, + 0x118561, + 0x118914, + 0x1191fe, + 0x119d8b, + 0x11a02a, + 0x11ac5f, + 0x11b4b5, + 0x11b8c0, + 0x11c382, + 0x11cff7, + 0x11d71d, + 0x11db68, + 0x11e6c9, + 0x11eabc, + 0x11f256, + 0x11fe23, + 0x120178, + 0x120d0d, + 0x1215e7, + 0x121992, + 0x122433, + 0x122846, + 0x1230ac, + 0x123cd9, + 0x12479b, + 0x124bee, + 0x125304, + 0x125f71, + 0x1262d0, + 0x126ea5, + 0x12764f, + 0x127a3a, + 0x1280cb, + 0x128cbe, + 0x129454, + 0x129821, + 0x12a580, + 0x12a9f5, + 0x12b11f, + 0x12bd6a, + 0x12c628, + 0x12ca5d, + 0x12d2b7, + 0x12dec2, + 0x12e363, + 0x12ef16, + 0x12f7fc, + 0x12fb89, + 0x13021e, + 0x130e6b, + 0x131681, + 0x131af4, + 0x132755, + 0x132b20, + 0x1333ca, + 0x133fbf, + 0x1344fd, + 0x134888, + 0x135062, + 0x135c17, + 0x1361b6, + 0x136dc3, + 0x137529, + 0x13795c, + 0x1383ad, + 0x138fd8, + 0x139732, + 0x139b47, + 0x13a6e6, + 0x13aa93, + 0x13b279, + 0x13be0c, + 0x13c54e, + 0x13c93b, + 0x13d1d1, + 0x13dda4, + 0x13e005, + 0x13ec70, + 0x13f49a, + 0x13f8ef, + 0x140659, + 0x140a2c, + 0x1412c6, + 0x141eb3, + 0x142312, + 0x142f67, + 0x14378d, + 0x143bf8, + 0x1440ba, + 0x144ccf, + 0x145425, + 0x145850, + 0x1465f1, + 0x146984, + 0x14716e, + 0x147d1b, + 0x1487ea, + 0x148b9f, + 0x149375, + 0x149f00, + 0x14a2a1, + 0x14aed4, + 0x14b63e, + 0x14ba4b, + 0x14c109, + 0x14cd7c, + 0x14d596, + 0x14d9e3, + 0x14e442, + 0x14e837, + 0x14f0dd, + 0x14fca8, + 0x15053f, + 0x15094a, + 0x1511a0, + 0x151dd5, + 0x152074, + 0x152c01, + 0x1534eb, + 0x15389e, + 0x1543dc, + 0x154fa9, + 0x155743, + 0x155b36, + 0x156697, + 0x156ae2, + 0x157208, + 0x157e7d, + 0x15848c, + 0x1588f9, + 0x159013, + 0x159c66, + 0x15a1c7, + 0x15adb2, + 0x15b558, + 0x15b92d, + 0x15c26f, + 0x15ce1a, + 0x15d6f0, + 0x15da85, + 0x15e724, + 0x15eb51, + 0x15f3bb, + 0x15ffce, + 0x160095, + 0x160ce0, + 0x16140a, + 0x16187f, + 0x1625de, + 0x1629ab, + 0x163141, + 0x163d34, + 0x164676, + 0x164a03, + 0x1652e9, + 0x165e9c, + 0x16633d, + 0x166f48, + 0x1677a2, + 0x167bd7, + 0x168126, + 0x168d53, + 0x1695b9, + 0x1699cc, + 0x16a46d, + 0x16a818, + 0x16b0f2, + 0x16bc87, + 0x16c7c5, + 0x16cbb0, + 0x16d35a, + 0x16df2f, + 0x16e28e, + 0x16eefb, + 0x16f611, + 0x16fa64, + 0x1703f3, + 0x170f86, + 0x17176c, + 0x171b19, + 0x1726b8, + 0x172acd, + 0x173227, + 0x173e52, + 0x174510, + 0x174965, + 0x17518f, + 0x175dfa, + 0x17605b, + 0x176c2e, + 0x1774c4, + 0x1778b1, + 0x178240, + 0x178e35, + 0x1796df, + 0x179aaa, + 0x17a70b, + 0x17ab7e, + 0x17b394, + 0x17bfe1, + 0x17c4a3, + 0x17c8d6, + 0x17d03c, + 0x17dc49, + 0x17e1e8, + 0x17ed9d, + 0x17f577, + 0x17f902, + 0x18046e, + 0x18081b, + 0x1810f1, + 0x181c84, + 0x182125, + 0x182d50, + 0x1835ba, + 0x1839cf, + 0x18428d, + 0x184ef8, + 0x185612, + 0x185a67, + 0x1867c6, + 0x186bb3, + 0x187359, + 0x187f2c, + 0x1885dd, + 0x1889a8, + 0x189142, + 0x189d37, + 0x18a096, + 0x18ace3, + 0x18b409, + 0x18b87c, + 0x18c33e, + 0x18cf4b, + 0x18d7a1, + 0x18dbd4, + 0x18e675, + 0x18ea00, + 0x18f2ea, + 0x18fe9f, + 0x190708, + 0x190b7d, + 0x191397, + 0x191fe2, + 0x192243, + 0x192e36, + 0x1936dc, + 0x193aa9, + 0x1941eb, + 0x194d9e, + 0x195574, + 0x195901, + 0x1964a0, + 0x1968d5, + 0x19703f, + 0x197c4a, + 0x1986bb, + 0x198ace, + 0x199224, + 0x199e51, + 0x19a3f0, + 0x19af85, + 0x19b76f, + 0x19bb1a, + 0x19c058, + 0x19cc2d, + 0x19d4c7, + 0x19d8b2, + 0x19e513, + 0x19e966, + 0x19f18c, + 0x19fdf9, + 0x1a02a2, + 0x1a0ed7, + 0x1a163d, + 0x1a1a48, + 0x1a27e9, + 0x1a2b9c, + 0x1a3376, + 0x1a3f03, + 0x1a4441, + 0x1a4834, + 0x1a50de, + 0x1a5cab, + 0x1a610a, + 0x1a6d7f, + 0x1a7595, + 0x1a79e0, + 0x1a8311, + 0x1a8f64, + 0x1a978e, + 0x1a9bfb, + 0x1aa65a, + 0x1aaa2f, + 0x1ab2c5, + 0x1abeb0, + 0x1ac5f2, + 0x1ac987, + 0x1ad16d, + 0x1add18, + 0x1ae0b9, + 0x1aeccc, + 0x1af426, + 0x1af853, + 0x1b01c4, + 0x1b0db1, + 0x1b155b, + 0x1b192e, + 0x1b248f, + 0x1b28fa, + 0x1b3010, + 0x1b3c65, + 0x1b4727, + 0x1b4b52, + 0x1b53b8, + 0x1b5fcd, + 0x1b626c, + 0x1b6e19, + 0x1b76f3, + 0x1b7a86, + 0x1b8077, + 0x1b8c02, + 0x1b94e8, + 0x1b989d, + 0x1ba53c, + 0x1ba949, + 0x1bb1a3, + 0x1bbdd6, + 0x1bc694, + 0x1bcae1, + 0x1bd20b, + 0x1bde7e, + 0x1be3df, + 0x1befaa, + 0x1bf740, + 0x1bfb35, + 0x1c0583, + 0x1c09f6, + 0x1c111c, + 0x1c1d69, + 0x1c20c8, + 0x1c2cbd, + 0x1c3457, + 0x1c3822, + 0x1c4360, + 0x1c4f15, + 0x1c57ff, + 0x1c5b8a, + 0x1c662b, + 0x1c6a5e, + 0x1c72b4, + 0x1c7ec1, + 0x1c8430, + 0x1c8845, + 0x1c90af, + 0x1c9cda, + 0x1ca17b, + 0x1cad0e, + 0x1cb5e4, + 0x1cb991, + 0x1cc2d3, + 0x1ccea6, + 0x1cd64c, + 0x1cda39, + 0x1ce798, + 0x1cebed, + 0x1cf307, + 0x1cff72, + 0x1d06e5, + 0x1d0a90, + 0x1d127a, + 0x1d1e0f, + 0x1d23ae, + 0x1d2fdb, + 0x1d3731, + 0x1d3b44, + 0x1d4006, + 0x1d4c73, + 0x1d5499, + 0x1d58ec, + 0x1d654d, + 0x1d6938, + 0x1d71d2, + 0x1d7da7, + 0x1d8756, + 0x1d8b23, + 0x1d93c9, + 0x1d9fbc, + 0x1da21d, + 0x1dae68, + 0x1db682, + 0x1dbaf7, + 0x1dc1b5, + 0x1dcdc0, + 0x1dd52a, + 0x1dd95f, + 0x1de4fe, + 0x1de88b, + 0x1df061, + 0x1dfc14, + 0x1e034f, + 0x1e0f3a, + 0x1e17d0, + 0x1e1ba5, + 0x1e2604, + 0x1e2a71, + 0x1e329b, + 0x1e3eee, + 0x1e45ac, + 0x1e49d9, + 0x1e5133, + 0x1e5d46, + 0x1e60e7, + 0x1e6c92, + 0x1e7478, + 0x1e780d, + 0x1e82fc, + 0x1e8e89, + 0x1e9663, + 0x1e9a16, + 0x1ea7b7, + 0x1eabc2, + 0x1eb328, + 0x1ebf5d, + 0x1ec41f, + 0x1ec86a, + 0x1ed080, + 0x1edcf5, + 0x1ee154, + 0x1eed21, + 0x1ef5cb, + 0x1ef9be, + 0x1f0029, + 0x1f0c5c, + 0x1f14b6, + 0x1f18c3, + 0x1f2562, + 0x1f2917, + 0x1f31fd, + 0x1f3d88, + 0x1f46ca, + 0x1f4abf, + 0x1f5255, + 0x1f5e20, + 0x1f6381, + 0x1f6ff4, + 0x1f771e, + 0x1f7b6b, + 0x1f819a, + 0x1f8def, + 0x1f9505, + 0x1f9970, + 0x1fa4d1, + 0x1fa8a4, + 0x1fb04e, + 0x1fbc3b, + 0x1fc779, + 0x1fcb0c, + 0x1fd3e6, + 0x1fdf93, + 0x1fe232, + 0x1fee47, + 0x1ff6ad, + 0x1ffad8, + 0x20031d, + 0x200f68, + 0x201782, + 0x201bf7, + 0x202656, + 0x202a23, + 0x2032c9, + 0x203ebc, + 0x2045fe, + 0x20498b, + 0x205161, + 0x205d14, + 0x2060b5, + 0x206cc0, + 0x20742a, + 0x20785f, + 0x2082ae, + 0x208edb, + 0x209631, + 0x209a44, + 0x20a7e5, + 0x20ab90, + 0x20b37a, + 0x20bf0f, + 0x20c44d, + 0x20c838, + 0x20d0d2, + 0x20dca7, + 0x20e106, + 0x20ed73, + 0x20f599, + 0x20f9ec, + 0x21007b, + 0x210c0e, + 0x2114e4, + 0x211891, + 0x212530, + 0x212945, + 0x2131af, + 0x213dda, + 0x214698, + 0x214aed, + 0x215207, + 0x215e72, + 0x2163d3, + 0x216fa6, + 0x21774c, + 0x217b39, + 0x2181c8, + 0x218dbd, + 0x219557, + 0x219922, + 0x21a483, + 0x21a8f6, + 0x21b01c, + 0x21bc69, + 0x21c72b, + 0x21cb5e, + 0x21d3b4, + 0x21dfc1, + 0x21e260, + 0x21ee15, + 0x21f6ff, + 0x21fa8a, + 0x2205d1, + 0x2209a4, + 0x22114e, + 0x221d3b, + 0x22209a, + 0x222cef, + 0x223405, + 0x223870, + 0x224332, + 0x224f47, + 0x2257ad, + 0x225bd8, + 0x226679, + 0x226a0c, + 0x2272e6, + 0x227e93, + 0x228462, + 0x228817, + 0x2290fd, + 0x229c88, + 0x22a129, + 0x22ad5c, + 0x22b5b6, + 0x22b9c3, + 0x22c281, + 0x22cef4, + 0x22d61e, + 0x22da6b, + 0x22e7ca, + 0x22ebbf, + 0x22f355, + 0x22ff20, + 0x2306b7, + 0x230ac2, + 0x231228, + 0x231e5d, + 0x2323fc, + 0x232f89, + 0x233763, + 0x233b16, + 0x234054, + 0x234c21, + 0x2354cb, + 0x2358be, + 0x23651f, + 0x23696a, + 0x237180, + 0x237df5, + 0x238704, + 0x238b71, + 0x23939b, + 0x239fee, + 0x23a24f, + 0x23ae3a, + 0x23b6d0, + 0x23baa5, + 0x23c1e7, + 0x23cd92, + 0x23d578, + 0x23d90d, + 0x23e4ac, + 0x23e8d9, + 0x23f033, + 0x23fc46, + 0x2402f0, + 0x240e85, + 0x24166f, + 0x241a1a, + 0x2427bb, + 0x242bce, + 0x243324, + 0x243f51, + 0x244413, + 0x244866, + 0x24508c, + 0x245cf9, + 0x246158, + 0x246d2d, + 0x2475c7, + 0x2479b2, + 0x248343, + 0x248f36, + 0x2497dc, + 0x249ba9, + 0x24a608, + 0x24aa7d, + 0x24b297, + 0x24bee2, + 0x24c5a0, + 0x24c9d5, + 0x24d13f, + 0x24dd4a, + 0x24e0eb, + 0x24ec9e, + 0x24f474, + 0x24f801, + 0x250196, + 0x250de3, + 0x251509, + 0x25197c, + 0x2524dd, + 0x2528a8, + 0x253042, + 0x253c37, + 0x254775, + 0x254b00, + 0x2553ea, + 0x255f9f, + 0x25623e, + 0x256e4b, + 0x2576a1, + 0x257ad4, + 0x258025, + 0x258c50, + 0x2594ba, + 0x2598cf, + 0x25a56e, + 0x25a91b, + 0x25b1f1, + 0x25bd84, + 0x25c6c6, + 0x25cab3, + 0x25d259, + 0x25de2c, + 0x25e38d, + 0x25eff8, + 0x25f712, + 0x25fb67, + 0x26043c, + 0x260849, + 0x2610a3, + 0x261cd6, + 0x262177, + 0x262d02, + 0x2635e8, + 0x26399d, + 0x2642df, + 0x264eaa, + 0x265640, + 0x265a35, + 0x266794, + 0x266be1, + 0x26730b, + 0x267f7e, + 0x26858f, + 0x2689fa, + 0x269110, + 0x269d65, + 0x26a0c4, + 0x26acb1, + 0x26b45b, + 0x26b82e, + 0x26c36c, + 0x26cf19, + 0x26d7f3, + 0x26db86, + 0x26e627, + 0x26ea52, + 0x26f2b8, + 0x26fecd, + 0x27075a, + 0x270b2f, + 0x2713c5, + 0x271fb0, + 0x272211, + 0x272e64, + 0x27368e, + 0x273afb, + 0x2741b9, + 0x274dcc, + 0x275526, + 0x275953, + 0x2764f2, + 0x276887, + 0x27706d, + 0x277c18, + 0x2786e9, + 0x278a9c, + 0x279276, + 0x279e03, + 0x27a3a2, + 0x27afd7, + 0x27b73d, + 0x27bb48, + 0x27c00a, + 0x27cc7f, + 0x27d495, + 0x27d8e0, + 0x27e541, + 0x27e934, + 0x27f1de, + 0x27fdab, + 0x2800c7, + 0x280cb2, + 0x281458, + 0x28182d, + 0x28258c, + 0x2829f9, + 0x283113, + 0x283d66, + 0x284624, + 0x284a51, + 0x2852bb, + 0x285ece, + 0x28636f, + 0x286f1a, + 0x2877f0, + 0x287b85, + 0x288174, + 0x288d01, + 0x2895eb, + 0x28999e, + 0x28a43f, + 0x28a84a, + 0x28b0a0, + 0x28bcd5, + 0x28c797, + 0x28cbe2, + 0x28d308, + 0x28df7d, + 0x28e2dc, + 0x28eea9, + 0x28f643, + 0x28fa36, + 0x2903a1, + 0x290fd4, + 0x29173e, + 0x291b4b, + 0x2926ea, + 0x292a9f, + 0x293275, + 0x293e00, + 0x294542, + 0x294937, + 0x2951dd, + 0x295da8, + 0x296009, + 0x296c7c, + 0x297496, + 0x2978e3, + 0x298212, + 0x298e67, + 0x29968d, + 0x299af8, + 0x29a759, + 0x29ab2c, + 0x29b3c6, + 0x29bfb3, + 0x29c4f1, + 0x29c884, + 0x29d06e, + 0x29dc1b, + 0x29e1ba, + 0x29edcf, + 0x29f525, + 0x29f950, + 0x2a060b, + 0x2a0a7e, + 0x2a1294, + 0x2a1ee1, + 0x2a2340, + 0x2a2f35, + 0x2a37df, + 0x2a3baa, + 0x2a40e8, + 0x2a4c9d, + 0x2a5477, + 0x2a5802, + 0x2a65a3, + 0x2a69d6, + 0x2a713c, + 0x2a7d49, + 0x2a87b8, + 0x2a8bcd, + 0x2a9327, + 0x2a9f52, + 0x2aa2f3, + 0x2aae86, + 0x2ab66c, + 0x2aba19, + 0x2ac15b, + 0x2acd2e, + 0x2ad5c4, + 0x2ad9b1, + 0x2ae410, + 0x2ae865, + 0x2af08f, + 0x2afcfa, + 0x2b056d, + 0x2b0918, + 0x2b11f2, + 0x2b1d87, + 0x2b2026, + 0x2b2c53, + 0x2b34b9, + 0x2b38cc, + 0x2b438e, + 0x2b4ffb, + 0x2b5711, + 0x2b5b64, + 0x2b66c5, + 0x2b6ab0, + 0x2b725a, + 0x2b7e2f, + 0x2b84de, + 0x2b88ab, + 0x2b9041, + 0x2b9c34, + 0x2ba195, + 0x2bade0, + 0x2bb50a, + 0x2bb97f, + 0x2bc23d, + 0x2bce48, + 0x2bd6a2, + 0x2bdad7, + 0x2be776, + 0x2beb03, + 0x2bf3e9, + 0x2bff9c, + 0x2c012a, + 0x2c0d5f, + 0x2c15b5, + 0x2c19c0, + 0x2c2461, + 0x2c2814, + 0x2c30fe, + 0x2c3c8b, + 0x2c47c9, + 0x2c4bbc, + 0x2c5356, + 0x2c5f23, + 0x2c6282, + 0x2c6ef7, + 0x2c761d, + 0x2c7a68, + 0x2c8099, + 0x2c8cec, + 0x2c9406, + 0x2c9873, + 0x2ca5d2, + 0x2ca9a7, + 0x2cb14d, + 0x2cbd38, + 0x2cc67a, + 0x2cca0f, + 0x2cd2e5, + 0x2cde90, + 0x2ce331, + 0x2cef44, + 0x2cf7ae, + 0x2cfbdb, + 0x2d024c, + 0x2d0e39, + 0x2d16d3, + 0x2d1aa6, + 0x2d2707, + 0x2d2b72, + 0x2d3398, + 0x2d3fed, + 0x2d44af, + 0x2d48da, + 0x2d5030, + 0x2d5c45, + 0x2d61e4, + 0x2d6d91, + 0x2d757b, + 0x2d790e, + 0x2d83ff, + 0x2d8f8a, + 0x2d9760, + 0x2d9b15, + 0x2da6b4, + 0x2daac1, + 0x2db22b, + 0x2dbe5e, + 0x2dc51c, + 0x2dc969, + 0x2dd183, + 0x2dddf6, + 0x2de057, + 0x2dec22, + 0x2df4c8, + 0x2df8bd, + 0x2e07e6, + 0x2e0b93, + 0x2e1379, + 0x2e1f0c, + 0x2e22ad, + 0x2e2ed8, + 0x2e3632, + 0x2e3a47, + 0x2e4105, + 0x2e4d70, + 0x2e559a, + 0x2e59ef, + 0x2e644e, + 0x2e683b, + 0x2e70d1, + 0x2e7ca4, + 0x2e8655, + 0x2e8a20, + 0x2e92ca, + 0x2e9ebf, + 0x2ea31e, + 0x2eaf6b, + 0x2eb781, + 0x2ebbf4, + 0x2ec0b6, + 0x2eccc3, + 0x2ed429, + 0x2ed85c, + 0x2ee5fd, + 0x2ee988, + 0x2ef162, + 0x2efd17, + 0x2f0480, + 0x2f08f5, + 0x2f101f, + 0x2f1c6a, + 0x2f21cb, + 0x2f2dbe, + 0x2f3554, + 0x2f3921, + 0x2f4263, + 0x2f4e16, + 0x2f56fc, + 0x2f5a89, + 0x2f6728, + 0x2f6b5d, + 0x2f73b7, + 0x2f7fc2, + 0x2f8533, + 0x2f8946, + 0x2f91ac, + 0x2f9dd9, + 0x2fa078, + 0x2fac0d, + 0x2fb4e7, + 0x2fb892, + 0x2fc3d0, + 0x2fcfa5, + 0x2fd74f, + 0x2fdb3a, + 0x2fe69b, + 0x2feaee, + 0x2ff204, + 0x2ffe71, + 0x3004a9, + 0x3008dc, + 0x301036, + 0x301c43, + 0x3021e2, + 0x302d97, + 0x30357d, + 0x303908, + 0x30424a, + 0x304e3f, + 0x3056d5, + 0x305aa0, + 0x306701, + 0x306b74, + 0x30739e, + 0x307feb, + 0x30851a, + 0x30896f, + 0x309185, + 0x309df0, + 0x30a051, + 0x30ac24, + 0x30b4ce, + 0x30b8bb, + 0x30c3f9, + 0x30cf8c, + 0x30d766, + 0x30db13, + 0x30e6b2, + 0x30eac7, + 0x30f22d, + 0x30fe58, + 0x3107cf, + 0x310bba, + 0x311350, + 0x311f25, + 0x312284, + 0x312ef1, + 0x31361b, + 0x313a6e, + 0x31412c, + 0x314d59, + 0x3155b3, + 0x3159c6, + 0x316467, + 0x316812, + 0x3170f8, + 0x317c8d, + 0x31867c, + 0x318a09, + 0x3192e3, + 0x319e96, + 0x31a337, + 0x31af42, + 0x31b7a8, + 0x31bbdd, + 0x31c09f, + 0x31ccea, + 0x31d400, + 0x31d875, + 0x31e5d4, + 0x31e9a1, + 0x31f14b, + 0x31fd3e, + 0x320265, + 0x320e10, + 0x3216fa, + 0x321a8f, + 0x32272e, + 0x322b5b, + 0x3233b1, + 0x323fc4, + 0x324486, + 0x3248f3, + 0x325019, + 0x325c6c, + 0x3261cd, + 0x326db8, + 0x327552, + 0x327927, + 0x3283d6, + 0x328fa3, + 0x329749, + 0x329b3c, + 0x32a69d, + 0x32aae8, + 0x32b202, + 0x32be77, + 0x32c535, + 0x32c940, + 0x32d1aa, + 0x32dddf, + 0x32e07e, + 0x32ec0b, + 0x32f4e1, + 0x32f894, + 0x330103, + 0x330d76, + 0x33159c, + 0x3319e9, + 0x332448, + 0x33283d, + 0x3330d7, + 0x333ca2, + 0x3347e0, + 0x334b95, + 0x33537f, + 0x335f0a, + 0x3362ab, + 0x336ede, + 0x337634, + 0x337a41, + 0x3380b0, + 0x338cc5, + 0x33942f, + 0x33985a, + 0x33a5fb, + 0x33a98e, + 0x33b164, + 0x33bd11, + 0x33c653, + 0x33ca26, + 0x33d2cc, + 0x33deb9, + 0x33e318, + 0x33ef6d, + 0x33f787, + 0x33fbf2, + 0x340544, + 0x340931, + 0x3411db, + 0x341dae, + 0x34200f, + 0x342c7a, + 0x343490, + 0x3438e5, + 0x3443a7, + 0x344fd2, + 0x345738, + 0x345b4d, + 0x3466ec, + 0x346a99, + 0x347273, + 0x347e06, + 0x3484f7, + 0x348882, + 0x349068, + 0x349c1d, + 0x34a1bc, + 0x34adc9, + 0x34b523, + 0x34b956, + 0x34c214, + 0x34ce61, + 0x34d68b, + 0x34dafe, + 0x34e75f, + 0x34eb2a, + 0x34f3c0, + 0x34ffb5, + 0x350622, + 0x350a57, + 0x3512bd, + 0x351ec8, + 0x352369, + 0x352f1c, + 0x3537f6, + 0x353b83, + 0x3540c1, + 0x354cb4, + 0x35545e, + 0x35582b, + 0x35658a, + 0x3569ff, + 0x357115, + 0x357d60, + 0x358791, + 0x358be4, + 0x35930e, + 0x359f7b, + 0x35a2da, + 0x35aeaf, + 0x35b645, + 0x35ba30, + 0x35c172, + 0x35cd07, + 0x35d5ed, + 0x35d998, + 0x35e439, + 0x35e84c, + 0x35f0a6, + 0x35fcd3, + 0x360388, + 0x360ffd, + 0x361717, + 0x361b62, + 0x3626c3, + 0x362ab6, + 0x36325c, + 0x363e29, + 0x36456b, + 0x36491e, + 0x3651f4, + 0x365d81, + 0x366020, + 0x366c55, + 0x3674bf, + 0x3678ca, + 0x36823b, + 0x368e4e, + 0x3696a4, + 0x369ad1, + 0x36a770, + 0x36ab05, + 0x36b3ef, + 0x36bf9a, + 0x36c4d8, + 0x36c8ad, + 0x36d047, + 0x36dc32, + 0x36e193, + 0x36ede6, + 0x36f50c, + 0x36f979, + 0x3700ee, + 0x370c9b, + 0x371471, + 0x371804, + 0x3725a5, + 0x3729d0, + 0x37313a, + 0x373d4f, + 0x37460d, + 0x374a78, + 0x375292, + 0x375ee7, + 0x376346, + 0x376f33, + 0x3777d9, + 0x377bac, + 0x37815d, + 0x378d28, + 0x3795c2, + 0x3799b7, + 0x37a416, + 0x37a863, + 0x37b089, + 0x37bcfc, + 0x37c7be, + 0x37cbcb, + 0x37d321, + 0x37df54, + 0x37e2f5, + 0x37ee80, + 0x37f66a, + 0x37fa1f, + 0x380773, + 0x380b06, + 0x3813ec, + 0x381f99, + 0x382238, + 0x382e4d, + 0x3836a7, + 0x383ad2, + 0x384190, + 0x384de5, + 0x38550f, + 0x38597a, + 0x3864db, + 0x3868ae, + 0x387044, + 0x387c31, + 0x3886c0, + 0x388ab5, + 0x38925f, + 0x389e2a, + 0x38a38b, + 0x38affe, + 0x38b714, + 0x38bb61, + 0x38c023, + 0x38cc56, + 0x38d4bc, + 0x38d8c9, + 0x38e568, + 0x38e91d, + 0x38f1f7, + 0x38fd82, + 0x390415, + 0x390860, + 0x39108a, + 0x391cff, + 0x39215e, + 0x392d2b, + 0x3935c1, + 0x3939b4, + 0x3942f6, + 0x394e83, + 0x395669, + 0x395a1c, + 0x3967bd, + 0x396bc8, + 0x397322, + 0x397f57, + 0x3985a6, + 0x3989d3, + 0x399139, + 0x399d4c, + 0x39a0ed, + 0x39ac98, + 0x39b472, + 0x39b807, + 0x39c345, + 0x39cf30, + 0x39d7da, + 0x39dbaf, + 0x39e60e, + 0x39ea7b, + 0x39f291, + 0x39fee4, + 0x3a01bf, + 0x3a0dca, + 0x3a1520, + 0x3a1955, + 0x3a24f4, + 0x3a2881, + 0x3a306b, + 0x3a3c1e, + 0x3a475c, + 0x3a4b29, + 0x3a53c3, + 0x3a5fb6, + 0x3a6217, + 0x3a6e62, + 0x3a7688, + 0x3a7afd, + 0x3a800c, + 0x3a8c79, + 0x3a9493, + 0x3a98e6, + 0x3aa547, + 0x3aa932, + 0x3ab1d8, + 0x3abdad, + 0x3ac6ef, + 0x3aca9a, + 0x3ad270, + 0x3ade05, + 0x3ae3a4, + 0x3aefd1, + 0x3af73b, + 0x3afb4e, + 0x3b02d9, + 0x3b0eac, + 0x3b1646, + 0x3b1a33, + 0x3b2792, + 0x3b2be7, + 0x3b330d, + 0x3b3f78, + 0x3b443a, + 0x3b484f, + 0x3b50a5, + 0x3b5cd0, + 0x3b6171, + 0x3b6d04, + 0x3b75ee, + 0x3b799b, + 0x3b836a, + 0x3b8f1f, + 0x3b97f5, + 0x3b9b80, + 0x3ba621, + 0x3baa54, + 0x3bb2be, + 0x3bbecb, + 0x3bc589, + 0x3bc9fc, + 0x3bd116, + 0x3bdd63, + 0x3be0c2, + 0x3becb7, + 0x3bf45d, + 0x3bf828, + 0x3c069e, + 0x3c0aeb, + 0x3c1201, + 0x3c1e74, + 0x3c23d5, + 0x3c2fa0, + 0x3c374a, + 0x3c3b3f, + 0x3c407d, + 0x3c4c08, + 0x3c54e2, + 0x3c5897, + 0x3c6536, + 0x3c6943, + 0x3c71a9, + 0x3c7ddc, + 0x3c872d, + 0x3c8b58, + 0x3c93b2, + 0x3c9fc7, + 0x3ca266, + 0x3cae13, + 0x3cb6f9, + 0x3cba8c, + 0x3cc1ce, + 0x3ccdbb, + 0x3cd551, + 0x3cd924, + 0x3ce485, + 0x3ce8f0, + 0x3cf01a, + 0x3cfc6f, + 0x3d05f8, + 0x3d098d, + 0x3d1167, + 0x3d1d12, + 0x3d20b3, + 0x3d2cc6, + 0x3d342c, + 0x3d3859, + 0x3d431b, + 0x3d4f6e, + 0x3d5784, + 0x3d5bf1, + 0x3d6650, + 0x3d6a25, + 0x3d72cf, + 0x3d7eba, + 0x3d844b, + 0x3d883e, + 0x3d90d4, + 0x3d9ca1, + 0x3da100, + 0x3dad75, + 0x3db59f, + 0x3db9ea, + 0x3dc2a8, + 0x3dcedd, + 0x3dd637, + 0x3dda42, + 0x3de7e3, + 0x3deb96, + 0x3df37c, + 0x3dff09, + 0x3e0052, + 0x3e0c27, + 0x3e14cd, + 0x3e18b8, + 0x3e2519, + 0x3e296c, + 0x3e3186, + 0x3e3df3, + 0x3e46b1, + 0x3e4ac4, + 0x3e522e, + 0x3e5e5b, + 0x3e63fa, + 0x3e6f8f, + 0x3e7765, + 0x3e7b10, + 0x3e81e1, + 0x3e8d94, + 0x3e957e, + 0x3e990b, + 0x3ea4aa, + 0x3ea8df, + 0x3eb035, + 0x3ebc40, + 0x3ec702, + 0x3ecb77, + 0x3ed39d, + 0x3edfe8, + 0x3ee249, + 0x3eee3c, + 0x3ef6d6, + 0x3efaa3, + 0x3f0334, + 0x3f0f41, + 0x3f17ab, + 0x3f1bde, + 0x3f267f, + 0x3f2a0a, + 0x3f32e0, + 0x3f3e95, + 0x3f45d7, + 0x3f49a2, + 0x3f5148, + 0x3f5d3d, + 0x3f609c, + 0x3f6ce9, + 0x3f7403, + 0x3f7876, + 0x3f8287, + 0x3f8ef2, + 0x3f9618, + 0x3f9a6d, + 0x3fa7cc, + 0x3fabb9, + 0x3fb353, + 0x3fbf26, + 0x3fc464, + 0x3fc811, + 0x3fd0fb, + 0x3fdc8e, + 0x3fe12f, + 0x3fed5a, + 0x3ff5b0, + 0x3ff9c5, + 0x40063a, + 0x400a4f, + 0x4012a5, + 0x401ed0, + 0x402371, + 0x402f04, + 0x4037ee, + 0x403b9b, + 0x4040d9, + 0x404cac, + 0x405446, + 0x405833, + 0x406592, + 0x4069e7, + 0x40710d, + 0x407d78, + 0x408789, + 0x408bfc, + 0x409316, + 0x409f63, + 0x40a2c2, + 0x40aeb7, + 0x40b65d, + 0x40ba28, + 0x40c16a, + 0x40cd1f, + 0x40d5f5, + 0x40d980, + 0x40e421, + 0x40e854, + 0x40f0be, + 0x40fccb, + 0x41055c, + 0x410929, + 0x4111c3, + 0x411db6, + 0x412017, + 0x412c62, + 0x413488, + 0x4138fd, + 0x4143bf, + 0x414fca, + 0x415720, + 0x415b55, + 0x4166f4, + 0x416a81, + 0x41726b, + 0x417e1e, + 0x4184ef, + 0x41889a, + 0x419070, + 0x419c05, + 0x41a1a4, + 0x41add1, + 0x41b53b, + 0x41b94e, + 0x41c20c, + 0x41ce79, + 0x41d693, + 0x41dae6, + 0x41e747, + 0x41eb32, + 0x41f3d8, + 0x41ffad, + 0x4200f6, + 0x420c83, + 0x421469, + 0x42181c, + 0x4225bd, + 0x4229c8, + 0x423122, + 0x423d57, + 0x424615, + 0x424a60, + 0x42528a, + 0x425eff, + 0x42635e, + 0x426f2b, + 0x4277c1, + 0x427bb4, + 0x428145, + 0x428d30, + 0x4295da, + 0x4299af, + 0x42a40e, + 0x42a87b, + 0x42b091, + 0x42bce4, + 0x42c7a6, + 0x42cbd3, + 0x42d339, + 0x42df4c, + 0x42e2ed, + 0x42ee98, + 0x42f672, + 0x42fa07, + 0x430390, + 0x430fe5, + 0x43170f, + 0x431b7a, + 0x4326db, + 0x432aae, + 0x433244, + 0x433e31, + 0x434573, + 0x434906, + 0x4351ec, + 0x435d99, + 0x436038, + 0x436c4d, + 0x4374a7, + 0x4378d2, + 0x438223, + 0x438e56, + 0x4396bc, + 0x439ac9, + 0x43a768, + 0x43ab1d, + 0x43b3f7, + 0x43bf82, + 0x43c4c0, + 0x43c8b5, + 0x43d05f, + 0x43dc2a, + 0x43e18b, + 0x43edfe, + 0x43f514, + 0x43f961, + 0x4407d7, + 0x440ba2, + 0x441348, + 0x441f3d, + 0x44229c, + 0x442ee9, + 0x443603, + 0x443a76, + 0x444134, + 0x444d41, + 0x4455ab, + 0x4459de, + 0x44647f, + 0x44680a, + 0x4470e0, + 0x447c95, + 0x448664, + 0x448a11, + 0x4492fb, + 0x449e8e, + 0x44a32f, + 0x44af5a, + 0x44b7b0, + 0x44bbc5, + 0x44c087, + 0x44ccf2, + 0x44d418, + 0x44d86d, + 0x44e5cc, + 0x44e9b9, + 0x44f153, + 0x44fd26, + 0x4504b1, + 0x4508c4, + 0x45102e, + 0x451c5b, + 0x4521fa, + 0x452d8f, + 0x453565, + 0x453910, + 0x454252, + 0x454e27, + 0x4556cd, + 0x455ab8, + 0x456719, + 0x456b6c, + 0x457386, + 0x457ff3, + 0x458502, + 0x458977, + 0x45919d, + 0x459de8, + 0x45a049, + 0x45ac3c, + 0x45b4d6, + 0x45b8a3, + 0x45c3e1, + 0x45cf94, + 0x45d77e, + 0x45db0b, + 0x45e6aa, + 0x45eadf, + 0x45f235, + 0x45fe40, + 0x46011b, + 0x460d6e, + 0x461584, + 0x4619f1, + 0x462450, + 0x462825, + 0x4630cf, + 0x463cba, + 0x4647f8, + 0x464b8d, + 0x465367, + 0x465f12, + 0x4662b3, + 0x466ec6, + 0x46762c, + 0x467a59, + 0x4680a8, + 0x468cdd, + 0x469437, + 0x469842, + 0x46a5e3, + 0x46a996, + 0x46b17c, + 0x46bd09, + 0x46c64b, + 0x46ca3e, + 0x46d2d4, + 0x46dea1, + 0x46e300, + 0x46ef75, + 0x46f79f, + 0x46fbea, + 0x47027d, + 0x470e08, + 0x4716e2, + 0x471a97, + 0x472736, + 0x472b43, + 0x4733a9, + 0x473fdc, + 0x47449e, + 0x4748eb, + 0x475001, + 0x475c74, + 0x4761d5, + 0x476da0, + 0x47754a, + 0x47793f, + 0x4783ce, + 0x478fbb, + 0x479751, + 0x479b24, + 0x47a685, + 0x47aaf0, + 0x47b21a, + 0x47be6f, + 0x47c52d, + 0x47c958, + 0x47d1b2, + 0x47ddc7, + 0x47e066, + 0x47ec13, + 0x47f4f9, + 0x47f88c, + 0x4805e0, + 0x480995, + 0x48117f, + 0x481d0a, + 0x4820ab, + 0x482cde, + 0x483434, + 0x483841, + 0x484303, + 0x484f76, + 0x48579c, + 0x485be9, + 0x486648, + 0x486a3d, + 0x4872d7, + 0x487ea2, + 0x488453, + 0x488826, + 0x4890cc, + 0x489cb9, + 0x48a118, + 0x48ad6d, + 0x48b587, + 0x48b9f2, + 0x48c2b0, + 0x48cec5, + 0x48d62f, + 0x48da5a, + 0x48e7fb, + 0x48eb8e, + 0x48f364, + 0x48ff11, + 0x490686, + 0x490af3, + 0x491219, + 0x491e6c, + 0x4923cd, + 0x492fb8, + 0x493752, + 0x493b27, + 0x494065, + 0x494c10, + 0x4954fa, + 0x49588f, + 0x49652e, + 0x49695b, + 0x4971b1, + 0x497dc4, + 0x498735, + 0x498b40, + 0x4993aa, + 0x499fdf, + 0x49a27e, + 0x49ae0b, + 0x49b6e1, + 0x49ba94, + 0x49c1d6, + 0x49cda3, + 0x49d549, + 0x49d93c, + 0x49e49d, + 0x49e8e8, + 0x49f002, + 0x49fc77, + 0x4a032c, + 0x4a0f59, + 0x4a17b3, + 0x4a1bc6, + 0x4a2667, + 0x4a2a12, + 0x4a32f8, + 0x4a3e8d, + 0x4a45cf, + 0x4a49ba, + 0x4a5150, + 0x4a5d25, + 0x4a6084, + 0x4a6cf1, + 0x4a741b, + 0x4a786e, + 0x4a829f, + 0x4a8eea, + 0x4a9600, + 0x4a9a75, + 0x4aa7d4, + 0x4aaba1, + 0x4ab34b, + 0x4abf3e, + 0x4ac47c, + 0x4ac809, + 0x4ad0e3, + 0x4adc96, + 0x4ae137, + 0x4aed42, + 0x4af5a8, + 0x4af9dd, + 0x4b004a, + 0x4b0c3f, + 0x4b14d5, + 0x4b18a0, + 0x4b2501, + 0x4b2974, + 0x4b319e, + 0x4b3deb, + 0x4b46a9, + 0x4b4adc, + 0x4b5236, + 0x4b5e43, + 0x4b63e2, + 0x4b6f97, + 0x4b777d, + 0x4b7b08, + 0x4b81f9, + 0x4b8d8c, + 0x4b9566, + 0x4b9913, + 0x4ba4b2, + 0x4ba8c7, + 0x4bb02d, + 0x4bbc58, + 0x4bc71a, + 0x4bcb6f, + 0x4bd385, + 0x4bdff0, + 0x4be251, + 0x4bee24, + 0x4bf6ce, + 0x4bfabb, + 0x4c040d, + 0x4c0878, + 0x4c1092, + 0x4c1ce7, + 0x4c2146, + 0x4c2d33, + 0x4c35d9, + 0x4c39ac, + 0x4c42ee, + 0x4c4e9b, + 0x4c5671, + 0x4c5a04, + 0x4c67a5, + 0x4c6bd0, + 0x4c733a, + 0x4c7f4f, + 0x4c85be, + 0x4c89cb, + 0x4c9121, + 0x4c9d54, + 0x4ca0f5, + 0x4cac80, + 0x4cb46a, + 0x4cb81f, + 0x4cc35d, + 0x4ccf28, + 0x4cd7c2, + 0x4cdbb7, + 0x4ce616, + 0x4cea63, + 0x4cf289, + 0x4cfefc, + 0x4d076b, + 0x4d0b1e, + 0x4d13f4, + 0x4d1f81, + 0x4d2220, + 0x4d2e55, + 0x4d36bf, + 0x4d3aca, + 0x4d4188, + 0x4d4dfd, + 0x4d5517, + 0x4d5962, + 0x4d64c3, + 0x4d68b6, + 0x4d705c, + 0x4d7c29, + 0x4d86d8, + 0x4d8aad, + 0x4d9247, + 0x4d9e32, + 0x4da393, + 0x4dafe6, + 0x4db70c, + 0x4dbb79, + 0x4dc03b, + 0x4dcc4e, + 0x4dd4a4, + 0x4dd8d1, + 0x4de570, + 0x4de905, + 0x4df1ef, + 0x4dfd9a, + 0x4e02c1, + 0x4e0eb4, + 0x4e165e, + 0x4e1a2b, + 0x4e278a, + 0x4e2bff, + 0x4e3315, + 0x4e3f60, + 0x4e4422, + 0x4e4857, + 0x4e50bd, + 0x4e5cc8, + 0x4e6169, + 0x4e6d1c, + 0x4e75f6, + 0x4e7983, + 0x4e8372, + 0x4e8f07, + 0x4e97ed, + 0x4e9b98, + 0x4ea639, + 0x4eaa4c, + 0x4eb2a6, + 0x4ebed3, + 0x4ec591, + 0x4ec9e4, + 0x4ed10e, + 0x4edd7b, + 0x4ee0da, + 0x4eecaf, + 0x4ef445, + 0x4ef830, + 0x4f01a7, + 0x4f0dd2, + 0x4f1538, + 0x4f194d, + 0x4f24ec, + 0x4f2899, + 0x4f3073, + 0x4f3c06, + 0x4f4744, + 0x4f4b31, + 0x4f53db, + 0x4f5fae, + 0x4f620f, + 0x4f6e7a, + 0x4f7690, + 0x4f7ae5, + 0x4f8014, + 0x4f8c61, + 0x4f948b, + 0x4f98fe, + 0x4fa55f, + 0x4fa92a, + 0x4fb1c0, + 0x4fbdb5, + 0x4fc6f7, + 0x4fca82, + 0x4fd268, + 0x4fde1d, + 0x4fe3bc, + 0x4fefc9, + 0x4ff723, + 0x4ffb56, + 0x50018e, + 0x500dfb, + 0x501511, + 0x501964, + 0x5024c5, + 0x5028b0, + 0x50305a, + 0x503c2f, + 0x50476d, + 0x504b18, + 0x5053f2, + 0x505f87, + 0x506226, + 0x506e53, + 0x5076b9, + 0x507acc, + 0x50803d, + 0x508c48, + 0x5094a2, + 0x5098d7, + 0x50a576, + 0x50a903, + 0x50b1e9, + 0x50bd9c, + 0x50c6de, + 0x50caab, + 0x50d241, + 0x50de34, + 0x50e395, + 0x50efe0, + 0x50f70a, + 0x50fb7f, + 0x5102e8, + 0x510e9d, + 0x511677, + 0x511a02, + 0x5127a3, + 0x512bd6, + 0x51333c, + 0x513f49, + 0x51440b, + 0x51487e, + 0x515094, + 0x515ce1, + 0x516140, + 0x516d35, + 0x5175df, + 0x5179aa, + 0x51835b, + 0x518f2e, + 0x5197c4, + 0x519bb1, + 0x51a610, + 0x51aa65, + 0x51b28f, + 0x51befa, + 0x51c5b8, + 0x51c9cd, + 0x51d127, + 0x51dd52, + 0x51e0f3, + 0x51ec86, + 0x51f46c, + 0x51f819, + 0x520742, + 0x520b37, + 0x5213dd, + 0x521fa8, + 0x522209, + 0x522e7c, + 0x523696, + 0x523ae3, + 0x5241a1, + 0x524dd4, + 0x52553e, + 0x52594b, + 0x5264ea, + 0x52689f, + 0x527075, + 0x527c00, + 0x5286f1, + 0x528a84, + 0x52926e, + 0x529e1b, + 0x52a3ba, + 0x52afcf, + 0x52b725, + 0x52bb50, + 0x52c012, + 0x52cc67, + 0x52d48d, + 0x52d8f8, + 0x52e559, + 0x52e92c, + 0x52f1c6, + 0x52fdb3, + 0x530424, + 0x530851, + 0x5310bb, + 0x531cce, + 0x53216f, + 0x532d1a, + 0x5335f0, + 0x533985, + 0x5342c7, + 0x534eb2, + 0x535658, + 0x535a2d, + 0x53678c, + 0x536bf9, + 0x537313, + 0x537f66, + 0x538597, + 0x5389e2, + 0x539108, + 0x539d7d, + 0x53a0dc, + 0x53aca9, + 0x53b443, + 0x53b836, + 0x53c374, + 0x53cf01, + 0x53d7eb, + 0x53db9e, + 0x53e63f, + 0x53ea4a, + 0x53f2a0, + 0x53fed5, + 0x540063, + 0x540c16, + 0x5414fc, + 0x541889, + 0x542528, + 0x54295d, + 0x5431b7, + 0x543dc2, + 0x544680, + 0x544af5, + 0x54521f, + 0x545e6a, + 0x5463cb, + 0x546fbe, + 0x547754, + 0x547b21, + 0x5481d0, + 0x548da5, + 0x54954f, + 0x54993a, + 0x54a49b, + 0x54a8ee, + 0x54b004, + 0x54bc71, + 0x54c733, + 0x54cb46, + 0x54d3ac, + 0x54dfd9, + 0x54e278, + 0x54ee0d, + 0x54f6e7, + 0x54fa92, + 0x550305, + 0x550f70, + 0x55179a, + 0x551bef, + 0x55264e, + 0x552a3b, + 0x5532d1, + 0x553ea4, + 0x5545e6, + 0x554993, + 0x555179, + 0x555d0c, + 0x5560ad, + 0x556cd8, + 0x557432, + 0x557847, + 0x5582b6, + 0x558ec3, + 0x559629, + 0x559a5c, + 0x55a7fd, + 0x55ab88, + 0x55b362, + 0x55bf17, + 0x55c455, + 0x55c820, + 0x55d0ca, + 0x55dcbf, + 0x55e11e, + 0x55ed6b, + 0x55f581, + 0x55f9f4, + 0x5606af, + 0x560ada, + 0x561230, + 0x561e45, + 0x5623e4, + 0x562f91, + 0x56377b, + 0x563b0e, + 0x56404c, + 0x564c39, + 0x5654d3, + 0x5658a6, + 0x566507, + 0x566972, + 0x567198, + 0x567ded, + 0x56871c, + 0x568b69, + 0x569383, + 0x569ff6, + 0x56a257, + 0x56ae22, + 0x56b6c8, + 0x56babd, + 0x56c1ff, + 0x56cd8a, + 0x56d560, + 0x56d915, + 0x56e4b4, + 0x56e8c1, + 0x56f02b, + 0x56fc5e, + 0x5705c9, + 0x5709bc, + 0x571156, + 0x571d23, + 0x572082, + 0x572cf7, + 0x57341d, + 0x573868, + 0x57432a, + 0x574f5f, + 0x5757b5, + 0x575bc0, + 0x576661, + 0x576a14, + 0x5772fe, + 0x577e8b, + 0x57847a, + 0x57880f, + 0x5790e5, + 0x579c90, + 0x57a131, + 0x57ad44, + 0x57b5ae, + 0x57b9db, + 0x57c299, + 0x57ceec, + 0x57d606, + 0x57da73, + 0x57e7d2, + 0x57eba7, + 0x57f34d, + 0x57ff38, + 0x580254, + 0x580e21, + 0x5816cb, + 0x581abe, + 0x58271f, + 0x582b6a, + 0x583380, + 0x583ff5, + 0x5844b7, + 0x5848c2, + 0x585028, + 0x585c5d, + 0x5861fc, + 0x586d89, + 0x587563, + 0x587916, + 0x5883e7, + 0x588f92, + 0x589778, + 0x589b0d, + 0x58a6ac, + 0x58aad9, + 0x58b233, + 0x58be46, + 0x58c504, + 0x58c971, + 0x58d19b, + 0x58ddee, + 0x58e04f, + 0x58ec3a, + 0x58f4d0, + 0x58f8a5, + 0x590132, + 0x590d47, + 0x5915ad, + 0x5919d8, + 0x592479, + 0x59280c, + 0x5930e6, + 0x593c93, + 0x5947d1, + 0x594ba4, + 0x59534e, + 0x595f3b, + 0x59629a, + 0x596eef, + 0x597605, + 0x597a70, + 0x598081, + 0x598cf4, + 0x59941e, + 0x59986b, + 0x59a5ca, + 0x59a9bf, + 0x59b155, + 0x59bd20, + 0x59c662, + 0x59ca17, + 0x59d2fd, + 0x59de88, + 0x59e329, + 0x59ef5c, + 0x59f7b6, + 0x59fbc3, + 0x5a0498, + 0x5a08ed, + 0x5a1007, + 0x5a1c72, + 0x5a21d3, + 0x5a2da6, + 0x5a354c, + 0x5a3939, + 0x5a427b, + 0x5a4e0e, + 0x5a56e4, + 0x5a5a91, + 0x5a6730, + 0x5a6b45, + 0x5a73af, + 0x5a7fda, + 0x5a852b, + 0x5a895e, + 0x5a91b4, + 0x5a9dc1, + 0x5aa060, + 0x5aac15, + 0x5ab4ff, + 0x5ab88a, + 0x5ac3c8, + 0x5acfbd, + 0x5ad757, + 0x5adb22, + 0x5ae683, + 0x5aeaf6, + 0x5af21c, + 0x5afe69, + 0x5b07fe, + 0x5b0b8b, + 0x5b1361, + 0x5b1f14, + 0x5b22b5, + 0x5b2ec0, + 0x5b362a, + 0x5b3a5f, + 0x5b411d, + 0x5b4d68, + 0x5b5582, + 0x5b59f7, + 0x5b6456, + 0x5b6823, + 0x5b70c9, + 0x5b7cbc, + 0x5b864d, + 0x5b8a38, + 0x5b92d2, + 0x5b9ea7, + 0x5ba306, + 0x5baf73, + 0x5bb799, + 0x5bbbec, + 0x5bc0ae, + 0x5bccdb, + 0x5bd431, + 0x5bd844, + 0x5be5e5, + 0x5be990, + 0x5bf17a, + 0x5bfd0f, + 0x5c03b9, + 0x5c0fcc, + 0x5c1726, + 0x5c1b53, + 0x5c26f2, + 0x5c2a87, + 0x5c326d, + 0x5c3e18, + 0x5c455a, + 0x5c492f, + 0x5c51c5, + 0x5c5db0, + 0x5c6011, + 0x5c6c64, + 0x5c748e, + 0x5c78fb, + 0x5c820a, + 0x5c8e7f, + 0x5c9695, + 0x5c9ae0, + 0x5ca741, + 0x5cab34, + 0x5cb3de, + 0x5cbfab, + 0x5cc4e9, + 0x5cc89c, + 0x5cd076, + 0x5cdc03, + 0x5ce1a2, + 0x5cedd7, + 0x5cf53d, + 0x5cf948, + 0x5d00df, + 0x5d0caa, + 0x5d1440, + 0x5d1835, + 0x5d2594, + 0x5d29e1, + 0x5d310b, + 0x5d3d7e, + 0x5d463c, + 0x5d4a49, + 0x5d52a3, + 0x5d5ed6, + 0x5d6377, + 0x5d6f02, + 0x5d77e8, + 0x5d7b9d, + 0x5d816c, + 0x5d8d19, + 0x5d95f3, + 0x5d9986, + 0x5da427, + 0x5da852, + 0x5db0b8, + 0x5dbccd, + 0x5dc78f, + 0x5dcbfa, + 0x5dd310, + 0x5ddf65, + 0x5de2c4, + 0x5deeb1, + 0x5df65b, + 0x5dfa2e, + 0x5e0575, + 0x5e0900, + 0x5e11ea, + 0x5e1d9f, + 0x5e203e, + 0x5e2c4b, + 0x5e34a1, + 0x5e38d4, + 0x5e4396, + 0x5e4fe3, + 0x5e5709, + 0x5e5b7c, + 0x5e66dd, + 0x5e6aa8, + 0x5e7242, + 0x5e7e37, + 0x5e84c6, + 0x5e88b3, + 0x5e9059, + 0x5e9c2c, + 0x5ea18d, + 0x5eadf8, + 0x5eb512, + 0x5eb967, + 0x5ec225, + 0x5ece50, + 0x5ed6ba, + 0x5edacf, + 0x5ee76e, + 0x5eeb1b, + 0x5ef3f1, + 0x5eff84, + 0x5f0613, + 0x5f0a66, + 0x5f128c, + 0x5f1ef9, + 0x5f2358, + 0x5f2f2d, + 0x5f37c7, + 0x5f3bb2, + 0x5f40f0, + 0x5f4c85, + 0x5f546f, + 0x5f581a, + 0x5f65bb, + 0x5f69ce, + 0x5f7124, + 0x5f7d51, + 0x5f87a0, + 0x5f8bd5, + 0x5f933f, + 0x5f9f4a, + 0x5fa2eb, + 0x5fae9e, + 0x5fb674, + 0x5fba01, + 0x5fc143, + 0x5fcd36, + 0x5fd5dc, + 0x5fd9a9, + 0x5fe408, + 0x5fe87d, + 0x5ff097, + 0x5ffce2, + 0x600527, + 0x600952, + 0x6011b8, + 0x601dcd, + 0x60206c, + 0x602c19, + 0x6034f3, + 0x603886, + 0x6043c4, + 0x604fb1, + 0x60575b, + 0x605b2e, + 0x60668f, + 0x606afa, + 0x607210, + 0x607e65, + 0x608494, + 0x6088e1, + 0x60900b, + 0x609c7e, + 0x60a1df, + 0x60adaa, + 0x60b540, + 0x60b935, + 0x60c277, + 0x60ce02, + 0x60d6e8, + 0x60da9d, + 0x60e73c, + 0x60eb49, + 0x60f3a3, + 0x60ffd6, + 0x610641, + 0x610a34, + 0x6112de, + 0x611eab, + 0x61230a, + 0x612f7f, + 0x613795, + 0x613be0, + 0x6140a2, + 0x614cd7, + 0x61543d, + 0x615848, + 0x6165e9, + 0x61699c, + 0x617176, + 0x617d03, + 0x6187f2, + 0x618b87, + 0x61936d, + 0x619f18, + 0x61a2b9, + 0x61aecc, + 0x61b626, + 0x61ba53, + 0x61c111, + 0x61cd64, + 0x61d58e, + 0x61d9fb, + 0x61e45a, + 0x61e82f, + 0x61f0c5, + 0x61fcb0, + 0x6203eb, + 0x620f9e, + 0x621774, + 0x621b01, + 0x6226a0, + 0x622ad5, + 0x62323f, + 0x623e4a, + 0x624508, + 0x62497d, + 0x625197, + 0x625de2, + 0x626043, + 0x626c36, + 0x6274dc, + 0x6278a9, + 0x628258, + 0x628e2d, + 0x6296c7, + 0x629ab2, + 0x62a713, + 0x62ab66, + 0x62b38c, + 0x62bff9, + 0x62c4bb, + 0x62c8ce, + 0x62d024, + 0x62dc51, + 0x62e1f0, + 0x62ed85, + 0x62f56f, + 0x62f91a, + 0x63008d, + 0x630cf8, + 0x631412, + 0x631867, + 0x6325c6, + 0x6329b3, + 0x633159, + 0x633d2c, + 0x63466e, + 0x634a1b, + 0x6352f1, + 0x635e84, + 0x636325, + 0x636f50, + 0x6377ba, + 0x637bcf, + 0x63813e, + 0x638d4b, + 0x6395a1, + 0x6399d4, + 0x63a475, + 0x63a800, + 0x63b0ea, + 0x63bc9f, + 0x63c7dd, + 0x63cba8, + 0x63d342, + 0x63df37, + 0x63e296, + 0x63eee3, + 0x63f609, + 0x63fa7c, + 0x6404ca, + 0x6408bf, + 0x641055, + 0x641c20, + 0x642181, + 0x642df4, + 0x64351e, + 0x64396b, + 0x644229, + 0x644e5c, + 0x6456b6, + 0x645ac3, + 0x646762, + 0x646b17, + 0x6473fd, + 0x647f88, + 0x648579, + 0x64890c, + 0x6491e6, + 0x649d93, + 0x64a032, + 0x64ac47, + 0x64b4ad, + 0x64b8d8, + 0x64c39a, + 0x64cfef, + 0x64d705, + 0x64db70, + 0x64e6d1, + 0x64eaa4, + 0x64f24e, + 0x64fe3b, + 0x6507ac, + 0x650bd9, + 0x651333, + 0x651f46, + 0x6522e7, + 0x652e92, + 0x653678, + 0x653a0d, + 0x65414f, + 0x654d3a, + 0x6555d0, + 0x6559a5, + 0x656404, + 0x656871, + 0x65709b, + 0x657cee, + 0x65861f, + 0x658a6a, + 0x659280, + 0x659ef5, + 0x65a354, + 0x65af21, + 0x65b7cb, + 0x65bbbe, + 0x65c0fc, + 0x65cc89, + 0x65d463, + 0x65d816, + 0x65e5b7, + 0x65e9c2, + 0x65f128, + 0x65fd5d, + 0x660206, + 0x660e73, + 0x661699, + 0x661aec, + 0x66274d, + 0x662b38, + 0x6633d2, + 0x663fa7, + 0x6644e5, + 0x664890, + 0x66507a, + 0x665c0f, + 0x6661ae, + 0x666ddb, + 0x667531, + 0x667944, + 0x6683b5, + 0x668fc0, + 0x66972a, + 0x669b5f, + 0x66a6fe, + 0x66aa8b, + 0x66b261, + 0x66be14, + 0x66c556, + 0x66c923, + 0x66d1c9, + 0x66ddbc, + 0x66e01d, + 0x66ec68, + 0x66f482, + 0x66f8f7, + 0x670160, + 0x670d15, + 0x6715ff, + 0x67198a, + 0x67242b, + 0x67285e, + 0x6730b4, + 0x673cc1, + 0x674783, + 0x674bf6, + 0x67531c, + 0x675f69, + 0x6762c8, + 0x676ebd, + 0x677657, + 0x677a22, + 0x6780d3, + 0x678ca6, + 0x67944c, + 0x679839, + 0x67a598, + 0x67a9ed, + 0x67b107, + 0x67bd72, + 0x67c630, + 0x67ca45, + 0x67d2af, + 0x67deda, + 0x67e37b, + 0x67ef0e, + 0x67f7e4, + 0x67fb91, + 0x6806fd, + 0x680a88, + 0x681262, + 0x681e17, + 0x6823b6, + 0x682fc3, + 0x683729, + 0x683b5c, + 0x68401e, + 0x684c6b, + 0x685481, + 0x6858f4, + 0x686555, + 0x686920, + 0x6871ca, + 0x687dbf, + 0x68874e, + 0x688b3b, + 0x6893d1, + 0x689fa4, + 0x68a205, + 0x68ae70, + 0x68b69a, + 0x68baef, + 0x68c1ad, + 0x68cdd8, + 0x68d532, + 0x68d947, + 0x68e4e6, + 0x68e893, + 0x68f079, + 0x68fc0c, + 0x69059b, + 0x6909ee, + 0x691104, + 0x691d71, + 0x6920d0, + 0x692ca5, + 0x69344f, + 0x69383a, + 0x694378, + 0x694f0d, + 0x6957e7, + 0x695b92, + 0x696633, + 0x696a46, + 0x6972ac, + 0x697ed9, + 0x698428, + 0x69885d, + 0x6990b7, + 0x699cc2, + 0x69a163, + 0x69ad16, + 0x69b5fc, + 0x69b989, + 0x69c2cb, + 0x69cebe, + 0x69d654, + 0x69da21, + 0x69e780, + 0x69ebf5, + 0x69f31f, + 0x69ff6a, + 0x6a0031, + 0x6a0c44, + 0x6a14ae, + 0x6a18db, + 0x6a257a, + 0x6a290f, + 0x6a31e5, + 0x6a3d90, + 0x6a46d2, + 0x6a4aa7, + 0x6a524d, + 0x6a5e38, + 0x6a6399, + 0x6a6fec, + 0x6a7706, + 0x6a7b73, + 0x6a8182, + 0x6a8df7, + 0x6a951d, + 0x6a9968, + 0x6aa4c9, + 0x6aa8bc, + 0x6ab056, + 0x6abc23, + 0x6ac761, + 0x6acb14, + 0x6ad3fe, + 0x6adf8b, + 0x6ae22a, + 0x6aee5f, + 0x6af6b5, + 0x6afac0, + 0x6b0357, + 0x6b0f22, + 0x6b17c8, + 0x6b1bbd, + 0x6b261c, + 0x6b2a69, + 0x6b3283, + 0x6b3ef6, + 0x6b45b4, + 0x6b49c1, + 0x6b512b, + 0x6b5d5e, + 0x6b60ff, + 0x6b6c8a, + 0x6b7460, + 0x6b7815, + 0x6b82e4, + 0x6b8e91, + 0x6b967b, + 0x6b9a0e, + 0x6ba7af, + 0x6babda, + 0x6bb330, + 0x6bbf45, + 0x6bc407, + 0x6bc872, + 0x6bd098, + 0x6bdced, + 0x6be14c, + 0x6bed39, + 0x6bf5d3, + 0x6bf9a6, + 0x6c0710, + 0x6c0b65, + 0x6c138f, + 0x6c1ffa, + 0x6c225b, + 0x6c2e2e, + 0x6c36c4, + 0x6c3ab1, + 0x6c41f3, + 0x6c4d86, + 0x6c556c, + 0x6c5919, + 0x6c64b8, + 0x6c68cd, + 0x6c7027, + 0x6c7c52, + 0x6c86a3, + 0x6c8ad6, + 0x6c923c, + 0x6c9e49, + 0x6ca3e8, + 0x6caf9d, + 0x6cb777, + 0x6cbb02, + 0x6cc040, + 0x6ccc35, + 0x6cd4df, + 0x6cd8aa, + 0x6ce50b, + 0x6ce97e, + 0x6cf194, + 0x6cfde1, + 0x6d0476, + 0x6d0803, + 0x6d10e9, + 0x6d1c9c, + 0x6d213d, + 0x6d2d48, + 0x6d35a2, + 0x6d39d7, + 0x6d4295, + 0x6d4ee0, + 0x6d560a, + 0x6d5a7f, + 0x6d67de, + 0x6d6bab, + 0x6d7341, + 0x6d7f34, + 0x6d85c5, + 0x6d89b0, + 0x6d915a, + 0x6d9d2f, + 0x6da08e, + 0x6dacfb, + 0x6db411, + 0x6db864, + 0x6dc326, + 0x6dcf53, + 0x6dd7b9, + 0x6ddbcc, + 0x6de66d, + 0x6dea18, + 0x6df2f2, + 0x6dfe87, + 0x6e01dc, + 0x6e0da9, + 0x6e1543, + 0x6e1936, + 0x6e2497, + 0x6e28e2, + 0x6e3008, + 0x6e3c7d, + 0x6e473f, + 0x6e4b4a, + 0x6e53a0, + 0x6e5fd5, + 0x6e6274, + 0x6e6e01, + 0x6e76eb, + 0x6e7a9e, + 0x6e806f, + 0x6e8c1a, + 0x6e94f0, + 0x6e9885, + 0x6ea524, + 0x6ea951, + 0x6eb1bb, + 0x6ebdce, + 0x6ec68c, + 0x6ecaf9, + 0x6ed213, + 0x6ede66, + 0x6ee3c7, + 0x6eefb2, + 0x6ef758, + 0x6efb2d, + 0x6f02ba, + 0x6f0ecf, + 0x6f1625, + 0x6f1a50, + 0x6f27f1, + 0x6f2b84, + 0x6f336e, + 0x6f3f1b, + 0x6f4459, + 0x6f482c, + 0x6f50c6, + 0x6f5cb3, + 0x6f6112, + 0x6f6d67, + 0x6f758d, + 0x6f79f8, + 0x6f8309, + 0x6f8f7c, + 0x6f9796, + 0x6f9be3, + 0x6fa642, + 0x6faa37, + 0x6fb2dd, + 0x6fbea8, + 0x6fc5ea, + 0x6fc99f, + 0x6fd175, + 0x6fdd00, + 0x6fe0a1, + 0x6fecd4, + 0x6ff43e, + 0x6ff84b, + 0x700293, + 0x700ee6, + 0x70160c, + 0x701a79, + 0x7027d8, + 0x702bad, + 0x703347, + 0x703f32, + 0x704470, + 0x704805, + 0x7050ef, + 0x705c9a, + 0x70613b, + 0x706d4e, + 0x7075a4, + 0x7079d1, + 0x708320, + 0x708f55, + 0x7097bf, + 0x709bca, + 0x70a66b, + 0x70aa1e, + 0x70b2f4, + 0x70be81, + 0x70c5c3, + 0x70c9b6, + 0x70d15c, + 0x70dd29, + 0x70e088, + 0x70ecfd, + 0x70f417, + 0x70f862, + 0x7101f5, + 0x710d80, + 0x71156a, + 0x71191f, + 0x7124be, + 0x7128cb, + 0x713021, + 0x713c54, + 0x714716, + 0x714b63, + 0x715389, + 0x715ffc, + 0x71625d, + 0x716e28, + 0x7176c2, + 0x717ab7, + 0x718046, + 0x718c33, + 0x7194d9, + 0x7198ac, + 0x71a50d, + 0x71a978, + 0x71b192, + 0x71bde7, + 0x71c6a5, + 0x71cad0, + 0x71d23a, + 0x71de4f, + 0x71e3ee, + 0x71ef9b, + 0x71f771, + 0x71fb04, + 0x72045f, + 0x72082a, + 0x7210c0, + 0x721cb5, + 0x722114, + 0x722d61, + 0x72358b, + 0x7239fe, + 0x7242bc, + 0x724ec9, + 0x725623, + 0x725a56, + 0x7267f7, + 0x726b82, + 0x727368, + 0x727f1d, + 0x7285ec, + 0x728999, + 0x729173, + 0x729d06, + 0x72a0a7, + 0x72acd2, + 0x72b438, + 0x72b84d, + 0x72c30f, + 0x72cf7a, + 0x72d790, + 0x72dbe5, + 0x72e644, + 0x72ea31, + 0x72f2db, + 0x72feae, + 0x730739, + 0x730b4c, + 0x7313a6, + 0x731fd3, + 0x732272, + 0x732e07, + 0x7336ed, + 0x733a98, + 0x7341da, + 0x734daf, + 0x735545, + 0x735930, + 0x736491, + 0x7368e4, + 0x73700e, + 0x737c7b, + 0x73868a, + 0x738aff, + 0x739215, + 0x739e60, + 0x73a3c1, + 0x73afb4, + 0x73b75e, + 0x73bb2b, + 0x73c069, + 0x73cc1c, + 0x73d4f6, + 0x73d883, + 0x73e522, + 0x73e957, + 0x73f1bd, + 0x73fdc8, + 0x74037e, + 0x740f0b, + 0x7417e1, + 0x741b94, + 0x742635, + 0x742a40, + 0x7432aa, + 0x743edf, + 0x74459d, + 0x7449e8, + 0x745102, + 0x745d77, + 0x7460d6, + 0x746ca3, + 0x747449, + 0x74783c, + 0x7482cd, + 0x748eb8, + 0x749652, + 0x749a27, + 0x74a786, + 0x74abf3, + 0x74b319, + 0x74bf6c, + 0x74c42e, + 0x74c85b, + 0x74d0b1, + 0x74dcc4, + 0x74e165, + 0x74ed10, + 0x74f5fa, + 0x74f98f, + 0x750018, + 0x750c6d, + 0x751487, + 0x7518f2, + 0x752553, + 0x752926, + 0x7531cc, + 0x753db9, + 0x7546fb, + 0x754a8e, + 0x755264, + 0x755e11, + 0x7563b0, + 0x756fc5, + 0x75772f, + 0x757b5a, + 0x7581ab, + 0x758dde, + 0x759534, + 0x759941, + 0x75a4e0, + 0x75a895, + 0x75b07f, + 0x75bc0a, + 0x75c748, + 0x75cb3d, + 0x75d3d7, + 0x75dfa2, + 0x75e203, + 0x75ee76, + 0x75f69c, + 0x75fae9, + 0x7605b2, + 0x7609c7, + 0x76112d, + 0x761d58, + 0x7620f9, + 0x762c8c, + 0x763466, + 0x763813, + 0x764351, + 0x764f24, + 0x7657ce, + 0x765bbb, + 0x76661a, + 0x766a6f, + 0x767285, + 0x767ef0, + 0x768401, + 0x768874, + 0x76909e, + 0x769ceb, + 0x76a14a, + 0x76ad3f, + 0x76b5d5, + 0x76b9a0, + 0x76c2e2, + 0x76ce97, + 0x76d67d, + 0x76da08, + 0x76e7a9, + 0x76ebdc, + 0x76f336, + 0x76ff43, + 0x7706d4, + 0x770aa1, + 0x77124b, + 0x771e3e, + 0x77239f, + 0x772fea, + 0x773700, + 0x773b75, + 0x774037, + 0x774c42, + 0x7754a8, + 0x7758dd, + 0x77657c, + 0x776909, + 0x7771e3, + 0x777d96, + 0x778767, + 0x778b12, + 0x7793f8, + 0x779f8d, + 0x77a22c, + 0x77ae59, + 0x77b6b3, + 0x77bac6, + 0x77c184, + 0x77cdf1, + 0x77d51b, + 0x77d96e, + 0x77e4cf, + 0x77e8ba, + 0x77f050, + 0x77fc25, + 0x780149, + 0x780d3c, + 0x7815d6, + 0x7819a3, + 0x782402, + 0x782877, + 0x78309d, + 0x783ce8, + 0x7847aa, + 0x784bdf, + 0x785335, + 0x785f40, + 0x7862e1, + 0x786e94, + 0x78767e, + 0x787a0b, + 0x7880fa, + 0x788c8f, + 0x789465, + 0x789810, + 0x78a5b1, + 0x78a9c4, + 0x78b12e, + 0x78bd5b, + 0x78c619, + 0x78ca6c, + 0x78d286, + 0x78def3, + 0x78e352, + 0x78ef27, + 0x78f7cd, + 0x78fbb8, + 0x79022f, + 0x790e5a, + 0x7916b0, + 0x791ac5, + 0x792764, + 0x792b11, + 0x7933fb, + 0x793f8e, + 0x7944cc, + 0x7948b9, + 0x795053, + 0x795c26, + 0x796187, + 0x796df2, + 0x797518, + 0x79796d, + 0x79839c, + 0x798fe9, + 0x799703, + 0x799b76, + 0x79a6d7, + 0x79aaa2, + 0x79b248, + 0x79be3d, + 0x79c57f, + 0x79c90a, + 0x79d1e0, + 0x79dd95, + 0x79e034, + 0x79ec41, + 0x79f4ab, + 0x79f8de, + 0x7a0785, + 0x7a0bf0, + 0x7a131a, + 0x7a1f6f, + 0x7a22ce, + 0x7a2ebb, + 0x7a3651, + 0x7a3a24, + 0x7a4166, + 0x7a4d13, + 0x7a55f9, + 0x7a598c, + 0x7a642d, + 0x7a6858, + 0x7a70b2, + 0x7a7cc7, + 0x7a8636, + 0x7a8a43, + 0x7a92a9, + 0x7a9edc, + 0x7aa37d, + 0x7aaf08, + 0x7ab7e2, + 0x7abb97, + 0x7ac0d5, + 0x7acca0, + 0x7ad44a, + 0x7ad83f, + 0x7ae59e, + 0x7ae9eb, + 0x7af101, + 0x7afd74, + 0x7b04e3, + 0x7b0896, + 0x7b107c, + 0x7b1c09, + 0x7b21a8, + 0x7b2ddd, + 0x7b3537, + 0x7b3942, + 0x7b4200, + 0x7b4e75, + 0x7b569f, + 0x7b5aea, + 0x7b674b, + 0x7b6b3e, + 0x7b73d4, + 0x7b7fa1, + 0x7b8550, + 0x7b8925, + 0x7b91cf, + 0x7b9dba, + 0x7ba01b, + 0x7bac6e, + 0x7bb484, + 0x7bb8f1, + 0x7bc3b3, + 0x7bcfc6, + 0x7bd72c, + 0x7bdb59, + 0x7be6f8, + 0x7bea8d, + 0x7bf267, + 0x7bfe12, + 0x7c00a4, + 0x7c0cd1, + 0x7c143b, + 0x7c184e, + 0x7c25ef, + 0x7c299a, + 0x7c3170, + 0x7c3d05, + 0x7c4647, + 0x7c4a32, + 0x7c52d8, + 0x7c5ead, + 0x7c630c, + 0x7c6f79, + 0x7c7793, + 0x7c7be6, + 0x7c8117, + 0x7c8d62, + 0x7c9588, + 0x7c99fd, + 0x7ca45c, + 0x7ca829, + 0x7cb0c3, + 0x7cbcb6, + 0x7cc7f4, + 0x7ccb81, + 0x7cd36b, + 0x7cdf1e, + 0x7ce2bf, + 0x7ceeca, + 0x7cf620, + 0x7cfa55, + 0x7d03c2, + 0x7d0fb7, + 0x7d175d, + 0x7d1b28, + 0x7d2689, + 0x7d2afc, + 0x7d3216, + 0x7d3e63, + 0x7d4521, + 0x7d4954, + 0x7d51be, + 0x7d5dcb, + 0x7d606a, + 0x7d6c1f, + 0x7d74f5, + 0x7d7880, + 0x7d8271, + 0x7d8e04, + 0x7d96ee, + 0x7d9a9b, + 0x7da73a, + 0x7dab4f, + 0x7db3a5, + 0x7dbfd0, + 0x7dc492, + 0x7dc8e7, + 0x7dd00d, + 0x7ddc78, + 0x7de1d9, + 0x7dedac, + 0x7df546, + 0x7df933, + 0x7e0668, + 0x7e0a1d, + 0x7e12f7, + 0x7e1e82, + 0x7e2323, + 0x7e2f56, + 0x7e37bc, + 0x7e3bc9, + 0x7e408b, + 0x7e4cfe, + 0x7e5414, + 0x7e5861, + 0x7e65c0, + 0x7e69b5, + 0x7e715f, + 0x7e7d2a, + 0x7e87db, + 0x7e8bae, + 0x7e9344, + 0x7e9f31, + 0x7ea290, + 0x7eaee5, + 0x7eb60f, + 0x7eba7a, + 0x7ec138, + 0x7ecd4d, + 0x7ed5a7, + 0x7ed9d2, + 0x7ee473, + 0x7ee806, + 0x7ef0ec, + 0x7efc99, + 0x7f050e, + 0x7f097b, + 0x7f1191, + 0x7f1de4, + 0x7f2045, + 0x7f2c30, + 0x7f34da, + 0x7f38af, + 0x7f43ed, + 0x7f4f98, + 0x7f5772, + 0x7f5b07, + 0x7f66a6, + 0x7f6ad3, + 0x7f7239, + 0x7f7e4c, + 0x7f84bd, + 0x7f88c8, + 0x7f9022, + 0x7f9c57, + 0x7fa1f6, + 0x7fad83, + 0x7fb569, + 0x7fb91c, + 0x7fc25e, + 0x7fce2b, + 0x7fd6c1, + 0x7fdab4, + 0x7fe715, + 0x7feb60, + 0x7ff38a, + 0x7fffff +}; diff --git a/codec2/tags/0.4.1/src/hanning.h b/codec2/tags/0.4.1/src/hanning.h new file mode 100644 index 00000000..81d88dcb --- /dev/null +++ b/codec2/tags/0.4.1/src/hanning.h @@ -0,0 +1,644 @@ +/* Generated by hanning_file() Octave function */ + +const float hanning[]={ + 0, + 2.4171e-05, + 9.66816e-05, + 0.000217525, + 0.000386689, + 0.000604158, + 0.00086991, + 0.00118392, + 0.00154616, + 0.00195659, + 0.00241517, + 0.00292186, + 0.00347661, + 0.00407937, + 0.00473008, + 0.00542867, + 0.00617507, + 0.00696922, + 0.00781104, + 0.00870045, + 0.00963736, + 0.0106217, + 0.0116533, + 0.0127322, + 0.0138581, + 0.0150311, + 0.0162509, + 0.0175175, + 0.0188308, + 0.0201906, + 0.0215968, + 0.0230492, + 0.0245478, + 0.0260923, + 0.0276826, + 0.0293186, + 0.0310001, + 0.032727, + 0.034499, + 0.036316, + 0.0381779, + 0.0400844, + 0.0420354, + 0.0440307, + 0.04607, + 0.0481533, + 0.0502802, + 0.0524506, + 0.0546643, + 0.056921, + 0.0592206, + 0.0615627, + 0.0639473, + 0.0663741, + 0.0688427, + 0.0713531, + 0.0739048, + 0.0764978, + 0.0791318, + 0.0818064, + 0.0845214, + 0.0872767, + 0.0900718, + 0.0929066, + 0.0957807, + 0.0986939, + 0.101646, + 0.104636, + 0.107665, + 0.110732, + 0.113836, + 0.116978, + 0.120156, + 0.123372, + 0.126624, + 0.129912, + 0.133235, + 0.136594, + 0.139989, + 0.143418, + 0.146881, + 0.150379, + 0.153911, + 0.157476, + 0.161074, + 0.164705, + 0.168368, + 0.172063, + 0.17579, + 0.179549, + 0.183338, + 0.187158, + 0.191008, + 0.194888, + 0.198798, + 0.202737, + 0.206704, + 0.2107, + 0.214724, + 0.218775, + 0.222854, + 0.226959, + 0.231091, + 0.235249, + 0.239432, + 0.243641, + 0.247874, + 0.252132, + 0.256414, + 0.260719, + 0.265047, + 0.269398, + 0.273772, + 0.278167, + 0.282584, + 0.287021, + 0.29148, + 0.295958, + 0.300456, + 0.304974, + 0.30951, + 0.314065, + 0.318638, + 0.323228, + 0.327835, + 0.332459, + 0.3371, + 0.341756, + 0.346427, + 0.351113, + 0.355814, + 0.360528, + 0.365256, + 0.369997, + 0.374751, + 0.379516, + 0.384293, + 0.389082, + 0.393881, + 0.398691, + 0.40351, + 0.408338, + 0.413176, + 0.418022, + 0.422876, + 0.427737, + 0.432605, + 0.43748, + 0.44236, + 0.447247, + 0.452138, + 0.457034, + 0.461935, + 0.466839, + 0.471746, + 0.476655, + 0.481568, + 0.486481, + 0.491397, + 0.496313, + 0.501229, + 0.506145, + 0.511061, + 0.515976, + 0.520889, + 0.5258, + 0.530708, + 0.535614, + 0.540516, + 0.545414, + 0.550308, + 0.555197, + 0.560081, + 0.564958, + 0.56983, + 0.574695, + 0.579552, + 0.584402, + 0.589244, + 0.594077, + 0.598901, + 0.603715, + 0.60852, + 0.613314, + 0.618097, + 0.622868, + 0.627628, + 0.632375, + 0.63711, + 0.641831, + 0.646538, + 0.651232, + 0.655911, + 0.660574, + 0.665222, + 0.669855, + 0.67447, + 0.679069, + 0.683651, + 0.688215, + 0.69276, + 0.697287, + 0.701795, + 0.706284, + 0.710752, + 0.7152, + 0.719627, + 0.724033, + 0.728418, + 0.73278, + 0.73712, + 0.741437, + 0.74573, + 0.75, + 0.754246, + 0.758467, + 0.762663, + 0.766833, + 0.770978, + 0.775097, + 0.779189, + 0.783254, + 0.787291, + 0.791301, + 0.795283, + 0.799236, + 0.80316, + 0.807055, + 0.810921, + 0.814756, + 0.81856, + 0.822334, + 0.826077, + 0.829788, + 0.833468, + 0.837115, + 0.840729, + 0.844311, + 0.847859, + 0.851374, + 0.854855, + 0.858301, + 0.861713, + 0.86509, + 0.868431, + 0.871737, + 0.875007, + 0.87824, + 0.881437, + 0.884598, + 0.887721, + 0.890806, + 0.893854, + 0.896864, + 0.899835, + 0.902768, + 0.905661, + 0.908516, + 0.911331, + 0.914106, + 0.916841, + 0.919536, + 0.92219, + 0.924804, + 0.927376, + 0.929907, + 0.932397, + 0.934845, + 0.93725, + 0.939614, + 0.941935, + 0.944213, + 0.946448, + 0.94864, + 0.950789, + 0.952894, + 0.954955, + 0.956972, + 0.958946, + 0.960874, + 0.962759, + 0.964598, + 0.966393, + 0.968142, + 0.969846, + 0.971505, + 0.973118, + 0.974686, + 0.976207, + 0.977683, + 0.979112, + 0.980495, + 0.981832, + 0.983122, + 0.984365, + 0.985561, + 0.986711, + 0.987813, + 0.988868, + 0.989876, + 0.990837, + 0.99175, + 0.992616, + 0.993434, + 0.994204, + 0.994927, + 0.995601, + 0.996228, + 0.996807, + 0.997337, + 0.99782, + 0.998255, + 0.998641, + 0.998979, + 0.999269, + 0.999511, + 0.999704, + 0.999849, + 0.999946, + 0.999994, + 0.999994, + 0.999946, + 0.999849, + 0.999704, + 0.999511, + 0.999269, + 0.998979, + 0.998641, + 0.998255, + 0.99782, + 0.997337, + 0.996807, + 0.996228, + 0.995601, + 0.994927, + 0.994204, + 0.993434, + 0.992616, + 0.99175, + 0.990837, + 0.989876, + 0.988868, + 0.987813, + 0.986711, + 0.985561, + 0.984365, + 0.983122, + 0.981832, + 0.980495, + 0.979112, + 0.977683, + 0.976207, + 0.974686, + 0.973118, + 0.971505, + 0.969846, + 0.968142, + 0.966393, + 0.964598, + 0.962759, + 0.960874, + 0.958946, + 0.956972, + 0.954955, + 0.952894, + 0.950789, + 0.94864, + 0.946448, + 0.944213, + 0.941935, + 0.939614, + 0.93725, + 0.934845, + 0.932397, + 0.929907, + 0.927376, + 0.924804, + 0.92219, + 0.919536, + 0.916841, + 0.914106, + 0.911331, + 0.908516, + 0.905661, + 0.902768, + 0.899835, + 0.896864, + 0.893854, + 0.890806, + 0.887721, + 0.884598, + 0.881437, + 0.87824, + 0.875007, + 0.871737, + 0.868431, + 0.86509, + 0.861713, + 0.858301, + 0.854855, + 0.851374, + 0.847859, + 0.844311, + 0.840729, + 0.837115, + 0.833468, + 0.829788, + 0.826077, + 0.822334, + 0.81856, + 0.814756, + 0.810921, + 0.807055, + 0.80316, + 0.799236, + 0.795283, + 0.791301, + 0.787291, + 0.783254, + 0.779189, + 0.775097, + 0.770978, + 0.766833, + 0.762663, + 0.758467, + 0.754246, + 0.75, + 0.74573, + 0.741437, + 0.73712, + 0.73278, + 0.728418, + 0.724033, + 0.719627, + 0.7152, + 0.710752, + 0.706284, + 0.701795, + 0.697287, + 0.69276, + 0.688215, + 0.683651, + 0.679069, + 0.67447, + 0.669855, + 0.665222, + 0.660574, + 0.655911, + 0.651232, + 0.646538, + 0.641831, + 0.63711, + 0.632375, + 0.627628, + 0.622868, + 0.618097, + 0.613314, + 0.60852, + 0.603715, + 0.598901, + 0.594077, + 0.589244, + 0.584402, + 0.579552, + 0.574695, + 0.56983, + 0.564958, + 0.560081, + 0.555197, + 0.550308, + 0.545414, + 0.540516, + 0.535614, + 0.530708, + 0.5258, + 0.520889, + 0.515976, + 0.511061, + 0.506145, + 0.501229, + 0.496313, + 0.491397, + 0.486481, + 0.481568, + 0.476655, + 0.471746, + 0.466839, + 0.461935, + 0.457034, + 0.452138, + 0.447247, + 0.44236, + 0.43748, + 0.432605, + 0.427737, + 0.422876, + 0.418022, + 0.413176, + 0.408338, + 0.40351, + 0.398691, + 0.393881, + 0.389082, + 0.384293, + 0.379516, + 0.374751, + 0.369997, + 0.365256, + 0.360528, + 0.355814, + 0.351113, + 0.346427, + 0.341756, + 0.3371, + 0.332459, + 0.327835, + 0.323228, + 0.318638, + 0.314065, + 0.30951, + 0.304974, + 0.300456, + 0.295958, + 0.29148, + 0.287021, + 0.282584, + 0.278167, + 0.273772, + 0.269398, + 0.265047, + 0.260719, + 0.256414, + 0.252132, + 0.247874, + 0.243641, + 0.239432, + 0.235249, + 0.231091, + 0.226959, + 0.222854, + 0.218775, + 0.214724, + 0.2107, + 0.206704, + 0.202737, + 0.198798, + 0.194888, + 0.191008, + 0.187158, + 0.183338, + 0.179549, + 0.17579, + 0.172063, + 0.168368, + 0.164705, + 0.161074, + 0.157476, + 0.153911, + 0.150379, + 0.146881, + 0.143418, + 0.139989, + 0.136594, + 0.133235, + 0.129912, + 0.126624, + 0.123372, + 0.120156, + 0.116978, + 0.113836, + 0.110732, + 0.107665, + 0.104636, + 0.101646, + 0.0986939, + 0.0957807, + 0.0929066, + 0.0900718, + 0.0872767, + 0.0845214, + 0.0818064, + 0.0791318, + 0.0764978, + 0.0739048, + 0.0713531, + 0.0688427, + 0.0663741, + 0.0639473, + 0.0615627, + 0.0592206, + 0.056921, + 0.0546643, + 0.0524506, + 0.0502802, + 0.0481533, + 0.04607, + 0.0440307, + 0.0420354, + 0.0400844, + 0.0381779, + 0.036316, + 0.034499, + 0.032727, + 0.0310001, + 0.0293186, + 0.0276826, + 0.0260923, + 0.0245478, + 0.0230492, + 0.0215968, + 0.0201906, + 0.0188308, + 0.0175175, + 0.0162509, + 0.0150311, + 0.0138581, + 0.0127322, + 0.0116533, + 0.0106217, + 0.00963736, + 0.00870045, + 0.00781104, + 0.00696922, + 0.00617507, + 0.00542867, + 0.00473008, + 0.00407937, + 0.00347661, + 0.00292186, + 0.00241517, + 0.00195659, + 0.00154616, + 0.00118392, + 0.00086991, + 0.000604158, + 0.000386689, + 0.000217525, + 9.66816e-05, + 2.4171e-05, + 0 +}; diff --git a/codec2/tags/0.4.1/src/ht_coeff.h b/codec2/tags/0.4.1/src/ht_coeff.h new file mode 100644 index 00000000..98c5c6ea --- /dev/null +++ b/codec2/tags/0.4.1/src/ht_coeff.h @@ -0,0 +1,107 @@ +/* Hilbert Transform FIR filter coeffs */ +/* Generated by make_hilb Octave script */ + +#define HT_N 100 + +COMP ht_coeff[]={ + {0.000000,0.000000}, + {-0.000000,-0.000001}, + {0.000000,0.000000}, + {-0.000000,-0.000017}, + {0.000000,0.000000}, + {0.000000,-0.000079}, + {0.000000,0.000000}, + {0.000000,-0.000217}, + {0.000000,0.000000}, + {0.000000,-0.000461}, + {0.000000,0.000000}, + {-0.000000,-0.000842}, + {0.000000,0.000000}, + {-0.000000,-0.001391}, + {0.000000,0.000000}, + {-0.000000,-0.002140}, + {0.000000,0.000000}, + {-0.000000,-0.003121}, + {0.000000,0.000000}, + {0.000000,-0.004371}, + {0.000000,0.000000}, + {0.000000,-0.005928}, + {0.000000,0.000000}, + {-0.000000,-0.007839}, + {0.000000,0.000000}, + {-0.000000,-0.010159}, + {0.000000,0.000000}, + {-0.000000,-0.012957}, + {0.000000,0.000000}, + {-0.000000,-0.016327}, + {0.000000,0.000000}, + {0.000000,-0.020399}, + {0.000000,0.000000}, + {-0.000000,-0.025364}, + {0.000000,0.000000}, + {0.000000,-0.031512}, + {0.000000,0.000000}, + {0.000000,-0.039319}, + {0.000000,0.000000}, + {0.000000,-0.049610}, + {0.000000,0.000000}, + {-0.000000,-0.063952}, + {0.000000,0.000000}, + {-0.000000,-0.085722}, + {0.000000,0.000000}, + {0.000000,-0.123718}, + {0.000000,0.000000}, + {0.000000,-0.210249}, + {0.000000,0.000000}, + {-0.000000,-0.636250}, + {0.999748,0.000000}, + {0.000000,0.634969}, + {0.000000,0.000000}, + {0.000000,0.208979}, + {0.000000,0.000000}, + {0.000000,0.122467}, + {0.000000,0.000000}, + {-0.000000,0.084502}, + {0.000000,0.000000}, + {0.000000,0.062771}, + {0.000000,0.000000}, + {0.000000,0.048477}, + {0.000000,0.000000}, + {0.000000,0.038242}, + {0.000000,0.000000}, + {-0.000000,0.030497}, + {0.000000,0.000000}, + {0.000000,0.024418}, + {0.000000,0.000000}, + {0.000000,0.019527}, + {0.000000,0.000000}, + {-0.000000,0.015532}, + {0.000000,0.000000}, + {0.000000,0.012242}, + {0.000000,0.000000}, + {-0.000000,0.009524}, + {0.000000,0.000000}, + {-0.000000,0.007285}, + {0.000000,0.000000}, + {-0.000000,0.005454}, + {0.000000,0.000000}, + {-0.000000,0.003973}, + {0.000000,0.000000}, + {0.000000,0.002796}, + {0.000000,0.000000}, + {-0.000000,0.001882}, + {0.000000,0.000000}, + {-0.000000,0.001196}, + {0.000000,0.000000}, + {-0.000000,0.000701}, + {0.000000,0.000000}, + {0.000000,0.000367}, + {0.000000,0.000000}, + {0.000000,0.000160}, + {0.000000,0.000000}, + {0.000000,0.000051}, + {0.000000,0.000000}, + {-0.000000,0.000008}, + {0.000000,0.000000}, + {0.000000,0.000000} +}; \ No newline at end of file diff --git a/codec2/tags/0.4.1/src/insert_errors.c b/codec2/tags/0.4.1/src/insert_errors.c new file mode 100644 index 00000000..cbe83233 --- /dev/null +++ b/codec2/tags/0.4.1/src/insert_errors.c @@ -0,0 +1,120 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: insert_errors.c + AUTHOR......: David Rowe + DATE CREATED: 20/2/2013 + + Inserts errors into a Codec 2 bit stream using error files. The + error files have one 16 bit short per bit, the short is set to 1 if + there is an error, or zero otherwise. The Codec 2 bit stream files + are in packed format, i.e. c2enc/c2dec format. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2013 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 . +*/ + +#include "codec2.h" + +#include +#include +#include +#include +#include + +int main(int argc, char *argv[]) +{ + FILE *fin; + FILE *fout; + FILE *ferror; + int i, start_bit, end_bit, bit; + unsigned char byte; + short error; + int errors, bits; + int bits_per_frame; + + if (argc < 4) { + printf("%s InputBitFile OutputBitFile ErrorFile bitsPerFrame [startBit endBit]\n", argv[0]); + printf("%s InputBitFile OutputBitFile BER\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 bit 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); + } + + if ((ferror = fopen(argv[3],"rb")) == NULL ) { + fprintf(stderr, "Error opening error file: %s: %s.\n", + argv[3], strerror(errno)); + exit(1); + } + + bits_per_frame = atoi(argv[4]); + + start_bit = 0; end_bit = bits_per_frame; + if (argc == 7) { + start_bit = atoi(argv[5]); + end_bit = atoi(argv[6]); + } + + bit = 0; + bits = errors = 0; + + while(fread(&byte, sizeof(char), 1, fin) == 1) { + + for(i=0; i<8; i++, bits++) { + if (bits != bits_per_frame) { + if (fread(&error, sizeof(short), 1, ferror)) { + if ((bit >= start_bit) && (bit <= end_bit)) + byte ^= error << (7-i); + if (error) + errors++; + } + else { + fprintf(stderr,"bits: %d ber: %4.3f\n", bits, (float)errors/bits); + fclose (fin); fclose(fout); fclose(ferror); + exit(0); + } + } + } + + fwrite(&byte, sizeof(char), 1, fout); + if (bits == bits_per_frame) + bits = 0; + if (fout == stdout) fflush(stdout); + if (fin == stdin) fflush(stdin); + + } + + fclose(fin); + fclose(fout); + fclose(ferror); + + fprintf(stderr,"bits: %d ber: %4.3f\n", bits, (float)errors/bits); + + return 0; +} diff --git a/codec2/tags/0.4.1/src/interp.c b/codec2/tags/0.4.1/src/interp.c new file mode 100644 index 00000000..5862bc2e --- /dev/null +++ b/codec2/tags/0.4.1/src/interp.c @@ -0,0 +1,325 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: interp.c + AUTHOR......: David Rowe + DATE CREATED: 9/10/09 + + Interpolation of 20ms frames to 10ms frames. + +\*---------------------------------------------------------------------------*/ + +/* + 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 . +*/ + +#include +#include +#include +#include + +#include "defines.h" +#include "interp.h" +#include "lsp.h" +#include "quantise.h" + +float sample_log_amp(MODEL *model, float w); + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: interp() + AUTHOR......: David Rowe + DATE CREATED: 22/8/10 + + Given two frames decribed by model parameters 20ms apart, determines + the model parameters of the 10ms frame between them. Assumes + voicing is available for middle (interpolated) frame. Outputs are + amplitudes and Wo for the interpolated frame. + + This version can interpolate the amplitudes between two frames of + different Wo and L. + + This version works by log linear interpolation, but listening tests + showed it creates problems in background noise, e.g. hts2a and mmt1. + When this function is used (--dec mode) bg noise appears to be + amplitude modulated, and gets louder. The interp_lsp() function + below seems to do a better job. + +\*---------------------------------------------------------------------------*/ + +void interpolate( + MODEL *interp, /* interpolated model params */ + MODEL *prev, /* previous frames model params */ + MODEL *next /* next frames model params */ +) +{ + int l; + float w,log_amp; + + /* Wo depends on voicing of this and adjacent frames */ + + if (interp->voiced) { + if (prev->voiced && next->voiced) + interp->Wo = (prev->Wo + next->Wo)/2.0; + if (!prev->voiced && next->voiced) + interp->Wo = next->Wo; + if (prev->voiced && !next->voiced) + interp->Wo = prev->Wo; + } + else { + interp->Wo = TWO_PI/P_MAX; + } + interp->L = PI/interp->Wo; + + /* Interpolate amplitudes using linear interpolation in log domain */ + + for(l=1; l<=interp->L; l++) { + w = l*interp->Wo; + log_amp = (sample_log_amp(prev, w) + sample_log_amp(next, w))/2.0; + interp->A[l] = powf(10.0, log_amp); + } +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: sample_log_amp() + AUTHOR......: David Rowe + DATE CREATED: 22/8/10 + + Samples the amplitude envelope at an arbitrary frequency w. Uses + linear interpolation in the log domain to sample between harmonic + amplitudes. + +\*---------------------------------------------------------------------------*/ + +float sample_log_amp(MODEL *model, float w) +{ + int m; + float f, log_amp; + + assert(w > 0.0); assert (w <= PI); + + m = floorf(w/model->Wo + 0.5); + f = (w - m*model->Wo)/w; + assert(f <= 1.0); + + if (m < 1) { + log_amp = f*log10f(model->A[1] + 1E-6); + } + else if ((m+1) > model->L) { + log_amp = (1.0-f)*log10f(model->A[model->L] + 1E-6); + } + else { + log_amp = (1.0-f)*log10f(model->A[m] + 1E-6) + + f*log10f(model->A[m+1] + 1E-6); + } + + return log_amp; +} + +#ifdef NOT_NEEDED + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: interp_lsp() + AUTHOR......: David Rowe + DATE CREATED: 10 Nov 2010 + + Given two frames decribed by model parameters 20ms apart, determines + the model parameters of the 10ms frame between them. Assumes + voicing is available for middle (interpolated) frame. Outputs are + amplitudes and Wo for the interpolated frame. + + This version uses interpolation of LSPs, seems to do a better job + with bg noise. + +\*---------------------------------------------------------------------------*/ + +void interpolate_lsp( + kiss_fft_cfg fft_fwd_cfg, + MODEL *interp, /* interpolated model params */ + MODEL *prev, /* previous frames model params */ + MODEL *next, /* next frames model params */ + float *prev_lsps, /* previous frames LSPs */ + float prev_e, /* previous frames LPC energy */ + float *next_lsps, /* next frames LSPs */ + float next_e, /* next frames LPC energy */ + float *ak_interp, /* interpolated aks for this frame */ + float *lsps_interp/* interpolated lsps for this frame */ +) +{ + int i; + float e; + float snr; + + /* trap corner case where V est is probably wrong */ + + if (interp->voiced && !prev->voiced && !next->voiced) { + interp->voiced = 0; + } + + /* Wo depends on voicing of this and adjacent frames */ + + if (interp->voiced) { + if (prev->voiced && next->voiced) + interp->Wo = (prev->Wo + next->Wo)/2.0; + if (!prev->voiced && next->voiced) + interp->Wo = next->Wo; + if (prev->voiced && !next->voiced) + interp->Wo = prev->Wo; + } + else { + interp->Wo = TWO_PI/P_MAX; + } + interp->L = PI/interp->Wo; + + //printf(" interp: prev_v: %d next_v: %d prev_Wo: %f next_Wo: %f\n", + // prev->voiced, next->voiced, prev->Wo, next->Wo); + //printf(" interp: Wo: %1.5f L: %d\n", interp->Wo, interp->L); + + /* interpolate LSPs */ + + for(i=0; iA[1]); +} +#endif + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: interp_Wo() + AUTHOR......: David Rowe + DATE CREATED: 22 May 2012 + + Interpolates centre 10ms sample of Wo and L samples given two + samples 20ms apart. Assumes voicing is available for centre + (interpolated) frame. + +\*---------------------------------------------------------------------------*/ + +void interp_Wo( + MODEL *interp, /* interpolated model params */ + MODEL *prev, /* previous frames model params */ + MODEL *next /* next frames model params */ + ) +{ + interp_Wo2(interp, prev, next, 0.5); +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: interp_Wo2() + AUTHOR......: David Rowe + DATE CREATED: 22 May 2012 + + Weighted interpolation of two Wo samples. + +\*---------------------------------------------------------------------------*/ + +void interp_Wo2( + MODEL *interp, /* interpolated model params */ + MODEL *prev, /* previous frames model params */ + MODEL *next, /* next frames model params */ + float weight +) +{ + /* trap corner case where voicing est is probably wrong */ + + if (interp->voiced && !prev->voiced && !next->voiced) { + interp->voiced = 0; + } + + /* Wo depends on voicing of this and adjacent frames */ + + if (interp->voiced) { + if (prev->voiced && next->voiced) + interp->Wo = (1.0 - weight)*prev->Wo + weight*next->Wo; + if (!prev->voiced && next->voiced) + interp->Wo = next->Wo; + if (prev->voiced && !next->voiced) + interp->Wo = prev->Wo; + } + else { + interp->Wo = TWO_PI/P_MAX; + } + interp->L = PI/interp->Wo; +} + + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: interp_energy() + AUTHOR......: David Rowe + DATE CREATED: 22 May 2012 + + Interpolates centre 10ms sample of energy given two samples 20ms + apart. + +\*---------------------------------------------------------------------------*/ + +float interp_energy(float prev_e, float next_e) +{ + return powf(10.0, (log10f(prev_e) + log10f(next_e))/2.0); + +} + + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: interp_energy2() + AUTHOR......: David Rowe + DATE CREATED: 22 May 2012 + + Interpolates centre 10ms sample of energy given two samples 20ms + apart. + +\*---------------------------------------------------------------------------*/ + +float interp_energy2(float prev_e, float next_e, float weight) +{ + return powf(10.0, (1.0 - weight)*log10f(prev_e) + weight*log10f(next_e)); + +} + + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: interpolate_lsp_ver2() + AUTHOR......: David Rowe + DATE CREATED: 22 May 2012 + + Weighted interpolation of LSPs. + +\*---------------------------------------------------------------------------*/ + +void interpolate_lsp_ver2(float interp[], float prev[], float next[], float weight, int order) +{ + int i; + + for(i=0; i. +*/ + +#ifndef __INTERP__ +#define __INTERP__ + +#include "kiss_fft.h" + +void interpolate(MODEL *interp, MODEL *prev, MODEL *next); +void interpolate_lsp(kiss_fft_cfg fft_dec_cfg, + MODEL *interp, MODEL *prev, MODEL *next, + float *prev_lsps, float prev_e, + float *next_lsps, float next_e, + float *ak_interp, float *lsps_interp); +void interp_Wo(MODEL *interp, MODEL *prev, MODEL *next); +void interp_Wo2(MODEL *interp, MODEL *prev, MODEL *next, float weight); +float interp_energy(float prev, float next); +float interp_energy2(float prev, float next, float weight); +void interpolate_lsp_ver2(float interp[], float prev[], float next[], float weight, int order); + +#endif diff --git a/codec2/tags/0.4.1/src/kiss_fft.c b/codec2/tags/0.4.1/src/kiss_fft.c new file mode 100644 index 00000000..3d1d4831 --- /dev/null +++ b/codec2/tags/0.4.1/src/kiss_fft.c @@ -0,0 +1,408 @@ +/* +Copyright (c) 2003-2010, Mark Borgerding + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + * Neither the author nor the names of any contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include "_kiss_fft_guts.h" +/* The guts header contains all the multiplication and addition macros that are defined for + fixed or floating point complex numbers. It also delares the kf_ internal functions. + */ + +static void kf_bfly2( + kiss_fft_cpx * Fout, + const size_t fstride, + const kiss_fft_cfg st, + int m + ) +{ + kiss_fft_cpx * Fout2; + kiss_fft_cpx * tw1 = st->twiddles; + kiss_fft_cpx t; + Fout2 = Fout + m; + do{ + C_FIXDIV(*Fout,2); C_FIXDIV(*Fout2,2); + + C_MUL (t, *Fout2 , *tw1); + tw1 += fstride; + C_SUB( *Fout2 , *Fout , t ); + C_ADDTO( *Fout , t ); + ++Fout2; + ++Fout; + }while (--m); +} + +static void kf_bfly4( + kiss_fft_cpx * Fout, + const size_t fstride, + const kiss_fft_cfg st, + const size_t m + ) +{ + kiss_fft_cpx *tw1,*tw2,*tw3; + kiss_fft_cpx scratch[6]; + size_t k=m; + const size_t m2=2*m; + const size_t m3=3*m; + + + tw3 = tw2 = tw1 = st->twiddles; + + do { + C_FIXDIV(*Fout,4); C_FIXDIV(Fout[m],4); C_FIXDIV(Fout[m2],4); C_FIXDIV(Fout[m3],4); + + C_MUL(scratch[0],Fout[m] , *tw1 ); + C_MUL(scratch[1],Fout[m2] , *tw2 ); + C_MUL(scratch[2],Fout[m3] , *tw3 ); + + C_SUB( scratch[5] , *Fout, scratch[1] ); + C_ADDTO(*Fout, scratch[1]); + C_ADD( scratch[3] , scratch[0] , scratch[2] ); + C_SUB( scratch[4] , scratch[0] , scratch[2] ); + C_SUB( Fout[m2], *Fout, scratch[3] ); + tw1 += fstride; + tw2 += fstride*2; + tw3 += fstride*3; + C_ADDTO( *Fout , scratch[3] ); + + if(st->inverse) { + Fout[m].r = scratch[5].r - scratch[4].i; + Fout[m].i = scratch[5].i + scratch[4].r; + Fout[m3].r = scratch[5].r + scratch[4].i; + Fout[m3].i = scratch[5].i - scratch[4].r; + }else{ + Fout[m].r = scratch[5].r + scratch[4].i; + Fout[m].i = scratch[5].i - scratch[4].r; + Fout[m3].r = scratch[5].r - scratch[4].i; + Fout[m3].i = scratch[5].i + scratch[4].r; + } + ++Fout; + }while(--k); +} + +static void kf_bfly3( + kiss_fft_cpx * Fout, + const size_t fstride, + const kiss_fft_cfg st, + size_t m + ) +{ + size_t k=m; + const size_t m2 = 2*m; + kiss_fft_cpx *tw1,*tw2; + kiss_fft_cpx scratch[5]; + kiss_fft_cpx epi3; + epi3 = st->twiddles[fstride*m]; + + tw1=tw2=st->twiddles; + + do{ + C_FIXDIV(*Fout,3); C_FIXDIV(Fout[m],3); C_FIXDIV(Fout[m2],3); + + C_MUL(scratch[1],Fout[m] , *tw1); + C_MUL(scratch[2],Fout[m2] , *tw2); + + C_ADD(scratch[3],scratch[1],scratch[2]); + C_SUB(scratch[0],scratch[1],scratch[2]); + tw1 += fstride; + tw2 += fstride*2; + + Fout[m].r = Fout->r - HALF_OF(scratch[3].r); + Fout[m].i = Fout->i - HALF_OF(scratch[3].i); + + C_MULBYSCALAR( scratch[0] , epi3.i ); + + C_ADDTO(*Fout,scratch[3]); + + Fout[m2].r = Fout[m].r + scratch[0].i; + Fout[m2].i = Fout[m].i - scratch[0].r; + + Fout[m].r -= scratch[0].i; + Fout[m].i += scratch[0].r; + + ++Fout; + }while(--k); +} + +static void kf_bfly5( + kiss_fft_cpx * Fout, + const size_t fstride, + const kiss_fft_cfg st, + int m + ) +{ + kiss_fft_cpx *Fout0,*Fout1,*Fout2,*Fout3,*Fout4; + int u; + kiss_fft_cpx scratch[13]; + kiss_fft_cpx * twiddles = st->twiddles; + kiss_fft_cpx *tw; + kiss_fft_cpx ya,yb; + ya = twiddles[fstride*m]; + yb = twiddles[fstride*2*m]; + + Fout0=Fout; + Fout1=Fout0+m; + Fout2=Fout0+2*m; + Fout3=Fout0+3*m; + Fout4=Fout0+4*m; + + tw=st->twiddles; + for ( u=0; ur += scratch[7].r + scratch[8].r; + Fout0->i += scratch[7].i + scratch[8].i; + + scratch[5].r = scratch[0].r + S_MUL(scratch[7].r,ya.r) + S_MUL(scratch[8].r,yb.r); + scratch[5].i = scratch[0].i + S_MUL(scratch[7].i,ya.r) + S_MUL(scratch[8].i,yb.r); + + scratch[6].r = S_MUL(scratch[10].i,ya.i) + S_MUL(scratch[9].i,yb.i); + scratch[6].i = -S_MUL(scratch[10].r,ya.i) - S_MUL(scratch[9].r,yb.i); + + C_SUB(*Fout1,scratch[5],scratch[6]); + C_ADD(*Fout4,scratch[5],scratch[6]); + + scratch[11].r = scratch[0].r + S_MUL(scratch[7].r,yb.r) + S_MUL(scratch[8].r,ya.r); + scratch[11].i = scratch[0].i + S_MUL(scratch[7].i,yb.r) + S_MUL(scratch[8].i,ya.r); + scratch[12].r = - S_MUL(scratch[10].i,yb.i) + S_MUL(scratch[9].i,ya.i); + scratch[12].i = S_MUL(scratch[10].r,yb.i) - S_MUL(scratch[9].r,ya.i); + + C_ADD(*Fout2,scratch[11],scratch[12]); + C_SUB(*Fout3,scratch[11],scratch[12]); + + ++Fout0;++Fout1;++Fout2;++Fout3;++Fout4; + } +} + +/* perform the butterfly for one stage of a mixed radix FFT */ +static void kf_bfly_generic( + kiss_fft_cpx * Fout, + const size_t fstride, + const kiss_fft_cfg st, + int m, + int p + ) +{ + int u,k,q1,q; + kiss_fft_cpx * twiddles = st->twiddles; + kiss_fft_cpx t; + int Norig = st->nfft; + + kiss_fft_cpx * scratch = (kiss_fft_cpx*)KISS_FFT_TMP_ALLOC(sizeof(kiss_fft_cpx)*p); + + for ( u=0; u=Norig) twidx-=Norig; + C_MUL(t,scratch[q] , twiddles[twidx] ); + C_ADDTO( Fout[ k ] ,t); + } + k += m; + } + } + KISS_FFT_TMP_FREE(scratch); +} + +static +void kf_work( + kiss_fft_cpx * Fout, + const kiss_fft_cpx * f, + const size_t fstride, + int in_stride, + int * factors, + const kiss_fft_cfg st + ) +{ + kiss_fft_cpx * Fout_beg=Fout; + const int p=*factors++; /* the radix */ + const int m=*factors++; /* stage's fft length/p */ + const kiss_fft_cpx * Fout_end = Fout + p*m; + +#ifdef _OPENMP + // use openmp extensions at the + // top-level (not recursive) + if (fstride==1 && p<=5) + { + int k; + + // execute the p different work units in different threads +# pragma omp parallel for + for (k=0;k floor_sqrt) + p = n; /* no more factors, skip to end */ + } + n /= p; + *facbuf++ = p; + *facbuf++ = n; + } while (n > 1); +} + +/* + * + * User-callable function to allocate all necessary storage space for the fft. + * + * The return value is a contiguous block of memory, allocated with malloc. As such, + * It can be freed with free(), rather than a kiss_fft-specific function. + * */ +kiss_fft_cfg kiss_fft_alloc(int nfft,int inverse_fft,void * mem,size_t * lenmem ) +{ + kiss_fft_cfg st=NULL; + size_t memneeded = sizeof(struct kiss_fft_state) + + sizeof(kiss_fft_cpx)*(nfft-1); /* twiddle factors*/ + + if ( lenmem==NULL ) { + st = ( kiss_fft_cfg)KISS_FFT_MALLOC( memneeded ); + }else{ + if (mem != NULL && *lenmem >= memneeded) + st = (kiss_fft_cfg)mem; + *lenmem = memneeded; + } + if (st) { + int i; + st->nfft=nfft; + st->inverse = inverse_fft; + + for (i=0;iinverse) + phase *= -1; + kf_cexp(st->twiddles+i, phase ); + } + + kf_factor(nfft,st->factors); + } + return st; +} + + +void kiss_fft_stride(kiss_fft_cfg st,const kiss_fft_cpx *fin,kiss_fft_cpx *fout,int in_stride) +{ + if (fin == fout) { + //NOTE: this is not really an in-place FFT algorithm. + //It just performs an out-of-place FFT into a temp buffer + kiss_fft_cpx * tmpbuf = (kiss_fft_cpx*)KISS_FFT_TMP_ALLOC( sizeof(kiss_fft_cpx)*st->nfft); + kf_work(tmpbuf,fin,1,in_stride, st->factors,st); + memcpy(fout,tmpbuf,sizeof(kiss_fft_cpx)*st->nfft); + KISS_FFT_TMP_FREE(tmpbuf); + }else{ + kf_work( fout, fin, 1,in_stride, st->factors,st ); + } +} + +void kiss_fft(kiss_fft_cfg cfg,const kiss_fft_cpx *fin,kiss_fft_cpx *fout) +{ + kiss_fft_stride(cfg,fin,fout,1); +} + + +void kiss_fft_cleanup(void) +{ + // nothing needed any more +} + +int kiss_fft_next_fast_size(int n) +{ + while(1) { + int m=n; + while ( (m%2) == 0 ) m/=2; + while ( (m%3) == 0 ) m/=3; + while ( (m%5) == 0 ) m/=5; + if (m<=1) + break; /* n is completely factorable by twos, threes, and fives */ + n++; + } + return n; +} diff --git a/codec2/tags/0.4.1/src/kiss_fft.h b/codec2/tags/0.4.1/src/kiss_fft.h new file mode 100644 index 00000000..64c50f4a --- /dev/null +++ b/codec2/tags/0.4.1/src/kiss_fft.h @@ -0,0 +1,124 @@ +#ifndef KISS_FFT_H +#define KISS_FFT_H + +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* + ATTENTION! + If you would like a : + -- a utility that will handle the caching of fft objects + -- real-only (no imaginary time component ) FFT + -- a multi-dimensional FFT + -- a command-line utility to perform ffts + -- a command-line utility to perform fast-convolution filtering + + Then see kfc.h kiss_fftr.h kiss_fftnd.h fftutil.c kiss_fastfir.c + in the tools/ directory. +*/ + +#ifdef USE_SIMD +# include +# define kiss_fft_scalar __m128 +#define KISS_FFT_MALLOC(nbytes) _mm_malloc(nbytes,16) +#define KISS_FFT_FREE _mm_free +#else +#define KISS_FFT_MALLOC malloc +#define KISS_FFT_FREE free +#endif + + +#ifdef FIXED_POINT +#include +# if (FIXED_POINT == 32) +# define kiss_fft_scalar int32_t +# else +# define kiss_fft_scalar int16_t +# endif +#else +# ifndef kiss_fft_scalar +/* default is float */ +# define kiss_fft_scalar float +# endif +#endif + +typedef struct { + kiss_fft_scalar r; + kiss_fft_scalar i; +}kiss_fft_cpx; + +typedef struct kiss_fft_state* kiss_fft_cfg; + +/* + * kiss_fft_alloc + * + * Initialize a FFT (or IFFT) algorithm's cfg/state buffer. + * + * typical usage: kiss_fft_cfg mycfg=kiss_fft_alloc(1024,0,NULL,NULL); + * + * The return value from fft_alloc is a cfg buffer used internally + * by the fft routine or NULL. + * + * If lenmem is NULL, then kiss_fft_alloc will allocate a cfg buffer using malloc. + * The returned value should be free()d when done to avoid memory leaks. + * + * The state can be placed in a user supplied buffer 'mem': + * If lenmem is not NULL and mem is not NULL and *lenmem is large enough, + * then the function places the cfg in mem and the size used in *lenmem + * and returns mem. + * + * If lenmem is not NULL and ( mem is NULL or *lenmem is not large enough), + * then the function returns NULL and places the minimum cfg + * buffer size in *lenmem. + * */ + +kiss_fft_cfg kiss_fft_alloc(int nfft,int inverse_fft,void * mem,size_t * lenmem); + +/* + * kiss_fft(cfg,in_out_buf) + * + * Perform an FFT on a complex input buffer. + * for a forward FFT, + * fin should be f[0] , f[1] , ... ,f[nfft-1] + * fout will be F[0] , F[1] , ... ,F[nfft-1] + * Note that each element is complex and can be accessed like + f[k].r and f[k].i + * */ +void kiss_fft(kiss_fft_cfg cfg,const kiss_fft_cpx *fin,kiss_fft_cpx *fout); + +/* + A more generic version of the above function. It reads its input from every Nth sample. + * */ +void kiss_fft_stride(kiss_fft_cfg cfg,const kiss_fft_cpx *fin,kiss_fft_cpx *fout,int fin_stride); + +/* If kiss_fft_alloc allocated a buffer, it is one contiguous + buffer and can be simply free()d when no longer needed*/ +#define kiss_fft_free free + +/* + Cleans up some memory that gets managed internally. Not necessary to call, but it might clean up + your compiler output to call this before you exit. +*/ +void kiss_fft_cleanup(void); + + +/* + * Returns the smallest integer k, such that k>=n and k has only "fast" factors (2,3,5) + */ +int kiss_fft_next_fast_size(int n); + +/* for real ffts, we need an even size */ +#define kiss_fftr_next_fast_size_real(n) \ + (kiss_fft_next_fast_size( ((n)+1)>>1)<<1) + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/codec2/tags/0.4.1/src/linreg.c b/codec2/tags/0.4.1/src/linreg.c new file mode 100644 index 00000000..e91a69c8 --- /dev/null +++ b/codec2/tags/0.4.1/src/linreg.c @@ -0,0 +1,106 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: linreg.c + AUTHOR......: David Rowe + DATE CREATED: April 2015 + + Linear regression C module based on: + + http://stackoverflow.com/questions/5083465/fast-efficient-least-squares-fit-algorithm-in-c + + Use: + + $ gcc linreg.c -o linreg -D__UNITTEST__ -Wall + $ ./linreg + + Then compare yfit results with octave/tlinreg.m + +\*---------------------------------------------------------------------------*/ + +/* + 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 . +*/ + +#include +#include +#include + +#include "linreg.h" +#include "comp_prim.h" + + +void linreg(COMP *m, COMP *b, float x[], COMP y[], int n) +{ + float sumx = 0.0; /* sum of x */ + float sumx2 = 0.0; /* sum of x^2 */ + COMP sumxy = {0.0,0.0}; /* sum of x * y */ + COMP sumy = {0.0,0.0}; /* sum of y */ + COMP sumy2 = {0.0,0.0}; /* sum of y**2 */ + float denom; + COMP zero; + int i; + + for (i=0; i. +*/ + +#ifndef __LINREG__ +#define __LINREG__ + +#include "comp.h" + +void linreg(COMP *m, COMP *b, float x[], COMP y[], int n); + +#endif diff --git a/codec2/tags/0.4.1/src/listensim.sh b/codec2/tags/0.4.1/src/listensim.sh new file mode 100755 index 00000000..b296cac5 --- /dev/null +++ b/codec2/tags/0.4.1/src/listensim.sh @@ -0,0 +1,9 @@ +#!/bin/sh +# listensim.sh +# David Rowe 10 Sep 2009 +# +# Listen to files processed with sim.sh + +../script/menu.sh $1_uq.raw $1_lpc10.raw $1_lpcpf.raw $1_phase0.raw $1_phase0_lpcpf.raw $2 $3 $4 $5 + + diff --git a/codec2/tags/0.4.1/src/lpc.c b/codec2/tags/0.4.1/src/lpc.c new file mode 100644 index 00000000..bfe33050 --- /dev/null +++ b/codec2/tags/0.4.1/src/lpc.c @@ -0,0 +1,306 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: lpc.c + AUTHOR......: David Rowe + DATE CREATED: 30 Sep 1990 (!) + + Linear Prediction functions written in C. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2009-2012 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 . +*/ + +#define LPC_MAX_N 512 /* maximum no. of samples in frame */ +#define PI 3.141592654 /* mathematical constant */ + +#define ALPHA 1.0 +#define BETA 0.94 + +#include +#include +#include "defines.h" +#include "lpc.h" + +/*---------------------------------------------------------------------------*\ + + pre_emp() + + Pre-emphasise (high pass filter with zero close to 0 Hz) a frame of + speech samples. Helps reduce dynamic range of LPC spectrum, giving + greater weight and hense a better match to low energy formants. + + Should be balanced by de-emphasis of the output speech. + +\*---------------------------------------------------------------------------*/ + +void pre_emp( + float Sn_pre[], /* output frame of speech samples */ + float Sn[], /* input frame of speech samples */ + float *mem, /* Sn[-1]single sample memory */ + int Nsam /* number of speech samples to use */ +) +{ + int i; + + for(i=0; i 1.0) + k = 0.0; + + a[i][i] = k; + + for(j=1; j<=i-1; j++) + a[i][j] = a[i-1][j] + k*a[i-1][i-j]; /* Equation 38c, Makhoul */ + + e *= (1-k*k); /* Equation 38d, Makhoul */ + } + + for(i=1; i<=order; i++) + lpcs[i] = a[order][i]; + lpcs[0] = 1.0; +} + +/*---------------------------------------------------------------------------*\ + + inverse_filter() + + Inverse Filter, A(z). Produces an array of residual samples from an array + of input samples and linear prediction coefficients. + + The filter memory is stored in the first order samples of the input array. + +\*---------------------------------------------------------------------------*/ + +void inverse_filter( + float Sn[], /* Nsam input samples */ + float a[], /* LPCs for this frame of samples */ + int Nsam, /* number of samples */ + float res[], /* Nsam residual samples */ + int order /* order of LPC */ +) +{ + int i,j; /* loop variables */ + + for(i=0; i. +*/ + +#ifndef __LPC__ +#define __LPC__ + +#define LPC_MAX_ORDER 20 + +void pre_emp(float Sn_pre[], float Sn[], float *mem, int Nsam); +void de_emp(float Sn_se[], float Sn[], float *mem, int Nsam); +void hanning_window(float Sn[], float Wn[], int Nsam); +void autocorrelate(float Sn[], float Rn[], int Nsam, int order); +void levinson_durbin(float R[], float lpcs[], int order); +void inverse_filter(float Sn[], float a[], int Nsam, float res[], int order); +void synthesis_filter(float res[], float a[], int Nsam, int order, float Sn_[]); +void find_aks(float Sn[], float a[], int Nsam, int order, float *E); +void weight(float ak[], float gamma, int order, float akw[]); + +#endif diff --git a/codec2/tags/0.4.1/src/lsp.c b/codec2/tags/0.4.1/src/lsp.c new file mode 100644 index 00000000..192fbbdb --- /dev/null +++ b/codec2/tags/0.4.1/src/lsp.c @@ -0,0 +1,321 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: lsp.c + AUTHOR......: David Rowe + DATE CREATED: 24/2/93 + + + This file contains functions for LPC to LSP conversion and LSP to + LPC conversion. Note that the LSP coefficients are not in radians + format but in the x domain of the unit circle. + +\*---------------------------------------------------------------------------*/ + +/* + 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 . +*/ + +#include "defines.h" +#include "lsp.h" +#include +#include +#include + +/*---------------------------------------------------------------------------*\ + + Introduction to Line Spectrum Pairs (LSPs) + ------------------------------------------ + + LSPs are used to encode the LPC filter coefficients {ak} for + transmission over the channel. LSPs have several properties (like + less sensitivity to quantisation noise) that make them superior to + direct quantisation of {ak}. + + A(z) is a polynomial of order lpcrdr with {ak} as the coefficients. + + A(z) is transformed to P(z) and Q(z) (using a substitution and some + algebra), to obtain something like: + + A(z) = 0.5[P(z)(z+z^-1) + Q(z)(z-z^-1)] (1) + + As you can imagine A(z) has complex zeros all over the z-plane. P(z) + and Q(z) have the very neat property of only having zeros _on_ the + unit circle. So to find them we take a test point z=exp(jw) and + evaluate P (exp(jw)) and Q(exp(jw)) using a grid of points between 0 + and pi. + + The zeros (roots) of P(z) also happen to alternate, which is why we + swap coefficients as we find roots. So the process of finding the + LSP frequencies is basically finding the roots of 5th order + polynomials. + + The root so P(z) and Q(z) occur in symmetrical pairs at +/-w, hence + the name Line Spectrum Pairs (LSPs). + + To convert back to ak we just evaluate (1), "clocking" an impulse + thru it lpcrdr times gives us the impulse response of A(z) which is + {ak}. + +\*---------------------------------------------------------------------------*/ + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: cheb_poly_eva() + AUTHOR......: David Rowe + DATE CREATED: 24/2/93 + + This function evalutes a series of chebyshev polynomials + + FIXME: performing memory allocation at run time is very inefficient, + replace with stack variables of MAX_P size. + +\*---------------------------------------------------------------------------*/ + + +static float +cheb_poly_eva(float *coef,float x,int order) +/* float coef[] coefficients of the polynomial to be evaluated */ +/* float x the point where polynomial is to be evaluated */ +/* int order order of the polynomial */ +{ + int i; + float *t,*u,*v,sum; + float T[(order / 2) + 1]; + + /* Initialise pointers */ + + t = T; /* T[i-2] */ + *t++ = 1.0; + u = t--; /* T[i-1] */ + *u++ = x; + v = u--; /* T[i] */ + + /* Evaluate chebyshev series formulation using iterative approach */ + + for(i=2;i<=order/2;i++) + *v++ = (2*x)*(*u++) - *t++; /* T[i] = 2*x*T[i-1] - T[i-2] */ + + sum=0.0; /* initialise sum to zero */ + t = T; /* reset pointer */ + + /* Evaluate polynomial and return value also free memory space */ + + for(i=0;i<=order/2;i++) + sum+=coef[(order/2)-i]**t++; + + return sum; +} + + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: lpc_to_lsp() + AUTHOR......: David Rowe + DATE CREATED: 24/2/93 + + This function converts LPC coefficients to LSP coefficients. + +\*---------------------------------------------------------------------------*/ + +int lpc_to_lsp (float *a, int order, float *freq, int nb, float delta) +/* float *a lpc coefficients */ +/* int order order of LPC coefficients (10) */ +/* float *freq LSP frequencies in radians */ +/* int nb number of sub-intervals (4) */ +/* float delta grid spacing interval (0.02) */ +{ + float psuml,psumr,psumm,temp_xr,xl,xr,xm = 0; + float temp_psumr; + int i,j,m,flag,k; + float *px; /* ptrs of respective P'(z) & Q'(z) */ + float *qx; + float *p; + float *q; + float *pt; /* ptr used for cheb_poly_eval() + whether P' or Q' */ + int roots=0; /* number of roots found */ + float Q[order + 1]; + float P[order + 1]; + + flag = 1; + m = order/2; /* order of P'(z) & Q'(z) polynimials */ + + /* Allocate memory space for polynomials */ + + /* determine P'(z)'s and Q'(z)'s coefficients where + P'(z) = P(z)/(1 + z^(-1)) and Q'(z) = Q(z)/(1-z^(-1)) */ + + px = P; /* initilaise ptrs */ + qx = Q; + p = px; + q = qx; + *px++ = 1.0; + *qx++ = 1.0; + for(i=1;i<=m;i++){ + *px++ = a[i]+a[order+1-i]-*p++; + *qx++ = a[i]-a[order+1-i]+*q++; + } + px = P; + qx = Q; + for(i=0;i= -1.0)){ + xr = xl - delta ; /* interval spacing */ + psumr = cheb_poly_eva(pt,xr,order);/* poly(xl-delta_x) */ + temp_psumr = psumr; + temp_xr = xr; + + /* if no sign change increment xr and re-evaluate + poly(xr). Repeat til sign change. if a sign change has + occurred the interval is bisected and then checked again + for a sign change which determines in which interval the + zero lies in. If there is no sign change between poly(xm) + and poly(xl) set interval between xm and xr else set + interval between xl and xr and repeat till root is located + within the specified limits */ + + if(((psumr*psuml)<0.0) || (psumr == 0.0)){ + roots++; + + psumm=psuml; + for(k=0;k<=nb;k++){ + xm = (xl+xr)/2; /* bisect the interval */ + psumm=cheb_poly_eva(pt,xm,order); + if(psumm*psuml>0.){ + psuml=psumm; + xl=xm; + } + else{ + psumr=psumm; + xr=xm; + } + } + + /* once zero is found, reset initial interval to xr */ + freq[j] = (xm); + xl = xm; + flag = 0; /* reset flag for next search */ + } + else{ + psuml=temp_psumr; + xl=temp_xr; + } + } + } + + /* convert from x domain to radians */ + + for(i=0; i. +*/ + +#ifndef __LSP__ +#define __LSP__ + +int lpc_to_lsp (float *a, int lpcrdr, float *freq, int nb, float delta); +void lsp_to_lpc(float *freq, float *ak, int lpcrdr); + +#endif diff --git a/codec2/tags/0.4.1/src/machdep.h b/codec2/tags/0.4.1/src/machdep.h new file mode 100644 index 00000000..4dff9ba5 --- /dev/null +++ b/codec2/tags/0.4.1/src/machdep.h @@ -0,0 +1,52 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: machdep.h + AUTHOR......: David Rowe + DATE CREATED: May 2 2013 + + Machine dependant functions, e.g. profiling that requires access to a clock + counter register. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2013 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 . +*/ + +#ifndef __MACHDEP__ +#define __MACHDEP__ + +#ifdef PROFILE +#define PROFILE_VAR(...) unsigned int __VA_ARGS__ +#define PROFILE_SAMPLE(timestamp) timestamp = machdep_profile_sample() +#define PROFILE_SAMPLE_AND_LOG(timestamp, prev_timestamp, label) \ + timestamp = machdep_profile_sample_and_log(prev_timestamp, label) +#define PROFILE_SAMPLE_AND_LOG2(prev_timestamp, label) \ + machdep_profile_sample_and_log(prev_timestamp, label) +#else +#define PROFILE_VAR(...) +#define PROFILE_SAMPLE(timestamp) +#define PROFILE_SAMPLE_AND_LOG(timestamp, prev_timestamp, label) +#define PROFILE_SAMPLE_AND_LOG2(prev_timestamp, label) +#endif + +void machdep_profile_init(void); +void machdep_profile_reset(void); +unsigned int machdep_profile_sample(void); +unsigned int machdep_profile_sample_and_log(unsigned int start, char s[]); +void machdep_profile_print_logged_samples(void); + +#endif diff --git a/codec2/tags/0.4.1/src/modem_stats.c b/codec2/tags/0.4.1/src/modem_stats.c new file mode 100644 index 00000000..d13b1a02 --- /dev/null +++ b/codec2/tags/0.4.1/src/modem_stats.c @@ -0,0 +1,111 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: modem_stats.c + AUTHOR......: David Rowe + DATE CREATED: June 2015 + + Common functions for returning demod stats from fdmdv and cohpsk modems. + +\*---------------------------------------------------------------------------*/ + +/* + 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 . +*/ + +#include +#include +#include "modem_stats.h" +#include "codec2_fdmdv.h" + +void modem_stats_open(struct MODEM_STATS *f) +{ + int i; + + for(i=0; i<2*MODEM_STATS_NSPEC; i++) + f->fft_buf[i] = 0.0; + f->fft_cfg = kiss_fft_alloc (2*MODEM_STATS_NSPEC, 0, NULL, NULL); + assert(f->fft_cfg != NULL); +} + +void modem_stats_close(struct MODEM_STATS *f) +{ + KISS_FFT_FREE(f->fft_cfg); +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: modem_stats_get_rx_spectrum() + AUTHOR......: David Rowe + DATE CREATED: 9 June 2012 + + Returns the MODEM_STATS_NSPEC point magnitude spectrum of the rx signal in + dB. The spectral samples are scaled so that 0dB is the peak, a good + range for plotting is 0 to -40dB. + + Note only the real part of the complex input signal is used at + present. A complex variable is used for input for compatability + with the other rx signal procesing. + + Successive calls can be used to build up a waterfall or spectrogram + plot, by mapping the received levels to colours. + + The time-frequency resolution of the spectrum can be adjusted by varying + MODEM_STATS_NSPEC. Note that a 2* MODEM_STATS_NSPEC size FFT is reqd to get + MODEM_STATS_NSPEC output points. MODEM_STATS_NSPEC must be a power of 2. + + See octave/tget_spec.m for a demo real time spectral display using + Octave. This demo averages the output over time to get a smoother + display: + + av = 0.9*av + 0.1*mag_dB + +\*---------------------------------------------------------------------------*/ + +void modem_stats_get_rx_spectrum(struct MODEM_STATS *f, float mag_spec_dB[], COMP rx_fdm[], int nin) +{ + int i,j; + COMP fft_in[2*MODEM_STATS_NSPEC]; + COMP fft_out[2*MODEM_STATS_NSPEC]; + float full_scale_dB; + + /* update buffer of input samples */ + + for(i=0; i<2*MODEM_STATS_NSPEC-nin; i++) + f->fft_buf[i] = f->fft_buf[i+nin]; + for(j=0; jfft_buf[i] = rx_fdm[j].real; + assert(i == 2*MODEM_STATS_NSPEC); + + /* window and FFT */ + + for(i=0; i<2*MODEM_STATS_NSPEC; i++) { + fft_in[i].real = f->fft_buf[i] * (0.5 - 0.5*cosf((float)i*2.0*M_PI/(2*MODEM_STATS_NSPEC))); + fft_in[i].imag = 0.0; + } + + kiss_fft(f->fft_cfg, (kiss_fft_cpx *)fft_in, (kiss_fft_cpx *)fft_out); + + /* FFT scales up a signal of level 1 FDMDV_NSPEC */ + + full_scale_dB = 20*log10(MODEM_STATS_NSPEC*FDMDV_SCALE); + + /* scale and convert to dB */ + + for(i=0; i. +*/ + +#ifdef __cplusplus + extern "C" { +#endif + +#ifndef __MODEM_STATS__ +#define __MODEM_STATS__ + +#include "comp.h" +#include "kiss_fft.h" + +#define MODEM_STATS_NC_MAX 20 +#define MODEM_STATS_NR_MAX 6 +#define MODEM_STATS_NSPEC 512 +#define MODEM_STATS_MAX_F_HZ 4000 + +struct MODEM_STATS { + int Nc; + float snr_est; /* estimated SNR of rx signal in dB (3 kHz noise BW) */ + COMP rx_symbols[MODEM_STATS_NR_MAX][MODEM_STATS_NC_MAX+1]; + /* latest received symbols, for scatter plot */ + int nr; /* number of rows in rx_symbols */ + int sync; /* demod sync state */ + float foff; /* estimated freq offset in Hz */ + float rx_timing; /* estimated optimum timing offset in samples */ + float clock_offset; /* Estimated tx/rx sample clock offset in ppm */ + + /* Buf for FFT/waterfall */ + + float fft_buf[2*MODEM_STATS_NSPEC]; + kiss_fft_cfg fft_cfg; +}; + +void modem_stats_open(struct MODEM_STATS *f); +void modem_stats_close(struct MODEM_STATS *f); +void modem_stats_get_rx_spectrum(struct MODEM_STATS *f, float mag_spec_dB[], COMP rx_fdm[], int nin); + +#endif + +#ifdef __cplusplus +} +#endif diff --git a/codec2/tags/0.4.1/src/nlp.c b/codec2/tags/0.4.1/src/nlp.c new file mode 100644 index 00000000..4ff11c14 --- /dev/null +++ b/codec2/tags/0.4.1/src/nlp.c @@ -0,0 +1,589 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: nlp.c + AUTHOR......: David Rowe + DATE CREATED: 23/3/93 + + Non Linear Pitch (NLP) 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 . +*/ + +#include "defines.h" +#include "nlp.h" +#include "dump.h" +#include "kiss_fft.h" +#undef PROFILE +#include "machdep.h" + +#include +#include +#include + +/*---------------------------------------------------------------------------*\ + + DEFINES + +\*---------------------------------------------------------------------------*/ + +#define PMAX_M 600 /* maximum NLP analysis window size */ +#define COEFF 0.95 /* notch filter parameter */ +#define PE_FFT_SIZE 512 /* DFT size for pitch estimation */ +#define DEC 5 /* decimation factor */ +#define SAMPLE_RATE 8000 +#define PI 3.141592654 /* mathematical constant */ +#define T 0.1 /* threshold for local minima candidate */ +#define F0_MAX 500 +#define CNLP 0.3 /* post processor constant */ +#define NLP_NTAP 48 /* Decimation LPF order */ + +//#undef DUMP + +/*---------------------------------------------------------------------------*\ + + GLOBALS + +\*---------------------------------------------------------------------------*/ + +/* 48 tap 600Hz low pass FIR filter coefficients */ + +const float nlp_fir[] = { + -1.0818124e-03, + -1.1008344e-03, + -9.2768838e-04, + -4.2289438e-04, + 5.5034190e-04, + 2.0029849e-03, + 3.7058509e-03, + 5.1449415e-03, + 5.5924666e-03, + 4.3036754e-03, + 8.0284511e-04, + -4.8204610e-03, + -1.1705810e-02, + -1.8199275e-02, + -2.2065282e-02, + -2.0920610e-02, + -1.2808831e-02, + 3.2204775e-03, + 2.6683811e-02, + 5.5520624e-02, + 8.6305944e-02, + 1.1480192e-01, + 1.3674206e-01, + 1.4867556e-01, + 1.4867556e-01, + 1.3674206e-01, + 1.1480192e-01, + 8.6305944e-02, + 5.5520624e-02, + 2.6683811e-02, + 3.2204775e-03, + -1.2808831e-02, + -2.0920610e-02, + -2.2065282e-02, + -1.8199275e-02, + -1.1705810e-02, + -4.8204610e-03, + 8.0284511e-04, + 4.3036754e-03, + 5.5924666e-03, + 5.1449415e-03, + 3.7058509e-03, + 2.0029849e-03, + 5.5034190e-04, + -4.2289438e-04, + -9.2768838e-04, + -1.1008344e-03, + -1.0818124e-03 +}; + +typedef struct { + int m; + float w[PMAX_M/DEC]; /* DFT window */ + float sq[PMAX_M]; /* squared speech samples */ + float mem_x,mem_y; /* memory for notch filter */ + float mem_fir[NLP_NTAP]; /* decimation FIR filter memory */ + kiss_fft_cfg fft_cfg; /* kiss FFT config */ +} NLP; + +float test_candidate_mbe(COMP Sw[], COMP W[], float f0); +float post_process_mbe(COMP Fw[], int pmin, int pmax, float gmax, COMP Sw[], COMP W[], float *prev_Wo); +float post_process_sub_multiples(COMP Fw[], + int pmin, int pmax, float gmax, int gmax_bin, + float *prev_Wo); + +/*---------------------------------------------------------------------------*\ + + nlp_create() + + Initialisation function for NLP pitch estimator. + +\*---------------------------------------------------------------------------*/ + +void *nlp_create( +int m /* analysis window size */ +) +{ + NLP *nlp; + int i; + + assert(m <= PMAX_M); + + nlp = (NLP*)malloc(sizeof(NLP)); + if (nlp == NULL) + return NULL; + + nlp->m = m; + for(i=0; iw[i] = 0.5 - 0.5*cosf(2*PI*i/(m/DEC-1)); + } + + for(i=0; isq[i] = 0.0; + nlp->mem_x = 0.0; + nlp->mem_y = 0.0; + for(i=0; imem_fir[i] = 0.0; + + nlp->fft_cfg = kiss_fft_alloc (PE_FFT_SIZE, 0, NULL, NULL); + assert(nlp->fft_cfg != NULL); + + return (void*)nlp; +} + +/*---------------------------------------------------------------------------*\ + + nlp_destroy() + + Shut down function for NLP pitch estimator. + +\*---------------------------------------------------------------------------*/ + +void nlp_destroy(void *nlp_state) +{ + NLP *nlp; + assert(nlp_state != NULL); + nlp = (NLP*)nlp_state; + + KISS_FFT_FREE(nlp->fft_cfg); + free(nlp_state); +} + +/*---------------------------------------------------------------------------*\ + + nlp() + + Determines the pitch in samples using the Non Linear Pitch (NLP) + algorithm [1]. Returns the fundamental in Hz. Note that the actual + pitch estimate is for the centre of the M sample Sn[] vector, not + the current N sample input vector. This is (I think) a delay of 2.5 + frames with N=80 samples. You should align further analysis using + this pitch estimate to be centred on the middle of Sn[]. + + Two post processors have been tried, the MBE version (as discussed + in [1]), and a post processor that checks sub-multiples. Both + suffer occasional gross pitch errors (i.e. neither are perfect). In + the presence of background noise the sub-multiple algorithm tends + towards low F0 which leads to better sounding background noise than + the MBE post processor. + + A good way to test and develop the NLP pitch estimator is using the + tnlp (codec2/unittest) and the codec2/octave/plnlp.m Octave script. + + A pitch tracker searching a few frames forward and backward in time + would be a useful addition. + + References: + + [1] http://www.itr.unisa.edu.au/~steven/thesis/dgr.pdf Chapter 4 + +\*---------------------------------------------------------------------------*/ + +float nlp( + void *nlp_state, + float Sn[], /* input speech vector */ + int n, /* frames shift (no. new samples in Sn[]) */ + int pmin, /* minimum pitch value */ + int pmax, /* maximum pitch value */ + float *pitch, /* estimated pitch period in samples */ + COMP Sw[], /* Freq domain version of Sn[] */ + COMP W[], /* Freq domain window */ + float *prev_Wo +) +{ + NLP *nlp; + float notch; /* current notch filter output */ + COMP fw[PE_FFT_SIZE]; /* DFT of squared signal (input) */ + COMP Fw[PE_FFT_SIZE]; /* DFT of squared signal (output) */ + float gmax; + int gmax_bin; + int m, i,j; + float best_f0; + PROFILE_VAR(start, tnotch, filter, peakpick, window, fft, magsq, shiftmem); + + assert(nlp_state != NULL); + nlp = (NLP*)nlp_state; + m = nlp->m; + + PROFILE_SAMPLE(start); + + /* Square, notch filter at DC, and LP filter vector */ + + for(i=m-n; isq[i] = Sn[i]*Sn[i]; + + for(i=m-n; isq[i] - nlp->mem_x; + notch += COEFF*nlp->mem_y; + nlp->mem_x = nlp->sq[i]; + nlp->mem_y = notch; + nlp->sq[i] = notch + 1.0; /* With 0 input vectors to codec, + kiss_fft() would take a long + time to execute when running in + real time. Problem was traced + to kiss_fft function call in + this function. Adding this small + constant fixed problem. Not + exactly sure why. */ + } + + PROFILE_SAMPLE_AND_LOG(tnotch, start, " square and notch"); + + for(i=m-n; imem_fir[j] = nlp->mem_fir[j+1]; + nlp->mem_fir[NLP_NTAP-1] = nlp->sq[i]; + + nlp->sq[i] = 0.0; + for(j=0; jsq[i] += nlp->mem_fir[j]*nlp_fir[j]; + } + + PROFILE_SAMPLE_AND_LOG(filter, tnotch, " filter"); + + /* Decimate and DFT */ + + for(i=0; isq[i*DEC]*nlp->w[i]; + } + PROFILE_SAMPLE_AND_LOG(window, filter, " window"); + #ifdef DUMP + dump_dec(Fw); + #endif + + kiss_fft(nlp->fft_cfg, (kiss_fft_cpx *)fw, (kiss_fft_cpx *)Fw); + PROFILE_SAMPLE_AND_LOG(fft, window, " fft"); + + for(i=0; isq); + dump_Fw(Fw); + #endif + + /* find global peak */ + + gmax = 0.0; + gmax_bin = PE_FFT_SIZE*DEC/pmax; + for(i=PE_FFT_SIZE*DEC/pmax; i<=PE_FFT_SIZE*DEC/pmin; i++) { + if (Fw[i].real > gmax) { + gmax = Fw[i].real; + gmax_bin = i; + } + } + + PROFILE_SAMPLE_AND_LOG(peakpick, magsq, " peak pick"); + + //#define POST_PROCESS_MBE + #ifdef POST_PROCESS_MBE + best_f0 = post_process_mbe(Fw, pmin, pmax, gmax, Sw, W, prev_Wo); + #else + best_f0 = post_process_sub_multiples(Fw, pmin, pmax, gmax, gmax_bin, prev_Wo); + #endif + + PROFILE_SAMPLE_AND_LOG(shiftmem, peakpick, " post process"); + + /* Shift samples in buffer to make room for new samples */ + + for(i=0; isq[i] = nlp->sq[i+n]; + + /* return pitch and F0 estimate */ + + *pitch = (float)SAMPLE_RATE/best_f0; + + PROFILE_SAMPLE_AND_LOG2(shiftmem, " shift mem"); + + PROFILE_SAMPLE_AND_LOG2(start, " nlp int"); + + return(best_f0); +} + +/*---------------------------------------------------------------------------*\ + + post_process_sub_multiples() + + Given the global maximma of Fw[] we search integer submultiples for + local maxima. If local maxima exist and they are above an + experimentally derived threshold (OK a magic number I pulled out of + the air) we choose the submultiple as the F0 estimate. + + The rational for this is that the lowest frequency peak of Fw[] + should be F0, as Fw[] can be considered the autocorrelation function + of Sw[] (the speech spectrum). However sometimes due to phase + effects the lowest frequency maxima may not be the global maxima. + + This works OK in practice and favours low F0 values in the presence + of background noise which means the sinusoidal codec does an OK job + of synthesising the background noise. High F0 in background noise + tends to sound more periodic introducing annoying artifacts. + +\*---------------------------------------------------------------------------*/ + +float post_process_sub_multiples(COMP Fw[], + int pmin, int pmax, float gmax, int gmax_bin, + float *prev_Wo) +{ + int min_bin, cmax_bin; + int mult; + float thresh, best_f0; + int b, bmin, bmax, lmax_bin; + float lmax; + int prev_f0_bin; + + /* post process estimate by searching submultiples */ + + mult = 2; + min_bin = PE_FFT_SIZE*DEC/pmax; + cmax_bin = gmax_bin; + prev_f0_bin = *prev_Wo*(4000.0/PI)*(PE_FFT_SIZE*DEC)/SAMPLE_RATE; + + while(gmax_bin/mult >= min_bin) { + + b = gmax_bin/mult; /* determine search interval */ + bmin = 0.8*b; + bmax = 1.2*b; + if (bmin < min_bin) + bmin = min_bin; + + /* lower threshold to favour previous frames pitch estimate, + this is a form of pitch tracking */ + + if ((prev_f0_bin > bmin) && (prev_f0_bin < bmax)) + thresh = CNLP*0.5*gmax; + else + thresh = CNLP*gmax; + + lmax = 0; + lmax_bin = bmin; + for (b=bmin; b<=bmax; b++) /* look for maximum in interval */ + if (Fw[b].real > lmax) { + lmax = Fw[b].real; + lmax_bin = b; + } + + if (lmax > thresh) + if ((lmax > Fw[lmax_bin-1].real) && (lmax > Fw[lmax_bin+1].real)) { + cmax_bin = lmax_bin; + } + + mult++; + } + + best_f0 = (float)cmax_bin*SAMPLE_RATE/(PE_FFT_SIZE*DEC); + + return best_f0; +} + +/*---------------------------------------------------------------------------*\ + + post_process_mbe() + + Use the MBE pitch estimation algorithm to evaluate pitch candidates. This + works OK but the accuracy at low F0 is affected by NW, the analysis window + size used for the DFT of the input speech Sw[]. Also favours high F0 in + the presence of background noise which causes periodic artifacts in the + synthesised speech. + +\*---------------------------------------------------------------------------*/ + +float post_process_mbe(COMP Fw[], int pmin, int pmax, float gmax, COMP Sw[], COMP W[], float *prev_Wo) +{ + float candidate_f0; + float f0,best_f0; /* fundamental frequency */ + float e,e_min; /* MBE cost function */ + int i; + #ifdef DUMP + float e_hz[F0_MAX]; + #endif + #if !defined(NDEBUG) || defined(DUMP) + int bin; + #endif + float f0_min, f0_max; + float f0_start, f0_end; + + f0_min = (float)SAMPLE_RATE/pmax; + f0_max = (float)SAMPLE_RATE/pmin; + + /* Now look for local maxima. Each local maxima is a candidate + that we test using the MBE pitch estimation algotithm */ + + #ifdef DUMP + for(i=0; i Fw[i-1].real) && (Fw[i].real > Fw[i+1].real)) { + + /* local maxima found, lets test if it's big enough */ + + if (Fw[i].real > T*gmax) { + + /* OK, sample MBE cost function over +/- 10Hz range in 2.5Hz steps */ + + candidate_f0 = (float)i*SAMPLE_RATE/(PE_FFT_SIZE*DEC); + f0_start = candidate_f0-20; + f0_end = candidate_f0+20; + if (f0_start < f0_min) f0_start = f0_min; + if (f0_end > f0_max) f0_end = f0_max; + + for(f0=f0_start; f0<=f0_end; f0+= 2.5) { + e = test_candidate_mbe(Sw, W, f0); + #if !defined(NDEBUG) || defined(DUMP) + bin = floorf(f0); assert((bin > 0) && (bin < F0_MAX)); + #endif + #ifdef DUMP + e_hz[bin] = e; + #endif + if (e < e_min) { + e_min = e; + best_f0 = f0; + } + } + + } + } + } + + /* finally sample MBE cost function around previous pitch estimate + (form of pitch tracking) */ + + candidate_f0 = *prev_Wo * SAMPLE_RATE/TWO_PI; + f0_start = candidate_f0-20; + f0_end = candidate_f0+20; + if (f0_start < f0_min) f0_start = f0_min; + if (f0_end > f0_max) f0_end = f0_max; + + for(f0=f0_start; f0<=f0_end; f0+= 2.5) { + e = test_candidate_mbe(Sw, W, f0); + #if !defined(NDEBUG) || defined(DUMP) + bin = floorf(f0); assert((bin > 0) && (bin < F0_MAX)); + #endif + #ifdef DUMP + e_hz[bin] = e; + #endif + if (e < e_min) { + e_min = e; + best_f0 = f0; + } + } + + #ifdef DUMP + dump_e(e_hz); + #endif + + return best_f0; +} + +/*---------------------------------------------------------------------------*\ + + test_candidate_mbe() + + Returns the error of the MBE cost function for the input f0. + + Note: I think a lot of the operations below can be simplified as + W[].imag = 0 and has been normalised such that den always equals 1. + +\*---------------------------------------------------------------------------*/ + +float test_candidate_mbe( + COMP Sw[], + COMP W[], + float f0 +) +{ + COMP Sw_[FFT_ENC]; /* DFT of all voiced synthesised signal */ + int l,al,bl,m; /* loop variables */ + COMP Am; /* amplitude sample for this band */ + int offset; /* centers Hw[] about current harmonic */ + float den; /* denominator of Am expression */ + float error; /* accumulated error between originl and synthesised */ + float Wo; /* current "test" fundamental freq. */ + int L; + + L = floorf((SAMPLE_RATE/2.0)/f0); + Wo = f0*(2*PI/SAMPLE_RATE); + + error = 0.0; + + /* Just test across the harmonics in the first 1000 Hz (L/4) */ + + for(l=1; l. +*/ + +#ifndef __NLP__ +#define __NLP__ + +#include "comp.h" + +void *nlp_create(int m); +void nlp_destroy(void *nlp_state); +float nlp(void *nlp_state, float Sn[], int n, int pmin, int pmax, + float *pitch, COMP Sw[], COMP W[], float *prev_Wo); + +#endif diff --git a/codec2/tags/0.4.1/src/noise_samples.h b/codec2/tags/0.4.1/src/noise_samples.h new file mode 100644 index 00000000..1e271bc1 --- /dev/null +++ b/codec2/tags/0.4.1/src/noise_samples.h @@ -0,0 +1,60006 @@ +/* unit variance complex noise samples */ + +/* Generated by write_noise_file() Octave function */ + +COMP noise[]={ + {-1.885516,0.055745}, + {-0.521966,-0.622614}, + {1.066249,0.337187}, + {0.425638,1.008370}, + {-0.318666,-0.210894}, + {-0.498824,0.361164}, + {-0.300114,-0.527950}, + {0.385872,0.182296}, + {1.195960,-0.586922}, + {0.266811,0.178374}, + {0.013054,0.215778}, + {-0.823216,-0.322273}, + {0.837766,-0.727259}, + {-0.862485,0.092857}, + {0.075880,0.633056}, + {-0.410681,-0.646296}, + {0.586237,-0.116673}, + {-0.058715,0.066528}, + {0.857992,-1.043428}, + {-0.123710,-0.261511}, + {0.185764,0.023376}, + {0.236794,-0.527785}, + {-1.703954,0.502907}, + {-0.299082,-0.422089}, + {-0.288630,-0.675562}, + {-0.424885,-0.319811}, + {-0.032088,0.101098}, + {0.605509,0.242926}, + {0.145393,-0.199722}, + {-0.184393,-1.528490}, + {0.081268,-0.843421}, + {0.654326,-0.158813}, + {-0.234536,1.226681}, + {0.221648,-1.226646}, + {-0.193938,-0.336096}, + {-0.518051,-1.309855}, + {-0.664323,1.059784}, + {0.007637,1.113850}, + {-0.465620,1.714405}, + {1.028837,-0.549814}, + {0.073478,-0.721235}, + {0.964658,0.084118}, + {-1.822765,-0.997525}, + {1.032482,0.916581}, + {-0.597571,-0.136872}, + {-0.009127,-0.208567}, + {0.516709,-0.773967}, + {-1.129711,1.021948}, + {-0.697322,-0.812202}, + {0.327103,-0.638199}, + {-0.497829,0.319382}, + {-1.362630,-0.414764}, + {-0.307641,0.207521}, + {-0.982186,-0.198641}, + {-0.588516,-0.097265}, + {1.299202,0.644097}, + {-0.972070,-0.680644}, + {0.782015,-0.002870}, + {-1.177445,-1.014379}, + {-0.398772,0.513042}, + {-0.666921,0.266484}, + {-0.803497,0.971730}, + {0.267153,0.335670}, + {-0.591532,0.779734}, + {-1.211656,-0.382351}, + {0.065910,-0.504718}, + {-0.686435,-0.584560}, + {0.858992,-1.042560}, + {0.847992,1.057437}, + {1.492562,-0.829278}, + {0.816092,-1.530742}, + {-0.520592,-0.549319}, + {-0.076793,0.021602}, + {-0.697792,0.763414}, + {0.821960,0.552985}, + {0.376647,-1.094689}, + {-1.401195,-0.857007}, + {-0.376378,-0.783975}, + {-0.120497,0.662907}, + {0.670862,-0.673604}, + {-0.177972,-1.238774}, + {-0.037790,-1.376598}, + {-0.899490,-0.445965}, + {0.474709,1.022354}, + {-0.291882,0.370018}, + {-0.072661,-0.118012}, + {0.396912,-1.371327}, + {-0.711547,0.258054}, + {-1.118704,-0.050908}, + {-0.592657,-1.747229}, + {-0.731285,-0.387065}, + {-0.535939,-0.294046}, + {-1.314716,-1.534715}, + {0.361445,0.618672}, + {-0.082988,-0.336140}, + {0.210252,0.650233}, + {-0.674824,0.056007}, + {0.596070,0.007299}, + {0.305633,-1.176059}, + {1.659456,0.424673}, + {0.660546,-0.514937}, + {-0.206967,0.241885}, + {-1.104655,-0.744576}, + {-0.218762,0.014955}, + {0.165193,1.381141}, + {0.078718,-1.222328}, + {-0.377642,-0.152884}, + {0.108755,0.412056}, + {-0.429127,-0.383452}, + {0.518805,0.741250}, + {0.740139,-0.770384}, + {-1.485392,-0.336407}, + {-0.078238,0.141468}, + {-1.271050,0.180219}, + {-0.211076,-1.217480}, + {1.461947,0.144679}, + {-0.109724,-0.861360}, + {-0.296620,-1.282399}, + {0.201649,-0.713701}, + {-0.156722,0.424378}, + {1.029760,-1.173706}, + {0.571211,-0.156216}, + {-0.455729,0.236642}, + {0.742660,0.014606}, + {-0.097202,-0.498742}, + {0.266521,0.048233}, + {-0.060433,0.282215}, + {-0.239310,1.006663}, + {0.389689,-0.071960}, + {-0.689538,0.568830}, + {0.759056,0.330529}, + {0.149945,-0.521060}, + {-0.580738,-0.907159}, + {1.448531,-0.054100}, + {0.690290,0.275166}, + {-0.478557,-0.516261}, + {-0.820324,-0.831472}, + {-0.341231,0.409044}, + {0.180268,0.231572}, + {-0.450892,1.061669}, + {0.192718,-0.862400}, + {-0.399038,0.268735}, + {-0.856262,-0.454883}, + {0.363651,-0.198669}, + {-0.642075,-0.189629}, + {0.005932,-0.508157}, + {0.985162,-0.020120}, + {1.562916,0.229486}, + {-0.899449,0.307419}, + {0.112975,0.627516}, + {-1.857863,-1.008967}, + {0.378419,0.019322}, + {0.443381,0.253609}, + {1.715317,-0.767294}, + {-0.385770,0.001505}, + {-0.645703,-0.310651}, + {-1.888905,0.409068}, + {0.805380,0.333960}, + {-1.046012,-0.674661}, + {0.794386,-0.303931}, + {-0.286721,0.610492}, + {-0.123797,-0.552424}, + {0.206278,-0.663653}, + {0.428624,-0.249450}, + {0.430463,-0.635776}, + {-0.119454,0.773666}, + {-0.578332,-0.980697}, + {0.235559,1.481441}, + {-0.714737,-1.423728}, + {0.350707,0.157071}, + {0.453768,0.680754}, + {0.283172,-1.286042}, + {0.031254,-0.559665}, + {-0.008719,-0.527750}, + {-1.036011,-0.024812}, + {0.392333,0.647429}, + {0.203090,0.422197}, + {-1.948977,0.778356}, + {1.366324,-0.798091}, + {1.180139,-0.048221}, + {0.114722,1.012431}, + {0.615604,0.391601}, + {0.987843,0.495600}, + {-0.496219,-0.900673}, + {1.001277,-0.568435}, + {-0.576352,-1.332582}, + {0.306377,0.123371}, + {0.211114,-0.685042}, + {0.298619,0.362809}, + {0.202382,0.173210}, + {-0.075417,-0.014578}, + {-1.015379,-0.025271}, + {0.128685,0.929594}, + {-0.723128,0.984769}, + {-0.536901,-0.125969}, + {0.240670,0.812981}, + {-0.763511,1.108132}, + {0.500508,-0.241395}, + {0.624663,-0.410191}, + {-0.094272,-0.521839}, + {1.429982,-0.369827}, + {-0.070236,-1.263636}, + {-0.498143,-0.973796}, + {0.575172,-1.017724}, + {0.487669,0.215515}, + {0.562802,-0.136995}, + {-0.963325,-0.880169}, + {-0.541808,-0.623215}, + {0.613993,0.303645}, + {-0.604527,-0.329199}, + {-0.331248,1.331861}, + {-1.040864,1.077405}, + {0.342707,0.741436}, + {-0.627839,-0.347768}, + {0.231630,-0.578183}, + {-1.128172,0.396462}, + {-0.198999,1.538255}, + {-0.177279,-0.290086}, + {-0.687712,-0.894058}, + {-0.124584,0.925987}, + {-0.602825,0.432388}, + {-0.111357,-0.496225}, + {0.034978,0.298642}, + {0.324142,-0.092883}, + {1.347456,0.820678}, + {0.674479,-0.288974}, + {1.539829,-1.107841}, + {-1.023161,0.056007}, + {0.317892,-0.963086}, + {0.158138,0.483226}, + {0.340379,-0.422898}, + {-0.813880,-0.882603}, + {-0.322466,0.829669}, + {-0.217180,-1.046571}, + {0.452658,0.839521}, + {-0.622912,-0.060398}, + {-0.034008,-0.564055}, + {-1.793271,-0.605655}, + {-0.028383,0.886204}, + {-0.308408,0.061571}, + {0.536948,0.120042}, + {-0.574106,-0.562561}, + {0.406051,-0.338068}, + {0.492813,-0.083346}, + {-0.711445,-0.455225}, + {-0.061165,0.217759}, + {0.338502,-0.376511}, + {0.832324,-0.406104}, + {-0.083176,0.715563}, + {0.040608,-0.871143}, + {-0.462891,0.849255}, + {-0.372708,-1.019345}, + {0.934808,-0.626071}, + {1.010369,-1.084185}, + {0.479580,-0.842863}, + {0.927175,0.131809}, + {-0.689773,-0.142861}, + {1.343912,0.404388}, + {-1.759282,0.448528}, + {0.619114,-0.525565}, + {-0.321018,0.404425}, + {-0.741470,-0.296394}, + {-1.980475,0.026427}, + {-0.614688,0.342918}, + {0.066823,0.132296}, + {0.498182,0.005019}, + {0.182848,0.162708}, + {-0.493550,0.153312}, + {1.072346,-1.225466}, + {1.139312,0.832815}, + {1.252850,0.105664}, + {-0.397363,-0.754276}, + {0.580338,-1.300751}, + {0.009278,-0.598071}, + {0.402804,-0.530334}, + {-0.039782,-0.370667}, + {-0.990988,-0.169245}, + {1.697751,-0.452739}, + {1.272906,-0.324169}, + {-1.567337,-0.459235}, + {-0.798090,-0.024978}, + {0.697111,-1.399949}, + {0.110211,-0.941636}, + {-1.480043,-0.132934}, + {-1.148194,0.987249}, + {-0.873447,-0.209100}, + {1.065186,-1.104929}, + {0.099062,0.126155}, + {1.977617,0.094483}, + {-0.786564,-0.546020}, + {-0.714383,0.131073}, + {0.905849,0.394293}, + {0.190777,-0.513831}, + {0.437916,0.203698}, + {1.043923,0.145473}, + {-0.443628,-0.725054}, + {0.983123,-0.489622}, + {0.842413,0.307580}, + {-0.822191,-0.258379}, + {-0.523631,0.285446}, + {0.571865,-0.025860}, + {-0.201652,-0.099850}, + {-0.022666,0.495916}, + {0.596392,0.867633}, + {0.804110,-0.338599}, + {-0.026179,-1.043212}, + {-0.598738,0.094476}, + {-1.478593,-0.541411}, + {-0.941390,0.363421}, + {0.361994,0.590341}, + {1.113285,-1.212781}, + {0.701988,0.084937}, + {-0.083600,-0.245951}, + {-1.484694,-0.468464}, + {0.162783,1.536800}, + {0.252869,-0.052530}, + {0.926480,-0.277632}, + {0.299984,-1.410909}, + {-0.425939,-0.332244}, + {0.464111,0.662834}, + {-0.802428,-0.324926}, + {0.028548,0.511754}, + {0.140263,0.200719}, + {1.751965,1.362158}, + {0.773686,-0.044970}, + {-0.098854,0.668847}, + {-0.356892,1.006610}, + {0.272827,0.118268}, + {0.294481,0.308008}, + {1.772151,0.001790}, + {0.399585,-0.223070}, + {0.143887,0.187282}, + {-0.580062,0.483563}, + {0.263317,0.146606}, + {0.913153,0.409123}, + {0.176392,0.531394}, + {1.266576,0.812919}, + {-0.339609,-0.004748}, + {1.029027,-0.899818}, + {-0.770858,-0.547236}, + {0.286743,-0.638120}, + {-0.521747,-0.089493}, + {-0.565535,-0.929156}, + {-1.535774,0.479567}, + {-0.615287,-0.520953}, + {-0.553663,-0.319031}, + {0.582640,1.113202}, + {0.232977,0.041975}, + {-0.199109,-0.254687}, + {-0.066200,0.947135}, + {0.666122,0.627375}, + {0.480019,1.051260}, + {-0.093472,-0.787448}, + {0.480187,0.926381}, + {-0.857216,0.556518}, + {0.442832,0.376201}, + {-0.119017,-0.140136}, + {-0.409616,-1.213675}, + {-0.437294,-0.024768}, + {0.451274,-0.787326}, + {-0.533223,-0.923706}, + {0.131233,1.268746}, + {1.743505,1.131077}, + {0.987317,0.595257}, + {-0.088862,0.853512}, + {0.551818,0.665099}, + {0.883782,0.470033}, + {-0.516423,-1.423524}, + {0.091609,0.378477}, + {0.009939,0.994809}, + {1.045723,-1.221703}, + {-0.276956,-0.093140}, + {-0.409436,-0.171621}, + {-0.964290,-0.362871}, + {0.592260,0.544377}, + {-0.681616,-0.447483}, + {-0.431291,0.024446}, + {0.663176,1.026108}, + {0.838537,-0.118180}, + {-0.747318,0.251341}, + {-0.380034,-0.715319}, + {-0.900635,0.212346}, + {-0.464843,0.620745}, + {-1.093005,0.607958}, + {0.515036,1.299937}, + {-1.016371,-0.029679}, + {-0.205308,0.148501}, + {0.505373,-0.440794}, + {-0.048557,-0.301057}, + {-0.698358,-1.099303}, + {-0.088257,-0.329308}, + {0.075595,-0.362464}, + {0.027192,-0.680106}, + {-0.757238,-0.166757}, + {-1.448321,-0.138835}, + {-0.136439,0.459323}, + {0.912758,0.296751}, + {0.799521,-0.573520}, + {-0.861892,-0.589343}, + {-0.567036,0.158120}, + {0.478773,-1.056482}, + {0.709261,0.523567}, + {0.739101,-1.002925}, + {-0.494944,0.003764}, + {0.454782,-0.046268}, + {0.210620,0.297517}, + {-0.781813,0.236194}, + {0.348782,-0.613968}, + {-0.094413,-0.465826}, + {1.768494,-0.406883}, + {0.007841,0.789725}, + {-0.162655,0.552781}, + {-0.758330,0.343804}, + {0.454609,-0.732044}, + {-0.168881,0.095592}, + {0.515566,-0.569084}, + {1.255135,-0.757000}, + {0.469649,0.564189}, + {1.260765,0.360564}, + {0.055027,-0.177677}, + {0.600213,-1.511142}, + {-0.018551,1.257905}, + {0.308072,0.151081}, + {-0.207634,-1.327921}, + {-0.527733,0.174325}, + {-0.159456,-0.732546}, + {-0.220168,-0.415477}, + {0.543532,-0.145998}, + {0.884459,1.021665}, + {-0.262540,-0.398469}, + {-0.281570,0.698927}, + {-0.908972,-0.709079}, + {1.589970,0.503578}, + {-0.171265,-0.741831}, + {-0.743265,-0.294431}, + {0.731885,0.012954}, + {0.007728,-0.499237}, + {0.089515,-0.775161}, + {0.725415,-0.411110}, + {0.298849,-0.118750}, + {-1.303123,0.250206}, + {0.310939,0.936912}, + {-0.172330,0.754859}, + {0.093154,0.269182}, + {-0.858640,-0.029252}, + {-1.073149,0.280686}, + {-0.601430,-0.256738}, + {-0.351531,-0.914084}, + {-1.751136,-0.490966}, + {0.112360,-0.656132}, + {0.921817,-0.276350}, + {0.763771,0.769928}, + {0.221840,1.213251}, + {-0.706608,-0.303978}, + {0.281566,-1.404763}, + {1.496795,0.177279}, + {0.261977,-0.939172}, + {-0.919389,-0.188529}, + {0.044503,0.718759}, + {-0.825230,0.774033}, + {0.693991,0.858213}, + {0.509792,0.099608}, + {-0.020553,-0.839990}, + {-0.854648,-0.540134}, + {-0.000525,1.256322}, + {0.894022,-0.693105}, + {0.442684,-0.596914}, + {0.498318,0.275977}, + {-0.388386,0.465259}, + {0.414579,-1.294942}, + {0.098001,-0.237709}, + {1.594870,-0.240582}, + {-0.711413,0.451491}, + {0.019527,2.133193}, + {0.948900,0.242084}, + {0.059194,0.584269}, + {0.852393,-0.156332}, + {-1.485739,0.262110}, + {-0.016760,-0.827316}, + {-0.891646,0.181925}, + {-0.018801,0.682929}, + {-0.690712,-0.572420}, + {1.070712,0.423795}, + {1.438766,0.043977}, + {-0.318368,-0.067348}, + {-0.661371,-1.089229}, + {0.046538,0.984436}, + {0.749236,-0.964548}, + {1.566314,0.918615}, + {-1.235787,1.002522}, + {0.416022,1.866776}, + {1.217135,0.668893}, + {-0.698937,-0.486054}, + {-0.478062,-1.168289}, + {1.113613,-0.737028}, + {0.773078,0.234230}, + {-0.270515,-0.411625}, + {-0.228462,0.192394}, + {-0.838646,0.153818}, + {-0.436599,-0.408881}, + {-0.286055,-0.410803}, + {0.729377,-0.731766}, + {0.197643,0.237175}, + {0.836606,0.664076}, + {-1.657439,1.703306}, + {-0.925155,-0.171418}, + {0.078549,-0.331130}, + {0.629470,0.307286}, + {1.248656,0.135449}, + {1.243601,0.442489}, + {0.387421,-0.154848}, + {-1.179918,-0.732728}, + {1.236507,0.602991}, + {0.372452,0.171586}, + {-0.394677,-0.101565}, + {0.381677,1.147393}, + {-1.697199,0.109712}, + {0.188553,-0.752200}, + {0.333632,-1.929951}, + {-1.659946,0.767602}, + {-0.190815,-0.557146}, + {-1.244192,0.038106}, + {0.077329,0.305661}, + {0.945212,1.065261}, + {-0.912713,1.292797}, + {-0.391785,-0.024158}, + {0.240759,-1.304114}, + {0.112919,-0.091566}, + {-0.424359,-0.382424}, + {-1.079261,0.972243}, + {0.454041,-0.530269}, + {-1.976890,-0.123184}, + {-0.190632,-0.544888}, + {0.296577,-0.825026}, + {-0.477747,-0.335360}, + {0.208503,0.097964}, + {-0.579558,-0.380423}, + {-0.414982,-0.344604}, + {0.940711,-0.907772}, + {-0.962894,-1.441203}, + {-0.648064,2.197827}, + {-0.633787,-0.990602}, + {0.215111,-0.181544}, + {0.232828,-0.123360}, + {-0.303892,1.339899}, + {-0.166969,1.219343}, + {0.508222,-0.102310}, + {-0.811188,1.126966}, + {0.321233,-1.277579}, + {0.007428,0.316342}, + {0.506948,0.481229}, + {-1.304547,0.311991}, + {0.142125,0.263640}, + {0.391351,0.737307}, + {1.437568,-0.534043}, + {-0.949425,1.069958}, + {-0.409085,-0.759735}, + {0.412259,0.737801}, + {-0.492377,-0.804608}, + {-0.217219,-0.405020}, + {0.115039,0.000846}, + {0.349041,0.299516}, + {-0.460594,0.403723}, + {0.196753,1.155867}, + {-0.277940,0.266830}, + {-0.274583,0.585154}, + {-1.172068,1.790906}, + {0.590439,-0.406621}, + {1.328016,-0.283713}, + {1.517565,-0.073409}, + {0.130855,1.772665}, + {-2.619775,1.072108}, + {0.319751,1.536673}, + {0.047733,-0.326729}, + {0.289634,1.226698}, + {2.014575,-0.883138}, + {0.229264,-0.183602}, + {0.589396,-1.070306}, + {0.273592,-2.039844}, + {-0.935323,-0.715785}, + {0.849403,0.619567}, + {0.480466,-0.484123}, + {0.222280,-0.134613}, + {-0.258632,-1.289221}, + {0.050742,0.026907}, + {-0.283583,0.031728}, + {-0.757978,0.771411}, + {-0.434361,0.111156}, + {0.021107,-0.043801}, + {0.773835,-0.122289}, + {-0.292605,0.119946}, + {0.501058,0.447133}, + {0.227193,0.479879}, + {-0.544627,-0.222938}, + {0.583272,-0.387875}, + {-0.223831,-0.468512}, + {-1.520007,0.446069}, + {-0.573569,0.226990}, + {-1.019881,0.053637}, + {-0.634610,-0.875259}, + {0.504476,-0.027282}, + {-0.039342,0.409377}, + {0.202815,1.231918}, + {-0.843921,0.164374}, + {0.356392,-0.821357}, + {0.108781,-0.523469}, + {-0.196590,-0.568744}, + {0.903934,1.041689}, + {-0.544910,-0.022931}, + {0.299150,1.544291}, + {0.880525,0.454125}, + {-0.528507,-0.169262}, + {-0.683196,-0.079160}, + {0.153998,-0.420623}, + {0.324243,0.022550}, + {0.099578,1.237426}, + {0.613243,0.648504}, + {-0.190038,0.945184}, + {-1.058645,0.829361}, + {0.657373,-0.037085}, + {0.292522,-1.824963}, + {1.306603,0.982009}, + {0.202489,-0.632477}, + {-0.198865,1.503029}, + {-0.506292,0.002522}, + {0.709691,0.107836}, + {-0.135288,-0.949001}, + {-0.013697,0.446746}, + {0.269863,1.736851}, + {0.147020,-0.676663}, + {-0.044332,0.878172}, + {-0.969214,0.385042}, + {-0.108626,-0.577699}, + {0.573041,-0.693982}, + {-0.430415,1.253413}, + {0.106646,-0.057892}, + {-0.946692,-0.108739}, + {-0.070615,-0.924246}, + {-0.407323,-1.048572}, + {0.541592,-0.183877}, + {1.559869,-0.734420}, + {-0.667415,-0.567982}, + {0.194163,-0.030077}, + {0.088646,0.226636}, + {0.502396,-1.399375}, + {-0.016646,-0.215656}, + {0.348238,0.112063}, + {1.303715,0.470275}, + {-0.665134,-0.786941}, + {0.470438,0.135527}, + {-1.337204,0.482771}, + {-0.535810,0.980521}, + {-0.168026,-0.750603}, + {0.387649,-0.230317}, + {-0.100852,0.278379}, + {0.685615,0.909829}, + {-1.248533,-0.401446}, + {0.402464,1.846549}, + {0.119498,0.304702}, + {0.717501,-1.078118}, + {-0.450438,0.775426}, + {-1.459832,-0.482867}, + {0.328487,-0.012362}, + {-0.126026,0.086507}, + {-0.630993,0.029377}, + {-1.326625,0.927913}, + {-0.198820,0.150652}, + {0.266277,-0.555360}, + {0.424295,-0.359816}, + {1.393099,-0.408979}, + {-0.137465,0.133084}, + {0.628200,-0.501458}, + {-0.684531,-0.666955}, + {-0.181920,0.890694}, + {-0.700720,-0.956197}, + {-0.060714,-1.247294}, + {-0.405972,-0.881525}, + {1.118188,0.072000}, + {-0.195761,-1.868639}, + {0.358203,0.349429}, + {0.154352,-1.476324}, + {-0.210438,-1.836233}, + {0.277728,0.211249}, + {0.104063,1.608697}, + {0.078646,-0.690233}, + {1.107666,0.152621}, + {0.976973,0.132356}, + {0.625021,0.424496}, + {1.106620,-1.108251}, + {-0.606551,0.611908}, + {-0.079978,0.362614}, + {0.450618,0.582625}, + {-0.256559,-0.109762}, + {-1.029120,-0.607627}, + {0.030983,0.226229}, + {0.466365,-0.698225}, + {-0.320317,0.232588}, + {-0.294836,0.215016}, + {0.380833,0.902802}, + {0.179398,-0.539814}, + {-0.750583,-0.650149}, + {-0.528202,0.616827}, + {-1.363519,-1.202585}, + {0.284990,-1.236363}, + {0.243581,-0.864788}, + {0.624023,0.137801}, + {-0.032040,-0.595454}, + {0.518910,0.207927}, + {-0.623962,0.216663}, + {-0.382311,0.684690}, + {-1.561598,0.901426}, + {0.426931,1.278804}, + {0.332361,-0.658982}, + {0.181141,-0.012956}, + {0.171052,0.552234}, + {-0.435677,0.454231}, + {-0.919015,0.176359}, + {-0.000067,-0.799626}, + {-0.930220,-0.187525}, + {-0.452119,-0.228146}, + {0.380184,-0.566153}, + {-0.179594,0.470684}, + {0.176167,-0.917050}, + {0.002315,0.589605}, + {1.252774,0.206557}, + {-0.284561,-1.124914}, + {0.174024,0.351072}, + {-0.838853,1.170720}, + {-0.067488,-0.254230}, + {-0.622343,-1.414225}, + {0.436853,0.611763}, + {-0.128391,0.096025}, + {-0.819464,-0.451713}, + {-0.165038,-0.122421}, + {0.024147,-1.314003}, + {0.304931,0.164088}, + {-0.288640,-0.620373}, + {0.357003,0.454057}, + {-1.286647,0.415088}, + {1.849891,0.616365}, + {-0.185972,-1.212797}, + {-0.415794,-0.401859}, + {-0.431783,-0.137922}, + {0.768623,-0.292081}, + {0.012545,1.445239}, + {-1.689607,-0.394403}, + {0.152052,-0.025210}, + {-1.765495,0.816127}, + {0.035743,0.371073}, + {-0.218734,-0.149507}, + {1.291120,-1.111594}, + {-0.374380,0.070194}, + {-0.903368,0.788305}, + {0.867657,-0.973921}, + {0.913874,0.430432}, + {-0.121419,0.832404}, + {-0.415312,1.135312}, + {-0.393487,-0.150178}, + {-0.079568,-0.565870}, + {1.522292,0.090401}, + {-0.334966,0.599134}, + {0.515824,0.178857}, + {-0.199075,-0.457595}, + {0.246401,-0.054357}, + {1.396896,-1.363043}, + {-0.027178,-0.553311}, + {1.010836,0.249187}, + {0.075435,0.009485}, + {-0.217608,1.185129}, + {-0.522616,0.556410}, + {0.858783,-0.313273}, + {-0.001036,-0.621413}, + {0.960607,-1.149066}, + {-0.521696,0.268324}, + {-0.517445,-1.383789}, + {0.305025,0.761437}, + {0.031777,-0.095862}, + {-0.795680,-1.512038}, + {0.033550,-0.338430}, + {-0.398340,-0.145735}, + {-0.322545,0.322695}, + {0.372049,-0.610750}, + {-0.137179,-0.590167}, + {-0.504190,-0.258481}, + {-0.335035,0.338316}, + {-0.364893,0.692466}, + {0.038100,-0.724327}, + {0.296797,0.135183}, + {0.159604,0.214980}, + {0.250361,-0.215980}, + {-0.347541,0.122078}, + {-0.056809,0.890072}, + {0.285375,0.181473}, + {0.170715,-0.393356}, + {-1.015282,-0.208756}, + {-0.785738,0.483868}, + {0.007467,1.387720}, + {-0.178938,0.754625}, + {0.664808,-0.600883}, + {0.001036,-0.083353}, + {0.194157,0.160494}, + {1.084332,-0.062428}, + {0.349357,0.373911}, + {1.433766,-1.303837}, + {0.037403,2.429277}, + {0.395728,-0.834206}, + {-0.389085,-0.755077}, + {0.850327,0.007645}, + {-0.368104,0.126990}, + {-0.775816,-0.923819}, + {-0.537167,0.945156}, + {0.142793,1.312552}, + {-0.125607,0.032723}, + {-0.137840,-0.002817}, + {0.742073,0.013517}, + {0.251125,-0.528226}, + {0.820089,-0.035605}, + {-0.713914,0.167522}, + {-0.863981,-0.178499}, + {-0.390476,-0.120624}, + {0.583901,-0.243569}, + {-0.227909,0.309306}, + {0.324491,-0.693688}, + {-1.094183,0.252179}, + {0.192052,0.039188}, + {-0.267150,-0.444016}, + {-0.005890,-0.573760}, + {-0.232266,-0.276434}, + {0.382483,0.162194}, + {0.150483,-0.651730}, + {0.067169,0.902480}, + {-2.098348,0.945188}, + {0.825451,1.329186}, + {-0.815597,-1.181818}, + {0.461014,-0.678300}, + {-0.711512,0.009708}, + {0.260361,1.191568}, + {0.185182,-0.338544}, + {0.478590,0.221720}, + {0.624523,0.990393}, + {-0.706888,0.014106}, + {1.173506,-1.110449}, + {-0.091258,-0.061557}, + {1.120091,1.816875}, + {-0.989880,-1.531038}, + {0.692417,-1.128270}, + {1.716773,0.088070}, + {1.162503,0.054400}, + {0.810364,0.272585}, + {-0.013515,-0.520286}, + {-0.730928,-0.950759}, + {0.008127,0.539806}, + {-1.317219,0.544458}, + {0.781036,0.503169}, + {-0.335197,-0.425765}, + {-0.735000,-0.347362}, + {0.528729,0.365142}, + {-0.617825,0.301920}, + {0.910278,-0.760821}, + {-0.709713,-0.356227}, + {0.953397,0.042611}, + {0.086349,-0.037081}, + {0.171876,0.033586}, + {1.106060,-0.413432}, + {-0.408955,1.259989}, + {0.072173,1.348382}, + {0.650744,0.132067}, + {0.241760,-0.334014}, + {-0.088343,0.502032}, + {-0.043052,0.355098}, + {-0.313450,0.269137}, + {-0.329212,-1.672112}, + {-0.207438,-0.117867}, + {0.366077,-0.234852}, + {0.411392,-0.008275}, + {0.353902,0.251566}, + {-1.477623,0.757765}, + {0.654771,-0.149077}, + {0.076332,-0.376470}, + {-0.879182,-0.887672}, + {0.125407,1.010632}, + {-0.871182,0.304759}, + {0.194266,-0.223159}, + {0.060104,-0.953143}, + {-0.045438,0.534938}, + {0.615844,0.411408}, + {-0.374972,-0.055209}, + {-0.253019,0.383784}, + {-0.891703,-0.218474}, + {-0.706804,0.115545}, + {-1.026031,1.389687}, + {-0.462136,0.335579}, + {-0.773215,-0.951771}, + {-0.779558,-0.464746}, + {0.476106,-0.777170}, + {0.664543,-0.569407}, + {0.214316,0.063090}, + {-0.569488,-0.008396}, + {0.750912,-0.739441}, + {0.214514,0.148096}, + {-0.198354,1.474815}, + {-1.805212,-0.107083}, + {0.169518,-0.786940}, + {-0.409644,0.852013}, + {-0.221826,-0.037541}, + {0.253388,-0.616419}, + {-1.774513,-1.460955}, + {0.742875,0.456503}, + {-0.232420,-1.359596}, + {-0.507235,-0.763391}, + {0.195227,0.320688}, + {-0.224637,-0.845635}, + {1.009627,0.163178}, + {0.778218,-1.096235}, + {0.865546,0.293077}, + {1.466179,0.233799}, + {0.226625,-0.545274}, + {0.692166,-0.527514}, + {0.013789,0.635607}, + {0.807891,-0.801895}, + {-1.053395,0.465520}, + {-0.036991,-1.273551}, + {-0.589794,-0.753839}, + {-0.030564,-0.036160}, + {0.155678,-1.045183}, + {0.625342,-0.595545}, + {0.036864,-0.046397}, + {-0.004179,-0.652544}, + {-0.820676,0.620457}, + {-0.183887,0.725946}, + {-0.166238,-1.560859}, + {0.175907,-1.429565}, + {-0.020052,0.815148}, + {-0.197063,-1.522027}, + {0.813251,-2.196093}, + {-1.334144,-0.008865}, + {0.412217,0.219281}, + {-0.080738,-0.419816}, + {0.192626,-0.493562}, + {-0.370266,-1.389646}, + {-0.030379,0.021337}, + {0.496641,0.294285}, + {-0.416795,0.418699}, + {0.195812,-0.707197}, + {0.122865,-0.525780}, + {-0.610908,-0.373378}, + {-0.177131,-1.018769}, + {0.403266,0.457369}, + {-0.288750,1.777459}, + {-0.606019,0.137316}, + {0.164513,1.727904}, + {0.911565,-0.299473}, + {-0.493145,0.145941}, + {0.279365,0.579905}, + {0.452409,1.222730}, + {-0.329814,0.070742}, + {-0.098010,-0.289855}, + {1.204663,0.662790}, + {-0.493696,0.573452}, + {-0.938748,-0.639465}, + {-0.739078,1.243613}, + {-0.343832,0.558003}, + {0.027203,0.055290}, + {-0.170201,0.729385}, + {-0.878156,-1.902973}, + {0.690907,1.079256}, + {0.028972,0.634171}, + {-0.155383,0.545055}, + {-0.431928,0.330613}, + {-0.635781,0.072453}, + {0.615176,0.308009}, + {0.104105,-0.205818}, + {0.415076,1.103903}, + {-0.024480,0.212016}, + {0.664855,-0.116184}, + {0.652496,-1.192114}, + {0.695982,-0.080428}, + {-0.526819,-0.078349}, + {1.742119,0.556368}, + {-0.153092,1.204460}, + {0.311190,0.421990}, + {0.938121,1.025194}, + {0.156598,-0.031073}, + {0.224118,0.600692}, + {-0.051218,0.216583}, + {-0.842484,0.468331}, + {0.407989,0.450259}, + {-0.949113,-1.564583}, + {-0.434143,0.325978}, + {0.747291,2.322704}, + {0.737442,1.246064}, + {-0.762481,-0.758876}, + {0.729215,0.853799}, + {-0.908589,-0.622078}, + {-0.598447,1.603107}, + {-0.959017,0.214551}, + {0.536470,-0.187251}, + {0.530038,0.557070}, + {-0.247256,0.391664}, + {0.445570,0.089350}, + {1.499768,-0.418437}, + {0.800986,-0.273838}, + {0.177952,-1.141694}, + {1.090844,1.147880}, + {0.084762,-0.180105}, + {-0.464588,0.255076}, + {-0.710487,-0.422911}, + {-0.159879,0.388722}, + {0.919932,-0.041034}, + {-0.515947,-0.139864}, + {-0.432913,-0.527550}, + {-0.275296,-1.159533}, + {-0.136299,0.789806}, + {-0.464789,-0.109964}, + {0.939702,-0.027732}, + {0.197460,0.125553}, + {0.360497,-0.081121}, + {-1.038393,0.917326}, + {-0.562256,-0.247960}, + {-0.506010,0.057694}, + {-0.061158,0.007115}, + {1.085933,0.036530}, + {0.782551,0.730841}, + {-1.730593,-0.649685}, + {1.033557,0.042674}, + {1.004293,-0.582702}, + {-0.588062,1.893153}, + {-0.038458,-0.489328}, + {-0.223353,0.176598}, + {-0.602039,-0.177264}, + {0.484092,-0.207521}, + {0.131809,0.406690}, + {-0.420236,2.391833}, + {-1.389783,-0.697870}, + {-1.051676,0.985787}, + {1.027283,0.026054}, + {-0.193866,0.459321}, + {-0.237210,-0.168983}, + {0.034746,0.785979}, + {1.228488,-0.966549}, + {1.189960,0.910590}, + {0.215783,-0.132182}, + {0.865491,1.580951}, + {0.342861,-1.317527}, + {-0.347129,0.117582}, + {0.477505,0.073989}, + {-0.330732,-0.626076}, + {-0.383103,-1.051103}, + {-1.127629,0.266550}, + {0.077820,0.478365}, + {0.979591,-0.218870}, + {-0.666472,0.081770}, + {-0.846640,0.983632}, + {-0.481019,0.374114}, + {0.076811,0.167969}, + {-1.276667,-1.056656}, + {0.884138,1.533002}, + {-0.422899,0.149947}, + {-0.471814,0.310129}, + {-0.294613,0.138715}, + {-0.917606,0.974627}, + {0.338625,0.106750}, + {-0.447939,-0.094187}, + {0.404872,0.074803}, + {-0.759799,-0.426123}, + {-0.788273,0.712513}, + {-0.021566,-0.188178}, + {-0.162962,-1.214495}, + {0.093791,-0.540991}, + {-0.961095,0.434286}, + {0.353384,-1.489342}, + {0.292430,-1.036190}, + {0.150482,-0.471052}, + {0.149233,-0.987746}, + {-0.432685,0.980449}, + {-0.738729,0.443044}, + {-0.038329,0.068701}, + {1.188859,-0.898705}, + {-1.250213,-0.076530}, + {-0.526824,0.334444}, + {-0.464058,0.049049}, + {-0.642591,-0.525583}, + {0.192584,-0.630311}, + {0.437306,0.681520}, + {0.487855,0.369540}, + {0.641239,-0.574243}, + {0.371964,-1.021879}, + {-1.041124,0.131275}, + {-0.691663,0.998510}, + {0.546112,0.831658}, + {1.393481,-0.148050}, + {1.262175,0.248708}, + {0.540609,-0.336198}, + {0.041225,-1.024662}, + {-0.177173,-0.224147}, + {0.867867,-0.187578}, + {-0.967667,-1.219234}, + {0.213381,-0.057988}, + {-0.675667,-1.091565}, + {0.556298,-0.770728}, + {-0.188682,0.656382}, + {-0.092475,0.407926}, + {-1.641683,0.484862}, + {0.190082,-0.330329}, + {0.174209,-0.676685}, + {-0.950743,-0.193766}, + {-0.435225,-0.580076}, + {0.246472,-0.472847}, + {-0.505688,-0.759662}, + {-1.255934,-0.736332}, + {1.935964,0.332194}, + {-0.500932,0.083885}, + {-0.067564,0.231471}, + {-0.379280,0.846503}, + {-0.030848,-0.246677}, + {0.125241,-0.397222}, + {-1.137543,-0.555543}, + {-0.122221,0.387840}, + {2.042492,-1.202247}, + {1.772027,0.326225}, + {-0.550197,0.205095}, + {0.450376,0.791456}, + {-0.506594,0.069919}, + {-0.063568,1.032985}, + {-0.621426,-0.028421}, + {0.043761,-1.038331}, + {-2.012759,-0.886260}, + {-0.144653,-0.613454}, + {1.042293,-0.047165}, + {-0.059067,0.116286}, + {0.148872,-0.095572}, + {-0.573228,-0.480453}, + {-0.200914,-1.046460}, + {-0.824112,1.568436}, + {-0.133283,-0.288869}, + {0.597348,0.377234}, + {-0.505799,1.227439}, + {-0.606898,0.148651}, + {-0.583873,-1.081077}, + {-0.347056,0.271253}, + {0.784106,0.033133}, + {0.184385,0.180992}, + {0.378686,-0.264273}, + {1.264891,1.156455}, + {-0.180967,0.378180}, + {1.185364,2.147560}, + {-0.443654,-0.290601}, + {-1.069806,0.508735}, + {1.608167,1.233684}, + {-0.794538,0.519840}, + {-0.078219,1.219228}, + {0.334451,-0.046541}, + {-0.666285,0.564027}, + {-0.577876,-0.550521}, + {-0.000416,-0.584869}, + {0.624742,-0.128862}, + {-0.205674,-0.383454}, + {-0.377425,0.710460}, + {0.086861,-1.107777}, + {0.781845,-0.797178}, + {0.153671,0.734022}, + {0.009617,-0.036667}, + {0.752946,1.007603}, + {0.471233,0.459138}, + {-0.821665,-0.267974}, + {-0.924172,0.593227}, + {-0.364922,0.183033}, + {0.503286,0.374220}, + {0.817608,-1.185941}, + {-1.068648,0.590834}, + {-0.100083,-0.975689}, + {0.801345,0.166370}, + {0.878885,0.514705}, + {-0.707014,0.403084}, + {0.827796,0.483292}, + {-0.975586,0.279704}, + {0.362153,1.075430}, + {0.799974,0.002309}, + {0.676713,-1.092933}, + {1.578438,0.276312}, + {0.110806,-1.246881}, + {-0.865309,0.165009}, + {-0.282162,0.733062}, + {-0.990404,-0.702353}, + {0.121363,0.147771}, + {0.038031,-0.195024}, + {0.138621,0.371235}, + {0.142721,0.021207}, + {0.268035,-0.692454}, + {0.945280,-0.180407}, + {-0.253126,-1.299034}, + {0.215126,0.964959}, + {0.214474,0.039968}, + {-0.315065,1.317935}, + {-0.495310,0.013483}, + {0.470253,0.354208}, + {-0.089794,0.245806}, + {-0.208178,1.288801}, + {0.753819,-0.739573}, + {-0.885257,-0.056685}, + {0.478816,0.673381}, + {0.388771,0.612329}, + {-0.820496,-1.297063}, + {-1.437975,0.521158}, + {0.271222,-0.170637}, + {-0.400573,-0.022383}, + {-1.216831,-0.194283}, + {1.347498,-0.865849}, + {1.490747,1.638422}, + {-0.066047,-0.399105}, + {-0.420802,1.133171}, + {0.135157,1.573802}, + {0.541187,0.894018}, + {1.510389,0.809415}, + {0.881448,-0.730401}, + {0.296695,-0.733757}, + {0.339736,-1.370242}, + {0.274695,0.252843}, + {-1.281780,0.313851}, + {1.274502,-0.466039}, + {0.808820,-0.486975}, + {0.817662,0.485549}, + {-0.095951,0.029602}, + {-0.110720,0.676979}, + {1.202230,0.782503}, + {0.323406,-0.119733}, + {-0.284233,0.460801}, + {-0.138012,-0.172029}, + {0.660058,-0.652850}, + {0.681055,0.587900}, + {1.034573,-1.401681}, + {-0.803681,0.663399}, + {0.279558,-1.726715}, + {-0.064446,-0.133818}, + {0.111129,-0.818469}, + {-0.109438,0.108017}, + {0.655329,-0.214051}, + {-0.182692,0.983672}, + {-0.386961,-0.148666}, + {-0.520381,0.408330}, + {-0.277355,0.529608}, + {-0.227798,1.212313}, + {0.286884,1.328657}, + {0.330357,0.676798}, + {-0.386855,-0.073008}, + {-0.005346,0.643306}, + {-0.408125,-0.611805}, + {-1.344349,1.214852}, + {0.280046,0.328383}, + {0.193258,0.841163}, + {0.688097,1.470022}, + {-0.543274,0.871549}, + {-0.243657,0.867887}, + {0.031152,0.192752}, + {-1.158627,-1.398383}, + {-0.797943,-0.620853}, + {0.551211,-1.681158}, + {0.057558,-1.031877}, + {-1.029493,0.639438}, + {0.099115,-0.246357}, + {0.343168,0.265658}, + {1.188859,1.031717}, + {0.126086,0.836314}, + {-0.606482,0.051107}, + {0.162957,-0.781010}, + {-0.462344,-0.438913}, + {-0.539638,0.657519}, + {0.022154,0.230604}, + {-0.843574,0.180764}, + {0.398755,-0.125898}, + {0.299966,-0.155337}, + {1.022899,-0.742968}, + {-0.807121,-0.640128}, + {-0.392841,-0.596371}, + {-0.360295,-1.003922}, + {0.679328,-0.665397}, + {-0.072668,1.290516}, + {-0.280499,-0.949490}, + {0.111927,0.581514}, + {-1.363240,-1.343656}, + {-1.084450,0.050768}, + {-0.385367,-0.565308}, + {0.202467,-1.237126}, + {-0.242867,0.417895}, + {-1.545462,-0.660856}, + {-0.215712,0.754475}, + {0.950926,0.189388}, + {-0.907607,-0.356709}, + {-0.018424,-0.492529}, + {0.592479,-0.228064}, + {-0.666301,-0.997495}, + {0.316365,2.371218}, + {0.234107,-0.170388}, + {-0.382072,-0.617266}, + {0.008455,0.054220}, + {0.391055,-0.070040}, + {-1.131104,0.097647}, + {0.114958,0.491805}, + {-1.828644,0.079717}, + {1.282146,0.110291}, + {0.357302,-0.071632}, + {-1.285120,-0.698425}, + {-0.620723,0.250825}, + {-1.580495,0.607744}, + {-0.310391,0.023209}, + {0.659152,-0.517724}, + {0.722716,0.407689}, + {-0.310078,0.307880}, + {-0.515929,-0.421393}, + {0.481648,-0.771808}, + {-0.613531,-0.311456}, + {-0.557038,0.487850}, + {0.240958,1.033137}, + {-0.411849,-0.652721}, + {-1.414977,1.570391}, + {0.198022,0.143388}, + {-0.665199,0.006710}, + {-0.125512,1.145256}, + {0.939666,-0.184737}, + {1.254756,0.210233}, + {-0.414391,-1.647095}, + {0.149630,0.144509}, + {0.288296,0.362648}, + {-0.017046,0.108292}, + {0.500758,1.194654}, + {-0.132504,0.838117}, + {0.436872,-1.259608}, + {0.185786,-0.150289}, + {0.570040,-0.268047}, + {-0.924944,0.709866}, + {0.460708,-0.753595}, + {1.505297,0.124422}, + {0.070403,0.380217}, + {-0.453289,-0.844383}, + {0.339141,0.421633}, + {-0.276216,0.254737}, + {-0.740343,0.477980}, + {-1.140554,0.373471}, + {-0.619092,-0.126768}, + {-0.106514,-0.394367}, + {1.219767,0.408088}, + {0.570849,0.749630}, + {0.279189,0.802048}, + {-1.761637,0.917490}, + {-0.125839,-0.480779}, + {-0.716519,-1.313543}, + {-0.886599,1.677483}, + {0.471796,0.455429}, + {0.472861,-0.700399}, + {0.630634,0.789490}, + {0.388011,0.023963}, + {0.160770,-0.328353}, + {0.684503,-0.912411}, + {-0.613712,-0.942848}, + {0.187679,-1.243436}, + {-0.303386,0.183180}, + {-0.430191,-0.919399}, + {-0.486669,0.017418}, + {-0.196664,-0.596788}, + {-0.016898,-0.305134}, + {-1.003277,0.875101}, + {0.016353,-0.323237}, + {0.821922,0.531172}, + {0.068244,-1.142754}, + {0.564201,-0.493468}, + {-0.108778,-0.451831}, + {-1.104421,-0.533559}, + {-0.190109,1.354647}, + {-1.625892,-0.106572}, + {0.053986,0.048085}, + {-0.078443,-0.504104}, + {-0.981755,0.138946}, + {-0.089922,0.305097}, + {-2.134689,-0.514083}, + {-0.557133,1.367571}, + {-0.124624,0.607339}, + {-1.498195,-1.186483}, + {-0.872943,-0.334031}, + {0.433069,0.253202}, + {0.748849,0.097565}, + {0.431413,-0.732537}, + {0.468929,0.578734}, + {-1.277818,0.672101}, + {0.471820,-0.460997}, + {0.494373,0.102286}, + {-0.141118,0.866229}, + {-0.347544,-0.467992}, + {-0.772585,0.634551}, + {-0.968830,-0.935472}, + {-0.019241,0.227594}, + {-0.813687,0.776289}, + {-0.124640,0.511015}, + {0.045039,0.998667}, + {0.160430,-0.284327}, + {-0.252488,-0.276808}, + {-1.446518,-0.593809}, + {0.444264,-0.215641}, + {-0.495694,1.313423}, + {0.233200,0.628049}, + {1.058397,-0.209975}, + {-0.631813,0.212791}, + {0.724289,0.730092}, + {0.766557,0.140992}, + {-0.422498,-0.065908}, + {0.759667,-0.394613}, + {-0.280825,-0.249983}, + {-0.334594,-0.099555}, + {-0.100845,-0.279454}, + {-0.631641,-0.001709}, + {-0.390891,0.591299}, + {-0.614147,-0.867562}, + {0.794232,0.262570}, + {-0.855585,-0.445803}, + {0.137634,-0.208739}, + {0.735539,-0.285394}, + {0.254964,-1.231606}, + {0.529011,0.143706}, + {1.430450,-0.392117}, + {0.441543,-0.753268}, + {-0.215594,0.692776}, + {0.235193,1.031127}, + {-0.658717,-0.573607}, + {-0.945679,-1.445653}, + {-0.416275,0.659500}, + {0.907194,0.304227}, + {-0.031342,0.374716}, + {0.005759,-0.770302}, + {-0.877440,-0.213883}, + {-0.710438,-0.089993}, + {-0.417193,-0.780149}, + {0.281753,-1.127371}, + {0.074096,0.751776}, + {-1.369300,-0.313873}, + {0.975236,-0.674780}, + {-0.395840,0.453994}, + {0.229087,-0.431998}, + {0.686648,-0.040472}, + {-1.932872,-2.114067}, + {-0.053147,0.889797}, + {1.557776,0.187376}, + {-0.177372,-0.372058}, + {-0.145758,-0.406644}, + {0.893661,-0.736872}, + {0.699794,-0.837986}, + {0.562408,-1.315862}, + {0.248331,0.796103}, + {-0.974681,-0.545749}, + {-0.633997,-0.920930}, + {-0.653344,-0.148806}, + {-0.278669,-1.016823}, + {0.990752,0.282628}, + {-0.002135,0.295268}, + {0.247889,-0.002233}, + {0.299683,0.464098}, + {-0.348562,0.234081}, + {-0.653547,1.042115}, + {1.427451,-0.211486}, + {-0.249740,0.299611}, + {0.236624,-0.236593}, + {0.361321,-0.011710}, + {0.225996,-0.116814}, + {0.665416,-0.154760}, + {-0.343271,0.309692}, + {0.214282,0.840876}, + {0.436174,0.465315}, + {0.491642,-0.396010}, + {-0.840432,0.546308}, + {-0.484284,-0.253952}, + {-0.674070,0.614429}, + {-1.132196,0.300718}, + {-0.686720,-0.668618}, + {-0.209752,-0.193816}, + {-0.864450,0.711636}, + {-0.704162,0.080921}, + {-0.281052,-0.711402}, + {0.476961,-0.296571}, + {-0.567590,0.120557}, + {1.206292,-0.739669}, + {0.073467,0.983447}, + {-0.761649,-0.205547}, + {-0.101813,-0.757212}, + {-0.036924,-1.095216}, + {-0.203280,0.087312}, + {0.419187,0.045301}, + {-0.128742,0.611231}, + {0.002422,-0.752412}, + {0.674792,0.880037}, + {-0.130573,-0.395283}, + {0.043261,0.842507}, + {0.744393,0.440538}, + {0.327633,0.077634}, + {-0.173323,1.100831}, + {-0.364820,0.190809}, + {-0.929120,0.340176}, + {0.083238,-0.252833}, + {-0.812169,1.206466}, + {-0.658568,0.595224}, + {-1.328600,0.526328}, + {-2.155765,1.269370}, + {-0.046160,-0.114023}, + {0.293193,-0.938083}, + {-0.254478,-1.169655}, + {0.586072,0.064899}, + {-0.826939,0.519365}, + {0.000194,-0.042804}, + {0.703387,0.425636}, + {-0.071028,0.344410}, + {-0.690411,-0.426178}, + {-0.305423,-0.957584}, + {0.565793,0.471864}, + {0.572453,-1.210154}, + {-0.176756,-0.543416}, + {-0.122719,0.142358}, + {0.041164,-0.689254}, + {0.488677,0.046068}, + {0.272934,-0.298194}, + {0.056580,-0.113747}, + {-0.586258,-0.393607}, + {0.449298,0.411649}, + {0.222406,0.339896}, + {-0.259049,0.537135}, + {-0.162509,1.788969}, + {0.261787,-1.022771}, + {0.342338,0.185518}, + {0.579314,-0.173051}, + {-0.141523,-0.044285}, + {0.193116,-0.235134}, + {-1.353094,-1.018692}, + {-0.436509,0.480147}, + {0.110273,0.018753}, + {-0.074405,0.256683}, + {-0.246641,-0.072741}, + {0.193535,0.110739}, + {0.236249,0.450123}, + {-1.328284,0.200608}, + {0.203875,0.971534}, + {0.140868,0.836049}, + {-1.180779,-0.571187}, + {0.352527,-0.941286}, + {-0.603336,1.499530}, + {-1.722024,-0.622489}, + {-0.665516,0.309695}, + {-0.196527,0.388266}, + {0.748597,0.328682}, + {-0.700676,-0.457945}, + {0.241755,0.916166}, + {-1.055948,0.612258}, + {-0.088514,-1.051597}, + {-0.666181,-0.503929}, + {-0.373979,0.896727}, + {-0.372882,-0.074176}, + {-0.109262,0.026398}, + {0.140324,0.378864}, + {-0.019849,-1.097344}, + {0.235596,-0.286668}, + {0.782230,-0.389778}, + {0.013781,-0.571368}, + {0.789306,0.647173}, + {0.630138,0.773210}, + {0.750400,-1.183298}, + {-0.682019,-1.609188}, + {0.896088,0.067930}, + {0.420614,-0.078741}, + {-1.496000,0.450049}, + {-0.863680,-0.475229}, + {-1.423561,-0.224888}, + {0.024832,-0.453597}, + {0.737548,0.300150}, + {-0.738513,0.671116}, + {0.789577,-0.557279}, + {0.667659,-0.837533}, + {0.440875,-1.043855}, + {-0.051215,-1.357721}, + {0.359163,-1.468140}, + {-0.336103,-0.186086}, + {-1.253254,0.917832}, + {-0.307426,0.767409}, + {-0.567196,0.228002}, + {-0.028435,0.944140}, + {0.222374,0.474538}, + {1.165054,-0.954027}, + {0.925421,0.519574}, + {-0.072758,-0.302302}, + {0.298489,0.526333}, + {0.559091,-0.004799}, + {0.661053,-0.291473}, + {0.589520,-0.043129}, + {0.486342,-0.102644}, + {0.399697,0.607928}, + {-1.591074,0.238188}, + {0.864441,0.826969}, + {-0.717594,0.995645}, + {0.335125,1.336621}, + {-0.374524,0.390990}, + {-0.010197,0.428746}, + {-0.061779,0.352761}, + {-1.529446,-0.080619}, + {0.588116,1.395893}, + {-0.455056,0.445153}, + {-0.217297,1.396009}, + {-0.657833,-1.016368}, + {-1.806291,0.038937}, + {0.002294,-0.394349}, + {-0.774411,1.119519}, + {-0.807535,0.342889}, + {-0.122509,0.143458}, + {-1.612262,0.133762}, + {-0.704500,-0.634429}, + {0.421355,1.477149}, + {-0.346425,1.488303}, + {-0.320905,1.385086}, + {0.517736,1.018882}, + {-0.698406,-0.561933}, + {0.455363,1.519318}, + {-1.529130,-0.417045}, + {1.090679,1.108610}, + {0.054188,0.538953}, + {0.034975,0.942247}, + {1.127053,-1.169750}, + {0.347556,0.169247}, + {-0.388350,-0.124856}, + {0.119545,0.172064}, + {0.335029,-0.074899}, + {-0.071492,0.385402}, + {0.701349,0.030827}, + {0.272265,0.385385}, + {-1.295989,-0.440285}, + {-0.016185,-0.292499}, + {-0.425862,0.192669}, + {-0.474981,1.023225}, + {0.378090,-0.085647}, + {-1.380673,-0.172079}, + {0.267498,-0.609266}, + {-0.174361,-0.720071}, + {-0.903868,0.497839}, + {-0.754455,0.498984}, + {0.333531,0.300701}, + {0.570416,0.121552}, + {-0.856487,1.273007}, + {0.864065,0.677483}, + {-0.359296,-0.764656}, + {0.373897,-0.165979}, + {0.004695,1.059938}, + {-0.205988,0.159122}, + {0.240554,-0.757747}, + {-2.731705,-1.090066}, + {0.196211,-0.214263}, + {-1.060994,0.303117}, + {0.065935,-1.370273}, + {0.147199,0.460440}, + {-1.434710,-0.211987}, + {0.506390,0.291023}, + {-0.385415,0.150877}, + {-0.058076,0.033607}, + {-0.040447,0.121214}, + {0.217183,0.381020}, + {0.008537,0.171304}, + {-0.793652,0.273910}, + {-0.113031,-0.165199}, + {-0.137888,-0.411958}, + {0.129773,1.543414}, + {0.026013,1.008311}, + {0.859350,0.590368}, + {0.137087,-0.138097}, + {0.273403,-0.938621}, + {0.365497,-0.156764}, + {0.670901,0.144948}, + {0.356986,-0.869288}, + {-0.882520,-0.440277}, + {0.462818,0.724776}, + {-0.573334,-0.513149}, + {-0.216443,-1.260162}, + {-0.037775,0.735246}, + {-0.374519,0.457316}, + {0.058640,-0.761478}, + {-0.440620,-0.890988}, + {-0.052313,-0.360096}, + {-0.537367,0.085238}, + {-0.894927,-0.267870}, + {-0.710221,-0.890203}, + {-1.603747,1.430830}, + {1.840006,1.279425}, + {0.449807,0.176538}, + {0.071127,-0.599730}, + {0.340974,0.830768}, + {0.167339,0.262566}, + {-0.519153,-0.781460}, + {-0.953526,-0.572926}, + {-0.718084,1.342914}, + {0.887380,-0.767601}, + {-0.500773,-1.256327}, + {-0.504054,-0.387444}, + {-0.423248,0.941044}, + {-0.075436,-0.011957}, + {0.778830,-0.741112}, + {0.527124,1.470712}, + {-0.061345,0.245175}, + {-0.108031,-0.165018}, + {0.089631,-0.062024}, + {-0.079677,-0.101521}, + {-0.396044,-0.025846}, + {0.849632,0.900182}, + {0.614655,-0.309219}, + {-0.168051,0.184285}, + {0.629810,-0.125703}, + {-0.626641,-0.299066}, + {-0.766331,0.668178}, + {1.026631,0.970999}, + {1.056465,0.385935}, + {0.034025,0.934794}, + {1.049357,-1.364552}, + {-0.307284,0.554048}, + {-0.124591,0.459456}, + {0.634236,0.196816}, + {0.846920,-0.870074}, + {0.377849,-0.151186}, + {0.010945,0.711493}, + {-0.143725,-0.331314}, + {-0.428652,0.812929}, + {-0.507231,0.476529}, + {0.822266,-0.169064}, + {-0.312591,0.878717}, + {0.126182,-0.185989}, + {1.011325,0.536978}, + {0.511545,1.633077}, + {-1.054305,0.395063}, + {1.824536,0.854489}, + {-1.843423,1.187168}, + {-0.260379,0.320860}, + {0.762158,0.289641}, + {0.273799,-0.015125}, + {0.406928,0.953909}, + {-0.053545,-0.024161}, + {-0.636427,-0.198150}, + {-0.601937,-0.004703}, + {0.117514,-0.399147}, + {0.147300,-0.182524}, + {0.117742,-0.391568}, + {0.598795,-0.217514}, + {-0.530160,-1.275872}, + {-0.448360,0.509787}, + {-0.231334,0.208376}, + {0.653553,-0.510494}, + {-0.469246,-0.599648}, + {0.223253,-0.260082}, + {0.425304,-1.320700}, + {-1.013285,-0.561188}, + {-0.649321,0.686967}, + {-1.283270,-0.227414}, + {-0.186007,0.368703}, + {-0.136933,-0.192889}, + {1.185159,0.545198}, + {1.216968,0.689015}, + {0.910311,-0.002513}, + {-0.253238,-0.334718}, + {-0.272165,0.329764}, + {0.419154,0.171196}, + {0.856108,-0.866033}, + {-0.363408,-1.279964}, + {-0.323154,1.229737}, + {0.515595,0.771904}, + {-0.113071,0.472993}, + {-1.090156,-0.702003}, + {-0.615317,0.258520}, + {-1.389988,0.090579}, + {0.227189,1.873838}, + {0.238943,1.189236}, + {0.997707,-0.750336}, + {-0.168988,1.198045}, + {-0.908115,-0.325316}, + {-0.276129,-0.887500}, + {-0.193721,0.061984}, + {0.372694,-1.067987}, + {-0.021077,-1.086837}, + {-0.355942,-0.129020}, + {0.601311,0.890568}, + {0.458201,0.949799}, + {0.477640,0.087344}, + {0.024384,0.268283}, + {-0.314620,0.511970}, + {0.208499,-0.010617}, + {1.054139,-0.793165}, + {0.712241,0.313028}, + {0.095001,0.032736}, + {-0.050507,-0.099467}, + {0.966046,-0.046950}, + {0.735177,-0.035276}, + {1.216582,-0.536102}, + {0.579388,0.044030}, + {-0.031001,-1.871012}, + {1.061978,-0.288872}, + {-0.504246,-0.401761}, + {-0.562567,-0.284664}, + {-0.275011,-0.021875}, + {-0.393798,0.931489}, + {0.006711,0.841041}, + {0.402936,0.199119}, + {0.107574,-1.388760}, + {-0.230410,0.022241}, + {-0.191842,-1.192988}, + {1.171249,0.021609}, + {0.716926,0.486816}, + {0.145686,0.517127}, + {-1.328921,0.377331}, + {0.851484,-1.077027}, + {-0.182252,-0.973016}, + {0.547530,0.307628}, + {0.752337,0.227463}, + {-0.943868,-1.105141}, + {0.051322,1.847229}, + {0.162891,1.662704}, + {0.215910,0.074535}, + {0.968104,-0.819955}, + {0.398545,0.106263}, + {0.311276,0.300695}, + {0.553913,1.407050}, + {-0.074835,-0.314706}, + {-0.756606,-0.249815}, + {-0.007184,0.241820}, + {-0.903521,-1.140063}, + {-0.347949,0.735517}, + {-1.520924,-0.054318}, + {-0.336836,-1.417745}, + {0.668140,-0.550144}, + {-0.813826,-0.378920}, + {-1.142460,-0.895100}, + {-0.464542,0.305670}, + {-0.803636,0.464800}, + {-0.519269,0.330770}, + {-0.744446,0.223551}, + {0.133873,0.641134}, + {-0.234319,-0.617046}, + {0.237105,0.190497}, + {-0.207124,0.186992}, + {-0.222716,-0.026379}, + {0.616382,0.940631}, + {-0.202311,0.380659}, + {0.365658,0.144009}, + {1.794867,-0.495343}, + {0.500606,-0.433379}, + {0.363196,-0.689170}, + {-0.025768,0.286324}, + {-0.868493,1.012894}, + {0.110665,-0.207569}, + {-0.041372,1.248633}, + {0.885087,-0.488457}, + {0.910808,0.069023}, + {0.693604,-0.067264}, + {0.566380,0.592366}, + {1.130313,-0.894986}, + {0.853269,1.224186}, + {0.451775,0.907155}, + {-0.899638,-0.755130}, + {0.009159,-0.715130}, + {0.725935,-0.067967}, + {-0.648557,-0.976766}, + {-0.215151,-0.130206}, + {-0.882912,1.101720}, + {0.549423,1.141824}, + {0.091037,-1.123045}, + {0.851998,-1.088543}, + {0.671949,-0.768697}, + {-0.026212,-0.142371}, + {0.188458,0.044498}, + {1.035851,0.732378}, + {0.496930,0.763086}, + {0.620814,-0.084441}, + {-0.816705,-1.005846}, + {0.129933,0.607144}, + {-0.335244,0.079260}, + {0.062206,0.842265}, + {0.342883,0.267645}, + {-0.570073,0.645440}, + {-0.179948,-0.386216}, + {-0.767378,0.206902}, + {0.759143,-0.306648}, + {0.482275,0.475103}, + {0.825030,-0.514951}, + {-1.028938,-0.819744}, + {1.732835,0.066877}, + {0.450762,-0.541033}, + {-0.616540,-0.408825}, + {0.089601,-0.831240}, + {-0.716228,-0.620456}, + {-0.045554,1.373536}, + {0.723475,0.165982}, + {0.238882,-0.391897}, + {1.879258,0.418675}, + {-0.908657,0.808384}, + {-0.286725,0.203416}, + {0.622622,1.988791}, + {-0.204689,0.503124}, + {-0.840514,-1.052989}, + {0.109104,-0.491465}, + {-0.458429,-0.890611}, + {-0.040308,0.387025}, + {0.334213,0.845817}, + {-0.485131,1.161892}, + {-0.154884,-0.021494}, + {0.901447,0.368832}, + {-0.577289,0.422688}, + {0.066667,0.480205}, + {0.497143,1.273457}, + {0.411773,-0.013752}, + {0.663922,0.240592}, + {0.147365,-0.939324}, + {0.265064,-0.679686}, + {0.080121,-0.490473}, + {0.405063,-0.141264}, + {1.250869,-1.013448}, + {-1.771650,-0.026840}, + {-0.214699,-0.238854}, + {0.153398,0.152295}, + {-0.332406,0.850663}, + {0.082405,0.034282}, + {-0.778027,1.776842}, + {1.119535,0.093578}, + {0.405343,0.144457}, + {0.318296,-1.045619}, + {0.894029,-0.789367}, + {-0.705205,-0.559302}, + {-0.583245,-0.587218}, + {-1.732809,0.502952}, + {-0.072216,-0.619449}, + {-1.005389,-1.337074}, + {-0.925036,-1.050076}, + {-0.849897,1.451525}, + {-0.640269,-0.536556}, + {0.280792,-0.596720}, + {-1.731763,-1.392341}, + {0.225837,-1.310780}, + {-0.855570,0.357171}, + {-0.596824,0.705603}, + {1.015263,-0.013845}, + {-1.378102,-0.871470}, + {-0.037446,-0.148328}, + {-1.100256,-0.404901}, + {0.618017,-0.193406}, + {-0.165397,0.385855}, + {1.048162,1.070281}, + {0.913836,0.796236}, + {-0.470200,-0.595482}, + {0.435984,0.550976}, + {0.991639,0.713741}, + {1.354705,0.236459}, + {-0.514888,0.034946}, + {0.447832,-0.324686}, + {-0.324818,0.064890}, + {0.512776,-1.010271}, + {0.644555,1.172259}, + {-0.884525,0.399588}, + {0.106287,-0.599133}, + {0.245535,0.597192}, + {-0.128277,0.432917}, + {0.307422,-0.650546}, + {0.870460,0.392310}, + {-0.236295,0.161812}, + {-0.905288,0.260416}, + {-0.288011,-0.014239}, + {-0.391415,-0.625783}, + {1.255478,-0.407403}, + {1.023093,0.311064}, + {0.059888,-2.054203}, + {0.200850,0.982033}, + {0.936100,0.701518}, + {-0.629761,0.267995}, + {1.891356,-0.312648}, + {0.084493,0.120200}, + {0.658455,0.408385}, + {0.401558,-0.236054}, + {0.213266,-0.339748}, + {0.249614,1.030643}, + {0.861996,-0.401135}, + {-0.645997,-0.919200}, + {0.345041,-0.019794}, + {0.422888,-1.570761}, + {-0.728576,-0.302344}, + {0.698979,0.162284}, + {0.432374,-0.278804}, + {0.288216,-0.280750}, + {0.692058,-0.788072}, + {-0.513736,0.160921}, + {-0.484442,0.091290}, + {0.217502,0.258031}, + {-0.564786,-0.078785}, + {0.773842,-0.205731}, + {0.496951,0.661244}, + {0.703862,0.256431}, + {0.417277,-0.643702}, + {0.030253,0.964357}, + {0.487751,-0.148838}, + {0.603282,0.729704}, + {0.623268,-1.087961}, + {0.673468,0.933167}, + {-0.456305,0.170897}, + {-0.397510,-0.674178}, + {-0.320248,0.681368}, + {0.138825,0.000576}, + {-0.706556,0.500306}, + {-0.180191,-0.216743}, + {-1.383253,0.599270}, + {-0.024074,0.774923}, + {0.117188,0.327920}, + {-0.897107,-0.217729}, + {0.780948,-1.488166}, + {-0.189833,-1.665574}, + {0.160742,0.396893}, + {0.132436,-0.269463}, + {-0.477604,0.319153}, + {-1.594824,-0.229696}, + {-1.033510,0.226079}, + {-0.375408,0.377189}, + {0.203341,-0.627341}, + {0.000475,-0.876883}, + {-0.354389,-0.692829}, + {0.902375,0.537518}, + {0.765544,1.350291}, + {0.617121,0.549060}, + {0.191055,-1.656615}, + {-0.637320,0.461113}, + {-0.139140,0.405568}, + {0.338228,0.190319}, + {-0.111718,0.427500}, + {-0.607051,-0.223998}, + {-0.256013,-0.126726}, + {-0.460717,0.657032}, + {-0.264035,0.642030}, + {-0.480224,-0.125524}, + {-1.104871,-1.244684}, + {0.794316,-0.618685}, + {-1.325048,0.625898}, + {-0.609105,-0.317561}, + {-0.110370,0.574926}, + {-0.079341,-0.941059}, + {1.123131,0.516150}, + {0.646988,-0.799697}, + {-0.528347,0.716934}, + {-1.297124,0.049700}, + {0.952649,-0.161405}, + {0.104493,-0.030703}, + {-1.168308,1.727449}, + {0.676470,0.693357}, + {-0.412443,0.253094}, + {-0.447798,0.038550}, + {-0.228133,0.125712}, + {0.274084,-0.664014}, + {-1.273383,-0.516870}, + {0.331193,-0.663290}, + {0.834921,-1.083132}, + {-0.016795,0.063665}, + {0.463293,0.100810}, + {-0.222092,-1.166433}, + {-0.045631,-0.035269}, + {-0.045329,-0.674897}, + {-0.784392,-1.057570}, + {-0.329826,0.339698}, + {1.178970,0.965670}, + {-0.300943,-0.650654}, + {0.152251,-0.474047}, + {-0.578936,-0.462915}, + {0.349399,-0.057776}, + {0.102065,-0.396655}, + {0.217686,0.393256}, + {-1.565998,-0.678150}, + {-0.317381,0.390873}, + {0.032866,0.637578}, + {-0.462473,-1.228468}, + {0.037433,-0.126953}, + {-0.219955,-0.079598}, + {0.986041,-0.242647}, + {0.981236,-0.308921}, + {-0.714607,0.747562}, + {0.878252,0.290233}, + {-0.013550,-0.801533}, + {-0.837193,-0.073407}, + {0.004598,-0.299227}, + {0.718243,-0.521436}, + {-1.411477,0.345819}, + {-0.185560,0.407726}, + {-0.645613,0.341977}, + {-0.144282,-0.130033}, + {0.170185,0.210823}, + {0.648260,0.522148}, + {0.163927,0.452781}, + {0.091997,-1.512229}, + {-0.925560,0.389415}, + {0.396382,-0.605291}, + {-0.206984,0.810648}, + {0.605544,-0.329259}, + {-0.496895,-0.433621}, + {0.821201,-0.159951}, + {-0.287604,-0.461316}, + {0.269550,-0.172898}, + {0.223504,-0.519438}, + {-1.219596,-1.509329}, + {-1.177703,0.106731}, + {-0.614510,-2.303451}, + {-0.508790,-0.814873}, + {-0.235748,-0.655716}, + {0.675918,0.241968}, + {0.848823,0.109502}, + {-0.339173,0.251667}, + {-0.907714,0.025476}, + {1.135073,-0.983344}, + {0.597885,0.092979}, + {0.775967,0.017399}, + {-2.228663,-0.026600}, + {0.991905,1.087891}, + {-1.345601,0.617191}, + {0.369217,-0.003157}, + {0.380365,-0.183456}, + {1.141741,-0.120062}, + {0.208724,0.917995}, + {-0.751646,1.025081}, + {-0.244497,-1.070647}, + {-0.426150,-0.441223}, + {-0.083133,0.600314}, + {-0.639394,-0.449710}, + {-0.227868,-0.052185}, + {0.039466,0.902238}, + {-0.228256,0.424697}, + {-1.264894,1.007502}, + {0.025662,-1.050856}, + {-0.853853,-0.077905}, + {-0.283073,0.020308}, + {0.102863,0.285404}, + {-0.729183,-0.883586}, + {0.488278,-0.537274}, + {-0.638371,0.705178}, + {0.257958,0.187060}, + {1.876355,-0.296744}, + {-0.029220,0.081046}, + {-1.202058,0.013792}, + {0.143679,-0.221348}, + {0.813612,1.334167}, + {-0.308881,0.009709}, + {0.744881,0.191344}, + {0.703735,0.479720}, + {0.916091,0.301598}, + {0.229351,0.527300}, + {0.608015,1.084639}, + {-0.028380,0.179041}, + {0.741942,0.210321}, + {-0.441117,2.019392}, + {0.287010,1.148982}, + {0.751560,-0.634404}, + {0.633605,-0.574008}, + {0.254998,0.117379}, + {1.321661,-0.738031}, + {-0.086967,-0.576727}, + {0.357126,0.432979}, + {-0.743290,0.811585}, + {-0.501911,0.783671}, + {-0.187481,0.444391}, + {0.175805,0.576845}, + {0.749123,0.582751}, + {-1.669288,-1.212711}, + {-0.024771,0.530228}, + {-0.600212,0.278748}, + {0.380659,0.552119}, + {-0.054384,-0.183081}, + {-0.577043,1.758637}, + {-1.290098,-0.034919}, + {-0.626743,-0.901914}, + {0.548593,0.563251}, + {-1.189395,-0.111436}, + {0.672192,0.884066}, + {0.490141,-0.258325}, + {1.522702,-0.355020}, + {0.280899,0.463460}, + {0.297340,-0.975150}, + {-0.783965,-0.193888}, + {0.116301,-0.696152}, + {-0.613030,0.111460}, + {-1.438732,-0.335699}, + {0.152343,0.580044}, + {0.174164,-0.175062}, + {-0.148853,-0.874012}, + {0.175072,0.017771}, + {0.358267,0.083250}, + {-1.047536,0.175354}, + {-0.048482,-0.104485}, + {0.180338,0.466878}, + {-0.062379,-0.997160}, + {-0.737199,-0.210693}, + {0.536667,0.012390}, + {0.013080,-0.896293}, + {-1.111020,0.036888}, + {-0.592474,-0.623239}, + {-0.587658,-1.419053}, + {0.481731,0.315493}, + {0.239846,0.451458}, + {-0.107999,-0.142484}, + {-0.238403,0.700594}, + {0.326648,0.295695}, + {0.709781,-0.414870}, + {-0.303296,-0.812312}, + {0.605543,-1.441576}, + {0.046576,0.392842}, + {0.391747,1.805781}, + {-0.610474,-0.502987}, + {-0.084417,-0.635316}, + {-0.117791,-0.511594}, + {1.263054,-0.152197}, + {0.036088,-1.413123}, + {-1.142865,0.441812}, + {0.670441,-1.734080}, + {-0.655343,-0.321802}, + {0.441931,-0.212622}, + {0.368448,-1.376489}, + {0.216562,-0.500590}, + {0.430320,0.433900}, + {0.910263,0.145197}, + {0.261373,-0.024356}, + {-0.931035,-1.031641}, + {0.071638,-0.030381}, + {1.047164,-0.390936}, + {0.786061,0.374129}, + {0.399636,-0.470714}, + {-0.828217,0.411402}, + {0.402586,0.304012}, + {0.173574,-0.061146}, + {0.718928,0.903788}, + {0.757697,-0.340347}, + {0.311022,-0.630422}, + {-0.320119,0.438468}, + {0.213126,0.315590}, + {-0.367474,-0.858977}, + {-0.364710,-0.211865}, + {-0.088531,-0.338955}, + {-0.426875,-1.259798}, + {0.017767,0.903531}, + {-1.317742,-0.291868}, + {-0.021616,-0.223357}, + {-0.466416,-0.982947}, + {-0.723046,-0.216801}, + {-0.506496,-1.256971}, + {-0.876586,-0.668156}, + {0.799653,0.883145}, + {-0.116016,-0.230735}, + {0.153892,0.245910}, + {-1.493473,-0.543369}, + {-0.104258,0.937885}, + {0.145870,-0.862457}, + {0.004280,0.091261}, + {-0.201859,0.062320}, + {1.434108,0.390146}, + {0.223945,-0.417881}, + {-1.429893,-0.221635}, + {-0.263642,-0.043051}, + {-0.301817,-0.656976}, + {-0.055533,-0.422469}, + {-0.170936,0.094114}, + {0.920585,-0.536474}, + {-0.244583,0.125218}, + {-0.398405,-0.673800}, + {-0.648268,-0.174215}, + {0.104402,-0.545924}, + {1.039966,-0.450643}, + {0.454026,-0.007051}, + {-1.348483,0.435892}, + {-1.154315,0.012219}, + {0.586239,-0.790228}, + {0.420334,-0.425579}, + {-0.695935,0.400174}, + {-0.324462,-0.569611}, + {-0.891715,1.286844}, + {-0.225809,-0.497207}, + {-0.877583,-0.401090}, + {-0.230709,-0.162162}, + {0.040464,0.348907}, + {-0.431771,0.340009}, + {0.045460,-0.714410}, + {-0.216520,-2.046873}, + {0.804486,0.379955}, + {0.107529,0.317036}, + {0.349638,-1.542756}, + {0.112593,0.633379}, + {0.245919,-1.442921}, + {1.226988,0.413531}, + {-0.216186,-1.098418}, + {-0.592056,-0.703833}, + {-0.461250,1.152356}, + {-0.451106,-1.041155}, + {0.758497,-0.026281}, + {0.580829,0.434704}, + {-0.244442,-1.287007}, + {0.871367,-0.668387}, + {-0.252397,-0.492179}, + {-0.105915,0.221225}, + {-0.396868,0.424444}, + {0.468587,-0.808788}, + {-0.332904,0.334434}, + {-0.300457,-0.004120}, + {0.200741,0.652505}, + {-0.290567,0.311535}, + {-0.596088,-0.685691}, + {0.383474,-0.564410}, + {0.365202,-0.520154}, + {0.303368,0.394516}, + {0.156166,0.414418}, + {-1.362271,-0.651302}, + {-0.565455,0.543162}, + {-0.528145,0.145123}, + {-1.176076,-1.178721}, + {0.086984,-0.105966}, + {-0.021746,-0.978670}, + {0.518625,0.155903}, + {-1.258329,0.223466}, + {0.130332,-0.419232}, + {0.563122,0.231711}, + {0.306401,-0.507524}, + {-1.053291,1.560204}, + {0.047668,0.546148}, + {0.948363,0.284353}, + {0.672895,0.507781}, + {-1.334744,-0.168633}, + {-1.208243,0.148212}, + {-0.848912,0.415874}, + {0.843947,0.736823}, + {-1.158485,0.210237}, + {-0.099862,1.120765}, + {0.337771,0.007164}, + {-0.469080,0.520155}, + {-0.100074,-1.349217}, + {-0.157844,0.287353}, + {-0.779996,0.294751}, + {0.073369,0.492718}, + {-0.464267,0.726453}, + {-0.462696,-0.741070}, + {0.023056,1.172214}, + {0.224251,0.025615}, + {-0.336091,-0.276409}, + {0.473509,-0.561504}, + {0.845649,-0.907685}, + {0.627133,-0.351774}, + {-0.990811,-0.590419}, + {-0.172712,-0.470133}, + {0.723323,-0.199676}, + {-0.307695,-0.713114}, + {-0.083497,0.329677}, + {-0.518250,0.421263}, + {0.084627,0.104033}, + {-0.333341,0.047107}, + {-1.401702,0.346693}, + {-1.554243,-0.861078}, + {0.326409,-0.263726}, + {-0.100557,-0.931537}, + {1.703162,0.946824}, + {-0.198882,-0.911880}, + {-0.506174,-0.771035}, + {-0.827505,0.609437}, + {0.673322,-0.205578}, + {-0.806857,-0.975934}, + {0.294299,0.863600}, + {-0.008905,0.140791}, + {-0.175659,-0.263704}, + {0.242597,-0.175465}, + {0.581556,-0.693348}, + {0.221080,-0.123343}, + {0.864177,1.380508}, + {-0.485638,-0.235111}, + {0.019145,-0.507227}, + {1.115591,1.035217}, + {-1.242264,-0.613672}, + {0.528370,0.525414}, + {-0.389619,-0.519511}, + {-0.156849,-0.205102}, + {-0.985984,-1.423871}, + {0.517087,-0.357108}, + {-0.199417,-0.794782}, + {0.201648,-0.957863}, + {0.127940,-0.981328}, + {-0.892293,-0.484381}, + {-0.246429,-0.134570}, + {-1.208455,1.697750}, + {0.005429,0.475156}, + {1.495576,-0.048856}, + {-0.532713,0.246399}, + {0.020822,0.397247}, + {-0.943340,0.215974}, + {0.091969,0.698433}, + {-0.605709,-0.662562}, + {-0.662931,0.331181}, + {0.510917,-0.498797}, + {-0.070321,-0.339604}, + {-0.828848,0.232796}, + {0.637634,0.622874}, + {-0.384873,0.201997}, + {0.762228,-0.732545}, + {-0.051603,-0.149058}, + {0.029130,0.529245}, + {0.834301,0.594478}, + {-0.261223,-0.069449}, + {-1.302920,-0.290366}, + {-0.609619,-0.588839}, + {0.497506,0.424783}, + {-0.187720,0.612541}, + {0.017128,0.698742}, + {-1.811540,-0.055316}, + {0.862133,-1.369530}, + {1.262000,-0.131324}, + {1.156433,0.484189}, + {-0.076493,-0.424579}, + {-0.130062,1.379691}, + {0.833397,0.567487}, + {0.078902,0.473863}, + {0.055890,-0.769505}, + {0.060725,-0.404843}, + {0.000445,0.737484}, + {-0.625014,-0.395060}, + {-0.753279,-0.276740}, + {1.520089,1.037106}, + {-0.319487,1.277601}, + {0.118810,1.297974}, + {-0.215298,-0.455871}, + {0.254708,0.218111}, + {0.418569,-0.707815}, + {-1.185689,0.006936}, + {0.123850,0.442040}, + {-0.408899,0.843042}, + {-0.086253,-0.322820}, + {-1.244809,-0.408063}, + {-0.152610,0.218428}, + {-0.304509,0.721444}, + {-0.223893,-0.198213}, + {0.161462,0.965719}, + {-0.016545,-0.046833}, + {0.014223,0.409396}, + {1.975500,-1.416411}, + {0.987470,-0.295333}, + {1.392536,-0.339042}, + {-1.772024,1.071792}, + {0.561628,0.260545}, + {-0.614207,0.253911}, + {0.255899,0.338669}, + {-0.545300,0.377977}, + {-0.781682,-0.308513}, + {-0.473559,0.115544}, + {0.970356,0.389522}, + {1.340998,0.204031}, + {0.636971,-0.691872}, + {1.087438,-0.703128}, + {0.335864,-0.678190}, + {-0.567828,-0.567210}, + {-0.650808,0.427866}, + {-0.267197,-0.819795}, + {-0.757122,-1.946263}, + {-0.479753,-0.686059}, + {-1.058098,-0.284788}, + {-0.601739,-1.515210}, + {0.613674,0.326730}, + {1.501791,-0.056387}, + {-0.990549,0.002105}, + {-0.865560,-0.308869}, + {0.464395,-0.231092}, + {-0.644999,0.444856}, + {0.545002,-0.193149}, + {0.447797,-0.492268}, + {-0.421009,-0.021117}, + {-0.190813,0.311118}, + {0.467296,0.294717}, + {0.154595,1.419043}, + {0.281873,0.405801}, + {-1.053144,0.367926}, + {0.048581,1.905063}, + {-0.637562,-0.469837}, + {0.650205,-1.538225}, + {-0.885319,-0.085329}, + {-0.052037,0.098850}, + {-1.205488,0.099386}, + {1.421300,-0.337389}, + {0.163746,1.595691}, + {0.316168,0.058669}, + {0.901451,-0.757891}, + {0.374950,0.220098}, + {0.289515,-0.754124}, + {-0.344068,-0.343308}, + {0.232374,0.263313}, + {2.246893,0.378554}, + {-0.376969,0.322563}, + {0.709981,-1.565807}, + {-0.784404,0.311436}, + {-0.414114,0.191005}, + {-0.912873,-1.111710}, + {0.022198,1.018839}, + {-1.388431,-0.029500}, + {1.318379,0.695939}, + {0.832088,-0.225946}, + {-0.685464,1.189551}, + {-1.724108,0.128743}, + {-0.267640,0.820472}, + {0.369300,1.266272}, + {-0.485413,-1.174063}, + {-1.258036,0.730961}, + {-1.037161,-0.806028}, + {-1.128983,-0.308337}, + {0.655767,-0.390841}, + {-0.343421,0.248034}, + {0.458703,-0.580272}, + {-0.309516,-0.875010}, + {0.612543,0.577868}, + {0.291884,0.221870}, + {0.556053,0.899818}, + {-0.155180,-0.104632}, + {0.342271,0.297307}, + {0.201082,0.328868}, + {1.519672,-1.255112}, + {-0.277044,0.809604}, + {-0.983866,-0.270883}, + {-0.252473,0.652332}, + {0.320750,0.253181}, + {0.439080,-1.174365}, + {0.577125,0.328839}, + {0.900496,0.913433}, + {0.217882,-0.002589}, + {-0.005437,-0.172455}, + {0.777052,-0.589731}, + {-0.319754,-0.552669}, + {0.663022,0.005191}, + {-0.444068,0.973952}, + {-0.284655,0.373087}, + {-0.653444,0.000541}, + {0.937499,-0.190486}, + {-0.353436,-0.421615}, + {-0.586946,1.251421}, + {-0.106296,-0.907972}, + {-0.133041,-1.699473}, + {-1.323406,1.678851}, + {0.297010,-1.495266}, + {-0.282727,-0.006885}, + {2.101317,-0.581565}, + {-0.386652,0.065565}, + {-0.086661,0.930770}, + {1.072493,-0.689899}, + {-1.072787,1.386659}, + {1.079130,0.126657}, + {-0.255408,-0.604117}, + {0.923296,0.431058}, + {0.884115,0.288090}, + {-0.783201,-0.804343}, + {-1.563031,0.029382}, + {-0.366755,0.047618}, + {0.931579,0.790832}, + {0.079395,-1.064498}, + {-0.576885,-1.423422}, + {1.061247,-0.359222}, + {-0.079346,-0.583210}, + {-0.513897,-1.038086}, + {-0.306731,-0.347102}, + {-0.303644,0.082931}, + {1.070749,0.846657}, + {0.596321,-0.863198}, + {-1.493087,0.752431}, + {-0.326493,-0.259466}, + {0.762672,0.637558}, + {0.470650,-0.475920}, + {1.217709,1.223485}, + {-0.105262,0.348860}, + {0.809125,0.110621}, + {0.705164,-0.451192}, + {0.256454,0.998392}, + {-0.182322,-1.808778}, + {0.132926,-0.046858}, + {-0.115529,-0.094157}, + {-0.386512,-0.427899}, + {1.703266,0.413302}, + {1.689060,0.300520}, + {-0.746970,-0.620105}, + {0.331307,1.166821}, + {-1.642881,-0.355440}, + {0.284702,-0.125837}, + {-0.942006,0.609114}, + {0.490133,-0.550940}, + {0.479289,0.712846}, + {-0.733015,1.085078}, + {1.342473,0.807258}, + {-0.139847,-0.210786}, + {-1.019707,-0.083367}, + {-0.515722,-0.667669}, + {-0.490205,0.536208}, + {1.137698,-2.187429}, + {0.689605,-0.279192}, + {-0.758482,-1.078222}, + {-0.062444,-1.440962}, + {-0.959758,-0.131322}, + {0.578693,1.089248}, + {-0.447809,0.153117}, + {-0.380639,0.131958}, + {0.663486,0.877594}, + {0.280871,-1.058013}, + {-0.699962,0.353879}, + {-0.162627,0.269167}, + {-0.204061,0.751909}, + {0.209289,-0.584008}, + {0.284208,0.331193}, + {0.885480,0.772389}, + {-0.252435,-0.861216}, + {1.302831,0.447444}, + {0.039083,-0.234160}, + {-0.935810,-0.162396}, + {0.125644,0.184471}, + {0.445812,-1.213550}, + {-1.380393,0.775430}, + {-0.188419,0.701213}, + {0.684211,-0.154271}, + {-0.182573,0.039267}, + {0.811469,-0.969950}, + {-0.778200,1.188098}, + {-0.049732,-0.445024}, + {-0.852271,-0.949873}, + {0.086241,-0.750884}, + {-0.096712,-1.624033}, + {-0.400723,0.228941}, + {1.049161,-2.253919}, + {-0.058805,-0.708923}, + {-1.286261,-1.145985}, + {-0.215680,0.977318}, + {-1.137437,0.643552}, + {0.648707,0.534293}, + {-0.097589,0.270605}, + {-0.536918,0.019383}, + {0.467302,0.109569}, + {-1.583003,-0.761356}, + {-0.935186,-0.891575}, + {-0.514207,0.428989}, + {0.765034,-0.341230}, + {0.067731,0.661021}, + {-0.145722,0.204315}, + {-0.062658,0.608009}, + {0.471454,0.095159}, + {-0.452387,1.030955}, + {0.553401,-0.726777}, + {0.622963,0.530085}, + {0.208907,1.294012}, + {-0.324651,1.366459}, + {-0.576267,-0.393594}, + {-1.011991,0.804189}, + {0.737499,0.822178}, + {0.481131,-0.143674}, + {-0.684440,0.644153}, + {0.794158,-0.398822}, + {0.568346,0.400063}, + {0.913021,-0.104825}, + {-0.181232,-0.575912}, + {-1.186140,0.417101}, + {0.311493,0.955016}, + {0.331007,1.201278}, + {0.208202,0.031411}, + {0.463080,0.501488}, + {0.482757,0.079090}, + {-0.880469,0.584826}, + {-0.159840,-0.023861}, + {0.845792,-0.498914}, + {1.200194,-0.998738}, + {-0.687638,0.627621}, + {0.834554,-0.044152}, + {-0.567932,0.022438}, + {0.649994,-0.451273}, + {1.550910,0.386612}, + {0.643220,-1.226031}, + {-0.084707,0.483131}, + {1.142138,-0.495484}, + {0.591518,0.600105}, + {0.909766,-0.968842}, + {-0.318164,-1.216190}, + {-0.002672,0.682111}, + {0.303462,-0.734521}, + {-1.328197,-0.512260}, + {0.142123,-0.446938}, + {-0.563399,-0.108576}, + {-0.595759,0.432539}, + {0.140978,-0.820013}, + {0.691118,-0.298545}, + {-0.892137,0.532776}, + {0.882700,-0.514615}, + {-1.126496,-0.553388}, + {-0.366223,0.264003}, + {1.216088,-0.643513}, + {0.144411,0.190855}, + {-0.513814,1.301282}, + {-0.139218,-1.666939}, + {-0.873328,1.087577}, + {0.368330,-0.436673}, + {-0.799562,0.387875}, + {1.105326,0.374214}, + {0.212973,0.611913}, + {-1.233469,-0.191584}, + {-0.678596,-0.747265}, + {-1.464750,0.891797}, + {-0.103633,0.529639}, + {0.946408,0.704495}, + {-0.247739,0.650610}, + {0.314285,-0.478465}, + {-0.801484,-1.330346}, + {-0.474770,0.029146}, + {0.156161,0.354246}, + {-0.514883,0.437114}, + {-0.723243,-0.302359}, + {-0.623393,-0.064006}, + {0.668911,0.512527}, + {-0.200754,0.270304}, + {1.274333,-1.593959}, + {-0.433487,-0.077630}, + {1.022869,-0.724708}, + {1.302765,-0.324157}, + {0.048530,0.524041}, + {0.580503,0.255952}, + {0.871851,-0.571890}, + {-1.320527,0.372024}, + {-0.837724,-1.330308}, + {-0.130319,1.947338}, + {-0.966811,-0.248498}, + {-0.980519,0.121219}, + {-0.928127,0.014107}, + {0.784902,-0.292815}, + {-0.001154,0.102495}, + {0.174204,-0.798143}, + {-0.616828,-1.187243}, + {0.901858,0.095972}, + {-0.036058,-0.624901}, + {-0.136308,0.048002}, + {0.724986,0.204018}, + {-0.290315,-0.226273}, + {-0.937261,0.310854}, + {1.350983,1.247481}, + {0.132400,-0.117268}, + {-0.433586,0.672210}, + {0.427985,1.263974}, + {0.053098,-0.134753}, + {0.145390,-1.579824}, + {-0.466987,-0.271971}, + {-0.452877,-0.054139}, + {-0.137701,-0.493978}, + {0.449226,0.123858}, + {0.641004,-1.580859}, + {0.732717,0.424758}, + {-1.191464,-0.668713}, + {-0.068454,-1.558817}, + {-1.255019,0.090546}, + {0.133334,-0.672320}, + {-0.357994,-0.062960}, + {-0.179648,-0.136934}, + {-1.405926,-0.152062}, + {-0.122649,-0.447278}, + {-0.956039,0.706032}, + {-0.577964,0.702715}, + {-1.092396,-0.224851}, + {-0.080453,0.539972}, + {0.941582,0.526443}, + {-0.245442,-0.421211}, + {-0.655510,0.175952}, + {0.090653,0.356258}, + {0.597282,0.245042}, + {-1.281953,1.174625}, + {0.246278,0.484865}, + {-2.421806,-0.626013}, + {-0.515321,0.348373}, + {0.100784,-0.155870}, + {-0.518027,-0.137351}, + {-1.091217,0.932436}, + {0.298705,0.215227}, + {-0.032357,0.318942}, + {-0.028669,0.835347}, + {-0.164235,-0.633671}, + {-0.978889,0.405411}, + {-0.366083,-0.163942}, + {-0.367713,0.709928}, + {-0.245638,-0.099905}, + {-0.171231,0.640628}, + {-0.531550,-0.252464}, + {-0.460142,1.860309}, + {-1.486483,-0.241096}, + {-1.050993,-0.330973}, + {0.877660,0.278261}, + {0.471375,0.863250}, + {0.815270,0.878291}, + {-1.064940,1.248690}, + {-0.069835,-0.017150}, + {1.102388,0.275357}, + {1.179494,0.240331}, + {-1.664730,-0.144800}, + {-0.236780,-0.450388}, + {0.727520,-0.630164}, + {-0.976490,-0.375161}, + {1.003983,-1.257875}, + {-0.358144,-0.688150}, + {0.425984,0.320394}, + {0.145065,-0.070437}, + {-0.791365,-0.328291}, + {0.251614,-0.243055}, + {-0.393163,0.191665}, + {-0.150863,-0.584294}, + {-0.673513,-0.686572}, + {-0.402621,-0.474615}, + {-1.157962,-0.033111}, + {0.452590,-1.526519}, + {0.021951,-0.726401}, + {-0.912745,0.826707}, + {-0.372052,0.412758}, + {0.777297,-0.106160}, + {-0.135258,0.030331}, + {-0.109689,-0.926576}, + {0.683335,-1.604886}, + {-0.421987,0.744210}, + {-0.557095,-0.775698}, + {0.454006,-0.044498}, + {0.177879,0.041843}, + {0.074312,0.324311}, + {-1.059395,0.620565}, + {-0.421680,0.527942}, + {-1.202068,1.160552}, + {-0.115764,-0.745636}, + {-1.541088,0.056196}, + {0.381186,0.008007}, + {-0.499599,0.141341}, + {0.013978,-0.125940}, + {0.090000,-1.187147}, + {1.160943,-0.631971}, + {-0.156704,0.697033}, + {-1.239590,-0.623728}, + {-0.792073,0.313426}, + {-0.731100,-0.549662}, + {-0.357447,1.054545}, + {-1.142243,-0.677072}, + {0.337990,0.046116}, + {0.530248,-1.446341}, + {0.636612,-0.662750}, + {-2.179262,0.191543}, + {-0.550411,0.747675}, + {-0.402629,0.988314}, + {-0.083953,0.479871}, + {0.124996,-0.359557}, + {0.421828,0.346338}, + {-0.171740,-1.735271}, + {1.095081,-0.775815}, + {-0.492503,0.267703}, + {-0.204414,0.545646}, + {0.385776,-0.276769}, + {0.183290,0.903289}, + {-0.084581,-0.121421}, + {-0.245414,-0.714739}, + {-0.576804,0.885006}, + {-1.119495,-0.231658}, + {1.164001,0.578247}, + {0.112226,0.129056}, + {-0.593079,-1.115176}, + {0.166237,-0.014866}, + {-0.444435,0.569202}, + {-1.420244,-0.532449}, + {-0.340449,-0.654735}, + {1.268462,-0.042484}, + {-0.553843,-0.819293}, + {0.303196,-0.769441}, + {0.388195,-0.520681}, + {-0.196868,-0.813691}, + {0.519316,-1.007083}, + {0.706958,0.112890}, + {-1.075358,-0.054663}, + {0.741997,0.785043}, + {0.052625,-0.121979}, + {0.253025,0.356385}, + {0.828369,-0.593061}, + {-0.384827,0.456143}, + {-0.140667,0.196871}, + {-1.966096,-0.083070}, + {-1.020553,-1.461990}, + {0.190510,-0.037306}, + {-0.625134,-0.080120}, + {-0.562010,-0.950249}, + {-0.230976,-0.527893}, + {-0.228677,-0.348693}, + {-0.332359,-0.311350}, + {-0.704024,-1.084836}, + {-0.434046,0.133438}, + {-0.318342,-0.053535}, + {-0.096872,0.012919}, + {-0.610696,-0.174108}, + {-0.252555,-0.509190}, + {1.061245,0.467663}, + {0.252635,-0.703320}, + {-0.212390,1.327738}, + {0.587415,0.199159}, + {-0.966466,-0.076941}, + {-0.829028,1.083157}, + {-0.505337,1.097833}, + {0.691992,0.091951}, + {0.564158,0.597321}, + {0.804210,0.592029}, + {-0.413688,0.496419}, + {-0.298775,0.196912}, + {-0.092485,-0.806745}, + {-1.159163,0.204774}, + {-0.794889,-0.067174}, + {-0.438785,-0.115991}, + {0.282720,-0.231078}, + {-1.228366,-0.260419}, + {-1.528740,-0.246528}, + {-0.246221,-0.580162}, + {0.114350,-1.968410}, + {-0.218031,-0.356657}, + {-0.948797,0.708502}, + {-0.805080,-0.480688}, + {-0.334364,0.785381}, + {0.070317,-0.128118}, + {0.470661,-0.323759}, + {-0.185075,0.483122}, + {-0.404439,0.149669}, + {0.074842,0.256006}, + {-1.013446,0.621396}, + {-0.134759,0.287886}, + {0.376520,1.192665}, + {-0.362520,-0.634418}, + {0.362985,-0.196815}, + {0.653376,0.725399}, + {1.234385,-0.520766}, + {0.281393,1.887825}, + {-0.506625,0.262909}, + {-1.755273,0.507609}, + {-0.321531,-0.128175}, + {0.301331,-0.922664}, + {-0.600594,-1.248979}, + {-0.314934,-0.073132}, + {-1.253293,-0.794391}, + {-0.119523,-0.106375}, + {-1.036734,-0.848670}, + {-0.204574,0.546471}, + {0.823228,0.262015}, + {1.082957,-0.114482}, + {-0.728824,0.148125}, + {-0.883430,0.785116}, + {0.641440,-0.078952}, + {-1.272558,0.134591}, + {0.505240,-0.602016}, + {-0.972164,1.092034}, + {0.612247,0.549404}, + {0.450208,0.493039}, + {-0.525409,0.940858}, + {-0.216053,0.053321}, + {-0.034777,0.076897}, + {-0.559997,-1.618377}, + {-0.739954,0.626905}, + {-0.033963,-0.233715}, + {0.672760,-0.049505}, + {-0.208845,-0.160882}, + {0.953452,-0.034831}, + {-0.376313,-0.779698}, + {-1.116935,0.789470}, + {1.852068,-0.400982}, + {0.337988,-0.001624}, + {0.591794,-0.223387}, + {-0.764729,-0.256717}, + {0.409644,-0.331827}, + {0.353446,0.986947}, + {0.013275,-0.074213}, + {0.197200,-0.544923}, + {-0.331489,0.568903}, + {0.432285,-0.929833}, + {0.600862,0.718698}, + {0.872893,-0.419268}, + {-0.200237,-0.718290}, + {0.242213,0.079084}, + {-1.577807,1.174048}, + {-0.379725,0.187433}, + {0.307646,1.344402}, + {1.215462,0.395933}, + {0.029692,0.606788}, + {0.892763,-0.031153}, + {0.685208,0.002816}, + {0.907146,0.248276}, + {0.328204,0.310385}, + {-0.450021,-0.534631}, + {2.075611,-0.976094}, + {0.337534,0.624849}, + {-0.375221,-0.715899}, + {-0.134676,-0.128634}, + {-0.654845,-0.951174}, + {-0.407146,-0.844925}, + {-1.268266,-0.592878}, + {-0.624101,-0.781781}, + {-0.162159,-0.785210}, + {-1.763260,0.357187}, + {-0.408447,0.565726}, + {-0.392385,-0.323932}, + {0.070956,-0.460428}, + {-0.053136,0.207713}, + {-0.164207,-1.296008}, + {-1.192106,-1.901697}, + {-0.431213,-1.017489}, + {-0.520848,1.407188}, + {0.145023,-0.336089}, + {0.856252,-0.968676}, + {0.695109,-1.115058}, + {0.942748,0.032814}, + {-0.442368,0.501998}, + {-1.339842,0.494702}, + {0.793722,0.683030}, + {-0.080036,-0.001120}, + {-0.124282,-0.176612}, + {-0.510859,-0.403349}, + {-0.013581,-0.068892}, + {-0.285268,0.123699}, + {0.681833,-0.376550}, + {0.665080,1.385498}, + {-1.217502,0.225975}, + {-0.594094,-0.361329}, + {0.640636,-1.635224}, + {0.440288,-0.173718}, + {-1.095971,0.028588}, + {-0.391012,0.536173}, + {-0.679180,-0.332060}, + {0.443795,0.206495}, + {0.102913,-0.012004}, + {-0.877523,-1.194485}, + {1.576267,-0.479076}, + {-1.125040,-0.707965}, + {-0.293637,-0.295395}, + {1.163673,0.261285}, + {-0.009871,1.620751}, + {0.420659,1.657904}, + {0.184678,0.360919}, + {-1.117315,-0.182509}, + {-1.805887,-0.737423}, + {1.715050,-0.359039}, + {0.548347,-0.711148}, + {0.819885,-0.536776}, + {0.038829,-0.046101}, + {-1.555754,1.115475}, + {0.059829,-0.900202}, + {0.215772,0.610962}, + {0.008583,-0.164357}, + {-0.394604,-0.266908}, + {-0.089186,0.115016}, + {0.879229,-1.099212}, + {0.666276,-1.094933}, + {-2.243026,0.931909}, + {1.069452,-0.301207}, + {1.192592,1.144332}, + {-0.546448,-0.404087}, + {1.042238,0.099649}, + {-1.150986,-0.352998}, + {1.671102,0.062038}, + {-0.292935,-0.142184}, + {0.912273,0.927933}, + {-0.610804,-0.790526}, + {-1.233318,0.582164}, + {0.362886,0.126435}, + {0.266818,0.880278}, + {0.334312,-0.851251}, + {-0.625542,0.254909}, + {0.730234,0.366879}, + {0.714704,0.004163}, + {1.194976,-0.023707}, + {0.326624,-0.471626}, + {-0.229043,-0.827678}, + {0.325709,-0.115376}, + {0.677117,-0.136203}, + {0.609055,-0.553231}, + {0.043072,-0.424984}, + {0.441790,0.828142}, + {-0.436910,-0.103521}, + {-0.626695,0.363246}, + {-1.091702,0.016860}, + {0.576059,0.141374}, + {-0.152014,-0.661996}, + {-0.774034,-0.052961}, + {0.523869,0.787151}, + {0.022872,0.624295}, + {2.371050,2.241895}, + {0.099188,-0.686992}, + {-0.026026,-0.171252}, + {0.675816,1.843051}, + {0.006666,0.000152}, + {1.021349,0.543076}, + {-0.602923,0.676056}, + {1.027891,-0.418795}, + {-1.759205,-1.102256}, + {1.116023,0.103083}, + {0.576224,-1.411952}, + {-0.156183,1.999043}, + {0.124434,-0.238939}, + {-0.938087,0.337435}, + {0.047635,0.159295}, + {0.217816,-0.807263}, + {-0.727492,0.439254}, + {0.245795,-1.372293}, + {1.078585,0.289308}, + {-0.746381,-0.190481}, + {0.461490,-0.156236}, + {0.279562,-0.141011}, + {0.800455,0.112162}, + {0.846632,-1.442145}, + {0.896583,-0.366371}, + {0.142449,0.555705}, + {0.443817,-0.165670}, + {-0.278247,1.893330}, + {-0.148235,0.209155}, + {0.819120,-0.340799}, + {0.110860,-0.461213}, + {-0.191900,-1.200356}, + {0.385260,0.158268}, + {0.179177,-0.338312}, + {0.286717,0.336873}, + {-0.596235,-0.074333}, + {0.311757,-1.159880}, + {-0.906439,0.587565}, + {0.837066,-0.107715}, + {-0.260451,-1.427325}, + {-0.216606,1.473217}, + {-1.717780,-0.058343}, + {-1.378627,0.891233}, + {-0.079320,0.532493}, + {-0.016687,0.630684}, + {0.240314,0.096040}, + {-0.331577,0.458243}, + {0.372299,-1.365709}, + {-0.741196,1.252891}, + {-0.264394,-0.346368}, + {0.174941,0.592150}, + {-0.182301,0.472894}, + {-1.078744,0.352627}, + {0.668825,-0.839549}, + {-0.794913,0.098837}, + {0.346916,0.827142}, + {-0.557851,-0.824683}, + {0.152571,-1.089133}, + {0.317379,-0.377552}, + {-0.310447,-0.798186}, + {1.416259,0.538289}, + {-0.139209,0.950880}, + {-0.671851,-0.023958}, + {-0.295455,0.491929}, + {-0.042358,-0.225679}, + {0.306427,-0.412672}, + {-0.096405,-0.210148}, + {1.661258,-0.451881}, + {0.887263,-0.441136}, + {1.303738,0.032488}, + {1.248415,-0.771581}, + {-0.521452,0.088019}, + {-1.103925,-1.154315}, + {0.257631,1.121379}, + {-0.262130,0.533858}, + {0.605826,-0.581051}, + {-0.188663,0.498607}, + {0.764838,0.473480}, + {0.860975,-1.159374}, + {0.452993,0.327307}, + {0.175875,1.009939}, + {0.281291,-0.479527}, + {0.434156,0.687246}, + {0.453294,0.558911}, + {0.191183,-0.316014}, + {0.214000,0.309648}, + {0.502847,0.327473}, + {-0.398865,-1.147691}, + {-0.952348,0.394180}, + {-0.349121,-0.235417}, + {-0.449837,0.044554}, + {-0.402914,-0.408737}, + {0.199668,0.760049}, + {0.010913,-0.831466}, + {0.090912,0.009287}, + {0.512837,-0.858424}, + {-0.283099,-0.240292}, + {-0.112692,-0.322550}, + {-0.417705,-0.353556}, + {-1.267119,0.235106}, + {-0.412714,-1.078769}, + {-1.068857,-0.020876}, + {0.735610,-0.698172}, + {0.097437,1.100995}, + {-0.824265,-0.625636}, + {-0.151463,0.035774}, + {-0.097028,-0.167782}, + {-0.354245,-0.055691}, + {0.360549,0.749328}, + {0.718972,-0.297089}, + {0.093750,-0.638153}, + {-0.247393,-0.297925}, + {-1.029741,-0.068838}, + {0.526758,0.786855}, + {-0.926147,0.224848}, + {0.558481,-0.057841}, + {-0.267158,-0.691253}, + {-1.247372,-0.770014}, + {-0.163633,-1.488970}, + {-0.501774,0.176045}, + {0.136177,-0.868078}, + {0.777970,0.447295}, + {0.460035,0.095623}, + {0.503416,-0.169723}, + {1.171534,-0.676447}, + {-0.713499,0.434530}, + {0.462648,0.066601}, + {-0.832730,-1.270562}, + {0.765136,0.913623}, + {0.417389,0.798048}, + {-1.426013,-0.274914}, + {-0.825985,-0.424720}, + {0.603344,-0.834278}, + {0.709370,0.850793}, + {0.003214,-0.250830}, + {-1.002978,-0.742748}, + {-0.936138,0.680271}, + {-0.053393,0.089266}, + {0.420002,-0.368487}, + {0.710330,-0.438794}, + {-1.087089,0.102425}, + {0.476970,-1.002341}, + {0.375935,0.399873}, + {-0.989189,0.653074}, + {0.872430,0.758053}, + {-0.890879,-0.312795}, + {-0.238132,-0.250050}, + {0.849829,-0.245135}, + {-0.306339,1.034213}, + {0.133859,-0.614994}, + {-0.556895,0.160389}, + {-0.042028,-1.154500}, + {-0.019949,-0.576390}, + {-1.028293,0.814275}, + {0.766851,0.887268}, + {0.044484,-0.512244}, + {0.795847,-0.238133}, + {-0.123321,1.153876}, + {1.732138,0.309731}, + {-0.429759,0.508320}, + {-0.700518,-0.577407}, + {0.586965,0.247099}, + {0.474665,-0.264909}, + {0.657846,0.682646}, + {1.683598,-0.181147}, + {0.481185,0.407061}, + {-0.867097,-0.307912}, + {-0.884851,0.803434}, + {0.248120,0.335810}, + {-0.766947,-0.015652}, + {0.138088,-0.540963}, + {0.483644,-0.292753}, + {0.434778,-0.933118}, + {0.969690,-0.575479}, + {0.033365,-0.110259}, + {0.045278,-0.657264}, + {-0.823623,0.516920}, + {-0.153628,-1.007980}, + {-0.500080,0.938031}, + {-0.332981,0.507900}, + {0.290413,0.159538}, + {-0.402051,0.813947}, + {0.464196,0.574152}, + {0.578220,-1.425212}, + {0.202852,-0.043236}, + {1.658922,0.205793}, + {-0.485749,-0.745853}, + {-0.446857,0.377168}, + {0.876179,1.074485}, + {-0.584951,0.013578}, + {-0.837915,-0.240871}, + {-1.524292,0.233789}, + {-0.825139,0.748604}, + {1.596491,0.933630}, + {-0.401496,-1.003424}, + {-0.258193,-0.695623}, + {-0.052062,-0.166794}, + {0.690957,0.351045}, + {0.493275,-0.920828}, + {-0.863543,1.297232}, + {-0.108419,0.062067}, + {1.378657,-1.208240}, + {0.085856,-1.104558}, + {-0.366961,0.245213}, + {0.832540,0.165383}, + {-0.584261,0.126903}, + {0.016941,0.536423}, + {-0.270773,1.502084}, + {-0.372237,-0.400977}, + {1.068030,-0.451306}, + {-0.621204,-0.546822}, + {1.960128,0.187646}, + {-0.280504,-0.872304}, + {0.683431,0.366819}, + {0.595984,-0.857526}, + {-0.631380,-0.386350}, + {0.020853,-0.369727}, + {-0.212579,0.923348}, + {0.683995,-0.323235}, + {0.805253,0.720984}, + {-0.198278,-0.751235}, + {-0.587794,1.028549}, + {0.082077,0.108813}, + {0.745455,-0.151971}, + {-0.976860,-1.417301}, + {-0.100352,0.301667}, + {0.452015,0.239125}, + {-1.198564,1.164572}, + {-0.347850,-0.780059}, + {1.005080,-0.098043}, + {-0.076527,0.140155}, + {0.822524,0.259489}, + {-0.484033,0.190539}, + {0.547659,0.465998}, + {0.402279,-0.058429}, + {-0.145342,0.125883}, + {-0.136622,1.065746}, + {0.408618,-0.650430}, + {0.015056,0.491154}, + {1.132468,-0.328837}, + {-0.012391,-0.686920}, + {0.053038,0.495824}, + {0.071729,-0.474581}, + {-0.440191,-0.561736}, + {-0.524869,0.365948}, + {0.556736,-0.017547}, + {0.292031,-0.097135}, + {1.006116,1.298618}, + {0.516901,0.626829}, + {0.630999,-0.413970}, + {0.774604,-1.207384}, + {-0.615805,0.565898}, + {0.364355,-0.950000}, + {0.530245,-1.069383}, + {1.242254,0.041582}, + {1.198631,-0.852988}, + {0.409406,-0.362121}, + {-0.051573,1.378894}, + {0.526354,0.639450}, + {-0.194904,-1.121370}, + {0.927330,1.050282}, + {-1.444789,0.271173}, + {-0.428099,0.664772}, + {-0.780386,0.717917}, + {-0.113324,-0.553108}, + {0.355862,-0.738216}, + {-0.099107,0.064152}, + {-0.154411,1.265266}, + {0.802506,-0.378603}, + {-0.254708,-0.134292}, + {0.098108,-0.759107}, + {-0.609531,-1.121607}, + {-0.421901,-0.211898}, + {0.711968,-0.180637}, + {-1.105167,1.156956}, + {-1.003797,0.694685}, + {0.049084,-0.230107}, + {-0.236223,1.025917}, + {0.404298,-0.017089}, + {-0.066885,0.931927}, + {-1.723563,-0.969529}, + {0.491575,-0.029033}, + {0.623884,-0.068448}, + {0.176416,-0.045140}, + {-0.898063,-0.441314}, + {0.054965,-0.105671}, + {0.099547,0.031943}, + {-0.136638,-0.641491}, + {-0.416031,0.788225}, + {0.421132,0.199360}, + {0.973337,-0.185653}, + {0.088055,0.466610}, + {0.175948,0.713615}, + {-0.186074,-0.718673}, + {-0.477278,0.873979}, + {0.439899,0.385747}, + {0.281673,1.501744}, + {-0.893871,0.167312}, + {-1.196201,0.511553}, + {-0.088248,1.523528}, + {-0.127180,0.047668}, + {-1.244524,1.220496}, + {-0.458583,0.408467}, + {-0.423980,-0.843592}, + {-0.680569,-0.034943}, + {0.025603,-0.219165}, + {-0.182524,-0.609754}, + {-0.540846,1.056731}, + {0.303247,1.820157}, + {0.180851,0.479806}, + {0.025760,-1.252858}, + {-0.747286,-0.234204}, + {-1.773173,0.069396}, + {0.370812,-0.513683}, + {-0.420497,-0.847213}, + {-0.820247,0.180888}, + {0.377636,-0.251796}, + {-0.084840,0.837256}, + {0.204533,-0.516983}, + {-0.579383,0.361949}, + {-0.079244,-0.997139}, + {0.763352,-0.920005}, + {0.991156,0.097808}, + {-0.207017,-0.379039}, + {-1.048663,0.392404}, + {-0.947993,-0.165707}, + {0.222565,-1.486800}, + {1.309369,0.187803}, + {0.083914,0.759151}, + {0.017533,-0.350594}, + {0.936769,-0.133694}, + {-0.542859,0.015576}, + {0.527186,1.057142}, + {0.576027,-1.107543}, + {-0.597828,0.116528}, + {-0.573770,-0.408299}, + {-0.564696,0.907437}, + {-0.843667,0.002832}, + {1.708716,-1.282816}, + {0.099415,-0.410289}, + {-1.175233,0.409935}, + {-0.505987,1.096503}, + {0.831878,-0.633435}, + {-0.036724,0.894208}, + {-1.009229,0.523294}, + {-0.206856,-0.518026}, + {-0.265399,0.734165}, + {-1.418101,-0.082190}, + {0.605095,0.372543}, + {-1.234487,1.112847}, + {-0.036487,0.136546}, + {-0.027486,-0.021950}, + {0.087476,0.308363}, + {0.380610,-0.770809}, + {-0.612494,0.395982}, + {-0.760804,0.774983}, + {1.865483,0.743280}, + {0.077926,0.679733}, + {-0.346491,-0.172862}, + {0.652737,-0.498038}, + {-0.306556,-0.127240}, + {1.422770,-0.788084}, + {0.727473,0.199273}, + {0.998929,0.906173}, + {-0.062778,-0.292218}, + {0.389584,-0.499927}, + {1.122804,0.323068}, + {-0.936607,0.116318}, + {0.080546,-1.053398}, + {-0.108415,0.262303}, + {0.675554,-0.771375}, + {0.697370,0.301939}, + {-0.516065,0.371745}, + {-1.958861,-0.787043}, + {1.816436,-0.421257}, + {0.580993,0.294074}, + {-0.218823,-0.831417}, + {-0.217031,-1.430616}, + {-0.483142,0.379944}, + {0.067187,-0.582305}, + {-0.697808,-0.168340}, + {1.293952,0.231077}, + {0.097290,-0.755162}, + {0.165245,0.091931}, + {-1.238996,0.033182}, + {0.094961,-0.517375}, + {-0.390291,0.240153}, + {0.023253,2.137456}, + {0.621424,-0.412412}, + {0.242280,-0.594768}, + {-0.765264,-0.423112}, + {-0.153731,0.730757}, + {0.419930,0.768227}, + {0.164315,0.199661}, + {-1.536602,0.855813}, + {0.226126,-0.357326}, + {0.350009,0.143890}, + {0.337303,0.843891}, + {-0.411561,-1.142193}, + {-0.701707,-0.241532}, + {-0.754151,-0.193665}, + {-0.371459,-0.379980}, + {-0.276399,-0.210742}, + {-1.074638,0.834850}, + {1.617356,-0.576681}, + {1.568916,-0.678719}, + {0.562247,0.287642}, + {0.631863,1.237075}, + {0.042284,-0.047805}, + {1.485053,-0.684224}, + {0.160235,-0.248368}, + {-0.389660,0.710686}, + {-0.050819,0.065209}, + {0.147388,0.158528}, + {0.327583,-1.242319}, + {-0.185792,-0.398783}, + {-0.880967,-0.168451}, + {0.561261,0.309319}, + {0.114879,0.834084}, + {-0.630472,0.320430}, + {0.435172,-0.147865}, + {0.138108,0.189852}, + {0.433189,0.538220}, + {-0.539843,-0.734402}, + {0.102453,1.548384}, + {-0.349662,-0.123426}, + {-0.497825,-0.681592}, + {-0.815304,0.920879}, + {0.264205,1.651104}, + {-0.360736,-0.822221}, + {-0.546373,-0.203813}, + {1.506398,0.351934}, + {1.271735,0.262145}, + {0.706702,0.382961}, + {0.063130,0.014527}, + {-0.198279,-0.082914}, + {0.756777,0.133322}, + {0.762393,0.070534}, + {-1.168252,0.042773}, + {-0.875856,0.058973}, + {-0.907179,1.363516}, + {0.003700,1.289862}, + {0.279690,-0.489829}, + {-0.952025,-0.016869}, + {-0.062242,0.118709}, + {0.335991,-0.262022}, + {-0.135763,0.124727}, + {0.827726,-0.460658}, + {0.070106,0.118099}, + {-0.594234,0.138962}, + {0.638866,1.436196}, + {0.038912,0.342362}, + {-0.409336,1.245498}, + {0.246502,-0.213165}, + {-0.522154,-0.329476}, + {-1.023245,-0.070043}, + {0.648593,-0.512078}, + {0.202472,-1.312851}, + {-1.306352,-0.890312}, + {1.086565,-0.802461}, + {0.842372,-1.343072}, + {-0.159571,-0.014023}, + {0.857682,-0.038734}, + {-1.088896,-0.345921}, + {0.822683,0.990156}, + {-0.329881,0.808677}, + {1.062717,1.498025}, + {-0.433379,-0.433149}, + {-1.122758,-0.127346}, + {0.542121,0.927791}, + {0.308221,0.175934}, + {-0.149790,-1.068382}, + {-0.616779,-0.744305}, + {0.839533,-0.157706}, + {0.303678,0.382350}, + {0.194006,-0.212379}, + {0.033246,-0.903250}, + {-0.338256,-0.678675}, + {-0.613313,-0.387690}, + {-1.010888,-0.461805}, + {0.256900,1.327843}, + {0.791153,0.371449}, + {0.412562,-0.756850}, + {0.065134,-0.322337}, + {0.083713,0.126607}, + {0.723780,1.256984}, + {-1.243036,-0.742905}, + {0.026896,0.353344}, + {-0.269050,0.745763}, + {1.149596,0.347420}, + {-0.774535,0.020295}, + {0.596979,0.015554}, + {-0.615475,-0.620565}, + {0.318177,0.396116}, + {0.421686,-0.052160}, + {-0.430877,-1.293244}, + {-0.155236,-0.215658}, + {-0.602139,0.532974}, + {-0.243152,-1.579031}, + {0.123780,-0.983632}, + {0.136269,-0.821246}, + {0.284418,0.304578}, + {-0.397824,0.300438}, + {-0.360441,0.227509}, + {0.046855,-0.171865}, + {-1.804252,-0.700048}, + {-0.924882,-0.556849}, + {0.134748,0.082988}, + {-0.132825,-0.916706}, + {0.786704,0.720149}, + {1.091863,0.641613}, + {0.881371,0.215342}, + {-0.096880,0.560482}, + {0.422486,-0.921443}, + {0.341221,-0.894846}, + {0.075976,1.064656}, + {-0.533020,-0.023005}, + {0.320752,0.244138}, + {-0.040666,0.065450}, + {1.450750,0.008950}, + {0.306952,-0.562488}, + {0.302953,0.123134}, + {0.798245,0.094443}, + {0.038655,-0.516631}, + {-0.252824,1.501311}, + {-0.356779,0.297983}, + {-0.180288,1.164347}, + {-1.407410,-0.435116}, + {-0.576522,-0.443552}, + {0.111603,-0.209512}, + {0.136332,1.190104}, + {-0.810554,0.693664}, + {0.308525,0.629498}, + {0.318195,-2.104560}, + {0.162520,-0.149801}, + {-1.142162,1.218633}, + {-0.351640,-0.468696}, + {-0.793111,-0.658338}, + {-0.575915,0.941180}, + {0.317133,0.669761}, + {0.985808,-0.707916}, + {0.260989,0.770580}, + {-0.078153,-0.123214}, + {0.053145,1.817637}, + {-0.628024,0.069947}, + {-0.777414,-0.126421}, + {-0.647336,0.166883}, + {2.207409,-0.473580}, + {-1.038409,0.398710}, + {-0.345503,0.161175}, + {0.081747,0.890997}, + {-0.308902,-0.075592}, + {-0.139376,-0.676387}, + {0.971584,-0.470253}, + {-0.162857,1.149113}, + {0.171516,0.587119}, + {-0.613744,-0.035450}, + {-0.580046,-0.329255}, + {0.100551,-1.085898}, + {-0.592872,-0.489665}, + {-0.941300,-0.498021}, + {0.156036,0.709273}, + {0.178233,-0.632015}, + {0.678891,0.228611}, + {0.492409,-0.005288}, + {-1.497998,-1.024431}, + {0.838897,-0.110250}, + {0.568010,-1.606525}, + {-0.432611,0.904418}, + {0.334915,1.309759}, + {-0.890282,1.529258}, + {-1.064858,-1.150747}, + {0.051353,0.433881}, + {-0.146728,-0.312565}, + {-1.063791,-0.097197}, + {-0.181281,0.331634}, + {1.723937,-0.176101}, + {0.569951,0.990671}, + {0.418655,-0.675772}, + {0.182521,-0.095608}, + {-1.007120,0.018916}, + {1.718394,1.198867}, + {-0.313048,0.068845}, + {-1.421110,-0.661129}, + {-1.370764,-0.150880}, + {0.358122,1.405506}, + {-2.015900,-0.734896}, + {0.605181,-0.924120}, + {-1.191318,0.682983}, + {-0.456857,-0.148538}, + {0.300737,-0.194614}, + {0.929323,0.927409}, + {-0.450904,0.410019}, + {0.838989,0.855354}, + {0.011216,0.148217}, + {1.790998,-0.435076}, + {0.979138,0.801324}, + {-0.434199,0.113647}, + {0.244367,-0.759697}, + {-0.866268,-0.172338}, + {0.185045,-0.400993}, + {-0.381384,-0.328469}, + {0.870050,-1.131930}, + {0.475579,-1.270791}, + {0.553011,-0.863202}, + {0.654535,0.866937}, + {0.636370,0.353826}, + {0.532848,-0.266808}, + {-0.305542,0.323175}, + {0.817581,-1.178811}, + {-1.196670,0.435729}, + {-0.879273,-0.080918}, + {-0.355981,0.831777}, + {-0.514107,-0.221697}, + {-0.173027,0.391314}, + {0.480640,-0.762188}, + {-1.365528,0.280669}, + {-1.190631,-0.468936}, + {0.865182,-1.193025}, + {0.501712,1.474804}, + {-0.256834,0.036278}, + {0.625077,-0.710525}, + {0.236352,1.463872}, + {1.622799,-0.836983}, + {-1.629799,-0.761636}, + {0.048897,1.161363}, + {-0.782579,1.512752}, + {0.305203,-0.203621}, + {0.078598,0.853412}, + {-0.590944,0.241544}, + {0.173496,-1.406007}, + {-0.999952,-0.051233}, + {0.671370,-0.805464}, + {-0.681366,0.306463}, + {0.562013,-1.218074}, + {-0.901352,0.429769}, + {-0.149506,0.266835}, + {0.214535,1.287188}, + {-0.169843,-0.687892}, + {-0.054779,1.567896}, + {0.240689,0.339854}, + {-0.874400,-0.867453}, + {0.412938,0.074314}, + {0.567298,-2.005843}, + {0.023167,0.258225}, + {-1.641902,0.893004}, + {-0.335666,-0.481124}, + {-0.406708,-0.010981}, + {0.658780,0.316174}, + {-0.955737,0.114306}, + {-0.015993,-1.537689}, + {1.424653,0.275514}, + {0.391517,-0.073148}, + {-0.745075,0.282317}, + {0.345172,0.271172}, + {0.481076,0.739154}, + {-0.356021,-0.874318}, + {-0.063438,0.390779}, + {-1.109843,-0.988009}, + {0.717374,0.051986}, + {-0.076888,0.729893}, + {1.231962,0.770958}, + {-0.473425,0.077225}, + {-0.541175,0.273609}, + {0.353179,-1.140094}, + {0.000531,0.335460}, + {-0.553490,-0.163401}, + {-0.267372,-0.190631}, + {-1.005119,0.844056}, + {-0.739355,-0.466000}, + {1.232900,-0.286890}, + {0.072653,0.156869}, + {0.766814,0.123674}, + {0.409127,0.391504}, + {-1.568030,0.076824}, + {0.312427,1.087632}, + {0.194971,0.012558}, + {-0.835118,-0.977949}, + {1.155426,0.060691}, + {-0.251222,0.836983}, + {0.405056,0.222589}, + {0.062390,-0.297580}, + {0.201353,-0.620657}, + {-0.057828,0.302448}, + {0.353545,-0.819051}, + {-1.077600,0.701107}, + {0.551567,-0.547460}, + {-0.206217,0.843281}, + {0.195007,-0.522554}, + {0.786147,0.742689}, + {-0.915141,-0.436052}, + {-1.052682,1.424224}, + {0.597211,-0.177125}, + {-0.226331,-0.785225}, + {-1.502941,0.305148}, + {0.211830,0.257461}, + {0.039781,0.621727}, + {1.764019,-0.364944}, + {-0.011250,0.080853}, + {-0.037767,-0.191529}, + {0.120387,0.320196}, + {1.215214,0.159849}, + {0.951333,-0.128658}, + {0.683926,0.291417}, + {0.465572,0.464227}, + {0.237083,-0.278794}, + {0.825346,1.939517}, + {-1.000650,0.397936}, + {-0.422528,0.457669}, + {-0.415993,-0.857881}, + {0.654893,0.925834}, + {0.702427,0.341379}, + {-0.992852,-0.485504}, + {0.468854,-0.558263}, + {1.051053,-1.438013}, + {-1.609177,-0.229971}, + {-0.338898,1.308837}, + {1.716121,-0.108408}, + {-1.842097,-0.281067}, + {0.180047,0.058089}, + {0.314948,-0.365466}, + {-0.598626,-1.149004}, + {0.282546,0.129074}, + {-0.297604,-0.102458}, + {-0.134736,0.128291}, + {1.822758,-0.192577}, + {0.071825,-0.011008}, + {0.497849,-0.199343}, + {-0.005720,-0.569142}, + {-0.765651,-0.543594}, + {-1.172104,-0.011979}, + {-0.242091,0.779012}, + {-0.028042,0.723704}, + {0.451185,-0.941516}, + {-0.613115,-0.114437}, + {-0.972157,0.133869}, + {-0.076452,-0.516053}, + {0.083782,0.204923}, + {0.784000,0.582870}, + {-0.183293,0.586900}, + {-0.219489,0.464479}, + {0.144135,1.149970}, + {0.288305,-0.029936}, + {1.159682,0.771728}, + {-0.068957,0.519200}, + {-0.352525,-0.019248}, + {-0.265696,-0.606806}, + {-0.369018,0.437127}, + {0.533511,-0.112122}, + {-0.720835,0.975622}, + {1.285089,-0.946088}, + {0.455252,0.289840}, + {-1.326309,-0.639170}, + {0.108470,-0.476583}, + {0.142548,0.079352}, + {-0.029694,0.643831}, + {-1.482084,-0.771038}, + {-0.465824,-1.087531}, + {0.707385,0.077513}, + {-0.076182,1.057646}, + {0.379631,0.409768}, + {0.188938,-0.425715}, + {-0.234099,-0.734066}, + {0.043174,0.676531}, + {-1.163066,-0.193611}, + {-0.159620,-0.673125}, + {0.127940,-1.817839}, + {-0.451725,0.015069}, + {0.235742,0.360075}, + {1.748806,-0.323556}, + {-1.276301,0.117820}, + {0.166940,0.213350}, + {0.355975,0.062672}, + {-0.320198,-1.132743}, + {-0.855608,-1.215465}, + {0.013539,0.799086}, + {0.828422,0.915972}, + {1.006847,0.215101}, + {0.595009,0.252831}, + {0.442370,0.482821}, + {-0.693609,0.417306}, + {0.288466,-1.005315}, + {-0.396817,0.004994}, + {-0.293724,-1.217092}, + {1.212464,0.943142}, + {-0.865108,0.242460}, + {0.390441,0.080091}, + {0.871808,-1.076529}, + {0.254390,-0.387861}, + {0.532100,-1.371890}, + {0.132686,-1.074121}, + {0.426648,0.209831}, + {1.146969,0.503369}, + {-0.668154,-0.483259}, + {0.259931,-0.150336}, + {0.082358,-0.893764}, + {0.840501,-0.011365}, + {-0.082053,0.647275}, + {0.266846,1.226206}, + {-0.140652,-0.516312}, + {0.643273,-0.881556}, + {-0.379870,1.065882}, + {0.680447,0.242642}, + {-1.571274,-0.140568}, + {-0.535686,0.628896}, + {-0.010813,-0.606330}, + {0.361251,1.002445}, + {1.065906,-0.068655}, + {-0.224415,1.117594}, + {0.218497,-0.668069}, + {-0.429568,0.891438}, + {-0.998373,-0.389920}, + {0.226733,-0.730284}, + {1.059704,-0.349823}, + {-0.625330,-0.250376}, + {0.007118,1.525240}, + {-0.162942,-0.147716}, + {-0.666501,1.257793}, + {-0.909984,-0.138492}, + {-1.032952,-0.006279}, + {-0.404583,-1.848097}, + {-1.225754,0.434826}, + {1.235797,-0.792226}, + {0.783316,-0.750591}, + {-0.975057,0.365633}, + {-1.894987,-0.971523}, + {-0.147116,0.722479}, + {0.279787,0.076446}, + {1.433566,0.223812}, + {0.878914,-0.054495}, + {0.011693,0.776712}, + {-0.558728,0.481371}, + {0.641182,0.167371}, + {-0.669665,-0.807005}, + {-0.791191,0.591605}, + {-0.461665,0.714639}, + {0.066197,-0.199694}, + {-1.124229,0.833225}, + {-1.295771,-0.025693}, + {-0.037691,-0.391047}, + {-0.847875,0.862880}, + {0.441229,0.830506}, + {-0.259800,-0.491246}, + {-0.240834,0.911920}, + {0.442518,-0.580840}, + {1.561534,1.501570}, + {0.280203,0.397246}, + {-0.194177,0.276828}, + {0.944982,-0.351264}, + {0.022922,0.275745}, + {-0.867058,-1.632255}, + {0.280170,-0.145873}, + {0.108578,-0.052305}, + {-0.745809,-0.673504}, + {-0.616121,-0.379739}, + {1.008981,-0.155303}, + {0.285808,-0.263033}, + {0.601160,-0.612923}, + {0.900771,0.463246}, + {-1.013394,-0.618011}, + {1.233695,-0.032871}, + {-0.521967,-0.979415}, + {0.273272,-0.433226}, + {-0.240057,0.465270}, + {-0.465325,0.770377}, + {0.988019,-1.088975}, + {0.592680,0.367929}, + {0.800055,-0.721733}, + {-0.737244,-1.452977}, + {-0.427059,0.281520}, + {0.866413,-0.643401}, + {-0.182692,0.588766}, + {0.273523,0.294392}, + {0.566235,0.542400}, + {0.129606,0.397222}, + {-0.579409,0.288147}, + {-0.238510,0.268652}, + {1.122152,0.526534}, + {-0.841624,1.691837}, + {0.833782,1.207890}, + {-0.924153,2.110262}, + {-0.474350,-0.238235}, + {-0.515517,0.124354}, + {-0.064715,-0.236171}, + {0.599675,1.079644}, + {1.849341,0.024192}, + {0.161045,-0.379662}, + {0.823915,0.389173}, + {-1.260631,-0.467304}, + {0.052479,-0.187389}, + {-0.036665,0.449072}, + {0.069593,-0.152828}, + {0.068830,-1.285841}, + {0.680442,0.401365}, + {-0.160834,-2.024653}, + {-0.929411,0.671114}, + {-0.421687,0.749814}, + {-0.065965,0.527096}, + {0.929475,-0.741284}, + {-0.077824,-0.442484}, + {0.193024,-0.911981}, + {-0.101269,0.845595}, + {0.165756,0.295690}, + {0.319546,0.593792}, + {-0.808930,0.153177}, + {1.124408,0.458110}, + {0.771971,0.222809}, + {-0.167902,0.238733}, + {-0.169285,1.231875}, + {-1.585493,0.216024}, + {-0.747700,0.098100}, + {0.340226,-0.192779}, + {-1.219417,-0.107218}, + {0.228007,0.456442}, + {-0.007155,-0.634464}, + {-1.875543,0.567589}, + {-0.519810,-2.179719}, + {-0.904975,-2.451302}, + {0.736883,-0.419567}, + {0.918135,-1.128765}, + {0.384645,0.353239}, + {0.434095,-0.284308}, + {-0.374883,-0.095262}, + {-0.304398,0.413076}, + {-0.748666,1.124787}, + {-0.701671,0.451972}, + {0.395372,0.412637}, + {0.588244,-0.145257}, + {0.405163,1.023715}, + {0.744314,0.958872}, + {-0.037084,-0.577777}, + {-0.628322,-1.456151}, + {0.762014,-0.483828}, + {-0.958353,-0.171473}, + {-0.113997,1.464166}, + {1.350982,-0.530942}, + {-0.172846,-0.004565}, + {0.233537,0.941079}, + {-0.200530,0.383425}, + {0.264278,0.095382}, + {0.725498,1.193517}, + {1.280922,-0.026653}, + {0.097571,-0.441089}, + {0.300984,0.414280}, + {-0.041914,-0.544705}, + {1.009088,0.188493}, + {0.866042,-0.355025}, + {-0.317615,-0.910565}, + {0.489751,-0.574142}, + {0.963424,-0.661532}, + {-0.318844,-0.517722}, + {-0.190129,0.036885}, + {0.186444,-0.158205}, + {0.078693,-2.586327}, + {-0.266931,0.725793}, + {-0.074349,0.454831}, + {-0.374770,0.697565}, + {-0.467025,-0.014349}, + {-0.260550,-0.127574}, + {0.666807,0.559806}, + {-0.271031,-0.063661}, + {0.095739,0.428225}, + {-0.115755,0.220370}, + {1.075172,-0.821800}, + {1.387517,-1.151660}, + {-1.516364,0.833318}, + {-0.347857,0.250917}, + {0.299464,0.749435}, + {0.154734,-1.501682}, + {-0.503228,1.050996}, + {0.327790,-0.112045}, + {0.987849,-0.260528}, + {0.449412,1.852591}, + {-0.526460,0.814047}, + {-0.451808,-0.480134}, + {0.678355,0.739133}, + {0.317312,-0.328581}, + {0.196623,0.404023}, + {0.324616,1.699530}, + {-0.776618,-0.269720}, + {0.162184,0.179116}, + {0.297846,-0.710724}, + {-0.169321,0.167991}, + {1.769393,1.076862}, + {-1.380745,-0.595286}, + {0.568804,0.534699}, + {-0.846191,-0.871218}, + {-0.110816,-0.141844}, + {0.285220,-0.612886}, + {-1.000946,-0.050010}, + {-0.101431,-0.938313}, + {0.162775,0.079309}, + {-0.582009,0.345429}, + {0.124885,0.247372}, + {-1.328240,0.510701}, + {0.442295,0.051789}, + {0.949722,0.676903}, + {-0.111284,0.899622}, + {-0.437720,-0.322130}, + {-0.258154,0.985684}, + {-0.758257,0.557973}, + {-0.421330,-0.073546}, + {1.197222,-0.621330}, + {-1.526086,0.768420}, + {0.144164,0.595554}, + {0.071158,0.831643}, + {0.121315,1.096341}, + {-0.442333,0.055718}, + {0.261819,-0.929387}, + {-0.335194,-0.703410}, + {-0.634767,-0.488540}, + {-0.152389,-0.588104}, + {0.153830,-0.655196}, + {-0.631695,0.677282}, + {1.746302,-0.602460}, + {0.338172,-0.699808}, + {0.901305,0.660470}, + {1.137559,-0.192002}, + {-0.332112,0.081961}, + {-0.379872,0.728106}, + {-0.433884,-1.073145}, + {-0.247557,0.726460}, + {-0.232024,-0.849128}, + {1.187650,-0.092062}, + {-0.392385,-0.780775}, + {0.413751,-0.559636}, + {-0.431597,-0.961824}, + {0.463489,0.645597}, + {-0.897957,-0.663863}, + {0.842534,-0.688768}, + {-0.834302,-0.540110}, + {0.174923,-0.886926}, + {0.256774,-0.733313}, + {-0.513784,-0.360074}, + {0.156928,0.710061}, + {-0.779415,-0.205818}, + {1.122295,-0.263072}, + {-0.067941,-0.241437}, + {0.775305,-1.499039}, + {-0.959691,-0.336725}, + {-0.557347,0.644162}, + {0.097356,0.117803}, + {0.085507,1.845262}, + {0.507571,-0.452847}, + {0.157979,0.584192}, + {0.534463,0.510878}, + {0.436897,-0.704341}, + {-0.598275,-1.183016}, + {-0.479736,1.993246}, + {-1.004427,-0.606627}, + {1.175857,-0.209354}, + {-0.555928,0.024468}, + {-0.519805,-0.867264}, + {0.391430,0.558873}, + {-0.640640,0.630178}, + {-1.513294,0.362170}, + {-0.096170,0.302206}, + {1.549390,0.176401}, + {-0.712729,0.480838}, + {0.400243,-0.498461}, + {0.050925,-0.342701}, + {0.365122,0.134136}, + {0.517262,1.140502}, + {0.650985,-0.879352}, + {0.791790,0.189469}, + {0.654234,0.497645}, + {0.384115,-0.034611}, + {-0.125724,0.640141}, + {-0.543262,-1.255624}, + {-0.220592,-0.656310}, + {-0.130609,-0.147886}, + {-0.441347,0.720036}, + {0.400598,-0.080680}, + {-0.199337,0.873405}, + {0.032691,1.536398}, + {-0.093394,-1.310056}, + {-0.854984,1.071773}, + {0.102072,-0.810930}, + {-0.477344,0.066698}, + {0.648895,0.026279}, + {-0.285891,1.400032}, + {-1.216298,-0.236778}, + {-0.549714,0.688796}, + {-0.062685,-0.343855}, + {-0.341088,0.238776}, + {0.105347,0.048365}, + {0.514533,-0.634733}, + {-0.571926,0.456588}, + {0.367809,-0.456143}, + {0.979090,-1.286519}, + {-1.218222,0.367350}, + {-0.590629,-1.532832}, + {-1.718226,0.242958}, + {1.096783,-0.711503}, + {0.588342,0.376010}, + {0.744463,0.371433}, + {0.003243,0.668123}, + {0.062086,0.809872}, + {-1.132122,-0.104988}, + {0.084982,0.995250}, + {-0.688752,0.216891}, + {0.215504,-0.061450}, + {0.452003,-0.690233}, + {-0.723135,-0.275493}, + {0.357621,-0.515781}, + {-0.890998,-0.479333}, + {0.498701,-0.923387}, + {0.936200,-2.091405}, + {-0.879032,1.485557}, + {0.332185,-0.128280}, + {0.550373,0.387625}, + {0.632224,0.633608}, + {-0.605378,1.048378}, + {-0.472907,0.472679}, + {-0.926621,0.312398}, + {-0.285207,-0.148072}, + {-0.160155,-0.599110}, + {0.743425,0.098568}, + {0.668188,1.079139}, + {1.112103,1.452457}, + {-0.727684,-0.625500}, + {0.582495,0.602978}, + {-0.533045,-0.290135}, + {-0.137783,-0.815375}, + {-0.423199,-0.027111}, + {-0.199832,0.858830}, + {-0.774598,-0.479101}, + {-0.808559,0.112108}, + {-0.095061,-0.376614}, + {-0.643351,1.359531}, + {0.932951,-1.417012}, + {-0.848382,-0.222414}, + {-1.002188,-1.075297}, + {-0.939211,-0.668392}, + {0.479471,-0.342248}, + {-0.651955,0.089450}, + {-0.529345,1.103163}, + {-0.297371,0.787987}, + {-0.692098,-0.212505}, + {0.441398,0.601694}, + {1.155338,0.506600}, + {0.806606,-0.500708}, + {-0.740199,-1.292330}, + {-0.301074,0.068852}, + {0.517610,0.645486}, + {-0.240596,0.629380}, + {0.078991,-0.446581}, + {0.463990,-0.548239}, + {0.076625,-0.265612}, + {0.100232,-0.929770}, + {0.066872,0.589058}, + {-0.187736,-0.658316}, + {-0.822249,0.309850}, + {-0.917348,0.269891}, + {-0.295888,0.149902}, + {0.910250,0.779854}, + {-0.763011,-0.047352}, + {-0.345678,-0.728869}, + {0.991317,-1.211605}, + {0.654773,-1.301914}, + {0.240193,0.127080}, + {0.683297,0.857939}, + {-1.056701,0.902413}, + {0.538899,-0.329668}, + {-0.212189,0.730930}, + {-1.240264,-0.481620}, + {-0.735395,-0.030127}, + {-0.024994,-0.142647}, + {0.112034,-0.735685}, + {0.427365,-0.104027}, + {-0.416424,-1.693984}, + {1.186313,0.507243}, + {-1.550728,0.625737}, + {-0.395223,1.280803}, + {0.117296,0.255594}, + {0.078576,-0.343091}, + {0.336925,-0.610704}, + {0.535086,-0.319883}, + {0.586244,0.858364}, + {0.792222,-0.425311}, + {-1.174751,-0.317509}, + {-0.296053,1.341013}, + {-0.761628,0.373641}, + {0.144214,-0.064574}, + {0.308336,-0.161496}, + {0.713510,0.549545}, + {0.561945,0.014662}, + {0.618634,0.376704}, + {0.566078,-0.488592}, + {0.749551,-0.008964}, + {-1.439229,-1.800224}, + {0.330291,0.691467}, + {-0.371258,1.717772}, + {0.264541,1.219097}, + {-0.449660,0.278444}, + {-0.925116,-0.622006}, + {1.810841,0.357436}, + {-0.361036,-0.568890}, + {-0.245604,-0.543745}, + {-0.809004,-0.297720}, + {0.673398,-1.349551}, + {0.320146,0.122381}, + {0.055778,0.645761}, + {-1.114450,0.141513}, + {0.191087,1.024756}, + {-0.230242,0.131826}, + {1.440529,-0.146838}, + {-0.309778,-0.905495}, + {0.038309,0.453297}, + {-0.322784,0.721147}, + {-0.358682,-0.408192}, + {-0.387312,-1.581744}, + {0.455011,0.089694}, + {-0.435709,0.434022}, + {1.121966,0.703677}, + {-0.000289,0.898656}, + {0.370298,0.569843}, + {-0.759395,0.155326}, + {0.264595,-0.758241}, + {-0.717438,-1.284560}, + {0.534397,0.044761}, + {-0.387217,-0.850411}, + {0.044635,-0.092650}, + {-0.372661,-0.068370}, + {0.066867,0.992163}, + {0.309686,-0.088930}, + {-0.551975,1.140835}, + {0.282269,-0.265153}, + {-0.385975,0.629002}, + {-0.588541,0.936380}, + {-0.450421,-0.312229}, + {-0.584466,0.390126}, + {-0.561504,0.846689}, + {-0.327959,1.138398}, + {0.772840,-1.154541}, + {0.109965,0.119873}, + {-1.041428,0.030014}, + {-1.054290,-0.520300}, + {-0.401694,-1.322928}, + {0.339501,-1.053816}, + {-1.483539,0.383590}, + {0.179033,-0.005078}, + {-0.449563,0.617536}, + {0.159361,-0.300597}, + {0.681503,0.425180}, + {0.075334,-0.054530}, + {1.127598,-0.722161}, + {0.830144,-0.411552}, + {0.130735,-0.537078}, + {-0.318294,0.279468}, + {1.329998,0.436047}, + {0.628394,0.202456}, + {0.452344,-1.322196}, + {-1.328185,1.430783}, + {-0.607721,-0.864380}, + {0.504693,-0.747412}, + {0.873797,0.066753}, + {-1.716981,-1.433918}, + {-1.009027,-0.760573}, + {-0.113434,0.171071}, + {-0.037380,0.247667}, + {0.522725,-0.251274}, + {0.372523,-0.578671}, + {0.363876,-0.147056}, + {0.646783,-0.450081}, + {1.137476,0.323571}, + {-0.780254,-0.368106}, + {1.146234,0.162286}, + {0.762737,0.417214}, + {-1.238331,0.742666}, + {-0.390029,-0.580793}, + {0.171207,0.920070}, + {0.371806,-0.258019}, + {-1.675454,0.112764}, + {0.314425,0.532884}, + {-0.212717,0.521552}, + {1.230658,0.602619}, + {0.024240,1.086085}, + {-0.753075,0.421991}, + {1.184260,0.288993}, + {-0.156075,-0.349412}, + {0.070528,-0.556874}, + {1.304863,0.059083}, + {0.075264,0.205343}, + {-0.115468,0.910225}, + {-0.086719,-0.359175}, + {0.580907,1.065438}, + {0.059108,-1.456124}, + {1.143980,-0.250649}, + {-0.532360,0.202426}, + {-1.306963,0.894754}, + {-0.004374,0.331473}, + {0.530959,1.017206}, + {0.896061,-0.486310}, + {0.124527,-0.835825}, + {0.401800,-0.694786}, + {0.131098,-0.507110}, + {-0.493495,-1.031719}, + {-0.380582,0.015232}, + {-1.773868,0.203092}, + {-0.243199,-0.939094}, + {-0.243723,-1.167272}, + {0.991581,0.396060}, + {-0.559749,0.941881}, + {0.942520,1.077600}, + {-0.572208,0.399250}, + {-1.198896,0.820616}, + {-0.733767,0.042879}, + {-1.020932,1.153919}, + {-1.048099,0.943322}, + {-0.354407,0.317066}, + {0.308045,0.211141}, + {0.831764,-1.378969}, + {-0.007062,-0.513552}, + {0.967642,0.641026}, + {-0.668442,0.316706}, + {-1.122864,-0.024464}, + {0.316990,0.362859}, + {-0.111627,0.744548}, + {0.185230,-0.636517}, + {1.227635,-0.165264}, + {-0.506497,0.297073}, + {-0.317230,-0.293662}, + {0.344244,0.550272}, + {0.086386,0.725618}, + {-0.374595,0.121906}, + {0.205497,1.783572}, + {0.647253,-0.895754}, + {0.162982,-0.022414}, + {-0.994075,-1.237339}, + {1.033565,-0.151604}, + {-0.280396,0.878138}, + {-0.264564,-0.165480}, + {0.301752,0.255018}, + {-0.615882,0.711428}, + {0.300740,0.246028}, + {1.845295,-0.214744}, + {1.080206,-0.092894}, + {0.015605,0.522865}, + {1.172807,-0.447869}, + {-0.821485,0.490399}, + {-0.306496,0.230408}, + {0.709987,-0.375342}, + {-0.355816,0.453023}, + {-0.212208,-0.678919}, + {0.091036,-0.565006}, + {0.116062,-0.416735}, + {1.050847,0.339220}, + {1.742643,-0.228713}, + {-0.434887,-0.201646}, + {-0.382463,-0.917137}, + {-0.598962,0.979455}, + {-0.678083,-0.074060}, + {1.074554,0.667668}, + {-0.175566,0.080397}, + {-0.746242,-0.837080}, + {0.569198,-0.288397}, + {-0.419237,0.814960}, + {1.110668,0.610994}, + {1.024729,-0.522782}, + {0.287071,0.129891}, + {1.059693,0.192434}, + {-0.500546,1.681387}, + {-0.352649,0.693367}, + {1.330871,0.878471}, + {1.452162,1.296531}, + {-0.561816,1.060767}, + {-0.024246,0.549463}, + {-0.558191,-0.475732}, + {0.579874,-0.378951}, + {-0.386188,0.616314}, + {1.904212,-0.081406}, + {0.056011,0.587343}, + {2.079102,-0.449990}, + {-0.585793,0.200955}, + {-0.148105,-0.720863}, + {-0.871106,1.178992}, + {-0.259457,0.018706}, + {-0.838352,-0.101366}, + {1.104726,-0.165176}, + {-0.376425,0.962019}, + {-0.383321,-0.621639}, + {0.185654,-0.673447}, + {0.088111,0.910684}, + {1.972742,1.066469}, + {0.343070,1.425779}, + {0.235284,-1.008437}, + {-0.232498,-0.780531}, + {-0.285426,0.387394}, + {0.570176,0.601760}, + {0.857470,0.042025}, + {0.823288,0.485621}, + {-0.161700,0.393089}, + {0.653084,-0.695477}, + {0.397400,1.144465}, + {0.330464,1.209299}, + {-0.905504,0.536976}, + {0.462790,0.056269}, + {0.181789,0.418193}, + {-0.442622,-0.997435}, + {-0.622074,-1.020432}, + {0.174594,-0.272027}, + {0.195162,0.424718}, + {-0.483125,-0.014181}, + {-0.333027,-0.666385}, + {-0.225218,-1.387923}, + {0.380830,-0.801521}, + {0.500795,0.083064}, + {-0.354031,0.562019}, + {-0.322369,0.355784}, + {-0.689934,1.420140}, + {0.505533,0.590711}, + {-0.258165,-0.519527}, + {0.484829,0.168475}, + {-0.887195,0.627565}, + {-0.569851,0.255714}, + {0.656937,1.030732}, + {0.253163,1.183688}, + {-0.090994,0.350419}, + {-0.621855,0.522503}, + {1.260944,-0.340844}, + {-0.328843,1.339729}, + {-0.187433,0.904883}, + {-0.091476,1.344383}, + {-0.398040,-0.259532}, + {0.059961,-0.952296}, + {-0.669200,-0.513899}, + {0.882696,-0.883357}, + {0.445337,0.858188}, + {-0.376645,0.216174}, + {0.251451,1.293422}, + {-0.343713,0.459366}, + {-0.790002,-1.400639}, + {-0.281481,0.156530}, + {-0.050578,-0.812539}, + {-0.069669,-0.942398}, + {0.206314,1.062811}, + {-0.862538,0.079873}, + {-0.142145,-0.179803}, + {-0.635656,0.187704}, + {-0.288690,-0.632587}, + {0.489273,-1.319410}, + {-0.113265,0.243749}, + {-0.547880,0.138515}, + {0.503130,-0.553393}, + {-1.042138,1.207500}, + {0.993756,1.771553}, + {0.945115,0.708578}, + {-0.755664,-0.227831}, + {2.114421,0.144923}, + {1.322935,0.007610}, + {0.668800,0.872877}, + {1.206511,1.284430}, + {0.119083,1.037143}, + {0.469420,-0.968104}, + {0.178111,-0.706050}, + {-0.093654,0.351570}, + {1.216869,-0.083921}, + {1.128239,-0.721634}, + {-0.603763,-1.222727}, + {-0.246507,0.765585}, + {-0.469168,-0.154943}, + {0.115194,-0.645646}, + {-0.628875,-0.134190}, + {-0.218869,1.072319}, + {-0.304600,-0.845963}, + {0.041486,0.312707}, + {-0.824256,0.026274}, + {-0.398291,0.206157}, + {0.865547,0.384018}, + {-0.518704,-0.244805}, + {0.770365,-0.244413}, + {-0.853040,1.803973}, + {-0.112336,0.330401}, + {0.389707,0.066202}, + {-1.206726,-0.931216}, + {0.890161,1.029948}, + {0.224077,-0.218359}, + {-0.835221,0.379948}, + {-0.576608,0.010603}, + {-0.046229,-0.651582}, + {0.149031,-0.006860}, + {-0.232445,-0.153048}, + {-0.361445,-0.624316}, + {-0.089316,-0.902206}, + {-0.677576,0.291582}, + {-0.694052,0.341786}, + {0.604152,0.954109}, + {-0.451568,-1.027999}, + {0.888470,0.246610}, + {1.378708,-0.162367}, + {0.807884,-0.154657}, + {-0.121010,0.723971}, + {0.756675,-0.287967}, + {-1.352302,0.460834}, + {-0.539413,-0.417247}, + {0.138693,0.716212}, + {-1.262669,0.189740}, + {-0.127893,0.098501}, + {-2.031114,-0.515120}, + {-0.566216,0.134760}, + {-0.894512,-1.013835}, + {0.545570,-0.785318}, + {0.314537,-0.541041}, + {-0.623232,-0.972520}, + {-0.239815,-0.060572}, + {-0.016385,0.088118}, + {0.233685,0.536110}, + {-0.701300,0.465990}, + {0.772176,-0.169732}, + {-0.111524,-0.101524}, + {0.058288,1.465041}, + {0.712798,-0.116610}, + {0.667813,0.354510}, + {-0.055343,-0.426603}, + {0.923450,-0.343740}, + {0.351264,-0.768122}, + {-0.881422,0.152680}, + {-0.929116,1.638255}, + {0.167936,-0.278059}, + {1.027618,0.529101}, + {-0.777487,-0.773029}, + {-0.171119,-0.587115}, + {-0.630818,0.969008}, + {0.561234,0.268168}, + {0.106045,-0.638529}, + {1.266788,-1.129971}, + {-0.995631,-0.558621}, + {0.188110,-0.702478}, + {0.335395,-0.240620}, + {-0.116215,0.260554}, + {0.680446,-0.603189}, + {0.904362,1.717741}, + {-0.015833,0.746788}, + {-0.148045,0.051645}, + {0.009869,0.846651}, + {0.298090,1.350605}, + {1.345340,-1.423719}, + {-0.754747,-1.335279}, + {0.419094,-0.864441}, + {-0.145479,-0.797688}, + {0.135712,0.991836}, + {0.225006,-0.060168}, + {0.355427,0.550726}, + {1.954229,0.656213}, + {-0.169736,0.311985}, + {0.939487,0.650424}, + {0.789964,-0.684274}, + {0.164532,0.093543}, + {0.060515,0.106031}, + {-0.024316,-0.913373}, + {-0.582858,0.242192}, + {-0.599441,0.706627}, + {-0.037631,-0.529508}, + {0.108102,0.029830}, + {-0.766994,0.601282}, + {-1.162212,-0.241856}, + {-0.283526,1.599770}, + {-1.549907,-0.505364}, + {0.722774,0.073483}, + {-1.024597,-0.392075}, + {0.858099,-0.287027}, + {0.327537,-1.007954}, + {0.667032,-0.025028}, + {0.975513,0.143732}, + {0.018982,0.474133}, + {-0.098149,1.106961}, + {-0.108187,-0.707083}, + {-0.219794,0.475886}, + {0.210508,-0.510677}, + {-0.416087,-0.900413}, + {-0.752409,-0.392688}, + {0.327123,-0.496539}, + {-0.879819,-1.010528}, + {-1.401704,-0.483436}, + {-1.566675,-0.015039}, + {-0.550926,-0.315944}, + {-0.711913,-0.986015}, + {0.408434,-0.200798}, + {-0.921718,0.340502}, + {-1.323506,-0.767555}, + {0.762208,-0.010204}, + {1.414222,-0.108579}, + {-1.279120,-0.115126}, + {-1.063315,-0.287798}, + {-0.612699,0.708367}, + {1.058841,-0.974767}, + {-0.887090,0.515838}, + {-0.169713,-0.586082}, + {0.468957,-1.057315}, + {-1.137185,-0.201351}, + {0.857001,0.506281}, + {-0.694478,1.116885}, + {-0.101536,0.252581}, + {-0.186678,0.121469}, + {0.237319,1.220649}, + {0.590731,0.106154}, + {-0.307152,-0.195058}, + {-0.534827,0.484876}, + {1.112901,0.239961}, + {0.050445,0.481539}, + {0.545830,0.854745}, + {-0.687006,-0.117939}, + {0.167796,0.067286}, + {-0.200961,-0.851043}, + {-0.029250,-0.070030}, + {0.571111,-0.402512}, + {-0.291893,-0.486622}, + {0.199427,-0.464909}, + {0.485504,0.196643}, + {-1.203786,1.305744}, + {-0.457443,2.058590}, + {-0.206683,-0.175040}, + {0.166361,0.461590}, + {-0.426843,-1.352936}, + {0.501698,0.238129}, + {-0.809285,-0.792133}, + {-0.655155,0.336089}, + {0.726113,-1.582158}, + {-0.150580,0.179097}, + {0.715039,-1.127365}, + {-0.012255,-1.422302}, + {-0.291115,-0.120922}, + {0.109163,0.722364}, + {0.653337,0.016132}, + {0.459079,-0.773381}, + {-1.171660,1.182249}, + {-0.102436,0.837007}, + {0.845445,0.528685}, + {-0.409713,0.406902}, + {0.830749,0.057450}, + {0.671611,0.782030}, + {0.200145,-1.167993}, + {-0.205830,-0.256860}, + {0.341035,0.280555}, + {-1.201147,-0.323218}, + {-0.212821,0.050460}, + {0.742152,-0.323082}, + {0.819270,0.195198}, + {0.669024,0.897072}, + {-0.501893,-0.365942}, + {-1.308934,0.089249}, + {-0.037597,-0.113499}, + {-1.004372,0.368385}, + {0.141077,-0.067610}, + {0.275376,-0.743583}, + {-0.191894,-1.129273}, + {-1.258964,-0.039886}, + {0.728804,-1.000285}, + {1.086578,-0.617149}, + {-0.855317,-0.310454}, + {-0.147711,0.408143}, + {-0.517206,0.043758}, + {0.719426,-1.283598}, + {-0.235939,0.668859}, + {-0.380010,-0.313257}, + {0.316778,-0.118759}, + {-0.262927,-1.567183}, + {-0.282733,0.420140}, + {0.818925,-0.012589}, + {0.357610,0.577911}, + {-0.190272,-0.414123}, + {0.625359,1.169565}, + {-0.917634,0.809205}, + {0.909000,-0.614465}, + {-0.273865,0.307313}, + {0.708742,1.146401}, + {-0.736018,1.297624}, + {-0.132588,-0.042389}, + {0.752216,-0.630562}, + {0.602787,-0.506396}, + {0.633488,0.200361}, + {0.862136,-0.559107}, + {0.745865,-1.328896}, + {-0.015377,-0.603058}, + {0.012261,0.207465}, + {-1.262966,0.309847}, + {-0.816732,-0.048421}, + {1.368862,-0.089376}, + {-0.950272,-0.966439}, + {0.201282,-0.088005}, + {-0.675286,0.791768}, + {0.857350,-0.330363}, + {0.297582,-0.494692}, + {-0.536755,0.002392}, + {-0.209953,0.732953}, + {-0.443116,-0.086068}, + {-1.175001,0.573199}, + {-0.515406,0.620601}, + {0.519220,0.365639}, + {0.179975,-0.360670}, + {-0.307683,0.106896}, + {0.132153,0.727465}, + {-0.280980,-0.228803}, + {0.239138,-0.878369}, + {-0.037641,0.340422}, + {0.908774,-1.101317}, + {0.049850,-0.299075}, + {0.019113,0.674994}, + {-0.015975,0.379414}, + {0.288954,-0.809359}, + {0.347018,-1.157598}, + {0.074732,-0.537650}, + {0.996135,-0.001765}, + {0.056827,-0.488387}, + {-0.833093,0.386931}, + {0.758476,0.872903}, + {-0.745092,-0.444934}, + {-0.224247,-0.116532}, + {-0.204749,0.261726}, + {0.404937,0.616612}, + {0.339130,0.532116}, + {0.321454,-0.851996}, + {0.318065,0.804013}, + {0.255111,-0.303607}, + {0.430730,0.409011}, + {0.336340,-0.608268}, + {0.689794,0.099887}, + {0.120092,0.052738}, + {-0.588516,-0.366448}, + {0.325651,-0.658579}, + {0.947989,-0.734417}, + {0.016734,-0.728917}, + {-0.841605,0.381322}, + {0.231804,0.206317}, + {1.051284,-0.490680}, + {-0.050906,-0.211480}, + {-0.105047,0.477795}, + {-0.252414,-0.626855}, + {-0.057217,-0.134807}, + {1.067822,-0.178322}, + {-0.086659,-1.147155}, + {-0.741801,0.582173}, + {0.803925,-1.119881}, + {0.543473,0.197205}, + {0.407991,-0.434675}, + {0.107264,-0.319198}, + {1.091457,0.760169}, + {-0.013718,0.000686}, + {-1.248275,0.208178}, + {-0.899392,0.261502}, + {-0.631148,-0.302873}, + {0.083128,0.705050}, + {-0.778608,-0.788078}, + {1.135346,-0.872922}, + {-1.157340,-0.867567}, + {-0.593543,-2.187029}, + {0.093469,0.234575}, + {0.443437,-0.304265}, + {1.551142,-1.422596}, + {0.442576,-1.577903}, + {0.192425,0.160683}, + {-0.902680,-0.431437}, + {-1.004525,-0.745898}, + {-0.483396,-0.192180}, + {1.080987,-0.266741}, + {-0.903296,1.170854}, + {-0.364402,0.684777}, + {0.309202,-0.017096}, + {-0.492831,-0.600043}, + {-1.612991,-0.804477}, + {-0.407146,-0.758813}, + {0.829137,-0.603992}, + {-0.251557,-0.383196}, + {-0.743938,0.109216}, + {1.011679,-0.340907}, + {0.241315,0.068707}, + {-1.006463,0.402521}, + {0.031220,-0.028792}, + {-0.417251,-1.398311}, + {0.775474,0.111723}, + {-1.223098,-0.658243}, + {2.340365,-0.265007}, + {0.301015,-0.206530}, + {-0.200633,-0.557171}, + {-0.202832,0.319060}, + {-0.010049,0.742861}, + {0.106082,0.811121}, + {0.055592,-0.191956}, + {0.355395,0.583195}, + {0.282830,-0.170406}, + {0.025638,1.918779}, + {0.944669,-0.058716}, + {1.264998,1.490664}, + {0.823037,0.092036}, + {1.217579,-0.491040}, + {0.037653,-0.782702}, + {0.149131,-0.656208}, + {0.410757,1.584757}, + {1.325665,0.028426}, + {0.971514,-0.170968}, + {0.142927,-0.349601}, + {-0.675615,1.239243}, + {1.118417,0.482521}, + {-0.525994,0.493175}, + {-1.053111,-0.390079}, + {0.030564,0.067288}, + {-0.074059,-0.899509}, + {-0.360663,0.382902}, + {0.550419,0.853873}, + {-0.544569,-0.824151}, + {0.568337,0.130398}, + {-0.604970,0.925242}, + {0.220753,-0.254279}, + {0.337711,0.557667}, + {-0.753422,-0.586669}, + {0.428708,-0.232984}, + {1.794279,0.483338}, + {1.304773,-0.365589}, + {-0.433436,-0.791504}, + {-0.214934,0.966716}, + {-0.305057,0.580224}, + {-0.106751,-0.822595}, + {1.028315,-0.877748}, + {0.852443,-0.409121}, + {0.625301,0.180248}, + {1.396398,0.143160}, + {1.108587,0.541150}, + {0.468621,-1.043421}, + {0.906804,0.715312}, + {-0.766680,0.905431}, + {-0.441257,0.668639}, + {0.284121,-0.043281}, + {-0.616953,0.794195}, + {0.163532,-0.395955}, + {-0.412360,-0.597153}, + {0.241518,-0.585513}, + {0.482960,0.567925}, + {-1.054434,-0.649045}, + {0.605650,-0.378689}, + {-0.609803,0.359699}, + {1.365516,0.646388}, + {-0.344219,0.120575}, + {-0.654285,-0.631225}, + {0.468870,0.618246}, + {-0.390055,0.556382}, + {-0.508965,0.454676}, + {0.116800,0.138547}, + {-1.168829,-0.304091}, + {-0.385664,-0.659049}, + {-0.639212,-1.396839}, + {1.224527,1.061921}, + {-0.712606,-0.081001}, + {0.120125,-0.300214}, + {0.179791,-0.636082}, + {-0.605018,-0.693630}, + {-0.678318,-0.318564}, + {-0.598472,-0.031708}, + {-0.520574,-0.296742}, + {0.067744,-0.796947}, + {0.696445,0.463145}, + {0.094760,-0.023756}, + {-1.028425,1.287291}, + {-0.669956,0.116063}, + {-0.209304,0.099915}, + {-1.108453,-0.002002}, + {-0.060206,-0.515472}, + {0.981295,0.380674}, + {0.263531,-0.667106}, + {0.250979,0.072504}, + {-0.096590,0.766292}, + {0.920231,-0.755035}, + {-0.505097,-1.091862}, + {-0.615787,0.117510}, + {0.368374,0.389098}, + {-0.126383,-0.430203}, + {0.164085,-0.529933}, + {0.599555,-0.034148}, + {1.102519,-0.438562}, + {0.085070,-0.251993}, + {0.865140,0.585431}, + {0.934833,-1.057558}, + {0.249809,-0.620187}, + {0.265592,1.080486}, + {-0.634548,-0.038819}, + {-0.150059,0.264938}, + {0.250318,1.521858}, + {-0.173384,-0.223300}, + {0.129138,0.492724}, + {1.592594,0.165069}, + {-0.331133,1.012240}, + {-0.697260,-0.195315}, + {-0.312506,-1.024730}, + {-0.234223,-0.824909}, + {-0.383885,0.106128}, + {-0.175865,0.392687}, + {-0.510849,-0.462690}, + {-1.018937,1.151529}, + {-0.038301,-0.066566}, + {0.530731,0.127405}, + {-0.208679,-0.107666}, + {0.120497,1.016165}, + {-0.052440,0.725401}, + {1.832884,-0.342007}, + {0.092143,0.258115}, + {-1.159934,-0.970688}, + {0.589430,-0.586012}, + {1.209632,1.986167}, + {-0.366520,0.055513}, + {0.384307,0.775611}, + {-0.877936,-2.193519}, + {-0.003713,1.002400}, + {-1.173911,0.755036}, + {-0.477599,0.075858}, + {0.388147,0.137404}, + {-0.270243,-0.165515}, + {-0.260462,1.171696}, + {-0.150456,-0.885312}, + {0.469399,-0.599552}, + {-0.597813,-0.750128}, + {0.095583,-0.274177}, + {-0.509728,1.587391}, + {0.972749,0.614814}, + {-0.752960,-0.189362}, + {1.062092,-0.210413}, + {-0.114508,0.325050}, + {1.881627,0.271021}, + {-1.128107,-0.567826}, + {0.014185,-0.695967}, + {0.338390,0.827812}, + {-0.274898,0.464329}, + {0.550296,0.200794}, + {-0.197346,-1.187593}, + {-0.155908,-0.802583}, + {-0.207092,-0.070371}, + {-0.486399,-1.113643}, + {-0.129494,-0.242884}, + {0.631126,0.237594}, + {0.772150,-1.293381}, + {-0.148225,1.069063}, + {-0.557726,0.180037}, + {-0.251261,0.420506}, + {-0.687525,-1.530252}, + {0.308271,-0.038557}, + {-1.212547,0.035603}, + {-0.060400,-0.303898}, + {1.425639,-0.355048}, + {0.144429,0.420649}, + {-0.688609,-0.997562}, + {0.259183,-0.891376}, + {0.275503,-0.114022}, + {-1.060990,-0.859264}, + {-1.590535,-0.179986}, + {-0.197122,-0.339152}, + {-1.741402,-1.241081}, + {-0.101596,-0.103421}, + {-0.576440,-0.998940}, + {-0.159847,-0.078504}, + {-0.598367,-0.701100}, + {0.454856,0.507896}, + {-1.739180,-0.913037}, + {1.341986,0.134193}, + {-0.290217,-0.535215}, + {0.783955,-0.574633}, + {-0.126710,-1.241383}, + {-1.693904,-0.209030}, + {0.500406,0.058675}, + {0.876139,-0.205673}, + {0.347464,1.353533}, + {-0.250533,-0.590198}, + {-0.049717,0.984800}, + {-1.667565,-0.013165}, + {0.328547,0.584034}, + {-0.578874,-0.321222}, + {0.607281,-0.663825}, + {-0.042807,-0.635103}, + {-0.198325,-0.054844}, + {-0.567400,-1.007322}, + {0.181597,-0.281650}, + {0.922825,0.237707}, + {-0.725941,0.008540}, + {0.146820,0.712341}, + {-2.004479,0.919673}, + {-0.437029,-0.158475}, + {0.009848,0.194884}, + {0.064501,0.515108}, + {0.966986,-0.106012}, + {0.431525,-0.640987}, + {0.226213,0.704404}, + {-0.389554,0.297250}, + {0.227194,-0.123749}, + {0.958163,0.684737}, + {-0.763641,-1.299124}, + {-0.519729,1.144937}, + {0.517323,0.380140}, + {0.358759,-0.376012}, + {0.485276,-1.189659}, + {-1.128039,0.154856}, + {0.012640,-0.800780}, + {-1.023062,0.541789}, + {-0.088985,1.220985}, + {-0.274541,0.330453}, + {-0.223176,0.277022}, + {-1.250833,0.859561}, + {0.166349,-1.059528}, + {0.706370,1.301363}, + {0.865846,-0.966971}, + {-0.746104,-0.181980}, + {-0.382071,-0.287606}, + {-0.696105,0.935651}, + {-0.754779,-0.608633}, + {1.558518,-0.068025}, + {-0.730162,-1.159437}, + {-1.243312,-0.025267}, + {0.538259,-0.151188}, + {0.755668,0.731049}, + {0.362774,-1.112199}, + {0.951361,-0.710292}, + {1.205493,0.703087}, + {-0.384461,-0.900938}, + {0.558954,0.738985}, + {0.534887,-0.264438}, + {0.451519,-0.094902}, + {0.271715,-0.849368}, + {-0.622068,-0.879637}, + {0.747059,0.748628}, + {-0.141696,-0.554025}, + {-0.162613,-0.058699}, + {-0.438999,-0.305623}, + {-0.974950,-0.030913}, + {-0.836826,-1.211227}, + {0.066026,-0.500706}, + {0.317875,0.639406}, + {1.768633,-1.108933}, + {-0.169267,-0.005666}, + {0.308455,0.547168}, + {-0.792556,-0.067929}, + {-1.053188,-0.742882}, + {-0.439344,1.796462}, + {0.928509,-1.153488}, + {-0.883353,0.292079}, + {1.150053,-0.757907}, + {0.159497,0.386146}, + {-0.575171,0.435701}, + {-0.104603,-0.597094}, + {-0.010359,-0.762375}, + {0.533096,-0.049087}, + {-0.622529,-0.504482}, + {-0.649558,-0.521691}, + {1.604563,-0.953022}, + {0.483842,0.422572}, + {0.604771,0.258910}, + {-0.420070,0.075085}, + {-0.670900,-0.537843}, + {-0.643097,-0.750436}, + {2.158761,-0.134695}, + {-0.699376,1.792557}, + {0.316584,0.159085}, + {-1.290301,0.659405}, + {-0.470062,0.491114}, + {-0.217911,0.097260}, + {-0.883950,0.411357}, + {-1.137233,-0.417558}, + {-0.060187,0.823960}, + {-0.527339,0.909397}, + {0.614027,-0.516774}, + {0.326730,-0.720490}, + {-0.732945,1.140511}, + {0.527214,-0.857791}, + {0.354728,0.527356}, + {-1.042879,-0.843408}, + {0.388951,-0.250227}, + {-0.760452,-0.272504}, + {0.670556,1.780283}, + {0.178493,-0.103607}, + {0.281239,0.573283}, + {-0.276774,-0.666889}, + {-0.369088,-0.515050}, + {-1.566099,-0.292304}, + {0.241018,0.111041}, + {-0.579810,-0.131634}, + {0.614676,-1.020588}, + {2.122965,-0.652456}, + {1.003513,-0.009904}, + {0.384063,-0.315227}, + {1.662325,-1.228987}, + {0.421827,-0.875429}, + {0.615807,-1.046427}, + {-0.369778,0.103087}, + {-1.400076,-1.351331}, + {0.243226,0.565874}, + {-0.190009,-1.569295}, + {0.431636,-0.614997}, + {0.640676,-0.202974}, + {0.723470,0.490124}, + {0.178854,0.920912}, + {0.291047,0.310138}, + {1.437523,-0.613064}, + {0.311316,1.098868}, + {0.064226,0.222299}, + {0.635425,0.681261}, + {-2.079335,-0.027042}, + {-1.620853,-0.434969}, + {-0.771540,-0.951936}, + {0.075813,-0.359065}, + {-0.196248,0.026575}, + {0.549859,-0.479033}, + {0.779249,-0.479395}, + {0.489763,0.682128}, + {0.779679,0.447111}, + {0.248959,-0.926465}, + {-0.978864,-0.625647}, + {0.487766,-0.729178}, + {0.488021,-0.395398}, + {-1.132487,-0.266249}, + {-0.946289,-0.121230}, + {-0.043873,-0.494146}, + {-1.797368,-0.163129}, + {0.604546,0.840547}, + {-0.100001,0.205591}, + {-0.704900,-0.745045}, + {0.141108,-0.367080}, + {0.714093,0.338304}, + {-0.211548,0.288865}, + {-0.139203,1.696446}, + {0.398683,-0.856051}, + {-1.399684,1.056120}, + {-0.172748,-0.560887}, + {-0.742047,-1.011942}, + {0.435281,-1.466353}, + {0.372200,0.312796}, + {-0.470258,0.052912}, + {-0.720672,-0.015639}, + {0.525673,0.064041}, + {0.322946,0.778343}, + {-0.715545,0.200291}, + {-0.638279,-0.376644}, + {0.318214,1.262688}, + {0.518733,-0.228811}, + {-0.587650,-1.462563}, + {0.669318,-0.231777}, + {0.771174,0.304270}, + {-0.186317,1.664676}, + {0.111617,-1.626430}, + {-0.574343,1.310556}, + {1.093523,1.010366}, + {-0.051229,0.373412}, + {-1.055527,-0.123199}, + {1.258413,-0.434222}, + {0.204129,0.827730}, + {-0.609029,0.323469}, + {1.834988,0.769506}, + {-0.473224,0.009616}, + {-0.936846,-1.464676}, + {0.419282,0.867511}, + {0.691505,-0.431348}, + {0.462740,-0.806883}, + {-0.077804,0.056353}, + {0.201756,0.460018}, + {-0.101533,-0.186722}, + {-0.683106,-0.812029}, + {0.393013,0.220783}, + {0.960070,0.016689}, + {-0.818561,0.072895}, + {-0.304093,0.221132}, + {0.432887,0.613225}, + {0.799350,1.722360}, + {-1.201054,0.101461}, + {-0.284951,-0.099726}, + {-0.284407,1.019124}, + {1.161096,-1.015084}, + {0.470649,0.547416}, + {0.910485,-0.148244}, + {0.903437,-0.639555}, + {0.414630,-0.744832}, + {-0.807047,0.328593}, + {0.546277,0.129403}, + {0.979881,1.317070}, + {0.815188,-1.157551}, + {0.652102,0.325572}, + {0.986148,-0.443291}, + {0.321192,-0.168401}, + {-0.095464,0.134572}, + {-0.644626,-0.367752}, + {1.186512,1.426639}, + {-1.268228,-1.212135}, + {0.329307,-0.048942}, + {-0.453068,0.181014}, + {-0.120221,1.319718}, + {0.203761,1.057543}, + {0.323603,-0.370886}, + {1.278257,0.506360}, + {-0.137128,-0.217014}, + {-0.123980,-0.196150}, + {0.969988,0.131635}, + {1.034595,0.043616}, + {0.051072,-0.038913}, + {0.475718,0.545762}, + {0.860966,-0.183492}, + {1.509751,0.139050}, + {0.183777,0.478787}, + {0.452950,0.262511}, + {1.193602,-0.473727}, + {1.279293,1.055423}, + {0.496909,0.719865}, + {1.540333,-0.346943}, + {-0.293427,-0.718329}, + {0.304463,1.034630}, + {0.081471,-1.789542}, + {-0.654413,0.275167}, + {-0.234365,0.326354}, + {-1.026665,0.836313}, + {1.740778,-0.446498}, + {1.571499,0.008159}, + {-1.551162,0.190736}, + {0.766180,-1.958868}, + {-0.246677,0.141081}, + {-1.245445,-1.767784}, + {0.338713,-0.398232}, + {-0.167049,0.337391}, + {1.670908,-0.878596}, + {-0.346210,0.066791}, + {-0.167848,-0.262351}, + {-0.838038,-0.908504}, + {0.665549,-0.241012}, + {0.507867,-1.133164}, + {0.083940,-0.788292}, + {0.689884,0.002313}, + {0.188896,0.230707}, + {-0.395535,0.585358}, + {0.759700,0.630998}, + {0.406334,0.692208}, + {-0.523691,0.244080}, + {-0.358877,-0.192886}, + {0.658757,-1.197811}, + {0.276591,-0.550659}, + {1.042222,-0.377038}, + {-0.519696,0.588037}, + {0.042507,0.893983}, + {-1.038433,-0.388424}, + {0.229740,0.097563}, + {0.050357,0.853214}, + {1.178250,0.666711}, + {1.119683,0.327372}, + {0.299392,0.581337}, + {-0.726023,0.958577}, + {-2.087364,-0.040116}, + {-0.733430,-0.365305}, + {-0.183230,0.747083}, + {0.195544,-0.669629}, + {0.096009,0.081064}, + {-0.158337,0.140540}, + {-0.141282,1.098426}, + {-0.200366,-0.260091}, + {0.179909,0.324990}, + {-0.177505,0.710188}, + {0.418389,0.656253}, + {0.201164,-0.480767}, + {-0.663206,-0.632061}, + {0.866354,0.298333}, + {0.580605,-0.186255}, + {1.573994,-0.905037}, + {-0.331628,-0.857198}, + {0.740416,0.061667}, + {-0.564123,-0.882095}, + {-0.015107,0.034831}, + {0.843711,0.918154}, + {-1.214840,0.950409}, + {-0.362231,0.026602}, + {-0.345554,0.438305}, + {-0.413601,0.471900}, + {-1.395099,-1.305808}, + {-0.405840,-0.326921}, + {0.411408,-0.368048}, + {0.883666,-0.358755}, + {-0.035198,0.003136}, + {0.954488,-0.213214}, + {0.332939,0.172640}, + {0.959216,0.688263}, + {0.018761,2.039100}, + {2.100315,0.051013}, + {-0.271325,-0.485585}, + {0.510974,-0.232181}, + {-0.510400,-0.715401}, + {0.026534,-0.521681}, + {0.089140,0.147550}, + {-0.756320,0.829660}, + {-0.500559,0.266032}, + {-0.082253,0.526760}, + {-0.317537,1.100217}, + {0.537659,0.004379}, + {-0.511521,-0.070164}, + {-0.950504,0.979454}, + {-0.434086,-0.894423}, + {-0.161771,0.383922}, + {0.169965,0.443431}, + {1.126951,0.313781}, + {-0.083320,0.064187}, + {1.105827,0.058595}, + {1.599304,1.457213}, + {0.097539,-0.136787}, + {0.050654,0.763772}, + {-0.815735,0.069732}, + {0.712392,0.340298}, + {-0.349751,1.663162}, + {-0.520406,0.437961}, + {-0.182619,-1.106802}, + {1.249108,0.082180}, + {-1.228325,-0.360564}, + {-1.231868,-0.419608}, + {-0.294485,0.226044}, + {-0.060826,0.702817}, + {-1.200765,0.467426}, + {-0.116198,0.278628}, + {1.214728,0.324470}, + {0.225038,0.563450}, + {-0.007607,-0.256299}, + {-1.010766,-0.953903}, + {-0.277060,0.812392}, + {0.707381,0.168940}, + {-0.918905,0.693847}, + {0.282631,-0.353127}, + {0.225166,1.501837}, + {-0.954247,-0.586650}, + {0.318076,-0.497355}, + {-0.418723,0.065298}, + {0.084946,0.228400}, + {0.307594,0.474237}, + {-0.107772,-0.421675}, + {-0.232476,0.576236}, + {0.586626,-0.859792}, + {0.283680,-1.605937}, + {0.065020,0.212051}, + {-0.474997,-0.555701}, + {0.353018,0.138387}, + {-1.107164,0.434415}, + {0.138023,1.048943}, + {0.390060,-0.475007}, + {0.216655,-1.005081}, + {-0.421095,0.760430}, + {0.827316,0.631502}, + {-0.349654,0.360977}, + {0.492383,1.430285}, + {-1.500687,0.296066}, + {-0.380852,-0.291811}, + {-0.484800,-0.267565}, + {-0.346712,0.186646}, + {-0.083542,0.405885}, + {-0.188996,1.142481}, + {1.320101,0.391448}, + {-0.146608,0.368600}, + {-1.163383,0.327332}, + {0.298202,-0.377332}, + {-0.805110,0.443164}, + {-0.871706,0.069784}, + {0.373116,-0.326406}, + {-0.607307,0.912847}, + {-0.607633,-0.101585}, + {1.970281,1.321946}, + {-0.148369,0.105401}, + {-0.282688,0.816048}, + {1.025746,0.483259}, + {-0.713131,0.610143}, + {0.300423,-0.665059}, + {-0.374302,0.666611}, + {-0.869616,0.119894}, + {1.018758,-0.715852}, + {-0.928172,-1.549172}, + {0.085113,0.833680}, + {1.108642,0.496890}, + {-1.549615,-1.217051}, + {0.266179,-0.905077}, + {-0.215376,0.513998}, + {1.069599,0.120225}, + {-0.307138,-0.329984}, + {-0.571582,-0.130708}, + {2.142098,-1.288388}, + {-0.420347,1.053044}, + {0.495939,-0.195319}, + {0.502492,0.785095}, + {0.766173,0.428730}, + {-0.099107,-0.093918}, + {0.729183,-0.195718}, + {0.426967,0.415027}, + {-0.895545,0.886429}, + {-0.968602,-1.162273}, + {0.416021,-0.046332}, + {-1.219170,0.166351}, + {0.586550,-0.244157}, + {0.838475,-0.615897}, + {-0.672975,-0.618807}, + {-0.360221,-0.009750}, + {-0.674237,-0.787390}, + {0.760231,-0.187308}, + {-0.812272,-0.645441}, + {0.790059,-0.221013}, + {-0.232809,-1.981273}, + {1.111118,0.087870}, + {0.404225,-1.245472}, + {0.461102,0.105999}, + {0.013247,1.296239}, + {-0.108755,0.536528}, + {-1.449621,0.250056}, + {-0.195004,-1.416802}, + {0.037800,-0.364457}, + {0.552454,-0.675048}, + {-0.065913,0.268582}, + {-0.831306,-0.075565}, + {0.515745,-0.533599}, + {-1.138916,-1.364227}, + {-0.070245,-0.567231}, + {0.128759,0.526600}, + {0.665589,0.326906}, + {-0.224787,0.432314}, + {-0.228078,-0.843603}, + {-0.031752,-0.495566}, + {0.022634,-0.591376}, + {-0.700905,1.335250}, + {-0.661231,0.287638}, + {0.023830,-0.433696}, + {-1.666931,-1.034963}, + {0.531734,-0.239730}, + {-0.827702,-1.580614}, + {-0.751258,0.940162}, + {-0.287944,-0.191240}, + {-0.907179,-0.244279}, + {0.709229,-0.938878}, + {0.900749,0.288377}, + {-0.676512,1.189215}, + {0.514203,0.472178}, + {0.721634,-0.583054}, + {1.061447,0.267226}, + {-1.211157,0.301310}, + {-0.167337,-0.373970}, + {0.028457,0.985726}, + {0.110579,-0.098623}, + {-0.172895,-0.801720}, + {1.208278,0.474267}, + {-0.384456,-1.699807}, + {-0.218454,-0.500844}, + {-0.106211,0.296750}, + {-1.006444,-0.168547}, + {0.382713,-0.009482}, + {0.331157,-0.878432}, + {0.031083,-0.458680}, + {-0.365436,-0.454964}, + {-0.398935,-0.993382}, + {-0.769671,0.501222}, + {-0.051267,-0.864739}, + {1.167413,0.251483}, + {-0.638681,-0.123305}, + {-0.903249,-1.315449}, + {1.127817,0.729152}, + {-1.489803,-0.197712}, + {0.258543,-0.400706}, + {-0.067041,-0.250410}, + {1.170671,0.585027}, + {-1.025814,-0.952182}, + {0.191594,-0.695594}, + {1.088652,0.211765}, + {-0.672739,0.157990}, + {0.594503,-0.652204}, + {0.621315,-1.149470}, + {-1.002667,-0.051699}, + {-0.548659,0.070243}, + {-0.256829,-0.297262}, + {0.978255,0.627959}, + {0.645651,0.839562}, + {0.851345,-0.772047}, + {0.605615,-1.084795}, + {-1.066617,0.157309}, + {-0.431485,-0.334219}, + {-0.065427,-1.128954}, + {-0.568002,-1.040160}, + {0.572203,-0.754751}, + {0.659738,-0.070165}, + {-0.381698,-0.328700}, + {-1.564251,0.477004}, + {0.088705,-1.206888}, + {0.054398,1.727333}, + {-0.225188,-0.242253}, + {0.166157,-0.688561}, + {-0.949477,0.963288}, + {0.412511,0.460764}, + {-0.156152,-0.188229}, + {1.155036,0.424556}, + {-0.490640,-0.278005}, + {-0.412096,0.287758}, + {1.863923,-0.062265}, + {-0.222627,0.474599}, + {1.395178,0.343841}, + {-0.147666,-1.077881}, + {-1.174875,0.087301}, + {0.690832,0.894002}, + {0.207429,-0.821849}, + {1.005274,1.609804}, + {0.371987,-0.429320}, + {-0.514226,-0.590668}, + {-0.026782,0.397409}, + {1.015714,0.810520}, + {0.927649,0.649634}, + {0.776910,-0.296798}, + {0.976134,0.656214}, + {0.003040,-0.262665}, + {0.315733,1.042726}, + {-0.596531,0.246790}, + {-0.402001,0.608359}, + {0.581907,0.501635}, + {1.279527,0.729790}, + {0.490545,0.881851}, + {1.094798,-1.607173}, + {0.965914,0.484647}, + {-0.960222,0.649783}, + {0.364875,-0.219241}, + {-0.077840,-0.737867}, + {0.774998,0.247243}, + {-0.119677,-0.232309}, + {-0.570180,-0.118825}, + {0.977602,1.283441}, + {0.831912,-0.804168}, + {-0.196479,-0.062512}, + {0.656737,0.855329}, + {0.528258,-0.285970}, + {-2.250344,0.084504}, + {0.546068,0.570570}, + {-0.858377,-0.909879}, + {-1.108219,0.488554}, + {-0.490006,-0.454847}, + {0.049783,-0.432571}, + {0.144726,1.065848}, + {-1.394773,0.611523}, + {0.082976,0.531777}, + {0.285337,-0.535880}, + {0.308235,-0.704091}, + {-0.234517,0.379574}, + {-0.039539,0.828459}, + {0.357857,-0.609556}, + {0.753604,-1.306881}, + {0.790172,0.034169}, + {0.056248,-0.121251}, + {0.186954,0.648174}, + {-0.995005,0.274405}, + {-1.001077,0.860050}, + {-0.057085,1.511382}, + {-1.206087,0.878339}, + {0.137995,1.844478}, + {-1.493125,-0.998766}, + {0.745860,-0.643919}, + {-2.238097,1.200986}, + {-1.456539,0.719147}, + {0.950348,0.805055}, + {-0.011920,1.722326}, + {1.586502,-0.601509}, + {-0.761579,-0.427211}, + {-0.442142,0.336680}, + {0.366955,-0.402493}, + {0.706776,1.396136}, + {-0.456781,0.836723}, + {1.000545,-0.568838}, + {0.385663,0.662292}, + {0.477626,0.829285}, + {-0.458256,-1.032467}, + {-0.359687,-0.822045}, + {-0.684604,0.498532}, + {-1.225389,0.177601}, + {0.432596,0.406977}, + {-0.151285,0.179645}, + {1.147279,-1.685706}, + {0.525030,0.020319}, + {-0.118010,-0.066492}, + {-0.080738,0.414352}, + {0.066255,0.637437}, + {0.213317,-0.937024}, + {0.349175,-0.783824}, + {-0.536209,0.153490}, + {-0.439903,-0.158521}, + {0.270046,0.415777}, + {0.680110,-0.429989}, + {0.868958,-0.394753}, + {-0.327469,-0.604439}, + {0.018249,0.086110}, + {0.863033,-0.847249}, + {0.819329,0.546402}, + {1.547121,-0.605341}, + {-0.742487,0.218372}, + {-0.531181,-0.785213}, + {-0.414961,-1.837414}, + {-0.697729,-0.105849}, + {0.562781,1.161757}, + {-0.252197,0.174986}, + {1.019893,-1.022593}, + {1.147283,-0.216186}, + {-0.192484,0.544878}, + {-0.288308,-1.126081}, + {-0.653159,1.145602}, + {0.356144,-0.300500}, + {-1.877840,-0.660298}, + {-0.888508,0.081546}, + {0.095668,-0.650209}, + {-0.996078,-0.377501}, + {-0.936371,-1.051814}, + {0.735572,0.371096}, + {0.667417,0.241111}, + {-1.166763,-0.795707}, + {-0.604337,-0.214551}, + {0.366715,-0.220244}, + {0.135127,-1.369202}, + {-1.280505,0.349096}, + {1.611228,0.383331}, + {0.010946,-0.325781}, + {0.156384,1.852116}, + {-0.937935,0.398887}, + {-0.149062,0.073763}, + {2.104644,1.227660}, + {-0.626178,-0.143603}, + {0.148232,0.324548}, + {0.172888,-0.311778}, + {-1.220482,-0.578080}, + {-0.817595,1.215959}, + {-0.071187,-0.946781}, + {-0.316114,-0.621434}, + {0.612704,-0.753227}, + {0.053054,-0.899090}, + {-0.548320,-0.228200}, + {0.163999,0.796821}, + {-0.245404,0.209061}, + {0.441967,1.234234}, + {-0.551563,0.044447}, + {0.658026,0.187557}, + {0.127459,-0.986518}, + {-1.929082,-1.281298}, + {-0.281742,-0.218021}, + {-0.024907,0.738612}, + {-0.576868,0.213936}, + {1.047293,1.199670}, + {-0.588133,0.536676}, + {-0.873318,-0.257263}, + {-0.173412,-0.363335}, + {-0.711159,-1.458770}, + {-0.627417,-0.146663}, + {0.734973,0.087137}, + {1.617436,-0.176356}, + {-0.695416,0.009464}, + {0.641452,0.164848}, + {-0.365163,-0.298145}, + {-0.040627,-0.594555}, + {-1.136559,0.782394}, + {0.889175,1.501206}, + {-0.505251,-0.965412}, + {-0.235839,0.215222}, + {-0.031725,0.742335}, + {0.298775,-0.150465}, + {-0.849287,0.112957}, + {1.179378,0.099546}, + {0.512879,0.770936}, + {-1.199297,-0.033108}, + {-0.539796,0.936294}, + {-0.205207,-1.051996}, + {-0.131672,0.924508}, + {-0.089858,0.043459}, + {-0.523057,0.636311}, + {-0.307674,1.349578}, + {0.036264,0.711152}, + {1.140221,-0.739087}, + {-0.755562,0.284111}, + {-0.724637,2.054996}, + {-0.342831,-0.691441}, + {-0.131512,-0.096478}, + {-0.257152,0.074351}, + {0.214615,1.055861}, + {1.802147,-0.650688}, + {0.494614,-0.618490}, + {0.345858,-0.425000}, + {-0.654990,0.633968}, + {1.944518,-0.824383}, + {0.027463,-1.406552}, + {-0.356381,1.000390}, + {-0.326255,-0.349790}, + {-1.301773,-0.173698}, + {1.209587,0.733830}, + {-0.415904,-0.973085}, + {-0.342312,0.036046}, + {-0.186381,0.151542}, + {-0.326625,0.939369}, + {0.462830,-0.373640}, + {0.606673,-0.179940}, + {-0.484880,0.561731}, + {-0.508378,-0.365497}, + {0.234596,-1.627686}, + {1.368364,-0.734676}, + {-0.795618,-1.015961}, + {-2.239029,-0.882143}, + {0.465919,-0.251305}, + {0.445335,-1.446642}, + {-0.265756,0.613863}, + {-0.452452,-0.137435}, + {0.431065,0.801259}, + {-0.152433,0.602319}, + {-0.540982,-0.360173}, + {0.631619,0.163229}, + {-0.006424,-0.396139}, + {-1.237030,0.367923}, + {-0.850830,-0.132116}, + {0.775877,-0.627868}, + {0.771979,-0.413618}, + {0.022536,0.168067}, + {1.196601,0.009715}, + {-0.617334,0.060062}, + {0.364119,-0.116998}, + {0.673689,0.458119}, + {0.149576,-0.055954}, + {-0.543521,0.313275}, + {-0.158121,0.340606}, + {-1.637515,0.192407}, + {-0.980130,-1.214198}, + {0.271889,-1.100195}, + {-0.043511,-0.011070}, + {1.944409,1.536861}, + {1.054500,-0.241073}, + {-0.266577,-1.534933}, + {-0.040460,-0.625212}, + {-0.459612,-1.252847}, + {0.965432,0.594862}, + {0.576392,-0.927788}, + {-0.551566,0.279525}, + {0.426353,0.063682}, + {0.612646,-1.516517}, + {-0.007228,-0.346205}, + {0.011120,0.115249}, + {0.472003,-0.089491}, + {0.714530,-0.399992}, + {-0.151271,-0.191677}, + {-0.775722,0.462697}, + {0.938747,-0.059595}, + {-0.019837,0.256951}, + {1.336979,-0.025192}, + {-0.897808,-0.356736}, + {-0.805198,0.998662}, + {-0.427256,0.460826}, + {0.649266,-0.173119}, + {0.712430,-0.425832}, + {-0.254883,0.091398}, + {-0.082338,-0.612070}, + {0.215579,-0.567451}, + {-1.144568,0.155085}, + {0.780083,-0.289786}, + {-0.695259,0.933670}, + {0.982418,-1.676289}, + {2.030334,1.321377}, + {0.038067,0.527490}, + {-0.875315,-0.009320}, + {0.068908,-1.082731}, + {-0.327867,0.493442}, + {-0.247380,0.306530}, + {-0.737028,0.122061}, + {0.989016,0.117014}, + {-0.043846,0.663677}, + {0.666528,-1.034380}, + {0.394277,0.951912}, + {-0.002676,0.539665}, + {1.144832,0.222148}, + {0.575492,0.698214}, + {-0.465967,0.644700}, + {0.135505,-0.027215}, + {0.971868,0.345926}, + {0.064156,-0.279836}, + {-0.379608,0.096507}, + {-0.122669,-0.207917}, + {0.579961,0.725394}, + {0.595409,-0.048807}, + {1.252596,-0.666008}, + {0.928256,0.648530}, + {-0.765453,0.753437}, + {-0.869056,-0.282207}, + {0.599402,1.136827}, + {-0.491976,1.257567}, + {-0.690075,0.095121}, + {0.114144,0.613636}, + {-0.016676,0.984432}, + {-0.038227,1.273482}, + {-0.273440,0.465032}, + {-0.042422,-0.082568}, + {0.293014,-0.062751}, + {0.091950,1.052528}, + {1.290355,0.079452}, + {-0.373801,-0.287744}, + {0.178010,0.153087}, + {-0.069493,-0.767951}, + {0.592277,-0.164846}, + {-0.624072,0.699601}, + {-0.164866,0.014304}, + {-0.989879,0.549690}, + {-0.390924,0.210302}, + {0.028281,1.109096}, + {0.200445,-0.121299}, + {-0.837043,-0.089108}, + {-0.330949,-0.683155}, + {-1.497096,-0.744454}, + {0.724696,1.325496}, + {1.093918,-0.158002}, + {-0.986055,0.252052}, + {0.738405,0.425232}, + {0.346898,-0.636832}, + {0.795577,-0.558523}, + {1.639357,0.539509}, + {-1.027171,-1.972701}, + {-0.526853,0.066382}, + {0.029728,0.371083}, + {0.493240,-0.618207}, + {-0.085066,0.157037}, + {-0.598327,0.875382}, + {0.473045,-0.683630}, + {-0.190108,0.531203}, + {0.755223,-0.445656}, + {-0.970831,-0.378947}, + {0.691900,-0.774742}, + {-0.566027,-1.971771}, + {0.221130,0.861383}, + {1.126111,-1.603044}, + {-0.238397,-0.723054}, + {-1.355820,0.134919}, + {0.901198,0.804579}, + {-0.152608,-0.056988}, + {-0.405939,0.133609}, + {-0.748368,-0.793250}, + {-1.127288,-0.628552}, + {-0.545445,-0.085877}, + {-0.731033,1.379358}, + {0.017076,0.460959}, + {0.860053,0.187958}, + {-0.398644,0.846772}, + {-0.136298,-0.593748}, + {-0.570386,-0.054041}, + {-0.208522,0.414807}, + {1.089348,0.418117}, + {0.071506,-0.234059}, + {0.803787,-0.420491}, + {0.379378,1.744838}, + {0.984846,-0.269280}, + {0.287580,1.777600}, + {-0.044561,0.393765}, + {1.037652,0.288589}, + {1.365033,1.028047}, + {-0.268731,0.214781}, + {-1.399734,-0.585635}, + {0.396474,-0.012739}, + {-0.310157,-0.572639}, + {-0.869280,-0.470035}, + {-0.767115,-0.147986}, + {-0.594210,-0.009435}, + {-0.259161,0.687769}, + {0.400244,0.052298}, + {-0.081466,1.100944}, + {-0.597903,-0.298039}, + {-0.112978,0.185533}, + {-1.188213,0.607802}, + {0.406532,0.557457}, + {0.053603,0.608809}, + {-0.909431,-1.412004}, + {0.092312,-0.308009}, + {-1.045767,-0.193634}, + {-0.655190,0.515159}, + {-0.979891,-0.064583}, + {-0.305666,2.135184}, + {0.263726,-1.169643}, + {0.138287,0.442218}, + {0.414382,-0.295128}, + {-1.223938,-0.394704}, + {-0.670657,-0.732705}, + {-0.130172,1.369600}, + {0.795171,0.769043}, + {-0.363984,0.127902}, + {-0.154541,-0.229581}, + {0.285194,1.725037}, + {-1.330522,0.314956}, + {-0.233268,-0.249791}, + {-0.867872,-0.116151}, + {0.528821,0.939245}, + {0.529436,-0.728938}, + {1.562335,-0.647528}, + {0.100798,0.930577}, + {-0.638534,-0.474881}, + {-0.985353,-0.905430}, + {-0.508469,-0.557904}, + {0.109266,-0.555654}, + {0.066719,-1.050199}, + {0.086614,0.288710}, + {-0.064293,0.794723}, + {0.211760,0.375610}, + {-0.388465,0.047865}, + {0.115226,0.666505}, + {0.090883,-1.307463}, + {-0.505210,-0.481163}, + {0.297328,0.181031}, + {-1.005686,-0.291049}, + {-0.384623,-0.349974}, + {-1.117550,-0.533047}, + {-0.273571,1.197142}, + {-0.355377,-0.791390}, + {-1.166707,0.219873}, + {-0.039557,0.571754}, + {-0.869280,0.219124}, + {-0.267389,0.851277}, + {-0.047552,-0.759693}, + {-1.247211,0.340410}, + {0.074985,-0.567950}, + {0.114898,-0.993669}, + {1.315018,1.236524}, + {0.490222,-1.122814}, + {-0.208569,0.122706}, + {0.811257,0.284157}, + {-1.535386,-0.961487}, + {-0.575903,-0.329705}, + {-0.440839,0.189689}, + {0.461173,0.106876}, + {-1.404882,-0.039592}, + {0.157627,-0.164670}, + {-0.143457,-0.082398}, + {0.137764,-1.405608}, + {1.138510,0.467085}, + {-0.569274,0.068115}, + {0.254692,-0.256963}, + {-0.200568,-0.105250}, + {0.649507,0.852508}, + {0.256781,0.075334}, + {-0.422662,0.827176}, + {0.453451,-0.274344}, + {-0.619070,-0.789528}, + {0.511156,-0.517215}, + {-0.746724,0.533320}, + {-0.266023,0.211951}, + {0.820569,-0.021797}, + {0.906967,-0.184995}, + {0.080283,-0.845286}, + {0.216563,-0.065165}, + {-1.069864,-0.627168}, + {-0.694919,-0.377147}, + {0.560266,0.723653}, + {-1.810003,0.936073}, + {0.401495,-0.323666}, + {0.279725,-0.512582}, + {0.115233,0.391509}, + {-0.049100,0.503527}, + {0.381476,-0.924580}, + {0.158435,-0.369579}, + {-1.724612,-0.082530}, + {0.146337,-0.627385}, + {-0.580628,-1.005474}, + {-1.283667,-0.367336}, + {1.671694,0.093866}, + {0.495123,0.338942}, + {1.386453,1.289725}, + {0.046473,-0.010269}, + {0.345976,0.217331}, + {-1.307691,0.901025}, + {0.011671,-0.051992}, + {0.446749,0.491618}, + {-0.798861,-1.715122}, + {0.459684,0.845517}, + {-0.619994,-0.080941}, + {0.726701,0.519006}, + {0.366870,-1.500535}, + {-0.695698,-0.307731}, + {0.383154,-0.604660}, + {-0.200421,-0.592773}, + {0.845962,0.202566}, + {-0.081811,-0.479720}, + {-0.162211,0.211402}, + {-0.508318,-0.515009}, + {-0.598247,-0.160839}, + {-0.361101,1.022331}, + {-0.593453,-0.828867}, + {-0.335951,-1.161512}, + {0.323913,0.171438}, + {0.880390,-0.900887}, + {0.961106,1.439049}, + {-0.145219,0.714873}, + {-0.035628,0.517433}, + {-1.289047,0.344996}, + {0.823198,-0.391606}, + {-0.666119,-0.158353}, + {-0.497984,-0.154500}, + {0.346989,1.546966}, + {0.708533,-0.966663}, + {0.374617,1.425507}, + {-0.337693,0.237900}, + {0.070178,-1.763557}, + {-0.029864,-0.502392}, + {1.018740,0.551282}, + {0.470196,0.024369}, + {-1.046625,0.923415}, + {-0.440020,0.376281}, + {0.735956,-1.156211}, + {-0.994301,0.170391}, + {0.092725,0.006086}, + {0.907493,-0.090784}, + {0.594763,0.737713}, + {0.906663,-0.107508}, + {-0.367296,-0.557330}, + {-2.018388,0.168510}, + {0.752505,0.463679}, + {0.078006,0.290962}, + {0.109202,1.088115}, + {-0.098741,2.088661}, + {0.628856,0.143489}, + {0.531659,-0.603075}, + {-0.792778,0.565173}, + {1.033181,0.091416}, + {-0.436632,1.313604}, + {-0.484757,-0.142273}, + {0.419226,-1.120024}, + {0.480503,1.065520}, + {-0.237411,-0.260825}, + {0.605263,-0.918341}, + {0.875513,-0.731113}, + {1.386509,1.669871}, + {-0.213429,0.316753}, + {0.131674,1.000488}, + {0.748148,-0.249815}, + {-0.533266,0.340614}, + {-0.869102,0.414872}, + {0.441595,-0.694290}, + {0.054900,1.807807}, + {-1.703986,-0.934117}, + {-1.249102,0.046980}, + {-0.221412,-0.687920}, + {0.448836,0.201658}, + {0.650497,1.040959}, + {0.177494,-0.799854}, + {-0.085265,0.556515}, + {-0.932668,-0.426775}, + {-0.062327,-1.158497}, + {-0.500424,-0.587836}, + {0.391493,-0.387043}, + {-0.617236,-0.317457}, + {-0.578667,0.512964}, + {-0.169709,-0.817154}, + {-0.110670,0.372632}, + {-0.222525,-0.793149}, + {-0.009570,0.182038}, + {-0.527806,0.463093}, + {-1.697382,-1.718132}, + {0.361860,0.075201}, + {0.089404,0.241598}, + {-0.946784,0.814996}, + {-0.613512,-0.255426}, + {-0.177349,-0.488484}, + {0.054348,-0.553629}, + {-0.194009,1.167781}, + {1.709740,0.267476}, + {-0.821832,-0.696939}, + {-0.200828,-0.430296}, + {1.069248,-0.373373}, + {-0.238442,-0.199476}, + {-0.180144,-0.025549}, + {-0.139817,-0.071419}, + {-0.173577,-0.475708}, + {0.304222,-0.368525}, + {-0.590842,-0.064255}, + {-1.185859,-1.155381}, + {-0.081806,-0.629742}, + {0.922781,0.144932}, + {0.942112,0.322870}, + {0.825791,1.003816}, + {0.826714,-0.826888}, + {0.213177,0.794777}, + {-0.099002,-0.002608}, + {-0.492385,0.451787}, + {0.128127,1.082202}, + {0.271635,-1.443648}, + {-0.178330,-1.243963}, + {-0.067726,0.414538}, + {-0.546234,0.480571}, + {-0.991696,-0.224893}, + {0.432404,-0.524750}, + {-0.501489,-0.744894}, + {0.103839,-1.138339}, + {-0.279854,-0.368705}, + {0.455291,0.602993}, + {-1.678218,0.178024}, + {-0.130112,0.138684}, + {-1.101287,0.579001}, + {-0.092947,-0.011740}, + {0.295525,0.118103}, + {0.785569,0.325779}, + {0.504792,-0.455453}, + {1.132796,0.017106}, + {0.033302,0.186834}, + {0.810809,-0.362816}, + {-0.474375,0.097647}, + {-1.062575,-0.732286}, + {0.342440,-0.680445}, + {-0.732904,-0.575352}, + {0.303712,-0.631739}, + {-0.319236,-1.030421}, + {-0.387937,-0.348376}, + {-1.079633,0.118041}, + {-0.602187,-0.491677}, + {0.423529,0.249166}, + {-0.952323,0.209902}, + {0.034247,0.375740}, + {-0.592018,-0.397569}, + {-0.163837,-0.427724}, + {0.382374,-0.150979}, + {0.555706,-0.725082}, + {-0.355857,0.158597}, + {0.761846,0.076153}, + {-0.634078,-0.304593}, + {0.471280,-0.916497}, + {0.242803,0.758195}, + {0.754191,1.510976}, + {1.548155,-0.494631}, + {0.691794,-0.562304}, + {0.668136,-0.981643}, + {-0.254217,-0.991335}, + {-0.318592,-0.794923}, + {-0.462833,-0.254355}, + {0.963190,-0.369654}, + {-0.006760,0.514227}, + {-0.029911,0.884285}, + {0.486003,-0.768507}, + {0.111313,-0.201531}, + {0.594695,-0.372400}, + {0.590731,-0.701254}, + {-0.563540,0.783977}, + {0.368562,-1.798989}, + {0.756754,0.099174}, + {-0.637641,-1.143978}, + {0.650260,-0.244381}, + {-0.691307,-1.071333}, + {0.861524,0.340780}, + {0.505066,0.009908}, + {1.474460,0.787023}, + {0.976164,0.140441}, + {-0.254395,-0.077743}, + {-0.607054,-0.319290}, + {0.265146,0.411305}, + {-1.013336,0.386584}, + {0.105899,0.018232}, + {0.563171,-0.016770}, + {-0.940128,-0.278832}, + {-0.221102,0.977281}, + {1.567826,0.261716}, + {0.196254,-1.341196}, + {-0.102125,0.328156}, + {-0.201069,-0.674704}, + {0.352926,-0.898702}, + {0.911536,0.859603}, + {-0.528193,0.953868}, + {1.140887,0.032021}, + {-0.020405,0.168142}, + {0.328295,-0.517896}, + {-0.337676,0.588593}, + {0.585343,0.249905}, + {-0.287053,-0.782415}, + {0.794615,0.416868}, + {-0.332534,1.181646}, + {0.674689,-0.239908}, + {-0.248407,0.137528}, + {-0.301989,0.114605}, + {-0.044851,0.768646}, + {0.542929,0.080812}, + {-0.071794,-0.299563}, + {-0.734715,0.382308}, + {-0.421130,0.911202}, + {-0.430273,0.472535}, + {-0.687487,-0.273706}, + {0.367111,-0.660188}, + {-0.918680,0.527015}, + {-0.341398,0.970202}, + {-0.107157,0.886225}, + {0.938713,-0.223450}, + {-0.671171,-0.152803}, + {-0.385831,0.640238}, + {-0.780561,-0.635265}, + {0.715185,0.185086}, + {-0.699200,0.606720}, + {-0.653360,0.102234}, + {0.131534,-1.084895}, + {0.261869,0.060136}, + {0.317683,-0.939159}, + {-0.840538,-0.043646}, + {-1.424293,0.084761}, + {1.215854,-0.694838}, + {0.062843,-0.337987}, + {0.563976,0.504785}, + {-0.080370,0.085930}, + {0.032035,-1.010920}, + {0.551369,0.494227}, + {-0.116020,0.300480}, + {0.331724,0.036285}, + {-0.382426,-0.529493}, + {1.077808,-0.458413}, + {0.331854,1.032253}, + {-0.535004,-0.323188}, + {-0.819970,0.052055}, + {0.719559,-0.602325}, + {0.915057,0.257542}, + {-0.428636,-0.009926}, + {-1.805475,0.369659}, + {-0.614094,-0.001800}, + {-1.235578,-0.052044}, + {0.097063,-0.732735}, + {-1.460257,1.469093}, + {1.278098,-0.169305}, + {-1.378817,0.540052}, + {0.493755,-0.307548}, + {0.218180,1.141994}, + {-0.221486,-0.292270}, + {0.287143,-0.163096}, + {0.703925,0.446666}, + {0.212925,0.082821}, + {0.484300,0.306027}, + {0.357386,-1.297873}, + {-0.738326,-0.241678}, + {-0.741457,-0.442234}, + {0.327873,0.656962}, + {-0.853324,0.049464}, + {0.311712,-0.772024}, + {0.492337,-0.224030}, + {-0.072145,-0.706020}, + {0.120789,-0.269756}, + {0.510265,-0.199574}, + {0.305081,1.339218}, + {-1.174933,-0.318689}, + {-0.310504,0.857660}, + {-0.260578,-0.738450}, + {0.840290,-0.412105}, + {0.978639,0.996309}, + {0.545701,-0.214489}, + {0.442492,0.140782}, + {0.134327,-0.614024}, + {0.152361,-0.415766}, + {0.402772,-0.590738}, + {-0.086536,0.126473}, + {0.212853,0.348347}, + {1.454511,0.690384}, + {-0.525360,0.196963}, + {0.096687,-0.682747}, + {0.001357,0.832025}, + {-0.426188,-0.466376}, + {0.206853,-0.152419}, + {0.687454,1.804000}, + {-1.322728,1.203989}, + {0.482003,-1.241984}, + {0.500789,-0.065064}, + {0.244065,0.269642}, + {-0.469472,-0.237159}, + {-0.066490,-0.163310}, + {-0.281095,-0.567134}, + {0.893307,0.612599}, + {-0.632126,-0.774347}, + {0.109283,0.368826}, + {0.148461,-0.404510}, + {-0.667521,1.577892}, + {0.218306,0.265584}, + {0.264606,-0.211250}, + {0.652372,-0.157857}, + {-0.577376,-0.888662}, + {-0.945390,0.153267}, + {0.375344,-1.667404}, + {-0.156601,-0.117106}, + {-1.462571,-0.718417}, + {-0.575509,-0.808437}, + {0.364817,0.078618}, + {-0.403867,0.323323}, + {0.157170,0.940718}, + {-0.905934,0.911193}, + {0.173700,1.333921}, + {0.056693,-0.033255}, + {-0.296912,-0.103485}, + {0.153056,-0.604195}, + {0.377705,0.504978}, + {-0.673747,0.286633}, + {0.034797,0.558569}, + {-0.710120,-0.480598}, + {-0.362652,-0.642279}, + {-0.284230,0.181896}, + {-0.426250,2.162377}, + {0.985906,-1.488951}, + {-0.458442,-0.456442}, + {0.553374,-0.612342}, + {-0.809457,-0.439975}, + {0.180812,0.353789}, + {-0.978222,0.464068}, + {-0.300099,0.132864}, + {1.487060,0.218514}, + {0.957071,0.801319}, + {-1.294117,0.020448}, + {0.445091,0.773514}, + {-0.199977,0.450449}, + {1.443591,0.429417}, + {-0.113708,0.610933}, + {0.137175,-0.859998}, + {-0.132513,-1.322847}, + {-1.005503,-0.177505}, + {0.000357,0.779256}, + {1.075366,0.024032}, + {0.459241,0.710256}, + {-0.305482,0.106401}, + {-0.276184,1.043264}, + {0.516417,-1.254294}, + {-0.131916,0.527997}, + {0.234204,-1.557823}, + {0.030533,-0.531908}, + {1.085678,-0.371773}, + {-0.221198,-0.710384}, + {-0.063287,0.159905}, + {0.444706,-0.383745}, + {-0.446182,-0.684475}, + {0.740908,0.413410}, + {0.167352,0.712524}, + {0.392175,0.355523}, + {0.129803,-0.137579}, + {-0.528156,-0.906438}, + {0.405284,-0.052276}, + {0.240957,-1.088857}, + {0.642791,-0.012554}, + {-0.439821,0.196588}, + {0.640984,0.397706}, + {-1.267697,-0.882481}, + {-0.129466,1.197844}, + {1.461545,-0.514695}, + {-0.664521,-0.084123}, + {-0.351623,1.236291}, + {0.412838,-0.694709}, + {0.414800,-0.181844}, + {-0.304968,-0.380719}, + {1.155782,-0.095914}, + {-0.071784,-1.320101}, + {-0.694458,0.795722}, + {0.810258,0.637455}, + {1.163340,-0.742524}, + {-0.963930,0.444600}, + {0.655143,0.089189}, + {-0.592677,-1.127872}, + {0.887550,-0.327055}, + {0.625412,-0.529684}, + {0.713678,-0.696201}, + {0.055567,-0.252346}, + {0.166431,0.153213}, + {0.441026,-1.378759}, + {0.559243,-0.537530}, + {0.202748,0.275560}, + {-0.840727,0.168231}, + {-0.064211,0.001891}, + {0.281684,0.135740}, + {-0.358316,-0.959788}, + {1.306011,0.464514}, + {-1.036941,-0.959162}, + {1.406593,0.632846}, + {-1.569454,-0.365218}, + {-0.346228,0.731728}, + {-1.295997,0.560615}, + {-0.959968,0.986496}, + {-0.585640,-0.657095}, + {-0.118904,-0.871209}, + {0.926150,-0.531476}, + {0.933032,0.480609}, + {0.263173,0.494663}, + {0.886100,-0.059677}, + {-0.369519,-0.535388}, + {0.421964,-0.910301}, + {-0.326652,-0.190231}, + {0.547934,0.631971}, + {0.710113,-0.411325}, + {0.693213,-0.929055}, + {0.018916,-0.458380}, + {-0.289372,-0.644681}, + {1.603608,-0.790238}, + {-0.870347,-0.519386}, + {-0.120219,-0.195792}, + {0.896996,0.754328}, + {-1.072971,0.660451}, + {-0.169902,0.618787}, + {1.392250,0.699588}, + {0.102127,-1.159976}, + {0.654802,-1.138594}, + {0.341693,0.533089}, + {0.622157,0.293998}, + {0.739470,-0.685871}, + {0.889143,-1.040852}, + {0.028575,1.018274}, + {1.349263,-0.463929}, + {0.455431,-0.360066}, + {-0.778939,1.099713}, + {-0.893473,0.754993}, + {0.004027,-0.390836}, + {-0.251340,0.012372}, + {-0.222768,-0.628511}, + {-0.106092,-1.338030}, + {-1.913003,0.816801}, + {0.249156,-0.479677}, + {-0.736923,1.666795}, + {1.082270,-0.175401}, + {-0.885157,0.570095}, + {-0.049028,0.558581}, + {-0.490770,0.519661}, + {-0.287551,-0.111662}, + {1.033980,0.682340}, + {0.087287,1.358185}, + {-0.050552,0.564941}, + {-0.303037,0.089188}, + {0.842740,0.611644}, + {0.467414,-0.006327}, + {0.466794,0.602077}, + {0.439659,-0.483228}, + {0.974723,-0.062053}, + {-0.260206,-1.049128}, + {-0.205828,0.295329}, + {-1.647119,0.441492}, + {-0.714502,0.081394}, + {-0.205006,-0.757855}, + {-1.960274,0.470666}, + {-0.533298,0.409415}, + {0.855841,1.096989}, + {0.358798,0.730984}, + {0.750960,-0.725304}, + {1.146306,1.834112}, + {-0.476547,0.068212}, + {-0.694398,-0.779186}, + {1.092268,-0.985842}, + {1.398056,-0.217714}, + {0.251666,0.911836}, + {0.110386,0.085893}, + {0.701887,0.259171}, + {0.516668,0.334310}, + {-0.003315,-0.918830}, + {-0.195731,0.013077}, + {0.430466,-0.277817}, + {1.030171,-0.394052}, + {-0.225629,-0.195349}, + {-0.027538,-0.056974}, + {0.031358,0.064035}, + {0.387717,0.243636}, + {0.317769,-0.582616}, + {0.940290,0.778192}, + {-0.490807,-0.763537}, + {0.207110,-0.045007}, + {1.971938,0.382367}, + {-0.727075,0.439464}, + {-0.077633,0.672896}, + {-1.460959,1.007622}, + {-0.025801,-0.096694}, + {-0.993988,-0.999907}, + {0.464187,0.789316}, + {0.256421,-1.363865}, + {0.159660,-0.277453}, + {-0.006103,0.852472}, + {0.060031,0.596424}, + {0.620580,0.715707}, + {0.276113,-0.545072}, + {-1.012081,-1.133049}, + {-0.097912,-0.474511}, + {1.319384,0.602481}, + {-0.031653,0.663256}, + {0.386930,0.752664}, + {-0.991397,-0.430424}, + {0.051973,-1.136431}, + {-1.149435,0.841670}, + {-0.186103,0.364773}, + {-0.412187,0.132497}, + {-0.775032,0.368945}, + {0.032215,0.521604}, + {1.015831,-0.411670}, + {0.726604,-0.273412}, + {-0.017691,0.358815}, + {-0.486292,-1.210999}, + {-0.099767,0.094482}, + {0.097904,0.233600}, + {-1.240408,0.247283}, + {0.721376,-1.415937}, + {0.561702,0.753190}, + {-0.214495,-0.390780}, + {-0.433983,-0.193696}, + {-0.539126,-0.635186}, + {0.334874,0.117167}, + {0.112738,-0.692831}, + {1.294694,1.248792}, + {-0.305773,0.353188}, + {1.021686,0.202287}, + {0.256958,-0.390091}, + {0.166097,0.454005}, + {-0.079576,-1.102067}, + {1.538520,-0.563688}, + {-1.731706,-1.126758}, + {-0.670402,0.414350}, + {0.514859,-0.033709}, + {0.457049,-0.953866}, + {-0.025339,-0.186967}, + {0.921516,-0.006589}, + {1.133250,0.762349}, + {-1.942749,-0.290318}, + {-1.006259,-1.719958}, + {0.583133,0.184458}, + {1.533676,0.565125}, + {1.678753,1.997106}, + {0.414856,0.635099}, + {0.248681,-0.371868}, + {-0.480461,0.508675}, + {0.128528,1.225431}, + {-1.035243,-0.326540}, + {-0.591735,-0.256529}, + {0.404609,0.115763}, + {-0.127455,-0.322196}, + {-1.377901,0.027817}, + {-0.419663,-0.117352}, + {0.100835,-0.416059}, + {0.112067,-0.455572}, + {-0.918836,-1.089230}, + {0.819424,-0.676223}, + {-1.262287,-0.710934}, + {-1.405267,-0.629728}, + {-0.245684,0.259446}, + {0.275126,0.743111}, + {-0.632728,0.059081}, + {-0.268444,1.149652}, + {0.262731,-0.503980}, + {-0.732316,1.865036}, + {0.546659,-0.355999}, + {1.055911,-0.387197}, + {0.493665,-0.753767}, + {-0.182871,0.659888}, + {0.622885,-1.309388}, + {-0.557757,-0.093695}, + {0.098147,0.439508}, + {0.803828,-0.887762}, + {-0.324194,-0.317906}, + {-1.732072,-0.835605}, + {-0.244274,0.535165}, + {0.459924,0.794849}, + {-0.678300,1.156888}, + {-0.492597,0.785141}, + {0.158968,0.435641}, + {-0.036905,0.358065}, + {0.110872,-0.689448}, + {0.880365,-1.190838}, + {0.796720,1.588231}, + {-1.706377,0.554221}, + {-0.358409,-0.529411}, + {-0.715658,0.777524}, + {-0.561075,-0.227583}, + {0.899021,-0.235572}, + {0.525853,-1.659359}, + {0.079290,0.113489}, + {0.113024,0.340952}, + {-0.139241,0.174221}, + {0.224799,0.763237}, + {-1.379719,0.258011}, + {-0.935142,-0.447336}, + {-0.784769,0.357662}, + {-0.232321,-1.397151}, + {-1.450584,0.943146}, + {-0.324962,-0.543177}, + {-1.282408,0.863020}, + {0.050112,0.898989}, + {-0.604191,-0.538101}, + {0.343664,-0.068146}, + {0.102684,-0.123663}, + {0.928256,0.360823}, + {-0.097289,0.462497}, + {-0.092053,0.034602}, + {0.440637,-0.296188}, + {1.149567,-0.825341}, + {0.260298,-0.546318}, + {0.369902,-0.765528}, + {-0.115122,-0.752161}, + {-0.134579,-0.097381}, + {-0.352925,-0.341836}, + {-0.133949,0.670338}, + {-1.133992,-0.211796}, + {-0.771100,0.093373}, + {-0.958877,0.269735}, + {-1.004989,-0.185393}, + {-0.095868,0.247778}, + {-2.586064,-0.157309}, + {0.225446,-0.204901}, + {0.848046,-0.114858}, + {0.944526,0.415761}, + {0.175256,0.081095}, + {-0.221988,0.520441}, + {0.101561,0.235463}, + {1.036973,0.143210}, + {1.226535,-0.837936}, + {0.071154,-0.334797}, + {0.002085,-1.605103}, + {-0.217532,-0.203431}, + {-0.020084,-0.177046}, + {1.594854,0.364505}, + {0.353434,0.078027}, + {-0.408512,0.470233}, + {1.312720,-0.497096}, + {-0.446915,1.180362}, + {0.576132,-0.033510}, + {0.987148,0.361694}, + {-0.741101,0.494390}, + {-0.147701,0.106470}, + {-0.122341,0.707589}, + {-0.828018,0.595488}, + {0.358592,0.384138}, + {1.122524,-0.548564}, + {0.865484,0.246095}, + {-0.347659,0.661972}, + {-0.629108,-0.078289}, + {0.435537,0.266599}, + {-0.290543,0.076388}, + {1.350286,-1.026417}, + {-0.279524,0.033803}, + {0.805857,-1.271171}, + {1.494965,-0.166193}, + {0.224108,-0.156611}, + {0.348711,0.043524}, + {0.486362,0.705632}, + {-0.135721,0.860144}, + {-0.419355,-0.933635}, + {0.585876,-0.739752}, + {0.348953,1.633115}, + {-0.716160,-0.030413}, + {-1.012214,0.928111}, + {1.274223,-1.604781}, + {0.986726,0.442809}, + {0.926012,-1.822679}, + {-0.976620,-0.129446}, + {-0.631693,-1.113716}, + {0.013938,-0.471054}, + {-0.337122,0.006422}, + {-0.075227,1.194378}, + {0.192303,0.005400}, + {0.482293,0.882435}, + {0.759362,-1.106292}, + {-0.178414,0.131685}, + {-0.109098,-0.738940}, + {0.076915,1.201590}, + {-0.065114,-0.913385}, + {0.258717,0.253192}, + {0.006675,0.474848}, + {-0.120236,0.074537}, + {-0.914876,-0.604674}, + {-0.239318,0.139784}, + {0.373102,-0.811346}, + {-0.112757,1.025991}, + {0.939548,0.465295}, + {-0.350290,-0.018134}, + {-0.562664,0.175504}, + {0.514850,-0.074323}, + {0.521176,0.137696}, + {0.194373,0.197405}, + {0.927279,1.181192}, + {-0.118453,-0.014140}, + {1.916604,-0.970558}, + {0.612289,-1.323595}, + {-0.046588,0.676538}, + {-0.361614,0.343330}, + {-0.072801,-0.258052}, + {-0.387405,-0.305871}, + {-0.953448,-0.183769}, + {0.528532,-0.434791}, + {-0.180672,-0.359667}, + {-0.599359,0.653634}, + {0.050363,-0.480589}, + {0.233107,0.154633}, + {-0.948858,0.182072}, + {0.456937,-0.516302}, + {0.303400,0.828243}, + {-0.675064,-0.986310}, + {-0.305059,0.166836}, + {1.464878,0.165149}, + {0.374637,-0.656082}, + {0.718124,-1.594720}, + {0.470116,-0.781559}, + {0.309853,-0.650064}, + {-1.133502,0.331558}, + {0.145630,-0.142324}, + {-0.157430,-0.301290}, + {1.777805,0.083103}, + {0.717511,0.394040}, + {-0.145187,0.174645}, + {-0.557239,0.572090}, + {0.191157,0.101788}, + {0.484733,0.137371}, + {0.285309,-0.047834}, + {0.197723,0.435201}, + {1.212389,1.074376}, + {1.174508,-1.056099}, + {-0.076020,-0.321082}, + {-1.196586,-0.557423}, + {-0.610224,-1.475905}, + {-0.009208,0.213072}, + {0.515729,-1.346302}, + {0.103609,-0.105880}, + {-1.120470,0.071781}, + {-0.777519,0.463790}, + {1.156226,-0.298195}, + {0.203968,0.760272}, + {-0.780637,-0.918900}, + {-0.769841,-0.775429}, + {0.935468,0.026705}, + {-0.241774,1.112869}, + {0.227628,0.184193}, + {-0.183832,0.409623}, + {1.130661,0.731075}, + {-0.555506,0.437555}, + {0.457972,-1.800335}, + {0.272675,0.660832}, + {-1.884673,0.050126}, + {-0.580737,-0.779387}, + {1.227434,0.547756}, + {0.053354,-0.616688}, + {0.478480,0.910639}, + {-0.333049,0.719330}, + {0.010465,-0.612533}, + {0.906478,0.818118}, + {-1.193153,-1.824502}, + {0.706058,0.615496}, + {-0.370577,-0.145762}, + {-0.902391,-0.628656}, + {-0.106987,-0.364320}, + {-0.084966,-1.302484}, + {0.849559,-0.758851}, + {-0.721184,0.072056}, + {0.445967,0.442923}, + {1.135449,1.092539}, + {0.250839,1.832846}, + {0.242031,-0.912937}, + {0.969083,-1.380916}, + {-0.854039,0.805446}, + {-0.063648,-0.529546}, + {-0.556826,0.358275}, + {0.502400,-0.419893}, + {1.121981,-0.341123}, + {0.146130,1.403614}, + {-1.507194,0.954692}, + {1.696664,1.704881}, + {-0.599841,-0.359776}, + {-0.044186,-0.459231}, + {-0.118475,-0.554999}, + {-0.833973,-0.512125}, + {-1.163373,-0.238938}, + {-0.208580,0.332700}, + {0.371481,-0.478670}, + {-0.607465,-1.178812}, + {-0.293391,0.125643}, + {-0.646705,0.940141}, + {0.189148,-1.350865}, + {0.342294,-1.580507}, + {-1.132454,-0.157761}, + {-0.019979,0.524966}, + {-0.169449,-0.519595}, + {1.065918,-0.985098}, + {-0.915971,-0.284780}, + {0.098857,-1.215288}, + {0.783253,0.635773}, + {0.449313,-0.510098}, + {0.689266,0.814086}, + {-0.144834,-0.612379}, + {-1.427958,0.199905}, + {-0.474064,-0.742974}, + {-0.337112,-0.137790}, + {-0.674899,-0.264672}, + {0.912269,1.104826}, + {0.831791,-0.341448}, + {-0.388669,0.672793}, + {1.087330,1.281850}, + {0.118528,0.631338}, + {-0.206049,-0.715623}, + {-0.781056,0.033644}, + {0.792916,0.295321}, + {-0.482422,-0.237909}, + {0.261478,-0.752447}, + {-0.754615,-0.516213}, + {0.192734,0.378640}, + {-0.439435,-0.431982}, + {-0.946669,0.479718}, + {-0.357092,-0.691345}, + {1.157752,0.666368}, + {-1.383208,0.311908}, + {0.409399,0.461214}, + {-0.698759,-0.607928}, + {-0.482476,1.416944}, + {-0.199183,0.371134}, + {-0.082352,0.429145}, + {0.432215,-1.285389}, + {-0.244029,-0.686566}, + {-1.015378,0.249656}, + {0.956609,0.256536}, + {-1.108435,-0.400837}, + {0.358475,0.626661}, + {0.376849,0.118413}, + {0.384957,-0.159492}, + {1.550985,0.318564}, + {-0.658378,0.829656}, + {0.070058,-1.867597}, + {-0.556355,0.877398}, + {-0.939162,-0.758821}, + {-0.975259,0.428551}, + {-0.465374,0.248586}, + {-0.647683,0.162461}, + {0.478579,-0.086328}, + {1.171809,-1.210333}, + {0.350605,-0.026423}, + {-1.535107,-0.289105}, + {0.569494,0.289004}, + {-0.842191,-0.535135}, + {-1.056587,-0.341966}, + {0.571423,-0.949688}, + {0.377006,0.223183}, + {0.895255,-1.194232}, + {0.407145,0.361737}, + {-0.133994,-1.212235}, + {-0.635602,0.102165}, + {-0.112363,0.370473}, + {0.088680,-0.934189}, + {0.189376,0.032527}, + {0.241638,0.015864}, + {0.926939,-0.360267}, + {0.633242,-0.199406}, + {-0.777074,0.718454}, + {1.263760,1.272871}, + {-0.887876,0.895443}, + {0.045161,-0.732052}, + {-0.500926,0.113907}, + {-0.126137,0.817229}, + {0.086923,-0.332814}, + {0.016727,0.325903}, + {-0.336638,-0.207087}, + {-0.613900,-0.550235}, + {1.069793,-0.208412}, + {0.077398,-1.607311}, + {-0.215649,0.115757}, + {-0.404151,-0.996211}, + {0.226156,-0.014279}, + {-1.177157,0.074822}, + {-0.140062,0.186657}, + {-0.409112,-0.330324}, + {1.309929,-0.332041}, + {0.821633,0.695834}, + {-0.938862,-1.552127}, + {0.075839,1.054654}, + {0.323977,-1.147671}, + {0.310022,0.038229}, + {-0.359029,-0.022630}, + {0.324017,0.387352}, + {-0.048052,0.500409}, + {-0.768604,-0.470784}, + {0.684604,0.201031}, + {0.736939,-1.300678}, + {-0.479045,-1.017034}, + {0.007828,-0.810752}, + {-0.304589,-0.420991}, + {0.655603,-0.376914}, + {-0.526926,-0.309443}, + {1.263186,0.124584}, + {-0.301892,0.095891}, + {0.329349,0.607629}, + {0.858170,0.481326}, + {0.863272,-1.044820}, + {-0.185530,0.990111}, + {-0.944209,0.851341}, + {-0.140130,1.176828}, + {0.656967,-0.249158}, + {0.831843,0.166278}, + {0.281441,1.026104}, + {0.815836,1.287209}, + {1.204176,-0.446447}, + {-0.824919,-0.004133}, + {-1.288957,0.000250}, + {0.202791,0.163948}, + {-0.652007,1.250650}, + {-0.940207,1.250555}, + {0.060222,-0.160424}, + {0.276591,-0.733905}, + {1.240840,-0.391642}, + {1.228907,0.734534}, + {0.183878,0.004227}, + {0.471755,-0.211169}, + {1.313163,1.109955}, + {0.040600,-1.427535}, + {-1.534644,0.502761}, + {-0.618235,0.755691}, + {0.075225,0.536254}, + {-0.464799,-0.526058}, + {-0.418575,-0.584390}, + {-0.394190,-1.816489}, + {0.225854,0.231993}, + {-0.635186,-0.053889}, + {-0.064877,-0.134776}, + {-0.030140,0.052716}, + {-0.548128,-0.690454}, + {0.386017,0.089867}, + {1.770913,0.146184}, + {-0.245883,1.392924}, + {-0.437879,0.537205}, + {-0.330323,0.467750}, + {0.586680,-1.393470}, + {-0.120830,-0.437540}, + {-0.963768,0.437445}, + {0.330936,-0.667993}, + {0.308680,-1.588304}, + {0.825726,0.482044}, + {0.226749,-0.379008}, + {0.713663,0.392264}, + {-0.364814,-1.242878}, + {-0.029851,-0.845113}, + {0.519322,-0.794357}, + {0.118346,-1.295004}, + {-0.992456,1.318909}, + {-0.072580,-0.019761}, + {-0.289738,1.767553}, + {-1.316428,0.126071}, + {1.683718,0.210909}, + {1.611788,0.725453}, + {0.165352,0.295910}, + {2.416738,0.700021}, + {0.526805,-0.148660}, + {0.937490,-0.086265}, + {0.818973,0.716807}, + {1.269264,0.610734}, + {0.966294,0.177897}, + {-0.865904,0.933524}, + {-0.204972,0.387884}, + {1.036139,-0.352334}, + {0.025383,0.301119}, + {1.257758,-0.315413}, + {0.678906,0.616848}, + {1.169668,-0.413489}, + {-0.307375,0.005018}, + {0.073738,-0.187008}, + {1.813125,-0.752193}, + {1.392039,-0.785845}, + {-0.643245,0.390684}, + {0.463355,0.238971}, + {-0.002376,-0.085880}, + {-0.838524,1.114617}, + {-0.367220,-0.351002}, + {0.266690,-0.777264}, + {0.192761,-0.720230}, + {-1.500903,0.695838}, + {0.493120,0.067029}, + {0.030118,1.236780}, + {0.034760,-0.819626}, + {0.293606,0.201533}, + {0.312385,1.481040}, + {0.644201,-0.675942}, + {-0.630559,0.140196}, + {0.752821,0.626086}, + {-0.310553,0.372922}, + {0.511409,1.005211}, + {-0.312640,1.205754}, + {0.047365,1.161801}, + {0.634709,0.848718}, + {-0.185228,0.068916}, + {0.710197,-0.424226}, + {-0.627263,0.410260}, + {-0.890694,1.019410}, + {-0.911236,-0.507543}, + {0.072052,-0.119403}, + {0.277360,0.255984}, + {0.011718,-0.365213}, + {-1.242291,-0.359709}, + {-0.266353,-0.290392}, + {-1.193119,-0.901162}, + {0.016134,-0.154263}, + {-0.392536,-1.082696}, + {0.997809,0.053994}, + {-1.230871,-0.639927}, + {0.753734,0.260376}, + {-0.177411,-0.654997}, + {-0.664207,-0.818289}, + {0.558704,-0.173549}, + {-0.456297,-0.523642}, + {0.437174,0.603725}, + {1.110922,0.929951}, + {-1.145341,0.606142}, + {0.762613,-0.534990}, + {1.123318,0.182479}, + {-0.924404,0.074693}, + {0.421870,-0.803706}, + {0.237068,-0.731789}, + {0.114878,0.715037}, + {-0.115797,0.490062}, + {0.613808,-0.057239}, + {-0.002727,0.385070}, + {0.118135,-0.066553}, + {-0.137414,-0.095722}, + {0.241358,-0.096421}, + {-0.514497,-0.904141}, + {-0.484342,1.537877}, + {-0.143724,0.510801}, + {0.761716,0.162944}, + {0.627842,-0.387618}, + {-0.263134,-0.631088}, + {0.435091,0.285372}, + {-0.506864,1.600501}, + {-0.514922,-0.416914}, + {-0.127203,0.976581}, + {-1.080020,-1.111665}, + {0.197020,0.354050}, + {1.494278,-0.024726}, + {-0.547009,0.483956}, + {-0.111064,-1.245961}, + {-0.654196,-0.610226}, + {0.233488,0.119793}, + {-0.816235,-0.666550}, + {-0.154340,0.061817}, + {-0.949530,0.341751}, + {0.045377,1.203108}, + {0.430596,1.308333}, + {-0.016732,-0.389215}, + {0.399432,0.672581}, + {0.459967,0.156065}, + {-0.095913,-1.398591}, + {-1.249649,-0.318145}, + {0.584487,0.046164}, + {0.523293,-0.263306}, + {0.928685,-0.941009}, + {-0.094772,1.143322}, + {-0.647698,0.255648}, + {-1.029936,0.187780}, + {0.514449,1.421299}, + {0.437990,-0.736063}, + {-0.148725,-1.226925}, + {0.735137,-0.988119}, + {1.047799,-0.121534}, + {-0.407426,0.264870}, + {-0.700435,-1.115746}, + {0.532253,0.835391}, + {-0.713866,-0.766539}, + {-0.594814,-1.583788}, + {-0.091316,0.186157}, + {-1.061280,0.790775}, + {1.196936,-0.655124}, + {0.138017,-0.110440}, + {-0.482455,-0.535907}, + {1.275872,-0.400182}, + {-0.064806,0.484727}, + {0.401664,-0.613058}, + {-0.700481,-0.936574}, + {0.532775,0.696085}, + {1.008801,0.749932}, + {-0.986396,-1.189219}, + {-0.913639,0.371736}, + {0.784265,-0.263053}, + {-0.408200,-1.066935}, + {-0.668052,-0.239838}, + {-1.178900,-1.241531}, + {-0.853686,0.295449}, + {0.166123,-1.515813}, + {-0.444517,0.062558}, + {0.332299,0.329983}, + {-1.982113,-0.485853}, + {1.132998,-1.205220}, + {-0.804666,0.302509}, + {-0.238308,-0.134546}, + {0.710908,-0.432452}, + {0.315154,1.398999}, + {-0.681044,0.872108}, + {0.606473,0.523653}, + {0.014945,0.278227}, + {-0.139660,0.507999}, + {0.589431,1.064057}, + {1.203018,-0.095737}, + {-0.706335,0.844312}, + {-0.457733,0.411376}, + {1.392476,0.615478}, + {0.503531,0.629748}, + {-1.868925,1.019854}, + {0.623614,-0.097751}, + {1.591276,-0.051853}, + {-0.113714,0.458968}, + {0.053809,-0.896137}, + {0.828523,-0.324982}, + {-0.897275,0.933097}, + {1.465266,0.219218}, + {-0.328468,-0.511827}, + {-0.269574,0.240325}, + {0.158350,-0.002023}, + {0.007904,0.374705}, + {-0.748152,-0.404403}, + {0.401461,1.023925}, + {-0.694375,0.165567}, + {-0.750854,-0.441250}, + {-0.732961,1.478016}, + {-1.351355,-0.403812}, + {1.015405,-0.641125}, + {-1.187931,0.516955}, + {0.356994,0.568579}, + {-0.980631,-1.747832}, + {0.841677,-0.390122}, + {-0.341402,-0.520199}, + {0.267459,0.114024}, + {-0.241603,-0.232871}, + {0.477839,0.132306}, + {-1.470251,0.729433}, + {0.041666,-1.683171}, + {0.476142,0.743715}, + {-0.601401,-0.980501}, + {0.652458,-0.252309}, + {0.456130,-0.278763}, + {1.118120,0.633555}, + {-0.749787,-0.239808}, + {-0.104785,0.184428}, + {0.669072,0.512814}, + {-0.766815,-0.611725}, + {0.264691,0.519192}, + {0.723239,0.197053}, + {0.208870,-1.040927}, + {0.225315,1.672246}, + {-0.292557,0.249723}, + {0.028916,0.585265}, + {0.095992,0.356909}, + {-0.555301,-0.057219}, + {-0.928637,-0.681245}, + {-0.528215,0.113653}, + {0.051210,-0.925710}, + {-0.488349,-1.072004}, + {0.388358,-0.829677}, + {-0.440984,0.402262}, + {-0.587779,0.415484}, + {-0.854813,-1.202757}, + {0.140449,0.615316}, + {-0.969118,0.625102}, + {0.723061,-0.023433}, + {-0.466547,-1.193377}, + {0.174382,-0.191844}, + {-0.069412,0.744591}, + {0.614304,0.878272}, + {1.039704,-0.498006}, + {-0.308974,0.145160}, + {1.014526,-0.374036}, + {0.252267,0.687180}, + {-0.162024,-0.879458}, + {-0.069318,-0.136461}, + {1.084086,-0.626762}, + {-0.337708,0.138883}, + {-0.614793,0.495342}, + {-0.313819,0.218629}, + {-0.355789,-0.208860}, + {1.264926,-0.581676}, + {0.995574,1.298469}, + {0.048826,1.154609}, + {0.853013,0.154451}, + {-0.288999,-0.321106}, + {-0.313594,-1.063780}, + {0.993070,0.561339}, + {0.227798,1.300257}, + {0.228511,1.096806}, + {-0.206126,-0.606261}, + {0.534751,1.086407}, + {0.990795,-0.239272}, + {-0.221983,-1.228456}, + {-0.853842,-0.354515}, + {-1.529191,-0.080374}, + {0.510801,0.916183}, + {-0.406386,0.535647}, + {-0.894904,-0.543193}, + {-0.238739,-0.062090}, + {-0.888515,-0.567698}, + {-0.480891,-0.205695}, + {0.174172,-0.275572}, + {-0.272541,0.816420}, + {-2.017061,-0.971229}, + {0.654095,-0.688792}, + {-1.521416,-0.151355}, + {-0.419304,-0.564373}, + {-0.683359,-0.964495}, + {0.191915,0.116535}, + {-0.122173,0.698014}, + {0.091031,0.996259}, + {0.807417,-0.307397}, + {0.503590,-0.560922}, + {-0.025515,-0.177932}, + {-1.471801,0.431103}, + {-0.274382,-1.436026}, + {0.410563,0.251427}, + {-0.688289,0.531037}, + {0.235751,-0.017373}, + {1.697625,0.330051}, + {1.296692,-0.008806}, + {-0.161821,-1.267515}, + {-0.157375,0.552060}, + {0.194818,-0.498418}, + {-0.803649,0.679683}, + {-0.085934,0.145656}, + {1.299868,-0.011962}, + {-0.912591,-0.421947}, + {1.145332,0.300821}, + {0.269805,0.306810}, + {-0.204528,-0.802886}, + {-0.467310,0.023213}, + {-0.143521,-0.064844}, + {-0.615181,-0.550979}, + {-1.849136,-0.009920}, + {0.171609,-0.665812}, + {-0.491934,0.882227}, + {-1.650295,0.114048}, + {-0.400294,0.424205}, + {-0.514118,-0.669073}, + {0.258922,0.794121}, + {0.049997,0.134089}, + {0.194488,-0.156671}, + {0.344593,-0.056610}, + {-0.065019,-0.791255}, + {-0.712143,-0.889316}, + {-0.037947,-0.410308}, + {-0.608536,0.363014}, + {-0.995931,0.748773}, + {-0.532246,1.524272}, + {-1.273984,-0.692641}, + {0.216458,-0.969723}, + {0.596969,1.207691}, + {0.630096,0.619046}, + {0.053170,0.680191}, + {-0.316325,2.215220}, + {-0.727683,0.614145}, + {-0.426250,-0.833144}, + {0.824881,-0.500053}, + {-0.529623,0.311797}, + {-0.178255,0.825478}, + {0.103841,-0.104707}, + {-0.031122,0.452810}, + {-1.102562,-0.565139}, + {0.562892,-1.009280}, + {-0.990678,0.532690}, + {0.780854,-0.558275}, + {-0.797341,-0.248667}, + {0.419113,0.984902}, + {-0.373388,-0.223312}, + {-0.219678,-0.502263}, + {0.073586,-0.923303}, + {0.462648,-0.208484}, + {0.402837,1.456425}, + {0.394849,0.801398}, + {-0.032908,-0.398294}, + {0.137910,0.005318}, + {-0.388445,0.932065}, + {-0.968678,0.568907}, + {-1.168897,0.713647}, + {-0.135803,0.675903}, + {-0.798947,0.409210}, + {-0.210345,0.474493}, + {-0.996924,-0.261361}, + {-0.376090,-0.169902}, + {-0.084624,-0.337132}, + {-0.149856,1.151486}, + {-0.334993,-0.025083}, + {0.014955,-0.281633}, + {-0.296591,1.360250}, + {-0.356625,-0.268706}, + {0.092831,-0.664457}, + {0.661417,1.101560}, + {0.818075,-0.436305}, + {0.257700,0.826407}, + {-0.876984,-0.265632}, + {-0.847009,0.983195}, + {0.533962,0.025176}, + {0.475236,-0.021672}, + {-0.408513,0.144330}, + {-0.054836,-0.056845}, + {-0.811997,-0.428748}, + {-0.041344,0.580983}, + {-0.403695,1.106749}, + {-0.782566,-0.126241}, + {-0.164866,0.115952}, + {-0.511490,-0.220781}, + {0.758437,1.045866}, + {1.585939,0.717827}, + {0.198230,-0.423196}, + {0.425990,0.760640}, + {0.349586,0.560766}, + {-0.394644,0.704755}, + {0.816262,0.894866}, + {0.669015,2.130989}, + {0.400988,0.020291}, + {0.271768,0.213246}, + {0.677947,-0.681183}, + {-1.418844,-0.062849}, + {0.154916,-0.318327}, + {-0.397071,2.104998}, + {0.775958,-0.897373}, + {-0.332711,0.107389}, + {0.120366,-0.286305}, + {0.329814,-0.271822}, + {0.103319,-1.265877}, + {-0.729148,1.209006}, + {0.782576,-1.122029}, + {-0.924092,-0.627575}, + {-0.804932,-0.421433}, + {0.344793,-0.265698}, + {0.408639,0.540421}, + {-0.154016,0.136751}, + {-1.289312,0.562553}, + {-0.541214,0.328546}, + {0.113700,0.137387}, + {-0.357670,0.284727}, + {0.870838,-0.493262}, + {-0.984308,-0.399538}, + {0.156173,0.616735}, + {0.558083,0.793972}, + {-0.041236,-0.886977}, + {-0.272831,-0.458041}, + {0.720271,-1.299717}, + {0.800746,-0.688169}, + {0.003356,-0.488594}, + {0.112341,1.180680}, + {-0.404111,-0.185403}, + {-1.132811,0.187327}, + {0.278689,0.563330}, + {-0.475478,0.253690}, + {0.822805,-1.018580}, + {-0.536317,-0.432998}, + {1.196511,0.646342}, + {0.248643,-0.351856}, + {0.023010,0.801504}, + {0.082477,0.227903}, + {-0.739984,1.409377}, + {-1.093346,0.284272}, + {0.014437,0.797834}, + {-0.231989,-0.756894}, + {-0.324308,-0.373406}, + {0.327255,0.165462}, + {0.077915,0.976373}, + {0.099804,-0.232398}, + {-0.188951,-1.848099}, + {-0.264076,0.299642}, + {-0.249151,0.531139}, + {-0.085369,0.191014}, + {0.418407,0.643442}, + {0.548592,-0.986217}, + {0.201831,-0.013044}, + {0.402804,0.414341}, + {0.672157,-1.203954}, + {0.095442,-0.174176}, + {0.841303,-0.015891}, + {-1.263681,-1.045229}, + {0.761722,0.884349}, + {-1.504885,-0.472921}, + {-0.346331,0.174952}, + {0.933591,0.149618}, + {0.730042,-0.463471}, + {-0.475737,1.006552}, + {0.759548,-0.283706}, + {0.157366,-1.489094}, + {0.523688,0.334166}, + {0.876784,0.002512}, + {-1.026722,0.090503}, + {-1.165607,0.169016}, + {0.359693,-0.053239}, + {0.215738,0.499053}, + {-0.350342,0.196230}, + {0.896169,0.062044}, + {2.042446,-1.127256}, + {-0.534803,-0.041073}, + {-0.164018,0.930955}, + {1.250713,0.249031}, + {-0.869230,0.749397}, + {0.340076,-0.429473}, + {0.156416,-0.607349}, + {-0.876436,0.247448}, + {0.631910,-0.711511}, + {-0.353926,0.595086}, + {-0.317500,0.152275}, + {0.016852,0.409049}, + {0.138180,-0.897995}, + {-1.043338,0.106864}, + {0.249097,0.765102}, + {-0.063449,-0.898102}, + {-0.009991,0.423051}, + {-2.479719,-0.472494}, + {0.089759,0.324779}, + {-0.425748,-0.136768}, + {-0.039432,0.113546}, + {0.378075,0.584178}, + {-0.116790,-0.340992}, + {1.409989,0.608333}, + {0.185191,0.854648}, + {0.148669,-0.916006}, + {0.243601,-0.578485}, + {0.534792,0.128748}, + {0.096589,-0.011526}, + {0.302454,-0.104072}, + {0.557113,-0.581964}, + {0.123224,0.084108}, + {-0.040691,1.241659}, + {-0.976656,-0.139564}, + {0.461107,0.951388}, + {-0.172467,-1.082873}, + {-1.153675,-0.385351}, + {-0.618565,0.103723}, + {0.584970,-0.576273}, + {-0.072267,0.632778}, + {-1.229002,-0.083644}, + {-0.398376,-0.960650}, + {-0.182248,0.182768}, + {0.047476,-0.416691}, + {-0.006784,0.265975}, + {0.197887,-0.503323}, + {1.187192,-0.302236}, + {-0.243130,-1.039109}, + {-0.062329,0.768271}, + {0.943091,0.735741}, + {-0.034137,0.599684}, + {-0.528197,-0.012226}, + {-1.206841,0.534777}, + {-0.136555,0.133648}, + {-0.026909,-0.925145}, + {0.545718,0.306186}, + {0.019155,0.114856}, + {0.108414,0.467932}, + {-0.690591,0.822777}, + {-0.784363,-0.578012}, + {-0.355875,0.224161}, + {1.082772,0.724638}, + {0.259778,-0.690524}, + {0.144948,-0.594185}, + {-0.569524,-0.553273}, + {0.951085,-1.238274}, + {-0.334362,0.954367}, + {0.270034,-0.455925}, + {0.135168,0.992027}, + {0.673968,-0.116692}, + {1.150927,-0.985755}, + {0.401896,-0.044726}, + {-0.404015,0.215494}, + {-0.874189,-0.310641}, + {-1.076193,-1.010944}, + {-1.077048,-0.032036}, + {-0.059354,-0.173463}, + {-0.218021,0.018288}, + {-0.196944,-0.747249}, + {0.734062,0.379284}, + {1.158500,0.450099}, + {-0.858797,0.229643}, + {1.308480,-0.146091}, + {-0.741501,0.254662}, + {1.000943,0.157585}, + {0.521755,-0.098708}, + {0.086764,0.359042}, + {-0.099892,0.739584}, + {0.340750,-1.523697}, + {-0.536943,1.085834}, + {0.570584,0.105172}, + {0.202618,-0.072868}, + {-0.636440,0.211023}, + {0.497984,0.587557}, + {-0.110149,-1.306920}, + {-0.679943,0.412284}, + {-0.316334,-0.908325}, + {-0.711702,1.541623}, + {1.257867,0.108194}, + {-0.642721,-0.461193}, + {-0.358721,-0.241200}, + {0.150649,-1.176602}, + {-1.319244,0.289257}, + {0.773558,0.096770}, + {-0.827512,-0.185106}, + {-0.040823,-1.803707}, + {0.649424,-0.745211}, + {1.254139,0.001556}, + {0.329440,-0.291886}, + {-0.640815,-0.162880}, + {0.091218,1.039846}, + {0.699821,-0.470335}, + {-0.583234,-0.635644}, + {0.819819,-1.751943}, + {-0.721584,0.787984}, + {-0.179237,0.328456}, + {-0.063781,0.429699}, + {1.631510,0.041000}, + {0.122645,-0.926669}, + {0.970309,-0.036087}, + {-0.204184,-0.045486}, + {-0.597965,0.889277}, + {-0.564184,-0.344697}, + {-1.064722,-1.138890}, + {-0.751389,-0.391462}, + {-0.024089,0.535480}, + {-0.265461,0.383199}, + {-0.504780,-1.007336}, + {-1.021076,0.831820}, + {0.141181,-0.805943}, + {0.451375,0.655968}, + {1.100952,0.897682}, + {0.205680,-1.447828}, + {-0.748725,0.229730}, + {0.886689,-0.042364}, + {-1.821520,-0.303140}, + {0.697765,-0.619635}, + {-0.046616,-0.261678}, + {-0.207704,-0.328292}, + {-0.534695,-0.547877}, + {-1.575192,0.622682}, + {0.469863,0.483822}, + {-0.215089,1.552073}, + {0.505524,-0.648942}, + {0.262484,0.623770}, + {0.427704,-0.562431}, + {-0.872769,0.672559}, + {-0.020422,-0.187349}, + {1.243445,-1.678458}, + {0.123213,-0.587475}, + {0.071629,-0.272299}, + {0.150438,0.166304}, + {-0.278067,-0.782556}, + {0.011738,-0.690190}, + {0.881321,-0.960599}, + {0.234258,-0.529572}, + {-1.583603,-1.199128}, + {0.394669,-0.930577}, + {-0.358556,1.527559}, + {-1.524935,-0.981286}, + {-1.283556,0.168284}, + {-0.071836,-0.156780}, + {1.300191,1.006321}, + {-1.238737,0.048229}, + {-0.377324,-0.229504}, + {1.099479,0.998962}, + {-0.298661,-1.195932}, + {-0.283137,-0.159995}, + {0.098216,1.750651}, + {-1.026856,0.639700}, + {0.770303,0.037554}, + {-0.190248,-0.145522}, + {-0.674866,0.016212}, + {-1.556569,1.310796}, + {-0.417356,1.000320}, + {1.292398,-0.862891}, + {-0.666403,1.999084}, + {0.359215,0.069716}, + {0.347212,-0.033478}, + {-0.378434,-0.364239}, + {-0.177074,0.536678}, + {0.665238,-0.817818}, + {-0.050101,0.086105}, + {0.402255,-0.348473}, + {-0.108418,-0.286375}, + {0.632875,-0.573563}, + {-0.401028,-1.098233}, + {-0.209670,-0.524291}, + {1.161718,-0.018141}, + {0.062103,0.583460}, + {0.477218,1.102610}, + {-0.467535,1.244971}, + {-0.375225,-0.086564}, + {0.628985,-0.808293}, + {1.769568,-0.074081}, + {-0.632422,0.452516}, + {-0.080602,0.904194}, + {-0.036578,0.987790}, + {-1.059879,-0.224910}, + {-0.942022,0.248616}, + {0.604268,0.203433}, + {0.511442,-0.200682}, + {-1.007013,0.355784}, + {-0.895393,-0.034260}, + {-1.057717,1.382638}, + {0.611742,0.856244}, + {0.703185,-0.058025}, + {-0.130182,-0.591155}, + {0.638317,-0.190395}, + {0.522978,-0.891479}, + {-0.002451,-0.012145}, + {-0.321576,0.154897}, + {-1.017726,0.839232}, + {0.275647,-0.836124}, + {-0.118267,-0.695792}, + {-2.185583,-0.392189}, + {0.732423,-0.118374}, + {0.884142,0.303615}, + {-1.341810,-0.498593}, + {-0.479942,-0.379985}, + {0.111066,-2.027992}, + {0.639038,-1.018160}, + {0.123944,0.497292}, + {-1.415298,-0.098769}, + {1.108608,-1.269705}, + {-1.101691,0.124200}, + {0.442822,-0.443518}, + {-1.122461,0.522937}, + {-0.142504,-0.305149}, + {-0.176067,-0.623792}, + {-0.196882,0.715774}, + {0.406265,0.244901}, + {1.161033,0.506478}, + {0.167092,-0.544898}, + {-0.008688,-0.682775}, + {-0.481234,-0.114580}, + {-0.301007,-0.278349}, + {0.839510,-0.084011}, + {0.523550,0.618197}, + {-1.485248,1.869149}, + {-0.385724,0.172770}, + {-0.388899,-0.581958}, + {0.615073,-0.767256}, + {0.695869,1.535576}, + {-1.500226,-0.888290}, + {-0.511725,0.657499}, + {-0.738649,-0.437450}, + {0.652296,-0.153666}, + {-0.169144,-0.366049}, + {-0.213299,0.312138}, + {-0.862391,-0.179164}, + {0.479733,1.023316}, + {-1.704103,-0.974490}, + {-0.348370,-1.488505}, + {-1.099062,0.282122}, + {-1.578280,-0.162824}, + {-1.091052,0.744575}, + {-0.515178,-0.044797}, + {0.065343,0.960922}, + {-0.051800,-0.142943}, + {-0.117723,-1.467680}, + {-0.643133,1.163677}, + {-0.034072,0.261251}, + {0.464990,-0.130008}, + {0.133313,-1.401987}, + {0.126248,0.450691}, + {-0.003664,-0.323720}, + {0.142170,-0.755157}, + {-1.656898,-0.020361}, + {-0.612778,0.036440}, + {0.353884,-0.743228}, + {-0.430287,-0.179029}, + {0.625341,0.171575}, + {1.016815,-0.257385}, + {0.324956,-0.714199}, + {-1.174736,-0.158217}, + {-0.274466,-0.771165}, + {-0.393455,-0.971745}, + {-0.298555,0.790057}, + {-0.646557,-1.558486}, + {0.758193,0.973426}, + {-0.512463,-0.785605}, + {0.980556,-0.044524}, + {0.453143,0.624350}, + {1.147269,0.020674}, + {-0.501269,-0.404065}, + {-0.244718,-0.507250}, + {0.770791,0.097876}, + {0.244499,-0.019047}, + {-0.727271,-1.001762}, + {-0.366096,-0.511113}, + {0.479774,0.574401}, + {0.917365,-0.129024}, + {-0.745295,-0.245488}, + {0.745051,1.034707}, + {0.810366,-0.847422}, + {0.235447,0.300914}, + {-0.708897,-0.941699}, + {0.309677,-1.041238}, + {-0.081649,0.128611}, + {0.844397,0.010619}, + {-1.009033,0.934418}, + {1.144116,0.074744}, + {-0.057235,-0.308853}, + {0.360603,0.036429}, + {0.830911,-0.450962}, + {-0.194946,-0.151025}, + {-0.211182,0.118259}, + {0.021337,0.332110}, + {0.129465,-0.225661}, + {-1.052171,-0.755217}, + {0.633623,-0.177776}, + {0.100743,-0.704954}, + {-0.818968,1.180590}, + {-0.535346,-0.545943}, + {-0.006770,0.316309}, + {0.775806,0.533149}, + {0.339163,0.050466}, + {0.318535,-0.074793}, + {-1.297398,-0.351562}, + {-0.772665,1.015512}, + {0.295548,-0.180960}, + {-0.044699,-0.203172}, + {0.724933,-1.023951}, + {-0.167979,-0.725819}, + {0.686506,0.268161}, + {-0.480277,-0.221435}, + {-0.056920,0.480959}, + {0.030116,-0.272789}, + {-0.302421,0.129490}, + {-1.671242,0.181529}, + {-0.281706,-0.333536}, + {0.016290,-0.028753}, + {-0.259901,-0.190484}, + {0.289524,-0.195349}, + {-1.337980,0.540319}, + {0.661628,-0.670418}, + {0.599796,0.557768}, + {0.580559,0.969807}, + {0.031230,0.964814}, + {0.198048,0.444485}, + {0.578456,-0.883133}, + {0.624222,1.329692}, + {-0.625168,-0.127331}, + {-0.017311,1.164091}, + {-0.621783,-0.446638}, + {0.701142,-0.309340}, + {-1.057874,-0.834624}, + {0.346678,-1.338687}, + {0.667874,-0.522838}, + {-1.028893,-0.504854}, + {-1.338328,-0.931585}, + {0.287635,0.120742}, + {0.230818,0.167010}, + {-0.328503,-0.748337}, + {-0.255351,0.964045}, + {0.510160,-1.611867}, + {0.223958,-0.860844}, + {0.239175,-0.837760}, + {1.266567,-0.125655}, + {0.582400,0.156299}, + {0.251579,-1.778354}, + {0.650474,0.028121}, + {0.993767,-0.090186}, + {0.441591,-0.361052}, + {-1.413507,0.317850}, + {0.334364,-0.332911}, + {-0.010362,-0.177608}, + {0.014458,-0.502127}, + {-0.919481,-1.160841}, + {-0.443414,0.552915}, + {-0.054788,-1.052794}, + {-0.561902,0.153077}, + {-0.677469,-0.159762}, + {0.650310,-0.922686}, + {0.296712,0.812605}, + {-0.294342,0.055605}, + {-0.535585,-1.384576}, + {-1.433487,-0.747544}, + {0.645626,-0.741622}, + {0.920579,-0.258878}, + {0.169646,0.529906}, + {0.674057,0.410030}, + {-0.351663,0.199608}, + {-0.339342,-0.416492}, + {-0.271758,1.138671}, + {0.224929,-1.327320}, + {0.601037,1.033542}, + {-0.193132,-0.768238}, + {0.364633,-0.653041}, + {0.783166,-0.809904}, + {0.559880,0.350413}, + {0.615788,-0.237848}, + {0.236813,-0.842202}, + {0.031135,-0.661401}, + {0.349296,-0.774153}, + {1.759036,-0.724450}, + {-0.116563,0.294276}, + {0.375200,-1.357901}, + {-1.029118,1.305234}, + {0.497985,-0.464184}, + {-0.295867,-0.349915}, + {0.221068,-0.835466}, + {-0.838100,0.275901}, + {-1.020066,0.277497}, + {1.091145,0.328918}, + {0.327124,0.702349}, + {-0.476125,0.304774}, + {0.520932,0.875467}, + {-1.726524,1.028699}, + {0.060615,0.113976}, + {0.297927,1.293605}, + {-0.405591,0.650445}, + {0.037677,-0.734049}, + {-0.565393,0.943537}, + {0.910424,-0.580765}, + {0.493416,-0.962297}, + {0.956024,0.716498}, + {0.474440,0.623715}, + {-0.922501,-0.564992}, + {-0.794655,0.719802}, + {0.596664,-0.091353}, + {-1.236730,0.412576}, + {-0.041676,0.394763}, + {0.786846,0.085198}, + {1.051734,-0.257630}, + {-0.906726,-1.590711}, + {0.362094,-1.386569}, + {0.148797,-0.901821}, + {-0.736306,0.417423}, + {0.329381,-0.221941}, + {0.009126,0.513875}, + {-1.192236,0.638637}, + {-0.317820,0.575279}, + {1.586186,-0.027898}, + {-0.025386,0.094059}, + {-0.315796,-0.838576}, + {0.030063,-0.320087}, + {0.534822,0.130995}, + {0.477222,-0.398652}, + {-0.913466,-0.563169}, + {-0.823684,-0.189615}, + {-0.213996,0.665743}, + {0.654202,0.146227}, + {-0.004974,0.257017}, + {-0.024927,-0.214095}, + {-1.045988,0.681355}, + {0.146436,0.294438}, + {1.089600,-0.127405}, + {0.798004,0.931002}, + {-0.505832,0.828742}, + {0.361348,-0.830710}, + {-0.305041,1.032923}, + {-0.728657,-0.579665}, + {0.517347,-0.452207}, + {0.879566,-0.278807}, + {-0.124969,-0.036169}, + {0.628951,-0.089218}, + {-0.603025,-0.528341}, + {0.019535,1.501341}, + {0.881593,0.143029}, + {-0.231925,-0.097508}, + {0.538676,0.300952}, + {-0.127155,0.296466}, + {-0.274248,0.005941}, + {1.500761,-0.345010}, + {-0.907824,1.044908}, + {0.414848,1.043371}, + {-0.867983,-0.304333}, + {0.044936,0.571416}, + {-0.266616,0.376188}, + {0.878846,0.549724}, + {-0.170746,0.362205}, + {0.160919,0.167739}, + {0.462195,0.540838}, + {-0.875388,-0.096774}, + {0.307478,-0.185363}, + {-0.181949,0.313114}, + {-0.085873,-0.399748}, + {-0.129085,1.140098}, + {-0.252383,0.086665}, + {0.189609,-1.301528}, + {0.382798,0.498417}, + {-0.506249,-0.317346}, + {-1.212357,0.230474}, + {0.474321,0.181404}, + {0.681870,-0.999781}, + {0.607469,-0.406532}, + {0.622035,-0.522596}, + {0.227928,0.106501}, + {-0.379127,-0.283975}, + {0.139899,-0.090042}, + {0.672276,-0.271219}, + {-0.234798,-0.982539}, + {0.475426,-0.896914}, + {-0.325514,0.546342}, + {0.437787,0.300656}, + {-0.625297,-0.525772}, + {-0.061169,0.198968}, + {-0.094667,0.112590}, + {0.786903,0.717350}, + {-0.109661,-0.225045}, + {0.186298,-1.271786}, + {-0.369875,0.986481}, + {0.689748,-0.439040}, + {-0.965116,-0.848020}, + {0.656998,-2.318079}, + {0.002981,0.218055}, + {-1.189818,0.355672}, + {0.584073,-1.050715}, + {-0.108002,-0.588069}, + {-0.313385,0.621555}, + {-0.889104,-0.082471}, + {-0.769348,1.617374}, + {-1.728674,1.396468}, + {-0.616521,1.370656}, + {-1.249198,0.309463}, + {0.189456,-0.979952}, + {-0.118186,1.507419}, + {0.747125,0.309914}, + {-0.614646,1.308353}, + {0.333443,-1.419442}, + {-1.700063,0.680655}, + {0.266295,0.063078}, + {-1.331327,0.169856}, + {0.242049,-1.531715}, + {0.960667,-0.302137}, + {-0.061825,0.429394}, + {-0.329970,0.278702}, + {0.410208,1.176057}, + {-0.789042,-0.174484}, + {-0.238696,-0.184614}, + {0.602804,0.051704}, + {-0.633642,0.103324}, + {0.065643,-0.546136}, + {-0.339235,-0.673524}, + {-0.315448,-0.300233}, + {-0.864395,0.215781}, + {0.254565,0.459681}, + {-0.723593,1.270257}, + {-0.583801,0.838345}, + {-0.808536,-0.416249}, + {-0.053534,0.820439}, + {0.798705,-0.418082}, + {1.776613,-1.110952}, + {0.366472,0.636865}, + {0.324757,0.701457}, + {-0.036684,0.112409}, + {-0.877729,0.003873}, + {-1.084160,-0.401799}, + {-0.008295,0.326360}, + {0.787213,-0.261947}, + {0.836987,-0.392854}, + {0.275954,0.382297}, + {-0.690174,0.027938}, + {-0.374934,0.437628}, + {-0.759869,0.360720}, + {-0.638815,0.093196}, + {0.189722,-0.218160}, + {-0.454777,-1.027413}, + {1.236142,0.310097}, + {0.477871,-0.594035}, + {-0.124788,-0.108431}, + {0.544631,0.996734}, + {-0.496622,-0.463029}, + {0.625047,0.069807}, + {0.557384,0.060492}, + {-0.265568,-1.409334}, + {0.239741,0.259396}, + {0.904890,-0.068242}, + {-0.744938,0.163030}, + {-0.471091,-0.345572}, + {-0.273164,0.370181}, + {0.729318,1.531839}, + {-0.726184,-0.223504}, + {0.242483,0.053784}, + {-0.205845,-0.562647}, + {-2.151637,-0.069466}, + {-0.846446,0.795935}, + {1.110915,-0.399958}, + {0.489046,-0.556660}, + {0.205667,0.176983}, + {0.328136,0.200920}, + {0.527322,0.191632}, + {1.546037,-0.657550}, + {-0.310488,0.301548}, + {0.585276,0.957516}, + {0.128524,0.840981}, + {0.018146,1.407488}, + {-1.516386,0.228783}, + {0.124218,-0.156492}, + {0.265637,0.315627}, + {-1.063782,-0.367510}, + {0.827797,0.276360}, + {1.960161,-1.227262}, + {0.806068,1.260862}, + {0.373849,-0.276127}, + {-0.498184,-0.462535}, + {-0.077592,0.327073}, + {0.588710,-0.430273}, + {-0.905723,-1.065033}, + {-0.016188,-0.290291}, + {-0.109620,0.477222}, + {0.565824,-0.470857}, + {0.705157,0.606991}, + {0.614145,-0.049931}, + {-0.031315,-0.632364}, + {0.072033,-0.559342}, + {0.458793,1.387290}, + {0.206636,0.224213}, + {-0.392240,-0.854508}, + {-0.839329,1.695036}, + {0.566507,-0.629087}, + {0.370644,-1.070375}, + {0.761916,-0.623349}, + {0.602129,0.418224}, + {0.790301,-0.310664}, + {1.481982,0.146058}, + {-1.573813,0.024454}, + {0.567915,-0.336681}, + {-0.639597,0.182668}, + {1.260436,2.207508}, + {0.696288,0.181341}, + {0.376110,0.431512}, + {-0.000551,0.056281}, + {0.402438,-0.361156}, + {0.072172,0.279490}, + {-0.885060,-0.641645}, + {1.385817,0.885361}, + {0.690711,-0.158455}, + {-0.960198,-0.182059}, + {0.321308,0.180684}, + {0.147669,-0.549752}, + {-0.107020,0.306074}, + {0.174252,0.899434}, + {0.061913,-0.189282}, + {1.102905,-1.250777}, + {0.223198,-0.637361}, + {-2.146420,0.173387}, + {-0.084436,-0.775938}, + {0.287327,0.446614}, + {1.090236,0.383949}, + {1.121181,0.127876}, + {0.103766,0.991675}, + {1.242702,0.272046}, + {1.008926,-0.211179}, + {-1.353983,-0.705201}, + {-1.661310,0.179906}, + {-0.572442,0.843940}, + {0.534838,-0.420940}, + {1.906158,1.102764}, + {-0.553360,-0.478077}, + {-0.636383,-1.315762}, + {-1.124395,0.081685}, + {0.220542,0.468091}, + {-1.229590,-0.659073}, + {-0.564517,0.239986}, + {-1.172267,-0.314597}, + {0.151538,0.149107}, + {0.242211,-0.821363}, + {0.254545,0.273831}, + {-0.534100,-0.226399}, + {1.163542,-0.942243}, + {1.041018,0.317274}, + {-0.401554,-0.096105}, + {-0.113999,-0.117513}, + {-0.010346,-0.748131}, + {0.354813,0.636504}, + {-0.681541,-0.112983}, + {-0.488145,0.464117}, + {-0.193164,0.061733}, + {-0.192093,-0.321730}, + {0.509883,0.382645}, + {-1.403973,-0.336215}, + {0.394349,-0.205158}, + {0.391611,-0.502082}, + {0.616434,-0.022915}, + {0.804218,-0.495715}, + {-0.079753,0.070374}, + {0.341990,-0.635143}, + {0.067861,-0.236447}, + {-1.101606,-0.120961}, + {0.442884,-0.438436}, + {0.212980,0.309736}, + {0.528495,-0.251375}, + {-0.692353,-0.169402}, + {0.562221,-0.028760}, + {0.590351,0.405250}, + {-0.717372,0.369161}, + {-0.806613,0.504272}, + {0.286954,1.111197}, + {-0.105423,-0.153474}, + {-0.346757,-1.116428}, + {0.226199,-0.504658}, + {0.004135,-0.101712}, + {-0.040985,-0.512184}, + {-0.022114,-0.025237}, + {-0.334621,-0.134380}, + {0.534726,-0.729250}, + {-0.282945,-0.576566}, + {-0.931037,0.047644}, + {1.365371,-0.644779}, + {0.168399,-1.211458}, + {2.486020,-1.456800}, + {-0.004467,-0.574279}, + {-0.401257,1.031333}, + {0.424854,0.679751}, + {-0.360869,-0.836076}, + {-0.349323,1.100520}, + {0.126475,0.711401}, + {-0.075597,1.820855}, + {-1.746648,1.113080}, + {-0.153525,-0.544782}, + {-0.533184,-0.693391}, + {-0.769927,-0.582211}, + {-0.680363,0.216778}, + {-0.004214,-1.526735}, + {-0.086907,-0.002847}, + {0.232166,-0.016912}, + {0.817197,0.482386}, + {-1.105532,0.491655}, + {-0.376338,0.410127}, + {1.042417,0.054103}, + {-0.241349,-0.748510}, + {-0.014625,-0.417149}, + {0.738367,0.443956}, + {-1.044035,0.497683}, + {0.292520,-0.751995}, + {-0.217407,0.722108}, + {0.918647,-0.718313}, + {-0.164316,0.409743}, + {1.309759,0.090394}, + {0.233709,-0.815158}, + {-0.239462,0.605397}, + {-0.039005,-0.027079}, + {-0.954133,-0.096347}, + {1.816169,0.521655}, + {0.153716,-0.328576}, + {0.835515,-0.359370}, + {-0.705611,-0.523065}, + {0.138570,-0.063344}, + {0.083846,-0.023266}, + {-0.562762,-0.812709}, + {0.365173,-0.859163}, + {0.578421,-0.182048}, + {-0.126089,1.117181}, + {0.617319,-1.086710}, + {0.769929,0.422361}, + {-1.309781,1.172984}, + {-0.596821,-0.251837}, + {0.212351,-0.811837}, + {-0.162098,-0.192380}, + {-0.813093,1.121627}, + {0.256762,0.936857}, + {-0.875631,1.008870}, + {0.247567,0.868075}, + {0.971357,-0.738473}, + {-0.226325,0.330532}, + {-0.162002,0.916161}, + {-0.400712,1.001422}, + {0.074112,1.112345}, + {0.860980,0.266196}, + {0.395444,-0.557019}, + {0.120734,-1.186860}, + {0.556697,0.066680}, + {0.854588,0.178589}, + {2.451387,-1.403948}, + {0.227316,0.024298}, + {0.591620,0.075444}, + {0.200034,0.061233}, + {0.482442,-0.836773}, + {1.044504,0.162091}, + {0.928003,-0.484096}, + {0.382501,-0.191498}, + {-0.375135,0.607373}, + {-0.736591,0.301910}, + {0.174839,-0.142515}, + {0.733383,0.997919}, + {-0.786136,-1.067298}, + {-0.206222,-0.113384}, + {-0.464171,0.094194}, + {-1.350080,-0.791223}, + {-1.126134,-0.116062}, + {-0.208917,-1.109539}, + {-0.370726,-0.057655}, + {-0.091744,-1.090501}, + {-0.208418,0.132989}, + {0.864632,-0.798601}, + {1.102361,1.368734}, + {-0.272215,-0.247604}, + {-1.023085,-0.986586}, + {-0.065967,0.605997}, + {0.063587,-0.976618}, + {-0.267152,-0.116898}, + {-0.461969,-0.203471}, + {-0.573852,0.570464}, + {-0.138348,0.534036}, + {-0.090592,0.936618}, + {0.850179,-0.537120}, + {-0.433713,-0.556356}, + {-0.537237,-0.713364}, + {0.426253,-0.478599}, + {1.133750,-0.964272}, + {-1.331896,0.116871}, + {0.191830,0.696149}, + {-0.109898,-1.447008}, + {0.959592,0.346543}, + {0.261532,-0.822086}, + {0.303775,-1.459434}, + {0.530404,0.421720}, + {-0.453037,-1.463699}, + {0.123500,0.017147}, + {0.172476,-0.507657}, + {-0.160135,1.263925}, + {0.030836,0.556500}, + {-0.185416,-0.025333}, + {0.637640,0.395256}, + {0.089760,-0.864083}, + {0.577483,1.581489}, + {0.979522,1.296548}, + {-0.497799,-0.045689}, + {-0.047660,1.066061}, + {0.048446,-1.060159}, + {-0.968548,-0.221439}, + {1.484060,0.378410}, + {-0.770293,-0.087204}, + {-0.764451,-0.554893}, + {0.348932,-0.676770}, + {-1.210537,0.339603}, + {0.924898,-0.536966}, + {-1.159727,-0.216140}, + {-0.625226,-0.977963}, + {0.640809,0.919168}, + {-0.239144,0.785286}, + {0.809998,0.679827}, + {0.397941,-0.337279}, + {1.158469,-0.284939}, + {0.740868,-0.632110}, + {0.246451,0.582746}, + {1.169569,-0.447871}, + {-0.206093,-0.436712}, + {1.593053,-0.562783}, + {-0.072116,-1.390822}, + {0.534517,-0.038637}, + {0.034689,0.141429}, + {0.474386,0.514105}, + {0.572791,-0.330251}, + {-0.548599,-0.594569}, + {-1.071301,-0.270923}, + {0.486895,0.652847}, + {-0.069770,1.249662}, + {-0.040552,-0.687992}, + {-0.284734,0.643650}, + {-0.808577,0.013167}, + {-0.452947,0.353593}, + {-0.729562,-2.012804}, + {1.237631,-1.264824}, + {0.110039,1.404809}, + {0.107938,-0.296577}, + {0.386214,-0.709940}, + {1.137573,0.606987}, + {0.412215,-0.555525}, + {-1.988232,-0.162112}, + {0.848561,0.408090}, + {-0.811612,0.394181}, + {0.485756,-0.746334}, + {0.049115,-0.087741}, + {-1.022135,-0.921590}, + {-0.633999,0.061617}, + {-0.090648,0.618570}, + {-1.247020,-0.001903}, + {-0.421031,-0.238286}, + {0.711286,-0.314523}, + {-0.147505,-0.383916}, + {-0.683990,0.445952}, + {0.432133,-0.119312}, + {-1.132072,-0.396738}, + {0.135841,0.222292}, + {-0.230532,0.331470}, + {0.254731,-0.376331}, + {-0.776682,0.039871}, + {-1.169703,-0.331153}, + {-0.873728,0.067719}, + {-0.207084,-0.835310}, + {0.037790,-0.362456}, + {0.583451,1.129280}, + {-0.558111,-0.573604}, + {0.856679,-0.022411}, + {0.164767,0.141428}, + {-0.009111,-0.317562}, + {1.150656,1.264776}, + {-0.789474,0.292994}, + {-0.466256,0.131396}, + {-0.773386,0.095435}, + {-0.310801,0.037979}, + {0.426976,0.983285}, + {0.477342,0.671231}, + {0.453581,0.460922}, + {-0.126415,0.223835}, + {-0.197906,-0.189931}, + {-0.526443,0.635295}, + {-0.729339,-0.271754}, + {-0.277572,-0.106432}, + {0.605958,0.268731}, + {0.697244,-0.324635}, + {-0.601406,0.750119}, + {2.020241,-0.455436}, + {-0.545556,-1.777371}, + {-0.106454,-0.323364}, + {0.730151,-0.521349}, + {-0.222232,-0.678729}, + {-0.822648,0.759164}, + {0.347482,0.318147}, + {0.320443,1.047896}, + {-0.007527,-0.099273}, + {-0.469680,0.811059}, + {-0.725923,0.045348}, + {-0.845127,0.408992}, + {-0.483176,-0.402357}, + {-0.244242,-0.138255}, + {0.777707,0.361076}, + {-0.284361,-1.213446}, + {-0.005269,1.151649}, + {-0.132040,-0.605975}, + {-0.614343,0.207020}, + {0.172750,1.326225}, + {-0.902838,0.195327}, + {0.343014,-0.865008}, + {0.125967,0.451258}, + {0.332072,0.614969}, + {-0.298182,0.490626}, + {1.424204,-0.479491}, + {-0.031385,0.164505}, + {0.233636,-1.315612}, + {-0.450889,0.377407}, + {0.029363,0.410567}, + {0.306058,0.200634}, + {-1.349288,0.431649}, + {0.358784,0.047745}, + {-0.557686,1.348221}, + {-0.061715,-0.056931}, + {-0.363172,0.195052}, + {-0.657930,-0.139592}, + {-0.228460,0.043261}, + {-0.400956,-0.445312}, + {-0.518420,0.120859}, + {-0.698407,-1.044712}, + {1.235472,1.348407}, + {0.487842,0.303364}, + {-0.723742,0.780963}, + {-0.593303,-0.225305}, + {-0.534609,0.308384}, + {0.517702,0.592656}, + {0.954708,0.946876}, + {0.138369,0.042618}, + {-0.011117,0.156468}, + {0.129045,-0.782424}, + {0.544442,-0.335302}, + {0.100454,0.021699}, + {-0.414913,-0.364941}, + {-1.446169,0.180437}, + {-0.104807,-1.198166}, + {-0.663552,0.253006}, + {-0.873757,0.653705}, + {0.913861,0.776582}, + {0.408304,-0.209211}, + {-0.292234,0.935191}, + {0.612411,0.506772}, + {0.052624,-0.170316}, + {-0.316935,0.099714}, + {-0.353097,0.013558}, + {1.233948,0.295996}, + {0.369796,0.587798}, + {-0.240517,-0.082754}, + {0.456761,1.042474}, + {-0.213108,0.167637}, + {0.399378,-1.139074}, + {0.884318,-0.559808}, + {1.445237,-0.362312}, + {0.116480,1.022887}, + {-1.064627,-0.325939}, + {0.517946,-0.548647}, + {0.415227,0.031714}, + {0.100481,-0.138348}, + {-0.809183,-0.296851}, + {0.780624,1.262479}, + {0.563065,-0.043795}, + {0.912444,-0.494706}, + {-0.734037,0.870375}, + {-0.318819,1.118381}, + {-0.000746,-0.287874}, + {-1.164864,-0.526955}, + {0.294943,0.563007}, + {-0.310269,0.305960}, + {-0.477327,-0.723869}, + {1.444745,0.187725}, + {1.871817,-0.263160}, + {-0.194735,0.555531}, + {-0.321051,-0.730174}, + {-0.190988,-0.402861}, + {-0.471553,-0.864754}, + {0.858125,-1.345250}, + {-0.616872,0.087958}, + {1.283791,0.027641}, + {0.256228,-1.305667}, + {0.135487,-0.829405}, + {-1.326564,0.237115}, + {-0.150936,0.123060}, + {0.525275,-1.201838}, + {0.345162,-0.254455}, + {-0.289832,-0.377094}, + {-0.152667,-0.439359}, + {-1.044104,-0.312180}, + {0.123564,0.909003}, + {0.092452,-0.627863}, + {-1.077986,0.652712}, + {0.546415,0.317801}, + {-0.327865,0.791680}, + {-0.742691,0.429484}, + {1.359870,0.653960}, + {0.618629,-0.810634}, + {-1.486101,-0.628531}, + {0.594045,-0.133495}, + {-0.470586,0.135156}, + {-0.143237,-0.465263}, + {-1.088628,0.943733}, + {0.198579,-0.639867}, + {-0.063074,-0.021058}, + {0.108028,0.446404}, + {1.189162,0.613968}, + {0.337471,-1.129207}, + {-0.455311,0.326954}, + {-0.570540,-1.907149}, + {-0.314445,0.220247}, + {-0.644406,0.871505}, + {-0.516263,0.822251}, + {-0.557629,-0.170696}, + {0.722273,-0.131339}, + {0.230421,0.790328}, + {-0.104488,-1.716517}, + {-1.241919,0.455016}, + {-0.692486,1.120817}, + {1.549314,-0.046370}, + {-0.106043,0.644970}, + {-0.074406,-0.804419}, + {0.548174,0.128521}, + {-0.595960,-0.462357}, + {0.142829,-0.219578}, + {-0.162097,-0.875243}, + {0.686753,0.775003}, + {0.873880,1.383881}, + {-0.653841,0.636136}, + {0.383632,-0.777116}, + {-1.108266,0.038942}, + {0.971520,0.211922}, + {-0.268643,0.730017}, + {0.855520,0.049969}, + {0.302034,-0.524310}, + {-0.852706,-0.537224}, + {-0.804297,-0.114715}, + {-1.478564,-0.084384}, + {-0.408535,0.423840}, + {-0.168721,-0.141810}, + {0.077383,0.243237}, + {-1.559434,1.191402}, + {1.022154,-0.100324}, + {0.323561,0.469589}, + {-0.663531,0.640213}, + {0.554019,1.763611}, + {1.013954,-0.099589}, + {-0.768361,0.429501}, + {-1.056947,-0.854475}, + {0.199817,-1.902227}, + {-0.070703,-0.504816}, + {-0.936270,0.009265}, + {0.151126,-0.507320}, + {-0.504326,0.276844}, + {-0.314265,1.314549}, + {0.326736,-0.579350}, + {0.592561,-0.964175}, + {-0.223907,-0.829707}, + {-0.401792,-0.560375}, + {0.302453,-0.641377}, + {0.179660,0.273186}, + {-0.093790,-1.403175}, + {-0.547478,-0.365566}, + {-1.082055,-0.079541}, + {0.493591,0.675680}, + {0.488427,0.562525}, + {0.214921,0.219073}, + {1.036597,-0.145378}, + {-0.027255,-0.113060}, + {0.673240,0.620677}, + {0.723878,-0.899601}, + {0.069137,-0.059731}, + {0.241888,0.932147}, + {0.990557,0.522072}, + {0.333210,-0.429499}, + {0.416918,0.495753}, + {-0.659767,-0.994323}, + {0.616175,0.547587}, + {1.096390,0.648779}, + {1.512614,1.140619}, + {-0.038962,-1.035122}, + {-1.083694,-0.279680}, + {0.614096,0.432151}, + {-0.347563,0.062973}, + {1.386988,-0.035997}, + {0.327510,-0.207868}, + {-1.183518,-1.737384}, + {-0.208895,1.406995}, + {0.663338,-0.017747}, + {-0.897272,-0.573788}, + {0.942633,-0.547325}, + {-0.099388,-0.254556}, + {-0.201353,0.644556}, + {0.866075,-0.228444}, + {0.946155,-0.216844}, + {-0.253558,0.114459}, + {0.715896,0.743102}, + {-0.359932,0.276616}, + {-0.210247,-0.083149}, + {0.802847,0.140860}, + {0.408994,0.029881}, + {0.377356,0.319152}, + {-0.372690,-0.245271}, + {0.676166,0.109436}, + {0.724096,0.333436}, + {0.221166,0.187551}, + {-0.391584,0.738071}, + {0.005351,0.778829}, + {-0.358326,0.932486}, + {0.490539,0.803589}, + {-1.940728,-0.191677}, + {0.344834,0.501654}, + {0.800213,0.523732}, + {0.582049,-0.075948}, + {-0.161980,0.485703}, + {-0.259158,-0.582118}, + {1.062836,0.273222}, + {-0.778178,0.190672}, + {0.714527,-1.538556}, + {-0.396795,0.449148}, + {-0.781750,0.953574}, + {-0.338389,-0.501176}, + {-0.641856,-0.054484}, + {0.563696,-0.904985}, + {-0.099391,1.184931}, + {-0.112808,0.108574}, + {0.646080,0.427004}, + {0.212517,0.155965}, + {0.535560,-0.571720}, + {0.553376,-0.294148}, + {-1.607834,-0.184165}, + {-1.547767,0.680574}, + {0.781165,0.154537}, + {0.560969,0.631483}, + {0.495580,1.820957}, + {0.007403,-0.213880}, + {-0.133441,0.263800}, + {-0.539947,-1.040542}, + {0.451911,-0.153928}, + {0.637194,0.419776}, + {1.273621,1.299122}, + {-0.212328,0.126958}, + {-0.797461,1.644603}, + {-0.122874,1.002433}, + {0.531739,1.435631}, + {-0.292445,0.088739}, + {0.116979,0.506073}, + {0.300921,-0.773498}, + {-0.001333,-0.556370}, + {-0.895409,0.437721}, + {0.917279,0.508782}, + {-0.491002,0.775053}, + {0.198360,-0.494544}, + {-0.466188,0.389353}, + {1.026724,0.378360}, + {0.554313,0.153011}, + {2.109013,0.702959}, + {-1.076990,-0.126220}, + {-0.628257,-0.250837}, + {-0.360120,-0.713433}, + {0.323767,-0.526853}, + {0.618992,0.232543}, + {0.680284,-0.239604}, + {-0.469444,0.121707}, + {-0.121518,-0.113712}, + {0.429205,-0.768057}, + {0.120817,-0.738954}, + {0.246917,-0.025595}, + {0.223685,0.828870}, + {0.558682,0.833145}, + {-0.226176,-1.141426}, + {0.592138,0.661966}, + {0.057983,-0.123112}, + {-0.277232,0.942800}, + {0.380806,-0.215897}, + {-1.027768,-0.692785}, + {1.629491,-1.099912}, + {-0.047831,-1.555090}, + {-0.577377,-0.165198}, + {0.708597,-0.250402}, + {-1.063587,-0.338164}, + {0.505373,0.385189}, + {0.072781,-0.658487}, + {0.542617,-0.198652}, + {1.367844,0.323822}, + {-0.727703,0.962762}, + {-0.393308,0.873045}, + {-0.950481,0.223532}, + {1.018389,0.884161}, + {-0.042519,0.854602}, + {-1.358413,-0.098257}, + {0.245351,-0.975102}, + {-0.055406,-1.219287}, + {1.325559,-0.297813}, + {-0.072107,-0.600966}, + {-0.045452,-0.636110}, + {1.196032,-0.569957}, + {0.455332,-1.319878}, + {-0.547178,-0.392150}, + {-1.296887,-0.758016}, + {0.862281,0.903182}, + {-0.538526,-0.948723}, + {0.065158,0.398744}, + {-0.565977,-0.745461}, + {-0.050462,0.869712}, + {0.205620,-0.219247}, + {0.093927,-0.270377}, + {1.113685,-1.069443}, + {-0.718055,0.556379}, + {0.050929,0.307347}, + {-1.222501,0.207457}, + {0.951141,-1.438969}, + {-0.003803,-0.125003}, + {-1.267607,0.411439}, + {-0.857943,-1.588554}, + {0.596604,-0.286897}, + {-0.872539,-0.101087}, + {-0.658556,0.189207}, + {-0.387868,-0.070786}, + {-0.462842,0.344476}, + {1.085369,-0.860640}, + {1.581858,1.043663}, + {-0.972570,0.171239}, + {-0.075607,-0.486479}, + {1.421958,-1.399106}, + {-0.589684,0.410053}, + {0.377491,0.034375}, + {0.428788,0.365635}, + {-0.528193,-1.238089}, + {0.262891,0.578832}, + {0.066590,0.188433}, + {-0.745635,-0.018847}, + {-0.116912,-0.514034}, + {0.597006,0.677949}, + {0.107517,-0.406065}, + {1.015423,0.001044}, + {-0.197476,0.574557}, + {-0.248416,-0.193462}, + {0.473342,-1.017108}, + {0.137976,1.024174}, + {-0.210346,0.751566}, + {-1.015057,-0.473646}, + {-0.595567,0.801209}, + {0.796281,0.545814}, + {-0.856927,-0.309617}, + {0.591179,1.361440}, + {0.157283,-0.776932}, + {0.393443,1.025215}, + {0.537778,0.697904}, + {2.219707,0.499801}, + {1.273309,-0.828332}, + {-0.982928,0.949413}, + {-1.153902,0.670467}, + {-0.156032,-0.994523}, + {0.821935,-0.378448}, + {0.260809,0.087339}, + {0.216860,-0.601138}, + {-0.882410,-0.227433}, + {-0.440866,-0.094405}, + {-0.074585,0.039917}, + {-0.737009,1.217088}, + {-0.268090,0.493822}, + {-0.066510,-0.570724}, + {-0.203579,0.757423}, + {0.062591,-0.452128}, + {0.507822,1.130258}, + {-1.135255,-0.393007}, + {0.740321,0.411285}, + {-0.402801,-0.390182}, + {0.794407,0.970310}, + {0.566977,0.605520}, + {-0.537209,0.639380}, + {-0.426697,0.138911}, + {-0.087417,0.452920}, + {-1.152861,-0.321958}, + {-0.284884,0.639191}, + {0.145500,0.907847}, + {0.982621,0.367939}, + {-0.195191,1.137989}, + {0.211046,-1.239543}, + {0.562427,-0.534005}, + {0.830928,-0.588515}, + {0.651664,-0.531934}, + {-0.056867,0.384091}, + {-0.589129,1.364900}, + {-0.141771,-0.114847}, + {-0.411185,0.073030}, + {-0.265763,0.272064}, + {0.882316,0.793624}, + {-0.160386,0.002500}, + {-0.235607,-0.567823}, + {-1.210585,0.206751}, + {0.817503,0.330202}, + {-0.162811,-1.417884}, + {0.592217,0.010516}, + {1.662363,-0.402841}, + {-0.446189,0.501595}, + {-0.729150,-0.238869}, + {-0.452834,0.078506}, + {-1.518996,-0.427439}, + {-0.266874,0.101362}, + {0.531735,-0.547254}, + {-0.965587,0.011378}, + {-0.298296,-0.096297}, + {-0.149287,0.531172}, + {0.448779,-0.448307}, + {1.047356,-0.315960}, + {1.247794,0.506753}, + {0.590511,0.472349}, + {0.121279,-0.433674}, + {-0.114362,0.767422}, + {1.581429,0.955828}, + {1.476868,-0.288333}, + {-0.556583,-1.164155}, + {-0.059431,-1.160055}, + {0.634128,1.002689}, + {-0.575933,0.033633}, + {1.081099,1.385344}, + {-1.422736,0.075505}, + {1.046288,0.401673}, + {0.435929,-0.472107}, + {-0.206122,0.348224}, + {-0.412777,-0.109916}, + {0.121895,-0.581462}, + {-0.133105,0.264961}, + {-0.850482,-0.072401}, + {-0.577871,0.376519}, + {-1.388756,-0.023759}, + {0.779804,-0.186311}, + {-0.620828,-0.118957}, + {0.932679,0.434943}, + {0.633370,0.592508}, + {1.134259,0.028486}, + {0.799487,0.223794}, + {-0.347314,-0.170474}, + {0.539087,-0.221093}, + {-0.820533,0.307851}, + {-0.717160,0.017505}, + {0.542587,-1.162436}, + {-0.624600,0.801725}, + {1.352536,-0.143812}, + {-0.796545,-0.900611}, + {-0.356700,-0.350123}, + {0.038018,0.541666}, + {0.289386,0.401983}, + {-0.137301,1.430812}, + {1.503273,0.402538}, + {-0.492407,-0.424006}, + {0.932498,-0.226829}, + {0.093021,0.081391}, + {-0.093971,-0.658882}, + {-0.284706,-0.026044}, + {-0.226983,0.526229}, + {0.029324,0.041975}, + {0.873120,0.151935}, + {-0.393476,-0.848702}, + {1.838695,-0.084288}, + {-0.074042,1.079671}, + {0.039939,-1.111425}, + {0.669271,2.216002}, + {-0.589368,-0.446797}, + {-0.465512,0.085837}, + {0.651261,0.403519}, + {0.218905,-0.766309}, + {-0.128001,0.073902}, + {-0.272830,-0.432066}, + {0.519152,-0.589446}, + {-0.311524,0.233018}, + {-0.545692,-0.664651}, + {-1.380502,0.757145}, + {-0.000180,-0.339163}, + {0.446891,0.438011}, + {0.454009,-0.094370}, + {-1.035878,0.187205}, + {-0.896572,0.237276}, + {0.382598,0.442667}, + {-2.504186,-0.537285}, + {0.099216,0.970556}, + {-0.381212,-0.168048}, + {0.554364,-0.100494}, + {-0.269872,-1.498621}, + {-0.494833,-0.343613}, + {0.449499,0.124923}, + {0.027846,-0.151862}, + {-0.115574,-0.391918}, + {0.431950,-0.632974}, + {-0.223079,0.433815}, + {-0.360470,0.230335}, + {-0.351935,-0.652477}, + {-0.699202,-0.709860}, + {0.165994,1.156386}, + {0.946215,-0.422976}, + {-0.694515,0.460667}, + {0.163665,-0.096615}, + {-0.011231,0.132682}, + {1.105695,0.245389}, + {1.070530,0.039658}, + {-0.393505,-0.942814}, + {0.695178,-0.279964}, + {0.373143,-0.153469}, + {0.068343,-0.246175}, + {0.255959,0.802372}, + {-0.561208,0.096934}, + {-0.520615,-0.044160}, + {0.829240,-0.282919}, + {0.617384,-0.417490}, + {1.900495,1.234182}, + {-1.341464,1.226474}, + {-0.168441,-0.813023}, + {1.015085,-0.464638}, + {0.369413,-0.066272}, + {-0.239524,0.683590}, + {0.357866,-0.112409}, + {1.009900,1.254497}, + {0.068589,0.356761}, + {-0.438932,-0.304929}, + {-0.012575,-0.341361}, + {0.299906,-0.036658}, + {0.404167,-0.128515}, + {0.366136,-1.307424}, + {-0.598692,-1.008058}, + {0.110613,-0.159653}, + {1.201734,0.376235}, + {-0.704852,0.106275}, + {0.007635,0.082348}, + {-0.767279,0.145814}, + {-2.046550,1.123715}, + {-0.006254,-0.772897}, + {1.860613,0.657821}, + {-1.010233,0.378664}, + {0.049775,0.410985}, + {-1.426361,0.659661}, + {0.362923,0.949449}, + {0.169229,-0.433502}, + {1.588609,-1.429715}, + {1.714049,1.762603}, + {0.280914,0.315189}, + {-0.366100,0.687960}, + {-0.017839,0.001341}, + {-0.011156,-0.946371}, + {0.605485,-0.901263}, + {1.083968,-1.642610}, + {0.689493,1.137977}, + {-1.346342,-1.228991}, + {0.441885,0.428678}, + {-0.300121,-0.242661}, + {0.151982,0.516324}, + {1.165886,0.321775}, + {-0.428105,0.187019}, + {-1.004687,0.294742}, + {0.338772,1.213508}, + {0.988679,-0.037867}, + {-0.224368,0.155973}, + {0.141559,0.186316}, + {-0.644438,0.395989}, + {-0.199866,-0.523264}, + {-0.107300,-0.461294}, + {0.358698,-0.649953}, + {-0.634770,-0.312915}, + {-0.564734,-0.715844}, + {0.255026,-1.108371}, + {-0.086293,0.312637}, + {0.814938,-0.283814}, + {1.229763,0.128464}, + {0.227974,-0.418647}, + {-0.120043,-0.684067}, + {0.077666,-0.085758}, + {-0.050780,-0.670323}, + {0.136626,0.813804}, + {0.594956,-0.407936}, + {0.955985,-0.191253}, + {0.489552,-1.486926}, + {0.577579,-0.486322}, + {0.562717,-0.751664}, + {0.002459,0.263571}, + {0.288905,-0.878478}, + {-0.464409,-0.538675}, + {0.286060,0.412672}, + {-0.181148,0.381556}, + {0.151361,0.358454}, + {-0.078488,0.251609}, + {0.773414,-0.739208}, + {0.691577,-0.694201}, + {-1.293390,-0.509235}, + {1.146156,-0.653543}, + {-0.242636,-0.801005}, + {0.353931,-0.135868}, + {-0.243086,-0.439001}, + {0.354013,-0.233653}, + {-0.277764,-0.677296}, + {0.473043,0.038362}, + {-0.176500,0.264359}, + {-0.625575,0.366112}, + {0.202867,0.941900}, + {-0.326032,0.671700}, + {-1.046037,-0.687290}, + {-0.868275,-0.007581}, + {-0.570060,0.286439}, + {0.713059,0.210833}, + {-1.294165,-0.028527}, + {0.071361,0.847772}, + {0.508287,0.046283}, + {0.058998,-0.528609}, + {-0.568115,1.051018}, + {0.922293,-0.377449}, + {0.202094,0.031911}, + {-0.114554,-0.415825}, + {-0.776175,-0.804922}, + {-0.057279,-0.584848}, + {0.412935,0.618731}, + {-1.092835,0.486985}, + {-0.678552,0.788882}, + {-0.968375,0.329940}, + {-0.714789,-0.149820}, + {-0.384156,0.175588}, + {0.730323,-0.459545}, + {-0.374056,-0.030715}, + {-0.530865,1.744913}, + {0.317942,0.712183}, + {0.514842,-1.521713}, + {-1.982352,0.917451}, + {0.533069,-0.184669}, + {-0.047735,-0.546721}, + {-0.084978,0.164704}, + {-0.713723,0.221991}, + {0.082505,-0.468486}, + {-0.100827,0.472135}, + {-0.666553,0.018597}, + {0.287429,-0.329748}, + {-1.436239,1.330035}, + {0.290806,-0.769263}, + {-0.048715,0.566687}, + {-0.968640,-0.211849}, + {0.088714,-1.498366}, + {-0.081821,-1.526247}, + {-0.569582,0.589569}, + {-0.581721,-0.848599}, + {-0.006144,-0.254501}, + {-0.374622,1.266927}, + {-0.426722,0.039232}, + {-0.613330,0.408639}, + {0.242699,-0.420023}, + {-0.511846,-0.344112}, + {0.055041,-0.785869}, + {0.817784,0.414807}, + {0.327502,-0.140078}, + {-0.177410,0.254219}, + {-0.697158,1.041201}, + {0.443662,0.437433}, + {0.255286,1.735288}, + {-0.986974,0.995444}, + {-0.170297,0.934111}, + {0.016505,-0.449689}, + {0.074375,0.925671}, + {-0.264038,-0.993178}, + {0.394263,0.428509}, + {0.275369,-0.148148}, + {-0.026461,0.786728}, + {0.219694,-0.715724}, + {-0.198181,-0.337653}, + {-0.046106,1.077969}, + {-0.427274,-1.648299}, + {0.916379,0.354817}, + {-0.495159,0.025080}, + {0.900671,-0.716446}, + {-0.255983,0.933249}, + {0.849832,-0.023818}, + {0.848812,1.222279}, + {0.762640,-0.407851}, + {-1.113535,-0.693755}, + {0.853063,-0.222685}, + {0.182071,-0.562988}, + {0.452813,-0.071797}, + {-1.401647,0.298240}, + {-1.096633,-0.276216}, + {-0.470637,-1.218317}, + {0.061808,0.397691}, + {0.600333,-0.767871}, + {1.008250,0.000708}, + {-0.647290,0.306240}, + {-0.398649,0.249797}, + {-1.305586,-0.172789}, + {0.385940,-1.320990}, + {0.758806,0.901173}, + {-0.002028,-0.687838}, + {-0.619773,-0.519246}, + {0.850480,-0.003780}, + {-0.327611,1.357023}, + {0.407292,0.562773}, + {-0.053213,-0.769666}, + {1.106032,1.282982}, + {-0.673619,1.289760}, + {0.476732,-0.611785}, + {0.152022,-1.680944}, + {-0.649479,-0.291411}, + {-0.012972,-0.162121}, + {-0.691724,0.407729}, + {0.236190,-1.267413}, + {0.533790,0.419325}, + {-0.018652,0.266647}, + {0.229770,0.165313}, + {-0.558823,-0.887105}, + {-0.764080,0.628785}, + {0.355465,0.190894}, + {-1.031620,0.424156}, + {0.210209,-0.511032}, + {2.231847,-1.271046}, + {0.495758,-0.561719}, + {-0.007179,-0.289322}, + {0.208132,1.637787}, + {-0.761436,-0.158279}, + {-1.584498,-0.324741}, + {0.085113,0.686596}, + {-0.430017,0.361140}, + {0.205829,-0.606992}, + {0.307451,0.417509}, + {-0.305665,0.631657}, + {-0.401597,-0.758367}, + {-0.231825,-0.733147}, + {0.413582,0.999199}, + {-0.017343,-0.416519}, + {-0.165102,-1.228027}, + {1.079916,0.834003}, + {-0.032758,1.090964}, + {0.682886,0.223947}, + {-0.125567,0.406849}, + {-0.291070,0.319598}, + {-0.433261,1.411476}, + {-0.521844,0.077749}, + {-1.622536,0.199245}, + {-1.152493,-1.236599}, + {0.010262,-1.143242}, + {0.590426,0.129957}, + {0.710855,-0.106919}, + {0.453857,-0.988619}, + {-0.904005,-0.503640}, + {0.589253,-0.486321}, + {-0.430470,-0.027916}, + {-0.820770,-0.751695}, + {-0.282278,-0.038594}, + {0.864998,0.097233}, + {0.111612,-0.288777}, + {-0.028031,-0.269425}, + {0.431845,0.101275}, + {-0.339818,-0.152321}, + {0.921835,0.289830}, + {-0.671086,-0.501673}, + {0.247329,0.183999}, + {0.567859,-0.307398}, + {0.116284,0.435589}, + {0.203286,0.041931}, + {0.492580,-1.168513}, + {0.661239,0.504958}, + {0.626179,0.315147}, + {1.241463,-0.126592}, + {-0.242149,0.706826}, + {0.022340,-1.150953}, + {-0.121594,0.286725}, + {-0.759044,0.336943}, + {1.203657,-0.225805}, + {-0.307556,-0.613049}, + {0.760114,-0.923164}, + {-1.293027,0.195280}, + {1.015077,0.098072}, + {-2.074471,-0.189545}, + {0.841240,0.955406}, + {-0.178337,0.721980}, + {1.160489,0.003816}, + {-0.384566,2.620896}, + {0.704705,0.063137}, + {0.548336,0.066192}, + {0.190808,-0.012015}, + {0.553649,0.329412}, + {-0.320558,0.795527}, + {-0.615417,0.909293}, + {-1.246752,-0.698925}, + {0.549175,0.281020}, + {-0.778784,-1.430814}, + {0.806743,0.036949}, + {0.477405,-0.736326}, + {-0.702940,-0.929653}, + {0.151960,0.582314}, + {0.865540,-0.423882}, + {0.491950,0.963153}, + {0.330508,0.053934}, + {0.464252,0.827913}, + {0.192361,-0.235847}, + {0.816402,-0.115001}, + {0.092131,-0.660784}, + {0.174107,0.285417}, + {-0.755223,0.514173}, + {0.364767,-0.792043}, + {-0.562086,-0.217651}, + {0.353453,0.348443}, + {0.585457,1.370006}, + {0.984197,-0.178664}, + {-0.366706,-0.786270}, + {1.414700,-0.134770}, + {0.941644,0.284337}, + {-0.455753,1.036933}, + {1.382049,0.541054}, + {0.575756,-0.046144}, + {-0.051649,0.048517}, + {-1.119540,0.541357}, + {0.273349,1.070178}, + {-0.456227,-0.374803}, + {-0.426392,-0.882598}, + {-0.085007,1.118462}, + {-0.265127,0.515600}, + {0.769586,-0.251247}, + {-0.458924,1.727463}, + {0.661363,0.210307}, + {0.953185,0.310892}, + {0.165745,-0.249229}, + {0.003256,-1.461112}, + {-1.295068,0.895661}, + {0.505398,-0.514159}, + {-0.794349,-0.483016}, + {-0.156867,-1.192899}, + {0.540678,0.515770}, + {-0.124202,-0.030591}, + {-0.391160,1.843647}, + {0.495854,0.368012}, + {0.973258,-0.316386}, + {-0.194668,-0.132074}, + {-0.155372,-0.897061}, + {0.231087,-0.105997}, + {-0.153340,-0.294455}, + {0.796845,0.174109}, + {0.603647,0.542966}, + {0.254563,0.674866}, + {-0.956172,-0.048158}, + {-0.530818,-0.801843}, + {-1.026113,-0.351077}, + {0.523780,0.415202}, + {-0.948912,-1.572310}, + {0.410020,0.659503}, + {-0.701486,-0.147504}, + {2.688922,0.358403}, + {1.560465,-0.433628}, + {-0.496547,-0.211502}, + {-0.124965,-0.391226}, + {-0.533224,0.503166}, + {-0.321520,-0.572785}, + {1.258924,0.163907}, + {0.151190,-0.084062}, + {0.226057,-0.056905}, + {0.587172,-0.471113}, + {-0.695980,-0.163141}, + {-1.237538,-0.208643}, + {0.998500,0.955563}, + {-0.179606,0.559009}, + {0.137764,-0.393149}, + {0.502345,-0.054011}, + {-0.904479,0.141850}, + {-0.350247,-0.211378}, + {0.404017,-0.839708}, + {1.263962,0.630874}, + {-0.135289,-2.442988}, + {0.442130,-0.830587}, + {0.122658,0.023062}, + {0.883724,0.665128}, + {-0.178230,0.306886}, + {-0.468211,0.071836}, + {0.246586,0.267636}, + {-0.557471,-0.275384}, + {0.580532,-0.339634}, + {0.229230,0.098588}, + {-0.037226,0.048941}, + {0.429143,-0.409864}, + {-0.994136,0.254552}, + {1.166575,0.976509}, + {0.851270,-0.625880}, + {-0.345877,0.458113}, + {1.414551,-0.046154}, + {-0.380014,0.085284}, + {-0.464670,0.922754}, + {0.372413,-0.292998}, + {0.047303,-0.678625}, + {0.754110,-0.077518}, + {-0.818388,-0.489265}, + {0.374833,0.280108}, + {0.074119,-1.470670}, + {-0.635899,-0.637640}, + {0.921722,0.985314}, + {-1.420950,0.022021}, + {0.627703,0.569002}, + {0.340334,0.147938}, + {0.400352,0.190057}, + {-1.088817,0.050628}, + {0.137021,0.484178}, + {0.078217,0.350442}, + {0.294682,0.070688}, + {-0.085588,0.602284}, + {0.673964,-0.173427}, + {-0.235137,-0.583674}, + {-0.707102,0.052630}, + {0.474050,-1.693641}, + {1.003813,0.543324}, + {0.628591,-0.050070}, + {-0.249527,0.767586}, + {-1.879195,-0.452537}, + {0.396132,-0.415229}, + {-0.028199,0.551825}, + {0.385329,-0.220834}, + {1.324679,-0.312798}, + {-0.642863,-0.825135}, + {-0.004710,-0.058157}, + {-0.847162,0.856134}, + {-0.740614,-0.863084}, + {-1.158400,0.973958}, + {-1.671737,-0.563632}, + {-0.650321,-0.235563}, + {0.598594,-0.545525}, + {0.526469,0.149947}, + {-0.237268,0.583359}, + {0.423311,-0.217139}, + {0.379071,1.034865}, + {-1.758812,0.686033}, + {-0.185959,0.643266}, + {0.032531,0.661944}, + {-0.298139,-0.817098}, + {-1.599706,-0.313605}, + {0.426141,-0.444764}, + {-1.006136,-0.819221}, + {-0.706618,-0.317805}, + {0.141126,1.084697}, + {0.623824,0.023016}, + {-1.046610,0.015300}, + {0.745230,0.751430}, + {-1.319946,-0.564289}, + {-0.604642,0.954636}, + {-0.483640,1.126604}, + {-0.757284,-0.011440}, + {-0.387955,-0.304309}, + {0.153010,2.368292}, + {0.914144,-1.029997}, + {-0.299668,-0.611878}, + {0.525482,-0.659581}, + {0.420515,0.491139}, + {-0.366100,0.268333}, + {0.341777,-1.103398}, + {-0.323677,0.907073}, + {-1.121212,0.392582}, + {0.633364,0.164803}, + {0.338245,-0.443073}, + {-0.135408,-0.702552}, + {-1.008789,-0.011260}, + {-0.781123,-0.685846}, + {0.776429,-0.662386}, + {1.057167,0.352887}, + {-0.597591,0.229540}, + {0.084232,1.119583}, + {-0.285929,0.236433}, + {0.186841,0.460782}, + {-0.172005,-0.130474}, + {0.310647,0.559606}, + {-0.119430,0.878673}, + {-1.612776,0.477573}, + {-0.154730,-0.506361}, + {-0.083025,-1.341480}, + {-0.590808,-0.873065}, + {0.237921,0.451140}, + {-1.029581,-0.416044}, + {-0.719467,-1.896297}, + {-0.051499,0.067354}, + {0.889375,-0.684079}, + {-0.718765,0.727295}, + {-0.536690,-0.605252}, + {-0.739059,-0.585248}, + {0.344357,0.106056}, + {-0.829777,0.728094}, + {-0.283713,0.261390}, + {0.152151,0.078054}, + {0.567021,0.126294}, + {0.291900,0.562743}, + {1.059085,0.084687}, + {-0.551331,-1.234712}, + {-0.588794,-1.091670}, + {-1.691073,-0.118561}, + {1.420551,-1.631329}, + {0.205528,-0.641568}, + {0.162794,0.566978}, + {0.766135,-0.410851}, + {-0.798597,0.988584}, + {-0.718769,-0.992680}, + {0.344092,0.608391}, + {0.292893,0.732026}, + {0.056027,-0.138066}, + {0.429755,0.079029}, + {0.187873,0.660457}, + {-0.517005,0.344139}, + {-0.147412,-0.311869}, + {-0.426811,-0.332282}, + {1.157440,-0.638019}, + {0.183905,-0.237103}, + {-0.779848,0.107454}, + {-0.451815,-0.023654}, + {-0.631830,0.052062}, + {-0.010302,0.265023}, + {-0.740212,0.667259}, + {-0.327306,-0.562585}, + {-0.036460,-0.926800}, + {-0.695698,0.585635}, + {0.506878,0.691465}, + {0.758726,0.102093}, + {0.084728,0.503180}, + {1.401625,0.519015}, + {-0.631581,-0.606695}, + {0.803128,-0.862507}, + {0.940896,0.866730}, + {0.194009,1.652032}, + {0.144810,-0.487873}, + {-0.461080,-0.403805}, + {0.002382,0.136163}, + {0.075381,-0.322951}, + {-0.966995,0.269808}, + {-0.030479,-0.126750}, + {-0.149463,0.291122}, + {1.059634,-0.087343}, + {-0.579570,0.637704}, + {-0.747178,-0.468939}, + {0.647099,-0.724797}, + {-0.223191,0.924383}, + {-0.337221,-0.601146}, + {-0.515588,0.209382}, + {-0.439052,-0.285641}, + {-0.461382,0.405431}, + {-0.342314,-0.077113}, + {-0.631056,-0.415190}, + {0.238351,-0.386171}, + {-0.862323,0.642213}, + {0.023490,1.420643}, + {-0.875054,-0.335857}, + {-0.501911,0.198525}, + {-0.610229,-0.615875}, + {-0.798574,0.715166}, + {0.822130,-1.270475}, + {-1.244082,0.455988}, + {1.012773,-0.052447}, + {1.371291,0.428342}, + {0.352000,-0.742200}, + {-0.239479,-0.204546}, + {-0.894340,-0.160308}, + {0.011754,-0.047223}, + {-0.665009,-1.202901}, + {-0.774045,-1.477797}, + {0.298235,0.642437}, + {0.281567,-0.363596}, + {-0.359115,0.641628}, + {0.457527,0.395590}, + {-0.613016,0.686037}, + {0.366476,-1.001394}, + {-1.256980,-0.267237}, + {-0.929750,0.866740}, + {0.450983,-0.179572}, + {-0.783167,0.315364}, + {0.373729,-0.263585}, + {-0.829264,1.092197}, + {-0.294844,-1.307715}, + {-0.382714,0.271065}, + {0.432171,1.321070}, + {1.193662,-0.601561}, + {0.441481,1.078067}, + {0.816584,0.272961}, + {0.550523,-0.150661}, + {0.184214,-0.219220}, + {-0.009063,-0.442284}, + {1.646675,-0.741609}, + {1.016200,0.837222}, + {-0.793906,-0.222885}, + {0.919271,0.064883}, + {-1.356202,0.423254}, + {0.049124,-0.191414}, + {-0.195965,0.184440}, + {1.121060,1.056448}, + {-1.033376,-0.124441}, + {0.347735,1.195392}, + {0.503386,0.384467}, + {0.000622,0.057254}, + {0.170387,-0.558950}, + {0.128132,0.079457}, + {1.004037,-0.526779}, + {0.385914,0.909700}, + {1.335021,-1.678956}, + {-0.288577,-0.895513}, + {0.565198,-0.882130}, + {0.225851,0.962253}, + {0.879317,-0.347095}, + {0.176626,0.994786}, + {-0.866639,-0.349720}, + {-0.671101,-0.515104}, + {-0.485501,0.483706}, + {-0.618060,0.335038}, + {0.041503,-0.588110}, + {0.111759,0.143271}, + {0.462091,-1.215689}, + {-0.745533,0.359722}, + {-0.258587,-0.704901}, + {0.274778,0.923238}, + {-0.004584,-0.433904}, + {-0.110584,0.522650}, + {0.310410,-0.005530}, + {-0.937176,-1.562305}, + {-0.827198,0.289808}, + {-0.698794,-2.184667}, + {-0.330698,-0.129384}, + {1.282239,0.020580}, + {0.367543,0.233161}, + {0.065772,0.245385}, + {-1.368919,-0.232512}, + {-0.022110,-0.434683}, + {0.989342,2.850177}, + {0.301916,-0.504838}, + {-0.199269,0.274472}, + {0.050557,-0.762571}, + {-0.439144,-1.131543}, + {-1.080251,-0.382884}, + {0.966876,-2.108684}, + {-0.843520,-0.663706}, + {0.898827,0.695593}, + {1.141696,1.743007}, + {-1.209097,0.920291}, + {-0.133004,-0.591750}, + {0.230189,-0.024491}, + {0.267833,-0.097969}, + {0.945771,-0.620059}, + {-1.927322,0.029121}, + {0.624278,-1.539738}, + {0.038578,0.956436}, + {-0.340126,0.630304}, + {0.615450,0.090583}, + {0.546216,-0.444248}, + {1.103206,-0.220818}, + {0.249552,-1.338686}, + {0.137988,-0.524542}, + {0.535324,-0.053403}, + {-0.312144,0.754749}, + {-0.305128,-0.570806}, + {-0.270710,-0.431734}, + {1.075527,-0.517887}, + {0.925849,-0.402164}, + {0.780606,-0.094631}, + {0.304430,-0.321345}, + {-2.161699,0.828282}, + {-0.074158,-0.677161}, + {-0.063345,-1.326582}, + {-0.309826,0.355096}, + {-0.276573,-0.413940}, + {0.647672,0.302474}, + {-0.232098,-1.147781}, + {0.120684,-1.621992}, + {0.955412,0.475249}, + {-1.220155,-0.114060}, + {1.336061,0.110965}, + {-0.643678,-0.340022}, + {-0.275077,-0.365716}, + {0.534379,-0.975696}, + {-1.015498,-0.567058}, + {-0.064751,-0.046544}, + {1.134877,-0.470992}, + {-1.008269,0.759255}, + {-0.144860,0.949311}, + {-0.732892,1.047155}, + {-1.535131,-0.961362}, + {-0.269558,0.444843}, + {0.059658,-0.187720}, + {0.035190,-0.221091}, + {-0.281704,-0.358197}, + {1.022722,0.075790}, + {-1.083448,-0.575743}, + {-1.302319,0.027091}, + {0.650458,1.349900}, + {-1.899117,1.012783}, + {0.181135,0.688259}, + {-0.202816,0.372898}, + {0.022705,1.006927}, + {0.407585,-0.837289}, + {0.002035,0.352033}, + {-0.356021,0.346572}, + {-0.617595,0.786143}, + {0.239147,-0.279550}, + {-0.088149,0.102956}, + {-0.145992,0.070007}, + {0.061313,-0.731353}, + {-0.584911,-0.334126}, + {-1.203326,0.593685}, + {-0.269043,-0.369218}, + {0.521335,-0.180848}, + {0.144528,0.438304}, + {0.735844,-0.087415}, + {0.843519,0.404185}, + {0.253477,0.233027}, + {0.286579,-0.892798}, + {0.017010,1.496329}, + {-0.282048,-0.432474}, + {-0.831781,-0.766073}, + {-0.339801,0.157388}, + {0.117625,-0.661367}, + {-0.133374,-0.349166}, + {-0.700496,-0.598886}, + {1.062019,-0.225486}, + {-0.844149,1.129804}, + {0.879032,0.843744}, + {-0.329666,0.330986}, + {0.186070,-0.855283}, + {-0.324321,-1.583881}, + {1.541431,-0.622636}, + {0.819195,-0.182278}, + {0.449811,-0.132524}, + {-0.888292,-1.515782}, + {-1.001516,-0.830254}, + {0.250502,-0.344122}, + {-0.187613,1.197694}, + {-0.529563,1.498822}, + {-0.076462,-0.133383}, + {0.650433,0.946105}, + {-0.483935,0.181802}, + {-0.723391,-0.925543}, + {-0.431870,-0.262836}, + {-0.422439,0.651529}, + {-0.782266,0.681568}, + {0.562754,-0.374426}, + {0.519622,0.043415}, + {-0.801116,1.075381}, + {-0.799244,-1.077313}, + {0.540276,1.027038}, + {-0.894727,-0.874882}, + {-0.749377,1.018981}, + {0.184097,-0.111914}, + {0.042289,-0.830370}, + {1.791222,-0.588920}, + {-0.047891,0.031348}, + {0.043701,-0.440535}, + {-0.840151,-0.568261}, + {0.323255,0.787932}, + {1.107241,0.054776}, + {0.060801,-0.856247}, + {-0.813509,0.705567}, + {-0.791245,1.459674}, + {-0.014035,-0.216140}, + {0.387915,0.037240}, + {0.642452,-0.129442}, + {-1.843821,-0.114364}, + {-0.035832,0.415178}, + {0.767540,0.263665}, + {-0.652285,-0.081054}, + {-1.285872,0.969226}, + {0.618911,0.255848}, + {-0.807479,0.457430}, + {1.064158,0.201941}, + {0.880563,0.083746}, + {-0.305545,1.351159}, + {0.904389,-0.245280}, + {-0.217445,0.025212}, + {-0.836006,-0.776473}, + {0.738829,1.044716}, + {0.284688,-0.270552}, + {1.085086,-0.533687}, + {0.671634,1.461351}, + {0.644988,-0.881924}, + {-0.894529,0.426442}, + {0.562243,0.029641}, + {0.404564,0.410895}, + {0.425106,-0.487737}, + {-0.640461,-0.176507}, + {-0.113150,-0.170049}, + {0.212635,-0.218543}, + {0.269008,1.255394}, + {0.432785,0.488759}, + {0.513129,0.005448}, + {0.099545,0.578849}, + {0.086904,-0.186066}, + {-1.555150,0.851275}, + {-0.032900,0.503340}, + {1.149826,0.331512}, + {0.073811,0.159585}, + {-0.223626,0.427643}, + {1.261585,0.418598}, + {0.601685,-0.525800}, + {-0.486987,-0.199185}, + {-0.059233,0.227470}, + {0.226861,0.459247}, + {-0.341422,-1.927231}, + {-0.171239,0.113076}, + {0.078549,1.096510}, + {-0.338355,-1.369953}, + {0.159905,-0.691937}, + {-0.307114,0.783536}, + {-0.566867,0.107976}, + {0.511947,-0.433910}, + {0.691441,-0.214146}, + {-0.603745,0.410150}, + {0.628406,1.315388}, + {0.785402,-0.016113}, + {0.897580,1.142371}, + {-0.523238,0.503762}, + {-1.709664,-0.720023}, + {0.458547,-0.008885}, + {-0.334689,-0.277679}, + {0.489018,-0.845080}, + {0.523348,0.669807}, + {-0.078580,0.679453}, + {0.434669,1.223368}, + {-0.046575,1.365787}, + {-0.280968,-0.687172}, + {-1.099810,0.666500}, + {-0.860152,-0.227991}, + {-0.330220,0.063645}, + {-0.469986,-0.845073}, + {-0.674068,1.048877}, + {0.455515,0.818142}, + {0.849858,-0.564687}, + {0.059095,-0.035666}, + {-0.223894,0.001953}, + {-0.067447,-1.792125}, + {1.605312,0.096682}, + {-1.475052,-0.104396}, + {-0.360386,-0.579824}, + {0.955123,1.157321}, + {-1.251963,0.038931}, + {0.370436,-0.992312}, + {1.371997,-0.487094}, + {0.015502,-0.447989}, + {-0.022840,-0.149928}, + {-0.664625,0.831535}, + {0.757109,0.066880}, + {-0.632931,-0.921457}, + {-0.231963,-0.193233}, + {0.777090,0.166369}, + {0.609395,-0.027552}, + {0.139106,0.541898}, + {0.942118,0.587904}, + {0.251157,-0.133831}, + {0.487019,0.189802}, + {0.457665,0.362136}, + {-0.424465,-1.249760}, + {0.581103,-0.376516}, + {0.510419,-0.590129}, + {1.037473,0.371550}, + {-0.466737,-1.004333}, + {-0.011938,0.537880}, + {0.547161,1.035422}, + {0.606423,-0.516887}, + {0.056961,1.039645}, + {0.477078,-0.559180}, + {-0.254626,-1.547132}, + {-1.133833,0.334869}, + {0.822161,0.621644}, + {-0.062360,-1.517223}, + {-0.703293,-0.420242}, + {0.317995,-0.825593}, + {0.736898,-0.336708}, + {0.771707,-0.083937}, + {-0.213908,0.357054}, + {1.824059,0.566277}, + {-0.196467,1.192675}, + {0.798056,0.142119}, + {-1.061991,0.018563}, + {-0.560025,0.370005}, + {0.454753,-0.180904}, + {-0.998511,0.325013}, + {-0.821580,-0.926141}, + {0.234012,-1.400391}, + {-0.674742,-0.704986}, + {-0.291769,1.030446}, + {-0.034057,0.722172}, + {0.696109,-0.239704}, + {0.209895,-1.576507}, + {-0.157850,0.127201}, + {0.466905,0.165965}, + {0.723092,-0.550305}, + {0.061567,0.078169}, + {-0.065939,0.569606}, + {-0.133807,0.770113}, + {0.393001,0.504942}, + {0.938111,-0.161913}, + {-0.597112,0.176459}, + {-0.258463,0.179758}, + {1.377765,-0.886022}, + {0.438264,0.736861}, + {-1.525573,0.999277}, + {-0.620013,0.193526}, + {0.575873,-1.214428}, + {-0.126903,0.386866}, + {0.530483,0.213737}, + {0.088473,-0.115534}, + {-0.212839,0.385450}, + {-1.321082,0.296746}, + {0.250801,0.116243}, + {-0.419752,0.580050}, + {0.941619,-1.096349}, + {0.016156,-0.012206}, + {0.223729,-0.513092}, + {0.431069,-0.090005}, + {-0.564370,0.121675}, + {0.207579,0.543705}, + {-0.569522,0.970283}, + {0.817061,0.419924}, + {-0.249714,0.263547}, + {0.715514,0.375579}, + {0.601764,0.078943}, + {0.912619,-0.785623}, + {-0.761932,0.233378}, + {0.345236,-0.083941}, + {0.256879,0.092192}, + {1.596566,0.978531}, + {0.233048,0.142618}, + {0.613216,-0.032437}, + {0.829523,-0.330173}, + {0.230123,-0.145399}, + {1.458398,1.026591}, + {0.430070,0.208748}, + {0.266168,0.118494}, + {0.539393,-0.277606}, + {-0.413476,-0.313748}, + {-0.369556,0.091205}, + {-0.326428,-0.843489}, + {0.876747,0.200702}, + {-0.649832,0.677572}, + {-0.132473,-0.408711}, + {-0.189154,-1.243630}, + {0.300237,-0.606909}, + {-0.727253,-1.333235}, + {0.491897,0.548159}, + {0.129355,1.663229}, + {-0.845514,-0.240228}, + {-0.375039,-0.919784}, + {0.911949,-0.218323}, + {0.235257,0.391849}, + {-0.246544,0.164098}, + {-0.231634,0.840406}, + {0.469351,-0.182122}, + {-1.743900,0.992432}, + {0.852607,-0.539289}, + {0.795267,-0.387124}, + {-0.185710,1.359292}, + {0.094303,0.079949}, + {0.642032,0.393244}, + {-0.155963,0.192307}, + {-0.348090,-0.970893}, + {0.392175,0.779526}, + {0.325050,-1.394403}, + {-0.089091,-0.577495}, + {-0.483524,0.167122}, + {-0.942847,0.788769}, + {-0.766730,-0.156880}, + {0.105378,0.028165}, + {-0.514349,0.215037}, + {0.561907,-0.681160}, + {0.734924,0.641628}, + {-0.145145,-0.683320}, + {0.393664,0.363491}, + {-0.681003,0.495072}, + {0.548521,-0.587928}, + {-0.058075,0.565056}, + {-0.107237,1.111712}, + {0.172436,-0.254398}, + {0.227540,-0.704157}, + {0.265045,-0.730209}, + {-0.869922,-0.474264}, + {-0.424165,0.721119}, + {-1.396401,-0.989424}, + {0.221913,-0.297296}, + {0.286758,-1.498876}, + {0.359150,0.152013}, + {0.112532,0.792481}, + {-0.518915,0.573917}, + {0.223169,-0.581940}, + {0.093260,-0.638841}, + {0.366104,0.042771}, + {0.417517,0.376103}, + {0.991679,-0.041029}, + {-0.060651,-0.884169}, + {-1.391370,0.124718}, + {1.114556,1.972558}, + {1.020741,-0.667193}, + {-0.025144,0.571881}, + {0.669084,-0.756397}, + {0.439585,-0.056732}, + {0.015199,0.202094}, + {0.566927,-0.613071}, + {-0.253624,0.616822}, + {-1.725917,0.187096}, + {-0.845198,1.593293}, + {-0.490629,-0.100485}, + {0.571619,-0.604498}, + {-0.018727,-0.145532}, + {-0.003540,0.086011}, + {-0.606243,-0.821588}, + {0.783794,0.540017}, + {1.102898,-0.136964}, + {0.216892,1.340393}, + {0.342599,-1.539241}, + {-0.575259,0.204180}, + {-1.488872,0.715385}, + {-0.221673,-0.742431}, + {-0.113355,0.020189}, + {0.213762,-0.406233}, + {-0.170202,-1.176525}, + {-0.131939,-0.115900}, + {0.612452,0.453876}, + {-0.743530,-0.455021}, + {0.466304,0.328039}, + {-0.258516,0.475259}, + {-0.516879,-0.380717}, + {-1.270884,-0.082694}, + {0.501087,-0.200590}, + {-1.445308,-0.484118}, + {0.650660,-0.526876}, + {-0.229810,-0.738966}, + {-0.802840,0.194996}, + {0.829044,-0.227303}, + {-0.054933,-0.287901}, + {0.285078,0.281370}, + {-0.363464,0.182841}, + {0.075010,-1.057872}, + {-0.589787,-0.269938}, + {1.178426,0.146037}, + {-0.073736,1.967197}, + {0.910865,0.370300}, + {-0.153322,0.395913}, + {1.123574,0.170210}, + {-0.882067,0.376414}, + {0.111788,0.783705}, + {-0.791890,0.455797}, + {0.724860,0.924557}, + {-1.174621,1.356142}, + {-1.081595,-0.106305}, + {-0.006296,-0.172133}, + {-0.122594,-1.407199}, + {-0.404103,0.582921}, + {-0.882765,0.122557}, + {0.094063,-0.110042}, + {1.335416,-0.733367}, + {0.464591,-0.575710}, + {-0.121591,-0.127096}, + {-0.062471,1.097518}, + {0.159503,1.027292}, + {-1.093872,-0.247750}, + {0.529288,-0.443974}, + {-0.136074,-0.048432}, + {0.556999,0.495463}, + {0.588577,0.128776}, + {0.462049,-0.451937}, + {0.353590,-0.723830}, + {0.204804,-1.625933}, + {0.092930,1.161258}, + {-1.224485,0.628751}, + {0.229420,-0.877564}, + {0.739953,-0.878338}, + {-0.892648,0.514262}, + {-0.544203,0.616829}, + {1.134951,-1.505910}, + {0.708691,0.176345}, + {-0.292243,0.137628}, + {-0.337737,-0.596135}, + {1.471883,0.535997}, + {-0.850951,0.121347}, + {0.243537,-0.589604}, + {-0.059771,1.176776}, + {-0.454490,0.804287}, + {0.070382,0.030761}, + {0.242788,0.176748}, + {-0.126759,0.129941}, + {0.030666,-0.850073}, + {1.875655,0.587808}, + {-0.161780,-1.784124}, + {-0.569807,0.916039}, + {-0.569185,0.072547}, + {-1.127872,0.026428}, + {-1.150343,1.487388}, + {0.720566,0.922631}, + {0.383465,-1.084402}, + {-1.237511,0.762091}, + {-0.099930,-0.928349}, + {-0.601861,-0.484212}, + {0.014186,0.985724}, + {0.396531,-0.374346}, + {0.370483,0.478921}, + {0.417636,0.285218}, + {0.144493,0.855940}, + {1.513194,-0.430838}, + {-0.286139,-0.974602}, + {-1.347122,-1.183399}, + {-0.109208,-0.834271}, + {-0.070154,-1.123663}, + {0.980670,0.398785}, + {1.504316,-1.491271}, + {0.365317,0.703937}, + {0.327227,-1.471393}, + {0.779325,-0.291336}, + {-0.813175,-0.633449}, + {0.201307,-1.315156}, + {-0.157624,0.806373}, + {1.101852,0.306818}, + {0.548022,0.618568}, + {0.914485,-1.093983}, + {-0.788237,1.330140}, + {0.204645,-1.260284}, + {0.708261,-0.487650}, + {0.831419,0.494045}, + {-0.479281,-0.174932}, + {0.274606,0.031707}, + {0.511466,1.479375}, + {-0.749887,0.138556}, + {0.094436,-1.604624}, + {1.701213,-0.021478}, + {1.273051,0.873564}, + {-0.564715,-0.604606}, + {0.576919,-0.577415}, + {0.854536,0.069007}, + {2.004698,-0.186701}, + {-1.020772,0.648632}, + {-0.474304,-0.256917}, + {0.280593,-0.442013}, + {0.609646,-0.099227}, + {-0.587909,-1.324509}, + {-0.478677,-0.380842}, + {0.992419,-0.833282}, + {-0.207837,0.203639}, + {0.504914,0.234515}, + {-0.266033,0.132612}, + {-0.242541,-0.095664}, + {-0.167233,-0.590706}, + {-1.276869,0.288847}, + {-0.312084,-0.687477}, + {0.271583,-0.587164}, + {0.515093,0.888483}, + {-0.886180,1.600277}, + {0.761687,1.283905}, + {-0.917327,-0.468507}, + {-0.255153,0.234853}, + {-0.698140,0.280238}, + {-0.173308,-0.549159}, + {1.163074,-0.136380}, + {-0.522856,-1.545376}, + {-0.250713,-0.577033}, + {0.127714,0.573650}, + {-0.619459,0.761195}, + {0.854662,-0.335280}, + {1.288629,-1.596849}, + {-0.259143,0.994771}, + {-0.089218,0.323881}, + {1.037082,-0.027840}, + {0.020579,1.366726}, + {-0.158254,0.495453}, + {0.551658,0.631316}, + {0.038543,-0.710163}, + {0.702737,-1.985090}, + {1.398746,-0.143418}, + {0.084599,-0.676724}, + {-0.015678,1.464065}, + {-0.034517,-1.102207}, + {-0.094801,-0.520467}, + {-0.203622,0.612699}, + {-1.132184,-0.715451}, + {-0.130513,0.631629}, + {-0.340655,0.517577}, + {-1.132617,-0.041877}, + {-0.913628,0.061052}, + {1.393766,-0.805041}, + {0.243021,-0.275513}, + {0.592899,0.812328}, + {-0.181057,0.511301}, + {-0.230935,0.289646}, + {-0.253628,1.248452}, + {-0.375765,-0.450903}, + {0.175142,-0.879180}, + {0.632521,0.051703}, + {0.714207,1.053456}, + {-0.848408,1.064349}, + {-0.233667,-0.270396}, + {0.383107,-0.240141}, + {0.507137,-0.249806}, + {-0.030230,-0.356838}, + {-0.578340,0.125787}, + {-1.095438,-1.281125}, + {0.471165,-1.473161}, + {-0.176499,-0.292983}, + {0.283998,-0.579375}, + {-1.456174,0.442805}, + {-1.091059,-0.554400}, + {0.325498,1.215230}, + {0.374914,-0.970670}, + {1.014939,0.866143}, + {-0.947639,0.514860}, + {0.945109,-0.393500}, + {-1.063523,-0.388257}, + {0.026398,-0.066196}, + {-0.485485,0.511262}, + {0.171215,-0.511392}, + {-1.389303,-0.782160}, + {0.119798,-0.872876}, + {-0.380890,-0.950004}, + {-0.454074,0.379206}, + {-0.150043,-0.133012}, + {0.209178,0.071162}, + {0.194253,-0.916240}, + {-0.696335,-1.251679}, + {-0.227848,0.695565}, + {-0.243941,-0.084309}, + {-0.950502,-0.635794}, + {-0.290364,0.216578}, + {-0.751428,-1.213585}, + {0.460577,-0.149599}, + {0.324715,0.166467}, + {-0.614041,-1.173885}, + {-0.142238,-0.336419}, + {-1.471493,-0.936717}, + {1.646690,0.184204}, + {0.225939,0.300060}, + {-0.128450,0.389350}, + {0.727421,-0.454894}, + {-0.435942,0.105538}, + {1.205978,0.100260}, + {-1.315567,0.308342}, + {0.754698,1.164033}, + {-0.107954,-0.172451}, + {-1.047203,1.015069}, + {-1.389840,-0.266683}, + {0.547945,0.616535}, + {-0.434114,0.849453}, + {0.071122,-0.277037}, + {-0.050800,0.284288}, + {-0.165278,0.009121}, + {-0.219966,-0.098418}, + {0.198508,0.353809}, + {-0.581533,0.448088}, + {-1.784726,-1.161621}, + {-0.604861,-0.274908}, + {0.183057,0.051142}, + {-0.317797,0.278299}, + {-0.850828,-0.630589}, + {0.104573,0.285301}, + {0.105866,0.698211}, + {-0.180861,-0.862928}, + {0.475285,-0.838884}, + {0.532029,-1.353946}, + {-0.605465,1.385299}, + {0.218651,-1.214866}, + {2.160576,-0.144045}, + {0.168189,1.107664}, + {0.299490,-0.176740}, + {-0.396194,0.210866}, + {-0.125884,-0.224011}, + {0.853672,0.228498}, + {-1.748178,-1.154824}, + {0.367379,0.232790}, + {-0.181073,-0.618603}, + {-0.789253,-0.907517}, + {0.589666,0.083053}, + {0.205531,-0.292960}, + {-1.755342,-0.647660}, + {1.320671,0.483386}, + {0.751741,-0.776958}, + {0.895885,0.848563}, + {0.581838,-0.625789}, + {-0.172855,-0.093791}, + {1.730868,-0.185926}, + {-0.859963,-0.199970}, + {0.619064,-1.075834}, + {-0.751592,-0.307590}, + {0.383126,0.058031}, + {0.532780,-0.855648}, + {-0.809753,0.598019}, + {0.523282,-0.210299}, + {0.092903,0.620162}, + {-0.841020,-0.066447}, + {-0.888254,0.244874}, + {-0.225321,-0.358074}, + {-0.523697,0.142496}, + {-0.211782,0.560938}, + {0.850574,-0.508918}, + {-0.016610,0.930612}, + {-0.170152,-0.661760}, + {0.379929,0.104789}, + {-0.781353,0.502040}, + {1.259342,-0.010921}, + {-0.135465,0.122281}, + {0.166991,-0.732114}, + {0.955615,-0.124115}, + {1.109480,-1.575200}, + {0.054263,-0.253799}, + {0.862238,-1.307799}, + {0.016864,0.606661}, + {0.483294,-0.230111}, + {1.663652,0.729566}, + {-0.611224,-0.653048}, + {-1.924986,-0.524554}, + {-0.603593,-0.245722}, + {0.878295,0.316568}, + {0.052504,-1.019809}, + {0.512341,0.171092}, + {0.774275,-0.490241}, + {-1.055341,0.751595}, + {-1.688396,1.987387}, + {-0.902226,-0.336708}, + {-0.433191,-0.099476}, + {-0.920050,1.128085}, + {-1.100896,0.374304}, + {0.388182,1.245751}, + {0.280377,0.511610}, + {-0.344954,-0.349710}, + {0.567448,-0.222402}, + {-0.230275,0.053800}, + {-1.450383,-0.655175}, + {-0.140144,0.256758}, + {-1.291789,0.096818}, + {-0.626539,-1.194533}, + {0.550245,-0.702534}, + {0.445211,0.411623}, + {0.860433,-0.689320}, + {0.660554,-0.055735}, + {0.924256,-0.222386}, + {1.467143,-0.039871}, + {0.423189,-0.130886}, + {-0.157257,-0.253543}, + {0.054858,0.012374}, + {0.004722,-0.181412}, + {1.204185,-0.360653}, + {0.683748,-1.078223}, + {0.114180,0.204924}, + {-0.209641,0.052979}, + {0.590545,-0.623896}, + {0.855198,0.077004}, + {-0.183976,0.390004}, + {0.562404,-0.634269}, + {0.638455,0.770984}, + {0.539077,0.058849}, + {1.143837,-0.619012}, + {0.379303,0.131913}, + {0.694961,-0.856962}, + {1.031972,-0.095841}, + {-0.414443,-0.130743}, + {-0.530670,-1.027409}, + {0.532992,0.593755}, + {-0.302745,0.408516}, + {-0.163969,-0.009049}, + {-0.937897,0.569411}, + {0.236075,-0.118090}, + {0.367388,0.920104}, + {-0.228411,-0.020714}, + {0.450075,-1.376905}, + {0.672742,0.878365}, + {0.272849,0.717775}, + {0.332603,-0.084299}, + {-0.123209,0.546980}, + {1.599618,-0.734019}, + {-1.207434,-1.476439}, + {0.126576,0.023655}, + {1.085747,0.148754}, + {-1.156599,-0.185243}, + {1.100054,-0.369996}, + {-0.075626,-0.451481}, + {-0.905205,-0.526888}, + {-0.401543,-0.591241}, + {-0.114917,-0.419392}, + {0.538569,-0.347340}, + {0.301107,-0.265479}, + {-1.341466,-0.843870}, + {-1.296856,-0.888799}, + {0.498068,-0.039892}, + {-0.390159,0.729649}, + {1.171404,1.213731}, + {-0.539536,-0.533475}, + {-0.471922,-0.364102}, + {0.204217,-0.768619}, + {0.692290,-0.199941}, + {0.682400,2.105154}, + {-0.663000,0.094841}, + {1.190975,1.491593}, + {-0.756086,0.111941}, + {0.061172,0.566461}, + {-0.048715,0.143162}, + {0.311618,-0.313990}, + {0.310462,0.386462}, + {0.466845,0.225448}, + {0.572650,-1.340082}, + {-0.824610,0.849502}, + {0.746589,-0.306592}, + {1.392851,0.308872}, + {0.506791,0.509163}, + {-1.012017,0.338057}, + {-0.425655,0.744355}, + {-0.177273,-1.268582}, + {1.931480,-0.463406}, + {-1.005768,-0.526282}, + {-0.554007,0.732979}, + {0.203002,1.016918}, + {-0.343580,0.392522}, + {0.671733,0.125681}, + {-1.033077,-0.210715}, + {-0.047144,-1.546564}, + {0.263303,-0.350745}, + {-0.790377,-0.556737}, + {0.347599,-0.244305}, + {-0.267536,-0.557566}, + {-0.914996,-0.772484}, + {-1.415204,0.476464}, + {0.636720,0.271362}, + {-0.160421,-0.202122}, + {0.256900,-0.971435}, + {-1.341629,-1.340080}, + {-0.996941,-0.175151}, + {-0.275634,-0.620064}, + {0.277806,1.181420}, + {0.257685,-0.644443}, + {0.972835,0.904661}, + {-0.069391,0.979036}, + {0.033424,1.180349}, + {1.601465,-0.899762}, + {-1.159530,-0.513358}, + {0.659085,-0.351394}, + {-0.778353,0.391627}, + {-0.732485,-0.817011}, + {0.160577,-0.745746}, + {-1.425300,0.587289}, + {0.466481,0.028874}, + {0.257711,-0.211149}, + {0.360215,0.446898}, + {0.160066,-0.290423}, + {-0.826929,0.104860}, + {-1.006527,1.418773}, + {0.086332,-0.509908}, + {-0.775915,-0.277061}, + {-0.568888,-1.679972}, + {-0.636057,0.987827}, + {-0.308029,0.307089}, + {0.717339,-0.888667}, + {-0.398455,0.051524}, + {1.624831,-0.428584}, + {-0.995265,-0.949414}, + {-0.574018,-0.660601}, + {0.821218,0.649943}, + {-0.066875,-0.742312}, + {-1.042409,-0.345767}, + {-0.694825,-0.086997}, + {0.892671,0.304710}, + {1.463746,1.347942}, + {-0.794659,-1.465119}, + {0.093978,-1.391761}, + {-0.289519,0.622867}, + {-0.038301,-0.287028}, + {0.225742,-0.501018}, + {-0.619576,1.728619}, + {-0.078345,0.521977}, + {0.410487,0.768793}, + {0.898314,-1.505122}, + {0.982556,-0.321653}, + {-0.156688,0.426663}, + {0.914887,0.476645}, + {-0.661801,-1.162848}, + {-0.834380,-0.187532}, + {-1.033042,-0.657361}, + {-0.258103,-0.279691}, + {-0.077377,-0.617789}, + {-0.067528,-0.795636}, + {0.697166,1.250363}, + {0.612638,0.426930}, + {0.414738,0.159230}, + {0.012610,1.110968}, + {0.088986,0.174993}, + {-0.701699,-0.585427}, + {0.005547,-1.001461}, + {-0.499370,-0.219090}, + {-0.409379,-1.410114}, + {0.678592,1.914758}, + {-0.333608,0.094601}, + {1.473032,-0.764558}, + {0.234098,0.682258}, + {-0.764432,0.203001}, + {-0.286558,-0.776227}, + {0.015636,-0.427128}, + {-0.829637,-0.587309}, + {0.126426,-0.046741}, + {-0.999990,-0.782663}, + {-1.231364,-0.812437}, + {-0.064503,-0.714886}, + {-0.917891,0.770603}, + {-0.586602,0.007693}, + {0.403223,0.712644}, + {-0.008010,-0.902316}, + {0.357368,0.403032}, + {0.138081,-0.123957}, + {-0.283588,0.063573}, + {-0.309539,0.658890}, + {-0.406599,0.958829}, + {-0.708649,-0.300691}, + {-0.292065,0.281290}, + {0.654537,0.474224}, + {-0.708419,-2.474893}, + {-0.285932,0.822338}, + {-1.107321,-0.186473}, + {-0.369601,-0.659469}, + {0.617200,-0.315311}, + {0.185574,-1.073683}, + {-1.332198,0.646972}, + {1.358647,-0.343407}, + {0.423292,0.187194}, + {-1.766024,0.026657}, + {-0.511465,-0.056579}, + {-0.202844,-0.666845}, + {-0.061273,0.149654}, + {-0.160488,0.253664}, + {-0.336715,0.856404}, + {-0.211530,0.286960}, + {-0.096027,-0.438433}, + {-0.123255,0.410071}, + {-0.588208,0.110857}, + {-0.160651,-0.237762}, + {0.178849,-0.486365}, + {0.523072,-0.604543}, + {-0.481635,0.822471}, + {-1.427760,1.475099}, + {-0.015193,0.056991}, + {-0.020920,-0.628689}, + {-0.662725,-0.334047}, + {-0.029955,0.271499}, + {-0.549856,0.193420}, + {-0.591084,-0.460397}, + {-0.847475,0.176087}, + {0.134666,1.535474}, + {-0.404517,1.774605}, + {-0.012591,-0.025081}, + {0.304635,0.349055}, + {1.032524,-1.067513}, + {-0.654717,-0.443237}, + {0.354067,-0.906890}, + {0.645732,-0.808004}, + {0.708526,0.422639}, + {0.251741,-0.199950}, + {-0.343301,-0.372559}, + {0.521966,0.293809}, + {0.596219,1.459711}, + {-0.911900,1.090172}, + {-0.180459,-0.242334}, + {0.043777,-0.308086}, + {0.892502,-0.297267}, + {0.069414,0.548758}, + {0.106618,0.638483}, + {0.075271,0.328460}, + {-0.453758,0.763184}, + {0.873083,-0.518432}, + {-0.165817,-0.466517}, + {-0.777957,0.195349}, + {-1.045421,-0.135624}, + {1.085889,0.201413}, + {0.045273,0.861950}, + {-0.380225,-0.540513}, + {1.234628,-0.061586}, + {0.388294,0.042646}, + {-1.184967,-0.334204}, + {-0.431482,0.137044}, + {-0.260536,-0.255510}, + {0.676812,-1.129665}, + {0.060250,-0.101155}, + {0.177268,0.504934}, + {0.447116,0.913391}, + {-0.188139,0.308266}, + {-0.461521,-0.562924}, + {0.803880,-0.403873}, + {-0.719793,0.283642}, + {-0.274215,-1.343825}, + {-0.176226,-0.931566}, + {-0.456589,0.988810}, + {0.069589,-0.085009}, + {0.498388,0.661623}, + {1.764237,-1.921451}, + {-0.520769,-0.283433}, + {-0.863480,-0.545718}, + {0.164524,-1.140960}, + {0.391842,1.388107}, + {-0.211966,-0.760097}, + {0.882238,0.726142}, + {-0.494735,-0.147398}, + {-2.130035,-0.271010}, + {-0.091024,-0.085686}, + {-1.139421,0.482023}, + {-1.313630,0.069675}, + {-1.013372,-0.030979}, + {-0.010000,-0.309232}, + {0.015798,-0.454868}, + {-0.021211,1.170452}, + {0.733800,0.657433}, + {-0.564449,-1.202041}, + {-1.438305,-0.225477}, + {0.737473,0.034093}, + {-0.124011,0.017096}, + {-1.054430,-0.490369}, + {0.735048,-0.170665}, + {-0.603735,-0.398150}, + {-0.291035,-1.773649}, + {-0.230866,0.024045}, + {0.565597,-0.230533}, + {0.341789,1.338716}, + {-0.174622,-0.278944}, + {-0.235408,-1.074645}, + {0.457028,0.409652}, + {0.792267,0.082481}, + {0.739603,-0.207675}, + {-0.446134,0.728303}, + {0.271171,0.646737}, + {-0.080809,-0.597354}, + {-0.333713,0.650210}, + {-0.058765,-0.037884}, + {0.313115,0.179699}, + {1.061631,0.029643}, + {-0.718130,-0.867332}, + {0.161520,-0.373053}, + {0.115240,1.018624}, + {-1.401570,-1.811324}, + {-0.389145,1.565653}, + {0.275466,0.553665}, + {1.366925,-0.550564}, + {-0.653708,-0.492507}, + {0.639135,0.108763}, + {0.502588,1.583952}, + {-0.959099,1.271320}, + {-1.233735,0.101634}, + {-0.740340,-0.248321}, + {-0.892102,0.109857}, + {-0.345742,0.073819}, + {0.031049,-0.115825}, + {0.366890,1.202980}, + {-0.555795,0.858266}, + {-0.789748,-0.582250}, + {-0.684044,-0.073831}, + {0.431366,-0.264677}, + {-0.251106,-1.079765}, + {-0.048445,-0.527598}, + {-0.257022,0.807331}, + {0.604370,0.108487}, + {1.193560,-0.504331}, + {0.887205,0.223083}, + {0.165226,0.181709}, + {-0.694678,0.305534}, + {-0.539173,-0.699254}, + {-0.962349,-2.031904}, + {0.437054,0.981274}, + {0.472644,0.330887}, + {0.577628,0.332816}, + {-0.547620,-0.333722}, + {-0.651263,2.080435}, + {-0.084852,0.079156}, + {-0.760344,0.805795}, + {0.499899,-1.470379}, + {0.351524,0.328809}, + {0.080884,-0.587359}, + {-0.553406,-0.169034}, + {0.039425,-0.538786}, + {0.858310,-0.140728}, + {0.472670,-2.246532}, + {-0.368775,-0.323302}, + {0.090378,-1.378154}, + {-0.550284,0.507064}, + {0.539224,0.603538}, + {-0.000691,-1.727633}, + {-2.003468,-0.661973}, + {0.337784,0.651070}, + {0.162028,0.567114}, + {-0.067531,0.050097}, + {0.182332,-0.719324}, + {-1.474951,0.685114}, + {0.860035,0.235277}, + {0.673692,-0.745029}, + {0.163864,0.823959}, + {0.712323,-0.579740}, + {0.133995,-0.852349}, + {-0.093329,-0.759119}, + {0.285367,1.120202}, + {0.187071,-0.415625}, + {0.522904,0.451246}, + {0.757153,0.243609}, + {0.184169,1.090276}, + {1.479287,-1.344383}, + {1.487636,0.349166}, + {-0.095602,0.755634}, + {-0.112605,0.207789}, + {-0.441569,-0.286210}, + {-0.409203,1.547667}, + {-0.546806,-1.646303}, + {1.074615,1.044879}, + {-0.434627,-0.525903}, + {-0.242109,1.227347}, + {-1.319122,0.275312}, + {-0.545729,0.662611}, + {0.343853,0.157724}, + {0.475258,0.149229}, + {0.253291,1.076345}, + {-0.570123,-1.272515}, + {-0.186610,0.269897}, + {-0.189057,1.120619}, + {-0.383515,0.226731}, + {0.924259,-0.098409}, + {-0.080234,-0.649794}, + {-0.726238,-1.386272}, + {0.806442,-0.219207}, + {0.024879,0.089845}, + {0.913936,-0.796274}, + {2.617004,-0.280960}, + {-0.718628,-0.178037}, + {-0.428151,0.215331}, + {-0.073535,-0.606667}, + {0.254862,0.639116}, + {1.488909,0.267331}, + {-0.583632,-0.698212}, + {1.157905,0.856185}, + {0.267413,0.309240}, + {-0.460028,0.787779}, + {0.527296,0.364704}, + {0.341824,-1.132002}, + {0.758196,0.233237}, + {0.556152,0.517602}, + {0.066575,-0.831919}, + {0.517617,-1.003521}, + {-0.448421,0.717349}, + {0.254943,0.001274}, + {-0.525383,-0.477606}, + {1.091618,0.208053}, + {-0.123831,-0.791330}, + {0.334160,0.226185}, + {-0.698222,0.706486}, + {-0.032881,0.242425}, + {-0.281343,0.751205}, + {0.632088,-1.214175}, + {0.073367,-1.174985}, + {-0.324776,-0.120150}, + {0.164874,0.111320}, + {0.609620,-0.439175}, + {0.031007,0.000219}, + {1.028218,-0.287004}, + {1.158747,0.853374}, + {-1.199486,-0.275183}, + {-1.283849,1.091030}, + {0.561488,-0.120327}, + {-0.287822,-0.044037}, + {-0.968829,-0.687665}, + {1.352591,-0.243109}, + {-1.373144,0.694374}, + {-0.378153,0.037286}, + {-0.802495,0.406625}, + {-0.041211,-0.643437}, + {0.185728,-0.003745}, + {-0.305742,-0.281991}, + {0.387514,-1.518495}, + {-0.242799,0.206669}, + {-0.669666,-0.599745}, + {-0.141009,-2.414735}, + {-0.003491,-0.033090}, + {-0.289344,-0.418806}, + {0.520367,0.013915}, + {0.555563,-1.274973}, + {-0.324143,0.296732}, + {-1.457603,0.238373}, + {0.410639,0.101798}, + {-1.012753,-0.935328}, + {0.899841,0.309905}, + {0.127096,-0.954350}, + {0.106654,1.147259}, + {-0.355125,-0.287927}, + {-1.547840,-0.332855}, + {-0.733110,0.032549}, + {-0.271676,0.273160}, + {-0.415254,-1.088883}, + {0.067924,-1.032075}, + {0.476029,-0.014800}, + {-0.003191,-0.439740}, + {-0.798743,0.822659}, + {0.883440,0.479619}, + {-1.455205,-0.328712}, + {0.775377,0.211114}, + {1.220351,0.695741}, + {0.452471,1.035777}, + {0.341504,-1.320770}, + {-0.611155,0.468035}, + {0.908185,0.273328}, + {0.292692,-1.200411}, + {-0.033289,-1.174946}, + {0.994273,-0.733959}, + {0.214130,0.413516}, + {0.274615,-0.372335}, + {1.346686,-1.437341}, + {-0.197733,-0.578892}, + {0.149638,-0.107375}, + {-0.339736,0.034751}, + {-0.338912,0.066107}, + {0.750437,0.078081}, + {-1.049538,0.591718}, + {-0.041805,0.895005}, + {-1.095430,0.700039}, + {-0.235200,0.094713}, + {0.065897,0.602921}, + {0.755398,-0.108273}, + {1.091147,0.071925}, + {0.228578,-0.294732}, + {-0.584694,-0.554632}, + {-0.078499,0.146121}, + {-0.915751,-0.799416}, + {-0.365473,0.373294}, + {-0.531644,-0.071814}, + {0.721813,0.581123}, + {-0.110709,0.244037}, + {0.199982,1.816332}, + {0.564345,1.371369}, + {0.467000,1.041223}, + {-0.686056,0.372524}, + {0.104741,-0.231289}, + {0.409822,-0.375921}, + {0.031726,-0.309260}, + {1.183292,0.898475}, + {-0.493938,-0.680656}, + {0.890296,0.420048}, + {0.070555,-0.613145}, + {-0.022719,0.779646}, + {1.421551,-0.488215}, + {-1.226503,1.639620}, + {-0.306046,0.416864}, + {-0.696823,0.344132}, + {-0.143656,1.441148}, + {-0.689809,-0.700984}, + {0.463316,0.449139}, + {-1.364012,0.198649}, + {0.449165,0.742472}, + {-0.486011,-1.473443}, + {0.500896,0.833914}, + {-0.622554,-0.239606}, + {1.189831,-1.242437}, + {1.151693,-0.330836}, + {0.920582,-0.666624}, + {-1.224090,-1.875929}, + {-1.092502,-0.769761}, + {-0.262561,-0.202329}, + {0.431854,1.719011}, + {-0.428703,-0.207687}, + {0.564636,0.288137}, + {-0.667355,0.277334}, + {0.180266,0.623707}, + {-0.315467,-0.069400}, + {-0.601639,-0.462335}, + {-0.948292,-0.538306}, + {-1.253119,-0.336230}, + {-0.049082,0.253962}, + {-0.451911,0.428742}, + {0.736800,0.882449}, + {-0.412044,0.366809}, + {-0.467545,-1.006095}, + {1.008279,1.350596}, + {-0.359243,1.473972}, + {0.331398,-0.803076}, + {-0.297361,-0.463851}, + {0.201236,-0.107912}, + {0.239863,0.923164}, + {-0.353475,0.650233}, + {0.384891,0.803903}, + {0.302545,1.670567}, + {0.799741,0.176856}, + {-0.024317,0.120099}, + {0.008041,-0.350004}, + {0.230942,0.570515}, + {-0.132010,0.455897}, + {-0.263291,-0.539349}, + {-0.645935,0.218008}, + {-0.463458,0.613702}, + {0.243487,1.705323}, + {-0.868175,1.548390}, + {-0.227668,1.410199}, + {0.658615,0.988933}, + {-1.447789,0.664133}, + {0.798315,0.707355}, + {0.425196,-1.360819}, + {-0.135508,-1.272751}, + {0.647140,0.224335}, + {1.161476,0.319277}, + {-0.480896,0.374320}, + {1.878285,0.118100}, + {-0.211065,2.614610}, + {0.436903,-0.128683}, + {1.200507,-0.109365}, + {-0.119335,-0.098252}, + {0.589978,0.683516}, + {-0.940828,1.101724}, + {-1.549157,0.580937}, + {-0.045247,1.021449}, + {0.032804,-0.767668}, + {0.999415,-0.176564}, + {-0.273115,-1.412497}, + {0.167989,-0.295090}, + {-0.036130,-0.505037}, + {0.340076,-0.586571}, + {-0.911702,0.260780}, + {-0.738639,-1.333492}, + {0.734417,-1.151579}, + {-1.217327,-0.926407}, + {0.231592,0.190441}, + {0.737205,-0.440307}, + {0.438334,-0.481113}, + {0.415552,0.334575}, + {0.720010,0.454014}, + {-0.802826,-0.345235}, + {-1.888756,0.673207}, + {-0.545520,-0.182574}, + {1.213482,0.417727}, + {-1.244954,0.421645}, + {-0.259205,-0.972422}, + {-0.804418,0.298643}, + {-0.497450,-1.013039}, + {-0.363112,-0.066604}, + {-0.295601,0.914620}, + {1.021939,-0.017453}, + {0.680981,0.298866}, + {1.107544,0.912255}, + {0.209341,0.491702}, + {1.108210,0.582607}, + {-1.014248,-0.037100}, + {0.258361,0.684969}, + {1.045870,-0.304365}, + {-0.871056,0.100909}, + {0.823420,-0.126928}, + {-1.214117,0.314406}, + {0.871430,0.118769}, + {-0.231277,0.241207}, + {0.035972,0.285960}, + {-0.742023,0.505129}, + {0.254087,0.341223}, + {0.454655,-0.525507}, + {0.755748,-0.462112}, + {0.587311,0.633949}, + {-1.442459,0.796037}, + {-0.318407,-0.290317}, + {-0.527692,-0.825944}, + {0.971368,-0.736664}, + {0.229420,1.203638}, + {-0.736167,-1.347227}, + {1.412800,0.828552}, + {0.740372,-0.240037}, + {0.876093,-1.017553}, + {-1.210328,0.107513}, + {1.137077,0.416858}, + {-0.750964,-0.268489}, + {-0.489146,-0.819406}, + {0.703970,-0.019085}, + {-0.301573,0.768771}, + {-0.280863,-0.923373}, + {-0.372715,0.726574}, + {0.399350,1.779629}, + {-0.254864,-0.001700}, + {0.357948,1.923558}, + {0.853556,-0.006690}, + {0.509726,0.496630}, + {-0.858094,-1.471612}, + {-1.728564,1.392049}, + {0.623779,-0.300334}, + {-0.675676,-0.167689}, + {-0.849742,-0.641322}, + {0.697436,-0.283774}, + {-0.275413,-0.855216}, + {0.109529,-1.411846}, + {-0.609845,1.742109}, + {0.172157,0.641408}, + {0.021837,0.465026}, + {-0.022089,-1.116902}, + {0.964458,0.032398}, + {0.532234,0.444177}, + {1.296815,-0.784017}, + {0.749398,0.180579}, + {0.574044,-0.467364}, + {-0.838701,-1.398614}, + {0.129156,0.516463}, + {-1.055356,-1.190214}, + {0.528734,-0.367550}, + {0.797226,0.908928}, + {-0.050036,0.414600}, + {-1.125256,-0.572235}, + {0.346222,0.074931}, + {-0.538717,-0.265686}, + {-0.056401,0.092578}, + {-0.207907,-0.019935}, + {1.012684,0.194750}, + {-0.367511,-0.884469}, + {0.107956,0.421098}, + {-0.130369,-0.206243}, + {-0.422989,0.053730}, + {0.242778,0.306604}, + {1.008636,-1.384316}, + {0.333947,0.589110}, + {-0.676884,0.681691}, + {0.948866,0.105958}, + {0.426000,0.672980}, + {-1.064013,0.336557}, + {-0.240377,0.553604}, + {-1.066478,-0.727211}, + {-0.640961,-0.431194}, + {-0.047056,0.430286}, + {1.455127,0.086339}, + {1.044019,0.478455}, + {-0.476166,0.241834}, + {0.380861,-1.272487}, + {-0.346503,-0.477271}, + {0.130709,0.817365}, + {-0.985777,-1.207054}, + {-0.046189,-1.202671}, + {-0.330047,0.026048}, + {-0.239273,1.694012}, + {-0.003318,-0.758511}, + {0.329162,-0.169705}, + {-0.474235,-0.351765}, + {0.503979,1.428228}, + {0.554457,0.574828}, + {-1.434442,-0.919440}, + {-0.451345,0.194554}, + {0.521378,-0.954107}, + {0.200849,0.335852}, + {-0.124435,0.284194}, + {-0.895518,-0.304695}, + {0.301791,0.348402}, + {0.093200,-1.526336}, + {0.633977,0.922629}, + {0.135976,-0.420617}, + {0.232458,-0.359167}, + {0.716139,0.072091}, + {0.254796,-0.013268}, + {-0.379655,-0.585246}, + {-0.022477,0.395561}, + {-1.191544,-0.383859}, + {1.447703,-0.326901}, + {1.032686,1.916231}, + {-0.883760,0.132351}, + {0.797983,0.389918}, + {0.690284,0.427680}, + {-0.500221,-0.126779}, + {-0.347322,1.756772}, + {0.199207,0.321965}, + {1.155876,-0.872054}, + {0.930258,-0.737929}, + {0.355776,0.125540}, + {0.111132,-0.084686}, + {-1.765447,-0.399887}, + {-0.484057,-0.693399}, + {0.164002,1.979783}, + {0.861997,0.458612}, + {1.264516,0.761647}, + {-0.265837,0.631914}, + {1.055233,0.348404}, + {-1.092578,-1.237799}, + {0.095743,-1.847219}, + {-0.335968,-0.005423}, + {-0.404703,0.532334}, + {-0.681848,-0.884532}, + {-1.117062,-1.755286}, + {-0.757974,-0.504821}, + {-0.349785,0.132151}, + {0.770082,0.883966}, + {-0.583158,-0.064996}, + {-1.505933,0.375539}, + {0.417048,0.888212}, + {0.276252,-0.045163}, + {-0.424762,-0.615027}, + {-0.365226,-0.268774}, + {0.618845,-0.605848}, + {0.164242,-0.422652}, + {0.645703,0.576558}, + {0.709919,0.591569}, + {0.666594,-0.737500}, + {0.026753,0.073156}, + {-0.021352,-0.729128}, + {0.909815,-0.255206}, + {-0.589314,-0.428360}, + {0.632534,-0.568628}, + {0.261934,-1.385056}, + {0.119414,0.325016}, + {0.805002,-1.770542}, + {0.277957,-0.422711}, + {0.741012,-1.257607}, + {1.212983,1.441817}, + {-0.765914,0.535380}, + {0.317519,-0.080034}, + {-0.338720,0.031978}, + {0.437849,0.750522}, + {0.047748,-0.215083}, + {-0.962192,-0.546992}, + {-0.645064,0.921583}, + {-0.551719,0.389382}, + {0.105114,-0.340749}, + {-0.310464,-1.039947}, + {0.161271,0.002407}, + {-0.846793,-0.332475}, + {0.085515,-0.070405}, + {0.516329,0.565764}, + {-0.035842,-1.577365}, + {-0.663475,-0.556161}, + {0.282857,0.891555}, + {-1.157957,0.323517}, + {0.468238,0.244984}, + {-0.001649,-1.302923}, + {-0.138291,0.749416}, + {0.078580,1.089354}, + {0.049946,-0.266946}, + {0.138307,-0.213026}, + {-0.398241,0.031845}, + {-1.097927,0.485306}, + {-0.228563,0.686991}, + {1.497539,0.916258}, + {0.779815,-0.813548}, + {-0.470301,-0.251974}, + {0.471512,1.453454}, + {-0.334489,-0.584985}, + {-0.471259,-1.117006}, + {0.399544,-0.900880}, + {0.372172,0.255576}, + {-0.107049,-0.126052}, + {0.408528,-0.020332}, + {0.284764,0.268221}, + {-0.298182,-0.221228}, + {-1.686760,0.052717}, + {-0.036532,0.036560}, + {-0.523159,-0.734161}, + {-1.978600,-0.302538}, + {-0.584814,-0.405386}, + {-0.741486,0.753370}, + {-0.040990,-0.509271}, + {-0.541529,-0.386237}, + {0.566418,0.037714}, + {0.151225,0.807270}, + {0.189559,-0.703980}, + {-0.079181,-0.363765}, + {-0.031324,-1.081530}, + {0.083723,-0.843167}, + {0.221127,0.064046}, + {-0.427889,0.022969}, + {0.139107,0.082158}, + {-0.086705,1.011836}, + {0.342143,0.246917}, + {0.207554,0.133077}, + {-0.080966,1.046769}, + {-1.059233,-1.085633}, + {-0.356010,0.718178}, + {-0.577859,-0.109375}, + {0.542744,1.108480}, + {-0.876346,-0.752113}, + {1.300557,-0.250276}, + {-1.010939,1.119039}, + {0.250270,-0.805066}, + {-0.711292,-0.052695}, + {-0.272900,0.801570}, + {-0.129894,-1.472325}, + {-0.059291,0.042281}, + {0.343083,0.256834}, + {0.652360,1.649133}, + {-0.441827,0.270447}, + {-0.338878,0.306703}, + {-0.533263,-0.367020}, + {-0.251497,-0.091588}, + {-0.288078,-0.953882}, + {-0.687001,1.500250}, + {-0.145605,-0.885543}, + {-0.295624,0.364480}, + {-0.773724,0.838420}, + {-0.755309,-0.637771}, + {0.140479,0.139850}, + {0.164407,-0.946375}, + {0.334796,0.474215}, + {-0.108846,0.443189}, + {-0.315848,-0.562709}, + {1.146425,-0.086577}, + {1.422925,1.452282}, + {0.528118,1.090295}, + {0.142858,-1.517183}, + {0.089292,-1.030106}, + {1.868715,-0.729473}, + {-0.847120,1.530669}, + {-0.619504,-0.077095}, + {0.013841,0.239227}, + {0.358968,-0.495570}, + {0.529144,-0.319802}, + {-0.237481,0.008175}, + {-0.949545,-1.524610}, + {-0.764478,1.202526}, + {-0.754071,0.211168}, + {0.726948,-0.350558}, + {-0.383736,-0.722571}, + {-0.531464,0.251220}, + {-0.215829,0.489119}, + {-0.673253,0.780101}, + {-0.425690,0.571457}, + {-0.591886,-0.066992}, + {-1.591411,-0.156612}, + {0.832392,-2.183463}, + {0.089291,0.262270}, + {0.334040,0.864206}, + {1.070955,-0.017792}, + {-0.209751,-0.368139}, + {0.320312,0.611719}, + {0.299755,-0.675094}, + {0.945826,0.192595}, + {0.160973,-0.236396}, + {-0.930557,-0.137053}, + {0.824962,-0.452584}, + {-0.781090,0.259436}, + {0.499810,-0.342312}, + {-0.976936,-0.295870}, + {-1.864960,-1.380520}, + {-0.343277,1.189033}, + {0.354532,0.766793}, + {-0.539951,0.213865}, + {-0.755910,0.577450}, + {-1.051209,-1.337479}, + {-0.047104,0.329372}, + {0.415117,-0.259529}, + {0.118073,0.808609}, + {1.623840,-0.219009}, + {-0.092132,1.145445}, + {-0.289294,0.153253}, + {-0.118908,0.241607}, + {-1.524828,-0.280118}, + {0.532567,-0.648456}, + {-0.104690,-0.952993}, + {0.096358,0.341141}, + {0.577925,-1.416989}, + {-0.472131,0.005166}, + {0.441558,0.684743}, + {-1.075276,0.458788}, + {-0.542887,-2.145492}, + {0.982289,-0.712595}, + {0.376656,-0.133513}, + {-0.495061,-0.153725}, + {-0.843701,-0.590876}, + {0.189824,-1.026949}, + {0.271507,0.450949}, + {-1.214261,1.019265}, + {-0.192929,0.809120}, + {0.580104,-0.580059}, + {-1.008693,0.258822}, + {-0.686540,-0.150929}, + {-0.806180,0.585680}, + {0.382421,0.681665}, + {0.993495,0.326671}, + {-0.011094,0.137639}, + {0.230903,1.353307}, + {0.321925,-0.530779}, + {0.445268,-0.218635}, + {-0.248939,-0.811110}, + {-0.438773,0.174895}, + {0.092849,-0.786051}, + {0.672213,0.282743}, + {0.310022,0.016750}, + {-0.554465,-1.296100}, + {1.167694,0.289020}, + {-1.008050,-1.267211}, + {1.337627,-0.727579}, + {1.107920,-0.800503}, + {1.580887,-0.434263}, + {0.534123,-0.023207}, + {-0.672041,-1.190008}, + {-0.623945,-1.000304}, + {-0.339638,-0.090139}, + {-0.247150,-0.090013}, + {-0.248865,-0.373625}, + {-1.008469,-0.345410}, + {0.219290,-0.748377}, + {-1.110240,0.109012}, + {-1.315957,-0.132981}, + {0.328799,0.407528}, + {0.992340,0.695968}, + {0.540487,0.100143}, + {-0.101748,1.200990}, + {1.372902,-0.484321}, + {0.182478,0.930679}, + {1.286810,-0.092169}, + {0.361417,-0.430697}, + {0.059600,0.508897}, + {0.957065,0.231615}, + {0.315519,0.910029}, + {-0.259820,-1.108543}, + {1.139876,1.306830}, + {0.111378,0.598970}, + {-1.158463,0.057921}, + {0.732254,0.269129}, + {-0.422410,0.384354}, + {0.434930,0.258197}, + {-0.135920,-0.584475}, + {-0.525475,0.266487}, + {0.479545,-1.317436}, + {-0.588906,-1.032770}, + {0.421416,-0.456796}, + {-1.112158,0.197872}, + {0.427474,-1.371221}, + {1.169989,0.066283}, + {-0.285752,0.682510}, + {-1.103367,-0.081644}, + {-0.492414,-0.508673}, + {-0.603259,0.274685}, + {0.453820,-0.705243}, + {0.451449,-0.286640}, + {-0.890995,1.493104}, + {-0.269448,-0.111697}, + {-0.284481,0.892255}, + {-0.156936,1.178820}, + {-0.026075,-0.288447}, + {0.192773,-0.689622}, + {0.408094,0.221306}, + {-0.077789,0.462070}, + {-0.763512,0.374190}, + {1.372160,-0.387671}, + {-0.961063,0.123053}, + {-0.563208,-1.176171}, + {-0.681526,0.053875}, + {0.246027,0.916420}, + {0.074971,0.397053}, + {-0.509338,-0.467579}, + {-0.028080,-0.246218}, + {-0.778298,-1.008908}, + {-0.688193,-0.856779}, + {2.135919,-0.463805}, + {-0.151521,-0.435434}, + {0.286563,-1.399753}, + {-0.238350,0.812805}, + {-0.637019,0.391566}, + {-0.930719,-0.753007}, + {-0.130401,-0.095141}, + {-2.022008,1.588912}, + {0.465128,-0.736271}, + {0.259710,0.008248}, + {-0.670376,0.573592}, + {-0.759845,-0.245010}, + {1.199012,1.484925}, + {0.117486,-1.283839}, + {0.823713,0.601557}, + {0.430107,1.305288}, + {-0.857913,-0.086698}, + {-0.240219,1.178419}, + {0.106586,-0.727451}, + {-0.013468,-0.553821}, + {0.331834,-0.839487}, + {-0.314308,-0.236823}, + {-1.020583,-0.465144}, + {-1.183478,-0.838031}, + {-0.688226,-0.504797}, + {-0.659946,0.110839}, + {-0.317790,-0.888356}, + {0.070495,-0.690989}, + {-0.215137,-0.280878}, + {-0.523957,-1.084659}, + {-1.625006,-0.827692}, + {-1.254357,-0.098812}, + {-0.037334,-0.320405}, + {-1.032500,-1.006692}, + {1.085823,-0.464633}, + {-0.424815,-0.295596}, + {-0.359488,-1.184184}, + {-0.081069,-0.021767}, + {0.194173,-1.145768}, + {-0.408176,-0.113861}, + {-0.210713,0.116032}, + {0.153323,-0.278102}, + {-0.824116,-0.348393}, + {1.711024,-0.546763}, + {0.732380,0.343069}, + {-0.031038,-0.890522}, + {0.333504,-0.385973}, + {0.838976,0.266577}, + {-0.957789,-0.709820}, + {0.084819,-0.404493}, + {0.086928,0.312046}, + {0.263436,0.677942}, + {-0.878981,-0.061526}, + {1.171282,-0.158491}, + {1.014568,-0.534002}, + {-0.414913,-0.218960}, + {1.441376,-0.016469}, + {-1.076862,0.575999}, + {-0.508823,-0.139239}, + {0.558421,0.010286}, + {0.950772,-0.758483}, + {-0.041742,0.060954}, + {-0.951736,-0.703192}, + {1.175201,0.090376}, + {-0.088403,0.175440}, + {1.137298,0.338050}, + {0.202901,-0.780958}, + {0.061536,1.037387}, + {0.163756,0.146354}, + {-1.082413,-0.656845}, + {-0.663994,-0.554342}, + {0.921438,0.127520}, + {-1.683027,-0.494672}, + {-1.207142,0.324501}, + {-1.591428,-0.689670}, + {0.380479,-0.276296}, + {-1.370787,-0.457896}, + {0.311180,0.865492}, + {0.329667,-0.284122}, + {0.764384,-0.263737}, + {0.388595,0.581989}, + {0.530794,0.089158}, + {-0.194579,-0.160770}, + {-0.497197,0.237652}, + {-0.969043,0.476531}, + {0.638742,0.543269}, + {-0.246685,-0.490291}, + {-0.504714,0.519112}, + {-0.275926,0.004395}, + {-0.679165,0.801614}, + {-1.013769,0.245981}, + {-1.048180,0.133878}, + {-0.347843,-0.709411}, + {-0.382321,0.205123}, + {-0.289524,0.058317}, + {0.779829,-0.108258}, + {-0.607607,-0.504919}, + {-0.313592,-0.887478}, + {-1.599302,0.151143}, + {-0.235541,0.112637}, + {0.193417,0.135649}, + {0.160499,-0.467862}, + {-0.417821,0.508193}, + {-0.371340,-0.797004}, + {-1.218597,-0.463920}, + {-0.329584,-0.832050}, + {0.403735,-0.347268}, + {0.312113,-0.544869}, + {-0.885796,-0.033127}, + {0.757105,0.871085}, + {-0.135961,0.870860}, + {-0.428802,-1.184347}, + {0.290754,0.685975}, + {0.025818,-0.815321}, + {0.241907,0.375104}, + {1.038442,0.255637}, + {0.196660,-0.681084}, + {-1.074595,-0.105662}, + {-1.073237,0.535047}, + {-1.330165,-0.216306}, + {0.568918,-1.460499}, + {0.046209,-1.528571}, + {0.044727,0.488519}, + {-0.583277,-0.315108}, + {-1.471177,-0.727805}, + {-0.046036,-0.582608}, + {-0.295384,0.529362}, + {0.361797,-0.922655}, + {0.397070,-0.019993}, + {-0.492521,-0.117990}, + {0.782889,1.170999}, + {0.662184,0.636561}, + {-1.735288,0.395381}, + {0.079380,-0.052730}, + {0.709996,0.654113}, + {-0.376010,-0.821716}, + {0.920385,-1.393132}, + {-0.322399,0.137951}, + {0.319344,-0.513440}, + {1.985403,-1.230494}, + {-0.254706,0.778217}, + {-0.381202,0.578765}, + {-0.175651,0.459589}, + {0.364902,-0.349097}, + {-0.521217,0.377102}, + {-0.696214,0.237524}, + {-1.428330,0.264137}, + {1.113969,-0.075405}, + {-1.211818,0.228307}, + {-0.100941,0.790198}, + {0.189215,-0.790792}, + {0.363891,-1.198473}, + {-0.964005,0.251669}, + {0.801589,-0.261038}, + {-1.090147,0.402919}, + {-0.227480,-0.351480}, + {-0.406823,0.119514}, + {-0.814855,1.243446}, + {0.516934,-1.114966}, + {0.026047,0.248718}, + {-0.378437,0.509858}, + {0.312049,0.311611}, + {-0.891748,0.177292}, + {0.608950,0.028471}, + {-0.495443,-0.650332}, + {-0.032869,0.579244}, + {1.360294,-1.192193}, + {-0.391750,0.494781}, + {-0.337458,0.448717}, + {0.363825,-0.229340}, + {-1.236290,0.427883}, + {0.399168,0.082217}, + {0.280208,-0.644907}, + {-0.759483,-1.003514}, + {1.269082,-0.253776}, + {0.442041,1.322204}, + {1.329775,-0.544052}, + {0.399145,0.137237}, + {0.772111,0.321600}, + {-0.588199,-0.243919}, + {-0.658466,-0.868454}, + {0.146449,-0.936439}, + {0.021534,-0.658851}, + {0.764039,0.391941}, + {0.200860,-0.212653}, + {0.159180,-0.042023}, + {-0.537129,-0.147575}, + {0.702245,-1.015617}, + {1.790915,0.570027}, + {0.766059,-1.875739}, + {-0.182925,-0.787800}, + {0.315391,0.206610}, + {0.710280,-0.029793}, + {0.798824,0.611930}, + {0.082498,-0.122377}, + {-0.441196,-0.130910}, + {0.361502,0.019255}, + {-0.494324,1.258054}, + {-0.658917,0.549865}, + {1.452774,0.133686}, + {-0.454627,-0.589725}, + {-0.880561,0.736115}, + {-0.035445,0.327460}, + {0.642400,0.698314}, + {0.196188,0.488357}, + {-1.092548,-0.378542}, + {1.012368,0.219866}, + {0.136436,1.050915}, + {0.450533,-0.095960}, + {-1.079073,0.205764}, + {0.129783,-0.607319}, + {0.304598,-0.028435}, + {1.256490,-0.636622}, + {0.251786,-0.305137}, + {-0.501987,0.211074}, + {-0.906736,-0.486202}, + {-0.082131,0.034965}, + {-0.584390,0.499364}, + {0.129603,-0.644452}, + {-0.480831,0.196367}, + {0.349143,1.779059}, + {0.431185,1.141092}, + {-0.747513,0.731564}, + {-0.786213,0.604126}, + {1.290785,0.708430}, + {-1.621136,0.607945}, + {-1.515636,0.414725}, + {-1.243614,0.535769}, + {-0.468547,0.431251}, + {-0.710815,-1.121571}, + {-1.329742,-0.444443}, + {-0.399959,0.076529}, + {-0.261205,-0.551109}, + {-0.712130,-1.339364}, + {-1.672925,1.158768}, + {0.511278,0.494824}, + {1.221284,-0.403334}, + {-0.689758,0.135193}, + {-0.266714,-1.264919}, + {-0.186901,-1.052718}, + {0.711819,1.601651}, + {-0.004976,-1.134699}, + {0.264689,0.143991}, + {-0.485013,0.240249}, + {-0.430138,-0.180132}, + {-0.448256,0.065344}, + {-0.313909,0.042542}, + {-1.788176,-1.003737}, + {-0.430691,0.515782}, + {-0.552024,0.033933}, + {-0.511113,-0.396641}, + {-0.667628,1.324609}, + {1.536055,-0.176847}, + {-0.371362,-0.780574}, + {-0.604459,-0.180242}, + {0.127890,-0.724469}, + {-0.546043,1.055909}, + {-1.160424,0.296830}, + {0.851429,-0.834491}, + {-0.653446,-0.319744}, + {-0.281928,0.036064}, + {0.152684,0.887427}, + {-0.584216,-1.129730}, + {-0.301487,-0.448074}, + {-0.644999,-0.062434}, + {-1.064140,-0.877770}, + {-0.025358,0.318626}, + {-0.169102,-1.656778}, + {-0.410128,1.517397}, + {0.908370,0.349006}, + {-1.017744,-0.256003}, + {-0.115645,0.371458}, + {-1.286410,-1.036681}, + {0.668494,-0.174631}, + {0.543753,-0.269535}, + {0.520788,-0.045167}, + {-0.348305,0.919992}, + {0.371761,0.757065}, + {0.314541,-0.679578}, + {0.365607,0.778578}, + {-0.119374,0.153537}, + {-0.266104,-1.198807}, + {0.480855,0.786074}, + {-0.032335,-0.840292}, + {0.610415,0.164635}, + {-0.644738,-0.147418}, + {0.544935,0.824594}, + {0.702994,-1.244186}, + {0.383204,1.467042}, + {0.264960,-0.885661}, + {0.500914,-0.588794}, + {0.070323,0.125276}, + {-1.166675,-1.286120}, + {2.429481,-0.059230}, + {0.764725,-0.984194}, + {1.319205,0.802877}, + {0.667521,-1.156544}, + {-0.490046,-1.778711}, + {0.006985,0.759426}, + {-0.060767,0.767774}, + {-0.536098,-0.574244}, + {-0.438429,-1.187924}, + {-0.482447,-1.117342}, + {-0.450270,-0.012118}, + {-0.862294,0.414935}, + {0.111836,-0.764191}, + {0.176201,-0.840321}, + {0.003283,0.329039}, + {-1.081580,-0.831850}, + {-0.757816,-0.792817}, + {1.390379,0.527990}, + {-0.423941,-0.375055}, + {1.019446,0.722048}, + {-1.226189,-0.806075}, + {-0.767485,-0.457873}, + {0.492217,-0.548094}, + {0.691643,-0.508868}, + {0.141146,-0.799097}, + {-0.090612,0.367936}, + {-1.588061,-0.270815}, + {-0.235590,-0.137989}, + {-0.055501,0.515153}, + {0.710591,-0.228057}, + {-0.499118,0.081473}, + {0.605634,-0.712194}, + {-1.465126,-0.300375}, + {-1.525912,0.646441}, + {-0.143056,0.092698}, + {-1.615522,0.655455}, + {-0.920867,0.776885}, + {1.293398,0.375770}, + {-0.367088,0.290023}, + {0.060016,-1.396905}, + {-0.564301,-0.163519}, + {0.765264,0.454371}, + {0.251582,-0.413469}, + {-0.202361,-0.426122}, + {-0.059972,0.009915}, + {-0.818937,0.409182}, + {0.019321,1.223693}, + {-0.308784,-0.106641}, + {-0.245638,-1.287715}, + {-1.559027,0.473275}, + {-0.523531,0.009086}, + {-0.815917,0.794331}, + {1.557748,0.201257}, + {-1.003834,0.532228}, + {-0.108970,-0.321004}, + {0.324720,-1.294292}, + {-0.526747,1.138428}, + {-0.648496,0.837288}, + {0.145426,0.003744}, + {0.995406,-0.617984}, + {0.658038,-0.080149}, + {0.680441,-0.468064}, + {1.360485,0.405642}, + {-0.648630,0.199765}, + {1.421996,0.120768}, + {-1.160572,0.425829}, + {-0.534584,0.437195}, + {0.263973,1.083009}, + {0.084184,-0.731033}, + {-0.583261,-0.202720}, + {-0.567244,-0.031166}, + {-0.393410,0.011082}, + {0.471308,0.529559}, + {0.817988,0.803892}, + {-0.436848,0.012289}, + {0.134056,-0.016346}, + {-0.510996,-0.160355}, + {0.301328,0.155798}, + {0.135075,-0.240089}, + {-2.111101,-0.043898}, + {0.492706,-1.075578}, + {0.331122,-0.193177}, + {-0.337675,-0.385101}, + {0.600488,-0.607441}, + {-0.482480,0.488866}, + {0.510644,-1.348219}, + {-0.900080,-0.246883}, + {0.054556,-0.043343}, + {-2.185732,-0.132914}, + {-1.179464,-0.506427}, + {0.060865,0.023893}, + {0.465712,-0.293140}, + {0.600472,-0.542588}, + {0.339465,-0.734740}, + {0.066566,-0.329599}, + {-0.182971,-0.834260}, + {-0.759862,-0.649675}, + {0.503928,0.562654}, + {0.180099,-0.072681}, + {-0.298720,0.091572}, + {0.414829,0.685094}, + {-0.178731,1.490621}, + {-0.764312,-0.940243}, + {-0.609986,0.139467}, + {0.620076,-0.882397}, + {-0.662503,-0.243036}, + {0.756788,0.492556}, + {-0.192028,-0.450766}, + {0.351446,0.122595}, + {0.312300,-0.348844}, + {-0.844268,0.241385}, + {-0.245266,-0.747779}, + {-1.043476,-2.173372}, + {0.689560,0.287984}, + {-0.604039,1.340161}, + {-0.186566,-1.016223}, + {-1.636023,-1.237069}, + {-0.183189,0.475359}, + {0.632049,-0.473980}, + {-0.105737,0.324525}, + {-0.734339,-0.411750}, + {-0.959041,-0.918415}, + {0.467121,-0.942991}, + {0.819873,0.146195}, + {0.528463,-0.981180}, + {0.144697,0.795032}, + {0.104364,0.648283}, + {0.183268,0.614067}, + {-1.164645,0.810951}, + {0.009496,0.610751}, + {-1.300113,-0.583004}, + {-1.015675,0.243285}, + {0.097064,0.342813}, + {-0.245720,0.670790}, + {0.205629,0.159022}, + {-0.262508,-0.028034}, + {-0.035008,0.785832}, + {0.565660,0.072977}, + {0.857016,-0.270113}, + {0.136789,-0.121418}, + {-0.656906,0.866977}, + {0.154962,1.086797}, + {1.053022,-1.172792}, + {0.226542,0.180113}, + {0.245718,-0.555295}, + {-0.232891,0.136740}, + {-0.930222,0.234981}, + {-0.486962,-0.336185}, + {0.350798,0.599626}, + {0.574125,0.169891}, + {0.614118,-0.392546}, + {-1.180994,0.390905}, + {0.683221,0.485573}, + {-0.841497,0.916893}, + {0.493882,0.242793}, + {1.254721,-0.271983}, + {-0.534063,0.438921}, + {0.575408,-0.133856}, + {0.312608,-0.033845}, + {0.580808,-0.613817}, + {-0.784972,-0.028488}, + {0.021831,-0.097100}, + {1.458365,-0.869399}, + {-1.300065,0.760049}, + {0.248812,-0.160696}, + {0.577725,0.443818}, + {-0.187965,1.600714}, + {0.318288,-0.795075}, + {-0.721696,-0.233585}, + {0.273242,0.614688}, + {0.681000,-0.554330}, + {-1.334662,-0.151226}, + {0.090395,0.928536}, + {0.810563,0.579363}, + {-1.128333,0.111594}, + {1.434974,0.769472}, + {-1.029423,0.004195}, + {-0.400590,0.108051}, + {-0.108363,-0.294703}, + {2.176060,-0.435633}, + {0.755020,0.883148}, + {-0.455663,-0.243404}, + {0.367326,-1.926805}, + {-0.455835,-0.070141}, + {1.081696,0.103537}, + {0.413618,-0.241936}, + {-0.155372,-0.490682}, + {-0.621036,0.039829}, + {0.890303,-0.313264}, + {-0.023574,-0.297114}, + {0.149197,0.434404}, + {-0.685611,-0.688437}, + {0.206938,0.778492}, + {-0.031417,0.174300}, + {-0.246155,-0.983701}, + {0.342626,1.369090}, + {-0.431405,0.516606}, + {-0.058886,-0.776391}, + {1.360163,0.224372}, + {1.125009,0.009836}, + {0.803894,0.584153}, + {-1.066450,-0.134171}, + {0.881308,-0.764883}, + {0.171104,0.260482}, + {0.114729,-0.114913}, + {0.883607,1.086200}, + {0.699362,-0.659063}, + {-0.164816,-0.175345}, + {0.387135,-0.085228}, + {-0.572309,0.619865}, + {-0.012015,-0.860950}, + {-0.342715,0.692370}, + {-0.024062,-0.039234}, + {0.292654,0.782865}, + {0.060171,0.442951}, + {0.160037,-0.381519}, + {0.408238,-0.320343}, + {-0.342973,-0.880725}, + {0.737359,0.306119}, + {-0.536555,-0.356491}, + {0.838071,-0.060380}, + {0.019197,-0.215087}, + {0.281771,0.139607}, + {-0.133836,-0.948025}, + {0.064779,-0.167417}, + {-0.325938,0.106840}, + {0.447499,0.335119}, + {0.025073,0.284159}, + {-0.052734,0.106778}, + {-0.701789,-1.485622}, + {0.518739,-0.597975}, + {-1.716639,0.510981}, + {-0.148489,0.188995}, + {0.199804,0.565255}, + {0.503694,-0.249207}, + {0.351417,0.318152}, + {-0.004846,0.498401}, + {-0.527585,0.429634}, + {2.230256,0.657682}, + {1.005492,0.534070}, + {0.335269,-0.396652}, + {-0.245966,0.173556}, + {1.145575,0.588938}, + {0.250537,0.473746}, + {0.273775,-0.223929}, + {0.015710,-0.244761}, + {-0.725572,0.598468}, + {0.272714,0.218757}, + {-1.388789,1.100565}, + {0.552103,-0.509940}, + {-1.061048,-0.439544}, + {0.192437,0.828632}, + {-0.847671,1.023359}, + {0.366431,-0.588009}, + {0.237764,0.442998}, + {-0.676158,-0.309010}, + {-0.610452,-0.659422}, + {-0.259924,0.412575}, + {0.388464,0.697350}, + {0.043340,0.184411}, + {-0.572546,-0.447644}, + {-0.330020,0.540548}, + {-0.476494,0.090675}, + {0.428011,0.507960}, + {-0.296043,-0.255790}, + {1.215630,-0.318831}, + {-1.154660,-0.477923}, + {-0.262266,1.238092}, + {-0.608603,0.453266}, + {-0.032630,-0.939531}, + {-1.660462,-0.153632}, + {1.705682,-0.866847}, + {0.429987,-0.912308}, + {0.416998,0.929955}, + {1.043259,0.307132}, + {-0.982368,0.014721}, + {0.123933,1.132765}, + {-0.203176,-0.346598}, + {0.070922,-0.385330}, + {0.144019,0.165251}, + {0.096086,-0.226780}, + {0.793344,0.135213}, + {-0.393406,-0.119594}, + {1.126684,-1.053134}, + {-0.132630,0.517421}, + {0.300448,-1.340154}, + {-0.834868,0.378596}, + {-0.132590,-0.127355}, + {-0.544568,1.427218}, + {-0.443372,0.521400}, + {-1.030830,1.124109}, + {-1.434174,0.036345}, + {-0.448801,-0.849006}, + {1.295485,1.176937}, + {0.612869,-0.763780}, + {-0.369440,-1.146724}, + {-0.183304,-0.234196}, + {0.228224,-0.830902}, + {1.022613,0.744120}, + {0.025729,0.401274}, + {-0.291958,0.275394}, + {-0.232227,-0.344890}, + {-0.372023,-0.748359}, + {0.399097,-0.026262}, + {-0.980706,0.557794}, + {-1.242178,-0.160578}, + {0.807544,0.089148}, + {-0.313827,-0.935789}, + {0.877743,0.053390}, + {-0.471764,-1.392615}, + {0.816500,1.445653}, + {-0.016996,-0.915960}, + {-0.919171,-0.825732}, + {0.536946,0.833119}, + {-1.361314,-0.838853}, + {-0.180351,-0.307114}, + {0.720178,1.060531}, + {0.168912,1.130233}, + {1.082306,0.407076}, + {0.193384,0.074239}, + {0.505658,-0.337304}, + {-0.059033,-0.040496}, + {-0.238771,-0.195282}, + {-0.160034,1.174256}, + {1.572109,-0.122569}, + {0.170932,-0.122646}, + {0.407778,0.454863}, + {-0.016869,-0.027842}, + {0.533907,-0.455801}, + {1.171133,1.451143}, + {-0.221926,0.445829}, + {-0.343024,-1.134887}, + {-0.084294,-0.803381}, + {1.762508,0.510097}, + {0.422538,-1.828873}, + {-0.272140,-0.351999}, + {-0.432142,1.296591}, + {-0.804792,1.207034}, + {-0.903372,0.071198}, + {0.221699,-0.548004}, + {0.296788,-0.487708}, + {-0.892082,0.116939}, + {0.118529,-0.058040}, + {0.889249,0.038813}, + {-1.435339,0.345064}, + {0.196684,0.414290}, + {-1.174361,-0.538056}, + {-0.655841,0.448240}, + {0.472673,-0.022418}, + {0.940362,0.311382}, + {-0.835209,-0.613456}, + {1.186347,0.367963}, + {-0.745946,-1.281948}, + {0.614204,-0.405224}, + {0.981560,0.711532}, + {-0.869991,0.308124}, + {-0.141029,-0.054972}, + {-0.145974,0.432189}, + {0.451887,-0.259041}, + {-0.784348,-0.033713}, + {0.793608,0.102305}, + {-0.744519,0.342470}, + {0.486741,0.105299}, + {0.347823,-0.107864}, + {-0.331637,0.717920}, + {-0.508501,1.192128}, + {1.490978,0.162327}, + {0.736492,-0.127445}, + {-0.085074,-0.474562}, + {0.599451,-0.167800}, + {0.674386,0.323677}, + {-0.412837,-0.758638}, + {0.609945,-0.786243}, + {0.606302,0.662258}, + {0.070750,0.124316}, + {0.362489,0.853723}, + {-0.421579,-0.217535}, + {-0.769619,2.120710}, + {-0.686205,-1.002458}, + {0.847970,0.499804}, + {-0.240487,-1.200173}, + {-0.787843,-0.870082}, + {0.134999,-0.037935}, + {1.418077,1.020690}, + {0.255585,-0.903872}, + {0.517503,1.018629}, + {0.222738,-0.956358}, + {-1.235963,0.716474}, + {0.896358,1.292193}, + {0.622993,0.939205}, + {0.032065,0.164409}, + {-0.779169,0.659748}, + {-0.738374,0.133285}, + {-0.620870,-0.855214}, + {0.342903,0.804248}, + {0.339164,-0.133036}, + {-1.661026,-0.210091}, + {0.245305,-0.675406}, + {-0.984197,0.390112}, + {-0.061474,-1.162560}, + {-0.723975,0.336075}, + {0.796753,-0.371630}, + {-0.548010,-0.761000}, + {-0.603116,-0.658810}, + {0.990442,0.351586}, + {-0.086890,-0.036006}, + {0.092425,-0.586906}, + {-0.925900,0.593131}, + {-0.763373,-0.389790}, + {-0.938653,-0.603703}, + {1.319069,0.867869}, + {0.485223,0.597602}, + {0.488264,-0.833841}, + {0.550617,-0.599518}, + {-0.329951,0.815395}, + {0.408096,-0.163820}, + {0.427087,-0.036759}, + {0.177247,0.112508}, + {0.674777,-0.049031}, + {-0.068546,1.438730}, + {0.238263,-1.518472}, + {0.883496,0.410851}, + {-0.306168,-0.121973}, + {0.119223,0.124116}, + {-0.458455,0.205762}, + {0.819118,-0.420270}, + {-0.502089,0.258248}, + {-0.168138,0.489351}, + {0.807982,-0.264625}, + {0.084262,-0.505577}, + {-0.559426,0.054462}, + {0.257622,-0.205514}, + {0.063041,-0.447553}, + {0.373281,0.067113}, + {-0.407206,-0.939355}, + {0.143221,-0.451897}, + {0.706256,0.478611}, + {0.537206,0.751956}, + {0.186734,-0.620411}, + {0.745475,-1.471416}, + {0.698281,0.256863}, + {0.042234,-0.046608}, + {0.099521,-0.430961}, + {0.236487,0.680732}, + {0.928581,0.289094}, + {-0.110851,0.188157}, + {-0.222611,-0.812705}, + {-0.633681,0.426959}, + {1.240335,-1.514135}, + {0.889274,-0.903866}, + {0.435835,0.552663}, + {0.713055,0.641659}, + {-0.042562,-0.629798}, + {-0.218147,-0.486607}, + {0.534103,-0.801708}, + {0.241010,0.206161}, + {0.572140,-0.082834}, + {-1.509288,-0.142938}, + {0.613317,-1.136810}, + {-0.196998,-0.273118}, + {-0.692536,-1.013502}, + {-0.524362,-0.353001}, + {-1.413574,-0.317148}, + {-0.184674,-1.254237}, + {0.212553,-0.393970}, + {0.115187,-0.497395}, + {-1.156764,0.217090}, + {-0.424303,-0.518804}, + {0.414805,0.157648}, + {0.213679,-0.158910}, + {-0.174193,0.696145}, + {0.085286,0.143396}, + {-1.850393,0.435779}, + {-0.015959,-0.039908}, + {-1.196652,-0.512413}, + {0.461147,1.083615}, + {1.188726,-1.253006}, + {0.191977,0.248884}, + {-0.633004,0.193534}, + {0.030327,0.447737}, + {-0.264705,0.787837}, + {0.010620,0.245484}, + {-0.824799,-0.704581}, + {-0.850004,0.204610}, + {0.381113,-0.610533}, + {0.471917,1.571607}, + {1.071030,-0.224993}, + {-0.384820,-0.304042}, + {0.283926,-0.337624}, + {-0.030392,-0.446234}, + {0.380697,1.115396}, + {-0.572464,0.561788}, + {0.625570,0.831812}, + {0.385308,0.863936}, + {-0.754364,0.169919}, + {0.019587,-0.256785}, + {0.572060,0.074947}, + {-0.701087,-0.235522}, + {-0.048703,0.055669}, + {1.222353,0.777241}, + {0.332950,0.082754}, + {-0.367895,-0.645924}, + {0.770417,0.554187}, + {-0.458786,-1.031422}, + {0.314500,-0.322402}, + {-0.683719,-0.429777}, + {-1.553851,-0.570942}, + {-0.067857,-0.160216}, + {2.145920,0.854215}, + {0.213836,-0.315033}, + {-0.513806,-0.416544}, + {-1.457721,-1.141119}, + {0.886807,-0.392147}, + {-0.193698,-0.206875}, + {0.548596,-0.465798}, + {0.215522,0.180953}, + {-0.391465,-0.142202}, + {0.902257,0.158063}, + {0.408777,-0.224758}, + {0.446692,0.091443}, + {-0.094655,0.081225}, + {0.499235,0.958718}, + {0.761380,-0.531675}, + {0.276579,1.203927}, + {0.276615,0.189762}, + {-0.100258,-0.732587}, + {-0.027769,1.596871}, + {0.462540,0.379880}, + {-0.341576,1.767737}, + {0.394437,-0.167993}, + {-0.105307,-0.509844}, + {0.334850,-2.520104}, + {0.845128,-0.104068}, + {-0.740984,-0.026126}, + {-0.974643,-0.280273}, + {-0.134239,-0.078789}, + {-0.299124,-0.863529}, + {0.106515,0.170939}, + {-0.927394,0.870161}, + {-0.491114,-1.917638}, + {-0.529767,-0.057114}, + {0.786100,-0.565618}, + {0.176072,-0.842280}, + {0.326239,-0.605491}, + {0.116318,1.170250}, + {0.644626,0.571773}, + {0.232028,-1.300912}, + {0.588283,0.271257}, + {-0.906647,-1.277791}, + {0.521843,-0.527216}, + {1.442306,0.379763}, + {0.236952,1.052319}, + {-0.295295,-0.568414}, + {0.242369,-0.208334}, + {-0.513807,-0.995215}, + {0.709065,0.862066}, + {-0.881110,-0.392734}, + {-0.341385,-0.818876}, + {-0.562235,-0.774610}, + {-0.383367,-0.394595}, + {0.193563,0.074610}, + {1.080435,0.606053}, + {0.541249,1.153279}, + {-0.507145,-0.367372}, + {-0.179289,0.029067}, + {0.098487,-0.117080}, + {-0.648908,1.440715}, + {0.227369,0.898461}, + {0.080062,-0.499544}, + {0.644433,-0.375275}, + {1.389011,0.012401}, + {-0.264708,-0.741045}, + {0.537436,-0.075225}, + {1.106610,-0.549125}, + {1.258275,-0.013265}, + {0.728976,0.175113}, + {-1.886547,-0.858978}, + {-0.781953,-0.791226}, + {0.122237,-0.660890}, + {-1.264703,-0.283197}, + {0.103200,-0.239052}, + {-0.243478,0.149221}, + {-0.144997,-0.203846}, + {-1.067080,-1.526123}, + {-0.976317,0.443019}, + {-1.106013,0.024286}, + {-0.311371,0.312037}, + {0.122867,-0.212564}, + {-1.891145,0.276717}, + {-0.898165,-0.258266}, + {0.160126,-1.155622}, + {0.322655,-0.124973}, + {0.709720,-0.446937}, + {0.646654,-0.041224}, + {-0.212961,0.280510}, + {0.377353,0.020557}, + {-0.559193,0.356275}, + {-0.304649,0.801474}, + {0.039679,-1.071028}, + {0.201060,0.268840}, + {0.060299,0.506095}, + {0.468796,0.933767}, + {-0.161046,0.352827}, + {0.444057,-0.026569}, + {-0.686397,0.188762}, + {-0.335728,0.854376}, + {1.571248,-0.778097}, + {-0.297224,-1.112280}, + {-0.298702,0.212694}, + {0.753050,-0.774688}, + {0.772973,0.801142}, + {1.006190,0.195367}, + {0.333846,-0.480112}, + {-0.391853,1.243410}, + {-0.695698,-0.290131}, + {-0.739155,-0.888427}, + {-0.332246,-1.694342}, + {-0.872134,-0.491913}, + {-1.196152,-0.951224}, + {0.677412,0.228122}, + {0.078804,0.855733}, + {0.835586,0.425326}, + {-0.229803,-0.248342}, + {-0.718329,-0.707283}, + {-0.509813,-1.200162}, + {0.225505,-1.007218}, + {-0.328166,-0.713028}, + {0.464166,0.043179}, + {0.309117,1.116584}, + {0.123684,0.813080}, + {-0.557566,0.056690}, + {0.771158,0.111089}, + {-0.102040,0.365176}, + {0.283581,-0.304576}, + {0.965047,0.603779}, + {-0.888726,0.478438}, + {0.477779,1.650476}, + {-1.743258,-0.545295}, + {1.377725,-0.340541}, + {-0.086465,0.288027}, + {0.172055,-1.416793}, + {-0.156652,-1.552419}, + {1.449604,-0.803632}, + {0.172637,0.621346}, + {0.793824,1.127283}, + {-0.470779,0.819345}, + {0.854335,-0.217494}, + {1.238408,-0.227297}, + {-0.446910,-0.251604}, + {-0.124721,0.631903}, + {1.355742,-0.253180}, + {0.521698,-0.380554}, + {0.610522,-0.644701}, + {-0.081964,0.075793}, + {-0.023329,1.079615}, + {0.035329,0.305532}, + {0.833652,0.329381}, + {1.248972,-0.520503}, + {1.090623,-0.312108}, + {-0.298609,0.072040}, + {-1.133040,-1.182362}, + {0.439116,0.599685}, + {-0.255228,-0.318038}, + {-0.027322,0.405769}, + {-0.892907,1.076022}, + {-0.262922,0.302096}, + {-0.920155,-0.097186}, + {-0.540438,1.415810}, + {0.272013,-1.071177}, + {-1.292397,-0.727006}, + {-0.061905,-0.763598}, + {-0.941549,0.110682}, + {-0.295776,0.793431}, + {-0.169404,2.201666}, + {-0.222637,-0.543007}, + {-0.231419,1.018982}, + {0.431675,-0.674150}, + {0.647789,1.313624}, + {-0.264086,-1.589729}, + {-0.501708,1.108352}, + {-0.208768,-0.310074}, + {-0.597616,0.571167}, + {0.001134,-0.028259}, + {1.776513,0.322038}, + {0.000932,0.887187}, + {-0.308110,-0.292049}, + {-0.532540,-0.401817}, + {0.489140,-0.274389}, + {2.617062,0.127502}, + {0.147567,1.240201}, + {0.663675,0.555925}, + {-0.074294,-0.891471}, + {-0.052708,1.536838}, + {0.022298,-0.206741}, + {0.479854,0.468749}, + {-0.554820,1.208232}, + {0.082508,0.244005}, + {0.308910,0.266430}, + {-0.474058,0.730188}, + {-0.234200,-0.862644}, + {0.952488,0.374155}, + {-1.407313,0.324058}, + {0.255768,0.333183}, + {-1.409944,0.885110}, + {-0.133868,0.923739}, + {0.365945,-0.286467}, + {-0.173753,-0.130918}, + {-0.127021,-0.366972}, + {0.038457,0.743113}, + {-0.478880,-0.722286}, + {-0.422107,-0.391745}, + {1.431973,1.075899}, + {0.065443,0.277849}, + {-1.101839,-0.748236}, + {0.291738,0.774096}, + {-0.408096,0.206278}, + {-1.180762,0.039864}, + {0.986053,-0.063561}, + {0.898749,0.024366}, + {0.206499,0.151574}, + {0.542112,0.681856}, + {0.773880,0.684502}, + {-0.241328,-0.031931}, + {-0.382695,-0.326442}, + {-0.849252,-0.163569}, + {-0.224038,0.104381}, + {-0.271735,0.180993}, + {-0.297649,1.141589}, + {-0.707010,-0.959005}, + {0.401963,-0.582866}, + {-0.715231,-0.495908}, + {0.530290,-1.238800}, + {-0.754427,0.394484}, + {0.419279,-1.220995}, + {0.230175,0.787427}, + {0.371875,-0.606294}, + {0.450371,-0.675309}, + {0.171612,-0.392663}, + {0.044028,0.193995}, + {0.390951,0.897858}, + {0.462471,-1.607671}, + {1.295156,0.465999}, + {0.793000,-0.411269}, + {0.521132,-0.780113}, + {0.533996,-0.337154}, + {0.465286,0.327814}, + {0.575773,0.419234}, + {-0.030753,-0.501412}, + {-0.575181,-1.392250}, + {0.464516,0.592014}, + {-1.051143,0.268391}, + {0.131935,0.110597}, + {0.074115,0.640275}, + {1.141666,-0.715042}, + {0.981527,0.398484}, + {-0.318100,-0.014155}, + {0.180788,-2.372129}, + {-0.228512,-1.445935}, + {0.604143,0.511910}, + {0.061448,0.220588}, + {1.285856,0.755178}, + {-0.007362,0.382650}, + {-0.121693,-1.355384}, + {0.384877,1.724619}, + {0.501171,0.169846}, + {0.072657,1.420837}, + {-0.653957,-1.801468}, + {1.157954,-0.653464}, + {-0.086409,0.466198}, + {-0.284619,-1.509457}, + {0.250620,0.007603}, + {-0.493596,-0.521283}, + {0.052350,0.242415}, + {-0.662703,0.329744}, + {0.270573,0.839284}, + {1.071362,-1.329600}, + {1.398703,-0.282566}, + {-0.731533,1.666659}, + {1.288748,0.120392}, + {-0.275091,-0.249067}, + {0.385583,0.034420}, + {-0.019935,-0.619918}, + {0.126886,0.241649}, + {-0.634954,-0.683893}, + {-0.689498,-0.555893}, + {0.355284,-0.081731}, + {-1.040687,-0.136149}, + {-0.539910,-1.308056}, + {-0.577548,0.394734}, + {-1.345688,0.532236}, + {-0.139622,0.230896}, + {0.266085,-0.109778}, + {0.720346,1.119455}, + {0.079954,0.124289}, + {0.511923,-1.657132}, + {-2.248034,0.251991}, + {1.364589,0.688028}, + {0.888909,-0.151714}, + {-0.569128,0.357256}, + {-0.771377,1.271462}, + {-0.737187,-0.032195}, + {-0.719654,0.068332}, + {-0.741507,-0.004577}, + {-0.437575,0.452222}, + {0.046679,0.449842}, + {-0.220268,-0.231133}, + {0.487091,-0.782256}, + {-0.588303,-0.523988}, + {0.078759,0.662810}, + {1.248130,-0.793583}, + {0.508679,0.242683}, + {0.870960,-0.005896}, + {0.322792,-0.772706}, + {-0.837291,-0.424434}, + {-0.273942,-0.068730}, + {-0.996061,0.634835}, + {-0.325385,0.366167}, + {-1.601558,-0.215569}, + {0.865809,-0.026148}, + {1.361558,-0.115469}, + {-0.588242,-0.102336}, + {-0.387966,0.323272}, + {0.289584,-0.504165}, + {-0.754503,-1.114553}, + {-0.353904,-0.014974}, + {-0.948798,0.383592}, + {-0.060121,-1.007894}, + {-0.209254,0.035108}, + {-0.191868,-0.327112}, + {-0.872958,1.449912}, + {1.215036,0.727058}, + {-0.851767,0.775217}, + {0.370956,-0.452360}, + {-0.325553,-0.956322}, + {-0.341459,1.281000}, + {-0.094430,-0.289030}, + {0.272220,0.131684}, + {-0.490177,-0.806252}, + {-0.099482,0.801627}, + {0.660006,-0.111388}, + {-0.412095,0.392647}, + {-0.019833,0.332668}, + {-0.076947,1.499139}, + {-0.243294,1.683990}, + {-0.671076,-0.433132}, + {0.167768,-0.058623}, + {1.324849,0.390514}, + {-0.069259,-1.476604}, + {-0.201312,-0.076595}, + {0.817829,-0.669267}, + {0.271931,0.149985}, + {-0.209551,-0.803738}, + {0.823791,-0.880931}, + {0.945366,-0.396813}, + {-0.636227,0.164765}, + {-0.560128,1.371587}, + {-0.210411,-0.871558}, + {0.049073,0.899454}, + {-0.426285,0.802485}, + {0.481298,0.695859}, + {-1.158734,0.585655}, + {0.344093,-0.512270}, + {0.837968,0.186502}, + {0.446366,-0.555741}, + {0.389203,-0.792521}, + {-1.165375,-1.629469}, + {-1.254712,0.471550}, + {0.689930,1.197958}, + {-1.004811,0.105754}, + {0.841131,0.147341}, + {0.154420,-0.297913}, + {-0.796042,-0.454021}, + {-1.231614,-1.187511}, + {-1.109815,-0.141912}, + {-0.566546,-0.288210}, + {-0.661025,0.127627}, + {-1.017198,-1.001861}, + {1.186309,0.060379}, + {-0.220627,1.019218}, + {-1.293678,-0.087054}, + {-0.025609,0.418478}, + {0.771157,-0.681107}, + {0.539560,0.233353}, + {-0.378370,0.264538}, + {1.893478,-0.101454}, + {0.248258,-0.000550}, + {-0.031156,-0.785691}, + {1.781812,-1.292306}, + {1.084657,0.507894}, + {-0.699208,0.885340}, + {1.285794,-0.619386}, + {0.955586,-0.121447}, + {-0.914452,-1.178647}, + {-0.242399,-0.427685}, + {-0.000717,0.064139}, + {0.574391,-0.693162}, + {0.485580,-0.614569}, + {-0.408661,-0.616323}, + {-0.464543,0.219753}, + {0.765718,0.874867}, + {1.166937,-0.037645}, + {-0.387840,0.839810}, + {-0.522687,1.260869}, + {0.079230,0.752776}, + {-1.317984,1.303184}, + {1.280048,0.412472}, + {1.609177,-1.354228}, + {1.037420,0.014540}, + {0.221589,0.058322}, + {-0.629552,0.832290}, + {-1.314747,0.685569}, + {0.279436,-0.743734}, + {-1.036796,0.905691}, + {0.495922,0.253242}, + {-0.916021,0.154075}, + {0.864485,0.140135}, + {-0.350216,-0.107206}, + {-0.536267,0.213086}, + {1.398571,-0.305908}, + {-1.517443,-0.348266}, + {0.316594,0.475011}, + {-0.682424,0.439457}, + {-0.443305,1.044724}, + {-0.515239,-0.514528}, + {-1.187287,0.148757}, + {0.286934,-0.102590}, + {0.258621,-0.932940}, + {1.392701,-0.258996}, + {-0.247044,0.662986}, + {-0.039077,-0.511042}, + {0.844728,-0.217617}, + {0.655759,-0.440128}, + {-0.413628,-0.925661}, + {-0.488104,-1.044892}, + {-0.543050,0.155919}, + {0.817307,0.193785}, + {0.341966,0.009039}, + {0.574199,0.718193}, + {-0.179957,-0.492905}, + {0.487152,0.524160}, + {0.329158,-0.281555}, + {-0.816659,-1.487422}, + {0.535622,0.409912}, + {0.252481,-0.624546}, + {-0.108432,-0.823732}, + {0.302554,-1.011194}, + {-0.425776,-1.472152}, + {-0.398910,-0.198658}, + {-0.068758,-1.227234}, + {0.126371,-0.758421}, + {0.343071,-0.216133}, + {0.001535,1.505001}, + {0.112153,0.738745}, + {-1.513525,-1.478555}, + {0.939067,1.193568}, + {0.382158,-0.305531}, + {-0.777582,-1.155642}, + {-0.672354,-0.312022}, + {-0.374348,-1.352798}, + {-0.418581,0.634617}, + {0.217850,-0.116165}, + {0.432181,0.426225}, + {-0.889372,0.893485}, + {0.855687,-0.582910}, + {-0.438450,-0.263930}, + {-0.466874,-0.869459}, + {0.040757,-0.535451}, + {-0.140064,0.789127}, + {-0.027951,0.105940}, + {-0.437942,-0.211395}, + {-0.040889,-0.017258}, + {0.338753,0.833301}, + {0.111661,-0.175934}, + {0.984011,0.077959}, + {-0.244420,0.211986}, + {-1.269522,0.063911}, + {0.409668,-0.303990}, + {0.462926,1.021879}, + {0.011614,-0.284044}, + {1.020808,0.476647}, + {0.196290,0.617474}, + {-1.098523,0.371501}, + {0.161323,-0.313071}, + {-0.002902,0.397897}, + {-0.356512,0.045680}, + {0.279592,-0.533235}, + {-0.475045,0.692805}, + {-0.089288,-0.703191}, + {-0.405232,-0.892280}, + {1.186783,0.798136}, + {-1.149640,-0.304031}, + {-0.243771,-0.696568}, + {-1.109856,0.231693}, + {0.587465,-0.480350}, + {0.184300,0.622183}, + {0.153163,0.512540}, + {1.675888,0.477305}, + {0.698217,0.670234}, + {0.860644,1.171471}, + {-0.330617,0.580491}, + {-0.058262,-0.788790}, + {-0.358326,-0.426058}, + {0.905134,-0.409635}, + {-0.008586,0.990271}, + {0.929488,-0.596337}, + {-1.358305,0.391919}, + {0.902404,0.342821}, + {-0.063962,0.618381}, + {-0.053813,0.301008}, + {0.297584,-0.666505}, + {0.556545,0.163475}, + {-0.105724,0.005318}, + {0.756775,0.828292}, + {-0.274629,-0.880320}, + {-0.476757,-1.149811}, + {1.127103,-0.294822}, + {-1.437952,0.298334}, + {0.907496,0.739951}, + {0.482075,0.004954}, + {0.157887,-0.816916}, + {-1.104784,0.063870}, + {-0.724938,-0.327697}, + {-0.487298,0.975783}, + {-0.065203,0.869972}, + {-0.211487,-0.462389}, + {1.094010,0.177366}, + {0.291395,-1.629667}, + {0.319282,0.785872}, + {1.229602,0.954910}, + {-0.342436,-0.978418}, + {0.352808,-0.930560}, + {0.347757,-0.981736}, + {0.298532,-0.077863}, + {-0.714535,-0.393789}, + {-0.333766,-0.139255}, + {-0.418941,0.359123}, + {-0.645184,0.861929}, + {-0.722475,0.301444}, + {-0.583318,1.352369}, + {-0.712937,0.243635}, + {0.440878,-0.827122}, + {0.327224,-0.062067}, + {0.186287,1.258463}, + {-0.729241,0.868902}, + {0.541857,-0.200516}, + {1.156841,-0.049354}, + {1.070085,-0.139319}, + {0.275765,0.779653}, + {0.355802,-0.444176}, + {-0.215164,1.591130}, + {0.410285,-0.761158}, + {-0.921834,-0.002490}, + {-0.552404,-0.660768}, + {0.405438,0.139289}, + {-0.275428,-0.582028}, + {0.727740,-0.766058}, + {-0.306953,-0.280078}, + {0.816312,-0.261072}, + {-0.199058,0.147132}, + {-0.360431,1.125081}, + {1.191538,-0.047433}, + {0.305817,-0.633319}, + {-0.494003,0.488029}, + {0.212671,0.098168}, + {0.210869,-0.461609}, + {-0.134279,0.437562}, + {0.343639,-0.292114}, + {-0.041375,-0.808615}, + {-1.049076,0.685913}, + {-0.665760,-1.010501}, + {-0.316509,-0.003953}, + {0.009980,0.599501}, + {0.638152,-0.300940}, + {-1.337720,-1.392983}, + {-0.275772,0.226258}, + {-0.550300,0.251820}, + {-0.584194,0.093470}, + {0.610120,1.230993}, + {-0.976958,0.361009}, + {-0.875544,1.373339}, + {0.287035,-0.431066}, + {-0.467716,0.616202}, + {-0.521935,-1.111703}, + {-0.098289,-0.170971}, + {-0.189521,-0.430798}, + {0.994687,-0.127269}, + {0.197679,0.364513}, + {-0.553761,-1.362114}, + {-1.599143,0.283164}, + {0.343200,0.241993}, + {0.950041,0.135606}, + {-0.496251,0.947582}, + {0.112208,-0.474788}, + {-0.043567,-0.201243}, + {-0.152120,0.819050}, + {-0.698148,-0.987049}, + {0.472844,0.167428}, + {0.805574,0.137483}, + {0.993595,0.361435}, + {-0.755927,0.329879}, + {-0.477493,0.425378}, + {0.513390,0.862967}, + {-0.370640,-1.203726}, + {0.303774,0.888996}, + {-0.531538,-0.061148}, + {0.292513,1.123151}, + {-1.375406,0.912479}, + {0.874095,0.312105}, + {0.285703,1.070449}, + {-0.327598,0.204123}, + {0.514364,-0.591838}, + {0.187292,0.151885}, + {-0.305341,0.797145}, + {0.512371,-0.430627}, + {-0.263249,1.117044}, + {1.457063,0.655659}, + {0.400834,-0.687060}, + {-0.534341,0.199095}, + {-0.670479,-0.049629}, + {0.170424,0.355076}, + {-0.089197,-0.199899}, + {-0.516640,-0.098609}, + {-1.415132,-0.986232}, + {-0.543245,-0.612453}, + {1.700407,-0.111663}, + {-0.333996,0.941663}, + {-0.558882,0.628745}, + {-0.189070,-0.269156}, + {-0.092103,0.289742}, + {1.721874,-0.613049}, + {0.400596,-1.689893}, + {0.029330,0.780505}, + {0.702801,-1.886583}, + {0.527904,1.344383}, + {-1.532567,-0.282722}, + {-0.187656,1.032522}, + {-0.563567,0.352977}, + {1.552724,1.036609}, + {-0.362367,0.884433}, + {0.907224,-0.245049}, + {0.968850,0.022296}, + {0.991932,-0.528220}, + {-0.574841,-0.667893}, + {-1.285195,-0.410222}, + {0.961984,0.592525}, + {0.851798,-0.802477}, + {-1.049946,-0.207182}, + {0.797470,-0.161487}, + {-0.749814,0.644751}, + {1.147914,0.191578}, + {1.094925,-0.009702}, + {-0.016473,-0.192798}, + {-0.479182,-0.608849}, + {-0.521973,0.822191}, + {-0.532269,0.303592}, + {1.239154,0.041944}, + {0.389138,0.091142}, + {-0.663000,0.328936}, + {0.342085,-0.836875}, + {-1.076007,-0.660702}, + {-0.134030,0.851663}, + {0.024222,0.084575}, + {-1.902667,-0.772045}, + {-0.584827,-0.179968}, + {0.072428,0.119199}, + {-0.342968,0.700217}, + {-0.467256,-0.216460}, + {0.245841,0.459667}, + {-0.569716,-0.968906}, + {-0.425136,-0.329992}, + {-0.290409,0.687952}, + {0.225955,0.172615}, + {1.003682,-0.248519}, + {-0.114798,1.216756}, + {1.860231,-0.053088}, + {0.106746,-0.618765}, + {0.288442,-0.650337}, + {0.718256,-0.694432}, + {-0.331457,-0.719543}, + {1.068076,0.148336}, + {-0.096353,-0.028651}, + {0.897863,-0.741848}, + {0.412489,1.038703}, + {-0.114692,-0.055749}, + {0.139043,-0.040275}, + {0.638080,-0.220795}, + {-0.633578,1.226884}, + {-0.251365,1.662993}, + {0.225500,0.307234}, + {-0.602385,-1.321478}, + {0.034489,-0.600173}, + {-0.758390,-0.563067}, + {-0.284530,-0.408226}, + {-0.579724,1.090416}, + {0.564264,-0.546693}, + {1.299442,-0.259779}, + {0.540747,0.139655}, + {0.950786,0.132223}, + {-0.293267,-0.682357}, + {-0.926701,1.267867}, + {-0.861209,-0.469813}, + {0.266995,0.266466}, + {-0.336500,0.231023}, + {-0.345643,0.297993}, + {-1.065829,-0.717767}, + {0.337612,-0.915230}, + {0.091474,0.162675}, + {0.308361,-0.094296}, + {0.577293,-1.348639}, + {-0.284413,0.283653}, + {0.357282,0.494051}, + {1.245152,0.281545}, + {-1.431170,-0.390320}, + {0.181289,0.594357}, + {0.532038,-1.703506}, + {-0.080299,-0.145390}, + {0.706124,0.883663}, + {-0.383556,-0.058734}, + {-0.778841,-0.343133}, + {0.466969,-0.233412}, + {0.438538,-0.476148}, + {0.583980,-0.010636}, + {-0.877575,0.042320}, + {0.360100,-1.169871}, + {-0.088032,-0.398826}, + {-0.476665,-0.290729}, + {0.290340,0.526910}, + {0.348399,-0.419803}, + {0.846750,0.362483}, + {1.325840,0.694740}, + {-0.345673,-0.490818}, + {-0.280731,-0.855840}, + {1.003652,0.167563}, + {0.046835,0.199770}, + {-0.137995,0.109839}, + {1.236355,0.414718}, + {0.076375,0.187022}, + {0.540177,1.332342}, + {-0.536548,0.170836}, + {-0.538823,-0.787885}, + {-0.030721,-0.152529}, + {-0.197468,-0.453547}, + {-0.860949,-0.359616}, + {-0.076259,-0.168284}, + {0.128913,0.374510}, + {0.491855,0.338274}, + {0.841089,0.539245}, + {-0.918791,-0.642914}, + {0.722143,0.109400}, + {-1.613346,0.192994}, + {0.138179,0.384452}, + {0.217286,0.484391}, + {-0.617670,0.552131}, + {-0.314759,1.396384}, + {0.680449,0.920245}, + {-0.776923,0.591054}, + {0.357123,0.348420}, + {-0.552000,-0.959852}, + {-0.457786,-0.012405}, + {0.194398,0.372935}, + {-1.158776,-0.739099}, + {-0.119856,0.695673}, + {-1.044994,0.542655}, + {-0.057589,0.663487}, + {-0.637497,1.383641}, + {0.841195,1.016650}, + {-0.227216,0.350548}, + {-0.666675,0.297665}, + {-0.837852,0.428705}, + {-1.515275,-0.555662}, + {-0.151261,-0.712636}, + {-0.221931,-0.513521}, + {-1.443995,0.844288}, + {0.313953,0.097811}, + {-0.204681,-0.430877}, + {0.980967,-0.423177}, + {0.232925,-0.543011}, + {0.306555,-0.317551}, + {-1.105006,-0.200727}, + {-0.491818,-0.043239}, + {-0.024608,-0.174225}, + {0.033530,2.148918}, + {-0.623382,-0.443777}, + {-1.073524,0.750841}, + {-0.120307,1.009256}, + {0.383676,-0.259419}, + {-0.313467,-1.256964}, + {-0.422919,-0.188656}, + {1.284099,0.681505}, + {0.223126,-0.031646}, + {0.306322,-0.620767}, + {0.442285,0.769126}, + {-0.724718,-0.051262}, + {0.239249,-0.361381}, + {0.330321,-0.151744}, + {-0.732583,0.357697}, + {1.352363,0.469735}, + {-0.520244,-1.172771}, + {-0.830415,0.617391}, + {-0.345373,-0.338332}, + {-0.195310,1.495399}, + {-0.303452,-0.330434}, + {-0.858515,0.736562}, + {-0.299252,0.080389}, + {1.345959,-0.872637}, + {0.074448,-0.237625}, + {1.059866,-0.609576}, + {-0.575313,0.866044}, + {-0.077763,1.006470}, + {-1.001055,0.181480}, + {0.602403,-0.828705}, + {0.704641,-0.635900}, + {0.125989,0.812281}, + {-0.020565,-0.376771}, + {0.086654,0.473210}, + {-0.807156,-0.842660}, + {1.800373,0.552391}, + {-0.130840,0.401600}, + {1.213215,0.407588}, + {0.032867,0.902099}, + {-0.647827,-0.660410}, + {0.139245,0.572428}, + {0.503025,-0.013337}, + {-0.345741,-0.790109}, + {1.992791,-0.453862}, + {-1.025935,0.141881}, + {1.284579,-0.440883}, + {-0.079254,0.984268}, + {0.774126,0.771004}, + {0.446898,0.009177}, + {-0.145382,0.156029}, + {0.640419,1.548422}, + {0.417477,-0.537218}, + {-0.166369,-1.168204}, + {-1.576589,-0.006857}, + {-0.568257,0.799393}, + {-0.097194,0.950091}, + {0.517471,-1.411220}, + {0.238796,-0.516115}, + {0.520339,0.649062}, + {0.066756,-0.377378}, + {-0.337598,0.506655}, + {0.082550,-0.452063}, + {0.348994,0.931952}, + {-0.986407,-0.704322}, + {-0.127239,0.598529}, + {0.326580,-0.100612}, + {-0.479889,-0.405277}, + {-1.261540,0.389325}, + {-0.326830,-0.479964}, + {0.362882,0.916080}, + {0.351699,0.236263}, + {0.339159,-0.569330}, + {0.193999,0.722854}, + {-0.383134,-0.307248}, + {0.983325,-0.083201}, + {0.134546,1.185024}, + {0.453730,0.055284}, + {0.699766,-0.295923}, + {-1.300227,2.106761}, + {1.649077,0.568909}, + {1.754100,-0.494836}, + {1.533405,0.734520}, + {1.171021,0.482031}, + {1.401353,0.104870}, + {0.365542,-1.022673}, + {-0.297745,0.086303}, + {0.811492,0.413641}, + {-0.006258,0.257878}, + {0.025602,0.267244}, + {0.302591,0.729528}, + {1.143575,0.702035}, + {0.878501,0.429343}, + {-0.568291,1.009797}, + {0.475038,-0.837439}, + {0.463692,0.574354}, + {-0.262200,-0.340073}, + {-0.092665,0.807504}, + {0.502834,-0.559747}, + {-0.405528,0.310426}, + {0.892265,0.595287}, + {1.606894,-1.747076}, + {-0.552482,0.153944}, + {-1.140951,0.420524}, + {-0.002796,0.745166}, + {1.856330,-0.471658}, + {-0.278099,0.079846}, + {-0.859602,0.915874}, + {-0.131552,-0.316820}, + {-0.384475,-0.141175}, + {1.036717,-0.801126}, + {-0.243963,-0.971380}, + {-0.096054,0.106090}, + {-1.006589,0.633260}, + {1.195284,0.049783}, + {1.377535,0.570432}, + {0.727388,0.842091}, + {-0.591521,-0.187649}, + {0.435684,-0.688750}, + {-0.294460,0.716584}, + {1.215540,-0.474825}, + {-0.696852,-1.070607}, + {-0.396589,0.554698}, + {0.089609,-0.423692}, + {-1.348885,-0.346625}, + {0.203519,0.440114}, + {0.743717,-0.894146}, + {-0.159810,-0.334923}, + {0.682591,-0.546565}, + {-0.712575,0.476973}, + {-1.104661,-0.456355}, + {-0.479537,0.251457}, + {-1.174705,-0.052909}, + {-0.352342,0.708805}, + {0.131579,-0.078383}, + {0.418601,0.558629}, + {-0.035404,-0.244368}, + {0.264606,-1.039640}, + {-0.949351,0.500103}, + {0.788048,0.890085}, + {-0.089676,0.665759}, + {-0.926300,0.785008}, + {0.511916,0.407786}, + {0.421369,-0.501708}, + {0.673039,-0.920122}, + {-1.286538,-0.354717}, + {0.248195,0.038161}, + {-0.205990,1.080045}, + {-0.217009,0.702000}, + {-0.276423,0.807365}, + {-0.426657,0.829259}, + {1.389469,-0.172937}, + {0.242023,0.337750}, + {0.111603,-1.317547}, + {-0.474308,-0.557545}, + {-0.943573,0.433703}, + {0.637707,-0.325782}, + {0.288693,0.683452}, + {0.404386,0.934451}, + {0.280019,0.234267}, + {0.235777,-0.732291}, + {0.679205,-0.897298}, + {-0.633602,1.471122}, + {0.135238,0.129816}, + {-0.615491,-0.198805}, + {-0.064142,-0.264310}, + {-0.386053,-0.523291}, + {0.905432,-0.812653}, + {-0.251535,0.119324}, + {0.544902,-1.468042}, + {0.940112,-1.020098}, + {0.261122,0.539496}, + {-1.028811,-1.062924}, + {-0.961214,1.210793}, + {0.440965,-0.383521}, + {-0.471681,-0.646258}, + {-0.640999,0.630283}, + {-0.593379,0.907085}, + {-0.559648,-0.906520}, + {0.131252,0.190629}, + {-1.155937,0.469075}, + {-0.774295,0.491694}, + {-0.391053,0.660751}, + {0.248040,0.038323}, + {-0.603211,0.265228}, + {-1.222478,-0.223261}, + {1.022423,0.355851}, + {0.285110,0.398718}, + {1.496522,-0.815689}, + {0.651223,-0.214058}, + {1.483784,-0.345858}, + {0.338015,-0.489712}, + {-0.046722,-0.437334}, + {0.159075,-1.718044}, + {-0.190740,-0.099638}, + {0.061885,0.049811}, + {0.679428,-0.232491}, + {0.435870,-0.001996}, + {1.027309,-0.975858}, + {-0.014691,-0.487557}, + {-0.295080,0.752236}, + {-0.274321,0.469497}, + {-0.517557,1.067698}, + {0.064585,0.127431}, + {-1.046478,-0.199519}, + {0.243379,0.939476}, + {0.061894,-0.918354}, + {0.182123,0.572483}, + {0.530045,0.686889}, + {-0.039721,-0.301593}, + {1.310340,-1.022175}, + {0.167251,-0.342483}, + {-0.873160,0.739288}, + {1.084948,-1.081913}, + {0.987790,-0.737875}, + {1.115765,0.832754}, + {0.710369,0.565371}, + {1.222391,-0.328709}, + {0.981649,-0.055245}, + {-0.777509,-1.846205}, + {0.368035,0.488807}, + {-1.365216,0.569074}, + {1.124465,0.671338}, + {0.992709,0.751788}, + {-0.470874,0.278596}, + {0.636061,-0.169493}, + {0.359905,0.085555}, + {0.222456,0.382605}, + {-1.173254,0.201384}, + {0.279053,-1.466444}, + {-0.551690,1.345065}, + {-0.510876,-0.198530}, + {0.495703,-0.623988}, + {0.084364,0.323890}, + {-1.999895,-0.270420}, + {-0.076837,1.042714}, + {-0.752037,0.184538}, + {0.788181,-0.585590}, + {-0.331946,0.352529}, + {-0.573372,0.687863}, + {0.138512,-0.567696}, + {-0.295121,-0.726297}, + {-0.543169,0.137349}, + {-1.715495,-1.038332}, + {-0.792709,1.829956}, + {-0.512584,-0.042359}, + {0.314335,0.342696}, + {0.301736,0.685331}, + {0.538495,1.567646}, + {0.619975,0.078173}, + {-0.498993,-0.523364}, + {-0.772238,0.214198}, + {-0.098512,-0.182276}, + {0.454210,-0.534136}, + {-1.022817,-1.137971}, + {0.073646,1.100400}, + {-1.024269,-1.297541}, + {0.102126,-0.936219}, + {-0.656945,0.838675}, + {-0.883419,-0.256136}, + {-0.187742,-0.020857}, + {0.277194,-0.076560}, + {0.664217,-0.799587}, + {-0.150595,-0.678707}, + {1.282330,-0.650995}, + {0.230992,-0.615056}, + {1.240003,-0.672353}, + {-0.277618,-0.291440}, + {0.819647,0.226890}, + {0.150397,-0.913147}, + {-0.416220,0.946438}, + {-0.076384,1.536212}, + {1.392241,-1.502352}, + {1.326505,-0.499578}, + {-0.091994,-0.153227}, + {-0.961196,0.689524}, + {0.781255,-0.480439}, + {0.928013,0.550042}, + {-0.232140,0.627398}, + {-0.954812,-0.337019}, + {0.310334,1.994616}, + {0.437513,-0.248398}, + {0.219854,0.604570}, + {-0.986371,0.508113}, + {0.338285,-1.014958}, + {0.109864,0.456381}, + {0.279878,-0.662212}, + {0.837898,0.324217}, + {0.556637,0.129244}, + {0.274982,0.417030}, + {-0.610253,-0.031767}, + {0.087246,-0.527219}, + {-0.003924,-0.518842}, + {-1.162910,0.023406}, + {-0.748007,-0.086280}, + {-1.473481,0.519776}, + {0.227004,-0.462845}, + {-1.082161,0.747261}, + {-0.506904,0.368379}, + {-0.400566,-0.884841}, + {0.601519,0.983189}, + {-0.166960,0.343570}, + {-1.095310,0.099506}, + {1.360160,0.674208}, + {-0.147483,0.107427}, + {0.281204,-0.417472}, + {0.661175,-0.414379}, + {-1.448734,1.031802}, + {-0.755926,0.045997}, + {-0.411609,0.573619}, + {0.557744,0.825309}, + {-0.849476,-0.220213}, + {0.491201,0.095585}, + {0.495856,-0.624079}, + {0.271922,-0.075840}, + {-1.176081,0.131668}, + {0.199308,0.838635}, + {1.157825,-0.261944}, + {0.499849,0.118281}, + {0.977981,0.048878}, + {1.199673,-0.964225}, + {0.858596,-0.581090}, + {-0.452553,-0.218746}, + {0.299985,0.111416}, + {0.658092,0.162666}, + {-1.038127,-1.509123}, + {-0.476839,-0.238866}, + {-0.825964,-0.083540}, + {-0.311650,0.915382}, + {-0.346397,0.095597}, + {1.291551,-0.057599}, + {-0.180325,1.013067}, + {-0.377176,-0.025424}, + {-0.170279,-0.752118}, + {-1.045206,-0.436628}, + {1.077868,0.598796}, + {-1.083213,-1.758250}, + {-0.312935,0.179621}, + {0.255198,-0.202909}, + {0.713268,-1.475905}, + {-0.464259,0.230728}, + {-0.089435,0.405254}, + {0.475353,-0.424938}, + {-0.867856,-0.104100}, + {-0.636819,-0.246586}, + {-0.172386,0.532258}, + {-0.100517,-0.057939}, + {-0.090309,-0.013900}, + {-0.012730,-0.418781}, + {-0.323899,-0.112924}, + {0.548806,-0.078950}, + {0.011270,-0.804839}, + {-1.476368,0.179108}, + {0.820229,-0.630583}, + {1.295267,-0.443406}, + {0.544548,0.943069}, + {1.785252,-0.261154}, + {2.075199,-0.129452}, + {0.294332,0.738836}, + {-0.488866,1.007274}, + {-0.503534,-1.208814}, + {-0.422143,0.460624}, + {-0.695711,1.140055}, + {-0.298145,0.028151}, + {-0.530038,0.012494}, + {1.063207,0.272223}, + {0.307094,-0.925566}, + {-0.396384,-0.079196}, + {-0.264129,-0.690633}, + {0.342815,1.176028}, + {0.208513,0.031339}, + {1.092949,-1.279019}, + {-0.182367,1.458113}, + {0.459643,0.537035}, + {-1.422746,-0.199628}, + {0.120842,0.431555}, + {0.120487,0.860370}, + {0.880075,-1.318327}, + {-0.918494,-0.508262}, + {1.039805,-0.397278}, + {-1.116948,-0.764242}, + {-0.648588,0.086831}, + {-0.310475,0.435516}, + {0.627558,-0.763336}, + {-0.357348,1.121826}, + {-0.261118,-0.210469}, + {0.566079,0.338734}, + {0.732632,-0.864559}, + {-0.031237,-0.416613}, + {-0.486114,0.440274}, + {1.080200,0.451333}, + {0.411008,-0.914379}, + {1.630417,-0.573224}, + {1.789973,-0.128818}, + {-1.282816,-0.068424}, + {0.649218,-0.044922}, + {0.219130,0.525529}, + {-0.370677,-0.053050}, + {1.003421,-0.883361}, + {-0.342108,-0.405991}, + {0.559990,0.090486}, + {-0.819193,1.397662}, + {-0.712352,0.014975}, + {0.372887,0.809808}, + {0.368211,0.098352}, + {0.107715,0.035441}, + {-1.024098,0.171511}, + {-1.378939,-0.282636}, + {-0.515788,0.376429}, + {0.019939,0.105386}, + {-0.458813,-0.083868}, + {-0.496787,0.049241}, + {0.463699,0.772761}, + {-0.261173,1.395466}, + {-0.700428,-0.454140}, + {0.203633,0.129327}, + {0.688547,-0.064068}, + {-0.286357,-0.615908}, + {1.006754,-0.251008}, + {0.233480,0.634520}, + {0.098067,-0.799585}, + {0.531663,1.047693}, + {-0.357639,0.643432}, + {-0.454815,-1.314132}, + {0.024120,0.533402}, + {-0.411249,-1.147575}, + {-0.478917,0.650582}, + {0.527923,-0.220407}, + {0.760079,-0.003595}, + {-1.436180,1.015680}, + {0.226704,0.663645}, + {-0.045143,-0.061152}, + {-0.302953,0.503048}, + {-1.017092,-0.028102}, + {-0.437520,-0.181724}, + {0.691820,0.557386}, + {0.481078,0.854929}, + {0.210535,-0.105821}, + {0.309759,1.545655}, + {-0.118720,-0.106134}, + {-0.491147,0.073132}, + {-0.315558,1.304714}, + {-0.069603,-0.566994}, + {-1.420324,-0.302228}, + {-0.001001,-0.159619}, + {0.538514,-0.717943}, + {-0.023256,0.486612}, + {0.961986,-0.094342}, + {1.390177,1.690547}, + {0.060921,-0.573038}, + {1.227780,-1.614966}, + {0.860354,0.141537}, + {-0.673537,-0.182732}, + {-0.394389,0.486924}, + {0.189958,-0.299760}, + {-0.187816,0.758961}, + {0.930850,0.838789}, + {0.532089,0.052800}, + {1.183978,0.043238}, + {0.000885,1.006165}, + {0.652237,-0.033242}, + {-0.062365,0.853989}, + {0.074019,1.062932}, + {0.548674,1.299869}, + {0.635525,0.892433}, + {1.040413,-0.904244}, + {-0.637131,-1.220854}, + {-0.178723,0.705191}, + {0.679517,-1.054694}, + {0.050417,0.463792}, + {-0.432476,-0.705006}, + {0.479097,-1.050954}, + {0.759427,-0.851752}, + {1.022693,-0.592958}, + {-1.062087,0.416080}, + {0.240269,-0.546121}, + {0.721674,0.787447}, + {0.390897,0.893822}, + {-1.344788,-0.366112}, + {-0.388957,1.529754}, + {-0.410491,-0.551688}, + {0.059600,0.157555}, + {0.589211,0.635496}, + {1.524161,-0.681505}, + {0.382074,0.694384}, + {0.184238,-1.242472}, + {-1.872358,0.314061}, + {0.197887,-0.051333}, + {0.134921,1.052766}, + {0.262707,0.571038}, + {0.217454,1.533922}, + {-0.473612,1.565367}, + {-0.430548,-0.327960}, + {2.456992,0.326251}, + {-0.249071,-1.096478}, + {1.629764,0.016947}, + {-0.311299,-0.966789}, + {-0.271977,0.129707}, + {0.570742,0.441806}, + {-0.663392,-0.189752}, + {-0.657755,-0.378028}, + {-0.289619,0.178035}, + {-1.547191,-1.379442}, + {0.318863,0.097885}, + {-0.133141,-0.867632}, + {1.709726,-0.325249}, + {-0.859378,-1.097579}, + {-0.824774,-1.066003}, + {0.667650,-0.896375}, + {0.771396,0.193745}, + {0.187997,0.834902}, + {0.264365,-0.077232}, + {-0.205345,-0.363629}, + {0.785119,0.128526}, + {-0.691053,-0.612586}, + {0.013257,-0.052083}, + {0.825087,0.514926}, + {-0.296533,0.266757}, + {0.172197,-1.001242}, + {-0.096571,0.384834}, + {0.009580,-0.143642}, + {-0.430595,0.227296}, + {0.246564,-0.054633}, + {-0.094468,-0.110370}, + {-0.692380,0.378773}, + {-0.199042,-1.555449}, + {0.505427,0.687997}, + {0.449979,0.039450}, + {0.393759,-0.881240}, + {1.174371,0.587504}, + {-0.022562,-0.094548}, + {0.799280,-1.480472}, + {0.041460,-1.331186}, + {-0.092273,-0.056904}, + {1.089637,1.394368}, + {0.377098,-0.286844}, + {-1.518074,0.303598}, + {-0.424125,-0.919862}, + {0.735314,0.790515}, + {-0.419136,-0.537595}, + {-0.224393,-1.089326}, + {-0.932735,0.204017}, + {-1.046173,-0.492433}, + {0.530493,-0.892328}, + {-1.605953,-0.056949}, + {-0.082756,-0.072003}, + {-0.273932,-0.025963}, + {-0.800355,0.314344}, + {0.072312,0.478394}, + {0.398293,0.285516}, + {-0.548830,0.122373}, + {-0.168767,0.843687}, + {-0.270897,1.661998}, + {-1.170453,-0.201107}, + {-0.475110,-0.145280}, + {1.305465,-0.282810}, + {-0.315642,0.100244}, + {-0.086178,1.029969}, + {0.615427,0.779651}, + {-0.207107,0.112033}, + {1.324170,-0.301879}, + {0.970426,-0.300709}, + {-0.051026,-1.504892}, + {-0.710653,0.471644}, + {-0.246991,0.815189}, + {0.603725,0.395888}, + {0.287185,-0.903460}, + {0.542505,-0.034145}, + {0.491362,0.846853}, + {-0.795065,-0.413406}, + {-0.094830,-1.353670}, + {0.848408,-0.279441}, + {0.423856,-0.773367}, + {0.223410,-0.744911}, + {-0.290439,0.138562}, + {0.179655,-0.293731}, + {0.963360,1.602055}, + {-0.162586,-0.561803}, + {0.690172,-0.162130}, + {-0.056525,-0.217605}, + {0.406531,-1.570055}, + {-0.214027,1.317937}, + {-1.324464,0.041843}, + {0.524061,0.463133}, + {-0.308113,-0.660500}, + {-0.045374,0.866035}, + {-1.375194,-0.346669}, + {-0.241115,-1.057360}, + {1.046871,1.007542}, + {-1.538573,-0.349429}, + {-1.296515,0.500255}, + {-0.319061,1.182597}, + {0.822835,1.088292}, + {-0.242570,0.808708}, + {-0.741186,-0.287133}, + {-0.043203,-0.170825}, + {0.086436,1.296764}, + {0.039347,0.444439}, + {-0.452934,0.019311}, + {0.165106,0.678114}, + {0.077917,0.386698}, + {-0.827517,0.531529}, + {0.008533,0.559169}, + {0.779173,-1.106132}, + {-0.141012,-1.305121}, + {-0.017937,0.457808}, + {1.289752,0.160765}, + {0.540358,1.399083}, + {-0.512611,0.568784}, + {-0.648622,-0.300842}, + {-0.293245,1.682090}, + {0.675206,0.479373}, + {-0.247437,0.127139}, + {0.385699,-1.137733}, + {0.734392,0.440471}, + {-1.045057,-0.228324}, + {0.556728,-0.598054}, + {-0.283752,-0.097712}, + {-0.555117,0.220327}, + {0.850535,0.713509}, + {-0.187237,-0.137412}, + {-0.069355,-0.705473}, + {0.514740,-0.842808}, + {-0.680879,-0.366539}, + {0.249006,-0.335864}, + {-0.098391,0.639156}, + {0.171737,-0.709357}, + {-0.443634,-0.636049}, + {1.088524,0.709373}, + {1.223219,-0.602659}, + {1.372139,-0.120711}, + {0.934723,0.998017}, + {-0.627598,0.214279}, + {1.030711,-0.173404}, + {0.136914,0.142240}, + {-0.703009,-1.393580}, + {0.296772,-0.271707}, + {-0.650348,0.475265}, + {0.681210,-0.614719}, + {-0.063976,0.173702}, + {0.927263,-0.034156}, + {0.436673,0.433596}, + {-0.011766,0.233163}, + {-0.461304,-2.176818}, + {-0.555505,-0.395928}, + {-0.121968,-0.515902}, + {-0.078036,-0.661705}, + {0.922070,-1.399317}, + {0.438197,-0.410533}, + {0.889117,2.238643}, + {-0.109874,-1.599532}, + {-0.122962,-0.682850}, + {-1.305958,-0.154182}, + {0.431402,1.018367}, + {-0.143377,-0.893054}, + {0.560765,-0.446487}, + {0.753484,-0.241121}, + {-0.967923,0.257292}, + {-0.119665,-1.032914}, + {-0.991815,0.479675}, + {-0.629275,0.847630}, + {0.721789,0.636400}, + {0.977668,-0.039434}, + {0.187379,-0.387067}, + {-0.314152,0.141318}, + {-0.817531,0.628117}, + {-0.923341,-0.167044}, + {-0.155868,-0.084994}, + {-0.686082,-0.206933}, + {0.021763,-1.069100}, + {0.091063,-0.184178}, + {-0.307996,-0.942727}, + {0.036592,0.643156}, + {-0.299491,1.314708}, + {-0.149338,-0.041127}, + {-0.365165,0.727747}, + {-0.591302,-0.009641}, + {-0.511106,0.790851}, + {-0.008839,-0.298441}, + {0.450988,-0.963904}, + {-0.043228,-0.140045}, + {0.622787,-0.480381}, + {1.330465,-0.430632}, + {0.237069,0.372814}, + {0.013612,0.660065}, + {-0.005838,0.638106}, + {0.099138,0.487362}, + {-0.462270,0.760901}, + {-0.039276,-0.367186}, + {-0.849389,0.963066}, + {0.260960,-0.760724}, + {-0.017266,-0.504135}, + {0.468009,0.090059}, + {1.015524,0.512994}, + {0.320663,-0.586802}, + {1.320691,-0.542734}, + {-0.662519,-0.014055}, + {-0.297684,-0.044484}, + {-0.799770,-0.356844}, + {-0.382747,0.640791}, + {-0.656885,0.305997}, + {0.114703,-0.966648}, + {0.136089,-0.769987}, + {0.032134,-0.482388}, + {0.164098,-0.131159}, + {0.378416,0.078075}, + {-0.221686,1.091587}, + {-0.103693,0.709294}, + {-0.345252,-0.305954}, + {1.203122,-0.260458}, + {0.793078,-1.844025}, + {0.052521,0.691232}, + {0.327413,1.180506}, + {0.000942,-0.045549}, + {0.500746,-0.800283}, + {-0.118962,-0.269397}, + {0.302711,-0.955327}, + {-0.451537,-0.663640}, + {-0.783589,-0.143810}, + {0.777130,0.550576}, + {-1.296793,-0.096188}, + {0.156387,1.318119}, + {-0.441793,0.789109}, + {0.098510,-0.721234}, + {1.144887,0.174284}, + {-0.628743,1.542204}, + {-0.746915,-1.002669}, + {0.640209,1.564354}, + {-0.042800,0.694716}, + {-1.546423,0.892586}, + {-0.302209,1.431112}, + {-0.691142,0.333508}, + {-0.429388,-1.099203}, + {1.047799,-0.141377}, + {-0.835629,-0.419429}, + {-0.395704,0.291504}, + {1.169077,-0.006899}, + {-0.000406,-1.023570}, + {-0.005843,0.363119}, + {-0.830499,-0.161589}, + {-0.049930,0.150634}, + {0.110034,0.489642}, + {0.229673,-0.090654}, + {0.628243,1.472188}, + {-0.426285,-0.014405}, + {0.704156,-0.031663}, + {1.408712,-0.223024}, + {-0.310124,0.322176}, + {1.341750,-0.011950}, + {-0.475503,-0.217211}, + {-0.322988,0.045987}, + {-0.293056,0.205099}, + {-0.120599,-0.231858}, + {-0.145756,-1.419736}, + {0.586338,0.525593}, + {-0.107314,0.053626}, + {-0.592978,-0.037145}, + {-1.158385,-1.045554}, + {0.119389,0.728346}, + {1.574950,-0.490199}, + {-0.282055,-0.229629}, + {0.168220,0.641829}, + {0.215137,0.436435}, + {-1.469822,-1.022768}, + {0.122827,-0.355324}, + {0.340368,0.460545}, + {-0.133655,-0.013018}, + {-0.214706,-0.229367}, + {1.137280,-0.600999}, + {-0.774999,-1.178053}, + {1.518943,1.058591}, + {0.407081,-0.502228}, + {-1.241990,0.417551}, + {0.014212,0.382705}, + {1.079171,0.037512}, + {1.449532,-0.035599}, + {-0.342860,0.119856}, + {-0.203089,1.758978}, + {0.892215,-0.343795}, + {-0.742509,-0.990385}, + {0.467033,-0.033716}, + {0.478131,-0.642241}, + {1.344997,-0.160438}, + {-0.420145,0.331979}, + {-0.652954,0.592996}, + {-0.495241,0.174791}, + {0.187080,-0.257417}, + {-0.382043,-0.147167}, + {0.529967,0.430835}, + {0.479963,-0.054450}, + {-0.878576,0.171068}, + {0.128695,-0.437802}, + {-0.715424,-0.054429}, + {-0.735767,1.208460}, + {0.913745,0.145152}, + {-0.901428,0.263530}, + {-0.108728,1.211707}, + {0.869162,1.245237}, + {1.346936,0.981211}, + {0.064847,-0.378967}, + {0.076235,1.113281}, + {-0.158075,-0.350806}, + {-0.830559,0.718345}, + {0.165189,0.659124}, + {0.566927,-0.057358}, + {-0.256642,0.501692}, + {-0.496891,0.558987}, + {0.314791,1.531419}, + {-0.105210,-0.967250}, + {0.340576,0.711382}, + {-1.141627,-1.066447}, + {-0.110436,-0.387441}, + {0.079143,-0.720602}, + {0.166833,0.239506}, + {-0.442205,-0.338438}, + {0.483370,0.156757}, + {0.693114,0.276451}, + {-0.183391,0.020851}, + {0.204206,-0.677262}, + {0.689076,0.309579}, + {-0.481239,-0.584827}, + {-0.933420,-0.491870}, + {-0.520784,-0.281925}, + {1.692787,-0.862935}, + {0.974295,-0.065542}, + {0.013460,-0.253194}, + {-0.484361,0.487765}, + {1.102883,-0.797744}, + {1.017178,-0.706175}, + {-0.306430,0.465774}, + {0.652186,0.377622}, + {-0.509788,-0.117614}, + {-0.182832,0.281499}, + {-0.243806,-0.608884}, + {-0.812188,1.031517}, + {-0.318785,-1.096473}, + {-0.753378,0.448524}, + {0.190946,0.805434}, + {1.315679,0.386423}, + {0.517649,-0.029638}, + {0.005505,0.303030}, + {0.245582,-0.056264}, + {-1.003810,0.352134}, + {0.145024,0.704185}, + {0.462317,0.143256}, + {0.942234,0.897553}, + {-0.215521,-0.331736}, + {-0.486441,-0.282984}, + {-0.132013,-0.653772}, + {0.703166,-0.978950}, + {1.265242,-0.730936}, + {0.541313,-1.092878}, + {-0.426889,-0.709462}, + {0.358945,-0.092949}, + {1.287703,-0.466656}, + {-0.029177,-0.528144}, + {-1.262047,-0.156719}, + {1.119061,-0.140010}, + {0.744231,1.364940}, + {-1.477712,0.677879}, + {1.394701,0.568561}, + {-0.709296,1.089103}, + {-1.084068,1.032923}, + {0.692925,-1.436255}, + {-0.583488,0.006146}, + {-0.096832,0.481081}, + {0.065004,-0.486029}, + {0.870241,-0.777612}, + {-0.485691,1.334895}, + {1.654056,-0.558402}, + {-0.123607,-0.634878}, + {-0.327436,-0.483555}, + {-0.308836,0.238801}, + {0.997275,0.372461}, + {1.298622,-0.350636}, + {0.054553,-0.251766}, + {-0.663848,0.096227}, + {-0.414783,-0.476282}, + {0.017994,-0.596242}, + {0.073553,0.224045}, + {-0.017235,-0.787626}, + {-0.513162,-0.883175}, + {0.296796,-0.667669}, + {0.609890,0.396096}, + {-0.429109,0.719473}, + {1.004360,-0.399219}, + {-0.729476,-0.121898}, + {0.495306,0.262692}, + {-0.113961,-0.354866}, + {-0.397658,0.111103}, + {0.772712,0.034410}, + {1.351640,-0.201355}, + {-0.632191,-0.828298}, + {-1.263127,-0.771645}, + {0.439372,-1.090465}, + {0.360964,-0.050497}, + {0.347296,-0.241183}, + {0.779991,1.223795}, + {-0.304319,0.532105}, + {0.438098,0.404655}, + {-0.851470,-0.274463}, + {-0.456542,0.692725}, + {-0.246019,0.385583}, + {0.191244,0.619761}, + {-1.086195,0.003533}, + {0.904869,0.542475}, + {0.998638,0.170402}, + {-0.706807,-0.315809}, + {0.166527,-0.172701}, + {-1.000581,-0.025441}, + {-0.835619,1.640966}, + {0.465558,-0.261938}, + {-0.312499,1.039515}, + {0.963936,0.325342}, + {-0.691905,-1.644457}, + {0.352920,-1.072839}, + {0.628098,0.001310}, + {0.081833,0.343911}, + {0.014168,0.756927}, + {-0.973338,-0.558293}, + {-0.871959,-0.104032}, + {-0.002001,-0.006319}, + {1.286904,-0.201689}, + {0.244030,1.578598}, + {-0.616804,0.274645}, + {-0.318141,0.335599}, + {-0.697360,-0.095197}, + {0.011818,-0.863732}, + {-0.138582,-0.019176}, + {-0.725250,-0.217377}, + {-0.875897,0.417330}, + {-0.319059,0.539565}, + {-0.482789,-0.312334}, + {0.409422,1.158154}, + {-0.015202,0.405469}, + {0.566499,-0.239419}, + {-0.048926,-0.333125}, + {0.123632,-0.575811}, + {-0.737014,1.050065}, + {-0.498796,-0.462582}, + {1.103683,-1.514551}, + {-0.494598,-0.326410}, + {-0.197300,0.386700}, + {0.062856,0.241676}, + {1.540076,0.134030}, + {0.167199,0.718623}, + {1.460202,0.168436}, + {-0.151115,1.190752}, + {-1.605562,-0.849851}, + {-0.182316,0.843664}, + {0.063442,-0.632068}, + {0.600120,-1.467388}, + {-0.214057,0.008288}, + {-0.591725,0.015858}, + {0.426621,-0.467059}, + {0.308007,-0.521593}, + {0.187186,0.432812}, + {0.771873,-0.797405}, + {-1.666113,-0.612908}, + {0.662923,-0.640449}, + {0.418502,0.839952}, + {0.567399,1.411843}, + {1.409143,0.943162}, + {0.272974,0.334327}, + {-0.194930,-0.042914}, + {-0.656420,0.632150}, + {-1.041831,0.166806}, + {0.747201,0.813639}, + {0.281704,0.944374}, + {1.358369,0.491507}, + {0.367469,-0.875805}, + {-0.422513,0.169091}, + {1.285167,0.685694}, + {0.330428,-0.193560}, + {0.299608,0.675410}, + {-0.270314,-0.081031}, + {0.064389,1.581159}, + {-0.222432,-0.019499}, + {0.426707,0.157563}, + {0.722662,-0.647789}, + {0.242988,0.714443}, + {0.748898,-0.308079}, + {-0.016544,0.354901}, + {-0.997099,-0.209123}, + {-0.235030,-0.400691}, + {-0.203206,1.099828}, + {0.142727,0.095450}, + {-0.341516,0.326233}, + {0.095229,0.019195}, + {-0.660175,0.112390}, + {0.905233,-0.514587}, + {0.319161,-0.949665}, + {-0.405405,-2.149487}, + {0.208820,0.999381}, + {-0.315606,1.516585}, + {-0.641859,-1.688719}, + {0.964642,-0.657701}, + {0.065903,-0.060402}, + {-0.026539,-0.681936}, + {-0.614921,-0.563590}, + {0.246976,-0.939397}, + {0.385899,0.281023}, + {-0.094005,0.848061}, + {-0.169226,0.774612}, + {-0.724207,0.299136}, + {-1.194411,-0.024786}, + {0.882686,-0.287766}, + {-0.483190,-0.806528}, + {-0.483338,0.922785}, + {0.041603,0.257413}, + {0.498249,0.308889}, + {0.634894,-0.438796}, + {0.295743,-0.624397}, + {0.071996,0.006979}, + {-0.372322,-0.699701}, + {-0.914731,1.474448}, + {-0.027933,-0.761139}, + {-0.295425,-0.913413}, + {1.158772,-0.605934}, + {-1.099764,1.238334}, + {0.225717,-0.107705}, + {-0.060501,-0.133608}, + {-1.004261,-0.846772}, + {1.353121,0.234258}, + {0.115511,-0.813911}, + {-2.526341,-0.552748}, + {0.628997,0.483053}, + {-0.185551,0.719097}, + {1.038135,-1.267809}, + {-0.807875,-0.433980}, + {-0.095644,0.352912}, + {-0.401847,0.180421}, + {0.326983,-0.414106}, + {-0.700716,-0.454423}, + {1.753344,0.341367}, + {-0.495613,0.589827}, + {0.795817,-0.022842}, + {-0.921182,-0.686602}, + {-1.692668,-0.029685}, + {-1.122250,-0.221354}, + {-0.588052,1.370316}, + {0.988746,-0.162050}, + {-0.653970,-0.824491}, + {0.362938,-0.445459}, + {1.171398,-0.033829}, + {-0.128480,0.441175}, + {-0.102669,-0.405796}, + {1.815588,-0.843343}, + {-0.009833,-0.493984}, + {-0.949789,1.129682}, + {0.396000,0.520610}, + {0.793786,-1.116647}, + {0.245421,-0.634161}, + {-1.542438,0.723155}, + {-0.983627,-0.634587}, + {0.325658,0.423862}, + {0.686591,0.678101}, + {0.840170,1.189774}, + {-0.124161,0.328021}, + {-0.670110,0.306719}, + {-0.647672,-0.390379}, + {-0.799760,-0.896996}, + {0.791386,0.183740}, + {-0.999459,0.290365}, + {0.108208,0.682826}, + {0.722602,-0.063568}, + {0.675050,-0.417068}, + {0.049737,-0.626277}, + {-0.091161,-0.152698}, + {-0.169368,-0.424080}, + {0.965155,1.073006}, + {0.875146,0.371974}, + {0.027511,-0.094845}, + {0.046664,-0.034023}, + {0.088000,0.191606}, + {-0.292866,0.357606}, + {0.486410,-0.150151}, + {0.758034,0.769236}, + {0.373728,0.795101}, + {-0.271229,-0.284477}, + {1.579846,-0.350881}, + {-0.201557,0.028050}, + {-0.509997,0.955817}, + {0.452960,0.647232}, + {-0.406892,0.567143}, + {-1.706461,1.360423}, + {0.953890,-0.875465}, + {0.657629,0.021581}, + {-0.129957,-1.226930}, + {-0.302970,-0.942701}, + {0.048147,-0.690086}, + {-0.477384,0.846820}, + {0.024795,1.669001}, + {1.201373,0.130037}, + {0.028444,-0.954818}, + {0.597766,-0.157195}, + {1.257619,-0.713805}, + {-0.793364,0.384184}, + {-1.448279,0.244332}, + {-0.241725,0.023413}, + {-0.834162,-1.002103}, + {-0.092808,-0.130621}, + {0.251400,0.563136}, + {0.142776,-0.576081}, + {0.082036,-0.836429}, + {0.477424,-0.233922}, + {0.592498,-0.708705}, + {-0.092424,-0.165077}, + {0.961011,-0.437526}, + {-0.040373,-0.007315}, + {0.151106,0.495559}, + {-0.791185,-0.172713}, + {0.532989,-0.116812}, + {0.323417,-0.257345}, + {-1.564697,1.408229}, + {-0.721557,1.018666}, + {0.590124,-0.231628}, + {0.771734,-0.400268}, + {-0.051036,0.575551}, + {-0.045053,-0.822877}, + {0.870412,0.425655}, + {-0.252330,-0.444619}, + {-0.101144,-0.403048}, + {-0.027262,1.535667}, + {-0.641673,-0.519516}, + {0.738704,0.547992}, + {0.168648,-0.151548}, + {-1.710591,0.257789}, + {-0.092677,0.346082}, + {-0.338101,0.082259}, + {-0.050333,-0.211235}, + {-0.699288,-0.374695}, + {-0.591992,1.089774}, + {0.627032,-0.226781}, + {-0.162334,0.632005}, + {1.473994,-0.687098}, + {-0.034147,-0.046207}, + {1.689347,0.546087}, + {-0.064003,0.303521}, + {0.024821,-0.361900}, + {0.625408,0.536032}, + {0.859899,-0.542843}, + {-0.768487,0.655731}, + {0.156214,0.442436}, + {-0.920403,-0.423091}, + {0.288070,-0.057672}, + {0.835439,-0.025869}, + {0.486492,-0.403805}, + {-0.670555,-0.015233}, + {0.202429,-0.231184}, + {0.368462,0.045512}, + {-0.759523,-0.656840}, + {-0.306825,-1.845469}, + {-1.126798,0.416730}, + {0.253965,-0.048144}, + {0.573909,0.256679}, + {-0.077506,0.902226}, + {0.106140,-0.161830}, + {0.944351,-0.103539}, + {0.996280,0.024614}, + {-0.437475,-0.095610}, + {1.605320,0.269590}, + {-0.030932,0.428579}, + {0.298472,-0.901861}, + {-0.459703,-1.415808}, + {-1.427354,-0.827994}, + {-0.668940,-0.453174}, + {0.081398,-0.075764}, + {0.449178,0.115437}, + {1.319972,0.180253}, + {0.214731,-0.518376}, + {0.401389,-0.697856}, + {-0.966804,-0.086393}, + {0.091583,0.256263}, + {0.121284,-0.390260}, + {0.682460,0.337722}, + {-0.528372,-0.012843}, + {0.535463,0.220828}, + {-0.207327,-0.002275}, + {0.032177,-1.481349}, + {-1.046740,0.503154}, + {0.990748,-1.593273}, + {-0.395646,0.419805}, + {0.309283,-0.466387}, + {1.107873,0.046100}, + {0.557575,0.602810}, + {-0.973449,-0.826520}, + {1.174536,-0.115438}, + {0.270087,-0.056070}, + {0.301369,-1.259042}, + {0.176198,0.039041}, + {0.685912,-1.168439}, + {0.868333,0.870309}, + {0.428619,-0.314340}, + {-0.605176,-0.019613}, + {0.551734,0.028005}, + {0.967593,-0.636688}, + {0.282477,0.393573}, + {0.681596,-0.537855}, + {0.080952,0.362344}, + {1.080137,-1.004045}, + {-0.121193,-0.497869}, + {0.873317,-0.001814}, + {-0.626031,-0.544039}, + {0.108145,-0.684680}, + {-0.563032,-0.925852}, + {0.979941,-0.514612}, + {-0.608938,0.633467}, + {-0.053909,0.182506}, + {-0.043155,1.357664}, + {-0.258396,0.276981}, + {-0.273572,-0.131251}, + {-0.146091,-0.601641}, + {-0.285407,-0.362421}, + {-0.145943,-0.085332}, + {1.246647,-0.702939}, + {0.000929,-0.146198}, + {0.426066,0.520638}, + {-0.385219,-1.726361}, + {0.895211,0.932719}, + {1.007455,-1.259203}, + {-0.192862,0.700090}, + {-0.229940,0.047657}, + {-0.530813,-0.440148}, + {-0.611116,-0.509634}, + {-0.580100,0.142553}, + {0.614953,0.098769}, + {1.398503,0.775546}, + {-0.541719,-1.671509}, + {-0.241597,1.020908}, + {-1.077532,-0.515526}, + {0.655762,0.775059}, + {-0.765450,-1.239293}, + {0.962747,-0.806323}, + {-0.609721,0.251087}, + {0.050378,-0.384786}, + {0.848758,0.698701}, + {2.116104,1.231120}, + {0.111879,-0.017177}, + {-0.687465,-0.181288}, + {-0.675059,-0.418819}, + {0.279545,-0.339861}, + {-0.599722,0.492495}, + {0.684005,-0.397453}, + {0.147776,-0.639692}, + {0.097598,-0.641184}, + {0.081977,0.034408}, + {-1.362164,0.108665}, + {0.163552,-1.671503}, + {0.040631,-1.212350}, + {0.291558,0.657082}, + {-0.295903,-1.140027}, + {-0.376469,1.434394}, + {0.423132,1.500112}, + {0.939533,0.706458}, + {-0.723371,0.467943}, + {0.734789,-1.367821}, + {-0.286426,-0.430950}, + {0.741645,0.202610}, + {-0.474269,-0.383443}, + {-0.111238,-1.258131}, + {0.660971,-0.293692}, + {-1.682554,0.395094}, + {-0.315600,1.396362}, + {-0.537842,0.199873}, + {-0.495910,1.133647}, + {-0.202967,0.311606}, + {0.956309,1.302041}, + {0.014266,1.520439}, + {-0.219412,0.174062}, + {-0.681151,-0.951635}, + {0.404607,1.513381}, + {0.416153,0.210891}, + {0.142163,0.694091}, + {0.076219,0.460826}, + {-1.083648,1.037683}, + {0.270994,0.354254}, + {0.986873,2.149951}, + {0.393861,0.989633}, + {0.688971,0.339303}, + {0.071278,0.056799}, + {-1.016039,-0.020912}, + {-1.334468,-0.536643}, + {0.734131,-0.538999}, + {0.610162,-0.467191}, + {0.178098,0.248881}, + {1.107075,0.903290}, + {0.067019,0.376517}, + {0.063519,0.307756}, + {0.222092,0.047481}, + {-0.642008,1.339605}, + {-1.434671,0.390346}, + {-0.286363,-1.096375}, + {0.528233,-0.114303}, + {0.002839,-0.363739}, + {0.081966,0.477424}, + {-0.745078,-0.212704}, + {0.262151,-0.629614}, + {0.650702,0.297788}, + {-0.360384,0.654797}, + {-1.210552,0.346825}, + {-1.123528,0.141074}, + {0.254125,0.134089}, + {-0.854449,-1.272994}, + {0.503444,0.407784}, + {-0.063343,0.002590}, + {-1.217891,0.297324}, + {1.362821,-0.092500}, + {-0.620024,-0.181695}, + {-0.583878,-0.087572}, + {-0.077708,-0.591811}, + {0.407316,0.210572}, + {0.370971,-1.195471}, + {-0.299583,1.320451}, + {0.203216,0.646346}, + {0.366164,0.909438}, + {0.203023,0.338926}, + {0.886110,-0.616392}, + {0.123373,-0.265751}, + {1.002188,-0.721736}, + {-0.087786,-0.162014}, + {-0.147706,-0.257366}, + {0.138837,0.156403}, + {-0.935765,-0.897313}, + {0.145589,0.934317}, + {-1.257050,0.339883}, + {-0.640691,-0.497094}, + {0.249565,0.324230}, + {0.429013,-0.807024}, + {0.951042,-0.750363}, + {-0.233908,0.322168}, + {-0.155345,-0.058620}, + {-0.923954,1.122193}, + {0.575643,0.585440}, + {0.020598,1.436937}, + {-0.091407,-0.699294}, + {0.578322,1.106103}, + {-0.103452,-0.119980}, + {1.023561,0.237926}, + {-0.294089,-0.806202}, + {0.353528,-0.555679}, + {-0.047433,-0.322646}, + {1.165529,0.140760}, + {-0.792405,-0.115971}, + {-1.054716,-1.248429}, + {-0.445960,-0.522722}, + {-0.535668,-0.623538}, + {1.871897,0.379341}, + {-0.602944,0.291409}, + {0.163383,-0.302622}, + {-0.434323,-0.137421}, + {-0.350281,0.083213}, + {0.871609,-0.841751}, + {0.975364,-0.601977}, + {0.494758,0.224624}, + {0.242478,0.421058}, + {0.232225,-1.453569}, + {0.414761,0.849492}, + {0.604876,0.053472}, + {0.281405,-0.468279}, + {-0.722334,-0.651553}, + {0.212448,0.783791}, + {0.338838,0.566970}, + {0.968908,0.412173}, + {-0.818738,1.184692}, + {-0.942716,1.063357}, + {0.156179,-0.884947}, + {0.275563,-0.824764}, + {0.161075,0.512591}, + {-0.063483,-0.132659}, + {0.244437,0.539625}, + {-1.022381,0.103652}, + {-0.191213,0.245448}, + {1.202137,-0.341605}, + {-0.830870,0.088173}, + {-0.376038,-1.505356}, + {-0.132499,-0.483134}, + {1.405172,-0.388605}, + {-0.731394,-0.474684}, + {0.424459,1.084378}, + {0.569630,-0.465403}, + {0.342360,0.588034}, + {0.530620,0.584731}, + {0.465075,0.367666}, + {0.476078,-0.835102}, + {0.325328,0.098233}, + {-0.588893,0.045396}, + {0.190879,0.254040}, + {0.743863,1.485769}, + {0.092567,0.772116}, + {-0.316621,0.345606}, + {-0.782686,-0.306573}, + {-0.034863,-0.764078}, + {0.087823,1.095970}, + {0.006421,0.475137}, + {-0.539624,1.058665}, + {-0.112003,-0.421538}, + {0.814427,-2.240315}, + {0.297667,0.029955}, + {0.387983,0.365167}, + {-0.512255,0.697944}, + {-1.002389,-1.053748}, + {0.785925,-0.982717}, + {0.513858,-0.382507}, + {-0.739047,0.720458}, + {0.563904,-0.592574}, + {0.269190,-0.290482}, + {-0.443868,1.120572}, + {-1.130339,0.430364}, + {0.653121,-1.146882}, + {-0.143795,-0.395516}, + {-0.601965,0.136010}, + {0.108440,-1.108889}, + {-0.633592,-0.202239}, + {-0.057448,0.917590}, + {-0.339216,0.038929}, + {-0.236586,0.236913}, + {0.250535,0.573183}, + {-1.205567,-0.151059}, + {0.435760,0.422565}, + {0.195745,-0.511377}, + {1.127967,-0.973948}, + {0.989271,-1.392772}, + {0.135742,0.374199}, + {-0.344161,0.674263}, + {-0.011739,-0.360829}, + {-1.431782,0.085627}, + {-0.120657,0.501635}, + {0.750871,0.035088}, + {-0.415468,-0.782156}, + {0.295173,0.275036}, + {-0.601768,0.944578}, + {-0.818800,-0.499709}, + {0.750934,0.255211}, + {0.011539,-0.207586}, + {-0.059063,0.577347}, + {0.027127,0.182079}, + {0.058243,0.931415}, + {-0.671812,0.744172}, + {0.645644,0.221537}, + {-0.870574,-0.487558}, + {1.078105,0.615241}, + {-0.212722,-0.339828}, + {1.044228,-0.140719}, + {0.507397,-0.046622}, + {-0.034885,-0.440408}, + {0.752870,2.271021}, + {-0.581907,-0.235032}, + {-0.322662,-0.221511}, + {0.415694,1.662084}, + {0.145703,-0.397409}, + {0.254030,0.000521}, + {-0.087437,-0.980333}, + {0.227735,-0.592052}, + {-1.659078,1.444394}, + {0.165351,0.893154}, + {0.143596,-1.051117}, + {-0.150326,-0.227989}, + {-0.176142,-2.753715}, + {-0.304719,-1.679630}, + {0.142689,1.087978}, + {-0.017008,-1.616949}, + {-1.541590,0.163136}, + {-0.310240,-0.896758}, + {-1.275426,0.756192}, + {1.243312,-0.449887}, + {1.116768,0.875750}, + {-0.707965,0.070670}, + {0.913211,-0.140092}, + {-0.979090,0.451250}, + {-0.864155,-1.828690}, + {0.921171,0.476562}, + {0.355440,0.234661}, + {-0.524266,0.329766}, + {-0.358736,-1.603375}, + {-0.648495,0.757445}, + {0.418951,0.216528}, + {-0.427809,-0.403671}, + {0.337321,-1.387978}, + {1.655019,-0.215407}, + {0.451075,-0.095607}, + {-0.244406,0.146289}, + {-0.137790,0.167550}, + {0.630097,0.525331}, + {1.207748,0.306192}, + {0.281222,2.135639}, + {1.263418,-0.404728}, + {-0.462965,-0.321707}, + {-0.502160,-0.109373}, + {0.267206,0.604009}, + {-0.095540,-0.133320}, + {-0.518950,-0.011799}, + {0.882133,-0.870423}, + {-0.273993,-0.871520}, + {-0.369624,-0.376413}, + {-0.426616,-1.054248}, + {0.605760,-0.041916}, + {-1.076826,-0.702786}, + {0.262593,0.312531}, + {-0.247497,0.678962}, + {0.286441,-0.227566}, + {-0.090176,-0.850555}, + {-0.613904,-0.323067}, + {-0.479344,0.855193}, + {0.812688,0.259328}, + {-0.397216,-0.922578}, + {0.056809,-0.180688}, + {-1.371158,0.243855}, + {-1.014261,0.371907}, + {0.033020,0.410626}, + {-0.916478,1.112751}, + {0.669737,1.082816}, + {0.431280,-0.142717}, + {0.497122,-0.690756}, + {-0.119205,-0.540953}, + {0.181345,0.682248}, + {0.031749,-0.632391}, + {-0.426867,0.192814}, + {-0.081193,0.403163}, + {0.211498,1.119102}, + {-0.832741,-0.389058}, + {0.687365,0.355030}, + {0.635475,-0.427351}, + {-0.546154,-0.025184}, + {-0.489334,0.302793}, + {-0.652276,-0.513544}, + {1.042010,-0.712245}, + {-1.620305,0.506514}, + {-0.862786,0.428432}, + {0.604738,-0.408423}, + {-0.521311,-0.121360}, + {0.541474,-1.269409}, + {-0.497038,0.414833}, + {-0.241790,-0.086959}, + {-0.152804,-0.480866}, + {-0.370062,1.004085}, + {0.669046,0.066165}, + {-0.781561,0.108622}, + {-0.559473,0.168401}, + {-0.453866,0.541715}, + {-0.674082,0.794643}, + {-1.933105,-0.147404}, + {1.300205,0.575127}, + {0.347053,1.234056}, + {0.029991,1.224125}, + {0.468447,0.084716}, + {0.172597,-0.493143}, + {0.474934,0.314407}, + {-0.641944,-1.460289}, + {-0.397220,1.519256}, + {-0.434311,0.720815}, + {0.309265,0.342057}, + {-1.198355,-0.052924}, + {-0.707677,0.641043}, + {-0.961501,-0.105753}, + {0.041026,-0.219741}, + {0.296451,-0.155747}, + {-0.041502,0.329670}, + {-0.175649,-1.146940}, + {0.291242,-0.629172}, + {0.201876,0.521308}, + {-1.249795,1.396366}, + {0.721736,-0.901069}, + {-0.279288,0.146240}, + {0.057212,-0.542932}, + {0.895544,0.168533}, + {1.243546,0.419985}, + {1.443173,0.998921}, + {1.178023,-0.424663}, + {0.944378,0.694314}, + {0.077267,-0.557875}, + {-0.100770,-0.061053}, + {0.091123,0.783914}, + {0.627541,-0.406884}, + {0.300425,0.129705}, + {1.588361,1.060950}, + {-0.737907,-0.102440}, + {-0.408529,-0.967258}, + {0.409326,-0.583521}, + {-0.252992,0.274365}, + {0.467400,0.293939}, + {0.616506,0.083653}, + {0.069252,0.630033}, + {1.261570,-0.161448}, + {0.980182,0.016625}, + {-0.967191,0.426424}, + {0.974353,0.373262}, + {0.465758,0.406121}, + {0.049765,0.155789}, + {1.019360,1.113022}, + {1.482616,-1.082850}, + {-0.370055,1.170347}, + {-0.914180,-0.076800}, + {0.711749,0.443053}, + {1.000344,-0.911585}, + {-0.685291,-0.007084}, + {0.003534,-1.342957}, + {-0.224481,-0.897010}, + {1.435450,1.058341}, + {0.901816,-1.078478}, + {0.440206,0.310660}, + {-0.440452,1.055084}, + {-0.481999,0.510978}, + {-0.425880,-0.638269}, + {-0.887044,0.737327}, + {0.766324,0.831116}, + {0.474519,0.013742}, + {0.719499,0.072296}, + {0.128751,0.551124}, + {-0.346348,-0.115964}, + {-0.027651,-0.597646}, + {0.459124,0.203102}, + {0.076236,0.050293}, + {-1.070625,1.089285}, + {0.946162,0.643590}, + {0.493112,-0.908918}, + {-0.530798,0.636518}, + {-0.775397,0.649794}, + {0.666540,-0.670376}, + {-0.051724,-1.176117}, + {0.734299,-0.049687}, + {-0.366040,0.690415}, + {-0.363912,-0.763731}, + {0.809317,-0.192377}, + {-0.584942,-0.575854}, + {0.212895,0.318501}, + {-0.229536,-0.564216}, + {0.325465,-0.148910}, + {-1.208239,0.149334}, + {-0.854608,-0.061222}, + {-1.275009,1.356758}, + {0.005121,0.384686}, + {0.540351,-0.968782}, + {0.522470,0.505677}, + {1.606856,0.455340}, + {0.390568,0.183534}, + {-0.517696,0.031122}, + {0.301117,2.578628}, + {-0.301510,-1.216527}, + {-0.342228,-0.046947}, + {-0.348194,0.992603}, + {-0.067880,-0.448626}, + {1.327164,0.245718}, + {-0.452255,-1.409662}, + {0.439151,1.195320}, + {-1.258445,1.550755}, + {-0.487881,1.205291}, + {-0.539438,-0.040513}, + {0.112800,0.659260}, + {0.163991,-0.512811}, + {-0.598902,0.260073}, + {-0.759021,1.076704}, + {-0.850034,-0.410968}, + {0.017091,-0.374513}, + {-1.673326,0.068799}, + {0.965866,-0.779812}, + {-0.058769,-0.720178}, + {-0.055818,-0.470524}, + {-1.050913,0.161955}, + {1.117855,0.191514}, + {1.104705,0.175696}, + {0.367485,-0.458936}, + {0.138570,0.060696}, + {-0.646029,0.418187}, + {0.562371,-0.098041}, + {0.132342,0.156962}, + {0.616000,0.247797}, + {-0.849396,-0.017041}, + {-1.265605,-0.174037}, + {0.263149,0.173862}, + {-0.947393,-0.548476}, + {-0.781072,-1.083780}, + {0.283519,-1.581446}, + {-0.649758,0.090980}, + {0.080903,-0.435490}, + {-0.546066,-0.445276}, + {0.883145,0.033681}, + {-1.438228,-1.592795}, + {-0.929637,0.644398}, + {-0.843645,1.001079}, + {-0.103938,0.314698}, + {-0.882742,0.603233}, + {0.560060,0.672982}, + {0.265318,-0.520901}, + {0.037542,-0.468269}, + {-0.614846,-0.896426}, + {-0.811132,-0.075196}, + {-0.701491,-0.278436}, + {-0.169226,0.555609}, + {0.152666,0.988791}, + {0.155918,-1.638999}, + {-0.029867,-0.008556}, + {0.789905,-0.447722}, + {0.369189,0.638383}, + {0.224741,-0.857948}, + {1.360289,-0.368943}, + {1.012567,-1.472297}, + {0.750105,-0.167508}, + {0.543334,-0.115844}, + {0.551806,-1.337525}, + {1.881674,0.384950}, + {-0.334593,-0.392176}, + {0.568056,0.658811}, + {0.826330,-0.070998}, + {-0.837258,-0.838016}, + {-0.559858,-1.022418}, + {0.141410,-0.739586}, + {-0.910228,-1.581966}, + {-0.196767,-0.383060}, + {-1.084272,-0.459566}, + {-0.639058,0.491458}, + {0.003765,0.880280}, + {1.188473,-0.151647}, + {0.210026,-1.324828}, + {-0.100415,0.512765}, + {0.513964,-0.254631}, + {-0.644200,0.342062}, + {0.783293,0.003817}, + {0.641491,0.529011}, + {0.382460,-0.793553}, + {-0.168696,0.881504}, + {-0.665068,-0.411740}, + {-0.422928,-0.392841}, + {-0.293466,-0.490343}, + {0.174657,0.011203}, + {0.371092,0.692387}, + {0.221498,0.094331}, + {1.040101,-0.724797}, + {-0.594782,-0.235973}, + {0.067611,-1.262378}, + {0.159732,-0.070026}, + {0.643780,-0.804505}, + {0.537444,0.286446}, + {0.032259,-0.725526}, + {-0.348096,1.322484}, + {-0.412691,-0.682603}, + {0.064050,-0.147144}, + {-1.125518,-0.730751}, + {0.100103,-0.336546}, + {0.011121,-1.408579}, + {-0.435174,0.184880}, + {0.216681,0.145450}, + {0.160929,-0.027522}, + {-0.094411,0.775505}, + {0.917143,-0.930427}, + {0.346981,0.563719}, + {-1.570088,-0.176042}, + {-0.151329,-1.215049}, + {-0.517596,-0.556149}, + {1.388624,0.121150}, + {-1.346197,-0.331584}, + {-1.014897,-0.904715}, + {-0.370488,0.625232}, + {0.234481,-0.599066}, + {-0.838492,0.445635}, + {0.570000,0.510314}, + {-0.117676,0.285231}, + {1.428193,0.287780}, + {0.846940,0.133845}, + {1.197855,0.607831}, + {-0.882803,-1.383388}, + {0.034651,-0.574273}, + {0.081993,-1.106833}, + {-0.415176,-0.051580}, + {-0.142726,0.131354}, + {0.705295,0.285068}, + {0.616462,0.274167}, + {0.542851,-0.557143}, + {-0.453895,1.480666}, + {0.389829,0.139984}, + {0.729928,0.418423}, + {0.199777,0.543327}, + {-0.777423,-0.121813}, + {0.544161,1.047456}, + {0.144618,0.189402}, + {-0.330806,-0.839508}, + {-0.386112,0.095356}, + {0.334664,-0.570556}, + {0.688800,0.258836}, + {-0.375194,0.976342}, + {-0.979181,0.389248}, + {0.352754,0.182541}, + {-0.557678,0.183718}, + {0.059676,-0.515850}, + {0.889687,0.384437}, + {0.326761,-0.569045}, + {-0.356064,0.960982}, + {-0.015646,0.537468}, + {0.070428,-0.848307}, + {-0.986289,0.860168}, + {-0.141119,0.141116}, + {0.387450,1.352744}, + {0.898063,0.207277}, + {0.307952,0.280249}, + {-1.091253,-0.645560}, + {1.079365,0.448420}, + {0.318470,-0.047758}, + {-0.664574,0.564786}, + {-0.568208,0.492372}, + {0.143767,0.051228}, + {-0.416511,0.722973}, + {-0.892012,-0.308575}, + {0.361998,-0.008642}, + {-0.497223,-0.648014}, + {0.249791,-0.081327}, + {0.207192,0.128874}, + {-1.025766,-0.510293}, + {0.098964,0.621213}, + {-0.490461,0.631713}, + {-0.448633,1.805053}, + {-0.321075,-0.425673}, + {0.109959,0.748809}, + {-0.636473,0.818729}, + {-0.323787,-0.565485}, + {-0.031436,0.886588}, + {-1.100856,-0.295367}, + {0.013026,1.275442}, + {1.243183,-0.863036}, + {-0.016862,-1.104960}, + {-0.503751,0.059092}, + {-0.428264,-1.092108}, + {0.240446,0.733125}, + {-0.924166,-0.286675}, + {0.081255,0.268827}, + {0.578614,0.267076}, + {0.855698,0.686772}, + {0.694556,0.169285}, + {0.065727,-1.138257}, + {-1.326172,-0.634456}, + {-0.290709,0.244074}, + {0.184962,-0.684550}, + {-0.484932,-0.874069}, + {0.683665,-1.045173}, + {-0.583586,0.853352}, + {-0.817727,-1.045137}, + {-0.661010,-1.251055}, + {-0.369424,0.527159}, + {-1.301217,0.246717}, + {0.143446,0.006156}, + {-0.073755,0.534466}, + {-1.136401,-0.589760}, + {-0.607309,-0.316112}, + {0.335294,-0.448585}, + {-0.574601,0.205810}, + {-0.239630,0.283724}, + {-0.697449,-0.307286}, + {0.071816,0.155103}, + {1.367617,-1.141154}, + {-0.396951,-0.248389}, + {-1.092599,-0.617174}, + {-1.294691,-0.226609}, + {-0.380847,-0.089574}, + {-0.743203,0.637321}, + {0.235272,-0.819851}, + {-1.195970,0.512104}, + {-1.679973,-0.738527}, + {0.575380,-0.899765}, + {-1.649001,-0.199959}, + {0.213428,1.358885}, + {0.943931,-0.471162}, + {0.432717,0.866101}, + {0.145445,0.133728}, + {-0.555018,0.149227}, + {-0.914787,0.598720}, + {-0.653930,-0.654901}, + {-1.346925,0.329945}, + {-0.171424,-0.565344}, + {-0.301527,0.240508}, + {1.273836,-0.145758}, + {-0.675821,-1.095405}, + {-0.413545,-0.143713}, + {-0.106844,0.824615}, + {0.131452,-1.038036}, + {-0.326685,1.463916}, + {-0.584519,-0.458745}, + {-0.543369,-1.094143}, + {0.143483,-0.846585}, + {0.272163,0.167407}, + {0.401943,-0.563082}, + {1.212306,0.087879}, + {0.504145,-0.648031}, + {-0.462351,-0.159423}, + {-0.319523,0.179709}, + {1.357242,0.045627}, + {1.074160,0.840235}, + {0.790452,0.720079}, + {-0.705431,0.410349}, + {0.416680,-0.002549}, + {-0.884954,-0.146867}, + {-0.808279,-0.171336}, + {-1.018281,0.721639}, + {0.822228,1.039615}, + {1.037790,0.060549}, + {-0.074556,-0.200271}, + {-0.880853,-0.366553}, + {-0.343761,0.333341}, + {-0.313231,-0.586011}, + {0.283823,0.573617}, + {1.143016,0.089887}, + {0.410687,1.083689}, + {0.277861,-0.083366}, + {0.021606,-0.194773}, + {-0.750214,1.458612}, + {0.917402,-0.016748}, + {-0.339684,-0.337568}, + {1.005284,-0.645882}, + {-0.519209,0.899330}, + {0.826162,-0.741211}, + {1.300132,-1.109551}, + {-0.374995,-0.317730}, + {0.785101,0.228184}, + {0.415868,0.737788}, + {0.527210,-0.188643}, + {0.376705,0.413658}, + {0.989599,0.805633}, + {-0.137061,-0.915614}, + {-1.702346,-0.057933}, + {-1.956591,0.046432}, + {-0.416960,0.338240}, + {-0.658461,-1.216968}, + {0.365795,0.659371}, + {0.252050,-0.558653}, + {-0.454467,0.004934}, + {0.504714,0.229244}, + {-0.278911,-0.228103}, + {-0.127623,-0.114296}, + {-0.014266,-0.342689}, + {-0.604625,0.121864}, + {-0.387685,-0.068082}, + {-0.091712,0.800537}, + {0.485931,-0.161304}, + {-0.016110,0.493620}, + {-0.653134,-0.353877}, + {-1.046778,0.196967}, + {-0.263242,-0.289129}, + {0.336474,-0.180203}, + {0.298396,-0.644825}, + {-0.427587,0.572250}, + {-0.208223,0.053185}, + {0.533386,-1.227956}, + {-0.725350,0.128195}, + {0.672904,0.530250}, + {-0.061316,-0.194678}, + {-0.709433,-0.046001}, + {-0.588879,0.353459}, + {0.123260,0.618527}, + {-0.549665,0.060101}, + {0.890191,-0.845135}, + {-0.454263,-1.313850}, + {0.783957,-0.491876}, + {1.361276,0.023611}, + {-0.458428,0.042147}, + {-0.143219,-0.073745}, + {0.074903,-0.017429}, + {-0.067903,-0.816547}, + {-0.380387,-0.772921}, + {-0.240030,1.420491}, + {-0.003621,0.010600}, + {-0.444036,0.409901}, + {0.277409,0.726745}, + {0.119726,1.707099}, + {-0.621712,-0.457125}, + {-0.214421,1.545744}, + {0.278621,-0.735467}, + {-0.099482,0.119682}, + {0.952647,-1.013460}, + {-0.290825,-0.041022}, + {0.368084,-0.002760}, + {-0.689006,-0.068005}, + {0.015785,0.505867}, + {1.306051,0.203435}, + {-0.263603,-0.214893}, + {0.292584,-0.248845}, + {-0.344389,-1.191472}, + {0.096606,-0.045469}, + {0.147219,0.465939}, + {-0.579923,-1.133735}, + {-0.918253,-0.931145}, + {0.557217,0.127417}, + {0.614199,0.613104}, + {0.412233,0.943510}, + {-0.471662,-0.514960}, + {-0.817375,-0.836164}, + {-0.264718,-0.546935}, + {0.508435,0.771316}, + {0.031847,-1.856060}, + {-0.443846,-0.260004}, + {-0.716667,-1.374211}, + {0.501604,0.548927}, + {0.314912,1.032581}, + {-0.781109,0.916868}, + {-0.869837,-1.039860}, + {0.630546,0.674600}, + {0.272632,0.214175}, + {0.531070,0.330978}, + {0.675056,-0.653400}, + {0.573720,0.836919}, + {-0.611225,0.014075}, + {-0.257263,-0.391545}, + {-0.759020,-0.312859}, + {0.264351,0.791373}, + {-0.438730,-0.456151}, + {-0.103243,-0.632429}, + {0.482892,0.141475}, + {-1.072978,0.148871}, + {-0.939209,-0.558985}, + {0.464793,-0.984782}, + {0.344131,0.564869}, + {1.005227,-0.360487}, + {-0.225080,0.071180}, + {0.208733,-0.458590}, + {0.680123,-1.202615}, + {-0.308920,0.517768}, + {0.980274,0.589646}, + {0.902236,-0.040233}, + {-1.138100,0.039754}, + {0.169840,0.120056}, + {-0.733937,0.211810}, + {0.623660,-0.836100}, + {-0.173754,0.076214}, + {-0.541470,0.864952}, + {-0.080678,-0.163713}, + {-0.044093,0.109390}, + {-0.028695,-0.639742}, + {0.643003,0.482195}, + {-0.364304,-0.293403}, + {-0.231682,-0.410161}, + {-0.467438,-0.345931}, + {-0.390529,0.236207}, + {-0.175126,0.380258}, + {0.978393,0.640634}, + {0.257795,-0.903357}, + {0.641261,0.315085}, + {-0.098354,0.511919}, + {-0.717823,-0.919712}, + {0.709709,-0.590981}, + {0.997767,0.207366}, + {0.588275,-0.122289}, + {-0.222499,0.042538}, + {0.394217,0.054417}, + {0.214881,0.114854}, + {0.596482,0.581786}, + {0.477025,-0.157396}, + {-0.633506,-1.318668}, + {-0.037122,0.440028}, + {0.968742,-0.275315}, + {-0.513770,0.381195}, + {1.098776,0.728930}, + {0.150417,-0.421163}, + {-0.902237,1.142415}, + {-0.729498,0.499136}, + {0.418742,0.861949}, + {0.267916,-0.737845}, + {0.024422,0.770033}, + {0.566193,0.531592}, + {0.166300,-0.113780}, + {-0.275348,-0.044917}, + {0.629763,-0.044562}, + {0.108581,-0.580329}, + {0.247883,-0.494344}, + {-1.462176,0.531806}, + {0.324773,-1.258865}, + {-0.406431,0.059552}, + {0.113265,0.337107}, + {-0.506166,1.040579}, + {-0.703153,0.839870}, + {-0.260571,-1.535683}, + {-0.454874,-0.041822}, + {-0.199992,-0.302883}, + {-0.743083,-0.906848}, + {-0.675013,-0.597745}, + {-0.338081,-1.521178}, + {0.931345,-1.090509}, + {0.651153,-1.330153}, + {-1.079088,0.315838}, + {0.246740,0.044863}, + {0.202616,1.446147}, + {-0.433066,0.284324}, + {-0.609858,0.344346}, + {1.142330,-0.944550}, + {-0.350428,-0.881955}, + {-0.451507,-1.605877}, + {-0.400012,-0.239471}, + {-0.136838,-0.775874}, + {0.282265,-0.413392}, + {-0.988833,1.529659}, + {0.719835,0.005099}, + {0.052020,-0.477086}, + {-1.283307,0.058599}, + {0.165701,0.649111}, + {1.021960,-1.416111}, + {0.940476,0.062629}, + {-0.751199,0.038566}, + {0.243450,-0.762697}, + {-0.649152,0.044560}, + {0.908395,0.209002}, + {0.325158,0.216998}, + {0.396454,0.138658}, + {-0.763522,-0.025907}, + {-0.762589,-0.137472}, + {-0.327529,-1.036809}, + {-0.632504,0.676907}, + {0.183574,0.389227}, + {-0.859700,-0.703806}, + {-1.154826,-0.991693}, + {0.449444,0.396030}, + {0.441770,0.491508}, + {-1.205186,0.299378}, + {1.050428,-0.456205}, + {0.096725,0.154959}, + {0.584349,-0.864514}, + {-1.679030,1.143489}, + {0.008505,0.228789}, + {-0.661763,0.775812}, + {0.142798,-0.623065}, + {-0.241421,-0.526502}, + {1.106520,0.156370}, + {0.365753,-0.256303}, + {-0.977046,1.118332}, + {0.884009,0.203437}, + {-0.353712,0.852741}, + {1.135822,-0.309740}, + {-0.439555,-0.067368}, + {0.554689,-0.288402}, + {1.734416,1.344531}, + {-1.349819,0.759427}, + {0.102799,-0.495112}, + {0.063102,0.722775}, + {-1.222947,-0.080150}, + {-0.340332,1.061612}, + {-0.228259,-1.903851}, + {-0.090773,0.687378}, + {0.203348,0.507128}, + {-0.577364,-0.212706}, + {-0.857515,-0.853969}, + {-0.562304,0.383151}, + {-0.918214,-1.478510}, + {1.026666,0.071216}, + {-0.012886,-0.308529}, + {0.022988,-0.145717}, + {0.234582,1.146633}, + {1.975283,-0.173765}, + {-1.487083,0.919537}, + {-1.203767,1.128685}, + {-1.355804,-0.425852}, + {-0.102354,-1.008553}, + {-0.436827,0.374401}, + {-1.741085,0.223597}, + {-0.898223,0.399684}, + {0.002133,-0.652951}, + {0.333743,0.185220}, + {-0.163247,1.355073}, + {-0.198911,-0.789921}, + {0.240101,0.133008}, + {-0.149245,-0.404471}, + {1.281203,-0.360689}, + {-0.172603,-0.635725}, + {0.286292,-0.148272}, + {-0.989616,0.037128}, + {-0.811488,1.305276}, + {0.736930,-1.009141}, + {1.069361,-0.737178}, + {0.752787,-0.592366}, + {-0.668359,0.755571}, + {0.005078,-0.395512}, + {0.006600,0.636287}, + {-0.619231,-0.611731}, + {0.333470,-0.919963}, + {-0.492449,-1.419036}, + {-0.622632,0.194757}, + {0.676292,1.819990}, + {-0.328240,0.542470}, + {0.345128,-0.019528}, + {-0.616645,0.691087}, + {-0.507449,-0.432094}, + {-0.204852,-0.217874}, + {0.834005,-0.099980}, + {1.199202,-0.293367}, + {0.449203,-0.521362}, + {0.226780,-0.171567}, + {0.523436,0.775392}, + {-0.711218,-0.421231}, + {0.151391,-1.096606}, + {-0.249307,0.995733}, + {0.245582,-0.339674}, + {0.412624,-0.060258}, + {-0.300827,0.023954}, + {-0.265459,0.720401}, + {-0.496526,-2.099281}, + {-0.605097,-0.001741}, + {-1.378320,-0.341276}, + {-0.994346,0.085029}, + {1.632400,0.360458}, + {-0.491899,-0.396243}, + {-0.010321,-1.021544}, + {-1.316304,0.895828}, + {-0.198830,-0.208983}, + {0.916044,0.314340}, + {0.562103,-0.885413}, + {0.878424,-0.092960}, + {-1.045844,-0.687749}, + {-1.295066,-0.226382}, + {-0.359215,0.110638}, + {0.540396,-0.456394}, + {1.030585,0.127512}, + {-0.085532,0.952881}, + {0.106917,0.478915}, + {-0.664272,-0.344642}, + {0.788052,1.409984}, + {-0.673592,1.430835}, + {-0.718720,-0.290875}, + {-0.721900,0.085461}, + {0.476120,-0.538352}, + {0.554070,0.581590}, + {-0.576287,-0.853427}, + {-0.431295,-0.014809}, + {-2.353094,1.312785}, + {1.022447,1.017332}, + {0.418273,2.001674}, + {-0.898325,0.139499}, + {0.235885,0.080549}, + {0.183877,0.730680}, + {1.009956,0.519400}, + {-0.689154,0.060848}, + {-0.683728,-0.649710}, + {0.079095,0.516578}, + {-1.386436,-0.530334}, + {0.302774,-0.053089}, + {-0.248980,0.192447}, + {-0.680767,0.423570}, + {-0.043439,0.510224}, + {-1.016935,0.183362}, + {0.076796,-1.333739}, + {-0.313256,-1.452270}, + {-0.850463,0.112410}, + {0.244360,-0.084178}, + {0.067792,-0.882987}, + {-0.569372,-0.399011}, + {-0.189225,0.729525}, + {-0.588975,-0.077969}, + {1.010968,-0.489609}, + {-0.395063,0.239897}, + {0.025387,0.354833}, + {0.725579,0.805842}, + {-1.146500,-0.264508}, + {-0.222810,-1.814964}, + {0.507912,-1.443934}, + {0.296149,0.880303}, + {-0.439268,1.606203}, + {0.334727,0.325640}, + {-0.869431,-0.847762}, + {-0.407707,0.153088}, + {0.348556,0.542411}, + {-0.082133,0.838110}, + {-0.377740,0.348750}, + {-0.523685,0.000306}, + {0.451224,1.080533}, + {0.864641,0.961894}, + {-0.464419,-0.075393}, + {0.247437,-0.100790}, + {0.677059,-0.034906}, + {0.977166,0.730818}, + {0.276546,-0.403567}, + {-0.380227,-0.745522}, + {-0.300027,0.125790}, + {0.454573,0.006509}, + {-0.771309,0.081517}, + {-0.311846,-0.412134}, + {-0.014595,0.090009}, + {0.707382,-0.074778}, + {-1.353019,-0.753631}, + {-0.100071,0.822131}, + {0.954790,-0.432571}, + {-0.078897,-0.647015}, + {0.386041,-0.035061}, + {0.448108,0.197019}, + {-0.270952,0.887823}, + {0.648405,-1.073664}, + {0.044912,-0.754380}, + {-0.455401,-1.209139}, + {-1.242109,0.132042}, + {0.391696,-0.419274}, + {-0.160193,-1.086374}, + {0.193327,0.720599}, + {1.178831,-0.759304}, + {-0.564605,1.076430}, + {-0.643302,-0.416708}, + {-0.962134,-0.990827}, + {0.368858,-0.144279}, + {0.036509,-0.440959}, + {0.179113,0.270476}, + {0.049637,-0.799549}, + {0.618109,-0.582336}, + {-1.394815,0.395536}, + {0.810724,-0.184896}, + {-0.176056,-0.058013}, + {-0.488312,-0.368066}, + {-0.080337,-0.440737}, + {0.116364,0.953468}, + {-0.307639,-0.302137}, + {0.341945,0.164106}, + {-0.466698,-1.158425}, + {0.052765,-0.344994}, + {-0.107626,-0.229995}, + {0.080011,0.653158}, + {-0.438442,0.465432}, + {1.422075,-0.608592}, + {0.108080,-1.057456}, + {-0.484339,-0.907178}, + {-0.746907,-1.978396}, + {-0.177762,0.203051}, + {0.386845,-1.106388}, + {0.611978,-1.018232}, + {0.520887,-0.361754}, + {-0.360101,-0.064618}, + {0.794305,0.526908}, + {0.619432,-0.126033}, + {-0.340265,-1.373028}, + {0.847319,1.149398}, + {-0.270491,-0.369213}, + {-1.409881,0.523044}, + {-0.402942,0.347133}, + {0.100939,-0.350152}, + {-0.107951,-0.680471}, + {0.436856,-0.753223}, + {-0.874005,0.762825}, + {1.008767,-0.929545}, + {0.927536,-0.502055}, + {1.498450,-0.602521}, + {0.762959,-0.278194}, + {-1.522717,-0.649417}, + {0.994833,-0.186581}, + {0.216919,0.567066}, + {0.850492,-0.682931}, + {-0.777097,-0.903028}, + {-0.850634,-0.188701}, + {0.044620,1.541080}, + {-0.307342,-0.202304}, + {-1.090498,-0.818833}, + {-0.004279,0.647200}, + {-0.290596,0.500608}, + {-0.009800,-0.272120}, + {-1.731344,-0.849070}, + {-0.389416,-0.540169}, + {1.177543,0.747062}, + {-0.858150,-0.456143}, + {0.973307,1.377374}, + {1.032589,0.695827}, + {0.015056,0.450971}, + {-0.934915,-0.677001}, + {0.342935,0.069114}, + {0.145474,-0.791543}, + {1.997462,-0.362196}, + {-0.993218,-0.020078}, + {1.123258,-0.113204}, + {0.125841,1.008802}, + {0.727876,1.066038}, + {-0.224529,0.890501}, + {0.213441,1.187995}, + {0.239012,-0.848701}, + {-0.519815,-0.475935}, + {0.113620,-0.506924}, + {0.203290,-0.296634}, + {-0.290231,-0.514121}, + {0.218741,1.021963}, + {-1.315299,0.334324}, + {-0.936988,0.419998}, + {0.886813,0.145840}, + {-0.188194,-1.261272}, + {0.949296,0.646163}, + {-0.826651,-0.432253}, + {0.061005,0.573649}, + {0.922200,-1.334003}, + {-0.006091,0.134091}, + {1.024516,0.063476}, + {-0.089739,-0.290697}, + {0.339610,0.989953}, + {0.555781,-1.426528}, + {-0.025669,-0.189457}, + {-0.710042,0.953935}, + {-1.262187,0.132588}, + {0.658343,-0.530960}, + {0.676713,-0.669361}, + {0.834718,-2.007914}, + {0.833518,0.359230}, + {0.649170,-0.687822}, + {-0.001830,-0.386894}, + {0.994915,-0.229340}, + {0.092444,0.399221}, + {0.536323,-0.782432}, + {0.262010,1.204889}, + {-0.208387,0.425622}, + {-1.100914,1.683131}, + {-1.658393,-0.775979}, + {-0.078725,-0.220114}, + {-0.303566,0.923927}, + {-0.225885,0.033406}, + {-0.837593,0.349616}, + {-0.560227,0.714755}, + {0.551992,-0.393791}, + {0.541405,-0.530435}, + {-1.165526,0.078792}, + {-1.026038,0.387096}, + {-0.517090,-0.484350}, + {0.136127,0.124638}, + {0.698761,0.346848}, + {-0.783071,0.074379}, + {0.158195,1.117125}, + {0.712435,-0.286792}, + {-0.362540,-1.001977}, + {-0.261314,1.161940}, + {1.007828,0.544864}, + {0.141605,0.538099}, + {-0.536036,-0.744530}, + {-0.056455,1.157725}, + {0.270982,-0.362836}, + {1.263497,0.040674}, + {0.146764,-0.753269}, + {0.364839,0.210494}, + {0.142940,0.490340}, + {0.272361,0.068047}, + {-1.040589,1.260799}, + {1.008508,0.670697}, + {-1.014574,2.123840}, + {-0.791800,-1.531609}, + {-1.780964,0.224965}, + {1.573411,0.802257}, + {-0.041381,0.109724}, + {-1.138676,0.501035}, + {-0.552511,0.754384}, + {0.074825,-0.740712}, + {0.310992,-0.947818}, + {-0.161513,1.611466}, + {0.351436,-0.213846}, + {-0.232344,0.926067}, + {-0.712473,0.154074}, + {0.531308,0.239847}, + {0.530134,0.456501}, + {-0.297722,-0.791948}, + {-0.072871,-1.399393}, + {0.183656,0.497474}, + {-0.279718,-0.393118}, + {0.648989,-0.820860}, + {0.372595,-1.044493}, + {1.032547,0.849237}, + {1.174671,-0.618382}, + {-1.652857,-1.472496}, + {0.158852,0.191819}, + {0.298620,0.279073}, + {-0.234746,-0.135384}, + {-0.875820,0.319486}, + {-0.426039,0.843713}, + {-0.496797,-0.192881}, + {-0.578836,0.257663}, + {-0.238402,0.900325}, + {-0.204088,-1.191861}, + {0.736090,1.052130}, + {-0.052316,-0.025508}, + {-0.213198,-0.936710}, + {-0.491398,0.410943}, + {0.177843,0.351607}, + {0.413028,-0.384109}, + {-0.296570,0.034297}, + {-0.222102,0.514522}, + {0.347397,-0.839739}, + {0.755191,0.119118}, + {-1.317696,1.106367}, + {0.012111,0.796336}, + {0.227983,0.378704}, + {-0.182946,0.270691}, + {-0.133785,0.099382}, + {-0.266511,0.038997}, + {-0.821681,0.553035}, + {0.389307,-1.106532}, + {0.135254,-0.883464}, + {1.870178,-0.286558}, + {-0.437784,-0.288228}, + {0.390194,0.094215}, + {0.606508,-1.296029}, + {-0.093019,-0.614305}, + {1.233362,1.207790}, + {0.161323,-0.765341}, + {-0.350088,1.001790}, + {-0.502004,-0.037202}, + {-0.067642,-0.030906}, + {-0.579459,-0.835251}, + {-0.327448,-1.330617}, + {-0.822818,-0.500291}, + {1.616254,-0.161664}, + {0.523254,0.304197}, + {0.874754,0.727626}, + {-0.625833,0.211643}, + {-0.295817,-0.417120}, + {-0.533891,0.548556}, + {-0.558758,0.571516}, + {0.822203,0.414686}, + {1.369430,0.325986}, + {1.064004,0.174272}, + {-0.985833,0.875381}, + {-0.345980,0.354199}, + {0.100855,1.346421}, + {1.413487,-0.299202}, + {-0.121055,-1.168458}, + {0.501534,-0.001734}, + {-0.099610,0.124655}, + {-0.014849,-0.560165}, + {1.152084,0.973772}, + {-0.517379,-0.823509}, + {0.020539,-0.675177}, + {-0.039182,0.878191}, + {0.067950,0.560550}, + {-1.394269,0.829335}, + {-0.441627,-0.010153}, + {0.385140,0.222085}, + {0.653992,-0.840685}, + {0.554082,-0.687828}, + {0.754380,-0.171576}, + {0.690489,-0.152949}, + {0.000351,-0.549264}, + {0.634582,-0.004171}, + {-0.818523,1.190795}, + {-0.877491,-0.566566}, + {-1.770940,-0.640230}, + {-0.681648,0.896819}, + {0.714653,-1.455870}, + {0.904495,-1.333302}, + {0.574457,-0.384864}, + {-0.758292,-0.483590}, + {0.187676,0.405114}, + {0.994700,-0.071836}, + {0.104159,0.532615}, + {-0.044879,-0.582247}, + {0.088417,0.343948}, + {-0.123630,-0.413369}, + {-0.520220,1.012739}, + {-0.210080,-0.180696}, + {1.090599,-0.559357}, + {0.684438,0.378806}, + {-0.026784,0.937192}, + {1.281961,0.075214}, + {0.730268,-0.520097}, + {0.937449,-1.019487}, + {-0.061509,-0.176202}, + {-0.421825,0.313385}, + {-0.367561,0.463862}, + {-0.121494,-0.479397}, + {0.550684,-0.312000}, + {-0.047790,-0.598700}, + {-0.759626,-0.857538}, + {0.464120,-0.230825}, + {0.787116,-0.630031}, + {-0.508880,0.581898}, + {-0.454863,0.576846}, + {-0.207468,1.946940}, + {-0.913960,-0.235153}, + {1.143211,0.111025}, + {-0.137003,0.162749}, + {-1.146435,1.853002}, + {-0.318815,-0.421180}, + {-0.260398,-0.035725}, + {0.175171,-0.048527}, + {-0.261859,0.350284}, + {0.162278,-0.033220}, + {-0.592133,-0.719742}, + {1.618602,0.334038}, + {-0.096548,-0.880363}, + {-0.348537,0.448118}, + {-0.662260,0.179356}, + {1.039235,0.256463}, + {-0.996895,0.746454}, + {-0.834224,-0.090841}, + {-0.647685,-0.812629}, + {-1.308253,0.412350}, + {-0.125295,-0.126640}, + {0.576406,-0.583028}, + {-0.374377,-0.094747}, + {0.533871,-0.080927}, + {0.515122,-1.155921}, + {-0.507165,0.282523}, + {-0.699975,1.619406}, + {0.182354,-0.753123}, + {0.710919,-0.243223}, + {1.477830,-0.025138}, + {1.782881,0.259661}, + {-0.521191,0.411698}, + {-0.166741,0.852319}, + {0.207224,-0.159255}, + {-0.487196,1.583805}, + {0.420298,-0.587703}, + {-0.287136,0.347728}, + {-0.058681,-1.279535}, + {-0.213399,-0.886647}, + {-1.030968,0.343184}, + {0.028405,-0.952633}, + {0.464603,0.442204}, + {0.931560,0.453043}, + {0.284575,0.967136}, + {0.138022,0.059599}, + {-0.451299,-1.015639}, + {1.003979,1.068919}, + {-0.655263,-0.663366}, + {-0.019621,-0.138225}, + {0.156525,-0.341867}, + {0.381232,0.059268}, + {-0.023279,-0.077880}, + {-0.156909,0.250573}, + {-0.169278,-0.914286}, + {0.305569,-0.291525}, + {0.731565,0.454905}, + {1.160261,0.085413}, + {-0.402037,-0.336640}, + {-0.086852,1.607379}, + {1.032812,0.761434}, + {-1.011438,0.206404}, + {-0.152752,0.593129}, + {0.239131,-0.087052}, + {0.808812,-0.541022}, + {-0.140430,-1.364158}, + {0.194295,0.880644}, + {0.118366,0.064148}, + {-0.536040,0.778541}, + {-0.720747,0.002512}, + {0.088296,-1.191485}, + {0.644848,-0.444607}, + {0.485903,0.409511}, + {1.460176,-0.876221}, + {-0.339190,-0.439055}, + {0.447675,0.418898}, + {-1.175829,-0.902773}, + {0.534399,0.539156}, + {-0.365101,-0.459903}, + {-0.889603,-0.728754}, + {-0.720091,0.356776}, + {0.152954,0.223066}, + {1.507327,0.739365}, + {0.310249,-0.006371}, + {-0.112344,-0.419108}, + {0.843904,-0.314723}, + {0.087930,0.313616}, + {0.844712,0.196815}, + {0.375568,0.356237}, + {0.204981,-0.400083}, + {0.361654,-0.270180}, + {-0.424588,-0.363919}, + {-0.302380,0.390982}, + {0.538019,-0.362291}, + {-0.287025,0.105711}, + {-0.592141,-0.264936}, + {-0.265425,0.583077}, + {-0.152032,0.522918}, + {-0.189186,-0.250399}, + {-1.096465,0.469056}, + {-0.888549,-1.140952}, + {-0.501972,-0.339613}, + {-0.203446,0.426474}, + {-0.039456,-0.535356}, + {0.070475,0.484328}, + {0.924276,-0.396241}, + {-0.106967,0.012352}, + {-0.367264,0.819153}, + {0.456802,0.237844}, + {0.563188,-1.024814}, + {0.009682,-0.064482}, + {-0.764852,0.219713}, + {-0.414932,-0.531342}, + {-0.088775,-0.892699}, + {-0.473699,0.186136}, + {-0.776648,-0.582610}, + {0.175734,-1.058049}, + {1.285690,-0.391957}, + {-0.091057,-1.011907}, + {-0.162767,0.561617}, + {0.031953,-0.540131}, + {0.534081,0.664403}, + {-0.360770,0.122694}, + {-0.178962,0.466559}, + {-0.004184,-0.337578}, + {-0.757067,0.029093}, + {-1.101300,0.209913}, + {0.465322,-0.086027}, + {-0.168690,1.115947}, + {0.263414,-0.000775}, + {0.159567,0.853760}, + {0.094110,-0.060344}, + {-0.421000,-1.195796}, + {0.441781,0.242496}, + {-0.021002,-0.381271}, + {-0.481126,-0.563097}, + {-0.798248,-0.508280}, + {-0.268196,0.934724}, + {1.292721,-0.335166}, + {0.226534,0.445048}, + {1.184933,0.558462}, + {0.375495,-1.145480}, + {0.748214,-0.745104}, + {0.688162,1.047310}, + {0.637883,0.949140}, + {-0.578133,-0.371881}, + {-0.506057,0.137040}, + {-0.392437,-1.031430}, + {-1.250713,-1.946813}, + {-0.206704,1.462894}, + {0.398430,-0.219612}, + {0.730672,-0.702692}, + {-0.698928,-0.450961}, + {0.584867,-0.708127}, + {0.590944,-0.109226}, + {-0.542510,0.253958}, + {-0.268875,1.111628}, + {0.649546,-0.696286}, + {-1.149829,-0.309965}, + {-0.154368,-1.500089}, + {0.822416,0.353288}, + {0.501110,-0.318761}, + {-0.212429,-0.008096}, + {-0.006164,-0.123611}, + {0.288868,0.048345}, + {-0.574713,-0.524916}, + {0.018293,-1.030497}, + {-0.005055,-0.072736}, + {0.723568,-0.635163}, + {0.237863,-0.875191}, + {-1.247980,-0.863139}, + {-0.302079,-0.212290}, + {-0.421802,-0.759025}, + {-0.589974,-0.507471}, + {-0.334862,0.003375}, + {0.401797,0.706722}, + {-0.461749,0.283630}, + {-0.841187,-0.665548}, + {-0.626371,0.618334}, + {-0.020821,0.503040}, + {0.116914,-0.093341}, + {-0.151675,-0.528033}, + {-0.193343,-1.099319}, + {0.274029,0.445690}, + {-0.021446,-1.220103}, + {0.513206,-0.740022}, + {1.777028,0.407704}, + {0.786759,0.109353}, + {-1.004914,0.876901}, + {0.464743,1.170006}, + {-0.002439,0.125068}, + {0.962875,-0.407956}, + {0.530559,-0.756573}, + {-0.389738,0.110620}, + {-0.556624,0.014509}, + {-0.132983,0.247574}, + {0.587943,-0.342146}, + {1.296368,0.197680}, + {-0.733120,-0.623643}, + {-0.011093,0.978888}, + {0.039641,-0.978184}, + {-0.443314,-0.153156}, + {0.588043,0.490341}, + {0.218709,0.363791}, + {-0.914626,0.826702}, + {1.411108,-0.816719}, + {-0.490262,-0.144227}, + {-1.206037,1.156620}, + {-0.662082,0.479091}, + {0.615883,-0.149877}, + {1.177829,-0.036366}, + {0.394260,-1.578483}, + {0.383648,0.485998}, + {-0.028002,0.334074}, + {0.722762,0.190366}, + {0.475814,0.082245}, + {0.439991,-0.022567}, + {0.014753,0.128088}, + {-1.144640,-0.335474}, + {0.470690,0.257257}, + {-0.751319,-1.107300}, + {0.531539,0.456327}, + {0.464679,0.083408}, + {0.077604,-2.053833}, + {-0.031526,-0.401000}, + {-0.741780,-0.921745}, + {-0.504616,-1.015580}, + {0.999344,-0.252633}, + {0.199592,-0.614304}, + {-1.630268,-0.100880}, + {-0.754618,-0.275004}, + {-1.115735,-0.519031}, + {-0.156714,-0.646913}, + {-0.315061,0.123277}, + {-0.414084,-0.655534}, + {0.469319,-0.330941}, + {0.647004,-0.163404}, + {-0.255922,1.618105}, + {-1.376396,-0.535470}, + {1.334960,-0.249415}, + {-0.920735,-0.189727}, + {2.380895,-0.939174}, + {-0.661720,0.252740}, + {1.948294,-0.096848}, + {-1.518951,-0.774151}, + {0.370676,-0.131442}, + {0.135880,0.077151}, + {-0.793921,0.407360}, + {0.434706,0.909590}, + {-0.892096,0.523341}, + {-0.077199,0.691331}, + {-0.703000,0.726934}, + {-0.793375,-0.399673}, + {0.170385,-0.177280}, + {0.497139,0.034646}, + {-0.972295,1.093025}, + {-0.260981,-0.434597}, + {0.295369,0.422417}, + {0.508523,0.711213}, + {-0.589540,0.610066}, + {0.089695,0.577849}, + {-1.169455,0.371278}, + {0.097553,-0.508773}, + {-1.427358,-0.450822}, + {0.764169,-0.321795}, + {0.281425,1.167852}, + {-0.513064,-0.109472}, + {1.086924,0.792903}, + {-0.003835,0.815400}, + {-0.876442,-0.231937}, + {0.483821,-0.227180}, + {0.779304,0.300537}, + {-1.021341,-1.075650}, + {-0.042599,1.217835}, + {-0.124324,1.154569}, + {0.983924,0.128325}, + {-0.262283,-0.571139}, + {0.163939,0.036503}, + {0.502541,-0.457276}, + {0.027506,0.551723}, + {-0.759208,-0.190703}, + {-0.532469,1.757544}, + {-0.097832,1.793890}, + {-0.233310,0.236538}, + {-0.296963,-0.245692}, + {0.331985,0.497470}, + {1.077897,-0.029477}, + {0.485004,-1.550032}, + {0.829323,-1.208018}, + {-0.417397,-0.885481}, + {-0.910960,0.333680}, + {0.505911,0.222267}, + {-0.779049,-0.648859}, + {0.024723,-0.506963}, + {-1.044112,0.858742}, + {0.349329,0.199761}, + {0.426148,0.579699}, + {1.397881,-0.625570}, + {-0.999539,0.150193}, + {-0.506555,-0.493017}, + {0.815503,-1.014094}, + {-0.309845,0.860823}, + {0.636101,0.034581}, + {0.383700,0.629026}, + {0.046350,-0.409060}, + {0.382661,0.192436}, + {1.578886,0.214420}, + {-0.287174,0.113654}, + {-0.567400,0.209722}, + {0.432908,-0.738713}, + {-0.114021,1.023082}, + {-0.087467,-0.003324}, + {1.628689,0.382128}, + {0.930859,-0.955031}, + {0.365787,-0.587545}, + {-0.566131,0.401941}, + {1.205574,-0.693033}, + {1.041772,-0.318306}, + {0.520455,-0.180903}, + {1.313961,0.417802}, + {-0.785333,-0.826391}, + {-0.003165,0.987190}, + {0.202221,-1.499396}, + {-0.156205,0.234217}, + {-0.034555,-0.710464}, + {0.578915,0.025341}, + {-0.967250,0.482964}, + {-0.125553,0.645679}, + {0.121600,0.282214}, + {-0.467374,-0.523647}, + {0.801851,0.110140}, + {-0.202959,0.245792}, + {0.964451,-0.823875}, + {-0.720574,-0.733981}, + {-1.552269,0.726240}, + {0.240196,0.208363}, + {-1.020113,0.453542}, + {0.835032,0.546624}, + {-0.427770,0.890482}, + {0.244842,-0.570207}, + {0.187974,-0.525677}, + {-0.033276,-0.603446}, + {0.681630,0.069452}, + {-0.076943,1.444004}, + {-0.466249,-1.483352}, + {-0.333822,-0.553728}, + {-0.464640,1.570671}, + {0.247143,-0.404809}, + {0.217763,-1.913662}, + {0.569612,0.403222}, + {-0.950478,0.269484}, + {1.296281,-0.340172}, + {0.248056,-0.421869}, + {0.333895,1.464495}, + {-0.974868,0.646046}, + {0.432670,-1.031978}, + {1.128838,0.295748}, + {-0.460823,0.493682}, + {-0.717489,1.188427}, + {1.258650,-0.377973}, + {-0.828146,0.064178}, + {0.641771,-0.060587}, + {0.245022,0.356199}, + {0.154221,-0.400658}, + {0.570724,0.989517}, + {-0.412180,0.972591}, + {0.350613,0.545597}, + {1.122365,-1.975271}, + {0.160367,0.137915}, + {0.352691,-0.878584}, + {0.423026,0.373635}, + {-0.726179,0.179411}, + {-0.338326,-1.788241}, + {1.947859,1.575207}, + {-0.951344,0.536022}, + {0.247396,-0.497166}, + {0.724586,-0.403144}, + {-0.061126,-0.153871}, + {0.528230,-0.103315}, + {-0.022290,-0.672390}, + {-0.000978,-0.182703}, + {-0.241614,-0.359854}, + {0.220241,0.428535}, + {0.798476,-0.295902}, + {-0.146218,0.143398}, + {-0.619417,0.438462}, + {-0.308855,0.331077}, + {-1.361136,1.024312}, + {-0.647613,0.907512}, + {0.233092,-1.078341}, + {1.052241,-0.621467}, + {-0.198725,1.172681}, + {-0.081506,0.023033}, + {-0.547092,0.137317}, + {0.637615,1.859723}, + {-0.623497,-0.596191}, + {0.149195,-0.605881}, + {0.093756,0.630550}, + {0.213268,-0.787503}, + {0.426453,-0.185747}, + {-1.548568,0.881788}, + {0.051195,0.231489}, + {0.209291,-0.593744}, + {0.628475,0.857678}, + {-1.089235,-0.641101}, + {0.594605,-0.576514}, + {0.252215,-0.021007}, + {1.067553,0.471123}, + {0.321541,-0.402181}, + {0.284533,-0.960188}, + {0.541105,-0.082863}, + {0.565337,1.026278}, + {0.317525,-1.185003}, + {0.530922,-0.175306}, + {-0.946283,1.216512}, + {-0.462192,0.124213}, + {-0.067219,0.018689}, + {-0.295595,0.227283}, + {-1.116823,0.278792}, + {0.252187,-0.143898}, + {-1.275510,0.009213}, + {-0.097323,-1.128635}, + {-0.292395,-0.146099}, + {0.287647,0.343419}, + {-0.297120,1.037639}, + {-1.152909,-1.062561}, + {0.117167,0.480675}, + {0.542487,0.344975}, + {-0.269590,0.071787}, + {0.351416,1.336789}, + {-0.679649,1.205267}, + {0.158638,0.405538}, + {0.690315,-0.580242}, + {-0.528184,0.321935}, + {-0.275456,0.434026}, + {1.047915,-0.868060}, + {-0.268058,0.433124}, + {0.395739,0.168345}, + {-0.706243,0.261628}, + {-1.686516,0.100118}, + {1.210646,0.205449}, + {-0.403912,1.149188}, + {0.218345,-0.059565}, + {0.666191,-1.686280}, + {-1.080821,0.264224}, + {0.133752,-0.095685}, + {-0.765833,-0.042006}, + {-0.851086,-0.571563}, + {-0.431850,-0.146573}, + {-0.083487,0.324847}, + {-0.458226,0.266507}, + {-1.653483,0.274261}, + {-0.892105,0.192638}, + {0.325240,0.618814}, + {0.839860,-0.650172}, + {0.586121,0.493141}, + {0.424046,-0.596069}, + {0.579320,-0.426532}, + {-0.860414,-0.096015}, + {1.231735,-0.063091}, + {0.667487,0.509589}, + {-0.244143,-0.241915}, + {0.392425,-0.336987}, + {-0.577080,0.077028}, + {-0.243798,0.518442}, + {-0.186535,-0.514620}, + {-0.350824,0.893193}, + {-1.068767,-0.852674}, + {0.256260,-0.692879}, + {0.700920,-0.234622}, + {-1.148149,0.242284}, + {0.140398,-0.995881}, + {-1.137315,-0.101466}, + {0.642480,1.006613}, + {-0.539053,-0.106642}, + {0.894393,-0.576259}, + {0.055949,-0.805028}, + {-0.346054,-0.817483}, + {-0.401898,0.351013}, + {0.959261,-0.648991}, + {-0.653608,1.002869}, + {0.844153,0.220495}, + {-0.631592,-0.347616}, + {-0.725926,1.047737}, + {0.236023,0.283730}, + {0.123264,0.320307}, + {1.048852,-0.451049}, + {-0.411348,-0.986237}, + {-0.003611,-1.217079}, + {-0.178690,0.757153}, + {-0.913871,0.555166}, + {0.359649,-0.092164}, + {-0.762808,-1.868481}, + {-0.459054,-0.002625}, + {-0.409244,-0.658257}, + {0.538408,-0.336349}, + {-0.748231,-0.660716}, + {-0.250560,-0.025371}, + {0.456996,-0.231112}, + {0.299549,-1.219953}, + {1.172228,-0.394426}, + {-0.378361,0.665830}, + {0.415112,0.418938}, + {-0.548112,0.102843}, + {-0.133962,-0.903369}, + {-0.468702,0.681193}, + {1.222459,1.556622}, + {0.578721,0.124503}, + {-0.465609,-1.236596}, + {0.344855,0.485644}, + {-0.769591,0.360454}, + {-0.285111,-0.421824}, + {0.383924,-0.612774}, + {-0.340934,-0.217555}, + {1.033859,-0.961846}, + {-0.638277,-0.124713}, + {0.713854,-1.025591}, + {0.641113,0.723899}, + {-0.714185,0.025297}, + {-0.243242,-0.632974}, + {0.004698,-0.561759}, + {0.826869,1.173450}, + {0.966164,-0.707247}, + {-0.542635,1.049767}, + {-0.518506,-0.302156}, + {0.545221,-0.705138}, + {-0.102193,-0.186358}, + {0.365136,0.095347}, + {0.201770,-0.480568}, + {0.016332,0.581984}, + {-0.200321,-0.337498}, + {0.655831,0.299526}, + {-0.638049,0.233237}, + {1.424052,-0.333001}, + {0.052369,-0.134042}, + {-0.288253,1.232961}, + {0.183916,-0.245885}, + {0.477995,-1.296021}, + {-0.386385,-0.681627}, + {-0.871080,0.846105}, + {0.995819,-0.009435}, + {0.296135,0.463088}, + {0.504048,0.026186}, + {0.829560,-1.492906}, + {0.848924,-0.979175}, + {-0.656607,-0.872808}, + {0.063178,-0.565062}, + {-0.543978,0.668214}, + {-0.282821,-0.442039}, + {0.348789,0.133412}, + {-0.108280,-0.389999}, + {0.463560,-0.296653}, + {0.762565,-0.939430}, + {0.562681,0.745310}, + {-0.475544,-0.766254}, + {-0.140575,0.199589}, + {-0.681751,-0.057548}, + {-1.695019,-0.254700}, + {-0.534453,-1.252818}, + {-0.097463,-0.033164}, + {0.013134,0.327568}, + {0.838379,0.372423}, + {0.665435,-1.323001}, + {-0.545902,1.244126}, + {-0.272644,0.828079}, + {-0.246118,0.092456}, + {1.201818,0.219538}, + {0.298446,0.028810}, + {0.130586,-1.150124}, + {-0.189182,0.693609}, + {-0.220031,0.117008}, + {0.553178,-1.375086}, + {0.699370,0.127016}, + {0.961901,0.570180}, + {-0.251472,-0.425322}, + {0.846566,0.693479}, + {-0.078834,-0.799604}, + {-0.174930,-0.493040}, + {-1.328997,-0.114349}, + {0.127677,0.719281}, + {-1.121602,-1.078388}, + {-0.664228,1.733879}, + {1.383895,-0.064893}, + {0.539674,-2.059210}, + {-1.022668,0.526521}, + {0.733573,-0.308119}, + {-0.188367,1.132020}, + {0.610091,-0.282697}, + {0.423397,0.009993}, + {0.393636,-0.644193}, + {0.128715,-0.357517}, + {0.517623,-0.447918}, + {0.158965,1.067064}, + {0.371601,-0.581261}, + {-0.927113,-0.619224}, + {1.303716,-1.165499}, + {0.322206,0.200896}, + {-0.825444,0.595176}, + {0.762828,-1.494917}, + {1.295692,-1.470736}, + {0.013767,-0.200418}, + {-0.238785,-0.631234}, + {-0.022044,-0.446997}, + {0.407923,-0.215020}, + {-0.523749,-0.371120}, + {0.713283,0.184292}, + {-0.268406,-0.526939}, + {0.138893,-1.775308}, + {-0.937942,1.003578}, + {-0.063107,0.546195}, + {-0.317434,0.743692}, + {0.750336,0.359023}, + {-0.674060,-1.184966}, + {2.118200,0.150908}, + {0.312808,0.577403}, + {-0.115615,-0.380405}, + {0.093313,0.277709}, + {0.781873,-0.614278}, + {0.868257,-0.087240}, + {0.696852,-0.037947}, + {0.418258,-0.615206}, + {-0.502346,-0.363948}, + {0.607748,1.486425}, + {-0.564759,0.351200}, + {-0.583354,-1.006512}, + {0.270122,-0.440737}, + {0.779603,-0.084426}, + {-0.007898,-0.106035}, + {0.320554,0.214694}, + {-0.177764,-1.660508}, + {0.364537,-0.190366}, + {0.239589,-0.553225}, + {-0.383177,0.604839}, + {0.055061,0.152930}, + {0.224963,0.592680}, + {0.196291,-0.213862}, + {-0.145762,0.712477}, + {0.968561,0.056109}, + {0.598746,0.380951}, + {0.702798,0.468182}, + {-0.052676,-0.835553}, + {0.586200,-0.290487}, + {-0.725037,-0.556427}, + {0.267490,-0.645407}, + {-0.859603,0.256510}, + {-1.167129,-0.483687}, + {-0.249517,-0.840456}, + {-0.081174,-0.251055}, + {-0.107692,1.266167}, + {0.924662,-0.992418}, + {0.178689,0.182523}, + {-0.559303,-0.632352}, + {-0.754172,-0.225666}, + {0.422639,-0.820600}, + {0.948590,1.657351}, + {-0.281405,-0.169279}, + {0.057540,0.103383}, + {0.965329,-0.888955}, + {-0.568440,1.343059}, + {-0.186236,-0.018155}, + {-0.110761,-0.791860}, + {-0.525465,-0.172692}, + {-0.820201,-0.368637}, + {0.488156,-0.537817}, + {-0.115891,-0.625948}, + {-0.244424,-0.566245}, + {-0.034738,-0.193282}, + {0.995996,1.175802}, + {0.633444,1.030137}, + {0.651915,0.959199}, + {1.923756,-0.905022}, + {-1.312415,0.148790}, + {-0.096677,-0.026953}, + {0.390501,0.602404}, + {0.867561,-0.780886}, + {-0.248516,0.609102}, + {0.754966,-0.110229}, + {0.193581,-1.306164}, + {-0.006005,-0.435352}, + {-0.309464,0.845346}, + {-1.119399,-0.660584}, + {1.827421,-0.534782}, + {1.365352,-0.177950}, + {-0.386234,-0.795813}, + {-0.468086,-0.003789}, + {0.881840,0.036744}, + {-0.514770,-0.810572}, + {0.151684,0.110164}, + {0.458389,0.323786}, + {-0.120473,-1.314917}, + {0.204646,1.100970}, + {0.020544,0.284023}, + {-1.429218,1.177050}, + {0.905353,0.885557}, + {-1.160315,1.849909}, + {-1.424230,-1.176559}, + {-0.905514,0.530293}, + {0.395918,0.575079}, + {-0.420402,0.728284}, + {-0.068162,-0.727264}, + {-1.231408,0.352116}, + {-0.629367,0.024142}, + {-0.776077,0.835663}, + {1.388639,1.024976}, + {0.079304,0.123010}, + {-0.742089,-0.595562}, + {0.413633,0.178427}, + {1.148139,0.310845}, + {-1.223023,-0.107151}, + {0.893529,-0.158779}, + {0.455295,0.570938}, + {0.361370,0.154722}, + {0.452221,0.207669}, + {0.342056,0.533909}, + {1.139659,0.955398}, + {0.954993,0.826294}, + {0.436891,0.869010}, + {0.229994,-0.244482}, + {0.099847,-0.476888}, + {-0.522935,0.503299}, + {-0.406360,0.610955}, + {0.944435,-0.128204}, + {0.065770,-1.670135}, + {0.740768,-0.036056}, + {-0.584472,-2.391807}, + {-0.818919,0.704807}, + {-0.164141,0.180842}, + {-0.896661,0.450317}, + {0.871090,0.180263}, + {0.135365,1.111712}, + {-0.834453,-0.341845}, + {-0.257690,-0.035587}, + {-0.462253,0.690694}, + {-0.658742,-0.564799}, + {-0.424196,2.228747}, + {0.041939,-0.154539}, + {-0.403634,0.374377}, + {-1.213989,-0.071425}, + {-1.333255,0.641658}, + {0.544231,0.130374}, + {-0.285297,-0.101088}, + {0.409156,0.353600}, + {-0.616579,-0.490166}, + {0.138329,1.149111}, + {-0.089856,-0.208823}, + {0.269195,0.727445}, + {-0.532599,0.947341}, + {1.064642,0.518264}, + {-0.160568,0.127441}, + {-0.982412,0.428601}, + {0.671490,-0.105111}, + {-0.544419,0.539514}, + {0.650748,0.073317}, + {1.383643,0.790720}, + {0.254461,-1.150863}, + {-1.104232,0.797452}, + {-0.254246,-0.008363}, + {-0.300772,-0.103863}, + {0.576015,0.396718}, + {1.176581,0.732102}, + {0.153447,0.054295}, + {0.000016,-0.797409}, + {0.700654,0.049420}, + {-0.194685,-0.862644}, + {-0.478585,-0.200502}, + {-1.569114,-0.100896}, + {-0.099857,1.359227}, + {0.499119,0.183329}, + {-0.594711,0.176504}, + {0.329206,1.105346}, + {0.247398,-0.273746}, + {-0.345935,-0.650667}, + {-0.038984,-0.023328}, + {-0.333903,-0.697988}, + {-1.651307,-0.010374}, + {0.135007,-0.017740}, + {-0.899312,0.155947}, + {-0.464175,-0.248264}, + {0.009996,0.360149}, + {-0.695577,-0.382261}, + {-0.402334,-0.007657}, + {0.620490,0.453809}, + {0.091440,0.758711}, + {0.343166,1.541721}, + {0.429339,-0.421495}, + {-1.151836,0.034463}, + {-0.085981,0.906358}, + {-0.026440,1.303161}, + {0.193819,0.354018}, + {0.562069,-0.395005}, + {-0.439914,-0.948032}, + {-0.334438,0.562737}, + {-0.864347,0.208509}, + {-0.643184,-0.135769}, + {0.053163,0.285246}, + {1.646151,-0.432861}, + {1.132792,-0.101623}, + {-0.698541,0.212543}, + {-0.600253,-0.394334}, + {-1.414120,-0.017888}, + {-0.368393,-0.718877}, + {-0.680915,0.363811}, + {-0.319313,0.322213}, + {-0.244923,0.003331}, + {1.157367,-0.139673}, + {0.607064,-0.324347}, + {-0.644671,-0.765634}, + {0.089788,-0.064507}, + {-0.720007,-0.670351}, + {0.360654,0.469579}, + {-0.309126,-0.364294}, + {0.500641,-0.866124}, + {-0.320571,-0.281417}, + {-0.224328,1.348302}, + {0.115238,0.182192}, + {-0.936327,-0.335628}, + {0.137544,0.668139}, + {0.100546,-0.022904}, + {-0.024822,-0.108423}, + {0.011225,0.990800}, + {-0.279834,-0.438608}, + {-0.275984,0.874441}, + {-0.823737,0.963043}, + {-0.768202,1.310865}, + {-0.066729,1.666242}, + {0.907228,0.372265}, + {-0.319255,0.457291}, + {-0.671123,0.800845}, + {-0.077611,0.279797}, + {-0.194283,-0.608156}, + {-0.041376,-0.876926}, + {-0.020332,-0.458281}, + {-0.440460,0.163008}, + {0.454897,0.330234}, + {-0.331951,-1.540866}, + {-0.633680,-0.034518}, + {0.757495,0.101301}, + {-0.833573,-0.786251}, + {0.965374,-1.392252}, + {-1.562416,-0.203946}, + {0.170349,0.102477}, + {-0.297897,0.362400}, + {-0.231639,-0.158231}, + {0.959721,0.665986}, + {1.098533,0.573646}, + {-0.091776,0.472902}, + {0.533416,-1.030881}, + {0.526210,1.060061}, + {-0.223194,0.188243}, + {-0.611879,-1.854657}, + {0.428365,0.538233}, + {-1.044283,-0.338610}, + {0.027523,0.049873}, + {-0.049738,0.893777}, + {-0.579892,-0.756394}, + {-0.740191,0.748805}, + {-0.542898,-1.202564}, + {0.825741,-0.048525}, + {0.539443,-1.170783}, + {1.033500,0.348025}, + {0.715562,0.128228}, + {0.108775,0.269008}, + {0.955005,0.864143}, + {-0.207915,0.674605}, + {1.403034,0.313231}, + {0.296529,-1.450481}, + {0.548132,1.537754}, + {-0.021173,-0.057581}, + {0.936941,0.628264}, + {-0.628539,0.130955}, + {0.068526,0.421100}, + {-0.403953,-1.199911}, + {1.453961,-0.456943}, + {-0.201087,0.108304}, + {0.271445,0.783038}, + {0.520304,0.921613}, + {-1.395021,-0.780013}, + {0.131228,-0.186797}, + {-0.855353,0.537660}, + {-0.337268,-0.724038}, + {-0.432516,0.344531}, + {-0.767389,0.464180}, + {-1.035498,0.530026}, + {0.441212,0.883714}, + {1.105195,-0.408422}, + {-1.103082,-0.169069}, + {-0.295896,0.969360}, + {-0.478854,-0.782398}, + {0.416756,0.605709}, + {0.733967,0.544675}, + {0.971172,0.356416}, + {0.599161,-1.120536}, + {-0.248181,0.556249}, + {0.887368,-0.641314}, + {0.673646,-0.843245}, + {-0.312341,0.397320}, + {0.729720,1.731690}, + {-0.801968,0.323223}, + {-0.536627,0.327754}, + {1.622578,-0.105935}, + {-1.750543,-0.207221}, + {-1.908934,-0.520022}, + {-1.469000,0.309230}, + {-0.115261,0.192568}, + {-0.122709,0.084334}, + {0.189000,0.696045}, + {0.493215,-1.328955}, + {-0.721492,-0.333963}, + {1.161054,-0.002184}, + {0.512723,1.972711}, + {-0.444754,-0.130414}, + {-0.868852,-0.249870}, + {-0.816170,0.515289}, + {1.022070,-0.030086}, + {-0.638999,-1.338192}, + {0.242959,0.271414}, + {-0.602075,-0.601963}, + {0.423126,0.633321}, + {0.223533,0.010055}, + {0.646706,1.390161}, + {-0.357542,0.682465}, + {-2.009524,-0.830636}, + {-0.778937,-0.933904}, + {0.175269,-1.002111}, + {-0.634257,0.665399}, + {-0.657813,0.290878}, + {0.747272,-0.428248}, + {0.007320,-0.768663}, + {1.248404,-0.212529}, + {-0.270378,0.342898}, + {-0.666666,-1.140755}, + {0.196211,1.501705}, + {0.302202,0.083526}, + {0.991868,-0.189178}, + {0.155298,-1.253545}, + {-0.466703,-0.348936}, + {0.716118,0.723010}, + {-1.105804,-0.353013}, + {0.555094,0.469380}, + {-0.287244,1.500390}, + {-0.246485,0.237558}, + {-0.510462,-0.763731}, + {-0.561608,-0.551817}, + {-0.069471,0.227096}, + {1.137497,0.948345}, + {0.172721,-0.065489}, + {0.748416,0.831896}, + {-0.155555,-0.792121}, + {-0.477453,0.763809}, + {0.124495,0.775665}, + {-0.615673,0.574783}, + {0.204540,0.358135}, + {-0.903123,-0.381671}, + {0.487242,0.995473}, + {-0.926024,0.064502}, + {0.929931,0.258942}, + {0.312395,-0.341280}, + {0.549625,-0.936615}, + {-0.861195,0.434874}, + {1.386344,1.002935}, + {0.150581,1.440757}, + {-0.223814,0.226411}, + {-1.239970,0.911429}, + {0.525911,-0.294822}, + {0.774677,-0.033484}, + {-0.481076,-0.140935}, + {0.097171,0.602864}, + {0.273227,1.072022}, + {0.309890,0.473631}, + {-0.466034,0.111893}, + {-0.691036,0.030113}, + {-0.821156,-0.280252}, + {-0.526502,-0.289481}, + {0.720837,0.871377}, + {0.790615,0.875528}, + {0.797253,0.484843}, + {0.111852,-1.055992}, + {0.169400,0.295747}, + {1.171135,-0.137264}, + {0.290213,0.662161}, + {-0.393626,-0.143884}, + {-0.749653,-0.256666}, + {0.260497,0.439210}, + {1.135854,-0.431511}, + {0.258906,0.670444}, + {-1.066888,-0.119150}, + {0.453981,0.837529}, + {0.411804,0.845536}, + {-1.059449,0.036210}, + {0.764611,0.473083}, + {-0.027347,0.346493}, + {0.339275,-1.308645}, + {-0.110170,-0.533479}, + {-0.509505,0.121273}, + {0.007601,0.222193}, + {0.245116,1.845521}, + {-0.063218,0.106742}, + {0.947333,0.014644}, + {0.082611,-0.363300}, + {0.686892,-0.186853}, + {1.235221,0.021879}, + {-0.257780,0.017378}, + {0.015664,0.281120}, + {0.190295,0.897504}, + {0.379354,0.120590}, + {0.427338,-0.164006}, + {1.172924,0.915224}, + {0.721570,-1.247163}, + {0.084550,0.312004}, + {-1.286085,0.190192}, + {0.284174,-0.119200}, + {-0.010789,-1.373622}, + {-0.185711,-0.418035}, + {0.505770,0.363854}, + {0.061188,0.700576}, + {-0.462928,0.573874}, + {0.740084,-0.629523}, + {0.528961,1.652541}, + {0.623314,0.190869}, + {-0.597870,-0.927126}, + {0.533533,0.251731}, + {0.277124,1.153433}, + {0.851106,-0.786252}, + {-1.330171,1.147345}, + {-0.464697,0.070864}, + {0.212042,-0.145618}, + {-0.687571,1.186801}, + {0.481482,0.178028}, + {-0.149879,0.044565}, + {-0.223578,0.104703}, + {0.574649,-0.285176}, + {-1.833740,0.013517}, + {-1.725660,-0.234990}, + {-0.463536,0.588847}, + {0.902710,0.788674}, + {-0.254637,-0.532033}, + {0.572229,1.349808}, + {-0.063305,-0.215431}, + {0.516429,0.299522}, + {-1.130246,0.308680}, + {-0.900674,-0.507683}, + {-0.583496,0.223002}, + {-0.592279,-0.950809}, + {-0.100426,-0.586777}, + {-0.028076,0.677118}, + {-1.803788,-0.573550}, + {-1.088822,1.183910}, + {0.596317,-1.549580}, + {0.668189,-0.306555}, + {-0.020441,0.607971}, + {0.853888,0.246148}, + {0.879904,1.225752}, + {1.614124,0.830021}, + {-0.291743,-0.135559}, + {0.458523,-0.480775}, + {0.275255,0.138678}, + {0.883940,0.525436}, + {-0.542455,-0.182128}, + {0.999170,-0.332015}, + {0.099745,0.792268}, + {0.708489,0.722752}, + {-1.050482,-0.202141}, + {-1.139348,0.223888}, + {-0.165198,-0.429917}, + {0.319484,0.084528}, + {0.047179,0.526009}, + {-1.274314,-0.347434}, + {-0.377124,0.028014}, + {-0.360881,0.915426}, + {-0.725553,-1.003947}, + {0.135016,0.821066}, + {0.748460,0.802817}, + {0.130105,0.256667}, + {-0.269583,0.719719}, + {0.649401,0.873793}, + {0.987143,0.161186}, + {-0.240362,0.789136}, + {-0.121450,0.924916}, + {-0.259843,0.404871}, + {0.016597,-0.851491}, + {-0.042926,-0.009539}, + {-0.196370,-0.423108}, + {-1.535905,0.622120}, + {-0.853325,0.069428}, + {-0.713308,0.493254}, + {0.023896,0.016209}, + {-1.230161,0.130732}, + {0.290839,-1.217903}, + {-0.256162,-0.539416}, + {0.629392,0.257101}, + {0.982458,-0.309371}, + {1.120927,1.254970}, + {2.080817,-0.873252}, + {-0.419871,0.427512}, + {-0.008634,0.589147}, + {-1.033991,-0.181336}, + {0.243382,-0.186332}, + {0.333660,-0.327366}, + {0.221360,0.080553}, + {0.704698,0.309089}, + {-0.450895,0.130395}, + {0.168094,-0.573576}, + {1.018659,0.358155}, + {0.418952,-0.622499}, + {-0.997778,0.362820}, + {0.222152,-0.219744}, + {-0.166802,0.480155}, + {-0.919339,-0.890832}, + {-0.286039,0.292035}, + {0.448303,-0.301572}, + {-0.449567,1.207951}, + {0.897655,-0.477985}, + {0.503965,-0.545751}, + {0.401514,-1.644501}, + {0.271308,0.286347}, + {-0.284592,0.577983}, + {-0.009884,0.478410}, + {1.517272,-1.524143}, + {-1.437806,0.700884}, + {-0.275556,-1.439763}, + {1.893314,-0.130608}, + {-0.166340,0.557318}, + {-0.691321,0.091720}, + {-0.106616,0.561819}, + {-0.383283,-0.766395}, + {0.775944,0.312252}, + {0.208777,-0.783645}, + {-0.680476,0.061669}, + {0.183494,-1.161476}, + {-0.392678,-0.523162}, + {-0.073376,0.398882}, + {1.160349,-0.807825}, + {-0.986883,0.472541}, + {-0.034247,-0.317474}, + {0.352450,-0.542563}, + {0.578726,0.400276}, + {-0.141064,-0.541357}, + {-0.202180,0.303236}, + {-0.873698,-0.388820}, + {-1.241604,-0.714657}, + {0.264090,-1.498626}, + {0.602075,0.227838}, + {-0.154430,0.667914}, + {-1.462996,0.458992}, + {-0.822634,0.424372}, + {-0.658739,0.865879}, + {-0.422218,0.182616}, + {0.053181,-0.072330}, + {-0.062806,0.762247}, + {0.835446,-1.311912}, + {0.087703,0.026320}, + {0.542328,-0.151886}, + {-1.828505,0.593531}, + {-1.080520,1.086271}, + {0.849256,0.525323}, + {0.497942,0.697413}, + {-0.244531,1.043887}, + {-1.458797,-0.216500}, + {-1.214738,-1.022308}, + {0.159061,-0.098262}, + {0.727952,1.271393}, + {-0.754485,0.954004}, + {-0.176632,0.615747}, + {0.028411,-0.767032}, + {-0.748180,-0.441965}, + {0.242074,-0.788659}, + {0.670060,1.096734}, + {0.154009,-1.243446}, + {0.850586,-1.501833}, + {1.150581,0.774110}, + {-0.989572,0.879881}, + {-0.575178,0.294339}, + {0.003447,0.489239}, + {1.145287,0.324623}, + {0.184091,-1.062771}, + {0.158889,0.215402}, + {0.201577,0.011042}, + {-0.181512,-0.504270}, + {-0.055374,0.590276}, + {-0.531721,-0.884568}, + {-0.209470,-0.372283}, + {-1.255795,-0.759923}, + {0.366333,-0.922058}, + {1.322717,-0.181335}, + {-0.678275,1.164669}, + {-0.750670,-0.137794}, + {0.112897,0.410423}, + {0.191286,0.113733}, + {-0.452766,0.723349}, + {-0.736083,-0.170689}, + {0.692416,0.132405}, + {1.018870,-1.559833}, + {-1.443120,-0.229399}, + {0.716224,0.947647}, + {0.279685,0.653005}, + {0.710520,0.177459}, + {-0.557518,-1.425511}, + {-0.256127,0.315232}, + {-0.082281,0.579783}, + {-0.857951,-0.531888}, + {-0.747733,1.197090}, + {-0.006789,-0.966185}, + {-0.612837,-0.621645}, + {1.132351,0.561013}, + {0.365387,0.280771}, + {0.819015,0.005642}, + {0.077710,-0.275083}, + {-0.589305,0.053577}, + {0.746235,0.106363}, + {0.483010,-0.756925}, + {0.555464,-1.006915}, + {1.083126,-0.706053}, + {-0.114394,-0.110508}, + {1.101602,-1.451006}, + {0.482109,0.584615}, + {0.242472,-1.768441}, + {2.096101,0.679566}, + {-0.527421,-0.071384}, + {1.001152,0.540874}, + {1.515730,-0.408948}, + {-1.081754,-0.587317}, + {-1.534001,-0.908835}, + {0.161009,0.022969}, + {-0.555147,0.084544}, + {-0.049147,0.004229}, + {-0.281130,1.140545}, + {1.877216,0.501126}, + {0.834883,0.052106}, + {0.108568,-1.416109}, + {-0.496393,-0.851726}, + {-0.546421,-0.850434}, + {-0.100497,0.366563}, + {-0.505233,-0.181871}, + {0.003181,-0.257644}, + {-0.427184,0.802357}, + {2.175829,0.214003}, + {-1.470833,-0.859757}, + {0.177123,-0.005589}, + {-0.155512,-0.028954}, + {-0.576782,-0.183170}, + {0.659928,0.889550}, + {0.547329,-0.667458}, + {1.543267,-0.883763}, + {-0.027341,-0.587168}, + {-0.767299,0.181322}, + {-0.058809,0.621716}, + {-0.136666,0.112151}, + {1.320616,-0.923620}, + {-0.758136,0.563569}, + {-0.896224,0.826225}, + {0.415972,1.835909}, + {-0.226084,0.573171}, + {0.648683,0.868590}, + {0.148597,0.095773}, + {-0.923255,-0.006413}, + {0.008498,0.345011}, + {-0.438936,-0.177137}, + {-0.220799,0.289912}, + {0.374629,-1.246758}, + {-0.405352,-0.920192}, + {0.267008,0.274742}, + {-0.976383,-0.137177}, + {0.688771,1.380999}, + {-0.478994,-0.518246}, + {0.005349,0.286922}, + {-0.296630,0.203362}, + {-0.543880,-0.873593}, + {1.511098,-0.907825}, + {0.433183,-1.112696}, + {0.716750,-0.497192}, + {0.545947,0.471261}, + {1.624519,-0.037766}, + {-0.383763,-0.364185}, + {-0.361717,0.471989}, + {-0.997984,1.419701}, + {0.816524,-0.299520}, + {-0.245384,0.189731}, + {0.065447,-0.059209}, + {0.779328,0.204790}, + {0.731539,-0.345297}, + {0.404574,0.248687}, + {1.043347,2.307089}, + {0.334605,-0.253063}, + {-0.216840,-0.098456}, + {0.350238,-0.382642}, + {0.349119,-0.532957}, + {-1.859158,-0.233730}, + {0.862392,-0.445325}, + {-0.101752,-0.036104}, + {-0.378956,-0.338704}, + {-0.994805,0.464318}, + {-0.996382,0.208659}, + {0.808323,0.455032}, + {-2.112046,0.061540}, + {0.819598,0.624593}, + {0.878981,1.053073}, + {-0.341489,-0.442258}, + {-0.496671,-0.854729}, + {0.065132,0.231571}, + {-0.246478,0.530029}, + {-0.284105,0.054951}, + {0.376465,-0.172238}, + {0.299234,0.652101}, + {-0.627995,1.886543}, + {-0.482888,-0.856058}, + {-0.830026,-0.832774}, + {0.779929,0.337171}, + {-0.369851,-0.412797}, + {-0.432700,0.692209}, + {-0.065776,1.142133}, + {1.054275,-0.392488}, + {-0.718737,-0.644947}, + {-0.076992,-0.542669}, + {-0.175216,0.328426}, + {-1.591234,-0.008631}, + {-0.369091,-0.575943}, + {-0.664370,0.357384}, + {-0.223916,-0.159983}, + {-0.524674,0.109124}, + {0.980964,0.285221}, + {1.085013,0.302149}, + {0.239054,-1.200352}, + {-1.131626,0.880129}, + {0.611328,0.462691}, + {0.109595,-0.038623}, + {0.137486,0.811529}, + {0.196871,-0.418142}, + {0.699526,-0.181672}, + {-0.998589,0.332045}, + {-0.339367,-0.358573}, + {-0.870253,0.811889}, + {0.424311,2.218276}, + {0.122027,0.056903}, + {-0.485555,-0.599874}, + {-0.023325,0.457989}, + {-0.257390,0.531017}, + {-0.594800,-0.363526}, + {1.037002,0.461854}, + {0.667577,0.489237}, + {0.025804,0.603610}, + {-0.453581,-0.162107}, + {0.230955,-0.243543}, + {-0.669782,0.966822}, + {-0.624782,-0.044558}, + {-0.787855,0.834564}, + {-0.309755,-0.555690}, + {0.895544,0.561778}, + {-0.081447,-0.146939}, + {0.741198,-0.128052}, + {0.669056,0.986545}, + {-0.747874,0.482845}, + {0.073550,-0.909752}, + {-0.872751,-0.413878}, + {-0.863929,-0.294266}, + {1.093727,-0.577195}, + {-0.161357,0.324918}, + {0.125704,0.723239}, + {-0.766171,-0.998274}, + {-0.023512,0.626686}, + {-0.790729,-0.296770}, + {2.140339,0.378394}, + {-0.262331,0.246625}, + {-0.856882,-0.281878}, + {0.997209,0.093078}, + {1.148219,-0.546145}, + {-0.030454,0.592030}, + {0.076696,0.233782}, + {-0.141260,-0.777390}, + {-0.589189,-0.483685}, + {0.289672,0.386135}, + {-1.264861,-0.995417}, + {-0.042752,-0.532604}, + {-0.134781,0.365284}, + {-0.340780,1.472232}, + {-1.483415,0.914143}, + {-0.283508,0.156881}, + {-0.736152,-1.343692}, + {-0.096745,0.290601}, + {0.091744,0.223455}, + {-0.353464,0.284825}, + {-2.136104,-0.528703}, + {0.494303,0.010275}, + {0.096905,-0.401126}, + {0.727808,0.185508}, + {-0.613681,0.534158}, + {1.044872,0.971303}, + {0.717104,0.100286}, + {-1.419618,-0.604448}, + {-0.410767,-0.231726}, + {0.848536,0.951917}, + {0.746859,-0.161283}, + {-1.056914,-0.626140}, + {-0.302984,0.411916}, + {-0.391683,0.373145}, + {-0.314457,0.491804}, + {1.239795,-0.694703}, + {-0.168077,-0.742324}, + {0.053671,0.573151}, + {1.116908,-0.547143}, + {-0.580176,1.202944}, + {0.088589,-0.455011}, + {0.779909,0.947051}, + {-0.559228,-0.818329}, + {-0.112108,-0.428851}, + {0.483455,0.814911}, + {1.219918,-1.265525}, + {-0.808586,0.580155}, + {-0.538486,-0.056154}, + {0.696324,0.122801}, + {-0.312645,-0.640077}, + {0.504048,-1.031634}, + {0.178747,0.494393}, + {1.744485,1.430984}, + {-0.106728,0.085838}, + {-0.572292,0.236523}, + {0.052278,0.163252}, + {0.083152,-0.214327}, + {0.114333,0.425771}, + {0.359542,-0.296919}, + {-0.935315,0.054319}, + {0.076361,-0.824908}, + {-0.081657,0.104635}, + {-0.267140,-0.395640}, + {0.426262,-1.206860}, + {0.257655,0.559848}, + {0.244592,1.151796}, + {0.897633,-0.515393}, + {0.418324,0.647156}, + {-0.741549,0.112829}, + {0.988401,-0.625204}, + {0.369894,-0.802808}, + {0.658272,-2.303792}, + {-0.215105,1.646744}, + {0.519888,1.012419}, + {-0.238965,-0.324462}, + {-0.112710,0.191850}, + {-0.066331,-1.146826}, + {-0.038528,-0.023964}, + {0.373568,0.001974}, + {-0.864264,-0.906543}, + {0.679871,0.421732}, + {-0.043741,1.101931}, + {-0.552452,-0.138525}, + {-0.095636,-0.883681}, + {-0.072871,0.876045}, + {-0.238791,0.132820}, + {0.244078,-0.390211}, + {-0.082340,0.487018}, + {0.796116,0.096262}, + {0.408338,0.230686}, + {-0.441585,-0.626388}, + {0.365510,0.719968}, + {0.126699,-0.388437}, + {0.110592,-0.075274}, + {2.264902,-1.563334}, + {-0.272466,-0.015424}, + {0.608222,1.351945}, + {-1.147737,1.113406}, + {0.284979,-0.205787}, + {-0.450449,0.238860}, + {1.027885,-0.840673}, + {-0.455186,-0.221859}, + {-0.938632,-2.082159}, + {1.391911,0.802204}, + {0.975475,-0.276338}, + {-0.243330,-0.064295}, + {0.138971,0.536216}, + {0.691166,0.177819}, + {1.026026,-1.879955}, + {-0.187583,0.063026}, + {-0.074402,-0.288843}, + {-0.243687,0.652614}, + {-1.212718,-0.767727}, + {0.251387,0.506600}, + {-0.660165,0.422242}, + {0.679188,1.371130}, + {-0.170699,-0.614176}, + {0.520129,-0.476992}, + {0.848435,-0.401178}, + {0.405024,-0.093561}, + {0.626143,0.076985}, + {0.295405,-0.762852}, + {0.549177,0.725065}, + {0.526664,0.156528}, + {0.977468,-0.889557}, + {-0.501570,-0.343316}, + {-2.000729,-1.623071}, + {-1.946962,0.328553}, + {0.777598,-0.856117}, + {-0.326491,0.100360}, + {0.198779,-0.141495}, + {-0.995361,-1.077920}, + {0.047623,-0.345042}, + {1.887429,-0.220347}, + {-0.157694,0.558083}, + {0.462495,-0.577463}, + {-0.215078,-0.858704}, + {1.253739,0.253756}, + {-0.169634,-1.005008}, + {-0.047497,0.740879}, + {-0.581666,0.040685}, + {-0.201745,1.662973}, + {0.317519,-1.047738}, + {0.967803,0.032915}, + {0.212464,0.089187}, + {0.718780,0.944362}, + {-1.948257,-0.331151}, + {0.922229,-0.646998}, + {-0.627500,0.378164}, + {-0.222201,-1.313254}, + {-0.266142,0.014479}, + {-0.424176,-0.993625}, + {-0.059820,0.319289}, + {-0.843761,-0.433096}, + {0.087394,-0.412266}, + {0.305914,-1.210798}, + {0.471462,0.643052}, + {1.252232,0.000904}, + {0.216403,-0.122659}, + {1.216662,0.381311}, + {1.296341,-0.140316}, + {-0.022925,0.194975}, + {0.862409,0.620792}, + {0.064807,1.351515}, + {-0.565969,-0.236810}, + {-0.155437,0.605360}, + {0.051996,0.325921}, + {0.150445,0.429124}, + {0.459964,0.511976}, + {0.428904,0.323586}, + {0.188316,-0.513317}, + {0.939000,1.371945}, + {0.649626,-0.024783}, + {1.376851,0.200015}, + {-0.048111,-1.183880}, + {-0.786435,-0.777301}, + {-0.241709,1.388115}, + {-0.109006,0.946566}, + {1.156840,1.561297}, + {-0.127523,1.700414}, + {0.761736,-0.883463}, + {-1.099255,-0.579362}, + {1.338325,0.799131}, + {-1.021709,0.379151}, + {-0.994399,0.063684}, + {0.818383,-0.273057}, + {0.668366,-0.297543}, + {-1.015779,0.889539}, + {0.913941,-0.629156}, + {-1.700678,0.079532}, + {0.256160,-0.369452}, + {0.150019,0.098158}, + {-0.119020,-1.045646}, + {0.741243,-0.716726}, + {-1.108436,0.863056}, + {0.307252,0.506812}, + {-0.171352,-0.503576}, + {1.261155,0.176500}, + {0.174007,-0.712686}, + {-0.141806,0.330990}, + {-0.109117,-0.228317}, + {0.203634,0.606610}, + {-0.712412,0.250541}, + {-0.137947,0.768827}, + {-0.744735,0.914129}, + {-1.167755,0.152721}, + {0.327150,-0.113608}, + {0.177006,-0.387882}, + {0.848800,0.884244}, + {-0.111614,-0.152304}, + {-0.300267,0.243189}, + {0.093467,0.290017}, + {1.352682,0.983666}, + {0.299551,0.490373}, + {-0.353636,0.504747}, + {0.613392,-0.069319}, + {1.054224,-0.871011}, + {2.339625,-0.344715}, + {-1.010481,0.230538}, + {-0.539544,-0.583309}, + {0.499012,0.102340}, + {-0.575380,0.783295}, + {0.805940,0.307558}, + {0.417599,-0.060720}, + {-0.177191,-0.033481}, + {0.109710,-0.280558}, + {0.446148,-0.888981}, + {0.195612,-0.768271}, + {0.039506,0.628468}, + {-0.492624,-0.504992}, + {-1.396420,-0.011736}, + {-0.046356,0.570300}, + {1.085142,-1.294011}, + {0.752542,-0.090279}, + {-1.473829,0.875925}, + {0.761430,-0.161165}, + {0.959718,0.258992}, + {0.460259,0.467090}, + {0.108088,-0.414908}, + {0.842820,0.796490}, + {0.248226,0.228333}, + {-0.166433,-2.038801}, + {-1.326628,-0.722473}, + {-0.475355,0.696458}, + {0.138056,0.500725}, + {0.168092,-0.866839}, + {0.019798,-0.447601}, + {-0.724926,0.046180}, + {-0.276801,1.054389}, + {0.003609,-0.044388}, + {-0.692568,0.378780}, + {-0.950437,-0.173717}, + {0.251268,-0.282029}, + {-0.439649,0.031710}, + {-1.080425,-0.215370}, + {0.719048,-0.338402}, + {-0.687926,-0.765291}, + {-0.401951,-1.098793}, + {-0.568740,-0.550765}, + {-1.100182,-1.817952}, + {0.427277,0.515781}, + {-0.227288,0.535524}, + {0.311561,-0.427903}, + {0.531886,0.638625}, + {-1.225598,-0.291583}, + {-0.123388,-0.705261}, + {0.958207,0.537159}, + {0.328784,-0.348955}, + {0.027395,-0.081869}, + {0.067524,0.032020}, + {0.528416,-0.759115}, + {0.941596,-0.896593}, + {-0.219845,-0.026498}, + {-0.032095,1.010285}, + {-0.610792,0.633952}, + {0.108644,0.649716}, + {0.552711,0.848451}, + {0.201063,0.583580}, + {-1.261548,0.388021}, + {0.890668,-0.175176}, + {0.607208,-0.307948}, + {-0.205981,0.041344}, + {-0.776250,0.177243}, + {0.337239,0.161071}, + {-0.037705,-0.120282}, + {-0.014045,-1.241609}, + {-0.555803,0.188605}, + {0.241814,-0.987252}, + {-0.463139,0.874492}, + {-0.070504,0.160308}, + {-0.178391,0.972757}, + {-0.366224,-1.177044}, + {0.971867,0.479103}, + {0.125259,0.461216}, + {0.694764,-1.494325}, + {-0.277845,0.320865}, + {0.616292,-0.626879}, + {-0.030863,0.874982}, + {-0.766846,-0.016767}, + {-0.369774,0.258101}, + {-0.149097,0.291851}, + {-0.493542,-0.295266}, + {1.146361,-0.267924}, + {-0.934380,-0.011444}, + {0.415305,0.183752}, + {-0.491891,-0.357477}, + {-0.560602,-0.794771}, + {0.317386,0.323920}, + {-0.500328,-0.562780}, + {0.041451,-0.181370}, + {-0.529525,-0.497591}, + {0.648109,0.580791}, + {-0.582613,-0.249940}, + {-0.051540,-0.826063}, + {1.646775,0.986751}, + {0.481024,-0.258589}, + {-0.789469,-0.719895}, + {0.638624,-0.406398}, + {-0.281974,-0.250588}, + {-0.619277,-0.458814}, + {1.953618,-0.616999}, + {1.097286,0.692794}, + {-0.079763,1.146230}, + {-0.662413,-0.114838}, + {-0.710125,-0.561579}, + {0.652582,-1.218519}, + {-1.107519,-1.568995}, + {-0.128567,-0.868703}, + {1.148380,-0.401765}, + {0.275385,0.300600}, + {0.619924,0.435204}, + {0.536274,-1.285634}, + {-0.410239,-0.168935}, + {0.305748,0.032075}, + {-0.278987,-0.244613}, + {0.272564,-0.215397}, + {0.442925,0.284863}, + {0.343083,-0.985089}, + {0.243655,-0.535491}, + {-0.058256,-0.138061}, + {1.469464,0.252023}, + {0.457389,0.293408}, + {-0.401809,0.313757}, + {0.756131,-0.077182}, + {-0.785143,0.185929}, + {0.335933,0.863780}, + {-0.386318,-0.435270}, + {0.083281,-0.052628}, + {0.228627,-0.248970}, + {0.607702,-0.139063}, + {-0.640376,-1.314560}, + {-0.128571,-0.846763}, + {0.614100,-0.123165}, + {0.129793,-0.321393}, + {-0.266171,-0.648007}, + {0.416713,-0.029613}, + {0.225510,0.728644}, + {0.393598,0.429328}, + {1.597007,-0.340253}, + {0.768635,0.000382}, + {0.010930,0.047671}, + {-0.193073,0.323188}, + {-1.230056,0.049060}, + {-0.445542,-0.226577}, + {-1.104063,-0.513824}, + {0.799375,0.141533}, + {0.706937,0.178929}, + {0.236867,0.128337}, + {-0.097298,-1.042810}, + {-0.735652,0.420616}, + {-0.588963,-0.623118}, + {-1.635909,0.027266}, + {-0.945824,1.046139}, + {-0.697924,-0.368466}, + {0.335071,-0.324357}, + {0.418055,-0.170021}, + {-0.243762,0.064872}, + {0.400947,-0.261076}, + {-0.356738,-0.672932}, + {1.059406,0.747656}, + {0.122394,-0.472220}, + {0.295724,0.705496}, + {-0.593362,0.561189}, + {0.827451,-0.913072}, + {0.575753,-0.582888}, + {-0.449487,-1.203258}, + {0.002070,-0.209496}, + {-0.819372,1.013107}, + {-0.223983,0.409793}, + {-0.105117,-0.240320}, + {0.505813,0.544863}, + {-0.062506,0.840417}, + {-0.074185,-1.498686}, + {-0.050561,-0.531679}, + {-0.407497,0.036355}, + {-0.640938,-0.667689}, + {0.015491,0.043753}, + {0.687209,-1.632878}, + {0.618242,-1.063427}, + {-0.241815,-0.839270}, + {0.602280,0.346705}, + {-0.701291,0.105225}, + {-0.407340,-0.339801}, + {-0.345298,-1.047087}, + {-0.134469,-0.783420}, + {-0.543787,1.086768}, + {-0.222433,-0.012544}, + {0.760408,-0.125045}, + {-0.585757,-1.015366}, + {-0.622145,-0.507983}, + {-0.105669,-0.357043}, + {-0.255007,0.058948}, + {-0.925739,0.274361}, + {-0.375779,-0.555844}, + {0.432849,0.596696}, + {0.057883,-0.368657}, + {-0.451532,-0.509855}, + {-0.756553,-1.048769}, + {-0.348112,-0.540951}, + {-0.831728,-0.598372}, + {0.332533,0.729092}, + {-0.135877,0.565378}, + {0.062568,-0.041090}, + {-0.367750,-0.509901}, + {-0.553719,-0.111947}, + {-1.021522,0.275873}, + {-0.050085,0.315809}, + {-0.928466,0.206772}, + {-1.191365,1.451377}, + {0.920724,1.063243}, + {-0.063332,-0.406468}, + {-0.515630,-1.279352}, + {0.487661,-0.818408}, + {-0.027072,-0.002359}, + {0.227643,0.002201}, + {1.084393,0.067814}, + {0.552847,0.362214}, + {0.199879,0.680228}, + {0.372569,0.685069}, + {0.292540,0.321147}, + {0.363653,0.247260}, + {-0.588959,-0.794473}, + {0.352148,0.263375}, + {0.524180,-1.109269}, + {-0.285997,-0.110195}, + {-1.179159,-0.952197}, + {0.573545,0.373895}, + {-0.224947,0.447142}, + {0.137062,-0.810396}, + {0.027311,-0.504226}, + {1.193193,0.163454}, + {0.554125,0.651387}, + {0.650385,0.140576}, + {-0.818715,-0.166574}, + {0.098850,0.910239}, + {-0.364286,1.396334}, + {-0.209655,-0.775914}, + {-0.370780,-1.208692}, + {-0.047578,0.440463}, + {1.233010,-0.648612}, + {-0.140918,0.321229}, + {0.196838,0.020064}, + {0.376956,0.417526}, + {0.185651,0.879134}, + {0.640523,-0.156284}, + {0.743281,-0.154083}, + {-0.360541,-0.915597}, + {-0.177171,-0.588081}, + {0.960627,-0.156028}, + {0.537350,-0.452252}, + {-0.235733,-0.027291}, + {-0.746237,-0.017686}, + {-0.406613,0.579063}, + {-0.994922,-1.060790}, + {-0.669324,0.430821}, + {-0.398869,-0.634411}, + {0.762944,-0.143725}, + {0.283899,0.878354}, + {-0.070692,-1.069885}, + {1.509989,-0.562410}, + {0.612479,-0.758589}, + {-0.176361,-0.743195}, + {-1.116313,-0.446980}, + {-0.007589,0.391379}, + {0.102751,0.106416}, + {0.704608,-0.302822}, + {0.013309,-0.343502}, + {1.258582,-0.751478}, + {-0.768097,-1.864140}, + {-1.428795,0.401529}, + {-0.620903,-1.088542}, + {-0.328758,-0.244061}, + {-0.351989,-0.302104}, + {0.040004,0.117331}, + {-0.116617,-0.037641}, + {-0.271723,0.244152}, + {0.359241,-0.171465}, + {-0.586401,-0.121233}, + {0.604605,1.161484}, + {-0.403794,1.518033}, + {-0.320099,-1.946147}, + {1.265835,-1.070397}, + {1.028280,0.157896}, + {0.070852,0.788980}, + {-0.628415,-0.602539}, + {-0.452347,0.152041}, + {0.078811,0.062621}, + {0.343871,1.592619}, + {-0.148877,0.159315}, + {-0.000463,-0.181856}, + {-1.639889,-0.376867}, + {0.521937,1.142912}, + {0.935462,-0.231012}, + {0.779969,-0.218677}, + {-0.354689,-0.476571}, + {-0.904562,0.034987}, + {0.125173,0.573088}, + {-0.495766,-1.612758}, + {-2.062263,0.055393}, + {-0.580883,0.751677}, + {0.616167,-0.770758}, + {0.926324,-0.141294}, + {1.046484,-0.562055}, + {0.375710,-0.089429}, + {-1.166185,-0.487809}, + {-0.707975,-0.729558}, + {-0.118322,-0.402670}, + {0.272092,0.594689}, + {0.240115,-0.224296}, + {0.244773,-0.446577}, + {-0.046161,0.215951}, + {1.385255,-0.292633}, + {0.161275,-0.089966}, + {-0.145126,-0.954704}, + {-0.061937,0.085533}, + {-0.448217,-0.232410}, + {-0.295303,0.406249}, + {-0.273240,-0.980753}, + {-0.413078,0.765020}, + {0.565840,-0.524401}, + {0.554666,-0.284595}, + {0.114768,0.187983}, + {-0.890592,-0.266010}, + {0.650560,0.103151}, + {0.586884,-0.342944}, + {0.626604,-1.021207}, + {-1.554120,-0.024893}, + {1.869185,0.210050}, + {-0.012275,0.388102}, + {-0.462074,-0.605148}, + {0.255341,-0.179884}, + {-0.340660,-1.397953}, + {0.187923,0.360639}, + {0.484712,-0.181846}, + {-0.177458,0.360760}, + {-0.482337,-0.081107}, + {-0.253224,0.661932}, + {-0.724755,0.316380}, + {-0.028731,-0.097583}, + {-0.090675,0.918420}, + {-0.288796,-0.874214}, + {-1.281843,-1.346400}, + {-1.975214,0.339394}, + {-0.613541,0.515236}, + {0.250206,0.074632}, + {0.996936,0.863932}, + {-0.782503,-0.162518}, + {-0.086359,-1.378544}, + {0.721407,-0.891762}, + {0.240897,0.580625}, + {-0.133187,1.084532}, + {1.435339,-0.476021}, + {0.283575,0.906435}, + {-0.470645,-0.523456}, + {-0.939491,-0.042648}, + {-0.949484,-0.012379}, + {-0.083733,-0.312338}, + {-0.885689,-0.387254}, + {0.644921,-1.190076}, + {-1.121036,-0.485559}, + {-0.356930,-0.523413}, + {-0.479120,-0.096518}, + {0.952204,-0.417529}, + {0.557766,-1.049478}, + {1.135059,-0.173027}, + {-0.302560,-0.322420}, + {-0.183123,-0.081440}, + {0.074167,-0.077368}, + {-1.407874,0.624530}, + {-0.230311,-0.298617}, + {0.770821,0.424980}, + {-1.662785,-0.094771}, + {-0.287911,0.475809}, + {-0.048476,-0.203032}, + {0.553445,-1.016724}, + {-0.376555,-0.217766}, + {0.114631,-0.345042}, + {-0.593877,0.872006}, + {0.276043,0.101842}, + {0.882983,0.102907}, + {0.001158,-0.755667}, + {0.047028,-0.324113}, + {-0.646981,0.918540}, + {0.291671,0.556886}, + {-0.137889,-1.529846}, + {0.298642,-0.279176}, + {1.768655,-0.293840}, + {-0.235337,-0.109834}, + {0.114141,-1.468380}, + {0.478717,0.202262}, + {-0.370501,-1.198972}, + {-0.151985,0.917563}, + {-0.053941,0.940994}, + {1.249975,-0.625239}, + {0.398662,0.117818}, + {-0.205314,-0.918815}, + {-0.419043,-0.126397}, + {-1.290054,0.482208}, + {0.604014,-0.941747}, + {0.399735,0.820368}, + {-0.249355,1.154546}, + {0.359412,-1.303754}, + {-0.016680,-1.368714}, + {0.248771,-0.238636}, + {-0.263899,0.869256}, + {-0.369987,-0.283830}, + {-0.466650,-0.208697}, + {-1.657492,-0.255177}, + {0.933283,0.293801}, + {2.525568,-0.350252}, + {-0.106274,-0.303690}, + {-0.411917,1.078396}, + {-0.386613,-1.306253}, + {0.971809,-0.252645}, + {0.155680,0.462985}, + {-0.520441,-0.015665}, + {0.566224,-0.363200}, + {0.858518,-0.442505}, + {-0.176691,0.428155}, + {-0.006586,-0.742642}, + {-0.224886,-0.229415}, + {1.261164,-0.739608}, + {-0.669418,-0.283427}, + {1.069320,-0.425814}, + {-1.009479,0.708147}, + {-0.473014,-0.106836}, + {0.283953,-0.549942}, + {-0.853421,-0.329629}, + {-0.464193,0.622219}, + {-0.087188,-0.801405}, + {0.500055,0.318167}, + {1.123225,0.074764}, + {-0.235380,-0.485006}, + {-0.714091,0.030128}, + {-0.239461,-1.534452}, + {1.116795,-0.824399}, + {-0.825487,-0.207473}, + {-0.051835,-0.448793}, + {0.164883,0.984871}, + {0.253362,-0.188939}, + {-0.372140,-0.968723}, + {0.119889,0.519344}, + {1.497227,-0.331945}, + {-1.279538,-0.084243}, + {1.188019,-0.265337}, + {0.213106,-1.016021}, + {0.100412,0.388037}, + {-0.512935,-0.810146}, + {-0.598912,-0.689186}, + {-0.567116,-1.257426}, + {0.086859,-0.193039}, + {-0.940346,0.374944}, + {-0.034308,0.275811}, + {-0.545470,0.096491}, + {-0.093181,0.866228}, + {-1.219487,0.113771}, + {1.206312,0.106241}, + {0.892992,-0.849006}, + {-1.354809,0.769571}, + {0.735957,0.424012}, + {-0.565301,0.510339}, + {-0.899932,0.461990}, + {1.103376,0.451826}, + {0.132011,-0.842416}, + {-0.638797,0.144869}, + {-0.642707,0.416796}, + {-0.427401,0.363543}, + {0.168475,-0.766367}, + {-0.751506,0.061892}, + {0.574152,-0.505695}, + {-0.335072,-0.286006}, + {-0.834026,0.619608}, + {0.547215,0.287132}, + {0.298914,-0.179478}, + {-0.561363,0.759409}, + {0.745341,0.945481}, + {-0.902903,-0.037729}, + {-0.390261,-0.658194}, + {0.279026,0.870289}, + {-0.157925,0.902163}, + {0.536656,1.220876}, + {0.488578,0.348556}, + {-0.531355,0.421049}, + {0.117253,0.950821}, + {0.718010,-0.541365}, + {-0.837644,0.805630}, + {0.181802,-0.456620}, + {-1.144830,-0.841213}, + {0.996041,0.509847}, + {-0.317890,1.355479}, + {0.444140,0.143680}, + {-0.301898,0.640867}, + {0.655019,0.121403}, + {-0.515694,1.185059}, + {0.107950,0.148497}, + {-0.134465,0.366955}, + {-0.413694,-0.651129}, + {-1.609086,-0.006717}, + {1.545435,0.251703}, + {-0.413004,-0.506535}, + {1.058658,-0.827896}, + {-0.625554,-1.151844}, + {0.662481,0.578591}, + {-0.053525,0.667165}, + {-1.458461,0.403909}, + {1.438034,1.671089}, + {0.449605,-0.144770}, + {-0.211705,0.239155}, + {0.737903,-0.691716}, + {-0.892143,-0.156775}, + {1.022161,0.568443}, + {-0.895021,-1.159661}, + {-0.129957,-1.015277}, + {0.025829,0.618146}, + {-0.725841,1.354559}, + {-0.404110,0.239310}, + {-0.381553,-1.030973}, + {0.661700,0.726828}, + {-0.871968,-0.873774}, + {-0.634683,-1.073318}, + {-0.190002,0.527019}, + {0.450145,0.068487}, + {-0.493345,-0.565194}, + {-0.067292,-1.089015}, + {0.311426,-0.162816}, + {0.696492,-1.081337}, + {-0.079561,0.192018}, + {-1.038164,0.001589}, + {-1.209152,0.260031}, + {0.517225,0.673063}, + {-1.070390,0.051018}, + {-0.172812,-0.518776}, + {0.246896,0.360236}, + {1.261445,-1.363637}, + {-0.249520,0.115168}, + {-1.039049,1.002534}, + {0.995219,-0.530594}, + {0.158186,-0.370508}, + {0.269083,-0.100298}, + {0.446531,0.134572}, + {0.163460,-0.234424}, + {0.655361,-0.266745}, + {1.368913,-1.221585}, + {-0.037131,0.339951}, + {-0.094642,0.057267}, + {1.801376,1.555417}, + {-0.674158,-0.035333}, + {1.133275,-0.083941}, + {-0.528994,0.797127}, + {-0.613801,-0.039986}, + {0.326418,0.552173}, + {0.961590,0.195621}, + {0.164999,-0.415260}, + {1.123196,-0.173849}, + {-1.028232,-0.935003}, + {-0.006582,-0.860200}, + {0.017667,0.604943}, + {-0.069771,-0.320669}, + {0.410253,-0.394301}, + {-0.464009,-1.065665}, + {-0.388085,-0.714962}, + {-0.379551,-0.026035}, + {-0.465111,0.046714}, + {0.329026,1.072201}, + {-0.204617,0.340843}, + {0.353240,-0.991605}, + {0.276096,0.606240}, + {0.180433,0.509623}, + {0.603712,-1.428401}, + {-0.288965,0.170324}, + {0.199499,-0.953213}, + {0.555000,-0.156563}, + {-0.332052,-0.212173}, + {-0.551909,-1.110573}, + {-0.701355,-0.256082}, + {0.052215,-0.905251}, + {0.154667,0.287735}, + {-0.375212,0.075292}, + {0.831316,-0.327454}, + {-0.544062,-0.324524}, + {0.375690,0.435796}, + {1.420773,-1.694466}, + {-0.472987,-0.933482}, + {-0.295863,1.125223}, + {1.051997,-0.065696}, + {-0.318684,-0.268566}, + {-0.407761,0.906795}, + {0.611763,-0.834517}, + {-0.577473,-0.618957}, + {-0.056931,1.173181}, + {1.188827,-0.751072}, + {-0.395580,-0.277524}, + {-0.286643,-0.821660}, + {-0.243831,-0.902510}, + {-0.859681,0.635123}, + {0.132016,0.648423}, + {0.176409,-0.202077}, + {0.916956,-0.416387}, + {-0.387859,0.270335}, + {-0.470603,-1.118427}, + {-0.082099,0.536118}, + {-0.319736,0.623595}, + {0.105603,-1.227178}, + {-0.246468,-0.676755}, + {-0.137842,-0.198255}, + {-0.612401,0.267072}, + {0.140070,0.928564}, + {-0.276867,-0.692713}, + {0.330789,0.082247}, + {-0.310965,0.471960}, + {-0.638029,-0.130571}, + {-0.227627,0.371444}, + {1.447594,-0.579724}, + {1.434342,1.967624}, + {-0.533127,-0.360049}, + {0.090985,0.865811}, + {1.621069,-0.655068}, + {-0.107101,0.602642}, + {-0.678090,-0.200194}, + {0.631410,0.856782}, + {0.026655,-0.682962}, + {1.024181,-2.110779}, + {-0.329181,-0.015544}, + {-0.869617,0.964415}, + {-0.574403,0.639381}, + {-0.200844,-0.526831}, + {-0.254985,-0.692828}, + {-0.627544,0.386942}, + {-0.594953,0.059818}, + {-0.728173,0.322703}, + {-0.125809,-0.264083}, + {-0.862048,-0.024952}, + {-0.305275,0.632945}, + {0.503292,0.276135}, + {-1.035994,-0.815081}, + {0.004263,-0.952890}, + {0.188009,-0.695292}, + {-0.490270,-0.076733}, + {-0.847985,1.389987}, + {0.757101,0.356868}, + {-0.744715,0.614691}, + {-1.179587,-1.951262}, + {0.406179,-0.501517}, + {-0.567337,0.303614}, + {-0.351789,1.342365}, + {1.001646,-0.588464}, + {-0.751630,-0.865141}, + {-0.336056,0.681107}, + {0.181667,-0.648438}, + {0.661723,-0.599597}, + {-0.843666,0.930312}, + {0.610179,0.011804}, + {0.637391,0.730488}, + {0.887057,-0.039574}, + {-0.596744,0.306742}, + {0.693533,-0.788946}, + {0.358266,-0.635755}, + {-0.103668,1.012763}, + {-0.409437,0.643533}, + {0.623653,-0.403418}, + {0.974759,-0.268196}, + {0.726314,0.552070}, + {-0.209079,-0.180960}, + {-0.253123,0.174441}, + {-0.343619,-0.120766}, + {0.153239,-1.407465}, + {0.003501,-0.301579}, + {-0.565188,1.263652}, + {0.256238,0.366026}, + {-0.196671,0.887337}, + {-0.842150,1.461294}, + {-0.109778,-0.496130}, + {0.715528,-0.835101}, + {-0.091186,1.525347}, + {1.127749,0.614371}, + {0.816348,0.223844}, + {0.088529,0.545457}, + {0.681807,-0.374392}, + {0.497116,0.065098}, + {1.063631,0.330052}, + {-0.473036,0.034874}, + {-0.157862,-0.001305}, + {0.434218,0.197264}, + {-0.550799,0.054486}, + {0.973037,0.002784}, + {0.493822,1.160678}, + {0.413581,1.777586}, + {0.337161,0.056664}, + {-0.209438,-0.856569}, + {0.312104,-0.137281}, + {-0.812145,-1.333425}, + {-0.687317,1.281605}, + {0.245950,0.130437}, + {-1.137658,-1.119996}, + {-0.321589,-0.976619}, + {1.042918,0.688281}, + {0.126441,-0.281123}, + {-0.690719,0.538968}, + {0.814742,0.984337}, + {0.800806,1.660842}, + {0.253362,0.679494}, + {0.289842,0.084567}, + {0.065649,-1.313600}, + {1.285205,0.734431}, + {0.200443,-0.037244}, + {1.168457,0.074900}, + {0.726807,-0.504987}, + {-0.246237,-0.309694}, + {-0.030608,0.807033}, + {-0.040489,-0.022902}, + {-0.102770,-0.193521}, + {0.760273,-0.024193}, + {0.153393,0.638818}, + {-0.049047,0.072808}, + {-0.751583,0.168734}, + {-0.163908,-0.509905}, + {0.673933,-0.014424}, + {-0.833475,-1.008629}, + {-0.590986,-0.105231}, + {0.643961,0.628600}, + {0.438267,0.052614}, + {0.110321,0.046113}, + {-0.517915,1.355916}, + {0.868033,-0.159152}, + {0.371602,-0.857592}, + {-0.419888,-0.337480}, + {0.558052,0.219982}, + {-1.131058,-1.257138}, + {0.733544,0.933340}, + {-0.646570,-0.253332}, + {-0.419020,0.398702}, + {1.839728,-0.458298}, + {0.357707,-1.077159}, + {0.104771,0.546341}, + {-1.056007,-0.099425}, + {-0.111075,-2.042791}, + {0.053667,1.959269}, + {0.389828,-0.320662}, + {1.618109,0.681527}, + {0.103634,-1.050246}, + {0.915626,0.011762}, + {1.378525,0.843142}, + {-0.180366,-1.548472}, + {0.582354,0.761079}, + {-0.022354,-0.375777}, + {-0.465816,-0.153786}, + {0.803733,1.015041}, + {-0.844731,-0.505638}, + {0.629193,-0.387865}, + {-0.170733,0.143273}, + {-0.240827,0.231065}, + {-1.250344,-0.026121}, + {-0.388932,0.564174}, + {0.216054,-0.002170}, + {0.232108,1.522422}, + {0.519424,-0.502575}, + {-0.052313,0.444903}, + {-0.705677,-0.812735}, + {-1.176015,-1.380785}, + {-1.723397,-0.849389}, + {-0.225763,-0.831275}, + {-0.102199,-0.389384}, + {0.320482,-0.065426}, + {0.050518,-0.353202}, + {0.095464,0.245600}, + {0.610228,-1.495030}, + {0.499674,0.301388}, + {0.079124,-0.689882}, + {-0.176226,0.270693}, + {0.591074,-0.395837}, + {0.962485,1.108556}, + {-0.376415,1.325772}, + {1.593700,-1.306007}, + {-0.669529,0.727318}, + {0.730542,-0.798588}, + {-1.006559,-1.222182}, + {0.105828,-0.657938}, + {-0.965177,-0.739113}, + {-0.235450,0.413555}, + {0.384625,-0.100571}, + {1.362594,-1.289672}, + {1.236262,0.729084}, + {0.648425,-0.684215}, + {0.986055,-0.194520}, + {-1.152769,-0.783978}, + {0.576223,0.548201}, + {0.097504,-0.259566}, + {-0.360024,0.723081}, + {0.607059,-1.003423}, + {-0.227951,-0.734850}, + {-0.294650,-1.235194}, + {0.193334,-1.675714}, + {-0.767385,0.618813}, + {0.098473,-1.515022}, + {0.358150,-0.135228}, + {1.113325,1.368268}, + {-0.151595,-0.246173}, + {-1.570232,-0.023322}, + {-1.226877,-0.155807}, + {1.879898,0.177321}, + {1.050730,-0.192028}, + {0.075023,0.738806}, + {0.439378,0.159967}, + {-0.870739,-0.053774}, + {-0.613293,1.773483}, + {1.022477,0.589100}, + {-1.903232,-0.116118}, + {0.130492,0.364978}, + {-0.889512,0.294264}, + {-0.898750,0.561895}, + {0.251006,0.804611}, + {-0.113566,-0.941961}, + {-0.234088,-0.917563}, + {-0.250283,-0.288450}, + {-0.907878,-0.094818}, + {-0.881149,0.528179}, + {-1.303454,-0.223259}, + {0.206582,0.221846}, + {-1.571029,1.443146}, + {-0.706678,-0.390482}, + {0.141913,0.510894}, + {0.182936,0.421928}, + {-0.119593,0.561059}, + {-0.744027,0.428400}, + {-0.152375,-0.959526}, + {1.160939,-0.069288}, + {-0.076280,0.162181}, + {0.327619,0.155115}, + {-0.530834,0.574725}, + {-0.430831,-0.101593}, + {0.920280,-0.279728}, + {0.031487,-0.263205}, + {-0.576176,-0.109081}, + {0.808516,-0.116405}, + {1.125426,-0.338095}, + {-0.908021,-0.070953}, + {0.115823,0.531403}, + {0.848018,-0.378923}, + {-0.380277,-0.804293}, + {-0.373310,0.893974}, + {-0.330087,0.948002}, + {-0.086096,-0.437250}, + {-0.469167,0.454149}, + {0.970617,0.231241}, + {-0.817633,0.825176}, + {-0.435250,0.430634}, + {1.683802,0.853621}, + {1.351207,0.235931}, + {-0.050678,-0.032962}, + {-0.355436,0.398207}, + {-0.678845,-0.389077}, + {-0.273377,-0.710650}, + {-1.210956,0.678632}, + {-0.755085,-0.086894}, + {-1.100352,0.299255}, + {-0.035763,0.330123}, + {0.322939,1.101242}, + {0.595764,-1.157084}, + {-1.243325,-0.664861}, + {-1.663768,-0.505836}, + {-1.267451,0.873669}, + {-0.455003,-0.043938}, + {0.470999,0.538119}, + {0.579555,-0.717479}, + {-0.802576,0.421240}, + {-0.237682,0.488393}, + {0.862354,0.812298}, + {0.230856,0.213576}, + {0.141439,0.509505}, + {0.206889,0.858483}, + {0.026078,-0.546219}, + {0.781592,-0.388893}, + {-0.123377,-0.794665}, + {0.068495,1.214323}, + {-0.714881,-1.054803}, + {-0.461472,-0.106502}, + {0.562470,-0.529948}, + {-0.709943,-1.806260}, + {0.774827,0.627849}, + {-0.082874,0.781436}, + {-0.301659,-0.219263}, + {0.608640,-0.139735}, + {-0.786892,-1.283778}, + {-0.366386,-1.194705}, + {1.061684,-0.463841}, + {-0.559144,0.542831}, + {-0.177584,1.693041}, + {-0.677950,0.092316}, + {0.408613,-0.701200}, + {0.245716,-0.034669}, + {0.997366,-0.451955}, + {-0.206925,0.136163}, + {0.352996,1.213371}, + {0.148059,0.397297}, + {1.053839,0.169786}, + {0.573741,-0.636227}, + {0.612745,-0.530977}, + {0.516292,0.150499}, + {-0.036636,1.234072}, + {-0.283012,0.155921}, + {-0.487859,0.275921}, + {-0.763096,1.543259}, + {-1.012146,0.104486}, + {0.648292,0.052648}, + {1.113207,-1.334106}, + {1.621335,-0.326147}, + {0.044245,1.144835}, + {-0.604862,-0.428931}, + {0.208504,0.480038}, + {0.621283,-0.263113}, + {-0.268506,-1.286471}, + {-1.190871,-0.981942}, + {-0.343443,-0.970982}, + {-0.443971,0.172888}, + {-0.529676,0.789394}, + {-0.747990,-0.355262}, + {0.260979,-0.616260}, + {-0.364506,0.875792}, + {0.230262,-0.650448}, + {-0.157869,-0.224029}, + {-0.138491,0.273796}, + {-0.337906,0.142918}, + {-1.126425,1.012362}, + {-0.045829,-1.204217}, + {-0.040201,0.072991}, + {0.095082,-0.512595}, + {0.391243,-0.697281}, + {0.028836,0.470680}, + {-0.254693,0.317709}, + {0.527280,0.185890}, + {0.679726,-0.539661}, + {0.536096,0.202399}, + {0.636754,-0.073378}, + {-1.635579,0.303301}, + {-0.055276,-0.309005}, + {-0.377681,-0.618366}, + {-0.570992,0.899069}, + {0.318571,-1.082007}, + {-0.501136,-0.050577}, + {0.463349,-0.492909}, + {-0.586518,1.437252}, + {-1.498805,0.669497}, + {-0.668884,0.501976}, + {0.849874,-0.274321}, + {1.503969,0.089087}, + {0.495296,-0.282796}, + {0.643539,-0.319368}, + {-0.003123,0.503895}, + {0.448926,0.415716}, + {1.300971,1.185440}, + {0.666304,-1.011385}, + {-0.501095,-0.437884}, + {0.126722,-0.628526}, + {0.602820,0.306907}, + {-1.052462,1.759648}, + {0.804709,-0.383309}, + {-0.783674,0.703607}, + {0.555353,-0.894576}, + {0.367530,-1.251446}, + {-0.379656,1.053925}, + {-0.368063,1.523577}, + {-0.512766,1.220449}, + {0.310470,1.126447}, + {-0.668240,-0.719845}, + {1.311328,-0.273581}, + {1.193026,0.758730}, + {0.011468,0.411093}, + {0.679916,0.227215}, + {0.200297,-0.461842}, + {0.203994,-0.360266}, + {-1.711995,-0.791191}, + {-0.587169,-0.795622}, + {-0.126559,0.539690}, + {-0.311544,0.215622}, + {0.624084,-0.939499}, + {0.451027,0.963659}, + {0.053951,0.473962}, + {-0.378173,-0.754404}, + {-0.483375,0.169867}, + {0.327772,0.443014}, + {0.438977,-0.918669}, + {0.272163,0.913450}, + {-1.148166,-1.651656}, + {0.678756,0.022641}, + {-0.162722,1.419714}, + {-0.442976,-0.324650}, + {-0.101127,-0.176612}, + {-0.257379,-0.900592}, + {-0.692997,-0.167735}, + {-0.576470,-1.033809}, + {0.129483,-0.795888}, + {-0.091165,-0.991940}, + {-1.546060,0.754515}, + {-1.955953,0.823558}, + {-0.507420,-0.342439}, + {0.839643,0.549449}, + {1.041734,-0.351442}, + {-0.099299,0.427514}, + {0.396409,0.685967}, + {1.582812,1.019917}, + {0.095047,-1.033650}, + {1.097222,0.232333}, + {0.235403,0.744469}, + {-0.956056,-0.248764}, + {-0.007542,1.351857}, + {0.829327,0.165330}, + {1.934778,0.740345}, + {-0.042057,-0.505659}, + {0.029940,0.584136}, + {-0.660522,0.974654}, + {0.550707,0.625208}, + {-0.736240,-0.090338}, + {-0.773422,1.383895}, + {0.164752,0.971219}, + {-0.078130,-0.016604}, + {1.174557,-0.671066}, + {0.709217,-0.447833}, + {1.173960,0.447247}, + {-0.452182,-0.283778}, + {0.221362,0.238256}, + {0.438321,1.115051}, + {0.385345,-0.134963}, + {-0.116907,-0.452026}, + {1.326754,-0.143928}, + {0.377629,0.647795}, + {0.706637,0.054253}, + {0.484648,0.233001}, + {0.559643,-0.014661}, + {0.442585,0.019897}, + {-0.481860,0.319169}, + {-1.873430,-0.373696}, + {-1.468880,-0.338588}, + {-0.564341,0.015573}, + {0.135980,-1.308351}, + {-0.209918,0.409567}, + {0.134787,0.555218}, + {-0.280328,0.229205}, + {0.356642,0.145734}, + {1.209981,-0.768739}, + {0.323467,0.471938}, + {-0.538486,0.833259}, + {0.377447,1.471453}, + {-1.542076,0.534062}, + {0.308006,-0.915789}, + {0.667877,0.838388}, + {-1.325876,-0.147813}, + {0.049283,-0.409670}, + {0.822751,-0.324401}, + {-0.248490,0.044080}, + {0.397286,-0.527903}, + {0.267321,0.173917}, + {0.097825,-0.258165}, + {0.156112,-0.403906}, + {-1.493610,-0.584519}, + {1.035700,-0.624181}, + {0.193366,0.367275}, + {-0.591444,-0.918827}, + {-0.031241,1.199647}, + {-0.635795,-0.401301}, + {0.292380,-1.257504}, + {0.790531,0.283300}, + {-0.612248,-0.856913}, + {-0.003711,0.557474}, + {0.046168,0.504684}, + {-0.258980,-0.145285}, + {-0.700174,0.664606}, + {-1.044332,0.112828}, + {-1.203219,-0.050509}, + {-0.098679,0.681808}, + {0.117978,1.020073}, + {-0.138431,-0.213658}, + {-0.373621,0.314261}, + {-1.125660,0.217905}, + {0.579220,0.315413}, + {0.819870,-0.421409}, + {0.215607,0.366435}, + {-0.391899,-0.353763}, + {0.031600,0.391145}, + {0.779146,-0.001210}, + {-0.371743,0.236842}, + {0.044205,0.077276}, + {-0.029682,0.564854}, + {-0.803910,0.609822}, + {0.083413,-0.621601}, + {-0.569837,-0.201887}, + {-1.037479,0.198802}, + {0.870755,-0.457554}, + {-0.644685,0.562159}, + {-0.368567,-0.571753}, + {-0.908622,0.593380}, + {-0.022836,-0.725834}, + {-0.212127,0.760100}, + {0.182831,-0.768164}, + {1.377295,0.894573}, + {-0.388203,-1.179584}, + {-0.366572,0.592177}, + {-1.357572,1.221986}, + {-1.467493,1.254612}, + {0.728275,1.398245}, + {0.270538,-0.980435}, + {-0.109704,0.391466}, + {-0.819701,-0.282182}, + {-1.576902,-0.264228}, + {-0.293211,-0.354652}, + {0.932537,0.499530}, + {0.124587,0.187973}, + {-1.182933,0.450079}, + {0.045172,0.295898}, + {-0.952133,-0.026615}, + {-1.077399,1.492134}, + {2.165598,-0.025851}, + {0.615697,-0.448814}, + {0.371116,0.104843}, + {-0.637342,0.743420}, + {-0.339935,1.886651}, + {-0.118879,-0.518939}, + {-1.136926,0.479470}, + {0.151684,0.264658}, + {-0.017438,0.081592}, + {0.013367,-0.432744}, + {0.818175,-0.660425}, + {0.169977,1.246542}, + {0.046875,-0.572609}, + {0.971265,1.007843}, + {0.552874,-0.763970}, + {0.402362,0.688291}, + {-0.177514,0.862440}, + {0.727237,0.600365}, + {-0.123267,-0.320214}, + {-0.973245,-1.093332}, + {-0.622050,0.480692}, + {0.850534,0.250697}, + {1.435793,-1.334161}, + {-0.297031,-1.179966}, + {0.304224,0.432995}, + {-0.319411,0.044257}, + {-0.130799,-0.801940}, + {0.073259,-0.088438}, + {-0.115683,0.651869}, + {-1.284032,0.744815}, + {-0.572874,1.298015}, + {0.284922,-0.246805}, + {0.516957,0.398332}, + {-0.407991,-0.949022}, + {0.136622,0.969059}, + {0.040189,-0.190255}, + {-0.287121,-0.074766}, + {-0.610242,-0.365421}, + {-0.695631,0.472487}, + {-0.761210,-1.011743}, + {-0.159401,0.335151}, + {-0.127480,-2.513513}, + {-0.621617,-0.001532}, + {-0.233636,0.540107}, + {-0.615082,0.740370}, + {0.728082,-0.745504}, + {0.755201,-0.364350}, + {1.455688,0.113219}, + {-0.384111,1.799205}, + {-0.060414,0.594761}, + {-0.645534,-1.282521}, + {1.354648,-0.365049}, + {0.700581,-0.261592}, + {-0.420933,0.412919}, + {-0.118914,-0.126970}, + {-0.369305,-0.651979}, + {0.833302,-0.776442}, + {-0.889951,0.333417}, + {0.717829,0.832634}, + {-0.780598,-0.353698}, + {-0.126353,0.156872}, + {-0.870306,-0.186695}, + {0.188068,-0.272942}, + {-0.853431,-0.099724}, + {-0.972554,-0.599254}, + {-1.109184,-0.599650}, + {0.911559,0.240889}, + {-0.351639,-0.044241}, + {0.189684,-1.491880}, + {0.667445,-0.069260}, + {0.369786,-0.124370}, + {0.521743,-0.479616}, + {-1.023666,0.709321}, + {-0.009410,-1.304473}, + {0.457866,-0.753617}, + {0.514681,-1.122756}, + {0.052715,0.047106}, + {-0.308785,-0.058814}, + {-0.543798,0.853832}, + {0.057451,0.111738}, + {0.023706,0.449120}, + {0.854094,-2.321072}, + {-1.288841,0.610626}, + {1.070943,0.900281}, + {-0.314136,0.986491}, + {-0.484965,-0.906231}, + {-0.534703,-0.786444}, + {0.529497,0.880418}, + {-0.594563,-0.523274}, + {-0.714857,-0.819102}, + {0.846788,-0.989649}, + {-0.535982,0.146718}, + {-0.205090,-1.063691}, + {0.080422,-1.044347}, + {0.026911,0.228324}, + {1.491431,0.321161}, + {0.661557,-0.309540}, + {0.438783,-0.302408}, + {0.264915,1.176531}, + {0.410967,-0.019055}, + {0.147043,-0.649251}, + {0.492513,-0.013112}, + {0.332999,-0.478951}, + {0.068906,0.560099}, + {-0.486798,-0.215182}, + {-0.415900,0.858515}, + {0.705293,1.097754}, + {-0.154359,0.384802}, + {-0.221449,-0.178315}, + {-0.575917,0.074498}, + {0.146447,0.313370}, + {0.126790,0.398399}, + {0.289635,-0.126919}, + {-0.074227,-0.213796}, + {-0.065885,0.678123}, + {0.656923,0.499602}, + {-0.564350,-0.575801}, + {-0.629272,1.852769}, + {-0.652193,-1.012536}, + {0.935159,0.505553}, + {0.010577,0.401854}, + {0.400071,0.797892}, + {-0.638037,0.362640}, + {-1.348614,-0.440950}, + {0.377069,-0.621824}, + {0.782456,0.777046}, + {0.279392,-0.409277}, + {-0.093743,-0.882047}, + {0.432319,-0.202289}, + {-0.854399,0.269268}, + {-0.569395,-0.550870}, + {-1.305619,-0.766131}, + {0.399734,0.356151}, + {-0.587518,0.990603}, + {-0.461472,-0.854095}, + {-0.776429,1.123592}, + {-2.094551,0.016854}, + {-0.852694,-0.164675}, + {-0.752425,-1.146923}, + {0.235446,0.097446}, + {-0.191573,0.584031}, + {0.036355,0.837690}, + {0.950405,-0.468673}, + {0.022319,0.946512}, + {-0.666949,0.540367}, + {-0.517209,-0.408994}, + {-1.497582,1.429821}, + {-1.424709,-0.265863}, + {1.067800,-0.018164}, + {-0.403612,0.521463}, + {0.520736,0.179845}, + {1.558446,2.297753}, + {-0.611957,0.341035}, + {0.574676,0.189530}, + {0.258192,-0.367458}, + {-0.515869,-0.068053}, + {0.320528,0.981756}, + {0.756459,0.855889}, + {-0.436195,0.505209}, + {-0.197706,-0.042505}, + {0.570348,-0.442366}, + {0.618202,-1.234316}, + {-0.246493,0.145392}, + {0.249191,0.204177}, + {-0.504036,-0.337933}, + {0.265983,0.156993}, + {1.010411,-0.820082}, + {0.967946,-1.061406}, + {-0.994254,0.516854}, + {0.246911,-1.559882}, + {-0.224508,-1.563141}, + {-0.420039,-0.552007}, + {0.078066,-0.074774}, + {-0.203336,-0.297024}, + {-0.109335,0.225023}, + {1.250758,-0.808705}, + {-1.025240,0.921113}, + {0.077180,1.828942}, + {-0.881796,-0.755137}, + {-0.091333,-1.279348}, + {-0.062119,0.378901}, + {-1.499594,0.831770}, + {-1.371222,0.612782}, + {0.282594,0.759345}, + {0.601033,-0.540685}, + {0.873884,-2.107622}, + {-0.413409,1.183102}, + {0.035613,0.033901}, + {-0.371701,-0.512521}, + {-0.390149,0.589897}, + {-0.421352,-0.052553}, + {0.213716,-0.657424}, + {-0.090430,-0.071487}, + {0.058196,-0.653575}, + {-0.705436,0.067998}, + {-0.053729,-0.957150}, + {-0.271140,0.371048}, + {1.052676,1.059416}, + {1.043681,0.143528}, + {1.356857,0.687629}, + {0.091930,1.509739}, + {0.339513,0.792737}, + {-0.055242,1.281981}, + {0.029510,0.013582}, + {-0.120412,0.188881}, + {-1.249855,-0.851677}, + {-1.079515,-0.452445}, + {0.393657,-1.150160}, + {-0.008601,-0.141600}, + {0.225137,0.963209}, + {-0.201913,0.770309}, + {-0.791302,-0.165032}, + {0.517454,-1.029753}, + {-0.607919,-0.209344}, + {0.527461,-0.735633}, + {-0.266679,-0.286525}, + {-1.703636,-1.176549}, + {-0.200180,0.435851}, + {0.269835,0.613393}, + {0.745864,-0.434237}, + {0.471439,1.529898}, + {0.363553,-0.002981}, + {-0.338163,0.906062}, + {0.883375,-0.307422}, + {-1.120693,-0.268472}, + {1.221899,2.130810}, + {0.141656,0.031991}, + {-1.233096,0.667534}, + {0.624299,0.425867}, + {-0.170222,0.592248}, + {1.076470,1.444681}, + {-0.183938,0.142772}, + {-0.821524,-1.008571}, + {-0.146813,0.404454}, + {0.684416,-1.073105}, + {1.117901,-0.560429}, + {0.530161,-0.027038}, + {-0.253069,-1.639337}, + {-0.717668,-1.081437}, + {0.653127,0.114892}, + {0.095271,0.140140}, + {-0.053616,0.987509}, + {-0.122837,0.191773}, + {-0.706302,0.420038}, + {1.186340,1.028863}, + {-0.117144,-0.018757}, + {1.239061,-0.216330}, + {0.295645,0.318719}, + {-0.287663,0.752288}, + {1.436414,1.607598}, + {-1.174806,0.781807}, + {0.919130,0.760221}, + {-1.465950,-0.301338}, + {-0.028985,0.532472}, + {0.108693,0.221737}, + {-0.679071,-0.035699}, + {0.046814,-1.058415}, + {0.343905,0.344772}, + {0.570854,0.524909}, + {0.315360,0.196929}, + {-0.434684,1.005404}, + {-0.404268,0.684464}, + {-0.747997,-0.269495}, + {-0.358844,0.247169}, + {-0.714708,-0.157657}, + {1.004165,0.448171}, + {-1.235014,-0.550712}, + {0.442388,-0.935624}, + {0.702100,-0.807752}, + {0.358939,-0.783201}, + {-1.133754,-0.837761}, + {-0.467297,-0.165956}, + {1.008790,0.066224}, + {-0.272849,0.330043}, + {-1.966277,1.246796}, + {-0.917265,-1.017836}, + {-0.027061,-0.299158}, + {1.124767,-0.984969}, + {0.146385,1.049555}, + {0.558241,0.085019}, + {-0.158555,-1.463400}, + {-0.133509,-0.671532}, + {0.666487,-0.563999}, + {0.656119,0.119249}, + {1.041716,0.447584}, + {-0.025932,0.527085}, + {-1.593675,-0.940512}, + {0.218719,0.224522}, + {0.858700,-0.400714}, + {-1.323566,-1.320280}, + {-1.019153,-0.525948}, + {1.737703,0.326414}, + {-0.638443,0.055007}, + {0.086753,0.243740}, + {-0.885970,0.377519}, + {1.184245,0.505174}, + {0.202493,-0.306676}, + {1.189207,-0.823331}, + {0.398937,0.120145}, + {-0.646384,0.314075}, + {-1.137885,-0.095339}, + {0.948864,-0.716966}, + {0.463843,-0.358252}, + {0.980654,-0.901849}, + {-1.215558,-0.298514}, + {0.270095,0.365947}, + {0.140718,-0.306677}, + {0.587339,-0.550040}, + {0.855364,-0.692435}, + {-0.456061,-0.045239}, + {0.462259,-0.725169}, + {0.724895,0.455988}, + {-1.028200,-0.257751}, + {-1.072973,-1.142716}, + {-0.576397,-1.548709}, + {-0.284426,0.134787}, + {-1.039392,0.502217}, + {-0.217312,-0.180047}, + {0.694919,0.186815}, + {-0.847320,-1.048344}, + {-1.022385,-0.565583}, + {-0.660343,0.410869}, + {-0.718115,-0.544506}, + {-0.182651,0.469230}, + {-0.231679,-0.362006}, + {-0.015608,0.083363}, + {1.222271,-0.723882}, + {-0.508861,-0.822197}, + {-0.902930,0.636436}, + {0.112424,-0.324648}, + {0.315799,-0.188587}, + {1.024169,-0.474601}, + {-1.152947,0.595031}, + {0.902782,-0.236906}, + {-0.241519,0.977620}, + {-1.518523,-0.585001}, + {-0.000930,0.727162}, + {0.877585,1.068244}, + {-1.638870,-0.206063}, + {1.408922,-0.130538}, + {-0.523389,-0.811424}, + {0.101777,0.366629}, + {1.289354,-0.426427}, + {0.604590,-1.337170}, + {-0.058429,1.861749}, + {-0.561091,-0.637419}, + {0.424127,-0.323688}, + {-0.081614,-1.449043}, + {0.968017,0.267704}, + {0.108011,0.499381}, + {0.170847,-0.487345}, + {-0.458183,-0.767461}, + {-0.039893,0.250217}, + {0.131645,-1.086087}, + {0.161841,0.342612}, + {-1.600553,0.342165}, + {0.541176,0.414102}, + {0.409636,0.349951}, + {1.204189,-1.086040}, + {0.350477,0.682488}, + {-0.721238,0.208825}, + {0.428534,-0.790265}, + {0.121097,-0.359704}, + {1.361358,1.230809}, + {-0.384294,0.472650}, + {0.145290,-0.174952}, + {-0.046377,-0.107608}, + {-0.383656,0.796097}, + {1.031273,0.264224}, + {1.167621,-0.300218}, + {-0.292386,-0.318581}, + {-0.335417,-1.144967}, + {-0.648088,-0.289108}, + {-0.068185,-0.682794}, + {0.894230,0.285057}, + {-1.260050,0.086270}, + {0.247349,0.104827}, + {0.007993,0.124410}, + {-0.089590,-0.563814}, + {1.509332,-1.875702}, + {-0.076540,1.065093}, + {0.316001,-0.172131}, + {0.102151,-0.953328}, + {-0.190367,0.254101}, + {0.255213,1.104178}, + {0.291825,-0.052904}, + {-1.058847,-0.004168}, + {-0.293184,-0.372100}, + {-0.420888,0.496658}, + {0.646020,0.472691}, + {-0.568856,-0.424865}, + {-0.822198,0.342074}, + {0.566707,-0.906916}, + {0.880532,-1.481777}, + {-0.158097,0.395299}, + {-0.169400,-0.308643}, + {-0.420999,-0.995964}, + {-0.134220,-0.451067}, + {-0.560854,-0.358684}, + {0.533672,0.609505}, + {0.225296,-0.259670}, + {0.136387,1.320238}, + {-0.143082,-0.656944}, + {-0.039519,-0.440310}, + {0.064516,-0.216104}, + {0.327496,-1.720161}, + {1.222967,0.133978}, + {0.344704,-0.992218}, + {-0.298720,1.336461}, + {0.910618,0.343415}, + {0.792131,-0.077562}, + {-0.078523,0.161363}, + {0.419388,0.354756}, + {-1.022862,-0.528513}, + {0.024169,0.636111}, + {-0.121226,0.869259}, + {0.269960,0.147618}, + {-0.173962,-0.286819}, + {-0.610308,-0.112641}, + {1.516570,0.220792}, + {0.067268,-0.929080}, + {0.140334,1.330344}, + {0.126366,-1.081471}, + {-0.243734,-0.118978}, + {-0.277617,-1.194380}, + {-0.682716,0.298833}, + {-1.288838,1.513837}, + {-1.077710,-0.288363}, + {0.353844,0.331654}, + {-0.496007,-0.449799}, + {0.674501,-0.901818}, + {-0.425209,-0.743499}, + {-0.493533,-0.014724}, + {-0.126484,-0.166360}, + {0.321523,-1.190012}, + {-0.243319,0.253336}, + {-0.324947,-0.463787}, + {0.224061,-0.778740}, + {-0.022366,-0.614416}, + {-0.104315,-0.614804}, + {0.416559,0.514345}, + {-0.380783,-0.071819}, + {1.224245,-0.170595}, + {0.668510,0.088242}, + {0.011928,-0.606299}, + {-1.276925,-0.185928}, + {1.427795,0.603522}, + {-0.687761,-0.603504}, + {-0.132693,-0.457303}, + {-0.680173,-0.865798}, + {-0.251745,-0.935759}, + {0.444854,-0.248104}, + {0.068890,0.189164}, + {-0.218620,-1.194219}, + {0.102438,0.748316}, + {0.626796,-0.085816}, + {0.382283,0.477754}, + {-0.055020,-0.453327}, + {-0.629663,-0.255501}, + {-0.314275,-0.853495}, + {0.153019,0.700717}, + {0.819287,0.714535}, + {0.078689,-0.639930}, + {-0.470512,-0.225320}, + {0.479791,0.944982}, + {1.631216,1.256571}, + {-0.936889,0.646269}, + {-0.494894,0.683656}, + {0.921918,0.268295}, + {0.561338,0.520386}, + {0.414373,1.463005}, + {0.760467,0.214625}, + {0.964109,-0.139284}, + {-0.587657,-0.930694}, + {0.299208,0.117574}, + {-0.452623,1.080372}, + {-0.206742,-0.027465}, + {-0.995999,0.131516}, + {-0.409115,-1.251451}, + {0.286588,0.339968}, + {0.248896,0.976740}, + {-0.600229,-1.037789}, + {1.217989,-0.829786}, + {-0.533772,-0.390166}, + {-0.252891,0.090843}, + {0.830241,-0.674900}, + {-0.305120,-0.830369}, + {-0.491488,0.649178}, + {0.438337,-0.155879}, + {-0.355961,0.587665}, + {0.504438,0.139915}, + {0.729127,-0.183104}, + {0.107723,-0.278060}, + {0.688445,0.756468}, + {0.393728,-1.411304}, + {0.536781,1.086957}, + {-0.520090,-0.203326}, + {0.533082,-0.846444}, + {-0.394528,0.670604}, + {-0.382789,-0.861758}, + {0.250303,0.478741}, + {-0.327998,0.777437}, + {0.733849,-0.765777}, + {-0.089826,-1.110802}, + {-0.206186,-0.678356}, + {0.386616,0.326163}, + {0.525415,-1.219435}, + {0.133794,0.344521}, + {0.004897,-0.582482}, + {-0.750436,-0.832588}, + {1.048079,-0.016272}, + {1.705627,0.415836}, + {1.430775,0.468125}, + {0.131126,-0.137068}, + {0.835151,-0.271749}, + {-0.298794,0.661111}, + {-1.031776,-0.466190}, + {0.920307,0.012391}, + {0.714790,0.765926}, + {0.049065,1.311591}, + {-0.718093,-0.406004}, + {0.398720,-1.039662}, + {-0.246073,0.103843}, + {-0.710795,0.507890}, + {0.091547,-0.294237}, + {1.265596,0.506513}, + {0.247169,-0.808032}, + {0.329468,-0.429356}, + {0.401651,-1.497002}, + {-0.915131,0.517771}, + {-0.158804,-1.010671}, + {0.337866,0.270349}, + {-0.334280,-0.437324}, + {0.587549,-0.839959}, + {0.609462,0.218756}, + {0.663163,0.295161}, + {0.199296,-0.011211}, + {0.336088,-0.804984}, + {-0.689722,0.139018}, + {1.805106,0.071002}, + {0.012271,-0.185305}, + {-0.242626,1.069228}, + {-0.001816,-0.770260}, + {1.082567,-0.538776}, + {-0.300932,0.408739}, + {0.673658,-0.546763}, + {-0.522996,-0.593263}, + {0.783541,0.018982}, + {0.129059,1.126919}, + {0.089440,0.382453}, + {-0.027288,0.112335}, + {0.207647,-0.722367}, + {-0.570810,0.360483}, + {0.285651,-0.252501}, + {0.723943,0.093512}, + {0.112908,0.175056}, + {-0.488045,0.285721}, + {-0.059020,-0.037746}, + {-0.512124,-0.099456}, + {-0.349365,-0.609648}, + {0.107796,-0.112698}, + {-1.477146,0.619852}, + {0.417878,1.275517}, + {0.029314,-0.196885}, + {0.570071,-0.086919}, + {0.249916,0.287204}, + {0.383593,0.201145}, + {0.114623,0.900762}, + {0.682162,-0.223562}, + {0.322560,0.917578}, + {0.750428,0.353774}, + {-0.948208,0.123629}, + {0.768450,0.085982}, + {1.272772,0.309070}, + {-0.439142,-0.382147}, + {-0.008128,-1.247159}, + {0.009078,-0.697620}, + {0.007060,0.961034}, + {0.129413,0.505956}, + {-1.910256,-0.665300}, + {0.069935,-1.173748}, + {-0.120057,0.181999}, + {0.399439,-0.688444}, + {0.284874,0.541595}, + {0.285854,0.693654}, + {-0.001666,-0.103849}, + {-1.224582,1.329128}, + {-0.648986,0.890249}, + {-0.388631,-0.337343}, + {-0.610412,0.675449}, + {0.271354,-0.522851}, + {-0.469737,0.289745}, + {-0.135145,0.094711}, + {0.391914,0.360719}, + {-1.432849,-0.395919}, + {0.718524,0.095473}, + {0.971875,0.020463}, + {0.321075,1.646243}, + {-0.198847,-0.236427}, + {1.874800,-0.097315}, + {-0.243075,-0.495529}, + {0.920510,0.609915}, + {0.471311,-2.079300}, + {-0.581785,-1.219514}, + {-0.280604,0.335288}, + {0.744908,1.156712}, + {1.065821,1.187737}, + {0.063306,0.219678}, + {0.149226,0.523140}, + {-0.223783,-0.203258}, + {-0.453659,-0.055288}, + {-0.577265,0.580418}, + {-0.394131,0.807998}, + {-0.805989,0.389628}, + {0.497947,0.244122}, + {0.156364,0.586017}, + {-0.824797,1.008399}, + {0.152007,-1.426285}, + {0.515238,0.477685}, + {-0.477381,0.117855}, + {-0.950519,-1.318016}, + {0.420935,0.940154}, + {-1.026912,-0.466710}, + {-0.582401,0.139818}, + {-0.549374,-0.236186}, + {0.644767,-0.465686}, + {0.830889,-0.265762}, + {-0.144430,-0.761845}, + {-0.128806,-1.521828}, + {-0.372228,-0.069244}, + {-0.492768,0.219460}, + {-0.490296,0.354823}, + {-0.848195,0.898729}, + {0.865969,-0.571089}, + {-0.454317,0.699749}, + {0.042831,-0.315084}, + {-0.285471,-0.292725}, + {-0.534360,0.172237}, + {0.689555,0.264977}, + {0.815292,-1.505314}, + {0.497006,-0.098925}, + {0.298728,0.364288}, + {0.136240,0.303815}, + {0.283923,0.596503}, + {0.114502,-0.238589}, + {-0.297723,0.385486}, + {-0.316969,0.430939}, + {0.040942,-0.313941}, + {-0.289333,0.351903}, + {0.896973,0.079274}, + {-0.268520,0.041966}, + {1.030958,-0.635246}, + {-1.875177,0.592061}, + {-0.430594,-0.653622}, + {0.267462,0.655383}, + {-0.514834,1.076798}, + {-0.097106,0.538920}, + {0.013117,0.662483}, + {0.644666,0.595031}, + {-0.117338,0.439290}, + {-0.357636,-0.677673}, + {-0.088865,-0.231393}, + {0.965777,-0.113227}, + {0.220975,0.768523}, + {-0.828622,0.050192}, + {-0.240097,-0.029707}, + {-1.058309,1.038959}, + {-0.570250,-0.924301}, + {-0.262456,-1.462101}, + {-1.228857,-0.142778}, + {0.469875,0.739288}, + {1.100930,0.341907}, + {0.672967,-0.393436}, + {0.518804,0.496781}, + {-0.142314,0.761519}, + {0.125922,-0.550510}, + {-0.348100,-0.273610}, + {-0.427612,0.061501}, + {0.256513,0.747116}, + {-0.059648,0.168510}, + {-0.913990,0.875762}, + {-0.802038,0.135093}, + {0.203664,-0.374754}, + {0.469188,-0.636419}, + {0.809588,0.460623}, + {0.113743,0.524456}, + {-0.272354,-0.854766}, + {0.022865,0.418124}, + {-0.133409,0.060661}, + {1.539998,-0.517456}, + {-0.645522,-0.426623}, + {-0.371401,-0.661202}, + {-0.122534,1.261750}, + {0.093323,-0.383381}, + {0.134252,0.902849}, + {0.511477,1.313929}, + {0.099273,0.514895}, + {-0.058003,0.969434}, + {-0.141294,-0.471783}, + {-0.429620,-0.154513}, + {-0.287361,-0.442306}, + {-0.336878,-0.062789}, + {-0.605904,0.102936}, + {-0.142869,-0.443398}, + {1.535686,1.529627}, + {0.367539,0.095620}, + {0.212680,0.531485}, + {0.604709,-0.251699}, + {-0.161790,-0.242223}, + {-0.575133,0.475413}, + {0.007935,0.138656}, + {-0.156317,0.351535}, + {1.107248,1.232089}, + {-0.269558,0.504884}, + {0.074465,-0.942669}, + {0.141073,-0.429191}, + {-0.269876,0.330541}, + {-0.209983,0.505994}, + {0.562585,1.614445}, + {0.439637,-1.675931}, + {0.030853,-1.163880}, + {0.304423,1.022936}, + {-0.327022,-0.504994}, + {1.936745,-1.338733}, + {-0.351500,-0.385984}, + {-0.563641,-0.826557}, + {-0.380570,0.789590}, + {-0.148708,0.255027}, + {-0.888800,-1.395291}, + {0.632760,-0.463043}, + {0.234656,0.303244}, + {0.116743,-0.473395}, + {0.271851,0.175900}, + {-0.552514,-0.338339}, + {0.691982,0.143707}, + {-0.976338,0.662087}, + {-0.504830,0.685742}, + {-0.264117,-0.307242}, + {0.511863,0.356987}, + {0.055412,-1.049023}, + {0.191737,0.267756}, + {0.231510,-1.056609}, + {0.204476,-0.636612}, + {-0.133734,1.938848}, + {0.255605,-1.483930}, + {1.011052,1.161027}, + {0.898627,0.805878}, + {-0.213312,0.436263}, + {0.755626,0.187831}, + {-0.762523,0.657359}, + {0.036146,0.739059}, + {-0.116160,-0.417153}, + {-0.150632,-0.670163}, + {0.418430,-0.878027}, + {0.525073,-0.538173}, + {-0.370425,-1.117374}, + {-0.757346,0.213995}, + {-0.208166,-0.014412}, + {1.041135,-0.440021}, + {0.745159,-0.655492}, + {0.075926,-0.175046}, + {-0.667127,-1.402322}, + {-0.420118,-0.660770}, + {-0.911100,-0.316687}, + {-0.103679,0.220340}, + {-0.660715,-0.765549}, + {-1.825846,0.383159}, + {-0.802056,-0.280138}, + {-0.373981,0.538737}, + {-0.426700,0.773436}, + {-0.163357,0.074898}, + {1.227122,1.422060}, + {1.288474,-0.542456}, + {-1.032935,0.639189}, + {0.437950,-0.087142}, + {0.475027,-0.968816}, + {0.165371,0.564307}, + {-0.510503,-0.411686}, + {-1.231209,-0.637638}, + {1.256137,-0.449882}, + {-1.522424,-0.184787}, + {-1.028042,0.985088}, + {1.030749,-0.439651}, + {-0.387196,0.411551}, + {1.188856,0.408318}, + {-0.587327,-0.142216}, + {1.135026,-0.262557}, + {-0.508316,-0.762131}, + {-0.149100,0.280352}, + {-0.951866,0.279302}, + {-0.604205,-0.672315}, + {1.600248,-0.457873}, + {0.569092,0.161693}, + {-1.152617,0.488698}, + {0.409741,0.570698}, + {-0.507684,-0.112046}, + {-0.748483,1.030598}, + {-0.076532,-0.294944}, + {0.270334,-0.074069}, + {0.758352,0.152663}, + {-1.269700,0.914973}, + {-0.730966,0.274066}, + {-1.529546,-0.878928}, + {-1.992355,-0.301284}, + {-0.645659,0.223827}, + {-1.002499,0.318252}, + {0.165309,-0.639122}, + {-1.019766,0.307431}, + {0.679903,-1.055646}, + {-0.003741,0.179578}, + {0.256276,0.808911}, + {1.114403,-1.010407}, + {-1.146745,-0.331667}, + {0.404155,0.383710}, + {-0.237773,0.921262}, + {1.885775,0.430458}, + {-0.818223,0.346674}, + {-0.078311,0.863722}, + {-0.428592,0.254773}, + {0.534155,0.809113}, + {1.383017,0.888617}, + {-0.515986,-0.599548}, + {0.212821,-0.000715}, + {-1.206773,0.526967}, + {0.014093,0.006118}, + {0.158839,-1.216860}, + {-0.027659,0.926053}, + {0.019575,0.165710}, + {0.197453,-0.230582}, + {1.261566,0.802630}, + {0.197086,0.008144}, + {0.059366,-1.335864}, + {0.762630,0.316835}, + {0.094044,0.216878}, + {-0.061064,0.344751}, + {1.017651,-1.442284}, + {0.827257,0.377237}, + {-1.187013,-0.462500}, + {0.582280,-0.502331}, + {0.744537,-1.480232}, + {-0.629860,0.197390}, + {0.059392,-0.392031}, + {-0.574393,0.117983}, + {0.129667,-0.171614}, + {-0.108789,-0.144976}, + {-0.289720,0.028863}, + {-0.236768,0.375456}, + {-0.026387,-0.120244}, + {-0.494994,1.099108}, + {-0.243313,-0.271767}, + {0.887063,-0.199488}, + {-1.520577,0.158127}, + {1.002710,-0.502214}, + {-0.690706,-0.243567}, + {-1.318276,-0.321401}, + {-0.458306,-0.366136}, + {-0.120988,0.372985}, + {-0.278336,0.750513}, + {-0.430248,0.203486}, + {-0.431980,0.898660}, + {0.147149,0.183560}, + {-0.761892,-0.033976}, + {0.544541,0.195048}, + {-1.004320,0.048136}, + {0.445875,0.124557}, + {0.819350,0.116228}, + {-0.074228,-0.359250}, + {0.149207,0.639891}, + {0.338190,0.705314}, + {0.771753,0.452919}, + {0.713768,-0.325439}, + {0.792008,0.244063}, + {0.619732,-0.670480}, + {-0.192255,-0.539623}, + {-0.071555,0.106152}, + {-0.531400,0.439331}, + {0.858087,0.454744}, + {-0.324386,-0.432407}, + {-0.049221,-0.765374}, + {0.524452,0.531419}, + {0.003815,0.508387}, + {-0.841803,-0.132345}, + {-0.251592,0.174575}, + {0.134064,-0.846480}, + {-0.380022,-0.772825}, + {0.570028,0.455106}, + {0.685860,0.878152}, + {0.349189,-0.979386}, + {-0.870929,0.582146}, + {-0.970770,-0.902920}, + {1.432578,0.124514}, + {-1.833284,0.491911}, + {-0.632608,0.655085}, + {-0.587920,-0.340920}, + {-0.688839,-0.890105}, + {0.453233,-1.036321}, + {1.020132,0.523791}, + {0.951761,0.683777}, + {-1.376582,1.527485}, + {0.236742,-1.750241}, + {-0.460403,0.501992}, + {1.020721,0.229132}, + {1.051587,-0.362471}, + {-0.259974,0.863537}, + {0.429171,1.050911}, + {0.191844,0.578415}, + {-0.231841,0.432569}, + {-0.984387,-0.084837}, + {-0.358412,0.102102}, + {0.878619,0.582503}, + {-0.205932,0.835352}, + {-0.103196,-0.742711}, + {1.284650,-0.553309}, + {-0.438278,-0.845167}, + {-0.180808,-0.562684}, + {-1.415280,0.309014}, + {1.032654,1.546299}, + {-0.578971,0.502129}, + {-0.372922,0.342322}, + {-0.601495,-0.396972}, + {0.449218,1.693786}, + {-0.215480,-0.912576}, + {-0.305294,-0.068039}, + {1.234584,0.890927}, + {-0.133936,-0.401511}, + {-0.029240,-0.508774}, + {-0.446670,0.056391}, + {0.438196,0.121282}, + {-0.235203,-0.016227}, + {0.085158,0.853693}, + {0.589462,-0.003206}, + {-0.347001,1.098295}, + {-0.482088,0.276294}, + {1.115959,0.104063}, + {1.222275,-0.122048}, + {1.131900,-0.401884}, + {0.416713,0.972292}, + {0.268957,0.822470}, + {-0.378075,-0.239070}, + {0.678130,-0.622487}, + {0.001222,0.176722}, + {0.515715,0.556026}, + {-0.811341,-0.664363}, + {-0.066931,-0.106832}, + {0.259630,-0.482719}, + {-1.051136,0.675293}, + {-0.444388,-0.119788}, + {0.307477,-0.014828}, + {-0.184077,0.282394}, + {-0.719949,0.155395}, + {0.689853,0.466149}, + {0.254500,-1.065029}, + {-1.153940,1.026575}, + {-0.724639,0.811474}, + {0.280946,0.774506}, + {1.733286,0.702247}, + {0.057015,-0.144861}, + {1.201717,-0.620823}, + {-1.489848,-0.513420}, + {0.007687,0.478682}, + {0.217798,-0.381518}, + {0.395505,0.487883}, + {0.637114,0.738214}, + {-0.696254,-0.017240}, + {-0.601473,-0.310016}, + {-0.911395,-0.423135}, + {0.943762,0.871834}, + {0.712787,-0.214152}, + {-0.154493,0.356730}, + {0.439694,2.528324}, + {0.511167,-0.597179}, + {-1.077821,1.509451}, + {0.534645,-0.031730}, + {0.367335,-0.235827}, + {-1.523038,0.527418}, + {0.337825,-0.714982}, + {-0.447831,-0.426621}, + {-1.118101,-0.239219}, + {0.531552,0.943312}, + {-1.294295,-0.742653}, + {0.625772,0.643434}, + {-0.277690,-0.187306}, + {0.253799,-0.294410}, + {-0.613186,0.208064}, + {-0.188373,-0.612828}, + {0.217985,-0.165977}, + {0.588750,0.477662}, + {-0.901009,-0.304080}, + {-1.010997,0.557475}, + {-0.375059,-0.290759}, + {0.071666,-0.579673}, + {0.210535,0.735150}, + {-0.448087,-0.526083}, + {0.398716,0.065340}, + {0.485392,1.369999}, + {-0.299177,-1.126727}, + {-0.103942,0.680101}, + {0.328730,0.178544}, + {0.142174,0.134296}, + {0.204866,-0.912750}, + {-2.020140,0.645009}, + {0.177036,-0.288237}, + {-0.069950,1.225832}, + {-0.304805,0.134353}, + {-1.765184,-0.128221}, + {-0.393885,-0.444420}, + {-1.330829,0.743254}, + {0.830278,0.671366}, + {0.869670,-0.919906}, + {1.211946,-1.221721}, + {0.363820,0.389598}, + {-0.613657,-0.172961}, + {0.534523,-0.777950}, + {0.899525,0.837620}, + {0.229674,0.539808}, + {-0.588145,1.541271}, + {0.526527,0.218288}, + {0.108346,-0.146209}, + {0.256885,0.222342}, + {-0.471906,-0.622017}, + {-1.040667,-1.033413}, + {1.262585,0.812615}, + {-0.109457,1.184248}, + {-0.777400,-1.560435}, + {0.151619,-0.442552}, + {1.678563,0.504373}, + {-0.589008,-0.440073}, + {-0.173452,0.875637}, + {-0.330927,-0.861614}, + {0.529098,0.754519}, + {-0.530484,0.361856}, + {-0.340118,-0.014196}, + {-0.443443,-0.221920}, + {-0.295703,0.775663}, + {0.931839,0.391841}, + {1.227308,0.357324}, + {1.058906,-0.561328}, + {0.379099,0.857939}, + {0.379845,0.088003}, + {2.175076,0.202864}, + {0.100406,-0.297335}, + {0.240141,-0.401507}, + {0.578608,0.265995}, + {-0.515623,0.946173}, + {-0.587795,-0.555286}, + {0.383657,-0.195416}, + {0.759589,-0.774641}, + {-0.109808,-0.123684}, + {0.172620,1.054034}, + {0.231130,1.353771}, + {0.832332,-0.629704}, + {0.736182,-0.815986}, + {1.913341,-0.066831}, + {0.548944,0.930218}, + {1.187104,0.054595}, + {-0.065391,1.307484}, + {-1.032659,-0.304898}, + {0.770218,0.384590}, + {-0.461868,0.279681}, + {0.659794,1.167296}, + {-0.280067,1.596266}, + {-0.557632,-1.620087}, + {0.231064,0.159401}, + {-0.585902,-0.632748}, + {-1.008761,0.180220}, + {-2.136943,0.182556}, + {0.578714,-0.151526}, + {0.468830,-0.370074}, + {-0.124409,0.101686}, + {-0.623913,0.511890}, + {0.603725,-0.110424}, + {0.086402,0.305489}, + {0.397162,-0.844066}, + {0.287331,0.595819}, + {0.435615,-0.308301}, + {-1.631188,1.233723}, + {-0.099963,-0.568243}, + {-0.069033,-0.553885}, + {0.465490,1.705170}, + {-1.502903,0.051838}, + {0.202618,0.056840}, + {0.690444,0.625482}, + {0.529718,-0.327767}, + {-0.489490,-0.609651}, + {0.832393,1.453277}, + {1.712547,0.803720}, + {0.189576,-1.727333}, + {0.907285,-0.228063}, + {1.339552,-0.868890}, + {-1.166663,-1.224587}, + {-0.379674,0.609648}, + {-0.573722,-0.147682}, + {-0.268252,-0.294019}, + {-0.342327,0.622820}, + {-0.973481,1.055302}, + {0.765404,-0.814623}, + {-0.533027,-1.451319}, + {-0.272482,1.012991}, + {-0.542893,-1.562890}, + {-0.171077,0.717300}, + {0.308168,0.116356}, + {0.314240,-0.370956}, + {0.804733,-0.334112}, + {0.386616,-0.027912}, + {-0.099513,0.902143}, + {-0.123303,0.843877}, + {1.079426,-0.071035}, + {0.598008,-0.248097}, + {0.573794,0.625676}, + {0.290775,0.601791}, + {-0.846620,-0.609600}, + {0.441754,0.374976}, + {-0.292908,-0.310313}, + {0.389009,-1.122842}, + {-1.994184,-0.597685}, + {-0.288490,-0.137211}, + {0.826802,-0.414513}, + {0.440020,-0.030550}, + {-0.776099,-0.389480}, + {0.554564,0.554801}, + {1.224902,0.286133}, + {-0.979788,0.109225}, + {1.253196,0.209456}, + {0.251155,0.753947}, + {0.665114,-0.393747}, + {-0.564377,-0.513027}, + {1.288081,-2.157011}, + {0.235869,0.471166}, + {-0.406039,0.027257}, + {-0.294357,-0.382251}, + {0.119859,-0.100326}, + {-0.458593,0.981385}, + {1.025987,-0.633064}, + {0.615666,1.604773}, + {0.594899,-0.462359}, + {0.309323,0.834967}, + {1.020212,0.969725}, + {-0.195893,-0.386131}, + {-0.627758,0.223954}, + {-1.018009,0.285884}, + {-0.624008,0.485126}, + {0.160685,-0.253051}, + {-1.063582,1.681213}, + {-0.198088,-0.757754}, + {0.728279,0.034337}, + {0.762127,-0.032588}, + {0.221347,-0.818478}, + {0.269797,-1.110743}, + {-1.210268,-0.495728}, + {0.485286,-0.320922}, + {-0.155302,0.041326}, + {-0.402684,1.638042}, + {-0.478496,-0.696576}, + {0.857587,-0.932290}, + {-0.479103,-1.444577}, + {0.106673,0.771573}, + {0.174064,0.228316}, + {0.379493,0.761051}, + {-0.573243,-0.279958}, + {0.611776,0.691011}, + {0.437668,0.574424}, + {1.270251,0.249666}, + {0.164892,0.358455}, + {0.667730,1.155659}, + {0.466743,0.958982}, + {-0.728237,-0.561067}, + {-0.191912,0.053633}, + {-0.319731,-0.092707}, + {-0.675490,0.366198}, + {0.535741,-1.151621}, + {-0.343547,0.839867}, + {0.751048,-1.498414}, + {1.666151,-0.356844}, + {0.042997,0.353855}, + {0.599371,0.374659}, + {-0.030844,-0.467997}, + {0.527571,-0.170217}, + {1.039629,0.511229}, + {0.139445,-0.375293}, + {-0.643767,-0.579323}, + {-0.213417,0.056574}, + {0.868315,-0.291497}, + {1.312809,0.661863}, + {-0.239329,-0.350563}, + {0.055933,1.334509}, + {-0.896131,1.594030}, + {-0.843781,-1.287317}, + {0.346229,-0.350082}, + {-0.385374,-0.165116}, + {0.058133,-0.170327}, + {-0.302902,-0.091267}, + {-0.224982,-0.275217}, + {-0.639219,0.182658}, + {1.005439,0.970002}, + {0.302856,0.157512}, + {0.167572,0.392681}, + {-0.183465,-0.536818}, + {-0.276488,0.932653}, + {-0.698586,-0.291830}, + {-0.663474,0.073177}, + {-0.707151,0.843712}, + {0.813781,-0.237099}, + {-0.567100,-0.155201}, + {-0.695440,0.900429}, + {-0.507948,-0.238936}, + {0.813905,-1.435846}, + {-1.030962,0.416183}, + {0.010413,-0.077815}, + {-0.456217,0.939060}, + {-0.280898,0.860698}, + {-1.059189,-0.026381}, + {0.418985,0.103886}, + {0.243547,0.263705}, + {1.022534,-0.870284}, + {-0.319105,-0.830518}, + {0.309283,0.131609}, + {-0.366955,0.545398}, + {-1.091913,0.803764}, + {0.919995,-1.444688}, + {-0.514388,-0.892124}, + {0.046488,-0.043293}, + {-0.097040,-0.142277}, + {-0.621773,0.278483}, + {-0.238226,-0.303143}, + {-0.239201,-0.202993}, + {0.828891,-0.447296}, + {-0.814409,-0.762757}, + {0.317636,-0.775188}, + {-0.704665,-0.001095}, + {0.190795,-0.410853}, + {0.438536,0.007221}, + {-1.275473,1.581711}, + {-1.032641,0.427879}, + {0.043270,0.560571}, + {-0.310790,-0.295852}, + {-0.322617,-0.582956}, + {-0.823786,0.792678}, + {-0.825312,0.460310}, + {-0.142982,-0.231356}, + {-0.107885,0.006865}, + {-0.428315,-0.575707}, + {-0.451766,-1.312755}, + {-0.605263,0.052154}, + {-0.858527,0.472405}, + {-0.147632,0.851068}, + {-0.032356,-0.398183}, + {-0.601653,-0.044037}, + {0.037578,0.212620}, + {0.475474,0.577324}, + {-1.937575,-1.393675}, + {0.241383,-0.543812}, + {0.300632,-0.384921}, + {0.860763,0.252422}, + {0.040594,-0.371765}, + {0.552900,0.011664}, + {-0.353449,0.312965}, + {0.857064,1.235445}, + {-0.408279,-0.576770}, + {0.133850,-0.708734}, + {0.979223,1.697775}, + {-0.859229,-0.252335}, + {-1.136499,-0.537318}, + {-0.025246,0.178310}, + {1.169886,-0.131893}, + {0.491317,-0.071596}, + {1.485336,-0.526005}, + {1.948320,-0.173133}, + {0.359882,-0.593865}, + {0.784955,0.290084}, + {-0.367032,0.564664}, + {-0.053053,0.166978}, + {0.576522,-1.319649}, + {0.593626,-0.037716}, + {0.330368,0.727155}, + {0.248306,0.837877}, + {-0.596916,-0.440271}, + {-0.031691,0.753502}, + {-0.427416,1.496483}, + {0.024830,0.428486}, + {-0.251342,-1.094742}, + {0.345125,-0.553380}, + {-0.898429,-0.026258}, + {0.712027,0.447699}, + {-1.220289,-0.815846}, + {0.262894,0.251074}, + {-0.136647,0.183869}, + {0.404985,-0.461170}, + {0.431711,-1.281842}, + {0.163396,0.332593}, + {-0.552892,0.335223}, + {-0.672727,-0.000601}, + {0.044287,0.469885}, + {0.199923,0.345696}, + {0.723835,-0.177781}, + {-0.379719,0.397453}, + {-0.641487,1.511009}, + {0.061980,0.031751}, + {-0.844554,0.892103}, + {-0.715934,-1.294866}, + {0.173878,-1.451147}, + {0.564775,-0.224633}, + {-0.475705,0.218131}, + {1.368321,2.155638}, + {-0.559571,-0.151806}, + {0.367671,-1.069871}, + {-0.480085,-0.683981}, + {-0.968596,-0.196502}, + {0.088215,-0.398611}, + {0.089681,0.049280}, + {0.019565,0.640091}, + {0.804096,-0.312743}, + {-0.029222,-0.817238}, + {0.111560,0.026803}, + {1.124348,-0.247172}, + {0.828146,-1.297903}, + {0.584710,1.072408}, + {-1.079120,0.519528}, + {-0.559623,-2.083301}, + {-0.013739,0.168279}, + {0.094835,-0.001691}, + {-0.176566,-0.071756}, + {0.143178,0.023358}, + {-1.209996,-0.402923}, + {0.502949,-0.787258}, + {-0.439794,-0.826874}, + {0.037231,-0.182201}, + {0.559047,-0.316920}, + {1.353808,-0.063423}, + {-0.184105,-1.087707}, + {0.520159,0.016875}, + {0.408005,0.337109}, + {0.012034,-0.141686}, + {-0.116381,0.989265}, + {0.215828,-0.819388}, + {-0.175628,0.230390}, + {-0.392693,-0.773533}, + {0.019304,0.018939}, + {0.019620,1.129002}, + {-0.266461,0.476351}, + {-0.932192,-0.308265}, + {1.087973,0.187229}, + {0.878040,0.274679}, + {-0.967149,-1.149465}, + {0.110062,-0.288712}, + {0.410077,0.016828}, + {-1.137827,0.737936}, + {0.556373,0.712373}, + {-0.136341,-0.106141}, + {0.966315,0.131986}, + {-1.636164,0.243468}, + {1.058806,-0.648276}, + {0.211281,1.021837}, + {-0.200606,0.108194}, + {0.343630,0.685307}, + {0.492227,-0.038799}, + {0.033762,0.584277}, + {0.236607,0.567255}, + {0.680730,0.758640}, + {-1.029663,1.126743}, + {-1.572466,-0.113236}, + {-0.285795,0.080142}, + {-0.974205,-0.403896}, + {1.117339,-0.485668}, + {-0.600984,-1.054548}, + {0.893469,-0.995996}, + {1.668182,-0.272915}, + {-0.209205,0.453159}, + {0.256428,-0.019136}, + {0.333610,0.511375}, + {-1.232951,0.873284}, + {-0.761203,-0.368131}, + {-0.518450,-1.168993}, + {0.742393,-0.718962}, + {0.449123,0.250070}, + {0.014006,-0.412005}, + {-0.680747,-0.172112}, + {0.116133,-0.562759}, + {0.460738,-0.656872}, + {0.650550,0.619822}, + {0.131879,0.424197}, + {-0.553638,-1.742206}, + {0.312592,0.469697}, + {-0.531606,-0.391612}, + {1.380083,1.445451}, + {-0.921923,-0.915796}, + {-1.153275,0.556598}, + {-0.161191,0.501045}, + {-0.702263,-0.058096}, + {0.560614,0.671590}, + {0.036180,-0.376868}, + {-0.588677,0.721655}, + {0.621821,-0.164663}, + {0.794529,0.699955}, + {-0.719335,0.651360}, + {0.148510,0.760655}, + {-0.114731,0.951111}, + {0.895827,0.383900}, + {-0.746435,0.641606}, + {-0.421358,0.631822}, + {0.466984,-0.324033}, + {0.489916,-0.957898}, + {0.079711,0.062274}, + {1.246410,-0.778342}, + {-0.318010,0.318632}, + {0.510297,-0.392028}, + {1.251361,1.171531}, + {0.293846,0.756420}, + {-0.909834,-1.088653}, + {0.185629,-0.928923}, + {-0.192179,0.381852}, + {0.128132,-0.618807}, + {1.135265,1.096902}, + {1.130910,0.031333}, + {0.189199,-0.530720}, + {0.364752,0.516586}, + {-0.640494,-0.438013}, + {-0.554450,0.002218}, + {-1.568253,-0.283404}, + {0.597701,-0.124230}, + {1.153399,0.400638}, + {0.290154,-0.118022}, + {-0.394926,0.335760}, + {-0.046594,-1.272174}, + {0.520793,-0.596359}, + {0.684737,1.409372}, + {2.146829,-0.595201}, + {0.334683,0.150969}, + {0.037160,0.579834}, + {0.559788,-1.024755}, + {-0.268161,-1.685690}, + {-0.777837,0.327112}, + {-0.628273,-0.114822}, + {-2.163572,0.843763}, + {-0.523453,1.909596}, + {-0.390204,0.742400}, + {0.184483,-0.248507}, + {0.492118,0.308610}, + {0.809920,-0.427897}, + {0.210169,-0.601697}, + {0.065808,-0.422819}, + {-1.259986,0.023207}, + {-1.222129,0.568027}, + {-0.255664,-0.612253}, + {0.228229,0.962349}, + {-1.340872,1.427331}, + {-0.567869,-1.869379}, + {-0.763201,-0.271214}, + {-1.445104,0.226024}, + {-0.645348,0.310639}, + {-0.516378,0.457223}, + {0.261481,-0.723054}, + {0.698503,-0.491313}, + {0.002835,0.081625}, + {-1.025465,-0.176307}, + {-0.479908,0.644662}, + {-0.748698,-0.134649}, + {0.463082,-1.921004}, + {0.586063,-2.033114}, + {-0.458925,0.394895}, + {-0.509606,0.005512}, + {-0.447751,-1.910113}, + {-1.557059,-0.149125}, + {0.534921,-0.429562}, + {0.211883,0.620042}, + {-1.527148,0.587183}, + {0.401908,1.280822}, + {0.031060,0.420576}, + {-0.762789,-0.367085}, + {1.175118,-0.820434}, + {-0.478197,-0.370352}, + {-0.236025,0.061470}, + {0.686564,-0.585512}, + {-0.237052,0.253177}, + {-0.729385,-0.466642}, + {-0.662395,-0.391071}, + {0.273296,0.506813}, + {0.965051,-0.027263}, + {0.070026,1.046618}, + {0.092287,0.070415}, + {-0.908972,-0.539245}, + {-0.623800,1.413496}, + {0.325102,0.822477}, + {-0.518215,0.034588}, + {0.220737,0.705239}, + {-0.818519,-0.857503}, + {-1.388012,0.171706}, + {0.650287,1.022428}, + {2.412083,-0.776552}, + {-0.297618,1.080676}, + {0.467493,-0.420103}, + {-0.059584,-0.053936}, + {0.624517,-0.194404}, + {0.036811,1.302039}, + {0.842010,-0.194790}, + {0.215698,0.725725}, + {-0.272988,0.542958}, + {-0.298502,1.190862}, + {0.166648,0.297913}, + {-0.783560,-0.385328}, + {0.351894,-0.279022}, + {0.183874,0.243079}, + {0.134334,0.079331}, + {-0.383688,0.849714}, + {-0.227904,0.641252}, + {0.329318,0.943028}, + {0.936512,1.038576}, + {0.757479,0.393397}, + {1.478493,-0.037539}, + {-1.189804,0.402658}, + {0.292558,-1.779022}, + {-0.284935,-0.366083}, + {-0.386498,1.453383}, + {0.611253,0.499528}, + {-0.251683,0.181155}, + {0.804380,-0.388200}, + {-0.231037,0.258398}, + {0.623782,0.017725}, + {0.468501,0.540843}, + {0.054289,1.158843}, + {0.109397,0.089475}, + {0.057510,0.640870}, + {-1.007740,-1.110276}, + {0.732886,0.842128}, + {0.268033,-0.755497}, + {-0.031795,-0.214367}, + {-0.643266,-0.275480}, + {1.885364,-0.353332}, + {1.004060,-1.001434}, + {-0.017497,0.894947}, + {1.829552,0.069833}, + {-0.930362,-0.271928}, + {-0.374898,0.170401}, + {-0.104757,-0.184549}, + {1.479948,-0.472800}, + {-0.766489,-0.268751}, + {-0.188110,0.343063}, + {-0.068686,0.373199}, + {-0.335110,0.539789}, + {0.926700,-0.263069}, + {-0.060970,0.075089}, + {-0.047239,-2.343455}, + {-0.758616,-0.638756}, + {0.194242,0.628520}, + {-0.670422,-0.252502}, + {-0.586947,1.217569}, + {0.325827,0.180049}, + {-1.170374,-0.478935}, + {1.157467,0.136615}, + {0.553874,0.901300}, + {0.489163,0.191637}, + {0.233215,-0.282606}, + {1.394105,-0.595516}, + {-0.616522,0.715078}, + {-0.840391,-0.099596}, + {0.539287,-0.316566}, + {-0.384641,1.575414}, + {0.708599,0.923721}, + {-0.728650,0.399285}, + {-0.884493,-0.797352}, + {0.346664,0.439675}, + {-0.912444,-1.014233}, + {0.440793,1.115063}, + {-0.852873,-0.619209}, + {0.167686,-0.498302}, + {1.288179,0.409765}, + {1.402931,0.688458}, + {-0.515123,-0.824088}, + {0.192950,-0.248628}, + {-0.062076,0.319169}, + {0.488478,2.046597}, + {-0.279347,0.144513}, + {-0.425342,-0.162927}, + {0.794761,0.950190}, + {0.050606,-1.039568}, + {0.258260,0.371916}, + {0.299544,0.840263}, + {1.011669,1.277889}, + {-0.455175,0.008475}, + {0.006032,0.495940}, + {-0.564037,0.951911}, + {-0.739710,0.911333}, + {0.288278,0.246605}, + {-0.415489,0.418020}, + {0.214393,-0.216782}, + {-0.258230,0.012515}, + {0.085156,-1.067564}, + {-0.477948,-0.126020}, + {0.819553,0.227472}, + {0.218761,0.118708}, + {-1.147643,0.315880}, + {-0.227523,0.539005}, + {0.001495,0.428174}, + {1.833835,-0.253958}, + {0.094817,-0.427417}, + {0.304182,0.027684}, + {-0.448943,1.724177}, + {0.306482,-1.723176}, + {0.297892,0.566358}, + {0.070474,-0.408958}, + {-1.135178,0.616141}, + {1.174561,0.739951}, + {-0.427643,-0.076585}, + {-0.143676,-0.561043}, + {-0.575947,-0.963853}, + {0.287610,-0.416596}, + {1.053362,0.219671}, + {0.215916,-0.082404}, + {-0.004859,1.016390}, + {-0.304115,-1.250074}, + {-0.804160,1.414419}, + {0.435396,1.580271}, + {-0.540909,-0.386004}, + {0.391329,0.175570}, + {0.068666,-0.634001}, + {-0.924601,-1.223534}, + {-0.244715,-1.882378}, + {-0.005935,0.055254}, + {0.053374,-2.037105}, + {-0.222229,-0.314341}, + {1.683783,-0.136252}, + {-0.209519,0.319064}, + {0.128087,0.515904}, + {1.057809,0.518777}, + {1.302667,-0.667992}, + {0.711711,1.370832}, + {-0.425870,-0.921453}, + {-0.282099,-0.019978}, + {0.475885,0.778538}, + {-1.191533,0.734870}, + {-0.029950,0.617866}, + {-0.455740,-0.735148}, + {-1.482617,0.289506}, + {-0.281529,-1.036867}, + {-0.900051,-0.070463}, + {-0.281393,-0.018742}, + {-1.565083,0.033298}, + {-1.253289,0.604701}, + {-1.473103,0.505138}, + {-1.337558,-0.025304}, + {0.025156,0.114029}, + {1.186775,0.120767}, + {0.833490,-1.016311}, + {-0.566033,-1.332979}, + {-0.525104,-0.650364}, + {-0.791062,0.388240}, + {1.154731,1.317110}, + {-0.317317,-0.091369}, + {0.113614,0.044248}, + {-0.258272,-0.047712}, + {1.078975,0.638972}, + {-0.597647,0.741361}, + {-0.489840,-0.645206}, + {0.555416,0.241694}, + {-0.612925,-1.006549}, + {-1.021876,-0.178930}, + {-0.739651,0.372522}, + {0.602211,1.641040}, + {0.379708,-0.413169}, + {0.089748,-0.616324}, + {0.599494,-0.401401}, + {0.259038,1.039479}, + {0.006801,-0.534216}, + {-1.441283,-0.788294}, + {0.652339,-0.170895}, + {0.170934,0.389251}, + {0.369531,1.157200}, + {-1.009088,0.126682}, + {-0.315585,0.221797}, + {0.202527,1.134547}, + {-0.272163,-0.354116}, + {-0.278950,-0.284232}, + {-0.055980,-0.181156}, + {-0.432454,-0.002721}, + {-0.818628,-0.041833}, + {-0.544952,-0.105704}, + {0.552322,0.225571}, + {-0.429020,-0.426446}, + {0.450359,0.329922}, + {-0.420977,0.010542}, + {0.524081,0.061941}, + {-0.611116,-0.497061}, + {-0.185940,-1.029832}, + {-0.352210,0.272805}, + {-0.523549,0.577421}, + {0.484978,-0.655545}, + {0.426839,0.473204}, + {-0.694465,0.191582}, + {1.346640,-0.894402}, + {-0.108025,0.551475}, + {0.196850,0.014778}, + {0.461298,-0.661029}, + {1.183668,-0.482788}, + {0.451475,1.978741}, + {0.436252,-0.573917}, + {-0.793265,0.340729}, + {0.372344,0.278611}, + {-0.754183,0.302767}, + {-1.031154,-1.065581}, + {0.628203,-0.223986}, + {0.430165,-0.891388}, + {-0.015695,-0.279011}, + {0.048695,-1.308632}, + {-0.269414,-0.197042}, + {-0.795862,1.044719}, + {0.436994,-0.946302}, + {0.660415,0.069112}, + {-0.073069,-0.338405}, + {-1.016127,-0.176174}, + {0.603558,0.251424}, + {0.051546,-0.212910}, + {-0.297017,-1.927157}, + {-0.110347,-0.266009}, + {0.592700,-0.192662}, + {-0.562193,-0.059079}, + {-0.549655,1.273057}, + {0.063368,0.733878}, + {-0.221776,1.592995}, + {-0.742231,-1.023633}, + {-0.300987,1.027012}, + {0.819822,1.696182}, + {-0.391936,0.788524}, + {0.532161,-0.042235}, + {-0.366096,-0.206694}, + {-0.124892,-0.264484}, + {-0.704913,0.651417}, + {2.149216,-0.035024}, + {-0.208488,0.467413}, + {0.197927,-0.450251}, + {0.775973,0.707921}, + {-0.971095,0.934934}, + {-0.675312,-0.556623}, + {0.398423,2.014933}, + {1.314999,0.121784}, + {-0.149328,-0.548591}, + {0.624388,0.554257}, + {0.794465,-0.762318}, + {-0.342740,-0.044003}, + {0.664133,0.988572}, + {-0.591256,-0.550813}, + {0.004503,-0.209721}, + {-0.704415,1.115631}, + {0.499527,-0.865457}, + {-0.427010,-0.058056}, + {-0.442966,-0.801730}, + {-0.028645,-0.432707}, + {-0.520193,-0.477441}, + {0.693746,-0.591685}, + {-0.723356,-0.124885}, + {-0.271467,0.138230}, + {0.378694,-1.346075}, + {0.867608,-0.861081}, + {-0.030809,-0.637696}, + {1.547649,-0.433481}, + {0.281972,1.218074}, + {0.289769,-0.252994}, + {-0.547299,-1.114947}, + {0.281379,0.103827}, + {0.144241,0.141649}, + {0.882615,0.777328}, + {0.293825,-0.291434}, + {0.115586,0.642325}, + {-0.661045,-0.025898}, + {0.339237,0.790670}, + {-0.709378,0.173682}, + {-0.691671,0.227216}, + {-0.093392,0.390772}, + {-0.822655,1.661899}, + {0.470760,-0.539462}, + {0.883847,0.324028}, + {-0.816597,-0.501790}, + {-0.171583,-1.222645}, + {0.589553,0.087931}, + {0.352979,-0.325299}, + {-0.040087,0.573102}, + {-0.333396,0.702907}, + {0.678815,0.634352}, + {1.236381,-0.495768}, + {0.455672,1.242359}, + {-0.877502,-1.177867}, + {0.036368,0.084722}, + {-0.261535,1.262188}, + {-0.187800,0.138469}, + {0.075047,0.017116}, + {-0.553277,-0.427987}, + {0.203971,-0.219700}, + {-0.102810,0.727420}, + {-0.208146,0.641188}, + {0.505555,-1.229252}, + {-0.089677,-0.317869}, + {0.045298,0.553962}, + {0.682165,0.978041}, + {0.758240,1.062833}, + {-0.591609,-0.169416}, + {0.200002,-0.806496}, + {0.401893,-0.505467}, + {-0.049368,0.974221}, + {-1.338392,-1.052507}, + {-0.234168,-0.459732}, + {-0.049076,-0.787956}, + {-0.440995,0.824773}, + {-0.310494,0.155186}, + {0.629950,0.438434}, + {0.128082,-0.298934}, + {-0.889005,-0.700750}, + {0.725139,1.108872}, + {0.806530,0.172376}, + {1.274152,-1.109091}, + {0.361415,0.304318}, + {-0.770589,-1.690576}, + {-0.077050,-1.541958}, + {0.055098,0.140834}, + {-1.027384,-0.083170}, + {-0.387121,1.173074}, + {-0.511185,-0.640359}, + {0.970168,0.278280}, + {-0.399875,-0.215985}, + {0.578435,0.171387}, + {-0.143334,-0.387392}, + {1.048777,0.181700}, + {0.369934,0.608091}, + {1.128358,-0.533869}, + {0.725995,-0.677232}, + {0.131748,-0.914071}, + {-0.661664,0.557397}, + {0.864385,0.026499}, + {-0.076076,-0.384927}, + {-1.700148,0.806878}, + {-0.093025,0.160711}, + {0.657889,-0.819687}, + {1.415252,0.043090}, + {-0.474513,1.021749}, + {-0.235819,0.669443}, + {-0.209294,0.038555}, + {0.350373,0.947927}, + {-0.473777,0.450919}, + {-0.439863,-1.296476}, + {-0.041963,0.452473}, + {0.519491,-0.934337}, + {0.029848,0.199221}, + {0.568997,0.413023}, + {-0.422968,0.191107}, + {-1.046889,-0.575230}, + {0.555575,0.114778}, + {-0.271803,-0.125287}, + {-1.492866,-0.813928}, + {0.581882,-0.352968}, + {-0.802623,1.377947}, + {0.700558,0.297364}, + {0.010499,0.485443}, + {0.030525,-0.214066}, + {0.290003,-0.036848}, + {0.177382,0.633674}, + {-0.142112,-0.817479}, + {-1.506692,0.130953}, + {-0.549851,0.089496}, + {0.530755,1.632153}, + {0.958531,-1.707736}, + {0.610349,2.078139}, + {-0.086293,0.239772}, + {0.202042,-0.362267}, + {0.894271,-1.466671}, + {0.438957,0.318388}, + {-0.721440,-1.241242}, + {0.570884,0.929768}, + {0.691115,0.078293}, + {2.031262,0.005026}, + {0.614740,0.403247}, + {-0.153316,-0.453097}, + {-0.500683,-0.473711}, + {-0.604458,0.407987}, + {0.182040,0.697141}, + {-0.162319,0.006736}, + {0.525699,0.675310}, + {-0.360962,-0.686781}, + {1.308789,-0.386448}, + {-0.174349,-0.941565}, + {-1.104866,0.335170}, + {-0.705175,0.291939}, + {-0.244608,-0.192226}, + {0.962480,0.146916}, + {0.413036,-0.045753}, + {0.322721,0.586207}, + {-0.285444,0.020732}, + {-0.201547,-0.960376}, + {-0.525784,0.598120}, + {-0.594926,0.215987}, + {-0.157909,-0.395456}, + {0.609670,0.114630}, + {0.326789,-0.001808}, + {-0.652800,0.608450}, + {0.630816,-0.318163}, + {1.290349,-0.308122}, + {0.302288,0.042105}, + {-0.618234,-0.122607}, + {-0.671018,0.647521}, + {-0.033489,1.029981}, + {1.127675,0.838844}, + {-0.391586,0.406333}, + {0.634599,-0.206173}, + {-0.158274,0.281173}, + {0.031888,0.459707}, + {-0.371921,0.932324}, + {0.076527,-0.283407}, + {-0.241424,0.283793}, + {0.312402,0.175612}, + {0.212368,-0.432081}, + {-0.773642,0.100780}, + {0.251432,0.483141}, + {-0.166812,-0.067869}, + {0.027261,0.793139}, + {0.764140,0.027200}, + {0.014120,-0.858433}, + {-0.996727,0.370392}, + {0.132527,0.167380}, + {0.972844,0.615013}, + {-0.400845,-1.129354}, + {0.468849,-0.867083}, + {1.017556,-0.782061}, + {-0.109531,-0.643417}, + {-0.213625,0.158193}, + {0.199067,-0.074333}, + {0.344584,-1.074916}, + {-0.221442,0.527535}, + {-0.427743,0.192179}, + {-0.445158,0.223376}, + {-0.406246,-1.129810}, + {0.498180,-0.537912}, + {0.246385,1.147774}, + {1.124593,0.638781}, + {-0.238219,-1.178279}, + {0.564715,0.082624}, + {0.009528,-0.294926}, + {0.449595,-0.413499}, + {-0.222000,-0.383341}, + {-0.293071,-0.020010}, + {0.262525,-0.619825}, + {-0.622110,0.994815}, + {0.826520,-0.318905}, + {-0.139956,0.034670}, + {-0.602776,1.445757}, + {-0.000428,0.515115}, + {0.262184,-0.002736}, + {1.304981,-0.501046}, + {-0.321231,0.622551}, + {1.054329,-0.220852}, + {-0.492771,-0.940654}, + {-0.780517,1.146123}, + {-0.030875,-1.453137}, + {0.833466,-0.395468}, + {0.523778,0.759513}, + {-1.126077,-0.417115}, + {-0.556663,0.032786}, + {0.206892,-1.122757}, + {-0.366164,1.106942}, + {0.152365,-0.067752}, + {0.046570,-0.568357}, + {-1.294625,0.304168}, + {-0.314597,-0.414620}, + {1.204236,0.126016}, + {-0.051512,0.247893}, + {-0.662050,-0.548429}, + {0.806882,0.635211}, + {0.354519,0.315406}, + {-0.102549,-0.307759}, + {-0.945865,-1.144877}, + {0.092988,-0.095752}, + {-0.590799,1.426964}, + {-0.512031,-0.295192}, + {-0.241074,-0.440517}, + {0.829680,0.087681}, + {-0.109337,-0.289886}, + {0.656985,0.294518}, + {0.564203,0.206732}, + {-0.898597,-0.207926}, + {0.327259,0.685055}, + {1.226880,-0.695505}, + {-0.829727,0.718718}, + {-1.451225,-0.289371}, + {0.837042,1.220714}, + {-0.158113,0.175430}, + {0.974037,-0.062980}, + {0.178835,0.169509}, + {1.118203,0.735886}, + {0.104949,-0.340257}, + {0.378724,0.089648}, + {0.214056,-0.821406}, + {1.396107,0.599080}, + {0.369926,0.109247}, + {0.673800,0.763612}, + {-0.268951,-0.230063}, + {0.567933,0.162580}, + {-1.689604,-0.345288}, + {0.137885,-0.093063}, + {-0.298533,-0.191792}, + {1.251967,-0.136681}, + {-0.693495,-0.932444}, + {-0.555325,-0.131594}, + {0.236263,-0.069815}, + {-1.252648,0.035106}, + {-1.764317,0.733486}, + {-0.075051,1.622354}, + {-0.085244,-0.605377}, + {-0.642959,-0.089863}, + {-0.113593,-0.099045}, + {0.058362,-1.029047}, + {0.826847,0.113454}, + {-0.244119,-0.050284}, + {-1.073509,0.123867}, + {-0.904460,-0.901549}, + {0.453204,-0.459712}, + {-1.264724,-0.418653}, + {0.472295,-1.485124}, + {0.323558,-0.092765}, + {1.800720,0.519789}, + {-1.126308,-0.318456}, + {0.724158,-0.269665}, + {0.710385,0.177657}, + {-0.783852,-0.215007}, + {-1.354067,0.031020}, + {-1.015185,0.249321}, + {0.839984,1.457903}, + {-0.353245,-0.313877}, + {0.763070,0.903317}, + {-1.656538,-0.791042}, + {-0.892608,-0.381481}, + {0.649284,-0.643492}, + {1.455720,-0.133815}, + {0.732560,-0.289157}, + {-0.377583,-1.019029}, + {-0.377847,-1.270397}, + {0.809711,-0.293496}, + {-1.027232,-0.492600}, + {-0.531947,-1.149837}, + {-0.321890,0.886703}, + {-0.603477,-1.377457}, + {0.259723,-0.220563}, + {0.949998,0.240148}, + {0.261264,0.890932}, + {0.595257,-1.336390}, + {-0.362741,0.082717}, + {-0.355324,-0.058517}, + {-0.404853,-0.487143}, + {-0.431324,0.299014}, + {0.079328,-0.804580}, + {0.824935,-0.454231}, + {0.262757,-0.554689}, + {0.126869,-0.439135}, + {-1.051874,-0.512746}, + {0.293715,0.904688}, + {-1.530512,-0.258114}, + {0.782473,1.192382}, + {0.532046,0.769399}, + {0.384142,-0.126943}, + {0.161275,-0.961466}, + {-0.060918,-0.053277}, + {0.876995,1.833961}, + {-0.747767,0.165348}, + {-0.052410,-0.612302}, + {0.814379,0.370027}, + {0.848717,-0.351940}, + {-0.797478,-0.346407}, + {0.451936,1.010194}, + {0.582376,0.949018}, + {-0.342362,0.108576}, + {0.556515,-0.142943}, + {0.728162,-1.097160}, + {-1.075414,0.137602}, + {0.457708,-0.654780}, + {0.165246,1.781712}, + {-0.319642,-0.993107}, + {-0.584410,0.462585}, + {-0.203283,-0.682679}, + {-0.872903,0.560968}, + {0.545374,0.278981}, + {0.918419,0.246065}, + {-0.632251,-0.167158}, + {-0.285094,0.517218}, + {0.742545,-0.428022}, + {-0.272512,-0.650121}, + {0.007097,-0.259464}, + {0.321549,-0.153838}, + {-0.935528,-0.478174}, + {-0.609717,-0.076270}, + {-0.755654,-0.453108}, + {0.881595,0.809393}, + {-0.851194,-0.126438}, + {-0.678539,-0.168662}, + {-0.735439,1.454476}, + {-0.702070,-0.732654}, + {0.950217,0.061374}, + {0.931381,0.383055}, + {-1.577577,-0.830957}, + {1.081051,0.875738}, + {0.946201,1.485701}, + {0.433276,0.890427}, + {1.505338,0.234134}, + {0.083216,0.185535}, + {0.206556,0.692397}, + {0.800164,1.210478}, + {0.308393,-0.573495}, + {-0.455541,0.377465}, + {0.285379,0.593679}, + {1.807014,0.007663}, + {1.599165,-0.768434}, + {-0.182963,-1.147207}, + {0.691660,0.496669}, + {0.235179,-0.284885}, + {-0.461998,0.542110}, + {-1.935320,-0.774389}, + {-0.078056,-0.127823}, + {0.299281,-0.033361}, + {0.302731,0.078716}, + {0.069066,-0.050105}, + {0.221607,-1.239222}, + {0.340220,0.582368}, + {-0.565872,0.345751}, + {-0.470414,0.191707}, + {-0.086475,-1.321960}, + {-0.653337,1.499706}, + {-1.186698,0.203143}, + {0.362014,0.335224}, + {0.763790,-0.914370}, + {1.135858,-1.463878}, + {0.719099,-0.477518}, + {0.269766,0.421199}, + {0.064365,-0.175814}, + {-0.367548,0.001256}, + {0.544776,-0.698629}, + {0.615651,-0.386841}, + {-0.875089,-0.516872}, + {0.413476,-1.281108}, + {0.502809,-0.490843}, + {-2.204143,0.110420}, + {-0.385040,-0.740596}, + {0.695904,0.385231}, + {0.255709,0.008205}, + {-0.586557,-0.564665}, + {0.803747,0.411107}, + {1.601181,0.662062}, + {0.865286,-0.979781}, + {0.689845,0.519237}, + {0.395498,0.145840}, + {-0.626369,0.344739}, + {0.042164,0.051887}, + {-1.403498,0.671656}, + {0.598572,0.681828}, + {1.220256,-1.165620}, + {-0.793312,0.715179}, + {-0.234183,0.019938}, + {0.385507,0.226328}, + {-0.450997,-1.107601}, + {-1.171289,0.649867}, + {-1.080178,-1.231856}, + {-0.061619,1.143806}, + {0.430298,0.525364}, + {-1.049354,0.166192}, + {-0.080776,-0.357525}, + {0.511572,-1.785495}, + {-0.558196,0.261639}, + {-0.887145,0.298578}, + {-1.566637,0.706769}, + {1.151140,0.445122}, + {-0.586133,0.107778}, + {-0.804525,0.245580}, + {0.980744,1.043818}, + {-0.070419,-0.910922}, + {-0.451713,0.466261}, + {1.125777,0.160904}, + {0.577041,0.069860}, + {1.144021,-0.150339}, + {-0.411414,0.404973}, + {0.188443,0.548050}, + {0.225498,-0.614626}, + {1.398432,-1.427287}, + {-0.035313,0.492779}, + {0.460713,-1.022950}, + {-0.523193,-0.887124}, + {-1.045011,0.261402}, + {1.388863,-0.612235}, + {0.475152,-0.857959}, + {0.468680,-0.231389}, + {0.983306,0.199760}, + {-0.645385,0.205021}, + {-0.363448,-0.870316}, + {-0.003819,0.010668}, + {0.471121,0.244769}, + {-0.040500,0.556180}, + {-1.479050,0.358434}, + {0.182788,0.373558}, + {-0.858638,-0.878108}, + {0.001368,0.436654}, + {0.142518,0.294864}, + {-1.153171,0.438127}, + {0.937820,0.034099}, + {1.521724,-0.077421}, + {-0.377694,-0.278517}, + {1.467230,-0.459260}, + {0.145964,0.357560}, + {0.619192,-1.480037}, + {-0.797876,0.686615}, + {-0.465726,1.294829}, + {1.120753,0.433341}, + {0.481084,0.429728}, + {-0.993491,-0.218804}, + {0.080120,0.061366}, + {-0.345080,-1.108765}, + {0.597685,-1.108810}, + {0.272861,-1.448070}, + {0.103180,-0.368753}, + {0.452562,-0.193846}, + {-0.047889,-0.169513}, + {-0.062237,-0.499899}, + {-0.208393,1.227431}, + {0.358621,-0.122079}, + {-0.538647,0.167846}, + {-0.535399,0.147300}, + {-0.016851,-0.523791}, + {0.185591,0.287441}, + {-0.076126,0.077379}, + {0.111808,-0.298068}, + {-0.360049,0.447806}, + {-0.468579,0.021829}, + {0.999254,0.093009}, + {0.409156,0.087569}, + {-0.290239,1.155172}, + {-0.631769,0.113278}, + {-0.485475,0.352847}, + {0.132807,0.899243}, + {0.231351,-0.149363}, + {0.389824,-1.011206}, + {-0.093767,0.618494}, + {0.302881,0.883287}, + {0.253348,-0.020438}, + {0.310115,0.544154}, + {-0.181672,0.250213}, + {0.785253,-0.002714}, + {0.399704,-0.310344}, + {-1.634428,0.357997}, + {0.976723,0.117106}, + {-0.663422,0.938808}, + {1.142522,0.426250}, + {-0.176854,0.538674}, + {1.134571,1.976267}, + {-0.793977,0.553600}, + {-0.496199,0.132777}, + {0.428161,1.342281}, + {0.881731,-0.349207}, + {0.487284,-0.673507}, + {0.834150,0.300816}, + {1.043740,0.574802}, + {-0.108407,1.056837}, + {-0.745715,0.304328}, + {0.494903,0.535517}, + {-0.608093,0.752694}, + {0.430291,-0.135674}, + {-0.174181,-1.362910}, + {-0.064613,-1.995513}, + {-0.704478,0.276742}, + {0.232225,-0.347325}, + {0.129886,0.297225}, + {0.095056,0.366532}, + {1.123177,-0.516860}, + {0.280489,0.548995}, + {0.950114,0.871146}, + {-0.045855,-0.101106}, + {0.323361,0.916197}, + {-0.379042,-0.789420}, + {0.155370,-0.526626}, + {0.123440,-0.404112}, + {1.122189,-0.542010}, + {0.287594,-0.412748}, + {-0.487695,-0.914112}, + {0.326158,-0.133099}, + {-0.166449,-1.353339}, + {-0.055827,0.625175}, + {-1.228110,0.059411}, + {-0.274514,-1.194058}, + {0.008816,-0.571387}, + {-0.700423,0.936284}, + {-0.528928,0.824434}, + {-0.436216,1.131698}, + {-1.371594,-0.535034}, + {-0.002092,0.190907}, + {-0.652668,1.278957}, + {0.101573,-0.906194}, + {0.783427,-0.139790}, + {-2.499705,-0.774554}, + {0.580857,0.350367}, + {-0.259410,0.346345}, + {1.443858,0.066180}, + {1.007880,-0.608615}, + {-1.185398,-0.124630}, + {-1.074749,-0.104417}, + {-0.075128,0.869631}, + {-0.157998,1.035636}, + {-0.212559,-0.416354}, + {0.399589,-0.077372}, + {0.139788,0.342017}, + {1.188158,-1.194288}, + {0.290935,0.230597}, + {0.467906,0.144104}, + {0.777358,0.288836}, + {0.818580,0.308433}, + {-0.210142,0.214512}, + {0.315948,-0.636328}, + {-0.005891,-0.999753}, + {0.072755,-0.563891}, + {0.425654,0.196551}, + {0.361411,-0.211226}, + {0.905206,-1.349513}, + {-0.790974,-0.395724}, + {0.525156,0.770383}, + {-0.092408,-0.488183}, + {0.265920,-0.036150}, + {-0.276333,-0.689856}, + {0.117261,0.005735}, + {-0.665691,-0.164460}, + {0.312157,-0.594442}, + {0.107864,-0.443120}, + {1.118670,-0.671898}, + {-0.022763,0.583797}, + {0.510916,-0.179671}, + {0.714169,-0.104546}, + {0.396036,1.216840}, + {0.373920,0.135520}, + {0.553972,-0.997894}, + {0.052585,0.462084}, + {-0.150044,-0.163447}, + {1.461147,0.659548}, + {-1.000455,-1.680109}, + {-0.717611,-0.210337}, + {-0.772596,-0.251350}, + {0.537726,1.050492}, + {-0.482650,-0.283289}, + {-0.633239,-0.569656}, + {-0.904458,-0.617468}, + {0.109119,-1.522443}, + {-1.226419,-0.899079}, + {0.379579,-0.252179}, + {-0.104614,0.852366}, + {-0.503179,0.002718}, + {0.361405,-0.255127}, + {0.707854,-0.139151}, + {0.588351,0.341695}, + {0.541234,0.404290}, + {-0.423201,0.945891}, + {0.540899,0.903758}, + {-0.383715,-1.224310}, + {0.541671,-0.191686}, + {0.220524,-0.467755}, + {0.419523,-0.261834}, + {-0.248004,-0.524029}, + {1.166929,-0.005245}, + {0.162462,0.683697}, + {0.021613,-1.336883}, + {-0.371790,-0.820360}, + {0.064987,-0.180902}, + {-0.530311,-0.237448}, + {0.014535,0.196268}, + {0.302158,-0.943375}, + {-0.741328,-0.621982}, + {-0.990134,-0.843669}, + {0.298802,0.314671}, + {0.150737,-0.515418}, + {0.642389,0.170803}, + {-0.660634,-0.070932}, + {-0.466752,0.294915}, + {0.498991,0.882812}, + {-0.120033,-0.318492}, + {-0.283866,0.416022}, + {-1.125159,0.156951}, + {0.164229,0.285664}, + {-0.680682,0.531478}, + {-0.228335,0.444181}, + {0.424797,-0.850202}, + {-0.620993,1.933195}, + {0.618146,1.057688}, + {0.351681,0.093757}, + {0.343992,-0.350496}, + {0.419756,-0.682277}, + {0.132223,-0.220393}, + {0.315669,-0.077213}, + {0.623756,-0.047636}, + {-0.980970,0.008924}, + {-0.180176,0.848320}, + {1.546197,0.370102}, + {0.713022,-0.899697}, + {-0.512503,-0.004650}, + {-1.161518,0.132127}, + {-1.041393,-0.554167}, + {-0.036518,0.378256}, + {-0.567661,-0.897940}, + {0.259504,-0.049623}, + {-0.026158,-0.270600}, + {0.724927,-0.499448}, + {0.138307,1.291056}, + {-1.822129,-1.644371}, + {0.671500,0.097591}, + {-0.980895,0.107560}, + {-0.420513,0.010420}, + {0.003000,-0.162645}, + {0.447768,-0.633708}, + {0.382118,0.153956}, + {-0.223916,-0.841490}, + {-1.102503,-0.035876}, + {0.040286,0.813246}, + {0.067205,-2.636223}, + {-1.058178,-0.439882}, + {0.240943,0.599442}, + {-0.266778,-1.074089}, + {0.320826,-0.918839}, + {-0.646954,-0.007690}, + {-0.530749,-0.347252}, + {-0.393036,-0.123253}, + {0.053211,-2.091439}, + {-0.481911,-0.677379}, + {-0.014975,0.997160}, + {0.536010,1.088136}, + {-1.031007,-1.129666}, + {-0.116730,0.519996}, + {1.565485,-0.343272}, + {-0.368459,0.506657}, + {-0.230470,-0.260120}, + {0.621381,1.007440}, + {0.186324,-0.312790}, + {0.273069,-0.166279}, + {0.201102,1.556145}, + {-1.115634,1.567159}, + {-0.648866,-0.322859}, + {-0.704410,0.380438}, + {0.342389,0.213936}, + {-0.042804,0.701810}, + {0.016719,0.090798}, + {-0.731592,-0.277491}, + {0.103078,0.783883}, + {0.345053,0.215559}, + {0.067924,1.081925}, + {0.369806,-0.219722}, + {1.098806,0.215612}, + {-0.724316,-0.036048}, + {0.186158,0.608022}, + {0.139663,0.056514}, + {-0.575010,-0.801492}, + {-1.123663,-0.414602}, + {0.564236,0.266108}, + {-0.391462,0.093429}, + {0.144703,-0.560902}, + {-0.686121,1.329790}, + {-0.379640,-0.241261}, + {-0.498875,-1.364991}, + {0.541470,0.214751}, + {-0.508841,-0.694946}, + {0.812702,0.407024}, + {0.257132,0.128592}, + {-1.187255,-0.495273}, + {0.020247,-0.196925}, + {0.188392,-0.459074}, + {-0.932918,0.525366}, + {1.134929,1.151288}, + {-1.296745,-0.844320}, + {-0.610290,-1.014578}, + {0.623994,0.443023}, + {-0.303615,-1.049124}, + {-0.597543,-0.208275}, + {0.252960,0.992397}, + {-0.023412,0.368284}, + {-0.429581,-0.070039}, + {0.923782,-0.778340}, + {0.060056,-0.739469}, + {0.753096,0.478049}, + {-0.127857,0.093383}, + {0.106401,0.423911}, + {-0.183224,-0.032369}, + {-0.381160,0.851604}, + {-0.797228,-0.217383}, + {0.227067,0.316891}, + {0.451114,1.830366}, + {-1.042958,0.186763}, + {-0.171936,0.478779}, + {-0.075379,0.034822}, + {0.385404,1.160047}, + {0.105260,-1.211098}, + {1.211046,-1.103540}, + {0.308818,-1.042156}, + {-0.704631,-0.115963}, + {0.012675,-0.547391}, + {-0.484557,-0.100460}, + {-0.836917,-0.043501}, + {-0.463115,1.544351}, + {0.309894,-0.669455}, + {0.685375,0.000866}, + {0.511942,0.836813}, + {-0.929517,-0.531037}, + {0.050933,0.075894}, + {0.845070,1.231045}, + {0.796139,0.796776}, + {0.766749,-0.653760}, + {0.742048,1.398289}, + {-0.403017,-0.007496}, + {-0.509706,1.110607}, + {-1.449968,0.427343}, + {-0.010909,1.223294}, + {-0.077727,-0.670769}, + {0.526333,0.308160}, + {0.319094,-0.176388}, + {0.742543,1.379446}, + {1.245044,1.188638}, + {-0.025489,-0.164810}, + {0.608945,-0.073624}, + {-0.174670,-0.273746}, + {-0.624686,1.010041}, + {-0.670461,0.584006}, + {-0.444858,-1.904891}, + {0.222806,0.547945}, + {0.138390,0.546322}, + {-0.446882,-0.696967}, + {-0.628694,-1.208785}, + {-2.152300,-0.613403}, + {-0.096864,0.068138}, + {-0.301906,-0.946012}, + {-0.369820,-0.646125}, + {-1.447581,-0.646713}, + {-0.400707,-0.494477}, + {-0.635435,-0.038456}, + {0.296783,0.278288}, + {-1.001213,0.042941}, + {0.091071,0.902239}, + {-0.460656,0.281628}, + {0.479946,0.142043}, + {-0.487485,-0.696643}, + {-0.407485,-0.541246}, + {-0.607882,-0.853128}, + {-1.305443,-0.877425}, + {-0.359749,-0.647498}, + {-0.626709,0.576527}, + {-0.148729,-0.090456}, + {0.172979,0.177948}, + {-0.107637,-0.478667}, + {0.366998,0.024629}, + {0.462107,0.857612}, + {-0.460563,0.248349}, + {0.907838,0.853909}, + {0.783150,0.585374}, + {-0.299669,-0.212882}, + {1.119594,0.504852}, + {0.377228,0.481423}, + {0.852296,0.676788}, + {-0.286757,-0.002129}, + {0.209843,-0.977784}, + {-0.441823,-0.072773}, + {0.917957,-0.753300}, + {0.273348,-0.628772}, + {-0.284862,0.155215}, + {-0.247355,-0.247082}, + {2.118546,-0.537469}, + {-0.310251,-0.363626}, + {1.378995,0.614774}, + {0.009172,-1.398820}, + {-0.300000,0.441999}, + {-0.297449,0.954413}, + {0.683275,0.180768}, + {-0.371476,-1.618431}, + {-0.175134,-1.231505}, + {-0.749555,-0.428287}, + {-0.969477,0.592818}, + {0.687133,-0.691685}, + {-0.165526,-0.045505}, + {0.910848,-0.391948}, + {1.179305,0.100935}, + {0.166614,-0.729254}, + {-1.130469,0.164593}, + {-1.549639,0.217721}, + {-0.481054,-0.872328}, + {-0.586590,-1.074824}, + {0.091563,0.381294}, + {-0.609678,-0.230306}, + {0.503876,0.238278}, + {-0.562595,1.625733}, + {1.273220,0.329444}, + {0.309265,-0.432313}, + {0.950421,0.011570}, + {0.374275,-0.221395}, + {-0.002535,-0.068439}, + {-0.704010,-0.714205}, + {0.645151,-0.117244}, + {-0.548621,0.089519}, + {-1.310708,0.214149}, + {-0.222895,0.327611}, + {-1.536313,0.422522}, + {0.805899,-1.158480}, + {0.201190,0.527469}, + {0.085621,-0.741991}, + {-0.638953,0.135701}, + {0.610284,0.256558}, + {-0.021550,-0.185034}, + {-0.663349,0.344785}, + {1.234438,0.087483}, + {-0.131234,-1.490191}, + {0.256245,0.425473}, + {-0.093340,0.831930}, + {-1.552555,-0.056483}, + {0.441688,0.115210}, + {0.108127,0.046402}, + {-0.367616,-0.887437}, + {-0.808894,-0.681247}, + {-0.609795,-0.206087}, + {0.578144,0.401209}, + {-0.066620,0.628916}, + {0.230375,-0.294361}, + {0.168031,0.445080}, + {0.184035,0.358481}, + {0.251087,-0.489438}, + {-0.945207,2.090916}, + {-0.899493,0.281441}, + {-0.600711,0.695281}, + {0.496877,1.825249}, + {0.557064,1.787828}, + {-0.032903,0.096150}, + {-0.171482,-0.526085}, + {-0.560700,0.472487}, + {-0.295947,0.009918}, + {1.142040,0.416169}, + {-0.447775,0.074483}, + {-0.823909,-1.010476}, + {-1.547191,1.727266}, + {-0.760387,-0.877929}, + {-1.629711,-0.932786}, + {0.486282,0.248117}, + {-0.264396,0.926022}, + {1.081113,0.075435}, + {-0.643699,-0.289886}, + {0.440984,0.308158}, + {0.821736,-0.810105}, + {-1.505203,-1.521192}, + {-0.542677,0.842918}, + {0.164887,0.399004}, + {-0.811521,0.078831}, + {0.797827,-1.167125}, + {-0.401101,-0.501867}, + {0.364811,-0.809028}, + {0.734068,-0.323428}, + {-0.319197,-0.550535}, + {-0.271324,-0.367006}, + {-0.059699,0.983663}, + {-1.366932,0.282483}, + {0.168976,0.203650}, + {0.302598,-0.221575}, + {1.175485,0.753488}, + {0.107512,1.781766}, + {0.946028,-0.282479}, + {-0.679608,-0.932184}, + {-1.191856,0.201361}, + {-0.166462,-0.053378}, + {-0.812532,-0.147616}, + {1.611017,0.674833}, + {0.314528,1.017239}, + {-1.162592,0.325194}, + {-1.032033,0.635921}, + {0.084120,-0.730470}, + {0.494315,0.897198}, + {0.847109,0.168996}, + {1.644454,0.751446}, + {-0.353970,-0.863128}, + {0.678397,0.141939}, + {-0.973674,-2.013022}, + {0.685345,0.419897}, + {-1.288642,-0.442089}, + {-0.054887,-0.748914}, + {-0.601785,-0.605123}, + {-0.214297,-0.391510}, + {-1.074972,0.659726}, + {0.105391,0.708672}, + {-0.113354,-0.765485}, + {0.300873,0.781452}, + {0.170277,0.599499}, + {0.147834,-0.954326}, + {-0.339726,-0.501183}, + {0.544002,0.385444}, + {0.352044,1.066552}, + {0.911869,0.956912}, + {-0.191047,0.108966}, + {1.413499,-0.757569}, + {0.706789,-1.026854}, + {0.539308,-0.138690}, + {0.080942,-0.272806}, + {0.098018,0.018024}, + {0.195238,-0.389384}, + {0.488144,-0.357992}, + {-0.309817,0.010149}, + {-1.032893,-0.592658}, + {-0.298775,-0.388887}, + {1.131782,-1.690704}, + {-0.193514,0.171204}, + {-0.537903,-0.543134}, + {0.659055,-0.601144}, + {0.304951,0.294985}, + {0.888941,0.970043}, + {0.458543,-0.183693}, + {-0.759308,0.795668}, + {-0.350375,-0.113882}, + {-0.127585,0.382365}, + {-0.213916,0.521858}, + {-0.344818,0.116112}, + {-0.092834,-0.185633}, + {0.061649,1.365497}, + {0.476463,-0.791558}, + {-0.984206,0.997109}, + {-0.057978,-0.489422}, + {-0.194234,-0.607085}, + {-0.657674,0.088412}, + {-0.469191,0.137722}, + {1.011820,-0.291022}, + {-0.303269,-0.626332}, + {0.561159,-0.200477}, + {0.140475,0.804297}, + {0.160608,-0.598328}, + {0.213319,1.449153}, + {1.142243,0.283340}, + {0.065037,-0.257834}, + {0.261033,0.207025}, + {0.700460,0.482503}, + {0.843141,-0.154417}, + {0.292633,0.402510}, + {-0.818789,-0.671620}, + {0.736334,-0.267822}, + {-0.736153,0.705889}, + {-1.012207,-0.010744}, + {0.662579,0.401311}, + {-0.387354,-0.679445}, + {1.209621,-0.153205}, + {-0.701672,0.069607}, + {1.319853,1.085888}, + {1.254748,-0.101110}, + {0.266011,-0.499106}, + {0.615725,0.884454}, + {-1.011208,0.102181}, + {-1.099802,-0.974027}, + {-0.531963,-0.562972}, + {0.121607,-0.356338}, + {0.518231,0.154831}, + {0.499951,1.188225}, + {-0.817457,1.714401}, + {0.369950,0.572897}, + {-0.414845,-0.182628}, + {-0.718216,1.117213}, + {-1.333928,0.469810}, + {-1.207522,-0.417102}, + {0.561111,0.726184}, + {-1.117766,-0.219214}, + {0.744550,-0.034760}, + {0.797619,1.455506}, + {-0.584053,0.337943}, + {0.157397,-0.757585}, + {0.116196,-0.446006}, + {0.146428,0.467807}, + {0.714421,-0.366232}, + {1.429872,0.625346}, + {-0.033015,0.198674}, + {0.105885,-0.216353}, + {-0.023687,0.692143}, + {-0.048073,0.669529}, + {-0.205184,0.780326}, + {0.266525,0.176072}, + {0.141148,0.252191}, + {-0.388369,0.046018}, + {0.299170,-0.177464}, + {-1.081893,-1.145642}, + {0.010014,0.514986}, + {0.448166,-0.748932}, + {-0.295357,-0.035173}, + {-0.033904,0.187373}, + {-0.964666,-0.232491}, + {0.485426,-1.478534}, + {0.150372,0.430681}, + {1.004055,0.755612}, + {-1.273932,-0.382681}, + {-0.123319,0.320989}, + {-0.919513,-0.315545}, + {-0.497703,0.345372}, + {0.182013,-0.018783}, + {0.188130,-1.169909}, + {-0.716006,-0.184715}, + {0.178950,-0.378160}, + {-1.121777,0.261067}, + {-0.884913,0.533499}, + {-0.252487,-0.381490}, + {-0.521029,-0.459944}, + {0.109009,-0.604069}, + {-0.131799,-0.166129}, + {-0.915776,0.867035}, + {-0.051356,-0.189373}, + {0.352025,0.298949}, + {0.197533,0.081879}, + {-0.198604,0.668512}, + {1.153004,0.840196}, + {-0.111957,-0.162456}, + {1.271047,0.649951}, + {-0.272905,1.016445}, + {-0.490432,-1.110506}, + {0.098962,0.280027}, + {-0.149747,-1.055724}, + {0.592247,-0.565550}, + {1.155912,-1.145805}, + {0.763039,0.568494}, + {-0.395993,0.406406}, + {0.047324,0.263514}, + {-0.137376,0.214639}, + {-0.226893,-0.197915}, + {0.966088,-0.475559}, + {-0.194234,-0.012569}, + {-0.473935,-0.886494}, + {-0.265603,0.751773}, + {-1.593588,0.084399}, + {1.119877,0.854302}, + {-0.038422,0.118207}, + {0.370947,0.914543}, + {1.114324,0.036220}, + {0.206356,-0.695196}, + {1.075653,0.031579}, + {-0.428467,0.099867}, + {-0.942289,0.247139}, + {-0.925418,-0.511600}, + {-0.275870,-0.147021}, + {0.403291,-0.774485}, + {-0.147236,-0.816691}, + {0.715749,-0.581534}, + {0.714183,-0.266639}, + {-0.530022,0.395632}, + {-0.081142,0.308192}, + {0.776196,-1.301781}, + {0.402042,0.760863}, + {0.582426,1.116527}, + {0.303501,-1.230810}, + {0.909943,-0.101521}, + {-0.304997,0.216745}, + {-0.534911,-1.278462}, + {0.117181,0.344833}, + {0.598680,-0.801582}, + {-0.488952,0.298129}, + {-0.577852,-1.244262}, + {1.066878,-0.383162}, + {0.365205,-0.304288}, + {0.219744,1.047894}, + {-0.203519,0.603274}, + {0.562170,0.561149}, + {0.172008,0.053308}, + {-0.240833,-0.248882}, + {0.374048,0.395277}, + {-0.184462,0.712107}, + {-0.744861,-0.403328}, + {0.909695,-0.029738}, + {-0.518537,0.759702}, + {0.075402,0.358815}, + {1.141827,-0.585600}, + {-0.562473,0.258697}, + {-1.676194,0.124049}, + {0.233487,-1.891531}, + {-0.829451,0.542206}, + {0.671130,-0.997574}, + {-0.508597,-0.729909}, + {1.180725,-0.338574}, + {1.129566,-0.232048}, + {-0.380058,0.044743}, + {-0.520974,0.138217}, + {0.316724,0.009838}, + {0.133527,-1.443095}, + {0.420516,0.089332}, + {-0.302825,0.028929}, + {1.668571,-0.092751}, + {0.452698,0.532245}, + {0.360685,-1.949182}, + {-0.909377,1.422417}, + {0.108981,0.031519}, + {0.529371,-0.320971}, + {-0.439658,0.288459}, + {0.212286,-0.312996}, + {0.505587,0.680236}, + {0.990288,-0.247507}, + {-0.568695,-0.327833}, + {-0.026999,-2.401438}, + {0.339704,-0.467720}, + {1.232324,-0.049586}, + {-1.244245,-0.285340}, + {-1.630956,0.212445}, + {0.099499,0.057161}, + {0.764231,-0.893147}, + {0.454370,-0.132950}, + {0.140425,0.680194}, + {0.516606,0.024468}, + {-0.862301,0.058704}, + {0.505420,0.269336}, + {-1.237570,-0.038382}, + {0.535371,-1.536667}, + {-0.363929,-0.038955}, + {0.024531,0.914036}, + {0.543681,0.532978}, + {-0.515135,-0.698846}, + {-0.428846,0.073398}, + {-1.039931,0.055062}, + {-0.621873,-1.226401}, + {0.007829,0.811232}, + {0.571021,-0.114346}, + {-0.382807,0.023667}, + {-1.068780,-1.869853}, + {1.156098,-0.153257}, + {0.573828,-0.535261}, + {-0.790467,0.176901}, + {-0.315664,0.803594}, + {-0.334936,0.354728}, + {-0.055522,0.952521}, + {1.315614,0.102351}, + {0.491766,0.538302}, + {0.653814,-0.342202}, + {-0.127639,-1.045441}, + {0.819444,-0.227273}, + {-0.029933,0.258527}, + {-0.824566,0.432697}, + {0.165227,-0.560056}, + {-0.588310,0.436099}, + {-0.421849,-0.388859}, + {-0.090400,-1.251581}, + {-0.533719,1.429956}, + {0.394513,1.115320}, + {-0.782266,0.768142}, + {-0.197776,0.622177}, + {-0.067525,1.525139}, + {1.756764,0.035239}, + {0.798450,-0.795585}, + {-0.262068,0.632512}, + {1.880538,-0.279111}, + {-0.792909,-0.561815}, + {0.888441,1.301812}, + {0.701364,-0.873528}, + {1.343495,-0.562411}, + {0.868597,0.141126}, + {-0.328745,0.918909}, + {-0.941006,-1.339590}, + {-1.343155,-0.049963}, + {-0.574658,-1.478137}, + {0.137838,0.792901}, + {-0.041365,0.454133}, + {0.091431,-0.459571}, + {-1.358113,-0.736001}, + {-0.192427,-0.926593}, + {0.350541,0.433002}, + {-0.084577,-0.444999}, + {0.205895,-0.138558}, + {-0.941218,-0.106877}, + {-0.194195,0.335722}, + {0.734401,-0.283139}, + {1.613564,-0.517256}, + {-0.090641,0.231313}, + {0.266345,0.222315}, + {0.518095,0.960832}, + {0.250561,-0.619001}, + {-0.130002,-0.001817}, + {-0.447930,0.628615}, + {-1.273623,0.406367}, + {0.212427,0.986079}, + {-0.997576,-0.940297}, + {0.375197,0.358510}, + {0.229471,-1.781878}, + {0.184320,0.461606}, + {0.434436,-0.414778}, + {0.034886,-0.062974}, + {-1.325976,0.135652}, + {0.189020,-0.739167}, + {-0.205637,-0.572855}, + {0.860524,-0.315333}, + {0.469117,-1.548092}, + {-0.513513,1.158982}, + {-0.837350,0.105504}, + {-0.061953,-0.530778}, + {0.293859,0.467221}, + {-1.319548,-0.912039}, + {-0.137013,-0.872433}, + {0.387589,-0.454601}, + {-0.234174,-0.245068}, + {-0.744095,-0.128278}, + {-0.391439,0.309053}, + {0.908503,0.583369}, + {0.802960,0.512355}, + {-0.685064,1.108868}, + {0.251810,0.543558}, + {-0.142699,0.735253}, + {-0.039414,-0.908746}, + {0.003694,-0.414133}, + {0.715774,0.070174}, + {-0.374828,1.309546}, + {-0.427538,0.385587}, + {1.338794,0.002127}, + {-0.216609,-0.694721}, + {-1.047300,0.562533}, + {0.397480,0.627659}, + {-0.068233,-1.155685}, + {-0.553008,0.472904}, + {-0.042893,-0.644339}, + {-0.448845,-1.208575}, + {-1.198214,0.953970}, + {0.997727,0.245114}, + {0.597755,0.536424}, + {0.056192,0.023036}, + {-0.599560,0.905339}, + {-0.495127,-1.106235}, + {-0.677290,-0.536778}, + {-0.732936,0.552336}, + {-0.341833,0.636930}, + {0.745283,0.226951}, + {-1.677101,-0.140140}, + {0.185817,1.107540}, + {-0.845686,-0.138093}, + {0.337944,-0.600359}, + {1.011849,0.076595}, + {-0.535078,0.401710}, + {-0.509358,0.080738}, + {-0.713136,0.201088}, + {-0.037796,-0.459023}, + {0.077312,0.078831}, + {-0.674500,0.304809}, + {0.022353,0.208630}, + {0.234088,-0.185560}, + {-0.100573,-0.317607}, + {1.598601,0.170815}, + {1.128860,0.395856}, + {0.126361,0.194856}, + {-0.743378,-1.283214}, + {-0.729153,-1.745945}, + {0.427334,0.514369}, + {-0.260759,0.127843}, + {0.726265,0.484686}, + {-1.043220,1.583933}, + {0.058154,0.202930}, + {-0.691332,0.298501}, + {0.914411,-0.450303}, + {0.871508,-0.248846}, + {-0.880065,-1.352105}, + {-0.347400,-0.479989}, + {-0.523254,-0.137392}, + {0.062610,0.321808}, + {0.583315,1.055442}, + {-0.543484,0.434486}, + {-0.325772,-0.127451}, + {-0.691826,-2.465879}, + {-0.182029,-0.371495}, + {0.061634,0.106658}, + {0.465593,-0.215001}, + {0.799056,-0.576378}, + {0.246446,0.624574}, + {-0.629259,-0.126268}, + {-0.332421,-0.594629}, + {0.811796,0.672092}, + {-0.362575,-0.952485}, + {-0.013237,-0.559132}, + {0.462364,-0.104255}, + {-1.326460,-0.448336}, + {-0.472969,-1.030240}, + {0.263871,0.137456}, + {0.289922,0.058766}, + {0.129665,-0.095386}, + {0.004142,0.060144}, + {0.440724,0.236644}, + {-0.648048,-0.197413}, + {-0.313149,0.016730}, + {-0.002432,0.336209}, + {0.258660,1.080749}, + {-0.622678,-0.971236}, + {-0.756907,-0.630989}, + {-0.511331,1.518728}, + {0.044649,-0.192437}, + {-0.525301,1.021474}, + {-0.281214,0.054685}, + {-1.829357,-0.855561}, + {-1.000657,-0.711545}, + {0.117003,-0.447632}, + {0.776485,-0.166259}, + {0.540743,0.110749}, + {0.957454,-0.352617}, + {1.317026,1.546090}, + {0.140886,0.013168}, + {-0.570171,0.392356}, + {-0.129722,0.788992}, + {-0.725847,0.653395}, + {0.679142,0.364229}, + {0.007173,-0.853037}, + {0.914126,-0.596944}, + {0.066525,0.639936}, + {0.026810,0.096725}, + {-0.538577,-0.152497}, + {0.239321,1.002422}, + {0.129554,-1.193610}, + {-0.187528,0.700211}, + {-0.645819,0.080298}, + {0.283125,0.043507}, + {0.350661,0.372335}, + {-0.655806,0.541560}, + {0.259071,0.914486}, + {-0.920489,-0.623889}, + {0.682493,0.379061}, + {-0.505215,0.663097}, + {-0.426863,-0.323863}, + {0.363894,0.848174}, + {-0.959164,0.304144}, + {0.370840,0.239161}, + {-0.576532,1.683390}, + {0.072048,-0.479737}, + {0.248627,-0.740696}, + {0.267982,-1.331841}, + {-0.742341,-0.098982}, + {-1.397583,0.691099}, + {0.062944,-0.918057}, + {-0.341076,-0.572305}, + {-0.625912,0.261916}, + {0.000942,0.115087}, + {-0.175561,-0.065593}, + {0.613856,-0.651875}, + {-0.374162,-1.289950}, + {-0.165900,-0.183065}, + {0.934889,-0.088622}, + {-0.658801,-0.699260}, + {-0.381254,-0.924817}, + {-0.606669,0.746831}, + {-0.801585,-0.060323}, + {0.750367,-1.191764}, + {0.422306,0.025905}, + {-0.348244,-0.193827}, + {0.533889,0.323919}, + {-0.475731,-0.614214}, + {1.358458,1.027040}, + {0.041062,0.716650}, + {1.086781,0.856076}, + {-0.318239,-0.090265}, + {-0.583590,-0.229458}, + {0.280177,-0.106195}, + {-0.066028,1.050147}, + {0.446572,0.653688}, + {1.619855,1.546549}, + {-0.200833,-0.507327}, + {1.815705,1.725080}, + {0.491063,-0.912080}, + {-0.302422,-0.518018}, + {-1.497067,-0.317440}, + {0.268533,-2.004116}, + {-0.197770,-0.600212}, + {0.599980,0.496906}, + {-0.801705,-0.434370}, + {-0.209023,-0.416797}, + {0.089678,0.179194}, + {0.720592,-0.140217}, + {0.937690,0.785413}, + {0.390751,0.123322}, + {0.407110,-0.263791}, + {-0.635582,0.585058}, + {1.028085,0.038369}, + {0.650746,-0.320141}, + {0.273652,-0.045191}, + {-0.773139,-0.851372}, + {0.357316,0.497209}, + {0.140061,0.278817}, + {-0.416838,-1.327050}, + {1.445687,-0.014796}, + {0.457813,0.799090}, + {-0.556724,0.854916}, + {-0.641068,-0.733796}, + {-0.186028,0.209995}, + {0.018928,-0.915909}, + {-0.352721,0.748722}, + {-0.917271,0.414704}, + {-1.388564,0.625074}, + {-0.601451,1.435210}, + {-0.090926,-0.755952}, + {-0.293108,-1.116392}, + {0.041463,-0.942099}, + {0.666369,-0.398063}, + {0.076754,-0.528375}, + {0.698873,-1.134724}, + {-0.392975,-1.312348}, + {-0.526917,0.774984}, + {-0.133714,-0.398997}, + {-0.990661,-0.808244}, + {0.208158,0.174976}, + {-0.042402,0.479397}, + {0.972845,-1.260660}, + {-0.360790,2.380324}, + {-1.161445,-0.617964}, + {-1.369325,0.963665}, + {0.712060,0.409267}, + {0.061189,1.091821}, + {0.108450,0.248626}, + {-0.532186,0.684632}, + {0.049827,0.344103}, + {-0.730446,-0.644051}, + {0.644672,0.108521}, + {-0.311770,0.388340}, + {0.133496,0.663978}, + {-1.068918,-0.856697}, + {-0.186471,-2.407906}, + {0.497449,0.217132}, + {0.553690,0.561973}, + {-0.222306,0.573912}, + {0.294889,-0.153714}, + {-0.467937,-0.114124}, + {0.505513,0.947824}, + {0.835613,1.387442}, + {0.099424,-0.647555}, + {-1.266308,0.746230}, + {-0.314232,-0.506824}, + {-0.017508,1.148471}, + {-0.005104,0.544153}, + {1.347437,0.169568}, + {0.736192,-2.120244}, + {0.478583,-0.538318}, + {-0.845261,-0.241234}, + {0.711244,0.248858}, + {-0.960539,0.885631}, + {0.519557,0.157119}, + {0.400078,-0.558660}, + {-0.355913,-0.726436}, + {0.620301,0.283481}, + {0.437469,0.894420}, + {-0.246065,-0.441159}, + {-0.207652,0.260112}, + {0.235413,1.202266}, + {-0.147333,0.651418}, + {-0.885893,-0.987513}, + {-0.126637,-0.161050}, + {0.198054,-0.239859}, + {0.753221,-0.122113}, + {0.852570,0.312679}, + {-1.421536,0.339068}, + {-0.608847,0.082841}, + {0.806647,-0.618066}, + {-0.055481,0.361346}, + {0.524385,1.872652}, + {-0.288788,-0.146810}, + {-0.967147,-0.853194}, + {1.966405,-0.833411}, + {0.789003,-0.347270}, + {0.015620,-0.631887}, + {-0.150879,0.915769}, + {-1.491238,0.217030}, + {0.326333,1.498518}, + {0.141223,-0.389036}, + {-0.513646,0.793641}, + {0.900859,0.209672}, + {0.036641,-0.621067}, + {-0.472702,0.503169}, + {-0.229471,0.415297}, + {-0.063377,-0.510807}, + {1.772735,-0.165259}, + {0.367308,0.204078}, + {-0.811216,-0.742540}, + {-0.346736,-1.336241}, + {-0.390538,-0.215693}, + {0.273645,0.017357}, + {-0.411219,-0.583215}, + {0.179285,0.386901}, + {-0.714087,-0.705568}, + {0.354034,-0.029101}, + {-0.124648,-1.203258}, + {1.036534,-0.216642}, + {-0.079461,-0.167129}, + {-0.519538,0.969040}, + {-0.926647,-0.543191}, + {-0.311806,0.129944}, + {0.338452,0.046144}, + {0.443791,1.037348}, + {0.366235,0.139119}, + {-0.436045,-0.889787}, + {-0.487186,-0.329841}, + {0.501924,-0.296196}, + {-0.155070,0.928638}, + {-2.271375,-1.096587}, + {-0.875416,0.031515}, + {0.034895,1.136367}, + {1.259196,0.151467}, + {-0.252917,0.546385}, + {0.146755,0.215855}, + {-1.279319,1.584790}, + {-0.218261,-0.211344}, + {0.838865,-0.281694}, + {0.072992,0.018618}, + {-1.486640,-1.384387}, + {0.673440,0.783368}, + {0.039087,0.485902}, + {0.548339,-0.131470}, + {-0.662826,2.232434}, + {-0.724622,-0.767747}, + {-0.737761,-0.048276}, + {0.858736,0.000247}, + {-0.219835,-1.241124}, + {0.396621,-0.086901}, + {-1.437003,0.502828}, + {-1.537267,0.734791}, + {0.247638,-1.034931}, + {-0.879638,0.130748}, + {0.532153,0.697673}, + {0.869286,1.340851}, + {0.477714,-0.332712}, + {-0.081229,0.614635}, + {-0.409415,-0.046581}, + {0.677428,-1.891076}, + {-0.988289,0.508962}, + {0.887530,-0.096640}, + {-1.348466,0.384365}, + {-1.031462,-0.619078}, + {-0.457756,1.980067}, + {-1.307319,-0.821311}, + {-0.428687,-1.927863}, + {0.126831,0.314297}, + {0.552891,0.191885}, + {1.303032,-1.178928}, + {-0.456697,0.537127}, + {-0.138564,0.139533}, + {-0.864216,-0.683295}, + {0.036298,-1.122012}, + {0.480571,-0.713238}, + {0.192623,-0.245657}, + {1.311303,-0.200987}, + {0.399964,-0.611107}, + {0.442759,1.073488}, + {-0.696011,-1.128391}, + {0.170959,-0.286343}, + {1.066110,-0.985228}, + {-0.541647,0.438916}, + {-0.441049,1.398625}, + {0.351268,-0.444252}, + {-0.100225,-0.353511}, + {-0.544437,0.471382}, + {0.719671,0.361168}, + {0.651644,0.499506}, + {0.854268,-0.138822}, + {-0.292998,-1.397932}, + {0.351302,0.565472}, + {-0.249761,-0.289783}, + {0.579986,1.135063}, + {0.380274,0.431460}, + {0.142501,-0.768253}, + {1.174364,-1.250559}, + {0.124183,-0.664356}, + {-1.775768,-0.426318}, + {-0.410384,1.397669}, + {-0.001185,0.082445}, + {0.683819,0.016434}, + {-0.474231,-1.274486}, + {-0.227899,-0.715442}, + {0.190972,-1.037010}, + {0.515506,1.060213}, + {0.574070,-0.057852}, + {0.794263,0.456543}, + {0.941117,0.348461}, + {0.714095,0.442504}, + {-1.016134,-0.621262}, + {1.501944,-0.164696}, + {0.859384,0.325223}, + {0.605958,-0.405522}, + {0.907773,-0.133478}, + {-0.652518,0.324279}, + {-0.223686,1.532219}, + {0.361665,0.114357}, + {0.118379,-1.485257}, + {0.306623,-1.663751}, + {-0.611527,0.305831}, + {-0.371509,0.148804}, + {-0.317648,0.168418}, + {-0.579078,-0.164959}, + {0.064958,1.214070}, + {-1.513764,-0.019390}, + {0.016424,2.001058}, + {-0.457485,-0.024951}, + {-0.847341,0.548593}, + {-0.839426,0.760265}, + {-0.698344,1.016456}, + {-0.246799,0.331351}, + {0.869786,-0.376963}, + {-0.318179,0.256495}, + {0.392127,-1.203653}, + {-0.120425,-0.077075}, + {1.005891,-0.597390}, + {0.055568,-0.619495}, + {0.760399,0.047681}, + {0.293058,0.480236}, + {0.295600,1.063913}, + {0.595203,0.121404}, + {0.681366,-0.184135}, + {1.298989,-0.786985}, + {-0.354303,0.275603}, + {0.255593,-0.140121}, + {1.054477,0.948719}, + {-0.798213,0.913454}, + {-0.582777,0.673212}, + {-1.973554,1.089905}, + {0.606828,-0.566130}, + {-0.539355,-1.199468}, + {0.086100,0.764955}, + {0.792542,-1.548656}, + {-0.533920,0.802166}, + {0.132591,-0.662338}, + {-0.061156,0.482952}, + {-0.104437,-0.056214}, + {-2.042381,0.317327}, + {-0.706828,0.899494}, + {-0.098682,0.865073}, + {0.231769,-0.480548}, + {-0.723515,-0.797806}, + {-0.333745,-0.255096}, + {1.425486,0.616569}, + {-0.223026,-0.286492}, + {0.945380,-0.819845}, + {-0.836305,0.433398}, + {0.888634,-0.227558}, + {-0.302648,-0.403994}, + {-0.266759,0.341454}, + {-0.911044,0.207652}, + {0.257598,0.267578}, + {-0.376137,-0.484206}, + {-0.106228,1.155262}, + {-0.547100,-1.021943}, + {-0.252786,0.099260}, + {0.089525,-0.008952}, + {-0.445924,0.184429}, + {0.141610,-0.548673}, + {-0.639422,-1.083761}, + {0.498910,0.621386}, + {0.093824,-0.107770}, + {-0.245646,0.217584}, + {-0.612243,-0.523719}, + {0.457347,0.364012}, + {-0.411336,-0.629464}, + {-0.092268,0.204563}, + {0.920493,-0.578667}, + {-0.869454,-0.238633}, + {-0.751389,0.777007}, + {0.580578,0.705056}, + {-1.233334,-1.695404}, + {-0.121305,0.368160}, + {0.782543,0.610795}, + {0.553925,1.300069}, + {1.374260,0.609157}, + {-1.357033,0.843414}, + {0.098626,-0.521365}, + {-0.032515,0.264753}, + {0.062218,0.085845}, + {0.138012,-1.084788}, + {-0.187827,1.380862}, + {0.263689,1.028871}, + {-1.215770,-0.552066}, + {-0.971891,-0.672402}, + {-0.256976,0.648996}, + {0.007809,-0.724976}, + {-1.053466,-0.103232}, + {0.957392,-1.526623}, + {0.387851,1.252142}, + {0.298416,-0.686813}, + {-0.249408,-0.417895}, + {-0.524619,-0.646987}, + {-0.101608,0.062621}, + {0.111389,-0.960781}, + {1.101285,0.205008}, + {-0.120747,-0.663793}, + {-0.602035,0.176470}, + {1.221108,0.961762}, + {0.159797,-0.161413}, + {-0.233941,0.806754}, + {1.256036,0.863057}, + {0.259618,0.549863}, + {0.320844,0.899846}, + {1.030547,-0.232090}, + {-0.517929,-0.918284}, + {0.680314,0.060717}, + {-0.505026,-1.527791}, + {0.162336,0.314724}, + {0.234991,-0.216314}, + {1.375132,0.094076}, + {-0.125705,-0.044844}, + {0.657598,0.128665}, + {0.281292,0.370853}, + {0.027894,-0.981212}, + {-0.732655,0.132501}, + {-0.338577,0.250010}, + {-1.883558,0.143130}, + {-1.095169,-0.539749}, + {0.166138,0.224390}, + {-1.094189,-0.104317}, + {-0.997375,-0.598321}, + {-0.535645,-0.686231}, + {1.289569,-0.268987}, + {0.998965,0.994487}, + {-0.349591,0.714244}, + {-0.457773,-1.093644}, + {-1.171475,1.478846}, + {0.523449,0.576947}, + {-0.610201,0.802389}, + {1.367942,-0.063770}, + {-1.189872,0.914725}, + {0.408213,0.132025}, + {-0.856124,-1.135856}, + {-0.347681,-0.706150}, + {0.226903,0.619634}, + {0.548890,0.651093}, + {-1.798606,-0.216122}, + {-0.220157,-0.282742}, + {0.108822,-0.485596}, + {-0.238309,-0.347750}, + {-0.476180,0.392785}, + {0.428713,-0.175999}, + {0.416074,-0.089752}, + {1.268016,-1.407373}, + {-0.322409,0.315716}, + {-0.086932,-0.954776}, + {-1.178527,1.119818}, + {0.873189,-0.405550}, + {-0.286794,-0.449645}, + {0.741120,-0.039714}, + {-0.401502,0.784565}, + {1.378832,0.131114}, + {-0.510286,-0.774428}, + {-0.241374,0.226729}, + {-0.413898,-0.710203}, + {-0.617347,-0.040064}, + {1.452338,-1.110283}, + {0.018838,-0.592385}, + {0.339572,-0.084802}, + {0.262142,1.120113}, + {0.382072,0.167998}, + {-0.273583,1.253093}, + {-0.509580,-0.586627}, + {-1.016938,0.501199}, + {0.530467,0.149760}, + {0.204492,0.038013}, + {0.074458,-0.292217}, + {0.257628,0.451130}, + {0.557490,-0.411723}, + {-0.181796,-0.641207}, + {-0.392248,-0.582808}, + {0.705525,-0.502120}, + {-1.021501,-0.207399}, + {-0.060821,0.298599}, + {-0.261969,-0.318225}, + {-0.350443,1.831054}, + {0.029182,0.719110}, + {-1.269295,-1.154099}, + {-1.488271,-1.469956}, + {0.176535,1.097410}, + {-1.195927,0.342358}, + {0.582184,0.396307}, + {-0.764560,-0.634440}, + {0.106084,-0.378503}, + {0.760363,0.649530}, + {-0.020356,-0.601389}, + {-0.423594,-0.651490}, + {0.600149,-0.395775}, + {0.421193,0.051504}, + {-1.364237,0.717686}, + {0.876530,-0.288772}, + {-0.098973,0.266692}, + {0.051789,0.462817}, + {0.361495,-0.346842}, + {-0.553109,0.940488}, + {-0.653951,0.277526}, + {0.163045,-0.244626}, + {-0.126776,-0.299731}, + {0.860475,0.302389}, + {0.606731,-0.425179}, + {0.305458,0.780583}, + {1.028347,-1.635167}, + {0.197608,1.209333}, + {0.150105,-0.773508}, + {-0.560487,-1.383294}, + {-0.657034,0.108016}, + {-0.629934,-0.335711}, + {-0.404889,0.112022}, + {0.350071,-0.125444}, + {-0.397430,-0.533393}, + {1.157015,-0.673598}, + {0.836126,-0.091404}, + {0.420003,0.030830}, + {0.304754,0.940964}, + {0.857632,-0.131707}, + {1.482902,-0.526416}, + {-0.506755,0.581483}, + {0.798173,-0.622550}, + {0.199645,0.054187}, + {-1.166797,-0.592686}, + {0.703425,-0.099088}, + {0.100574,-0.652021}, + {-0.452634,0.557510}, + {-0.395655,0.631259}, + {0.005128,-0.031089}, + {-0.476422,0.288975}, + {-0.696440,1.007601}, + {0.651351,0.229279}, + {-0.546184,0.967790}, + {-1.783408,0.458041}, + {-0.158492,0.721176}, + {-0.829438,-0.495769}, + {0.853862,-0.436152}, + {-0.510630,0.354021}, + {0.410283,-0.562993}, + {1.333456,0.619765}, + {0.680707,0.364967}, + {0.768117,0.202325}, + {-0.624035,0.194222}, + {-0.242982,-0.068768}, + {-0.060626,0.243812}, + {0.918857,0.010191}, + {-0.158575,-0.660882}, + {0.268070,-1.046163}, + {-0.550812,-0.916602}, + {0.222526,-1.326576}, + {-0.142632,1.771943}, + {-0.500111,0.366333}, + {0.045897,-0.931826}, + {0.061037,-0.398634}, + {-1.206603,1.049450}, + {-0.346603,0.009748}, + {-0.194651,-0.420179}, + {-0.172385,1.200766}, + {-0.276451,-1.221394}, + {-0.971227,0.736046}, + {0.849993,-0.122658}, + {0.565771,1.029030}, + {0.572575,-0.539519}, + {-0.278977,0.982730}, + {-0.406039,-0.534002}, + {-0.022104,-0.217645}, + {0.393789,-0.655764}, + {-0.821859,0.222043}, + {0.709829,-0.538537}, + {0.309091,1.335973}, + {0.555716,0.225149}, + {1.155433,-0.264109}, + {-0.224191,-0.004592}, + {-0.076549,0.928899}, + {0.141337,-0.500391}, + {-0.286491,0.403995}, + {0.340087,1.192301}, + {-0.264734,0.101794}, + {0.873252,-1.455120}, + {-0.574337,0.221889}, + {-1.110424,0.703227}, + {0.420803,0.333899}, + {0.277080,-0.644572}, + {-0.747538,0.159962}, + {0.552815,1.068068}, + {1.368512,0.010990}, + {-0.206001,-0.237472}, + {0.288503,-0.659436}, + {-0.954056,0.215502}, + {1.548500,-0.238286}, + {-0.889812,0.522877}, + {-0.012439,-0.723786}, + {-0.525273,-0.379121}, + {-0.527515,-1.502476}, + {0.133542,0.108887}, + {0.492447,-0.045511}, + {0.574807,-1.260810}, + {0.878001,0.683264}, + {-0.376682,-0.588180}, + {0.164608,0.358034}, + {0.459547,0.386397}, + {-1.374767,0.442204}, + {-0.699591,-0.427016}, + {-0.228447,-1.161662}, + {-0.322419,1.606881}, + {0.576055,1.101472}, + {0.563123,0.146375}, + {0.244216,-0.241690}, + {0.438112,-0.485327}, + {-1.276929,0.367200}, + {-0.181353,-1.346356}, + {-0.146869,-0.957341}, + {-2.198517,0.705247}, + {-0.289717,-0.177364}, + {0.280325,-1.142208}, + {0.002380,0.345383}, + {-0.418233,-1.133385}, + {0.183564,0.534520}, + {-0.372636,-0.051311}, + {-0.020811,-0.085884}, + {1.163894,-0.173220}, + {0.616165,0.230038}, + {-1.320575,-0.652613}, + {0.123778,-0.062176}, + {-0.722536,-0.008719}, + {1.340873,0.027244}, + {-0.294827,-0.522338}, + {-0.602427,0.183616}, + {-0.785766,-0.953680}, + {-0.286187,0.348720}, + {-0.280901,0.554931}, + {0.380116,0.763759}, + {0.780404,0.192032}, + {1.328343,1.436113}, + {-0.362877,0.085413}, + {1.403308,-0.413647}, + {0.773876,-0.086423}, + {-1.316530,-0.726207}, + {-0.379298,-0.390658}, + {-0.150301,0.006436}, + {0.370812,-0.684290}, + {-0.905463,-0.548246}, + {-0.072613,0.421906}, + {-0.211486,0.321136}, + {-0.247273,0.076461}, + {-1.160356,0.131643}, + {0.379819,-0.441965}, + {1.064987,0.033534}, + {-0.575692,-0.336300}, + {-0.131156,0.299834}, + {-0.907355,-0.562159}, + {-0.142894,-0.067061}, + {-0.305338,0.059685}, + {-0.890171,-0.918641}, + {-0.333344,0.104434}, + {0.450288,0.236190}, + {0.180918,-0.376193}, + {-0.816878,0.145535}, + {-0.789538,-1.143910}, + {-0.022631,0.224265}, + {-0.080696,0.591185}, + {-0.511739,0.521540}, + {1.522040,-1.191704}, + {-0.120255,0.225194}, + {-0.124457,0.484338}, + {-0.332395,0.668069}, + {1.358569,0.343165}, + {-0.907961,0.303291}, + {-0.726165,0.958101}, + {-0.631030,-0.969657}, + {0.187222,-0.841928}, + {-1.702365,-0.218011}, + {0.042628,-1.318380}, + {0.356098,0.394505}, + {-0.321503,-0.176962}, + {-1.508798,0.471924}, + {0.284711,-0.884522}, + {-0.279981,1.075346}, + {0.261212,0.062374}, + {0.730161,-0.028577}, + {1.413322,-0.696512}, + {-0.537404,-0.498826}, + {0.470840,-0.050515}, + {1.075743,1.816796}, + {0.238969,0.728689}, + {0.021923,-0.203939}, + {0.068466,0.691633}, + {-0.463844,0.382524}, + {0.536354,1.367231}, + {-0.269568,0.317660}, + {-0.509721,-0.056128}, + {-0.996035,0.482343}, + {-0.318504,0.613621}, + {0.724407,-0.391671}, + {-0.976483,0.002770}, + {0.168754,-0.138651}, + {-0.850412,0.004662}, + {-0.778271,0.301141}, + {-0.556300,-0.014048}, + {-0.144566,0.581755}, + {1.567425,-1.299013}, + {-0.633055,-1.176258}, + {-1.218887,1.088643}, + {-0.057700,0.210952}, + {-0.252005,-0.056308}, + {-0.164041,1.200916}, + {0.881096,-0.523409}, + {1.271002,0.348902}, + {0.300212,0.080781}, + {-1.259126,-0.385348}, + {0.380261,-0.005380}, + {0.301990,-0.096667}, + {-0.644417,0.661865}, + {0.031295,-0.414362}, + {0.513909,-0.849192}, + {1.037724,0.167813}, + {0.045507,0.302800}, + {-1.007752,-0.631584}, + {-1.626240,0.520166}, + {0.161739,-0.005463}, + {-1.011094,-0.296322}, + {0.530863,-0.353709}, + {0.919905,-1.215387}, + {-0.399307,0.348172}, + {0.124302,-0.831545}, + {-1.101106,0.209511}, + {0.423896,0.392179}, + {-0.194011,-0.630735}, + {-0.500591,0.215709}, + {0.031183,0.910928}, + {0.038389,-0.311259}, + {-0.355431,-1.334079}, + {0.530912,-0.294080}, + {-0.716034,-1.092596}, + {0.581166,0.307768}, + {0.499546,-1.691484}, + {-0.109812,-0.243400}, + {0.044216,0.158567}, + {-1.588308,-0.037482}, + {0.222448,-1.635453}, + {-0.184406,-0.084681}, + {1.961808,0.936940}, + {0.545590,0.745191}, + {0.655076,0.761226}, + {0.928499,-0.528748}, + {0.311753,0.419596}, + {1.127516,0.514393}, + {-1.142233,-1.018180}, + {-0.751043,0.873569}, + {-0.003552,-0.256010}, + {-0.055468,-0.040296}, + {-0.461006,0.063426}, + {0.114477,1.054606}, + {0.646237,-0.738074}, + {0.047691,0.563215}, + {0.182860,-0.736483}, + {1.006184,-0.743762}, + {0.208249,1.194100}, + {-0.936638,-0.678655}, + {1.379611,-1.003314}, + {-0.214213,0.683884}, + {-0.412822,0.050631}, + {0.206172,-0.486222}, + {-0.262572,0.662397}, + {0.484827,0.903902}, + {1.340717,0.828282}, + {0.376723,-0.394673}, + {0.947224,0.377674}, + {-1.479304,-0.488522}, + {-0.346264,-1.112863}, + {0.079983,-0.757019}, + {-0.589024,-0.865351}, + {0.154858,0.742523}, + {-0.185417,-1.110911}, + {0.054021,0.213561}, + {0.049129,0.159524}, + {0.250903,1.427318}, + {-1.002452,-1.002884}, + {-0.706890,0.148861}, + {-1.154288,-0.107721}, + {-0.817221,0.436977}, + {-0.157997,-0.870204}, + {1.385451,-1.059729}, + {-0.802317,0.030557}, + {0.536617,-0.377124}, + {-0.267416,1.257724}, + {0.271600,-0.064099}, + {-0.293484,0.280734}, + {-0.139114,-0.129475}, + {0.480314,-0.765081}, + {0.342935,-0.322883}, + {0.036162,-0.632071}, + {0.182499,0.303409}, + {0.388280,-0.850579}, + {-0.118716,0.915001}, + {-0.755100,-0.436041}, + {-0.860414,0.326513}, + {-0.078845,0.146499}, + {-0.454604,0.719797}, + {-2.241604,0.049962}, + {-1.192389,1.327719}, + {0.375567,1.037999}, + {0.689446,-0.703830}, + {0.302199,-0.655993}, + {-0.087239,0.488734}, + {0.211377,0.892874}, + {-1.046074,-0.479046}, + {-1.018003,0.367627}, + {-0.152274,1.650427}, + {-0.779947,1.239985}, + {0.952925,0.318968}, + {0.643531,0.231822}, + {-0.469200,-0.137811}, + {0.818526,-0.988439}, + {0.143608,-0.391619}, + {-0.078638,-0.494635}, + {-0.706101,-0.278646}, + {-0.828922,0.806409}, + {-0.198227,0.585023}, + {-0.181743,-0.538596}, + {0.696894,0.324933}, + {-1.035302,-0.067149}, + {1.116654,-0.636352}, + {-1.447442,-0.383901}, + {-0.842335,0.808594}, + {-0.059386,-1.333912}, + {0.039588,-0.568428}, + {1.841497,0.186063}, + {-0.222182,0.546696}, + {-0.492511,0.065429}, + {-0.049596,0.521704}, + {0.950219,0.001244}, + {0.239031,0.821970}, + {-0.148545,-0.111477}, + {-0.799855,0.719260}, + {-0.198976,-0.598787}, + {1.057029,-0.080555}, + {-0.042454,0.198415}, + {-0.396442,0.128443}, + {0.356674,0.917567}, + {0.629624,-0.252468}, + {0.494230,0.346046}, + {-0.203429,0.238311}, + {-1.254628,-0.489511}, + {-0.885587,1.273245}, + {0.130810,-0.161627}, + {0.060963,-0.761843}, + {-0.216955,-1.087269}, + {0.365978,0.094954}, + {0.912409,0.200455}, + {-1.054822,-0.278074}, + {0.608031,0.908329}, + {0.311314,-0.062994}, + {-1.084923,-0.437044}, + {0.483123,0.692619}, + {0.487429,0.109963}, + {-0.553350,0.131579}, + {-0.992250,0.280366}, + {-0.884746,0.002868}, + {-0.029371,1.412446}, + {0.678184,0.364567}, + {-0.139078,-0.387712}, + {-0.347524,1.175467}, + {-1.183990,-0.650822}, + {1.246393,-1.035660}, + {-0.296366,0.060319}, + {-1.583348,0.761657}, + {-0.150878,0.717756}, + {-0.539900,0.032499}, + {0.538042,-0.765398}, + {0.608876,-0.599854}, + {0.351878,-0.018209}, + {-0.963879,0.867025}, + {-0.746801,0.240322}, + {-0.264184,-0.061670}, + {0.684332,0.011746}, + {1.440898,-0.176096}, + {0.229892,-1.161869}, + {0.056788,-0.657892}, + {-0.700251,-0.949597}, + {-0.678207,-1.371336}, + {0.610739,0.719252}, + {-1.817905,-0.601268}, + {0.031990,0.180419}, + {0.060516,0.204577}, + {-0.679842,1.491688}, + {0.905999,-1.561989}, + {-0.013397,-0.658106}, + {0.646469,-0.124247}, + {0.231365,-0.066460}, + {0.072911,1.358672}, + {0.523387,0.767592}, + {-0.255464,-0.837687}, + {-0.347596,0.065474}, + {-0.118698,0.282555}, + {0.227003,-0.532110}, + {-0.105316,1.261845}, + {-1.287464,0.009365}, + {0.164639,0.004452}, + {0.487845,-0.036515}, + {0.237642,-0.113136}, + {0.280221,-0.370952}, + {-0.693740,-0.547488}, + {-0.026475,-1.513071}, + {0.562730,-0.294865}, + {-0.407170,-0.821101}, + {-0.007381,-0.255046}, + {-0.882883,0.044493}, + {0.458046,-0.236675}, + {-0.280611,0.402649}, + {0.655407,0.081470}, + {-0.583163,0.689875}, + {-0.126923,-0.141713}, + {0.568498,-0.192502}, + {0.207786,-0.707445}, + {0.181237,-0.315024}, + {0.452277,-0.237819}, + {0.804749,0.161488}, + {-0.668502,-0.165804}, + {-0.995984,-0.756193}, + {-1.477199,0.138328}, + {0.224779,0.153369}, + {0.714115,-0.105414}, + {0.755752,-1.157271}, + {-0.624159,0.288454}, + {0.410050,-0.940682}, + {-0.735226,0.333144}, + {-0.319454,-0.151368}, + {-0.534119,0.581015}, + {-1.021982,0.025073}, + {0.364749,-0.324409}, + {-0.809700,-0.013999}, + {-0.631631,-1.111146}, + {0.041314,-0.401087}, + {0.694871,0.735264}, + {-0.367532,-1.564337}, + {-0.580821,-0.330655}, + {0.183537,0.598051}, + {-0.245114,-0.399095}, + {0.431852,-0.491440}, + {-1.538842,0.741551}, + {0.355387,-0.411799}, + {0.047607,-1.484812}, + {-0.406563,-0.099734}, + {-0.476070,-0.974793}, + {0.424268,-0.049799}, + {-0.463479,0.342533}, + {-0.021704,-0.441977}, + {0.274849,0.092550}, + {0.062134,0.876438}, + {0.724167,-0.072370}, + {-0.878909,0.087750}, + {0.496256,-0.162627}, + {0.279006,0.247471}, + {1.112257,-0.008240}, + {-0.542958,1.121075}, + {0.883658,-1.033522}, + {0.665774,1.218471}, + {-0.485500,0.566506}, + {0.101171,-0.467048}, + {0.428733,0.037372}, + {0.070215,0.356568}, + {-0.115995,0.469828}, + {-0.288060,0.751706}, + {-0.893341,-0.479910}, + {0.129788,-0.712225}, + {0.607605,-0.659464}, + {-0.928870,0.184671}, + {1.532564,0.622921}, + {-0.259213,0.773723}, + {-0.613180,1.165169}, + {-0.246855,0.477170}, + {-0.763396,0.185209}, + {0.176437,-0.026025}, + {0.238849,0.442184}, + {-0.352254,-0.531682}, + {0.807799,-0.627800}, + {0.047221,0.691612}, + {-1.063426,-0.086542}, + {0.127711,-0.873769}, + {-0.266249,-0.401636}, + {-0.792988,0.561747}, + {1.359199,0.175116}, + {0.055027,0.221748}, + {-0.811887,0.783136}, + {-0.242847,1.170197}, + {0.603982,-0.386618}, + {-0.066028,-0.887924}, + {0.195072,-0.461362}, + {-0.124588,-1.349309}, + {-0.923671,0.021243}, + {0.672608,0.390882}, + {-0.157503,0.476204}, + {0.395069,1.581050}, + {0.546212,0.493126}, + {-0.275470,-0.171620}, + {0.279435,0.010272}, + {0.398665,-0.060216}, + {-0.540549,-0.545716}, + {-0.203679,0.332363}, + {-0.496097,-0.577372}, + {0.580802,0.437667}, + {1.112826,-0.947356}, + {-0.740122,-1.666636}, + {0.794783,-1.131704}, + {-0.942124,-0.854277}, + {-0.673412,0.214855}, + {-0.147656,0.291988}, + {-0.104863,0.388239}, + {0.076779,0.606955}, + {0.200388,0.524721}, + {-0.320980,0.897459}, + {0.075462,0.168864}, + {1.058383,-0.217411}, + {-0.257135,-0.135694}, + {-0.967934,-0.164808}, + {-0.923465,1.535662}, + {-0.342228,0.493143}, + {0.950437,0.330328}, + {1.159788,0.029407}, + {0.519360,-0.289634}, + {-0.387919,0.756822}, + {0.110258,-0.324655}, + {-0.834385,0.057787}, + {0.385197,0.770062}, + {-0.865068,-0.695108}, + {-0.163616,0.499126}, + {-0.260925,0.174936}, + {0.269825,-0.563868}, + {0.085977,0.711242}, + {-0.154136,-0.310298}, + {0.667896,0.312458}, + {0.455000,0.511352}, + {-0.119230,0.565919}, + {0.448509,-0.266193}, + {-0.076594,0.711581}, + {0.487758,-0.084284}, + {-0.134384,0.512608}, + {-0.073188,-1.588799}, + {0.263813,-1.537716}, + {-0.318161,0.668523}, + {0.716481,1.034983}, + {0.100407,0.603227}, + {1.278314,0.725134}, + {-1.102419,-0.668425}, + {-1.533689,-0.122580}, + {-0.015321,-0.363228}, + {-0.354993,-0.049059}, + {0.234433,-0.176360}, + {1.531154,1.445120}, + {0.196174,-0.704589}, + {0.939701,0.188199}, + {-0.883210,-0.154533}, + {0.533736,1.018771}, + {1.025444,-0.745913}, + {-0.224936,0.074982}, + {-0.445386,-0.861890}, + {0.037407,-0.227981}, + {-0.186347,-1.290577}, + {-0.309371,0.403374}, + {-0.532396,0.613887}, + {2.165530,1.358975}, + {2.007988,-0.415721}, + {1.170118,1.184736}, + {0.147671,0.285319}, + {0.189048,-1.372490}, + {0.572345,-0.160934}, + {-0.968055,0.078689}, + {-0.838057,0.005487}, + {0.002971,0.754035}, + {0.963936,-1.052451}, + {1.384693,-0.238220}, + {0.730919,-0.253514}, + {-0.055962,-1.239576}, + {-0.971576,0.081729}, + {1.592811,0.554873}, + {0.891373,-1.465274}, + {-0.436801,0.681487}, + {0.781594,-0.567997}, + {-0.734441,-0.356614}, + {-0.417233,0.307766}, + {-0.342015,-0.643618}, + {-0.292766,-0.377798}, + {0.524786,0.511648}, + {-0.581227,1.232650}, + {-0.014453,0.621820}, + {0.249726,0.375897}, + {0.606730,-0.436103}, + {0.470665,1.092492}, + {0.049061,0.242758}, + {0.356517,0.602295}, + {-0.136680,-0.171375}, + {0.138788,0.924838}, + {1.014005,-0.233081}, + {-1.201889,0.445990}, + {1.026871,-0.586108}, + {0.489435,1.106440}, + {-0.647070,0.966539}, + {0.412053,0.403891}, + {1.508765,0.651857}, + {0.967302,0.360629}, + {0.643439,0.542859}, + {0.009643,0.167438}, + {-0.043095,-0.479629}, + {-0.427617,-0.891696}, + {0.262743,0.496652}, + {0.399848,0.055136}, + {0.389352,-0.140837}, + {-0.874961,-0.286650}, + {-1.148781,0.964809}, + {-0.075158,-1.058411}, + {-1.356972,0.477178}, + {-0.583056,0.785091}, + {0.180521,0.643195}, + {-0.341790,0.582116}, + {0.617637,-0.386019}, + {0.287523,-0.641069}, + {0.445544,-1.046088}, + {0.056885,0.909019}, + {0.237974,-0.577966}, + {0.265120,0.170968}, + {0.831315,0.261175}, + {-0.053478,0.750541}, + {-0.910915,0.305149}, + {0.740491,0.199702}, + {-0.644430,0.804073}, + {-0.032674,0.043810}, + {0.506929,0.722204}, + {-1.458642,-0.012285}, + {1.125423,-0.870600}, + {-0.413975,-1.013859}, + {0.263494,-0.250882}, + {-0.509992,0.642512}, + {0.309917,0.102069}, + {0.432682,-0.594946}, + {0.389074,-0.347972}, + {0.363322,0.447382}, + {0.409466,0.684147}, + {-0.383569,1.103528}, + {0.400605,1.027698}, + {-0.244181,-1.174979}, + {-0.138094,-0.035489}, + {-0.732504,-1.119719}, + {0.401623,-0.226204}, + {-0.009444,-0.493273}, + {-0.623539,0.052497}, + {-0.082322,0.624134}, + {-0.241276,0.692779}, + {-0.855399,-0.954111}, + {-0.102812,0.455049}, + {-0.163148,-0.813131}, + {0.632547,-0.140929}, + {0.494530,-0.185368}, + {-0.193079,-0.723176}, + {0.337338,-0.445788}, + {0.401790,0.559695}, + {0.230591,-0.192288}, + {-0.300693,-0.121974}, + {1.384646,-0.585677}, + {0.325791,-0.040454}, + {-0.012575,0.226125}, + {-1.008117,-1.345584}, + {-0.253066,-0.722583}, + {0.510556,-1.634320}, + {-0.620574,0.638105}, + {0.744498,-0.848184}, + {-0.604678,0.294828}, + {0.576435,-0.241527}, + {-0.209046,1.633283}, + {-0.037161,-0.383274}, + {-0.522555,-0.336960}, + {0.454551,0.473618}, + {-0.155145,-0.383863}, + {0.691671,0.364433}, + {0.110858,-0.308247}, + {0.291931,-0.200529}, + {-0.257731,-0.294773}, + {-0.297832,-0.078972}, + {-1.000551,-0.056650}, + {-0.728054,1.617977}, + {0.683715,-0.328680}, + {-0.000525,0.011541}, + {0.620598,-0.661930}, + {0.264711,-0.928142}, + {0.228987,-0.335306}, + {-0.244599,-0.068855}, + {-0.836542,-0.817358}, + {0.092673,0.460987}, + {-1.129502,-0.114615}, + {-0.632434,0.515582}, + {0.031820,0.686984}, + {0.770886,-0.492505}, + {-0.596480,1.289307}, + {-0.101952,-0.691478}, + {-0.104274,-0.131200}, + {-0.625558,-1.086399}, + {0.877969,-0.772245}, + {0.268059,-0.223637}, + {-0.900697,1.204608}, + {0.050722,0.907601}, + {0.673273,0.381280}, + {-2.047377,-0.460464}, + {-0.180485,0.585813}, + {0.917693,-0.593887}, + {-0.800537,0.647290}, + {-0.440595,0.183335}, + {-0.713969,-0.073229}, + {-0.774967,-0.149180}, + {0.404131,0.588253}, + {-0.461998,-0.696968}, + {0.274178,-0.357117}, + {0.206730,0.108627}, + {-1.064527,-0.450529}, + {0.868135,-0.511465}, + {1.861500,-0.019361}, + {-0.168042,0.157278}, + {-0.306666,-0.372632}, + {-0.358648,0.439013}, + {-0.508541,0.110548}, + {0.429907,0.318529}, + {0.768140,0.536835}, + {-0.468226,-0.061801}, + {-0.479689,-0.447397}, + {1.419374,-0.900772}, + {1.265393,-0.725799}, + {-1.446047,0.967326}, + {-1.003305,-0.450572}, + {-0.765069,-0.367291}, + {0.058085,0.520892}, + {0.507400,0.307971}, + {-0.096135,0.082836}, + {0.499087,-0.483651}, + {0.786245,-0.896910}, + {-0.776823,-0.917120}, + {0.046113,-0.674221}, + {0.437166,-0.946565}, + {-0.481481,0.348660}, + {-0.303571,-1.297511}, + {0.184266,-0.433271}, + {0.351287,0.490834}, + {0.136868,0.207400}, + {-0.928643,-0.705652}, + {0.411477,-0.296834}, + {-0.130098,0.423371}, + {0.256138,0.201198}, + {1.325804,-1.394897}, + {-0.987536,0.911194}, + {0.467954,0.721556}, + {-1.111917,-0.388390}, + {-0.225829,-0.194731}, + {0.686892,0.002306}, + {0.017090,-0.337756}, + {0.320620,0.701407}, + {-0.126604,-0.448189}, + {-1.038320,0.350680}, + {0.525033,-0.775856}, + {1.423413,-0.907011}, + {-0.654169,1.310124}, + {-0.256723,-1.274182}, + {-0.148799,1.158405}, + {-1.309938,-0.423753}, + {-0.822022,0.520373}, + {-0.487639,-0.029609}, + {-1.731135,1.225201}, + {0.860007,0.817290}, + {1.085528,-0.477385}, + {0.170410,0.225994}, + {0.130012,0.501964}, + {1.362920,-1.040532}, + {0.274595,-0.360680}, + {-0.180443,-1.150807}, + {-1.010892,-2.785690}, + {-0.185408,0.645141}, + {0.408186,0.598987}, + {-0.276912,-0.233762}, + {-0.554369,0.384061}, + {-0.313129,-1.273413}, + {-0.295076,-0.206805}, + {-1.135422,0.314641}, + {-0.091967,1.316718}, + {-1.148036,0.420483}, + {0.464056,0.070829}, + {0.643956,-1.132460}, + {0.007388,-0.087534}, + {-0.670980,-0.644856}, + {-0.562657,0.103308}, + {-0.910544,-0.624181}, + {-1.294871,-0.704342}, + {0.253288,-1.249465}, + {0.010697,-0.206204}, + {0.032296,-0.068846}, + {0.227298,0.289679}, + {-1.018986,0.376146}, + {0.196228,0.336658}, + {0.324491,0.481509}, + {1.401432,-1.385349}, + {0.469776,-0.021242}, + {-0.359218,0.077900}, + {0.263855,-0.553276}, + {-1.338136,1.760596}, + {0.345680,-0.356526}, + {0.967508,-0.348957}, + {-0.000197,-0.317256}, + {0.266182,0.209979}, + {0.645966,-0.065156}, + {0.095471,0.687960}, + {-0.950904,0.472007}, + {0.237504,1.029535}, + {-1.188493,0.582823}, + {0.037901,0.276498}, + {1.500981,0.033858}, + {0.470859,0.204791}, + {-0.325697,-0.511828}, + {-0.701164,-0.624759}, + {-1.022831,0.029449}, + {-0.617654,-0.209681}, + {-1.086358,-0.753587}, + {-0.620495,0.350436}, + {0.255824,0.780289}, + {0.259997,0.853987}, + {0.178984,0.708660}, + {0.206355,0.342937}, + {-0.203803,0.123989}, + {0.087570,-0.018768}, + {-0.251778,0.402282}, + {-0.067944,0.802752}, + {0.814430,-1.075422}, + {0.980073,0.924960}, + {-0.643462,0.281085}, + {-0.043385,0.222169}, + {0.150379,-0.073680}, + {-0.866595,-0.370094}, + {0.070700,-0.031495}, + {-0.718160,-0.057721}, + {-1.453375,0.891355}, + {0.289324,0.775060}, + {0.181655,0.483275}, + {-0.752997,-0.073676}, + {-0.304538,-1.541777}, + {-0.709192,0.581410}, + {0.492839,-0.517246}, + {0.183811,-0.156000}, + {0.653373,0.230724}, + {0.406458,0.005703}, + {-0.311049,0.812297}, + {-0.520574,0.204449}, + {0.054290,-0.724717}, + {0.094583,-0.073227}, + {0.038531,1.556567}, + {-0.384123,-0.654494}, + {0.561946,-0.464299}, + {-0.404523,-0.766166}, + {-0.481575,0.460856}, + {-1.907571,-0.823209}, + {2.101905,0.161585}, + {0.287454,-0.132443}, + {1.242270,0.686925}, + {-0.921165,-0.565261}, + {0.611637,0.513699}, + {0.049954,-1.129081}, + {-0.501940,0.054891}, + {1.429713,-0.551187}, + {-0.836163,-0.446508}, + {0.278495,0.087073}, + {0.218168,-0.779450}, + {-0.223319,-0.407988}, + {0.634553,-0.616996}, + {1.182395,0.959111}, + {-0.978832,0.211972}, + {0.424967,-0.249287}, + {-0.041136,-0.865872}, + {0.678616,0.138109}, + {-0.183760,0.626009}, + {0.774335,0.071065}, + {-0.711756,0.994632}, + {-1.071178,-0.459611}, + {-0.483535,0.070145}, + {-1.195615,0.843780}, + {-0.466068,-0.769168}, + {-0.277629,-1.090422}, + {0.421671,-0.180614}, + {0.412349,0.215483}, + {0.770770,-1.211197}, + {0.216869,-1.257316}, + {1.131962,1.071910}, + {0.604317,1.569760}, + {-0.432696,-0.511691}, + {1.490919,0.544307}, + {0.722433,-0.223854}, + {-0.747281,0.587934}, + {0.591043,-0.389259}, + {0.915617,0.907123}, + {-0.090304,0.260222}, + {-0.286085,0.181432}, + {-1.366335,0.134996}, + {1.006915,-0.256088}, + {-0.742269,-0.287000}, + {-0.560519,0.149843}, + {0.228870,-0.089042}, + {0.485062,1.555019}, + {-2.098179,-1.037507}, + {0.281221,0.160181}, + {1.124136,0.576409}, + {0.377565,0.179290}, + {-0.774858,-0.594426}, + {0.057609,0.773926}, + {-0.352908,0.659389}, + {-0.214422,-0.486733}, + {1.185269,-0.773319}, + {2.361595,0.580060}, + {-0.480781,0.323322}, + {-0.280537,0.592566}, + {-0.518135,1.090907}, + {0.038454,-0.673850}, + {-0.396300,0.291648}, + {0.431237,-0.742958}, + {-0.354511,-0.258468}, + {0.589504,-0.340787}, + {0.350439,0.872189}, + {0.434521,0.321774}, + {-0.033107,0.105060}, + {0.708078,-0.753049}, + {0.529888,-0.271240}, + {0.536421,-1.059462}, + {-0.225809,-0.688310}, + {1.434065,0.509015}, + {-0.173576,0.479379}, + {-1.128043,-1.200555}, + {-0.400962,0.006900}, + {-0.193926,0.797977}, + {0.890121,-0.520395}, + {0.483454,-0.759030}, + {0.120016,0.881875}, + {-0.600343,-0.651720}, + {-1.451600,-1.029965}, + {0.761142,0.319997}, + {-0.112053,-1.155185}, + {1.220439,1.751782}, + {1.160185,0.688299}, + {-0.512242,-0.051162}, + {-0.706967,-0.136270}, + {0.615304,1.293581}, + {-1.400761,0.916505}, + {1.187036,0.351908}, + {0.080335,-1.965701}, + {-1.630052,0.439980}, + {-1.391160,0.129870}, + {1.155798,0.582881}, + {-0.065111,-1.099486}, + {0.125533,-0.003002}, + {-0.164680,0.102916}, + {0.466728,0.343552}, + {0.762902,0.475304}, + {0.744999,-0.654491}, + {-1.398257,0.311517}, + {-0.237558,-0.246793}, + {0.428761,0.156024}, + {0.570756,0.535184}, + {2.016382,-0.060246}, + {-1.088301,0.681331}, + {0.830869,-0.097576}, + {0.388942,1.207765}, + {-0.606217,-0.034154}, + {-0.231597,-0.930088}, + {-1.380885,-0.946200}, + {1.243384,-0.076184}, + {-0.876585,1.046718}, + {0.966272,0.210433}, + {-0.291174,0.271509}, + {0.211819,0.974055}, + {-0.463701,-0.565772}, + {0.487341,-0.602470}, + {-1.121183,-0.165544}, + {-0.252906,0.474726}, + {-0.402199,0.851284}, + {0.080496,-0.760036}, + {0.025413,-1.091766}, + {0.547332,-0.330242}, + {-0.672557,0.494495}, + {0.954815,-0.310860}, + {0.424952,0.387591}, + {-0.206481,-1.215096}, + {-0.565978,0.308471}, + {-0.594998,0.287291}, + {0.244841,-1.011218}, + {-0.121897,-0.182509}, + {0.436936,-0.388815}, + {-0.237612,0.125997}, + {0.469551,0.559430}, + {-0.150812,0.430465}, + {-0.309672,-0.159915}, + {-0.041266,-0.484249}, + {-0.498416,0.134495}, + {-0.216836,-0.600673}, + {0.753550,0.178144}, + {-0.829567,0.580848}, + {0.151586,0.985193}, + {-0.030831,0.835093}, + {-1.336242,-0.274785}, + {0.877728,0.795873}, + {-1.272274,-0.088021}, + {0.329721,0.397562}, + {0.284857,-0.480608}, + {0.682917,0.080741}, + {-0.101889,-0.248454}, + {-0.682076,1.494906}, + {0.629653,0.954928}, + {-0.543290,1.090091}, + {1.459454,0.219865}, + {0.242040,-0.001250}, + {1.335699,-0.279217}, + {-0.929197,-0.177255}, + {-1.073987,-0.628953}, + {-0.603636,0.406831}, + {-0.127502,-0.233138}, + {-0.595331,-1.556322}, + {-0.003979,-0.372901}, + {-0.071019,0.395963}, + {0.367574,-1.213747}, + {-0.334848,-0.212891}, + {0.545672,0.431015}, + {-0.319922,-1.488089}, + {1.622107,-0.160144}, + {-0.443496,-0.342474}, + {-0.182690,0.814460}, + {0.294580,0.439232}, + {-0.456404,-0.781690}, + {-0.239482,0.065164}, + {0.522642,0.114414}, + {0.220545,0.027521}, + {0.928442,-0.357315}, + {-0.037976,0.045284}, + {0.271085,-0.280372}, + {1.126150,-0.692677}, + {0.605778,-0.288038}, + {-0.839818,0.853392}, + {-0.017924,-0.218859}, + {0.193144,0.838310}, + {0.382364,-0.079117}, + {-1.218131,-1.625995}, + {0.587757,-0.067836}, + {1.112485,-0.821042}, + {-1.079681,1.113467}, + {0.739449,0.903260}, + {-0.337197,-0.539171}, + {-0.715782,0.433698}, + {-0.681131,-1.078419}, + {-0.399622,-0.481035}, + {0.985279,0.921888}, + {-0.886267,-0.759144}, + {0.477293,-0.151442}, + {-0.382453,-0.131280}, + {-0.996212,-0.422600}, + {0.704734,0.607694}, + {0.134826,0.350086}, + {-0.256879,0.214261}, + {-0.492210,-1.268288}, + {0.269138,1.401154}, + {-0.717996,0.256866}, + {0.058280,-0.897792}, + {0.335278,-0.190030}, + {-0.247184,-0.605186}, + {0.020146,0.328500}, + {-1.189915,0.129145}, + {0.215961,1.303383}, + {0.478757,0.180930}, + {-0.299342,-0.948503}, + {-1.146943,0.060521}, + {-0.868843,-1.063643}, + {0.923269,-0.045103}, + {-0.878523,1.072741}, + {0.151682,-0.385870}, + {1.248675,0.859689}, + {0.583381,-0.622081}, + {-0.427717,-0.653473}, + {0.114755,1.122795}, + {0.715533,-1.419478}, + {-0.653173,-0.975489}, + {0.388866,-0.494883}, + {0.991641,-1.615541}, + {1.623819,-0.756583}, + {-0.477507,-0.049437}, + {-0.921536,-0.203534}, + {0.524950,-1.209924}, + {0.015214,0.484588}, + {-0.744276,-0.907266}, + {-0.256785,0.726990}, + {-0.989783,0.236785}, + {-0.927026,0.190489}, + {-1.224202,0.044595}, + {0.695077,-0.066990}, + {0.118911,0.317058}, + {0.216068,0.148307}, + {0.147362,0.344791}, + {-0.335603,0.447019}, + {-1.224890,-0.325840}, + {0.002756,-0.321191}, + {-0.160248,1.419446}, + {1.272372,-0.411115}, + {0.090553,-0.020891}, + {-0.813158,0.552475}, + {-1.298817,0.862553}, + {-0.585694,1.251896}, + {-0.013283,-0.413138}, + {-0.297463,-0.903216}, + {-0.255549,1.091331}, + {-0.206760,0.800369}, + {-0.390704,0.606333}, + {0.513017,-1.429631}, + {0.433862,2.005801}, + {-0.383853,-0.598873}, + {1.005859,0.614970}, + {0.851717,0.475903}, + {0.326298,0.574711}, + {-0.558315,0.661107}, + {0.524201,0.697230}, + {0.354126,-1.373313}, + {-0.935029,0.948730}, + {-0.134743,0.135532}, + {0.276808,1.185467}, + {0.018978,0.217541}, + {-0.112404,1.728553}, + {-1.302444,0.146517}, + {0.311354,-0.511768}, + {-0.162418,1.170043}, + {1.221405,-0.185509}, + {0.187501,-0.388756}, + {-0.992425,0.895706}, + {0.010906,-0.436499}, + {-1.151269,-0.978387}, + {0.331651,2.365055}, + {-0.261792,-0.105662}, + {-0.015082,-1.027851}, + {-0.566662,-0.066912}, + {0.333652,0.030599}, + {-0.580868,1.197625}, + {-0.698983,-0.072313}, + {-0.336455,0.586318}, + {-0.460653,-1.130129}, + {1.129557,-0.342097}, + {0.675431,-0.111390}, + {0.656948,-1.198251}, + {0.124118,0.471617}, + {0.873740,-0.661021}, + {0.883188,-0.120431}, + {-0.231922,0.823063}, + {-0.037173,0.803393}, + {0.249852,-0.697130}, + {-0.608230,0.681932}, + {-0.243067,-0.598592}, + {1.280129,0.144530}, + {0.335054,-0.507225}, + {-0.148178,0.471538}, + {-1.320556,0.648198}, + {0.793534,0.184092}, + {0.175364,0.260736}, + {-0.345658,-1.638374}, + {-0.954853,0.361345}, + {-0.439794,-0.209984}, + {-0.580261,-0.437008}, + {-0.042380,-1.008410}, + {-0.256240,0.240739}, + {0.997668,0.041341}, + {0.084286,1.337007}, + {-0.089726,0.349824}, + {-0.351226,-0.439389}, + {0.789935,-0.231385}, + {0.559332,0.372916}, + {0.431332,-0.309163}, + {0.438769,0.729816}, + {-0.709308,-0.453381}, + {-0.806887,0.031475}, + {-0.109243,0.296421}, + {1.053895,-0.808360}, + {1.310377,-0.018203}, + {-0.088228,0.464224}, + {0.404860,1.091152}, + {0.980650,-0.822832}, + {-0.182331,0.154915}, + {-0.416259,0.293648}, + {-1.202575,0.608544}, + {-0.939778,0.311341}, + {0.362085,-0.732201}, + {0.318978,-0.637671}, + {-0.485214,0.461226}, + {-0.302925,-0.728450}, + {0.411979,-0.138660}, + {-0.429297,-0.510534}, + {-1.260831,-0.795375}, + {0.852526,-0.602336}, + {-0.795936,0.503556}, + {-1.379397,-0.490658}, + {0.325956,-1.584800}, + {-0.223558,0.569081}, + {0.081155,0.347926}, + {-0.295295,0.593889}, + {1.147863,0.678079}, + {0.666420,0.268891}, + {0.335919,-0.387414}, + {1.884109,-0.565796}, + {-1.155022,-0.181474}, + {-0.083694,0.434470}, + {-0.431032,-0.709799}, + {0.867853,-0.661146}, + {1.308108,-0.705654}, + {0.441709,0.237870}, + {0.906238,0.160666}, + {0.263269,-0.911975}, + {1.316673,0.073375}, + {0.495316,0.359938}, + {-0.137338,-0.098128}, + {1.551014,-0.986343}, + {0.852076,-0.721691}, + {0.453226,0.292144}, + {1.095678,-0.511793}, + {-0.038954,1.062364}, + {0.808936,-0.562206}, + {-0.290931,-0.645168}, + {0.256794,0.145837}, + {-0.849594,0.501363}, + {0.383039,-0.725827}, + {0.191017,0.987863}, + {-0.260132,0.407206}, + {0.386396,-1.059209}, + {-0.377412,-0.745123}, + {-0.291906,-0.531367}, + {-0.405497,0.709018}, + {0.620085,0.652872}, + {-0.848280,-0.510761}, + {0.284859,0.615713}, + {0.348772,-0.207622}, + {-0.055816,1.039482}, + {0.334478,0.209594}, + {1.605196,-0.420670}, + {-0.605169,-0.084273}, + {0.630320,0.781429}, + {0.014900,-0.362734}, + {0.894942,-0.727579}, + {0.067741,0.754466}, + {0.949988,-0.066743}, + {-0.253311,-0.959373}, + {-0.348181,0.499553}, + {0.059039,-0.130159}, + {-0.127018,-0.015114}, + {0.113024,-0.379652}, + {-0.474835,-0.334921}, + {0.787752,1.233290}, + {0.730310,-0.362158}, + {-0.043029,0.764059}, + {0.702234,0.977776}, + {-0.707870,0.675695}, + {-0.746668,-0.056283}, + {-1.427597,0.548321}, + {-0.889836,-0.322518}, + {0.559716,-0.205609}, + {0.866683,-0.427771}, + {0.190978,-0.991563}, + {-0.904855,0.124091}, + {0.050012,-0.833915}, + {-0.237735,0.753702}, + {1.054057,-0.159998}, + {-1.311705,-0.141423}, + {-0.167340,-0.857237}, + {0.299898,-2.073567}, + {1.438581,0.978587}, + {-0.643269,-0.584753}, + {0.133317,0.494257}, + {-0.649429,0.374599}, + {0.275902,-1.538577}, + {1.198951,-0.760458}, + {-1.385012,-0.069386}, + {-1.281703,-0.058265}, + {-0.555278,-0.011261}, + {-2.004580,-0.558871}, + {0.177745,-0.102492}, + {0.172073,-0.727798}, + {0.435496,-0.446889}, + {0.636023,-1.534272}, + {0.316862,0.134926}, + {-0.152594,-0.252641}, + {1.716484,-0.760875}, + {0.577497,1.141460}, + {0.259169,0.340464}, + {0.148970,-0.160064}, + {1.170360,0.759366}, + {-0.411688,0.120789}, + {0.282131,-0.723614}, + {-0.570560,-0.471775}, + {0.394987,0.179098}, + {0.078922,-1.605195}, + {1.222166,0.705268}, + {0.112494,0.182192}, + {-0.419529,-0.187154}, + {-1.690670,-0.646314}, + {-1.058211,0.228100}, + {0.214788,0.185218}, + {0.288251,0.244880}, + {-1.430080,-1.445750}, + {0.247476,-0.302103}, + {0.265110,-0.804134}, + {1.164424,1.113711}, + {0.311110,-1.210742}, + {0.796506,0.428281}, + {-0.316142,-0.291436}, + {-0.440177,-0.503075}, + {0.097647,-0.178009}, + {0.663421,0.217058}, + {0.665703,-0.958534}, + {0.310222,0.430380}, + {1.264676,0.514635}, + {0.652022,-0.675808}, + {0.546673,-0.732842}, + {-1.412238,0.029713}, + {1.812263,-0.439160}, + {-0.059908,-0.137715}, + {0.717444,-0.127056}, + {-0.231742,0.293963}, + {0.953017,0.337998}, + {-0.259151,0.250980}, + {0.052105,-0.381903}, + {0.152729,-1.519173}, + {-0.591415,-0.657243}, + {-0.150356,0.561554}, + {0.049513,-0.328535}, + {0.980559,-0.235285}, + {1.255975,-0.268207}, + {0.054851,0.313362}, + {1.065817,0.798603}, + {0.333122,0.943230}, + {0.173731,1.244529}, + {-0.137778,1.175759}, + {-0.572404,-0.089366}, + {-1.084071,0.201398}, + {-0.302239,-0.089035}, + {-2.102849,0.327512}, + {-0.071969,0.048153}, + {-0.987305,0.609359}, + {0.045616,-0.070737}, + {0.255401,-0.350403}, + {-0.325866,-0.684457}, + {-0.949723,-0.234736}, + {0.084110,-0.655785}, + {0.250549,1.066458}, + {0.025403,-0.832694}, + {-0.995800,0.738287}, + {0.298398,1.547136}, + {-1.442081,0.084168}, + {0.067213,-0.221365}, + {0.242559,0.174805}, + {-0.326723,-0.622174}, + {0.223836,-0.637175}, + {0.811831,-0.299335}, + {0.773214,0.551379}, + {0.392211,-0.445570}, + {-0.284968,-0.265439}, + {-0.881859,1.508451}, + {-0.347475,-0.325761}, + {-0.616885,-0.769191}, + {0.576795,-0.557282}, + {0.047390,0.337606}, + {-0.097859,1.780184}, + {-0.429312,1.112392}, + {-0.524623,0.219636}, + {0.405006,-0.298594}, + {0.382213,-1.012895}, + {-0.976113,-0.643431}, + {-0.135279,0.069899}, + {-0.077138,0.056443}, + {-0.622842,-0.648767}, + {-0.142333,-0.385734}, + {0.939501,1.168477}, + {-0.090723,-0.021190}, + {0.941865,-1.007430}, + {-0.986187,0.958079}, + {0.375743,0.363480}, + {-0.381949,-0.320752}, + {1.268664,-0.616885}, + {0.136944,0.263353}, + {-2.053794,0.961262}, + {-0.684081,-1.224868}, + {0.599383,0.140131}, + {-0.032657,0.782458}, + {0.385562,-0.313714}, + {0.404669,0.093627}, + {1.091659,0.677779}, + {-0.253105,-0.859333}, + {-0.324104,0.386444}, + {-1.904799,-0.146740}, + {0.373496,0.440722}, + {1.125800,0.354270}, + {-0.276754,-0.390405}, + {0.553166,-0.230742}, + {0.345504,1.257560}, + {0.326855,0.709150}, + {0.168127,0.088543}, + {0.349772,-0.368904}, + {-0.285477,-0.469480}, + {0.523761,-0.504454}, + {0.904464,-0.016717}, + {0.081565,-0.511504}, + {0.885394,0.427703}, + {-0.042153,0.607306}, + {-0.240457,-0.369428}, + {-0.476362,0.849541}, + {0.090063,-0.979648}, + {0.986172,-1.489947}, + {-1.101995,0.630631}, + {-0.700222,-0.297787}, + {-0.105735,-0.061019}, + {0.274621,0.286836}, + {0.956524,-0.005156}, + {1.141911,0.489715}, + {0.155700,0.477954}, + {0.161408,-0.280752}, + {0.208306,-0.382345}, + {-0.319743,-0.654164}, + {1.015004,-0.453518}, + {0.798286,0.047264}, + {-0.339036,1.191907}, + {-0.508641,0.191641}, + {-0.312756,0.231250}, + {1.006892,0.770095}, + {0.392099,-0.187454}, + {0.827204,-1.196456}, + {-0.071158,0.489808}, + {-0.111609,-0.123514}, + {-0.392260,1.137272}, + {-0.418037,-0.312706}, + {-0.890258,-0.638300}, + {0.922980,1.538843}, + {-0.076405,-0.034489}, + {-0.056280,0.132953}, + {0.470452,-0.751306}, + {-0.507513,-0.546397}, + {-1.195554,0.917548}, + {0.119745,-1.039416}, + {0.641056,0.873863}, + {-1.881030,0.230334}, + {-0.472662,-0.485251}, + {-0.731312,-0.241578}, + {1.386169,-0.814696}, + {0.439633,0.192069}, + {0.060629,-0.471375}, + {-0.908071,0.528836}, + {0.831151,0.885574}, + {-1.203440,-0.299895}, + {0.129863,0.106531}, + {0.936271,0.756381}, + {0.084020,-0.140794}, + {0.018339,-0.191766}, + {0.476259,1.311259}, + {0.250059,-1.190703}, + {-0.203745,0.761848}, + {-0.825526,-0.180980}, + {0.812343,0.263797}, + {-0.153643,0.325493}, + {-0.823435,-0.089900}, + {-0.936715,-0.947103}, + {0.504302,0.273732}, + {-0.136153,0.040614}, + {-0.228844,0.063628}, + {0.961477,-0.801511}, + {0.144958,0.157167}, + {-0.275340,0.067845}, + {0.982365,0.655564}, + {-0.101251,0.364215}, + {-0.518940,0.008418}, + {1.146963,0.276110}, + {-0.685455,0.477746}, + {-0.867617,0.334274}, + {-0.216229,-1.075130}, + {0.222334,0.883621}, + {0.561563,-0.562039}, + {0.122965,-1.491563}, + {0.905398,0.202764}, + {0.237011,0.541816}, + {0.995545,-0.305894}, + {0.621302,-0.394520}, + {0.118272,-0.759820}, + {0.217348,-1.054868}, + {0.146891,0.018121}, + {-1.551826,-0.096002}, + {0.015579,-0.036639}, + {1.011278,-1.192439}, + {-0.071961,0.011541}, + {-0.953020,-0.444260}, + {-0.367500,1.228606}, + {1.526161,0.151876}, + {1.107404,0.159669}, + {0.491996,-0.158496}, + {-0.098865,0.292759}, + {-0.430131,-1.325361}, + {1.032900,0.131424}, + {0.238858,-0.653212}, + {1.227567,-0.970755}, + {-1.135533,0.454609}, + {-0.498524,-0.586837}, + {-0.249832,0.164953}, + {0.788240,0.689636}, + {-1.805305,0.688304}, + {-0.568470,-0.213126}, + {-1.008743,0.494092}, + {-0.068211,-0.558996}, + {1.019529,-1.524452}, + {-1.555353,0.038906}, + {-1.517993,0.035634}, + {-0.183605,1.086476}, + {-0.901828,1.815693}, + {-0.376961,0.539305}, + {0.384843,0.052507}, + {-0.147705,-1.045677}, + {0.880142,-0.997078}, + {-0.854662,0.272260}, + {0.283422,1.151546}, + {-1.105150,0.930541}, + {0.044104,0.397594}, + {-0.104013,-0.673208}, + {-0.211616,-0.621975}, + {0.027161,0.371316}, + {0.600274,-0.606245}, + {0.806180,0.471603}, + {-1.008090,0.778175}, + {-0.289146,-0.809723}, + {-0.038659,-0.429242}, + {-1.334523,-0.137992}, + {-1.995175,0.137457}, + {0.021312,-0.091064}, + {-1.281258,-0.684793}, + {-0.413871,-0.292442}, + {0.381687,0.818085}, + {0.295284,0.101209}, + {0.665034,0.592564}, + {0.037124,0.035242}, + {0.132064,-0.657651}, + {1.053341,0.819935}, + {1.210807,0.675951}, + {0.457895,-1.075189}, + {0.358357,0.147282}, + {-0.499271,0.175458}, + {0.854323,0.068143}, + {1.991820,0.805889}, + {1.826429,-0.005057}, + {-0.467242,0.138414}, + {-0.366227,-1.697539}, + {0.485183,-0.821876}, + {0.536318,0.341220}, + {-0.441596,0.831566}, + {-0.134826,0.751288}, + {0.358869,1.095253}, + {-0.386092,0.078119}, + {-0.397661,-0.118587}, + {-0.419914,-1.100465}, + {0.280444,0.389289}, + {-0.832278,0.269468}, + {0.472347,0.132484}, + {0.088928,-0.278739}, + {0.361290,-0.444613}, + {-0.320039,-0.519034}, + {1.354470,0.178576}, + {-0.168088,-0.359028}, + {-1.317068,-0.040397}, + {-0.157570,0.775248}, + {0.150971,-0.256518}, + {0.921575,0.744693}, + {-0.137337,-0.764665}, + {-0.917358,-0.458914}, + {-0.705772,-0.263352}, + {-0.510704,-1.187616}, + {0.796905,0.825262}, + {-0.050399,0.512465}, + {0.768824,-0.159475}, + {-0.687249,0.364975}, + {-0.430008,-0.471340}, + {-0.202663,-0.386981}, + {-0.518536,0.608685}, + {0.525161,0.135142}, + {-0.372337,-0.486685}, + {0.717387,-1.392395}, + {0.854322,0.356855}, + {-1.102180,-0.156184}, + {-0.209081,-0.377676}, + {-0.967928,-0.798301}, + {0.111753,0.232228}, + {0.314745,0.446778}, + {-0.989801,0.082857}, + {-0.298760,0.326928}, + {-0.204933,0.197721}, + {1.048764,-0.114128}, + {-0.304972,0.032725}, + {0.104894,0.290204}, + {-0.045314,0.859009}, + {-0.718912,1.194088}, + {-0.242557,0.422101}, + {-0.859795,0.575768}, + {0.311124,-0.177388}, + {-1.427806,0.214970}, + {-0.645104,0.500403}, + {-0.219194,-0.984099}, + {0.788104,-0.907460}, + {0.513765,0.453685}, + {0.335412,-0.418488}, + {-1.097887,0.150175}, + {-0.979087,0.198912}, + {0.305300,-1.140391}, + {0.077787,0.856586}, + {0.214734,-0.592854}, + {-1.113305,0.320877}, + {-0.669169,0.448671}, + {0.253991,0.932563}, + {-0.455481,0.185849}, + {0.762277,-0.010084}, + {-0.477479,0.184388}, + {0.960667,0.390639}, + {-0.720191,0.037977}, + {-1.316302,1.152700}, + {0.398760,0.257566}, + {-0.401636,-0.419254}, + {-1.914376,1.449176}, + {-0.339228,0.296751}, + {0.207467,0.305288}, + {-1.731574,-0.030498}, + {-0.240750,-0.617304}, + {-0.237212,0.715578}, + {-0.416285,-1.008641}, + {0.634027,1.717009}, + {0.384123,-0.449106}, + {-1.160894,-1.767794}, + {0.618354,-0.261380}, + {-1.569626,-0.364495}, + {0.631915,-0.543410}, + {0.282734,-0.370501}, + {-0.977373,-0.433726}, + {1.432343,-0.462557}, + {-0.972547,0.004444}, + {0.784231,-0.243932}, + {-0.376546,-0.584034}, + {1.001247,-0.164126}, + {0.554715,-0.308636}, + {0.540227,0.426550}, + {-1.066853,-0.294694}, + {-0.504114,0.275915}, + {-0.949985,0.630675}, + {0.506317,-0.294027}, + {0.133689,0.989125}, + {0.105266,0.527915}, + {0.072913,0.211680}, + {0.381472,0.837872}, + {-0.183162,0.180758}, + {0.458198,-0.961007}, + {-0.004799,0.996245}, + {-1.561414,-0.676542}, + {-1.427195,0.800941}, + {0.173579,0.155504}, + {-0.830370,0.498583}, + {-0.232669,0.505982}, + {-0.096304,-0.750719}, + {1.906512,-1.461034}, + {-0.395663,-1.409489}, + {-0.705341,-0.497179}, + {-0.163104,-0.442154}, + {0.853744,-0.265722}, + {-0.361874,0.151299}, + {0.107204,-0.414142}, + {-0.106144,0.419209}, + {-1.286889,-0.802826}, + {-0.144332,0.370855}, + {0.474858,0.913496}, + {-0.867293,0.301363}, + {-0.545302,0.146680}, + {0.001880,0.805475}, + {1.320236,0.643083}, + {-1.141064,1.684144}, + {-0.128674,0.678582}, + {-0.343416,0.309854}, + {0.019772,1.077821}, + {-0.239235,-0.119506}, + {-0.373356,-0.583563}, + {0.403890,-0.534354}, + {-0.519976,0.020956}, + {0.712048,0.988539}, + {-0.861664,-0.493059}, + {0.093158,-0.833793}, + {1.052626,0.468904}, + {0.091221,0.456901}, + {-0.584013,-0.961460}, + {1.685019,0.470576}, + {-0.180148,-0.785828}, + {-0.210638,-0.498937}, + {0.934431,1.304392}, + {0.066268,-0.504962}, + {0.151449,-0.194295}, + {0.247991,0.136973}, + {-0.126328,-0.633755}, + {-0.857218,1.918319}, + {0.354034,0.566611}, + {-0.323836,-0.588707}, + {-0.093776,-0.592204}, + {-0.027068,-0.042178}, + {0.002969,0.636477}, + {-0.480469,-0.201484}, + {-1.191052,0.906057}, + {0.598655,-0.164748}, + {-0.044789,-1.118828}, + {-0.541816,-0.070911}, + {0.074609,1.345165}, + {-0.032322,-0.231974}, + {-0.449760,1.661760}, + {0.707548,0.034345}, + {-0.907888,-0.004174}, + {0.152966,0.440522}, + {0.046909,0.346149}, + {-0.281537,-1.219698}, + {-0.895213,1.513594}, + {-0.881255,0.124261}, + {-1.081693,-0.436486}, + {-0.106278,0.626797}, + {0.754899,0.295278}, + {-0.227234,0.474572}, + {-0.763770,-0.042921}, + {-1.002643,0.429052}, + {0.478156,-0.815031}, + {-0.733688,-0.279437}, + {-0.362104,0.064655}, + {-0.114674,0.196627}, + {0.044324,-1.013509}, + {-0.452231,-1.026683}, + {-0.928972,0.240171}, + {0.531384,-0.041877}, + {0.360475,2.263092}, + {-0.002502,0.278693}, + {-1.068170,-0.652698}, + {-0.133973,0.404417}, + {0.112787,0.817903}, + {0.093469,0.514351}, + {0.173190,0.030494}, + {-0.386117,-0.119304}, + {-0.150011,1.098977}, + {-0.718702,1.061190}, + {-0.187865,0.769379}, + {-0.673330,-0.520017}, + {-0.782271,0.749117}, + {1.040643,-0.447207}, + {-0.686538,-1.825913}, + {0.706101,-1.401344}, + {-0.031939,-0.069587}, + {1.026212,-0.730925}, + {0.311104,0.591601}, + {0.589268,-0.406947}, + {-0.305040,0.233919}, + {-0.658906,-0.074957}, + {-0.172826,0.539225}, + {1.621683,0.577736}, + {1.074205,0.776840}, + {-1.131216,-0.504166}, + {-0.664862,-0.542385}, + {-0.245912,0.040006}, + {1.012363,-0.520893}, + {-1.044423,-0.968495}, + {0.057525,-0.137602}, + {0.031642,-0.360814}, + {0.302685,0.776735}, + {-0.590976,0.666512}, + {-0.153819,-0.015702}, + {0.050475,1.733477}, + {0.474972,0.052117}, + {0.185655,-0.901557}, + {0.383428,0.150210}, + {0.254788,0.679409}, + {-0.224796,0.681574}, + {-0.256749,-1.077031}, + {0.134707,-0.760133}, + {1.014226,-1.619607}, + {-0.766887,-0.104736}, + {0.761824,-0.642466}, + {0.640060,0.025030}, + {0.717916,0.808046}, + {0.158375,-0.609786}, + {0.599932,0.529572}, + {0.920422,-1.417508}, + {0.247593,-0.365323}, + {0.143007,0.147123}, + {-0.698949,-0.661064}, + {0.099640,0.528546}, + {0.387466,1.303945}, + {0.721636,-0.563915}, + {-0.056200,-0.095831}, + {0.127167,0.466936}, + {0.614167,-0.250185}, + {0.324173,-0.104513}, + {0.564475,-0.584259}, + {0.000883,-0.715214}, + {0.175617,-0.853427}, + {-0.655242,0.141206}, + {-0.799496,-0.397656}, + {0.509296,-0.078758}, + {0.824815,-0.397955}, + {0.165592,-0.838807}, + {-1.406393,-0.034832}, + {-0.140087,-0.245922}, + {-0.039954,-0.580654}, + {0.592499,0.257650}, + {0.865662,-0.321183}, + {-0.348095,0.633829}, + {-0.222209,0.346638}, + {0.077141,-0.429164}, + {-0.612928,0.649756}, + {-0.218828,-0.978959}, + {-0.467017,0.873553}, + {1.012268,-0.236361}, + {0.935993,-0.768227}, + {-0.637278,0.397934}, + {-0.171380,0.726429}, + {-0.200094,1.039778}, + {-0.395740,-0.290233}, + {-0.251927,0.547605}, + {-0.317331,2.066899}, + {0.874234,-0.172457}, + {-0.112367,0.968130}, + {-0.608874,-0.281634}, + {0.458084,0.134327}, + {-0.327929,-0.153658}, + {-0.809721,-1.217724}, + {0.108791,0.635246}, + {-0.127071,0.688169}, + {-0.681222,0.292983}, + {-0.447850,-0.098757}, + {-0.059162,0.033865}, + {-1.459920,-0.167831}, + {-0.546872,1.304584}, + {0.567670,-0.764303}, + {-0.051371,0.814561}, + {0.018359,0.085225}, + {0.295254,0.367041}, + {0.923804,-0.382126}, + {-0.094986,0.179273}, + {0.751972,-1.355834}, + {-0.131853,-0.066514}, + {0.223027,-0.074406}, + {-0.447982,-0.207079}, + {-1.165943,-1.747960}, + {0.289496,-0.581631}, + {0.995888,-0.840471}, + {0.287864,-1.173235}, + {-0.035233,-0.012186}, + {1.404205,-0.502267}, + {0.271013,-0.607421}, + {0.082209,-0.294491}, + {1.108759,0.397367}, + {0.147693,-0.077201}, + {0.644694,-1.167422}, + {0.439444,-0.480603}, + {1.596557,0.704222}, + {0.202072,-1.010761}, + {0.472276,-0.171207}, + {0.496560,-0.780542}, + {1.279076,-0.623514}, + {0.182762,-0.393778}, + {0.150084,0.277712}, + {0.752527,0.683646}, + {0.480142,1.172231}, + {1.005193,-0.949569}, + {0.668218,-0.521006}, + {-0.401607,0.695572}, + {0.934451,-1.387263}, + {-1.060714,-0.674529}, + {0.445290,-0.241091}, + {0.757956,0.271408}, + {1.231487,0.237535}, + {-0.486448,0.433734}, + {-1.455954,1.581795}, + {-1.037576,-1.013962}, + {-0.251248,-0.324413}, + {1.064396,0.130331}, + {-1.209972,-0.399869}, + {0.412389,0.237274}, + {-0.971736,0.139207}, + {0.364493,0.360362}, + {0.462466,0.123618}, + {0.015647,0.662696}, + {0.521067,-0.464325}, + {-0.691029,-0.419101}, + {0.797372,-0.361360}, + {-0.711848,-0.337005}, + {0.276187,0.033567}, + {0.261731,0.465815}, + {-0.122547,-0.163457}, + {0.449124,0.025562}, + {-0.366007,-0.325535}, + {0.741756,0.044402}, + {0.795758,-1.009837}, + {-0.045791,-1.021170}, + {-0.690750,-0.553651}, + {-0.885860,0.289949}, + {0.587965,-0.598258}, + {0.645572,0.810630}, + {-0.008388,-0.730176}, + {0.161907,0.977525}, + {-0.967148,0.872038}, + {0.372738,-0.028752}, + {0.255575,1.354765}, + {-0.947345,0.186383}, + {0.938292,0.931974}, + {-0.137511,-1.156500}, + {1.535508,1.226839}, + {0.098197,0.233959}, + {1.091029,-0.489096}, + {0.919905,1.862780}, + {0.715268,0.128684}, + {0.737863,-0.154854}, + {-0.231765,-0.541695}, + {-0.512769,-0.574521}, + {-0.128448,0.487393}, + {0.352688,1.345931}, + {0.064971,-0.982254}, + {-0.726009,1.313529}, + {0.448623,-0.053441}, + {1.469537,-0.044362}, + {1.011843,0.352729}, + {1.063249,-0.322635}, + {-0.131380,0.533014}, + {0.451360,0.230248}, + {0.001995,0.153600}, + {1.646787,0.881911}, + {-1.458759,-0.586824}, + {-0.702392,-0.241636}, + {-0.074182,-0.072131}, + {0.262439,0.583482}, + {-0.476122,0.082469}, + {0.438068,0.803544}, + {-0.207061,0.660637}, + {0.567990,-0.597823}, + {-1.688718,-0.103409}, + {-0.829192,0.426556}, + {0.827020,0.826934}, + {0.441454,-0.546262}, + {-0.304897,-0.022233}, + {-0.357555,-0.612953}, + {-0.388052,0.013095}, + {0.777314,0.544567}, + {0.437676,0.305298}, + {-0.356608,-0.848358}, + {0.791083,-0.271240}, + {0.044885,0.107636}, + {0.364655,0.012973}, + {0.538263,-1.124278}, + {0.228271,-1.168910}, + {0.026633,-0.327359}, + {0.464736,-0.077427}, + {-0.438151,-0.387916}, + {0.384472,0.255111}, + {-0.913587,0.151118}, + {0.215311,0.261325}, + {0.133743,1.302663}, + {0.977288,-1.212393}, + {-1.005590,1.135110}, + {-1.031105,-0.046053}, + {0.034069,0.088167}, + {-1.874043,0.314546}, + {-0.138676,-0.665746}, + {-1.367737,0.809027}, + {-0.617917,0.576212}, + {-0.059977,0.148805}, + {1.021231,-1.734845}, + {0.232449,-1.635767}, + {-0.402629,0.093773}, + {0.306316,-0.589913}, + {0.691035,-0.933528}, + {-0.854344,-0.581280}, + {-0.550056,-0.087623}, + {-0.735359,0.440600}, + {-0.599941,-0.566529}, + {-0.157511,0.329776}, + {-0.620057,-0.573574}, + {-0.618399,-0.151361}, + {0.173969,-0.559218}, + {-0.316563,2.332789}, + {-0.512502,-0.263662}, + {0.127996,0.407326}, + {0.888734,-0.229112}, + {0.431876,-0.881928}, + {0.480039,-0.855335}, + {0.548737,0.504779}, + {0.039114,-0.355311}, + {-0.536205,1.175569}, + {-0.006012,-1.440053}, + {-0.366908,-0.714389}, + {-0.253160,-0.482878}, + {0.071598,-0.022415}, + {0.484456,0.242941}, + {0.353405,-0.516339}, + {0.269909,0.018111}, + {-0.512141,0.368190}, + {-0.034358,-0.690191}, + {0.186251,-0.383563}, + {-1.243734,1.020511}, + {-0.310334,-0.639568}, + {-0.238013,1.203421}, + {-0.276677,0.105597}, + {0.528988,0.213357}, + {0.351103,0.004227}, + {0.686052,-0.683489}, + {0.402253,-0.548756}, + {-0.244236,-0.179112}, + {0.039858,0.390838}, + {0.985325,0.842588}, + {0.440814,-0.329205}, + {0.666419,0.644613}, + {0.548497,-0.000859}, + {-0.938426,1.023278}, + {-0.941754,0.721262}, + {0.000099,1.114577}, + {-1.218951,1.191773}, + {-0.607709,0.205343}, + {-0.206425,0.838011}, + {0.699534,-0.002445}, + {1.352826,-0.100402}, + {0.041916,0.740550}, + {0.416504,-0.341657}, + {0.097466,1.186724}, + {0.687240,-0.367369}, + {0.545399,-0.035212}, + {0.374638,0.479261}, + {0.135228,-0.116509}, + {-0.608795,0.777712}, + {0.335622,0.171713}, + {-0.049759,0.394634}, + {0.882455,-0.007277}, + {0.074308,0.777326}, + {0.370312,0.102349}, + {0.376820,0.573884}, + {-0.431049,0.306366}, + {1.085490,0.744110}, + {-0.230620,-0.315921}, + {0.436716,0.557135}, + {-0.702941,0.571264}, + {0.221250,0.066672}, + {-0.570686,-0.286918}, + {-0.560485,-1.471082}, + {-0.314618,-0.584589}, + {-0.311362,0.168867}, + {1.173793,0.106905}, + {-1.017770,-0.355978}, + {-0.228067,-0.524127}, + {-0.163044,-1.799027}, + {-0.126843,-0.121222}, + {-0.360908,-0.655512}, + {1.040580,-1.978968}, + {-0.769183,0.705786}, + {-0.275717,-0.258945}, + {-0.590592,-1.078141}, + {-1.062724,0.958762}, + {0.123248,0.000726}, + {-0.630985,-0.643702}, + {-0.304755,0.333120}, + {-0.354195,-0.773979}, + {-1.222200,-0.340033}, + {-0.500831,-0.495272}, + {0.395941,0.305049}, + {1.926537,-0.064242}, + {0.102387,0.533556}, + {1.094398,0.165614}, + {-1.017921,-1.540784}, + {-0.218494,-0.929660}, + {-0.535317,0.186219}, + {1.199743,-0.241787}, + {0.086699,-0.643872}, + {-0.586069,0.057078}, + {0.457002,-0.144936}, + {0.938976,0.355965}, + {-0.478159,-0.863239}, + {0.123059,0.137369}, + {-0.726764,0.697758}, + {-0.776171,-0.293292}, + {0.532566,-0.658669}, + {0.490077,-0.101454}, + {0.031428,0.291178}, + {-0.667737,0.741288}, + {0.907230,0.233775}, + {0.515349,-0.227823}, + {1.010764,-0.015213}, + {0.444179,-0.562985}, + {-0.276474,0.657198}, + {-0.172263,0.956311}, + {-0.355806,0.703603}, + {-0.506885,-0.799493}, + {-0.697335,-0.297622}, + {-0.012191,1.840314}, + {-0.847463,0.284183}, + {0.854194,0.403219}, + {1.929827,0.528325}, + {-0.261886,0.577017}, + {-0.031070,-2.348125}, + {-0.155820,-0.265157}, + {0.512475,0.208609}, + {-1.450445,-0.816839}, + {0.564060,0.610582}, + {0.208762,0.538423}, + {-0.394083,-0.217364}, + {0.232377,-0.084660}, + {0.344522,0.516178}, + {-1.449901,-0.112290}, + {0.000158,-0.982079}, + {0.787346,1.416797}, + {0.158547,-0.490012}, + {-0.765118,0.416037}, + {0.552854,0.197313}, + {-0.560294,0.168624}, + {-0.710216,-0.278700}, + {-0.022732,0.174521}, + {-0.831227,0.475439}, + {0.219373,-0.678127}, + {-0.002961,-0.573618}, + {-0.945813,0.412736}, + {-0.979897,1.265908}, + {-0.311475,0.379769}, + {-0.082964,0.038846}, + {-0.500868,0.551077}, + {-1.116548,-0.382053}, + {-0.150512,-0.889516}, + {0.003441,-0.441244}, + {-0.155477,0.236868}, + {-0.372866,-0.003664}, + {0.517363,-0.227696}, + {0.348671,-1.184919}, + {0.023715,-0.857359}, + {-1.165542,0.373084}, + {-0.372004,0.745161}, + {1.486675,0.482708}, + {0.713017,-0.111925}, + {0.698459,0.261537}, + {-1.448937,0.151106}, + {-0.936754,0.023684}, + {0.896661,-0.031541}, + {0.360038,0.783076}, + {-0.094289,0.365897}, + {1.270895,0.047391}, + {-0.069325,-0.911174}, + {0.356797,-0.202779}, + {0.966214,-0.501017}, + {-1.056213,-0.334850}, + {-1.048820,1.448814}, + {-1.559907,0.438635}, + {-0.533985,0.378701}, + {1.577709,-0.730175}, + {0.591595,1.416816}, + {-0.192300,-0.219470}, + {0.299344,-0.860943}, + {0.318677,0.121607}, + {0.335483,0.070689}, + {-0.111371,-1.205420}, + {0.395077,0.205784}, + {1.026121,-0.818676}, + {-0.968687,0.857896}, + {0.312721,1.501156}, + {-0.482650,0.352206}, + {0.997697,0.112893}, + {0.950446,-0.398203}, + {0.097713,-1.070921}, + {-0.800673,-0.325717}, + {0.671945,-0.861890}, + {0.021531,-0.436324}, + {0.437880,1.356432}, + {0.457176,-0.276639}, + {-0.247776,0.777048}, + {0.251688,0.079969}, + {-1.334482,-1.474248}, + {-0.483623,0.743976}, + {0.355137,-0.034433}, + {-0.956198,-1.078557}, + {0.405169,1.702393}, + {-0.835610,-0.412153}, + {0.177645,-0.803742}, + {0.190991,-0.126655}, + {-0.293197,0.907349}, + {0.208255,0.226394}, + {-0.590120,-0.320991}, + {-0.477141,-0.954609}, + {0.534067,-0.035251}, + {-0.962419,0.424134}, + {0.409965,-0.074026}, + {-0.110630,-0.862237}, + {0.037791,0.944337}, + {0.944043,-0.704466}, + {-0.648236,0.057918}, + {-0.617177,-0.830966}, + {0.416183,-0.658194}, + {1.180214,0.519521}, + {-0.123865,-0.426364}, + {0.019066,0.317164}, + {0.234837,0.331158}, + {-0.656986,0.335032}, + {0.346063,-1.649529}, + {0.058210,-0.381788}, + {-0.260900,0.186365}, + {0.429371,0.681698}, + {1.939461,-1.181745}, + {-0.445243,-0.716289}, + {0.131740,0.865901}, + {-0.918136,-0.131137}, + {-0.053577,-0.373297}, + {-0.531049,0.031422}, + {-1.254709,0.556524}, + {-1.119247,0.394916}, + {-0.498215,-0.035437}, + {1.322329,0.190493}, + {-0.701283,-1.164440}, + {-0.361131,-0.504716}, + {-0.117174,0.107979}, + {0.700073,1.603625}, + {-0.582119,0.440169}, + {1.018868,-0.420729}, + {-0.212079,-0.280104}, + {1.132422,-0.035123}, + {0.026273,1.886585}, + {-0.729453,0.098911}, + {0.805546,0.750763}, + {0.224181,0.331261}, + {0.116170,0.259857}, + {0.100047,0.046190}, + {-0.055174,0.957446}, + {-1.456418,-1.105336}, + {0.290339,-0.811412}, + {-0.403941,-0.272939}, + {1.707646,0.332927}, + {0.858293,0.006974}, + {-0.476534,0.364698}, + {-0.705168,0.544668}, + {-0.667669,0.289049}, + {1.181489,-0.102266}, + {-0.363524,-0.507603}, + {0.077873,-0.227451}, + {-0.070765,0.236432}, + {0.547170,0.221358}, + {-0.084700,-0.954482}, + {-0.930200,-1.003973}, + {0.641949,1.189144}, + {0.292530,1.376169}, + {0.146329,0.050514}, + {0.504086,0.327294}, + {0.560656,-0.819642}, + {-0.782328,0.555732}, + {-0.321355,0.040423}, + {0.575312,0.676942}, + {0.676739,0.371605}, + {-0.739089,0.154797}, + {-0.196959,0.765774}, + {-0.075477,-0.064618}, + {-0.708957,-0.695153}, + {-0.114007,-0.274311}, + {-0.208777,-0.197655}, + {-0.330289,0.090402}, + {0.645717,-0.861720}, + {0.759627,1.159973}, + {0.736863,0.016140}, + {-0.290055,1.066642}, + {-0.360313,0.572408}, + {0.559798,-0.118348}, + {1.099664,0.913475}, + {-1.221145,0.753011}, + {-1.080846,-0.309538}, + {0.898748,-1.751489}, + {-0.793636,-0.682252}, + {0.601441,0.716634}, + {-0.754166,-0.295275}, + {-0.057178,-0.531244}, + {-0.503737,0.754428}, + {-0.092784,0.415358}, + {-0.428408,0.867882}, + {-0.531645,-0.427532}, + {0.015225,0.360774}, + {0.052039,0.804546}, + {0.140220,0.683936}, + {-0.183837,-0.075742}, + {0.141611,0.121116}, + {0.863189,-0.304942}, + {-0.183500,-1.267097}, + {0.721582,0.324832}, + {0.490362,-0.620402}, + {0.032723,-0.342147}, + {0.015191,0.299803}, + {-0.453198,0.232907}, + {0.890290,-0.037167}, + {1.101406,-0.724242}, + {-1.147539,-0.245951}, + {-1.727078,-1.683502}, + {0.261545,-0.107582}, + {0.068065,0.753220}, + {0.369570,0.796556}, + {0.143988,0.884428}, + {0.009223,-0.259795}, + {-0.207237,1.912655}, + {0.901343,0.446570}, + {1.779646,-0.190026}, + {0.060311,-0.035492}, + {0.471146,-0.987103}, + {-0.678292,-0.087719}, + {-0.381341,0.932014}, + {0.423463,-0.374888}, + {0.132522,-0.133326}, + {0.725087,-0.055467}, + {-0.026041,0.630602}, + {0.237645,-0.147676}, + {0.384787,0.046887}, + {1.184148,-0.971991}, + {0.904135,-1.133769}, + {1.047468,-0.174437}, + {-0.262063,1.567163}, + {-0.323006,0.521236}, + {0.517606,0.341770}, + {-0.289763,-0.525198}, + {1.140138,-0.745015}, + {0.748583,0.650728}, + {-0.040966,0.218449}, + {0.340059,0.915520}, + {0.031779,0.421656}, + {-0.394555,-0.262061}, + {0.204192,-0.199669}, + {-0.222583,0.416622}, + {0.026680,0.648281}, + {0.394312,-0.072898}, + {-0.547009,-0.610642}, + {-0.323403,-0.781335}, + {0.246200,-0.481307}, + {1.250227,-0.203189}, + {1.335570,0.028829}, + {0.907068,-0.322204}, + {-0.241285,0.672412}, + {-0.500388,1.413200}, + {0.348404,0.053563}, + {-0.515993,1.348158}, + {0.419507,0.843740}, + {-1.680552,-0.349667}, + {1.125661,0.162114}, + {-2.253658,-1.822658}, + {-0.603819,-0.131986}, + {-0.688067,-1.520234}, + {0.107885,1.042587}, + {0.794351,0.550783}, + {0.107568,0.622575}, + {0.427502,0.055636}, + {-0.386636,-0.648276}, + {-0.530590,0.233918}, + {-0.069396,-0.648418}, + {0.677155,1.610371}, + {-0.636080,0.824467}, + {1.069180,0.649464}, + {-1.099628,0.652186}, + {1.175325,0.015894}, + {0.519414,-1.197649}, + {-0.613790,-0.781378}, + {-1.117294,0.891372}, + {0.284313,-0.488536}, + {0.142283,1.641906}, + {1.718632,-0.694643}, + {-0.611194,-0.432577}, + {-0.251579,-0.852987}, + {-0.170100,0.486159}, + {0.320121,-0.580628}, + {0.872266,-0.384060}, + {-0.208309,0.139307}, + {-1.583756,-0.645014}, + {-0.702369,-0.541675}, + {0.336241,0.831866}, + {-0.865645,0.436119}, + {-0.620241,-0.606092}, + {-0.104203,0.984638}, + {-0.410559,-0.040961}, + {-0.416490,-0.226391}, + {0.088726,-0.220726}, + {-1.499559,-0.585178}, + {0.293249,0.186455}, + {-1.210379,-0.633716}, + {-0.277191,-1.244025}, + {1.139804,0.055639}, + {-0.228353,0.448129}, + {0.559068,-0.023119}, + {-1.221999,0.465622}, + {1.162107,-0.729434}, + {-0.368202,0.259066}, + {-0.285426,1.295138}, + {0.379646,0.224708}, + {0.294352,-0.551327}, + {-0.462702,0.187464}, + {-0.026366,-1.131739}, + {0.894485,-0.169837}, + {1.029962,-0.513169}, + {-0.308485,-0.846109}, + {0.013267,0.200561}, + {0.442056,0.037734}, + {-1.579953,-0.567456}, + {0.313331,0.287219}, + {0.237625,-1.467799}, + {-0.343068,0.471870}, + {0.808584,-0.605491}, + {-0.384505,0.285999}, + {-0.821182,1.140405}, + {0.083857,0.569015}, + {0.358021,0.251793}, + {-1.050896,0.222264}, + {0.693579,-0.417443}, + {0.488468,0.599156}, + {-0.102947,-1.320533}, + {0.340396,-0.671734}, + {0.618710,-0.219283}, + {-0.125032,-0.163230}, + {-0.088188,-0.534394}, + {0.682064,1.041136}, + {-0.344705,-0.089664}, + {-0.529053,0.255838}, + {-0.136569,-0.214062}, + {1.455681,0.491256}, + {1.238314,-0.436456}, + {0.183785,-0.294781}, + {-1.115245,1.248687}, + {-0.649421,-0.614780}, + {1.178710,-0.312908}, + {0.812326,-0.393600}, + {-0.874232,0.893146}, + {-1.043341,-0.195049}, + {-1.266037,-0.004749}, + {-0.377230,-0.359996}, + {-0.196225,0.796953}, + {0.996897,-0.623582}, + {-0.556859,-0.864103}, + {-1.371972,0.769551}, + {0.056397,-0.658378}, + {-0.074004,0.516830}, + {-0.019248,0.750291}, + {0.172892,-0.524600}, + {-0.598676,-0.007268}, + {0.137861,1.698237}, + {-0.084691,1.344243}, + {0.001925,-0.191394}, + {0.240667,-0.596132}, + {-0.139205,1.502034}, + {0.716061,-1.415551}, + {0.861506,-0.658005}, + {0.514495,0.090184}, + {-0.528631,1.006103}, + {-0.388832,-0.792382}, + {0.735890,0.122394}, + {-1.547132,1.015471}, + {0.121113,-0.501140}, + {0.975384,-1.280454}, + {0.079350,0.996285}, + {0.046097,-1.248331}, + {-0.978137,-0.857029}, + {-0.292484,0.917538}, + {0.476399,-0.533662}, + {-0.185424,0.410061}, + {-0.516918,0.560953}, + {-1.108884,0.242701}, + {0.393610,-1.112134}, + {-0.342411,0.026459}, + {0.960001,-0.039799}, + {0.292966,-0.871399}, + {0.509531,0.068985}, + {0.306125,0.182601}, + {0.684688,0.611943}, + {0.366705,-1.300976}, + {-0.161117,0.460565}, + {0.919045,0.162937}, + {-0.600136,0.528728}, + {0.807988,-0.082820}, + {0.723075,-1.101493}, + {0.408624,0.497548}, + {0.592179,-0.511883}, + {-0.624763,0.320432}, + {0.702432,0.047555}, + {-0.826321,0.702721}, + {-0.590704,0.927206}, + {-1.222225,0.520187}, + {0.057220,-0.355501}, + {-0.346697,0.327871}, + {-0.389801,-1.554275}, + {0.700315,-0.895953}, + {0.367463,0.307326}, + {-0.364395,-1.611608}, + {-0.506932,0.889372}, + {-0.243596,0.575283}, + {-0.802028,0.056860}, + {-0.171424,0.239689}, + {0.169908,-0.522395}, + {0.213199,-0.701460}, + {0.552262,0.906828}, + {-1.016062,0.643300}, + {0.298917,-0.477633}, + {0.354035,0.004910}, + {-0.091019,0.375327}, + {-0.237197,0.523797}, + {-0.445213,0.236868}, + {0.184486,0.210037}, + {-0.200655,-0.532764}, + {-0.165018,0.252682}, + {0.301383,-0.470096}, + {0.733004,-0.519851}, + {-0.340900,0.559258}, + {-0.003634,0.397142}, + {-0.158002,-0.601995}, + {1.029616,-0.712344}, + {-0.272084,1.292895}, + {-0.245181,0.153895}, + {1.537927,0.233934}, + {-0.194398,-0.207617}, + {-0.037529,-0.362480}, + {-1.439610,-0.069318}, + {-0.527334,-0.847175}, + {0.888073,1.120245}, + {0.759059,-1.709285}, + {-0.038818,-0.451563}, + {-1.569456,0.059742}, + {-1.135825,1.105116}, + {0.860456,-0.054651}, + {0.791421,0.583433}, + {0.300375,0.733727}, + {0.740330,0.173272}, + {0.720677,-0.006213}, + {0.211773,0.171237}, + {1.239301,0.513578}, + {-0.038229,-1.319419}, + {-1.110608,0.623842}, + {-1.199877,2.009182}, + {0.110201,1.359225}, + {-0.521048,1.259603}, + {-0.779884,0.080694}, + {0.922866,1.378522}, + {-0.036678,-0.256378}, + {0.630587,0.356473}, + {-0.818911,0.348724}, + {-0.823156,-0.403827}, + {-0.305461,-0.183285}, + {0.545495,-0.917827}, + {-0.307489,0.278087}, + {0.576430,0.263072}, + {-0.110932,0.343314}, + {-0.730010,0.924897}, + {0.492041,0.775198}, + {0.461854,0.423507}, + {0.427495,1.700151}, + {0.432533,0.301152}, + {-0.593518,1.393076}, + {-0.389399,-0.733757}, + {-1.049504,0.301791}, + {0.546392,0.734537}, + {0.338524,0.116400}, + {-0.597570,-1.925078}, + {0.322346,1.008118}, + {0.513935,-0.042958}, + {-0.518049,0.101353}, + {1.352677,-0.293425}, + {0.240988,-1.041734}, + {-0.691185,-1.063328}, + {0.130569,1.016253}, + {-0.586304,-0.555797}, + {0.462853,-0.235079}, + {0.079994,-0.355770}, + {0.153572,0.147783}, + {-0.596490,-0.795026}, + {0.326538,-0.790256}, + {-1.460756,-0.251033}, + {0.017858,0.259083}, + {0.507881,-1.054094}, + {0.266351,0.627879}, + {-0.752761,-0.513762}, + {-0.627282,0.008649}, + {-0.886446,0.842860}, + {-0.463043,-0.469626}, + {0.096623,0.933024}, + {-0.286410,0.744126}, + {-0.542282,1.126897}, + {-0.313235,0.205528}, + {-1.320519,0.277179}, + {0.071715,0.147248}, + {-0.903511,-0.083047}, + {0.656132,-1.350683}, + {-0.207632,-0.039248}, + {0.117073,-0.120780}, + {-1.332364,0.590990}, + {-0.380298,-0.400794}, + {-0.366577,0.174013}, + {0.485112,-0.117400}, + {0.372690,-0.023396}, + {-0.909507,-0.293390}, + {1.037746,0.057621}, + {0.939461,-1.025088}, + {1.893673,-0.611078}, + {0.078827,-0.951650}, + {-0.839030,0.090466}, + {-1.104840,-1.126416}, + {0.590214,0.068381}, + {1.100851,0.573205}, + {-0.393116,-0.875980}, + {-0.254150,-0.405253}, + {-0.278855,1.000683}, + {0.921864,0.463923}, + {-0.041988,-0.112156}, + {0.155288,-0.019315}, + {0.099627,0.916635}, + {-0.622412,-0.503004}, + {-0.262853,0.533022}, + {-2.349103,-0.232631}, + {-0.387689,-0.672924}, + {-0.981208,0.386278}, + {0.021049,-0.336082}, + {0.385965,1.431628}, + {0.084666,-0.022362}, + {1.501095,-0.445381}, + {-0.174828,0.029946}, + {-0.075096,-0.754793}, + {0.440599,-0.624117}, + {-0.191469,-0.122779}, + {-0.619664,0.048316}, + {0.681431,-1.113935}, + {0.392264,-0.416262}, + {-1.025569,0.426959}, + {0.231863,1.526328}, + {-0.235847,0.767781}, + {-0.081400,-1.937839}, + {-0.142145,0.413403}, + {-0.578059,-0.410749}, + {0.886248,-1.144489}, + {-0.584558,-0.717462}, + {0.337355,-0.804375}, + {-0.070221,0.776269}, + {-0.020066,0.015296}, + {-0.731855,1.217179}, + {0.430529,-0.118092}, + {0.121456,2.210222}, + {0.825156,-1.563617}, + {-0.365542,-0.034897}, + {0.238998,0.603491}, + {-0.488885,-0.418294}, + {0.519796,-1.412865}, + {-1.114191,-0.510320}, + {-0.752598,0.541650}, + {0.380631,-0.713726}, + {0.023115,1.015882}, + {-0.198359,0.433732}, + {0.103927,0.017306}, + {-0.039809,0.223707}, + {1.711996,0.402454}, + {-0.056678,0.174339}, + {-1.687713,-0.160125}, + {0.696416,-0.493909}, + {-0.873410,0.257890}, + {0.319853,0.072947}, + {-0.368300,0.341422}, + {-0.482285,0.930112}, + {-0.004708,0.893093}, + {-0.051559,0.713417}, + {1.244796,1.336726}, + {-0.104941,-0.449322}, + {0.655462,0.706759}, + {-0.239773,1.696788}, + {-0.324650,0.398949}, + {0.624589,0.044072}, + {0.357952,0.443955}, + {0.749903,1.159453}, + {-1.563112,-0.838062}, + {-0.617714,-0.025810}, + {1.450510,-0.020522}, + {0.225253,-1.483181}, + {-0.666102,-0.989824}, + {0.463322,0.622948}, + {-0.252765,-0.493345}, + {-0.030605,0.132428}, + {-0.104919,-1.328013}, + {0.512898,-0.265843}, + {0.641341,0.344586}, + {0.586485,-0.656758}, + {-0.869639,-1.444607}, + {-0.283470,-0.175611}, + {-0.403954,-0.687469}, + {0.222511,-0.720233}, + {-1.268683,-0.981553}, + {-0.379982,-0.435577}, + {1.266867,0.349347}, + {0.164557,-1.057785}, + {0.093567,0.955540}, + {-0.141307,-0.705522}, + {0.371905,0.120573}, + {-0.389172,-0.765473}, + {0.917816,-0.237643}, + {1.004090,0.178844}, + {-0.629418,-0.412242}, + {-0.210337,0.560592}, + {-0.318360,1.059381}, + {0.583389,-1.323808}, + {-0.817288,0.993688}, + {-0.878170,-1.153520}, + {0.368115,0.337455}, + {0.031655,0.110590}, + {0.265206,0.204946}, + {0.088893,0.170791}, + {-0.177558,2.292458}, + {0.141059,-0.985035}, + {-0.660856,-0.980383}, + {-0.609849,0.985874}, + {-0.214610,0.730502}, + {-0.616156,-0.316919}, + {0.694992,-0.768053}, + {-0.325122,-1.054053}, + {1.217558,-0.854166}, + {0.854051,-0.005104}, + {1.209427,-0.241328}, + {0.324556,0.132322}, + {-0.343527,0.053413}, + {0.224351,0.479553}, + {0.421346,-0.521788}, + {0.118883,-0.218365}, + {0.188380,-0.456052}, + {-0.349273,-0.770785}, + {0.219073,0.003962}, + {-0.296130,-0.656501}, + {0.636082,0.026015}, + {-0.625080,0.346952}, + {0.929759,0.857013}, + {0.187340,0.484039}, + {0.007584,-0.624158}, + {0.309799,-2.221435}, + {0.640643,1.329439}, + {0.226335,-0.805996}, + {0.822625,1.060992}, + {-0.470881,-1.000766}, + {0.425072,-0.397100}, + {-0.223623,0.531114}, + {0.292353,-0.088059}, + {0.366968,0.358980}, + {-0.753461,-0.700875}, + {0.249173,0.177231}, + {0.182607,-0.592219}, + {-0.058347,0.078718}, + {0.183978,-0.226199}, + {0.648659,-0.221680}, + {-0.656861,-0.408497}, + {0.798399,0.044049}, + {-1.154125,-0.803622}, + {0.008225,-0.136806}, + {0.676763,-0.316637}, + {-0.376109,0.251771}, + {-1.331292,1.241033}, + {0.190767,0.475373}, + {0.578552,1.172062}, + {0.505876,-0.233129}, + {-0.361797,-0.297199}, + {-0.097264,-0.225741}, + {-0.050572,-0.001436}, + {-0.454120,-0.192442}, + {1.120225,-0.898933}, + {-0.216917,0.333024}, + {0.110060,0.750588}, + {0.760030,0.575150}, + {0.975368,0.487183}, + {-0.416180,1.692559}, + {0.804607,-0.335317}, + {-0.669472,0.243862}, + {1.112954,-0.010765}, + {-0.312142,-0.937224}, + {-0.567689,-0.263702}, + {0.041868,0.572080}, + {1.804127,-0.566619}, + {-0.521481,1.063847}, + {1.819315,0.382287}, + {0.380872,-0.611233}, + {0.296314,-0.222157}, + {1.498113,0.879454}, + {1.518674,0.605166}, + {0.019620,-0.040801}, + {1.102724,0.266670}, + {-0.684836,-0.568236}, + {0.519185,-0.779516}, + {-0.226690,-0.818393}, + {0.394623,-1.286799}, + {0.900695,0.487765}, + {-0.799478,-0.400191}, + {-0.830514,-0.562055}, + {0.951365,-0.076491}, + {-0.152298,-1.042769}, + {0.069064,-1.023238}, + {0.053427,-1.985536}, + {-0.686719,0.206313}, + {-0.872301,0.294649}, + {-0.624577,-0.387285}, + {-0.050756,0.173358}, + {-0.721308,0.536205}, + {0.598027,-1.956268}, + {1.243462,-0.102223}, + {0.272178,0.642981}, + {0.490204,-1.332468}, + {-0.459636,1.005367}, + {-0.186912,-0.782287}, + {-0.912943,-0.294037}, + {1.394333,0.134047}, + {-0.104225,0.280412}, + {0.396206,-0.652859}, + {-1.350593,0.267762}, + {-0.192340,0.249925}, + {-0.294556,0.392405}, + {-0.585629,-0.706280}, + {0.416039,-0.105205}, + {0.230197,-0.642631}, + {-0.788622,-0.801780}, + {0.641724,0.143368}, + {0.868609,0.721575}, + {-0.648315,-0.221029}, + {-0.759865,-0.581518}, + {0.050452,-0.421412}, + {0.554405,-0.621567}, + {-0.620533,-0.351417}, + {-0.708260,0.277084}, + {-0.663141,0.789494}, + {0.544607,-0.890151}, + {0.915475,0.208660}, + {-0.089024,-1.629471}, + {0.122487,0.665973}, + {0.778714,-0.473087}, + {0.436424,-0.053708}, + {-0.962989,0.178894}, + {-0.093878,-1.372909}, + {-1.334592,-0.532912}, + {0.914235,-1.047946}, + {0.468339,0.302520}, + {0.144360,0.390533}, + {-0.851259,0.971010}, + {-0.701207,0.150590}, + {0.338131,-0.762748}, + {1.102405,-0.101683}, + {0.187218,1.112117}, + {0.825270,-0.520667}, + {0.520354,0.359599}, + {-0.541755,0.243781}, + {-0.025789,-0.276606}, + {0.663983,-0.217932}, + {-0.424530,0.937543}, + {0.087080,-0.695290}, + {0.125273,-0.056948}, + {-0.574391,0.829597}, + {0.707433,-0.081680}, + {1.053279,0.587411}, + {1.371934,-0.232203}, + {1.377562,-0.181817}, + {0.301180,1.214186}, + {-1.259045,-0.768218}, + {-0.106634,0.320428}, + {0.638354,0.147326}, + {1.035767,1.246632}, + {-0.484057,-0.778008}, + {-0.568900,0.810352}, + {1.343526,-0.565878}, + {-0.078860,0.468044}, + {-0.241550,-0.951938}, + {0.207429,-0.254585}, + {0.447816,-0.015839}, + {0.302137,0.164948}, + {0.563014,0.769551}, + {-1.148579,0.887160}, + {-0.083611,0.680195}, + {0.369397,0.512873}, + {0.381627,1.395393}, + {0.681791,0.515388}, + {-0.542576,-1.534588}, + {1.918437,0.611528}, + {-0.522244,1.209917}, + {-0.093985,-0.455651}, + {-0.107796,0.859061}, + {-1.018800,0.051540}, + {-0.539498,-0.754561}, + {-0.015481,-1.049091}, + {0.407858,0.681992}, + {1.168251,-0.815391}, + {0.280607,-0.068227}, + {-0.528591,0.091963}, + {-1.073499,-0.577745}, + {0.395243,-0.629384}, + {1.095985,-0.516588}, + {-0.136250,-0.015595}, + {-0.696164,0.819270}, + {-0.192516,-0.906690}, + {1.066016,0.386976}, + {0.084233,-0.420819}, + {0.691169,-0.036671}, + {0.304274,-0.143800}, + {0.174184,1.080694}, + {-0.812545,-0.113297}, + {0.498295,-0.183696}, + {1.482711,0.261931}, + {-1.195411,-0.365014}, + {-1.007641,-1.211093}, + {0.180812,-0.582404}, + {-0.600608,0.360349}, + {-0.795459,-0.612485}, + {-0.498403,-0.770827}, + {0.179341,0.252923}, + {0.078219,-0.134409}, + {0.029020,0.530232}, + {-1.082486,-0.964627}, + {0.475449,0.228865}, + {0.945295,-0.971173}, + {-0.376007,-0.822730}, + {-0.048402,-0.952172}, + {0.442908,0.788001}, + {-0.523677,0.317709}, + {0.249828,-0.866534}, + {0.288825,-0.711717}, + {0.749714,1.240367}, + {0.231159,-0.142686}, + {-0.672808,-0.212280}, + {-0.205479,0.294669}, + {-0.867840,1.497664}, + {0.602268,0.171039}, + {-0.439475,-0.397819}, + {0.056233,1.305299}, + {-0.202537,-1.087085}, + {0.879143,0.645517}, + {-0.098655,0.549591}, + {-0.079826,0.092852}, + {0.787565,-0.587819}, + {0.844504,0.083068}, + {-0.316615,-0.486807}, + {0.318470,-0.589745}, + {-0.323499,0.031700}, + {0.794815,1.192794}, + {-1.434705,-0.743418}, + {0.194635,0.496011}, + {-0.068369,1.097164}, + {0.055882,-0.610884}, + {-0.944299,-0.941208}, + {-0.498806,0.156640}, + {0.208447,-0.528226}, + {0.956777,-0.354452}, + {-0.879130,-1.356783}, + {-0.605954,1.495664}, + {-0.025056,0.107553}, + {0.610923,0.435619}, + {-1.008064,0.239170}, + {-0.137944,-0.395381}, + {-0.531626,0.570013}, + {0.039088,-0.074388}, + {-0.602167,-0.940069}, + {0.520930,0.839237}, + {-1.547177,0.015998}, + {0.439233,0.453052}, + {-0.029776,-0.125403}, + {-0.345532,0.150671}, + {0.283820,-0.311247}, + {0.691268,0.439948}, + {-0.297298,0.571417}, + {-0.664505,-0.174490}, + {1.265258,0.472942}, + {0.049889,0.244857}, + {-0.095322,0.754115}, + {-0.029737,-0.356600}, + {0.146569,-1.294022}, + {-0.295789,0.369970}, + {0.200032,-0.482899}, + {0.781168,1.247152}, + {-0.245575,0.442512}, + {-1.080089,-1.224498}, + {0.347986,-0.310894}, + {1.813778,-0.546107}, + {0.347830,1.098305}, + {1.139714,0.083681}, + {0.613995,-0.064648}, + {0.627980,-1.185934}, + {-0.088940,-0.247523}, + {0.293299,0.282612}, + {0.145607,-0.363898}, + {0.682261,0.069479}, + {-0.062785,-0.107404}, + {-0.404708,0.102763}, + {-0.237587,0.193964}, + {0.971118,1.637474}, + {-0.449309,0.565929}, + {1.795769,0.373496}, + {-0.873712,0.616632}, + {-0.196513,-0.640404}, + {-0.186019,-0.672891}, + {0.405301,-0.523678}, + {-1.000323,1.087868}, + {-0.748565,0.346213}, + {-0.533750,0.023908}, + {-0.576248,0.401431}, + {-0.892996,0.627997}, + {-0.467071,1.447969}, + {-0.139768,-1.028884}, + {0.278656,0.126379}, + {-0.238544,0.542289}, + {-0.270467,-1.010170}, + {-0.228088,0.216426}, + {1.142972,-0.627060}, + {1.031965,-0.434600}, + {0.340546,-0.237191}, + {-0.136616,0.924569}, + {-0.852451,0.409948}, + {-0.030960,0.003293}, + {0.751540,-0.478669}, + {0.454761,-0.433887}, + {-1.611252,0.302680}, + {0.003690,-0.193511}, + {-0.883646,-0.472813}, + {-0.217567,0.614904}, + {-0.060909,-0.291651}, + {0.348777,0.769840}, + {-0.205364,-0.945972}, + {0.100935,-1.105324}, + {-0.730546,1.197917}, + {0.037881,-1.364004}, + {-0.790273,-0.500485}, + {1.019594,1.405192}, + {0.553383,-0.760307}, + {0.079813,1.242097}, + {0.724602,0.322399}, + {0.691650,-0.277596}, + {-0.999711,0.814944}, + {-0.103090,0.702437}, + {-0.245544,-0.599467}, + {-0.194306,1.677402}, + {0.436362,1.246626}, + {0.206087,-0.136172}, + {1.747782,0.584106}, + {0.406945,0.500722}, + {0.401018,0.061251}, + {-0.485579,-0.126287}, + {0.102872,0.074572}, + {0.526394,-0.130306}, + {-0.997377,0.317494}, + {0.651321,-0.412428}, + {-1.160759,-1.663891}, + {-1.106270,0.202325}, + {-0.698919,0.195317}, + {0.486878,0.717703}, + {-0.998619,0.718843}, + {0.006452,0.669891}, + {1.418430,-0.380581}, + {-0.079725,0.248431}, + {0.034193,-0.516827}, + {0.087614,-0.200013}, + {-0.608534,-0.918271}, + {-0.096351,-0.320469}, + {-0.803814,-0.983979}, + {-0.563381,0.035484}, + {0.725737,0.753731}, + {0.945344,-0.412933}, + {1.252002,0.158636}, + {-0.615195,-0.442558}, + {-0.181433,-0.153078}, + {-0.131831,0.255303}, + {0.028794,0.045431}, + {-0.901468,-0.112194}, + {-0.240013,0.332503}, + {0.725427,1.028639}, + {-0.832698,-1.074637}, + {-0.087355,2.052221}, + {-1.695433,1.195954}, + {0.348765,0.618883}, + {-1.261736,0.226435}, + {-1.036571,1.108908}, + {-0.631858,0.969470}, + {-0.383927,0.513694}, + {-1.065415,0.305332}, + {-0.770717,-0.211612}, + {-0.042169,-0.577398}, + {0.778070,0.164015}, + {-0.308740,0.253317}, + {0.673013,0.384047}, + {-0.663271,-1.645542}, + {-0.594806,-0.266981}, + {0.031422,0.017209}, + {0.372819,0.179241}, + {-0.451831,-1.222927}, + {-1.473253,-1.466359}, + {-0.021394,1.299407}, + {0.517073,1.048515}, + {-0.492487,0.319604}, + {0.045902,-0.369191}, + {0.761630,-0.646184}, + {-1.143760,-0.877989}, + {-1.207937,0.402411}, + {0.647822,-0.684881}, + {1.561865,-0.520949}, + {0.034907,0.267810}, + {-0.060274,-1.422451}, + {-0.739349,0.707542}, + {-0.536740,-0.575886}, + {-0.052684,-0.290248}, + {-0.123131,-0.743400}, + {-0.514004,0.128876}, + {-0.865755,0.825335}, + {-1.093714,-1.041393}, + {1.399303,-0.474390}, + {-1.593978,-0.302014}, + {-0.647736,0.276940}, + {-1.921976,-1.024671}, + {-0.330629,-1.292647}, + {-0.758354,0.195156}, + {0.469699,0.035348}, + {-0.091111,0.143719}, + {-0.451077,0.345265}, + {0.206307,-1.201955}, + {-0.710390,1.963236}, + {0.375559,-0.576808}, + {0.149091,-1.086740}, + {-0.449572,0.325384}, + {-0.192764,0.050606}, + {0.421631,-0.018053}, + {1.221822,0.036003}, + {0.377659,0.155503}, + {0.659024,-0.972623}, + {0.028611,1.195320}, + {0.766597,1.851492}, + {-0.080947,-0.311238}, + {-0.546674,0.601715}, + {0.100401,-0.217646}, + {0.545637,0.168297}, + {-1.346635,-0.631837}, + {-0.682666,0.621478}, + {0.045733,-0.349107}, + {-1.244812,-0.204358}, + {-0.422721,0.108213}, + {0.079947,-0.097146}, + {-0.020068,0.559199}, + {0.297205,0.513111}, + {0.941640,0.417691}, + {-0.925712,-0.314921}, + {-0.315827,1.287305}, + {0.529011,0.755734}, + {-1.309677,0.875144}, + {-0.230303,0.267374}, + {0.868997,0.302759}, + {-0.111540,0.065648}, + {-0.142909,0.138899}, + {-0.578420,-1.061350}, + {0.245031,0.319639}, + {1.260454,-0.384548}, + {0.982616,0.576288}, + {0.159346,0.750479}, + {-0.087783,1.089588}, + {0.196171,-0.771344}, + {-0.607085,0.048410}, + {-0.068539,-0.651095}, + {0.361776,-0.899946}, + {0.513233,-0.276754}, + {-0.815696,0.184741}, + {0.595970,0.094903}, + {0.115271,-0.496266}, + {1.233400,-0.604420}, + {-1.610600,0.068291}, + {1.685176,-0.540653}, + {1.331054,-0.306383}, + {0.474553,-0.181542}, + {-0.349692,-1.046318}, + {0.466882,0.552974}, + {0.671398,0.059918}, + {1.220610,-0.655965}, + {-1.017139,0.324829}, + {-0.405089,-0.133175}, + {-1.230806,-0.614727}, + {0.053516,0.105043}, + {0.263139,-0.629699}, + {0.284898,-0.362198}, + {-0.210472,0.588927}, + {0.430466,0.051079}, + {0.114497,0.987658}, + {-1.348501,0.053213}, + {-0.087962,0.937382}, + {-0.583326,-0.560167}, + {0.925946,0.254656}, + {-0.883881,-1.030357}, + {-0.800863,0.810453}, + {1.625943,-1.280755}, + {0.323764,-0.336854}, + {0.797648,0.589424}, + {-0.219584,0.872309}, + {0.640241,0.052660}, + {0.266435,-0.575933}, + {0.010578,0.226011}, + {0.416890,0.200529}, + {1.452786,-0.051537}, + {-0.310855,0.121700}, + {-0.632248,-0.915323}, + {0.030787,-0.673870}, + {-1.049494,0.197745}, + {0.047091,-1.145422}, + {0.711093,0.945179}, + {-0.242047,0.140575}, + {0.340217,0.852112}, + {0.630934,1.603793}, + {-0.212128,0.191145}, + {-1.331703,-0.244984}, + {0.474762,-1.272654}, + {-0.064322,0.887641}, + {-0.772426,-0.137183}, + {-0.476909,-0.765121}, + {-0.921167,0.515822}, + {0.706203,-0.726292}, + {-1.297285,1.234220}, + {0.251867,0.516994}, + {0.152440,0.693035}, + {0.355725,-0.222082}, + {0.070784,-0.573142}, + {-0.472779,0.405148}, + {-0.387195,0.495100}, + {0.353239,1.388869}, + {0.436446,0.846312}, + {0.117673,0.291440}, + {0.038314,0.003910}, + {0.832524,0.297668}, + {-0.067787,-0.787236}, + {0.308990,-1.201882}, + {-0.716303,0.682363}, + {-1.541222,0.779205}, + {-0.399833,0.182525}, + {-1.489015,0.201933}, + {-1.085351,-0.414808}, + {-0.593430,-0.460045}, + {-0.136958,0.225884}, + {0.839454,0.132045}, + {0.512016,0.539074}, + {1.021031,-0.818081}, + {-2.082684,-0.974775}, + {1.078381,-0.424613}, + {-0.215449,-1.070854}, + {-0.267500,-0.045646}, + {-0.097457,-0.787663}, + {-1.127850,-0.129833}, + {0.261141,0.361222}, + {-0.047321,-0.078316}, + {-0.213066,-0.934763}, + {-0.693972,0.416171}, + {0.734195,0.443239}, + {-0.761988,1.089263}, + {0.254715,0.226029}, + {0.302206,0.304181}, + {-0.588604,-0.955464}, + {-0.724068,0.962523}, + {1.030788,1.094885}, + {-1.634408,0.959742}, + {-0.343578,0.529590}, + {-0.913576,0.062114}, + {-0.029438,0.785613}, + {-0.978121,-1.357258}, + {0.393594,-0.252471}, + {-0.547676,0.105908}, + {0.540394,-0.607045}, + {0.769064,-0.118855}, + {-0.655730,0.653167}, + {0.624079,0.821763}, + {0.289239,-0.019449}, + {0.171656,-0.435785}, + {1.322478,0.011860}, + {-2.093062,1.275452}, + {-0.213217,0.410659}, + {-0.922502,0.014639}, + {1.481723,-0.168258}, + {-1.494468,-0.526159}, + {0.212115,-0.653763}, + {0.247302,0.440803}, + {-0.227827,-0.164564}, + {-0.730551,0.626705}, + {0.955221,-0.640437}, + {0.083621,-0.495753}, + {0.010779,0.268628}, + {-0.517990,0.518614}, + {-0.127293,0.121118}, + {-1.391215,0.845785}, + {0.376562,0.013170}, + {-0.023148,0.651098}, + {-0.545330,1.030364}, + {0.423751,-1.034899}, + {0.064578,0.069449}, + {0.727233,-0.170816}, + {-0.262943,-0.128789}, + {-0.200262,0.310986}, + {0.252975,0.424229}, + {-0.907615,-0.073997}, + {-0.543862,-0.735072}, + {-0.813343,-0.173314}, + {-1.201885,1.528061}, + {0.656099,0.166095}, + {-1.168671,0.209173}, + {0.835893,0.449546}, + {0.058003,-0.443218}, + {-0.940742,0.333260}, + {0.685444,1.349441}, + {-0.070850,0.383320}, + {-0.784000,0.412765}, + {0.972754,0.248983}, + {-0.611710,0.795272}, + {0.740168,-0.382664}, + {-0.595800,1.134890}, + {-0.291688,-0.192899}, + {-0.324666,1.139416}, + {-0.026190,0.014553}, + {-0.797475,0.108035}, + {0.257394,-0.383343}, + {0.936633,-2.076909}, + {-0.164027,0.563305}, + {-0.029333,-1.077666}, + {-0.776752,0.687745}, + {-0.361438,-1.434606}, + {0.159147,0.129632}, + {0.742079,-0.379723}, + {-0.325943,-0.534641}, + {0.421914,0.776426}, + {-1.185213,1.207085}, + {-0.812063,-0.427344}, + {-1.734549,-0.468229}, + {-0.532631,-0.196973}, + {-1.124256,-0.783135}, + {0.002816,-0.609461}, + {0.497856,-0.858671}, + {0.297182,-0.995354}, + {-0.009002,-0.094468}, + {-0.841901,0.478523}, + {-0.357151,-0.724320}, + {0.684269,-0.106986}, + {-0.875832,0.368872}, + {-0.451512,1.155647}, + {0.007695,0.984606}, + {-0.245539,-0.586946}, + {-0.438202,0.003614}, + {0.272786,0.270776}, + {0.645523,0.541562}, + {-0.237560,-0.637564}, + {-0.848358,-0.612336}, + {-0.277362,-0.783485}, + {0.481862,-0.045225}, + {0.276958,0.039033}, + {-0.226987,1.330472}, + {1.139474,0.298630}, + {-0.452719,0.688238}, + {0.575993,-1.073807}, + {-0.877879,-0.474368}, + {1.162578,-0.352652}, + {-0.616572,-0.422459}, + {-0.353035,1.347897}, + {-1.158601,-0.646731}, + {0.451272,0.588822}, + {-0.141924,0.363633}, + {0.527233,-0.473859}, + {-0.363216,-0.892939}, + {-1.340083,-0.111274}, + {-0.603631,-0.270979}, + {-0.188457,0.012816}, + {-0.811343,1.252060}, + {1.188571,-0.831308}, + {-1.041929,-0.096941}, + {0.712698,0.394449}, + {-0.553583,0.946137}, + {-1.219442,-0.169581}, + {0.864311,-0.554224}, + {-0.262955,1.220312}, + {-0.576259,0.887034}, + {1.004077,0.461673}, + {-1.593715,0.659881}, + {0.531584,0.228323}, + {-0.240945,0.486940}, + {0.922614,-0.455564}, + {0.275567,0.685332}, + {-0.420722,1.269918}, + {0.430470,0.686037}, + {0.034631,-0.235561}, + {-0.314039,-0.525507}, + {0.272926,1.024054}, + {-0.597859,-0.371195}, + {0.369351,0.638611}, + {-0.203028,1.337666}, + {0.939544,0.549966}, + {0.478238,-0.275508}, + {-0.155890,0.618782}, + {0.065502,1.306056}, + {-0.144435,-1.053199}, + {0.675192,-1.042800}, + {0.887757,0.799049}, + {1.032078,-0.335687}, + {-0.416585,-0.671976}, + {-0.277219,0.392748}, + {-1.373308,0.145767}, + {-1.898957,0.258620}, + {-1.507777,-0.799117}, + {0.125190,-1.513681}, + {-0.555275,-1.147338}, + {0.109193,0.630449}, + {0.850572,-0.428761}, + {0.762598,-0.418743}, + {-0.658676,0.120374}, + {0.219889,0.679444}, + {0.960891,0.748391}, + {0.870463,0.591815}, + {1.008497,0.258433}, + {-0.397245,0.229091}, + {0.079530,-0.765548}, + {-1.189197,0.391146}, + {1.090130,-0.176457}, + {0.878735,-1.220042}, + {-0.282687,0.045037}, + {0.690295,0.760265}, + {-0.064226,-1.270045}, + {0.451127,0.620894}, + {0.518653,-0.291379}, + {1.427926,0.763723}, + {0.013799,-0.112367}, + {-0.284511,0.556617}, + {0.023375,-1.498134}, + {0.527409,0.837385}, + {-0.337269,0.119037}, + {0.397375,1.457268}, + {-0.915267,1.637006}, + {0.189049,0.517475}, + {0.118637,1.005364}, + {0.396135,-1.604041}, + {-0.089106,-0.609048}, + {-0.028093,0.096681}, + {0.978246,-0.222336}, + {0.078209,0.502843}, + {0.317957,-0.209239}, + {-0.235391,-1.067509}, + {0.672564,-0.630147}, + {0.573721,0.505773}, + {-0.211566,0.007962}, + {0.493715,-1.029766}, + {0.610607,-0.973276}, + {-0.204172,-0.197208}, + {1.323638,-0.298948}, + {-1.036127,-1.456968}, + {-0.650336,-0.262731}, + {-0.324206,-0.556171}, + {0.184158,-0.349058}, + {0.439262,0.058320}, + {-1.534475,0.227140}, + {-0.631174,1.780843}, + {-0.755815,-0.501755}, + {0.146835,-0.731846}, + {0.859454,0.963689}, + {0.800582,-0.146938}, + {1.372001,0.638182}, + {-0.919889,-0.622212}, + {0.681129,-0.602858}, + {0.172753,1.274081}, + {-0.669045,-0.735854}, + {1.072433,-0.430603}, + {-0.945714,0.249387}, + {0.058404,-0.356905}, + {0.280842,1.395081}, + {-1.333727,0.175503}, + {-0.162653,0.997135}, + {1.349928,-0.778412}, + {0.351735,-0.432853}, + {0.130525,-0.679365}, + {-0.255894,0.000290}, + {-0.033975,0.753936}, + {0.880727,0.592943}, + {-0.432137,-1.241763}, + {-0.916417,0.629270}, + {-0.417353,0.281667}, + {1.027431,-0.561347}, + {-0.313624,-0.862803}, + {0.688305,-1.114407}, + {0.407758,0.350545}, + {-0.084867,-0.097319}, + {0.659983,0.568765}, + {-0.226611,0.133226}, + {-0.215283,-0.443496}, + {0.718936,-0.037813}, + {0.933978,-0.233086}, + {-0.516582,0.734210}, + {0.736643,0.706611}, + {0.305234,0.000249}, + {-0.370270,0.590320}, + {0.962118,-0.925841}, + {-1.048981,-0.103269}, + {0.044995,0.871437}, + {0.797065,-0.797195}, + {0.012374,1.464487}, + {-0.744670,-0.902590}, + {-0.975379,0.299666}, + {-0.751756,-0.171825}, + {-0.478057,1.113745}, + {-0.351503,0.127088}, + {0.589924,-0.913712}, + {1.035181,-0.319182}, + {-0.226216,-0.426067}, + {0.740355,0.631193}, + {-0.506299,-2.521827}, + {-0.734618,-0.279302}, + {-0.793006,0.934782}, + {0.400248,0.019342}, + {-0.460130,0.039696}, + {-1.182922,-0.759926}, + {-0.322657,0.433662}, + {1.295318,0.089107}, + {0.776325,-0.202020}, + {-1.354920,-0.019325}, + {-0.070378,-0.628537}, + {-0.313186,-0.122804}, + {0.679820,-0.407435}, + {0.568100,-0.865077}, + {-0.270622,-0.118376}, + {-0.120073,1.163957}, + {-2.521375,-0.093829}, + {0.242298,-0.793270}, + {0.110432,1.286578}, + {0.589488,0.684460}, + {-0.130721,-0.833847}, + {-1.196174,0.719174}, + {1.558364,-0.705261}, + {0.040922,0.325140}, + {-0.591884,0.749348}, + {-0.121397,0.219684}, + {0.378761,-0.899270}, + {-0.292474,-0.083947}, + {-0.868838,-1.003608}, + {0.229984,-1.746968}, + {-0.653827,-0.413638}, + {-0.724029,0.485097}, + {0.014806,1.481808}, + {-0.493384,-0.210216}, + {0.722527,-0.225007}, + {1.054819,1.601291}, + {-0.282008,-0.282742}, + {-0.866851,0.072647}, + {-1.735218,-0.205276}, + {-0.689724,-0.951328}, + {0.216225,0.177342}, + {-0.124588,-0.162394}, + {0.489274,-0.190430}, + {-0.057484,-0.451252}, + {-0.838170,0.008589}, + {-0.012782,1.507933}, + {-0.471353,0.394553}, + {-0.190237,0.685665}, + {0.557875,-0.620214}, + {-0.059726,0.397332}, + {-0.592982,-0.006411}, + {-0.123340,0.161368}, + {-0.854995,0.700566}, + {-0.572703,-0.252267}, + {-0.763440,0.344721}, + {0.021265,0.446768}, + {-0.586946,0.323793}, + {0.180415,0.043743}, + {-0.288882,-0.511805}, + {2.624556,-0.567090}, + {0.551481,0.803221}, + {-0.143453,-0.586976}, + {0.992092,1.533923}, + {-0.318124,-0.550864}, + {1.318704,-0.063433}, + {-0.155347,1.117042}, + {0.058911,-0.944546}, + {0.108052,-0.051107}, + {-1.035368,0.386023}, + {-0.823147,0.171737}, + {0.846301,0.680001}, + {-0.110664,0.468723}, + {-0.083706,0.625575}, + {0.290091,0.858146}, + {-0.662183,-0.590796}, + {-0.288190,-0.353492}, + {-1.159802,-1.337642}, + {-0.306885,-0.750638}, + {0.044691,-1.653807}, + {-0.615050,0.289028}, + {-0.201731,0.465221}, + {1.008004,-0.060762}, + {-0.550498,0.300423}, + {-0.116548,-0.013405}, + {0.549048,1.586230}, + {0.759367,-0.971517}, + {1.323636,1.681829}, + {0.170062,0.089436}, + {-0.211072,0.704819}, + {-0.419963,-0.128266}, + {0.626398,-0.551576}, + {1.543900,0.511508}, + {-0.784514,1.183790}, + {0.502940,1.028658}, + {-1.016714,0.248965}, + {0.112604,0.111350}, + {-0.123006,0.683764}, + {0.021753,-0.247159}, + {0.138703,1.086674}, + {-0.051887,-1.076659}, + {1.737884,0.864115}, + {-0.215718,0.020311}, + {0.666013,-0.799401}, + {-1.108657,0.547216}, + {0.552800,2.316691}, + {-0.103811,0.195943}, + {-0.559387,0.399860}, + {-0.574699,-0.002171}, + {0.494645,0.839499}, + {1.539942,0.061094}, + {-1.185473,0.157370}, + {0.687725,-0.726402}, + {1.062304,0.143174}, + {-0.231306,0.431820}, + {0.181212,0.243572}, + {0.048089,1.016969}, + {1.019749,-0.468151}, + {0.272841,-0.383551}, + {0.606381,-0.216956}, + {-1.061207,-1.080103}, + {-0.174838,0.363043}, + {-0.498895,1.116096}, + {-0.098641,0.561958}, + {0.043930,0.385439}, + {-0.427768,-1.146650}, + {0.923076,-0.396539}, + {0.754689,0.963067}, + {-0.037038,-0.203416}, + {0.019305,-0.562339}, + {-0.797642,-0.371491}, + {0.081456,-0.831708}, + {0.208751,-1.180105}, + {-0.774074,-0.978951}, + {1.266618,0.537957}, + {-0.712267,0.567095}, + {0.145303,-0.817414}, + {1.967789,1.007710}, + {0.193202,0.217408}, + {-0.798454,-0.633302}, + {-0.330441,0.650118}, + {-0.007839,0.797737}, + {-0.990287,0.006108}, + {-0.443475,1.373610}, + {0.356907,-0.324058}, + {-0.456490,0.150888}, + {0.778863,-0.215198}, + {-0.465454,-0.433403}, + {0.906855,0.653127}, + {0.492398,-0.648731}, + {0.945877,-1.419218}, + {-0.177893,-0.646512}, + {1.411359,-0.241056}, + {-0.264133,-1.505842}, + {-0.366946,0.985009}, + {-0.128469,-0.052593}, + {0.167171,-0.446152}, + {0.919920,0.002816}, + {0.119854,-0.960683}, + {1.395234,-1.093261}, + {0.264784,0.684038}, + {0.136742,-0.623673}, + {-1.157844,0.208610}, + {-0.081146,-0.545579}, + {0.129620,0.317296}, + {-0.565284,0.051918}, + {-0.552605,0.036032}, + {0.605695,-0.026673}, + {0.050425,2.453665}, + {0.044827,-1.616143}, + {-0.113293,0.653822}, + {1.093501,2.247677}, + {0.695921,-1.033199}, + {0.000694,-0.086366}, + {0.421101,0.539692}, + {0.051940,-1.072276}, + {0.040107,-0.888686}, + {-0.229449,1.123220}, + {1.198503,-0.862325}, + {0.700102,0.555513}, + {-0.119860,-0.774937}, + {-0.028011,1.437656}, + {1.000033,0.429811}, + {0.381991,-0.471777}, + {-1.061909,0.633338}, + {0.795537,-0.653199}, + {1.595592,-1.118207}, + {-0.084673,-1.361223}, + {-0.624297,0.764246}, + {0.089882,1.013592}, + {-0.533656,0.632749}, + {0.465736,0.775404}, + {-0.888801,-0.059761}, + {0.523573,0.053779}, + {-0.209593,0.885880}, + {0.748105,0.127068}, + {0.599795,-1.139121}, + {-0.077588,0.842374}, + {0.761840,-0.795831}, + {0.709548,0.183950}, + {-0.252544,0.680008}, + {0.570220,0.515018}, + {0.266137,-0.206870}, + {-0.885632,1.679647}, + {1.150557,0.483125}, + {-0.468721,-1.841706}, + {0.271059,0.926911}, + {-0.154149,-0.322614}, + {-0.329320,1.218566}, + {-0.171047,-1.007784}, + {0.223529,-0.505620}, + {0.772175,0.801805}, + {-0.341824,0.518301}, + {0.968368,-1.633597}, + {0.073692,-0.583842}, + {-0.953372,-0.161117}, + {0.551488,0.447077}, + {0.020273,-0.505357}, + {0.365393,-0.032102}, + {0.844367,-0.639689}, + {1.018752,0.751834}, + {1.126097,-0.613405}, + {1.016788,-0.019078}, + {0.623747,0.592169}, + {-1.319641,0.298078}, + {-0.329394,-0.423323}, + {0.364704,-0.653483}, + {0.617694,-0.252054}, + {-0.591705,1.619074}, + {-0.161785,1.838932}, + {0.564582,-0.723667}, + {0.225778,0.243980}, + {-0.037796,0.502040}, + {0.367842,-1.021410}, + {-0.427836,-0.366767}, + {-0.488887,1.324747}, + {0.283351,-0.475819}, + {-0.368885,-0.343402}, + {0.022111,-1.503025}, + {0.608174,0.232807}, + {0.872253,-0.186510}, + {-0.550839,-0.327475}, + {-0.154591,-0.267873}, + {-0.747008,-0.379431}, + {-0.277511,-0.951636}, + {-0.759266,0.574239}, + {1.154286,0.179194}, + {-0.112772,-0.817203}, + {0.200759,0.799191}, + {-0.502025,0.432883}, + {-1.119323,-0.074693}, + {1.254542,0.141465}, + {0.080510,0.266965}, + {1.402806,0.382574}, + {0.817240,-0.115142}, + {0.507720,0.176294}, + {0.210651,-0.143840}, + {-0.689945,1.732906}, + {0.235579,-0.641823}, + {0.851720,-0.271216}, + {-0.214092,-1.383215}, + {1.260678,-0.375676}, + {-0.342547,0.300925}, + {0.157321,-1.216358}, + {-1.291505,0.269752}, + {-0.813264,0.966839}, + {0.385009,-0.966745}, + {0.048812,0.037934}, + {0.157922,0.072546}, + {0.136019,-0.636157}, + {-1.131118,0.701695}, + {0.057882,0.542163}, + {-0.289670,-0.556624}, + {0.296565,0.901636}, + {0.811896,0.152258}, + {0.071886,-0.310387}, + {0.248307,-1.423973}, + {-0.077694,-0.208889}, + {0.351881,-0.374276}, + {-1.108993,0.435304}, + {0.689461,-0.661618}, + {-0.847280,0.417742}, + {-0.693780,-0.030547}, + {0.205481,0.163966}, + {1.152296,0.501315}, + {0.421218,-0.000555}, + {-0.796311,0.281834}, + {-0.269010,1.052164}, + {0.133541,-0.454531}, + {-0.412860,1.370429}, + {0.616688,0.124832}, + {0.702940,-1.203623}, + {0.675882,-0.390202}, + {0.830890,1.250459}, + {0.674844,0.665324}, + {-0.043831,0.707066}, + {-0.886906,-0.060713}, + {0.677298,-0.111700}, + {-0.754756,-0.380721}, + {-0.561574,0.787921}, + {-0.138727,-0.246949}, + {0.399551,0.257836}, + {0.391218,-0.046240}, + {-0.604638,-0.547392}, + {1.211615,0.045085}, + {-2.243039,-0.736534}, + {0.779312,0.843648}, + {0.162298,0.157163}, + {-0.140700,0.766237}, + {-0.144998,0.378899}, + {0.417087,0.656509}, + {-0.663537,0.226287}, + {0.623830,0.333788}, + {2.231783,0.374867}, + {0.734099,0.049999}, + {1.036979,-0.688127}, + {-1.040401,-0.707128}, + {0.381121,-0.100134}, + {1.359817,-0.400703}, + {-0.552157,-1.396689}, + {0.259124,-0.224525}, + {-0.273705,-0.347394}, + {-0.409249,0.216952}, + {-0.216934,-0.899068}, + {-0.235146,0.030945}, + {-0.889038,0.360220}, + {-0.157354,0.100057}, + {-0.036127,-0.499812}, + {-0.348823,0.151622}, + {0.279825,-0.589387}, + {-0.933342,0.643324}, + {0.555767,-0.017369}, + {-0.011276,-0.013992}, + {-0.434804,0.253158}, + {0.675855,-0.224374}, + {-0.805744,0.659219}, + {0.808692,0.008962}, + {0.397507,-1.041463}, + {-0.127428,-0.570829}, + {-0.029020,-0.201817}, + {-1.009712,-0.877845}, + {-1.216129,0.783185}, + {0.328932,-0.747150}, + {-0.854801,-0.178626}, + {-0.785073,-1.023245}, + {0.788804,0.147804}, + {-0.654940,0.835733}, + {1.194529,0.469089}, + {-0.435047,-0.112630}, + {-0.398296,0.298359}, + {0.614442,-0.831401}, + {0.898647,1.252811}, + {-0.651719,0.063096}, + {0.829332,-0.130964}, + {-0.644862,0.485383}, + {0.099189,-1.241679}, + {0.232553,-1.087991}, + {0.827992,0.327188}, + {0.251847,-0.542311}, + {0.114473,0.172203}, + {-0.607207,-0.449144}, + {-0.376521,0.290727}, + {-0.132065,0.363772}, + {0.435356,-0.571154}, + {-0.190653,0.248960}, + {0.651496,-0.923586}, + {0.512997,-0.004873}, + {-0.236174,-0.568753}, + {0.932160,-1.334080}, + {0.155451,0.672475}, + {-0.911918,-0.030052}, + {0.263176,0.406002}, + {0.304970,-0.011967}, + {-0.410390,-0.330155}, + {-0.141643,0.047151}, + {-0.172968,-1.012272}, + {-0.372838,0.560728}, + {-0.855840,0.042006}, + {-0.164063,0.636134}, + {-1.109047,-0.279656}, + {-0.069774,-0.604646}, + {-0.282135,-0.394121}, + {0.176084,0.052311}, + {0.487541,-0.565642}, + {-0.208335,0.518275}, + {-0.149021,-0.363198}, + {-0.249631,-0.090729}, + {-0.249841,-0.596483}, + {0.640211,-0.976106}, + {0.326645,0.866942}, + {1.183765,0.830576}, + {-0.029594,-0.620946}, + {1.115148,-0.337932}, + {1.567311,0.261972}, + {-0.721293,-0.564232}, + {-0.357507,0.803439}, + {-1.016735,-0.027591}, + {-0.426745,1.104032}, + {0.443712,1.244449}, + {1.160755,-0.838377}, + {-0.819387,-0.128786}, + {0.288092,0.008755}, + {-0.515644,0.101036}, + {0.364482,-0.130023}, + {-0.229438,-0.654899}, + {0.906635,-0.125711}, + {-0.159322,-0.304040}, + {-1.211824,0.158356}, + {-0.012123,-0.488427}, + {-0.426069,-0.835684}, + {-0.125217,-1.170805}, + {-0.270562,0.000386}, + {0.623183,-0.945317}, + {0.848419,-0.522606}, + {1.250635,0.444407}, + {0.492130,1.050228}, + {1.080375,-0.338691}, + {-0.764704,-1.279899}, + {0.741656,0.485046}, + {0.956357,-1.023715}, + {-0.247405,-0.820810}, + {-0.149085,-0.107801}, + {-0.570624,1.043465}, + {-0.115018,-0.641550}, + {-0.616512,-0.289516}, + {1.176485,-0.172412}, + {-0.362269,1.717443}, + {-0.817064,-0.370700}, + {-0.465179,0.259246}, + {-0.642608,0.664244}, + {0.747615,0.390002}, + {-1.838046,-0.673345}, + {-0.071150,-0.063051}, + {0.124401,-0.037791}, + {0.721531,-0.349121}, + {0.948579,-0.683095}, + {-0.296344,-1.657454}, + {-0.244777,-0.050854}, + {-0.355675,-0.088336}, + {0.834088,-0.200241}, + {-1.139669,0.315556}, + {-0.080632,-0.198803}, + {-0.187648,0.739006}, + {0.609210,-1.146719}, + {0.133987,0.472373}, + {1.301981,-0.658052}, + {0.148344,0.175711}, + {0.482189,-1.298825}, + {-0.666823,-0.399625}, + {0.067421,-0.725454}, + {-0.052146,-0.168842}, + {0.332959,0.334690}, + {-1.054764,0.239030}, + {-0.165250,-0.447066}, + {-0.428016,1.320568}, + {0.510212,0.318306}, + {0.451920,0.645015}, + {1.606643,0.236357}, + {0.230974,0.123761}, + {-0.049062,0.112286}, + {0.479037,0.015434}, + {-0.287389,0.872496}, + {1.067029,0.499731}, + {-0.126337,0.779721}, + {-0.370434,0.612051}, + {0.075632,0.614917}, + {-0.528660,-0.850174}, + {0.487266,-0.590261}, + {-0.234836,0.263938}, + {-0.065654,2.081570}, + {-0.636267,-0.906258}, + {-0.803871,0.321421}, + {-0.328638,0.333370}, + {-0.516140,0.175497}, + {0.347902,-0.402807}, + {0.411276,0.362019}, + {0.440469,0.412853}, + {1.107078,-0.338276}, + {0.856038,-0.131811}, + {-0.369578,0.324333}, + {0.516267,0.144410}, + {-0.706354,-0.923046}, + {1.199280,-0.679079}, + {-0.206381,0.733361}, + {-1.118980,-0.339299}, + {0.249695,1.301003}, + {-0.001465,1.070052}, + {-0.888923,-0.187516}, + {0.810337,0.313939}, + {0.305196,0.026000}, + {0.494726,1.024847}, + {1.476541,-0.802107}, + {-0.526713,0.266385}, + {0.384008,-0.961735}, + {1.282973,-0.698481}, + {0.988486,0.038408}, + {-0.219075,-1.024923}, + {-0.466889,0.255891}, + {0.003917,0.530058}, + {-0.767964,-0.385498}, + {-0.377691,0.462312}, + {0.026027,-1.093603}, + {-0.458202,0.027801}, + {0.806314,-0.293232}, + {0.050386,0.705391}, + {0.738212,0.099567}, + {1.685787,0.176921}, + {-0.892685,-0.318613}, + {1.109295,-0.356620}, + {-0.037037,-0.399946}, + {1.099257,0.066189}, + {-0.138197,0.931202}, + {0.352476,0.541835}, + {-0.234773,1.811281}, + {0.220325,1.006277}, + {1.183808,0.818720}, + {0.412037,-0.266925}, + {-0.046189,0.101378}, + {-0.525259,0.184060}, + {0.223098,-0.866883}, + {0.759485,1.089619}, + {-0.645569,0.593185}, + {-0.363564,-0.111653}, + {-0.760729,0.424275}, + {-0.173270,0.825271}, + {-0.893186,0.404038}, + {0.757566,0.583220}, + {-0.256129,-0.077900}, + {0.284986,0.630869}, + {0.664454,0.481663}, + {0.119009,0.113249}, + {-0.205947,1.010834}, + {0.932543,-0.060003}, + {0.274266,-0.406043}, + {-0.247609,0.396317}, + {-0.442815,0.120444}, + {-1.305720,0.295270}, + {0.936322,0.968362}, + {-0.571598,-0.407698}, + {-0.392774,-0.484139}, + {0.822763,0.339368}, + {-0.517289,0.041135}, + {0.147543,-0.792703}, + {-1.670020,0.099579}, + {-0.299869,-0.266431}, + {0.605640,-0.814238}, + {1.222721,1.050723}, + {-0.467391,-0.124769}, + {-0.575869,0.609053}, + {1.713472,0.570511}, + {0.042960,-1.006402}, + {1.239476,-0.082176}, + {0.378559,-0.955065}, + {-0.165652,0.451352}, + {0.429384,-0.053004}, + {-0.244308,1.056232}, + {0.830270,-0.183125}, + {-0.600558,-1.360258}, + {0.171056,-0.003685}, + {0.839484,0.430587}, + {-0.553197,-1.112661}, + {0.472149,1.241828}, + {0.428034,0.237235}, + {0.611704,-0.377012}, + {-0.231170,-0.306880}, + {0.087621,0.844398}, + {1.390622,0.674419}, + {0.387463,-0.353450}, + {-0.150300,0.730488}, + {-1.062157,0.504289}, + {-0.531514,0.020223}, + {0.128882,-0.065820}, + {0.331307,0.862964}, + {-0.725060,0.793610}, + {0.668800,-2.340218}, + {0.306622,0.510434}, + {-0.240424,0.483310}, + {0.755874,-0.307130}, + {0.307453,-0.534037}, + {-0.260084,-0.957092}, + {0.030535,-0.356006}, + {0.063740,0.338408}, + {0.137347,0.408912}, + {0.071998,-0.512812}, + {-0.816655,0.667604}, + {0.206418,0.459734}, + {-0.199134,-1.021477}, + {-0.027864,-0.229509}, + {0.029766,0.406308}, + {0.263539,0.950641}, + {1.107474,0.510104}, + {0.701356,-0.092664}, + {-0.332519,0.882492}, + {-0.259295,0.542719}, + {0.803323,-0.516191}, + {-0.810940,0.828519}, + {-0.333099,0.493898}, + {0.803446,0.041317}, + {-0.752852,-0.397360}, + {-0.508714,-0.341192}, + {-0.998590,0.444147}, + {0.540311,0.590371}, + {0.352505,-0.284619}, + {-0.330681,0.699920}, + {-0.428966,0.610587}, + {-1.333091,-0.297171}, + {0.345433,-0.821063}, + {0.993852,0.062134}, + {0.729285,0.480559}, + {-0.038753,-0.071297}, + {-0.388438,-0.398816}, + {-0.746620,-0.076653}, + {0.345309,0.817757}, + {0.769405,-0.063687}, + {0.092044,-0.442898}, + {1.029397,-0.869702}, + {0.832081,0.437601}, + {-0.374608,-0.269611}, + {-0.728890,-1.033769}, + {-0.207543,1.059676}, + {0.140337,0.321861}, + {-0.268235,0.376937}, + {0.554032,-1.522496}, + {0.302898,1.115891}, + {-0.566679,1.087246}, + {0.209126,-0.299056}, + {0.183449,-0.446472}, + {0.769257,1.156924}, + {-0.426186,-0.534314}, + {1.357257,-0.027091}, + {0.125598,-0.148277}, + {0.361150,-0.612232}, + {0.733645,-0.215266}, + {-0.599140,-0.087500}, + {0.364386,-0.379064}, + {0.106744,0.427322}, + {0.244401,-0.090466}, + {-0.086618,0.290300}, + {-0.769588,1.227312}, + {0.410929,0.406906}, + {0.033896,-0.301329}, + {1.368098,-1.264228}, + {0.265425,0.246094}, + {-1.089731,0.655995}, + {-0.959035,-0.323536}, + {-0.177452,0.299655}, + {-1.085650,0.751856}, + {-0.934940,-0.467314}, + {0.157832,-1.370121}, + {-0.756801,1.174560}, + {-0.238213,1.484015}, + {0.103337,0.562886}, + {-0.883352,-0.457006}, + {-0.619941,-0.072602}, + {0.827989,-0.576543}, + {-0.274512,0.688768}, + {0.192892,0.046977}, + {0.494114,-1.198486}, + {0.210812,-1.483980}, + {0.068552,-0.412908}, + {0.768963,0.512225}, + {0.887015,-0.416106}, + {0.069268,-0.161404}, + {1.158016,0.428234}, + {1.414889,0.177849}, + {-0.043316,-0.734135}, + {1.519925,-0.641341}, + {-0.954973,-0.096053}, + {-0.627640,0.832967}, + {-0.128482,0.227255}, + {0.096457,-0.172163}, + {-1.188885,0.383040}, + {-0.636699,0.641324}, + {0.760031,-0.811875}, + {-0.020737,0.443516}, + {0.457384,-0.365880}, + {-0.876749,1.149372}, + {0.295054,0.679878}, + {0.023256,0.103668}, + {-0.327805,-0.125698}, + {0.020041,0.216254}, + {-0.306899,-0.187019}, + {1.085265,0.158704}, + {-0.145690,-0.394788}, + {0.338803,0.342693}, + {-0.515034,-1.539775}, + {-0.389804,1.336893}, + {-0.094832,0.858926}, + {-0.697567,-0.301372}, + {0.304157,-0.457016}, + {0.445920,0.840317}, + {0.367189,-0.400123}, + {-0.537674,0.319642}, + {0.040484,0.213835}, + {0.486631,0.235979}, + {-0.927168,0.494577}, + {0.095336,0.538537}, + {-0.685255,-0.341503}, + {-0.414110,0.730628}, + {-0.249497,-0.384687}, + {-0.381906,0.335050}, + {-0.296216,0.192564}, + {0.259756,0.167208}, + {-0.631983,0.213763}, + {-0.107557,0.031968}, + {0.086282,-0.608626}, + {-0.520260,-0.616549}, + {-0.380245,1.375046}, + {-1.355688,-0.262657}, + {-1.404467,0.037742}, + {0.045811,0.570009}, + {-0.416171,-0.129814}, + {0.370554,0.880282}, + {0.719642,1.595834}, + {0.056979,1.643866}, + {0.509780,-0.269105}, + {-0.035170,-0.008985}, + {-0.380304,0.435292}, + {-0.061932,0.766256}, + {0.417917,0.120335}, + {-1.059375,0.118735}, + {0.561525,-0.136216}, + {1.044780,0.316513}, + {0.278741,0.285996}, + {0.445276,1.914646}, + {1.135214,-0.056030}, + {1.552693,-0.468664}, + {0.107992,0.196631}, + {0.010882,-0.782850}, + {0.411889,0.243120}, + {1.041102,0.506174}, + {-0.436580,1.011682}, + {0.234764,-1.107368}, + {-0.369947,-0.283590}, + {0.712020,-0.042864}, + {0.256171,-0.289042}, + {-0.664674,-0.389437}, + {0.501317,-0.199763}, + {-0.233973,0.776302}, + {-0.551974,-0.311394}, + {-1.213793,-0.063365}, + {-0.942542,0.886742}, + {0.120656,-0.927157}, + {0.848886,-0.191111}, + {-0.085995,0.712069}, + {-0.121119,0.712586}, + {0.795790,0.039031}, + {1.130273,-1.091505}, + {-1.009660,-0.084673}, + {-1.391243,1.439570}, + {-0.790172,1.190427}, + {-1.055203,1.031347}, + {0.351972,-0.261797}, + {0.309700,-0.121583}, + {-1.395336,-0.368211}, + {-0.242807,0.043287}, + {-0.091725,1.525055}, + {0.222701,-0.585086}, + {-0.197990,1.109946}, + {0.683433,0.234584}, + {0.778488,1.031004}, + {-1.728844,-0.828213}, + {-0.305833,0.235194}, + {0.839395,1.013991}, + {-0.732283,-1.178569}, + {0.751353,0.525831}, + {-0.608151,-0.209578}, + {-0.760489,0.909863}, + {-0.941207,0.596632}, + {0.113422,0.124614}, + {-0.677100,-0.845145}, + {-2.116992,-1.043945}, + {0.443954,1.264070}, + {-0.844221,-0.548022}, + {0.073296,0.266820}, + {0.606826,-0.308290}, + {-0.142944,0.057349}, + {0.072881,0.302992}, + {-0.294356,-1.221644}, + {0.671911,0.295323}, + {-0.409702,-0.847209}, + {0.266690,-0.020814}, + {1.417976,0.528433}, + {0.294250,-1.224903}, + {-0.438673,-0.509542}, + {0.044148,0.398124}, + {-0.812297,-0.912451}, + {-0.879513,-0.624383}, + {0.758342,0.704452}, + {0.563399,-1.164427}, + {0.809358,-0.309169}, + {-0.076009,-1.386514}, + {-0.580469,0.458582}, + {0.513892,0.214365}, + {-0.640728,-0.171872}, + {-0.521270,-0.133816}, + {-0.843834,0.906054}, + {-1.123661,0.041336}, + {0.082797,0.087755}, + {0.904721,1.160552}, + {-0.238756,0.127971}, + {-1.306804,0.307469}, + {-0.097808,0.500074}, + {-0.007891,-0.206617}, + {-1.058789,-1.223922}, + {-0.086817,1.141660}, + {-0.672100,0.422630}, + {1.107477,0.445402}, + {-1.048691,0.148970}, + {0.860657,-0.307406}, + {-0.075900,-0.772589}, + {0.085372,-0.654328}, + {-0.402544,0.348887}, + {0.836413,-0.212447}, + {0.969845,-0.432787}, + {1.678800,-0.719544}, + {0.122685,0.736764}, + {-0.610210,-0.231955}, + {-0.602630,0.861072}, + {1.689118,-0.524512}, + {-0.570388,-0.710299}, + {0.359182,-0.302528}, + {-0.584968,0.029896}, + {0.376150,-0.101358}, + {0.190034,-0.895052}, + {-0.083246,0.352043}, + {0.488237,-0.109218}, + {0.864959,-0.134808}, + {-0.489859,0.046721}, + {-0.285949,-0.556426}, + {-0.090628,-0.144285}, + {-0.407313,0.094491}, + {-0.754715,0.269388}, + {-0.110048,0.336987}, + {-1.504402,0.827809}, + {-1.144984,0.736338}, + {-0.615585,-0.119038}, + {-1.320089,0.799899}, + {0.146051,-1.613330}, + {-0.203844,1.002752}, + {1.005593,-1.051012}, + {0.590068,0.881226}, + {1.034314,0.478533}, + {-0.807146,0.527922}, + {-1.431626,1.052176}, + {0.254060,-0.588784}, + {-0.552606,0.801991}, + {0.571316,-0.099644}, + {1.906518,0.779457}, + {0.661004,0.688072}, + {-0.848444,-0.767891}, + {-0.446525,1.557097}, + {0.342626,0.070643}, + {1.499481,-0.562495}, + {0.474748,-0.065518}, + {-1.305470,0.236428}, + {-0.996922,0.424136}, + {0.109899,0.116446}, + {-1.376289,-1.178174}, + {1.094583,0.176159}, + {-0.660629,0.735661}, + {0.324773,-0.650471}, + {-0.050363,0.168514}, + {1.411432,0.431589}, + {-0.841104,1.189949}, + {-0.090368,0.422103}, + {-0.138836,-0.227462}, + {0.251194,0.456981}, + {-0.456550,-1.052269}, + {-0.585470,-0.733649}, + {0.718189,0.069608}, + {-0.215514,0.144581}, + {-0.295208,-0.293870}, + {0.064279,1.659733}, + {-0.639890,0.107245}, + {0.671313,-0.308464}, + {0.171154,0.201673}, + {0.530860,-0.395579}, + {0.405182,0.111475}, + {-1.105560,0.477897}, + {-0.469701,-0.814646}, + {-0.310904,-0.140531}, + {0.906292,0.445761}, + {0.641656,-0.711619}, + {1.811121,-0.499532}, + {0.544038,0.258314}, + {0.240229,0.023662}, + {-0.161251,-0.927410}, + {0.526134,0.501783}, + {-0.633589,-0.525689}, + {-0.969783,1.421790}, + {0.164651,-1.234975}, + {-0.945772,0.158957}, + {0.120218,-0.221355}, + {0.234672,-0.016298}, + {-0.397618,-0.661839}, + {1.072883,-0.141947}, + {-1.348040,0.586734}, + {-0.872801,0.434857}, + {-1.430760,0.165192}, + {-0.636803,0.781150}, + {-0.071279,0.396819}, + {-0.298115,0.418331}, + {0.831866,-0.535220}, + {0.958718,0.633147}, + {1.412960,-0.748229}, + {-0.178002,-0.206609}, + {-0.024151,0.915775}, + {1.393923,0.405981}, + {-0.206648,1.302225}, + {0.259960,0.096155}, + {0.842216,0.222933}, + {-0.375179,0.699708}, + {-1.103264,-0.776247}, + {0.193353,-1.171155}, + {0.205492,0.076179}, + {-0.072841,-1.186499}, + {-0.401707,1.760304}, + {-0.205922,0.764063}, + {0.028046,0.211591}, + {0.009746,0.166249}, + {-0.523126,0.458907}, + {0.775557,-0.863099}, + {0.597490,0.287191}, + {1.398946,-0.443293}, + {-0.610123,-1.801501}, + {-0.659803,0.440813}, + {-0.254009,0.206463}, + {0.023678,-1.708605}, + {1.336293,-1.666408}, + {-0.624224,-0.008318}, + {-0.391454,-0.672562}, + {0.005607,0.074204}, + {-0.563962,0.743411}, + {-0.451022,-0.173040}, + {-0.382636,0.398129}, + {-0.036862,-0.079446}, + {-0.008467,-2.296086}, + {0.023278,1.499503}, + {-0.064032,-0.525729}, + {1.457191,-0.108098}, + {0.321643,0.192680}, + {0.121531,0.798915}, + {0.925207,0.317706}, + {1.826658,0.097183}, + {-1.022560,0.131480}, + {-0.318490,1.086323}, + {-1.671511,-0.990183}, + {-0.087723,1.093251}, + {-0.866849,0.094690}, + {0.559302,-0.868112}, + {-0.607928,-1.491484}, + {-0.369056,0.883585}, + {-0.373229,-0.023122}, + {-0.971052,0.792590}, + {0.851785,-0.009613}, + {-0.460853,0.096153}, + {-0.755498,0.166030}, + {-0.598639,-0.848533}, + {0.291127,-0.247983}, + {-0.829961,-1.371573}, + {-0.887194,-0.038222}, + {1.016759,0.265340}, + {-1.203644,-0.226689}, + {1.077377,0.055066}, + {-0.711420,-0.799640}, + {-0.952350,1.757540}, + {-0.699760,-0.395833}, + {0.196095,-0.452552}, + {0.858758,0.082961}, + {-0.102536,-0.000287}, + {0.343266,-0.165811}, + {-0.728940,0.271092}, + {-0.365214,0.684535}, + {0.216959,0.140539}, + {1.180350,-0.419423}, + {1.324288,-0.085228}, + {0.147214,-0.477679}, + {-0.340726,-0.495787}, + {-1.273332,-1.550655}, + {0.922246,-0.111028}, + {0.801098,0.605313}, + {0.636192,1.656684}, + {-0.459339,0.881863}, + {1.781037,0.234321}, + {0.109470,0.133394}, + {-0.004980,-0.810822}, + {0.908525,-0.163045}, + {-0.974477,0.323659}, + {-0.048603,-0.036304}, + {0.325440,-0.342764}, + {-0.337570,-1.092254}, + {0.903449,-0.284129}, + {-0.513390,0.181617}, + {-0.906126,0.669673}, + {-0.047735,-0.670418}, + {0.017003,0.589952}, + {0.028141,0.768896}, + {-0.578796,0.026764}, + {0.153556,-1.036369}, + {1.736299,0.027607}, + {0.207225,-0.621084}, + {0.705813,0.683555}, + {0.613738,-0.279927}, + {0.893509,-0.452908}, + {0.636020,-0.005940}, + {-0.658270,-0.311733}, + {-0.134504,0.070080}, + {1.042131,0.291936}, + {-1.287365,0.847615}, + {-0.003671,0.744938}, + {1.467651,0.342594}, + {0.428411,0.563561}, + {-0.684351,0.323237}, + {-1.151725,-1.138706}, + {-0.979643,-0.060294}, + {-0.950965,1.226894}, + {0.275188,1.399455}, + {1.059926,-0.504133}, + {1.403033,-0.687512}, + {0.451808,-0.267527}, + {0.287162,0.469132}, + {0.667303,-0.852516}, + {-0.817966,0.656727}, + {-0.610009,-1.209200}, + {-0.303650,-0.565971}, + {0.794594,-0.236306}, + {0.431590,-0.908313}, + {-0.486556,-0.148481}, + {0.047972,-0.563498}, + {0.402585,-0.280605}, + {-0.378654,1.233252}, + {0.353901,-0.875133}, + {0.422729,0.132703}, + {0.856809,1.362334}, + {-0.307263,-1.011948}, + {-0.301736,0.329660}, + {-1.085452,0.606158}, + {0.652982,-0.949242}, + {0.162631,-0.537617}, + {-0.965026,-0.836121}, + {-0.224588,-0.548422}, + {-0.437774,-0.279190}, + {0.115997,1.282330}, + {-0.897054,-0.047287}, + {-0.798308,0.372153}, + {0.665938,-0.055502}, + {-0.287413,-0.908496}, + {0.678644,1.314557}, + {-1.449310,1.522950}, + {0.133398,-0.047658}, + {1.224299,-0.149895}, + {0.441690,-0.259865}, + {0.126046,0.235240}, + {-0.966749,-0.417786}, + {-0.246070,0.437277}, + {-0.513593,0.459173}, + {1.263919,0.212954}, + {-0.627105,0.099150}, + {-0.594187,1.118584}, + {0.080869,0.148184}, + {0.706184,0.093108}, + {-0.250103,0.904912}, + {-0.085195,0.370800}, + {-0.081942,1.186957}, + {-0.296313,0.398278}, + {0.107458,-0.270042}, + {-1.468816,0.286041}, + {-0.248786,-0.194616}, + {-0.839973,0.355437}, + {-0.683425,-0.178796}, + {-0.338075,-0.537129}, + {-0.036752,-0.461836}, + {-1.024372,-0.805341}, + {0.013059,0.294161}, + {0.921884,0.535430}, + {-1.007252,1.557665}, + {0.542827,-0.917693}, + {0.309396,0.368338}, + {1.457432,-0.177952}, + {0.233876,-1.087922}, + {-0.287049,-0.480668}, + {-2.620387,0.600910}, + {1.326669,-0.917157}, + {0.401335,0.923110}, + {0.162796,1.157234}, + {0.041788,-0.014345}, + {0.072941,-0.425285}, + {-0.560475,0.764890}, + {0.016479,0.416079}, + {0.097405,0.248996}, + {0.019340,-0.636057}, + {-0.744067,0.747826}, + {0.245503,0.206129}, + {-0.143130,-0.092267}, + {-0.030139,-0.746082}, + {-0.340620,-0.172249}, + {0.574330,0.097636}, + {0.705237,1.038887}, + {0.036829,-1.428994}, + {-0.385480,1.221082}, + {0.367570,-0.573062}, + {0.850865,-0.205763}, + {-1.330905,0.354961}, + {-1.307074,-0.343509}, + {-0.957751,-0.442580}, + {-0.409731,0.243503}, + {0.567889,-0.604233}, + {0.388103,0.085991}, + {0.040627,-0.011142}, + {0.077060,2.004945}, + {-0.833086,-0.049453}, + {-0.843774,-0.478384}, + {0.372355,-0.792844}, + {-0.234287,0.672964}, + {0.107062,-0.502565}, + {-1.135028,0.280502}, + {0.638347,0.034212}, + {-0.199093,-0.238458}, + {0.782282,1.017529}, + {1.389149,0.234737}, + {-0.823454,-0.341639}, + {0.651162,0.121302}, + {0.653624,0.783446}, + {0.352699,-0.207281}, + {1.238071,-0.754767}, + {-0.238806,0.128663}, + {0.262681,0.361327}, + {0.509025,-0.603024}, + {0.981913,-0.189391}, + {-0.706196,-0.289371}, + {1.145942,0.153677}, + {-0.907823,-1.129337}, + {0.188763,0.623059}, + {-0.207448,0.309242}, + {-1.436932,-0.449519}, + {0.263175,0.540244}, + {-0.483092,-0.058570}, + {0.397371,0.753641}, + {0.644110,0.798701}, + {-0.237872,-0.334731}, + {0.600366,-0.897091}, + {0.710538,-0.133366}, + {-1.516116,0.488503}, + {-0.939188,0.418730}, + {-0.827630,-1.305309}, + {0.991499,-0.948166}, + {-0.499176,-0.031343}, + {0.451127,0.527453}, + {-0.546957,-0.430328}, + {0.946791,-0.178838}, + {1.094307,-0.154938}, + {0.609540,-0.054620}, + {0.425711,0.862792}, + {1.052342,-0.544269}, + {0.017746,0.359976}, + {0.075115,-0.401081}, + {0.374648,1.155752}, + {-0.461745,0.439978}, + {0.047619,-0.886710}, + {-0.099683,0.583548}, + {-0.334765,0.050996}, + {-0.478206,-1.264766}, + {0.516489,0.865504}, + {0.320340,-0.267298}, + {-1.324292,0.440493}, + {-0.710460,-0.206828}, + {-0.884704,0.660258}, + {-0.262272,0.394818}, + {-1.601370,0.444466}, + {-0.040487,1.753595}, + {0.449335,0.513686}, + {-0.558298,0.133991}, + {-1.303113,-0.149324}, + {-0.640885,0.046974}, + {-0.069325,-1.365680}, + {0.608970,0.076633}, + {-0.606595,1.106964}, + {-1.357901,-0.599083}, + {0.171158,-0.825277}, + {-0.169345,1.197084}, + {0.952399,-0.276599}, + {-1.216459,-1.814032}, + {0.336292,-0.361441}, + {-0.391223,0.027209}, + {-0.888571,1.002162}, + {0.433612,0.093511}, + {-0.367321,1.307070}, + {0.857512,-0.309022}, + {0.552752,-0.380307}, + {-0.133756,-0.251153}, + {-0.076031,0.670133}, + {0.150394,0.146506}, + {-0.499016,0.809971}, + {-0.790913,0.740662}, + {-1.123231,-1.005292}, + {0.580124,0.208377}, + {-0.466913,0.115610}, + {1.579526,0.786724}, + {0.463652,0.545059}, + {0.363065,-0.468610}, + {0.052198,0.530309}, + {-0.533674,1.126832}, + {0.055098,1.460855}, + {0.446183,-0.620585}, + {0.061081,-0.558367}, + {0.602677,1.026030}, + {-0.214633,0.288994}, + {-0.885402,-0.515751}, + {0.666543,0.166763}, + {-0.582033,-0.122415}, + {0.363257,-0.093152}, + {0.197198,0.114842}, + {0.406922,1.065118}, + {-0.242795,0.181694}, + {1.181767,0.889092}, + {0.397062,-0.428570}, + {-1.448884,-0.474985}, + {-0.309184,-0.467696}, + {0.137783,2.027669}, + {0.474842,-0.884960}, + {-1.661712,0.148843}, + {-0.069285,-0.320696}, + {-0.170034,1.251510}, + {-0.222496,-0.937833}, + {-0.311250,-0.485117}, + {-0.383917,-0.251372}, + {-0.320437,-0.642387}, + {0.206323,-0.019793}, + {-0.278823,-0.242762}, + {0.680746,-0.243103}, + {-0.567863,-0.748655}, + {-0.323796,-0.790379}, + {0.524243,-1.175681}, + {-0.397445,-0.523772}, + {-0.474692,-0.477136}, + {0.189023,0.966859}, + {0.386555,0.481977}, + {-0.140878,-0.911496}, + {0.406182,-0.015365}, + {0.102477,-0.746348}, + {0.090930,-0.614517}, + {-0.086082,-0.376112}, + {0.370291,1.207642}, + {1.139898,0.217497}, + {-0.610672,0.245983}, + {-0.174618,0.833632}, + {-0.831968,0.195580}, + {-0.757329,-0.178189}, + {-0.452875,0.648865}, + {-0.050510,-0.011244}, + {0.607291,0.053154}, + {-0.511124,0.651127}, + {1.482337,-0.900918}, + {-0.703173,0.311134}, + {-0.814727,0.000269}, + {-0.500544,-0.108025}, + {-0.986775,-1.061037}, + {0.121914,-0.452219}, + {-0.442473,1.026816}, + {0.763792,1.515099}, + {0.623316,0.417977}, + {-0.212855,0.306216}, + {-0.561318,-0.795493}, + {0.576698,0.693102}, + {0.061154,1.127743}, + {-0.887248,-0.434093}, + {0.400682,-0.310835}, + {0.432078,0.437754}, + {-1.820646,-0.665382}, + {-0.545136,-0.481289}, + {0.400912,0.700684}, + {0.137771,0.590814}, + {0.811931,1.048663}, + {-0.815412,-0.744414}, + {-0.182987,0.208578}, + {-0.481622,-0.883622}, + {-1.174057,0.017304}, + {0.762922,0.651641}, + {-0.225956,0.405115}, + {0.170487,0.754648}, + {-0.324751,-0.699111}, + {0.508982,0.579276}, + {-0.217381,0.280138}, + {-0.164204,0.071186}, + {1.046480,-0.151789}, + {-0.407525,0.236215}, + {0.043528,0.503335}, + {-0.422499,0.544007}, + {0.737522,-1.360706}, + {1.348720,0.519788}, + {-0.879691,0.405074}, + {-0.357675,0.687248}, + {-0.860730,-0.689677}, + {-1.748928,-1.078704}, + {-0.195426,-1.049862}, + {-0.035495,-0.350232}, + {1.033713,-0.030587}, + {0.800092,-0.110899}, + {-0.305951,0.274492}, + {-0.832381,-0.825501}, + {1.297737,0.530891}, + {-0.024356,0.967573}, + {-0.449962,1.296328}, + {0.341683,-0.869522}, + {-1.470761,0.197663}, + {-0.936318,-1.271953}, + {0.048144,-0.615236}, + {0.378908,0.844420}, + {0.461083,-0.366872}, + {0.047960,0.407828}, + {-0.840079,-1.095449}, + {-0.027915,1.084483}, + {0.674601,0.522046}, + {1.931610,0.765981}, + {-0.125784,-0.336877}, + {0.019115,-1.481554}, + {0.820840,-0.447176}, + {0.707047,0.929830}, + {0.958282,-0.396113}, + {-0.580240,0.094636}, + {-0.174754,-1.196160}, + {-0.860568,-0.091731}, + {0.523920,-0.030573}, + {0.274479,-0.049813}, + {0.153459,0.249274}, + {0.533358,0.444977}, + {-1.241255,0.245974}, + {-1.012174,-0.027701}, + {-0.395522,-0.193917}, + {-0.972526,0.180350}, + {0.430804,-0.833766}, + {-1.011518,0.292716}, + {0.207684,-0.205800}, + {0.044858,0.152791}, + {0.448157,-0.030646}, + {-0.499634,-0.262260}, + {-0.143806,-1.010803}, + {0.886031,-0.336787}, + {-0.362530,-1.768263}, + {-0.242831,-0.154468}, + {0.734717,0.111474}, + {0.072613,0.508828}, + {-1.899793,0.301018}, + {0.090072,0.247977}, + {1.285664,0.732956}, + {-0.135188,0.142834}, + {1.273538,-0.920904}, + {0.221604,0.753942}, + {0.117900,1.060812}, + {-0.232774,-0.083558}, + {-0.425926,0.686408}, + {-0.340529,-0.169042}, + {-1.070367,-0.239810}, + {0.173529,-0.065984}, + {-0.933640,0.004310}, + {-0.566267,1.379593}, + {0.734686,-0.766672}, + {-0.413294,0.709294}, + {0.595004,-1.135705}, + {0.718267,-0.281773}, + {0.106468,-0.863281}, + {-1.145502,0.206171}, + {0.887536,-0.242405}, + {-0.075956,0.156573}, + {-0.567216,-0.288216}, + {0.664645,-0.362856}, + {0.547459,-1.799647}, + {-0.241719,0.821927}, + {-0.034155,0.250263}, + {-0.046388,-0.235086}, + {0.419359,0.310763}, + {-0.215888,-1.367215}, + {0.034387,1.044299}, + {-0.358005,0.645426}, + {0.326152,0.748784}, + {0.202163,-1.123275}, + {0.690767,-0.848466}, + {-0.125006,-0.255902}, + {0.162892,-0.345699}, + {-0.955042,0.294080}, + {0.083320,1.880625}, + {-1.198282,0.804137}, + {0.587054,-0.958859}, + {-1.601116,-0.725511}, + {1.139292,-0.045379}, + {0.203917,0.685789}, + {-0.493037,0.458789}, + {-0.031010,-0.106568}, + {-0.429805,1.119367}, + {-0.528015,0.735593}, + {-0.134197,-1.255463}, + {-0.448291,-0.262008}, + {-0.050223,0.690944}, + {-0.326287,0.961302}, + {0.124462,-0.571389}, + {-1.086006,0.724509}, + {0.209547,1.056945}, + {-1.293691,0.471514}, + {-0.003896,0.567797}, + {0.183588,-0.440099}, + {0.728438,-0.316034}, + {0.626752,-0.654537}, + {-0.323843,-0.581490}, + {-0.584120,1.235448}, + {-0.724753,-0.357822}, + {0.651802,-0.255045}, + {1.066699,0.145706}, + {-0.327084,-0.703887}, + {0.726433,0.902326}, + {0.615929,-0.468777}, + {0.215638,0.025393}, + {0.133688,0.312972}, + {1.480107,0.472599}, + {-0.422097,-0.160696}, + {-0.044013,-0.556906}, + {0.614888,-0.377907}, + {-0.064303,-0.363883}, + {0.417722,0.242693}, + {-0.610622,-0.349784}, + {0.274353,1.229638}, + {1.376876,-0.661918}, + {0.065799,0.192942}, + {-0.985618,1.632529}, + {0.007131,-0.681075}, + {0.034166,-0.337426}, + {-0.725304,-0.279474}, + {-0.730621,-0.266983}, + {-0.843057,0.478930}, + {0.474710,-0.454256}, + {-0.507851,-1.321088}, + {-0.017476,-0.794130}, + {-1.038323,0.066833}, + {0.385382,1.225797}, + {0.021934,-0.410591}, + {-1.010484,-0.669754}, + {0.429793,1.532827}, + {0.636827,-0.288977}, + {-0.534265,-0.646029}, + {-0.844287,-0.564450}, + {-0.396490,0.315667}, + {-1.273186,0.218433}, + {0.417662,-0.018864}, + {0.462506,-1.253567}, + {-0.182622,-0.273477}, + {-1.579637,0.949574}, + {0.433213,-0.037784}, + {-0.846671,0.082560}, + {0.662308,0.650516}, + {0.045595,-0.496667}, + {0.119091,0.014749}, + {0.608458,0.837623}, + {-0.687084,-0.195381}, + {-0.018589,0.789815}, + {-0.298420,0.261702}, + {-0.040271,-0.194730}, + {0.620631,0.613639}, + {-0.937617,-1.049478}, + {-1.053561,-0.076996}, + {-0.146382,1.050599}, + {-0.020837,0.355688}, + {0.201458,0.287587}, + {2.218790,0.476933}, + {-0.104763,0.355760}, + {-0.479467,1.109721}, + {-0.893756,-0.550251}, + {0.956522,-0.432295}, + {-0.194464,0.764093}, + {-0.704136,0.235401}, + {-0.654628,-0.706623}, + {-0.493649,-1.139754}, + {1.131061,-0.875211}, + {0.422646,0.452794}, + {1.210811,0.230644}, + {0.529746,1.430776}, + {0.460853,-0.100968}, + {0.145607,0.417836}, + {-0.183425,0.671501}, + {0.712047,0.585763}, + {0.667523,0.427398}, + {0.083714,0.241186}, + {0.603047,-0.437378}, + {0.671836,-0.108031}, + {0.147556,1.611462}, + {-0.474514,0.338308}, + {0.669331,-0.582147}, + {-0.518075,-1.063090}, + {-0.404972,1.037375}, + {0.392642,0.132706}, + {0.091281,-0.677244}, + {-0.101493,0.595298}, + {-0.273278,-0.149243}, + {-0.056904,0.119955}, + {-1.155884,-1.080464}, + {-0.068053,-0.148710}, + {0.578176,0.409176}, + {0.840193,0.143279}, + {-0.240609,-0.502595}, + {-1.242000,-0.441204}, + {1.109439,0.606569}, + {0.055563,-0.064248}, + {-0.149710,0.672466}, + {0.726856,-0.310854}, + {-0.653160,-0.652705}, + {0.278598,0.458304}, + {1.079266,0.059011}, + {-1.419938,0.322182}, + {0.945599,0.108086}, + {-0.751556,0.294139}, + {0.427620,0.212390}, + {-0.069527,0.242822}, + {0.278856,-0.156601}, + {-0.065200,0.118212}, + {-0.195535,-0.019769}, + {-0.420603,-0.282551}, + {-0.907453,0.158124}, + {0.113203,-0.260452}, + {0.108842,-0.457941}, + {0.325193,0.172876}, + {0.291742,-1.615476}, + {1.111341,0.223062}, + {0.355686,0.290422}, + {0.634955,-0.443257}, + {-0.288282,-0.326955}, + {0.392507,-0.445702}, + {-0.079780,-0.200318}, + {0.358629,0.085606}, + {-1.037372,0.489174}, + {-0.650397,-0.686827}, + {1.025516,-1.009867}, + {0.704492,-0.014842}, + {-1.937672,0.038744}, + {1.043168,-0.182518}, + {0.767195,1.172210}, + {-0.973759,0.495782}, + {0.727765,-0.454134}, + {-0.463311,0.027464}, + {0.461195,0.676168}, + {0.563002,-0.443334}, + {0.837410,1.297797}, + {0.530937,0.527558}, + {-0.207558,1.073655}, + {0.017685,-0.129331}, + {-0.434984,-0.756967}, + {1.186167,0.330663}, + {-0.494215,-0.229928}, + {-1.967930,0.423566}, + {0.085717,0.490676}, + {0.579028,0.081474}, + {-1.165809,1.066751}, + {0.155616,-0.207882}, + {0.824000,0.024005}, + {-0.650314,-0.289259}, + {0.289677,0.562463}, + {0.084380,-0.741257}, + {-0.185975,-1.002760}, + {-0.258544,-1.231110}, + {-0.680721,-0.132215}, + {-0.126178,-0.346100}, + {0.059501,-0.556818}, + {0.257426,0.740194}, + {0.209590,0.920746}, + {0.278486,0.751635}, + {-0.266518,-0.406470}, + {0.747083,0.368274}, + {0.361351,1.035953}, + {0.730710,0.834248}, + {-0.629610,-0.456521}, + {-1.063318,0.238140}, + {-0.239986,0.455673}, + {0.045907,1.094522}, + {-0.098907,-1.444712}, + {0.346836,-0.959861}, + {-0.120778,-0.989386}, + {0.411690,0.088654}, + {-0.269997,0.408287}, + {0.840135,-0.066117}, + {-0.488370,1.718434}, + {0.875784,1.132982}, + {-0.423667,-0.074866}, + {0.406809,-1.179861}, + {0.214059,-0.303153}, + {-0.302193,1.101238}, + {0.868983,-0.955911}, + {-0.507030,-0.093825}, + {0.906214,0.198565}, + {-1.340024,0.138617}, + {-0.383054,-0.069114}, + {-0.486159,-0.087876}, + {-0.469249,0.620882}, + {-0.278926,0.596592}, + {-1.669627,0.194691}, + {0.742352,-0.614247}, + {0.718457,-1.097553}, + {-1.226771,0.059541}, + {-0.753392,-1.289320}, + {-0.209317,-0.130344}, + {0.481910,0.355924}, + {-0.316461,0.620936}, + {-1.244952,-0.290661}, + {0.215579,-0.017983}, + {-0.469612,-0.348379}, + {-1.275008,0.509724}, + {-0.522839,0.762522}, + {1.326882,0.479414}, + {0.226020,-0.210263}, + {-1.179333,-0.508178}, + {-0.818269,-0.304733}, + {-0.173224,-0.439298}, + {-0.536131,0.998854}, + {0.607704,0.360449}, + {0.006800,1.240915}, + {-0.835128,-0.346159}, + {0.147648,0.135792}, + {-0.724952,-0.728993}, + {0.387685,-0.535468}, + {0.119265,0.577041}, + {0.496673,-0.247011}, + {-0.506871,0.140888}, + {-0.556531,-0.131979}, + {-0.286395,0.267888}, + {-1.535815,0.901937}, + {-0.025959,-0.061265}, + {0.571857,0.076721}, + {0.378659,-1.266500}, + {0.474031,-1.498596}, + {-0.010007,0.157154}, + {1.036847,0.749449}, + {1.036444,0.841654}, + {0.548594,-0.632059}, + {0.368966,-1.003432}, + {0.570837,-0.124028}, + {0.341200,0.495283}, + {1.122887,0.046649}, + {0.748775,-0.646888}, + {0.114935,0.407391}, + {0.016391,-1.068782}, + {0.276187,0.082486}, + {0.328695,-0.203988}, + {-0.955191,-0.006992}, + {-0.954723,0.976115}, + {0.130024,0.006814}, + {1.178728,-1.134652}, + {-0.280919,1.145315}, + {-0.074035,-0.138700}, + {-0.885872,-0.173488}, + {-0.052446,0.391385}, + {0.061407,-0.036012}, + {-0.178374,0.207062}, + {1.539364,-0.706954}, + {0.683015,-0.203145}, + {0.214058,-0.228743}, + {0.816114,-0.336901}, + {1.083669,0.601556}, + {0.243885,0.366600}, + {-0.376040,0.342849}, + {0.049959,-0.020917}, + {-0.249481,1.559691}, + {0.260203,0.448585}, + {0.400041,0.204926}, + {0.103935,-0.828622}, + {-1.743587,-0.564881}, + {1.227175,-0.006252}, + {0.517290,0.681785}, + {0.041937,-1.277299}, + {0.884991,1.022953}, + {-0.395354,0.177096}, + {0.659057,-0.417478}, + {-1.433312,-1.086898}, + {-0.307188,0.459477}, + {1.083389,-0.395616}, + {0.931207,-0.529729}, + {-0.691098,-0.682569}, + {-0.107824,-0.121179}, + {0.162237,0.278125}, + {-0.187331,-0.078223}, + {0.539435,-0.468066}, + {-0.037026,-0.169309}, + {-0.032828,0.774350}, + {1.004977,0.207932}, + {-1.375620,-0.465708}, + {-0.853797,-0.492372}, + {0.857050,-0.067048}, + {-1.358066,-0.056983}, + {0.205638,0.517628}, + {0.134978,-1.457460}, + {-0.628057,-0.198079}, + {1.020819,0.168767}, + {-0.660697,0.430602}, + {-1.207856,0.350159}, + {0.211552,0.334102}, + {1.569613,0.644036}, + {0.625801,-0.806877}, + {0.753956,-0.280829}, + {0.800271,0.796731}, + {-0.157847,0.366712}, + {-0.520191,-0.177564}, + {-1.880639,0.111041}, + {0.565178,-0.025211}, + {0.867760,0.267054}, + {-1.699681,0.127302}, + {0.925459,0.105993}, + {-0.381951,-0.290209}, + {-0.008579,-0.672418}, + {-0.226066,0.111930}, + {-0.511046,-0.180645}, + {-0.150570,-0.920002}, + {0.456257,1.157604}, + {0.285512,-0.521834}, + {0.197973,0.250159}, + {-0.574980,-1.048345}, + {0.065042,0.539600}, + {-0.080347,0.440878}, + {0.334152,1.807252}, + {0.870739,-0.406652}, + {0.176466,0.116783}, + {-0.373632,-0.833253}, + {-0.411070,-0.622612}, + {0.490742,0.472114}, + {-0.144185,0.440259}, + {-0.911075,1.395547}, + {-0.963359,0.070059}, + {0.472861,0.954686}, + {0.144494,0.457410}, + {0.724328,0.010123}, + {1.405964,0.660263}, + {0.629468,-1.148403}, + {-0.365955,0.044107}, + {1.302156,-0.349987}, + {0.559796,0.286848}, + {-1.408563,1.083378}, + {0.176937,0.040345}, + {-0.339737,-1.036991}, + {-0.000428,0.120110}, + {0.174082,-0.440745}, + {-0.812662,0.308663}, + {-0.344535,0.731337}, + {-0.687735,-0.481504}, + {-0.167853,0.616992}, + {-0.032443,-0.661320}, + {-0.744886,-0.239760}, + {0.372373,0.085475}, + {-1.440036,0.895442}, + {-0.277006,-0.398549}, + {-0.370569,-0.322067}, + {0.103481,-0.007568}, + {-0.106426,0.323058}, + {-0.483987,-0.268954}, + {0.292168,0.040605}, + {0.074066,0.134120}, + {0.153317,-1.287651}, + {-1.203918,-0.967637}, + {-0.317271,0.386501}, + {0.954049,-0.099558}, + {0.462192,-0.061542}, + {-0.062967,0.369906}, + {-0.884488,0.712304}, + {0.186711,-0.348097}, + {-0.352553,-1.659383}, + {-0.486478,-1.015527}, + {0.251005,0.060654}, + {-0.383225,0.840563}, + {-0.808342,-0.888829}, + {-0.227572,0.129202}, + {-0.314270,-0.775019}, + {-1.545768,-0.570873}, + {0.545677,0.182432}, + {0.081540,-0.429030}, + {-0.106779,-0.216418}, + {0.450044,0.045841}, + {0.905832,-0.902027}, + {0.457874,-0.063177}, + {0.116610,-0.016288}, + {-1.167063,0.372052}, + {0.982923,-0.259440}, + {-0.922239,0.212051}, + {-0.529454,-0.435260}, + {-0.213398,0.659482}, + {0.235217,-0.582746}, + {0.622280,0.032259}, + {0.593666,0.351868}, + {-0.873997,-0.448480}, + {-0.945217,1.031911}, + {-0.039626,0.351279}, + {1.166869,-0.022261}, + {0.104525,0.891744}, + {-0.833076,0.326978}, + {1.038616,0.221851}, + {0.210548,0.797819}, + {-0.610088,-0.922245}, + {-0.343548,-0.954441}, + {0.159815,-0.755620}, + {-1.254248,0.310110}, + {0.112621,0.338769}, + {0.509586,-0.114230}, + {0.458902,-0.012483}, + {-0.077531,0.845512}, + {-0.024838,-0.325136}, + {0.099325,-0.797450}, + {-0.149184,0.461116}, + {-0.229381,-0.113607}, + {-0.790994,0.906154}, + {1.110214,0.040753}, + {-0.312241,0.102262}, + {-0.492226,-0.169707}, + {0.154426,0.445431}, + {0.915648,0.371803}, + {-0.997727,-0.598569}, + {-0.694967,-0.288512}, + {0.440323,-0.276589}, + {-0.606794,-1.515034}, + {-0.336494,0.022852}, + {0.119489,-0.371741}, + {-0.695836,0.229833}, + {-0.161236,-1.197827}, + {0.902952,0.341914}, + {-0.478975,-0.883342}, + {0.010275,0.473193}, + {-0.257723,0.343809}, + {-1.647461,-0.658151}, + {1.203630,0.311324}, + {-0.520208,-0.077408}, + {-0.042387,-0.201717}, + {0.732624,-0.442372}, + {-0.025341,0.263186}, + {-0.585464,0.089537}, + {-1.270729,0.861931}, + {0.365129,0.609487}, + {1.133617,-1.306806}, + {-0.010529,-0.948779}, + {-1.495597,1.148781}, + {-0.029070,-0.136818}, + {0.206800,0.008509}, + {-0.794964,0.295312}, + {0.338531,-0.540493}, + {-0.405923,-0.474873}, + {0.979782,0.070233}, + {-1.358570,-3.041284}, + {-2.044437,-0.337722}, + {0.467839,-0.830266}, + {0.885020,0.766034}, + {0.628159,0.150322}, + {0.155384,1.033378}, + {0.499468,-0.472419}, + {-0.017379,0.135709}, + {1.044006,0.107473}, + {0.069893,1.038512}, + {0.052506,-0.202886}, + {0.725175,-0.396198}, + {-1.435707,0.436358}, + {-0.537693,0.135514}, + {0.874197,1.596120}, + {0.692789,-0.072948}, + {1.514427,0.422330}, + {0.356388,0.004602}, + {-0.424132,1.742008}, + {1.161560,0.621060}, + {-1.253631,0.873246}, + {0.830477,-0.113869}, + {-0.089117,1.005543}, + {-0.119315,0.415317}, + {0.530735,-0.551322}, + {0.468530,-0.096115}, + {0.465401,0.845196}, + {-1.226917,1.079224}, + {-0.340842,-0.903031}, + {1.019357,-0.845306}, + {-0.542261,-0.981142}, + {0.745563,-0.146286}, + {0.146678,1.522813}, + {0.489313,0.877646}, + {0.622197,0.410875}, + {-0.332401,1.742686}, + {-0.530628,0.179136}, + {0.214410,0.379434}, + {-1.320653,0.366324}, + {-0.135837,-0.625588}, + {0.018205,0.579573}, + {0.113747,0.193869}, + {0.826568,-0.342809}, + {0.517217,0.388353}, + {0.511517,-1.261484}, + {0.069570,1.590514}, + {0.524966,1.277127}, + {-0.604102,0.356745}, + {-0.289114,1.192349}, + {-1.224444,0.781320}, + {0.797974,0.660886}, + {0.358733,0.016464}, + {-0.201142,0.232487}, + {1.024496,-0.588845}, + {-0.513361,1.122263}, + {-0.918694,0.121980}, + {-0.195506,-0.020095}, + {0.331440,-0.501190}, + {0.266567,1.455573}, + {0.740847,0.632486}, + {-0.395862,0.862711}, + {-0.542915,-0.406950}, + {-0.187643,0.516822}, + {-0.777298,-0.688838}, + {1.561877,0.175345}, + {0.042752,0.261983}, + {-0.477959,0.013431}, + {-0.378112,-0.612150}, + {0.517772,-0.504068}, + {0.534609,-0.171057}, + {0.581429,-0.511870}, + {1.573305,0.690322}, + {0.371148,0.371632}, + {0.775532,-1.827403}, + {0.699914,-0.106911}, + {-0.563281,-0.400668}, + {0.120288,0.692679}, + {-0.216988,0.919587}, + {-0.032172,-0.042166}, + {0.257666,-0.073362}, + {-0.829215,0.807044}, + {0.043528,-0.370050}, + {0.726681,-0.109935}, + {0.199629,-0.260646}, + {-0.064800,0.952449}, + {-0.366864,0.342468}, + {-0.213579,0.473732}, + {0.475745,-0.522349}, + {-0.578518,0.470114}, + {0.131571,0.070506}, + {0.199747,1.295036}, + {0.163703,0.315885}, + {0.730185,-0.561563}, + {0.155160,-0.466836}, + {0.209743,-0.938351}, + {-0.332044,0.339460}, + {-0.334248,-0.438717}, + {-0.177906,-0.445812}, + {-0.403888,0.515655}, + {-0.529417,1.448326}, + {0.751148,-0.069385}, + {-0.543366,1.195889}, + {-0.565148,0.963886}, + {1.462286,-0.220984}, + {1.482440,-0.287540}, + {-0.577094,-0.718976}, + {-1.677120,-0.951714}, + {1.349836,0.330001}, + {0.047546,-0.005764}, + {-0.087343,-0.860869}, + {0.969527,-0.058331}, + {0.640526,-0.460373}, + {-0.620476,0.177907}, + {0.646331,0.313684}, + {-0.865669,-0.430395}, + {-1.109093,0.284577}, + {0.623313,1.066345}, + {-0.942186,0.297467}, + {0.386541,-0.886178}, + {-1.337573,0.110937}, + {0.411021,-0.972933}, + {-0.731420,-1.565217}, + {0.115932,0.032862}, + {0.647009,-0.702312}, + {0.368068,0.376174}, + {1.769808,-0.289011}, + {-0.186158,0.373612}, + {-1.327035,-0.080788}, + {-1.039836,-0.777259}, + {-0.020857,0.135255}, + {-0.342180,-0.853006}, + {0.599834,0.159697}, + {-1.190980,-0.408167}, + {-0.953700,-0.055447}, + {0.242964,0.103171}, + {-0.330887,0.495570}, + {-0.736320,-0.023509}, + {0.572782,0.531094}, + {1.955315,0.650087}, + {0.489044,-0.003831}, + {-0.573902,-1.761131}, + {-0.258057,-0.141214}, + {0.092342,0.110264}, + {0.813360,1.816915}, + {1.221027,-0.215925}, + {-0.103234,0.313383}, + {0.078699,-0.198435}, + {-0.581828,-0.816310}, + {0.283286,-0.081822}, + {0.302095,-0.251803}, + {-0.406478,-0.593376}, + {-1.326431,0.230793}, + {-0.180609,0.370457}, + {0.552601,0.177024}, + {-1.333465,0.065461}, + {0.599845,-0.602277}, + {1.077753,-1.104753}, + {0.809628,0.038772}, + {0.024962,-0.314990}, + {-0.988391,1.568123}, + {0.338240,0.004098}, + {-0.412518,0.731701}, + {-0.313828,0.854789}, + {1.524806,-1.562020}, + {-1.169150,0.061988}, + {-0.463460,-1.121006}, + {-0.688317,0.548066}, + {1.066755,-1.657319}, + {-0.098140,-0.618434}, + {0.432144,-0.550599}, + {-0.078023,1.897759}, + {0.527062,-1.127072}, + {0.386297,0.274681}, + {1.092527,-0.621702}, + {0.544097,-0.200129}, + {0.619517,0.186827}, + {-0.894467,0.710752}, + {-0.516944,-0.474122}, + {-0.178624,-0.241885}, + {-1.103791,0.206812}, + {-0.750328,-0.465599}, + {-1.049783,-0.059999}, + {-0.238415,-0.584913}, + {0.841484,0.498381}, + {0.772949,-0.257598}, + {0.631129,-0.010723}, + {0.638257,-0.000321}, + {0.484532,-1.725015}, + {0.429875,0.794608}, + {0.098118,-0.679536}, + {0.252370,-1.123608}, + {0.256356,0.128045}, + {-1.654829,-0.677293}, + {0.341717,0.901616}, + {-1.530022,-0.071391}, + {1.584247,0.385784}, + {-0.134925,-0.596211}, + {-0.306823,-0.640632}, + {0.680138,1.001415}, + {0.855363,0.466031}, + {1.047399,-0.967652}, + {0.874714,0.771008}, + {0.023131,0.930381}, + {-1.094853,-0.870464}, + {0.718843,-0.226276}, + {-0.135767,0.433719}, + {0.058625,-1.398816}, + {-1.478618,-0.590113}, + {-1.706239,-0.238334}, + {-0.278994,1.505897}, + {-0.649649,0.049328}, + {0.357204,-0.249715}, + {-0.178715,0.811732}, + {1.233743,0.677688}, + {0.404137,1.022936}, + {0.656525,0.330724}, + {0.607732,-1.362354}, + {-0.127905,-0.419755}, + {-0.152615,-0.700967}, + {-0.352367,-0.973191}, + {-0.720073,-1.323530}, + {-0.127801,-0.477660}, + {-0.092400,0.491723}, + {0.341948,-0.814883}, + {-0.040942,-0.194408}, + {-0.510947,0.165069}, + {-0.386948,0.041816}, + {-0.391543,0.095043}, + {0.814066,-0.413210}, + {0.652218,-0.465334}, + {-0.144483,0.331067}, + {0.230318,-0.335014}, + {-0.085459,-0.090830}, + {-0.458532,0.005534}, + {0.602005,0.549709}, + {-0.656597,-0.039494}, + {-0.529460,-0.586545}, + {0.459330,0.016754}, + {-0.902031,-0.240948}, + {-0.046894,0.151840}, + {0.377669,1.389795}, + {0.397125,0.524265}, + {-0.388316,0.810665}, + {1.536130,-0.018437}, + {-0.324880,0.392937}, + {-0.402622,1.137794}, + {0.298408,-0.266189}, + {0.681114,-0.071383}, + {-0.272913,-0.092683}, + {1.575728,0.022775}, + {0.194788,-0.335136}, + {0.519039,0.062735}, + {-0.764728,0.146452}, + {0.236471,-1.427158}, + {0.995246,0.767302}, + {-0.349678,0.736569}, + {0.118835,0.421198}, + {-1.078159,0.402561}, + {-0.764007,-0.533382}, + {-0.455951,1.354001}, + {0.541724,0.107812}, + {0.517193,0.011113}, + {0.192692,0.927513}, + {-0.639680,-0.461272}, + {-0.497412,0.005693}, + {0.035037,0.968771}, + {0.427440,-0.147090}, + {-1.412140,-0.121905}, + {0.344535,0.038231}, + {0.256825,0.088627}, + {-0.859248,-0.787997}, + {-0.127159,-1.105511}, + {1.125815,-0.063713}, + {-1.355366,-0.913897}, + {0.567869,0.633445}, + {0.784268,-0.756031}, + {-0.417336,0.300105}, + {-1.430904,0.105505}, + {-0.042593,-0.153161}, + {0.213039,0.587233}, + {0.028565,0.513513}, + {-0.041316,-1.552297}, + {0.458964,1.495922}, + {0.559308,-1.214681}, + {1.049392,0.519859}, + {0.290751,0.410285}, + {-0.235969,0.075235}, + {0.827775,0.234283}, + {-0.353105,0.368130}, + {1.152140,0.124431}, + {-0.676463,-0.451120}, + {0.431903,0.156522}, + {-1.146142,0.821383}, + {-0.231929,0.460321}, + {0.331103,0.291431}, + {-0.486103,-1.028895}, + {0.247142,-0.577083}, + {0.643317,0.642730}, + {-0.038357,-0.731389}, + {-0.529627,-0.518347}, + {-0.458770,-0.602541}, + {0.717108,-1.502174}, + {1.639891,-0.046797}, + {0.367167,-0.575410}, + {0.200877,-0.125050}, + {1.282175,-0.037682}, + {-0.094635,-0.888363}, + {0.413420,1.283817}, + {0.132756,0.300671}, + {-0.367404,1.005577}, + {0.511375,-0.097647}, + {-0.375077,0.423522}, + {0.382736,0.001469}, + {0.044349,-1.190297}, + {-1.190740,0.471491}, + {0.835772,0.424912}, + {1.030520,0.464877}, + {-0.529949,0.824068}, + {-0.099363,0.508190}, + {-1.371466,0.242051}, + {0.916338,-1.128584}, + {0.785841,-1.448629}, + {0.407546,0.603846}, + {0.575293,-0.166221}, + {0.886545,0.439648}, + {-0.226133,0.961934}, + {-0.165523,0.076377}, + {-0.678735,-0.898540}, + {-0.053888,1.308609}, + {0.584848,0.060583}, + {0.083871,-0.233156}, + {0.004868,0.283304}, + {0.552259,0.868118}, + {0.500338,-0.610468}, + {-0.043386,-0.346571}, + {-0.498805,0.288491}, + {0.438704,-0.106490}, + {0.415201,-0.503631}, + {0.032692,0.644929}, + {0.101192,0.299544}, + {0.381060,-1.411974}, + {-0.859828,-0.958490}, + {-0.680687,0.892740}, + {0.112933,0.002252}, + {-0.278048,-0.241376}, + {-2.217421,-0.418946}, + {0.671425,0.447137}, + {1.852803,-0.254499}, + {-0.777766,0.350337}, + {0.058883,-0.792590}, + {1.819335,0.931958}, + {-0.140655,0.687205}, + {-0.454620,0.532005}, + {0.520396,-0.641183}, + {-0.614732,-0.794939}, + {-0.555090,0.194826}, + {-0.867211,-0.430899}, + {0.114316,0.279198}, + {0.906085,0.126300}, + {-1.652861,-0.398311}, + {0.720231,0.310120}, + {0.616857,-0.224845}, + {-0.355100,0.825606}, + {-0.443765,-0.588850}, + {0.548479,0.069557}, + {0.311662,0.550548}, + {1.211246,-0.191114}, + {-0.220659,1.110956}, + {-0.359286,-0.164330}, + {0.789602,-0.070392}, + {0.566583,-0.827020}, + {0.595349,-0.690691}, + {0.189841,0.431550}, + {-0.289571,-0.607088}, + {0.621366,-0.321307}, + {0.186891,-0.852539}, + {0.232188,-1.220607}, + {-0.612862,0.059821}, + {-0.105208,0.298759}, + {-0.329366,-1.318732}, + {0.320709,0.096560}, + {0.140400,-1.134450}, + {-1.507197,-1.015648}, + {0.397460,0.411895}, + {-0.815200,-0.096281}, + {0.168722,0.671290}, + {-0.859969,0.821381}, + {0.171885,-0.220966}, + {-0.093656,-1.361741}, + {-0.527003,0.899775}, + {0.390672,-1.707368}, + {0.729568,-0.255314}, + {0.688398,0.539302}, + {-0.397821,0.236694}, + {-0.255357,0.443405}, + {1.355847,0.620758}, + {1.705390,0.158142}, + {1.290421,-0.602823}, + {-0.732108,-0.318124}, + {0.541361,0.046519}, + {-0.502741,-1.050050}, + {0.252136,-0.639033}, + {0.878938,0.856368}, + {-0.690850,1.354681}, + {0.104990,0.071316}, + {0.447853,-0.020789}, + {-0.009859,-0.006837}, + {-0.719030,0.285837}, + {-0.045532,1.180974}, + {-0.413249,-0.120820}, + {0.590697,0.086396}, + {-0.312210,0.058620}, + {0.038969,-0.080060}, + {0.668350,0.562553}, + {-0.339013,0.060135}, + {-0.907438,-0.823162}, + {-0.119806,-0.877603}, + {-0.478883,-0.143292}, + {-0.320699,0.212539}, + {0.100108,0.485710}, + {-0.392466,-0.806866}, + {0.001016,0.076458}, + {-0.592774,0.343524}, + {1.462533,-0.066516}, + {-0.569967,0.315363}, + {-0.481084,0.337295}, + {-0.087391,0.658159}, + {-0.302733,0.653680}, + {0.413127,0.535186}, + {-0.582368,0.582489}, + {1.018942,0.463516}, + {-0.061175,-0.350878}, + {-1.630071,-0.232123}, + {1.208054,0.322525}, + {0.230705,0.582932}, + {-0.217847,0.575781}, + {0.893442,0.630389}, + {-0.174874,0.390805}, + {0.956859,0.734961}, + {0.438679,0.368285}, + {1.409507,-0.272855}, + {-0.021050,0.944726}, + {-0.227605,-1.004858}, + {0.346623,0.582952}, + {0.576312,0.318435}, + {1.094793,-0.629266}, + {-1.088802,0.041459}, + {-0.500393,0.442719}, + {-0.271167,0.374385}, + {0.241921,0.418248}, + {-0.627281,-1.002708}, + {-1.147085,-0.423343}, + {0.728013,-0.479764}, + {0.055815,-0.515315}, + {0.496916,0.348340}, + {0.640592,-0.044396}, + {-0.823480,-0.081510}, + {-0.658153,0.363340}, + {0.549048,0.679255}, + {0.379224,0.498001}, + {0.531963,0.993990}, + {0.503592,0.389701}, + {-0.354800,0.131830}, + {0.447769,-0.726391}, + {-0.226749,0.070274}, + {1.525876,0.048507}, + {0.423583,0.515601}, + {0.281501,0.333000}, + {-0.581471,-0.653560}, + {0.356261,0.210534}, + {-1.831239,-2.179264}, + {-0.207313,2.443682}, + {0.581231,0.219500}, + {0.244048,-0.433631}, + {0.234179,-0.519635}, + {0.321517,-0.667325}, + {0.331807,0.023669}, + {0.150836,0.951006}, + {0.850205,-0.427679}, + {-0.266342,0.492303}, + {0.421612,-0.671137}, + {0.097019,-0.343781}, + {0.353095,0.071768}, + {0.399844,1.140014}, + {-0.092161,0.421038}, + {0.951596,0.997798}, + {0.233831,-0.888818}, + {-0.914231,0.468451}, + {-0.320417,0.768939}, + {0.010017,-0.067670}, + {-0.641204,0.499319}, + {0.464514,-0.342039}, + {0.806917,0.412848}, + {-0.389667,-0.723328}, + {1.504390,-0.862004}, + {-0.077352,-0.895115}, + {-0.618964,0.190222}, + {0.301279,0.239691}, + {-1.242100,0.120618}, + {0.930139,0.521412}, + {0.529753,-0.277023}, + {-0.884634,-0.158847}, + {0.636505,-0.971609}, + {-0.835765,0.991747}, + {0.277340,-0.861971}, + {1.021073,1.142868}, + {-0.705786,0.603524}, + {0.156000,-0.793177}, + {0.066289,-0.265637}, + {-1.395549,-0.477809}, + {-0.398661,0.403177}, + {-0.459976,-0.843605}, + {0.984018,-0.852629}, + {0.218633,-0.126745}, + {-0.282519,0.221063}, + {-0.030076,0.666546}, + {-0.069338,0.189674}, + {0.437178,0.500713}, + {0.391939,0.145078}, + {-1.572762,0.700506}, + {-1.015432,0.377474}, + {-0.840338,0.937558}, + {0.342004,0.167650}, + {-0.060252,0.117581}, + {0.472117,0.635502}, + {0.104385,-0.161998}, + {1.188391,-1.588144}, + {-1.256569,-0.943382}, + {-1.338045,-1.795011}, + {0.423467,-0.663819}, + {0.202217,0.684588}, + {0.233240,1.011311}, + {-0.758494,0.433929}, + {0.926118,-0.054441}, + {0.564314,-0.974460}, + {0.726559,-1.559723}, + {-0.541272,-0.563339}, + {0.749341,-0.459923}, + {-0.592150,-0.292360}, + {-1.425995,-1.199563}, + {0.630984,0.173879}, + {-0.496013,0.849446}, + {0.730005,-0.623744}, + {0.339948,0.700938}, + {0.318261,-1.431390}, + {0.179177,-0.081351}, + {0.422595,0.110693}, + {0.525183,-0.014276}, + {0.791773,-0.477120}, + {0.337622,-0.907080}, + {-0.961643,0.350677}, + {-0.419235,0.114661}, + {-0.036426,-0.074521}, + {-0.851223,0.150299}, + {-1.402542,-0.652643}, + {-0.444904,0.206768}, + {0.649220,0.699797}, + {0.159030,0.332804}, + {0.252170,-0.574764}, + {0.214542,-0.070060}, + {0.672585,-0.214337}, + {0.317019,0.014172}, + {-0.760543,0.267257}, + {1.642791,0.243831}, + {-1.046533,-0.098091}, + {-0.043117,0.019885}, + {0.017252,-1.446676}, + {0.264861,0.685846}, + {0.517324,0.010126}, + {0.343672,0.470516}, + {0.031183,0.226200}, + {-0.069854,-0.562667}, + {0.527272,0.532637}, + {-0.858228,0.534935}, + {0.364460,0.740142}, + {-0.140402,-0.483472}, + {0.017139,0.061624}, + {-0.294724,1.396053}, + {-0.540405,-0.124744}, + {-0.216948,-0.080703}, + {0.142776,-0.316044}, + {-0.253452,-0.078581}, + {-0.025665,0.377449}, + {0.170569,0.657816}, + {0.558146,0.230644}, + {-0.811005,0.844136}, + {1.274885,-0.602096}, + {-0.256525,0.339416}, + {-0.445608,-0.526104}, + {-0.679020,-0.428087}, + {-0.585500,0.611806}, + {0.321104,1.015454}, + {0.088048,0.254566}, + {-0.194493,-0.085023}, + {0.235160,0.956288}, + {0.814722,0.247546}, + {-0.785712,0.033330}, + {1.303812,-0.323498}, + {0.900592,0.189877}, + {0.557885,-0.981445}, + {0.472523,0.784359}, + {0.761798,-0.989764}, + {0.391552,0.560236}, + {0.697718,-0.307289}, + {-0.302544,0.328754}, + {-1.050820,-0.691314}, + {-0.647732,-0.054507}, + {0.021808,0.443342}, + {-1.449923,-0.824803}, + {0.190423,-0.098085}, + {0.631746,-0.468679}, + {0.040293,-1.576056}, + {-0.372698,0.455461}, + {0.220583,0.009939}, + {-0.270850,-0.097216}, + {-0.505603,0.942481}, + {-0.821008,0.456088}, + {-0.903589,-0.879087}, + {-1.037097,0.467356}, + {-0.106833,1.072424}, + {0.863947,0.585468}, + {0.005151,0.434652}, + {-0.400947,-1.251142}, + {0.189981,0.404356}, + {-0.285439,0.379628}, + {0.087294,-0.869496}, + {-0.192137,0.869642}, + {-0.692827,-0.385168}, + {-0.562495,0.217508}, + {0.542657,-0.510556}, + {0.464191,-0.475241}, + {-0.360873,0.439250}, + {0.855123,0.200659}, + {-0.610447,0.408358}, + {0.908977,1.265472}, + {0.594758,-1.492478}, + {0.029868,-0.283152}, + {-0.742647,-0.959861}, + {-1.058543,-0.718420}, + {0.030062,0.074846}, + {0.484401,-1.125483}, + {-0.284086,0.159763}, + {-1.080775,-0.140955}, + {-0.174126,-0.086363}, + {0.739286,-0.217804}, + {0.141377,-0.665255}, + {0.920503,-0.318352}, + {0.312659,0.743913}, + {0.276399,0.154918}, + {0.663342,-0.243720}, + {0.208475,1.070727}, + {1.547443,-0.539637}, + {-0.480355,-0.378719}, + {-0.286722,-0.944048}, + {-0.939835,0.257670}, + {-0.970612,-0.234679}, + {-0.869842,1.134333}, + {0.129012,-1.323594}, + {-0.847059,0.612807}, + {0.143607,0.167211}, + {-0.644289,-0.020060}, + {0.597720,-0.525289}, + {0.344575,0.696561}, + {0.032192,-0.316594}, + {-0.527359,0.248141}, + {0.057843,-1.004926}, + {0.174263,-0.084976}, + {-0.103775,-0.357881}, + {0.591409,0.244348}, + {-1.185070,-0.186006}, + {0.643666,0.679958}, + {-0.560183,-0.180895}, + {-0.730927,0.972640}, + {0.414448,-0.245573}, + {-0.715735,-0.063948}, + {0.602288,-0.368285}, + {-0.595310,-0.096140}, + {0.154414,-0.239226}, + {-0.643521,-1.322612}, + {-0.372893,0.644678}, + {-0.871536,-1.116017}, + {-0.355362,-0.495611}, + {0.807998,-0.506884}, + {-1.512365,1.149375}, + {-0.663902,-0.483402}, + {-0.027985,0.740126}, + {-0.627528,0.621482}, + {0.273277,0.398212}, + {0.646616,1.375140}, + {-0.691492,1.019221}, + {0.666217,0.443858}, + {0.695471,0.183591}, + {-0.505856,-0.531083}, + {0.770952,0.230695}, + {-0.598738,0.451612}, + {0.301636,-1.123508}, + {0.345123,-0.300982}, + {-0.371200,0.114885}, + {0.040179,0.024051}, + {-0.193750,0.538700}, + {-0.540208,0.170493}, + {-0.732932,-0.668738}, + {-1.222816,0.434783}, + {0.056403,0.263628}, + {0.248752,1.012811}, + {-0.511117,-0.049178}, + {-0.044573,-0.975817}, + {0.398627,0.462711}, + {-0.260856,-0.068978}, + {-0.280710,-0.321223}, + {-1.899199,-1.720357}, + {-0.214145,0.610662}, + {0.860637,-0.542982}, + {1.479895,0.512347}, + {-0.634684,-0.205669}, + {-0.774042,0.960716}, + {0.254752,-0.070188}, + {0.048949,0.072511}, + {-0.076806,0.217678}, + {-0.398325,0.011892}, + {0.947991,0.795319}, + {1.507949,-0.647927}, + {-0.067973,0.815859}, + {0.021869,-1.330399}, + {0.260440,-0.736693}, + {0.047665,1.669888}, + {0.051714,-0.750557}, + {0.461558,0.446945}, + {1.025170,0.357000}, + {0.045956,-0.325779}, + {-0.173120,0.700485}, + {0.536135,-0.477065}, + {0.128767,-0.204009}, + {-0.760650,-1.142806}, + {0.136669,-1.190282}, + {0.497392,-1.408788}, + {-0.148019,0.206583}, + {-0.501879,-0.488139}, + {0.009399,-0.681400}, + {0.701198,-0.538127}, + {0.180453,0.485088}, + {-0.265001,0.156447}, + {-0.640031,0.482786}, + {-0.518979,-0.541837}, + {-0.032891,-0.430068}, + {-0.461893,-0.277698}, + {0.262606,0.260080}, + {0.041808,-0.123995}, + {-0.440511,0.223938}, + {-0.106192,-1.594211}, + {-0.418230,0.723012}, + {0.073327,-0.112584}, + {-0.418561,-0.692791}, + {0.368207,0.185128}, + {0.168326,0.239815}, + {0.114983,-0.779877}, + {-0.513697,-0.218598}, + {-0.509730,-1.001503}, + {-0.257517,0.486916}, + {-0.939828,0.965026}, + {-1.454300,-0.203483}, + {-0.492785,-0.713430}, + {0.301437,-0.797414}, + {0.238702,-0.386490}, + {-0.944933,0.181264}, + {0.443444,1.104281}, + {0.703275,-1.091732}, + {-0.739420,0.369381}, + {-0.541723,0.306867}, + {-0.421282,-0.067401}, + {-0.359663,-0.430076}, + {-0.365976,-0.386311}, + {-1.235840,-0.744903}, + {-0.582278,0.165135}, + {0.258208,0.795858}, + {0.656751,-0.199973}, + {-0.661437,-1.236283}, + {-0.183853,0.537246}, + {-0.698045,0.604539}, + {-0.705045,0.847084}, + {-1.459402,0.628008}, + {0.692337,1.236132}, + {-0.260324,0.599788}, + {-0.010288,-0.048783}, + {0.066315,0.077396}, + {0.258401,-1.300776}, + {-0.606507,0.626366}, + {0.918692,0.313908}, + {0.301100,0.600185}, + {0.756285,-0.134042}, + {0.419008,0.068592}, + {0.678707,0.297421}, + {-0.762643,0.544065}, + {0.811504,0.550301}, + {-0.128498,0.753596}, + {-0.506348,-0.102907}, + {-0.361289,-0.120066}, + {0.772548,0.007574}, + {-0.403729,0.699871}, + {0.438742,2.197012}, + {-1.157543,-0.354945}, + {0.220848,0.508695}, + {0.354803,-0.410951}, + {1.084506,0.972850}, + {0.092344,1.433922}, + {0.506397,0.385787}, + {1.217549,0.293367}, + {-0.334559,-0.101333}, + {-0.406466,-0.023401}, + {0.356600,-1.141455}, + {-0.011750,0.287641}, + {-0.050458,0.686041}, + {-1.213470,0.430009}, + {0.551580,-0.801972}, + {0.065996,-0.224313}, + {0.281099,-1.068458}, + {-0.096408,0.757440}, + {1.583368,0.056612}, + {0.087061,0.328131}, + {-0.394441,-1.372195}, + {0.512555,-0.342829}, + {-0.073289,-0.416035}, + {0.913218,-1.088553}, + {-0.698006,0.235712}, + {-0.230038,-0.514247}, + {-0.040607,-0.916763}, + {0.632154,-0.540679}, + {-0.887651,-1.009355}, + {-0.632470,-1.022231}, + {0.190182,1.032801}, + {-0.027089,0.692375}, + {-0.675473,0.192100}, + {-1.255069,0.423638}, + {-0.195848,0.109171}, + {0.292869,-1.505548}, + {0.515116,-0.182036}, + {-0.690289,0.288317}, + {1.434559,-0.687078}, + {-0.461406,-1.224466}, + {-0.374814,0.354303}, + {0.616066,0.664220}, + {-0.312574,-0.753793}, + {-0.010131,0.316177}, + {0.677541,-0.304399}, + {0.362407,-0.542312}, + {0.421985,-0.426462}, + {1.074806,0.427175}, + {0.714370,-0.383605}, + {0.981694,-0.101514}, + {-0.580749,0.366888}, + {0.150148,1.272927}, + {0.102605,1.472671}, + {0.133743,-0.162327}, + {0.098048,0.154761}, + {0.138915,0.424027}, + {-0.068587,-0.269135}, + {0.151768,-0.574258}, + {0.705147,0.504406}, + {-0.199471,-0.747309}, + {0.660886,1.191666}, + {-0.434080,0.337494}, + {0.065750,-1.195325}, + {-0.022976,0.447841}, + {0.105985,0.089817}, + {-0.084156,-0.318798}, + {0.072991,-0.327037}, + {-0.128438,0.126156}, + {-0.405562,-0.076535}, + {-0.426691,-0.173649}, + {-1.860770,-0.948092}, + {-0.127870,-0.262563}, + {-1.138050,-0.096580}, + {0.370414,-1.870972}, + {-0.169835,0.059237}, + {0.107617,0.823066}, + {-1.055285,-0.282586}, + {-1.207492,0.630350}, + {0.199582,0.096160}, + {0.726497,0.068093}, + {-0.532842,-0.156855}, + {1.093617,0.601716}, + {-1.528594,-0.081629}, + {-0.210981,-0.742901}, + {0.320628,-1.275187}, + {-0.959229,-1.040017}, + {-0.435513,-1.345417}, + {0.883669,0.681837}, + {-1.529650,-0.446392}, + {-0.720045,1.701187}, + {-1.098947,0.930781}, + {-0.652223,-0.676971}, + {0.540277,0.620405}, + {-0.084783,-0.516229}, + {-0.645938,-0.752328}, + {0.592236,-0.445923}, + {0.987580,-0.654351}, + {0.631582,-0.687112}, + {-0.747723,-0.216685}, + {-0.242519,0.244150}, + {-0.503676,-0.402645}, + {-1.298327,1.084137}, + {-0.362467,0.491899}, + {-0.033132,-0.268392}, + {-0.126278,0.423416}, + {-1.031263,-0.085027}, + {0.243811,-0.366720}, + {0.639498,0.129467}, + {-0.335136,1.108368}, + {-0.512740,1.873530}, + {0.643081,0.099739}, + {-0.255082,0.612374}, + {-0.175646,0.130710}, + {0.108781,1.292291}, + {-0.614601,0.259555}, + {0.168058,0.048234}, + {-0.574672,0.318310}, + {-0.216721,-0.336900}, + {-0.005054,0.439731}, + {-0.850990,0.370968}, + {-0.067698,0.383192}, + {0.383593,-0.525092}, + {-0.061197,0.459613}, + {1.361076,-0.818933}, + {-0.505306,-0.543337}, + {0.635340,-0.050133}, + {-1.114203,0.161483}, + {-0.176448,-0.346756}, + {0.120352,0.445743}, + {-0.245858,-0.834506}, + {-0.920717,0.600234}, + {-0.297926,0.695282}, + {1.293254,0.324459}, + {-0.963549,0.214107}, + {0.291750,0.306301}, + {-0.020635,-0.108404}, + {-0.625249,0.393424}, + {-0.678041,-0.306473}, + {1.267072,-0.004506}, + {0.022893,0.861164}, + {-0.623908,0.323349}, + {0.368754,0.620841}, + {-0.528447,-0.141905}, + {0.088043,1.543236}, + {-0.899354,-0.855242}, + {-0.026557,-0.453395}, + {0.027462,1.047341}, + {0.769418,-1.229816}, + {1.440973,-0.699249}, + {0.073809,-0.849225}, + {0.260617,-0.050471}, + {-0.343781,-0.188150}, + {0.196896,0.184787}, + {0.186939,-0.670752}, + {0.922055,1.559028}, + {0.501239,-0.571159}, + {-0.501999,0.117773}, + {-0.919095,0.778399}, + {0.351764,-0.823198}, + {0.148608,0.329635}, + {1.115657,-0.601348}, + {-0.356139,-0.377287}, + {0.082008,-0.934193}, + {0.413781,-0.481072}, + {0.159484,0.219529}, + {0.769932,-0.473240}, + {-0.127988,-0.380868}, + {0.633024,-0.074308}, + {0.422594,-1.072281}, + {-0.962782,0.898361}, + {0.606030,-0.243257}, + {0.060875,-0.778985}, + {-0.615502,0.659961}, + {0.690715,-0.017834}, + {0.475395,-0.359472}, + {-0.974448,-0.511066}, + {0.692056,-0.796830}, + {0.464684,-0.250498}, + {-0.473990,0.157603}, + {-0.221502,-0.380543}, + {0.776700,0.874519}, + {0.278098,-0.390918}, + {-0.020204,0.129496}, + {-0.492732,-1.203373}, + {-0.192923,0.392172}, + {-0.456686,-1.096002}, + {0.225734,-0.338651}, + {-0.423440,-0.151675}, + {0.047326,0.697747}, + {-1.402831,0.389770}, + {-0.481669,-0.607328}, + {0.707638,-0.420784}, + {-0.585504,0.372906}, + {0.884026,0.946783}, + {-0.890221,-0.123712}, + {-0.946448,-1.331909}, + {-0.161589,0.672376}, + {-0.428532,0.326757}, + {-0.478465,-0.457691}, + {-0.054022,1.405670}, + {-0.333135,0.375169}, + {-0.372505,0.854525}, + {1.535750,0.415969}, + {0.295118,-0.716003}, + {-0.336206,-0.196896}, + {0.743605,0.229018}, + {0.792000,-1.768616}, + {-1.354626,0.963126}, + {-1.405782,0.680236}, + {-0.237975,-0.000923}, + {-0.690345,-1.003080}, + {-1.313895,-0.033107}, + {-0.614969,0.864382}, + {0.990158,1.112463}, + {-1.001071,-0.634240}, + {0.594301,0.062948}, + {-0.534023,0.563650}, + {0.605461,-0.096271}, + {0.236832,-0.313801}, + {-0.493347,-0.201958}, + {-0.520262,-0.387792}, + {-0.912513,-1.199020}, + {-0.129950,-0.310796}, + {-0.541204,-0.716691}, + {-0.081170,0.596112}, + {0.737798,1.145168}, + {-0.928121,-0.998200}, + {0.669610,1.145227}, + {0.832308,0.318849}, + {-0.039104,-0.614171}, + {0.755613,-0.876583}, + {-1.016801,0.001975}, + {-0.050756,0.076366}, + {0.630505,-0.239083}, + {0.197191,-0.747906}, + {-0.372266,-0.592826}, + {-1.529025,0.438443}, + {-0.412525,-0.849941}, + {0.829853,0.127465}, + {0.283020,0.119718}, + {1.891486,-0.325311}, + {-0.585484,-0.410801}, + {0.059833,-0.092511}, + {-0.831938,-0.638384}, + {-0.235357,0.183885}, + {-0.347581,-1.189650}, + {0.014281,-0.758982}, + {0.350777,-0.963252}, + {-0.065657,-0.156335}, + {-0.165794,0.022285}, + {0.747007,-0.478210}, + {0.567832,-0.106546}, + {0.396140,0.016729}, + {-0.272671,0.066605}, + {1.376385,0.510745}, + {-0.060046,0.644132}, + {0.775174,-0.161923}, + {0.685821,0.001454}, + {-1.561711,0.881058}, + {1.787424,-0.058002}, + {0.336836,-0.858057}, + {-0.331450,-0.740409}, + {-2.109117,0.353266}, + {-0.216311,0.071157}, + {0.114973,-0.504866}, + {-0.622727,-0.587637}, + {-1.153190,0.816906}, + {-1.426416,1.516651}, + {-1.307579,0.228991}, + {-0.770577,-0.045774}, + {0.372744,0.808508}, + {0.120187,-0.103078}, + {-0.195718,-0.374301}, + {1.075698,1.295923}, + {-0.361592,-0.873742}, + {-0.418061,-1.279100}, + {0.784779,-1.675948}, + {1.268633,-0.865789}, + {-0.519273,0.090093}, + {-0.262722,-0.402864}, + {-0.951638,0.084945}, + {-0.355352,-0.351439}, + {0.285010,0.056406}, + {-0.950448,-0.397773}, + {-0.464651,0.160215}, + {1.109933,-0.480592}, + {-1.419546,1.158028}, + {0.905718,0.111670}, + {-0.237821,0.135966}, + {-1.259691,0.323498}, + {-0.470925,-0.541165}, + {0.102619,-0.372763}, + {-0.712979,-0.457720}, + {0.970056,0.171370}, + {-1.135346,-0.461788}, + {-0.633181,1.008828}, + {1.176038,-1.068340}, + {0.500422,-0.673381}, + {0.894371,-0.164669}, + {0.483704,0.314087}, + {-1.188251,-0.842904}, + {-0.157257,0.172253}, + {-0.898239,0.677601}, + {-0.279064,-1.615232}, + {-0.992485,0.177739}, + {-0.476199,-0.218263}, + {-0.132737,1.169939}, + {-1.302813,0.651199}, + {-0.310092,0.900820}, + {0.049591,-0.876856}, + {-0.107885,-0.364864}, + {-0.126501,-0.848695}, + {1.113648,0.511673}, + {0.264047,0.194513}, + {-0.056919,0.273691}, + {0.703939,-0.054764}, + {-1.272536,-0.341796}, + {-0.119178,-0.654156}, + {0.132597,-0.130565}, + {0.899426,0.459049}, + {-0.391768,-1.166623}, + {-0.225483,-0.557438}, + {-0.167593,0.661089}, + {-1.659540,-0.002336}, + {0.794658,0.033512}, + {-1.069324,0.241018}, + {-0.918777,1.380683}, + {0.332766,0.468339}, + {1.686444,-0.943082}, + {-0.547574,-0.948940}, + {0.030771,0.036540}, + {-0.833640,-1.376152}, + {-1.243536,0.371659}, + {-0.237937,-0.425704}, + {0.259845,1.519797}, + {-0.911238,-0.668074}, + {-0.013456,0.176795}, + {-0.882968,-0.341753}, + {0.854397,0.383916}, + {0.235472,0.285590}, + {-0.359982,0.097074}, + {-0.131102,-1.300127}, + {0.266605,0.174879}, + {-0.294888,0.138128}, + {-0.108081,0.172793}, + {-0.478603,-0.057927}, + {-0.712859,1.038960}, + {0.209788,0.449368}, + {0.387551,-0.640651}, + {0.003760,-0.340271}, + {-0.061907,0.617510}, + {0.392158,-0.953156}, + {0.726593,-0.189035}, + {0.597882,-0.274553}, + {0.666026,0.048594}, + {0.284210,0.946907}, + {0.305420,0.165142}, + {0.404228,0.231668}, + {-0.017939,-1.142982}, + {1.139064,-0.458041}, + {-0.819369,0.895217}, + {-0.047318,0.285829}, + {-0.568780,-0.190502}, + {-0.606370,-0.099547}, + {1.424332,0.802029}, + {-0.821119,0.250209}, + {-1.376602,1.326391}, + {-1.098387,1.606694}, + {0.496951,-0.357961}, + {0.210738,0.046687}, + {0.369485,-0.157254}, + {-0.544895,-0.402399}, + {-0.882763,-0.055791}, + {-0.357232,0.166177}, + {-0.615774,-0.069649}, + {-0.767183,-0.112721}, + {0.375762,-0.020422}, + {-0.098314,0.398756}, + {0.176510,0.550347}, + {1.200922,-0.003930}, + {1.325052,-0.313705}, + {-0.150081,1.250977}, + {2.057610,0.216751}, + {-0.238246,0.229506}, + {0.857400,-0.572607}, + {-0.562334,1.100413}, + {0.384247,-1.554662}, + {0.067540,0.515121}, + {1.340051,-0.351801}, + {-0.422137,-0.315044}, + {0.860255,-0.025928}, + {-0.499608,-0.491812}, + {-0.466429,-1.328300}, + {-0.323761,0.241738}, + {0.393656,-0.847954}, + {0.459800,1.193975}, + {0.310703,-0.636093}, + {-0.445585,0.424384}, + {0.846073,0.364936}, + {-0.259331,-0.399480}, + {0.436216,-0.067255}, + {-0.733748,-0.699265}, + {0.324053,1.497643}, + {0.615826,0.748861}, + {1.193295,-1.242813}, + {-0.466988,0.156967}, + {0.611477,0.193048}, + {-0.055928,-0.158672}, + {0.975226,-0.459924}, + {-0.655781,-0.693858}, + {1.324562,-0.668467}, + {0.864872,-2.109563}, + {0.717141,-0.626098}, + {-1.302740,0.096267}, + {1.116621,-0.009268}, + {0.100593,1.267514}, + {0.425933,-0.009823}, + {-0.173129,-0.174238}, + {0.153032,0.109386}, + {-0.318603,0.546064}, + {0.289912,0.429496}, + {0.155977,0.603650}, + {-0.776808,0.920140}, + {-0.878454,-0.082128}, + {0.608451,1.174464}, + {0.353067,-0.103951}, + {-0.452806,0.168395}, + {1.339559,0.439086}, + {-0.020182,-1.321645}, + {0.118079,-0.311166}, + {-0.272936,0.134373}, + {0.373963,-1.299783}, + {0.054969,0.261178}, + {-0.239239,-0.615398}, + {-1.001020,-1.146200}, + {0.449862,-1.228006}, + {0.323008,0.572236}, + {-1.653429,0.189960}, + {-1.049711,-0.245348}, + {0.976135,0.169753}, + {0.706318,-0.614142}, + {1.130571,1.122720}, + {-0.180019,-0.492531}, + {0.585209,-0.465400}, + {-0.786602,0.685904}, + {0.096573,0.109326}, + {-0.141775,-0.749653}, + {-0.059186,-0.316195}, + {-1.462725,-1.202917}, + {-1.236354,0.418481}, + {0.151833,0.157247}, + {0.691259,0.080574}, + {0.483058,-1.638888}, + {0.128021,1.112820}, + {-0.191649,1.303981}, + {-0.086171,-1.095404}, + {-0.568276,0.304373}, + {2.181999,-0.551641}, + {-1.035423,-0.289490}, + {0.155008,-0.150995}, + {-1.103950,-1.857698}, + {-0.668989,-0.467956}, + {-0.185524,0.446566}, + {-0.643301,-0.258359}, + {0.087981,-0.547687}, + {-0.516929,0.605263}, + {0.342129,0.093293}, + {2.011109,0.019105}, + {0.363808,0.781133}, + {-1.536479,1.337943}, + {0.435211,-0.631518}, + {-0.556866,-0.694405}, + {1.114228,-0.174913}, + {0.538381,-0.752450}, + {0.550732,-0.407947}, + {0.022731,-0.085540}, + {0.188773,0.308336}, + {0.487134,-0.164736}, + {0.186646,1.139253}, + {0.045252,-1.157604}, + {1.084051,-0.890305}, + {0.619163,-0.150592}, + {0.354104,0.841673}, + {0.229173,-2.117542}, + {-0.396302,-0.148405}, + {-0.233108,0.645852}, + {-0.409376,0.680217}, + {0.561133,-1.591081}, + {0.132287,1.114235}, + {-0.167495,-0.729692}, + {-0.563572,-1.003719}, + {-1.407809,0.049666}, + {0.259140,-1.152104}, + {0.876016,0.966907}, + {1.109627,0.127202}, + {0.900875,0.161930}, + {-0.239223,-0.745766}, + {-0.049711,-0.106964}, + {-1.172386,1.606319}, + {1.580091,-0.165441}, + {-0.105897,0.096532}, + {0.514744,-0.441290}, + {-0.410128,1.642280}, + {1.025580,-0.241450}, + {0.570167,0.040530}, + {0.871560,-0.323875}, + {-0.234388,-1.244179}, + {0.675376,0.964659}, + {0.374233,0.149805}, + {-0.789252,1.310412}, + {-0.284409,1.148222}, + {-0.660847,0.363166}, + {0.782152,0.454305}, + {0.172868,0.088907}, + {-0.278771,0.023603}, + {0.293272,0.372982}, + {0.311987,0.322549}, + {0.606624,0.527143}, + {0.192137,0.430538}, + {-0.324541,0.343529}, + {-0.158355,0.734556}, + {-0.137073,-0.403531}, + {-0.250048,0.162757}, + {0.447298,0.471529}, + {-0.874570,-0.929687}, + {0.556881,0.694617}, + {0.202336,0.104962}, + {-1.529270,0.384855}, + {0.164846,-0.749040}, + {-0.712317,-0.291645}, + {-0.649720,-0.482616}, + {-0.157974,0.405484}, + {0.057860,0.996968}, + {0.618568,-0.192818}, + {-0.569099,0.526239}, + {0.535368,-2.569703}, + {0.287562,-0.200457}, + {-0.774001,-0.447806}, + {-0.677427,0.757377}, + {0.440255,1.722018}, + {0.221734,0.363236}, + {-1.142799,0.246628}, + {-0.000987,0.084137}, + {0.177699,-0.161609}, + {0.219112,0.145815}, + {1.192557,-0.513284}, + {-1.063099,-0.407821}, + {0.344825,0.059121}, + {0.324140,-1.340732}, + {-0.385376,0.564923}, + {1.112126,0.068623}, + {1.217525,-0.793810}, + {-0.173809,0.211866}, + {0.008904,0.344939}, + {-0.551659,-0.020264}, + {0.409603,0.130882}, + {-0.460838,0.011734}, + {0.767436,-0.389044}, + {-0.317004,1.030325}, + {0.765716,1.202983}, + {-0.899111,-0.543610}, + {-0.281986,-0.684544}, + {-0.364272,0.091067}, + {-0.944820,0.735864}, + {-0.473074,0.236066}, + {0.590428,-0.001307}, + {0.902710,0.060698}, + {-0.479309,0.186699}, + {-0.622708,0.120223}, + {-0.552450,-0.012236}, + {0.431918,1.303160}, + {0.050594,-0.525912}, + {0.362519,0.624894}, + {-0.941750,0.479853}, + {-0.146931,-0.166574}, + {-0.222338,-0.578684}, + {0.516931,0.696953}, + {-0.950476,0.567101}, + {0.021004,0.707791}, + {1.023076,1.585372}, + {-0.379172,-0.455007}, + {0.999678,-1.125859}, + {1.112727,1.119853}, + {-1.229585,-0.372180}, + {0.485929,1.072664}, + {-0.533969,-0.058251}, + {-0.780870,-0.083022}, + {0.197475,-0.090851}, + {0.869964,-0.537793}, + {0.041044,0.400725}, + {0.337632,0.010040}, + {0.995867,-0.413684}, + {-0.197465,-0.816039}, + {0.113805,1.162790}, + {-0.869838,0.460479}, + {-0.720627,0.136898}, + {-0.555949,0.348150}, + {-1.010460,0.876235}, + {0.288385,0.442596}, + {0.628015,0.092587}, + {1.017268,1.102030}, + {0.136902,0.765530}, + {-1.074543,-0.048865}, + {-1.177793,-0.693738}, + {0.527523,0.145117}, + {-0.760523,0.203876}, + {0.938313,1.041252}, + {0.539914,-0.157041}, + {-0.572504,-0.177670}, + {-0.180789,-0.215865}, + {0.138948,-0.228659}, + {-0.294927,-0.979739}, + {-0.295661,-1.044591}, + {0.151225,-1.389272}, + {-0.756423,-0.423643}, + {-0.061934,-0.301791}, + {-0.270853,-0.240812}, + {-0.803715,0.821259}, + {-0.697601,0.617383}, + {0.289209,-0.053389}, + {-0.896823,0.262431}, + {-0.295344,-0.261914}, + {0.058281,0.044589}, + {-1.008325,0.176720}, + {0.175546,-0.335204}, + {0.631611,-0.600731}, + {-0.433719,-1.128985}, + {-0.409720,-0.312795}, + {0.323113,0.261763}, + {0.036730,0.115460}, + {0.059806,0.466118}, + {-0.435466,0.810298}, + {1.362624,-0.053060}, + {0.017303,0.016551}, + {-0.831908,-0.085054}, + {-0.047121,-1.210964}, + {-0.492066,0.242858}, + {0.390794,0.069634}, + {0.814141,-0.385739}, + {0.000600,1.161953}, + {-0.825328,-1.076807}, + {-0.137587,-0.380351}, + {-1.033185,0.376119}, + {-0.942623,0.986463}, + {-0.615904,0.634404}, + {0.405671,0.449572}, + {-0.610933,0.735977}, + {-0.318879,0.163802}, + {-0.507174,-0.284257}, + {0.727653,-0.764991}, + {0.553744,0.406244}, + {0.109977,-0.425145}, + {0.007260,0.694717}, + {-0.589111,-0.324782}, + {1.296184,-0.280316}, + {0.273412,-0.063905}, + {0.628945,0.335630}, + {-0.149412,-0.710817}, + {1.448227,-0.686517}, + {0.812279,1.204193}, + {-0.323526,0.612276}, + {1.317114,-0.397886}, + {-0.905302,-0.684715}, + {-0.018889,0.460583}, + {0.413307,0.079909}, + {0.196694,-0.264636}, + {0.237990,0.380848}, + {1.110570,0.186631}, + {1.100941,0.944369}, + {-0.268469,-0.372955}, + {0.654447,-1.005281}, + {-0.867087,0.494783}, + {-0.307357,0.224308}, + {1.126564,-0.447765}, + {-1.441809,-0.432263}, + {0.829316,-0.254776}, + {0.276601,0.028482}, + {0.321513,0.477089}, + {-0.326903,-0.065775}, + {0.181178,0.425015}, + {-0.021201,-0.632189}, + {0.196787,-0.270172}, + {0.482211,0.760539}, + {-0.021529,0.350678}, + {0.538731,0.792097}, + {-0.792762,-1.073304}, + {0.269102,0.466839}, + {-0.457873,-0.267988}, + {-1.086786,-1.382579}, + {-0.902461,-0.333688}, + {1.449862,0.549708}, + {1.103982,-0.815866}, + {-0.331610,-0.126280}, + {-0.434605,-0.574026}, + {-0.564428,0.451053}, + {1.065076,-0.142613}, + {-1.067355,-0.781069}, + {0.415735,0.395771}, + {-0.257126,-0.498318}, + {0.229113,-0.904408}, + {0.475347,0.932772}, + {-0.126197,-0.312728}, + {0.015972,1.513573}, + {0.072260,-0.478380}, + {0.199441,-1.515994}, + {0.801702,-0.148107}, + {0.732459,-0.716389}, + {-1.055474,0.377686}, + {0.882117,-0.319396}, + {-0.389893,0.614071}, + {-0.426814,0.453146}, + {-1.280709,0.307466}, + {0.465162,-0.568253}, + {-0.105649,0.264185}, + {0.207625,0.360816}, + {-1.212366,0.121881}, + {0.229992,-0.215450}, + {0.416004,-0.583465}, + {0.716912,-0.118409}, + {0.096084,-0.512867}, + {0.186247,0.032560}, + {0.028022,-0.556780}, + {1.150752,-0.299593}, + {-1.619091,-0.453159}, + {-0.212540,-1.038386}, + {0.255212,-0.885610}, + {-0.279565,0.220245}, + {-0.933030,1.702921}, + {1.098960,-0.501176}, + {0.621376,-0.194441}, + {-0.046707,-0.191768}, + {0.820383,-1.152666}, + {-0.625110,1.133264}, + {0.136433,-0.774816}, + {0.450809,-0.089682}, + {-2.456335,0.966943}, + {0.912559,-0.737705}, + {-0.981240,-0.672716}, + {-0.364111,-0.695029}, + {-0.339351,1.566577}, + {-1.639069,1.051843}, + {0.305872,0.958157}, + {-0.506132,0.126778}, + {0.213442,0.269895}, + {0.219518,0.742494}, + {0.850854,0.816322}, + {0.239080,0.545993}, + {-0.092504,0.731571}, + {0.440567,-1.122125}, + {0.610520,-0.413122}, + {-0.578101,-0.718322}, + {-0.222974,1.427200}, + {0.545492,-0.056598}, + {0.627889,1.317222}, + {-0.048461,-0.116290}, + {-0.394290,-0.229413}, + {-0.462502,-0.045762}, + {-0.200809,0.574322}, + {0.339283,-0.584942}, + {-0.393629,1.095376}, + {-0.371673,-0.655765}, + {-0.260952,-0.654112}, + {1.083400,0.823028}, + {-0.952867,-0.473551}, + {-0.018485,0.260282}, + {0.387338,0.088609}, + {-0.988637,-0.394637}, + {-0.651919,-0.458630}, + {1.482098,0.311456}, + {0.617416,0.339357}, + {0.024986,-0.654472}, + {-0.633096,-1.253554}, + {0.316704,-1.543150}, + {-0.309558,-0.064486}, + {-0.027012,-1.213059}, + {0.155906,-0.785986}, + {-0.021507,-0.082515}, + {1.588522,-1.195031}, + {-0.385961,-0.717514}, + {0.813259,0.823171}, + {1.542545,-0.583962}, + {0.699293,1.152578}, + {-2.520775,-0.740568}, + {1.650931,0.444675}, + {-0.894331,-1.449709}, + {-0.606002,-0.786614}, + {0.612772,0.153705}, + {-0.921274,0.922913}, + {0.440139,0.658577}, + {-0.229417,0.728289}, + {1.547479,-2.279597}, + {-0.319338,-0.157973}, + {-1.461973,1.054925}, + {-0.679512,-0.422229}, + {-0.320076,-0.624900}, + {-0.272455,-0.652699}, + {-0.050571,-0.713983}, + {-0.389856,-0.423589}, + {-0.973979,0.062857}, + {1.550694,-0.360476}, + {0.159432,-0.127434}, + {-0.372704,0.494970}, + {0.300625,-0.256622}, + {-1.003412,0.402113}, + {-0.075613,-1.686128}, + {0.482382,-0.480330}, + {0.093242,-0.754616}, + {0.281740,0.184726}, + {-1.393960,-0.547393}, + {0.536805,-0.148686}, + {-0.465176,0.255458}, + {0.306821,0.035537}, + {0.559831,-0.109144}, + {-0.714140,0.108895}, + {0.217559,0.447498}, + {-0.314098,-0.724385}, + {-1.492888,-0.993242}, + {-0.428441,-0.227405}, + {0.188548,0.658179}, + {0.768091,1.556233}, + {-1.545457,-1.086941}, + {0.140440,0.092669}, + {0.537909,-0.495652}, + {0.332552,-0.612271}, + {-0.511223,-0.340514}, + {0.079385,-0.114250}, + {-1.463661,0.057599}, + {0.223999,0.976185}, + {-0.543545,0.027883}, + {0.979747,0.489620}, + {-1.192039,-0.798037}, + {0.730126,-0.056639}, + {-0.267151,0.693524}, + {0.558097,0.153657}, + {-0.696618,-1.338386}, + {-0.909832,-0.096288}, + {0.882699,0.742963}, + {-0.275874,-0.809979}, + {-0.053137,-0.168546}, + {-0.422878,-0.367399}, + {1.557298,0.459112}, + {0.246203,-1.167259}, + {-0.504330,-0.532256}, + {0.987550,-0.885807}, + {0.683296,-0.854008}, + {-0.999180,0.227098}, + {-0.668949,-0.025123}, + {0.025665,-0.317833}, + {1.113571,0.491572}, + {-0.168884,1.194192}, + {0.093188,-1.044563}, + {1.753660,-0.163939}, + {0.555963,-0.609948}, + {0.794400,0.059530}, + {-0.335538,1.145340}, + {-0.230857,-0.288830}, + {-0.449282,0.390382}, + {0.306169,0.184478}, + {-0.346556,-0.363817}, + {-0.831726,0.067839}, + {1.276276,-0.466759}, + {0.244800,0.473109}, + {-0.215391,-0.292773}, + {-0.273257,0.201723}, + {0.842924,-0.698762}, + {-0.729074,0.256315}, + {-1.456625,0.252573}, + {0.559147,-0.282695}, + {0.994685,0.128463}, + {0.300242,-0.524755}, + {0.229392,-0.252261}, + {-0.262222,1.375848}, + {-0.629900,0.580724}, + {-0.886522,0.229244}, + {0.175535,-0.159406}, + {-0.005415,0.158939}, + {0.950522,0.379940}, + {0.346992,0.559263}, + {-0.822353,0.315018}, + {1.106625,-0.737253}, + {-0.252764,-0.041978}, + {-0.652043,1.078668}, + {0.544128,-0.877090}, + {-0.435260,-0.777845}, + {-0.142025,0.692931}, + {-0.031940,-0.162408}, + {-0.737664,0.759069}, + {0.018416,-0.910539}, + {0.501767,0.015715}, + {-0.525217,-0.909641}, + {0.502059,1.002820}, + {0.550277,0.890858}, + {0.563253,-0.901443}, + {-0.482929,-0.468226}, + {0.459780,-1.053824}, + {0.679393,-0.444330}, + {-1.560609,0.500156}, + {0.326860,-0.233930}, + {0.014115,1.226398}, + {-0.841667,0.256632}, + {-0.986458,0.214088}, + {0.561778,-0.293625}, + {-0.166624,-0.623391}, + {0.072308,-1.647830}, + {0.261475,0.207571}, + {-0.439805,-0.515374}, + {-0.903760,0.247456}, + {-0.992315,-0.455678}, + {-0.736917,-0.314349}, + {-0.760237,-0.334644}, + {-0.808025,0.764268}, + {0.962557,-0.746572}, + {-0.497432,0.389293}, + {-0.627429,0.078673}, + {0.281879,-0.521353}, + {-0.041629,0.996509}, + {0.148478,-0.832781}, + {0.241113,0.180056}, + {0.427418,-1.070871}, + {-0.528049,-0.483790}, + {-0.523555,-0.270324}, + {-0.304426,-0.037406}, + {-0.137959,1.438044}, + {0.928138,-0.431107}, + {0.158206,0.475620}, + {0.290347,-0.571426}, + {0.518227,-0.212278}, + {1.434704,-0.008646}, + {0.870633,0.309615}, + {-0.408402,-0.358914}, + {-0.932732,1.867362}, + {-1.106557,0.682544}, + {0.700628,0.050873}, + {0.606759,0.318505}, + {1.100808,0.865530}, + {1.167061,0.859812}, + {-0.457106,0.360329}, + {-0.412289,0.264824}, + {0.121729,0.471512}, + {-1.263924,0.036896}, + {0.592224,-0.981550}, + {-1.358297,-1.589214}, + {0.370305,0.206402}, + {-0.033672,-0.610428}, + {0.084157,-1.167364}, + {-0.925039,0.239143}, + {0.529815,1.166401}, + {0.059166,0.526304}, + {-1.093501,1.010147}, + {1.095547,-0.668412}, + {-0.013464,-0.212740}, + {0.318854,0.079713}, + {-0.582878,0.209336}, + {0.654810,0.042878}, + {1.084759,0.085261}, + {-0.816288,0.517988}, + {-0.922044,-0.145496}, + {-0.413527,-0.094974}, + {0.921929,0.223829}, + {0.834340,-0.632027}, + {0.740097,0.472727}, + {0.109634,-0.761616}, + {0.181177,0.801596}, + {-0.139230,0.351644}, + {-0.919758,1.187038}, + {-0.538770,-0.565291}, + {1.101719,0.094469}, + {0.063713,1.074669}, + {0.544651,-0.008236}, + {-0.043402,-0.182157}, + {-0.337167,-0.066716}, + {-0.942704,-0.275433}, + {-1.247517,0.659809}, + {0.260576,-0.850054}, + {0.328842,-0.795337}, + {-1.158718,0.621543}, + {0.696945,-1.559381}, + {-0.387067,-0.638698}, + {-0.196632,0.228895}, + {0.300199,0.872357}, + {0.989715,1.032305}, + {-0.595253,0.281982}, + {-0.591831,-0.041140}, + {0.274069,-0.351900}, + {-0.204608,-0.274791}, + {0.111010,1.228848}, + {-1.030237,-0.321911}, + {0.451188,-0.908440}, + {-1.157873,-1.048536}, + {-0.773016,-0.742834}, + {-0.068020,0.052725}, + {0.424745,-0.757197}, + {-0.495433,-0.890633}, + {0.095193,-0.673641}, + {-0.838353,0.958686}, + {-0.070324,0.364606}, + {0.240110,-0.379039}, + {0.814811,0.773006}, + {-0.123048,0.360797}, + {-0.383944,-0.049565}, + {-0.384357,0.170201}, + {0.027846,-0.520829}, + {0.509019,-0.721829}, + {1.510086,-0.121824}, + {0.461037,-0.152050}, + {-0.062760,0.456919}, + {0.903696,-0.632184}, + {0.147880,-1.655441}, + {0.107131,0.254212}, + {-1.168225,0.436568}, + {1.645891,0.720458}, + {0.637719,-0.054386}, + {-0.674512,-0.595368}, + {-1.647293,-0.454644}, + {-1.427878,-1.542565}, + {-1.299486,-0.638739}, + {-0.789832,0.890510}, + {-0.971617,0.239988}, + {1.162886,0.122570}, + {0.296613,0.157020}, + {-0.651558,-1.195472}, + {-0.483987,-0.676177}, + {-1.459346,0.226026}, + {-1.565833,-0.705405}, + {0.562608,-0.783332}, + {-0.335643,0.629401}, + {0.601555,-0.527161}, + {0.172194,-0.279522}, + {1.396232,1.176078}, + {1.057625,-0.239732}, + {0.925509,-0.621106}, + {-0.112643,-0.176105}, + {-0.224907,-0.088044}, + {-0.615717,0.351970}, + {-1.022447,-0.343888}, + {-0.611137,0.278950}, + {-0.611510,-0.059484}, + {-0.585823,-0.678989}, + {-0.601954,-0.562345}, + {-0.262591,1.266941}, + {-0.772093,0.174441}, + {-0.587666,0.893304}, + {0.111368,1.608418}, + {0.714706,-0.534446}, + {-0.771247,0.120513}, + {0.318155,0.438540}, + {2.023913,0.190916}, + {-0.212721,0.773555}, + {0.232401,0.319443}, + {-0.251844,-1.318009}, + {0.162669,0.403618}, + {0.827621,-0.529870}, + {0.250448,-1.073482}, + {0.059679,-0.063302}, + {-0.194909,0.064858}, + {0.480359,0.527630}, + {0.037879,0.460448}, + {0.486415,-0.957618}, + {0.451010,-0.068816}, + {0.968128,0.192947}, + {0.831207,-0.164804}, + {0.144330,-1.177113}, + {-1.046468,-0.117025}, + {1.453514,0.529669}, + {0.462780,0.519148}, + {0.355027,0.727646}, + {0.355796,0.311839}, + {1.776668,0.186074}, + {-1.419462,-0.435581}, + {-0.360595,-0.117783}, + {-0.309289,0.349530}, + {-0.530039,-0.873192}, + {-0.106943,0.925020}, + {1.306105,0.027449}, + {0.580964,0.705161}, + {1.478512,-0.101863}, + {-0.202531,0.738568}, + {-0.493564,-0.930668}, + {0.268006,0.343200}, + {0.459762,1.566772}, + {-0.160910,0.379268}, + {0.629888,-0.503718}, + {1.381070,-0.364317}, + {0.307948,-0.047268}, + {0.796512,-0.935058}, + {-0.700082,-0.972416}, + {-0.298262,-0.605478}, + {-0.323136,1.541209}, + {-0.195020,0.416722}, + {-0.086115,0.749763}, + {0.435675,-0.521759}, + {-0.104943,-0.146577}, + {1.092303,0.546935}, + {0.274549,0.086542}, + {0.505962,0.274669}, + {-0.720219,-0.028282}, + {0.761485,0.999235}, + {0.953266,0.149321}, + {0.633826,0.108976}, + {-0.930898,0.531887}, + {-0.401657,1.460128}, + {-1.032822,0.380031}, + {0.199604,0.147336}, + {-0.633607,-0.055812}, + {-0.316084,-0.492567}, + {-0.775544,-0.393868}, + {-0.304902,0.496941}, + {0.587243,0.404586}, + {0.535787,-0.290660}, + {0.526786,-0.492909}, + {0.032885,-0.335402}, + {0.254548,0.025119}, + {-0.007256,0.956603}, + {-0.781701,0.182978}, + {-0.594395,-0.051752}, + {1.137163,0.417077}, + {-0.725425,1.703746}, + {0.203050,-0.823786}, + {-0.093223,-0.599492}, + {-0.171074,0.434182}, + {0.446139,-1.024946}, + {1.307526,-0.924091}, + {0.165343,-0.061759}, + {0.847232,-0.364522}, + {-1.687820,-0.966855}, + {0.367350,1.007379}, + {0.462134,-0.629192}, + {1.480619,0.308647}, + {-0.480776,-0.412441}, + {-0.032728,0.426328}, + {-0.723946,0.349359}, + {-0.695635,0.225437}, + {0.093643,0.801008}, + {-1.148551,-0.246205}, + {-0.049321,-0.459364}, + {-0.241512,1.553192}, + {1.138608,1.302721}, + {0.263139,-0.527765}, + {0.172326,0.638467}, + {-0.425811,0.438227}, + {-0.932956,0.082939}, + {-0.145653,-0.835906}, + {0.099492,-1.396676}, + {-0.730089,-1.456065}, + {0.328898,0.922454}, + {-0.479136,0.168375}, + {-0.693307,-1.117508}, + {0.434907,0.255777}, + {0.159500,-0.075837}, + {0.606847,-1.786357}, + {0.114103,-0.890503}, + {0.475339,-0.639335}, + {-0.501279,0.909314}, + {-0.461021,0.340318}, + {-2.371022,0.240045}, + {-0.663024,-0.078565}, + {0.408487,0.747418}, + {-0.039952,0.544522}, + {-0.346095,-1.181014}, + {1.313543,1.313791}, + {-0.286968,0.049342}, + {-0.985057,0.416389}, + {0.567016,-0.890193}, + {-0.029613,-1.097792}, + {-0.274942,1.279869}, + {0.840626,-0.071335}, + {1.103612,-0.346434}, + {-0.971668,0.314411}, + {-0.401788,-0.159312}, + {0.876157,-1.020020}, + {-0.187758,-0.633080}, + {-0.737539,0.950549}, + {-0.537099,1.220313}, + {-0.354796,0.504951}, + {0.516333,0.303805}, + {0.744535,-0.050407}, + {-0.305368,0.196347}, + {-0.539320,-0.584686}, + {0.578355,0.192718}, + {-1.251327,0.031665}, + {-0.988681,-1.128213}, + {-1.076868,1.127315}, + {-0.652836,-0.331953}, + {-0.922967,0.220209}, + {0.721116,-0.345270}, + {0.102160,-0.184497}, + {0.724131,-0.729485}, + {0.311939,1.406437}, + {-0.687354,-0.482095}, + {-0.746110,0.490688}, + {-0.290505,-0.930634}, + {1.203664,0.171541}, + {0.798127,0.241126}, + {-0.347300,0.167841}, + {-0.383096,0.527781}, + {0.231403,-0.662014}, + {1.208195,-0.842100}, + {0.118811,0.382395}, + {-0.971162,-0.657731}, + {-0.109055,-1.321417}, + {-0.166172,1.000512}, + {0.245685,0.853006}, + {1.179090,0.148636}, + {-0.722005,0.218807}, + {-0.356529,0.394081}, + {0.283431,-1.474497}, + {-0.528565,-0.181279}, + {-0.309054,-0.447532}, + {-0.302059,-0.835447}, + {0.063289,0.197125}, + {0.873344,0.283293}, + {-0.827399,0.327898}, + {-1.445307,0.015543}, + {1.134014,0.449569}, + {0.026380,-0.550346}, + {-0.107964,0.656922}, + {0.551898,-0.361890}, + {1.354513,-1.238748}, + {0.259696,1.783583}, + {-0.954792,0.686831}, + {-0.745327,-0.404158}, + {0.454100,-0.837450}, + {0.087043,-0.950885}, + {0.505512,0.460524}, + {0.404887,0.789404}, + {-0.037236,0.441461}, + {1.725802,0.267412}, + {0.797967,0.244751}, + {-0.978130,0.515460}, + {0.542536,-0.075439}, + {0.712379,-0.497695}, + {-0.212806,0.608145}, + {0.577898,-0.192766}, + {0.489932,0.990213}, + {0.119053,-0.729816}, + {1.097182,-0.576013}, + {-1.201042,-0.794151}, + {-0.120795,0.066962}, + {0.146414,0.603197}, + {0.026528,-0.603082}, + {-0.800504,0.268076}, + {-0.343166,-0.407044}, + {-0.102762,-0.303068}, + {0.129492,1.346782}, + {-0.258398,0.169313}, + {1.243914,-0.592895}, + {1.095122,0.260779}, + {-0.600781,-0.189894}, + {0.240113,0.082414}, + {0.353061,0.355369}, + {0.420819,-0.911021}, + {0.696589,0.394239}, + {-0.682780,0.358780}, + {0.063955,-1.517855}, + {-0.322178,-0.074134}, + {-0.974101,1.406756}, + {-0.526017,-0.353056}, + {-0.640417,0.340377}, + {-0.182126,-0.411452}, + {-0.488776,-1.599695}, + {1.517429,0.767395}, + {0.603698,-0.721522}, + {0.541078,-0.821337}, + {0.110168,0.163595}, + {0.212353,-0.539387}, + {0.117418,-0.754495}, + {-0.155305,-0.255334}, + {-0.119331,0.141361}, + {-1.467100,-0.792509}, + {0.202781,0.268023}, + {-0.814643,-0.407787}, + {0.137034,-0.791640}, + {-0.789811,-0.493989}, + {-0.336780,-0.653000}, + {-0.759226,-0.386969}, + {0.455847,0.617339}, + {1.664504,-0.591428}, + {-0.206955,0.421407}, + {-0.567116,0.215310}, + {-0.634151,-0.216379}, + {-0.474751,0.577085}, + {0.580540,0.007682}, + {0.431102,-0.313646}, + {0.037617,-0.541906}, + {0.586028,0.437426}, + {1.122127,1.192700}, + {0.679301,0.617392}, + {-0.266514,0.750701}, + {1.021989,0.573764}, + {-0.471908,-1.137463}, + {-0.275688,-1.347824}, + {-0.260820,0.857808}, + {-0.353317,-0.507878}, + {1.482158,-0.115137}, + {0.989099,-1.264611}, + {-0.181237,-0.731317}, + {-1.272231,0.000604}, + {-0.050286,-0.518716}, + {0.906532,0.073988}, + {-0.725282,-0.708613}, + {1.130826,0.492829}, + {0.382025,0.118885}, + {-0.289855,0.327266}, + {-0.356868,-0.127456}, + {-0.497037,0.347544}, + {0.916516,-0.011213}, + {0.795788,0.833036}, + {-1.108708,0.654990}, + {1.098447,-0.380100}, + {-0.699273,0.774193}, + {0.342752,-0.535842}, + {0.047643,-0.227671}, + {1.274331,0.341689}, + {0.895537,-0.407677}, + {-0.778889,-0.038155}, + {0.698568,0.098739}, + {1.916364,-0.661903}, + {-0.845148,0.287349}, + {0.837011,-1.241308}, + {0.022716,-0.396469}, + {-0.020420,-0.034983}, + {-0.285681,-0.753360}, + {-0.118651,-1.527316}, + {-0.176143,0.446362}, + {0.130017,-0.415744}, + {0.318507,0.552840}, + {-0.603890,0.207048}, + {-0.523459,0.105243}, + {-0.002344,-0.410590}, + {0.476249,-1.748434}, + {0.110030,-0.295667}, + {-0.776678,-0.699187}, + {-0.336088,0.120044}, + {-0.132220,0.564894}, + {-0.400230,-1.465552}, + {-0.899290,0.326598}, + {-1.442301,-0.087643}, + {-0.008753,-0.630739}, + {0.390787,0.192346}, + {-0.340743,-0.440807}, + {-1.539744,1.205671}, + {0.627614,0.398445}, + {0.127486,0.357655}, + {0.135552,0.764774}, + {0.518036,-0.218960}, + {1.049276,-0.090579}, + {-0.008401,1.454761}, + {0.003514,0.918229}, + {0.302454,0.976231}, + {-0.961992,-0.017294}, + {0.076837,0.668940}, + {-0.348232,0.509916}, + {-1.436588,0.235003}, + {-0.084113,-0.570737}, + {0.635977,0.515143}, + {-0.580761,0.004320}, + {-0.130124,0.718512}, + {-1.064332,0.805427}, + {1.314300,-0.425192}, + {-0.597376,0.040773}, + {-0.369787,0.951658}, + {1.179303,0.302642}, + {0.309178,0.951243}, + {0.683143,-0.691633}, + {0.595706,-0.308229}, + {1.452309,0.693933}, + {-0.597845,0.801738}, + {0.458518,-0.343717}, + {-0.149173,-0.241056}, + {0.979689,0.240095}, + {-0.599037,0.543307}, + {0.354471,-1.145843}, + {-0.020165,-0.398078}, + {-0.123823,1.399765}, + {0.024307,0.255874}, + {0.390943,0.200198}, + {0.660994,-0.236146}, + {0.874927,0.787643}, + {0.171618,0.136452}, + {0.225134,0.175814}, + {-1.009673,0.213737}, + {0.778509,-0.536733}, + {0.659917,-1.701921}, + {-1.047737,-0.614887}, + {-0.561108,0.215661}, + {-0.185832,-0.245792}, + {-0.486231,0.531170}, + {0.116419,-0.145595}, + {0.019939,-0.695158}, + {0.144234,-0.507506}, + {-0.396990,-0.833085}, + {0.375825,-1.907635}, + {-0.080535,0.196175}, + {0.007163,0.589929}, + {-1.106312,-0.916138}, + {1.084560,-1.289281}, + {0.700913,-0.454858}, + {1.690164,-0.645198}, + {0.472295,0.365814}, + {-0.354035,-1.187006}, + {-0.363422,-0.700427}, + {-0.409595,-0.297748}, + {0.222860,-0.488023}, + {1.154380,-0.023766}, + {-0.572994,0.995388}, + {-0.522744,0.915831}, + {-0.102298,0.075968}, + {-1.113661,0.277819}, + {-0.541258,0.942888}, + {0.144149,-1.421493}, + {-0.813628,0.518374}, + {0.438114,-0.583365}, + {-0.306953,-0.083300}, + {-0.965428,-0.187021}, + {-1.651694,0.301327}, + {-0.358049,0.160427}, + {0.494740,0.212273}, + {-0.475793,0.129843}, + {-0.513566,0.206706}, + {-0.789498,-0.454014}, + {-0.506331,-0.677233}, + {-1.191360,-0.684613}, + {-0.473632,-0.505620}, + {1.704961,-0.000282}, + {-0.748426,0.044751}, + {0.722466,-0.271562}, + {-0.114380,-0.029615}, + {0.881983,0.732634}, + {-2.466091,0.797042}, + {0.107247,-1.069177}, + {0.365094,-0.240360}, + {0.860761,-0.392398}, + {0.419712,1.024297}, + {-0.733678,-0.114491}, + {-0.387299,-0.698591}, + {-1.111876,-0.894044}, + {-0.338478,0.432863}, + {0.374858,0.592964}, + {0.132022,-0.172552}, + {-0.566581,0.486986}, + {-0.361814,-0.127256}, + {-0.495429,-1.119817}, + {-0.373163,0.277704}, + {-0.451895,-0.150489}, + {0.676212,0.462474}, + {0.731097,0.067339}, + {-0.391580,-0.221534}, + {0.702811,0.805510}, + {0.306927,-0.330470}, + {0.202033,-0.281253}, + {0.670677,-1.640630}, + {-0.171426,0.129238}, + {0.855865,-0.001158}, + {0.902835,-0.314898}, + {0.258288,-0.817972}, + {-0.246663,-0.050172}, + {-1.298989,1.057827}, + {-0.194878,-0.869015}, + {-0.989629,-0.909738}, + {-0.566145,-0.028838}, + {-0.537190,-0.250192}, + {1.007348,0.083241}, + {0.351506,-0.080267}, + {0.167228,-0.274140}, + {0.523975,-0.383455}, + {-0.693140,-0.400584}, + {-1.377034,-0.099976}, + {0.687119,0.508089}, + {0.624748,-0.713680}, + {0.524963,0.852304}, + {-0.365119,1.391765}, + {-0.098955,-0.773518}, + {0.099686,0.092521}, + {-0.191519,0.113134}, + {-0.246630,-0.849187}, + {0.372718,-0.028201}, + {0.209208,0.168457}, + {0.531034,0.810682}, + {-2.065181,-0.403745}, + {1.662412,-1.025271}, + {0.116164,-1.358371}, + {0.871266,0.684274}, + {-0.601819,0.436820}, + {0.379071,-0.950469}, + {-1.481672,1.328396}, + {-0.215309,0.881097}, + {1.543692,-1.302871}, + {0.566876,-0.346706}, + {-0.107790,0.187282}, + {-0.050962,0.305967}, + {2.234456,0.245861}, + {0.922211,0.315870}, + {0.170718,0.332505}, + {-0.173235,0.269735}, + {-0.034479,-0.147379}, + {-0.910476,0.549261}, + {-1.482071,0.073635}, + {-1.006192,-0.257727}, + {1.380736,0.159414}, + {0.133536,-0.518567}, + {0.452510,-0.297029}, + {0.506554,0.634800}, + {-0.223515,-0.113593}, + {1.640303,-0.303890}, + {0.451081,-0.579022}, + {-0.423077,-0.310128}, + {-0.515610,0.197095}, + {1.449878,-0.575191}, + {0.595091,-0.861876}, + {0.467010,0.214356}, + {1.126815,-0.412791}, + {-0.768978,0.928791}, + {0.662096,0.992854}, + {-0.870112,0.867863}, + {-0.444760,0.695527}, + {0.545433,0.548246}, + {0.900893,1.440884}, + {1.009321,-1.093170}, + {0.002783,-0.661035}, + {0.446845,-0.962453}, + {1.071007,0.104193}, + {0.701488,0.155886}, + {-1.495756,-1.595266}, + {0.037920,-0.027757}, + {-0.816584,0.442122}, + {1.024597,0.061760}, + {0.372463,0.656436}, + {0.193900,-1.113707}, + {0.702296,0.063060}, + {-0.387018,0.640494}, + {0.472535,0.526097}, + {-0.113295,-0.461936}, + {-0.549302,-0.072353}, + {0.113877,1.728784}, + {-0.503031,0.465992}, + {-1.800512,0.344290}, + {-0.291058,0.191364}, + {-1.383239,-0.639046}, + {0.301438,0.939880}, + {-0.887944,0.532416}, + {-0.337686,-1.497391}, + {-0.273128,0.170892}, + {-0.187554,1.292625}, + {-0.335620,0.813804}, + {0.302649,0.115870}, + {-0.125463,0.244516}, + {0.775593,0.754042}, + {0.726695,-0.656969}, + {0.888387,-1.134760}, + {1.275522,-0.250979}, + {-0.736736,-0.023197}, + {-0.722655,0.071534}, + {0.398133,-0.225856}, + {-0.158094,-0.713822}, + {-0.187789,1.530984}, + {0.066136,-0.285781}, + {0.337437,0.069203}, + {-1.522060,0.359290}, + {-0.410925,0.715260}, + {-0.348957,0.792795}, + {-0.822869,0.817856}, + {0.215875,-0.611351}, + {-0.606455,0.320282}, + {1.436453,-0.107341}, + {-0.330349,-1.194834}, + {0.572256,1.303348}, + {1.090097,1.118251}, + {0.745744,-0.906311}, + {-1.122036,-0.363927}, + {-0.352830,0.069443}, + {0.173709,0.298217}, + {1.233522,0.305900}, + {0.226477,-0.043980}, + {-0.722420,0.493256}, + {0.557195,0.058823}, + {-1.094416,-0.312172}, + {0.071648,0.977559}, + {-0.387061,0.773792}, + {0.338082,-0.019251}, + {0.163224,-0.330960}, + {0.610427,0.371691}, + {0.323763,-0.522994}, + {-0.668372,-0.370236}, + {1.242604,0.090453}, + {-1.050305,-0.440150}, + {0.388379,-0.214487}, + {-0.479460,-0.280957}, + {-0.581688,0.708546}, + {-0.651918,-0.699252}, + {-1.289294,0.894307}, + {0.430920,1.134885}, + {-0.140695,0.119391}, + {-0.113397,0.141629}, + {-0.224160,-0.849461}, + {0.145152,1.010905}, + {0.114341,0.319432}, + {-0.731503,0.963791}, + {-0.805791,-0.234161}, + {-0.097786,-0.078454}, + {1.247790,0.056807}, + {-0.066401,-0.334968}, + {0.675039,-0.744820}, + {-0.181113,-0.290322}, + {0.651336,0.530368}, + {-1.249633,-0.321314}, + {-0.289785,0.448466}, + {0.666290,1.196834}, + {0.623286,-0.328105}, + {-0.469083,0.311728}, + {-0.641303,-0.664674}, + {-0.033907,-0.670533}, + {0.177868,1.697506}, + {-0.216707,0.202837}, + {-0.186939,-0.529367}, + {0.022609,-0.126800}, + {0.203477,-0.579855}, + {-0.230490,1.011908}, + {0.162921,1.168193}, + {0.885725,-0.666452}, + {0.277346,0.026881}, + {0.127636,-0.291993}, + {0.343859,0.254767}, + {0.937021,-0.240389}, + {-0.450499,-0.519208}, + {0.026306,0.871227}, + {-0.532201,0.361956}, + {0.510303,-0.387441}, + {-0.746218,0.107938}, + {-0.043113,0.416857}, + {-0.765734,-0.057674}, + {-0.976013,-0.471322}, + {-0.608322,-0.386790}, + {-0.153345,-0.142873}, + {0.282707,-0.174705}, + {0.908893,-0.288510}, + {1.248578,-0.267686}, + {-0.733607,-0.318778}, + {0.711804,0.106524}, + {0.730638,-0.818837}, + {-0.143297,0.775292}, + {0.826449,-0.764265}, + {-1.053740,0.429313}, + {0.093451,-0.285474}, + {0.092797,-1.313155}, + {-0.990341,-0.497315}, + {0.566588,0.912216}, + {-0.641365,-1.513570}, + {-0.399701,0.419908}, + {0.550336,0.454210}, + {1.130919,-1.011306}, + {-0.648588,0.724713}, + {1.530720,-0.329322}, + {0.240109,0.297342}, + {-0.803036,-0.672687}, + {0.558095,0.210214}, + {-0.415771,0.335389}, + {-0.446871,-0.080301}, + {0.439153,0.420859}, + {0.454300,-0.120721}, + {0.210916,-0.112178}, + {-0.409692,-0.248721}, + {-0.879181,-0.650745}, + {0.314275,0.157443}, + {-0.127992,0.459773}, + {0.189201,-0.437353}, + {-0.199317,0.335634}, + {0.926867,-1.219475}, + {0.990475,0.115756}, + {-0.596768,0.519271}, + {0.544668,0.177830}, + {0.025311,0.718018}, + {0.865983,-0.396329}, + {0.931238,0.051218}, + {-1.306796,0.890281}, + {-0.038267,0.417608}, + {0.423411,0.011136}, + {-0.591386,-0.028572}, + {-0.659057,-0.868477}, + {-0.454503,-0.183610}, + {-1.296091,0.623354}, + {-0.369003,-1.032546}, + {0.687142,-0.539728}, + {0.702910,0.311785}, + {0.486632,-0.654871}, + {-0.698156,0.479333}, + {-0.286491,0.023513}, + {-0.061237,0.264710}, + {0.815363,-0.724906}, + {0.080431,0.452235}, + {0.209167,-0.366842}, + {0.238600,-1.015582}, + {0.236585,1.119290}, + {0.115878,-0.511488}, + {0.417193,-0.342133}, + {-0.132619,-0.383681}, + {-0.309108,-0.467185}, + {0.389856,-0.296845}, + {0.862805,-0.845385}, + {0.163740,-1.328876}, + {0.841628,-1.134586}, + {-1.314638,0.983453}, + {0.007594,-0.151851}, + {0.491880,0.589396}, + {0.410562,-0.533815}, + {0.152744,-0.382076}, + {-0.814165,-0.726665}, + {-1.054786,0.399620}, + {-0.604055,0.219815}, + {0.195637,-1.204522}, + {-0.218163,0.389220}, + {-1.060887,-0.365853}, + {0.076152,0.972619}, + {0.106557,-0.550138}, + {0.350506,-0.580934}, + {0.899491,-1.202793}, + {0.006987,-0.237220}, + {-0.621779,0.109460}, + {0.758860,0.378667}, + {0.665073,0.149904}, + {0.514973,-1.076146}, + {-0.531363,-0.151537}, + {-0.160327,-0.372274}, + {1.439986,-1.868230}, + {0.189739,0.119885}, + {0.203151,1.214735}, + {0.227369,-0.449251}, + {-0.320953,1.173650}, + {0.362700,-0.413635}, + {0.104156,0.742685}, + {0.786895,0.217765}, + {0.461444,-0.383361}, + {-0.026425,0.050263}, + {-0.700833,-0.176479}, + {0.516268,-0.266494}, + {0.542822,-0.196286}, + {0.972150,0.282374}, + {0.373345,-1.661969}, + {0.848982,-0.275416}, + {-0.147993,0.557783}, + {-1.235018,-0.425926}, + {-0.990208,-0.819959}, + {-0.502916,0.897826}, + {-0.963431,0.100756}, + {-0.539236,-0.495820}, + {0.043163,-0.313743}, + {0.268113,-0.401802}, + {0.094456,0.929705}, + {0.434827,0.666465}, + {-0.285961,0.540364}, + {-0.067659,0.148652}, + {-0.343734,1.625959}, + {0.941489,-0.334072}, + {-0.339727,-0.526445}, + {0.793149,0.946932}, + {-0.398235,0.623877}, + {0.264790,-0.715621}, + {-1.011724,0.322794}, + {1.384937,0.455970}, + {1.454257,0.048507}, + {-0.306816,-1.428050}, + {0.370468,0.733515}, + {0.850482,0.067026}, + {-0.026520,0.315161}, + {0.553367,-1.038959}, + {-1.381139,0.169341}, + {-0.126396,0.774954}, + {0.579820,-0.324341}, + {0.690277,-0.552866}, + {0.042603,0.250999}, + {0.234958,-0.328548}, + {-0.034987,-0.427424}, + {0.017550,1.027859}, + {0.639405,0.074327}, + {-1.079853,0.773206}, + {-0.255093,-0.538056}, + {-0.516779,0.552364}, + {0.588249,-0.122769}, + {-0.180270,-0.526765}, + {0.281459,-0.573820}, + {-0.597178,0.884251}, + {-1.459452,0.521668}, + {0.475132,0.670896}, + {0.364260,-0.003726}, + {0.162263,1.430702}, + {1.002323,1.191997}, + {0.593734,1.105144}, + {0.455673,-1.069412}, + {-0.566892,-0.153912}, + {-0.401493,0.730293}, + {-0.616850,-0.357030}, + {0.131704,0.877433}, + {0.448159,0.531570}, + {0.707994,0.388152}, + {-1.120399,-1.558184}, + {0.205040,0.110543}, + {0.667577,0.900941}, + {-1.023609,-0.438459}, + {0.592556,-0.786459}, + {-0.218398,-0.203380}, + {0.274252,0.404389}, + {-0.458191,1.011445}, + {0.222179,0.858687}, + {0.029628,-0.040130}, + {-0.290997,-0.035703}, + {0.309122,-1.492022}, + {-1.010844,0.589316}, + {-0.356162,0.305040}, + {0.261650,0.718863}, + {0.434287,0.022466}, + {-0.076320,-0.343857}, + {0.183141,1.026684}, + {0.784650,0.184908}, + {0.701212,0.267810}, + {0.525909,1.299042}, + {-1.685660,0.350329}, + {-0.593831,-0.228072}, + {0.017935,0.860203}, + {0.840364,-1.130071}, + {1.015367,1.442451}, + {-0.901634,-0.746853}, + {0.199565,-0.821338}, + {-0.313785,0.748286}, + {0.090435,0.856189}, + {-0.393746,1.621984}, + {-0.703148,0.813511}, + {-1.461475,0.879518}, + {0.943104,-0.598617}, + {0.393415,-0.321067}, + {0.352488,-0.808631}, + {-0.262355,0.074378}, + {0.444508,0.028535}, + {-1.235967,0.087614}, + {-0.366743,0.274720}, + {-1.534213,1.187011}, + {-1.288413,1.152383}, + {-0.176366,0.392408}, + {-0.479891,-1.289108}, + {0.006065,-2.244152}, + {-0.200774,0.584892}, + {0.841201,0.359442}, + {0.042903,0.605595}, + {-0.050008,0.526026}, + {0.545172,0.114942}, + {-0.741202,0.452490}, + {-0.662675,0.502251}, + {-0.293925,0.361124}, + {-0.174266,0.891888}, + {0.214914,-0.044729}, + {1.076459,-0.324856}, + {0.028362,-0.712596}, + {0.119129,0.420191}, + {0.290109,-1.690392}, + {-0.534984,-0.709829}, + {0.928031,0.340022}, + {0.329803,-0.001821}, + {-0.789933,-0.997637}, + {0.525651,-0.947355}, + {0.800005,0.294846}, + {-0.940716,-0.342722}, + {1.153485,-0.757920}, + {-0.372701,-0.015358}, + {0.413703,0.474207}, + {0.554610,-0.587293}, + {0.609088,0.282538}, + {-0.389165,-0.999838}, + {-0.501062,0.425428}, + {0.506568,0.864824}, + {0.467536,0.041527}, + {0.413553,-0.972673}, + {-0.784710,-0.456333}, + {-0.591675,-0.081141}, + {-0.000096,-0.918489}, + {-0.741971,-0.673887}, + {0.423698,0.133942}, + {-0.353825,-0.248892}, + {0.265903,1.104794}, + {1.155745,-0.487131}, + {-1.230837,1.182218}, + {-0.039358,-1.024105}, + {-0.126243,-0.422831}, + {0.083741,1.333631}, + {-0.582043,-0.167835}, + {-0.651064,-0.716060}, + {-0.933496,1.031392}, + {0.285776,0.119386}, + {1.790267,1.839585}, + {0.673148,-0.036901}, + {0.060941,0.392402}, + {0.439779,0.335930}, + {0.482075,-0.508116}, + {0.166439,-0.478669}, + {1.468145,0.050076}, + {0.697232,0.408675}, + {-0.276139,0.399703}, + {0.376897,-0.613126}, + {0.465563,-1.169737}, + {-1.834874,0.539662}, + {-0.091337,0.444562}, + {-0.997118,0.098997}, + {-0.233274,-0.598737}, + {-0.989027,-1.117883}, + {0.624755,0.428710}, + {-0.375702,-1.212512}, + {-1.056685,0.388795}, + {-0.909594,0.317522}, + {-0.356905,-0.074151}, + {0.524995,0.703629}, + {0.314174,-0.403816}, + {-0.491192,1.182237}, + {-0.926085,-1.084090}, + {-0.017806,0.842876}, + {0.440742,-0.130747}, + {0.272952,0.081986}, + {0.441477,-0.697158}, + {0.259341,-2.099767}, + {0.831863,-0.033636}, + {-0.502615,-1.206727}, + {0.555998,0.859499}, + {-2.056364,0.396201}, + {0.341466,0.784581}, + {0.343672,1.187463}, + {1.274795,-0.151500}, + {-0.628121,1.454649}, + {0.565032,-0.448605}, + {-0.207750,-0.820005}, + {1.175663,0.211856}, + {-1.633000,1.122887}, + {-0.291601,2.700069}, + {-0.622804,1.831482}, + {-0.301059,0.509034}, + {-0.427513,0.001459}, + {-0.341017,-0.116875}, + {0.022551,-0.314193}, + {-0.918960,-0.674715}, + {-0.129296,-0.117801}, + {0.786287,-1.378251}, + {-0.451442,-1.084505}, + {0.942049,-0.109402}, + {-0.219356,-0.655816}, + {-0.878586,0.229613}, + {0.675175,-0.893381}, + {-0.932964,-1.161234}, + {0.214065,-0.396179}, + {-0.277875,1.353829}, + {0.086688,-0.992670}, + {0.266658,1.190433}, + {-0.665654,0.447818}, + {-1.073475,-0.902468}, + {0.561274,1.066952}, + {0.439581,1.398037}, + {-0.038367,-0.253666}, + {-0.180841,-0.607550}, + {-0.663332,0.315716}, + {-0.204138,-0.260854}, + {1.300259,0.483273}, + {0.488196,-1.506948}, + {-1.576188,-0.122042}, + {-0.161309,-0.070824}, + {-0.163122,-0.342865}, + {-0.647706,1.966371}, + {-0.912235,-1.511959}, + {0.246138,-0.881132}, + {-0.400870,-0.146707}, + {1.873068,-0.401651}, + {-0.246960,1.020948}, + {-0.309774,-0.749670}, + {-1.658745,0.706234}, + {0.137746,0.464169}, + {-0.128249,1.229660}, + {0.485569,-0.862653}, + {-0.314748,-0.798912}, + {0.596327,-2.260403}, + {-0.739134,-0.774303}, + {0.559885,2.133758}, + {-0.378982,-0.458096}, + {-0.645429,-0.411828}, + {0.442957,0.412317}, + {0.062638,-0.130068}, + {0.913193,0.872129}, + {-0.000645,-0.659925}, + {-0.611296,0.051654}, + {0.463594,0.106210}, + {-0.172544,0.250975}, + {-0.820128,0.059186}, + {1.244089,-0.241306}, + {-0.606408,0.162598}, + {-0.516257,-0.453431}, + {0.379360,-0.010924}, + {1.694404,-0.098512}, + {0.740398,-1.163674}, + {-0.086404,0.808617}, + {-0.788179,0.497859}, + {0.518954,1.316377}, + {-0.268101,-0.000552}, + {-0.011397,0.127380}, + {-0.776983,1.310111}, + {1.155819,-0.536423}, + {0.325867,0.129875}, + {-0.305559,1.698206}, + {1.469264,1.171590}, + {0.052020,1.645200}, + {-0.475098,0.752333}, + {-0.478576,1.051189}, + {0.209720,-0.846175}, + {0.336027,1.281707}, + {-0.457927,0.978607}, + {0.434299,0.603314}, + {0.819164,-0.707148}, + {0.285992,0.200020}, + {0.903948,0.841191}, + {-0.374723,0.784422}, + {0.270358,-0.432780}, + {-1.131503,-0.204865}, + {0.998721,-0.562161}, + {2.709929,0.333403}, + {0.277214,-0.599034}, + {-1.049311,0.119009}, + {-0.022257,-0.188019}, + {1.186738,0.666140}, + {0.855026,-0.173047}, + {-0.518785,0.244153}, + {1.443967,0.472201}, + {0.268845,0.765957}, + {-0.262575,-0.227543}, + {-0.178477,-0.237919}, + {0.718803,-1.198294}, + {0.296576,-0.928266}, + {-0.265587,0.333848}, + {0.004683,0.050916}, + {0.746835,-0.077362}, + {-0.848756,0.639052}, + {-0.435768,0.677006}, + {-0.761960,-0.673618}, + {0.483697,-0.006953}, + {0.859446,0.342013}, + {0.652033,1.150497}, + {0.279404,0.172724}, + {-1.654868,-0.062761}, + {-0.628006,1.229600}, + {0.434866,0.453249}, + {0.674872,-0.018098}, + {-0.880481,0.632858}, + {0.357744,-1.100971}, + {0.576850,-0.473425}, + {1.084853,-0.458153}, + {-0.135107,-0.068785}, + {-0.519318,-1.097185}, + {-0.391322,-0.857973}, + {0.105697,0.637781}, + {1.012647,0.768231}, + {0.032431,-0.712690}, + {-0.204606,-0.459269}, + {0.385121,0.683265}, + {0.360634,-0.324071}, + {0.146076,-0.206186}, + {-0.206886,-0.280858}, + {0.331549,-0.657394}, + {0.877392,0.663666}, + {0.395278,0.505377}, + {0.756041,0.859819}, + {-0.571644,-0.580026}, + {0.612494,-0.767403}, + {0.440062,-0.276920}, + {0.205130,0.951105}, + {-0.082089,0.424510}, + {-0.388500,-0.817454}, + {-0.297097,-0.030734}, + {0.564334,0.170313}, + {-0.046735,-1.039128}, + {0.236019,-0.606694}, + {0.580484,0.228738}, + {0.732596,1.402753}, + {0.684455,0.312711}, + {-0.114287,0.351727}, + {0.132644,0.482891}, + {-0.052996,0.413845}, + {-0.092510,0.323390}, + {-1.249163,0.744762}, + {-0.144000,-0.150784}, + {0.245751,-0.037541}, + {-0.265020,0.824606}, + {0.166448,-0.503386}, + {0.221548,1.011519}, + {0.705554,0.734803}, + {-0.449412,0.766934}, + {-0.041904,0.103437}, + {-0.589535,0.745306}, + {0.178707,0.543289}, + {-0.049604,0.417483}, + {-1.320194,0.671440}, + {0.618327,0.293337}, + {-0.035204,-0.955884}, + {0.696789,0.975314}, + {0.335561,-0.397880}, + {-0.101238,-0.789334}, + {-1.353433,0.224343}, + {-1.536268,0.154368}, + {0.290941,0.264984}, + {0.054972,0.497049}, + {0.249733,0.304852}, + {0.072880,0.649790}, + {-1.092497,-0.508302}, + {-0.580980,-0.404179}, + {0.684158,1.161387}, + {1.027268,0.419341}, + {-0.575905,0.422229}, + {-0.586725,0.243471}, + {1.044492,0.197131}, + {-0.818624,-0.339106}, + {1.028786,0.649399}, + {0.128927,0.552989}, + {-0.381191,-0.812393}, + {0.255808,-0.783620}, + {-1.000067,-0.814667}, + {0.937145,0.594671}, + {-0.138406,0.009326}, + {0.646863,0.329219}, + {0.114717,0.727041}, + {0.534733,-0.274257}, + {-0.076583,2.064369}, + {-0.061055,0.387069}, + {0.587603,-0.573761}, + {-1.432342,0.080705}, + {0.517872,-0.933701}, + {0.257925,-1.369532}, + {-0.882056,0.033029}, + {0.272729,-0.396548}, + {0.898916,0.232792}, + {-0.323588,0.996638}, + {1.414689,-0.936268}, + {-0.063766,0.848570}, + {-0.631058,-1.026964}, + {0.144042,-0.577972}, + {0.620716,-0.672317}, + {1.311640,0.177935}, + {0.355140,-0.394373}, + {-0.892820,0.040002}, + {0.669596,-1.423798}, + {-0.728338,0.281565}, + {-0.158685,-0.108162}, + {0.294872,0.143540}, + {0.154297,0.845158}, + {-0.614381,0.567366}, + {0.342103,1.116219}, + {0.264975,-1.064063}, + {-0.177622,-0.849517}, + {-0.539107,0.444928}, + {0.552126,-0.015861}, + {-0.212621,0.081190}, + {-0.653462,-0.566566}, + {0.092306,-0.221675}, + {1.100202,0.129533}, + {1.004146,0.906987}, + {-0.450678,-0.139092}, + {-0.041574,0.880738}, + {1.077768,0.691243}, + {0.683594,1.009049}, + {-0.782169,1.735141}, + {0.450257,0.439635}, + {0.529029,0.258264}, + {1.138549,1.986809}, + {-1.302507,0.020303}, + {-0.283556,0.445303}, + {-0.718645,-0.162901}, + {-0.043436,0.596306}, + {-0.253106,1.007761}, + {0.511255,-0.417590}, + {0.747033,0.272022}, + {-0.558437,-0.347778}, + {0.160240,-0.682185}, + {-0.958911,-0.030034}, + {-0.156077,0.031554}, + {-1.151408,0.317689}, + {-0.063615,0.309607}, + {0.652097,-0.090736}, + {0.093596,0.162455}, + {-0.179022,1.654394}, + {-0.242415,-1.079423}, + {0.397297,-1.272118}, + {-0.182965,0.130558}, + {-1.227359,0.503225}, + {0.010313,0.859745}, + {-0.230950,-0.566212}, + {-0.237624,0.329725}, + {0.962370,-0.180738}, + {-0.382887,-0.314282}, + {-0.606405,1.263377}, + {0.178244,-0.050770}, + {1.157081,-0.144043}, + {1.081460,-0.125683}, + {0.287172,0.296327}, + {-0.145758,0.931086}, + {-0.235046,0.421208}, + {-0.476461,0.823257}, + {-0.425877,-0.436417}, + {-0.164299,0.097882}, + {0.438670,0.627963}, + {-0.690073,0.733569}, + {0.386280,-0.534213}, + {-1.074264,-0.832657}, + {0.059724,0.429346}, + {0.241225,-1.310186}, + {-0.041200,-2.185164}, + {0.104350,0.419205}, + {0.259056,-0.248550}, + {1.271667,0.475120}, + {-0.218242,1.164193}, + {0.346768,-0.150378}, + {-0.846548,0.308488}, + {-1.063304,-0.776317}, + {1.166478,-0.454347}, + {0.033053,0.179463}, + {-0.332293,-0.312112}, + {-0.403124,-0.863969}, + {-0.115242,0.881201}, + {-0.443942,-0.049482}, + {0.576722,0.121133}, + {1.115690,-0.395430}, + {-0.967709,-0.283118}, + {0.238138,0.015244}, + {-0.346183,-0.321679}, + {-0.184817,-0.803985}, + {0.428226,-0.424139}, + {0.294728,1.082187}, + {0.146915,-0.379303}, + {-0.524167,0.099747}, + {0.586104,-0.292682}, + {0.078394,0.960573}, + {1.670460,0.570454}, + {0.535695,0.279784}, + {-0.059247,1.179067}, + {0.193284,0.103453}, + {0.198475,1.316057}, + {-0.354204,-0.801039}, + {-1.095112,-0.629114}, + {-0.739693,0.109626}, + {-0.669776,-1.101214}, + {-1.119037,-0.827679}, + {-0.697044,0.582501}, + {0.670182,-0.339850}, + {1.052632,-1.151181}, + {-0.013924,-0.148582}, + {0.676350,-0.382496}, + {-0.609900,0.145339}, + {-0.467053,-1.060301}, + {0.329805,1.116336}, + {-0.657195,-0.381897}, + {0.144469,0.365412}, + {-0.455678,0.492839}, + {0.164257,-0.588328}, + {-0.215978,-0.137108}, + {0.885806,0.550884}, + {-0.512770,-0.358695}, + {-0.059087,0.164926}, + {-0.401278,-0.857801}, + {0.648031,-0.168120}, + {-0.175814,-0.106801}, + {1.103215,-0.147023}, + {-0.173378,-1.161128}, + {0.048200,0.186641}, + {0.382578,0.367532}, + {0.470646,0.681831}, + {-0.094808,0.385076}, + {-0.227419,-0.100211}, + {0.752327,1.031990}, + {0.325679,-0.929947}, + {-1.252363,0.747342}, + {0.611128,0.470173}, + {-0.717586,-0.267591}, + {-1.351702,0.677071}, + {-0.216029,0.531468}, + {0.115357,0.016478}, + {-1.068851,1.084321}, + {0.464010,0.510275}, + {1.225770,-0.765537}, + {0.508388,-0.879914}, + {-0.865601,-0.344538}, + {0.685346,0.515833}, + {-0.637203,-0.617789}, + {0.279486,-0.543520}, + {0.897987,-0.208160}, + {-0.677693,-0.780875}, + {-0.760403,0.397810}, + {0.184177,0.176928}, + {-1.069590,-0.614911}, + {-0.132476,0.356640}, + {-0.036611,-1.348685}, + {0.173300,0.074283}, + {0.665913,0.252531}, + {0.876800,0.368352}, + {0.239620,1.213974}, + {0.392571,0.197044}, + {1.445377,1.168005}, + {-0.351908,-1.245911}, + {-0.200333,-0.246884}, + {1.165079,0.269904}, + {1.102148,0.936739}, + {0.415018,-0.692267}, + {0.695930,-0.610682}, + {0.337706,-0.194200}, + {-0.406360,-0.428313}, + {2.001919,0.298601}, + {0.040240,0.021280}, + {0.476985,-0.207150}, + {-0.955785,2.342469}, + {0.167188,0.627934}, + {0.278484,-0.586048}, + {-0.908941,0.243936}, + {-0.146000,-0.877617}, + {0.192032,-0.244236}, + {0.975606,0.244268}, + {-0.170990,0.257347}, + {0.764497,-0.551919}, + {0.058791,0.682466}, + {0.065943,-0.984803}, + {-0.912431,0.368831}, + {0.855040,0.067306}, + {0.749915,-0.835586}, + {0.838403,-1.238493}, + {-1.483938,-0.123001}, + {-0.557550,-0.923933}, + {-0.771014,0.386390}, + {0.273899,-0.385988}, + {0.750930,-0.659754}, + {0.777048,1.433688}, + {-0.209220,0.937272}, + {0.205420,-0.235356}, + {0.414937,0.418160}, + {0.718236,-0.451301}, + {-0.186269,-1.322922}, + {-1.920077,0.476052}, + {-1.398596,0.784435}, + {-0.256580,0.180031}, + {-0.532659,0.457304}, + {-0.384892,-0.039057}, + {-0.055613,-0.548142}, + {0.527916,0.194822}, + {0.823368,-0.281136}, + {0.619060,-1.874924}, + {1.444115,0.480538}, + {-0.819634,0.380911}, + {-0.423061,-0.352648}, + {0.834671,1.128296}, + {-0.327942,-0.116678}, + {-0.313019,0.264847}, + {-0.887367,-0.196781}, + {0.102331,-0.425392}, + {0.586136,-0.513125}, + {-0.392544,0.760032}, + {0.048821,-0.120578}, + {-0.659257,1.355152}, + {0.071198,-0.123784}, + {-0.611575,-0.162787}, + {0.600874,0.427984}, + {-0.438527,-0.718199}, + {1.021030,-0.206658}, + {-0.040177,0.469484}, + {-0.097920,0.431053}, + {-0.227448,0.032859}, + {0.438377,-0.490723}, + {-0.127967,-0.318678}, + {0.530951,-0.205032}, + {0.306926,-1.611728}, + {-0.155619,0.005610}, + {0.364185,1.075986}, + {-0.355830,1.056994}, + {-0.416081,0.881061}, + {-0.168114,0.891871}, + {0.318273,0.022034}, + {0.045802,-0.498750}, + {0.874723,-0.261830}, + {2.041322,0.581367}, + {-0.434688,-0.889884}, + {-0.625497,-1.424039}, + {-0.916101,-0.012513}, + {0.301928,-0.119459}, + {0.054875,0.719308}, + {0.113292,-0.985813}, + {-0.256198,1.240920}, + {0.110794,0.058590}, + {0.475235,0.043136}, + {0.265904,0.466909}, + {0.569717,1.513256}, + {2.460579,0.347629}, + {-0.583997,-0.395316}, + {1.412936,-0.136881}, + {0.257743,-0.020675}, + {-0.773710,0.598378}, + {-0.155740,0.175291}, + {0.708158,-0.303414}, + {0.128797,-1.688465}, + {-0.944673,0.178251}, + {-0.419667,-0.800480}, + {1.015229,0.451624}, + {-0.563132,-0.098941}, + {1.022619,0.269203}, + {0.544089,-0.558886}, + {0.285403,-0.945592}, + {-0.249927,-0.639200}, + {0.616154,0.448953}, + {1.538937,0.176176}, + {-1.072722,-0.731432}, + {2.202183,-1.085427}, + {-0.187007,0.862339}, + {-0.009781,-0.919787}, + {0.882595,-0.224292}, + {0.328335,-1.466478}, + {-0.425207,-0.406182}, + {0.230537,0.884368}, + {-0.295215,-0.639698}, + {-1.490884,0.427221}, + {1.247354,0.295467}, + {-0.810296,0.889553}, + {1.136726,0.000428}, + {-0.448626,-0.265578}, + {-0.375165,-0.970000}, + {-0.029743,1.329743}, + {0.191118,-0.149061}, + {-1.198112,0.166633}, + {-1.072263,0.604945}, + {1.319951,0.678233}, + {-0.286881,1.447051}, + {-0.000431,-0.790107}, + {-0.927154,-0.720568}, + {1.244388,0.126044}, + {0.361372,-0.563810}, + {1.786158,0.068526}, + {0.652693,-0.233381}, + {-0.956019,-0.446398}, + {-1.257622,-0.253433}, + {0.262294,0.421673}, + {1.178025,0.259483}, + {-0.138056,0.076554}, + {-0.338284,-0.760501}, + {0.238752,-0.363470}, + {-0.467720,-0.613917}, + {1.727196,-2.032936}, + {0.453188,1.148454}, + {-0.860575,-0.211261}, + {-0.134673,-0.149191}, + {0.089986,-0.837997}, + {-0.421324,0.572281}, + {-0.154263,0.793297}, + {-0.068541,-1.226925}, + {-1.024731,1.765286}, + {0.321293,-0.655162}, + {-0.381602,0.084867}, + {-0.761043,0.072325}, + {-0.153164,-0.580169}, + {1.095428,-0.725517}, + {-1.360859,-0.509727}, + {-0.015713,1.146405}, + {0.080499,0.991718}, + {-0.037406,0.203660}, + {0.437657,0.772791}, + {-0.335827,-0.643198}, + {-0.748036,1.554296}, + {0.056139,0.540525}, + {0.855326,1.251389}, + {1.512833,0.127560}, + {-0.335811,-0.685869}, + {0.049175,-0.612331}, + {0.744695,0.303599}, + {0.086665,0.554790}, + {-1.437300,-0.698848}, + {1.208241,0.809530}, + {-0.368646,0.188188}, + {0.918053,2.303752}, + {0.542692,0.198394}, + {0.895487,-1.142547}, + {1.427584,-0.139881}, + {0.366063,-0.559492}, + {0.615816,-0.518515}, + {1.683531,0.689662}, + {-0.561367,0.740093}, + {0.136173,0.685102}, + {0.676639,0.746691}, + {0.409337,-1.146213}, + {-0.636375,0.027888}, + {0.588745,0.274056}, + {-0.722872,0.098504}, + {-0.671533,0.012166}, + {1.011527,0.719796}, + {0.081135,-0.237933}, + {-0.318500,0.963256}, + {-0.817222,0.191993}, + {-0.244338,0.114244}, + {-0.596279,-0.365810}, + {-0.075441,1.479957}, + {-0.791400,0.528275}, + {0.028476,-0.288631}, + {0.165929,-0.171160}, + {0.275183,0.915583}, + {0.295522,-0.680658}, + {0.488326,0.104785}, + {-0.735568,-0.701452}, + {-0.082936,-1.234151}, + {-0.944770,0.415823}, + {-0.723673,0.661138}, + {0.020222,-0.209032}, + {0.744207,1.798693}, + {-0.650645,0.033519}, + {-1.346394,-1.296518}, + {0.979960,-1.559900}, + {0.346991,-0.097270}, + {0.844271,-0.832661}, + {-0.627946,-0.340953}, + {0.648317,-0.668772}, + {1.035056,0.096494}, + {-0.374343,0.301709}, + {-1.959191,0.184104}, + {0.354760,0.554715}, + {0.461264,-0.291802}, + {-1.445191,-0.676835}, + {-0.390066,0.002849}, + {-1.243483,-0.254016}, + {0.756660,-0.152519}, + {0.449951,-0.361801}, + {0.032053,0.448066}, + {0.301092,-0.018617}, + {0.919110,-1.106308}, + {0.688230,-0.751883}, + {1.443475,0.290925}, + {-0.336814,-0.202997}, + {0.194678,0.132777}, + {0.438428,-0.932498}, + {-0.005527,-1.612383}, + {-0.065145,-0.331485}, + {0.569241,0.575176}, + {-0.973392,0.141843}, + {-2.301017,0.881275}, + {0.784561,0.317932}, + {-0.077933,0.914512}, + {0.087316,-0.135682}, + {0.092940,-1.181121}, + {-1.310608,0.288132}, + {-0.892082,-1.676985}, + {0.916083,0.042083}, + {-1.244578,0.624427}, + {-0.334890,0.718718}, + {-0.741767,-0.347100}, + {-0.416327,-0.223633}, + {0.086690,0.939596}, + {0.888409,-0.085335}, + {0.625874,1.037141}, + {0.722036,-1.315310}, + {-0.335910,-0.880128}, + {-0.565481,-0.047599}, + {0.935371,-0.398854}, + {-0.727068,0.164967}, + {-0.431810,-0.025259}, + {0.528973,0.176538}, + {-0.620117,-0.164306}, + {0.113693,-0.756706}, + {-0.026549,-0.082517}, + {0.366109,-0.935198}, + {0.574120,-0.696891}, + {-0.329320,-1.004717}, + {0.167355,-1.385869}, + {-1.184704,0.231683}, + {-1.687510,0.741804}, + {0.460393,0.417694}, + {0.913381,-0.623551}, + {-0.025182,0.652840}, + {0.149389,1.580919}, + {0.046797,0.067857}, + {0.445068,-0.193108}, + {-0.087060,0.449112}, + {0.444716,1.154858}, + {-1.680048,-1.100377}, + {0.060122,1.288340}, + {1.811764,0.294464}, + {0.172455,1.302739}, + {-1.053456,-0.391417}, + {-0.932098,-1.179288}, + {0.822615,0.311778}, + {-0.593686,-0.517305}, + {0.592373,-0.858691}, + {-0.941357,0.211116}, + {-1.091715,-0.037219}, + {0.397495,0.181766}, + {-0.339179,-0.444183}, + {0.202008,-0.835547}, + {0.707791,0.284963}, + {1.127548,0.443368}, + {0.320918,0.693486}, + {-0.408938,-0.202700}, + {-0.474738,-1.197323}, + {0.196347,-0.186877}, + {0.133286,-0.981743}, + {0.454869,-0.118595}, + {-0.708891,0.915489}, + {-0.124946,0.257625}, + {-0.013053,-1.262217}, + {-0.816680,0.357514}, + {-1.325378,-0.000513}, + {-0.471835,-1.666112}, + {0.006822,0.861943}, + {-0.609116,0.665514}, + {-0.022823,-0.921185}, + {0.334153,-0.307869}, + {-0.200664,0.039748}, + {-1.341585,-1.016766}, + {-1.478115,-0.168005}, + {0.493183,-0.315358}, + {0.320896,-0.265798}, + {-0.410948,0.749325}, + {0.493700,0.609085}, + {1.511312,-0.136707}, + {-0.369151,-1.186832}, + {0.053669,-0.453470}, + {-0.344181,0.465001}, + {-0.409580,1.225758}, + {-0.040541,0.314214}, + {-0.563372,0.154451}, + {-0.296031,0.128113}, + {-0.170489,-0.237342}, + {0.484353,0.541345}, + {-0.281269,-1.163252}, + {-0.441618,-0.191346}, + {-0.766963,-1.158696}, + {0.683851,-0.047111}, + {0.085014,-1.047429}, + {0.435402,-1.193670}, + {0.723781,0.086784}, + {0.117848,0.731946}, + {-1.001471,-0.568533}, + {1.623786,-0.472448}, + {-0.405629,-0.440914}, + {-0.867240,0.860770}, + {-1.370369,-0.367847}, + {-1.068700,0.049127}, + {-0.506801,0.070046}, + {-0.571468,-0.279030}, + {-0.936487,0.177180}, + {1.208152,0.335738}, + {0.547493,0.278008}, + {-0.676350,0.122804}, + {0.881113,-0.622278}, + {-0.997446,0.228682}, + {0.374538,-1.112491}, + {0.018405,2.294138}, + {0.190651,-0.275758}, + {-1.066702,1.292937}, + {0.453821,1.500667}, + {-0.003891,-0.058122}, + {0.483079,1.838471}, + {-0.535369,-0.173664}, + {-1.069100,-0.694773}, + {-0.112032,-1.188326}, + {0.855142,0.212202}, + {-1.308295,-0.165234}, + {-0.899488,-0.114441}, + {-0.146224,0.097630}, + {-0.510277,0.887175}, + {0.821703,0.158980}, + {0.853827,-0.985330}, + {0.451970,0.343768}, + {0.077419,-1.075895}, + {-0.613300,0.876653}, + {-0.747934,0.101782}, + {0.456308,-0.448831}, + {0.704574,0.516584}, + {-0.123099,0.328140}, + {0.934254,-0.065327}, + {-0.598220,-0.151876}, + {0.247193,-0.320853}, + {0.710846,0.595196}, + {1.133704,-0.279589}, + {-0.213979,0.300774}, + {-0.136586,-0.481220}, + {-0.818138,0.623683}, + {0.492634,-0.509161}, + {0.233986,-0.216658}, + {-1.803974,-0.101863}, + {0.338246,-0.233200}, + {1.210916,-0.191023}, + {-0.419416,0.400604}, + {0.174883,0.361058}, + {0.041907,-0.084804}, + {-0.565089,-0.646098}, + {0.808848,-0.495713}, + {-0.880710,-0.067991}, + {0.466173,-0.432444}, + {0.326814,0.655068}, + {1.323321,-1.755300}, + {-0.246832,0.422534}, + {0.488638,0.630369}, + {-0.672349,-0.571405}, + {0.929277,0.597525}, + {0.295168,1.180543}, + {-0.443439,-0.167602}, + {0.850886,0.731905}, + {-0.130536,-1.019228}, + {0.667789,-0.245031}, + {-0.048100,0.713830}, + {-0.693496,1.039212}, + {-0.470569,-0.156852}, + {1.071015,-0.851179}, + {-0.141749,-0.228665}, + {0.133398,0.157939}, + {-0.920078,-0.522450}, + {-1.336102,-2.023545}, + {0.189471,-0.546281}, + {0.600537,-0.493998}, + {0.253657,0.643392}, + {-0.844469,1.910885}, + {0.805807,0.277348}, + {0.113829,-0.394163}, + {0.706544,0.990309}, + {0.166811,-1.066923}, + {0.713167,0.883103}, + {1.297380,-0.698009}, + {0.182918,0.196844}, + {-0.582698,0.320323}, + {1.179693,1.053822}, + {1.973986,0.861945}, + {0.831394,0.372738}, + {0.036404,-1.044186}, + {-0.322784,0.736748}, + {0.465765,1.236812}, + {-0.094890,-0.910340}, + {0.534838,0.087896}, + {-0.423018,0.473497}, + {0.446821,-0.345740}, + {1.370136,-0.313957}, + {0.605235,-0.218558}, + {-0.312323,-0.331415}, + {-0.957650,-0.174169}, + {0.438262,0.355984}, + {-0.630817,-0.585063}, + {0.844182,0.027599}, + {0.255999,0.290238}, + {0.195645,-0.309908}, + {-0.361390,0.759387}, + {0.793257,-0.590533}, + {-0.272252,-0.825983}, + {-0.524775,1.002337}, + {1.025595,0.035075}, + {0.144336,0.133347}, + {-0.053176,-0.873734}, + {-1.072797,-0.022777}, + {-0.201704,-0.812261}, + {0.406989,0.690699}, + {0.167489,0.337122}, + {0.954502,0.132945}, + {-0.234877,-1.122684}, + {-0.713308,0.242610}, + {0.993134,-0.224591}, + {0.195455,0.240318}, + {0.176161,0.919258}, + {-1.200962,0.602950}, + {0.146329,-0.178380}, + {1.905485,0.926800}, + {-1.213910,-0.046545}, + {-0.712013,0.163252}, + {0.701015,0.587351}, + {0.475746,-0.236882}, + {0.681216,1.077988}, + {1.005624,0.206876}, + {0.503490,0.797294}, + {-0.740207,-0.178577}, + {0.049749,0.215896}, + {0.121691,0.231312}, + {0.307603,1.696005}, + {0.149964,-0.357488}, + {-0.833350,1.591904}, + {-1.066643,-0.227741}, + {-0.130385,0.289346}, + {0.171775,1.229285}, + {0.499181,0.204163}, + {0.365325,0.432717}, + {-1.116102,1.193373}, + {0.816269,0.322493}, + {0.044289,-0.038741}, + {-0.081816,-0.660226}, + {0.209952,-0.440067}, + {-0.585770,-1.303251}, + {-0.470685,0.187163}, + {-0.273317,-0.063477}, + {1.701860,-0.310642}, + {0.235376,0.741904}, + {-1.391462,-0.818046}, + {0.891559,0.276066}, + {0.397528,-0.407250}, + {-0.245719,0.703900}, + {0.408310,-1.425978}, + {0.984774,0.218506}, + {-0.226844,0.404807}, + {-0.478742,-0.640515}, + {0.194719,1.070898}, + {-0.421489,-1.495545}, + {-0.285219,-0.021769}, + {0.805010,-0.178533}, + {-1.462175,-0.074131}, + {-0.012403,-0.230968}, + {1.614191,-0.155847}, + {1.208571,-1.196227}, + {-0.757660,1.376246}, + {0.948323,-0.100899}, + {-0.537264,0.178661}, + {-0.225242,-0.390378}, + {-2.111611,-0.388815}, + {0.591711,0.721370}, + {-0.486270,-0.043296}, + {-0.354134,0.102331}, + {0.494296,0.500110}, + {0.977534,0.912976}, + {0.083083,0.580670}, + {0.047811,-0.201119}, + {-0.101871,1.602735}, + {-0.299291,-0.338615}, + {-0.517633,-0.181010}, + {0.557599,-1.494308}, + {-1.180601,-0.754826}, + {0.843726,1.285523}, + {0.248651,1.227134}, + {0.385419,-1.487426}, + {0.329802,0.523718}, + {0.832042,2.344297}, + {-0.483497,-0.042848}, + {-0.571850,0.444970}, + {0.578707,-0.332521}, + {-0.383466,0.231784}, + {0.026002,1.355058}, + {0.290971,-0.253279}, + {-0.280147,-0.381802}, + {0.068319,-1.243266}, + {1.056405,-0.214847}, + {-0.804678,0.348259}, + {-0.311298,-0.374442}, + {-0.727188,1.198522}, + {0.089518,0.348222}, + {0.016808,0.138825}, + {-0.165610,0.734759}, + {-0.607876,0.020547}, + {-0.381076,0.319154}, + {0.771585,2.282850}, + {-0.679082,-0.535810}, + {0.922199,-0.104349}, + {0.883859,0.707429}, + {0.297841,-0.513259}, + {-0.084643,0.804522}, + {0.051716,0.095978}, + {-0.214681,-0.166287}, + {0.681025,0.064098}, + {1.880843,0.324433}, + {0.035759,0.351759}, + {-0.184237,1.372837}, + {0.089526,-0.380857}, + {1.314891,0.090765}, + {-0.166000,-0.408904}, + {-0.487537,-0.303936}, + {1.403138,-0.027080}, + {0.874409,-1.421801}, + {-1.455847,-0.180022}, + {1.082291,1.664879}, + {0.071012,0.797922}, + {0.252097,-0.345585}, + {0.278979,0.328135}, + {0.096045,-0.823268}, + {0.240866,0.568270}, + {0.623840,0.074629}, + {1.197388,-0.864621}, + {0.010140,0.536038}, + {-0.936742,-0.311617}, + {0.229416,0.009804}, + {-0.867776,1.059319}, + {0.613966,0.475140}, + {-0.213434,0.139105}, + {0.725146,-0.742290}, + {0.106239,0.386418}, + {0.189119,-0.313432}, + {-0.506237,-0.211804}, + {0.625359,0.120521}, + {0.723693,-0.672366}, + {-0.960395,0.399574}, + {0.120116,0.211127}, + {0.862921,-0.124087}, + {1.083842,1.379676}, + {-0.596075,-0.150507}, + {1.813520,0.153563}, + {0.821543,0.716422}, + {0.905501,0.148319}, + {-0.281616,0.736664}, + {0.523724,0.771024}, + {0.736386,0.335333}, + {0.704974,-1.258289}, + {0.230135,0.149167}, + {-0.183667,0.141978}, + {0.343212,-0.472806}, + {0.502101,-0.030266}, + {0.302980,-0.873466}, + {-0.047585,0.202728}, + {-0.490690,-1.793145}, + {0.072517,0.500160}, + {0.574135,0.273335}, + {-0.679558,-0.481851}, + {-0.391140,0.833001}, + {0.007197,-0.476483}, + {0.755864,0.699900}, + {0.023659,0.256314}, + {-0.219938,-0.203388}, + {-0.489864,0.259189}, + {-1.006033,-0.103282}, + {0.158715,-0.664053}, + {-0.300183,-1.039796}, + {-1.321861,-0.637445}, + {-0.720415,-0.327571}, + {0.251887,-0.485211}, + {0.078411,-0.322993}, + {0.056805,-0.293353}, + {0.315853,-0.085568}, + {0.222705,0.310332}, + {-0.182731,-0.397738}, + {-0.180319,0.561981}, + {0.598215,-0.364178}, + {-1.249949,-1.177746}, + {-0.456053,-0.685671}, + {0.954583,0.571800}, + {1.014219,-1.278695}, + {1.266613,0.223437}, + {-0.283420,-0.474797}, + {0.693306,-0.029207}, + {0.273299,0.133892}, + {0.532101,-0.320308}, + {-0.594831,0.406073}, + {-0.005518,0.766143}, + {0.147701,0.838501}, + {-0.745052,0.749668}, + {0.936722,0.046095}, + {-0.921153,-0.296284}, + {0.230717,1.078411}, + {-0.104489,0.089344}, + {0.184105,0.646882}, + {0.829563,-0.030537}, + {0.646903,-1.032258}, + {-0.266078,-0.192410}, + {0.430983,-0.751174}, + {-0.369734,0.154678}, + {1.027273,-1.123325}, + {-0.284810,-0.673581}, + {-0.198272,0.710599}, + {-0.664385,0.828056}, + {-1.078880,0.714872}, + {-0.474676,0.242386}, + {0.680091,-0.410467}, + {-0.127690,-0.562865}, + {-0.234136,-1.291910}, + {-0.304469,-0.626725}, + {0.530474,0.566233}, + {-0.109255,-0.557004}, + {0.087012,0.988810}, + {-0.750837,-1.577521}, + {0.347408,-0.389814}, + {1.437412,0.283755}, + {-0.159056,1.128835}, + {0.004413,-0.144927}, + {0.088644,-0.027569}, + {-0.079487,-0.229503}, + {0.870379,-0.028245}, + {-0.138882,1.645245}, + {-0.177149,-0.495996}, + {-0.040567,-0.960823}, + {0.701093,-0.753669}, + {-0.268945,0.477653}, + {0.519034,-0.856936}, + {1.010434,0.014817}, + {0.314739,0.141389}, + {0.838768,0.270923}, + {-0.922034,0.148587}, + {0.537647,1.022497}, + {-0.184456,0.248540}, + {-0.702941,0.129272}, + {-1.199959,-0.484713}, + {0.775146,0.641877}, + {1.355787,-0.061010}, + {-0.273411,-0.344273}, + {-0.079652,-0.580078}, + {-0.294108,0.383430}, + {-0.663756,0.764663}, + {-0.029209,0.187390}, + {0.458825,0.020946}, + {-0.759974,-0.072059}, + {-0.762552,2.339859}, + {-0.691081,0.637021}, + {0.066676,-0.267145}, + {-0.000870,-0.130399}, + {-0.128295,-0.090600}, + {0.434282,-1.040424}, + {0.064080,0.311479}, + {0.445593,-1.427874}, + {0.309938,0.341331}, + {-0.668997,0.293917}, + {1.532275,0.452357}, + {1.468994,0.022104}, + {-0.581643,1.003752}, + {0.923086,0.272041}, + {0.469483,0.205555}, + {0.066270,1.032433}, + {-0.223936,0.193990}, + {0.722656,0.900099}, + {-0.460502,0.026773}, + {0.264304,0.263321}, + {0.011564,0.998830}, + {-0.852220,-0.735707}, + {-0.367962,0.277292}, + {0.912905,-0.022560}, + {0.474794,-0.033505}, + {0.383646,0.014366}, + {-0.147667,-0.066343}, + {0.496019,-0.698605}, + {0.466197,0.778409}, + {-0.005985,-0.917034}, + {0.364603,-1.005913}, + {-1.127720,-0.496130}, + {0.530754,-0.710343}, + {0.817573,-0.478350}, + {1.542207,1.147533}, + {-1.015912,-0.392767}, + {-0.528064,-1.332638}, + {-1.655403,0.790160}, + {-0.192199,0.863973}, + {-0.148335,1.398748}, + {0.231018,-0.580136}, + {-0.028057,0.350163}, + {-0.078239,-0.095824}, + {-0.368671,-0.118777}, + {0.143814,0.563598}, + {-0.286646,-1.756129}, + {0.331342,0.411717}, + {0.402591,0.419929}, + {0.267689,0.344904}, + {-0.737596,0.808101}, + {-1.479648,-0.212449}, + {0.354386,1.310559}, + {-0.676218,-1.049757}, + {-0.115748,-1.162720}, + {-0.325709,-1.636897}, + {0.093754,0.067673}, + {-0.266273,-1.083043}, + {-0.366387,-0.814048}, + {-0.315910,0.796504}, + {1.358526,0.414087}, + {-0.674816,-0.587575}, + {-1.084357,-0.761996}, + {1.170537,-1.118362}, + {-0.888671,-0.372056}, + {0.206631,-0.197368}, + {0.151309,-0.017645}, + {-0.639638,-0.158684}, + {-0.818429,-0.799644}, + {0.193617,0.138892}, + {-0.330140,0.508120}, + {-1.023892,-0.005087}, + {-0.492779,-0.242526}, + {1.190477,0.548598}, + {0.380355,-0.428248}, + {-0.443627,0.322194}, + {0.643475,-0.610225}, + {1.639932,0.217874}, + {-0.075206,-0.891935}, + {0.472977,0.806206}, + {-0.049387,0.521157}, + {0.775513,1.120129}, + {-0.820993,-0.580519}, + {0.787248,0.471905}, + {1.982564,-0.239183}, + {0.036994,-0.084856}, + {0.397587,-0.108305}, + {0.717829,-0.658020}, + {0.096854,-1.073618}, + {-0.247410,0.105690}, + {-0.636805,-0.001866}, + {0.249262,0.170546}, + {-1.384929,-0.181014}, + {0.394318,-0.470332}, + {0.312685,-0.971393}, + {0.126831,1.201348}, + {-0.741448,-0.364570}, + {0.885990,-0.170062}, + {0.946030,0.048529}, + {-0.814388,0.775904}, + {0.365165,-0.393381}, + {-0.910022,-0.285627}, + {-1.692124,-0.058729}, + {-1.176468,0.344140}, + {-0.680828,-0.802456}, + {1.430130,-1.167865}, + {-1.009736,-0.292885}, + {0.780604,0.117665}, + {-1.183708,-0.191115}, + {-1.109502,-2.955782}, + {-0.679155,-0.425963}, + {-0.478117,-0.857997}, + {0.559869,1.189793}, + {0.693475,0.705402}, + {-0.069617,-0.231592}, + {-0.824859,-0.475262}, + {-0.613227,0.171012}, + {-0.972368,-0.750733}, + {0.572478,-0.362034}, + {0.400015,0.093211}, + {-0.664619,-0.115371}, + {1.629905,1.260396}, + {-0.887239,-0.880451}, + {-0.475993,1.783962}, + {-0.535449,0.374335}, + {-0.268655,0.381528}, + {-0.048788,0.080243}, + {-0.263956,0.156544}, + {-0.201047,-0.681716}, + {0.007541,-0.270714}, + {0.968368,-1.040116}, + {1.598093,-0.868513}, + {0.608883,-0.925775}, + {-0.292500,0.359309}, + {0.781647,-1.854675}, + {-0.048384,-0.358500}, + {-0.045277,0.182846}, + {0.702542,-0.682803}, + {-1.310088,0.288354}, + {-1.111262,-0.253839}, + {-0.610601,0.629673}, + {-0.077137,-0.288207}, + {-1.248534,-0.678787}, + {0.589672,-0.209868}, + {0.328118,0.280762}, + {-0.130254,0.359489}, + {-1.191280,-0.282377}, + {-0.727137,0.795181}, + {-0.332298,0.545214}, + {0.449265,0.809670}, + {-1.176652,0.024432}, + {-0.444225,0.247852}, + {-0.493719,-0.443957}, + {0.490093,-0.462030}, + {0.894083,-0.428290}, + {-0.808464,0.061714}, + {-0.438031,-0.880389}, + {-0.374120,-0.133532}, + {0.109504,0.714367}, + {1.199793,-0.870295}, + {-0.016396,1.234340}, + {0.176536,0.170704}, + {1.583727,-1.037287}, + {-0.408359,0.192187}, + {-0.716863,-0.030518}, + {-0.087939,-0.157292}, + {0.233970,-0.789071}, + {0.448874,-0.318136}, + {-0.001706,0.203524}, + {-0.583113,0.483299}, + {0.032509,-1.159109}, + {0.243543,-1.545598}, + {0.963137,-1.858378}, + {-0.433912,0.106663}, + {-0.584636,-0.554822}, + {-0.169820,0.694442}, + {-0.694692,-1.420531}, + {0.124368,0.308158}, + {-0.371740,-1.256747}, + {-0.371259,-0.345713}, + {-0.080108,-0.248600}, + {-0.508996,-0.502867}, + {-0.259720,-1.107589}, + {-0.479506,-0.625836}, + {-0.966428,-1.108758}, + {0.199396,0.684562}, + {-0.139579,-0.532375}, + {-0.671940,1.263705}, + {0.583387,-0.545125}, + {0.594017,0.135560}, + {0.295089,-0.517450}, + {0.227495,-0.116494}, + {-0.278437,0.070346}, + {1.252146,0.161429}, + {-0.719420,-0.400126}, + {0.411649,0.672294}, + {-0.067492,-0.147642}, + {0.773465,0.447213}, + {-0.096564,0.687259}, + {0.223581,-0.672181}, + {-1.189369,-1.012300}, + {0.378992,-1.602545}, + {0.528201,-0.184505}, + {0.555361,-0.073704}, + {0.641793,-0.149102}, + {0.614789,0.145011}, + {-0.014245,0.835852}, + {-0.433430,-0.150091}, + {1.265735,-0.171617}, + {0.424119,0.261458}, + {0.543597,-0.019062}, + {0.106955,-0.352852}, + {0.259824,-1.044464}, + {-0.134395,1.294968}, + {0.614190,0.103061}, + {-0.472730,0.440592}, + {0.026255,1.541770}, + {-0.680532,0.748520}, + {-1.652447,-0.981050}, + {1.530492,0.410946}, + {0.590749,-0.057968}, + {-0.204753,-0.053539}, + {-0.146540,0.407365}, + {-0.589178,-0.794021}, + {1.057477,0.390612}, + {-0.318475,0.110593}, + {0.860875,-0.484007}, + {-0.853862,-0.303066}, + {-0.640767,-0.247635}, + {-0.661993,0.487274}, + {-0.132963,-0.470698}, + {0.276424,0.103581}, + {0.269608,-1.122638}, + {-1.094199,0.419837}, + {0.466955,-0.942801}, + {1.061330,-0.773058}, + {0.504520,0.613301}, + {0.975902,0.530381}, + {-0.030956,0.526710}, + {0.231220,-1.339298}, + {-0.011487,0.006031}, + {-0.018207,-1.410146}, + {-0.042725,-1.430596}, + {0.082844,0.468408}, + {-0.592661,0.098480}, + {0.011226,0.279928}, + {0.032576,-1.292298}, + {-1.290445,0.847037}, + {0.901504,-0.435370}, + {-0.728679,-1.694385}, + {0.869029,1.438773}, + {0.348432,0.771641}, + {0.433021,-0.359444}, + {-0.716851,-1.686122}, + {0.654974,-0.546823}, + {-0.288514,0.307206}, + {0.656826,0.217168}, + {-0.688401,0.403697}, + {-0.151237,-0.641147}, + {0.280761,-0.025080}, + {1.352524,0.262260}, + {-1.020794,0.502821}, + {-0.308908,-0.753609}, + {-1.227055,-0.566285}, + {1.246124,-1.216215}, + {-0.096449,-0.082642}, + {-0.582940,0.409202}, + {-0.297638,0.527261}, + {-0.473862,-0.847413}, + {0.493371,0.316474}, + {-0.505728,-0.462956}, + {-0.595404,-0.478184}, + {0.282216,-0.370408}, + {-0.648353,2.154436}, + {0.388833,-1.448003}, + {0.520432,0.059147}, + {-0.013529,0.455994}, + {0.939385,-0.134557}, + {0.620260,0.444285}, + {0.242877,-0.212567}, + {0.864014,1.110652}, + {-0.433176,0.148295}, + {-0.467423,0.654889}, + {0.385444,0.838910}, + {-0.451962,-0.686281}, + {-0.028356,1.160879}, + {-0.420737,0.282096}, + {0.276441,0.183335}, + {0.644401,0.809729}, + {-0.038628,-0.032380}, + {-0.689183,0.615413}, + {0.685082,0.193192}, + {0.603120,-0.720557}, + {0.575454,-0.298269}, + {-0.336636,0.032836}, + {1.167203,-0.640395}, + {-1.086856,-0.481934}, + {1.008476,1.002123}, + {-0.884676,0.816595}, + {1.107577,-0.884024}, + {0.478516,-0.707394}, + {0.258192,-0.748370}, + {-0.741356,0.392670}, + {0.705741,-0.514239}, + {0.153360,0.250206}, + {0.332233,0.401451}, + {-0.810436,0.247146}, + {0.382241,0.492063}, + {-0.120140,-0.666149}, + {0.219067,-0.351762}, + {0.503475,0.143766}, + {1.810909,-0.522492}, + {0.914236,1.024772}, + {-0.001545,0.951413}, + {-0.361359,-0.703397}, + {-0.790543,-0.080398}, + {-0.124326,0.712994}, + {0.989520,0.282750}, + {-0.639085,-0.593687}, + {0.532412,0.985720}, + {-0.814493,-0.684384}, + {-0.335779,-0.770313}, + {-1.021545,0.405681}, + {-0.711770,-1.295042}, + {0.875563,-0.431312}, + {-1.424888,0.070227}, + {0.041671,0.512540}, + {0.560060,-1.156517}, + {0.495886,0.815220}, + {0.932619,0.063747}, + {0.015802,-0.313213}, + {0.849039,0.928043}, + {-1.711563,-0.070807}, + {-0.666807,-0.065413}, + {1.336124,0.298359}, + {-1.465749,1.267894}, + {0.643581,0.208283}, + {-0.027162,0.285537}, + {0.727538,0.592374}, + {-1.035589,0.161733}, + {-0.093690,-1.111324}, + {-0.118812,-0.492105}, + {-0.310044,0.136076}, + {0.423281,0.738354}, + {-0.332121,-1.129243}, + {0.821705,-1.094517}, + {0.034405,-0.125589}, + {-1.061441,-0.025527}, + {0.262581,0.337586}, + {0.089369,-0.030417}, + {0.001538,-0.262250}, + {-0.603561,0.120004}, + {-0.666026,-0.523188}, + {-0.604976,0.661149}, + {0.424495,0.063530}, + {-0.459048,0.273275}, + {-0.759139,-1.058355}, + {0.788408,-0.233671}, + {0.420774,-0.023008}, + {-0.057270,-0.647363}, + {0.332215,-0.161691}, + {-0.241240,0.285908}, + {-2.248124,-1.075027}, + {1.897230,1.332517}, + {-1.000960,-0.341355}, + {-0.764357,0.742789}, + {-0.430048,0.351628}, + {-0.758480,-1.168399}, + {-0.435465,-1.025082}, + {-0.031475,1.442605}, + {-0.098961,0.902862}, + {-1.182562,1.622450}, + {-0.779323,0.082419}, + {0.456925,0.197176}, + {-0.508334,-0.322065}, + {0.508929,1.414049}, + {0.831596,-0.269084}, + {-0.557522,0.829015}, + {-0.307706,1.811900}, + {0.522715,0.538211}, + {-0.007168,-0.369323}, + {-0.617961,0.598800}, + {-0.978429,-1.276183}, + {-0.311683,-0.168769}, + {0.813820,-0.732024}, + {1.620090,0.776415}, + {-0.244712,-0.030740}, + {0.423419,0.437735}, + {-0.438972,0.722604}, + {-0.882370,-0.599715}, + {0.861613,0.144139}, + {0.794431,-0.119300}, + {0.174561,0.355555}, + {-0.691546,0.900205}, + {0.994296,1.262278}, + {-0.693701,0.809946}, + {0.153439,0.433443}, + {-0.125105,-0.519678}, + {0.091914,0.929540}, + {0.307382,1.281497}, + {-0.219573,-0.230141}, + {0.323594,0.781383}, + {0.898631,0.775206}, + {0.511558,-0.475861}, + {0.097796,-0.356711}, + {0.279638,1.045159}, + {1.270842,-0.511080}, + {-0.082679,0.240138}, + {0.568139,-0.004501}, + {0.109403,-0.183895}, + {-0.739424,1.048188}, + {-0.054909,-0.730640}, + {-0.107852,-0.216831}, + {0.685852,-0.120568}, + {1.372181,0.079369}, + {-0.057168,-1.475400}, + {1.379104,-0.416757}, + {0.674217,0.132367}, + {0.823818,0.008095}, + {-0.227594,-1.181870}, + {0.154429,-0.278722}, + {-0.380589,1.327236}, + {0.953822,-0.415279}, + {0.523925,-0.065958}, + {-0.336928,0.243956}, + {0.552334,0.546455}, + {1.968980,-0.255377}, + {0.071926,-0.528260}, + {-0.242553,0.409914}, + {0.794756,-0.821838}, + {0.670664,-0.016080}, + {-0.195775,-0.420098}, + {-0.437345,-0.444139}, + {0.929108,0.038056}, + {-0.034900,0.359362}, + {-0.646337,0.250061}, + {0.164494,-0.964178}, + {0.217552,-0.079574}, + {0.616784,-0.219605}, + {0.274625,0.461819}, + {0.600045,0.609724}, + {-0.227316,0.212501}, + {-0.681566,-0.149931}, + {0.613788,0.331795}, + {-0.746826,-0.495927}, + {-0.352302,-0.492596}, + {-0.234966,-0.714624}, + {0.209031,0.429705}, + {0.909196,-0.574662}, + {-0.264863,1.129618}, + {-0.418314,0.193085}, + {0.140225,-0.055672}, + {-0.259935,0.107007}, + {0.577398,-0.501482}, + {-0.700274,0.431435}, + {-0.320978,-1.214359}, + {0.040677,-0.504970}, + {0.621603,0.489428}, + {-0.775181,0.755810}, + {-0.449114,-0.259854}, + {-0.964709,-0.189900}, + {0.571927,-0.612827}, + {-0.510919,0.532547}, + {1.043521,0.076593}, + {0.559284,1.091596}, + {0.385705,-0.620434}, + {-0.281876,1.139602}, + {0.696445,0.461885}, + {0.144423,-0.355093}, + {-1.477952,0.389119}, + {1.033198,-0.665606}, + {0.301267,0.413149}, + {-0.437421,1.527053}, + {-0.688981,0.779191}, + {-0.736537,-0.869510}, + {0.633416,0.485837}, + {-0.217942,-0.604167}, + {0.052318,-0.432202}, + {-0.404016,0.007563}, + {0.371806,0.924113}, + {0.685100,0.792052}, + {0.338713,-1.831682}, + {0.116368,-0.901689}, + {0.859729,-0.187662}, + {0.532246,-0.609526}, + {-0.252737,0.583202}, + {0.802405,-0.891543}, + {-0.657884,-1.409923}, + {-1.011401,-0.576367}, + {-0.518947,0.454590}, + {-0.760309,0.886904}, + {0.551054,0.077816}, + {-0.056155,-0.399365}, + {-1.188687,-0.144384}, + {0.348530,-0.718497}, + {0.040766,0.421674}, + {0.054193,-1.058049}, + {-0.703027,0.823753}, + {0.674644,0.568892}, + {0.653971,-0.029957}, + {-0.330844,0.894927}, + {-0.355906,0.469251}, + {-0.548867,1.196719}, + {-0.316741,-0.112885}, + {-0.050654,-1.074386}, + {-0.458463,-0.052899}, + {-0.323981,-0.056114}, + {-1.226962,-0.781318}, + {-0.793700,0.814978}, + {0.588809,0.468163}, + {0.297339,0.292342}, + {-1.189165,-0.848667}, + {-0.401703,-0.893584}, + {0.275424,0.119550}, + {-0.152022,-0.594732}, + {-0.937268,0.649621}, + {0.139979,0.423321}, + {-0.267033,-0.061451}, + {0.460158,0.411101}, + {0.102352,0.520000}, + {-0.670053,0.131062}, + {-0.547779,-1.300149}, + {1.065430,-1.272432}, + {0.850852,-1.537153}, + {-0.127321,-0.412569}, + {0.497995,-0.760964}, + {0.618018,-0.962779}, + {-0.367868,0.358651}, + {0.418133,-0.031711}, + {0.827988,-0.299697}, + {0.418025,-0.080342}, + {0.227770,-0.733112}, + {-0.522901,0.220810}, + {0.036422,-0.204918}, + {1.192243,-0.320297}, + {0.640624,-2.005424}, + {1.277127,0.447780}, + {-0.277087,0.657680}, + {-0.277141,0.773988}, + {-1.130237,0.935414}, + {0.284414,0.813877}, + {-0.174957,1.139543}, + {0.300714,-0.749478}, + {1.404330,-1.232405}, + {-0.313154,-0.213062}, + {0.652658,0.241568}, + {1.120691,0.518463}, + {0.224488,-0.153773}, + {0.375402,0.482763}, + {0.435975,0.236790}, + {1.127072,-0.422277}, + {0.580361,1.063162}, + {-0.955583,0.064231}, + {-1.802524,0.616951}, + {0.463128,-0.562220}, + {0.556800,0.473310}, + {0.658684,-0.639963}, + {-0.085954,-1.135439}, + {-0.243128,-0.126796}, + {-0.207362,-0.333691}, + {0.056183,-0.707808}, + {0.902377,-0.681407}, + {0.152853,0.619626}, + {-0.603487,0.293431}, + {0.133038,-0.379933}, + {0.264123,-0.101897}, + {0.861720,1.091886}, + {-0.479815,-0.165089}, + {-0.508836,0.900798}, + {-1.131878,0.459296}, + {0.037585,1.004276}, + {-0.480040,0.214050}, + {0.156506,-0.222274}, + {0.690720,0.133503}, + {0.429938,-0.394251}, + {-0.791723,-0.605653}, + {-0.554200,-0.418231}, + {-0.655144,-0.346624}, + {0.054409,0.359821}, + {-0.198795,-0.563282}, + {0.006104,0.725420}, + {-0.447277,0.540059}, + {-0.240985,0.280044}, + {0.637304,-0.116014}, + {1.381762,0.955712}, + {-0.148803,0.395996}, + {0.461393,0.840140}, + {-0.627308,-0.418263}, + {-2.171597,-0.599572}, + {0.080969,0.894764}, + {0.237331,-0.687851}, + {0.226158,-0.331895}, + {0.210506,-0.350461}, + {-0.043257,-0.021596}, + {0.551392,0.221253}, + {0.410879,-0.257200}, + {0.735420,0.692801}, + {-0.812522,0.436671}, + {-1.425556,-0.022695}, + {1.337264,-0.118216}, + {-0.196561,-1.121436}, + {-1.635570,-0.545684}, + {-0.259296,0.302864}, + {0.233845,0.231713}, + {-1.369904,0.069084}, + {0.310104,0.568822}, + {-0.074240,-0.389091}, + {0.513558,0.016256}, + {0.154059,-0.551779}, + {0.139022,0.002589}, + {1.252789,-1.075694}, + {-0.357876,0.779981}, + {-0.057981,-0.578702}, + {-0.348248,-0.564724}, + {-0.281181,0.160394}, + {0.755197,-1.493796}, + {0.349744,-0.585402}, + {-0.097265,0.568082}, + {-1.207000,0.702378}, + {-1.086582,0.502455}, + {-0.274557,-0.175564}, + {-0.663327,-1.099270}, + {0.025018,-0.858302}, + {0.251512,0.181174}, + {0.948731,0.438021}, + {0.278818,-0.736799}, + {0.384640,0.133641}, + {-0.269113,0.522492}, + {-0.192256,0.710115}, + {0.052306,0.974402}, + {0.154651,-0.268357}, + {-0.131640,0.099690}, + {-1.309976,-0.291957}, + {0.346624,0.382487}, + {0.516366,0.707133}, + {0.697076,1.540016}, + {0.490790,-0.397012}, + {1.123760,0.916850}, + {0.515663,0.434250}, + {-1.638678,-0.176421}, + {1.167902,-0.355185}, + {-0.264941,1.971705}, + {0.745419,-0.542922}, + {-0.754792,-0.652504}, + {1.369699,-0.283123}, + {-0.372842,-0.062135}, + {-0.746602,-1.311843}, + {0.620061,-0.729972}, + {-0.014445,-0.658271}, + {0.344167,0.003698}, + {-0.842281,1.037953}, + {-0.843122,-0.523207}, + {-0.318300,-0.179022}, + {-0.323143,0.019886}, + {0.430288,0.041221}, + {0.360478,0.640265}, + {0.483503,-0.160184}, + {0.244137,1.233902}, + {-0.545883,0.318665}, + {0.247693,-0.469566}, + {-0.321296,0.284737}, + {1.147200,0.641921}, + {1.216635,0.890397}, + {0.486701,0.456830}, + {0.550060,-0.222243}, + {-1.397045,0.187919}, + {0.912252,-0.441861}, + {1.245188,-0.318386}, + {-1.140431,0.133960}, + {-0.223423,-0.543275}, + {-0.259693,0.710342}, + {0.100516,0.525350}, + {-0.101837,-0.378891}, + {0.004744,-0.651883}, + {0.701837,0.505055}, + {1.259750,0.414716}, + {1.619510,-0.525369}, + {-0.927012,0.502818}, + {-0.687559,0.774157}, + {-1.015032,0.154981}, + {0.783957,0.857966}, + {1.055951,1.123508}, + {0.124867,-1.198195}, + {-0.122501,-0.319462}, + {0.522490,1.035699}, + {0.047462,-1.064514}, + {-0.069016,-0.011192}, + {-0.061777,0.932923}, + {-0.496995,0.483659}, + {0.960503,0.102691}, + {-0.858251,-0.587168}, + {-0.679635,-1.149459}, + {0.778286,0.086740}, + {-0.797912,0.786926}, + {0.043148,-1.618909}, + {0.354889,1.345281}, + {1.176276,-0.529673}, + {0.612892,1.322230}, + {0.784053,-1.188249}, + {-0.921667,1.036610}, + {-0.328724,-0.039212}, + {0.462540,1.173392}, + {-0.104801,-0.346268}, + {-0.531985,0.372684}, + {-0.788000,0.243345}, + {0.882742,-0.834651}, + {0.691050,0.394536}, + {-0.122631,0.586303}, + {-1.264893,-0.525182}, + {0.461967,0.151354}, + {0.776068,0.123712}, + {0.063297,0.200959}, + {0.136792,-0.138604}, + {-0.573293,0.711280}, + {0.738962,-1.300857}, + {0.159731,-0.141142}, + {-0.359106,-0.029247}, + {-1.076380,0.376036}, + {0.572506,-0.942929}, + {0.367264,0.437083}, + {-0.507908,-0.742628}, + {-0.012061,0.227037}, + {-0.747644,-0.353159}, + {-0.998729,-0.220973}, + {-0.587253,-0.390827}, + {-0.094152,0.756393}, + {0.448719,0.149999}, + {-0.218918,-0.048559}, + {-0.015560,-0.440495}, + {1.434334,-1.392218}, + {0.077947,-0.359505}, + {1.786997,-0.312543}, + {0.255695,-0.381884}, + {-0.301675,-0.104294}, + {0.700752,0.109512}, + {0.170083,1.699975}, + {-0.434933,0.267685}, + {0.402053,-0.343667}, + {0.698429,0.834043}, + {-0.331847,-0.731839}, + {-1.146666,-0.701629}, + {-0.002935,0.704111}, + {0.205245,0.690760}, + {-0.683238,0.215240}, + {-0.646288,0.694404}, + {0.325711,-0.046830}, + {0.592448,-0.308384}, + {1.529366,-0.987481}, + {-0.295320,-0.271241}, + {0.729563,-0.167488}, + {0.642193,-0.120176}, + {-1.548146,0.885333}, + {0.351531,0.897226}, + {1.595430,1.246450}, + {-0.486378,-0.288596}, + {-0.302011,0.618312}, + {0.182741,0.420557}, + {1.113837,0.316246}, + {0.527597,0.254757}, + {1.415948,-0.051085}, + {0.520356,-0.721367}, + {-0.144424,0.705921}, + {-0.070251,-1.038962}, + {-0.218357,1.041630}, + {0.729530,-0.690915}, + {0.128689,0.314481}, + {-0.117418,0.402299}, + {0.241349,-0.167075}, + {0.360539,0.711009}, + {-0.001491,0.204478}, + {0.487177,-0.385142}, + {0.480899,0.083528}, + {0.905059,-0.668149}, + {0.473028,0.683468}, + {0.048413,-0.513762}, + {0.392684,-0.016979}, + {0.008658,-0.397690}, + {0.312022,-0.290086}, + {-0.224513,-0.203352}, + {-0.700904,1.285464}, + {-0.209541,0.152510}, + {-0.689456,0.082655}, + {-0.090242,0.461600}, + {-0.012036,-0.301713}, + {-0.301809,1.238924}, + {-0.329893,-0.021590}, + {0.223851,0.421586}, + {0.317937,1.311734}, + {0.075659,-1.100616}, + {0.582116,0.136126}, + {-0.364256,-0.625304}, + {0.014662,-0.234577}, + {-1.092968,0.618389}, + {-0.238227,-0.574362}, + {-0.417061,-1.373738}, + {-0.534463,0.792450}, + {-0.112449,-0.282805}, + {-0.579626,0.953945}, + {-0.737441,-1.782889}, + {-0.761315,-0.665039}, + {-0.230262,0.334866}, + {-1.640518,0.345659}, + {-0.183278,1.207714}, + {-0.155715,0.262073}, + {0.495034,0.977896}, + {0.267491,0.395822}, + {0.020021,-0.525175}, + {-0.409405,0.155372}, + {-0.637273,0.397385}, + {0.569432,-0.826493}, + {-0.300224,-0.571919}, + {-0.419535,0.627416}, + {-0.670691,0.736638}, + {0.148186,0.842415}, + {-1.898319,0.635542}, + {-0.194627,-0.501422}, + {0.649891,0.952195}, + {-0.213436,-0.681949}, + {-0.868013,-1.363636}, + {0.613184,-1.017739}, + {-0.840052,-1.564144}, + {0.723446,-0.354610}, + {0.654592,-0.818130}, + {-0.712827,-0.762259}, + {0.166346,0.489915}, + {-0.302822,-0.693097}, + {1.358446,-1.355483}, + {-1.139428,0.086305}, + {-1.082740,1.498861}, + {-0.329648,0.147864}, + {-0.174769,-0.118863}, + {0.845277,-0.480739}, + {-0.289794,-0.173351}, + {0.837552,-0.021153}, + {-0.033429,0.650532}, + {-0.718426,-0.668466}, + {-0.238433,0.483005}, + {-0.720576,-0.226939}, + {-0.565185,-0.899305}, + {-0.586429,-0.847011}, + {0.948211,-1.151628}, + {0.079392,-1.199359}, + {-0.196210,-0.018502}, + {0.092218,-0.902690}, + {0.545633,-0.702880}, + {0.953190,-0.244621}, + {-0.122974,-0.872691}, + {1.001723,0.399548}, + {0.773129,0.292586}, + {0.369522,1.099643}, + {-0.128016,0.145086}, + {0.432098,-0.694186}, + {0.830267,-0.548718}, + {0.960296,-0.000663}, + {0.811884,0.184881}, + {-1.071500,0.409177}, + {0.738243,0.409131}, + {0.073622,0.031693}, + {-0.046745,0.274024}, + {-0.115489,-0.411869}, + {0.216582,-0.319286}, + {0.753995,-0.498359}, + {-0.216480,-1.134280}, + {-0.021988,-0.433786}, + {-0.327947,0.395941}, + {0.075096,-0.558661}, + {-1.031386,-0.090874}, + {0.661876,0.234726}, + {-0.032586,-0.957959}, + {0.675562,-0.062058}, + {0.089478,0.117239}, + {0.758516,-1.036737}, + {0.363183,-0.269026}, + {0.465104,0.683736}, + {0.515043,0.202359}, + {1.572937,-1.193864}, + {-0.456658,-0.051996}, + {-0.262883,-0.004140}, + {1.536223,-0.941011}, + {0.241501,-1.081946}, + {0.376242,-0.059869}, + {1.661854,-0.122313}, + {-0.171189,-0.902749}, + {0.163209,0.109854}, + {0.838006,-0.570945}, + {-0.403151,0.401615}, + {-0.941536,0.224667}, + {0.254770,0.119757}, + {0.010017,0.650252}, + {-0.849219,-0.093818}, + {0.438965,0.528280}, + {0.585909,0.170241}, + {-0.231668,-0.647083}, + {-0.812408,-0.241565}, + {-0.270441,-0.747414}, + {0.351427,-0.136789}, + {-0.454502,-1.594160}, + {-0.128552,-0.381218}, + {0.852571,0.550196}, + {-0.082519,-0.975152}, + {-0.118825,-0.587947}, + {0.118019,0.174990}, + {0.977679,0.989980}, + {-0.687867,0.152383}, + {1.597743,0.880373}, + {-0.926928,-0.305081}, + {-0.676320,0.054946}, + {-0.480725,-0.568788}, + {-0.366417,1.067759}, + {0.017773,1.235424}, + {1.404835,-1.087228}, + {-0.967946,0.352186}, + {-1.229937,-0.317813}, + {-0.051257,-0.039613}, + {-0.580332,-1.096354}, + {1.377717,0.775992}, + {-0.525138,-0.051334}, + {0.341863,0.010390}, + {-0.994051,0.551957}, + {0.554196,0.888456}, + {-0.096138,-0.120533}, + {0.772601,-0.270712}, + {0.643594,-0.087350}, + {0.409067,-0.299266}, + {-0.679971,-0.342567}, + {0.589620,0.703170}, + {0.636779,1.389787}, + {-0.824128,-0.335895}, + {0.607159,0.420643}, + {1.373971,-0.342893}, + {-0.910657,0.837440}, + {1.034973,-0.352405}, + {1.085682,1.920129}, + {0.064748,0.257708}, + {0.862755,0.755955}, + {-0.684932,0.094005}, + {0.112119,-1.441972}, + {1.163420,-0.049867}, + {-0.635217,0.609453}, + {-0.238855,0.480435}, + {1.449328,-0.098448}, + {0.784127,-0.652244}, + {0.769041,-0.937921}, + {0.835573,0.295585}, + {-0.062899,1.494506}, + {-0.062220,0.228891}, + {0.481334,-0.470990}, + {-0.505073,0.374573}, + {-0.099382,-0.967523}, + {1.186319,-0.831618}, + {-0.399300,0.931511}, + {-1.524902,-0.985501}, + {-0.615012,0.547274}, + {0.268857,-0.076929}, + {-0.897427,1.088771}, + {1.055351,0.095282}, + {1.708821,-0.076167}, + {-0.739946,-0.354375}, + {0.373417,0.855748}, + {0.131967,0.285461}, + {-0.364408,-1.708271}, + {-1.014175,0.495565}, + {0.505787,1.003443}, + {0.391683,-0.524584}, + {0.752228,0.882360}, + {-0.394883,1.502965}, + {-0.997717,-0.172972}, + {-0.230813,0.301756}, + {0.669804,-0.121530}, + {-0.070862,-0.368520}, + {1.320153,-0.521160}, + {-1.390873,0.259563}, + {1.146922,0.597540}, + {0.281829,-0.449891}, + {0.295038,0.408987}, + {-0.202209,-1.183362}, + {-0.399018,-0.672154}, + {1.004778,-1.104954}, + {0.143005,0.049996}, + {0.232512,0.669719}, + {0.094630,-0.576997}, + {0.667844,0.367973}, + {-0.537996,0.626066}, + {1.033757,-0.285931}, + {0.992368,-0.514368}, + {-0.319021,0.248041}, + {1.579195,-0.231515}, + {-0.582862,0.913516}, + {-1.085018,0.556959}, + {-0.024787,0.559586}, + {0.402267,0.959849}, + {-0.032095,-0.548640}, + {-1.150115,-0.539607}, + {0.385566,-0.409285}, + {-1.471116,0.537079}, + {0.392795,-1.486643}, + {0.328634,-0.040776}, + {-0.084120,0.830458}, + {-0.524122,0.922066}, + {-0.416595,-0.044276}, + {0.100140,0.462444}, + {-0.590881,1.340948}, + {-0.891718,0.723849}, + {0.337707,-0.670773}, + {0.721537,0.536058}, + {0.059957,0.287448}, + {0.400511,-0.763103}, + {-0.550953,-0.197097}, + {0.591824,0.441947}, + {0.447746,-0.502807}, + {-0.167608,-0.888259}, + {1.103233,-1.437809}, + {0.199023,0.063524}, + {0.202555,0.322043}, + {-0.976584,-0.396812}, + {0.372419,-0.791595}, + {1.289941,0.357281}, + {-0.228916,-1.001487}, + {1.049654,-0.610849}, + {-1.054080,-0.370253}, + {0.859058,-0.644741}, + {-0.377507,0.207554}, + {-0.559546,0.074691}, + {-1.074664,1.355183}, + {0.305625,0.198544}, + {-0.606985,0.356763}, + {0.242896,-0.375304}, + {-0.749774,-0.181054}, + {-0.342246,-0.259054}, + {1.589396,1.010118}, + {1.140405,-0.864599}, + {-1.096629,-0.377337}, + {-0.496940,0.605907}, + {-0.664267,-0.651997}, + {0.951590,0.175420}, + {-1.117929,-0.261231}, + {-0.534170,0.241918}, + {-0.781527,0.244559}, + {-0.271591,0.486803}, + {-1.256120,0.858586}, + {-0.421249,0.405847}, + {0.479353,-0.525636}, + {0.209101,0.142047}, + {-0.083113,0.886645}, + {-0.471083,-0.416663}, + {0.011834,-0.389550}, + {0.669072,-1.245624}, + {-0.598668,0.117422}, + {-0.173989,-0.056465}, + {-0.922954,0.482571}, + {0.522571,-0.365634}, + {0.042361,1.106480}, + {0.655395,-0.034779}, + {0.631652,-0.294389}, + {1.527036,-0.058525}, + {-0.249208,0.459807}, + {-0.887983,-0.627558}, + {-0.289353,-1.411403}, + {0.054751,2.470137}, + {-0.248717,1.053043}, + {-0.735576,0.010779}, + {-0.514003,-0.279226}, + {0.305765,1.274540}, + {0.534981,0.774853}, + {0.392611,-0.644576}, + {-0.468937,1.078119}, + {-0.541705,1.414380}, + {0.277103,0.165488}, + {-0.387851,-0.830792}, + {-1.253914,0.532510}, + {-0.221315,1.797991}, + {0.274370,0.277949}, + {-1.765567,0.046853}, + {-0.327146,-0.297614}, + {-0.984489,-0.168465}, + {-0.660634,-0.450022}, + {0.198917,-0.218025}, + {-0.677175,-0.172085}, + {0.644052,0.285876}, + {0.088023,0.232635}, + {-0.451399,-1.512956}, + {-0.377844,-0.626486}, + {-0.362430,-0.127407}, + {-0.840019,0.380215}, + {0.114939,0.878416}, + {0.470442,-0.105566}, + {-0.585039,0.237390}, + {-0.815600,-0.504437}, + {-0.161445,0.036143}, + {0.296359,1.325861}, + {-0.322171,-1.669738}, + {1.477603,0.776825}, + {0.381550,-0.635687}, + {-0.694525,-0.559498}, + {-1.930663,-0.704911}, + {-0.449682,-0.545347}, + {0.026977,-0.127266}, + {0.233908,0.544153}, + {-0.863452,-0.074155}, + {-0.649361,2.113175}, + {-1.059833,0.624585}, + {0.846892,-1.573266}, + {-0.217441,-0.559443}, + {-0.160678,1.002391}, + {0.804081,-0.338683}, + {-1.541742,0.230370}, + {-0.503421,-0.416987}, + {1.028147,0.529024}, + {-0.596178,0.738456}, + {-1.173493,0.202724}, + {-0.297988,-0.661943}, + {0.302419,0.866482}, + {-0.521944,-1.270284}, + {-0.436218,-0.097784}, + {-0.264531,-0.550600}, + {1.014478,-0.038692}, + {-0.999085,0.486181}, + {1.440740,-0.371893}, + {-0.042694,0.067326}, + {0.093956,-0.957300}, + {-0.375195,-0.970154}, + {-0.251632,-1.304492}, + {-0.414494,1.099568}, + {0.017527,0.168563}, + {-1.263777,0.285450}, + {0.068131,0.327754}, + {1.105079,0.539763}, + {0.981225,-0.468582}, + {0.551992,-0.036035}, + {1.124159,-0.005432}, + {0.611806,-0.979175}, + {0.483684,-0.518734}, + {-0.366983,0.455012}, + {-1.008954,0.471497}, + {-0.133646,-0.509659}, + {-1.029489,0.006309}, + {0.530972,-0.509375}, + {1.140833,0.249621}, + {-0.211773,0.138957}, + {-0.537149,1.254415}, + {-0.213279,0.065513}, + {-1.082796,0.529235}, + {0.350453,0.444304}, + {0.031279,-0.234978}, + {-0.543908,0.234837}, + {0.487194,1.375390}, + {0.215563,-0.549211}, + {0.072623,0.165267}, + {0.801105,-0.987048}, + {0.269412,0.711896}, + {0.027622,0.562303}, + {-0.813866,-0.782547}, + {-0.093912,0.227673}, + {-0.172055,0.060514}, + {0.074656,-0.266314}, + {1.217632,-0.605089}, + {-0.535103,-0.616239}, + {0.151379,-0.076634}, + {0.642760,-0.481053}, + {0.035701,-0.056708}, + {0.980441,-1.299210}, + {-0.856956,-1.002073}, + {0.598486,0.466839}, + {-0.386966,-1.046460}, + {0.625117,-0.115207}, + {-0.260750,-0.041046}, + {0.076652,-0.932881}, + {0.265818,0.764649}, + {0.421985,-0.714312}, + {-0.601085,0.964101}, + {0.467187,-0.124653}, + {-0.387454,0.211856}, + {-0.157263,-0.585296}, + {0.418027,-0.077462}, + {1.583309,-0.609096}, + {0.884257,0.515131}, + {0.138889,-0.138020}, + {-0.169847,0.059272}, + {0.540075,0.309144}, + {0.557179,1.418778}, + {0.610912,0.512799}, + {-0.873253,0.692568}, + {0.120274,-0.853970}, + {-0.586573,-0.561751}, + {-0.672660,0.694987}, + {1.109601,0.008173}, + {1.003841,-0.652223}, + {0.874688,0.367941}, + {-0.330203,0.745219}, + {-0.753140,0.915769}, + {-0.696116,0.227309}, + {0.346841,0.100445}, + {0.740158,-0.250985}, + {-0.397857,0.594584}, + {1.110536,0.339610}, + {0.345296,-0.347319}, + {-0.907915,-0.471159}, + {-0.649958,1.565001}, + {0.775790,-0.287460}, + {1.032125,0.130026}, + {0.907496,1.390180}, + {0.298254,-1.588717}, + {-0.259348,0.502732}, + {0.220840,-0.783740}, + {-0.138042,-0.590126}, + {0.426154,-0.091085}, + {0.405208,0.611676}, + {-0.204049,-0.083068}, + {0.159682,0.740970}, + {0.942561,0.693500}, + {-0.610743,0.303196}, + {0.172349,1.598668}, + {1.627400,-0.281164}, + {0.551930,0.098748}, + {-0.388243,0.433245}, + {-1.235033,0.763915}, + {-0.744667,-0.561124}, + {-0.592271,-0.641181}, + {0.156840,0.347964}, + {-0.023119,0.533539}, + {0.011757,1.073952}, + {-1.186307,0.280738}, + {0.756950,1.492111}, + {-0.877649,0.112185}, + {-0.585789,-0.254425}, + {0.038438,-0.550157}, + {0.314995,0.322778}, + {-0.134760,0.871567}, + {-1.044096,-0.636270}, + {0.590711,0.558388}, + {0.209019,0.293453}, + {-0.599300,0.026492}, + {1.033710,-0.675529}, + {-1.954583,0.594947}, + {-0.182764,0.343157}, + {0.859978,0.329311}, + {0.646436,-0.806192}, + {-0.046664,0.909861}, + {1.093129,0.536020}, + {0.872300,0.678087}, + {-0.123750,0.457168}, + {0.551871,-0.941036}, + {0.794294,-0.407648}, + {-1.538821,-0.171563}, + {-1.035249,0.118770}, + {-0.348383,-0.118152}, + {-0.226615,-0.889496}, + {1.341554,0.160355}, + {-0.351517,-0.424568}, + {-0.070817,0.414649}, + {-0.442786,0.423882}, + {-0.388425,1.093738}, + {-0.582796,0.676209}, + {0.752177,0.821946}, + {-1.006474,0.412201}, + {-0.416449,-0.072394}, + {-0.911661,1.041543}, + {0.003509,0.102477}, + {0.196127,0.591685}, + {0.326262,-0.526969}, + {-1.042304,0.505778}, + {-1.505353,-1.006878}, + {-0.951996,-1.085898}, + {-0.317499,0.045335}, + {-0.099205,0.858056}, + {0.764524,1.480639}, + {0.517856,0.207770}, + {-0.742181,0.240161}, + {-0.555104,-0.871874}, + {-0.699238,-0.986373}, + {-0.763561,-1.000094}, + {0.670026,-0.733751}, + {0.662880,-0.655407}, + {0.119571,-1.657008}, + {-0.223206,-1.113342}, + {0.487176,0.474053}, + {0.192200,1.888510}, + {0.611398,-0.667669}, + {-1.403757,0.409866}, + {0.024463,-0.041370}, + {-0.609262,0.806420}, + {-0.907307,1.198974}, + {0.162117,-1.544459}, + {-0.796786,0.537950}, + {-0.387992,-0.266020}, + {-0.225214,-0.058790}, + {0.753621,0.972150}, + {-0.615864,1.401833}, + {-0.819524,-0.597168}, + {0.647379,-0.468126}, + {-0.655050,-0.432251}, + {-0.069667,-1.062873}, + {0.359295,0.145826}, + {0.647484,0.920104}, + {-0.101287,-0.687857}, + {0.695485,0.112454}, + {0.685476,-0.236214}, + {0.374271,-0.144157}, + {-1.779720,-0.300198}, + {0.145786,0.213707}, + {0.038580,-0.033343}, + {0.672791,1.277813}, + {0.479531,1.053826}, + {-0.907617,-0.059189}, + {-0.172751,0.074425}, + {-0.349068,0.726073}, + {0.008332,0.348492}, + {0.319315,-0.391381}, + {0.402430,0.078896}, + {-0.391121,0.722606}, + {0.081394,0.035975}, + {0.604639,0.636573}, + {-0.598326,-0.581740}, + {-1.369758,1.353076}, + {-1.032156,-0.428532}, + {-0.405163,0.809273}, + {-0.638386,-0.671499}, + {-1.571366,-0.098790}, + {-0.047946,-0.327424}, + {-0.535140,1.485649}, + {0.572495,-0.533611}, + {0.769134,-0.416792}, + {-0.122776,0.855205}, + {0.281802,-0.669203}, + {0.694392,-0.350054}, + {-0.516665,0.498350}, + {-1.145787,0.669606}, + {-0.587504,-1.078295}, + {-0.906257,1.099786}, + {0.713687,-0.104260}, + {0.500828,-1.120030}, + {0.201346,0.446714}, + {0.571867,0.307374}, + {-0.307728,1.383134}, + {-0.066681,0.450119}, + {-0.848761,-1.038823}, + {1.032712,0.224183}, + {0.061333,-0.310979}, + {0.468093,0.223010}, + {-0.199854,-0.913527}, + {-0.857930,0.211259}, + {-0.587648,-0.245449}, + {0.353839,-0.297458}, + {0.888759,-0.874265}, + {0.403853,-0.386048}, + {0.278338,0.103402}, + {-0.538262,-0.477405}, + {-0.028885,1.451692}, + {0.309332,0.336400}, + {-0.000990,0.952112}, + {0.551432,0.708093}, + {0.885608,0.394472}, + {0.630507,0.873531}, + {2.009406,0.830925}, + {0.270462,0.962180}, + {-0.188686,0.224709}, + {-0.176674,-0.183785}, + {0.140600,1.093924}, + {0.189660,-0.420077}, + {-0.523965,-0.625934}, + {-0.336031,0.037125}, + {0.082479,-0.028029}, + {-0.186355,-0.412999}, + {0.082385,1.314585}, + {-0.916720,0.023372}, + {0.361526,0.970313}, + {-1.036301,0.902711}, + {0.753404,-1.144667}, + {1.331139,0.200917}, + {0.079871,0.568019}, + {0.105169,-0.612822}, + {-1.203528,-0.279910}, + {0.681629,-0.484965}, + {1.737185,-1.163903}, + {-0.073538,-0.938369}, + {0.199483,0.191980}, + {-0.463281,0.147863}, + {0.502202,1.383967}, + {0.662814,-0.696233}, + {0.322913,-0.224863}, + {-0.039758,-0.433784}, + {-0.241469,0.133004}, + {0.631311,-0.203045}, + {-0.490926,0.738562}, + {-0.738987,-0.807033}, + {-0.559719,-1.710482}, + {0.414458,-1.114866}, + {0.217559,-1.101081}, + {2.001337,-0.837311}, + {-0.309366,-1.325185}, + {-0.421962,-0.105397}, + {-0.254192,0.250041}, + {0.149750,1.424141}, + {0.574641,-0.960555}, + {1.300898,0.408217}, + {1.120122,-0.397386}, + {0.988203,-0.705869}, + {0.025219,-0.318984}, + {-0.787385,0.484271}, + {0.244498,-1.167668}, + {-0.293105,1.187101}, + {-1.315942,-0.787983}, + {0.014455,0.371305}, + {0.454436,-0.013107}, + {-0.983662,0.592077}, + {-0.500665,0.485289}, + {-0.822873,-0.988985}, + {-0.684186,0.119209}, + {-0.770508,0.745145}, + {0.751135,0.857208}, + {0.580580,-0.403847}, + {-0.261483,0.001789}, + {-0.599543,0.700149}, + {-0.134033,0.276866}, + {1.292787,0.681824}, + {0.571468,-0.079806}, + {-0.420807,-0.237937}, + {-1.393211,-1.148364}, + {-0.826257,-0.341136}, + {-1.430113,-0.469738}, + {0.254639,-0.935916}, + {0.477547,-0.063091}, + {0.143719,-0.656087}, + {-1.043832,-1.865735}, + {-0.223533,-0.255380}, + {-0.347852,1.319428}, + {0.216353,0.217898}, + {0.751324,-0.392111}, + {0.126306,0.463054}, + {0.421776,0.953244}, + {0.101965,0.723898}, + {0.711760,0.644511}, + {1.214540,-0.992251}, + {-0.900924,0.851336}, + {-0.768326,-0.273583}, + {0.611353,-0.777963}, + {-0.644784,-0.597365}, + {-0.866147,-0.077811}, + {1.171992,-0.373912}, + {0.166663,0.845840}, + {-0.051581,-0.037914}, + {-0.044931,0.952456}, + {1.025787,0.092280}, + {0.682561,1.339457}, + {-0.392748,0.417949}, + {0.032937,0.238781}, + {-0.620218,-0.190434}, + {-0.281839,0.385357}, + {-1.841805,0.735532}, + {0.803464,0.390506}, + {-0.520705,-1.106509}, + {-0.231873,-0.372118}, + {1.238221,-0.126795}, + {0.021599,0.567909}, + {0.135681,0.509549}, + {-0.372477,0.993091}, + {-0.463447,2.094221}, + {-1.084856,0.187484}, + {-0.146659,-0.233581}, + {0.020933,-0.106898}, + {0.829958,0.011197}, + {-0.094014,-0.883021}, + {0.547873,-0.450064}, + {0.202885,1.034507}, + {0.994910,0.329836}, + {1.331541,-0.281977}, + {0.228948,-2.008565}, + {-0.478031,0.427230}, + {1.083612,-1.020268}, + {-0.249602,1.393039}, + {-0.012306,0.044320}, + {0.574595,-0.315582}, + {0.774972,-0.431653}, + {0.270253,1.094467}, + {0.120273,-0.263953}, + {1.016864,0.431796}, + {-0.309168,-0.270309}, + {-1.523819,0.385376}, + {-0.763456,0.512232}, + {0.336560,0.850508}, + {0.042057,-0.438179}, + {0.847706,-0.456465}, + {0.742120,0.530981}, + {-0.373430,-1.277644}, + {0.670180,-1.752892}, + {-0.817789,0.218930}, + {0.452251,-0.077324}, + {-0.072623,-0.105395}, + {-1.412266,-1.332875}, + {0.357278,0.516348}, + {-0.043991,-1.067616}, + {1.180654,-0.141604}, + {0.105626,-0.698556}, + {0.368029,0.262566}, + {-0.920419,0.474313}, + {-0.223634,0.572453}, + {0.361011,0.280134}, + {0.558817,0.182521}, + {0.561101,0.605270}, + {0.229716,-0.019313}, + {-0.434761,-0.308359}, + {-0.245133,0.726120}, + {-0.390881,-1.251642}, + {-0.250035,-1.268882}, + {1.655818,-0.092527}, + {-0.910120,0.060578}, + {-0.188804,-0.314052}, + {1.215279,-0.127738}, + {-0.878795,0.285774}, + {0.369799,-0.207177}, + {0.389388,0.134644}, + {0.047652,0.563269}, + {0.447321,-0.865163}, + {-0.080775,-0.368620}, + {-1.003217,-0.560501}, + {0.115756,0.065585}, + {0.736376,-0.286535}, + {-0.305092,0.029092}, + {0.016444,-0.133073}, + {-0.385179,-0.465072}, + {-0.411212,-0.129245}, + {-2.027827,0.247035}, + {-0.408223,-0.432254}, + {-0.623146,-0.096782}, + {0.066094,0.359122}, + {-0.658791,1.673232}, + {0.345053,0.994307}, + {0.475042,-0.520856}, + {-0.629916,0.001245}, + {0.231530,-0.112516}, + {-0.310512,0.763089}, + {0.351545,-0.857181}, + {-1.282645,0.358697}, + {0.265706,-0.200202}, + {-1.020432,-0.205901}, + {-0.450405,0.863954}, + {0.535266,-1.489977}, + {0.116972,-0.830045}, + {-0.574343,0.203469}, + {-1.234327,0.190012}, + {-0.671839,0.202848}, + {-0.511748,0.717934}, + {-0.667350,-0.498889}, + {0.062991,-0.257410}, + {1.387187,0.166053}, + {0.038892,-0.294788}, + {-0.197843,-1.474079}, + {0.842538,0.954516}, + {0.190780,-0.445425}, + {0.986009,0.305338}, + {-0.043897,-0.600633}, + {1.275066,0.500597}, + {0.688402,0.940529}, + {0.681829,1.527615}, + {1.058668,0.147151}, + {1.057440,0.219391}, + {0.279102,0.711516}, + {-0.735985,-0.916082}, + {-0.795380,0.473156}, + {-0.188000,-0.126179}, + {-0.130109,1.022084}, + {-0.255161,-0.611966}, + {-0.712545,0.512778}, + {-0.390866,-0.023470}, + {0.585919,0.072051}, + {0.265748,-0.113116}, + {-0.954015,0.396356}, + {1.150886,0.526901}, + {0.918889,-0.335352}, + {0.908329,-0.918572}, + {0.829812,1.271961}, + {0.385431,0.764974}, + {0.842191,0.817413}, + {-0.211592,-0.300848}, + {0.085412,-0.503896}, + {-0.295625,-1.210188}, + {0.553279,-0.752066}, + {-0.336870,-0.023617}, + {-0.117579,0.194043}, + {-0.439305,0.074470}, + {-0.871696,0.517667}, + {1.132128,-0.352925}, + {1.659963,0.078571}, + {-0.718459,1.770532}, + {-0.815585,0.052456}, + {0.462433,-0.846664}, + {0.112519,-0.115914}, + {0.351286,0.311147}, + {0.445398,1.030217}, + {-1.336584,0.196926}, + {1.720238,-0.567869}, + {-0.036464,0.802003}, + {-0.783873,-0.818943}, + {1.240642,0.976164}, + {0.760370,0.622208}, + {0.716383,0.043453}, + {0.007335,0.445271}, + {-1.912350,0.369577}, + {0.471466,-0.281855}, + {-1.259278,0.458071}, + {-0.505514,0.551813}, + {0.808326,0.336688}, + {0.134236,0.795999}, + {-1.110478,0.657803}, + {0.788157,-1.379746}, + {-0.602157,-0.601484}, + {-0.601597,-0.629413}, + {-0.562336,-0.375857}, + {-0.115154,-0.348384}, + {-1.337893,-0.034902}, + {-0.421096,-0.451334}, + {0.828483,1.195515}, + {-1.170578,-0.527504}, + {-0.310432,0.760422}, + {-1.197816,0.709533}, + {-0.127652,-0.091019}, + {0.069065,-0.305886}, + {-0.078245,-0.633251}, + {0.088257,0.108119}, + {-0.449101,0.132235}, + {-0.124084,1.428966}, + {-0.281890,0.234157}, + {-0.525617,0.582656}, + {-0.816034,0.676694}, + {0.126295,-0.336684}, + {0.148247,0.687522}, + {-0.650085,0.552353}, + {1.047440,-0.871696}, + {-0.652720,0.124596}, + {0.143902,-0.299925}, + {-0.045092,-0.377154}, + {0.337776,-0.360983}, + {-1.034746,-0.453121}, + {0.446298,-0.614523}, + {-0.576398,-0.186150}, + {-0.660111,0.507337}, + {-0.212991,-0.067267}, + {-0.472959,0.233856}, + {0.757097,0.921087}, + {-0.371281,-0.873578}, + {-0.462358,-0.546336}, + {1.046260,0.861505}, + {0.188323,-0.927420}, + {-0.394811,-0.928531}, + {-0.745356,1.802213}, + {-0.144337,1.288925}, + {0.042964,0.393180}, + {-1.051774,-0.538140}, + {-0.859913,-0.181454}, + {-0.768838,-0.081829}, + {-0.410304,-0.505518}, + {0.513469,-0.829740}, + {0.143379,-0.353562}, + {0.259461,-0.349013}, + {-0.693666,0.506081}, + {-0.142532,-1.125624}, + {0.027827,0.093478}, + {0.755859,-1.261207}, + {-0.805314,0.460203}, + {0.565516,0.049003}, + {-0.290886,-0.435227}, + {0.177884,1.134761}, + {-0.790097,-1.155042}, + {0.609440,-0.427450}, + {-1.456648,0.430752}, + {0.731694,0.148750}, + {-1.096537,-0.659722}, + {-0.045365,-0.812621}, + {-0.052870,-0.012892}, + {-0.186133,-1.655777}, + {-1.233724,0.005300}, + {0.227544,-0.206169}, + {0.444051,-1.393497}, + {0.145246,-0.470748}, + {0.321554,-0.540005}, + {0.574299,0.947717}, + {-0.851562,0.821642}, + {-0.224767,0.375636}, + {-1.247393,-1.880826}, + {0.869151,0.644628}, + {1.350218,-0.621884}, + {0.386796,-0.520246}, + {-0.978645,0.272595}, + {0.065436,-0.430137}, + {-0.790944,0.646567}, + {-0.368160,0.501998}, + {-0.401020,0.148140}, + {-0.046369,-0.202567}, + {0.058994,-0.870889}, + {-0.652756,1.932327}, + {0.172676,-1.271166}, + {0.413797,0.955612}, + {0.814433,0.006399}, + {0.328790,1.584645}, + {0.709699,0.490172}, + {-0.774854,-0.005901}, + {0.730751,-2.130532}, + {0.585216,-0.058045}, + {0.745170,-0.426331}, + {-0.547863,0.536897}, + {0.291419,0.183834}, + {0.370049,-0.225214}, + {0.720345,0.700864}, + {-0.658056,0.512990}, + {-0.197299,-0.572787}, + {-0.980329,-0.373197}, + {-0.102615,-0.600997}, + {0.551575,0.035526}, + {0.227213,-1.755647}, + {-0.720773,1.473189}, + {1.078551,0.494038}, + {-0.590708,-0.726487}, + {0.174511,0.593049}, + {-1.113569,-0.861532}, + {-0.863915,-0.407862}, + {-1.489835,0.680252}, + {0.605744,-0.755458}, + {0.019818,-1.444399}, + {1.537532,0.420513}, + {0.454858,0.278244}, + {-1.167997,0.522964}, + {0.636516,0.864054}, + {0.904913,0.954676}, + {-0.172054,1.515377}, + {-0.323955,-0.109815}, + {-0.408556,-0.110050}, + {-0.074129,0.608238}, + {0.907023,0.611414}, + {0.527238,-0.111692}, + {-1.210925,1.026236}, + {0.414338,-1.508815}, + {0.865041,0.205104}, + {-0.519846,0.335515}, + {0.025669,0.894116}, + {-0.069780,0.825868}, + {-0.977589,0.602818}, + {-1.474683,-1.465573}, + {-0.906716,-1.172873}, + {0.633533,-0.164525}, + {1.348636,-0.597077}, + {-0.676391,-0.863396}, + {0.836835,0.681102}, + {0.597157,-0.230220}, + {0.394546,0.387985}, + {-0.930641,0.087960}, + {-0.591838,-0.300588}, + {-0.886742,0.109750}, + {-1.099630,-1.113304}, + {-0.728393,-0.212042}, + {0.763934,-0.639567}, + {0.298122,-0.353191}, + {-0.190079,-0.338979}, + {0.348171,0.548532}, + {-0.524688,-0.411727}, + {0.233072,-0.517023}, + {0.062224,-0.491644}, + {-1.043832,0.098989}, + {-0.476795,-1.490535}, + {0.329321,0.234013}, + {0.221229,0.925059}, + {-0.390816,0.510160}, + {0.875961,0.263989}, + {0.269341,0.588287}, + {-0.104352,1.572109}, + {-0.466807,-0.291013}, + {0.052197,0.507006}, + {-1.203065,0.707042}, + {-1.156324,0.471411}, + {0.754021,-0.321351}, + {-0.351852,0.063256}, + {1.050723,-0.239489}, + {0.095218,-0.048337}, + {-1.306553,-0.315263}, + {0.445850,-0.782225}, + {2.486118,-0.184109}, + {-0.450901,0.744972}, + {0.815191,-0.335411}, + {-0.842677,-0.284237}, + {0.315266,-0.974383}, + {0.075656,-0.930034}, + {-0.265583,0.430262}, + {-0.066361,-0.215722}, + {0.460555,-0.264005}, + {0.338359,-1.339680}, + {-0.711655,0.100374}, + {-0.092740,1.377253}, + {-0.072264,-0.288660}, + {-0.052467,0.772709}, + {0.293775,0.090349}, + {0.824527,1.267417}, + {-0.112363,0.132903}, + {-0.363463,0.969263}, + {-1.642345,0.744705}, + {-0.477562,1.379558}, + {-0.589734,-0.589188}, + {-0.466736,-0.970264}, + {0.010874,0.547445}, + {1.722207,0.884766}, + {0.098718,-0.666330}, + {-0.296542,-1.569936}, + {1.125261,-0.712730}, + {-0.975173,0.932793}, + {0.634325,1.085860}, + {0.217421,0.671107}, + {0.305540,-1.001059}, + {0.798078,0.480317}, + {1.662060,-0.279516}, + {0.613269,-0.820772}, + {-0.367006,0.253467}, + {-0.506871,0.590810}, + {2.014429,-0.631055}, + {-1.851417,-0.047491}, + {0.237869,-0.702116}, + {-0.850494,0.647305}, + {0.129418,-0.098577}, + {-0.842460,0.401123}, + {0.289509,-0.445374}, + {-0.192546,0.423623}, + {0.132945,-0.395475}, + {1.171623,-0.137565}, + {-0.672710,0.703577}, + {0.289266,0.112169}, + {0.388150,-1.503414}, + {-0.632542,-1.193749}, + {-0.836479,-1.570629}, + {-0.117854,0.799663}, + {-1.031422,0.769983}, + {1.141551,1.223726}, + {-0.136202,0.032976}, + {0.539139,-0.362692}, + {0.386391,-0.404400}, + {-0.807908,0.672289}, + {-0.273757,0.409065}, + {0.072317,0.218765}, + {0.315393,-0.161862}, + {0.109827,0.280521}, + {1.124393,-0.880358}, + {1.062493,-0.861810}, + {-0.694576,0.955105}, + {-0.704939,0.712260}, + {0.620207,0.404908}, + {-0.149497,0.008919}, + {0.213315,0.753410}, + {0.882143,0.344575}, + {-0.580178,-0.062246}, + {0.588335,0.732016}, + {-0.923274,0.056641}, + {-0.172440,-0.095349}, + {-1.135217,0.278840}, + {0.775523,-0.339523}, + {-0.314081,-0.344806}, + {-0.764043,-0.198468}, + {-0.089438,-0.785644}, + {-1.040912,1.061657}, + {0.895079,-0.034029}, + {-0.526144,-1.937661}, + {-0.207926,-1.120596}, + {-0.091010,-0.505344}, + {0.284329,0.647329}, + {1.276309,-0.095555}, + {-1.225333,0.215700}, + {0.090999,0.073973}, + {0.870768,-0.363724}, + {0.248731,0.020068}, + {-0.548422,-0.119689}, + {0.920298,-0.082783}, + {-0.467797,1.355912}, + {1.329022,-0.309356}, + {-1.728073,-0.120729}, + {0.624453,0.563478}, + {-0.698755,0.502237}, + {0.401369,-1.301986}, + {-0.924123,-0.248924}, + {0.419063,-0.429884}, + {-0.417802,0.312480}, + {0.303873,0.281815}, + {-0.216253,-0.382458}, + {0.871156,0.437237}, + {0.076165,-0.075358}, + {0.978428,0.177972}, + {-0.387862,-0.666285}, + {-0.385355,-1.084756}, + {-0.039386,0.090518}, + {-0.110409,-0.131921}, + {-0.266880,-0.746409}, + {-0.628974,0.648673}, + {-0.473564,-0.126878}, + {0.061978,-0.647717}, + {-0.282066,-0.853113}, + {-0.118735,1.327370}, + {1.149891,1.209448}, + {0.352147,-0.388989}, + {1.769291,-0.319750}, + {0.764107,-0.667852}, + {-0.587102,-0.210417}, + {1.015087,0.052787}, + {-0.035987,1.195230}, + {0.892858,0.405185}, + {-0.756342,-0.517984}, + {0.623213,-0.595297}, + {0.604408,1.193989}, + {0.953219,0.110624}, + {0.152238,0.507352}, + {-0.094461,-0.308558}, + {0.384838,-0.277351}, + {0.025861,-0.759865}, + {-0.657839,0.460731}, + {-0.194513,0.533848}, + {1.023904,-0.500503}, + {-0.359781,0.642104}, + {-0.404128,-0.973247}, + {0.908211,-0.748690}, + {1.828527,0.178212}, + {0.993783,0.377209}, + {0.497713,0.653823}, + {1.349187,-0.664650}, + {0.867764,-0.677804}, + {0.784912,-0.648229}, + {0.855189,0.283978}, + {-0.177741,0.486565}, + {0.171991,-1.590330}, + {-0.341884,-0.551188}, + {0.552575,-1.140915}, + {0.234083,-0.731475}, + {-0.841477,0.261885}, + {-0.463546,1.015421}, + {-0.655670,-0.933363}, + {0.091412,-0.144388}, + {0.777763,-1.143306}, + {0.393413,0.247097}, + {-0.859657,1.263778}, + {-0.091360,-0.695528}, + {0.453558,0.447697}, + {-0.285448,-0.091432}, + {0.575826,0.771546}, + {-0.185321,-0.400092}, + {-0.927254,-0.065710}, + {-0.404850,0.199127}, + {1.175847,-0.727493}, + {-0.646317,-0.100079}, + {-0.146116,0.997661}, + {0.940721,0.331262}, + {-0.176631,-0.432014}, + {-0.158682,0.007962}, + {0.403128,0.862988}, + {-1.286299,-0.553118}, + {-0.625140,-0.416925}, + {0.164739,0.127397}, + {-1.296657,0.431593}, + {0.110012,0.621031}, + {0.131967,0.747297}, + {-0.417073,-0.528516}, + {-0.058879,0.064701}, + {0.878022,0.417763}, + {-0.593777,-0.749282}, + {-1.488954,-0.088751}, + {0.327350,0.729740}, + {0.288635,0.711133}, + {-0.516210,0.772244}, + {0.646623,-0.360133}, + {0.517444,-1.050468}, + {0.275757,-0.042346}, + {1.091949,-0.723761}, + {-0.581401,0.804300}, + {-0.281716,0.298812}, + {0.389729,-1.352334}, + {0.968056,-0.125904}, + {1.044800,0.400574}, + {0.876008,0.171549}, + {-0.861513,-0.111525}, + {1.321833,0.560932}, + {-0.756588,0.179387}, + {-1.030283,-0.202424}, + {-1.125655,0.034160}, + {-1.018706,0.236765}, + {-1.619937,1.162817}, + {0.587348,0.547688}, + {-1.197305,-0.512869}, + {-0.043864,-1.074949}, + {-0.830876,0.394422}, + {0.164382,-0.058257}, + {-1.269143,0.168948}, + {0.160676,-0.664515}, + {-0.505345,-1.100780}, + {-0.245201,0.068290}, + {-1.306518,-0.678766}, + {-0.425379,0.392774}, + {-0.258367,0.204147}, + {0.045519,-0.256474}, + {-2.017382,0.265548}, + {-0.452550,0.579091}, + {-0.340566,-0.079455}, + {-0.463289,-0.473197}, + {-0.304125,-1.146060}, + {-1.079937,0.770227}, + {0.697733,-1.635291}, + {0.794379,-0.590399}, + {2.066159,0.237608}, + {0.203241,0.228367}, + {0.209470,-0.821393}, + {1.064899,-0.383132}, + {0.799363,-0.151461}, + {-0.607846,0.619438}, + {-0.440935,-0.199774}, + {1.095711,0.112102}, + {-0.687980,-0.399792}, + {-0.489549,0.143813}, + {0.567918,0.022705}, + {0.838391,-1.106572}, + {1.085598,2.516036}, + {-0.699425,-0.521144}, + {-1.195329,-0.973063}, + {-0.455357,0.190010}, + {-0.365438,-0.562397}, + {-0.303810,-1.368273}, + {0.466171,-0.926118}, + {-0.428213,0.660771}, + {0.847118,1.179101}, + {0.431831,0.765670}, + {0.216519,0.066846}, + {0.050229,-1.132895}, + {-0.591341,-0.135568}, + {-1.016589,0.499351}, + {0.619695,1.239771}, + {-0.860305,0.327144}, + {0.794001,-0.673587}, + {-0.198357,0.818361}, + {1.168914,-0.014642}, + {0.448577,1.053050}, + {0.292636,-0.202807}, + {0.769249,0.583713}, + {0.416304,-0.914883}, + {0.462558,-0.935260}, + {0.088227,-0.958327}, + {0.594615,1.182851}, + {-0.204744,0.504845}, + {-0.244805,-0.381424}, + {-0.737471,-1.320935}, + {-0.528289,-0.573258}, + {-0.105260,-0.673370}, + {-0.635278,-0.500940}, + {0.839401,-0.789100}, + {-0.900784,0.142913}, + {-0.611013,1.205516}, + {-0.341594,0.707921}, + {-0.549906,-0.191784}, + {-0.351525,0.601229}, + {0.696679,-0.084436}, + {0.249797,-0.466641}, + {-0.112995,0.982649}, + {-0.103804,0.028549}, + {1.300759,0.562159}, + {0.188050,0.252173}, + {0.106742,0.672221}, + {1.403964,0.196841}, + {0.178249,1.119562}, + {0.478215,0.501237}, + {-0.603436,-0.402843}, + {0.938323,-0.147083}, + {-1.344410,-0.465496}, + {-0.274058,0.037370}, + {0.302808,0.701736}, + {0.522547,-1.063970}, + {0.214000,-1.234162}, + {0.115400,-0.182797}, + {0.613710,-1.188964}, + {-0.059478,-0.884451}, + {-0.020643,0.621642}, + {-0.485842,-0.203300}, + {-0.574101,1.824857}, + {-1.110800,0.465908}, + {-0.009223,-0.878354}, + {-0.970119,-0.234322}, + {2.232488,-0.241458}, + {-0.817618,-0.215082}, + {0.985711,-1.312330}, + {-0.043408,0.166327}, + {0.685598,-1.189246}, + {-0.863629,1.000956}, + {0.363370,0.558049}, + {-0.275515,-1.251793}, + {-0.783958,-0.159861}, + {-0.265416,1.423040}, + {-0.303787,0.078342}, + {-0.942708,0.058797}, + {-0.126596,-0.043927}, + {0.940185,-0.514732}, + {-1.717989,-0.302336}, + {0.392299,-0.472739}, + {-0.605450,-0.153565}, + {0.172246,1.273566}, + {0.973775,-0.571675}, + {0.412459,0.246981}, + {0.750398,0.637567}, + {-0.131172,-0.812034}, + {-0.412718,-0.312419}, + {-1.084367,0.469211}, + {-0.750192,0.239366}, + {-0.807903,0.025000}, + {0.169366,1.110027}, + {0.341377,-0.550559}, + {1.503539,-0.645394}, + {-0.546320,-0.503335}, + {0.349192,0.240205}, + {1.054660,-1.886768}, + {0.052298,0.500975}, + {-0.010100,-0.988941}, + {0.166413,-0.383006}, + {0.843436,0.918938}, + {-0.595515,0.371500}, + {-0.309942,1.492045}, + {0.605896,-0.550874}, + {0.379367,-0.626731}, + {-0.236509,0.601141}, + {-0.378510,-0.419328}, + {0.478068,0.010601}, + {-0.675805,-0.583364}, + {-0.210744,0.418466}, + {-0.189950,0.501288}, + {-0.463660,0.303614}, + {-0.537675,-0.958237}, + {-1.015898,-0.270030}, + {0.198231,0.122265}, + {1.116642,-0.840185}, + {-1.101533,1.812925}, + {-0.561163,-0.261127}, + {1.012467,0.890354}, + {-0.529417,0.082287}, + {0.009180,0.806196}, + {0.789673,0.029863}, + {1.003828,0.373652}, + {0.814418,0.309315}, + {-0.606146,-0.168860}, + {0.056299,0.365320}, + {0.093105,-0.068656}, + {0.755631,-0.057552}, + {0.081025,-0.900634}, + {-0.016102,0.247733}, + {0.884746,0.342390}, + {-0.875936,0.681588}, + {0.098843,-0.487980}, + {-0.376775,-0.427447}, + {0.381212,0.542140}, + {0.530379,-0.369676}, + {0.709660,0.380700}, + {-1.112918,0.335488}, + {-0.171830,0.036069}, + {-1.019468,0.441974}, + {0.552776,1.116890}, + {-0.256032,1.029227}, + {0.709352,0.980046}, + {-0.721419,-0.145083}, + {-1.190310,-1.516095}, + {-1.099134,-0.241831}, + {-1.177761,0.420445}, + {0.618117,1.070602}, + {1.308669,-0.017416}, + {-0.186330,-0.148709}, + {-1.075173,1.134706}, + {-0.474658,-0.073558}, + {-0.417598,-0.815183}, + {0.452627,-0.086364}, + {-0.099908,0.206006}, + {1.159685,-0.593182}, + {-0.620191,0.221127}, + {1.099579,0.166276}, + {-0.224604,-0.878283}, + {0.361899,0.449122}, + {0.782647,-1.303460}, + {1.024841,0.701208}, + {-0.575269,0.369847}, + {0.185542,0.396025}, + {-0.475507,0.042582}, + {-0.644299,1.072212}, + {0.024074,0.094974}, + {1.065494,1.061942}, + {-0.103903,0.047036}, + {-1.507948,1.355023}, + {0.488277,-0.387922}, + {-0.670998,0.516623}, + {1.043637,1.027954}, + {-0.814702,-0.705341}, + {1.113500,-0.824085}, + {-0.446971,0.387174}, + {0.085304,0.134263}, + {-0.032566,0.373506}, + {-0.715275,0.920719}, + {0.856968,-0.363303}, + {-0.531281,-0.778124}, + {-0.273956,0.840519}, + {-1.738353,0.489447}, + {-0.868719,0.482146}, + {-0.324818,0.031145}, + {0.538558,0.494144}, + {-0.353669,0.337685}, + {0.231094,0.720309}, + {-0.836142,0.106659}, + {0.595464,0.423801}, + {0.883973,-0.601154}, + {0.723997,0.934565}, + {-0.355962,0.152775}, + {-0.127005,1.104947}, + {0.969229,-0.149105}, + {-1.201512,0.674038}, + {0.146767,-0.498363}, + {-0.035950,0.557077}, + {-0.459134,-0.914077}, + {0.763345,0.524424}, + {0.011704,-2.017428}, + {-0.849172,1.506112}, + {-0.250493,-1.045756}, + {-0.121860,-0.690564}, + {-0.155904,0.608851}, + {-1.229102,-0.406017}, + {1.226610,1.085280}, + {-0.805206,0.629291}, + {-0.069214,0.730650}, + {1.064779,0.264552}, + {-0.006544,-0.494682}, + {0.457170,-0.951151}, + {-0.410514,0.789954}, + {0.565477,-0.255665}, + {0.734690,-0.988831}, + {-1.062641,0.225151}, + {-0.385230,0.821491}, + {0.371702,-0.110034}, + {-0.057454,0.128720}, + {-0.081977,1.037915}, + {0.311523,1.253425}, + {-0.502448,0.093294}, + {0.615595,-2.344534}, + {0.653408,-1.185627}, + {0.867888,-0.434547}, + {-0.240755,0.331160}, + {-1.197783,0.687314}, + {0.521806,0.208657}, + {-0.554643,0.428899}, + {0.057554,-0.366342}, + {-0.357134,0.156007}, + {0.334822,0.737721}, + {1.436037,-0.287579}, + {-0.612891,0.136375}, + {0.789853,-0.141415}, + {0.525511,0.179881}, + {0.123147,0.811655}, + {0.113730,0.769911}, + {0.182976,-0.119810}, + {0.628026,-0.801001}, + {-0.469332,-0.992844}, + {0.420309,0.553148}, + {-1.170904,-0.099700}, + {-0.146831,-0.313078}, + {0.388133,0.790864}, + {0.282657,0.691093}, + {1.559222,0.832869}, + {0.381183,0.380482}, + {0.489654,-0.943613}, + {0.054295,-0.253576}, + {0.455407,0.344980}, + {0.570221,-0.475851}, + {-0.223240,0.744998}, + {-0.530980,0.687077}, + {-0.449808,-0.821267}, + {-0.330739,0.448330}, + {0.804212,-0.577691}, + {0.158454,0.805972}, + {-0.108758,-0.954099}, + {-0.439021,0.197579}, + {-0.539345,0.439251}, + {0.651230,0.754042}, + {-0.355923,-1.137383}, + {-0.177306,0.749586}, + {0.441287,-0.286658}, + {-0.902108,0.227320}, + {-1.284466,1.638574}, + {-0.036202,0.181132}, + {-1.497482,0.003437}, + {-0.061348,-0.006829}, + {-0.005529,-0.741155}, + {0.215731,0.852106}, + {1.581736,0.051235}, + {0.515924,0.070864}, + {-0.482895,1.204395}, + {-0.025352,-0.128358}, + {1.549274,-0.306254}, + {0.574087,0.073902}, + {-0.521191,0.521923}, + {-0.316768,-1.246159}, + {0.374086,-0.736770}, + {0.657694,0.176918}, + {-0.873769,0.767673}, + {1.284637,0.593571}, + {0.129845,-0.097307}, + {-0.554935,0.847270}, + {0.103939,0.668202}, + {0.803857,1.265275}, + {0.337945,-0.680761}, + {-0.332438,0.818654}, + {0.815651,-0.086611}, + {0.898750,0.267473}, + {0.332558,0.854873}, + {0.033251,-0.369557}, + {-0.994826,0.728912}, + {0.320312,0.989656}, + {-0.968790,-0.524464}, + {0.050254,-1.200479}, + {1.284280,0.052694}, + {-0.551391,1.260977}, + {-0.243554,-0.369087}, + {0.248510,-1.259281}, + {-0.100092,0.030010}, + {0.639801,-0.080694}, + {-0.453774,0.601667}, + {0.157292,0.534592}, + {0.350959,0.051935}, + {-0.757799,-0.971434}, + {0.493319,-0.446165}, + {0.614688,-0.582649}, + {0.074603,-0.299675}, + {0.882269,-0.187581}, + {0.372823,0.368325}, + {0.114711,-0.315413}, + {-0.451795,0.002528}, + {0.124370,-2.011045}, + {0.144513,-0.674410}, + {-0.887191,0.318651}, + {0.276441,-0.028075}, + {-0.656448,0.802020}, + {-0.278558,0.378958}, + {-1.030818,-0.732686}, + {0.993217,-0.426098}, + {0.539963,-0.880491}, + {0.259553,0.120942}, + {0.980649,0.629225}, + {0.549393,-0.007366}, + {1.775229,-0.150526}, + {-0.505972,0.223503}, + {-0.705733,-0.590672}, + {0.617949,-0.169851}, + {-0.057909,0.846471}, + {0.008234,-0.314480}, + {-0.096775,1.283379}, + {-0.962696,-0.439218}, + {-0.259974,0.118526}, + {0.250173,-0.150096}, + {0.910862,-0.680728}, + {-0.415913,-0.191966}, + {-0.396152,-0.497643}, + {-0.771449,-0.213775}, + {-0.301254,-0.272266}, + {0.926896,-0.570671}, + {-0.591745,0.146475}, + {1.086466,-0.131236}, + {-0.844351,-1.562438}, + {-0.990476,0.070498}, + {-0.077338,-0.863886}, + {0.136252,-0.505947}, + {-0.382066,-1.286926}, + {0.669333,-0.074047}, + {1.276768,-0.175578}, + {0.350866,0.997669}, + {0.615194,-1.606065}, + {-1.052562,-0.334451}, + {0.299494,-1.071920}, + {0.549473,0.191316}, + {-1.676270,-0.096974}, + {0.265582,0.159041}, + {0.244795,1.792395}, + {1.008245,-0.322289}, + {-0.702334,0.432326}, + {-1.037780,0.165330}, + {1.538379,0.489235}, + {0.703589,-0.819391}, + {-0.628913,-0.514712}, + {0.569468,0.511478}, + {-1.707972,0.273521}, + {0.317935,0.288596}, + {-0.284997,-2.009373}, + {-0.740532,0.559777}, + {0.537857,0.332833}, + {0.429478,-0.292228}, + {0.285689,1.118983}, + {-0.631836,-0.066223}, + {0.592196,-1.045784}, + {0.226062,0.549405}, + {0.309204,0.291148}, + {0.328950,-0.651208}, + {-0.175570,0.128113}, + {-1.071762,-0.222013}, + {-0.246732,0.503570}, + {0.562434,-0.087614}, + {-1.083738,0.163863}, + {0.138512,-0.058985}, + {-0.738895,0.011677}, + {1.499974,0.103210}, + {0.355002,-0.338290}, + {-0.256904,-0.343176}, + {-0.015659,-0.417844}, + {0.208660,0.606469}, + {-0.734477,0.817951}, + {-0.867542,0.663637}, + {-1.304717,-0.388440}, + {0.704185,0.760198}, + {-1.316292,-0.295106}, + {0.218730,0.983686}, + {0.818713,-1.046025}, + {-0.583046,0.551182}, + {1.265510,-1.016420}, + {-0.761852,0.033767}, + {-0.745320,-0.492837}, + {0.934553,0.066774}, + {-0.819204,0.242431}, + {0.611336,-0.031476}, + {0.096080,-0.848272}, + {-0.106150,-0.492336}, + {-0.383184,-0.269763}, + {0.132107,0.766301}, + {0.212758,-0.088413}, + {-0.422718,1.161167}, + {0.736935,-0.974879}, + {-0.910351,0.495623}, + {0.997377,0.717006}, + {1.989167,-0.180638}, + {-0.518269,1.156765}, + {-1.168705,0.352030}, + {0.875218,-0.727473}, + {0.110928,0.594784}, + {-0.893894,0.190021}, + {-0.063990,-0.588675}, + {0.271381,-0.362008}, + {-1.002002,0.472853}, + {-0.262505,-1.738222}, + {-0.726954,-0.594786}, + {1.196291,1.072635}, + {-0.121522,-0.341266}, + {-0.041270,0.655770}, + {0.198658,0.212242}, + {0.259623,-0.910297}, + {-0.906628,-0.709528}, + {0.763820,-0.135300}, + {1.075767,0.169487}, + {-0.535647,-0.428838}, + {0.184472,0.911065}, + {-1.106756,0.326421}, + {-0.568826,-0.976099}, + {-1.131721,-0.119743}, + {-1.014501,0.157798}, + {-0.188462,-0.981151}, + {0.998759,-0.198788}, + {-0.831733,-0.686713}, + {0.940988,-0.639840}, + {0.432728,-0.625815}, + {-0.373126,-0.262423}, + {0.717374,0.275913}, + {0.267194,-0.410032}, + {-0.244544,-0.599248}, + {-0.372515,-0.727035}, + {1.133795,0.095964}, + {0.188813,0.214390}, + {-0.491510,0.110745}, + {-0.112035,1.669554}, + {-0.692933,0.354110}, + {-0.777650,-0.649853}, + {0.206946,-0.549717}, + {0.060381,-0.218033}, + {-0.923367,1.095193}, + {-0.086790,0.112154}, + {0.173823,-0.663045}, + {0.246195,0.466305}, + {0.046693,-0.524645}, + {-1.283808,-0.478148}, + {0.964145,-0.018176}, + {0.171523,-1.351762}, + {-0.679412,-0.388570}, + {0.550322,-0.537612}, + {0.731997,-1.087005}, + {-0.454207,-0.599756}, + {-0.187639,0.654378}, + {-0.844323,-0.003906}, + {-0.145352,-0.604780}, + {1.621990,-1.918143}, + {-0.151221,0.586071}, + {-2.341130,-1.090539}, + {0.085287,0.722866}, + {-0.323067,0.087640}, + {1.363234,-0.722450}, + {-1.625929,-0.003371}, + {-1.349280,0.497928}, + {-0.763448,0.084800}, + {0.968353,0.485273}, + {-0.654131,0.368048}, + {0.906649,0.966963}, + {0.502693,-0.801039}, + {-0.106512,-0.017897}, + {-0.357878,0.507848}, + {0.596556,-0.386384}, + {-1.350622,-0.075382}, + {-1.132769,-0.094515}, + {0.784254,1.026684}, + {-1.195967,-0.498431}, + {-1.486993,1.041977}, + {-0.861464,1.155882}, + {0.454096,-0.743460}, + {0.135509,0.255852}, + {0.328982,0.287838}, + {-0.351451,-1.454514}, + {-1.163104,0.800600}, + {-0.159101,-0.818017}, + {0.570768,-0.511169}, + {0.261905,0.321343}, + {-0.961814,-0.663710}, + {1.707887,-0.051143}, + {-1.670659,-0.504308}, + {0.921242,0.016788}, + {0.340322,-0.915290}, + {0.166781,-0.511569}, + {-0.158216,-0.111283}, + {-0.283839,-0.287862}, + {0.628406,0.668089}, + {-0.332001,-1.189296}, + {0.017396,0.278010}, + {-0.009861,0.703837}, + {0.292750,0.126056}, + {-1.187099,-1.326938}, + {-0.183012,-0.223564}, + {-0.566881,0.719534}, + {-0.083212,-0.380213}, + {0.070757,-0.303190}, + {-0.121132,0.687038}, + {0.322541,-0.477786}, + {0.129674,-0.807120}, + {-0.418168,0.229298}, + {-0.546595,0.883441}, + {0.637606,0.900993}, + {-0.022450,-0.668027}, + {1.165285,-0.042859}, + {0.394648,1.776434}, + {-0.119592,-0.949967}, + {-0.380534,-0.700304}, + {-0.428653,0.876593}, + {-0.010833,0.445818}, + {-2.068289,0.926831}, + {-0.056759,-1.011635}, + {0.951500,0.730713}, + {-0.735857,-0.974632}, + {-0.441883,-0.113780}, + {0.403497,-0.698566}, + {-0.583007,-0.225655}, + {0.845352,1.129219}, + {1.029108,0.170238}, + {0.677910,-0.154584}, + {-0.866846,-0.610082}, + {0.620796,0.585499}, + {-0.175772,-0.410802}, + {0.738516,0.222083}, + {0.340440,-0.224279}, + {0.514320,-0.118299}, + {0.643830,0.931380}, + {0.823034,0.678161}, + {-0.025896,-0.374766}, + {-0.296529,0.078295}, + {-0.197529,1.188479}, + {-0.561245,1.938594}, + {-0.891056,-0.514375}, + {-0.583395,1.256778}, + {0.358371,0.149749}, + {0.713595,0.243942}, + {-0.424386,-0.267761}, + {0.801126,-0.010966}, + {-0.860760,0.599409}, + {-0.132413,0.845348}, + {-0.366124,1.094189}, + {0.098452,1.013495}, + {-0.594768,1.698599}, + {-0.214296,0.107876}, + {0.435504,-0.097577}, + {0.484505,0.098009}, + {0.395685,1.294490}, + {-0.288240,0.457515}, + {0.454454,0.065128}, + {0.611166,1.360646}, + {0.479140,1.245248}, + {1.573051,0.996718}, + {0.353760,-0.558113}, + {-0.300835,-0.238335}, + {-1.239956,-0.500976}, + {0.687230,-1.586164}, + {0.984939,0.909665}, + {0.095002,-0.407167}, + {-0.722139,0.986728}, + {0.656063,0.152251}, + {-1.206285,0.300682}, + {-0.445228,-1.320390}, + {0.868370,0.652878}, + {0.480469,-0.416396}, + {0.844269,-0.152263}, + {-0.854423,-2.170806}, + {0.451749,-0.005347}, + {0.076050,-0.938747}, + {0.414240,0.282529}, + {-0.314277,0.634230}, + {-0.352751,1.885884}, + {-0.331918,0.293480}, + {-0.611542,-0.591605}, + {-0.032914,-0.878914}, + {0.182686,0.511677}, + {0.282213,-0.654782}, + {0.180992,-0.735602}, + {0.434231,-0.167422}, + {-0.416232,0.478046}, + {-0.150081,-0.445287}, + {-0.321248,-0.468089}, + {0.620043,0.101055}, + {-0.728128,-0.213253}, + {-1.353567,-0.307609}, + {0.725953,-0.761898}, + {0.531030,-0.335851}, + {-0.913209,-0.639658}, + {-0.309075,0.414710}, + {-0.120038,1.012719}, + {0.402300,-0.164851}, + {-0.404268,-0.373224}, + {-0.619788,-0.509276}, + {-1.967288,-0.882356}, + {0.774993,0.863349}, + {0.170683,-0.823057}, + {-1.277681,-0.649139}, + {-0.150491,0.048295}, + {0.655999,-0.224661}, + {-0.328017,1.448516}, + {-0.168569,-0.611396}, + {-1.867020,-0.315154}, + {-0.172188,0.758110}, + {-0.688985,0.441307}, + {-0.344957,0.468144}, + {0.467038,-1.260435}, + {-0.002124,0.251853}, + {0.532495,-0.325352}, + {-0.436167,0.212400}, + {-0.226487,0.643460}, + {1.280616,-1.277356}, + {-0.015069,1.146608}, + {0.145602,0.831614}, + {-1.259462,0.772211}, + {-0.348614,0.234378}, + {0.236966,-0.423945}, + {0.171916,0.116998}, + {-0.380486,-0.447256}, + {-0.069114,-0.908586}, + {0.006162,0.030039}, + {-0.360495,0.129786}, + {-0.449148,0.342152}, + {-0.637659,0.279006}, + {-0.475733,0.146527}, + {0.774150,-0.450019}, + {0.384453,0.905140}, + {0.539473,0.294686}, + {0.963547,0.772764}, + {-0.577154,0.243345}, + {-0.990744,-0.184541}, + {0.361697,-0.706210}, + {-1.300668,-1.074359}, + {-0.350468,-0.053975}, + {-1.253670,1.152225}, + {0.645014,-1.229474}, + {-0.947043,-0.775451}, + {0.731531,0.761002}, + {-0.704281,-0.492722}, + {-2.122805,1.221006}, + {-0.886448,0.215374}, + {-0.063047,1.035249}, + {-0.130030,-1.597369}, + {-1.588580,-0.164693}, + {0.243675,0.189793}, + {1.045297,-1.178104}, + {0.389365,-0.556548}, + {0.475483,-1.559555}, + {-0.335436,0.300775}, + {-0.972000,-0.175491}, + {-0.133305,1.090422}, + {1.581001,0.260800}, + {-0.075648,1.263143}, + {1.516818,-0.971175}, + {0.169816,-0.200516}, + {-1.034590,0.153998}, + {-1.097372,0.044848}, + {-0.579664,-0.209895}, + {-0.053491,-0.037996}, + {1.254129,-1.166188}, + {-1.171324,-1.423655}, + {0.425314,-0.416050}, + {-0.615369,0.303270}, + {-0.110978,-0.122135}, + {0.204478,0.019416}, + {-0.802350,0.427858}, + {-1.296030,-0.172149}, + {-0.506648,0.402006}, + {-0.190420,0.046755}, + {0.243431,0.240358}, + {-0.507131,0.100200}, + {-0.454722,-0.946433}, + {0.725846,0.693385}, + {-0.194304,1.034517}, + {-0.639409,-1.491172}, + {-0.370464,-1.316069}, + {0.026346,1.232204}, + {-0.045298,-1.867401}, + {1.566024,-1.070478}, + {-0.525522,0.424209}, + {-0.390620,0.469335}, + {-0.748788,-0.640077}, + {-0.861505,1.668542}, + {0.942889,1.164779}, + {0.168485,-0.273375}, + {-1.415495,1.078624}, + {-0.973990,-0.245288}, + {-0.406225,0.204616}, + {-1.107687,0.132306}, + {-0.922430,0.271948}, + {-0.770345,0.248383}, + {-0.262733,-0.459021}, + {-1.543574,0.237828}, + {0.427934,1.167747}, + {0.838651,-0.645278}, + {0.003714,0.143614}, + {-0.365774,0.832688}, + {0.120564,0.594678}, + {0.995994,-0.565695}, + {-0.126425,0.174578}, + {0.947284,-0.717938}, + {1.291500,0.893980}, + {0.094097,0.331983}, + {-1.520554,1.050692}, + {0.429938,0.967334}, + {1.062959,1.335563}, + {-1.374009,0.443307}, + {-0.133662,0.424658}, + {-0.351652,0.475247}, + {-0.774004,1.216356}, + {-0.929932,-1.357864}, + {-1.093596,-0.304936}, + {0.421699,1.120944}, + {-0.347581,-1.700207}, + {1.759930,0.663514}, + {-0.091702,0.155358}, + {0.037256,0.562375}, + {-0.880499,0.164302}, + {-0.851232,0.905426}, + {-0.576845,0.536598}, + {-0.671018,0.273580}, + {0.527832,0.179628}, + {-0.088704,-0.382192}, + {-0.475693,-0.489545}, + {0.813913,-0.007911}, + {0.866953,1.168459}, + {0.342727,0.090489}, + {-0.102248,0.577989}, + {0.548149,0.018512}, + {-0.439522,-0.100163}, + {-0.187621,-0.065630}, + {-0.323931,-0.323939}, + {-0.346097,-0.211944}, + {0.183836,1.796108}, + {-0.314326,0.290377}, + {0.221068,-0.314679}, + {-0.807497,0.876966}, + {1.656237,-1.284909}, + {0.429140,0.610550}, + {-0.692503,-1.275180}, + {0.148498,-0.742160}, + {0.471384,-0.117794}, + {-0.337555,0.201199}, + {0.276186,0.288946}, + {0.242827,-0.076791}, + {1.846708,-0.086855}, + {-0.069953,0.656462}, + {0.115995,0.180799}, + {-0.284735,0.545367}, + {0.633690,-0.122335}, + {-0.909572,-1.230068}, + {0.080008,0.996363}, + {0.694586,-0.073983}, + {-0.882830,-1.068673}, + {0.189491,1.853682}, + {-1.424492,0.427126}, + {0.689818,1.018190}, + {0.475888,-0.235734}, + {0.272150,0.265798}, + {0.032696,0.054859}, + {-0.596591,-0.418400}, + {-0.330926,1.472477}, + {0.830467,0.554452}, + {0.141106,-0.441457}, + {0.871720,0.179847}, + {0.295633,-0.724683}, + {-0.435067,0.340489}, + {0.350137,1.011308}, + {-0.193628,0.339546}, + {0.698882,0.568895}, + {0.714853,-0.257131}, + {-0.262342,-0.470386}, + {-0.636850,-0.532836}, + {-0.147885,-0.767427}, + {0.750463,-0.213164}, + {-0.548790,0.050549}, + {-1.033421,-0.901535}, + {1.500041,-1.549836}, + {-0.432532,0.497503}, + {1.038156,0.874007}, + {0.463656,0.085929}, + {-0.089563,-0.381914}, + {-0.081148,1.037969}, + {0.548773,0.429676}, + {-0.491311,-0.637343}, + {-2.438709,-0.051842}, + {1.225795,-0.902596}, + {-0.445842,0.452895}, + {0.109824,0.055383}, + {-0.232239,0.462964}, + {0.237473,-0.816454}, + {-0.073903,0.108264}, + {-0.412081,0.634950}, + {0.526763,-0.598860}, + {0.633333,0.185228}, + {-0.230045,-0.696161}, + {-1.147548,-0.875395}, + {-0.126686,-0.787857}, + {-0.478097,-0.754376}, + {-1.022308,-0.408585}, + {-0.269342,-0.318111}, + {-0.634583,0.035421}, + {0.976029,0.481457}, + {0.490922,1.815942}, + {-0.325872,0.000525}, + {-0.552517,0.029422}, + {-0.493102,-0.053374}, + {-1.503537,-0.460894}, + {1.108601,-0.232398}, + {-0.695587,-1.170494}, + {-1.077017,-0.195150}, + {0.199615,0.188295}, + {0.984679,-0.566367}, + {1.297710,-0.537764}, + {-0.743610,1.332962}, + {0.611631,-1.230295}, + {0.535225,-0.203019}, + {-1.456897,0.798777}, + {-0.000363,-0.238487}, + {0.922337,0.150983}, + {0.215997,0.386013}, + {0.536468,0.167675}, + {0.223258,0.110369}, + {0.661156,0.422147}, + {-0.247800,-0.854418}, + {0.653356,0.093449}, + {0.412471,0.099614}, + {0.008260,-0.284842}, + {0.602377,0.832860}, + {-0.140841,0.066235}, + {0.373272,-0.127086}, + {0.881863,-0.583065}, + {-0.689000,0.206484}, + {1.005700,-0.372850}, + {-0.405465,-0.531119}, + {-0.647395,-0.657215}, + {0.062044,-1.065059}, + {-0.727797,0.903809}, + {-0.566777,-0.706294}, + {-0.632129,0.467014}, + {0.899076,0.126889}, + {0.385478,1.186605}, + {0.703954,-0.241354}, + {0.283012,0.853681}, + {-0.971216,-0.982086}, + {0.102070,-0.510027}, + {-0.474635,0.615183}, + {-1.176123,0.165700}, + {0.656442,-0.454286}, + {-0.470031,0.269875}, + {-0.570072,0.651427}, + {0.160737,0.443575}, + {-0.102227,-1.423956}, + {0.063696,0.787943}, + {0.435511,-1.119014}, + {-0.192739,-0.355147}, + {-0.353761,-0.790623}, + {-1.113609,0.176838}, + {0.250330,-0.046952}, + {0.615718,0.870463}, + {0.400504,0.431724}, + {1.162029,-0.731667}, + {0.568344,-1.078877}, + {0.085425,-0.443310}, + {0.207902,1.284480}, + {0.334856,0.462654}, + {-0.335173,1.595103}, + {-0.929111,-0.555447}, + {0.011277,0.456913}, + {-0.040002,0.130483}, + {0.973999,0.191361}, + {-0.303043,0.236946}, + {0.643394,-0.426236}, + {0.323195,-1.152534}, + {0.747335,-1.247994}, + {0.294046,-0.113540}, + {-0.253140,-0.990029}, + {1.250059,0.248076}, + {-0.521407,-0.594040}, + {0.808065,0.500768}, + {-0.017087,1.026674}, + {0.006366,-0.327461}, + {-0.349676,-1.622236}, + {-0.438362,0.532035}, + {-0.660037,-0.474255}, + {0.162498,0.533545}, + {1.633542,-0.132034}, + {-0.318215,0.175327}, + {1.192031,-0.516092}, + {0.778273,2.231759}, + {-0.011893,-0.581060}, + {-1.029364,-0.695297}, + {-0.173287,0.110115}, + {0.635321,0.005894}, + {-0.363303,0.267814}, + {0.757333,0.531349}, + {-0.454391,-0.388071}, + {0.250888,-1.427019}, + {0.180933,-1.456074}, + {0.679743,-0.683070}, + {-0.313584,-0.254765}, + {-0.030301,0.911933}, + {0.128000,0.628659}, + {-0.443625,-0.158499}, + {1.973744,-0.920044}, + {0.893488,-0.150660}, + {0.931910,0.910991}, + {0.042853,-0.026324}, + {-0.313634,-0.520955}, + {-0.671536,-0.215733}, + {0.556569,0.028198}, + {1.117075,0.254181}, + {-0.910888,0.046416}, + {-0.442587,-0.710371}, + {0.417335,0.155742}, + {-0.390962,1.821362}, + {0.041557,0.535249}, + {0.118388,-1.118331}, + {-1.008590,0.173649}, + {0.933494,-0.410314}, + {-1.828304,-0.246922}, + {0.948599,0.110863}, + {0.563454,-0.219323}, + {0.190125,-1.330677}, + {0.649893,0.077576}, + {0.752153,0.957161}, + {0.145088,0.727431}, + {-0.266557,-0.271793}, + {-0.021569,0.947269}, + {-0.193472,0.296913}, + {0.872543,0.792483}, + {0.567036,-1.219657}, + {-0.243654,0.348594}, + {1.193936,0.547621}, + {0.457518,0.539115}, + {0.476268,0.389504}, + {0.481768,-1.579726}, + {-0.125194,0.075938}, + {0.973247,-0.247002}, + {-0.843604,0.794316}, + {0.516310,0.192748}, + {-0.156413,-0.385387}, + {0.670795,0.673320}, + {0.715695,0.154379}, + {-1.280764,-0.035405}, + {0.336530,1.477179}, + {0.379120,1.083063}, + {-0.395949,-0.490567}, + {-0.541033,0.318875}, + {1.380447,1.144061}, + {-1.155728,-0.451759}, + {-0.119609,0.530847}, + {0.112070,-0.418582}, + {-0.073277,-0.967746}, + {-0.568655,0.359419}, + {-0.644562,1.301028}, + {-0.972656,-0.051257}, + {0.565598,0.063147}, + {0.226373,-1.303766}, + {-0.053945,0.745209}, + {-0.902083,-0.659843}, + {1.127191,1.430759}, + {-0.593266,-0.302685}, + {-0.258176,0.542044}, + {-0.416106,-0.838782}, + {-0.513205,-0.035953}, + {0.242585,-0.897682}, + {-0.942517,1.556742}, + {-0.845536,-0.691953}, + {1.195428,-0.996093}, + {2.193852,-0.065919}, + {0.924832,-0.176276}, + {2.032670,0.127016}, + {-0.102169,0.484681}, + {-0.035450,-1.188934}, + {0.429058,0.816624}, + {-0.470365,0.209900}, + {1.204684,0.408525}, + {-1.114052,0.414965}, + {-0.544975,1.493659}, + {1.142379,0.058358}, + {-1.591466,0.057853}, + {-0.396774,-0.466300}, + {0.278815,0.305556}, + {0.398613,-0.065548}, + {0.671438,0.213874}, + {-1.240631,0.575082}, + {0.694327,-1.107893}, + {-0.789778,-0.245106}, + {1.082148,0.219531}, + {0.152659,-0.295388}, + {1.491724,1.028192}, + {0.264360,-2.175691}, + {0.311309,0.322370}, + {-1.010542,-0.856291}, + {1.053519,-0.514131}, + {0.635882,0.553160}, + {0.210920,-0.544505}, + {-0.390892,0.472470}, + {-1.002592,0.835210}, + {-0.380769,1.290713}, + {-1.474071,-0.592612}, + {-1.467829,-0.275493}, + {-0.484917,-0.266843}, + {1.358912,-0.290679}, + {-0.760563,0.421103}, + {0.606959,0.863622}, + {-0.587442,0.924857}, + {-0.967521,-0.513563}, + {-0.083623,0.137413}, + {-0.366754,0.279873}, + {-0.664209,-0.109312}, + {-0.807642,-1.778743}, + {0.805218,0.540964}, + {0.176385,-0.486583}, + {0.173106,-0.536233}, + {0.000016,0.458630}, + {-0.370551,-0.189795}, + {0.285176,0.463441}, + {0.240888,-0.349790}, + {0.108800,-1.538375}, + {0.043605,-2.269263}, + {-0.272421,-0.006057}, + {0.246002,0.570891}, + {0.096239,1.069368}, + {0.120818,-0.952900}, + {-0.717973,0.329944}, + {0.667827,0.340873}, + {1.111960,-0.209056}, + {-0.189543,-0.273671}, + {0.227323,1.114953}, + {-0.126011,0.855705}, + {-0.076941,-0.519865}, + {0.663803,0.416814}, + {-1.438996,0.380905}, + {0.894368,-1.006748}, + {0.577437,-0.173548}, + {1.291229,1.496509}, + {-0.272941,-0.641907}, + {-0.724711,0.930725}, + {0.076404,-0.563913}, + {-1.000032,0.407691}, + {-0.566778,0.243748}, + {0.053640,-1.146169}, + {0.056950,-0.137659}, + {0.346461,0.676644}, + {1.134174,0.689609}, + {0.667048,0.155867}, + {-0.320707,-0.534195}, + {0.003425,0.485725}, + {-0.047785,-0.403591}, + {-0.508202,-0.573405}, + {0.249207,0.572682}, + {-0.257244,0.012521}, + {0.677142,-0.089546}, + {0.020521,1.116257}, + {0.752646,1.008726}, + {-0.505273,-0.214467}, + {-0.574463,0.394588}, + {-0.062090,0.170994}, + {-1.058119,0.845956}, + {0.671211,0.127179}, + {0.669598,0.396192}, + {-1.024867,-0.406429}, + {-0.919537,-1.145803}, + {0.835666,-1.895036}, + {-1.151913,0.473192}, + {0.555942,0.438244}, + {-0.109398,-0.855773}, + {-0.287955,-0.851273}, + {-0.240201,0.972916}, + {0.263522,1.213921}, + {0.260295,0.650558}, + {0.211509,0.528461}, + {0.224630,0.145409}, + {0.998198,-0.616575}, + {-0.241487,-0.203747}, + {0.176697,0.282204}, + {-1.171878,-0.213805}, + {-0.379528,0.635300}, + {-1.216967,0.179625}, + {-0.880248,-0.542043}, + {-0.062630,1.538727}, + {-0.418366,0.221704}, + {-0.204577,-0.588521}, + {0.468903,0.240225}, + {0.962490,0.035097}, + {-1.212926,-0.343519}, + {1.920868,0.684370}, + {1.041078,0.532627}, + {0.283895,-0.418711}, + {-1.397285,0.823509}, + {0.297481,-0.725686}, + {-0.495904,0.086877}, + {-0.863560,-0.351497}, + {0.531538,1.820775}, + {-1.045262,0.780107}, + {0.974250,-0.849368}, + {0.380715,-1.227674}, + {0.781374,-0.931283}, + {-0.112700,0.323563}, + {0.188277,0.095565}, + {-0.780066,-0.535792}, + {-0.559995,0.628452}, + {-0.217922,-0.893528}, + {0.759105,-0.418794}, + {0.649615,0.790668}, + {0.067538,-0.565015}, + {-0.002673,0.883082}, + {0.194140,0.176718}, + {-0.940190,1.442042}, + {0.619299,0.056097}, + {0.468398,0.509592}, + {-0.711271,0.043840}, + {-0.998983,-0.728807}, + {0.325337,0.466913}, + {0.077430,0.279358}, + {-0.673751,0.162800}, + {-0.231974,0.235378}, + {0.910689,-0.797473}, + {-1.622605,-0.841817}, + {0.432091,-1.018767}, + {-0.539186,-0.324225}, + {-0.242040,0.155646}, + {1.252015,0.593035}, + {0.188151,-0.739432}, + {0.534619,0.511769}, + {0.345659,0.476703}, + {-0.474379,0.580542}, + {-0.760683,-0.293209}, + {-0.917086,0.574522}, + {-0.423170,-0.878440}, + {0.040276,0.362034}, + {0.008902,-0.223798}, + {0.002946,-0.186733}, + {-0.727363,0.046058}, + {0.494353,-0.235286}, + {0.720284,0.433101}, + {1.295036,0.230127}, + {-0.419453,0.141825}, + {-0.485166,0.030742}, + {-0.579491,-0.809389}, + {0.297978,1.166165}, + {0.107656,0.089250}, + {-0.419769,0.749546}, + {0.101102,0.988807}, + {-0.007293,-0.739409}, + {-0.673602,0.874056}, + {0.488981,-0.019753}, + {-0.544172,1.634457}, + {-1.110920,-0.678521}, + {-1.387117,-0.567418}, + {-1.186982,-0.625841}, + {-0.131011,-0.534074}, + {0.455097,0.393563}, + {0.737161,-1.031238}, + {0.817935,-0.327775}, + {-0.385625,-0.012476}, + {-0.802613,0.038609}, + {-0.194642,-0.009339}, + {0.377562,-1.207033}, + {-0.660416,-0.454296}, + {-0.706623,0.381842}, + {-0.116607,0.548143}, + {0.288850,-1.075507}, + {0.276881,0.463193}, + {0.829630,0.529055}, + {0.299449,-0.575188}, + {-0.231345,0.351412}, + {1.003362,-1.460585}, + {0.451130,-1.124930}, + {0.322338,0.099733}, + {-0.254205,-0.042471}, + {0.211873,-0.537793}, + {0.550656,-1.202402}, + {0.302071,-0.529459}, + {0.484872,-0.424805}, + {-0.676112,1.242723}, + {0.196295,0.986675}, + {-0.006182,0.043626}, + {1.004458,-1.101313}, + {-0.508022,-0.307337}, + {-0.069604,-0.270549}, + {-0.936588,0.401472}, + {0.395051,-0.291762}, + {0.249364,-0.460210}, + {0.470524,-1.377845}, + {-0.031948,-0.316301}, + {0.398084,0.453870}, + {-0.084745,0.044352}, + {-0.653237,0.563452}, + {-0.052125,0.128803}, + {-0.427875,0.636993}, + {1.058874,0.376406}, + {-0.282247,-1.483023}, + {-0.125176,-0.032568}, + {1.794146,-1.232187}, + {-0.187983,-0.345985}, + {0.123095,-0.261032}, + {-0.415461,-1.090493}, + {-0.500346,-0.804478}, + {-0.513241,1.041086}, + {-1.784888,0.501072}, + {-0.235262,-0.395913}, + {-0.874197,0.136517}, + {0.802032,0.092163}, + {0.172660,-1.036619}, + {-0.740904,0.535180}, + {0.617676,0.005886}, + {-0.693840,-0.522827}, + {-0.803188,-0.240073}, + {-0.728556,-0.632434}, + {-0.149941,0.193266}, + {0.476898,-0.368260}, + {-0.031225,-0.120384}, + {-0.073972,0.464808}, + {0.160690,0.537959}, + {-0.450836,0.102038}, + {-0.216212,1.235659}, + {0.164200,0.192175}, + {-0.265676,0.384622}, + {0.213530,-0.157196}, + {-0.833550,-0.048440}, + {0.003577,0.903917}, + {-0.060957,0.001082}, + {-0.422697,-0.291104}, + {-0.436963,0.617239}, + {-0.560838,-0.652536}, + {-0.389877,-1.335308}, + {0.221871,-0.727966}, + {0.366452,-0.156117}, + {0.048762,0.817719}, + {1.364032,-1.028170}, + {-0.199738,-0.597666}, + {-0.048452,0.186324}, + {0.317672,1.640253}, + {1.030187,1.004812}, + {0.186677,0.155142}, + {-0.128456,-0.513439}, + {1.114846,-0.127393}, + {-0.365605,-0.311630}, + {-0.081923,0.648966}, + {0.060946,1.009555}, + {0.545678,0.076880}, + {-0.990208,-1.026702}, + {-0.840658,0.552260}, + {-1.316496,0.415412}, + {0.233111,-0.268865}, + {-1.081822,0.126111}, + {-0.893361,0.121170}, + {0.637557,-0.768942}, + {-0.981313,-0.937625}, + {0.366842,-0.491230}, + {-0.296605,-0.122075}, + {-0.694637,-0.691831}, + {-0.346922,1.010405}, + {0.265549,-0.072721}, + {0.553767,0.365723}, + {-0.886712,0.109635}, + {-0.548347,-0.303784}, + {-0.124639,0.349517}, + {-0.989650,0.330316}, + {0.762642,0.298664}, + {-0.179434,1.111018}, + {0.040421,0.525211}, + {-0.040726,-0.517622}, + {-0.436258,-0.419372}, + {-0.614376,-1.002123}, + {0.714119,-0.753994}, + {-0.514783,-0.369145}, + {0.074207,-1.001150}, + {0.344306,-0.309130}, + {0.149015,0.765323}, + {-0.296244,0.136197}, + {0.962661,1.268011}, + {0.023783,-1.186554}, + {0.123632,0.492674}, + {0.856406,0.442632}, + {0.232322,-0.486339}, + {0.191689,0.265950}, + {0.179934,-0.748107}, + {-1.701289,-0.051015}, + {-0.259518,1.342912}, + {-1.092688,0.126797}, + {0.646145,1.070342}, + {-0.102832,0.212320}, + {0.371741,1.059808}, + {0.329041,0.597689}, + {1.172615,0.542162}, + {-0.190803,0.345770}, + {0.694535,-0.143332}, + {1.565777,-0.517105}, + {-1.157503,-0.395621}, + {0.977210,0.015425}, + {-0.257104,0.098762}, + {-1.333003,0.368782}, + {0.061883,0.379086}, + {0.445949,-0.575541}, + {0.417953,0.289093}, + {0.289993,-0.020798}, + {-1.440368,0.472769}, + {1.148131,1.054014}, + {-0.556081,0.000779}, + {0.327782,0.192655}, + {-0.039300,-0.677965}, + {0.740380,-0.491050}, + {-0.072859,-1.870999}, + {-0.464327,-0.233392}, + {0.037757,-0.291647}, + {-0.124848,-0.199890}, + {0.429504,1.065232}, + {-0.841457,0.469673}, + {-0.636712,0.263585}, + {0.958690,-0.322036}, + {-0.209246,0.211522}, + {0.228839,-1.553564}, + {0.544155,0.188110}, + {0.738006,0.016440}, + {0.586748,0.001516}, + {0.360613,0.505248}, + {-0.257556,-0.316652}, + {-0.203123,0.066133}, + {0.707979,-0.756344}, + {-0.583274,-0.479593}, + {-0.810371,-0.061860}, + {0.273421,-0.865636}, + {-0.823282,0.610077}, + {0.094723,0.544387}, + {-0.008236,0.290898}, + {0.646489,0.296314}, + {-0.205770,-0.509249}, + {-0.052562,0.594927}, + {0.444777,0.441814}, + {0.100155,-0.501991}, + {-0.232563,-0.082230}, + {-0.081497,-0.962312}, + {0.041276,0.987394}, + {1.069935,-1.329858}, + {-0.076026,-0.887274}, + {0.086993,0.014743}, + {-0.179174,0.280143}, + {0.565349,-0.420367}, + {0.521928,-1.241770}, + {0.916126,1.435687}, + {0.637655,-0.516147}, + {-1.043603,0.819465}, + {-0.883656,-0.205474}, + {-0.644741,0.180014}, + {0.622506,-0.334192}, + {-0.241486,-0.600670}, + {-1.499588,0.650466}, + {-0.201187,-0.192333}, + {0.480999,-0.530799}, + {-1.738026,-0.145849}, + {0.998277,0.673428}, + {-0.144344,-0.233893}, + {-0.059109,-0.308362}, + {0.269830,1.562885}, + {-0.013641,-0.506529}, + {-0.278890,0.111794}, + {0.066036,0.843526}, + {-0.042208,1.107633}, + {-0.014597,0.485376}, + {0.183473,-1.283402}, + {-0.039860,-0.602430}, + {0.759903,0.034461}, + {-0.520732,0.826968}, + {0.093097,0.518453}, + {-0.047591,0.588031}, + {-0.808060,-0.728578}, + {-1.845584,0.914242}, + {0.266263,0.716752}, + {-1.253357,-1.118286}, + {0.705217,0.050021}, + {0.743902,-0.448512}, + {0.216893,0.073955}, + {0.385487,0.994616}, + {0.178511,0.204042}, + {-0.523429,-0.483543}, + {0.274570,0.042189}, + {-0.187481,0.727858}, + {-1.040426,-0.720766}, + {-0.359936,1.093006}, + {-0.665247,-0.950281}, + {-1.001936,0.289410}, + {1.381124,0.376211}, + {0.995092,-0.174666}, + {1.360198,-2.217745}, + {-0.554387,-1.676721}, + {-0.233175,-0.582371}, + {-0.388060,-0.034116}, + {1.342218,0.537788}, + {0.249304,1.296082}, + {-1.475857,-1.157512}, + {-0.197745,-0.568437}, + {0.824403,0.507678}, + {0.819198,-0.920770}, + {0.385495,-0.200380}, + {-0.503672,0.548119}, + {-1.111840,-1.633640}, + {-1.163537,-0.037715}, + {0.292674,-0.654745}, + {-0.962338,-0.407980}, + {-0.123743,0.028162}, + {-0.253323,0.014822}, + {0.479730,-0.823812}, + {-1.207221,0.300687}, + {0.996807,-1.482183}, + {-0.338063,0.564877}, + {0.920558,-0.084443}, + {1.293720,0.577197}, + {-0.967375,0.013719}, + {-0.481738,0.429749}, + {-0.943010,-0.544458}, + {0.060644,0.029556}, + {1.271225,0.072382}, + {1.345314,-0.606930}, + {-0.113264,0.048617}, + {-0.471231,0.591903}, + {0.450025,-0.255396}, + {1.082117,-0.457752}, + {-0.437023,0.619777}, + {0.199128,0.415873}, + {-0.738844,-1.578600}, + {-0.460504,-0.497232}, + {0.365693,0.851386}, + {1.155773,0.416016}, + {1.362762,-0.089273}, + {0.045085,-0.410653}, + {-0.352391,1.194551}, + {0.269619,-0.845695}, + {-0.937635,-0.041440}, + {-0.291614,0.210214}, + {-0.590964,0.334029}, + {0.041430,-0.582846}, + {-0.049634,-0.333992}, + {0.587620,0.926445}, + {0.019148,-0.708333}, + {-0.897879,1.311240}, + {-0.362442,1.068789}, + {0.417690,0.948938}, + {1.014004,-0.315357}, + {-0.426504,0.852104}, + {0.879939,1.426273}, + {1.147532,-0.513129}, + {-0.010543,-0.559115}, + {-0.935264,-0.274738}, + {0.047804,-0.517361}, + {-1.287619,-0.019239}, + {-0.829546,-0.280842}, + {-0.731296,0.823460}, + {-0.891822,0.427640}, + {0.589846,0.227553}, + {0.224689,0.571736}, + {-0.991209,-1.790480}, + {-0.009287,0.367028}, + {-0.551808,-1.155483}, + {-0.158887,-0.504851}, + {-1.006753,1.691039}, + {0.139125,1.656709}, + {0.311493,-1.358651}, + {-0.000659,-0.397979}, + {0.168687,-0.256026}, + {-1.042776,0.605335}, + {-0.319026,1.219072}, + {1.837911,0.271572}, + {0.239919,0.877257}, + {-0.037115,-0.596589}, + {-0.745878,1.264467}, + {0.010089,0.390431}, + {-0.581987,-0.175623}, + {-0.649250,0.127701}, + {-0.927358,-0.445949}, + {0.969864,-0.227424}, + {0.341977,0.252902}, + {0.135549,-0.495303}, + {-0.434902,-0.375805}, + {0.365613,0.090189}, + {-0.599520,-0.108817}, + {-0.486901,0.808199}, + {0.802453,0.113674}, + {-0.985303,0.348679}, + {0.272472,-0.315188}, + {0.653225,-0.102477}, + {-1.075974,0.333581}, + {0.197104,-0.038665}, + {0.362767,0.959841}, + {-0.336212,-0.991636}, + {0.341808,-0.200085}, + {0.350307,-1.046523}, + {0.941919,-0.790265}, + {-0.391904,-0.269616}, + {-0.583731,-0.576541}, + {-0.767887,0.168764}, + {0.804567,-0.160216}, + {1.321056,0.602316}, + {-0.188219,-0.925499}, + {-0.025028,-0.134455}, + {0.409337,0.135734}, + {0.934364,0.899781}, + {0.443336,-0.454010}, + {0.267522,1.651923}, + {-0.021616,-0.240785}, + {-0.389671,0.913717}, + {1.028459,-0.957200}, + {0.917363,0.369138}, + {0.528539,0.496175}, + {0.086018,0.410356}, + {-0.761042,0.621316}, + {0.674682,-0.212507}, + {-0.658861,-0.532391}, + {0.285689,-0.034456}, + {0.547369,0.588551}, + {-0.665673,-0.523220}, + {-0.044039,0.016680}, + {0.770642,1.488234}, + {1.180668,-0.468981}, + {-0.046869,-0.474722}, + {-0.575480,1.143743}, + {0.493793,-0.521459}, + {-0.181592,0.068195}, + {-0.893649,-0.629530}, + {0.739301,-0.072214}, + {0.372672,0.080329}, + {0.913631,-1.018692}, + {-0.517839,0.093767}, + {0.621679,0.306497}, + {0.074540,0.055095}, + {0.723377,-0.915493}, + {0.022777,-0.462031}, + {0.093992,0.364776}, + {-0.161938,-1.408632}, + {-0.700315,-0.305135}, + {0.067748,-0.187459}, + {0.483409,-0.713985}, + {0.928152,-0.381167}, + {-0.857084,1.583029}, + {-1.318696,0.516152}, + {0.062040,0.590523}, + {0.832742,-0.065744}, + {0.190616,0.184008}, + {0.718808,0.579103}, + {0.091621,-0.167070}, + {-0.496135,1.776628}, + {-0.776281,-0.967919}, + {-0.340838,-1.252051}, + {0.509865,0.890890}, + {0.011224,1.492168}, + {-0.370739,0.707013}, + {-0.707116,1.492027}, + {-1.470031,-1.128868}, + {-1.199963,0.304341}, + {0.178199,-1.144514}, + {0.827291,0.129026}, + {-1.809214,0.424594}, + {-0.056250,-1.086321}, + {-0.806620,0.594545}, + {0.614157,0.789597}, + {-0.230539,-0.152551}, + {0.305055,0.383843}, + {-0.572786,-0.383604}, + {0.699148,0.289711}, + {1.471148,1.731421}, + {0.221494,-0.119078}, + {0.134051,0.860560}, + {-0.199285,1.539492}, + {0.327753,-0.263169}, + {0.070554,-0.500086}, + {0.607835,1.349017}, + {0.298997,0.241897}, + {0.128546,0.517720}, + {-0.933511,-0.304699}, + {-0.222248,-0.319890}, + {0.219134,1.083726}, + {0.732430,-0.081472}, + {-0.274968,0.590110}, + {-0.774399,1.437671}, + {1.398432,-0.474460}, + {0.731892,0.666366}, + {0.286832,-0.212891}, + {0.820630,1.301418}, + {0.413562,1.052060}, + {-0.226316,-0.541971}, + {-1.042872,-0.345541}, + {-0.858989,-1.096863}, + {1.880585,-0.233188}, + {-0.807930,-1.151544}, + {0.394861,-0.330062}, + {-0.085289,-1.629366}, + {0.640853,-0.152655}, + {0.183194,-0.254060}, + {-1.443384,1.394728}, + {-0.011702,0.646342}, + {0.736446,-1.332796}, + {0.621335,-0.574106}, + {-0.338450,-1.567302}, + {-0.332211,0.110908}, + {-1.017165,-1.522539}, + {-0.140315,2.030807}, + {0.044867,-1.101171}, + {0.189708,0.085158}, + {-1.830584,0.387522}, + {-1.017359,0.484883}, + {0.275108,0.181996}, + {-0.327957,1.214680}, + {0.336969,-0.766226}, + {-0.562675,0.180997}, + {1.310744,0.585186}, + {0.080051,2.094519}, + {0.211201,0.942647}, + {0.568763,-0.272394}, + {0.152587,-0.595240}, + {1.275315,0.622396}, + {0.813283,-0.132745}, + {0.407696,1.569844}, + {0.039364,0.287794}, + {0.244642,-0.641218}, + {0.886477,1.006243}, + {0.948847,0.187471}, + {-0.626010,0.160922}, + {0.962612,0.504401}, + {0.875536,-0.815369}, + {0.175947,-1.244808}, + {-0.070131,0.461325}, + {0.202225,-1.039772}, + {-0.325603,0.232979}, + {-0.747171,-1.024781}, + {-0.079451,0.376832}, + {0.336329,1.142868}, + {0.213160,0.231289}, + {-0.691300,-0.017983}, + {0.057278,-0.387798}, + {0.073555,1.006174}, + {0.490772,0.337166}, + {0.685390,-0.318414}, + {0.637094,0.808315}, + {0.523969,2.121595}, + {0.721264,-0.482325}, + {-0.145401,-0.605792}, + {-0.233810,-0.053732}, + {1.269554,0.710916}, + {1.057321,-1.046691}, + {0.464363,-0.270764}, + {0.840490,1.150537}, + {-0.620898,-1.419891}, + {-0.857446,-0.039502}, + {-0.770707,-1.876256}, + {0.950801,1.087080}, + {1.432451,-0.030974}, + {0.490360,-0.567231}, + {-0.268067,-1.435917}, + {-1.183652,0.279454}, + {0.884853,-0.220426}, + {-0.528640,-0.111193}, + {-1.097008,0.128877}, + {-1.181036,-0.940732}, + {0.775628,0.000761}, + {1.472129,0.938313}, + {-0.651045,-0.150514}, + {0.253945,0.727849}, + {-0.625689,-0.863395}, + {-0.857663,-0.204035}, + {0.229410,0.785159}, + {0.415385,-0.811285}, + {0.135788,0.541017}, + {0.540449,0.302355}, + {-0.375243,-0.075659}, + {-0.126218,-1.254478}, + {-0.842535,-0.102853}, + {-0.944249,0.424586}, + {1.011823,-0.620988}, + {1.012036,0.169655}, + {0.512690,0.312651}, + {-0.628804,0.539718}, + {0.567513,0.109352}, + {0.934259,-0.533472}, + {-0.633715,-1.496096}, + {-0.416398,-0.918620}, + {0.421463,-1.209687}, + {0.314672,-0.470088}, + {-0.834237,-0.445546}, + {-0.485232,-0.247145}, + {-0.136325,-0.141431}, + {-0.006273,1.250196}, + {0.266229,-0.648711}, + {-0.945678,-0.027143}, + {0.782856,-0.470187}, + {0.305630,0.658933}, + {-1.111016,0.700723}, + {-0.365320,0.254061}, + {-0.175023,0.308741}, + {0.744562,0.103704}, + {0.557819,0.264705}, + {-1.130397,-0.307616}, + {0.190300,0.843572}, + {0.871835,-0.864320}, + {1.025579,0.117274}, + {-0.714639,-1.413594}, + {-0.394212,0.630346}, + {-0.402052,0.309273}, + {1.048158,0.495032}, + {-1.458614,0.390078}, + {-1.348655,-0.157187}, + {0.627460,0.517239}, + {0.616428,0.013392}, + {0.066659,0.172077}, + {0.177589,1.104288}, + {-0.202342,0.342469}, + {-0.896507,-0.597822}, + {-2.067867,-1.208733}, + {-0.022428,0.203426}, + {0.303756,0.349684}, + {0.627717,0.858736}, + {-0.745760,-0.181848}, + {-0.496215,1.429290}, + {-0.011943,-1.057738}, + {0.536641,1.349276}, + {-0.528001,-0.098934}, + {-1.063109,0.581999}, + {-1.256061,0.808575}, + {-0.601466,0.399072}, + {0.563718,-0.264581}, + {-0.237276,-0.677165}, + {-0.348054,1.673165}, + {0.064061,-0.618610}, + {-0.161228,0.795589}, + {-0.924021,-1.050412}, + {0.197726,0.353867}, + {-0.151410,-1.246225}, + {-0.714340,0.549384}, + {1.556261,-1.468342}, + {0.468479,-0.903354}, + {-0.483340,1.187727}, + {0.077127,-0.093447}, + {0.064972,0.945303}, + {-0.092409,0.145919}, + {1.315321,0.437219}, + {0.090724,0.761955}, + {0.781174,0.978083}, + {-0.308962,-0.268376}, + {0.696462,-0.805879}, + {0.966927,1.486179}, + {-1.249165,-1.299388}, + {1.239842,0.109267}, + {-0.340003,0.701168}, + {-1.633695,0.438179}, + {0.257196,0.023754}, + {0.005382,-0.652799}, + {0.698827,-1.245465}, + {1.057062,-0.264028}, + {-0.335223,-0.503241}, + {0.175219,-1.082885}, + {-0.274187,-0.933890}, + {-0.240526,-2.221268}, + {-0.007571,0.808866}, + {0.162060,0.252737}, + {0.481541,0.726904}, + {-0.555236,0.591634}, + {-0.136039,-0.497365}, + {-0.914324,-0.971380}, + {-0.330625,0.159913}, + {0.231296,-1.098666}, + {0.393929,-1.169035}, + {-0.664998,0.348284}, + {0.579266,-0.439099}, + {0.782286,-0.483201}, + {-0.036705,0.243544}, + {-0.470027,-0.758332}, + {-1.089025,0.282651}, + {-0.536396,-0.779503}, + {0.584009,0.036838}, + {0.777240,-0.758248}, + {-0.410388,0.482134}, + {-0.240905,-0.322910}, + {1.052859,0.448321}, + {0.744819,0.688556}, + {-0.323975,-0.312544}, + {1.688688,0.125085}, + {0.767757,0.027399}, + {-0.165767,0.087836}, + {-0.295850,-1.950460}, + {0.035816,0.245902}, + {-0.180130,-1.262665}, + {0.117034,0.019373}, + {0.309583,-0.084634}, + {0.160314,0.617106}, + {-0.223874,-0.405101}, + {0.391423,-0.984880}, + {-0.583522,-0.208371}, + {0.314564,1.000927}, + {1.528070,-0.488905}, + {0.682797,-0.214904}, + {-0.961746,0.561929}, + {-0.044529,-0.357871}, + {-0.881485,-0.203306}, + {1.081847,-0.376245}, + {0.828899,1.159757}, + {-0.396282,0.868155}, + {0.013008,-0.796971}, + {1.839981,0.128022}, + {0.861759,-0.389782}, + {0.939432,0.185296}, + {0.402922,-1.121553}, + {-0.878636,-1.122818}, + {1.213472,0.848105}, + {0.264317,-0.326819}, + {0.669519,-0.620270}, + {0.703125,-0.958242}, + {-0.367984,-0.413227}, + {-0.561993,0.902582}, + {0.709199,0.095548}, + {-0.624048,-0.624104}, + {0.367587,0.743255}, + {0.349618,-0.082040}, + {0.353670,-0.602772}, + {-0.121469,0.186655}, + {0.966288,-0.989082}, + {0.615847,1.087146}, + {0.049469,-0.498055}, + {0.161550,0.553359}, + {-0.061135,-0.214648}, + {0.046340,1.148951}, + {-0.104857,0.135405}, + {0.575610,1.613613}, + {0.294077,0.716711}, + {0.590764,-0.458646}, + {0.533655,-0.474675}, + {-0.200094,0.220235}, + {0.538978,-0.112814}, + {-0.596995,0.556408}, + {0.538951,-2.449696}, + {0.092171,-0.864222}, + {1.336939,0.991303}, + {0.333067,0.173662}, + {-0.153896,0.523270}, + {-0.582494,0.868651}, + {0.018634,0.130106}, + {-0.392325,-0.082136}, + {0.011480,0.421792}, + {-0.427424,-0.661210}, + {0.942397,0.587290}, + {-0.291423,0.402361}, + {-0.624678,0.855158}, + {0.427905,-0.996070}, + {-0.282753,-0.652971}, + {-1.240070,1.256909}, + {0.815396,-0.668763}, + {0.069285,0.238819}, + {0.077701,0.317614}, + {1.331490,0.009543}, + {1.194605,-0.196271}, + {0.230566,0.449264}, + {0.385677,1.158774}, + {-0.340860,-0.164507}, + {-0.842850,-0.564676}, + {-1.758840,0.064669}, + {-0.772174,0.091618}, + {1.140984,-0.811770}, + {-0.283852,-0.741705}, + {0.846224,0.293317}, + {-0.901372,1.090597}, + {1.033877,-1.064114}, + {-1.186147,0.598334}, + {-0.967792,1.113083}, + {0.974157,0.994512}, + {0.313614,-0.240645}, + {-0.063238,-0.036188}, + {-0.886378,-0.081582}, + {0.155813,-1.314707}, + {0.005821,0.803969}, + {0.031398,1.138370}, + {0.020663,-1.412936}, + {0.051696,0.849846}, + {-0.754989,-0.899231}, + {0.394988,0.540404}, + {-0.440672,-0.180217}, + {1.164193,-0.163753}, + {0.201996,-0.935543}, + {-0.757096,0.768721}, + {-0.851269,0.282609}, + {-0.032236,-0.457477}, + {0.242147,-0.379077}, + {-0.369603,-0.280814}, + {0.521168,-0.299217}, + {-0.383667,0.998399}, + {-0.273344,-0.133382}, + {-0.197726,0.033374}, + {0.399979,0.840030}, + {-0.349378,-0.387395}, + {1.124925,-0.570043}, + {0.418603,0.905447}, + {0.470094,-0.957354}, + {0.799573,0.109228}, + {0.261391,-0.587899}, + {0.115105,0.568951}, + {-0.511340,1.109997}, + {0.183765,1.450929}, + {0.528498,-0.666337}, + {0.342372,-0.375714}, + {-1.148716,0.543099}, + {-0.747361,-0.454390}, + {-0.510703,-0.904779}, + {0.494719,0.007910}, + {-0.178977,-0.714179}, + {-0.178152,-0.715379}, + {-0.282468,0.236082}, + {-1.500059,-0.596371}, + {0.070261,0.659727}, + {-0.930558,0.499131}, + {0.889396,0.872062}, + {1.504564,-0.762497}, + {-0.316940,-0.491494}, + {-0.366178,-0.120892}, + {-1.136140,-0.665677}, + {0.792450,0.494536}, + {-0.058379,-0.131564}, + {0.318553,-0.170468}, + {-0.442968,-0.453066}, + {-0.086122,0.487054}, + {-0.002152,0.609175}, + {-0.198518,-0.485488}, + {0.401525,1.306812}, + {-0.871198,-0.567593}, + {-1.415314,-0.301627}, + {1.094900,0.063995}, + {-0.495128,0.213385}, + {0.001405,-0.320934}, + {-0.324564,-0.183506}, + {0.122253,-0.766486}, + {0.984696,0.267844}, + {0.390885,-0.724844}, + {-0.295282,0.211369}, + {-0.452752,0.149217}, + {-1.129899,1.635510}, + {0.401396,0.319009}, + {-0.558456,0.761582}, + {0.516621,-0.299728}, + {1.170774,0.462117}, + {0.617850,0.230530}, + {-0.616788,-0.704169}, + {0.921282,-0.768237}, + {-0.341409,0.311033}, + {1.237788,-0.817666}, + {0.485433,-1.114476}, + {-0.342288,-0.175267}, + {0.536632,1.147849}, + {0.173754,0.023311}, + {0.019679,-0.413100}, + {0.597239,-0.651007}, + {0.649898,-0.023947}, + {0.784239,0.588037}, + {0.830428,-0.495560}, + {-1.123475,1.667920}, + {-0.757155,0.047444}, + {-1.536651,0.080233}, + {-0.600005,0.260676}, + {0.220305,-1.151817}, + {-0.957182,0.202521}, + {0.051226,-0.029891}, + {0.929447,0.384707}, + {-0.422607,-0.106100}, + {0.353436,0.656718}, + {-1.698234,-0.708923}, + {0.303429,-0.258709}, + {-0.088662,0.015699}, + {-0.107934,-0.261967}, + {0.273168,1.400901}, + {0.727049,-0.003312}, + {0.353597,0.715919}, + {-0.952026,-0.067464}, + {-0.145977,-0.817247}, + {0.424964,-0.919265}, + {0.216841,-0.912514}, + {0.817183,-0.911165}, + {-0.818262,-0.517903}, + {0.313475,-0.796077}, + {-0.461417,0.089258}, + {0.281792,-0.291761}, + {0.256943,-0.778188}, + {0.692420,-1.751276}, + {-0.667443,-1.761493}, + {0.064327,0.039954}, + {0.393151,-0.403340}, + {0.452610,-1.766216}, + {-1.336807,-0.219532}, + {0.984460,-0.595093}, + {-0.702228,0.759469}, + {-0.464956,0.036841}, + {0.212799,0.031216}, + {-0.802860,-0.547493}, + {-0.158662,0.903760}, + {0.085684,-0.487384}, + {0.396768,-0.742668}, + {0.947527,-0.110617}, + {-0.879301,0.044952}, + {1.116675,-0.038127}, + {-0.722818,1.392444}, + {-0.373075,0.108044}, + {0.341487,0.570356}, + {0.441689,-0.298432}, + {-0.916256,0.631859}, + {-0.115507,0.498266}, + {0.487754,0.201490}, + {1.238389,-0.100924}, + {0.271103,0.682797}, + {-0.148481,0.589360}, + {-1.194668,-0.756352}, + {0.264142,0.313523}, + {0.562690,-0.166170}, + {-0.527054,0.196752}, + {-1.636821,-0.651796}, + {0.182204,0.101729}, + {-1.710289,-0.320628}, + {0.053238,-0.006688}, + {0.879077,-0.416623}, + {0.459898,-0.350816}, + {-0.856786,0.761817}, + {0.575136,0.370224}, + {-0.710682,-1.661932}, + {0.336980,0.262314}, + {-0.579270,1.290335}, + {1.163348,0.112616}, + {-0.596616,-0.104548}, + {-0.584829,0.611158}, + {-0.507069,0.090728}, + {-1.061880,0.073344}, + {-0.141397,0.660130}, + {1.132322,0.001417}, + {-0.578203,1.455008}, + {0.430346,-0.353417}, + {0.774728,-0.360911}, + {0.089974,0.151366}, + {-0.258221,-0.281586}, + {0.380590,-0.050307}, + {0.805828,1.610702}, + {-2.417115,-0.796571}, + {0.513097,-0.330322}, + {-0.384140,0.768697}, + {-0.343898,0.186101}, + {-1.280400,-0.294454}, + {0.497601,-1.076587}, + {0.969059,0.648983}, + {0.415521,-0.271362}, + {-0.023547,-0.051680}, + {0.697681,0.077273}, + {1.467525,-0.087120}, + {0.914526,0.512467}, + {0.673227,-0.608451}, + {0.868157,-0.438369}, + {-0.641897,-0.582166}, + {-0.395403,-0.726859}, + {0.708135,0.058289}, + {0.155302,-0.353393}, + {-0.604680,-0.269021}, + {0.555662,-0.222243}, + {-0.691591,-1.012201}, + {0.593126,-0.482201}, + {0.938501,-0.141245}, + {-0.285179,-0.282197}, + {-0.332866,-0.838107}, + {-0.299353,0.907257}, + {-0.502252,0.130212}, + {0.509899,0.203982}, + {0.432764,-1.036891}, + {0.320100,0.302258}, + {-0.715537,0.630849}, + {1.399467,0.189787}, + {0.257626,0.021932}, + {-0.112331,0.217707}, + {-1.289427,1.432804}, + {-0.390872,-0.357403}, + {0.236182,0.303781}, + {0.802511,0.330483}, + {-1.028297,-0.403086}, + {-0.147910,-0.288479}, + {0.978197,-0.775374}, + {0.868229,1.459663}, + {0.452224,0.498722}, + {0.746035,-0.670797}, + {-0.360626,0.630983}, + {-0.148420,-0.258364}, + {-0.536846,0.526774}, + {-0.736656,0.599485}, + {0.251565,0.410096}, + {-0.817544,0.436993}, + {-0.361899,-0.266149}, + {0.106065,1.119062}, + {-0.001893,-0.840154}, + {-0.174058,0.288847}, + {0.450589,-0.520516}, + {0.330658,-0.272313}, + {0.560301,0.149574}, + {-0.927905,-0.026315}, + {-0.130635,0.149914}, + {-0.167674,0.479912}, + {0.163863,-0.914797}, + {-0.236233,0.492833}, + {-0.439716,-0.273501}, + {1.097053,0.570964}, + {-1.090225,-0.751110}, + {-0.622561,-1.038814}, + {0.309323,-1.010214}, + {-0.204232,-0.589475}, + {-0.039192,0.034730}, + {-0.672256,0.289962}, + {1.195556,-0.759149}, + {0.701010,-0.946209}, + {-0.211877,-0.021206}, + {0.834771,0.269014}, + {0.310538,0.897536}, + {-0.416299,-0.103346}, + {0.263666,-0.033155}, + {1.199319,0.739114}, + {0.209693,-0.011071}, + {1.463650,-1.052988}, + {-0.101228,-0.167856}, + {1.234120,-0.942573}, + {0.196785,0.954050}, + {0.829042,0.153133}, + {0.357430,0.139137}, + {-1.233805,0.986066}, + {-0.587524,0.933536}, + {1.124220,0.284460}, + {0.369787,-0.213798}, + {-0.012298,1.911852}, + {-1.586387,0.267615}, + {0.696006,-0.464801}, + {-0.624327,1.280676}, + {0.367066,0.324597}, + {0.000432,0.067311}, + {0.390603,1.101625}, + {0.256944,-0.623323}, + {0.543036,0.814041}, + {0.002517,-0.822681}, + {-1.222231,0.151677}, + {1.087153,-0.651828}, + {-0.140421,-0.309047}, + {-1.276460,-0.479672}, + {0.907053,0.734263}, + {-1.468305,1.325843}, + {-0.742062,1.724340}, + {0.602905,0.826894}, + {-0.234395,0.552366}, + {-0.319795,-0.300154}, + {0.766130,0.375387}, + {-0.565094,-0.908181}, + {-0.002303,0.803038}, + {0.606245,-0.886099}, + {-0.375411,-0.501269}, + {1.137430,0.498844}, + {1.400551,1.243294}, + {-0.572345,0.330001}, + {-0.831085,0.224646}, + {-1.193440,0.029548}, + {-1.017357,0.114069}, + {0.036078,0.403207}, + {1.394122,-0.032985}, + {-0.220085,0.427158}, + {-1.279987,-0.411288}, + {0.377185,0.243313}, + {0.004243,-0.857524}, + {1.036016,-0.532137}, + {0.245228,-1.150637}, + {1.467709,-0.614337}, + {-0.512344,0.162373}, + {-1.104046,-0.167139}, + {-0.224718,-0.143013}, + {-0.256979,0.070597}, + {0.089855,-0.271238}, + {-0.734984,0.724372}, + {-0.217210,0.319333}, + {0.718725,0.347974}, + {0.251565,0.741094}, + {0.290149,0.659867}, + {0.408272,-0.032915}, + {0.079918,0.470449}, + {-1.011348,-0.572926}, + {0.265858,-0.244285}, + {0.498660,-1.173075}, + {-0.489052,0.268982}, + {0.803724,-0.240363}, + {-0.448072,0.003395}, + {0.190085,0.738899}, + {-1.320261,-0.384362}, + {-0.851492,-0.388560}, + {0.421440,-0.177958}, + {-0.701418,0.243165}, + {-0.274377,0.336519}, + {-0.432270,0.059413}, + {0.723602,-1.369028}, + {0.003061,1.025321}, + {0.439715,0.455140}, + {0.247416,-0.318078}, + {-0.295679,-0.309351}, + {-1.069923,0.563669}, + {0.778952,0.003877}, + {-0.650501,0.383655}, + {0.290488,-0.280076}, + {-0.318266,-0.503424}, + {0.200569,-0.451626}, + {-0.058511,1.000852}, + {-0.501142,1.127454}, + {0.840729,0.860918}, + {0.404423,1.184485}, + {0.080599,0.337071}, + {0.265972,-0.831970}, + {-0.792118,-0.632130}, + {-1.312815,-0.150298}, + {0.384463,0.434096}, + {-0.473277,-0.646626}, + {0.726083,0.524943}, + {0.232413,-1.349094}, + {-0.132578,-0.328246}, + {0.192057,-0.949313}, + {-0.294124,1.799810}, + {-0.646249,-0.365151}, + {-1.142885,-0.860267}, + {0.952542,0.463949}, + {-0.843407,0.603740}, + {0.245604,0.005612}, + {0.876790,-0.725446}, + {-1.264255,-0.509446}, + {0.935016,-0.003417}, + {0.253759,-0.252225}, + {-0.504993,0.338401}, + {1.002041,0.260841}, + {0.156989,-0.135302}, + {-1.024724,-0.400709}, + {-0.112462,-1.205456}, + {0.334260,0.781035}, + {0.183794,0.683842}, + {-0.865777,0.383277}, + {-0.505670,0.667817}, + {-0.088249,0.840903}, + {1.101360,1.926043}, + {-0.308625,-0.138154}, + {0.609676,-0.715983}, + {-0.645769,-0.287890}, + {0.369474,-0.729993}, + {0.186644,0.541750}, + {0.463282,0.674407}, + {0.216844,-0.852488}, + {0.856090,0.940839}, + {1.001064,0.394220}, + {-0.837133,-0.154497}, + {-0.390434,0.439008}, + {0.680226,-0.317541}, + {0.098053,0.117416}, + {0.071014,-0.649889}, + {-0.262387,-0.155264}, + {0.388413,0.769428}, + {0.158413,0.941346}, + {0.671325,-0.266932}, + {0.970945,-0.618071}, + {0.233638,0.572923}, + {0.060161,-0.256486}, + {-0.637504,0.063894}, + {0.934414,-0.427341}, + {-0.467026,0.652522}, + {-0.863576,0.149723}, + {-0.771443,-0.816274}, + {0.511701,-0.479018}, + {-0.257457,0.087086}, + {0.290638,0.016947}, + {-0.386981,-0.727179}, + {-1.098515,-0.274432}, + {-0.557208,1.426296}, + {-0.613355,0.019539}, + {-0.419196,-0.251018}, + {-0.832714,0.502052}, + {0.128755,0.655366}, + {0.256114,0.273034}, + {-1.125167,-0.906505}, + {0.388043,-0.540845}, + {-0.937881,2.105264}, + {-0.202089,1.002912}, + {0.723756,-0.449443}, + {0.233778,0.527703}, + {-0.057235,1.884349}, + {1.157345,-0.412072}, + {-0.955458,-1.385361}, + {0.053114,0.627971}, + {0.827722,0.375269}, + {-0.181816,0.772748}, + {-1.626276,0.442130}, + {-0.435385,-0.179652}, + {1.089080,-0.426374}, + {1.017264,0.699838}, + {-1.020426,-0.298556}, + {0.676783,0.459662}, + {-0.739834,0.763761}, + {0.721741,-1.206326}, + {-0.951135,-0.270497}, + {-0.457913,-1.038211}, + {1.712993,-0.468750}, + {-0.543171,1.050327}, + {-0.541388,0.741480}, + {1.399220,-0.146602}, + {-0.246873,1.307922}, + {-0.314164,-0.681691}, + {-0.361125,0.096600}, + {0.468431,-0.456516}, + {-1.208053,0.471189}, + {-0.369852,-0.310925}, + {-0.655492,-0.981961}, + {1.982648,0.257313}, + {0.350295,-0.328245}, + {-0.408155,0.164967}, + {1.186227,0.615053}, + {1.538608,0.853998}, + {-1.014463,-0.266268}, + {-0.038058,1.267679}, + {1.226620,-0.039905}, + {0.128462,-0.723152}, + {1.117944,-0.485275}, + {0.110495,0.512575}, + {0.613947,-0.332562}, + {1.183653,-0.135030}, + {-0.545671,-1.236704}, + {-0.368847,0.282388}, + {0.354177,-0.397370}, + {-0.221450,0.619409}, + {-0.212607,-0.070614}, + {-0.746339,0.421409}, + {-0.796334,0.416425}, + {0.281155,-0.847141}, + {1.084794,-0.633466}, + {-1.416468,-0.504705}, + {-0.413320,-0.218964}, + {-0.006619,1.498092}, + {0.592891,0.110515}, + {0.202503,-0.802352}, + {-1.044280,-0.551926}, + {-0.551728,0.074422}, + {-1.621229,-0.887687}, + {-0.034501,-0.177771}, + {0.643751,-0.498982}, + {0.537422,0.214707}, + {0.859316,0.230005}, + {0.984145,0.642774}, + {-0.446523,-0.283910}, + {0.698656,-0.512658}, + {-0.413664,0.370197}, + {0.012230,0.057244}, + {-0.124965,0.707693}, + {-1.668994,0.589325}, + {0.431439,0.916868}, + {0.357835,-0.007437}, + {0.091721,-1.193125}, + {1.085117,0.362418}, + {-0.815710,-0.704111}, + {0.368599,0.417522}, + {-0.153068,0.701186}, + {0.633497,1.153006}, + {-0.640502,-0.448321}, + {-0.288243,-1.008288}, + {-0.241203,0.571272}, + {-0.700623,0.003668}, + {0.762784,-0.271363}, + {-0.675450,-0.536786}, + {-1.095720,0.963368}, + {-0.545080,-0.052652}, + {0.425995,1.045991}, + {0.747089,-0.106197}, + {0.705921,0.481355}, + {-0.231552,-0.495818}, + {-0.035338,0.271549}, + {-1.434181,-0.462102}, + {-0.234651,-0.659026}, + {0.293521,0.578445}, + {-0.159469,-0.371527}, + {0.947780,-0.184427}, + {-0.575724,1.293055}, + {1.217078,0.776812}, + {0.077462,0.005225}, + {0.031218,0.312440}, + {-0.254340,-1.261328}, + {-0.545078,0.114315}, + {0.214459,0.265649}, + {0.665158,-0.572889}, + {0.156845,-0.494711}, + {-0.805048,-0.829465}, + {-1.377436,-0.234879}, + {-0.680977,1.091655}, + {0.991115,-0.327044}, + {-0.636966,-0.868296}, + {-0.468122,0.139195}, + {-0.023171,-0.344042}, + {0.779795,0.665803}, + {0.288043,-0.640526}, + {-0.377837,-0.768582}, + {1.312911,0.154017}, + {0.594896,0.205326}, + {0.546600,-0.380945}, + {-0.348857,-0.048100}, + {-0.719583,0.758329}, + {0.366828,0.580990}, + {0.370738,0.785391}, + {-0.058071,-1.293254}, + {-0.886575,0.757403}, + {0.424991,-0.722256}, + {0.284736,0.076029}, + {1.316231,-1.073572}, + {-0.783294,0.805530}, + {0.389834,-0.129104}, + {1.095639,-0.075839}, + {0.935852,-0.373630}, + {-0.885108,-0.020762}, + {0.158064,0.217629}, + {-0.640319,-0.386929}, + {-0.909168,-0.373835}, + {0.010911,-0.101003}, + {-0.277750,-0.148550}, + {0.521820,1.009048}, + {-0.512451,-0.513281}, + {-0.008047,0.202402}, + {0.741191,-0.666179}, + {0.763195,0.771867}, + {0.390221,0.297205}, + {0.625399,0.489404}, + {1.023425,0.108867}, + {-0.703103,0.629155}, + {-0.103211,-0.285761}, + {-0.390588,1.375767}, + {0.454617,-0.110921}, + {0.317920,-0.896351}, + {0.649451,-0.067138}, + {-0.121899,-0.655986}, + {0.358821,-1.041252}, + {-0.222857,-0.303574}, + {-0.568716,-0.089093}, + {-0.192284,-0.838715}, + {1.222415,-0.016245}, + {0.526310,-0.627056}, + {-0.068488,-1.753668}, + {-1.039387,-0.320863}, + {0.020520,0.318572}, + {0.496641,-0.577605}, + {-0.968605,-0.480527}, + {0.285637,1.389404}, + {0.944869,0.885298}, + {0.638385,-0.710974}, + {-0.279932,0.152341}, + {-0.743228,-1.024093}, + {-0.486215,-0.168400}, + {-0.114585,1.020039}, + {0.056702,-0.528896}, + {-0.949243,-0.844536}, + {1.129499,0.153529}, + {-1.146171,-0.448270}, + {-0.600020,-0.088151}, + {1.026368,-0.907166}, + {1.049642,1.198028}, + {-0.732045,-0.405919}, + {0.210230,-0.786201}, + {0.310585,0.342437}, + {0.067431,0.566931}, + {-0.587248,0.255356}, + {-0.170138,1.277977}, + {-0.258523,-1.186042}, + {-0.773006,-1.019886}, + {-0.448797,-0.188137}, + {-0.091370,0.772927}, + {0.244919,-0.106617}, + {-0.774478,-0.520363}, + {0.440259,0.217792}, + {0.363108,0.753145}, + {-0.266081,0.238928}, + {-1.127392,0.360823}, + {-0.261177,1.592192}, + {0.699450,0.113524}, + {-0.655141,0.291248}, + {-0.436259,-0.058521}, + {0.384314,0.487647}, + {0.039816,-1.110978}, + {0.404230,0.678814}, + {-0.949673,-0.269000}, + {-0.248331,-1.005033}, + {-0.540079,0.606271}, + {0.444702,0.146360}, + {1.015384,-1.065484}, + {-1.877784,-1.198948}, + {0.489736,1.350612}, + {-0.710135,-0.775063}, + {0.593538,-0.900296}, + {-0.098286,-1.049735}, + {-0.108973,0.545483}, + {0.062642,-0.684699}, + {0.098171,0.140806}, + {-0.959390,-0.170130}, + {0.461162,1.804670}, + {1.124557,0.055315}, + {0.189370,-1.658841}, + {0.186242,-0.841503}, + {0.633026,-0.735853}, + {0.857498,-0.201044}, + {-0.218993,-0.016715}, + {-0.765959,0.455723}, + {0.217731,-0.073306}, + {-0.436889,0.159793}, + {-0.023781,-0.349387}, + {-0.248361,0.055098}, + {-0.771684,0.303200}, + {-0.211929,1.024403}, + {0.104045,-1.383657}, + {-0.416710,0.061459}, + {-0.436209,-0.471431}, + {-1.510879,-0.277018}, + {0.200120,1.225231}, + {-0.328469,0.600453}, + {0.127003,-0.602157}, + {0.987188,0.212941}, + {0.670236,0.123304}, + {0.422322,0.157453}, + {0.152338,-0.945760}, + {-0.025870,-0.413677}, + {-0.268227,-0.778529}, + {0.480173,0.907527}, + {-0.888884,-1.439385}, + {-1.351376,-1.091003}, + {0.222836,-0.086297}, + {0.573336,-1.360066}, + {-0.806399,-0.498281}, + {-0.595494,0.831074}, + {0.908191,0.307062}, + {-0.459795,-0.710666}, + {-0.094751,-0.206448}, + {-0.024242,-0.951987}, + {-0.318051,0.362327}, + {-0.063917,-0.408062}, + {-0.003055,1.006656}, + {1.000114,-0.003844}, + {0.433414,0.153418}, + {-0.146174,-0.778023}, + {-0.002596,-0.081254}, + {-0.372852,-0.562314}, + {0.813749,-0.171006}, + {0.516876,-0.334962}, + {0.130150,-0.220825}, + {-0.399139,-0.678091}, + {-0.184451,-0.949755}, + {-0.188671,0.303505}, + {0.037500,-0.099776}, + {0.773437,0.244504}, + {0.445884,-0.043319}, + {0.316367,-0.273157}, + {-0.746967,0.698428}, + {-0.191399,0.086704}, + {1.316252,1.332223}, + {0.445639,0.004308}, + {-0.087606,0.111263}, + {-0.891735,0.020169}, + {0.193313,-0.606729}, + {0.731145,-0.605570}, + {-0.692633,0.021142}, + {-0.444493,0.208281}, + {-0.466215,-0.817877}, + {-0.624077,-0.305184}, + {0.280254,1.208432}, + {0.014983,0.902646}, + {0.006548,0.008337}, + {0.044097,0.697776}, + {-0.171889,-0.146767}, + {0.265368,0.009346}, + {1.059121,0.446341}, + {1.888582,-0.599794}, + {-0.562391,0.519765}, + {-1.251330,-0.838557}, + {-2.137730,-0.631450}, + {0.182187,0.499127}, + {0.764443,0.756613}, + {0.631286,0.584558}, + {1.111431,-0.772644}, + {0.076405,0.183672}, + {-0.058883,-0.335039}, + {-0.703857,0.073318}, + {0.757167,0.909054}, + {-0.611251,-0.894211}, + {-0.330231,0.304851}, + {-0.364020,-0.938645}, + {-0.104970,0.914045}, + {0.093519,1.357853}, + {-0.770065,-0.085731}, + {1.319136,0.816044}, + {0.058947,-0.406575}, + {-0.396587,-0.503710}, + {0.220349,-0.336425}, + {-0.501066,0.255245}, + {1.323531,-1.916640}, + {-0.596563,0.742761}, + {0.713492,-0.603602}, + {0.051641,-0.788488}, + {-0.027644,-0.011744}, + {0.313449,0.369693}, + {-0.874394,-0.458299}, + {0.156414,-0.301505}, + {-0.817243,-0.129309}, + {0.387262,1.050022}, + {-0.730068,0.280044}, + {0.562581,0.907164}, + {0.467513,0.105385}, + {0.244667,0.168116}, + {0.639852,0.033501}, + {0.208643,0.034229}, + {0.947509,-1.095182}, + {0.730262,1.390582}, + {-0.409880,-1.003160}, + {0.401874,1.156874}, + {-0.714656,-1.740182}, + {-0.430680,-0.361054}, + {-0.188850,0.396311}, + {0.796301,-0.592325}, + {-1.140359,-0.833160}, + {-0.015264,-0.656368}, + {1.098273,-0.926714}, + {0.514728,-0.216690}, + {0.098571,-0.636577}, + {-0.910064,0.415927}, + {-0.440682,0.758024}, + {0.127293,0.104132}, + {-0.981800,-0.277406}, + {0.899617,-0.979514}, + {0.602636,0.426296}, + {0.150065,0.494543}, + {0.232962,0.763611}, + {0.467684,0.140699}, + {-1.574619,0.669059}, + {0.882179,-0.011036}, + {0.097422,0.257114}, + {-0.102244,-0.259914}, + {0.490538,0.105090}, + {-0.996295,0.948638}, + {0.083436,0.900836}, + {0.438195,0.350201}, + {-0.679329,-0.713746}, + {0.529187,1.286256}, + {-0.954747,-0.283946}, + {-0.130941,-0.382040}, + {-0.158855,-1.450548}, + {-0.250052,-0.982319}, + {-0.268123,-0.627128}, + {0.444598,1.229273}, + {1.187865,0.972354}, + {1.162571,0.615927}, + {-0.053069,-0.762640}, + {0.568529,0.950631}, + {0.704832,-0.363101}, + {-0.821986,-0.831900}, + {0.321775,-0.386797}, + {0.318484,-0.462144}, + {-0.981095,-0.085616}, + {-0.827586,-0.611532}, + {-0.767987,0.213131}, + {1.465830,0.359996}, + {0.063406,-0.101972}, + {0.103066,-0.104108}, + {-0.332640,-0.565526}, + {0.153801,0.192602}, + {-0.180607,-0.683069}, + {-1.020433,-0.029838}, + {-1.056090,-0.281924}, + {0.711217,1.040632}, + {-0.779687,-0.286412}, + {-1.227989,0.344829}, + {-0.325886,-0.117333}, + {0.010627,0.905134}, + {-0.179905,-0.040737}, + {-0.034126,0.635378}, + {-0.551102,-0.611186}, + {1.349050,0.713766}, + {-1.950842,0.993737}, + {-0.285493,0.919628}, + {-0.839695,-1.284912}, + {0.867960,0.118154}, + {-0.524136,-0.534178}, + {-0.606047,-0.077576}, + {0.997701,-0.360559}, + {-0.143819,-0.521362}, + {0.277948,0.011120}, + {0.781126,-0.650844}, + {0.514107,-0.291052}, + {-0.605037,0.018662}, + {0.595003,-0.358330}, + {-0.892601,-0.794597}, + {-1.068990,-1.057503}, + {-0.833229,1.270529}, + {-0.334875,0.977099}, + {-0.663629,0.338105}, + {0.554117,-0.088210}, + {-0.667932,1.031071}, + {-0.082927,-0.130890}, + {-0.543973,-0.272414}, + {1.397328,0.081006}, + {0.369186,0.137642}, + {-1.393635,0.792070}, + {-0.582444,-0.031794}, + {-0.053332,-0.043677}, + {-0.372722,-0.230031}, + {1.135177,0.092456}, + {0.280377,-0.188462}, + {-0.486260,-0.151009}, + {1.265662,0.491554}, + {-0.473461,0.147609}, + {-0.239905,-0.801906}, + {-0.220706,0.501078}, + {0.640279,-0.721218}, + {-0.349523,-0.466126}, + {0.322248,0.690068}, + {0.360951,0.602485}, + {0.312384,-0.548838}, + {-1.562549,0.675293}, + {0.282446,0.191236}, + {-0.251916,0.509349}, + {-1.270286,-1.114868}, + {-0.429550,-0.631172}, + {0.636991,1.337931}, + {-0.239257,-0.528962}, + {0.203516,0.107619}, + {-0.158954,0.175905}, + {0.017560,-0.973022}, + {1.063318,-0.351026}, + {-0.500848,0.195306}, + {-0.407674,-0.547799}, + {0.311455,-0.233779}, + {0.950908,0.750602}, + {0.087365,-0.326519}, + {-0.921551,-0.059790}, + {-0.237386,0.904391}, + {0.579191,-1.093121}, + {1.114219,0.472145}, + {1.464486,-0.047726}, + {0.230240,-0.507439}, + {0.214072,0.384204}, + {0.227012,1.628634}, + {0.862830,-0.777709}, + {0.499309,0.503287}, + {0.194024,-0.094408}, + {-0.333249,-1.050169}, + {-0.510589,-1.637118}, + {-0.885624,-0.982164}, + {1.742562,-1.274337}, + {0.089119,-1.079374}, + {-0.446537,-0.098650}, + {0.360210,-0.124113}, + {-0.658511,0.326397}, + {-0.544164,0.579137}, + {-0.251213,0.155793}, + {0.335646,0.461865}, + {0.443714,-0.380484}, + {-0.217890,0.767709}, + {-1.477727,-0.131848}, + {-0.670288,-0.482916}, + {1.276010,-0.242181}, + {-0.569009,-0.344377}, + {0.258112,0.099654}, + {-0.470833,-0.107608}, + {0.077847,-1.011430}, + {-0.095550,-1.610504}, + {-0.245212,-0.779197}, + {0.507037,0.270557}, + {-0.210576,-0.406151}, + {0.334297,0.471540}, + {0.940615,-0.817298}, + {0.807612,-0.335314}, + {-0.967504,1.005527}, + {-0.419911,-0.427284}, + {1.058308,0.377315}, + {-0.640751,-0.100329}, + {-0.206736,-1.490178}, + {-0.908508,0.534514}, + {0.236230,-0.674558}, + {0.040694,0.194800}, + {0.926613,-0.976837}, + {-0.400272,0.398158}, + {1.213940,-0.431001}, + {-0.154429,-0.506394}, + {0.263405,-0.666924}, + {-0.587860,-1.305488}, + {-0.626593,0.117810}, + {0.343828,1.396967}, + {0.083446,-0.263320}, + {-0.486981,-0.263767}, + {-0.353650,0.590502}, + {0.546912,0.129352}, + {-0.148903,-0.442021}, + {0.148692,0.307489}, + {0.456169,0.695536}, + {-0.306257,0.742800}, + {0.843344,-0.137786}, + {-0.403558,-0.081928}, + {0.004422,0.767584}, + {0.602551,-0.925966}, + {0.808077,0.677800}, + {-0.920983,0.444859}, + {0.709114,-0.150759}, + {0.774244,0.583938}, + {-0.007792,-0.664973}, + {0.811944,-0.309259}, + {0.744698,-0.075886}, + {-0.510442,-0.065905}, + {-0.015831,-0.190166}, + {0.713298,-0.160445}, + {-0.693444,0.164467}, + {0.504515,0.718341}, + {-0.357876,0.683165}, + {-0.509067,0.349283}, + {0.027786,0.967045}, + {0.001332,-0.162389}, + {-0.917110,0.767740}, + {0.095917,-0.158809}, + {-0.542706,0.715325}, + {0.730792,0.659037}, + {-0.010585,-0.228058}, + {0.500959,-0.152128}, + {0.079144,0.005812}, + {-1.190054,-0.493119}, + {0.184814,1.759480}, + {0.491137,-0.172917}, + {-1.489489,-0.538351}, + {0.038032,0.828474}, + {-0.790134,0.518021}, + {1.008854,0.645478}, + {0.307948,0.009483}, + {-0.329913,0.936288}, + {0.018155,-0.235603}, + {-0.321219,-1.203784}, + {0.428175,-0.218314}, + {-0.362877,-0.370190}, + {0.444549,-0.342885}, + {-0.049808,0.501963}, + {0.674179,-0.185107}, + {0.599912,-1.732999}, + {0.088862,0.782982}, + {-0.107951,0.180743}, + {-0.122355,1.267863}, + {0.550598,-0.112575}, + {-0.000421,0.525225}, + {1.443725,0.501908}, + {-0.409289,0.574812}, + {-0.039830,0.421113}, + {0.508459,-1.005977}, + {-1.445393,-1.149261}, + {-0.631553,-0.319625}, + {-0.909902,0.054411}, + {0.339123,2.211716}, + {-1.144259,0.907937}, + {0.767662,0.182702}, + {-0.001103,-0.936672}, + {0.724690,-0.821044}, + {-0.127908,0.396448}, + {-1.259213,-0.942427}, + {0.270614,0.534192}, + {0.302353,-0.606736}, + {0.368202,0.117501}, + {-0.621508,-0.599182}, + {-0.389050,0.382474}, + {0.276748,-0.206800}, + {0.692974,-2.222835}, + {0.281160,0.177410}, + {0.692791,0.111511}, + {0.641347,0.456632}, + {-0.024490,0.649549}, + {-0.110421,-1.172916}, + {-1.093464,-0.732331}, + {-0.355374,-0.282145}, + {0.758283,-0.156623}, + {-1.392806,-0.020595}, + {0.062043,-0.332704}, + {0.072246,-0.407848}, + {0.764714,-0.922699}, + {0.324736,0.223764}, + {0.322471,-0.791710}, + {-0.310998,0.871270}, + {0.409121,0.452691}, + {-0.507904,0.540686}, + {0.247319,0.370197}, + {0.289584,0.022769}, + {0.918507,-0.797867}, + {-0.002342,-0.653221}, + {0.665966,0.086050}, + {-0.105914,0.520572}, + {0.661266,-0.788971}, + {-0.016104,1.032441}, + {-1.079144,0.763598}, + {0.286110,-0.408518}, + {-0.702570,-0.278708}, + {0.418026,-1.825956}, + {-0.699938,0.339054}, + {-0.549577,-0.472606}, + {-0.958419,-0.399456}, + {0.931910,0.405273}, + {-0.061580,-0.001784}, + {-0.235095,-0.195635}, + {0.396945,-0.793988}, + {-0.120105,0.741895}, + {0.967101,-1.193312}, + {0.408000,0.328582}, + {0.121563,0.074206}, + {0.794018,0.365534}, + {1.427377,-0.303106}, + {-1.185743,-0.469011}, + {-1.014410,-0.160477}, + {0.891003,-0.675965}, + {-0.449822,0.835702}, + {0.168080,-0.372203}, + {0.231932,-0.813300}, + {0.695524,0.543724}, + {-1.150522,-0.300759}, + {-1.130058,-0.194783}, + {-0.158590,0.163209}, + {0.318411,-1.215333}, + {-0.130949,1.027326}, + {-0.022279,-0.079554}, + {-0.819798,-1.296138}, + {0.045197,0.904739}, + {2.069130,-0.927992}, + {-0.409507,0.500071}, + {-0.320066,-1.146465}, + {0.541117,0.115373}, + {-0.789460,-0.165824}, + {0.540866,-0.330202}, + {-0.794487,-0.094771}, + {-0.857677,0.866646}, + {-1.027897,-0.906066}, + {-0.990814,-0.484744}, + {-1.118999,1.518096}, + {0.368560,0.062309}, + {-0.472288,-0.358193}, + {0.818078,0.355593}, + {0.432227,0.535003}, + {0.881773,-0.248469}, + {0.386008,-0.326813}, + {0.729605,-0.034809}, + {-1.973023,-0.054177}, + {-0.155383,0.156626}, + {-0.654563,0.363333}, + {-0.629236,0.253927}, + {0.047558,-0.270537}, + {0.876852,1.219813}, + {0.676330,0.747201}, + {1.527175,-0.031846}, + {0.058820,0.330611}, + {-1.429720,-0.026237}, + {0.145607,-0.314241}, + {-1.057689,-0.330500}, + {0.140384,-0.134579}, + {-0.954319,0.012254}, + {0.454891,-1.125468}, + {2.357209,-0.042871}, + {-1.230701,0.477340}, + {-0.320824,-0.139064}, + {-0.761107,0.100853}, + {-0.288901,-0.086378}, + {-0.428826,1.158555}, + {0.547848,-1.217274}, + {-0.445240,-0.070165}, + {-1.133672,0.465347}, + {0.623461,0.635773}, + {1.003495,-0.575461}, + {-0.028313,-1.236159}, + {-0.362889,0.221756}, + {-0.439814,-0.193680}, + {0.519280,1.102878}, + {0.752761,0.423081}, + {0.166261,-0.338834}, + {-0.310806,-0.151127}, + {-0.160761,0.442555}, + {0.654292,-0.498436}, + {0.080171,-0.983075}, + {0.630524,0.050145}, + {-1.094236,0.845830}, + {-0.395812,-1.350396}, + {0.362922,-1.130889}, + {0.657214,0.160993}, + {-1.055868,0.691473}, + {-0.077860,-0.396539}, + {0.272831,0.186593}, + {-0.963077,1.436838}, + {-1.491045,0.983782}, + {-0.445406,-1.055664}, + {-0.560002,0.315656}, + {-1.094953,0.428742}, + {1.355583,-0.101228}, + {-0.610726,-0.903339}, + {0.220781,0.133283}, + {-0.385599,-0.105530}, + {1.569466,0.694499}, + {-0.949049,0.657375}, + {0.293380,-0.197649}, + {-0.121347,-1.023660}, + {0.142107,1.869948}, + {0.240700,1.753354}, + {0.155119,-0.787710}, + {0.072108,0.802771}, + {-0.518774,-0.835932}, + {0.686448,0.413265}, + {-0.075227,0.357503}, + {-0.367060,-0.293209}, + {1.198188,0.228709}, + {0.086829,0.401398}, + {0.402488,-0.001439}, + {1.875893,1.073098}, + {-0.997759,-1.144125}, + {-0.046681,0.959887}, + {-0.059867,0.850184}, + {-0.456443,-0.686195}, + {-0.245116,-0.874781}, + {-0.652563,-1.042379}, + {-0.538923,0.202282}, + {-0.076387,-0.432216}, + {0.434154,-0.289432}, + {0.791833,1.524970}, + {-1.011962,0.122749}, + {0.443728,0.583743}, + {-0.476166,-0.164564}, + {0.865760,1.395544}, + {0.458453,0.486414}, + {-1.083056,-0.554460}, + {-0.320430,1.151998}, + {-0.522975,0.380352}, + {-0.800879,-0.410712}, + {-1.160173,-0.225969}, + {-0.727965,-0.082624}, + {-0.078411,0.553021}, + {0.825728,-0.312162}, + {-1.384057,0.781615}, + {-0.368922,0.233514}, + {0.279253,-0.378687}, + {0.403824,0.290804}, + {-0.229572,-0.601070}, + {-0.626745,-0.384230}, + {-1.287989,-0.222999}, + {0.484008,-0.010462}, + {0.301750,-0.985000}, + {-0.633804,0.825349}, + {0.394338,-0.576349}, + {0.468509,0.024264}, + {0.255173,-0.901778}, + {0.346377,-0.280184}, + {0.110180,0.975376}, + {-0.753469,-0.647554}, + {0.651564,-0.547723}, + {-0.144017,0.548258}, + {-0.046057,-0.679254}, + {-0.688028,0.887658}, + {-0.445831,-0.479626}, + {-0.456182,0.267624}, + {-0.799260,0.204550}, + {0.563612,-0.771680}, + {0.352540,0.832719}, + {-0.186709,-0.571833}, + {-0.293953,-0.033501}, + {-0.817521,0.420114}, + {-1.095604,-0.434751}, + {1.279435,-0.039357}, + {-0.247834,0.165422}, + {0.921388,0.559970}, + {-0.060142,0.715675}, + {0.740212,1.014127}, + {-0.452908,0.311206}, + {-0.067195,-0.201576}, + {-1.385389,-0.762611}, + {-1.021316,-1.118405}, + {1.760285,0.265590}, + {-0.914306,0.241406}, + {-1.244930,-0.148217}, + {-0.866724,0.107860}, + {0.289939,-1.543434}, + {0.245372,0.941026}, + {0.353275,-0.177928}, + {-0.031020,1.110706}, + {0.377406,-0.075570}, + {-0.164487,1.047496}, + {-0.499391,-0.473578}, + {0.300038,-0.640920}, + {-0.628968,0.062134}, + {0.489684,-0.638970}, + {-0.015019,0.460942}, + {-0.638345,-1.058916}, + {-0.916723,0.886223}, + {-0.333517,0.053708}, + {0.736499,-0.159192}, + {-0.594457,0.367349}, + {-1.222093,-0.085438}, + {0.251137,-0.073996}, + {0.161582,0.194835}, + {-0.380923,0.667572}, + {-0.679757,-0.361005}, + {-0.028839,0.205199}, + {1.091436,-1.342332}, + {-0.221619,-0.241515}, + {-1.053060,0.026055}, + {0.644250,-1.217245}, + {-1.450051,0.901819}, + {-0.920654,-0.715461}, + {-0.130068,1.003309}, + {1.031255,0.523672}, + {-0.136103,-1.381621}, + {-0.011925,-0.254506}, + {-0.960022,1.478489}, + {0.103113,-1.121767}, + {-0.272495,0.511347}, + {0.286424,0.059268}, + {1.022935,0.594292}, + {0.591589,0.954365}, + {0.350593,-0.458349}, + {-0.050092,0.359806}, + {-1.176490,0.825566}, + {-0.680308,-1.571630}, + {0.664836,-1.675775}, + {0.341383,-0.000495}, + {-0.036233,0.927286}, + {-1.339825,-0.242439}, + {-0.295042,-1.175472}, + {0.327445,-0.305612}, + {-1.334769,0.363978}, + {-0.428302,-1.062567}, + {0.329631,0.597784}, + {0.869728,-1.290804}, + {0.836562,0.583755}, + {-0.647207,-0.128658}, + {-0.438580,-0.636896}, + {-0.104333,1.364442}, + {0.134730,-0.418112}, + {-0.297180,-0.005213}, + {-0.277926,-0.075135}, + {-0.356162,-1.540321}, + {-0.315842,-0.300644}, + {-1.054645,0.153170}, + {-0.247471,0.149554}, + {1.167076,-0.050294}, + {-1.150539,-0.133037}, + {1.375072,-0.851715}, + {0.074937,-0.949878}, + {-0.757522,-0.348698}, + {-0.904564,0.281156}, + {-0.601026,-0.749410}, + {-0.559856,0.573678}, + {-1.146828,0.569818}, + {0.867965,0.745430}, + {-1.303702,-0.904121}, + {0.878923,-0.963699}, + {-0.201701,-0.181087}, + {0.623439,-1.377927}, + {-0.196558,-0.155427}, + {0.545429,0.059872}, + {-0.546805,-0.394397}, + {-0.673582,0.666513}, + {-0.904560,0.345434}, + {-0.404512,0.602264}, + {0.037119,0.766632}, + {0.114462,0.094188}, + {0.152701,0.227803}, + {0.192302,0.350055}, + {-0.806506,0.365440}, + {1.434434,0.090690}, + {-0.927956,0.028970}, + {-0.935372,-0.873602}, + {-0.008948,-0.719395}, + {0.984091,-0.139250}, + {-0.659274,0.742974}, + {-0.389700,0.424576}, + {-0.417964,-0.791927}, + {-0.496517,-0.670771}, + {-0.839619,-0.452674}, + {0.353229,-0.699395}, + {0.160866,0.370645}, + {-1.017395,1.246349}, + {-0.215995,-0.034148}, + {-0.917350,0.216393}, + {0.676833,-1.047976}, + {0.260097,0.124759}, + {0.217774,-0.111813}, + {0.676580,-0.052744}, + {0.283784,0.299891}, + {-0.063002,-0.428329}, + {0.105711,-0.622631}, + {-0.355259,-0.471869}, + {0.266862,0.081740}, + {-1.059721,0.037092}, + {-0.335785,-0.856030}, + {0.165769,0.484277}, + {-0.709411,-0.235252}, + {0.027820,0.592038}, + {0.069184,0.501440}, + {1.395272,2.336471}, + {0.930130,0.779630}, + {0.985494,0.017321}, + {0.462865,-0.679985}, + {-0.562682,-0.638530}, + {-0.220520,-1.015673}, + {0.447075,0.614206}, + {-0.113999,0.348454}, + {-0.330527,-1.009147}, + {0.389321,-0.059019}, + {0.160636,1.179804}, + {0.951858,0.075998}, + {0.220489,0.169580}, + {1.011409,-1.264994}, + {0.431117,-0.022166}, + {1.354951,0.693625}, + {0.365787,0.922387}, + {-0.335963,0.354223}, + {-0.231851,1.246409}, + {0.039846,-0.434578}, + {-0.640260,-0.246655}, + {1.010049,-0.948681}, + {0.420819,0.066446}, + {-0.792475,-0.850887}, + {-0.136391,-0.217795}, + {-0.306861,-1.044193}, + {0.599871,0.242422}, + {0.837296,-0.704235}, + {-1.036397,0.218225}, + {-0.362114,-0.270397}, + {-0.815529,-0.643457}, + {-0.346423,0.137188}, + {-0.533657,0.614111}, + {0.894783,0.792716}, + {0.996665,0.135734}, + {-1.810934,-0.175269}, + {0.231803,0.610888}, + {-0.033074,-0.878133}, + {1.029652,-0.537181}, + {0.969218,-0.136601}, + {0.637612,0.569671}, + {-0.856078,0.008827}, + {-0.884361,0.905464}, + {0.266886,0.602131}, + {0.724282,0.927329}, + {0.656946,1.176936}, + {0.385285,0.453920}, + {0.428491,1.218457}, + {-0.534283,-0.476385}, + {1.265943,-0.071326}, + {1.205410,0.119519}, + {0.729693,0.805513}, + {0.792140,0.259950}, + {0.032696,0.915109}, + {0.577120,-0.330747}, + {0.393790,-0.488283}, + {-0.285168,-0.266736}, + {-1.092401,0.351137}, + {-0.410238,-0.455906}, + {-0.112126,-1.848342}, + {-0.694043,0.586241}, + {-0.282187,-0.084074}, + {0.208143,-0.690431}, + {-0.294220,-0.077478}, + {0.114810,-0.640660}, + {0.317942,0.617271}, + {-1.111586,0.978228}, + {0.522150,1.274807}, + {-0.714204,0.099528}, + {-0.270756,-0.875450}, + {0.562005,-0.039459}, + {0.705905,0.860567}, + {0.762285,1.074943}, + {-0.776165,-0.025768}, + {-0.459283,-0.636944}, + {0.185427,-0.185363}, + {0.204738,0.186381}, + {0.973185,0.077738}, + {-0.292046,-0.508409}, + {0.513353,-0.271946}, + {0.003043,0.871596}, + {0.688854,0.660598}, + {0.210751,0.387266}, + {-0.279586,-1.103817}, + {-0.688930,0.757404}, + {0.565899,-0.300622}, + {0.174615,0.399735}, + {0.138945,0.695770}, + {0.223658,0.384469}, + {-1.073520,-0.360915}, + {-0.489023,-0.405400}, + {-0.605479,-1.167890}, + {-0.411600,0.781236}, + {-1.073459,1.248510}, + {0.810854,-0.254195}, + {1.234502,-0.806495}, + {0.260701,1.174122}, + {-0.372537,1.946493}, + {0.314475,0.895673}, + {-1.009274,0.473788}, + {-0.182152,-0.423023}, + {0.252709,2.433176}, + {0.355098,0.295953}, + {-0.547349,0.145758}, + {-0.602792,0.126766}, + {-0.736203,-0.064009}, + {0.927410,-0.913014}, + {0.685445,0.595637}, + {-1.650825,-0.447151}, + {0.274037,0.349263}, + {0.465722,0.789074}, + {-0.162240,-0.368575}, + {-0.699205,-0.695247}, + {-1.299655,-0.834587}, + {-0.112135,0.439572}, + {-0.554151,0.008035}, + {0.843647,-0.401783}, + {-0.043751,-0.334123}, + {1.091176,0.919460}, + {-0.122626,-0.120011}, + {0.282004,0.565924}, + {1.054618,0.582818}, + {-0.770044,0.182383}, + {-0.377127,-0.662357}, + {0.699934,-0.416461}, + {0.725721,-2.274378}, + {-0.285218,-0.376295}, + {-0.046947,0.662061}, + {-0.150529,-0.552474}, + {0.366969,-0.279145}, + {-0.522761,0.138649}, + {0.359948,-1.543065}, + {-1.101930,-0.354878}, + {0.338112,-0.700804}, + {-0.408526,0.129634}, + {0.649985,-0.651205}, + {0.418800,-0.999764}, + {0.357306,-1.544311}, + {-0.381705,-0.067610}, + {-0.161721,0.259118}, + {-0.606741,0.789184}, + {0.281002,0.526998}, + {0.011339,-0.794455}, + {-1.830912,-0.398614}, + {-0.550333,0.484507}, + {0.380872,0.240877}, + {-0.333808,0.561707}, + {-0.306073,-0.400679}, + {0.455130,0.236129}, + {-1.028073,-0.645612}, + {-0.594235,-0.259487}, + {-0.990751,0.305760}, + {0.006477,-1.019058}, + {0.269924,-0.321009}, + {-0.232176,-0.961120}, + {-0.595080,-0.028841}, + {1.278412,0.318883}, + {0.447321,1.388019}, + {0.532051,0.673116}, + {-1.563452,-0.046970}, + {-0.449587,0.019068}, + {0.606453,-0.602681}, + {1.166692,-0.056815}, + {-0.500489,0.600240}, + {-0.500505,-0.287763}, + {0.713353,-0.974392}, + {0.627625,-0.903950}, + {0.360888,0.126583}, + {-0.455974,-0.380084}, + {-0.104278,-0.465263}, + {0.651519,0.420961}, + {0.788706,0.245607}, + {0.070684,-0.600027}, + {0.647984,-0.619099}, + {0.649698,-1.690212}, + {0.318449,0.028318}, + {-1.471110,1.370645}, + {1.207134,-0.322368}, + {-0.685125,0.769329}, + {1.287764,0.797221}, + {-0.996293,1.087134}, + {0.442161,-0.195315}, + {0.121135,0.058126}, + {1.045922,0.679832}, + {0.873562,0.306245}, + {-0.946556,-1.014899}, + {-1.098702,-0.429317}, + {-0.259191,0.604008}, + {-0.446836,-0.599038}, + {0.079361,-0.237178}, + {-0.530503,0.677970}, + {-0.601736,0.605187}, + {-0.160833,0.081568}, + {-0.692943,-1.922262}, + {-1.351586,-0.764923}, + {-0.910394,1.516147}, + {-0.447204,0.696053}, + {-1.603351,0.949397}, + {0.853493,-0.313292}, + {-0.782020,0.417463}, + {-0.229522,0.508701}, + {0.760533,-0.023716}, + {0.227146,0.243735}, + {-0.842789,0.148573}, + {0.517921,-0.314691}, + {0.692720,0.314784}, + {0.280511,0.102037}, + {0.665274,-0.165350}, + {0.082569,0.733769}, + {0.296156,1.171633}, + {1.047696,0.574972}, + {1.019455,0.327643}, + {0.590864,-0.069291}, + {0.058153,-0.552653}, + {0.532137,-0.655718}, + {0.030514,0.631288}, + {0.014617,0.384621}, + {1.061152,0.155026}, + {-1.531251,0.473269}, + {0.989563,0.018146}, + {-0.456740,0.513566}, + {0.652150,0.217298}, + {0.305406,-0.295892}, + {-2.437038,-0.899029}, + {0.129350,0.230154}, + {-0.072882,-0.255708}, + {1.735334,-0.122027}, + {0.357863,-0.822077}, + {-0.260330,-1.094809}, + {-0.618916,0.441565}, + {-0.692015,0.582413}, + {-0.962700,-0.265797}, + {-0.354149,0.603085}, + {-0.086914,-0.518697}, + {-0.573745,-0.565417}, + {0.606341,0.808186}, + {-0.799331,0.580242}, + {-0.096986,0.161126}, + {0.633315,0.549819}, + {-0.144446,0.177149}, + {0.781768,0.531140}, + {0.338951,-0.899343}, + {0.498622,-0.161978}, + {-1.030481,0.406074}, + {-0.853416,0.247330}, + {-0.021314,0.430044}, + {-0.792349,-0.084728}, + {0.661328,1.015329}, + {-0.127205,0.562281}, + {0.597676,0.621570}, + {0.134817,0.231554}, + {-0.159303,-0.083000}, + {1.241670,-0.215870}, + {0.511646,-0.487637}, + {0.396153,0.003545}, + {-0.879940,-0.429533}, + {-0.720669,0.339226}, + {-0.316744,0.113981}, + {-0.177206,1.125024}, + {-1.768052,-1.277820}, + {0.241700,-0.037855}, + {-0.839180,0.779339}, + {-0.368304,-0.224287}, + {-0.788630,0.576087}, + {0.842764,-0.512279}, + {-0.162576,0.392872}, + {-0.704226,0.243854}, + {0.131859,-0.414154}, + {-0.819482,-1.100527}, + {-0.470748,0.467712}, + {-0.316207,0.030052}, + {-0.235583,-0.156785}, + {-0.557592,-0.375994}, + {-0.784024,0.716792}, + {-0.032535,0.712314}, + {-0.122718,0.060842}, + {0.256587,-0.063350}, + {1.593900,-0.262349}, + {-0.241222,1.230849}, + {0.595739,0.423673}, + {0.891444,0.670761}, + {0.005808,0.459865}, + {0.340771,-0.696366}, + {-0.238902,0.415223}, + {-0.572688,-0.354505}, + {-0.059561,0.494342}, + {0.693758,-0.277854}, + {-0.037608,-0.300489}, + {0.644744,1.106841}, + {0.232660,0.485564}, + {2.011315,0.810211}, + {1.047770,-0.099242}, + {1.206122,0.597776}, + {-1.206184,0.417061}, + {-0.522987,0.244164}, + {-0.036536,0.528486}, + {-0.624421,-0.312582}, + {0.898749,0.177874}, + {1.192713,-0.990058}, + {0.498853,-0.556840}, + {0.589997,-1.001501}, + {0.623528,-0.219887}, + {0.082308,0.170954}, + {-0.289952,0.937628}, + {-0.907912,-0.664638}, + {0.010034,-0.573764}, + {0.911873,0.898607}, + {0.204328,0.208605}, + {0.886008,0.671941}, + {-0.238965,-0.470697}, + {-0.047580,-1.367534}, + {0.445139,0.183575}, + {-0.257686,1.029901}, + {0.650779,0.298196}, + {-1.048885,0.864492}, + {0.018705,1.086719}, + {0.353729,-0.758869}, + {0.135370,-0.483281}, + {-1.076019,0.680627}, + {1.100044,0.598223}, + {-1.294965,1.147402}, + {-0.106790,0.436389}, + {-0.743914,1.121257}, + {-0.871260,1.178553}, + {0.204845,-0.486308}, + {0.361820,-0.974340}, + {-0.206131,0.818694}, + {0.788987,0.506632}, + {0.344848,-1.206124}, + {1.204349,-0.052713}, + {0.485916,-0.425330}, + {-0.356002,1.018318}, + {-0.627702,0.255646}, + {-1.301431,0.413334}, + {0.247930,-0.302713}, + {-1.193767,0.508636}, + {0.802304,-0.014054}, + {0.225364,0.597259}, + {1.130788,0.014869}, + {-0.375125,-0.713056}, + {-0.887297,-1.193802}, + {0.911819,0.357139}, + {0.102299,1.114198}, + {0.346137,0.583719}, + {-0.295741,-0.163232}, + {0.306565,0.062372}, + {-0.387799,0.117200}, + {-0.078818,0.039897}, + {-0.951657,-0.147061}, + {0.531560,-0.532658}, + {-0.922460,0.370301}, + {-0.800399,0.384196}, + {0.207158,1.049643}, + {-0.855953,0.709615}, + {0.833019,0.272167}, + {0.272961,0.796026}, + {0.862792,0.320292}, + {-2.027771,-0.518041}, + {0.382846,-0.137945}, + {-0.116166,-0.315429}, + {-0.168185,-0.144519}, + {0.531779,0.133622}, + {-0.516350,-0.152330}, + {-0.127356,-1.375547}, + {-0.105342,0.100885}, + {0.525022,-0.939381}, + {-0.066998,0.440557}, + {-0.397364,0.443860}, + {0.503200,0.746156}, + {-0.431620,0.075595}, + {-0.841891,0.743002}, + {1.371081,-0.365098}, + {-0.010784,-0.465652}, + {0.020112,-0.041097}, + {0.826739,0.182882}, + {-0.613873,0.704830}, + {-0.568370,0.143343}, + {0.387460,-0.545298}, + {0.021157,-0.747607}, + {1.302628,0.905500}, + {0.261942,-0.033071}, + {0.376649,0.470807}, + {-0.612337,-0.531302}, + {0.841322,0.076988}, + {-0.153153,0.320945}, + {-0.874257,-0.702040}, + {0.165278,-1.657980}, + {-0.147901,-1.012033}, + {-1.277508,0.406026}, + {0.962158,-0.812888}, + {0.570132,-0.249752}, + {0.178017,0.240519}, + {0.221700,-1.244702}, + {-1.203450,0.112039}, + {0.203837,-0.704907}, + {0.134167,-0.222161}, + {-0.462939,-1.592425}, + {-0.032346,0.235999}, + {0.386704,-0.786325}, + {-0.693315,0.928200}, + {-2.135864,0.434740}, + {1.006662,1.715587}, + {-0.142810,-0.802204}, + {0.458850,0.565148}, + {-0.338997,1.517529}, + {-0.803918,0.696678}, + {-0.048029,0.081896}, + {0.172872,-1.381249}, + {-0.463157,0.151494}, + {0.014982,-0.330029}, + {0.131682,0.900381}, + {1.245995,-0.694195}, + {0.723281,0.823227}, + {-1.268782,0.935669}, + {-0.323588,0.329887}, + {-0.826465,0.789808}, + {0.969452,0.147947}, + {-0.086800,-0.739140}, + {0.330504,-0.580053}, + {0.613212,-0.291821}, + {1.508769,0.762460}, + {0.427432,-0.078387}, + {0.241827,-0.720148}, + {0.103200,0.692154}, + {0.237121,-0.186097}, + {0.383141,0.836269}, + {-1.686991,-0.116805}, + {0.357785,0.936704}, + {0.009202,-0.259852}, + {-0.364276,0.361380}, + {-0.452860,1.136152}, + {-0.503536,0.666926}, + {1.115614,0.371158}, + {-0.140742,0.824371}, + {-0.082390,-0.656057}, + {-1.230565,0.359913}, + {0.005553,-0.198844}, + {1.238036,-0.548324}, + {-0.707677,-0.575827}, + {0.561192,-0.372388}, + {0.495972,1.965641}, + {0.693577,-0.278012}, + {-0.501385,0.209282}, + {1.174469,-1.508376}, + {0.645479,-1.112553}, + {0.216551,1.222801}, + {0.317056,-0.152965}, + {0.192083,0.034963}, + {-0.110488,-0.462419}, + {-0.666300,-0.015961}, + {-1.752495,0.399985}, + {-0.469240,0.924181}, + {-0.274931,0.641528}, + {-0.312214,-0.016273}, + {-0.517574,-0.530389}, + {0.833532,0.046255}, + {0.684154,-0.745428}, + {-0.955607,0.071248}, + {-0.251567,0.985285}, + {-0.121152,-0.148834}, + {-0.009011,0.787854}, + {-0.649552,0.048180}, + {-0.425329,0.878791}, + {0.393766,0.793184}, + {0.526353,-1.044814}, + {-0.425715,0.097562}, + {0.345638,-0.549481}, + {0.697957,-0.674357}, + {0.905744,0.301798}, + {0.974970,0.602490}, + {-0.901499,-0.882178}, + {-0.019264,-0.630321}, + {-0.421427,0.049030}, + {-0.217801,-1.297212}, + {0.182897,-0.126145}, + {0.128832,-1.435972}, + {-0.107732,-0.836753}, + {-0.777310,0.461033}, + {0.206962,-0.196436}, + {1.346730,-0.307975}, + {0.401943,0.332010}, + {0.044175,0.580896}, + {0.186951,0.580326}, + {0.198179,0.439384}, + {-0.265917,0.422116}, + {0.364858,1.826492}, + {0.891892,-0.698183}, + {1.583665,-1.221355}, + {-0.190341,0.962946}, + {-0.174967,-0.009207}, + {0.729038,-0.307764}, + {0.043398,-1.428511}, + {-0.680441,0.960596}, + {0.250274,0.295808}, + {0.032164,-0.418385}, + {-0.197256,-0.704446}, + {-1.712183,-1.163529}, + {-0.268695,-0.200849}, + {2.306987,2.318621}, + {0.060264,0.224934}, + {0.578235,0.321018}, + {0.028329,-0.398577}, + {-0.468995,0.372626}, + {-0.486544,1.004021}, + {-1.324421,-0.240098}, + {-0.516670,0.486116}, + {1.493896,-0.392662}, + {0.129571,-0.570646}, + {0.163091,-0.300952}, + {-0.249986,0.337349}, + {-0.795421,-0.775087}, + {-1.050828,-0.478171}, + {-0.687893,-1.095394}, + {0.446193,-0.334549}, + {0.207191,1.248893}, + {1.304610,0.004308}, + {-0.531389,-0.521206}, + {0.856143,-0.371803}, + {-0.436616,1.111738}, + {-1.420017,-0.184266}, + {1.140460,-1.630379}, + {0.161864,0.404858}, + {-0.253171,-0.606452}, + {-1.208974,1.509948}, + {-0.954164,-1.303938}, + {-0.048128,0.715313}, + {0.256096,-0.413618}, + {0.282291,1.407356}, + {0.056407,0.582285}, + {0.394826,0.319440}, + {-0.481465,-1.111214}, + {0.591739,0.508274}, + {0.032651,0.767816}, + {-0.134227,0.328188}, + {0.092560,-0.469654}, + {0.797004,-0.160862}, + {0.769209,1.001893}, + {0.898712,0.476407}, + {-0.606030,0.660273}, + {0.035930,-0.406220}, + {0.549958,0.477784}, + {0.930700,0.739616}, + {-0.352887,0.120378}, + {1.456712,-0.987803}, + {-2.326077,-0.576206}, + {0.005039,-0.663576}, + {0.271949,0.400765}, + {1.016654,-0.532382}, + {0.578166,0.345697}, + {1.335427,-0.691842}, + {0.346829,-1.486777}, + {-1.153416,-1.026001}, + {0.223860,0.210608}, + {-0.190999,-0.519098}, + {-0.198968,0.263295}, + {0.651483,0.398883}, + {-0.549925,-0.275894}, + {-1.229674,-0.017529}, + {-1.383489,0.757820}, + {-0.253172,0.217579}, + {-0.816223,-0.232510}, + {0.104862,0.528907}, + {0.079655,0.495187}, + {-1.060489,0.302825}, + {-0.137642,0.212762}, + {0.674357,0.008222}, + {-0.048395,0.926425}, + {0.412030,-0.840911}, + {0.237129,0.647045}, + {0.339638,-0.335510}, + {0.284322,1.034499}, + {-1.397022,-0.292628}, + {-0.146085,0.519480}, + {-0.041487,-0.555443}, + {0.577501,-0.304147}, + {0.311928,-0.446547}, + {0.635509,-0.519239}, + {-1.033277,-1.288549}, + {0.731980,0.033399}, + {-1.854763,-0.310873}, + {-0.244777,0.164482}, + {0.177305,-1.028995}, + {-0.848186,-1.102416}, + {0.208618,0.238623}, + {0.141655,-0.253353}, + {0.171815,0.430131}, + {-0.300252,0.385949}, + {-0.002417,0.000851}, + {0.140724,0.631155}, + {-0.361690,-0.341663}, + {0.452532,1.566797}, + {-0.983234,-0.383707}, + {-0.919083,-0.153251}, + {-0.570362,-0.004002}, + {0.012526,0.451240}, + {1.078805,0.115248}, + {-0.303834,-0.334887}, + {0.111197,-0.445325}, + {0.190372,0.714853}, + {0.826630,-0.758796}, + {-0.855694,-0.601218}, + {-0.240251,0.838381}, + {0.169116,0.269469}, + {-0.758837,-0.535851}, + {0.833886,0.712264}, + {-1.228975,-1.041728}, + {-0.454220,1.116119}, + {1.266360,0.991548}, + {0.399368,0.572129}, + {0.284363,0.183403}, + {0.852430,-0.069496}, + {-0.634331,0.143028}, + {0.704158,-0.787308}, + {-0.348563,-0.322614}, + {-0.926186,0.376325}, + {0.743159,0.167845}, + {2.017916,1.018183}, + {0.808439,-0.898639}, + {-0.362709,-0.359190}, + {-0.263045,-1.681332}, + {-0.155017,-0.596109}, + {-0.058238,-0.339211}, + {-1.052586,-0.827454}, + {0.083530,-0.579545}, + {0.798530,0.075240}, + {-0.671206,-0.110130}, + {-0.032062,-0.960990}, + {0.473355,0.406486}, + {0.724043,0.644396}, + {-0.324565,0.679171}, + {-0.260678,0.183511}, + {-0.340520,-0.690654}, + {-0.490994,-1.070487}, + {-0.102180,-0.653080}, + {1.588020,1.305983}, + {-0.284747,0.210628}, + {-0.084555,0.093298}, + {-0.200014,0.790467}, + {-0.717793,0.363149}, + {0.131695,-0.446003}, + {0.914407,0.814170}, + {-0.202136,-0.003753}, + {1.277709,0.898150}, + {0.656615,-0.393242}, + {-0.156783,0.685943}, + {-0.206718,0.503998}, + {0.201327,0.404118}, + {0.042250,-0.107335}, + {-0.870850,0.210164}, + {0.381354,0.642557}, + {-0.595277,0.854957}, + {0.322635,0.139045}, + {1.736598,0.188796}, + {0.862338,-0.908735}, + {0.952138,-1.054378}, + {0.771591,0.755734}, + {0.080442,-0.425273}, + {0.711784,0.796568}, + {0.221518,0.711452}, + {-0.754410,0.214646}, + {0.297972,-0.998691}, + {-0.023798,-0.667344}, + {-0.064961,-0.853014}, + {0.082753,0.438751}, + {-0.829817,-0.535958}, + {0.179596,0.170377}, + {-0.232841,0.874216}, + {1.184970,0.506020}, + {0.638693,-1.085547}, + {0.618905,0.086848}, + {0.091035,-1.093523}, + {1.586531,-0.145763}, + {0.781375,-0.734368}, + {-0.439204,-0.368124}, + {0.884153,-0.881938}, + {0.443501,0.046392}, + {-0.000463,-2.010197}, + {-1.341146,0.413517}, + {-0.115972,-0.617283}, + {0.576521,-0.591029}, + {0.262853,0.282668}, + {0.454027,-0.299344}, + {0.561599,-1.411193}, + {0.847940,-0.386760}, + {0.162330,-1.607905}, + {0.019188,0.449590}, + {0.667390,0.097850}, + {1.070732,-0.511950}, + {0.837035,0.531196}, + {0.366102,-0.046720}, + {-0.715692,0.543561}, + {-0.021125,-0.195383}, + {0.548797,-1.182353}, + {1.307617,-0.209852}, + {0.563610,0.627996}, + {0.085233,0.093108}, + {-0.445645,1.093604}, + {-0.920394,1.114292}, + {-0.394214,0.442132}, + {-0.175037,0.756531}, + {-1.486353,0.249107}, + {0.036325,-1.007293}, + {-0.348203,0.752406}, + {-0.502838,0.733700}, + {-0.386542,-0.143784}, + {-0.289604,1.540041}, + {-0.112224,0.139364}, + {-0.060213,-0.734811}, + {0.401407,1.469775}, + {0.455272,0.162539}, + {-0.151403,0.737257}, + {0.767557,-0.397638}, + {-0.392108,-0.373642}, + {0.602157,-0.607477}, + {-0.745662,-0.034958}, + {-1.102743,0.087956}, + {-1.559189,0.464934}, + {-1.466796,0.183389}, + {-1.075429,-0.243765}, + {-0.902469,-0.918449}, + {0.135849,0.153793}, + {-0.867781,-0.363082}, + {1.109122,0.450055}, + {-0.862578,0.592056}, + {-0.417136,0.030326}, + {1.119029,0.172928}, + {-0.460388,1.450624}, + {-0.383553,-0.286544}, + {0.769042,0.259261}, + {-0.624490,1.200131}, + {-1.122671,-0.736922}, + {-1.806449,0.235413}, + {-0.034734,-1.440604}, + {0.183904,-0.178401}, + {0.345460,-0.134209}, + {-0.048553,-0.107624}, + {-1.055511,-0.230159}, + {-0.770478,1.603207}, + {0.225398,1.413173}, + {-0.771651,-0.881477}, + {0.297900,-0.163596}, + {-0.747235,0.837724}, + {1.266946,-0.261761}, + {0.714842,-0.900438}, + {0.566732,-0.227364}, + {-0.266881,-0.036107}, + {-0.791542,0.149132}, + {-1.792347,-0.319528}, + {-0.653766,0.011991}, + {1.200644,0.555262}, + {0.282989,-0.753802}, + {0.528717,0.482407}, + {-0.546723,-0.455929}, + {0.266867,0.694730}, + {0.516831,0.923688}, + {0.182959,-1.056826}, + {-1.486910,-0.208888}, + {1.201567,0.192398}, + {-1.757454,-0.151676}, + {1.324179,-0.469352}, + {0.040209,0.160468}, + {0.654096,-0.624048}, + {0.357661,0.980737}, + {0.058591,-0.693167}, + {-0.122160,-1.377046}, + {0.281492,0.331693}, + {-0.082028,0.294920}, + {1.769671,0.812195}, + {0.098679,0.119134}, + {-1.443098,-1.187373}, + {-0.280626,-0.135435}, + {0.589831,0.260585}, + {-0.540208,-0.744497}, + {0.140753,0.497638}, + {-1.508149,-0.600368}, + {-0.545563,1.017052}, + {0.626888,-0.915797}, + {-0.053717,-0.598712}, + {-0.550529,0.572603}, + {0.159770,1.587399}, + {-1.196120,0.802992}, + {-0.515035,0.547389}, + {-0.008116,0.409647}, + {-1.058518,0.054808}, + {-0.042508,-0.559489}, + {0.011590,0.322688}, + {1.052709,0.384123}, + {0.425621,-0.744465}, + {-1.279637,1.410061}, + {0.107505,-1.717265}, + {-0.850488,-0.542529}, + {-0.969962,0.197049}, + {0.045225,-1.201257}, + {-0.701234,0.348909}, + {0.254005,-0.689191}, + {0.696662,0.251047}, + {1.158640,-0.473769}, + {-0.674666,0.000070}, + {-1.079858,-0.744986}, + {-0.956900,-0.604828}, + {0.336681,0.096805}, + {0.749376,0.408288}, + {-0.341699,-0.132789}, + {-0.566410,-0.063452}, + {-0.307095,0.690775}, + {1.362382,-0.954373}, + {0.027733,0.171340}, + {-0.043149,-0.889067}, + {-0.759746,-0.387685}, + {-0.014074,0.110098}, + {1.941074,1.179552}, + {-0.316348,1.024601}, + {0.686783,-0.662860}, + {-0.480265,-0.318199}, + {-0.301052,0.547353}, + {-0.658741,0.133439}, + {0.219759,0.560583}, + {-0.128545,-0.937591}, + {0.937029,0.858481}, + {0.636270,-0.195326}, + {-0.333245,-0.881758}, + {0.799974,0.622142}, + {-0.008765,-0.681762}, + {-0.344503,-0.152322}, + {-0.269002,-0.978158}, + {-1.401038,0.473890}, + {-0.254753,-0.199118}, + {0.501615,-0.004429}, + {0.223899,0.481336}, + {-0.846760,0.430996}, + {-0.061397,-1.110077}, + {-1.262684,-0.975124}, + {-0.255968,0.443139}, + {0.165242,2.157322}, + {0.171348,-0.113452}, + {0.784235,0.826362}, + {-0.930326,-0.142924}, + {-1.016804,-1.041038}, + {0.053696,0.188937}, + {-1.831388,-0.308341}, + {0.956302,-0.422604}, + {-0.814804,-1.598612}, + {0.125995,-0.841216}, + {1.222502,-0.172663}, + {-0.066590,0.294008}, + {1.467924,0.078648}, + {-0.594113,0.074105}, + {0.454844,0.418237}, + {-0.355792,-1.712601}, + {0.280973,0.482542}, + {-1.677893,-0.708101}, + {-0.143138,-0.222046}, + {0.185764,-0.182096}, + {-1.591763,0.811301}, + {-0.872062,0.528511}, + {0.531152,0.105743}, + {-0.405518,-0.243221}, + {-0.285285,-0.724835}, + {1.211926,-0.938313}, + {-0.311116,0.708844}, + {0.452738,0.246767}, + {-0.734349,-0.015975}, + {0.504125,-0.297089}, + {-0.550223,-0.407948}, + {1.386104,-1.647487}, + {-0.532341,-0.778504}, + {-1.609207,-0.322142}, + {0.151805,0.083478}, + {0.045700,0.360312}, + {-0.209418,0.028573}, + {-0.028010,-0.531229}, + {-0.297919,-0.606391}, + {-0.227399,-0.036008}, + {-1.071328,0.802874}, + {1.611743,-0.469932}, + {-0.639568,1.269852}, + {1.007945,0.734555}, + {0.278845,1.802139}, + {-0.074947,1.028369}, + {0.512044,-1.046021}, + {0.400092,0.083723}, + {-0.560397,-0.243498}, + {0.036739,0.207770}, + {0.571326,0.324339}, + {0.186415,-0.351682}, + {-0.457269,0.176103}, + {0.021670,-0.065631}, + {0.511796,-0.018099}, + {1.735932,-1.412607}, + {-0.650731,-1.358326}, + {0.575977,0.636595}, + {0.654576,-0.152643}, + {-0.490564,0.772623}, + {-0.524959,-0.161241}, + {-0.658197,-0.312236}, + {0.163393,-0.340469}, + {0.656293,0.638867}, + {0.501754,-0.811553}, + {0.440917,0.449741}, + {1.556753,0.811315}, + {0.841730,-0.772732}, + {0.660040,-0.888669}, + {-0.782535,-0.242943}, + {1.033138,-1.092518}, + {-0.069224,0.487574}, + {0.387082,-0.053341}, + {-0.254564,-0.830744}, + {-0.007638,-0.247230}, + {-0.661025,0.930161}, + {0.606968,-0.680955}, + {-0.137605,0.289561}, + {0.863396,0.128169}, + {-0.349560,-0.836361}, + {-1.438246,-1.537779}, + {-0.460247,-1.009597}, + {0.728357,-0.362308}, + {-0.050639,-0.243558}, + {-0.679497,0.781298}, + {0.658934,0.412632}, + {0.670115,0.267368}, + {0.123810,-0.916516}, + {0.868722,-1.620722}, + {-0.145830,0.480333}, + {-1.145276,-0.014976}, + {-0.108175,-1.215163}, + {-0.449991,-0.695477}, + {0.354733,0.823464}, + {-0.039724,-0.098980}, + {0.013556,0.499284}, + {-1.312451,-0.054851}, + {-0.830864,0.524224}, + {0.486311,-0.717254}, + {0.643189,-0.177630}, + {0.273871,0.698640}, + {0.853247,-0.305921}, + {-1.129702,0.190997}, + {0.373702,-1.523299}, + {-0.301040,0.189571}, + {-0.224603,0.155915}, + {0.831177,-0.779143}, + {1.389989,-0.223985}, + {-0.321807,-0.258173}, + {-0.366492,-0.422011}, + {-0.384236,0.224358}, + {-1.063747,-0.704562}, + {-0.555400,0.187686}, + {0.271893,0.617246}, + {-0.610279,-0.700190}, + {-0.551170,0.213321}, + {1.648215,0.778172}, + {-0.025453,-0.830363}, + {-0.219132,-0.100106}, + {-1.131840,0.570620}, + {0.351216,0.049910}, + {-0.316256,-0.207403}, + {-0.050467,1.734194}, + {-0.654866,0.299421}, + {0.150861,-0.684421}, + {-0.561852,0.297147}, + {-0.126410,0.789246}, + {-0.127865,-0.749320}, + {0.162245,1.241481}, + {1.336352,-0.647051}, + {-0.605969,0.480636}, + {-1.072146,0.585871}, + {0.768267,0.008915}, + {-0.399790,0.263734}, + {-1.004410,0.473403}, + {0.145836,0.570952}, + {0.647171,0.532919}, + {1.021832,-0.194468}, + {-0.166667,0.643500}, + {-0.062712,0.359724}, + {0.260920,1.286259}, + {0.702274,-0.475356}, + {-0.995690,-0.674690}, + {1.214113,0.161147}, + {-0.054271,-0.030268}, + {0.135363,0.245079}, + {-0.193862,-0.856533}, + {-0.446497,0.195088}, + {0.909234,0.465749}, + {0.027739,-0.240682}, + {0.202885,-0.391204}, + {-0.915654,-1.517288}, + {0.032038,0.801794}, + {-0.565640,-1.125811}, + {-0.746958,0.080219}, + {1.012414,-0.176261}, + {0.925715,0.171622}, + {0.504816,0.886424}, + {-0.055414,-1.707216}, + {0.331249,1.448197}, + {0.325529,-0.748697}, + {0.006156,-0.885744}, + {0.843520,-0.760984}, + {1.008421,-0.221801}, + {-0.978591,1.867998}, + {0.351767,1.119610}, + {-0.152918,1.039013}, + {-0.595093,0.442284}, + {0.844670,-0.308379}, + {0.716920,-0.336382}, + {0.461792,-0.273735}, + {0.097085,-0.336706}, + {-0.119997,0.705377}, + {0.216905,-0.214695}, + {-0.163907,0.691365}, + {0.046850,-0.395489}, + {-0.622611,-0.633670}, + {0.073035,-0.563313}, + {-1.652085,-0.637483}, + {0.004529,-0.510007}, + {-0.756162,-0.373366}, + {0.224175,0.104698}, + {0.240622,0.087521}, + {0.051187,0.920317}, + {1.667764,0.411180}, + {-0.117246,-0.234740}, + {-0.082710,-0.477874}, + {0.040677,-0.399180}, + {-0.950192,0.484832}, + {0.746072,-0.140056}, + {-1.349141,0.607029}, + {0.548435,-0.191376}, + {0.190776,-1.480638}, + {0.719537,1.345205}, + {1.446202,-0.580025}, + {0.053474,0.978262}, + {0.786674,0.753003}, + {-0.996297,0.640894}, + {1.383403,0.136313}, + {0.608127,0.754792}, + {-0.827608,-0.016325}, + {-0.924064,-0.682900}, + {-1.054567,-0.001422}, + {1.185203,1.589105}, + {0.496944,0.349206}, + {-0.169828,-0.384878}, + {-0.285749,0.247343}, + {-0.719044,-1.465544}, + {0.064705,-0.715851}, + {-0.313329,1.540674}, + {-0.565377,-0.220547}, + {-0.959113,-0.696998}, + {-0.265068,0.828256}, + {-0.231885,-0.521362}, + {0.084903,-0.990582}, + {0.419140,-0.095240}, + {0.278788,-0.044144}, + {0.586966,0.431494}, + {1.209696,0.763105}, + {-1.666831,-0.629313}, + {-0.497822,0.832480}, + {-0.142951,-0.554920}, + {-0.275496,-1.050326}, + {-0.478618,-0.636370}, + {0.782930,0.504903}, + {-0.082104,-1.564349}, + {-0.211217,0.853166}, + {1.084067,0.782337}, + {-0.055275,0.277204}, + {0.880825,-0.475584}, + {-0.949252,0.084678}, + {-0.211708,0.245726}, + {1.704036,0.424302}, + {0.077734,-0.365634}, + {0.216536,0.821771}, + {0.375309,-0.657953}, + {-0.659413,-0.187937}, + {-0.499583,-0.274513}, + {1.229467,-0.033242}, + {-0.267309,0.993163}, + {0.865415,0.210650}, + {-0.823692,-0.069652}, + {-0.540393,-0.407260}, + {-0.708647,-0.380446}, + {-0.456284,-0.443381}, + {-1.262311,-0.764377}, + {-0.321781,0.630733}, + {-0.588639,-0.187851}, + {-0.568256,0.499750}, + {0.373187,0.006208}, + {0.707336,0.348158}, + {1.672811,-0.006168}, + {-0.123496,0.243460}, + {-0.436994,0.521309}, + {0.221835,0.213596}, + {-0.110805,0.604376}, + {-0.453414,-0.656775}, + {-0.342502,-0.092188}, + {0.282574,1.154633}, + {-0.805164,0.800347}, + {0.792364,0.263727}, + {-0.117166,-0.150103}, + {-0.284043,1.115365}, + {0.454632,-1.305995}, + {-0.027046,-0.148701}, + {0.158758,-1.399725}, + {-0.035824,1.192414}, + {-0.761856,0.094855}, + {-0.008090,0.994581}, + {-0.259027,-0.931982}, + {-0.978369,-0.050289}, + {0.339204,-0.785655}, + {-0.301449,0.823972}, + {0.745963,0.972562}, + {1.820135,0.926824}, + {-0.182639,0.155852}, + {-0.307134,0.062589}, + {-0.356943,1.592747}, + {-0.810041,-0.170031}, + {0.924231,-0.092920}, + {-0.511708,-0.739995}, + {0.217789,0.214683}, + {0.727853,0.509274}, + {0.540418,0.119559}, + {1.247327,0.541364}, + {0.750281,0.697049}, + {0.211089,0.231808}, + {0.542634,0.268686}, + {0.250232,0.727131}, + {-1.260513,0.624552}, + {0.606138,-0.194470}, + {0.114722,0.116973}, + {-0.552551,-0.850632}, + {-0.586970,-0.054372}, + {0.199770,-0.540281}, + {-1.122043,-0.794103}, + {1.090813,0.071042}, + {-0.304107,0.113772}, + {0.555280,0.023257}, + {0.066496,-1.087529}, + {0.735559,1.299498}, + {-0.523713,-0.325003}, + {0.558212,-1.053250}, + {-0.542305,-0.417328}, + {0.228459,-0.174137}, + {0.882993,1.180572}, + {-0.210242,0.141900}, + {0.530180,-0.288710}, + {-0.867478,-0.490810}, + {0.680940,0.052579}, + {-0.190379,-0.716328}, + {2.098467,0.446381}, + {-0.802407,0.021896}, + {-0.050531,0.152073}, + {-0.548937,-0.769984}, + {1.160574,1.151177}, + {-0.844446,-1.831308}, + {0.469147,0.201575}, + {0.915001,0.416576}, + {0.447789,-1.554800}, + {0.498533,-0.152030}, + {0.333739,0.365833}, + {0.523884,0.261510}, + {0.102519,-2.132332}, + {1.322340,0.237185}, + {-0.666061,0.182718}, + {-0.547886,0.110171}, + {-0.885832,-0.119981}, + {-0.220295,0.279038}, + {0.672774,-0.493978}, + {0.201961,0.278770}, + {-0.698567,1.015529}, + {-0.547559,0.238427}, + {-0.900760,-0.019301}, + {0.850664,0.808783}, + {-0.435736,0.345590}, + {-0.166500,0.514461}, + {-0.734562,-1.054797}, + {-0.480065,0.153198}, + {1.169755,0.209574}, + {1.069664,0.606532}, + {-0.708567,-0.040850}, + {0.652199,-0.079326}, + {-0.719968,0.322006}, + {-0.514982,0.234570}, + {-1.101919,-0.339730}, + {0.150537,0.654555}, + {-0.736618,-0.262166}, + {-0.856246,-0.452481}, + {1.287460,-0.187745}, + {-0.217413,-0.915828}, + {0.609253,-0.743804}, + {-1.171250,-0.922717}, + {0.150368,0.415436}, + {1.201096,-0.573735}, + {-0.115596,0.661219}, + {1.042194,-0.088547}, + {0.005057,-0.396937}, + {-1.158327,-0.358233}, + {0.623459,-0.169205}, + {0.388201,0.751152}, + {0.895239,0.665853}, + {0.354939,0.105708}, + {-0.587396,-1.923318}, + {-0.061833,0.531589}, + {0.604179,-0.251531}, + {0.494426,0.338236}, + {-0.271009,-0.331057}, + {-0.256580,0.492214}, + {-0.088714,-0.383933}, + {1.123027,0.719944}, + {0.375988,0.313174}, + {0.236084,0.230468}, + {0.003886,-0.712924}, + {0.104498,1.606752}, + {-0.532576,0.330591}, + {-0.488381,-1.352006}, + {0.161545,1.723053}, + {-0.710498,-0.276665}, + {-0.986647,0.482909}, + {1.434283,0.726346}, + {0.068419,1.131931}, + {0.442032,-0.394590}, + {-0.239756,0.143242}, + {1.643873,-0.058546}, + {-1.003878,-0.192841}, + {0.122247,-0.079203}, + {-0.252594,-1.356311}, + {-0.869489,-0.064070}, + {-1.961857,-0.185462}, + {-1.899979,0.496400}, + {-0.109843,0.709934}, + {0.827485,-0.498313}, + {0.209843,1.037273}, + {-1.581375,-1.119497}, + {0.290475,1.032399}, + {0.668792,0.476572}, + {-0.433339,-0.944385}, + {0.323084,0.537194}, + {-0.221663,0.003856}, + {1.383254,-0.497884}, + {-1.198460,-0.892147}, + {-0.750552,0.230349}, + {-0.637159,0.240327}, + {1.023382,1.174099}, + {0.449877,1.718353}, + {0.110701,-1.119723}, + {0.188672,-0.085627}, + {-0.767622,0.429697}, + {0.022888,-0.290090}, + {0.029017,-0.575055}, + {0.569277,-0.179878}, + {-1.100726,0.865245}, + {-0.544482,0.275123}, + {-0.336701,-0.933121}, + {0.051869,0.544727}, + {0.845421,-0.138977}, + {-0.855811,0.654785}, + {0.146789,-1.087976}, + {-0.213152,0.076521}, + {1.014701,0.369228}, + {0.303512,-0.346069}, + {0.019167,0.409554}, + {0.812617,-0.834358}, + {1.338190,-0.103966}, + {0.776275,0.019837}, + {-0.804914,-0.226097}, + {-1.210668,-1.599920}, + {-0.354872,1.508185}, + {-0.577729,-0.030264}, + {1.140923,-0.684538}, + {-1.087623,0.646425}, + {-1.213811,1.245787}, + {-0.747429,0.088243}, + {-1.028906,1.421081}, + {0.269063,0.871054}, + {-1.154534,0.036896}, + {0.616763,0.386360}, + {-0.112931,-0.217046}, + {0.465623,-0.396933}, + {0.167084,-1.587480}, + {1.067098,1.142031}, + {-0.726521,0.527343}, + {0.521179,0.754796}, + {1.965600,-0.951334}, + {-0.493864,0.148753}, + {-0.789453,-0.495132}, + {1.154057,0.025690}, + {0.226936,0.017755}, + {-0.397219,0.138528}, + {0.825606,-0.364112}, + {-0.550409,0.454887}, + {0.168085,-0.192830}, + {1.037240,0.172213}, + {-0.623615,-1.192414}, + {-1.394999,0.433780}, + {-0.517121,0.276487}, + {-0.717265,-1.106185}, + {1.173780,0.500190}, + {1.189896,0.347666}, + {-0.367490,0.332201}, + {1.428207,0.822697}, + {0.450744,1.052459}, + {-0.703437,0.894070}, + {0.915143,0.151831}, + {-0.076742,0.733596}, + {0.524063,-0.923572}, + {0.182666,-1.514815}, + {-0.096585,-0.475288}, + {0.933516,0.325996}, + {0.262816,-1.152226}, + {-1.298289,1.056797}, + {0.290436,0.293651}, + {-0.796841,0.007490}, + {-0.001210,-0.482373}, + {-0.372255,-0.003545}, + {-0.951811,0.424592}, + {0.428500,-0.154131}, + {-0.016110,0.104156}, + {0.714483,-0.096403}, + {-0.497021,0.177252}, + {0.119749,-1.519028}, + {1.655545,-1.336578}, + {0.765918,-0.329551}, + {1.142739,1.110006}, + {0.715838,0.057273}, + {0.978170,0.262785}, + {0.989103,0.268928}, + {-0.844677,0.128637}, + {-0.709728,-0.957801}, + {1.655370,0.576793}, + {-0.701566,-0.455455}, + {1.472421,0.138446}, + {-0.068813,0.104376}, + {-0.307454,0.024655}, + {-1.584193,0.460054}, + {-0.636200,0.303211}, + {-0.547006,-0.100346}, + {0.033197,-0.233433}, + {0.036871,-1.428877}, + {-1.282191,-0.020832}, + {-0.226060,0.575992}, + {0.539645,0.580925}, + {-0.515746,0.640159}, + {0.122624,0.379262}, + {-0.298237,-0.430135}, + {0.582305,0.104006}, + {0.761337,0.778517}, + {-0.116138,-0.079724}, + {0.056869,0.497983}, + {0.534546,-0.781835}, + {1.373099,0.424074}, + {-0.326885,-0.553422}, + {0.466659,0.459637}, + {0.057961,0.638324}, + {1.220616,0.000019}, + {-0.396984,1.437168}, + {0.217722,0.458254}, + {0.517229,-0.226219}, + {0.266293,0.723080}, + {0.316267,-0.496743}, + {0.395212,0.100780}, + {0.208948,-0.868054}, + {0.494479,0.422566}, + {0.090251,0.077638}, + {-0.006175,-0.650019}, + {-0.244839,-0.682264}, + {-0.168110,0.761099}, + {-0.705272,0.959809}, + {0.345444,-0.191354}, + {-1.338302,-0.620916}, + {-0.913269,-0.357629}, + {-0.326929,-0.599831}, + {-0.886159,-0.329607}, + {-0.352269,-0.326190}, + {0.517424,-0.679915}, + {-0.256276,0.568007}, + {-0.018477,0.625619}, + {-1.188829,-0.540793}, + {-0.063814,0.082350}, + {-0.574465,-0.281673}, + {-1.431945,-0.967747}, + {-1.319540,-0.350255}, + {0.385732,0.441168}, + {0.648657,-0.187545}, + {-0.413140,-0.199861}, + {-0.860812,0.630549}, + {-0.526107,-0.254688}, + {1.561758,-0.918379}, + {0.478789,-0.553762}, + {0.577887,0.031411}, + {-0.123129,-1.310582}, + {0.467329,-0.373385}, + {-0.158891,-0.519788}, + {0.413279,-0.717616}, + {-0.090683,0.008334}, + {-0.201974,-0.766771}, + {0.467733,-0.252969}, + {1.537250,-0.785099}, + {1.055945,1.034578}, + {0.855592,-1.000192}, + {0.049488,1.476671}, + {0.485982,-1.096695}, + {-0.417544,-0.230928}, + {0.650111,-0.343016}, + {-0.697971,-0.973262}, + {0.665104,0.431052}, + {0.312919,1.312641}, + {0.441995,-0.145228}, + {0.314576,0.658067}, + {-0.499512,-0.180834}, + {0.274381,-0.633668}, + {-1.253873,0.337280}, + {0.429498,-0.073320}, + {-0.721886,-0.291230}, + {2.130391,-0.609516}, + {0.264504,-0.772070}, + {0.197991,0.156987}, + {0.012200,0.176025}, + {0.511819,0.264211}, + {0.846034,-0.534889}, + {-0.019510,0.783356}, + {0.369750,-0.658338}, + {0.067036,-0.850373}, + {-0.187688,0.650173}, + {-0.550258,0.977643}, + {0.310795,-0.493400}, + {-1.002795,-0.323754}, + {-0.687753,0.520814}, + {-0.273234,-0.055023}, + {1.420085,-0.258885}, + {-1.197577,0.045913}, + {0.069913,-0.134013}, + {-0.662290,-0.003455}, + {-0.451015,-0.580987}, + {1.162251,-0.128787}, + {-0.397880,-0.417766}, + {0.970358,0.047251}, + {-0.999546,-0.615866}, + {-0.667909,0.655248}, + {0.171279,-1.041255}, + {0.490597,-0.745594}, + {-0.163106,-0.467833}, + {0.685498,-0.884569}, + {0.021264,-0.159166}, + {-0.284385,0.390590}, + {-0.406411,0.147308}, + {-0.887529,-0.424785}, + {0.800653,0.320601}, + {-0.237328,0.229176}, + {-0.356110,-0.871456}, + {-0.469616,-0.563785}, + {0.540253,0.000454}, + {0.766091,-0.692660}, + {1.265823,-1.121352}, + {-0.519969,-0.763516}, + {-0.908685,1.223205}, + {0.378901,-0.148434}, + {0.734892,-0.017845}, + {0.630235,0.605463}, + {0.484549,0.798393}, + {0.889189,-0.588511}, + {-1.209300,-0.615938}, + {0.745912,0.216205}, + {-0.361015,0.030537}, + {-0.140569,0.491194}, + {0.206099,0.823077}, + {1.382085,0.511459}, + {0.822290,1.501179}, + {0.580893,0.246972}, + {-0.058519,-0.069856}, + {-0.623353,-0.877999}, + {0.911648,0.144101}, + {0.264720,-1.072727}, + {-0.788517,-0.665520}, + {0.884159,-0.498943}, + {-0.328181,-1.628856}, + {-0.854272,-0.298947}, + {0.369952,-0.228915}, + {0.466766,-0.533842}, + {-0.856672,0.555703}, + {-1.666030,0.205364}, + {-1.163374,0.020615}, + {-0.460905,0.147512}, + {-1.150163,-0.171924}, + {-1.086664,1.156968}, + {0.221459,0.371883}, + {-0.140640,-0.413140}, + {0.015694,-0.876451}, + {0.084676,-0.170816}, + {1.728853,-0.133309}, + {0.505786,0.017453}, + {0.738540,-1.225824}, + {-0.732059,0.505571}, + {0.586809,0.992493}, + {-0.201427,0.147962}, + {-0.669290,0.191411}, + {-0.670438,0.813079}, + {-0.396987,0.005979}, + {-0.248870,0.602922}, + {0.019785,-1.162706}, + {0.258091,-0.507443}, + {-0.293495,-0.206140}, + {-1.416552,-0.047997}, + {0.863624,-0.614726}, + {0.618458,-0.667468}, + {-0.068763,-0.452185}, + {0.518270,0.013776}, + {0.095323,0.282178}, + {-0.501060,1.250301}, + {0.495096,-0.240239}, + {0.841004,0.186255}, + {0.979204,-0.843511}, + {0.159362,-0.525116}, + {-1.076816,-0.329245}, + {0.590261,0.475905}, + {-0.042284,0.849452}, + {-0.176301,0.436022}, + {-0.007701,1.259334}, + {-1.508466,-0.903273}, + {1.741680,0.724148}, + {-0.829550,0.878517}, + {0.549818,0.385023}, + {-0.586413,0.711769}, + {-0.731277,0.072802}, + {0.732751,-0.781661}, + {1.453798,0.653282}, + {-0.547525,0.163118}, + {1.321736,0.284994}, + {0.967075,0.447090}, + {0.449005,-1.871133}, + {0.049354,-0.499692}, + {0.623433,1.594496}, + {-0.006018,-0.366873}, + {-0.476288,-0.645067}, + {-0.185525,1.921269}, + {0.691321,-1.097974}, + {-1.417428,0.364298}, + {0.995453,0.433032}, + {0.645331,-0.069612}, + {0.587566,-0.248929}, + {-0.015891,0.435682}, + {0.300868,0.560848}, + {0.593525,0.847680}, + {-1.032251,0.705217}, + {-1.236513,-0.605437}, + {0.480328,0.151749}, + {-0.327914,-0.239973}, + {0.645026,1.272340}, + {1.041862,-0.097846}, + {-0.444069,0.694695}, + {0.748340,-0.242565}, + {-0.392311,-0.564402}, + {0.955277,-0.330417}, + {0.766884,-1.099700}, + {0.270925,-0.271814}, + {0.991722,-1.258038}, + {-1.300449,-0.021881}, + {-0.648161,-0.316676}, + {0.189458,0.566763}, + {-1.087335,0.525761}, + {-0.096931,0.439582}, + {-0.004232,-0.614384}, + {-1.011860,0.920394}, + {-0.096274,-0.360917}, + {0.126764,-0.317622}, + {1.075920,-2.092266}, + {-0.745683,0.670968}, + {-0.427878,0.479526}, + {1.421614,1.297357}, + {-0.182187,0.907850}, + {0.576038,-0.390017}, + {-0.774510,0.092694}, + {1.486913,0.472625}, + {-0.985614,-0.039686}, + {0.497321,0.513824}, + {-0.226054,-0.465794}, + {0.263041,-0.071887}, + {0.284301,-0.781556}, + {0.312159,-1.389565}, + {-0.473675,1.103600}, + {0.066062,-0.020374}, + {0.153187,-0.821651}, + {0.252598,-0.505776}, + {-0.588915,-0.507526}, + {0.746750,0.865902}, + {-0.198729,0.371388}, + {0.192385,-0.115625}, + {-0.301964,1.093953}, + {-0.372911,0.616029}, + {-0.146635,-0.921548}, + {0.449273,-0.739387}, + {0.901099,0.774089}, + {0.266051,0.377341}, + {0.591555,0.563182}, + {0.636632,-0.227791}, + {1.160072,0.570171}, + {0.176682,0.068412}, + {-0.005833,0.132717}, + {0.004802,-0.842799}, + {1.604389,-0.379789}, + {0.484633,-0.421334}, + {0.185324,0.164699}, + {0.040009,0.495247}, + {-0.126941,-0.436956}, + {1.077300,1.615921}, + {-0.092967,-0.177670}, + {0.562370,-0.425568}, + {-0.812328,-0.831640}, + {0.504950,-0.415654}, + {0.634659,-1.051510}, + {-0.509551,-0.741446}, + {0.461403,-0.823263}, + {0.741515,-0.178576}, + {-1.803048,0.240838}, + {0.965793,0.671290}, + {0.485702,0.199620}, + {-0.033739,0.468502}, + {0.995017,0.457605}, + {-0.891019,-1.422089}, + {0.213272,1.349124}, + {0.957810,-0.529870}, + {1.144436,0.631099}, + {-0.608364,-0.008161}, + {-0.183913,-0.622132}, + {0.259485,1.794263}, + {-1.893936,0.887524}, + {0.869948,0.279483}, + {1.330244,-0.234150}, + {-0.698793,-1.869186}, + {-0.023907,-0.584283}, + {0.889881,-1.321943}, + {0.739625,-0.348848}, + {-0.445268,0.106291}, + {0.826921,0.698815}, + {-0.290005,0.699820}, + {-0.344072,-0.323324}, + {-0.411819,-0.585410}, + {-0.018909,-0.290762}, + {0.505112,-0.327444}, + {-0.118789,-0.034296}, + {1.369287,0.043394}, + {-1.463384,-0.619034}, + {-0.230005,1.632769}, + {-0.715552,1.059146}, + {0.500928,-0.212733}, + {0.920560,-0.635359}, + {-0.588473,0.687934}, + {-0.213108,-0.623500}, + {-1.114112,1.581999}, + {1.450259,-0.777587}, + {-0.240633,0.524103}, + {-0.437009,-0.672738}, + {-0.672158,-0.442712}, + {-1.001309,0.772701}, + {-0.448667,0.061504}, + {0.258287,-0.116766}, + {-1.022620,0.057617}, + {-0.132288,1.008135}, + {1.073702,-1.840446}, + {1.048816,-0.795525}, + {0.549427,-0.386099}, + {0.536366,-1.205694}, + {-0.187059,1.950097}, + {0.301988,-0.179036}, + {-0.553248,1.508990}, + {-1.704598,0.083126}, + {-0.872153,-0.082539}, + {-0.436999,0.247757}, + {-0.535663,0.218898}, + {1.740084,-1.134760}, + {1.769763,0.915663}, + {-0.562986,-0.099149}, + {1.793889,-0.797788}, + {-0.178126,-0.267732}, + {0.631260,-1.067603}, + {0.824120,0.547277}, + {0.414803,0.795777}, + {1.524148,-0.914855}, + {0.122641,-0.801623}, + {0.240361,-0.440083}, + {0.297449,2.260062}, + {-0.047492,-0.415373}, + {1.113301,-0.107794}, + {-0.278272,-0.153044}, + {-0.795337,0.227249}, + {-0.362846,0.602121}, + {0.954406,1.716838}, + {-0.259979,-0.099052}, + {-0.032074,-0.033958}, + {-1.944759,-1.116393}, + {-0.489102,0.214741}, + {-0.522574,1.262638}, + {0.863974,-0.082520}, + {0.484891,1.178134}, + {0.703921,0.461285}, + {-1.885850,-0.134840}, + {0.185955,0.977271}, + {0.324373,0.280497}, + {-0.540469,0.740809}, + {-0.490823,0.276430}, + {1.048976,-0.306852}, + {-0.872366,0.408507}, + {-0.522883,0.166499}, + {0.244488,-0.257421}, + {-1.040009,-0.423785}, + {-0.755068,0.536125}, + {-0.684830,0.823324}, + {0.564522,0.356330}, + {-0.595022,0.388829}, + {-0.144106,0.215685}, + {0.035723,-0.053939}, + {-0.353620,-1.153940}, + {1.247211,-0.730838}, + {1.664593,0.096993}, + {0.991357,-0.265930}, + {-1.524475,1.193607}, + {0.404257,-1.329731}, + {-0.893348,-0.573884}, + {-0.456101,1.026453}, + {0.114008,-0.620093}, + {0.505622,0.342661}, + {0.550962,0.586929}, + {0.809653,-0.405812}, + {-0.028734,-0.834741}, + {-0.155816,-1.209146}, + {1.153799,1.158627}, + {-0.190132,0.358644}, + {-0.802479,-0.235259}, + {0.090976,-0.943619}, + {0.728902,-0.942158}, + {1.160826,-0.138895}, + {0.377593,-0.778267}, + {0.070475,0.710161}, + {-0.141220,-1.059658}, + {0.833144,0.183631}, + {-0.769879,0.085471}, + {0.940921,0.622870}, + {0.717500,0.267314}, + {-0.671317,-0.402610}, + {-0.190394,0.893239}, + {0.197755,0.923891}, + {1.199303,-0.372345}, + {-0.196247,0.422832}, + {0.254665,-0.230619}, + {1.194773,-0.045428}, + {-0.165593,-1.152962}, + {0.457136,-0.280145}, + {-0.302551,0.117955}, + {1.065757,0.136590}, + {-0.403169,-1.378557}, + {-0.555648,0.009076}, + {-0.654869,-0.527972}, + {0.007930,0.308520}, + {0.267582,-0.462596}, + {-1.321099,1.596624}, + {0.201720,0.549905}, + {0.573367,-0.507021}, + {0.816064,0.368670}, + {-0.014020,0.027474}, + {0.437790,0.322314}, + {0.228108,-0.622273}, + {-0.462938,-1.714444}, + {0.645504,0.655548}, + {-0.129067,-1.174696}, + {-0.363463,0.121620}, + {0.064644,-0.373728}, + {0.829669,-0.093423}, + {1.987522,1.409714}, + {0.402627,0.461663}, + {-0.517408,1.461400}, + {-0.194346,0.371817}, + {-0.095302,1.127603}, + {0.854504,0.243799}, + {-0.175436,0.956797}, + {0.765841,0.740974}, + {-0.311100,0.344987}, + {0.505908,-1.150500}, + {0.570032,-0.062613}, + {-0.145633,0.780485}, + {-0.162999,0.361546}, + {-0.290794,1.229566}, + {0.262506,-0.308712}, + {-0.060761,-1.319020}, + {-0.374195,0.429511}, + {-0.086799,0.375579}, + {-0.695934,1.544833}, + {-0.553200,0.563327}, + {0.270544,0.934228}, + {0.336961,0.195811}, + {0.665743,0.096687}, + {-0.076057,1.056521}, + {0.798484,-0.357557}, + {0.241616,-1.011969}, + {-1.077322,-0.558872}, + {0.442441,-0.655746}, + {0.244793,-0.618180}, + {0.103232,0.499368}, + {-0.227070,0.190847}, + {0.550947,-0.745656}, + {-1.079964,0.299129}, + {0.779327,-1.277451}, + {-1.628750,0.145433}, + {0.240864,-1.102978}, + {-1.270518,0.131556}, + {0.775651,-0.293631}, + {-0.240939,-1.275808}, + {0.223459,0.026144}, + {-0.742946,0.387688}, + {0.012050,-0.095382}, + {-0.342335,-0.145945}, + {-0.474094,-0.504738}, + {-0.202108,0.823645}, + {1.541322,-0.601652}, + {0.433840,-0.201410}, + {0.098066,0.014597}, + {-0.773606,-0.954702}, + {0.318751,-0.263447}, + {0.397180,-0.536216}, + {-1.235381,0.558129}, + {0.769004,-0.940717}, + {-0.235040,-0.468838}, + {-0.564520,-0.384393}, + {-0.005423,1.188288}, + {-0.985059,0.199438}, + {-0.189449,-0.528242}, + {-0.388491,-1.042069}, + {0.430704,-0.535256}, + {-0.591624,-0.007859}, + {0.592677,-0.737538}, + {-0.381401,-0.351623}, + {0.491357,-0.380019}, + {-0.483469,1.474160}, + {-0.125849,0.369908}, + {0.078613,-0.121651}, + {-0.353110,-0.717969}, + {0.872719,-0.606648}, + {-0.428882,0.846706}, + {0.175737,-0.707301}, + {0.420668,-0.670445}, + {0.181614,-0.047297}, + {0.921628,-0.508933}, + {0.592896,0.669205}, + {-0.330365,-0.380564}, + {0.650241,1.309658}, + {0.236892,-0.200631}, + {-1.285455,-1.072231}, + {0.258253,-0.458396}, + {0.580260,-0.058791}, + {-0.198798,0.297518}, + {-0.081461,1.105449}, + {-0.972283,0.637500}, + {-0.752549,-0.092627}, + {-0.787857,-1.415530}, + {1.506419,1.017351}, + {0.585529,0.375103}, + {0.637950,-0.354231}, + {0.542343,-0.978832}, + {-0.631439,0.380096}, + {0.387861,-0.406235}, + {-0.458367,0.221299}, + {0.982058,-1.106305}, + {0.250386,-0.654296}, + {0.176148,-0.799581}, + {-1.154337,0.577434}, + {0.743221,-0.164562}, + {0.147461,0.563461}, + {0.262860,-0.187851}, + {0.080463,-1.267225}, + {-0.842093,0.465417}, + {-1.150684,0.413909}, + {-0.697233,-0.258542}, + {1.008287,0.072083}, + {-0.788413,-0.051451}, + {-0.039100,0.376908}, + {0.314799,-0.081361}, + {-0.961472,-1.372276}, + {0.190966,-0.194039}, + {-0.415721,0.883995}, + {-0.001280,-1.035261}, + {-0.578034,0.253532}, + {0.718858,0.130658}, + {0.169064,-0.650773}, + {1.019305,0.470424}, + {-0.779577,-1.527926}, + {-1.397568,-0.116837}, + {0.151050,-0.025676}, + {-0.946740,-0.996213}, + {0.946883,0.374918}, + {0.120331,0.668101}, + {-0.158538,-0.647519}, + {1.011966,-0.291368}, + {-0.414841,0.899555}, + {-0.613882,-0.444467}, + {0.133879,-1.173510}, + {-0.713934,0.659541}, + {0.632421,-0.324801}, + {-0.929352,-0.825345}, + {-0.939329,-0.154669}, + {0.135173,0.015513}, + {1.221067,0.948110}, + {-0.389186,-0.513496}, + {0.296118,1.574228}, + {-0.296515,-0.024812}, + {1.003795,0.323161}, + {-0.435951,0.654561}, + {-0.490652,-0.418108}, + {0.752490,-0.105439}, + {-0.337112,0.345660}, + {-0.567309,1.101450}, + {0.959341,-1.200654}, + {0.928823,0.018668}, + {0.251045,-0.478851}, + {0.947048,-1.373055}, + {0.155776,-1.054964}, + {-0.380913,-0.118574}, + {0.042293,-0.476657}, + {0.200067,-0.039548}, + {-0.386089,-0.409839}, + {0.799759,-0.629364}, + {1.030871,-0.758805}, + {0.191216,-0.009835}, + {1.064252,0.456354}, + {-0.739292,0.213518}, + {-0.957471,0.766434}, + {1.289907,1.080144}, + {0.839509,-0.415417}, + {-0.126717,-0.220462}, + {-0.493196,0.136442}, + {-0.740415,-0.205084}, + {-0.451410,-0.124071}, + {0.590748,-1.389196}, + {1.048353,-0.143902}, + {1.382293,0.237621}, + {-0.817723,-1.004158}, + {0.025907,-0.953813}, + {-0.134011,0.870525}, + {-0.796710,0.808375}, + {1.063805,-0.573200}, + {0.608984,0.022332}, + {0.705208,1.520836}, + {-0.449768,0.364173}, + {-0.121032,-0.081536}, + {-0.222846,1.764236}, + {-2.317731,-0.242630}, + {0.003012,2.291217}, + {-0.731425,0.097707}, + {0.267980,0.021976}, + {-0.052570,-0.060891}, + {1.328129,1.291555}, + {-0.535779,-0.699093}, + {-0.321002,0.511984}, + {-0.118378,0.976733}, + {-0.483034,-0.250304}, + {-1.164027,0.342938}, + {0.152236,0.157467}, + {-0.219252,0.092701}, + {0.666655,-0.396142}, + {-0.662523,-0.345241}, + {0.362952,-0.167473}, + {-0.619415,0.020731}, + {1.119113,0.580225}, + {-1.234932,0.059510}, + {-0.979695,0.650857}, + {0.248844,0.475403}, + {0.152068,0.896504}, + {-0.025802,-0.188693}, + {-0.312432,0.713030}, + {0.318940,1.325683}, + {-1.388616,-0.069398}, + {0.563331,0.129599}, + {0.556248,0.372978}, + {-0.387270,-0.410561}, + {0.381157,0.174884}, + {0.205704,0.309849}, + {0.546306,1.544967}, + {-1.502442,0.568854}, + {-1.441137,-0.654132}, + {0.236177,0.806135}, + {-0.458600,-0.272605}, + {1.645150,-0.472139}, + {1.230134,-0.639721}, + {0.194120,-0.166522}, + {0.117438,-0.763945}, + {0.775048,-0.144419}, + {0.582774,-0.338508}, + {-0.451656,-0.308490}, + {-0.997512,0.221620}, + {0.518933,0.834596}, + {0.072709,0.691029}, + {-0.072488,-0.926413}, + {0.455952,1.521838}, + {0.452472,-1.063857}, + {0.509717,0.548683}, + {0.555750,-0.567077}, + {0.044489,0.772517}, + {-1.065137,1.047399}, + {-0.057517,0.426841}, + {-0.048828,-0.066677}, + {-0.090397,-1.373149}, + {0.299498,-1.074127}, + {0.508632,0.940645}, + {-0.075787,-0.866339}, + {1.162672,0.315994}, + {-0.398345,-0.537812}, + {-0.364908,-0.483622}, + {0.461687,0.527551}, + {-0.162621,0.230750}, + {1.072227,1.602365}, + {-0.866570,1.022571}, + {1.183777,0.054456}, + {-0.901192,-0.614876}, + {0.207856,-1.230461}, + {-0.218150,-0.421866}, + {-0.416722,0.161147}, + {0.434887,0.939654}, + {-0.141095,-0.011220}, + {-1.002557,-0.906183}, + {-0.336980,0.143558}, + {1.524689,-0.734075}, + {-1.673018,-0.011837}, + {-0.399086,0.379387}, + {0.022946,0.360077}, + {1.334352,-0.058248}, + {0.582118,0.104689}, + {-0.235530,-0.117603}, + {-0.685178,1.207036}, + {-0.505037,0.394430}, + {1.041913,-0.754037}, + {0.157290,-0.635867}, + {0.420463,0.059918}, + {-0.672484,-0.106277}, + {-0.342000,-0.887734}, + {0.037279,-1.312576}, + {0.196471,-0.690414}, + {0.628345,0.600837}, + {1.905626,0.213228}, + {0.002845,0.911432}, + {-0.273556,-0.817731}, + {-0.734045,-0.814594}, + {-0.278813,1.362944}, + {-0.490799,0.681619}, + {0.823281,0.924446}, + {0.382131,0.054887}, + {0.207567,0.197565}, + {-0.198756,-2.356373}, + {-0.146667,1.116811}, + {-1.225286,0.261605}, + {-1.600163,-0.215777}, + {0.188098,0.034549}, + {0.059091,0.203517}, + {0.539660,-0.144263}, + {0.559525,-0.197091}, + {-0.995693,0.479884}, + {-0.140240,0.304529}, + {-0.933852,1.657169}, + {-0.378402,0.686321}, + {-0.133646,-0.711732}, + {0.356331,0.032003}, + {0.167839,-1.094820}, + {0.495340,0.695848}, + {-0.324402,2.032407}, + {0.345523,-0.708782}, + {0.651872,1.141485}, + {-0.804705,0.431775}, + {0.073119,-0.202232}, + {-0.389707,-0.229234}, + {-0.264997,1.293800}, + {0.443424,0.482117}, + {0.331831,-1.277015}, + {-1.021430,-1.437496}, + {0.034502,-1.757843}, + {-0.222381,-0.925680}, + {0.029757,0.759219}, + {0.025235,0.100197}, + {0.204608,0.007049}, + {0.108738,-0.526643}, + {0.063573,-1.456564}, + {-0.344489,0.271249}, + {-0.605927,-1.137269}, + {-0.505740,-0.805053}, + {0.607392,0.236317}, + {-0.004607,0.308809}, + {0.148965,0.107110}, + {-0.116365,-1.014452}, + {0.054350,-0.377083}, + {1.753877,0.889535}, + {-1.155775,0.390584}, + {-0.077606,0.065922}, + {0.550225,0.202540}, + {1.695931,-1.527247}, + {0.112023,1.588761}, + {-0.397930,-0.627045}, + {-0.761887,0.846351}, + {-0.202916,0.218434}, + {0.028378,1.479997}, + {-0.484383,-0.042392}, + {-0.104811,0.833990}, + {-0.860957,0.498545}, + {1.074833,-0.971359}, + {0.286261,-0.574891}, + {0.415268,0.659014}, + {-0.123245,-0.459360}, + {0.596546,-0.406837}, + {1.301351,-0.741688}, + {0.925065,-0.414523}, + {0.443874,-0.870857}, + {0.416989,-0.113289}, + {0.117815,0.264440}, + {-0.569040,-0.606823}, + {-0.071240,0.617613}, + {1.082605,0.798463}, + {-0.300080,0.104141}, + {-0.190657,-0.215200}, + {-0.109927,-1.077320}, + {-0.865215,-0.747596}, + {0.026072,0.657730}, + {-0.602460,-0.765455}, + {-0.120662,-0.176552}, + {-0.020959,0.700393}, + {-0.532963,1.578641}, + {0.660906,-0.761852}, + {0.204630,0.671138}, + {1.378102,1.047063}, + {0.561706,0.261408}, + {-0.260495,0.707119}, + {0.122258,-1.309491}, + {0.348012,-0.204710}, + {0.590837,-0.752105}, + {1.641608,-0.346800}, + {-0.873873,0.418680}, + {-0.277803,0.003063}, + {1.257064,0.252787}, + {0.675850,0.403955}, + {-0.418536,0.803833}, + {-0.164660,0.169753}, + {0.850197,0.896004}, + {0.819463,-0.702546}, + {0.422036,0.045786}, + {0.453763,-0.574596}, + {-0.166787,-0.756407}, + {0.523826,0.600864}, + {-0.115417,0.177982}, + {-0.055416,0.683982}, + {-0.270215,0.340186}, + {0.195431,1.313902}, + {-0.443910,-0.182965}, + {-0.071393,-0.364572}, + {-0.707667,0.098065}, + {0.778016,-0.604885}, + {-0.229268,-0.776824}, + {-0.512173,-1.134451}, + {0.252034,0.380931}, + {-0.003544,0.019841}, + {-0.058631,0.109133}, + {-0.128306,-0.186545}, + {-0.293227,1.213620}, + {-0.779521,0.232263}, + {0.060435,0.186679}, + {0.990281,-0.912743}, + {-1.301892,0.111320}, + {-0.034738,-0.546598}, + {-0.566775,-0.661059}, + {-0.925700,-1.136595}, + {0.568009,-0.694776}, + {-0.857730,1.198007}, + {-0.037984,-0.146860}, + {-0.252787,-0.038902}, + {-0.568219,-0.219940}, + {0.303626,0.948180}, + {-0.038566,-0.531735}, + {-0.103828,-0.538015}, + {0.260650,-0.359314}, + {-0.327697,0.416712}, + {-1.116063,0.090095}, + {-1.293285,-0.837186}, + {-0.482711,-0.182843}, + {0.059427,0.514144}, + {0.566554,-0.141405}, + {-1.308599,0.222065}, + {0.119560,-0.441928}, + {-0.228916,-0.884073}, + {0.381615,-0.358756}, + {0.207154,1.337287}, + {-0.260877,-0.510744}, + {-0.240457,0.257392}, + {-0.147033,-0.616898}, + {0.252767,0.555545}, + {1.142911,0.946975}, + {-0.145901,-0.472828}, + {0.263985,0.594191}, + {0.275152,-0.360078}, + {-0.378772,0.233403}, + {0.060201,-1.295192}, + {0.711630,-0.480067}, + {-0.727486,-0.316626}, + {-1.024395,-0.820563}, + {0.229158,0.571038}, + {-0.195501,0.125831}, + {-0.134340,-0.536494}, + {-0.265465,-1.168649}, + {-1.253822,0.766807}, + {-0.908661,0.099254}, + {-0.303613,-0.289008}, + {-0.312701,-1.039648}, + {-0.560653,0.439198}, + {-0.592471,-0.580957}, + {-1.482518,0.450587}, + {1.765973,-0.280969}, + {-2.102702,0.355270}, + {0.543240,1.121485}, + {0.960646,0.575538}, + {-0.328846,-1.412944}, + {-0.158343,1.897285}, + {1.102149,-1.023840}, + {0.757352,-0.148155}, + {-0.543007,0.817050}, + {0.860867,0.780749}, + {-0.209900,-0.052244}, + {0.033218,0.744034}, + {0.846613,0.704981}, + {1.311109,-1.502775}, + {0.749682,-0.026687}, + {-0.670479,-0.906180}, + {-0.449276,-0.235328}, + {-1.029479,-0.800321}, + {-0.552364,0.362018}, + {0.571044,-0.294024}, + {0.303263,-0.977773}, + {-1.872468,0.396964}, + {-0.955788,-0.245566}, + {-0.953171,0.032204}, + {-0.140014,0.562421}, + {-0.238861,-1.034260}, + {0.016618,-0.778735}, + {0.641832,-1.328999}, + {-0.555008,0.001675}, + {0.177758,0.407400}, + {0.378772,-0.737130}, + {-0.947272,0.646346}, + {0.530960,0.259863}, + {-0.901216,-0.065121}, + {-0.322799,-1.319203}, + {1.054523,0.101474}, + {1.428788,-0.349216}, + {0.349194,1.127674}, + {-0.452166,-0.174773}, + {-1.118452,0.641579}, + {0.089249,-0.175187}, + {0.266167,0.234908}, + {0.087406,-0.807926}, + {-1.697266,0.627200}, + {-1.079827,-0.422557}, + {-0.372603,0.642134}, + {0.131330,0.888119}, + {0.792349,0.278774}, + {-0.246192,0.080661}, + {-0.353288,0.005239}, + {-0.134266,-0.384476}, + {-0.828652,0.066405}, + {-0.548264,-0.080022}, + {-0.120933,-0.875978}, + {0.903563,-0.743197}, + {-0.567596,-0.824528}, + {-0.206943,-0.203413}, + {0.232509,0.801755}, + {0.398309,-1.779415}, + {-0.186675,-0.863868}, + {1.305872,0.428744}, + {-1.716046,0.133683}, + {-0.450440,0.029653}, + {-0.506766,0.145657}, + {-0.967946,-0.295591}, + {0.257046,-0.199603}, + {0.490026,0.741449}, + {-0.482293,0.888983}, + {0.433545,0.021292}, + {0.395731,-0.152964}, + {-0.127526,0.629495}, + {0.948778,0.420625}, + {0.080788,0.918771}, + {-0.601768,-0.511523}, + {0.056685,-0.188264}, + {0.077067,-0.297327}, + {0.362971,-0.552698}, + {0.500014,-0.566048}, + {0.681482,0.264552}, + {-0.610054,-0.646848}, + {0.265600,0.541288}, + {0.026679,0.942537}, + {-1.762192,-0.407303}, + {-0.902743,-0.036230}, + {0.474591,-0.525614}, + {0.067020,-0.220233}, + {-0.618935,0.644017}, + {-0.247249,0.460334}, + {0.455640,-0.078102}, + {0.204557,0.186035}, + {-0.502683,-0.745109}, + {0.603414,2.160750}, + {0.949033,-0.309626}, + {0.143544,-0.468590}, + {-1.617425,-0.599765}, + {-0.338967,0.795837}, + {-0.575392,0.117471}, + {1.113309,0.741864}, + {0.491207,-1.773106}, + {-0.796479,-1.166586}, + {1.776758,-0.487393}, + {0.665706,-0.686534}, + {-0.733067,0.665936}, + {-1.191914,-0.753852}, + {-0.861479,-0.028041}, + {0.528864,0.362282}, + {0.372907,-0.759873}, + {-0.326107,-0.368006}, + {1.034767,-0.488401}, + {-0.020672,0.121155}, + {-0.763290,-0.252682}, + {-0.581453,0.977660}, + {-0.422611,0.734330}, + {0.410968,-0.697525}, + {0.256227,0.884536}, + {-0.271733,0.028247}, + {-0.553155,0.558822}, + {0.591687,0.681808}, + {-0.295964,-0.252254}, + {-0.861694,0.270864}, + {-0.212098,0.137016}, + {0.563568,0.156760}, + {-0.959209,-0.885105}, + {1.242799,-0.806484}, + {-1.749964,0.424195}, + {-0.811421,0.090595}, + {-1.270889,0.077082}, + {-0.507043,0.606896}, + {-0.573533,0.304032}, + {-0.073649,1.058108}, + {0.042070,-0.145220}, + {-0.668327,1.142738}, + {0.669062,-0.322129}, + {0.021137,-0.503492}, + {-0.193499,0.358862}, + {-0.508566,0.260507}, + {0.084811,-0.605995}, + {1.557960,-1.120053}, + {1.643320,-0.421612}, + {-0.480576,-0.823660}, + {0.231449,0.151004}, + {0.398016,0.209073}, + {0.045075,0.672618}, + {-0.008618,0.247177}, + {-1.053566,0.352608}, + {0.116426,1.141890}, + {0.792719,-0.667965}, + {0.331232,1.168582}, + {-0.196787,0.038326}, + {-1.109405,0.145585}, + {0.925101,-0.146615}, + {0.420151,-0.522343}, + {-0.006697,0.762735}, + {-0.508807,-0.069119}, + {0.925127,0.708615}, + {-0.110840,-0.048132}, + {-0.364342,0.472781}, + {-0.885346,1.332877}, + {-0.247386,1.012912}, + {-1.386080,0.289459}, + {0.225626,-1.466751}, + {-0.274328,-0.634428}, + {0.221469,0.108111}, + {-0.288359,0.596638}, + {0.406563,-1.159590}, + {-0.781803,0.171775}, + {-0.266993,1.093298}, + {0.188762,-0.887276}, + {-1.385732,0.271974}, + {-0.535123,-0.445177}, + {-0.405735,0.672560}, + {0.184163,0.241237}, + {0.218489,-0.629709}, + {-0.080616,0.521363}, + {-0.263647,-1.969656}, + {-0.000105,-1.140732}, + {0.345163,0.238108}, + {-0.724603,-0.973090}, + {0.166771,2.574467}, + {-0.442168,-0.073635}, + {0.087945,0.845359}, + {0.179795,-0.061662}, + {-0.317741,-0.537081}, + {-0.444731,-0.240390}, + {0.451603,-0.608631}, + {0.311307,-1.277915}, + {-1.138521,0.364751}, + {0.634037,-0.538308}, + {0.336605,-0.705948}, + {0.112277,0.892130}, + {-1.254259,0.041164}, + {-0.032781,1.144167}, + {-0.022324,0.649488}, + {-0.344520,-1.047174}, + {0.317010,-0.433506}, + {0.814095,-0.340343}, + {0.022872,0.077959}, + {0.249692,0.224696}, + {1.305443,0.613798}, + {-0.581707,0.071940}, + {-0.258272,-1.904325}, + {0.601451,-0.060804}, + {-0.118601,0.938334}, + {0.303851,0.393623}, + {0.736692,-0.211060}, + {-0.272122,-0.490145}, + {0.222637,-0.021387}, + {-0.311633,0.735060}, + {-0.199568,0.759139}, + {-1.013715,-0.780787}, + {-1.135842,-0.735749}, + {0.387608,0.235686}, + {0.083913,-0.711059}, + {0.163113,-0.233968}, + {0.180869,-1.193578}, + {-0.541856,0.511090}, + {0.718738,-0.971796}, + {0.918659,-0.884243}, + {0.235544,-1.235024}, + {0.685277,0.219639}, + {0.854647,-0.421738}, + {-0.028494,-0.255750}, + {-0.526021,-0.508404}, + {-0.492737,-0.753063}, + {0.462732,-0.859153}, + {-0.133400,0.676276}, + {0.450487,0.025040}, + {-0.561239,0.571686}, + {-0.642541,-0.609117}, + {1.075468,-0.169765}, + {0.574631,-0.097372}, + {0.338229,-0.024071}, + {-0.525317,0.025844}, + {0.487080,0.416213}, + {-1.007587,-0.270080}, + {0.343576,-1.099756}, + {-0.699170,0.043134}, + {-1.044511,0.757733}, + {-0.575676,-0.749373}, + {0.305846,-0.161683}, + {0.811672,0.079546}, + {-0.192293,0.436743}, + {-0.693445,-0.830657}, + {0.968077,1.051416}, + {-0.769386,-1.502744}, + {-0.255967,-1.803842}, + {-0.470924,-0.998421}, + {-0.824508,-1.845973}, + {0.045837,-0.401762}, + {0.360613,0.910411}, + {-0.337096,-0.237348}, + {-0.484460,0.113391}, + {0.305826,-0.010794}, + {0.147090,0.500318}, + {0.225740,-0.205529}, + {-1.264348,-0.329185}, + {-1.194871,-0.957492}, + {0.650858,-0.758139}, + {-1.280834,0.080681}, + {0.625022,-0.858635}, + {1.711320,0.093822}, + {-1.151505,0.996810}, + {1.790324,0.687198}, + {0.656644,1.704101}, + {-0.376292,-0.352113}, + {-0.126730,0.661884}, + {0.252564,-0.254102}, + {-0.661905,1.131852}, + {-0.368894,0.146481}, + {-0.798706,-1.083358}, + {-0.454165,1.240990}, + {-0.039095,-0.119828}, + {0.632847,-0.423721}, + {-0.380750,-0.363220}, + {-0.262391,-0.622616}, + {-0.859738,0.564480}, + {-0.750698,0.139456}, + {0.947125,0.430152}, + {0.677915,0.729907}, + {-0.239181,0.435498}, + {0.466691,-0.384876}, + {0.532654,-0.083163}, + {0.542034,0.653067}, + {0.208817,-0.330605}, + {-0.130409,0.034659}, + {-2.320815,-0.033099}, + {0.871427,0.273985}, + {0.194936,1.108967}, + {-0.285382,0.345010}, + {1.195251,1.573778}, + {0.713952,1.087552}, + {-0.415100,0.517458}, + {1.196398,0.021875}, + {0.802508,1.907587}, + {0.299614,-0.173952}, + {-0.608050,-0.581877}, + {0.977775,0.565290}, + {-0.192386,0.145355}, + {-0.665472,0.535100}, + {-0.151025,0.022383}, + {-0.250835,0.788190}, + {0.764801,0.467007}, + {0.298350,-1.467544}, + {-0.017556,-1.063610}, + {1.562445,-0.529165}, + {-0.520377,0.378911}, + {0.058748,1.831556}, + {-1.071124,0.601172}, + {-0.878448,-0.254107}, + {-0.154485,-0.985552}, + {-0.887400,0.327273}, + {-0.705357,-1.472086}, + {-0.740599,-0.067128}, + {0.711410,-1.034293}, + {-0.333938,0.630428}, + {1.278035,0.397289}, + {0.210056,-0.257437}, + {-0.585602,-0.005302}, + {0.203850,0.195065}, + {-1.060016,0.172660}, + {0.771525,-0.917467}, + {-0.723919,-0.412679}, + {0.232786,-0.197431}, + {1.194496,-0.581625}, + {1.340972,0.360705}, + {0.975104,0.097678}, + {1.133589,0.133129}, + {-0.298991,0.302132}, + {-0.784508,-0.922366}, + {0.322948,-0.119337}, + {0.110163,-0.145440}, + {1.574654,0.287009}, + {-0.189796,-0.018106}, + {-0.174887,-0.498104}, + {-0.080131,-0.165148}, + {-0.657113,0.318723}, + {-0.433595,0.705876}, + {0.857977,-0.158599}, + {-0.482497,0.036595}, + {-0.576244,-0.193566}, + {0.296959,-0.488391}, + {0.405842,-0.070404}, + {0.590507,0.533184}, + {0.587150,1.314828}, + {-0.211139,-1.292577}, + {-1.010083,-0.313106}, + {-0.863307,0.569579}, + {0.997553,-0.971260}, + {0.472407,1.098185}, + {-1.119245,-1.232905}, + {0.618522,1.245082}, + {-0.262763,-0.278210}, + {-0.105775,0.170132}, + {1.269669,-0.240590}, + {0.170976,0.601526}, + {0.188523,-0.015175}, + {-1.326050,1.007456}, + {-0.090769,0.040268}, + {0.418566,0.135730}, + {-0.182901,0.036998}, + {-0.333515,0.424837}, + {0.428316,0.383354}, + {-0.794054,-0.779979}, + {0.263906,0.439720}, + {0.162836,0.989119}, + {-0.071999,0.354381}, + {-0.291458,-0.020139}, + {0.449140,0.931136}, + {-0.694063,-0.246796}, + {-0.862572,0.091815}, + {0.028864,-0.095157}, + {0.724161,0.223737}, + {0.047003,1.150192}, + {-1.174734,-0.534178}, + {0.591572,-0.393347}, + {-0.219495,0.747091}, + {-0.136702,-0.163781}, + {-1.060912,0.069882}, + {0.029668,0.042101}, + {0.131750,0.093846}, + {0.871290,1.182361}, + {1.253828,0.378833}, + {1.186058,-1.172422}, + {-0.063604,0.553535}, + {1.002073,-0.209174}, + {0.444720,-0.729126}, + {-0.206357,0.032391}, + {-0.700775,-0.526320}, + {-0.737105,0.314376}, + {0.592877,0.135543}, + {-0.663426,0.630024}, + {1.260741,0.446146}, + {-0.705061,-1.146632}, + {0.428181,0.432223}, + {-0.213335,0.151536}, + {0.520582,0.924886}, + {0.577738,-0.057536}, + {-0.751351,1.533813}, + {-0.156074,0.562951}, + {0.046758,-0.037720}, + {-0.217340,0.168171}, + {0.241340,0.494540}, + {0.506104,-0.317633}, + {-0.655820,0.567359}, + {0.480759,-1.112311}, + {0.386474,-1.201118}, + {-1.449230,-0.518502}, + {-0.706211,0.406803}, + {-1.560129,-0.422456}, + {-0.077915,-0.197029}, + {-1.004173,-0.827722}, + {0.500350,1.832784}, + {1.097967,-0.612166}, + {-0.131651,0.635959}, + {-0.049192,0.986648}, + {0.349039,0.570957}, + {-0.171897,-0.308825}, + {-1.215161,-0.958771}, + {0.571949,0.628435}, + {0.729169,0.139248}, + {0.709536,0.696363}, + {0.097966,0.586873}, + {0.397300,0.024276}, + {0.236370,0.090813}, + {0.514880,0.171434}, + {0.793476,-0.258985}, + {-0.515502,-0.496673}, + {0.473964,0.129542}, + {-0.354065,-0.227705}, + {0.656057,0.340024}, + {-0.176111,0.646745}, + {0.688527,0.624363}, + {-0.533171,-0.007906}, + {-1.490044,-0.019393}, + {0.062044,0.744611}, + {0.830698,-0.386727}, + {-0.110515,0.456228}, + {1.417382,-0.674755}, + {0.459868,0.925687}, + {-0.836631,0.488354}, + {-0.019731,-0.693838}, + {1.289891,-0.627465}, + {0.055161,-0.256309}, + {0.468467,-0.780689}, + {0.717432,-0.802497}, + {-0.085141,-0.309899}, + {0.930132,0.556225}, + {0.405997,-0.271818}, + {-0.768176,-0.288646}, + {0.100647,0.538259}, + {0.907866,0.140152}, + {-0.368110,-0.402555}, + {-0.228629,-0.940188}, + {-0.569401,0.233255}, + {-1.022570,0.000617}, + {-0.324842,0.052006}, + {-0.269973,0.777187}, + {-0.035408,-0.139996}, + {0.473745,0.160440}, + {-1.354914,-0.289104}, + {-0.475516,-0.054631}, + {-0.041168,-0.128649}, + {0.427951,-0.409020}, + {1.363959,-0.447370}, + {-0.703075,1.016340}, + {-0.075306,-0.369703}, + {0.230086,-0.722273}, + {1.792416,-0.645114}, + {-0.093824,-0.242755}, + {-1.292877,-1.080529}, + {1.196220,0.155053}, + {0.173557,-0.177454}, + {-0.634131,-0.976788}, + {-0.379141,0.884947}, + {-0.536256,0.697163}, + {0.552100,-0.096580}, + {-0.696552,0.923878}, + {0.118458,0.110518}, + {-0.582715,-0.173407}, + {-0.956599,1.799081}, + {-0.843667,-0.384598}, + {0.764067,-0.865968}, + {1.000620,-0.160073}, + {0.953401,1.628974}, + {-0.888514,-0.891334}, + {-0.680686,0.247835}, + {-0.754843,0.258330}, + {-0.675973,0.394557}, + {-0.190745,0.303396}, + {-0.170964,1.405210}, + {0.926068,-0.197468}, + {0.672418,0.927374}, + {0.197025,-0.069306}, + {0.354251,-0.267216}, + {0.290035,-0.073490}, + {0.110947,0.354887}, + {0.443680,-0.098480}, + {-0.294424,0.866491}, + {-0.841475,-0.422685}, + {0.266968,0.062065}, + {1.515674,-0.060925}, + {0.176005,0.140636}, + {0.404577,-0.509459}, + {0.515552,0.061269}, + {0.853981,-0.954393}, + {1.019148,-1.441008}, + {0.163838,0.376008}, + {0.288430,0.184545}, + {0.067683,1.030477}, + {-0.499583,0.343582}, + {0.009995,-0.042159}, + {-0.621239,1.076062}, + {-0.939004,0.349109}, + {0.798145,0.400775}, + {0.435127,0.287123}, + {0.202232,-0.459503}, + {-0.115217,-0.562763}, + {0.415476,-0.178029}, + {1.158389,1.432155}, + {0.936251,-0.718354}, + {0.848607,-0.413887}, + {0.391567,-0.379341}, + {-0.299960,0.021999}, + {-0.500304,-0.145804}, + {0.809236,0.749736}, + {0.827454,0.361110}, + {0.433617,-1.060374}, + {0.897989,0.043762}, + {-1.028161,0.704788}, + {-0.194029,-0.081497}, + {0.651930,-0.779738}, + {-0.210318,0.138924}, + {-0.224011,-0.719656}, + {-0.690712,-0.403295}, + {-0.421069,0.703604}, + {-0.492768,-0.402452}, + {-0.811297,0.602505}, + {-1.785654,0.521719}, + {0.587757,-0.400209}, + {0.043330,-0.684632}, + {0.384072,1.455485}, + {1.259714,0.400161}, + {0.761448,0.079450}, + {-0.053741,-0.471277}, + {0.412257,0.180934}, + {0.519025,-0.912317}, + {1.338382,-1.089903}, + {-0.120862,1.387350}, + {0.046935,1.216046}, + {0.078641,0.418476}, + {-0.826729,-0.603339}, + {-1.169826,-0.905686}, + {-0.319044,-0.337864}, + {-0.000338,-0.036139}, + {-0.070890,0.167189}, + {-0.364559,-0.483024}, + {-0.845227,0.663173}, + {-0.358604,0.991618}, + {-0.544255,0.196842}, + {1.734390,0.066961}, + {0.304854,-0.438655}, + {0.570055,1.368692}, + {0.680056,0.502049}, + {1.473820,-0.240434}, + {0.143943,0.150471}, + {-0.601375,1.462794}, + {-0.130329,0.130809}, + {-0.816240,-0.613083}, + {-0.363673,0.906229}, + {-0.137845,0.310958}, + {0.028385,0.813332}, + {0.797503,-1.224658}, + {0.193431,-0.529715}, + {-0.088177,-0.203006}, + {-0.475714,-0.792887}, + {0.226096,-0.128947}, + {0.184089,-0.068373}, + {0.887181,0.224031}, + {-0.216778,0.056027}, + {-1.168135,-0.932106}, + {0.564475,-0.495475}, + {-0.673622,1.542024}, + {-0.610914,-0.581747}, + {-0.089544,-0.439327}, + {0.714516,-0.660308}, + {1.223961,-0.522664}, + {0.661751,-0.105839}, + {-0.630532,-0.064537}, + {-1.161529,1.098738}, + {-0.427223,-0.021232}, + {-0.026751,0.416435}, + {0.362154,-0.386305}, + {0.208456,0.633020}, + {0.045405,1.111140}, + {1.425449,-1.110883}, + {0.707444,0.651275}, + {-0.500077,0.697821}, + {0.203707,0.456913}, + {-0.853159,1.120343}, + {0.834138,-1.031290}, + {0.617247,-0.697880}, + {-0.043978,-0.182348}, + {0.543946,-0.336939}, + {-0.357450,-0.588382}, + {0.063896,0.467717}, + {-1.005923,0.946648}, + {0.848093,0.260463}, + {-0.603198,0.472919}, + {0.824311,1.081034}, + {-1.794170,-0.412169}, + {-1.188588,-0.303771}, + {-0.599378,-0.512405}, + {-0.764410,0.839242}, + {-1.630732,-1.206763}, + {0.475393,1.662433}, + {0.287510,0.340842}, + {-0.361590,-0.457253}, + {0.259458,0.427517}, + {-0.962593,-0.157040}, + {-1.043433,0.709428}, + {-0.124816,0.350705}, + {-1.784117,-0.277703}, + {-0.816757,0.881473}, + {1.130899,0.072276}, + {0.508338,-0.545349}, + {0.248984,-1.013667}, + {0.303921,-0.296289}, + {0.907752,-0.325327}, + {-0.706874,-0.148790}, + {-1.511246,-1.230174}, + {-0.034105,1.186995}, + {0.791315,-0.061800}, + {-0.115356,-0.013607}, + {0.614068,-0.643597}, + {-1.434752,-0.837895}, + {-0.262646,-0.486002}, + {0.425083,-1.154407}, + {-0.888865,0.643359}, + {0.354696,-0.522025}, + {0.516178,-0.483834}, + {-0.383349,-0.393546}, + {0.627820,1.304975}, + {-1.536539,0.297887}, + {0.522986,-0.438700}, + {0.570505,0.136875}, + {1.225639,0.726921}, + {0.046321,0.004620}, + {-0.978947,0.165502}, + {0.673976,0.355861}, + {-0.565507,0.154310}, + {0.184185,0.636983}, + {0.669884,0.339459}, + {-0.272178,0.155650}, + {0.946849,-0.018712}, + {1.554380,-0.573908}, + {-1.650752,-0.797470}, + {0.149065,-0.449614}, + {0.000874,0.687892}, + {-0.496167,-0.407806}, + {-0.311445,-0.715590}, + {-0.129442,0.092998}, + {1.038462,1.427624}, + {0.969798,-0.841165}, + {-0.638606,0.246169}, + {-0.007508,-0.280498}, + {0.113839,-0.195910}, + {1.042036,0.726260}, + {-0.200482,0.235256}, + {-0.406369,-0.249998}, + {0.286145,-1.006218}, + {0.210969,0.512718}, + {-0.859586,-0.839554}, + {0.139226,0.146909}, + {0.695305,-0.442922}, + {-0.681479,0.678879}, + {0.573686,0.732063}, + {0.409687,-0.487551}, + {-0.740833,0.407906}, + {-0.627461,-0.094149}, + {0.717096,-0.324215}, + {-1.040547,0.209955}, + {0.390960,0.716126}, + {0.087138,0.229283}, + {-0.453888,-0.488261}, + {-0.309646,-0.346751}, + {-0.129650,0.732543}, + {-0.170771,0.525447}, + {0.514311,0.262524}, + {0.791326,-1.098801}, + {0.026081,-0.432545}, + {0.695147,0.619485}, + {-0.160913,-0.305334}, + {-0.388194,0.428275}, + {-0.857131,0.383539}, + {-0.127692,-0.568071}, + {-0.153925,-1.205867}, + {-0.131234,-0.794515}, + {0.509942,0.661891}, + {-0.411283,-0.325822}, + {-0.557037,0.549357}, + {0.276122,-0.018714}, + {-0.459507,0.586174}, + {0.946074,0.411524}, + {-0.517742,-0.440520}, + {0.518675,-0.707372}, + {0.346846,-0.672055}, + {0.552754,1.465565}, + {-0.084615,0.414643}, + {0.452343,-0.941522}, + {0.346356,0.291833}, + {-0.280410,1.026607}, + {0.938494,-0.769506}, + {-0.559070,-0.210613}, + {-1.005965,1.379425}, + {1.003043,-1.111699}, + {-0.675980,-0.769700}, + {0.000281,1.375752}, + {0.304516,-1.251364}, + {-0.821937,-0.484556}, + {-0.859102,-1.335838}, + {0.058085,-0.346139}, + {0.003970,-0.523620}, + {-0.142542,0.689615}, + {-0.916600,0.902236}, + {0.486899,0.086527}, + {-0.428760,0.270439}, + {0.358628,-0.635933}, + {-0.564581,-0.585300}, + {0.873809,0.369030}, + {-0.178501,0.513622}, + {1.498494,0.604123}, + {-0.119000,0.391230}, + {-0.893021,-0.149327}, + {-1.342297,-1.126706}, + {0.373536,0.861215}, + {0.256534,1.148103}, + {0.899039,-0.560694}, + {0.054489,0.862495}, + {-0.293322,-0.433164}, + {-0.232534,-0.152667}, + {0.571215,-0.491188}, + {0.200082,1.008588}, + {-0.535039,-0.070187}, + {-0.374009,-0.006474}, + {0.968621,-1.673820}, + {-0.250826,-0.592453}, + {-0.768210,-1.143156}, + {0.506240,0.456245}, + {0.517084,-0.666774}, + {0.212136,-0.465469}, + {1.318910,-0.330234}, + {0.021991,0.039870}, + {-0.393252,0.086292}, + {0.707893,-0.244737}, + {0.499235,-0.784132}, + {0.007350,-0.371172}, + {1.522063,0.906834}, + {-0.242588,-1.852291}, + {0.221807,-0.033887}, + {0.323357,0.072972}, + {0.960496,0.074214}, + {0.760485,-0.415787}, + {1.011444,-1.408695}, + {-0.765112,0.167737}, + {0.051886,0.271979}, + {-0.082595,0.361773}, + {0.870305,0.283143}, + {0.225699,0.608936}, + {-1.312811,-0.998105}, + {-0.653488,0.900398}, + {-1.438955,0.084821}, + {-0.412878,-0.723466}, + {-0.272037,0.361482}, + {-0.694861,0.082223}, + {0.850862,1.180117}, + {-0.283139,0.336570}, + {-0.271481,0.069012}, + {-0.029517,-1.101000}, + {0.634905,-0.821237}, + {0.149412,-0.139163}, + {-0.484147,0.270160}, + {-0.761418,0.079378}, + {-0.072847,0.937568}, + {-1.307853,-1.009845}, + {0.297282,0.648821}, + {-0.091781,-1.985271}, + {-0.606219,0.151353}, + {-0.429607,-0.025052}, + {-0.332890,1.175599}, + {-1.118603,0.141680}, + {-0.097394,-0.858219}, + {0.016748,0.173787}, + {0.499711,0.334283}, + {0.294804,-0.100448}, + {-0.226681,1.320937}, + {0.445101,-0.020208}, + {0.298761,0.661325}, + {0.366419,0.625208}, + {-0.610404,-0.402482}, + {-0.196988,-1.143042}, + {-0.140385,-0.419017}, + {0.112807,0.888080}, + {0.266033,0.057014}, + {-0.728926,-0.934920}, + {-0.140320,-0.094250}, + {1.177336,-0.396966}, + {0.420952,0.653529}, + {0.796815,0.416470}, + {0.811086,-0.565463}, + {0.367195,0.333449}, + {-0.400751,1.975824}, + {1.216133,-0.533538}, + {-0.061920,-0.453391}, + {-0.711951,-0.449488}, + {-0.102566,-0.455585}, + {0.285088,-0.802786}, + {0.808552,-0.322926}, + {-0.602289,0.632072}, + {-0.661576,-1.758596}, + {-0.146488,-0.548057}, + {-0.206403,-0.017511}, + {-0.450221,-1.498859}, + {0.932314,-1.134894}, + {0.656476,0.145769}, + {0.235734,0.094820}, + {-0.722074,0.001788}, + {-0.957129,0.829923}, + {-1.219129,-0.094515}, + {0.433577,0.505638}, + {0.667379,-0.080276}, + {-0.481288,-0.154287}, + {0.832150,0.696951}, + {0.845959,0.070575}, + {0.511181,-0.543340}, + {1.404294,0.382848}, + {0.652795,-0.156181}, + {-0.114089,-0.125219}, + {0.105672,-0.192649}, + {1.581463,-0.060738}, + {1.179013,0.318857}, + {-0.514448,-0.186117}, + {-0.004286,0.388816}, + {0.553462,1.141917}, + {-0.108260,-0.709488}, + {0.366715,0.522898}, + {1.011547,0.255626}, + {0.510127,-0.556431}, + {1.387465,-1.491813}, + {-0.030602,0.643039}, + {0.252861,0.370345}, + {0.158032,-0.485250}, + {1.505481,-0.401738}, + {-0.425678,1.475448}, + {0.558642,0.266556}, + {-0.761068,-0.757845}, + {-0.236187,0.096478}, + {-0.299872,-1.335299}, + {-1.133420,0.013509}, + {0.020291,0.311569}, + {0.852593,-0.665722}, + {-0.523899,0.543296}, + {-0.258387,0.397797}, + {-1.620860,0.323925}, + {1.104585,-1.383714}, + {0.683798,0.260786}, + {-1.928301,-0.180178}, + {-1.028854,0.442835}, + {0.657349,-0.494352}, + {-0.277212,0.670959}, + {-0.180849,0.531330}, + {-1.227284,-0.792597}, + {0.563598,-0.076574}, + {-0.437456,0.229217}, + {0.929340,0.015725}, + {0.074666,0.424629}, + {0.534245,-0.350823}, + {0.389638,-0.082153}, + {0.500066,-0.103981}, + {0.517706,0.482821}, + {-0.748255,1.069502}, + {0.473974,-0.018833}, + {0.395953,0.000067}, + {0.154909,0.296848}, + {0.200809,0.287738}, + {-0.607075,-0.544885}, + {-0.267287,0.616905}, + {-0.323802,1.280877}, + {0.255228,0.082953}, + {0.888876,-0.780725}, + {-1.507838,-0.628624}, + {0.117847,0.741004}, + {0.951439,2.158240}, + {0.255605,-0.694650}, + {0.403436,-0.019320}, + {0.028617,-1.122894}, + {-0.559034,-0.279798}, + {-0.151086,1.482814}, + {0.401004,-1.215030}, + {-0.010857,-0.722506}, + {-0.779211,0.186412}, + {0.839532,0.388371}, + {-0.519503,-0.769165}, + {0.886356,-0.068777}, + {-0.666874,0.232912}, + {-0.769333,0.407110}, + {-0.156172,0.626609}, + {-0.845403,0.246838}, + {-0.921500,-1.513649}, + {-0.659432,-0.352143}, + {-0.456287,0.822831}, + {-0.264057,0.594756}, + {-0.381242,0.749825}, + {0.584222,-0.010185}, + {0.717621,0.407810}, + {0.126997,0.610555}, + {0.121083,-0.601804}, + {0.338280,-1.296916}, + {-0.998988,0.202698}, + {0.271413,0.241189}, + {-0.660860,-0.922695}, + {0.217074,0.091244}, + {-0.829182,-0.173802}, + {-1.686936,0.133783}, + {0.085111,-1.036699}, + {-0.835207,-0.547288}, + {-1.001460,0.163306}, + {-0.009840,-0.897352}, + {-0.221570,0.248621}, + {-0.104666,-0.544456}, + {0.492826,1.224533}, + {-0.303816,0.203433}, + {-0.035890,-0.396120}, + {-0.911609,0.154966}, + {-0.477369,-0.149520}, + {0.829666,0.383750}, + {0.288714,-0.400195}, + {0.825822,1.060236}, + {-0.565369,0.570078}, + {0.725772,0.524669}, + {-1.427359,0.510741}, + {0.185095,0.075540}, + {0.123475,-0.291902}, + {0.273887,-0.125613}, + {-0.173428,1.043319}, + {0.321986,0.197724}, + {-0.846527,-0.708152}, + {0.008510,-0.342922}, + {0.627415,-0.580544}, + {0.845050,1.241589}, + {0.585281,0.461177}, + {0.359324,-0.420843}, + {0.049152,1.106094}, + {0.581734,-0.166265}, + {0.003368,1.019929}, + {1.025792,-0.545836}, + {-0.566680,0.838736}, + {0.217046,-0.554830}, + {0.746989,0.330831}, + {-0.477775,-1.838477}, + {1.209384,0.537204}, + {0.084745,-0.402040}, + {0.453664,0.663259}, + {-0.949609,0.481791}, + {-1.018870,0.244091}, + {-0.100135,-0.408291}, + {0.145723,-0.390015}, + {0.591639,-0.187299}, + {-0.072565,0.022234}, + {-0.090558,0.900594}, + {-0.115991,-1.076001}, + {-0.047715,0.945083}, + {-0.153139,1.232195}, + {0.395757,-0.137489}, + {0.500312,-0.165208}, + {-0.446434,-1.255448}, + {0.744826,0.719971}, + {0.101905,0.317928}, + {-1.113815,1.181345}, + {-0.826383,-0.342046}, + {0.698280,-0.256223}, + {-0.376007,0.253217}, + {-0.351381,-0.465508}, + {0.347951,0.252016}, + {1.060703,-0.456476}, + {-0.487386,1.010946}, + {0.082913,1.363434}, + {0.144076,0.505970}, + {0.788440,0.349740}, + {0.359451,0.412744}, + {-0.133783,0.371278}, + {0.132375,0.736016}, + {0.675589,-0.281074}, + {1.388233,0.041104}, + {-0.111974,-0.788585}, + {-0.719106,0.429423}, + {0.285667,0.906691}, + {-0.412522,-0.263860}, + {-0.379611,-1.850579}, + {-0.882381,0.633164}, + {-0.350683,0.326832}, + {0.113319,0.299109}, + {0.030724,-0.533961}, + {-0.229546,1.599082}, + {0.791774,0.219618}, + {-0.083769,-0.825250}, + {-0.250508,0.384164}, + {1.622536,0.627566}, + {0.269926,1.457477}, + {0.027500,0.077387}, + {-0.040952,-0.869704}, + {0.249097,0.799744}, + {-0.855749,-1.207818}, + {0.031174,0.232988}, + {0.470634,-0.176486}, + {-1.322606,-0.574727}, + {0.618473,-1.051757}, + {0.044093,-1.194452}, + {-0.856825,-0.363124}, + {-0.740040,0.491909}, + {1.049228,-0.383126}, + {0.269759,-0.756658}, + {0.411827,-0.187708}, + {-0.021801,-0.730890}, + {-0.338874,-0.436049}, + {0.439729,-0.211741}, + {-0.464913,0.405662}, + {0.813909,1.691059}, + {-0.432949,-0.328759}, + {0.016182,0.617470}, + {-0.000084,-0.630506}, + {1.013115,0.113926}, + {1.045430,-0.431612}, + {-0.149045,-0.540305}, + {-0.168907,1.023595}, + {-0.681722,-0.870885}, + {0.148709,-0.519793}, + {0.083637,-0.233137}, + {-0.006738,-0.358652}, + {-1.132096,-0.196676}, + {0.755618,-0.630740}, + {1.172062,0.331256}, + {-0.074557,-1.505289}, + {1.261753,-0.254490}, + {0.432557,-0.043824}, + {0.233409,-0.174214}, + {0.046213,0.259837}, + {-0.956389,0.034619}, + {0.336500,0.085573}, + {1.029807,-1.168944}, + {0.148733,-0.666186}, + {0.504364,0.591615}, + {-0.244863,-0.431764}, + {-1.287166,-0.010764}, + {0.206851,-1.199483}, + {-1.130227,-0.926562}, + {0.045319,-0.640907}, + {1.744857,0.365060}, + {-0.337659,0.254251}, + {-1.241628,0.474563}, + {-0.098000,0.043348}, + {0.135789,0.720002}, + {0.079954,-0.567468}, + {0.209679,0.580221}, + {0.129076,-0.638995}, + {-0.259201,0.098160}, + {0.684000,0.742712}, + {-1.058322,1.121174}, + {-1.133869,-0.077823}, + {-0.786057,-0.192047}, + {0.043596,-0.730099}, + {-0.468971,-0.508530}, + {-0.166478,0.964301}, + {-0.421994,0.534392}, + {0.801013,0.327796}, + {0.626465,-0.857809}, + {-0.316640,0.963254}, + {-0.686444,-0.349580}, + {-0.411887,0.006307}, + {-0.044218,-0.684096}, + {1.448337,-0.256645}, + {0.224336,-0.436483}, + {0.025337,-0.347815}, + {-0.407366,0.419951}, + {-0.132820,0.348857}, + {0.371735,-0.864264}, + {0.086483,-0.338426}, + {0.585107,0.270821}, + {0.326869,0.548646}, + {-0.326146,-0.463299}, + {1.143470,-0.087656}, + {-0.098858,1.246934}, + {-0.036904,0.191940}, + {0.287535,-0.291944}, + {0.369159,0.063018}, + {-1.317075,-0.193187}, + {0.378189,0.176271}, + {0.856049,-0.716794}, + {0.077633,0.519224}, + {-0.699016,-0.029019}, + {0.295033,0.961106}, + {0.197367,0.762655}, + {0.114262,-0.106428}, + {0.589365,-0.677044}, + {-0.241511,0.228210}, + {-0.430454,-0.895877}, + {0.702252,0.370365}, + {1.742418,-0.318825}, + {0.735371,-0.917391}, + {0.798335,-0.370615}, + {-0.537492,0.369018}, + {1.236422,0.065891}, + {-0.266399,-0.351783}, + {0.423548,0.165331}, + {0.077228,0.536433}, + {-0.174825,0.148350}, + {0.199017,-0.554067}, + {-0.965766,-0.545608}, + {0.554513,0.053499}, + {0.037865,0.091226}, + {0.586746,0.403764}, + {1.063461,-0.711465}, + {0.627927,0.180048}, + {1.849318,0.366474}, + {-0.787943,-0.066363}, + {-0.225401,0.838693}, + {0.780419,1.099950}, + {-0.583530,-0.334410}, + {0.435296,-0.110910}, + {-0.395316,0.522476}, + {-0.296867,1.030867}, + {0.180194,0.365723}, + {-0.565612,0.105022}, + {-0.071050,-0.637618}, + {1.036443,1.254893}, + {-0.357016,0.150407}, + {-0.105283,0.193076}, + {0.137034,0.727374}, + {0.395267,-0.224436}, + {-0.148716,0.241524}, + {-0.185222,0.387931}, + {1.193605,-0.847551}, + {0.250426,-0.707717}, + {0.140128,-0.294992}, + {0.023456,0.023879}, + {0.557191,-1.088329}, + {-0.705496,-0.351205}, + {0.706976,1.287748}, + {0.207298,-0.734820}, + {0.124706,0.189566}, + {0.797376,1.215020}, + {-0.329404,-0.576281}, + {0.648951,0.195529}, + {-0.597548,0.519029}, + {0.212921,0.436097}, + {-0.330959,0.311842}, + {-2.163917,-0.881882}, + {-1.070369,0.664018}, + {0.473269,-0.101973}, + {0.378465,-0.822488}, + {1.361181,0.418143}, + {-1.012859,-0.712103}, + {0.870152,-1.346827}, + {0.653007,-0.617410}, + {0.497337,-0.775725}, + {-0.260237,0.259267}, + {-0.743430,-0.591395}, + {-0.674841,-0.191339}, + {-0.584851,-0.214106}, + {0.225244,0.160024}, + {1.161423,0.256300}, + {-1.640086,-0.242275}, + {-0.180871,-0.679693}, + {-1.243241,-0.228350}, + {0.599251,0.947940}, + {1.146590,-0.156590}, + {-0.647330,0.051065}, + {1.949584,-0.583944}, + {-0.242692,1.238130}, + {0.039443,0.740763}, + {-1.458523,0.089037}, + {-0.153975,-0.381741}, + {-0.317357,-0.610750}, + {0.237125,1.346517}, + {-0.201768,0.320696}, + {0.606654,1.023548}, + {0.810015,0.801355}, + {-0.870015,0.018496}, + {0.005406,0.866319}, + {-0.020676,-0.167982}, + {-0.341657,0.564725}, + {-0.720214,-0.704252}, + {0.656031,-0.457047}, + {0.070486,0.044186}, + {-0.170715,-0.739585}, + {0.184302,-1.788002}, + {0.715592,-0.376628}, + {-0.363081,-0.119088}, + {-0.100914,0.119614}, + {0.005834,-0.268860}, + {-0.129771,0.331506}, + {0.143287,-0.198036}, + {-0.304611,0.217426}, + {-0.594381,-0.825000}, + {-0.365556,-0.258829}, + {-0.214172,1.162243}, + {-1.194364,0.810341}, + {-0.325733,-0.570507}, + {-0.614001,-0.663556}, + {0.118437,-0.291858}, + {0.502611,-0.601088}, + {0.659081,-0.217369}, + {-0.446278,-0.786148}, + {0.022241,0.272441}, + {0.590431,0.909812}, + {-0.505353,0.055519}, + {-1.032100,-0.102485}, + {0.514653,0.094284}, + {0.017452,-0.117900}, + {-0.434090,-0.360114}, + {-0.795938,0.951701}, + {1.526127,-0.592844}, + {-0.389825,-0.453072}, + {0.384166,-1.012017}, + {1.182901,-0.350927}, + {-0.650756,-0.215167}, + {-0.920064,0.382095}, + {0.325262,0.053581}, + {-0.367365,-0.250609}, + {-0.792805,-0.159176}, + {0.364886,1.149926}, + {-0.952999,-0.523706}, + {-0.590878,-0.928414}, + {1.302134,0.020920}, + {0.271231,1.409444}, + {-0.421610,0.925520}, + {1.193167,0.706521}, + {-0.333416,0.336865}, + {0.018979,0.278195}, + {0.454613,0.518481}, + {-0.039562,-0.760878}, + {0.452849,0.034856}, + {-0.363828,-0.532211}, + {-0.120648,0.354305}, + {0.124415,0.897220}, + {0.079466,-0.085179}, + {0.550458,0.796151}, + {0.118218,0.662074}, + {-0.355235,-0.199056}, + {0.436312,0.191719}, + {1.566220,-0.116118}, + {-0.836157,-0.768313}, + {1.586808,0.178922}, + {-0.280443,-0.468900}, + {-0.326042,0.010218}, + {0.566632,1.593287}, + {1.012295,-1.739928}, + {-0.076488,0.044391}, + {0.483599,-0.125041}, + {-1.492059,0.640508}, + {-0.678092,-0.179653}, + {-0.373386,-0.340247}, + {-0.832028,0.600061}, + {-0.567324,-1.027965}, + {-0.083357,0.199339}, + {-0.734433,0.929912}, + {0.570454,0.573202}, + {-0.365270,0.716633}, + {-0.417190,-0.754130}, + {-0.854980,-0.194668}, + {-0.798654,-0.640999}, + {-0.386871,0.854369}, + {-0.317394,-0.378946}, + {0.845760,-0.762026}, + {-0.238503,0.628650}, + {-0.476581,-1.193935}, + {0.372842,0.363358}, + {1.929276,0.425483}, + {0.560945,-0.892123}, + {0.832559,1.026749}, + {0.332159,-0.899940}, + {0.729769,-0.406694}, + {1.773252,-1.453081}, + {0.014471,0.518545}, + {-0.032728,-0.153441}, + {-0.418525,-0.263385}, + {1.483183,1.053228}, + {-1.108048,-0.126405}, + {-0.882071,0.557002}, + {-0.299469,0.621888}, + {-1.390889,0.791123}, + {0.087246,-0.444939}, + {-0.971593,0.855966}, + {0.288585,-1.387271}, + {-0.019311,0.732536}, + {0.575029,-0.900371}, + {-0.849454,-0.021176}, + {0.102055,0.741000}, + {0.639938,0.250506}, + {0.031515,-1.559311}, + {0.184749,0.007297}, + {-0.615292,0.150555}, + {-1.045878,0.504486}, + {0.648174,0.248709}, + {-1.923251,-0.525706}, + {-0.139883,-0.496519}, + {-0.273595,0.733709}, + {-0.554049,-0.638829}, + {-0.388154,-0.721417}, + {0.302342,-0.922345}, + {0.301997,0.247964}, + {0.783229,-0.118560}, + {0.015568,-1.688273}, + {-0.203951,-0.271846}, + {-0.464304,-0.803130}, + {0.788053,0.525790}, + {-0.310437,0.810294}, + {0.734484,-0.122955}, + {0.078820,-0.755273}, + {0.689406,0.380790}, + {-0.879125,-0.800241}, + {0.916797,-0.158671}, + {-0.955580,0.370290}, + {1.053886,0.183747}, + {-1.024297,0.502801}, + {0.821289,-0.323075}, + {-0.197416,-0.199129}, + {0.128673,-0.204273}, + {-0.047906,0.532305}, + {-0.332497,-0.459762}, + {-0.921215,0.010891}, + {-1.187693,0.237371}, + {-0.907113,-1.114225}, + {-0.391416,0.334680}, + {0.484839,-0.022006}, + {0.279699,-0.155898}, + {0.232580,0.635441}, + {0.442647,-0.512038}, + {0.457949,-0.744347}, + {-0.420994,-0.605339}, + {0.607157,1.329146}, + {-0.274663,0.330222}, + {-0.146928,0.998094}, + {0.634872,-0.085303}, + {0.038862,0.137135}, + {0.874375,0.481656}, + {-0.078049,0.930253}, + {0.211922,0.365963}, + {-0.057426,-1.256802}, + {-0.249915,0.102113}, + {0.074635,0.926036}, + {-0.919523,0.156604}, + {0.321808,-0.463000}, + {-0.336447,0.591209}, + {0.069922,0.186182}, + {-0.098125,0.286970}, + {-0.945924,0.199885}, + {1.251790,-0.588337}, + {-0.103392,-0.063531}, + {-1.495706,0.300232}, + {0.161476,-0.532461}, + {-0.229976,0.007762}, + {0.102294,0.640865}, + {-0.046165,-0.345694}, + {0.152871,-0.139371}, + {-0.621642,0.466272}, + {0.502189,-0.429932}, + {0.381534,0.850587}, + {1.047882,0.364581}, + {0.166650,-0.533360}, + {-0.147243,0.870267}, + {0.264328,-0.088269}, + {0.241229,0.219450}, + {-0.674579,0.991554}, + {-0.952101,0.726952}, + {0.000481,-0.050198}, + {-0.237754,0.641076}, + {-0.058228,-0.524298}, + {1.097294,-0.979438}, + {-1.219292,-0.095890}, + {0.265504,-0.684968}, + {-0.779660,0.555899}, + {0.571050,-0.072841}, + {0.669225,1.701574}, + {-1.191487,0.111178}, + {0.909199,0.891876}, + {-0.395837,-0.258702}, + {0.093876,-0.469630}, + {-0.423132,0.835933}, + {-0.273781,-0.809838}, + {0.379980,0.848947}, + {1.264064,-0.035597}, + {-0.801897,0.295423}, + {0.817880,-0.017036}, + {-0.105681,0.855247}, + {0.486284,-0.619853}, + {-0.032531,0.489774}, + {0.211010,0.529908}, + {0.661884,2.635604}, + {0.539633,1.054015}, + {-0.523203,0.144841}, + {0.642130,-0.062279}, + {0.773169,-0.295494}, + {1.236025,0.138371}, + {-0.902266,-0.091117}, + {0.126149,1.096640}, + {-0.361577,0.548790}, + {0.082879,-0.449861}, + {-0.084813,1.095634}, + {1.546048,1.536377}, + {0.856924,0.635732}, + {0.834506,0.824424}, + {-0.021495,-0.526435}, + {-0.838356,0.515902}, + {-0.473372,-0.161548}, + {-0.778314,1.424876}, + {-0.230595,-0.748969}, + {-1.592887,-0.737746}, + {-0.938554,-0.530306}, + {-1.572545,-0.791394}, + {0.435546,-0.376083}, + {0.525145,0.213393}, + {0.367887,-1.044275}, + {-0.719915,0.061255}, + {0.304958,-0.204748}, + {1.210495,-0.112141}, + {-0.086723,0.129535}, + {-1.281467,0.522155}, + {-0.333647,-0.274983}, + {-0.554049,0.413201}, + {0.753145,0.891878}, + {0.274075,-0.707382}, + {-0.062669,0.788726}, + {0.466273,-0.501215}, + {0.024895,0.354051}, + {0.798756,0.455852}, + {-0.020206,-0.029112}, + {0.339560,1.851831}, + {0.152438,0.738243}, + {0.183936,-0.781268}, + {-0.103182,0.713654}, + {0.875376,-0.483562}, + {0.015320,-0.460793}, + {0.060661,-0.643523}, + {-2.264353,0.105116}, + {-0.789343,0.615718}, + {-0.243310,0.060137}, + {1.699891,-0.863147}, + {-0.512188,-0.107884}, + {0.715462,-0.746962}, + {-0.168059,0.396399}, + {-1.855221,0.474742}, + {1.117193,-0.177673}, + {0.605124,0.264148}, + {-0.158801,-0.269563}, + {-0.026259,1.643594}, + {-0.612630,-0.403823}, + {-2.104756,1.120870}, + {0.439319,-0.326207}, + {-0.729839,-0.030055}, + {-0.197924,-0.161142}, + {0.859821,0.172257}, + {-0.082605,1.518575}, + {-1.076389,-1.744869}, + {-0.219282,1.053450}, + {-0.545467,0.263106}, + {0.717580,-0.589610}, + {-0.704720,-0.962831}, + {0.404192,0.274100}, + {-0.559766,-0.674194}, + {-0.846818,1.766523}, + {0.413603,0.183993}, + {0.258588,0.447021}, + {0.711449,-0.254685}, + {-0.039759,0.029436}, + {-0.128433,-0.269298}, + {-1.025894,1.345869}, + {-0.912975,0.052240}, + {0.755264,-0.206240}, + {0.044141,0.949915}, + {-1.565117,-0.595266}, + {0.200074,-1.417585}, + {-0.158238,-0.081043}, + {-0.503170,-0.078182}, + {0.362525,-0.194696}, + {0.259960,-0.907605}, + {-0.105310,-1.933984}, + {-0.899535,-0.440019}, + {0.163533,0.065331}, + {-0.571787,-1.130394}, + {0.301250,-0.094735}, + {0.104414,-1.423818}, + {-0.146865,-0.198913}, + {-0.497490,0.758248}, + {0.466122,-0.416899}, + {-0.940500,0.639487}, + {-0.440392,0.809788}, + {-2.223726,0.948796}, + {-0.313709,1.585454}, + {0.206535,-0.868710}, + {0.910526,-1.174225}, + {-0.495236,0.167135}, + {-0.575404,0.007086}, + {-0.255414,0.937178}, + {-0.296419,-0.082039}, + {1.002712,1.059056}, + {-1.200725,1.009362}, + {-1.031906,1.427611}, + {0.064588,-0.744817}, + {1.290310,0.659770}, + {0.251141,-0.190253}, + {-0.586866,-0.099783}, + {1.514305,0.076462}, + {-0.292877,-0.034932}, + {0.086519,-1.537324}, + {0.558554,-1.027847}, + {0.016688,-0.294418}, + {-0.464068,0.572870}, + {-1.031390,0.702926}, + {-0.993327,0.280797}, + {0.407376,1.270542}, + {-0.291421,-0.688110}, + {0.842434,1.685884}, + {-0.464356,-1.287623}, + {0.680357,-0.473646}, + {0.694717,0.571415}, + {0.391202,-0.560555}, + {-0.169632,-0.035731}, + {-0.203948,0.790613}, + {-0.670035,-0.264796}, + {-0.090461,0.101945}, + {-0.311617,0.481222}, + {-0.344817,0.135445}, + {-1.162870,0.142668}, + {-0.487890,-0.544005}, + {0.732853,0.690509}, + {0.585005,-1.244755}, + {0.503757,-0.316446}, + {0.869989,-0.370224}, + {0.351113,-0.041060}, + {0.021720,-0.728370}, + {-0.706755,-0.494790}, + {-0.103364,-1.238782}, + {-0.355559,-0.533147}, + {0.166720,-0.864956}, + {0.334983,0.100261}, + {-0.848547,0.637065}, + {-0.317559,0.657728}, + {0.409242,0.262048}, + {0.596688,0.826314}, + {-0.458137,0.110997}, + {-0.682732,-0.219886}, + {-0.408569,0.043952}, + {-0.320255,-1.596813}, + {0.387040,-0.699110}, + {0.198430,-0.538138}, + {0.856802,-0.708255}, + {0.756612,-0.653997}, + {-0.356619,-0.562844}, + {0.271806,1.194806}, + {-0.175223,-1.368711}, + {-0.153117,-0.398840}, + {0.706898,-0.328442}, + {0.034251,-0.107789}, + {0.277096,0.757656}, + {-0.144774,0.378035}, + {-1.538711,0.603603}, + {0.206118,0.430155}, + {0.622510,0.173831}, + {0.046042,0.058330}, + {-0.577057,0.162875}, + {0.685647,-0.647830}, + {-0.910460,0.504792}, + {-0.200849,-0.954877}, + {0.475974,-0.438454}, + {0.340606,0.030790}, + {-0.278135,0.194854}, + {0.707024,-0.623755}, + {-0.091069,-2.189701}, + {-0.273684,-0.897539}, + {0.050275,0.334330}, + {-1.301614,-0.241288}, + {0.376532,1.392280}, + {0.848500,0.658936}, + {-0.354567,-0.729838}, + {0.779270,-0.651632}, + {-1.525730,0.876681}, + {0.587723,-1.383307}, + {-0.741497,0.254969}, + {0.873264,0.197479}, + {-0.480964,1.299430}, + {-0.431708,0.130537}, + {0.323680,-0.448970}, + {-0.803705,-0.383630}, + {0.259853,-0.171842}, + {-0.074427,-1.423999}, + {0.213413,-0.806918}, + {0.319758,-0.629784}, + {0.197369,-0.175039}, + {0.374164,-2.020326}, + {0.234205,0.212423}, + {0.442106,-0.486910}, + {-0.970864,0.312143}, + {0.994610,0.634741}, + {0.048931,0.205781}, + {0.369340,-0.247351}, + {-0.458195,0.094655}, + {-0.853393,0.397950}, + {-0.222113,-0.020140}, + {0.855104,1.002182}, + {-0.949021,0.731330}, + {-0.073219,1.402526}, + {-0.151223,-0.492186}, + {-1.375457,-0.136411}, + {-0.466811,0.022190}, + {1.087376,0.106868}, + {-0.744528,-0.413374}, + {-0.342038,0.049102}, + {-1.494273,-0.271438}, + {-0.125528,0.601419}, + {-0.111221,-0.380202}, + {0.641612,0.273790}, + {-0.883504,0.517323}, + {-0.843544,0.433726}, + {0.070544,0.613134}, + {-1.407600,-0.044330}, + {-0.492451,0.995879}, + {0.983269,0.143963}, + {0.221852,0.495000}, + {-0.791657,0.614310}, + {0.703727,-0.571992}, + {-0.071284,0.875682}, + {1.641568,-0.631850}, + {-0.083871,0.250629}, + {-0.229893,-1.203232}, + {-0.382616,1.669525}, + {0.486753,-1.096469}, + {-0.599193,-0.121324}, + {1.105338,0.376484}, + {-0.433136,-0.568643}, + {1.262118,0.303337}, + {-0.180750,-0.251747}, + {0.232196,0.634354}, + {0.526905,0.692507}, + {-0.416640,-0.134469}, + {-0.945404,0.290901}, + {1.452757,0.222601}, + {-0.057791,-0.455470}, + {-0.853629,-0.583719}, + {-0.233342,0.161093}, + {-0.968813,0.500752}, + {-0.861537,0.075586}, + {1.474493,-0.284338}, + {-0.754792,0.807480}, + {-0.643724,1.545286}, + {-0.922333,-0.131210}, + {-1.068958,-0.426784}, + {-1.011546,0.020778}, + {0.787292,0.193200}, + {1.276891,0.812940}, + {-0.001378,1.525040}, + {-0.482745,0.059566}, + {0.640762,-0.003003}, + {-0.842820,-0.681972}, + {-1.136885,1.104554}, + {0.707249,0.574867}, + {0.404579,0.578500}, + {0.772682,0.950729}, + {-0.758872,-0.442283}, + {-0.134508,0.287088}, + {-1.217763,-0.136208}, + {0.067001,0.006883}, + {-1.117236,-0.517592}, + {1.074093,-1.371225}, + {0.434892,-0.753326}, + {-1.657469,-0.184451}, + {-0.563524,0.887134}, + {0.594674,-0.128692}, + {-0.861165,0.393858}, + {0.740365,-0.155010}, + {-0.542431,-0.137020}, + {-0.160958,0.367545}, + {1.061826,-0.276971}, + {-0.771112,0.145356}, + {1.963119,0.088410}, + {0.024542,0.144405}, + {-1.161727,0.028527}, + {-0.629890,-1.011632}, + {-0.523735,0.451983}, + {0.226956,-0.663835}, + {-0.709942,0.411619}, + {-0.862071,-0.723057}, + {-0.430194,0.705340}, + {0.489380,-0.913195}, + {-0.913531,-0.125404}, + {0.580276,-0.084090}, + {-0.795566,0.423792}, + {0.195894,-0.952419}, + {0.206701,0.058895}, + {0.343643,0.988757}, + {0.111858,1.155224}, + {-0.402678,0.396630}, + {-0.085481,1.087237}, + {-0.626447,0.384020}, + {-1.545255,1.402500}, + {-0.382681,1.101254}, + {-0.570465,-0.881833}, + {-0.067170,0.447168}, + {-0.402078,-0.107883}, + {-0.063022,1.237664}, + {0.357641,-0.210884}, + {0.173106,1.169455}, + {0.371232,-0.555801}, + {0.426061,1.683925}, + {-0.862561,0.481593}, + {-1.295345,0.677131}, + {0.882575,-0.080920}, + {1.076227,0.081224}, + {0.217811,0.806447}, + {0.642645,-0.244275}, + {-0.137093,-0.322132}, + {0.246084,-0.089603}, + {0.827582,-0.845716}, + {0.373640,-0.242160}, + {-1.221390,0.390996}, + {-0.147700,0.855458}, + {-0.301463,-0.077718}, + {-0.477683,-1.468176}, + {-0.708449,0.284200}, + {0.341767,1.177536}, + {0.073596,-0.373099}, + {-0.418003,0.011618}, + {0.659790,0.501637}, + {0.517335,-0.383893}, + {-0.504534,0.584654}, + {-0.700111,-0.051171}, + {0.235161,-1.457844}, + {0.447664,-0.556099}, + {0.669581,1.662563}, + {0.635083,-0.024530}, + {-0.426292,-0.598758}, + {0.380072,-1.112453}, + {-0.081336,0.145480}, + {-0.907122,0.871629}, + {0.131628,1.573776}, + {-0.384249,0.507013}, + {-0.799491,0.657805}, + {-0.243014,0.812674}, + {-0.280861,-1.138266}, + {0.252573,-0.763178}, + {-0.829438,0.152104}, + {0.238524,-0.277766}, + {2.523618,-0.842357}, + {-0.699246,-0.801106}, + {1.166441,0.831885}, + {0.413058,0.094339}, + {-0.446019,0.307323}, + {-0.725646,-0.489846}, + {-0.253605,-1.246224}, + {0.912358,-0.556724}, + {1.278255,0.012615}, + {-0.078776,-1.194235}, + {-0.366774,-2.136559}, + {0.776158,0.034121}, + {0.124952,0.735158}, + {0.495498,-0.287894}, + {0.645361,0.435278}, + {-0.027172,-0.196745}, + {-0.091825,0.181205}, + {-0.449690,0.202206}, + {0.615196,-0.763464}, + {0.006443,-0.808811}, + {-0.778937,-0.464757}, + {-0.661201,-0.076723}, + {0.142220,0.639184}, + {0.043606,0.256401}, + {1.185320,0.179074}, + {0.964460,1.638016}, + {-0.439314,-1.027129}, + {-0.974713,-0.701040}, + {0.626450,1.670174}, + {0.849683,0.000633}, + {-0.758821,0.643905}, + {0.533524,-0.276729}, + {-0.287200,0.229033}, + {0.976720,0.691516}, + {0.413251,-0.414654}, + {-0.105930,0.582164}, + {1.083972,0.127931}, + {-0.008602,0.396564}, + {-1.014633,-0.766216}, + {-0.567769,-0.603326}, + {-0.671345,-0.870915}, + {-0.436383,0.159432}, + {0.789563,-1.405331}, + {-0.012052,0.291490}, + {-1.064900,0.499255}, + {1.857613,0.173601}, + {-0.166943,-0.593651}, + {0.813628,0.624637}, + {-0.792895,-0.334087}, + {-0.371264,-1.463375}, + {0.232055,1.514775}, + {-0.480078,-0.932215}, + {0.493973,0.190971}, + {0.477380,0.232577}, + {0.240390,-0.359935}, + {0.082890,-0.564972}, + {0.142401,0.071885}, + {0.415193,-0.076906}, + {1.294283,0.031845}, + {0.184350,0.522837}, + {-0.985097,0.515890}, + {-0.321414,0.266318}, + {-0.040275,-1.090636}, + {1.454251,-0.464461}, + {-1.341400,-0.556900}, + {1.112672,-1.294695}, + {0.684248,-0.569627}, + {0.110519,1.620119}, + {-0.074092,-1.501786}, + {0.836840,0.582174}, + {-0.312866,-0.163083}, + {-0.348387,0.846036}, + {-0.401781,-0.683929}, + {-0.477886,0.419644}, + {0.380085,1.371967}, + {-0.151815,-1.437845}, + {0.362655,1.699131}, + {-0.285574,-0.328342}, + {-0.373046,0.552420}, + {0.524496,-0.274919}, + {0.162426,-0.591347}, + {0.247988,-1.248758}, + {0.179873,-0.495477}, + {0.332481,0.187029}, + {-0.680053,-0.795562}, + {-0.297790,-1.228507}, + {0.433604,0.362610}, + {-0.912981,-0.317793}, + {0.356607,-0.401878}, + {-0.457215,1.277897}, + {0.423863,-0.907331}, + {1.369555,0.294154}, + {-0.558227,-0.787342}, + {-0.700928,-0.002200}, + {0.475999,0.053324}, + {0.759515,-0.511097}, + {-0.214352,-1.108068}, + {-0.823262,0.181915}, + {-1.481847,-0.145536}, + {-0.838811,-0.827068}, + {-0.354237,-0.929419}, + {-0.003615,0.497626}, + {1.165999,0.676843}, + {0.626492,0.510292}, + {0.158529,0.168647}, + {1.189623,0.008902}, + {0.281004,-1.174505}, + {0.610236,-0.754183}, + {-0.669239,0.615970}, + {0.300373,-0.608739}, + {1.205115,-0.072012}, + {0.272992,-0.140035}, + {-0.478646,-0.534863}, + {-1.353538,0.265825}, + {-0.199615,-1.529628}, + {-0.219052,1.418831}, + {-0.138797,0.344504}, + {0.170086,-0.026321}, + {-0.196733,0.535114}, + {-1.033414,-0.221792}, + {0.028438,0.044914}, + {-0.884678,0.622154}, + {0.822835,-2.043658}, + {0.344915,-1.053158}, + {-0.644134,-0.574558}, + {-1.332407,0.519250}, + {0.036381,0.475286}, + {-0.303382,0.982412}, + {-0.353411,0.250417}, + {0.139548,-0.642938}, + {1.414632,-0.370112}, + {0.532912,-0.264381}, + {0.342811,0.344477}, + {0.501145,-0.288626}, + {0.311541,0.560236}, + {-0.413902,-0.733376}, + {0.591928,-0.533218}, + {-0.311692,-0.614243}, + {0.357470,-1.610867}, + {-0.400828,-0.474021}, + {0.291392,1.248851}, + {0.016993,-0.633725}, + {-0.525249,0.450546}, + {0.801819,1.070688}, + {-1.296271,-0.616623}, + {-0.393605,-0.448016}, + {-0.165781,0.199731}, + {-0.066457,0.457058}, + {0.245912,0.367495}, + {-0.614678,0.338112}, + {0.424687,-0.042103}, + {-0.016281,0.164701}, + {-0.388587,-0.005404}, + {-0.616791,0.044666}, + {0.164994,-0.591148}, + {1.130053,0.244749}, + {-0.764096,-0.677907}, + {0.001894,0.070851}, + {0.970162,-0.004036}, + {0.294438,-0.848449}, + {-0.085147,-1.038641}, + {0.146574,-1.020098}, + {0.731212,1.172352}, + {-0.966413,0.010182}, + {0.022011,0.098571}, + {-0.062500,0.809517}, + {0.613554,0.896113}, + {-1.702897,-0.428981}, + {-0.295817,-0.095047}, + {0.363999,1.299666}, + {-0.185637,0.710197}, + {0.667850,-0.579586}, + {-0.091486,-1.745092}, + {0.278540,-0.322231}, + {-1.393286,0.017571}, + {-0.909896,-0.550217}, + {-0.227978,-0.287231}, + {-0.041531,-0.572542}, + {0.598923,-1.109982}, + {0.528515,0.294793}, + {1.420346,-0.167967}, + {0.339044,-0.296742}, + {-0.427926,-0.195084}, + {2.320888,-0.602119}, + {0.316394,-0.195310}, + {0.392226,-0.018758}, + {-0.347128,-0.012198}, + {0.885682,0.291685}, + {0.694113,-0.213884}, + {1.098109,0.434729}, + {0.126689,0.353735}, + {-0.540018,-0.289525}, + {-0.878448,1.391600}, + {-0.019977,0.206745}, + {0.873189,-0.483586}, + {0.121439,-0.209070}, + {0.648235,-0.185503}, + {-0.009043,-0.764272}, + {0.372579,0.872373}, + {0.472101,-0.192603}, + {-0.407035,-0.893065}, + {-1.367142,-0.975043}, + {0.746200,-0.328607}, + {0.388173,-1.625638}, + {0.884013,-0.528696}, + {0.705324,0.779519}, + {0.408395,-0.377831}, + {1.083901,0.395567}, + {0.781733,-0.146787}, + {-0.068884,-0.865584}, + {0.156537,0.742738}, + {0.113212,0.987732}, + {1.521997,0.329659}, + {-0.192594,-0.352522}, + {-0.976653,0.187491}, + {0.817131,0.071363}, + {0.699118,0.409109}, + {-0.297057,-0.940273}, + {-0.936432,-1.106289}, + {0.626260,-0.241420}, + {-0.260488,0.166791}, + {0.701135,-1.061037}, + {-0.554144,-1.046121}, + {0.513165,0.663304}, + {-0.011168,0.147376}, + {0.037910,1.201414}, + {0.140816,1.384849}, + {-0.242984,-1.207828}, + {-0.107482,0.575915}, + {0.451083,0.174602}, + {0.269525,-0.536069}, + {0.211411,-0.104573}, + {-0.204415,-0.512769}, + {0.628925,-0.352539}, + {1.033395,0.036681}, + {-0.675614,-0.143876}, + {-0.621722,-0.934906}, + {0.211877,-0.248810}, + {-0.352170,0.551980}, + {-1.116948,0.321283}, + {-0.826697,1.581404}, + {-0.195648,0.310111}, + {-0.938570,-0.616930}, + {-0.451007,0.525622}, + {-0.120274,0.851907}, + {0.045607,-0.373985}, + {-0.214821,0.266194}, + {0.171364,-0.008571}, + {0.301965,-0.705054}, + {-1.165181,-0.235733}, + {-0.650434,-0.274030}, + {0.122090,0.561616}, + {0.435428,-0.782393}, + {-0.004740,-0.125884}, + {-0.321219,-0.415579}, + {-1.199688,0.284728}, + {-0.533240,0.015463}, + {0.304348,-0.073971}, + {-0.733804,-0.444715}, + {-0.725423,0.204256}, + {0.604231,-0.689961}, + {-0.756920,-0.218757}, + {0.956018,0.954204}, + {0.169414,-0.152566}, + {0.481613,-0.565409}, + {0.371303,0.288803}, + {-0.794294,-1.147211}, + {-1.706341,0.716376}, + {-0.627696,0.291968}, + {-0.121333,-1.001299}, + {0.550558,-0.282856}, + {-0.349733,-0.561486}, + {0.578835,0.339123}, + {0.420234,-0.741495}, + {0.144577,0.277881}, + {0.031130,-0.728796}, + {-0.564058,1.498556}, + {1.015670,0.422366}, + {-0.063266,0.346276}, + {0.551090,-1.963699}, + {0.934465,-0.385555}, + {0.422983,1.159449}, + {0.101278,-1.667219}, + {-0.308766,0.332842}, + {0.150898,-0.097385}, + {-0.862758,-1.060237}, + {-0.687885,-1.141096}, + {-0.862829,-0.505841}, + {0.558943,-0.778417}, + {0.549535,-0.363780}, + {0.072778,0.637066}, + {0.286029,0.322126}, + {0.330171,-0.854661}, + {-1.348837,-0.420251}, + {-0.198428,-0.371513}, + {-0.525214,0.301414}, + {-0.667387,0.022208}, + {-0.574674,0.529466}, + {2.371918,-0.496606}, + {0.257499,-0.783288}, + {0.156324,0.286932}, + {0.087484,0.531503}, + {0.093291,0.317147}, + {-0.427160,-2.024729}, + {-0.044421,1.046526}, + {0.978931,0.464268}, + {-1.373383,-0.073722}, + {-2.321501,-0.976402}, + {0.683655,0.655822}, + {0.352602,-0.192715}, + {0.339613,0.269168}, + {-0.472547,-1.432907}, + {-0.231035,0.019309}, + {-0.094858,1.060712}, + {0.681354,-1.324615}, + {0.864079,0.416811}, + {-0.558628,0.087251}, + {-0.365315,0.133957}, + {0.107680,2.348517}, + {0.198383,1.253961}, + {-1.268406,0.952837}, + {-0.992758,-0.560084}, + {0.672959,0.572037}, + {-0.449041,1.977002}, + {0.522614,0.339234}, + {0.085229,-0.360501}, + {0.640099,0.726865}, + {-0.091502,-0.015738}, + {-1.201696,1.035130}, + {-0.109550,-0.696829}, + {1.168720,1.005732}, + {-0.249323,1.263522}, + {0.724024,0.109230}, + {0.265328,0.012693}, + {-0.842707,-1.113746}, + {-1.256092,-0.822533}, + {-0.075814,-0.052293}, + {-0.128797,-0.411582}, + {-0.653104,-0.788771}, + {0.939494,0.157740}, + {1.072504,0.885641}, + {0.163190,0.818505}, + {0.706255,0.687324}, + {0.384361,-0.313490}, + {0.508228,-1.395336}, + {0.359982,0.352805}, + {-0.256236,0.825832}, + {0.029179,-0.324424}, + {0.486841,0.728258}, + {0.817556,0.065814}, + {1.494148,0.828882}, + {-0.050180,-0.893645}, + {-0.636544,-1.178485}, + {-0.720967,0.391549}, + {-1.307682,0.078339}, + {-0.605757,-0.944323}, + {-0.731348,-0.094258}, + {0.396463,0.209925}, + {0.209509,-0.607296}, + {0.119597,-0.249649}, + {-0.200995,-0.099649}, + {-0.567400,-0.345251}, + {-0.857138,0.181769}, + {-0.941646,-0.854838}, + {-1.128753,0.837338}, + {-0.657241,-0.759242}, + {-0.188936,0.670672}, + {-0.306598,-0.482202}, + {0.912207,-0.517195}, + {1.164901,-0.427966}, + {-0.009895,-1.020774}, + {0.025765,1.322707}, + {0.150524,1.732201}, + {-0.439267,-0.498603}, + {-0.368177,0.524348}, + {-0.630978,-0.521041}, + {-0.231973,-0.184883}, + {0.067075,1.310441}, + {-0.105442,1.412885}, + {0.331006,-1.363233}, + {0.791599,0.084396}, + {-0.890726,-1.246866}, + {-0.542651,-0.106851}, + {0.107314,0.092753}, + {-0.732606,0.153913}, + {-0.330158,0.495539}, + {0.489401,1.064049}, + {-0.417820,1.261110}, + {-1.631694,-0.818434}, + {-0.620724,-0.895058}, + {0.426467,-1.064865}, + {0.467471,-0.278711}, + {0.817514,-0.321221}, + {0.096475,-0.494918}, + {0.152146,0.351492}, + {-0.498145,1.133315}, + {0.303055,-0.317239}, + {0.103959,0.019469}, + {0.092448,0.918901}, + {-0.993398,0.147710}, + {-0.995629,0.413023}, + {1.220671,-1.202642}, + {0.724379,1.575400}, + {0.811431,0.466068}, + {0.499664,-0.880995}, + {0.558109,0.769554}, + {-0.702879,-1.050569}, + {-0.353375,-0.936081}, + {0.360053,-0.464839}, + {-0.779252,-0.780140}, + {0.090785,-0.637723}, + {-0.304972,0.459278}, + {0.736270,-0.110646}, + {-0.109772,0.206927}, + {-0.478619,-0.042280}, + {-0.876631,0.510703}, + {-0.906729,-0.217556}, + {-1.537449,-0.267733}, + {-0.978123,-0.957757}, + {-0.714696,0.975507}, + {0.812617,-0.332136}, + {-0.725724,-0.236311}, + {-0.100842,1.337503}, + {0.080524,1.176672}, + {0.771711,-0.341004}, + {-0.423299,-0.455648}, + {2.158161,-0.512129}, + {1.151039,-1.024555}, + {0.642063,0.018575}, + {-1.054085,0.401372}, + {-0.288785,0.630494}, + {0.347641,-0.610670}, + {1.408482,0.059692}, + {-0.379421,-0.208655}, + {-0.483324,-0.878070}, + {0.602104,-0.394601}, + {-0.004706,-0.642013}, + {-0.358424,-0.253404}, + {0.411569,-0.129959}, + {1.228551,0.006102}, + {0.531607,-0.018854}, + {-1.380934,-0.627088}, + {0.547267,-0.039238}, + {0.746745,0.351671}, + {0.303177,-0.387336}, + {-0.796387,-1.614076}, + {0.464988,0.970223}, + {0.191287,0.066696}, + {-0.220325,0.790812}, + {0.303741,1.089789}, + {0.448117,-0.011489}, + {0.419576,0.169210}, + {0.541446,-0.813073}, + {-0.746604,-0.394798}, + {-0.535124,-0.399080}, + {1.212820,1.210170}, + {-0.608420,0.220226}, + {-1.418918,1.368314}, + {0.931166,0.677711}, + {0.682432,-0.895030}, + {-0.693349,0.261801}, + {0.258131,-2.168849}, + {0.867516,0.563051}, + {-0.096511,-0.462814}, + {-0.689393,-0.230999}, + {-0.369812,0.249233}, + {0.046717,0.954072}, + {-0.032594,0.551930}, + {-0.766079,-0.071566}, + {0.793508,-0.748283}, + {0.241679,0.608403}, + {0.498824,0.196015}, + {0.386018,-0.774475}, + {-0.291054,-0.131220}, + {-0.436014,0.049768}, + {-0.006478,0.331976}, + {-1.126995,0.403371}, + {0.674118,-1.006190}, + {0.727574,-0.631312}, + {0.115880,0.143336}, + {-0.181566,0.695052}, + {-0.233203,-0.086295}, + {0.112809,-0.045588}, + {0.543264,0.808170}, + {-0.581874,-0.471845}, + {0.340867,-0.485032}, + {0.165312,0.013926}, + {-0.162445,0.725280}, + {-0.499103,-1.248448}, + {0.033577,0.051456}, + {-1.045131,-0.235899}, + {-1.110962,-0.102827}, + {-0.274189,1.259956}, + {-0.791826,1.100141}, + {0.324671,0.829447}, + {0.800825,-0.584404}, + {0.849667,-0.944107}, + {0.288553,0.174365}, + {-0.215377,1.086802}, + {0.392650,-0.010487}, + {0.748435,-1.137606}, + {0.034898,-0.302699}, + {0.636265,0.119519}, + {0.837150,-0.690876}, + {-0.092518,0.354308}, + {0.084607,-0.381048}, + {0.970579,0.659439}, + {-0.564493,-0.616213}, + {-0.403944,-0.133496}, + {1.350834,0.527610}, + {-0.742367,-0.805350}, + {0.624140,0.366381}, + {0.005646,-0.563460}, + {0.268050,-1.292687}, + {0.547784,-0.463622}, + {-0.659049,-0.130209}, + {0.283018,0.527990}, + {1.418480,1.297302}, + {0.488656,0.974499}, + {0.551555,-0.669995}, + {0.015860,-0.360077}, + {0.438938,1.527582}, + {-0.729915,-1.304140}, + {0.025131,0.002452}, + {-1.484426,0.708978}, + {-0.804342,0.051125}, + {0.990833,-0.309900}, + {-0.023686,0.762213}, + {-0.617502,0.277137}, + {-1.488232,0.224413}, + {-0.082550,0.224711}, + {0.610967,-0.436610}, + {-0.019999,1.299875}, + {-0.323230,1.244962}, + {-0.812947,1.719798}, + {0.333300,-0.174474}, + {0.115682,-1.155270}, + {-0.695856,0.388529}, + {-0.543434,-0.096509}, + {-0.096049,0.107245}, + {-0.199971,0.163067}, + {-0.067111,0.395370}, + {1.026571,-0.210498}, + {-0.233456,0.753581}, + {0.051242,-0.861376}, + {0.567777,-0.613727}, + {0.987200,-0.366176}, + {-0.409966,-0.600319}, + {-0.021597,-0.362028}, + {-0.285392,-1.023961}, + {0.324897,-0.397392}, + {-0.592783,-1.366636}, + {1.513069,0.094527}, + {-0.044122,0.361806}, + {0.677076,-0.471443}, + {-0.333290,0.236344}, + {0.108895,-0.098454}, + {0.103235,-0.195197}, + {0.650796,-0.537053}, + {-0.131204,-0.326541}, + {0.520322,0.172370}, + {0.210147,-0.555893}, + {-1.082301,-0.048132}, + {-1.964090,-0.466588}, + {0.328335,-0.553112}, + {0.708616,0.426767}, + {1.323439,-0.348617}, + {0.360543,0.545349}, + {-0.719946,-0.639191}, + {0.592925,0.790534}, + {0.402184,-0.204855}, + {0.907703,-1.809146}, + {-0.387200,0.273777}, + {-1.602303,0.588109}, + {0.867147,0.107290}, + {0.824226,0.764841}, + {-0.538419,-0.797958}, + {0.814390,0.065650}, + {-1.453486,-0.528528}, + {-0.672247,-0.514976}, + {-0.052375,0.190079}, + {-0.094941,0.604553}, + {0.088500,0.393075}, + {0.195693,0.876814}, + {-0.184889,-1.487501}, + {-0.270364,0.104600}, + {0.102034,0.660195}, + {-0.091355,-0.465751}, + {-0.135152,-0.520824}, + {-0.022116,-0.821371}, + {0.570832,0.492145}, + {0.066106,0.238053}, + {-0.184571,0.890977}, + {0.288094,-1.019289}, + {-0.022496,-0.473805}, + {1.126320,1.508352}, + {-0.531990,0.461793}, + {-0.594808,0.080021}, + {0.290982,-0.692523}, + {-0.890167,0.818541}, + {-0.162518,0.512516}, + {-0.062089,0.662125}, + {-0.469694,0.836419}, + {0.590828,-0.375129}, + {-1.549634,1.352916}, + {-0.257487,0.526662}, + {0.554513,-0.496139}, + {-0.489056,-1.265723}, + {0.233948,-0.647727}, + {0.333881,0.673747}, + {0.721218,0.641171}, + {0.166479,1.234207}, + {0.251689,-0.854045}, + {0.503304,-0.772030}, + {-0.397815,1.070705}, + {-0.454466,-0.093432}, + {0.509756,0.581621}, + {-0.636769,0.173815}, + {-0.434115,-0.379772}, + {0.360372,0.416251}, + {-0.816916,0.336363}, + {-0.481516,-0.148237}, + {-0.344201,1.129372}, + {-0.745381,-0.145303}, + {-0.237741,-1.131222}, + {0.083772,-0.220665}, + {0.519841,-0.090807}, + {-0.074125,-0.928286}, + {-0.280099,-1.361722}, + {-0.233499,-0.378497}, + {0.373073,-1.241461}, + {-1.426124,0.070811}, + {-0.509544,0.495983}, + {0.099959,-0.668754}, + {0.270905,1.556735}, + {-0.390670,0.537248}, + {-0.058168,0.187165}, + {-0.406095,-0.397041}, + {0.121194,-0.343134}, + {-0.451420,0.715020}, + {-0.116938,-0.147192}, + {-0.333465,0.135991}, + {-0.741996,-0.453454}, + {-0.481034,-0.484738}, + {-0.782498,0.231260}, + {0.024518,0.585927}, + {-0.450470,-0.353688}, + {0.594174,-0.126300}, + {-0.794772,0.420486}, + {1.314513,-0.513466}, + {-0.370453,0.760489}, + {0.150855,-0.339750}, + {-0.135993,-0.778609}, + {-0.276600,-0.086547}, + {0.113501,-0.451234}, + {0.807762,-0.310844}, + {0.789981,0.544938}, + {-0.304444,0.191596}, + {-1.155565,-0.682987}, + {0.312056,1.172277}, + {0.148072,-0.646764}, + {-1.017788,0.784066}, + {0.908108,-2.113397}, + {-0.647792,-0.940894}, + {-0.147613,0.439221}, + {-1.081613,0.980868}, + {0.632143,-0.374708}, + {-0.495802,-0.113519}, + {-0.001556,0.150950}, + {-1.307628,-0.508955}, + {-0.300870,0.315066}, + {-1.083447,-0.140177}, + {-0.100772,0.376783}, + {-0.477322,1.014067}, + {-0.567785,-0.305888}, + {-0.836664,1.106455}, + {-0.015276,0.006448}, + {0.616278,0.239966}, + {0.030009,-1.107782}, + {-0.770995,-0.138155}, + {-0.681094,-0.519193}, + {-0.882058,-0.080711}, + {0.248760,-0.979030}, + {0.000043,-0.366665}, + {0.400810,-0.085567}, + {0.641021,-0.084098}, + {0.533652,0.288318}, + {0.894862,-0.065116}, + {0.123370,0.978511}, + {-0.180674,0.803822}, + {0.728752,-0.234438}, + {-1.319526,0.158393}, + {-0.205442,-0.299613}, + {-0.383721,-0.335137}, + {-1.028570,0.223713}, + {0.932332,-0.634004}, + {0.157887,-0.980576}, + {0.889136,0.047845}, + {-0.087490,-1.077315}, + {1.004223,-0.574276}, + {-0.563213,-0.079366}, + {0.609176,0.143015}, + {1.007697,-0.230920}, + {-0.432129,-0.855668}, + {-0.751450,-0.419138}, + {-0.531787,0.218861}, + {1.240797,0.009179}, + {0.098613,1.024921}, + {-0.418097,-0.610862}, + {0.638017,-0.556955}, + {-0.882736,0.678364}, + {-0.101406,0.188363}, + {0.575997,-0.320782}, + {-0.184244,-0.946120}, + {0.854262,0.058870}, + {0.623265,0.222449}, + {0.026415,0.979594}, + {0.482302,0.001502}, + {-0.278778,-0.147706}, + {0.640003,0.194414}, + {0.438042,-0.226420}, + {0.136500,0.092192}, + {-0.202665,0.686749}, + {0.522478,0.318777}, + {-0.913607,0.461100}, + {0.058242,-0.589196}, + {-0.125264,0.196658}, + {0.455045,0.102476}, + {-0.248191,-0.131455}, + {-0.497535,0.250805}, + {0.168700,0.673232}, + {0.711314,-0.106036}, + {0.651818,-0.851557}, + {0.977553,-1.253093}, + {0.286839,1.317582}, + {-0.371842,-1.093583}, + {-0.301749,1.329315}, + {-0.403959,-0.126875}, + {-0.217582,0.112597}, + {0.122512,-0.547045}, + {0.538957,1.455939}, + {-0.051608,0.121125}, + {-0.483043,0.988090}, + {0.497165,-0.191173}, + {-0.703290,0.550797}, + {0.658044,0.757078}, + {-0.412660,-0.052012}, + {-0.252273,0.092307}, + {-1.322972,0.140665}, + {-0.203724,0.534689}, + {0.116356,0.483238}, + {0.554228,1.157456}, + {0.327654,1.316895}, + {0.250489,-1.294149}, + {0.982871,0.689230}, + {0.192154,-0.292214}, + {-0.669868,-0.373672}, + {-1.188747,-0.038297}, + {-1.090901,0.731469}, + {0.764236,-0.485868}, + {0.275150,1.088652}, + {0.976241,-0.963219}, + {-0.581240,-1.282012}, + {0.320197,0.407777}, + {0.748587,0.046703}, + {0.467881,-0.329966}, + {-1.102496,0.283212}, + {1.062265,1.008907}, + {-0.606597,0.619235}, + {-0.156865,-0.044052}, + {-0.002704,-0.036497}, + {0.706197,-0.423776}, + {-0.257156,0.973133}, + {0.487914,1.074381}, + {-0.885602,-1.777507}, + {-0.940260,0.448708}, + {0.932505,0.236523}, + {1.804253,0.372704}, + {-1.578130,0.083653}, + {-0.626332,1.026166}, + {1.193807,-0.043563}, + {-0.505137,-1.317739}, + {-0.508528,0.107232}, + {-0.487782,0.645512}, + {-0.437935,-0.346208}, + {0.632623,1.393825}, + {0.487853,0.179346}, + {0.015868,0.802943}, + {-0.172107,-0.530354}, + {-0.438663,0.597939}, + {-0.523518,-0.769340}, + {-0.309114,-0.877138}, + {-0.805692,0.319938}, + {0.980487,0.415193}, + {0.086533,-0.000662}, + {0.083456,0.469788}, + {2.350354,0.199267}, + {-1.117492,1.031942}, + {-1.874684,-1.438324}, + {-1.506923,-0.254100}, + {-0.442244,-0.212173}, + {0.622220,0.078493}, + {0.442782,0.738116}, + {0.382808,1.370781}, + {-0.572913,-0.327280}, + {0.033002,-1.591756}, + {-1.011466,-0.707980}, + {-0.540779,-0.501728}, + {-0.430794,-0.139464}, + {0.953393,-0.835771}, + {-0.569549,-1.511300}, + {-1.023529,-1.226598}, + {-0.030465,0.795517}, + {-0.123311,-0.051937}, + {-0.428708,-0.079562}, + {-1.177091,0.332774}, + {-1.004645,-0.843150}, + {-0.038739,1.507680}, + {0.090651,0.221051}, + {0.109970,0.073002}, + {1.310602,0.693833}, + {0.072228,1.417407}, + {-0.104879,0.467846}, + {-1.441396,0.816322}, + {-0.151793,0.678658}, + {-0.096420,0.855195}, + {0.430901,1.154121}, + {-0.250084,-0.013302}, + {0.587835,0.733677}, + {0.477520,-0.424982}, + {-0.504096,-1.402798}, + {-1.013512,0.267668}, + {-0.363026,-0.005476}, + {-0.718136,-0.118798}, + {-0.446816,-0.602576}, + {-0.797358,-0.024473}, + {0.633098,0.624564}, + {0.021270,1.205089}, + {0.266963,1.498017}, + {-0.508527,0.054780}, + {-0.043710,0.286613}, + {-0.142768,0.551359}, + {0.220664,-1.355083}, + {0.521431,-0.476980}, + {0.141075,0.083285}, + {-0.059602,-0.756118}, + {-0.451512,-0.258693}, + {-0.730176,1.521289}, + {-1.362482,0.104512}, + {0.270994,0.327411}, + {-0.363492,-0.868879}, + {0.672515,-0.270446}, + {-1.342101,0.237073}, + {0.508772,-0.377732}, + {-0.713798,-0.466147}, + {0.368961,0.592551}, + {0.299261,2.116040}, + {-0.672263,-0.279814}, + {-1.007523,1.276007}, + {0.227684,-0.462034}, + {0.387360,-0.328996}, + {0.352344,0.109850}, + {-0.554321,-0.079454}, + {-1.105078,0.393291}, + {1.734659,0.308959}, + {-0.308866,0.349966}, + {-0.493334,1.891041}, + {0.107295,-0.199193}, + {0.015633,1.669639}, + {-0.192819,0.360563}, + {1.300187,0.043971}, + {-0.195297,-0.619241}, + {-0.120101,-1.056832}, + {-0.447948,-0.495157}, + {-0.326704,-0.483233}, + {-1.035520,1.157850}, + {-0.498165,1.806892}, + {-0.145448,0.642467}, + {-0.405584,1.352826}, + {-0.421562,0.606142}, + {0.294387,1.309778}, + {-0.154054,0.079388}, + {0.536240,0.173272}, + {-0.024006,1.108828}, + {0.874482,-1.013605}, + {0.377186,-0.667107}, + {1.113183,0.945097}, + {-0.623475,-0.893737}, + {-0.192779,-1.241070}, + {0.632202,0.599329}, + {-0.998820,-0.803084}, + {1.383370,0.376201}, + {-0.083581,0.942494}, + {-0.173566,-0.198364}, + {0.074235,-0.314876}, + {-0.556586,0.347212}, + {0.490005,0.416503}, + {0.331992,-0.555958}, + {-0.691485,-0.331265}, + {-0.796966,-0.358733}, + {-0.252577,0.543161}, + {-0.861375,0.772953}, + {0.133135,1.007422}, + {0.110358,-0.029927}, + {-1.330897,0.730045}, + {0.393907,0.863772}, + {-0.741439,0.432644}, + {0.576414,-1.086511}, + {-0.053779,1.091841}, + {0.727738,-0.274889}, + {-0.147372,0.359935}, + {-1.596102,0.038969}, + {0.002325,-0.748844}, + {1.142039,-0.398003}, + {-0.334125,-0.639994}, + {0.207807,0.496680}, + {-0.364096,-0.594810}, + {1.762264,0.531826}, + {-0.749354,0.980400}, + {-1.280578,1.031222}, + {0.206510,0.566433}, + {-0.682051,-0.394535}, + {-0.551294,1.174139}, + {0.313715,-1.149243}, + {0.656347,0.386459}, + {0.735878,0.178740}, + {-0.293578,-0.287406}, + {-0.179112,-0.387732}, + {0.213178,-0.962025}, + {-0.344776,-0.181182}, + {0.641578,-0.406269}, + {-1.401786,-0.171097}, + {0.286238,-0.125231}, + {0.252492,-0.547389}, + {0.120026,0.720419}, + {1.337138,0.195949}, + {-0.660370,0.703330}, + {0.092159,-0.695855}, + {-0.620594,0.229351}, + {1.055181,0.111751}, + {1.006880,0.293700}, + {-0.093249,0.555442}, + {-0.399694,0.811308}, + {-1.684486,-0.633970}, + {0.080918,0.511860}, + {-0.439946,0.019865}, + {-0.390984,-1.044203}, + {-0.685936,-1.231559}, + {-0.204744,-0.679722}, + {-0.859863,0.460715}, + {-0.246945,0.401049}, + {0.193542,1.129638}, + {-0.255188,0.214659}, + {0.484590,-0.289803}, + {0.830376,-1.338483}, + {-0.649905,-0.117391}, + {-0.796076,-0.304220}, + {0.353714,0.110796}, + {1.064357,0.203116}, + {0.772181,0.613989}, + {-0.595196,0.130421}, + {0.714852,-0.201961}, + {-0.246157,1.317799}, + {-0.188331,1.819959}, + {-0.255805,-0.742062}, + {-0.138330,-0.228130}, + {0.447635,0.068326}, + {0.167371,0.023899}, + {0.541047,-0.398183}, + {1.279247,-0.892511}, + {0.970960,-0.571617}, + {0.064149,-0.440132}, + {-0.091864,0.479401}, + {-0.178907,-0.263349}, + {-0.460228,0.072292}, + {-0.022178,0.024037}, + {0.042415,0.943316}, + {-0.639441,0.125048}, + {0.773008,1.096997}, + {0.127606,0.363171}, + {0.870742,-0.533857}, + {-0.763648,0.812840}, + {0.461366,0.041432}, + {-0.006986,-0.606103}, + {0.535399,0.207011}, + {-0.584722,-1.519249}, + {0.121278,-0.207252}, + {1.085226,-0.059229}, + {0.129751,0.594549}, + {-0.110785,1.298075}, + {-0.828154,0.282231}, + {0.357325,0.161702}, + {-0.286592,0.378964}, + {0.132628,0.276829}, + {-0.793980,1.023088}, + {-0.957162,0.460617}, + {-0.032594,-0.412238}, + {0.060784,0.629413}, + {1.100209,0.447011}, + {-0.198523,0.062691}, + {-0.709541,0.204258}, + {0.020197,-1.320956}, + {-0.215897,-1.623511}, + {0.748680,0.160824}, + {-0.504640,0.232847}, + {-0.269767,-0.738709}, + {0.392299,0.153438}, + {0.160576,-0.386143}, + {0.357881,0.613915}, + {-1.268598,-0.067517}, + {-0.666996,0.396000}, + {-0.761129,-1.835104}, + {-0.128240,0.064241}, + {-0.200634,-0.545752}, + {0.111993,0.186523}, + {-0.162610,-0.333088}, + {-0.548141,0.520658}, + {0.016143,-0.863869}, + {-0.569927,1.339376}, + {0.616225,-0.058848}, + {-0.664092,-0.932852}, + {-0.309768,-0.158927}, + {0.459254,1.205541}, + {-0.809099,-0.795062}, + {-0.182439,-0.025138}, + {-0.916346,-0.341971}, + {0.829546,-0.066365}, + {0.855095,-0.587404}, + {-0.275741,1.185855}, + {-0.816888,0.228774}, + {-1.253625,-0.671337}, + {-0.336773,-0.885292}, + {-1.419712,0.386946}, + {0.256469,-0.112479}, + {-0.195782,0.897473}, + {-0.448164,0.230629}, + {-0.137292,-0.954298}, + {0.044064,-1.420896}, + {0.346739,-0.728567}, + {-0.486216,0.932718}, + {-0.234357,-0.424851}, + {-0.893944,-1.580683}, + {0.224420,-0.109758}, + {-0.525390,-0.659896}, + {-0.082822,-1.111491}, + {-0.027127,0.600399}, + {0.417077,-0.941458}, + {-0.672273,-0.776712}, + {-0.375658,-0.673124}, + {-0.128259,0.669274}, + {0.274039,-0.162639}, + {0.531405,0.328816}, + {-0.173541,-0.344658}, + {0.109632,-0.652172}, + {0.745372,-0.988494}, + {0.323987,0.395099}, + {-0.220000,-0.137398}, + {0.004579,-0.872426}, + {0.251476,-0.625225}, + {1.333603,-0.551770}, + {0.081311,-0.544503}, + {0.326594,-0.007595}, + {-0.823281,1.430717}, + {0.572531,0.791617}, + {0.063804,-0.438730}, + {-0.804912,-0.338880}, + {0.533428,-0.017895}, + {-2.355835,-0.084042}, + {-0.020945,0.576270}, + {-1.338558,0.102208}, + {-1.341976,0.904601}, + {0.494760,0.485739}, + {-0.067460,2.005861}, + {-0.249791,0.460139}, + {0.735361,0.697345}, + {-0.007071,-0.683978}, + {0.116523,-0.146979}, + {0.082917,-0.544381}, + {-0.183656,-0.015491}, + {-0.125475,0.097676}, + {0.216174,0.367420}, + {-0.825492,0.033576}, + {0.392395,0.018111}, + {-1.196534,-0.398387}, + {0.858381,-0.236375}, + {0.427010,-0.140906}, + {0.549912,1.102720}, + {0.013097,-0.589424}, + {-0.486318,-0.182311}, + {0.597453,0.811553}, + {-0.394496,0.945556}, + {0.194762,-0.392322}, + {-0.245420,-1.255616}, + {0.591577,-0.107335}, + {-0.065784,-1.591483}, + {-0.463762,-0.160668}, + {-0.789821,-0.048679}, + {-0.275537,0.448439}, + {1.110561,1.009790}, + {0.527317,-1.005654}, + {1.115740,-0.604145}, + {-0.557221,1.170167}, + {0.014607,-0.908701}, + {0.869524,-0.104916}, + {0.670785,-0.073642}, + {0.275557,-0.344125}, + {-0.677464,0.205771}, + {1.468200,-2.040479}, + {-0.644867,-0.260612}, + {-0.885294,-0.600743}, + {-1.083463,0.305217}, + {0.192783,0.054288}, + {-1.442832,-0.464161}, + {-0.430593,0.193934}, + {1.037362,-0.157372}, + {0.396271,0.148627}, + {-0.590031,-0.536029}, + {-0.903929,-0.929530}, + {0.502786,-0.088813}, + {0.556812,0.044700}, + {0.140136,-0.196190}, + {0.247448,-0.454580}, + {0.858752,0.511401}, + {-0.226488,-0.387412}, + {-0.588826,0.225291}, + {0.122682,-0.776759}, + {-0.494520,0.407446}, + {-0.991127,0.502398}, + {0.655983,-0.129177}, + {-1.425441,-0.191821}, + {-1.341352,0.064542}, + {-1.072479,1.113384}, + {0.041286,2.051621}, + {-0.242983,0.516347}, + {-0.237060,-1.113874}, + {-0.023272,1.377334}, + {-1.899043,0.594030}, + {0.467479,1.264261}, + {0.663846,-0.112813}, + {0.692125,-0.625121}, + {-0.298478,-0.083012}, + {-0.964078,-0.081148}, + {-0.470905,0.411913}, + {1.474979,-0.154895}, + {0.661302,-0.012302}, + {-0.965442,0.514810}, + {0.318276,0.457882}, + {-0.542257,-1.222535}, + {0.062860,0.023413}, + {0.085049,1.158655}, + {1.247453,-0.154635}, + {0.178202,0.204762}, + {0.844883,0.791503}, + {0.233726,-0.984440}, + {0.164056,0.642663}, + {-0.322448,0.327553}, + {-0.126490,0.319918}, + {-0.158159,-1.372744}, + {1.298184,-0.764151}, + {0.018998,0.522201}, + {-0.962200,0.169821}, + {-0.176380,1.186852}, + {-0.034894,0.510674}, + {0.098506,-0.900306}, + {0.336179,-0.133751}, + {0.337938,0.195812}, + {0.012498,0.889530}, + {-0.625594,-0.298426}, + {0.694907,0.251068}, + {-0.113195,0.672439}, + {-0.753666,0.051040}, + {0.141270,0.049792}, + {-0.067074,0.245343}, + {-1.587448,-1.120145}, + {0.136902,0.397052}, + {0.012719,0.888125}, + {-0.899053,-0.232361}, + {-0.572945,0.118157}, + {0.689248,-0.024022}, + {-0.369033,1.314103}, + {1.171046,-0.441653}, + {0.148432,0.000953}, + {0.474619,1.318479}, + {-0.789100,-0.189436}, + {1.168206,-0.870973}, + {-0.471363,0.375174}, + {0.506161,-0.536559}, + {1.423200,0.042084}, + {-0.929433,-1.633785}, + {-1.295439,0.135491}, + {-1.538034,-0.008372}, + {-1.271645,-1.051796}, + {0.554905,-0.373024}, + {-0.643509,-0.327706}, + {-0.419714,1.107479}, + {0.466287,-0.239969}, + {-0.653212,0.139871}, + {-1.451830,-0.344354}, + {-0.907859,-0.216021}, + {0.944616,0.366605}, + {0.059977,0.109431}, + {1.031953,-1.164485}, + {0.449597,-2.254492}, + {-0.703591,-0.293462}, + {0.705176,0.000026}, + {0.129751,-0.129761}, + {-0.500724,0.070967}, + {0.708266,-0.279742}, + {0.057621,-0.165775}, + {-0.918908,0.311085}, + {0.103258,0.736145}, + {0.327648,0.004814}, + {-0.462488,-1.311553}, + {-0.800705,-0.250875}, + {0.725654,-0.503263}, + {0.070847,0.104229}, + {-0.617014,-0.723182}, + {-1.389549,-0.393330}, + {0.968007,-0.009708}, + {0.139527,1.299372}, + {0.248082,0.601290}, + {0.953040,-0.996260}, + {1.309783,-1.016336}, + {-0.934166,0.729653}, + {-0.388471,0.682112}, + {-0.240315,0.888481}, + {-1.098614,-0.034184}, + {-0.421662,-0.755789}, + {0.307964,0.867011}, + {0.444477,0.930219}, + {1.603805,-0.402639}, + {-0.089754,1.413485}, + {0.230484,0.488389}, + {0.354216,0.348765}, + {-0.322557,-0.563235}, + {-0.185066,0.795538}, + {-0.550469,0.168640}, + {-0.331680,-0.810292}, + {-0.678005,-0.138885}, + {0.888325,0.259799}, + {-0.261157,1.314246}, + {-0.724085,0.698159}, + {-0.487339,0.343089}, + {0.256545,0.306148}, + {1.087370,1.360731}, + {0.909221,0.906951}, + {0.840193,0.271044}, + {-0.449186,-0.712406}, + {-0.100897,-0.905420}, + {-1.281902,-0.335234}, + {0.740303,0.011500}, + {0.899467,-0.124748}, + {0.536766,-0.366208}, + {-0.643354,0.691747}, + {-0.261056,-0.256182}, + {0.272516,-0.258403}, + {0.631447,-0.167719}, + {-0.196437,-0.052842}, + {1.508024,-0.936465}, + {-0.180365,-1.378710}, + {-0.249668,0.002152}, + {1.598053,1.741993}, + {-1.056432,0.117693}, + {0.515300,1.069078}, + {-0.212007,-1.048830}, + {0.335613,0.489364}, + {-0.796184,-1.069425}, + {0.083158,0.697802}, + {-1.235153,-0.772422}, + {-0.357202,-0.012821}, + {-0.593893,-1.181373}, + {0.050524,-0.401930}, + {0.074720,0.364095}, + {-0.079716,-1.693522}, + {0.100870,-0.312204}, + {0.947544,0.242623}, + {-0.643159,-0.717020}, + {0.224527,0.733617}, + {0.216476,1.876947}, + {0.332304,-0.401619}, + {1.189563,-1.382521}, + {0.908890,-0.674780}, + {0.437119,-0.298161}, + {-0.058059,-0.200793}, + {0.362838,0.619364}, + {0.117785,0.015330}, + {-1.151039,-0.121108}, + {-0.542608,0.263258}, + {-0.605341,1.175677}, + {-0.526847,0.683678}, + {-0.003684,-0.546691}, + {0.101077,-0.028945}, + {-0.699619,0.028653}, + {-0.287565,0.909150}, + {-0.003493,0.475101}, + {0.110908,-0.450847}, + {0.822169,-0.268593}, + {-1.331173,0.303365}, + {0.354079,1.195309}, + {1.074010,-0.113039}, + {1.358327,0.349989}, + {0.328412,0.126190}, + {0.251235,0.427830}, + {-0.681032,-0.654465}, + {0.947471,-0.314890}, + {-0.506438,0.044035}, + {0.437633,-0.586149}, + {0.108011,0.609608}, + {-0.313954,0.566877}, + {-0.057536,-1.682225}, + {0.588066,0.182714}, + {1.063758,-0.640294}, + {0.843978,-0.415465}, + {1.201541,1.527708}, + {-0.299630,-0.584595}, + {0.591297,0.504796}, + {-0.056764,-0.947796}, + {-0.517348,-0.289759}, + {-0.288464,0.617447}, + {0.348633,-1.043987}, + {0.054553,-0.520532}, + {-0.090965,-0.147650}, + {0.086384,-0.577068}, + {-0.102547,-1.253433}, + {0.635189,0.519118}, + {-0.720591,-1.495902}, + {0.080849,0.205010}, + {0.751958,-0.190846}, + {-0.538937,-0.320929}, + {-0.612417,0.554560}, + {-0.851261,0.869392}, + {1.198195,-0.529736}, + {0.057548,-0.579206}, + {-1.025654,-0.151350}, + {0.303841,-0.211254}, + {0.446343,-1.552067}, + {0.315397,-0.808794}, + {-0.063785,0.774825}, + {0.783816,-0.157279}, + {-0.693511,0.332481}, + {-0.234900,0.528764}, + {0.596556,0.333542}, + {1.373749,-0.817280}, + {-0.295436,-0.145692}, + {0.006813,0.157722}, + {0.516578,-0.790212}, + {0.478924,-0.959898}, + {0.370258,0.489034}, + {0.713319,-0.586588}, + {0.332856,0.078227}, + {-0.425185,-0.677807}, + {-0.149519,0.199877}, + {1.263811,-0.509766}, + {0.233085,-0.479083}, + {0.856984,0.232124}, + {-0.398816,0.118417}, + {0.725782,0.573860}, + {-0.423177,-0.195038}, + {0.479589,-0.152071}, + {-0.606474,1.399722}, + {-2.041557,0.729519}, + {-0.617790,-0.668932}, + {0.137657,-1.422402}, + {-0.786831,-0.619224}, + {-0.149759,-0.165667}, + {0.190154,0.929670}, + {-0.287768,1.169585}, + {1.061637,0.067450}, + {-0.140288,-0.424489}, + {0.785589,-0.241400}, + {-0.992917,0.456275}, + {0.543095,-0.526169}, + {0.262447,0.354750}, + {0.115837,-1.383394}, + {-0.765803,-0.645191}, + {0.382408,-0.004403}, + {0.124288,-0.280736}, + {1.156532,0.881587}, + {1.088618,0.321389}, + {-2.279889,-0.488846}, + {-1.135730,0.591114}, + {-1.093988,-0.708227}, + {-0.153356,0.947910}, + {0.191071,-0.367728}, + {0.332287,0.126137}, + {-0.150579,-0.128056}, + {-0.515071,1.279206}, + {-0.471647,0.450751}, + {-0.177599,0.084528}, + {0.405248,-1.192993}, + {-1.199598,-1.871218}, + {-1.009935,0.125214}, + {0.860742,-0.062698}, + {-0.657040,-1.041627}, + {0.026116,-0.059837}, + {-1.346135,1.113968}, + {-0.624805,0.301187}, + {0.274945,0.937253}, + {0.478006,0.733921}, + {-0.612665,-0.715399}, + {-0.016013,0.268927}, + {0.319591,0.208865}, + {1.344190,-0.216045}, + {0.130151,1.142744}, + {0.172902,-0.626551}, + {-1.349281,-0.008253}, + {0.621623,0.463895}, + {0.184316,0.698054}, + {-0.585348,-1.744754}, + {0.109077,0.127077}, + {0.216486,0.290303}, + {0.785660,0.927775}, + {0.384514,-0.692532}, + {0.727702,-0.034449}, + {-0.057908,0.127263}, + {0.271526,0.524594}, + {-0.858654,-0.086733}, + {0.464001,0.064140}, + {0.227926,1.431933}, + {0.138844,0.005704}, + {0.141627,-0.127211}, + {-1.003825,0.034579}, + {-0.388278,0.179387}, + {0.158985,0.905558}, + {-1.242335,0.519667}, + {-0.047141,0.947802}, + {0.336262,-1.612058}, + {0.614542,-0.464413}, + {0.982166,-1.628173}, + {-0.870128,-0.651271}, + {0.486409,0.436105}, + {0.108930,1.638884}, + {-0.021817,-0.425794}, + {0.039699,-0.387185}, + {-1.225415,-0.377385}, + {0.391090,-0.505627}, + {0.651504,-0.883661}, + {-0.276837,0.691315}, + {0.383239,0.054891}, + {0.297223,-0.197196}, + {1.388005,-0.270560}, + {-1.400360,0.278525}, + {-2.093290,0.098416}, + {0.610011,1.401331}, + {-0.945061,-0.541204}, + {0.412258,-1.330328}, + {0.173694,-1.109422}, + {-0.159121,-1.744757}, + {0.285345,1.096001}, + {0.128427,-0.244146}, + {0.067905,-0.156659}, + {-1.018499,-0.578789}, + {0.505971,0.765807}, + {1.015914,0.376986}, + {0.790707,-1.646495}, + {0.487164,-0.607104}, + {-0.697297,-0.367804}, + {-0.565402,0.674289}, + {1.188518,0.712744}, + {-0.592933,-0.373505}, + {-0.203660,1.226443}, + {-0.098045,-0.097690}, + {0.433178,-1.020054}, + {-0.430052,-0.776739}, + {0.324026,-0.937248}, + {0.701878,-0.493328}, + {0.230826,0.826293}, + {0.004731,0.068967}, + {-0.498959,0.400514}, + {-0.513084,-1.025155}, + {0.421206,-1.417798}, + {-0.981820,-0.435834}, + {0.506125,0.020348}, + {-0.235266,-0.135010}, + {0.838326,-0.650392}, + {-0.396983,-0.682428}, + {0.182128,0.408830}, + {0.727117,-0.622519}, + {-0.068542,0.310867}, + {0.442916,0.767343}, + {0.044007,-1.159112}, + {0.493622,-0.162111}, + {0.380900,-1.503298}, + {0.423037,0.548507}, + {-1.568571,0.528272}, + {0.547764,-0.029898}, + {-0.356876,0.578955}, + {0.515241,0.565923}, + {0.167784,1.612647}, + {0.169705,0.087695}, + {1.177100,0.004351}, + {-0.689952,0.053029}, + {0.154453,1.419159}, + {-0.546385,1.058132}, + {0.021626,-0.754253}, + {0.741607,-0.361204}, + {-0.057849,0.999592}, + {-0.015000,1.519017}, + {-0.384562,0.938159}, + {1.000041,1.295279}, + {-1.069485,-0.177887}, + {-0.656125,-0.402525}, + {-0.338546,0.308619}, + {-0.201887,0.631236}, + {-0.576348,-1.438422}, + {0.094374,-0.332953}, + {1.717504,0.411315}, + {-0.139432,0.242414}, + {1.030451,-0.541582}, + {-0.132491,0.928665}, + {-0.929343,0.330223}, + {0.212063,-0.999967}, + {-1.546734,1.473279}, + {0.895231,-0.122118}, + {-0.024873,0.397475}, + {-0.471758,0.171216}, + {-0.384773,0.411799}, + {1.604132,0.192566}, + {-0.352284,-1.692873}, + {-0.127207,-0.166561}, + {-0.087210,-0.289254}, + {0.069733,0.733600}, + {-0.481091,-0.748068}, + {0.025913,-0.282440}, + {0.385995,-0.269872}, + {0.807898,0.547847}, + {0.920522,-0.253019}, + {0.590344,0.287209}, + {-0.264166,-1.420356}, + {0.741891,-0.453230}, + {-0.005511,-0.334318}, + {0.584215,-0.105380}, + {1.235921,0.737084}, + {0.073373,0.196251}, + {0.050188,0.318437}, + {0.326590,0.608379}, + {-0.322564,0.284616}, + {-0.646108,-0.359319}, + {0.322070,0.143369}, + {-0.863728,-0.775195}, + {0.831176,0.342701}, + {0.032958,-0.098237}, + {0.571168,-0.012336}, + {0.182689,0.790901}, + {-0.425154,-0.855671}, + {-0.898454,0.187687}, + {-0.526788,0.506000}, + {0.653615,0.022943}, + {-0.027712,0.795147}, + {-0.439436,0.442340}, + {0.706258,-1.337857}, + {0.478575,0.834826}, + {-1.198496,-0.435258}, + {-0.626551,-0.689605}, + {0.463850,-1.046754}, + {0.616860,0.015892}, + {-0.036480,-0.180819}, + {-0.850951,0.360575}, + {-0.778725,0.021580}, + {-0.003573,0.011854}, + {0.901575,1.139995}, + {-1.397778,-0.965160}, + {0.828026,-0.382807}, + {-0.014620,0.930159}, + {-1.300195,-0.110779}, + {0.749689,0.981340}, + {0.030482,0.848674}, + {0.187375,-0.097744}, + {0.209488,-0.196027}, + {0.347616,-0.395632}, + {0.329045,0.511381}, + {1.124516,-0.961421}, + {-0.221487,-0.120998}, + {-1.498910,1.138313}, + {-0.900081,0.195057}, + {0.353490,-0.370964}, + {0.461766,-0.958569}, + {-0.156196,-1.009013}, + {-0.303470,0.211825}, + {0.970393,0.376784}, + {0.495209,0.940894}, + {-0.760660,-0.732722}, + {-0.277112,-0.555909}, + {0.336774,-0.081721}, + {-0.764784,1.256559}, + {0.729786,0.187455}, + {-1.516521,-0.580250}, + {-0.060807,1.773198}, + {0.384536,-0.806667}, + {-0.704657,-0.622280}, + {-0.801176,0.052175}, + {-0.590213,1.990490}, + {-0.177006,-0.136596}, + {-0.043811,-1.299593}, + {-0.581471,0.077527}, + {0.234488,-0.891170}, + {-0.346771,1.199070}, + {0.082643,1.293400}, + {0.936822,0.025082}, + {-0.731120,-0.476702}, + {-0.934721,-0.022417}, + {0.222389,0.501521}, + {-0.120435,0.461318}, + {-0.065142,0.306212}, + {0.295570,-0.442311}, + {0.993401,0.404579}, + {-0.453363,0.509552}, + {0.282236,0.306297}, + {-0.536249,-0.901250}, + {-0.425114,0.194843}, + {-0.519253,1.853919}, + {-0.710138,0.608713}, + {0.021883,-0.406892}, + {-0.119297,1.104563}, + {-1.009286,0.692377}, + {-1.312874,0.446078}, + {0.820048,0.144155}, + {0.594350,-0.518111}, + {0.445168,-0.296112}, + {0.528797,0.275437}, + {-0.975129,1.054113}, + {-0.141110,-0.278283}, + {-1.108218,0.758768}, + {-0.720411,0.105147}, + {0.012397,0.377536}, + {-0.600491,-0.143086}, + {-0.953860,-0.409408}, + {0.207974,-0.533590}, + {0.505393,-0.929868}, + {0.693728,-0.168896}, + {1.295575,0.330245}, + {0.197670,-0.003298}, + {-0.644899,-0.599500}, + {0.369732,-0.579213}, + {-0.403831,-1.208236}, + {0.102628,0.417057}, + {0.225578,1.013419}, + {-0.251294,-0.004769}, + {0.889491,1.815880}, + {-1.038993,0.521891}, + {0.764166,-0.213457}, + {-0.562020,-1.509213}, + {0.211293,-0.936981}, + {-0.463538,1.090030}, + {-0.553620,-0.791400}, + {0.611880,-0.306484}, + {0.044468,-0.166676}, + {-0.023328,-1.778915}, + {-0.214294,-0.414020}, + {-0.756939,-1.513298}, + {0.250125,-0.882986}, + {1.120913,-0.169637}, + {0.645831,-0.162204}, + {1.177705,-0.888318}, + {0.363945,-0.029949}, + {0.402238,-0.546777}, + {-0.094455,-0.101378}, + {0.164174,0.060548}, + {-0.169991,-1.176339}, + {-0.374419,-0.123020}, + {-0.914397,-0.405280}, + {-0.853371,-0.380429}, + {1.609595,1.394657}, + {0.488861,0.494798}, + {0.158526,0.345015}, + {0.803121,0.150331}, + {-0.081292,0.181697}, + {0.393064,-0.478711}, + {0.279182,0.092095}, + {0.430334,-0.073225}, + {0.014806,0.588098}, + {0.913267,0.970571}, + {0.646704,0.609592}, + {0.566444,0.775254}, + {-0.335177,1.080688}, + {0.127562,1.140199}, + {0.165559,-0.264557}, + {-1.069915,-0.891586}, + {0.507922,-0.743511}, + {-0.734341,1.039713}, + {-0.738939,-0.058723}, + {0.759593,-1.014583}, + {0.555667,-1.733928}, + {-1.367914,-1.030299}, + {0.188542,-0.418601}, + {0.793444,-0.741383}, + {-0.040384,0.198946}, + {1.361842,-0.048743}, + {-0.225959,0.500185}, + {-0.613758,-0.930241}, + {-1.065079,-1.626019}, + {-1.661331,0.447628}, + {-1.178209,-1.594785}, + {0.385772,0.687990}, + {0.320431,0.326874}, + {-0.209635,0.241160}, + {-0.478316,-0.322029}, + {-1.574782,0.928755}, + {-0.150281,0.335387}, + {0.346979,0.106675}, + {-0.979085,-0.448834}, + {-0.484871,-0.130679}, + {-0.882404,-0.284669}, + {-0.135947,1.428153}, + {0.289974,0.663804}, + {-0.832558,-0.786738}, + {0.566306,1.650858}, + {-0.618622,-0.104784}, + {-0.597685,-0.212515}, + {1.865293,1.206891}, + {0.617878,-0.378103}, + {-0.276038,1.353459}, + {0.879395,0.084117}, + {-0.648554,-0.500746}, + {0.603251,-0.759062}, + {-1.056790,0.769620}, + {0.451470,-0.190342}, + {1.668428,-1.349133}, + {-0.399983,-1.187873}, + {-0.876715,0.206248}, + {0.800569,-0.255028}, + {0.108497,1.535395}, + {-0.321630,0.307984}, + {-0.010085,-1.543582}, + {0.733422,-0.807197}, + {-0.527735,0.361278}, + {0.546397,-0.913698}, + {0.386942,-0.026931}, + {-0.683948,1.644054}, + {-0.713074,-0.760496}, + {0.729880,0.611484}, + {-0.324111,-0.185442}, + {0.513507,0.655970}, + {0.973032,0.708102}, + {0.162839,-1.911128}, + {0.171333,0.442628}, + {0.793978,0.363283}, + {0.139764,-0.553196}, + {1.477350,0.571024}, + {0.046847,-0.083842}, + {0.774276,0.538647}, + {-1.232450,-0.279392}, + {0.998783,0.699271}, + {-2.497752,0.890340}, + {-0.686000,-0.489450}, + {-0.622210,0.728997}, + {-0.896078,-0.269973}, + {0.254307,0.947307}, + {1.029120,0.030115}, + {-0.457637,0.586413}, + {-0.570341,0.796948}, + {-0.326200,0.703162}, + {0.718013,-0.641897}, + {-0.347796,-0.117920}, + {0.980266,-0.427121}, + {0.715130,0.436598}, + {-0.354809,-0.981161}, + {0.609447,0.117866}, + {-1.117899,1.185150}, + {-0.070233,0.421426}, + {0.362961,-0.220281}, + {0.091918,-0.947668}, + {-0.918369,0.893874}, + {1.165251,0.420864}, + {1.432566,-0.178810}, + {-0.356868,-0.188257}, + {-0.815491,-0.404427}, + {-1.070312,-1.216305}, + {-0.318984,-0.583511}, + {1.848678,0.453940}, + {-0.708129,0.177312}, + {-0.893931,1.710539}, + {0.093921,0.348349}, + {1.105949,0.999284}, + {0.967769,-0.721817}, + {0.937282,0.156570}, + {1.436906,1.511836}, + {0.508619,-0.010131}, + {-0.069583,-0.309253}, + {0.108287,0.135978}, + {-0.739620,-0.139477}, + {-0.651608,1.778285}, + {0.027295,-0.276027}, + {0.751467,0.405693}, + {-0.350001,1.687277}, + {0.358628,-0.135793}, + {1.669210,-0.094304}, + {0.563354,0.389800}, + {-0.248111,-0.198466}, + {0.074279,-0.311566}, + {0.205118,-0.722409}, + {0.284728,0.431713}, + {-0.299721,0.775480}, + {0.288778,1.204617}, + {-2.612038,1.096907}, + {0.138972,0.125366}, + {0.298215,0.304176}, + {-0.193236,1.529766}, + {0.485275,-0.982963}, + {0.725341,-0.936405}, + {-0.065237,0.208370}, + {0.125534,-0.205573}, + {-1.821296,0.674082}, + {-0.275038,0.327760}, + {-0.727191,-1.227306}, + {-0.865239,0.939065}, + {-0.803833,1.620915}, + {-0.842433,-1.108209}, + {-0.401148,-0.736410}, + {-0.115040,-1.629236}, + {-2.049102,-0.888722}, + {0.563586,-1.881832}, + {0.500135,0.870559}, + {-0.623029,-1.087557}, + {0.560799,-0.777685}, + {-0.023666,-0.920057}, + {0.514122,-0.387123}, + {0.330311,-0.267867}, + {0.141501,-0.770913}, + {0.895122,1.295559}, + {0.235886,-0.142025}, + {-1.600266,1.392146}, + {0.062394,-0.199017}, + {0.105093,0.847228}, + {-0.004692,-0.611023}, + {-1.105202,-0.676440}, + {-0.803199,0.080607}, + {1.068037,-1.432548}, + {-0.073955,0.534296}, + {-1.544967,-0.292418}, + {-0.018596,0.600587}, + {0.693918,0.111383}, + {0.875333,0.538827}, + {0.810163,0.603066}, + {-0.991128,0.633334}, + {1.410649,-0.273373}, + {-1.402586,0.048299}, + {-0.476167,-0.040214}, + {1.133741,0.893093}, + {-1.976746,0.495152}, + {-0.762297,-0.434453}, + {-0.407391,0.458918}, + {0.081289,-0.693117}, + {-0.901769,-0.566278}, + {0.294244,0.018293}, + {-1.778410,0.169995}, + {-0.065897,-0.565356}, + {-0.067741,-0.386928}, + {-0.042227,-0.470778}, + {-0.724262,-0.448146}, + {0.799391,-0.353504}, + {0.736085,-0.189575}, + {-0.170609,-0.001362}, + {-0.876784,-0.416884}, + {-1.194944,-1.159666}, + {0.378294,-0.050373}, + {2.029991,0.034750}, + {0.488729,0.272216}, + {0.100163,0.084453}, + {0.619746,0.787200}, + {1.516011,0.190597}, + {0.242183,-0.282804}, + {1.348479,0.195434}, + {1.574083,0.044098}, + {-1.648078,0.005385}, + {-0.240798,0.327597}, + {-0.072394,-0.742375}, + {-0.357626,-0.537052}, + {-1.019427,-1.502025}, + {0.265137,1.275985}, + {-1.408237,0.487417}, + {0.488564,0.094077}, + {0.538473,0.089383}, + {0.822984,-0.041699}, + {0.446649,0.965423}, + {0.425275,0.258184}, + {0.293588,-0.009747}, + {-1.901312,0.094518}, + {0.055270,0.104028}, + {0.717610,-0.083141}, + {-1.028907,0.529666}, + {0.276336,-1.707147}, + {0.518490,0.271655}, + {-0.157786,-0.735939}, + {-0.642959,0.105473}, + {-0.194654,0.744489}, + {1.057427,0.578372}, + {-0.078556,0.535382}, + {0.275007,0.425924}, + {-1.493477,0.323239}, + {0.384662,-0.732389}, + {-0.458062,-0.246727}, + {-0.009941,-0.256232}, + {-0.431288,0.694332}, + {1.237922,-0.196164}, + {0.049717,-0.417202}, + {-0.828197,0.209999}, + {-1.328594,-0.698908}, + {0.817510,1.298454}, + {0.021412,-0.376025}, + {0.656062,-0.479696}, + {0.739794,-0.697219}, + {0.359927,0.330324}, + {0.490626,-1.394430}, + {0.003006,-0.052538}, + {0.188833,0.728305}, + {-1.187172,0.758908}, + {-0.519732,-1.148840}, + {-0.411235,-1.217214}, + {0.955021,-0.430176}, + {-0.523480,-0.587903}, + {-1.227340,0.033012}, + {0.122805,-0.649916}, + {0.990446,-0.160799}, + {0.217109,0.439570}, + {0.197974,-0.855599}, + {-1.016884,-0.834066}, + {-0.685161,0.797699}, + {0.718871,0.735908}, + {-2.084638,-0.653982}, + {0.229928,0.252590}, + {0.876971,-1.135835}, + {0.208727,-1.096199}, + {0.189714,0.324005}, + {0.559235,0.891645}, + {-0.337588,1.226503}, + {-0.633028,1.304579}, + {0.352611,0.118112}, + {0.755508,-1.202909}, + {-0.368064,0.379022}, + {0.187482,0.040502}, + {-0.489215,-0.316624}, + {-0.148897,1.794500}, + {0.617933,0.380534}, + {0.724284,0.929908}, + {-0.101068,0.829591}, + {0.239707,0.830689}, + {1.419880,-0.703233}, + {0.428630,-0.738185}, + {0.188227,-0.067175}, + {0.848946,-0.139604}, + {1.358890,-0.759908}, + {-0.598246,-1.356423}, + {0.708571,-0.747022}, + {-1.307309,-1.158771}, + {1.114919,0.003653}, + {0.247448,0.759891}, + {0.629880,-0.013493}, + {0.581883,-0.841438}, + {-0.348783,0.559365}, + {0.553004,0.045767}, + {-0.689707,0.334441}, + {0.783204,0.262356}, + {1.422351,-0.205031}, + {2.033491,0.619792}, + {-0.663187,-0.541048}, + {0.546304,0.061896}, + {0.954720,1.149216}, + {-0.559310,0.175198}, + {1.274649,1.348253}, + {-0.247850,-0.207347}, + {1.742038,1.103291}, + {0.043844,-0.424239}, + {0.614981,-0.080676}, + {-0.517806,1.025811}, + {0.801125,-0.606164}, + {0.473503,0.520220}, + {-0.308974,0.331494}, + {-1.295514,-0.646832}, + {-0.472990,-0.230161}, + {0.174489,-0.366097}, + {-0.118363,-0.163279}, + {-0.200880,-0.899742}, + {0.998390,-0.199202}, + {-0.622541,-0.695766}, + {0.669754,-0.206478}, + {0.106122,0.549600}, + {0.591344,0.214104}, + {0.488377,0.644834}, + {1.136572,1.169122}, + {0.323891,0.444824}, + {-0.562209,-0.060314}, + {0.213956,-1.280496}, + {-0.321971,-1.103028}, + {0.672409,-0.083641}, + {0.495207,0.706465}, + {-0.494982,1.309929}, + {0.994709,-0.975631}, + {0.059966,-0.007228}, + {1.295286,0.210362}, + {-1.155912,0.093655}, + {-0.270843,0.470326}, + {0.756844,0.345241}, + {0.514597,0.140073}, + {-0.621769,0.148131}, + {0.357821,-0.203675}, + {-0.273598,-0.884954}, + {-0.849266,-0.397208}, + {-0.405585,-1.645132}, + {-0.010028,-0.355219}, + {-0.143243,0.535060}, + {-0.489155,0.541734}, + {-1.917934,0.442072}, + {1.120600,0.609251}, + {-0.806215,-0.431671}, + {1.317120,-1.219868}, + {0.067240,1.040216}, + {-0.567193,-1.387665}, + {0.795042,0.402961}, + {-1.025794,-0.277941}, + {0.649983,1.281336}, + {-0.256848,0.005927}, + {0.607023,0.715590}, + {0.540951,-0.424004}, + {-0.353391,1.289066}, + {1.755964,-0.674437}, + {-0.664991,-0.691634}, + {-0.096792,0.422837}, + {-1.167967,0.555492}, + {0.152719,-0.072909}, + {0.116643,0.226822}, + {-0.630662,-0.558520}, + {0.414169,-0.530572}, + {0.717343,-0.343964}, + {0.485011,-0.965124}, + {0.132872,-1.176696}, + {-0.542650,-0.059320}, + {-0.771646,-0.399126}, + {-0.848580,0.963529}, + {0.186147,0.262803}, + {0.352650,0.664986}, + {0.993840,0.913475}, + {-0.484132,-0.800343}, + {0.680518,0.491133}, + {-0.187661,0.025441}, + {-0.647229,0.234518}, + {1.007825,-0.196186}, + {0.956857,-1.015468}, + {-0.722691,-1.369092}, + {0.254518,0.088674}, + {0.029979,-0.009861}, + {0.301615,0.155056}, + {0.039314,0.343316}, + {0.145456,1.183385}, + {0.775872,0.441937}, + {-0.305562,-1.261231}, + {-0.509677,-1.261546}, + {-0.452788,-0.152168}, + {-0.024417,0.566667}, + {0.156338,0.402470}, + {0.451700,-0.516105}, + {0.517440,0.675626}, + {0.108431,0.416795}, + {-0.764284,-0.532834}, + {1.206985,0.069426}, + {-0.932342,1.046480}, + {-0.777393,0.052027}, + {-1.092549,0.033582}, + {0.197445,-0.491148}, + {-0.411677,-0.336139}, + {-0.037210,-0.926280}, + {-0.708483,0.693739}, + {0.664921,-1.385649}, + {-1.353380,1.021171}, + {-0.241049,-0.683939}, + {-0.029907,0.167199}, + {-1.608903,-0.559216}, + {-0.181052,0.821785}, + {1.590072,-1.518116}, + {1.057565,-0.689682}, + {-1.281043,-0.980591}, + {0.304693,-1.080609}, + {-0.240484,0.707799}, + {-0.768310,-0.067520}, + {0.843861,-0.009503}, + {0.807601,-0.431015}, + {-0.512754,-0.550360}, + {1.284096,-1.260585}, + {-0.922574,0.298207}, + {-0.393917,-0.519193}, + {0.127912,-0.984685}, + {-0.144986,0.035279}, + {0.188536,0.393360}, + {0.259745,-0.309148}, + {-0.677779,-0.595934}, + {-0.037591,-0.101627}, + {-0.309109,0.365495}, + {-0.102452,1.566645}, + {1.387901,-0.195166}, + {-0.446879,-0.526524}, + {0.997398,-0.882687}, + {0.031554,0.124163}, + {-0.931075,0.093264}, + {0.482681,1.855809}, + {-0.010467,0.925571}, + {0.169549,0.122786}, + {-0.090570,-0.028792}, + {0.849088,-1.107529}, + {0.050598,0.536702}, + {-0.571372,0.390521}, + {0.337937,0.089426}, + {-0.070935,-0.296006}, + {-0.543102,-0.683296}, + {-0.082528,1.188412}, + {-0.075670,0.684850}, + {0.217929,0.127319}, + {0.244448,0.690258}, + {-0.526178,0.479326}, + {-0.126780,1.089720}, + {0.456035,-0.008824}, + {-0.236651,0.009875}, + {-0.671016,-0.961407}, + {0.700866,0.834313}, + {-0.049151,0.411310}, + {0.069039,0.176343}, + {1.372698,0.367522}, + {-0.107484,0.090397}, + {-1.242871,0.580082}, + {0.352131,0.516255}, + {-0.409130,-0.283403}, + {0.399885,-0.173183}, + {-0.911535,-1.057501}, + {-0.134356,-0.571363}, + {-0.200745,-0.714382}, + {0.247331,-1.213185}, + {-0.183543,0.319417}, + {-0.359287,-0.789582}, + {-0.258945,-0.568476}, + {0.371024,-0.265164}, + {-0.075029,-1.608623}, + {0.082652,2.076230}, + {-1.223628,-1.586630}, + {0.405567,0.823574}, + {0.054968,0.521170}, + {-1.478086,0.062628}, + {0.111418,-0.029518}, + {-1.266318,0.854860}, + {0.944464,-0.835138}, + {0.460958,0.185149}, + {-0.058453,0.047748}, + {0.078237,-0.159788}, + {0.734696,0.268869}, + {0.027735,-1.024541}, + {0.228605,-1.028311}, + {-0.264515,0.187069}, + {0.016598,0.390539}, + {0.080454,0.084167}, + {-0.373853,-0.258455}, + {0.496835,-0.132385}, + {-1.257065,0.046987}, + {0.335159,0.020590}, + {0.466133,0.439269}, + {0.014981,1.110095}, + {0.785194,0.155149}, + {-0.920996,-0.294657}, + {-0.108107,0.667374}, + {-0.074103,0.487597}, + {0.309323,0.450575}, + {1.192132,0.937428}, + {-0.334944,-0.222933}, + {0.412831,-1.114841}, + {0.239488,-0.354992}, + {0.444740,-0.426829}, + {-0.133782,0.466919}, + {-0.488809,0.609075}, + {0.312304,-0.261759}, + {-0.790404,-0.962166}, + {-0.274962,-0.943480}, + {-0.063458,0.313199}, + {0.754376,-0.624958}, + {0.894785,0.254635}, + {-0.454480,-0.679299}, + {-0.017854,-0.594485}, + {-0.423178,-0.160964}, + {-0.458684,-0.155883}, + {-0.663973,0.506733}, + {0.541449,-0.654020}, + {0.172654,0.253066}, + {1.021464,-0.901336}, + {0.111092,-0.491099}, + {0.252050,-0.769468}, + {-0.617856,0.312547}, + {-0.409293,-1.120223}, + {0.039604,-0.485376}, + {-1.493487,0.335907}, + {0.274749,0.723980}, + {-0.203481,-0.723032}, + {-0.495656,-0.759281}, + {1.456744,-1.628369}, + {-0.975111,0.016837}, + {-0.622091,1.044867}, + {-0.434081,-0.462833}, + {-0.315109,-0.189411}, + {0.081910,-0.831801}, + {-0.414067,0.096517}, + {0.024855,-0.006315}, + {-0.505820,0.029401}, + {0.677997,-0.561131}, + {1.161094,-0.385332}, + {0.171413,-1.071286}, + {0.796474,0.125143}, + {0.737257,0.495755}, + {-0.760664,0.609637}, + {0.050209,0.872019}, + {-0.779293,-0.049293}, + {-0.084521,-0.987525}, + {0.836932,0.679155}, + {0.295252,-0.767659}, + {-0.018792,0.419797}, + {-1.163658,0.443970}, + {-0.266127,-0.327858}, + {0.087685,-1.161947}, + {-0.369729,0.762725}, + {0.172665,-0.329469}, + {0.330880,0.749120}, + {-0.816435,-0.491657}, + {0.111348,-1.505915}, + {0.209077,0.184622}, + {-2.342060,-0.110587}, + {0.307412,0.700396}, + {0.113512,-0.465633}, + {-0.646155,0.716656}, + {-0.638825,-1.478782}, + {0.450901,-0.035870}, + {0.035266,1.827315}, + {0.737470,-0.119507}, + {-0.228202,0.108246}, + {0.825314,0.200114}, + {0.487949,0.471538}, + {-0.357296,0.391417}, + {0.180314,0.346172}, + {0.559934,0.139351}, + {-1.305116,0.414318}, + {0.716210,0.212909}, + {-0.013896,1.197851}, + {-1.824869,-0.867501}, + {-0.515474,0.050329}, + {-0.414146,-0.076725}, + {0.708817,-1.133978}, + {-0.639175,0.428318}, + {1.050038,0.727185}, + {-0.702393,0.513455}, + {0.276582,0.809652}, + {0.077934,0.198272}, + {2.196177,0.991960}, + {-0.440575,-1.385910}, + {0.706450,-0.276282}, + {-0.391529,0.375718}, + {0.486569,-0.694199}, + {-0.074971,-1.160590}, + {0.662076,0.018694}, + {0.336811,-0.550141}, + {-0.387020,-0.397890}, + {-0.096345,0.269838}, + {-0.026117,-0.057475}, + {0.158403,-0.187549}, + {0.420344,-0.129844}, + {0.190663,-0.087482}, + {-0.366855,0.893119}, + {-0.249219,0.316325}, + {-0.117221,-0.587177}, + {-1.294407,1.470405}, + {0.418475,-0.548199}, + {1.001920,-0.042350}, + {-0.292716,-0.515533}, + {-1.153163,0.988116}, + {-0.289238,-0.720697}, + {-0.106232,-1.124727}, + {-0.965999,0.865133}, + {-0.401036,0.078021}, + {-1.109930,-0.864017}, + {0.297575,0.865459}, + {0.995143,0.682193}, + {-0.599609,-1.702099}, + {0.883933,-0.307388}, + {0.802376,-0.004978}, + {-0.401257,0.112706}, + {0.384942,-1.000741}, + {-0.989461,0.937746}, + {0.964376,-0.361083}, + {1.014743,-0.689544}, + {-1.640868,0.131432}, + {0.631133,-0.101351}, + {0.185813,0.273002}, + {-1.225259,-0.530792}, + {1.054923,0.095617}, + {-0.207572,0.807720}, + {0.950261,-0.272710}, + {-0.842451,1.027046}, + {-0.948909,0.464619}, + {-0.652197,-0.593345}, + {0.386114,0.647057}, + {-0.348600,-0.148170}, + {0.035874,-0.075556}, + {-0.566582,0.252229}, + {-1.150907,0.142389}, + {-0.373560,0.708924}, + {0.179962,0.177331}, + {0.017741,1.577087}, + {-0.489230,-0.574279}, + {-0.239784,0.779613}, + {-0.897308,-0.203218}, + {0.925241,0.527958}, + {1.036630,0.416062}, + {0.888976,0.209959}, + {0.455977,0.361892}, + {0.395073,0.243300}, + {0.499225,0.860184}, + {1.188627,0.506501}, + {-0.358162,-0.525381}, + {1.769127,-0.519498}, + {-0.973750,0.263258}, + {0.081556,-0.101205}, + {1.293777,0.240134}, + {0.128978,-1.442584}, + {0.092528,-0.197125}, + {-0.117172,-0.490877}, + {-0.946199,-0.606982}, + {0.652803,-0.511129}, + {0.043937,-0.032281}, + {0.284060,0.005765}, + {-0.734968,-1.145450}, + {-0.025606,-0.626951}, + {-0.375895,0.717175}, + {0.438582,0.918001}, + {0.038609,-1.114450}, + {1.118108,0.106149}, + {1.272686,0.846763}, + {0.633646,-0.105666}, + {-0.205043,0.210912}, + {-0.334164,-0.085337}, + {-0.206717,0.894467}, + {-0.085313,1.097756}, + {-0.399149,-0.100234}, + {-0.149590,0.007444}, + {0.494023,-1.223272}, + {-1.126557,-0.292829}, + {1.506312,-0.733856}, + {0.129777,-0.464705}, + {-0.430088,0.615048}, + {1.070713,1.226466}, + {-0.500223,-0.890256}, + {0.241018,-0.691634}, + {-0.425803,-1.598684}, + {-0.349414,0.668187}, + {-0.759980,-1.039801}, + {0.099818,0.588593}, + {0.661566,-0.452644}, + {-0.276551,-0.245314}, + {0.062076,0.738192}, + {-0.436350,-1.545334}, + {-0.338107,0.327650}, + {-0.671510,-0.169933}, + {-0.250838,-0.394788}, + {-0.716007,0.057696}, + {0.716020,0.323465}, + {0.287767,-0.496472}, + {-1.361017,-1.022037}, + {-0.389014,-0.327876}, + {0.005581,0.230345}, + {1.057323,0.344696}, + {0.404404,0.524537}, + {0.213022,1.094306}, + {-0.594658,-0.593064}, + {-0.748241,0.800080}, + {-0.115638,-0.166546}, + {-0.107154,-0.697047}, + {-0.458238,-0.452683}, + {-0.336989,-0.047009}, + {-1.289175,1.647780}, + {0.150375,-0.407781}, + {0.597241,-0.547383}, + {0.443295,0.936489}, + {0.590847,-0.187656}, + {-1.212900,0.882074}, + {0.484389,-0.686777}, + {1.149782,-0.194390}, + {-1.172668,0.032417}, + {0.260298,-1.012974}, + {-0.294107,-1.012750}, + {0.801182,0.633359}, + {0.239464,0.241602}, + {-0.881659,-1.163284}, + {0.489810,-0.463799}, + {0.565567,0.113305}, + {-0.556349,-1.347072}, + {-1.062547,-0.931198}, + {-0.738569,-0.353611}, + {1.317955,-1.099776}, + {0.148693,-0.201014}, + {0.133189,0.681195}, + {-0.120725,0.135954}, + {0.109002,-0.457197}, + {-0.694733,0.709827}, + {0.529587,0.628810}, + {-1.078803,0.606417}, + {-0.135627,1.108991}, + {0.037637,-1.260746}, + {-1.080624,1.191058}, + {0.359973,0.135705}, + {0.232936,0.269440}, + {0.002593,-0.783674}, + {-0.069699,1.212021}, + {-0.664211,-0.740183}, + {0.165729,0.041761}, + {-0.317411,0.070021}, + {-0.172353,-0.428702}, + {0.332293,-0.774738}, + {-0.917322,-0.820716}, + {-0.058246,-0.746256}, + {0.477261,-0.232573}, + {-0.644001,0.166028}, + {-0.429890,0.847238}, + {-0.056154,-1.187696}, + {-0.879377,-0.311314}, + {-0.187718,-0.505879}, + {0.145068,0.268477}, + {0.344934,-0.459281}, + {-0.892009,-0.676237}, + {-0.648511,-0.152063}, + {0.285463,0.019339}, + {-0.020319,-0.901552}, + {-0.937522,0.163649}, + {-0.431348,-0.446665}, + {-0.614010,-0.352647}, + {0.890186,-0.313942}, + {0.187972,0.408152}, + {-0.040763,-0.587026}, + {-1.192632,-0.395902}, + {-0.089341,0.188121}, + {-1.109439,0.101585}, + {-1.721289,-1.011886}, + {-0.451708,0.401072}, + {-0.878256,-0.235344}, + {0.572753,-0.329785}, + {-1.136417,1.039607}, + {-0.433782,-0.120676}, + {0.567816,0.084631}, + {0.546969,-0.179829}, + {0.225644,-0.412318}, + {0.171741,0.816235}, + {-1.141608,-0.629613}, + {-0.537893,-0.566981}, + {0.734572,1.390754}, + {0.099797,-0.210714}, + {-0.603835,-0.911116}, + {-0.919496,0.154357}, + {-0.200722,-0.585775}, + {0.721968,0.331313}, + {0.561601,0.473508}, + {0.550664,-0.258516}, + {-0.237893,0.651197}, + {-0.756266,0.166779}, + {-0.705900,0.481691}, + {-0.006736,0.003238}, + {0.955769,0.739538}, + {-1.102150,-2.203276}, + {-0.152229,-0.119703}, + {-0.498020,0.338978}, + {1.435975,0.240195}, + {0.009239,2.011670}, + {0.176554,0.774631}, + {-0.793129,0.211589}, + {-0.072293,0.240170}, + {0.881402,0.528900}, + {0.458104,0.297768}, + {1.425877,-0.725340}, + {-1.097623,-0.304087}, + {-0.127377,-0.767495}, + {-0.019548,0.382421}, + {0.498701,1.214140}, + {0.443213,-0.118249}, + {-0.071224,-0.014039}, + {0.630956,-1.420196}, + {1.092859,-0.858199}, + {0.601709,-0.454233}, + {0.061239,-0.833424}, + {-0.018905,0.604909}, + {0.465324,-1.778430}, + {-0.755851,0.803587}, + {1.085178,-0.492003}, + {0.820772,-0.064660}, + {0.125793,-1.132899}, + {0.315742,-0.133927}, + {0.890772,0.347966}, + {0.509473,-0.904259}, + {0.313390,-1.242697}, + {-0.183140,-0.195672}, + {-0.664699,-0.149961}, + {1.498274,-0.991017}, + {-1.516974,-0.399403}, + {-0.916197,0.142253}, + {0.040795,-0.428170}, + {-0.845305,0.260543}, + {1.148172,1.459513}, + {-0.079861,0.168896}, + {0.687934,0.865708}, + {-0.536824,0.124210}, + {-0.692623,-1.014247}, + {-1.316924,-0.789046}, + {0.636503,-0.209795}, + {0.552650,0.090913}, + {-0.033354,0.150511}, + {1.249451,-0.206799}, + {0.901957,-0.045704}, + {-0.268462,0.797655}, + {-0.295622,-0.834320}, + {-0.623560,0.392378}, + {0.753139,-0.171098}, + {-0.315586,-0.093971}, + {-0.171782,0.310994}, + {-0.584684,-1.313163}, + {0.305928,1.064417}, + {0.262624,-0.763970}, + {-0.460683,-1.066815}, + {0.775057,0.025142}, + {-0.476420,0.420022}, + {-0.123804,-0.614338}, + {0.107369,-0.775216}, + {1.000481,-0.185825}, + {0.204721,0.528385}, + {0.234913,0.036659}, + {-0.580442,0.580949}, + {1.199714,-0.639281}, + {-0.175095,-1.293234}, + {0.211567,-1.011604}, + {0.534241,0.104124}, + {0.475270,0.112080}, + {-0.296861,0.570522}, + {-0.006516,-0.807378}, + {1.324154,0.366234}, + {0.385646,0.663829}, + {0.952289,-0.020348}, + {-0.107272,-0.904948}, + {-0.430374,-0.791322}, + {0.023816,0.049091}, + {-0.739512,-0.394887}, + {0.267303,0.220767}, + {0.585441,-0.615484}, + {-0.174586,-0.975560}, + {-0.857831,0.240895}, + {-0.578808,0.608267}, + {-0.618652,-0.737440}, + {-1.703410,1.076574}, + {0.239973,-0.524723}, + {-0.877083,0.885381}, + {0.364504,-1.546471}, + {0.843914,1.160001}, + {1.150505,1.071204}, + {-0.370583,-0.153527}, + {-0.146237,-1.166747}, + {1.580330,0.835601}, + {1.183807,-0.290036}, + {0.408171,0.697836}, + {-1.363711,1.276123}, + {0.003091,-0.751142}, + {0.892821,1.683361}, + {-0.181868,0.148855}, + {0.247007,-0.270453}, + {-0.864199,-0.144221}, + {0.131680,-1.468996}, + {1.015785,0.628468}, + {0.080450,-0.687172}, + {-0.209898,0.096785}, + {0.759138,-0.425614}, + {-0.758907,-0.363425}, + {0.295546,-0.675126}, + {0.137910,0.585381}, + {-0.615761,-0.004313}, + {0.900616,0.336981}, + {1.909880,-0.158311}, + {-0.634418,-0.790108}, + {-0.475383,0.335938}, + {-0.438158,1.008165}, + {-0.066609,-0.342591}, + {1.040649,0.129256}, + {-0.317508,0.138331}, + {-0.934472,0.287414}, + {-0.822846,-0.707184}, + {0.013228,0.200951}, + {-0.192966,0.231664}, + {0.702280,-0.035047}, + {1.601308,-0.110163}, + {0.968228,0.484041}, + {0.267920,1.208324}, + {0.387431,0.257585}, + {0.137627,-0.038053}, + {-0.533791,-0.592955}, + {-0.208416,-0.090015}, + {1.242265,-0.575457}, + {-0.093360,0.612640}, + {0.474705,1.164073}, + {-0.223268,-0.303550}, + {0.725415,0.987524}, + {-0.792211,0.833725}, + {-0.127078,0.253060}, + {1.032843,-0.053796}, + {-0.611660,0.688883}, + {0.020020,-0.682951}, + {-0.061453,1.055994}, + {0.159875,0.842203}, + {1.073916,0.515861}, + {-1.002761,0.703949}, + {-0.433069,-0.241907}, + {-0.485950,0.355489}, + {0.046573,0.251588}, + {0.594776,1.519930}, + {-0.353550,-0.125344}, + {0.019352,-0.371083}, + {0.567640,-0.653759}, + {-0.250529,0.176770}, + {-0.406982,0.103083}, + {0.373635,0.728257}, + {1.588916,-0.649808}, + {-0.478022,-0.050687}, + {0.377243,0.193279}, + {-0.036592,-0.246075}, + {1.520919,1.009384}, + {0.159340,0.341124}, + {-0.463280,0.378020}, + {-0.035160,0.543988}, + {0.118358,0.710502}, + {-0.619443,0.780539}, + {0.191851,0.377155}, + {-0.776310,-0.116329}, + {-0.276307,-0.043138}, + {-1.211908,0.346911}, + {0.079369,-0.858422}, + {0.016724,0.926178}, + {1.256652,-0.481102}, + {-0.806248,0.229023}, + {0.044788,0.119707}, + {-0.262081,0.272806}, + {0.932057,-0.006805}, + {0.544372,-0.095148}, + {-1.383816,-1.364462}, + {-0.358308,1.050147}, + {0.273473,-0.855889}, + {-0.003535,0.064740}, + {-0.833668,-1.139499}, + {-0.191707,0.659760}, + {-0.462448,0.173778}, + {-0.025911,0.309467}, + {-0.460535,0.971118}, + {1.307444,1.320250}, + {1.627809,0.805101}, + {0.508275,-0.630378}, + {-0.234563,1.086843}, + {-0.122915,0.361400}, + {-0.915180,0.611521}, + {-0.286575,-0.818160}, + {0.182178,0.788028}, + {0.604783,-0.208278}, + {0.359150,1.039738}, + {-0.992256,0.972576}, + {0.106132,-1.299370}, + {-0.162884,1.643172}, + {-0.338271,0.643220}, + {-0.862948,-0.463959}, + {0.326343,0.010285}, + {-0.098661,-0.720012}, + {0.058748,0.476613}, + {-0.313979,0.106628}, + {0.342506,-1.683328}, + {-0.675662,0.430103}, + {-0.378889,-0.229145}, + {1.071848,0.353785}, + {-0.028918,-0.457589}, + {0.480169,1.182056}, + {-0.186146,0.337164}, + {0.032820,-0.383106}, + {-0.716018,0.172634}, + {-0.408182,-0.131892}, + {0.656507,-1.192520}, + {-0.081387,-1.758375}, + {0.157451,0.629884}, + {-0.501019,0.814047}, + {-0.998292,-0.030481}, + {-0.562935,0.654219}, + {0.092469,-0.943344}, + {0.875478,0.782977}, + {0.136500,0.716997}, + {-0.130205,0.061150}, + {0.772493,-0.787669}, + {-0.069071,-1.069128}, + {0.020852,0.155118}, + {-0.691191,-0.378006}, + {0.037354,-0.996423}, + {1.281753,-0.929153}, + {-0.426147,-0.438014}, + {0.112682,1.190760}, + {-0.025867,-0.051631}, + {0.855843,0.245861}, + {-1.283729,0.078821}, + {0.082616,0.423985}, + {0.650177,0.257912}, + {-0.288642,-0.113135}, + {-0.309283,0.956368}, + {0.275866,0.777270}, + {1.063946,-0.850517}, + {-0.114175,-0.925831}, + {-0.197025,0.160165}, + {0.188163,0.770923}, + {0.725416,-0.238262}, + {0.532756,0.332611}, + {0.110235,0.733467}, + {0.568374,-0.980107}, + {0.264085,-0.102002}, + {0.128516,0.242100}, + {-0.326246,0.476676}, + {0.177628,1.005675}, + {0.183542,-0.730819}, + {0.560809,0.026720}, + {-0.555138,-0.837223}, + {-1.111326,-0.738718}, + {-0.573157,1.307743}, + {0.039276,-0.375639}, + {-0.610247,0.441594}, + {0.288641,-0.912492}, + {1.190911,0.545295}, + {0.782747,0.523818}, + {-0.489349,-0.232879}, + {-0.020657,-0.703896}, + {0.073902,0.609629}, + {0.772461,-0.210514}, + {-0.035950,0.573090}, + {0.973263,0.098002}, + {0.573650,-0.286151}, + {-0.420773,0.322248}, + {0.828456,-0.527977}, + {1.858361,0.248676}, + {-0.216404,0.356862}, + {-0.646708,-0.483857}, + {-0.093864,-0.293461}, + {0.583492,-0.646171}, + {-1.115405,-0.181960}, + {1.366417,-1.845473}, + {-0.794050,0.390124}, + {0.467227,0.144103}, + {0.059131,1.012538}, + {0.365336,0.237803}, + {-0.484233,-0.485568}, + {-1.005855,-0.440960}, + {0.502362,-0.343204}, + {-0.153506,-0.221922}, + {1.040348,0.847320}, + {0.875955,0.856994}, + {0.134586,-0.579993}, + {0.979287,-0.133640}, + {0.552321,0.102281}, + {0.541191,-1.039863}, + {-1.155057,-0.141459}, + {-0.136017,0.538894}, + {-0.816461,0.275250}, + {-0.724677,0.192772}, + {0.326787,-0.010919}, + {0.117003,1.159378}, + {0.504487,-0.285180}, + {-0.855043,0.300502}, + {0.497492,1.177945}, + {-1.019849,-0.391640}, + {0.294492,-0.148558}, + {-1.105971,-1.574034}, + {-0.549529,0.276093}, + {1.612157,0.358384}, + {-0.490901,-0.027039}, + {0.169836,1.390746}, + {-0.194342,-0.284269}, + {-0.171289,0.586009}, + {0.440634,-0.241719}, + {-0.866231,0.075171}, + {0.604738,0.501042}, + {-1.268727,0.181187}, + {0.970697,0.307040}, + {1.049433,0.365987}, + {-0.498752,0.386423}, + {-0.025266,-0.505426}, + {-0.073175,0.049414}, + {-0.182412,1.089200}, + {-0.323381,-0.689772}, + {0.110545,-1.103422}, + {-0.264985,1.043266}, + {-0.572449,1.384650}, + {0.364356,0.676386}, + {0.022608,0.196732}, + {1.158744,2.048316}, + {0.765193,-0.520691}, + {0.612272,0.175707}, + {0.822290,-0.539943}, + {-0.029847,0.542674}, + {-0.046485,-0.527074}, + {-0.247289,-0.309464}, + {-0.123121,0.695817}, + {-0.585551,1.109341}, + {1.091744,-0.323955}, + {-0.258755,0.608515}, + {-0.359400,-0.617556}, + {0.213343,0.803480}, + {0.723600,-0.553256}, + {-0.919498,1.614200}, + {0.151235,-0.057427}, + {0.507107,0.231984}, + {-0.423361,-0.409427}, + {0.846366,1.210201}, + {-0.481114,-0.023277}, + {-0.021299,0.801072}, + {0.087164,0.162119}, + {0.648244,-0.593489}, + {-1.033972,-0.776052}, + {-0.910048,0.009627}, + {1.145802,-0.064943}, + {-0.863007,0.893723}, + {-0.063187,0.408214}, + {0.097570,0.371056}, + {0.055008,0.378266}, + {0.760486,-0.116970}, + {0.175700,-0.711182}, + {-1.061988,-1.515268}, + {-0.366716,1.634002}, + {-1.127267,0.259187}, + {-0.105613,-1.658119}, + {-0.956148,0.078537}, + {-0.789998,-0.046661}, + {-0.555772,0.241221}, + {-0.361317,0.374073}, + {0.542807,-0.644804}, + {-0.067211,-0.306273}, + {-0.313289,-0.762354}, + {0.944145,0.011802}, + {0.344604,0.581157}, + {-0.238694,-1.260077}, + {-0.499531,-0.040909}, + {1.081440,-0.013408}, + {-1.020259,-0.402582}, + {0.168469,-0.449379}, + {-0.322218,-0.352819}, + {0.417512,0.125277}, + {-0.179187,0.773391}, + {0.934511,0.154665}, + {0.668175,1.139319}, + {-1.109726,-0.697647}, + {-0.058986,-0.618589}, + {1.224662,-0.691357}, + {-0.344564,1.430847}, + {-0.198289,0.080758}, + {0.248374,-0.855443}, + {0.510391,0.972455}, + {-0.236303,-0.325335}, + {0.461915,-0.112654}, + {-1.113610,-1.548437}, + {-1.242013,-0.824333}, + {-0.071317,0.322042}, + {-0.489653,-0.266651}, + {0.049223,-0.240123}, + {-0.017929,0.190162}, + {-0.643566,-0.146084}, + {0.581599,0.459194}, + {-0.885802,-0.729123}, + {0.659102,1.113099}, + {0.604221,0.372455}, + {0.150965,-0.404922}, + {0.024189,-0.589169}, + {0.181120,-2.232684}, + {-0.109871,-0.604952}, + {-0.441800,-1.783353}, + {1.351005,0.201968}, + {0.226026,0.178360}, + {0.052492,0.086991}, + {1.777618,1.068832}, + {-0.332651,0.317066}, + {0.541455,-0.685652}, + {0.392310,1.079179}, + {-0.427805,-0.269735}, + {0.498657,-0.582363}, + {0.940945,0.355367}, + {0.265536,-1.458500}, + {0.449227,0.874282}, + {0.227071,-0.627270}, + {-0.093351,-0.097808}, + {-1.145261,-0.218075}, + {0.484358,1.069822}, + {0.996167,0.219158}, + {0.164768,0.888018}, + {-0.524378,-0.335536}, + {0.408570,0.683742}, + {0.520097,-0.352789}, + {0.528279,0.701878}, + {0.254929,0.657117}, + {-0.913148,-0.518469}, + {-0.444215,-0.199164}, + {0.123173,0.541502}, + {0.623248,0.013648}, + {0.876430,0.188051}, + {-0.745054,-0.440719}, + {1.370839,-0.341183}, + {-0.557997,0.053702}, + {0.504211,-0.772695}, + {1.925599,-0.732382}, + {1.134615,0.354443}, + {-0.823694,0.010852}, + {-0.010443,-0.137324}, + {0.583601,-0.844533}, + {0.664869,1.118130}, + {-0.000382,0.444552}, + {-0.646392,1.280645}, + {1.497105,0.917277}, + {-0.230933,-0.814139}, + {-0.618821,-0.230543}, + {0.004494,-0.586885}, + {0.188155,0.759926}, + {0.400992,-0.852580}, + {0.916116,0.173815}, + {0.164091,-0.226974}, + {0.428332,-1.030586}, + {-1.450546,-0.165323}, + {-0.743664,-0.984256}, + {1.239929,0.021010}, + {0.169317,0.059045}, + {1.351634,0.648103}, + {-0.725472,0.514575}, + {0.682044,0.646209}, + {-0.254000,-0.088715}, + {0.820242,0.000807}, + {-0.199804,-1.335055}, + {0.568600,-0.573050}, + {-0.372125,1.120332}, + {-0.080109,-0.217794}, + {-0.077319,0.183705}, + {0.610015,-0.768326}, + {0.531406,-0.197264}, + {0.374272,0.746575}, + {0.811771,-0.070560}, + {0.456952,0.828381}, + {-1.114625,-0.778551}, + {-0.677564,-1.195200}, + {-0.032155,-0.146667}, + {0.160033,-1.240192}, + {0.784846,-0.048669}, + {0.226182,-0.040282}, + {-1.385046,-0.704092}, + {0.539381,-1.102437}, + {0.385233,0.702485}, + {0.229480,0.119168}, + {-1.160470,0.285107}, + {-0.541554,0.585548}, + {-0.348345,0.770643}, + {-0.277295,0.505369}, + {0.072372,0.074768}, + {-1.171783,-0.243523}, + {0.704349,0.708709}, + {0.059024,0.631281}, + {0.065354,1.504243}, + {-0.835199,0.568548}, + {-0.460690,1.264099}, + {-1.828812,-1.061787}, + {0.003831,0.815100}, + {-1.209037,0.131804}, + {0.842161,-0.991327}, + {0.138250,-0.926978}, + {-0.127969,0.712464}, + {-0.350826,1.252760}, + {0.556596,0.709099}, + {-0.880338,-0.882393}, + {0.633947,0.831589}, + {1.535985,0.012752}, + {-0.110222,-1.560059}, + {-0.473637,-0.328046}, + {-0.183194,0.641908}, + {-1.074374,0.106450}, + {0.837744,-1.048600}, + {0.080980,-1.310010}, + {0.538448,-1.136176}, + {-0.596666,-0.628378}, + {-0.594768,0.340720}, + {0.251058,-0.190293}, + {-0.061235,0.142368}, + {0.563618,-0.663220}, + {-0.994710,0.799951}, + {-0.013219,-0.077868}, + {-0.260975,0.436012}, + {0.701558,-1.555042}, + {0.218937,-0.839333}, + {0.189052,-0.893478}, + {-0.825828,-0.108326}, + {0.179960,-0.454794}, + {-0.189811,-0.729981}, + {0.258641,0.734701}, + {1.033546,-0.851021}, + {-0.481548,1.060999}, + {0.550961,-0.495215}, + {-0.720159,0.605927}, + {-0.918472,-1.437412}, + {0.238061,0.359825}, + {-0.669119,-0.477539}, + {-0.393230,1.100341}, + {-0.294604,0.625805}, + {1.183505,0.325424}, + {0.656797,0.302560}, + {-0.264583,1.659226}, + {0.944444,0.759065}, + {0.363301,-0.931562}, + {0.321250,0.144317}, + {0.056304,0.033562}, + {0.396821,-0.081704}, + {-0.146098,-0.157071}, + {-0.567406,0.542368}, + {0.087811,-1.191284}, + {0.645851,-1.129586}, + {-0.480500,0.559676}, + {-0.512098,-0.692533}, + {-0.576949,-0.178230}, + {-0.312055,-1.312385}, + {-0.661092,-0.003298}, + {1.385371,0.073527}, + {0.749575,0.121531}, + {0.451503,-0.172923}, + {-1.720465,0.533779}, + {-0.558727,-0.163352}, + {1.161200,1.410997}, + {0.343344,-0.099791}, + {-0.065168,-2.180713}, + {0.350066,0.806381}, + {-0.286234,-0.192670}, + {0.073187,0.263513}, + {-0.757331,-0.586757}, + {0.984908,0.277915}, + {1.028605,0.961379}, + {0.644807,0.258389}, + {0.606982,0.266423}, + {-0.090490,0.787222}, + {0.184171,0.023188}, + {0.350628,0.158079}, + {0.778608,0.188059}, + {-0.930078,1.186364}, + {-0.671489,-0.012170}, + {-0.081454,0.351651}, + {1.178337,0.477150}, + {-0.455728,-0.782186}, + {0.891922,0.565029}, + {1.160296,-0.280368}, + {0.653268,0.357551}, + {1.540297,1.202347}, + {0.245353,0.959049}, + {0.243214,-0.407234}, + {-0.450652,1.435352}, + {-0.707209,1.169824}, + {-0.087597,0.734600}, + {0.280094,-0.507072}, + {-0.362702,0.385568}, + {-0.298647,-0.445275}, + {1.484539,-0.134123}, + {-0.714418,-0.484541}, + {0.183658,-0.100520}, + {-1.304078,-0.615248}, + {-0.145906,-0.378490}, + {-1.139469,0.513238}, + {-1.002350,-0.857683}, + {-0.662826,1.027047}, + {0.866330,-0.714924}, + {0.134961,-0.170331}, + {-1.346329,-0.335113}, + {-1.486651,0.211276}, + {-0.033975,0.498228}, + {0.808639,0.410672}, + {-0.183830,0.673398}, + {0.283445,0.591164}, + {-0.775002,-0.358194}, + {-0.559984,0.245061}, + {0.448254,-0.351589}, + {-0.307253,0.317585}, + {0.110474,-0.551974}, + {1.435987,-0.093767}, + {-0.899370,-0.601259}, + {0.050750,-0.801049}, + {-0.248103,-0.266506}, + {-0.722677,0.408100}, + {0.439215,0.082929}, + {0.326781,0.560803}, + {-0.435041,0.157077}, + {0.616733,-0.929936}, + {-1.000230,0.585819}, + {0.197016,-0.325485}, + {-0.661867,-0.863923}, + {-0.149218,-0.118129}, + {-0.048844,-0.426240}, + {-0.048809,-1.036530}, + {1.234970,-1.198487}, + {-0.564061,0.812790}, + {0.518469,-0.899248}, + {-1.011805,-0.436426}, + {-0.731235,0.119354}, + {-0.748153,-0.686550}, + {-0.765046,-0.353657}, + {-0.836584,0.509778}, + {0.848860,-0.573605}, + {0.275349,-0.980142}, + {-0.086480,0.350212}, + {0.561023,0.614301}, + {0.295835,-0.062431}, + {-0.169997,1.796229}, + {1.411584,-0.157918}, + {-0.820578,-0.083208}, + {0.363949,-1.059952}, + {-1.105712,-0.108223}, + {0.022597,-1.059282}, + {-0.599310,-1.113121}, + {1.271478,0.088851}, + {-0.351697,1.037394}, + {0.708869,1.367619}, + {1.616188,0.268445}, + {-0.055062,0.051147}, + {0.089420,0.984126}, + {1.037123,0.467659}, + {0.285018,1.056293}, + {0.076872,0.167609}, + {0.466394,0.073944}, + {-1.120238,-0.403795}, + {-0.605089,0.022859}, + {0.279943,1.026083}, + {0.103397,0.277845}, + {-0.243145,0.104500}, + {0.333394,-0.637974}, + {-0.115601,1.088147}, + {-0.792947,0.234692}, + {-0.789909,-0.934349}, + {-0.734755,0.478295}, + {1.709832,-0.280996}, + {0.744538,-0.906727}, + {0.250604,0.999609}, + {-0.503783,0.558645}, + {0.495996,0.365936}, + {0.142156,-0.574836}, + {0.512751,0.192158}, + {1.235956,0.332711}, + {0.023924,-0.429072}, + {1.193035,-0.496755}, + {0.507106,0.569391}, + {-0.957161,-1.168585}, + {-0.107514,0.423613}, + {-0.739674,-0.701516}, + {0.904520,-0.072935}, + {-0.102696,-0.928840}, + {-0.431224,0.774089}, + {0.546826,0.645864}, + {-1.462693,-0.997040}, + {0.045656,0.881963}, + {1.235724,0.605226}, + {0.485086,-0.077597}, + {-0.269521,-0.825996}, + {-1.322636,0.198827}, + {-0.755254,0.130400}, + {0.905988,-0.026561}, + {0.398511,-0.221909}, + {0.101731,-0.824604}, + {-0.772005,-0.034138}, + {0.255018,0.583319}, + {-0.099606,-0.618148}, + {-1.244045,0.403242}, + {0.290003,0.145494}, + {0.525354,0.224848}, + {0.953469,0.330420}, + {-0.529456,0.842453}, + {-0.558430,-0.068691}, + {0.816181,-1.027805}, + {0.473286,0.705963}, + {-0.374642,-0.541333}, + {0.450463,-0.658926}, + {-0.817825,-0.087311}, + {-0.506713,0.154635}, + {-0.234898,0.576703}, + {-0.308701,-0.353461}, + {-1.064488,-0.829382}, + {-0.948916,1.358909}, + {0.873385,0.041247}, + {-0.975031,0.341437}, + {0.465089,-0.305899}, + {-1.322672,-0.257483}, + {-1.628600,0.631921}, + {1.432280,-0.394926}, + {-0.278556,0.212714}, + {-0.350961,-1.579332}, + {-0.404100,0.750536}, + {0.368782,0.707155}, + {0.075936,-1.267203}, + {-0.831914,-0.096899}, + {-0.333046,-1.207398}, + {0.347681,1.157404}, + {-0.578348,-0.070195}, + {-0.129107,1.292968}, + {0.170815,0.528093}, + {0.446822,-0.070859}, + {0.606865,-1.535666}, + {0.948290,-0.884917}, + {-0.045336,-0.805774}, + {0.469737,-0.474745}, + {-0.491228,1.119829}, + {-0.441045,0.412691}, + {-0.263473,0.314737}, + {-0.249778,-0.497140}, + {1.067664,0.185250}, + {0.464393,0.962226}, + {1.268074,-0.124376}, + {-0.050562,0.440929}, + {1.169404,0.656123}, + {-0.881702,0.319503}, + {-1.052664,1.076097}, + {-0.492302,0.583617}, + {0.558011,-0.848022}, + {-0.723854,0.330486}, + {-0.451609,0.208036}, + {0.033972,0.322249}, + {0.081812,0.909632}, + {0.438240,-0.140270}, + {-1.769997,0.783168}, + {0.841427,0.381585}, + {-0.535555,1.054986}, + {0.480827,-0.859746}, + {-0.590138,-1.197696}, + {1.838550,-0.341772}, + {0.314785,0.598647}, + {0.966481,0.829249}, + {-0.603204,1.197482}, + {0.287894,-0.764641}, + {0.245047,0.646047}, + {0.703114,0.023655}, + {-0.751477,-0.640445}, + {0.128946,0.238554}, + {-0.248008,-0.661997}, + {-1.358426,0.542743}, + {-0.077018,0.562820}, + {-0.992383,-0.265463}, + {0.815603,-0.609510}, + {0.402195,0.111800}, + {0.098221,0.243275}, + {0.465141,-0.894786}, + {-0.195025,0.818069}, + {0.163013,0.020456}, + {0.019287,0.280488}, + {-1.292419,-0.472930}, + {-1.176423,-0.206148}, + {-0.517755,-0.206153}, + {-0.221025,-0.087351}, + {0.613520,0.874127}, + {0.125680,-0.160756}, + {0.959133,-0.888381}, + {-0.119945,0.682721}, + {0.994469,1.538646}, + {0.666825,0.194733}, + {-0.037507,-0.858152}, + {1.210323,-0.049750}, + {-1.064716,-0.617205}, + {0.945401,-2.387452}, + {0.158818,0.160687}, + {-0.482974,0.394775}, + {-0.858639,0.219751}, + {0.294519,0.146071}, + {1.044995,-0.604510}, + {0.823595,0.998153}, + {0.038470,1.230760}, + {1.575698,-0.815523}, + {0.148811,0.410763}, + {-0.389223,0.867009}, + {-0.126203,0.541746}, + {1.678347,0.380927}, + {0.429547,-1.024259}, + {-0.266202,0.332225}, + {-1.617040,-1.222720}, + {-0.563409,-0.661385}, + {-0.219464,-0.002245}, + {0.314463,0.656447}, + {-0.300489,0.532422}, + {-1.675190,0.759753}, + {0.428757,0.171765}, + {-0.011795,-0.359087}, + {-0.887617,0.835305}, + {-0.810371,1.602856}, + {0.409307,-0.461949}, + {0.199920,-0.987035}, + {0.123417,0.693076}, + {-0.100030,-1.106335}, + {1.582451,-1.165881}, + {-0.704681,-0.668353}, + {0.760863,1.026244}, + {-0.191075,0.266052}, + {-0.668103,0.170235}, + {-0.012904,-0.286498}, + {-0.501481,0.788971}, + {0.668517,0.968752}, + {-1.047200,-0.400916}, + {-0.533675,0.024010}, + {-0.986899,-0.229436}, + {0.627433,1.110767}, + {-0.365978,0.023073}, + {0.663772,-0.100048}, + {1.049500,0.285839}, + {-0.643717,-0.106911}, + {0.591250,-0.125807}, + {-0.639040,-0.106044}, + {0.037507,-0.832752}, + {0.328107,-0.285961}, + {-0.627469,-0.265954}, + {-0.052279,0.075179}, + {-0.231068,0.046103}, + {1.172718,0.580020}, + {-0.255252,0.819326}, + {-0.169260,-0.100791}, + {-0.756299,0.608835}, + {-0.181330,-0.094706}, + {0.479515,-0.363664}, + {1.236969,0.858327}, + {-0.975062,0.641956}, + {1.244166,0.412330}, + {-0.243528,-0.367673}, + {-0.352109,-0.345661}, + {-0.198278,0.348731}, + {-0.264499,0.354155}, + {1.043070,-1.080189}, + {-0.158193,0.645892}, + {-0.341817,-0.186282}, + {-0.152951,-0.679947}, + {-0.281572,0.534695}, + {-0.012417,0.328755}, + {-0.265771,-0.525037}, + {-0.161336,1.444940}, + {0.995682,0.203988}, + {-0.537981,0.988658}, + {-0.529871,1.194728}, + {0.831686,0.030963}, + {0.356165,-0.026852}, + {-0.577640,-0.518094}, + {-1.028778,-0.136226}, + {1.046369,-0.334105}, + {-0.005565,-1.329268}, + {-0.821778,-0.563742}, + {1.142928,0.091294}, + {0.682693,-1.263949}, + {0.380228,-0.658545}, + {0.843082,0.932597}, + {-0.345522,0.249836}, + {0.446026,-1.368423}, + {-0.918192,1.002040}, + {-0.661288,-0.984786}, + {-0.590316,-0.129025}, + {0.777157,0.056676}, + {-0.264574,-0.214260}, + {-0.816790,0.067197}, + {-0.585520,-0.519243}, + {-1.193762,-0.976993}, + {0.583269,0.827641}, + {0.394747,-0.120571}, + {-0.049132,-0.030678}, + {-0.484051,0.178199}, + {-0.283985,-0.097271}, + {0.105214,-0.205086}, + {0.341469,1.602652}, + {0.269129,0.846228}, + {-0.386895,-0.161324}, + {0.950400,0.840099}, + {-0.753280,0.687107}, + {0.466935,-0.616318}, + {-0.287216,-0.420626}, + {-1.046482,-0.085754}, + {0.284436,-0.869538}, + {0.897849,0.423417}, + {0.921429,-0.765774}, + {0.763842,-0.209293}, + {0.617392,0.912271}, + {-0.177456,-0.132474}, + {0.806300,0.356169}, + {0.336841,-0.384476}, + {0.283514,-1.204551}, + {-1.051563,0.410899}, + {-0.962639,0.824742}, + {-0.270251,-0.887304}, + {0.165904,-0.610252}, + {-0.333379,0.607510}, + {0.600463,0.941986}, + {0.997552,0.235415}, + {-1.187420,-0.233916}, + {0.897561,-0.197762}, + {0.319458,-0.794006}, + {1.832876,-1.005851}, + {0.117741,0.084043}, + {-0.277336,-0.585939}, + {-0.220366,0.332784}, + {-0.955706,-0.663342}, + {-0.874698,-0.661934}, + {-0.977466,0.530857}, + {-0.670765,0.717771}, + {1.169043,0.801325}, + {-0.313282,0.543873}, + {1.361090,-0.016967}, + {-0.045271,0.468467}, + {-0.872414,0.191454}, + {-0.622985,1.003125}, + {-1.506511,-0.683927}, + {-0.860689,-0.551287}, + {-0.871940,-0.866821}, + {0.624825,0.683967}, + {1.592190,0.116308}, + {0.126634,0.042754}, + {0.051162,1.220215}, + {0.758876,0.604646}, + {0.941573,0.080765}, + {-0.195989,0.676589}, + {-0.499377,0.152671}, + {0.658630,0.605302}, + {-0.358647,1.735287}, + {1.364593,0.503183}, + {0.210822,-0.166494}, + {-0.861761,0.367387}, + {-0.458178,0.060156}, + {0.427491,0.042062}, + {0.086057,-0.088052}, + {0.162160,-0.189039}, + {-0.734105,1.173913}, + {1.009910,-0.268308}, + {0.511028,0.449041}, + {-0.638741,1.917117}, + {-0.396037,-0.155032}, + {-0.997269,-0.575873}, + {0.535088,0.441734}, + {-0.543414,-0.751851}, + {-1.416398,-0.066365}, + {-0.053821,1.180805}, + {0.282290,0.897749}, + {0.759861,-0.479464}, + {0.990860,-0.835886}, + {0.536881,-0.128652}, + {-0.235283,1.638562}, + {-0.048821,-1.424798}, + {-1.013434,-0.285478}, + {0.380225,0.037058}, + {0.083666,0.162508}, + {-0.638680,-0.529640}, + {0.063698,0.202676}, + {0.126295,-0.106833}, + {-0.705436,0.875691}, + {1.560148,-0.744106}, + {0.506902,0.182486}, + {-0.216431,0.488020}, + {0.088319,0.537304}, + {0.744745,0.260296}, + {-0.266826,0.163056}, + {-0.680731,1.666494}, + {0.716172,-0.824289}, + {0.576971,1.097574}, + {-0.306776,0.425233}, + {0.559360,0.770270}, + {0.306141,-0.569606}, + {0.641368,0.473688}, + {-0.534869,0.305556}, + {0.479480,-1.319807}, + {-0.369422,0.008258}, + {-1.015711,0.415351}, + {0.334729,-0.161003}, + {0.111812,-0.232136}, + {1.115033,0.418084}, + {0.372638,0.159681}, + {0.228723,0.086318}, + {0.183488,0.840287}, + {-0.032699,-0.968931}, + {0.497496,0.382361}, + {-0.737920,0.301958}, + {-0.390336,-0.313842}, + {-1.358576,-0.824571}, + {-0.296870,-0.221777}, + {-1.204408,-0.178874}, + {0.430879,0.540454}, + {-0.129484,-0.943346}, + {0.111495,-0.347794}, + {0.241006,0.882070}, + {0.259517,-0.153651}, + {0.359138,0.493153}, + {-0.117222,-0.896891}, + {0.130265,-0.611169}, + {-0.564621,-0.942626}, + {0.109644,0.919373}, + {-0.765497,-0.454155}, + {1.351302,-0.499722}, + {-0.388550,0.828392}, + {1.338169,1.025334}, + {-0.017090,-0.296752}, + {-0.180796,0.374854}, + {0.418456,0.346593}, + {-0.739752,0.202709}, + {-0.167847,-0.921766}, + {0.747846,-0.289610}, + {0.366519,-1.205982}, + {0.238487,-0.366714}, + {-0.757299,0.554594}, + {-0.815610,-0.092068}, + {0.238967,0.595734}, + {-0.637637,-0.039172}, + {-0.511671,-0.025446}, + {1.327343,-0.892339}, + {0.787727,0.725476}, + {0.193989,-0.948691}, + {-0.435612,0.747976}, + {0.973745,0.043831}, + {-0.081442,-1.261099}, + {0.972757,0.437030}, + {-0.906525,0.511164}, + {0.286286,-0.007231}, + {-0.724918,0.317117}, + {-0.010738,-1.408628}, + {-0.892791,-0.413062}, + {-1.145404,-1.000462}, + {-0.054472,-0.656673}, + {-0.397352,-1.006708}, + {1.272339,0.348268}, + {-0.072337,0.462120}, + {0.263024,0.820054}, + {-1.350094,-1.060760}, + {0.318931,1.224979}, + {-0.743524,0.081760}, + {0.782937,0.494788}, + {-0.380764,0.038653}, + {0.366967,-1.110074}, + {-0.539220,-0.289508}, + {-0.750016,-0.379700}, + {-1.056018,0.760600}, + {-0.014371,0.051682}, + {0.646769,-1.206138}, + {-0.192194,-0.268590}, + {0.211900,-0.061502}, + {0.667021,0.717522}, + {-0.988574,0.469784}, + {0.909208,-0.187655}, + {-0.264537,0.459019}, + {0.283053,-0.771236}, + {0.977605,0.326370}, + {0.188691,-0.116146}, + {-0.841161,-1.507667}, + {-0.622058,0.275580}, + {0.827556,0.636424}, + {0.829953,-0.934848}, + {-0.974846,-0.484086}, + {1.038897,0.572127}, + {-1.470389,0.655402}, + {-0.031678,-0.280099}, + {0.345680,1.131225}, + {1.521886,0.475562}, + {-0.095613,0.225868}, + {0.587360,0.098605}, + {-0.910606,-0.220681}, + {0.695483,0.270633}, + {1.392499,-0.534474}, + {-0.380665,-0.132181}, + {0.739761,-0.804516}, + {0.247837,0.364872}, + {-0.504840,0.279031}, + {0.577741,-0.499917}, + {-0.877160,-0.500081}, + {0.470665,0.626683}, + {-0.845048,-0.661755}, + {0.573259,0.452514}, + {1.463281,0.460497}, + {-0.140814,-1.014287}, + {0.792857,0.139124}, + {0.095435,-1.194781}, + {-0.168013,-0.617225}, + {-0.669563,-0.438816}, + {0.970599,1.334226}, + {-0.389379,-0.250410}, + {0.337426,1.425473}, + {0.040593,0.759876}, + {-0.692656,-0.593318}, + {0.644505,-0.808285}, + {0.343813,0.483264}, + {0.262818,-0.442864}, + {0.401180,-0.354012}, + {0.042798,0.576953}, + {1.057127,-0.234653}, + {-0.543273,0.116899}, + {-0.261085,0.760538}, + {0.917617,0.504692}, + {-0.505622,-0.461514}, + {-0.397714,0.102581}, + {0.841617,0.258265}, + {-1.224217,1.200595}, + {0.549822,-0.854504}, + {-0.331807,0.249164}, + {-0.969781,1.050829}, + {-1.102970,-0.743287}, + {0.391551,-1.364767}, + {-0.291293,0.652954}, + {-1.597162,-0.453738}, + {-0.347804,-0.281488}, + {-0.384993,-0.354367}, + {-0.893094,-0.032469}, + {-1.033837,0.258447}, + {-0.059178,-0.196922}, + {-0.727165,1.094397}, + {-0.050880,-0.416205}, + {-1.801534,0.759659}, + {-0.013259,-0.907752}, + {-0.663571,-0.737940}, + {0.248589,-0.087161}, + {1.713345,1.020552}, + {0.274155,-0.077844}, + {0.684280,0.290232}, + {0.467950,-1.380906}, + {-0.134793,0.354306}, + {0.641834,-0.147045}, + {1.549775,1.034824}, + {1.011992,0.136162}, + {1.032606,-0.470594}, + {0.002512,-0.501699}, + {0.263132,-0.873676}, + {0.596802,0.698595}, + {0.644208,-1.026820}, + {-0.241748,-0.120648}, + {0.400545,0.692764}, + {0.723725,-1.171937}, + {-0.065336,0.082173}, + {0.087121,0.777870}, + {0.137719,0.862409}, + {0.600762,-0.256252}, + {-0.496334,1.522049}, + {1.415523,-0.361800}, + {0.195888,0.140839}, + {-0.201059,-0.957306}, + {0.833613,-0.884474}, + {-1.923963,-0.511931}, + {-0.401694,-0.750599}, + {-0.057871,-1.554591}, + {0.136921,-0.610025}, + {-0.692221,0.232519}, + {-0.963772,-0.406412}, + {-1.011556,0.388904}, + {0.196652,0.402592}, + {-0.236942,0.249439}, + {0.197316,0.749347}, + {0.260643,1.518230}, + {-0.261184,-0.019793}, + {0.953847,0.003123}, + {-0.488447,-0.693489}, + {0.100561,-0.839624}, + {-0.387958,0.029235}, + {-0.056287,0.849571}, + {0.146328,-0.596042}, + {-0.442422,-0.081224}, + {1.467301,1.058274}, + {-0.842963,-0.823609}, + {0.361145,0.235648}, + {2.244235,-0.417005}, + {0.557178,0.494236}, + {-0.286937,0.446261}, + {-0.797514,0.125949}, + {-0.396846,-0.492949}, + {0.791338,0.112081}, + {0.731112,0.815339}, + {0.124238,1.042459}, + {0.178620,-0.243480}, + {-0.297767,-0.499014}, + {0.089431,-1.045263}, + {0.876765,1.478866}, + {-0.433655,-0.416072}, + {0.076538,0.452756}, + {0.276575,-0.657696}, + {0.710620,0.425570}, + {-0.348002,-1.521084}, + {0.463074,-0.794634}, + {1.420303,0.458714}, + {-0.799261,0.730155}, + {-0.282421,-0.450125}, + {-1.215153,0.133084}, + {0.429525,0.137792}, + {-0.046368,-0.348350}, + {1.182696,-0.476907}, + {-0.354102,-0.016664}, + {0.228567,-0.048909}, + {0.317271,-0.110712}, + {0.000535,0.097966}, + {0.358389,-0.986634}, + {0.233837,-0.517393}, + {-0.702710,-1.470436}, + {0.301747,-0.361704}, + {-0.116303,0.152185}, + {0.321548,0.456944}, + {0.426785,0.809817}, + {0.862019,-0.752446}, + {0.503493,-0.196673}, + {-0.188695,1.043960}, + {-0.634846,0.615436}, + {-0.773059,-0.768587}, + {0.735760,-0.078372}, + {0.076222,-0.103925}, + {-0.837846,-1.879631}, + {0.311214,0.005395}, + {-0.256265,0.525394}, + {-0.759509,0.445865}, + {-0.425542,0.964997}, + {0.621631,0.218384}, + {0.749916,0.486092}, + {0.735936,-0.741326}, + {-0.550580,0.175995}, + {0.441750,0.922190}, + {-0.284205,0.780467}, + {0.111299,-0.940763}, + {-0.488491,0.739998}, + {-0.538022,0.602799}, + {-0.458050,-0.227355}, + {1.218009,1.485198}, + {0.293776,0.548771}, + {0.621581,0.201245}, + {0.029869,-0.484299}, + {0.297470,-0.678649}, + {-0.652890,-0.572565}, + {0.708517,0.135724}, + {-0.759185,1.020900}, + {0.089393,1.254895}, + {-0.163606,-0.225901}, + {1.028091,-0.979818}, + {-0.463887,-0.461716}, + {-0.472972,1.295955}, + {-1.499760,-0.100153}, + {-0.316495,0.182810}, + {-0.029037,1.390832}, + {-1.052626,0.016877}, + {0.140853,-1.064090}, + {0.077518,0.160558}, + {-0.789567,0.126484}, + {0.237999,0.933535}, + {-0.625411,-0.154393}, + {-0.651849,0.477355}, + {0.313835,-0.871245}, + {0.063692,0.733038}, + {-0.125890,-1.321408}, + {0.782127,0.731970}, + {0.067632,1.028553}, + {0.390798,-0.202231}, + {0.859910,-0.547214}, + {0.303427,0.117133}, + {-1.221034,0.106196}, + {-0.556539,-0.005747}, + {-0.581574,-0.064757}, + {-0.093350,-1.416022}, + {-0.371514,0.863009}, + {-0.228865,-0.911086}, + {0.226620,0.868273}, + {-0.022400,0.968063}, + {-0.282417,-1.206830}, + {0.517815,-0.318365}, + {0.433595,-1.277757}, + {0.650281,0.282816}, + {0.696810,-0.618460}, + {-0.018515,-1.174056}, + {0.528708,-0.383014}, + {0.465366,-0.166643}, + {-1.111839,-0.208049}, + {1.260600,-0.904770}, + {0.114190,0.595080}, + {-0.772035,1.160945}, + {-0.072465,-0.121030}, + {0.740277,0.073001}, + {-0.031995,-1.003071}, + {0.309444,-0.284262}, + {0.256298,0.217717}, + {-0.714797,0.139100}, + {1.365575,-0.321842}, + {0.609559,1.219424}, + {-0.656153,0.923034}, + {0.306127,0.569498}, + {-0.185454,-0.769265}, + {0.640850,-0.158718}, + {-1.334112,-0.208599}, + {-0.368937,-0.719614}, + {0.154071,0.481000}, + {0.369258,-1.256445}, + {-1.053810,1.454169}, + {-0.166292,-0.690521}, + {0.434216,-0.485381}, + {0.446152,0.316255}, + {0.598136,-0.692985}, + {0.194634,0.723444}, + {0.033284,-0.674910}, + {-0.677093,-0.480733}, + {0.483942,0.055658}, + {-0.380847,1.698802}, + {-0.739697,-0.967901}, + {0.181901,-0.283096}, + {-0.385252,-0.218986}, + {0.571349,1.211891}, + {0.208035,-0.801372}, + {-0.001354,0.011905}, + {0.481477,-0.622890}, + {1.126983,0.720045}, + {0.366125,0.725890}, + {0.172974,0.276534}, + {-0.297515,-0.000297}, + {0.716860,-0.694652}, + {0.896244,-0.218171}, + {0.166865,-0.781466}, + {-0.782709,-0.862993}, + {-0.004288,1.019110}, + {-0.509804,0.230849}, + {-0.987740,0.724671}, + {-0.816786,-1.334751}, + {-0.406238,-0.684850}, + {0.680826,0.080398}, + {-0.045664,0.409165}, + {1.857790,-0.268328}, + {0.265866,1.576185}, + {-0.633796,-0.378996}, + {0.441580,0.420835}, + {0.594992,-0.103592}, + {-0.350224,1.054242}, + {-0.454100,0.966540}, + {-0.553087,0.060871}, + {-0.473446,-0.638460}, + {0.348962,-0.726140}, + {0.403723,-0.092776}, + {0.168148,-0.187260}, + {-0.047057,-0.712472}, + {0.546338,0.364816}, + {0.918003,-0.461675}, + {-0.907751,-1.659162}, + {0.690737,0.688165}, + {1.115170,-0.620245}, + {-0.424054,-0.378832}, + {-0.295589,0.438479}, + {-1.181545,-0.526172}, + {-0.191356,0.363078}, + {1.256819,0.772957}, + {0.660880,-0.127556}, + {-0.770033,1.086703}, + {-0.221948,-0.024302}, + {0.376195,0.665919}, + {0.855315,1.296681}, + {0.064168,-1.090223}, + {1.198266,-0.123963}, + {0.222219,0.832714}, + {0.265471,0.660817}, + {0.926886,0.106470}, + {-0.116532,-0.351282}, + {0.282755,1.394651}, + {1.976995,0.625415}, + {0.086001,0.874691}, + {-1.158765,-0.296382}, + {0.821879,0.330819}, + {1.473645,0.454222}, + {0.373012,0.334324}, + {0.784090,-1.194075}, + {-0.049292,-0.080586}, + {-0.326299,-1.150056}, + {-0.376097,-0.297711}, + {0.400420,0.699295}, + {-0.401832,0.718915}, + {0.513962,1.314126}, + {-1.223199,0.822673}, + {-0.198511,0.577317}, + {-0.931176,-0.141243}, + {-0.328271,-0.297043}, + {0.058682,0.063005}, + {-1.537647,-1.357544}, + {0.991342,-0.020237}, + {0.389384,-0.358624}, + {-0.286835,0.522531}, + {-0.921756,-1.109047}, + {-0.005216,0.585698}, + {0.073284,-0.240263}, + {-0.608758,1.045577}, + {-0.127535,1.243989}, + {1.069722,-0.381090}, + {0.658169,-0.466652}, + {0.110592,-0.898093}, + {-0.344192,0.315264}, + {-1.253943,0.576829}, + {-0.988689,0.289650}, + {0.323581,0.406835}, + {0.753623,-1.395921}, + {-0.526975,0.375853}, + {-0.228419,0.642204}, + {-0.911534,-0.802450}, + {-0.714417,-0.277566}, + {-0.248413,-0.669371}, + {0.558370,-0.525797}, + {-0.676306,-0.233652}, + {0.187377,-0.245513}, + {-0.115084,-0.722299}, + {-0.778514,-0.521242}, + {1.510762,0.186472}, + {-0.112162,0.741817}, + {0.168038,0.036480}, + {0.473081,-0.613676}, + {0.017735,-1.619743}, + {0.125184,-0.943553}, + {0.545184,-0.381330}, + {0.093888,0.932584}, + {0.298593,-1.014602}, + {1.317871,-0.453601}, + {0.446039,0.296345}, + {-0.003700,-0.215325}, + {0.357740,-1.726941}, + {0.056925,-0.146512}, + {0.242151,-0.224778}, + {0.333254,1.380770}, + {1.576821,-0.423607}, + {0.293532,0.300461}, + {-0.192775,-0.819195}, + {-0.724187,0.864495}, + {-0.256047,0.693948}, + {0.227372,0.048857}, + {0.384743,-0.022614}, + {0.334230,0.059078}, + {-0.084885,0.245805}, + {-0.956303,-1.202349}, + {-0.673081,-0.715653}, + {-1.070653,-0.327304}, + {-0.147279,0.735590}, + {-1.051301,2.081734}, + {0.743641,0.675310}, + {0.497307,-0.052339}, + {-1.137150,-0.681605}, + {0.958912,-0.359105}, + {-0.011346,-1.133356}, + {-0.675276,0.676611}, + {-0.088049,-0.368402}, + {1.029195,0.986048}, + {0.769677,0.565289}, + {-0.142346,1.404113}, + {-1.105935,0.105231}, + {0.137296,-0.042361}, + {0.064376,1.281022}, + {0.891722,-0.662071}, + {-0.274474,1.361238}, + {0.501089,0.037064}, + {-1.079683,0.260584}, + {-0.657026,-0.608459}, + {-1.321491,0.137369}, + {-0.147387,1.485629}, + {0.701370,-0.338272}, + {-0.937117,-1.890266}, + {-0.002981,-0.309410}, + {-0.450557,0.756156}, + {-0.207628,0.767636}, + {-0.017018,-1.057447}, + {-0.516946,0.622016}, + {-0.439782,-0.660634}, + {0.465733,0.369621}, + {-1.107081,0.963995}, + {-1.304264,-0.056408}, + {0.326753,0.871892}, + {0.607911,-0.097462}, + {0.368739,-0.185021}, + {1.177421,0.378663}, + {-0.059318,-0.122919}, + {0.024356,-0.157050}, + {-0.952570,-0.640217}, + {-0.285763,0.974177}, + {-0.222286,-0.638367}, + {1.350695,0.832729}, + {0.426047,0.068965}, + {-1.235143,-0.255727}, + {0.097972,-1.280044}, + {0.613868,0.569266}, + {0.792483,-0.388408}, + {-0.611795,-0.757664}, + {0.066523,-1.342460}, + {1.152646,0.059112}, + {-0.407404,-0.164086}, + {0.998551,-0.553072}, + {-0.230242,-0.414397}, + {1.100387,-0.474447}, + {-0.136452,-0.266361}, + {-0.783866,-0.608098}, + {-0.626331,0.731900}, + {0.453871,0.483000}, + {0.118882,-0.076636}, + {-0.010890,1.832384}, + {-0.275781,0.534932}, + {-0.758412,0.302367}, + {0.774181,-0.666316}, + {-1.239903,-0.018154}, + {-0.826897,-0.159508}, + {0.294782,0.329762}, + {-0.310305,0.173462}, + {-0.484331,0.577130}, + {0.528037,-0.079597}, + {-1.165040,0.643362}, + {0.218828,-1.879045}, + {0.340559,0.534394}, + {1.027003,-0.862991}, + {0.265023,0.582110}, + {0.533497,0.424652}, + {-0.143533,-0.668350}, + {-0.043478,1.242700}, + {0.140689,-0.328515}, + {0.594427,0.952587}, + {0.328719,0.131913}, + {1.647645,0.451601}, + {0.807728,0.547755}, + {-0.398431,1.090855}, + {0.071550,0.529582}, + {0.696988,0.096969}, + {-0.315803,0.602702}, + {-0.053510,0.368662}, + {-0.783694,-0.369834}, + {-0.513209,-0.183077}, + {-0.389552,-0.423163}, + {0.250511,-0.197899}, + {1.072604,1.141232}, + {-0.256157,0.324126}, + {-0.845304,1.344024}, + {1.607235,-0.083729}, + {0.216531,-0.229193}, + {-1.849789,0.283520}, + {-0.273563,-0.437125}, + {0.439165,0.820069}, + {-0.071710,0.044047}, + {-0.036628,0.811854}, + {0.949810,0.092324}, + {0.223015,-0.302363}, + {-1.151938,0.219130}, + {-0.602013,-0.159929}, + {-0.479745,-0.467518}, + {-0.596418,1.115315}, + {1.155356,0.976269}, + {-0.339066,0.667014}, + {-0.537118,-0.328546}, + {0.231632,-0.251679}, + {-0.564684,-0.151955}, + {0.404261,0.591546}, + {0.156538,-0.119747}, + {-0.265291,0.441799}, + {-0.710732,0.990762}, + {-0.037181,-0.893433}, + {-0.608993,0.072250}, + {-0.431612,-0.294577}, + {-0.449292,-0.627379}, + {1.118185,-0.219789}, + {-1.095315,-0.141630}, + {-0.906823,1.379934}, + {-0.355207,0.170146}, + {0.012266,-0.140593}, + {0.582558,0.200710}, + {-0.264941,0.654223}, + {0.490653,0.262090}, + {-0.806158,0.423760}, + {-0.916022,-0.095727}, + {-1.435559,-0.430004}, + {-1.383499,0.819679}, + {-0.476148,-0.799760}, + {-0.086440,-0.288405}, + {0.468541,-0.026429}, + {-0.513250,-0.142815}, + {-0.903017,0.571624}, + {-0.097263,0.834344}, + {-1.345370,-0.677137}, + {1.710559,-0.271618}, + {-0.490398,-0.719281}, + {-0.660807,0.868829}, + {-0.612810,-0.703682}, + {0.992913,0.444834}, + {0.083612,0.800845}, + {-0.140036,-0.531708}, + {-1.676151,0.726057}, + {1.115666,0.611399}, + {-0.454838,0.031736}, + {0.338107,0.033385}, + {-1.179649,0.975904}, + {-0.362644,-0.703524}, + {0.265567,-0.598433}, + {0.612009,-0.911296}, + {0.669627,0.732675}, + {0.299979,-1.083474}, + {-0.001796,0.450980}, + {-0.312085,-0.240890}, + {-0.157834,-0.452017}, + {-1.005825,-1.124619}, + {1.514761,-0.139328}, + {0.205847,-0.624360}, + {-0.788916,-0.431594}, + {0.185577,0.530159}, + {-0.998640,-0.120038}, + {-0.701757,-0.385069}, + {0.127492,0.278129}, + {0.644093,-0.318252}, + {1.349703,0.815553}, + {1.178677,0.257816}, + {0.290177,1.567018}, + {0.815353,0.069366}, + {0.428406,0.751920}, + {-0.358682,-0.000313}, + {0.898652,-0.035994}, + {0.007882,-0.203406}, + {1.143951,0.676206}, + {-1.579231,-0.510529}, + {-0.029383,0.067530}, + {-0.207513,-0.651686}, + {-0.171590,0.197287}, + {1.106950,0.639104}, + {-1.153861,0.109446}, + {0.128439,1.245168}, + {-1.709516,0.155977}, + {0.698242,0.511780}, + {0.188021,0.140058}, + {0.214542,-0.603858}, + {-0.585161,-0.999378}, + {-0.125116,-0.107497}, + {1.169544,-0.068827}, + {-0.641184,-0.795741}, + {0.299439,-0.994491}, + {-1.270881,0.080905}, + {0.638892,0.320804}, + {-0.045967,0.343003}, + {0.572705,-0.597459}, + {-1.076651,0.926168}, + {1.591514,-0.239336}, + {-0.151223,0.296796}, + {-0.547906,-0.598357}, + {0.194930,-1.469040}, + {-1.066167,-0.488868}, + {0.375923,-0.458435}, + {0.118752,-0.176519}, + {-1.119040,-0.877881}, + {0.317179,1.106286}, + {-0.524586,0.380106}, + {0.449438,-0.812248}, + {0.218978,-0.240793}, + {0.920874,1.099158}, + {0.337065,-1.042434}, + {0.165176,-0.575666}, + {0.124061,0.064366}, + {-0.972349,-0.449360}, + {0.438009,-0.607478}, + {1.340508,0.164007}, + {-0.611231,-0.045868}, + {-1.894545,0.313067}, + {0.026078,-0.046337}, + {-0.993251,0.529082}, + {0.338591,-0.050854}, + {0.276524,-1.876008}, + {0.553549,-0.641581}, + {-1.274207,1.314869}, + {0.082555,0.483468}, + {0.480747,0.004671}, + {0.129514,0.227370}, + {0.488707,-0.498655}, + {-0.672859,0.446981}, + {-0.389134,0.220936}, + {0.678780,0.388861}, + {0.004714,0.113091}, + {0.098152,0.402314}, + {-0.584163,0.655414}, + {1.069824,0.053944}, + {1.426146,-0.171673}, + {-0.492434,0.430442}, + {0.387326,-0.723692}, + {0.923225,0.315823}, + {-0.436266,-0.179644}, + {0.679013,0.839753}, + {0.121002,0.328185}, + {0.686624,0.263510}, + {-1.014880,0.226535}, + {0.496357,0.676631}, + {-0.685878,0.475997}, + {-0.816184,-0.690225}, + {0.624418,-0.640938}, + {0.981859,-0.263799}, + {1.266654,-0.559957}, + {-0.447318,-1.692190}, + {-1.632760,-0.647412}, + {1.237379,1.188506}, + {0.224983,-0.193860}, + {0.265301,0.088248}, + {1.487341,-0.210028}, + {0.975147,-1.738118}, + {-0.315739,-1.563346}, + {0.759571,-0.834275}, + {0.248891,-0.487193}, + {0.593097,0.883254}, + {-0.295665,-0.091338}, + {0.242557,-0.870492}, + {0.076878,-0.401879}, + {-1.275364,-0.748062}, + {-1.030366,-0.635397}, + {-0.059741,0.281073}, + {0.647269,0.569318}, + {0.091019,-0.383699}, + {1.550738,-0.017491}, + {0.558012,-0.883251}, + {1.344487,0.781872}, + {0.425354,-0.544888}, + {0.443166,-0.622855}, + {0.402391,-0.428524}, + {0.322402,0.140907}, + {0.665183,0.150628}, + {0.264571,0.063423}, + {-0.180192,1.228519}, + {0.176187,0.609708}, + {-0.686995,-0.858999}, + {0.403250,1.127242}, + {-0.460433,0.622449}, + {0.957213,0.125857}, + {-0.214465,-0.254392}, + {0.953570,-0.146560}, + {0.351196,-0.097209}, + {0.363350,0.991605}, + {-0.842097,0.750050}, + {0.173444,0.393799}, + {0.644241,0.891357}, + {0.518479,0.829535}, + {-0.793455,-0.868437}, + {-0.451662,0.080692}, + {1.713382,0.806600}, + {-0.986818,0.371536}, + {-0.732506,-0.086137}, + {-0.287972,1.333554}, + {-0.505251,-0.388335}, + {0.182226,-0.170677}, + {0.656847,-0.151742}, + {0.240621,-0.408503}, + {-1.207747,0.579227}, + {-0.480071,-1.477118}, + {0.397312,1.160838}, + {-0.478893,0.085660}, + {-1.201398,-0.484779}, + {-0.875166,1.306590}, + {-0.048226,0.168645}, + {0.575978,0.334768}, + {0.268464,-0.584981}, + {0.172204,0.362164}, + {-0.573584,0.837555}, + {0.097430,0.693442}, + {0.710075,0.430611}, + {0.279881,0.500559}, + {-0.495316,-0.284207}, + {-0.024375,-0.582689}, + {0.503912,0.590465}, + {0.543956,-0.751481}, + {-0.113901,0.583382}, + {-0.424219,0.552384}, + {-0.209784,0.254702}, + {2.524661,-1.007793}, + {0.453447,-0.787107}, + {0.129431,0.856054}, + {-0.725614,-0.060954}, + {-0.076847,-0.411651}, + {-0.585319,-0.607995}, + {0.354620,-0.943508}, + {0.004873,0.874609}, + {0.584256,0.295973}, + {-0.751269,-0.621494}, + {1.252094,0.523044}, + {0.412384,-0.071193}, + {1.460668,-0.424840}, + {-1.668383,-0.125918}, + {-0.140575,-0.793958}, + {-0.602913,-1.530258}, + {-0.485749,0.647443}, + {0.327012,0.012391}, + {-0.065556,-1.534338}, + {0.040087,0.692505}, + {0.331535,0.606771}, + {-1.081422,0.655871}, + {0.112370,0.095884}, + {0.544109,-0.418467}, + {0.883949,0.869171}, + {-0.053113,1.005180}, + {0.084581,0.070706}, + {1.176918,0.868754}, + {0.340621,-0.290651}, + {1.069518,-0.145240}, + {-0.305978,-0.255205}, + {0.264782,0.828990}, + {0.076048,0.311651}, + {1.020387,-0.341573}, + {1.171179,0.317841}, + {0.039440,-0.343955}, + {-0.196474,-1.120097}, + {0.173672,-0.637267}, + {0.869413,0.499800}, + {0.402750,-0.274691}, + {-0.195399,-0.716727}, + {-0.697868,-0.592886}, + {1.005820,-0.833437}, + {1.667014,-0.928567}, + {0.112603,0.637979}, + {-0.378046,-0.094991}, + {-0.264513,0.562337}, + {-0.281534,-0.171989}, + {0.184469,0.954685}, + {-0.184794,-0.419611}, + {0.042573,-0.035524}, + {0.526333,0.216558}, + {0.221470,-0.570724}, + {0.952384,0.824810}, + {0.377462,-0.439426}, + {0.552507,0.406306}, + {0.356019,-0.448320}, + {-1.181908,0.315880}, + {1.237299,-1.380363}, + {-0.266766,1.166820}, + {-0.543319,-0.487425}, + {0.853891,1.002771}, + {0.094524,-1.085172}, + {-0.122670,-0.819704}, + {0.507893,1.214830}, + {0.066840,0.391217}, + {-0.627340,-1.028818}, + {0.048450,0.066480}, + {1.252207,-1.088292}, + {1.914396,-0.390461}, + {0.783587,-0.456659}, + {-1.087500,-0.414070}, + {-0.017378,-0.330487}, + {0.822467,0.523086}, + {0.544551,-0.396871}, + {0.505004,-0.302542}, + {0.655396,0.309852}, + {0.744048,-0.677621}, + {0.632487,0.637052}, + {0.382478,-0.487032}, + {-0.253994,1.037147}, + {1.056620,0.110571}, + {-1.000220,0.890575}, + {0.227128,-0.051171}, + {0.249166,-0.869667}, + {0.362158,0.942859}, + {0.170629,0.370184}, + {-0.428655,-0.104012}, + {0.827800,-0.147575}, + {0.050820,-0.016864}, + {1.169503,0.264916}, + {1.055638,-1.029984}, + {-0.213356,-0.446858}, + {0.883660,-0.272743}, + {-0.179240,1.234001}, + {-1.124872,-1.414740}, + {0.620017,0.524664}, + {0.429714,-1.144124}, + {0.071774,0.024483}, + {0.236817,0.493902}, + {-0.345272,0.403117}, + {-0.245305,0.443081}, + {0.456796,0.439895}, + {0.127632,-1.065099}, + {1.004045,0.187642}, + {0.910957,0.711730}, + {0.270826,0.181679}, + {0.554230,-0.318570}, + {0.415953,0.287152}, + {0.249620,-1.683391}, + {-0.183154,-0.452854}, + {0.914111,-0.432673}, + {-1.329404,-0.200816}, + {0.408647,0.357466}, + {0.342816,0.128307}, + {-0.372446,-0.517950}, + {-0.268470,-0.945823}, + {0.058636,0.446404}, + {0.077650,-0.641117}, + {0.500659,0.569755}, + {-1.264154,-0.108240}, + {-0.323458,1.076444}, + {0.286058,-0.812280}, + {1.130102,-0.533853}, + {0.820155,0.813720}, + {-0.369292,0.599253}, + {-0.401040,-1.122319}, + {0.015961,0.999207}, + {0.113009,0.151940}, + {-0.326797,-1.045239}, + {-0.631927,-0.213249}, + {-0.232764,-0.353310}, + {-0.277962,0.172006}, + {-1.384869,0.322627}, + {0.657043,0.378613}, + {1.632659,-0.311238}, + {-0.128560,0.380120}, + {-0.021658,0.595562}, + {0.055891,0.020949}, + {0.360843,-1.355132}, + {-0.441202,0.653312}, + {-0.903583,-0.602887}, + {0.589411,-0.501421}, + {0.009663,0.497738}, + {0.955606,0.137016}, + {-0.829489,0.248268}, + {-0.623087,0.554453}, + {-0.983462,-0.470261}, + {-0.093188,-0.254457}, + {0.281605,-0.015601}, + {1.143487,-0.512110}, + {-0.259302,0.254954}, + {-1.333991,0.113816}, + {1.056834,0.224210}, + {0.478784,-1.143913}, + {1.172144,0.054436}, + {0.126576,-0.617074}, + {0.129731,0.567838}, + {0.992712,0.311224}, + {-0.080398,0.093624}, + {-0.333385,0.321406}, + {-0.857085,0.136303}, + {-0.193071,0.112527}, + {0.174651,-0.824896}, + {-0.044413,-0.225567}, + {0.889937,0.174611}, + {0.221331,-0.846178}, + {-0.911343,-0.217177}, + {-0.598798,1.486589}, + {0.678465,-0.562484}, + {1.906944,0.211159}, + {-0.148741,0.420947}, + {0.875071,0.723028}, + {0.500603,0.175314}, + {-0.669264,0.505343}, + {-0.162355,0.492007}, + {0.405254,0.188295}, + {0.730781,-0.170657}, + {0.219461,-0.487510}, + {-0.607648,-0.266311}, + {1.031809,-1.878717}, + {0.262365,0.080670}, + {0.704439,-0.342870}, + {0.526865,0.107263}, + {0.449751,-0.350958}, + {-0.250292,-0.244899}, + {0.322347,-0.066403}, + {0.250252,0.152062}, + {-0.123904,0.252763}, + {0.097518,0.668475}, + {-0.756972,0.544061}, + {-0.482034,-1.042969}, + {0.216007,-0.057989}, + {-0.076012,-0.157728}, + {-0.193643,0.281670}, + {-0.047023,-1.385414}, + {0.425208,0.198825}, + {-1.128706,1.130083}, + {0.749280,0.273274}, + {-0.885277,-0.437183}, + {-0.045310,0.493993}, + {0.689210,0.481689}, + {-0.836367,-0.212518}, + {0.933511,-0.551367}, + {0.323157,0.145200}, + {-0.381780,0.425335}, + {-0.043935,0.669080}, + {0.950537,-0.788988}, + {0.888065,0.870818}, + {0.198948,1.131985}, + {0.333668,1.531210}, + {0.329099,1.260233}, + {0.619784,-0.971239}, + {-0.362197,0.842451}, + {-0.107082,0.572070}, + {-1.273638,-0.219990}, + {-0.220258,0.341964}, + {-0.110476,-0.229104}, + {1.871605,1.085818}, + {-0.667567,-0.510587}, + {-0.081589,-0.002145}, + {-0.485358,-0.264608}, + {-0.021298,-1.378931}, + {1.061728,-0.050554}, + {0.063661,-0.078720}, + {0.540324,-0.679083}, + {0.040479,-1.175746}, + {-1.651713,0.175791}, + {-1.061321,-0.905733}, + {-0.144548,-0.403863}, + {-0.212951,-0.162069}, + {-0.202079,0.210548}, + {-0.481286,-0.089389}, + {0.534427,0.293422}, + {-0.077023,-0.592110}, + {0.748204,-0.933897}, + {0.789813,0.023419}, + {0.364097,-0.688288}, + {-0.817344,-0.232389}, + {-1.106773,-0.011376}, + {-1.149018,0.589183}, + {-0.237988,0.461070}, + {0.144291,-0.866590}, + {-0.319867,-0.741546}, + {0.467556,-0.563525}, + {0.787965,-0.067020}, + {-0.377218,0.346134}, + {-0.439111,-0.729340}, + {0.111481,-0.725684}, + {-0.345130,0.303179}, + {0.221511,-0.444748}, + {-0.139828,1.064259}, + {-0.102410,1.595486}, + {-0.033213,-1.118558}, + {0.003251,0.259777}, + {-0.418818,0.218547}, + {0.196030,-0.238166}, + {0.317481,0.810128}, + {0.685667,-1.193565}, + {-0.230818,1.499649}, + {0.527567,1.628496}, + {0.418979,-0.163575}, + {0.943900,0.909605}, + {-1.191709,-0.027791}, + {0.834602,1.596546}, + {0.285289,0.562981}, + {-0.270156,-0.195083}, + {-0.731085,-0.510584}, + {0.054180,0.401694}, + {0.222936,-0.465566}, + {0.708946,0.905168}, + {0.274867,-0.023564}, + {0.255887,-1.523657}, + {-0.438371,-0.835342}, + {-0.388636,0.420745}, + {0.575120,0.350653}, + {0.165252,-1.180423}, + {-0.106785,-0.106601}, + {-0.163290,0.059107}, + {-0.048709,-0.263100}, + {0.309147,-0.042611}, + {-0.927395,0.617546}, + {0.809214,1.027300}, + {-0.146042,0.142650}, + {-0.784247,-1.284659}, + {-0.278628,-0.344565}, + {0.036556,0.842948}, + {0.912256,0.120918}, + {-1.159161,-0.897982}, + {1.183806,0.116039}, + {0.080759,-0.670877}, + {1.106555,0.968417}, + {-0.748972,-0.332161}, + {0.015659,-0.238382}, + {0.072921,0.945789}, + {0.720423,-0.655437}, + {-1.184291,-1.204869}, + {0.005271,-0.500795}, + {-0.947286,0.565118}, + {0.402954,-0.272249}, + {-0.051205,-1.269563}, + {-0.244921,-0.403400}, + {0.688696,-0.966522}, + {-1.332749,1.102022}, + {0.248091,-0.614807}, + {0.542833,0.089974}, + {0.092234,-1.064895}, + {-0.142784,-0.393747}, + {-1.915675,0.230426}, + {0.189830,0.787094}, + {-0.630199,0.176279}, + {-1.014131,1.143947}, + {-0.520987,-0.274620}, + {0.207558,-0.600789}, + {0.091016,-0.244461}, + {-0.130663,0.121426}, + {0.004404,0.214764}, + {1.305978,0.539062}, + {1.085432,0.406738}, + {-1.147405,0.986932}, + {-0.527963,0.040514}, + {1.048821,0.402675}, + {0.871429,1.049595}, + {1.770856,-0.090866}, + {-0.518070,0.716500}, + {0.487361,0.022371}, + {-0.686924,-0.549181}, + {0.340429,0.907657}, + {-0.394719,1.043237}, + {0.202132,-0.329431}, + {-0.569046,0.377140}, + {-0.446943,0.699826}, + {-1.179740,-0.505842}, + {0.356706,0.439865}, + {-0.598450,0.446083}, + {-1.374043,0.679741}, + {-0.021589,-1.611401}, + {0.410296,0.014703}, + {1.604389,0.059808}, + {-1.673347,-0.607599}, + {-0.050574,0.534932}, + {1.712505,1.284287}, + {-0.342150,-0.043176}, + {0.055806,0.223800}, + {0.355618,-0.311415}, + {-0.271235,0.683074}, + {-0.775743,1.125752}, + {-0.378310,-1.640378}, + {-1.038677,0.190076}, + {1.174409,-0.118801}, + {0.331030,-0.048922}, + {0.728780,-0.295898}, + {0.693699,-0.972498}, + {0.174966,-1.152868}, + {-0.876610,-0.017480}, + {-0.062463,0.606038}, + {0.974421,1.248637}, + {1.417309,-0.262139}, + {0.011829,1.068245}, + {-0.812946,2.785479}, + {0.861911,0.248256}, + {-0.567134,0.287479}, + {-1.000297,0.453402}, + {-0.007071,0.201681}, + {-0.152146,1.342125}, + {0.671739,0.150808}, + {1.116866,0.838904}, + {0.759212,-1.364876}, + {-1.013891,1.460428}, + {-0.226149,-1.126365}, + {-0.451954,-0.444787}, + {-0.021515,1.034266}, + {-0.571367,-0.692007}, + {-0.349616,0.140445}, + {0.168654,0.087815}, + {-0.129953,0.445421}, + {0.410578,0.912573}, + {-0.217475,-0.669581}, + {-0.222785,1.245619}, + {1.558435,0.605819}, + {-0.488581,-0.336896}, + {-0.247095,0.691559}, + {-0.272835,-0.264770}, + {0.675699,0.032700}, + {-0.600614,0.262450}, + {0.180303,-0.367078}, + {0.919067,1.375550}, + {0.152099,-0.550776}, + {-0.201242,0.036053}, + {0.764895,-1.477231}, + {0.396961,0.220377}, + {-0.306654,0.876105}, + {-0.991493,0.187414}, + {-0.307614,0.684635}, + {-0.773884,0.106210}, + {-1.566911,0.170510}, + {0.361833,-0.141857}, + {-0.600408,-0.446279}, + {1.421652,0.535651}, + {0.798181,1.741752}, + {0.828463,-1.351656}, + {1.064522,0.356219}, + {-0.261882,-0.068944}, + {-0.274206,-0.863308}, + {-0.472305,-0.610240}, + {1.169302,0.073319}, + {0.212464,-0.516636}, + {0.072813,0.172732}, + {-0.402815,-0.754899}, + {0.240675,0.006754}, + {-0.413280,0.162876}, + {-0.878790,-0.579111}, + {-0.490272,-1.206031}, + {-0.500456,-0.219817}, + {0.069254,-1.439473}, + {0.914958,0.485123}, + {0.759158,-0.336522}, + {0.798766,-0.831419}, + {0.572361,-0.465976}, + {-0.130641,-0.259763}, + {-0.529278,0.642024}, + {0.169663,1.957850}, + {0.290362,1.466387}, + {0.486745,-0.303996}, + {-0.739829,0.729494}, + {-1.119647,-0.438709}, + {1.199651,0.132905}, + {-0.028488,0.166904}, + {0.294118,1.343646}, + {-1.078798,-0.045417}, + {-0.144834,0.724221}, + {-0.286147,0.584877}, + {-1.025536,1.281690}, + {1.349738,0.051777}, + {-0.163706,0.861461}, + {1.304346,-1.415064}, + {-0.220065,0.578733}, + {-0.073421,-0.292662}, + {-0.407989,1.100458}, + {0.306779,-0.903447}, + {-0.053132,-0.864616}, + {-0.613827,0.320417}, + {-0.157362,-0.152289}, + {-0.363881,-0.696127}, + {-0.644928,-0.357587}, + {0.523401,-0.545460}, + {-0.284975,0.437116}, + {-0.332811,0.194424}, + {0.886436,-0.283097}, + {-0.353503,1.253798}, + {0.777206,1.140778}, + {-0.176515,1.349269}, + {0.200192,0.474405}, + {-0.090735,0.782045}, + {0.108052,-0.393573}, + {-0.097758,0.133294}, + {-0.521819,-0.069948}, + {0.495179,0.903907}, + {-1.635143,0.044403}, + {-1.044754,0.995099}, + {-0.029236,0.231209}, + {-0.763150,-0.740411}, + {0.666666,0.948566}, + {-0.996496,0.103076}, + {0.066595,0.386752}, + {1.079913,-0.587405}, + {-0.126881,0.324364}, + {0.242668,0.274037}, + {-0.167854,-0.463373}, + {1.254502,-1.338299}, + {-0.814549,-0.540325}, + {0.604115,0.960306}, + {-0.762464,0.255581}, + {-0.145291,-0.151457}, + {0.539461,0.564589}, + {0.452901,-0.644154}, + {-0.121667,0.123363}, + {0.172408,0.943437}, + {0.349217,-0.431470}, + {0.193653,-0.286326}, + {0.373892,-0.225571}, + {-0.469563,-0.051636}, + {0.703894,0.076285}, + {-0.342531,-0.919488}, + {-0.093593,0.467140}, + {-0.370503,-0.159512}, + {-0.427136,0.822814}, + {0.484980,0.660569}, + {0.380112,1.642120}, + {0.741086,-1.181946}, + {-0.861984,-0.551848}, + {-0.326551,0.051893}, + {-0.673266,0.128672}, + {0.477538,-0.448337}, + {0.424523,-0.099635}, + {-0.200313,0.300309}, + {-0.319153,-1.021980}, + {-0.640520,-0.659841}, + {-0.189198,0.771204}, + {0.163659,-0.315306}, + {0.756345,0.736886}, + {-0.321533,0.169677}, + {-1.755957,0.206259}, + {-2.116119,1.256344}, + {-0.750604,0.344105}, + {0.267358,-0.320943}, + {1.438068,-0.187643}, + {-0.629031,-0.059064}, + {0.769031,0.174502}, + {0.611810,0.637876}, + {0.509224,1.423682}, + {0.029716,-0.226301}, + {-0.529129,-0.458146}, + {0.588062,0.568816}, + {-0.261343,0.028227}, + {0.000322,-0.506508}, + {-0.454871,-0.212809}, + {-1.170607,0.073436}, + {1.134318,0.212980}, + {-1.039946,1.151672}, + {0.904145,-0.236109}, + {0.572173,-0.222902}, + {0.354798,-0.056846}, + {0.617914,-0.121507}, + {-0.485005,-0.789432}, + {0.555901,1.045454}, + {-0.342510,0.662108}, + {0.477863,0.919492}, + {-0.886891,-0.151806}, + {0.073477,0.660208}, + {-0.836821,-0.492241}, + {0.868206,0.057640}, + {-0.278170,-0.344302}, + {1.740416,0.163213}, + {0.710730,0.125488}, + {0.283223,0.313698}, + {0.549759,-0.103777}, + {0.979863,0.559804}, + {-0.290891,-0.894974}, + {0.187074,-1.035208}, + {0.722918,-1.398915}, + {-0.581228,0.581626}, + {0.289505,-0.332083}, + {0.489170,-0.566258}, + {-0.889190,-0.521928}, + {-0.262424,0.143982}, + {-1.279355,-0.724648}, + {0.257297,0.851178}, + {-0.306166,-0.469346}, + {0.045235,-0.453040}, + {0.285296,0.528722}, + {-0.568471,-0.086437}, + {-0.449844,0.791630}, + {0.440313,0.203210}, + {-0.715834,0.084234}, + {-0.535316,-0.471520}, + {0.545214,0.542797}, + {0.858170,-0.392007}, + {0.459011,0.277321}, + {0.630900,0.621847}, + {-0.661226,-1.433006}, + {0.657691,-0.355625}, + {-0.083747,0.737402}, + {-0.427198,-0.957863}, + {-0.194041,1.158089}, + {-0.546119,-0.629835}, + {1.668000,1.040309}, + {-0.407113,-1.748223}, + {0.586268,0.131234}, + {0.824612,0.043758}, + {0.077720,0.434675}, + {-0.878529,0.066930}, + {-0.910217,-0.770628}, + {-0.399495,0.223856}, + {-0.776131,0.072596}, + {0.968979,-0.378461}, + {-0.788724,-0.419890}, + {-0.717876,-0.129177}, + {0.649467,-0.543748}, + {-0.083694,-0.154461}, + {0.433057,0.341816}, + {-0.109326,0.473616}, + {-0.306007,0.525211}, + {1.334709,0.792284}, + {0.450165,0.092275}, + {1.269496,-0.283253}, + {-0.987681,0.679147}, + {0.700508,-0.765557}, + {0.020683,0.657076}, + {0.556750,0.196350}, + {-1.036465,0.515704}, + {0.529448,0.036856}, + {-1.108420,-0.332631}, + {-0.792801,-0.226293}, + {-0.806708,-0.100053}, + {-0.810484,-0.306346}, + {-0.181914,-0.053941}, + {-0.967090,0.696498}, + {1.192545,-0.294435}, + {-0.566689,-1.356403}, + {-0.828942,-0.407377}, + {-0.621438,1.217900}, + {-1.028343,0.521929}, + {1.025599,-0.656932}, + {0.138542,0.489792}, + {-0.202065,1.257500}, + {0.043756,-0.176369}, + {0.685895,-0.249690}, + {0.549922,0.885082}, + {-0.189354,-1.551150}, + {-1.118100,0.020367}, + {0.474848,1.184561}, + {-0.050645,1.195300}, + {0.867725,-0.380298}, + {1.033550,0.154888}, + {-0.477175,-0.457725}, + {1.148061,0.585421}, + {0.380830,-0.754913}, + {-0.106258,0.080392}, + {-0.092959,-0.386023}, + {-0.358937,-0.724895}, + {-1.374994,1.067211}, + {0.460321,0.527363}, + {-1.238789,-0.089993}, + {1.464682,0.876127}, + {-1.234731,1.128579}, + {0.724792,-0.450972}, + {-1.521916,0.809717}, + {-0.388497,-0.174976}, + {0.086236,0.748876}, + {1.100546,-0.528230}, + {0.226367,0.697463}, + {0.744283,1.254010}, + {-0.249234,-0.694237}, + {0.167903,0.298213}, + {-0.228874,-0.560931}, + {0.394532,0.449698}, + {-0.344909,-0.227098}, + {-0.415043,-1.065131}, + {0.126645,1.162114}, + {1.370732,-0.619147}, + {0.823699,-0.552124}, + {0.345714,-0.232139}, + {0.894510,-0.203477}, + {0.475686,-1.010735}, + {0.661874,0.478840}, + {-0.521820,-0.526937}, + {1.314386,0.651335}, + {-0.319251,-0.196685}, + {-0.505632,0.967049}, + {0.590235,0.712258}, + {1.380347,1.137978}, + {0.152855,-0.242439}, + {0.291709,-0.255131}, + {1.260959,-0.491270}, + {-1.089113,-0.159145}, + {0.435095,-0.676862}, + {-0.340494,0.469703}, + {1.302442,-0.532868}, + {-0.378602,-0.400420}, + {0.925227,-0.607976}, + {0.251869,0.591035}, + {-0.646873,-0.636483}, + {-0.328268,-0.897893}, + {1.089412,-0.159031}, + {0.814358,2.220698}, + {0.772924,-0.691036}, + {-0.784735,1.137714}, + {-0.042070,-0.600536}, + {0.592465,-0.209877}, + {0.769297,1.296465}, + {0.448652,-0.198575}, + {0.025998,0.141744}, + {0.485850,-1.270583}, + {-0.846149,-0.038597}, + {-0.277242,-0.731952}, + {0.198053,-1.496392}, + {-0.073055,0.046129}, + {0.574797,-1.238401}, + {0.133512,0.156586}, + {0.105417,1.088396}, + {0.143785,0.480135}, + {0.306526,-0.884781}, + {0.722423,-0.916666}, + {-0.657561,0.272999}, + {-0.557441,1.138685}, + {-0.782249,-1.293763}, + {0.453444,0.532557}, + {1.013185,-0.405740}, + {-0.094466,0.752667}, + {1.286455,-0.593367}, + {-0.298950,0.306095}, + {1.181346,0.559262}, + {0.461658,-0.639042}, + {-1.291839,-0.121779}, + {-0.326193,0.113747}, + {-1.154270,-0.089857}, + {-0.351472,-1.491822}, + {0.720080,-0.419379}, + {-0.672820,0.094205}, + {0.812964,-0.064953}, + {-1.294077,1.076364}, + {-0.133796,-0.745281}, + {-0.393393,0.385628}, + {-0.602521,-0.377900}, + {0.528132,-0.164217}, + {0.505215,-0.104243}, + {0.765574,0.926339}, + {2.024634,-0.477364}, + {0.017166,0.179716}, + {0.399008,-1.200177}, + {-1.090208,0.311701}, + {-0.158439,-0.916668}, + {1.058774,0.191072}, + {-0.464662,-0.983746}, + {0.540500,-0.331676}, + {0.139759,-0.346498}, + {-0.331954,0.206804}, + {-0.956494,0.357149}, + {-0.944290,-0.414694}, + {1.172465,-0.536726}, + {-0.541046,0.365657}, + {0.276923,1.402963}, + {-0.242318,0.269377}, + {0.965338,-0.785207}, + {-0.718256,-0.028312}, + {0.231175,0.665614}, + {-0.947264,-0.913082}, + {-0.501002,1.094529}, + {0.352224,-0.272040}, + {0.397494,0.185641}, + {-0.151725,0.717844}, + {0.839893,0.459279}, + {0.801901,-0.313492}, + {-0.684958,0.226865}, + {-0.212219,-0.213841}, + {0.892238,-0.435760}, + {1.314788,-0.271844}, + {0.836362,0.043882}, + {-0.957485,-0.948085}, + {1.079672,0.119647}, + {-0.513333,0.529166}, + {0.438430,-0.923301}, + {0.175442,-0.539418}, + {-0.003292,-0.268481}, + {-0.438336,0.598716}, + {0.174795,0.663858}, + {0.409033,1.094613}, + {0.766143,0.882464}, + {0.116399,0.720590}, + {-0.563363,0.971493}, + {-1.542577,0.365604}, + {0.514771,-0.458050}, + {-0.346020,0.184177}, + {-1.029390,0.631160}, + {0.916323,0.569872}, + {0.330674,-0.403426}, + {-0.815112,0.338683}, + {-0.233795,-0.536290}, + {-0.156529,-1.368641}, + {-0.263744,0.144793}, + {0.546089,0.239988}, + {-0.176949,-0.463405}, + {-0.369226,-1.044596}, + {-0.505317,-0.388794}, + {-0.451340,0.812733}, + {0.325007,0.206856}, + {-0.810237,-1.085805}, + {0.165055,0.996302}, + {-0.931375,0.613591}, + {-0.126483,-0.744854}, + {0.397855,0.364294}, + {0.287751,-0.500914}, + {-0.053719,0.982818}, + {-0.553468,0.292330}, + {0.179430,-0.597617}, + {-1.198685,-0.800000}, + {1.186764,-0.992792}, + {0.724964,0.103448}, + {0.963127,0.232599}, + {0.092029,0.364811}, + {0.023554,0.358368}, + {-0.156919,-0.181441}, + {0.186716,0.206933}, + {0.533803,-0.467186}, + {-0.459122,0.140642}, + {0.994366,-0.893881}, + {0.452242,0.282844}, + {-1.757045,-0.228025}, + {0.966083,-0.036048}, + {-0.134917,-0.207168}, + {0.124213,-0.129237}, + {-0.080806,-0.024992}, + {-0.799884,-0.669277}, + {-0.620681,-0.397588}, + {-0.352503,-0.044189}, + {0.092370,0.364939}, + {0.449970,1.026360}, + {0.529612,0.063033}, + {-1.083693,-0.194379}, + {0.369823,-0.277191}, + {-0.177423,-0.619947}, + {0.562466,1.467675}, + {-0.573227,0.920231}, + {0.552988,-0.530708}, + {0.844829,-1.136412}, + {0.558908,0.169169}, + {0.626978,-0.115006}, + {0.351068,-0.464366}, + {-0.762156,-0.066833}, + {-0.117971,0.052717}, + {-0.570717,0.761831}, + {-0.514255,0.164156}, + {0.013305,-0.055138}, + {-0.245547,0.642430}, + {0.216396,0.005143}, + {-0.507045,-0.685026}, + {1.118325,0.364330}, + {-0.590687,-0.140389}, + {0.013596,0.844098}, + {-0.399225,0.716323}, + {-0.417137,-0.565919}, + {0.092852,0.416915}, + {-0.943451,-0.152195}, + {-1.020240,0.801126}, + {-0.611728,0.436773}, + {-0.019905,-1.332957}, + {-0.690646,-0.464269}, + {0.907830,-0.494683}, + {-0.281882,-0.749796}, + {-1.546127,-1.007659}, + {0.830144,-0.015166}, + {-0.390510,-1.043779}, + {0.117684,-0.482510}, + {0.924184,1.260658}, + {-1.061867,1.221469}, + {-0.815122,-0.023800}, + {-0.103022,0.298058}, + {-0.252904,0.230901}, + {0.021567,-0.875517}, + {0.248461,0.093681}, + {0.264196,0.004397}, + {-0.311626,-0.620671}, + {0.280419,0.771652}, + {-0.018466,0.219481}, + {1.700853,-0.112003}, + {-0.882344,0.018746}, + {-0.006374,0.087725}, + {-0.100868,0.209463}, + {0.512129,0.523700}, + {-0.317199,0.307879}, + {0.294301,-0.330502}, + {0.601020,-0.125700}, + {-0.739890,-0.023356}, + {-1.444838,0.568493}, + {-0.134116,-0.671218}, + {1.005881,0.367029}, + {-0.738930,0.646782}, + {-0.342683,-0.504731}, + {0.716899,-0.539596}, + {0.738524,0.070291}, + {0.386202,0.440067}, + {1.345032,0.180183}, + {-0.018880,-0.031769}, + {-0.378806,-0.171766}, + {-0.286278,-0.617444}, + {-0.080975,-0.526326}, + {0.700062,-0.604598}, + {-0.885363,0.470310}, + {-1.156147,-0.054617}, + {0.133744,-0.226376}, + {-0.240292,-1.157249}, + {0.063137,-0.793579}, + {0.030749,-0.302199}, + {0.090525,0.483558}, + {0.073085,-0.481644}, + {-0.223842,-2.140667}, + {0.031752,0.005003}, + {1.231275,-0.530212}, + {1.038917,-0.422673}, + {0.394114,0.524978}, + {-1.097829,0.484170}, + {0.431677,0.251181}, + {1.225130,-0.837454}, + {-0.186695,1.110229}, + {0.338671,0.141820}, + {-0.023210,1.021750}, + {0.990528,-1.624820}, + {0.011025,-0.247794}, + {-0.339063,0.407060}, + {0.384226,0.510580}, + {-0.757315,-0.246458}, + {-1.582920,0.107500}, + {-1.012034,0.035645}, + {1.968999,0.055935}, + {-1.424400,-1.006629}, + {-0.381551,-0.428135}, + {0.437026,0.843355}, + {0.179125,0.109344}, + {-0.449217,1.913849}, + {0.427694,-0.425086}, + {-0.211741,-0.700567}, + {-0.188227,-0.847564}, + {-0.594710,1.483595}, + {-0.072411,0.766453}, + {1.150670,0.617209}, + {-0.386818,-0.026636}, + {-0.385528,-1.273407}, + {-0.361319,0.734053}, + {0.098469,-0.126693}, + {-1.389158,1.163252}, + {-0.460623,0.471711}, + {0.338909,-0.460817}, + {0.130190,0.607843}, + {0.207546,0.467445}, + {-0.587233,-0.598555}, + {0.608060,0.186716}, + {1.153664,0.245205}, + {0.328400,0.759055}, + {-0.694971,0.220107}, + {-0.338761,-1.561954}, + {-0.594066,-0.121286}, + {-0.422942,-0.435408}, + {-0.514954,-0.135974}, + {-0.685185,0.540584}, + {-0.824955,1.303292}, + {0.226211,-0.342887}, + {-0.598595,-1.523227}, + {0.678569,0.475931}, + {0.630242,0.483559}, + {-0.620338,0.518139}, + {0.919177,-0.181962}, + {0.507928,-0.566914}, + {-0.488096,0.812728}, + {-0.364813,0.705453}, + {-1.369744,0.240855}, + {0.714938,-0.709527}, + {0.582868,0.091790}, + {-0.180208,0.726072}, + {0.452558,0.415231}, + {0.495553,-1.877462}, + {0.582132,-0.333465}, + {0.833380,-0.489799}, + {0.267983,0.623820}, + {-1.556596,0.244596}, + {0.566314,0.288588}, + {-0.067564,1.023165}, + {0.505347,0.922345}, + {-0.470138,-0.951912}, + {0.660978,0.761539}, + {0.621641,0.135908}, + {1.400944,0.226884}, + {0.652989,-0.565545}, + {0.237052,-0.192473}, + {0.953481,-0.437290}, + {-0.532917,0.753979}, + {-0.401020,0.182003}, + {-0.774883,0.538031}, + {-0.320697,-0.549711}, + {1.663374,0.724379}, + {0.588294,1.303208}, + {1.044164,-0.361746}, + {-0.145359,-1.690668}, + {-0.825189,1.215719}, + {-1.088180,-0.300943}, + {-0.430774,0.622501}, + {0.316668,0.544425}, + {0.504829,-0.457687}, + {-0.834387,-0.240484}, + {-0.306896,0.687505}, + {0.268810,1.644408}, + {-0.780049,1.087894}, + {-1.538673,-0.201769}, + {0.535403,0.605154}, + {0.019388,-0.435640}, + {-0.440314,-0.055865}, + {1.298971,1.128651}, + {0.177042,1.260625}, + {-0.854552,0.621748}, + {-0.677730,0.607538}, + {0.203182,0.219196}, + {1.347539,0.528045}, + {-1.261542,0.367327}, + {-0.137496,0.330269}, + {0.960711,1.133014}, + {0.687000,0.111912}, + {-0.181358,1.091956}, + {0.223343,-0.483492}, + {-0.273860,0.362866}, + {-0.011742,-0.136568}, + {0.275521,-1.429957}, + {-0.273297,-0.074082}, + {0.290409,-0.066311}, + {-0.228273,-0.362296}, + {-1.378862,-0.444713}, + {0.241775,0.546076}, + {0.039962,-0.186289}, + {-0.036983,-0.286490}, + {0.091318,-1.140707}, + {0.511967,-0.298166}, + {-0.103362,0.567148}, + {-1.507135,-0.446682}, + {-0.002256,-0.382378}, + {0.793055,0.713325}, + {0.519248,-0.273429}, + {0.373212,1.206027}, + {-0.186569,0.345384}, + {-1.037811,0.160379}, + {0.100911,0.728662}, + {0.348187,1.397238}, + {1.053003,0.787660}, + {0.851118,-0.072377}, + {0.885419,-2.014642}, + {0.224168,-0.873868}, + {0.866546,-1.231568}, + {-0.196727,0.530071}, + {-0.510674,-0.434893}, + {0.256375,-0.296321}, + {1.333570,1.516369}, + {0.216969,1.545445}, + {0.164709,0.254986}, + {0.100115,-0.605479}, + {0.086380,0.234960}, + {0.907601,-0.649032}, + {-1.199984,0.075438}, + {1.186217,-0.332770}, + {-0.270511,-1.202410}, + {0.826974,0.035252}, + {0.331603,-0.037377}, + {0.476641,0.109902}, + {-0.174187,-0.546405}, + {0.159829,-0.563128}, + {-0.251076,-0.337193}, + {0.587231,0.086443}, + {-0.004139,-0.062337}, + {0.847037,-1.213560}, + {0.720797,-0.302577}, + {-0.313615,1.223469}, + {-0.385838,0.548932}, + {-0.681006,0.375296}, + {-0.002250,-0.626297}, + {0.044566,-0.714328}, + {-0.785516,0.625881}, + {1.008274,-0.326630}, + {-0.475841,0.809907}, + {-0.189279,-0.144121}, + {-0.147481,-0.167430}, + {0.297717,-0.662249}, + {0.903221,-0.828173}, + {-0.076715,-0.103500}, + {-0.220609,0.037787}, + {0.500891,0.420473}, + {0.273765,-1.134860}, + {0.469416,-0.299483}, + {0.490976,0.584688}, + {0.840863,0.462752}, + {-0.374205,-0.498565}, + {0.970595,1.606044}, + {0.351297,0.387913}, + {-1.301970,1.173260}, + {0.132588,1.491314}, + {-1.181621,-0.261585}, + {-1.361050,0.972321}, + {-0.153063,-1.707550}, + {0.758497,0.123412}, + {0.238820,0.155025}, + {-0.254726,0.301346}, + {-1.010450,1.160231}, + {-1.240972,0.287896}, + {0.784458,-0.105589}, + {-0.536336,-0.405889}, + {-0.146211,0.253732}, + {-0.878979,0.549278}, + {0.065870,-0.198147}, + {-0.954775,1.043484}, + {0.557617,1.047797}, + {0.493106,-0.919198}, + {-0.170124,0.314583}, + {0.688442,0.122648}, + {-1.023681,-0.111431}, + {0.801745,-1.821817}, + {-0.723679,0.440206}, + {-0.453669,-0.190110}, + {-0.581141,0.078254}, + {-0.941791,-0.060551}, + {0.890659,0.122601}, + {0.963847,0.066347}, + {0.759853,-0.199802}, + {-0.106224,0.458618}, + {1.065279,0.399051}, + {-0.321525,0.808861}, + {-1.208707,0.585097}, + {0.866323,-0.559539}, + {0.474646,0.039294}, + {1.902251,0.915424}, + {-0.455613,-0.414985}, + {-0.246282,-0.640345}, + {-0.333131,0.196717}, + {-0.493399,-0.772411}, + {0.204786,-0.870497}, + {0.309500,-0.533279}, + {0.910107,0.510703}, + {-0.056168,-0.123584}, + {-0.491468,-0.572133}, + {0.375774,1.162053}, + {0.063430,1.272410}, + {-1.406177,-0.010975}, + {-0.087637,-0.226010}, + {-0.563296,0.452261}, + {-0.449694,-0.554259}, + {0.707040,0.188047}, + {1.601323,-0.206911}, + {-0.923501,0.574700}, + {-0.966020,0.679890}, + {0.268570,0.368709}, + {0.212696,-0.904453}, + {0.194974,0.488184}, + {0.470565,0.918929}, + {-0.684581,-0.142648}, + {-0.844954,-0.189146}, + {-0.542152,-0.747252}, + {0.495473,0.403557}, + {-0.688008,-0.913830}, + {-0.059830,0.517971}, + {-2.171862,1.024477}, + {-1.249624,-0.015772}, + {0.015926,0.734811}, + {0.457707,-0.081584}, + {-0.009916,-0.098752}, + {0.810571,-0.772556}, + {1.274648,0.151342}, + {1.083434,-0.643550}, + {1.044509,0.338194}, + {-0.378948,0.039118}, + {-0.075820,-1.730294}, + {0.774083,0.620047}, + {-0.066915,-1.689347}, + {0.731451,-0.094387}, + {0.259309,-0.417934}, + {-0.498563,0.708930}, + {0.774393,1.168883}, + {-0.172278,-0.053409}, + {-0.293542,-0.414288}, + {1.373904,0.468393}, + {-0.086211,0.448331}, + {0.141485,-0.030337}, + {-0.107671,0.406149}, + {0.098529,0.748433}, + {-0.267386,-0.031872}, + {-0.748722,-0.653857}, + {0.004819,0.286587}, + {0.320934,0.502389}, + {0.434680,0.257350}, + {0.042256,-0.018636}, + {-0.305369,0.076753}, + {-0.205572,-0.818070}, + {0.936762,0.858510}, + {-0.423207,0.799304}, + {0.072296,0.374763}, + {-0.156480,-0.604657}, + {-0.968287,0.266390}, + {1.115752,-0.133177}, + {0.666615,-0.815890}, + {0.472277,0.132071}, + {-0.193603,0.875236}, + {0.318294,-0.031684}, + {1.004666,-0.833170}, + {0.262337,-0.253264}, + {0.691983,2.042454}, + {0.209886,-0.290278}, + {0.278291,1.124044}, + {-0.207172,1.567355}, + {0.238977,-0.323462}, + {-0.223252,-0.119456}, + {0.303814,1.004795}, + {1.200940,0.213197}, + {-0.687440,-1.084798}, + {-0.198295,0.195513}, + {0.046763,0.521581}, + {-0.510831,-0.423679}, + {0.244499,-0.628926}, + {0.698044,-0.623503}, + {0.416896,-0.041211}, + {-0.350345,-0.226075}, + {0.695417,0.604628}, + {-0.383804,0.383435}, + {0.086188,-0.192144}, + {0.781463,-1.146905}, + {0.098847,-0.660911}, + {-0.335006,0.419788}, + {1.122026,-0.064158}, + {0.384520,-0.618539}, + {0.479143,-1.027819}, + {1.107169,-0.524087}, + {0.383901,-0.402677}, + {0.194053,0.255903}, + {0.477393,0.074827}, + {-0.410776,-0.444651}, + {-1.991022,-0.394045}, + {0.216143,-0.334173}, + {-0.563452,0.819894}, + {-0.311190,0.640443}, + {-0.243058,0.560057}, + {-0.546188,-0.070783}, + {-0.615962,0.363862}, + {0.240774,0.912485}, + {0.219238,-0.849157}, + {-0.885919,-1.007370}, + {0.190039,0.543608}, + {1.070954,0.179088}, + {0.554915,-0.018668}, + {1.371742,-0.335006}, + {-0.645975,0.229713}, + {-0.736469,0.669922}, + {0.001929,-0.033222}, + {0.701460,-0.205447}, + {0.486977,0.824796}, + {1.258540,-0.391141}, + {-0.036946,0.293066}, + {0.670274,-0.247172}, + {-1.768643,0.859413}, + {0.290706,-0.231858}, + {-0.102970,-0.041794}, + {-0.418989,-0.849960}, + {0.098567,0.921322}, + {-0.459667,-0.893404}, + {-0.804486,1.022065}, + {-0.978005,-1.097316}, + {0.774600,-0.328074}, + {-0.242046,0.003126}, + {-0.056869,-0.164227}, + {-0.521315,0.145929}, + {0.311763,-0.783776}, + {0.116789,0.376795}, + {0.518519,-0.236313}, + {0.134501,-1.013336}, + {-1.199793,-0.823016}, + {0.122597,0.539057}, + {0.664613,0.256397}, + {-0.316770,0.490154}, + {-1.263702,-0.252355}, + {0.550430,0.282031}, + {1.070783,-0.094371}, + {0.587430,-0.613368}, + {0.684523,0.740690}, + {-1.023715,0.345296}, + {0.107663,0.265091}, + {0.215299,-0.153788}, + {-0.342020,-1.389234}, + {1.512062,0.110530}, + {-0.255843,-0.304788}, + {0.344653,0.472651}, + {1.604399,0.282072}, + {-0.123394,-1.073324}, + {0.823059,0.235494}, + {1.005127,-0.422945}, + {1.087857,0.942103}, + {0.388606,0.630055}, + {-0.489398,0.271613}, + {0.662806,-0.072930}, + {-0.505174,-0.083009}, + {-1.099044,-0.087619}, + {1.682942,0.105597}, + {-0.963602,-1.159610}, + {1.770411,-0.665544}, + {0.274943,-0.029549}, + {-0.368023,0.498046}, + {0.382125,0.110398}, + {0.143411,-0.471052}, + {-0.962301,-0.125190}, + {-0.382881,-0.300460}, + {-0.702084,-1.028932}, + {0.609839,-0.269770}, + {-0.322227,-0.046758}, + {0.196679,-0.841992}, + {0.389128,0.554504}, + {-0.138058,-0.153224}, + {0.225274,0.357098}, + {-0.326247,-0.149102}, + {0.189830,2.038718}, + {0.622165,-0.578665}, + {-0.555788,-1.517656}, + {0.223546,-0.956908}, + {0.036102,-0.216316}, + {-0.527827,-0.790654}, + {-0.703457,1.216742}, + {1.896473,0.420610}, + {-0.919048,-1.717801}, + {-0.564716,-0.463391}, + {0.072924,0.515583}, + {1.213858,1.273362}, + {-0.585628,-1.777402}, + {0.315143,0.314280}, + {1.599076,0.263103}, + {0.551870,-0.508782}, + {0.198278,-0.171192}, + {0.370793,0.390001}, + {0.186273,-0.685544}, + {-1.334139,-0.047514}, + {0.859364,1.107470}, + {1.108595,-0.249803}, + {-0.767836,0.024632}, + {-0.755180,0.202525}, + {0.558701,-0.646325}, + {-0.864527,-0.056300}, + {-0.568031,0.020910}, + {-0.192644,-0.239731}, + {0.335820,0.941753}, + {-0.905318,0.078626}, + {1.348554,-0.274217}, + {0.718711,0.937416}, + {0.701784,1.186619}, + {0.783715,0.942788}, + {0.511822,-0.269353}, + {0.262749,0.224861}, + {-0.369690,0.087992}, + {0.119908,0.245625}, + {-0.755046,-0.352329}, + {1.050758,-1.220104}, + {1.112945,-0.869696}, + {0.154116,-0.398725}, + {-0.682546,-0.178220}, + {0.000616,-1.176764}, + {0.582237,-0.360093}, + {-0.048804,-0.182963}, + {0.343632,-1.302243}, + {-0.059123,1.169904}, + {-0.849233,0.417740}, + {0.802972,0.824939}, + {-0.259347,1.401916}, + {0.262680,1.027712}, + {0.119396,0.842189}, + {0.789537,0.288341}, + {0.873023,-0.678867}, + {-0.282999,-0.803959}, + {0.032434,-0.332495}, + {0.362466,-0.869451}, + {1.303907,-0.351392}, + {-0.261026,-0.184508}, + {0.069724,0.222538}, + {-1.692123,-0.176506}, + {0.182023,-0.297168}, + {1.166731,0.974402}, + {0.182690,0.901593}, + {-2.707181,0.294289}, + {-0.422655,0.616411}, + {0.818191,-0.536655}, + {0.200265,-0.152867}, + {-0.571663,-0.576991}, + {-1.149922,0.237294}, + {0.683474,0.514764}, + {-0.327411,-0.298380}, + {0.543399,1.134105}, + {0.221413,-0.885642}, + {1.120697,-0.024074}, + {-0.727365,0.561341}, + {-0.060173,-0.140444}, + {0.010505,-0.532622}, + {0.085622,0.854726}, + {0.776915,0.627544}, + {-0.480372,1.612013}, + {0.035874,0.948871}, + {-0.202889,0.071192}, + {1.071655,0.563884}, + {-0.856493,0.157759}, + {1.465912,0.740984}, + {-0.975957,0.149083}, + {0.017006,0.661242}, + {0.677641,0.736448}, + {-0.055937,1.619199}, + {0.017620,0.501037}, + {-0.329608,-0.642669}, + {0.460941,-0.086157}, + {-0.677150,-0.999700}, + {1.085090,0.487071}, + {0.766686,0.736476}, + {0.245465,-0.602065}, + {0.259054,-0.926270}, + {0.241794,0.493962}, + {0.213145,-0.717582}, + {-0.164479,1.252053}, + {1.520899,0.765972}, + {-0.262001,-0.514990}, + {0.394009,0.530819}, + {-0.398782,0.610431}, + {0.061806,-0.058270}, + {0.630771,1.025669}, + {-0.235617,0.164118}, + {-0.497122,0.651216}, + {0.906863,0.812694}, + {0.942602,0.037286}, + {0.353956,-0.268639}, + {0.721879,-1.407883}, + {0.336154,-1.490511}, + {0.463325,-0.409685}, + {-0.654404,0.164448}, + {1.353668,-1.381831}, + {0.902985,1.291975}, + {-0.673638,1.082945}, + {0.096381,0.069481}, + {0.268580,-0.006480}, + {0.351301,0.210100}, + {-0.111290,0.763114}, + {0.482922,0.206619}, + {0.265563,0.454462}, + {-1.242255,-1.027363}, + {-1.082879,0.470826}, + {0.192528,-1.507715}, + {-1.393900,0.462004}, + {-0.328719,0.813496}, + {0.736296,0.834899}, + {0.401170,-0.096215}, + {0.570525,-0.070442}, + {-0.633878,-0.590925}, + {0.147991,0.069756}, + {0.368475,0.553471}, + {-0.936644,-0.634945}, + {-0.209835,0.061014}, + {0.376984,0.415601}, + {-0.053992,0.927934}, + {-0.664815,-0.230709}, + {-0.368558,-0.869841}, + {0.869019,0.207397}, + {-0.077032,0.015291}, + {-1.041657,-1.084937}, + {-0.040849,-1.191117}, + {-0.040502,-0.637029}, + {-0.113547,-0.036059}, + {-0.376653,0.011245}, + {-0.611166,-0.722246}, + {-0.252785,0.199909}, + {-0.554396,-0.777145}, + {1.508706,1.960357}, + {0.802878,-1.058245}, + {-0.668372,-0.380450}, + {0.934698,0.328675}, + {-0.484190,-0.777490}, + {-1.096700,-0.599480}, + {0.133311,-0.708274}, + {-0.037022,-0.697705}, + {-0.094335,-0.104415}, + {0.578229,-0.473142}, + {0.521239,0.402009}, + {-0.601727,-0.589783}, + {1.068671,-0.802095}, + {-0.179212,0.761986}, + {-0.098283,-0.660154}, + {-1.325546,0.733457}, + {1.204701,0.635880}, + {0.071453,0.547081}, + {0.116252,0.809687}, + {-0.289209,-0.786678}, + {0.060218,-0.093927}, + {1.040621,0.201639}, + {0.663944,-1.404113}, + {0.323341,0.022382}, + {-1.173198,1.186145}, + {0.631958,0.811309}, + {0.140914,-0.812980}, + {0.918574,-0.388552}, + {0.137629,0.245151}, + {0.286895,-1.006635}, + {-0.883709,0.464159}, + {1.149660,0.500635}, + {0.869576,-0.471720}, + {0.820353,0.381747}, + {-0.764649,-0.632796}, + {-1.436934,-0.113737}, + {-2.086755,0.084057}, + {1.010455,-0.246709}, + {-0.149211,-1.532015}, + {0.496285,0.442942}, + {0.101726,-0.696911}, + {0.536346,-0.055237}, + {-1.001254,-0.165978}, + {0.527046,1.269435}, + {0.251018,-0.408625}, + {-0.398318,1.683260}, + {-0.838820,-0.091386}, + {1.301904,1.505187}, + {0.156433,-0.483412}, + {-0.888996,-0.920372}, + {1.318649,0.539760}, + {0.608943,1.036337}, + {-0.290264,-1.659074}, + {-0.100778,0.034840}, + {-0.597380,-0.927067}, + {2.662626,-0.397478}, + {1.115005,-0.106991}, + {0.838668,-0.032934}, + {-0.046413,0.184593}, + {0.262956,-0.070027}, + {0.126185,1.919012}, + {-0.267772,-0.664473}, + {0.614649,0.179683}, + {-0.527418,0.106321}, + {-0.240424,1.418708}, + {-0.112591,-0.348458}, + {1.337480,-0.026564}, + {-0.112471,0.124444}, + {-0.491147,0.252096}, + {-0.291925,-0.069114}, + {0.572380,0.425877}, + {0.216700,0.480072}, + {0.002923,-0.590032}, + {-0.221473,0.797032}, + {-0.450239,-0.109167}, + {-0.138495,0.363282}, + {0.536702,0.942890}, + {-0.385188,-0.255577}, + {-0.195874,-0.396227}, + {-0.149959,-0.045442}, + {0.175505,0.639732}, + {-0.871016,0.558898}, + {-0.166986,0.487026}, + {0.015097,0.188443}, + {1.593731,-0.064295}, + {-1.302004,1.334270}, + {0.647612,0.649894}, + {-0.466297,-1.438770}, + {-0.082164,-0.271981}, + {-0.369005,0.109265}, + {0.012960,1.067369}, + {0.008171,-0.522336}, + {1.072758,0.533772}, + {0.010905,-0.615835}, + {-0.267041,0.338341}, + {-0.163231,-0.172623}, + {-0.298143,-0.844671}, + {-0.996324,0.395993}, + {0.351228,0.210237}, + {-0.408737,1.852449}, + {1.371179,-0.270106}, + {0.698624,-0.186227}, + {0.764440,-1.018351}, + {-0.417185,-0.489324}, + {-0.254638,-0.780647}, + {-0.589837,-1.171805}, + {1.132576,-0.812185}, + {0.071797,0.075910}, + {-0.142160,-0.205967}, + {-0.131813,-1.570445}, + {-0.646197,-0.501273}, + {-0.343572,-0.550584}, + {-0.384814,0.182407}, + {1.396442,-0.058372}, + {1.089823,0.806014}, + {0.613392,0.111495}, + {-0.619374,-0.997811}, + {0.937457,0.236635}, + {-1.783063,-0.017353}, + {0.639293,1.721414}, + {-0.973684,-0.595704}, + {0.588127,2.077128}, + {-0.508637,0.421534}, + {-0.204767,-0.116534}, + {-0.925742,-0.808087}, + {-0.247853,0.383247}, + {0.122339,-0.377588}, + {-0.245016,1.239323}, + {-1.251013,1.414176}, + {-0.595604,0.183438}, + {0.165761,0.973419}, + {-0.360977,0.533837}, + {-0.156010,1.266329}, + {-0.361477,-0.706989}, + {-1.278243,-0.570395}, + {0.188787,-0.241089}, + {0.695269,-0.016308}, + {0.336792,1.128790}, + {-0.195083,-0.486791}, + {0.435703,-1.218875}, + {-0.892865,0.992856}, + {-0.503019,-0.799460}, + {0.305161,-0.872681}, + {0.824504,0.670722}, + {-0.057163,-0.737607}, + {-0.459377,-0.426213}, + {0.661363,-0.123470}, + {0.291500,-0.574575}, + {0.736858,-0.048679}, + {-1.798391,-0.674830}, + {-1.124265,-0.210419}, + {0.305464,0.240427}, + {0.660762,0.390722}, + {-2.191616,-0.299109}, + {0.764942,-0.333123}, + {-0.766828,-0.575533}, + {0.609647,-0.179405}, + {0.010595,-0.673221}, + {0.496617,0.041268}, + {0.961196,-0.055449}, + {-0.225309,0.834606}, + {1.114384,-0.055796}, + {-0.222813,-0.099848}, + {-0.120519,0.033593}, + {1.015066,-0.116109}, + {-0.906373,0.667821}, + {-1.147539,-1.158675}, + {-0.339648,-0.873359}, + {-0.489429,-0.652974}, + {-0.607693,0.915098}, + {-0.739589,-0.880921}, + {-0.519588,0.827766}, + {0.166684,-0.028429}, + {-0.621222,-0.143460}, + {0.186200,-0.213188}, + {-0.815053,-0.375461}, + {0.459186,0.134372}, + {0.218895,0.177810}, + {0.028394,-0.083888}, + {-0.673259,-0.245137}, + {1.213576,-0.494994}, + {-0.504661,1.291076}, + {0.485929,0.212768}, + {-0.050601,1.330620}, + {-0.127089,1.121260}, + {-0.062864,1.184358}, + {0.388036,0.065984}, + {0.639649,0.940623}, + {0.345500,-0.926372}, + {0.294821,0.080969}, + {-0.675096,0.401880}, + {-0.457889,-1.034898}, + {0.546379,-0.123306}, + {1.925229,0.617684}, + {0.036275,0.153092}, + {0.438382,-0.367055}, + {-1.510804,-0.350652}, + {0.511549,0.357008}, + {0.058650,-0.056035}, + {0.426843,0.291233}, + {0.647381,1.340631}, + {-0.459728,0.946206}, + {-0.626630,0.024277}, + {-0.023095,-0.808970}, + {0.409768,-1.094577}, + {-0.364498,0.100205}, + {0.584196,-0.029047}, + {-1.299973,-1.205881}, + {-1.467178,1.165527}, + {0.651701,-0.056131}, + {0.591321,0.585146}, + {1.050908,-0.864838}, + {-1.010467,0.869663}, + {0.286195,0.382027}, + {-0.407370,0.606735}, + {0.731817,-0.248191}, + {0.594029,0.949877}, + {1.107643,0.816630}, + {0.112756,-0.800629}, + {-0.936598,-0.635692}, + {0.320902,-1.154471}, + {0.362662,0.687527}, + {-0.772593,-0.345974}, + {-0.301668,-0.298240}, + {-0.317592,1.336231}, + {-0.396778,-0.334856}, + {-0.506675,-0.312185}, + {-1.281432,0.149600}, + {0.401639,-0.418585}, + {0.782846,0.722927}, + {0.344150,0.854286}, + {-0.014517,0.567740}, + {0.108356,0.024531}, + {0.902085,-0.055156}, + {0.826237,-0.713395}, + {0.244866,0.044681}, + {-0.176188,0.891915}, + {-0.420097,-0.253119}, + {0.417268,0.290663}, + {0.163310,-0.245311}, + {-0.182683,-0.297175}, + {0.631826,-0.030011}, + {-0.109512,-0.088560}, + {1.429108,0.225297}, + {0.155576,0.083817}, + {1.613520,0.239461}, + {0.127288,-0.420358}, + {0.477950,0.504352}, + {1.328754,-0.163013}, + {-0.568880,-0.751232}, + {-0.482506,-1.538834}, + {-0.059557,0.412963}, + {0.350223,-0.360451}, + {0.833328,1.009992}, + {-0.066145,-0.506290}, + {-1.529181,0.414709}, + {1.240990,0.206763}, + {-1.129462,0.769895}, + {-0.481806,0.484887}, + {0.595993,0.725062}, + {-0.285575,1.347548}, + {2.330541,-0.013789}, + {-1.797866,0.257308}, + {0.905498,0.146234}, + {-0.319323,-1.413330}, + {-0.175398,-1.142782}, + {-0.862556,0.482210}, + {0.223448,0.729414}, + {0.578396,-0.016839}, + {-0.318659,-0.617867}, + {0.157744,0.530414}, + {0.123166,-0.362401}, + {1.806366,0.187194}, + {0.141849,0.128567}, + {0.233317,0.139137}, + {-0.195036,-0.613837}, + {1.714962,1.593262}, + {-0.732866,-0.038927}, + {0.307565,-0.920340}, + {0.373395,-0.516143}, + {0.826920,-0.612844}, + {-0.388779,-0.390229}, + {-0.862877,0.788258}, + {0.495550,0.670739}, + {-0.545650,0.635220}, + {-0.230298,0.414062}, + {-0.719266,-0.811359}, + {-0.999942,1.684412}, + {0.527479,0.543823}, + {-0.743616,0.101886}, + {-0.199070,0.115074}, + {-0.870949,0.256787}, + {0.142208,0.122864}, + {1.178514,-0.092691}, + {0.516611,0.664212}, + {-0.414682,1.125980}, + {0.378510,-0.100979}, + {0.283304,-0.277420}, + {-0.208157,-0.202171}, + {-0.440988,-0.820237}, + {1.298009,-0.850293}, + {0.779159,-0.461672}, + {0.149934,1.508017}, + {0.095404,-0.092000}, + {-0.337095,-0.317412}, + {-0.629736,-0.111690}, + {-0.399381,0.078341}, + {-0.479442,-0.187099}, + {-0.760090,0.125670}, + {-0.610029,-0.278563}, + {0.649156,0.494456}, + {-0.672965,0.631743}, + {-0.016562,0.306273}, + {-0.609100,0.137436}, + {0.652638,1.047158}, + {0.026014,-0.348532}, + {0.423324,-0.479491}, + {-0.383879,0.485369}, + {-0.598911,-0.835369}, + {0.115294,-0.571799}, + {-0.125615,0.202125}, + {-0.909276,-0.587717}, + {-0.727220,0.093925}, + {-0.134042,-0.601821}, + {-0.187468,-0.669988}, + {0.370470,0.393121}, + {-0.691281,0.520446}, + {-0.548105,-0.687475}, + {1.223865,0.276014}, + {-0.770862,-0.529642}, + {-0.147001,-0.466523}, + {-0.573650,0.453058}, + {-0.592723,0.439779}, + {-0.455307,-0.206169}, + {1.320446,0.684046}, + {-0.935463,-0.447754}, + {0.703593,-1.016309}, + {-0.891936,-0.175935}, + {0.328758,-0.396236}, + {0.094338,0.221705}, + {-1.404257,-0.190658}, + {-0.100089,1.039360}, + {-0.966548,0.827384}, + {-1.253737,-1.014768}, + {-0.346418,-1.267854}, + {-0.158700,1.164901}, + {-0.034736,0.009220}, + {0.545952,-0.246464}, + {0.717271,-0.093260}, + {0.676085,-0.863656}, + {0.493132,-0.105922}, + {-0.533072,0.636553}, + {-0.216843,0.884234}, + {0.111424,0.082110}, + {1.028141,0.146957}, + {-0.446215,0.136231}, + {0.730978,-0.275731}, + {0.042365,0.048442}, + {-0.370711,-0.543378}, + {0.106057,1.265886}, + {0.379243,-0.330497}, + {1.108852,-0.723866}, + {-0.110398,0.511860}, + {-0.106902,0.174878}, + {1.148426,-0.603670}, + {-0.128195,0.280598}, + {0.764800,-0.358176}, + {-0.266245,0.816531}, + {0.114914,-0.539096}, + {0.114034,-0.367231}, + {2.141155,-1.484656}, + {-0.724135,-0.856970}, + {0.266306,-0.874060}, + {0.846456,0.435570}, + {0.066472,0.252900}, + {-1.088643,-1.133248}, + {-0.566947,0.767431}, + {0.619468,-0.550164}, + {0.029218,1.459059}, + {1.301080,0.095710}, + {1.753613,-0.553147}, + {1.516418,-0.318869}, + {0.861448,-0.472804}, + {-1.047020,-0.037668}, + {-0.123383,0.272455}, + {-0.124143,1.500702}, + {0.378722,0.458093}, + {-1.369372,-0.010599}, + {-1.027065,0.948843}, + {0.152530,-0.545888}, + {-0.239192,0.716174}, + {0.874709,-1.022073}, + {-0.259942,-0.432089}, + {0.315777,-0.677813}, + {-0.187516,0.604001}, + {-0.350366,-0.868253}, + {0.358178,0.239084}, + {-0.355413,0.043801}, + {-0.114867,0.567550}, + {0.031781,0.301042}, + {-0.447827,-0.086481}, + {0.347362,-0.347636}, + {1.466736,-1.298975}, + {1.198740,-0.131404}, + {1.300932,0.897703}, + {0.490673,-0.229079}, + {-0.330844,-0.232505}, + {0.025943,0.810266}, + {-0.261850,-0.280763}, + {-0.607853,1.415846}, + {0.498158,-1.107135}, + {0.674920,-1.200670}, + {-0.527907,0.318037}, + {-0.097676,0.532536}, + {-0.475594,0.848160}, + {1.642276,-0.891873}, + {-0.019197,-0.109536}, + {0.784795,0.260554}, + {-0.431823,-0.907632}, + {-0.763132,-0.342258}, + {0.570806,-0.517628}, + {-0.522336,0.403684}, + {0.307563,-1.143478}, + {0.825753,0.031997}, + {0.368023,-0.139664}, + {2.021968,-0.943570}, + {0.245160,-0.269865}, + {1.303964,0.871270}, + {-0.453218,0.819811}, + {0.594784,0.655540}, + {-0.891577,-0.373922}, + {0.538908,-0.710190}, + {0.930254,0.481708}, + {0.307017,-0.652410}, + {-0.201791,-0.804746}, + {-0.740248,-0.045989}, + {0.865316,0.507359}, + {0.112008,0.675150}, + {0.390570,-0.737997}, + {0.588187,-0.739911}, + {-0.557253,0.208247}, + {-1.425644,-0.743117}, + {0.400609,-1.036328}, + {0.703460,0.720835}, + {-1.235671,0.360834}, + {0.977538,0.800469}, + {-0.215826,-0.917093}, + {0.464002,-0.108658}, + {-0.170525,1.430161}, + {0.249880,0.881905}, + {0.039538,0.515360}, + {0.589463,1.687736}, + {-0.918504,0.398258}, + {0.885603,-0.419459}, + {-0.103454,0.517781}, + {-1.403384,0.991157}, + {-1.129402,-0.084304}, + {0.631421,-0.053522}, + {1.013885,-0.201949}, + {0.677556,0.891074}, + {0.761542,-0.055830}, + {1.043183,0.841930}, + {0.116780,0.047638}, + {-0.379538,0.850317}, + {0.899566,-1.508949}, + {-0.360145,-0.726620}, + {-0.394237,0.504382}, + {1.299661,-0.904075}, + {0.037135,-1.543567}, + {0.025721,-1.294574}, + {-0.201345,-0.573420}, + {-0.805476,1.100473}, + {-0.222557,0.815637}, + {0.745171,-0.443108}, + {-0.051322,0.385340}, + {0.415288,0.967950}, + {0.567228,0.929748}, + {-0.981482,0.368396}, + {-0.322623,0.925524}, + {0.036004,-1.359715}, + {-1.239654,0.547052}, + {0.569381,0.209552}, + {0.999405,0.435894}, + {0.209398,-0.035708}, + {-0.616545,-1.367319}, + {-0.032505,0.893263}, + {-0.753972,-0.284855}, + {-1.122253,0.694921}, + {0.062416,0.560687}, + {-0.867416,0.682553}, + {-0.093222,0.154366}, + {-0.881648,0.429238}, + {-0.190308,-2.089628}, + {0.066021,0.756615}, + {0.514725,-0.798372}, + {0.053171,-1.408616}, + {0.209844,0.661365}, + {-0.353419,0.830578}, + {0.283011,-0.510899}, + {1.844187,0.067852}, + {0.452893,0.042450}, + {1.522679,0.732928}, + {0.455406,-0.622942}, + {0.434744,-0.877805}, + {0.156233,0.549888}, + {-0.488361,0.683512}, + {-0.709181,-0.074767}, + {1.094457,-1.430172}, + {-1.090533,-1.200256}, + {0.467875,-1.396375}, + {-0.216862,0.998395}, + {0.845417,0.461581}, + {-0.243621,-1.037224}, + {1.009367,-0.804843}, + {-0.733158,-0.634989}, + {-0.317695,0.187141}, + {1.042970,-0.479150}, + {0.574917,-0.396721}, + {-0.753535,0.501924}, + {0.176516,0.011773}, + {-0.252053,-0.567245}, + {0.523082,0.913279}, + {-1.555099,0.401929}, + {-0.437464,0.181542}, + {-0.873226,0.044419}, + {0.219685,1.157821}, + {-0.254417,-1.517094}, + {0.091563,-0.354438}, + {-0.528333,-0.170731}, + {0.995211,0.678314}, + {-0.898812,-0.064997}, + {-0.013840,0.293050}, + {-0.839259,-0.587023}, + {-0.945978,-0.617619}, + {-0.895625,0.302625}, + {1.051869,0.573372}, + {-0.825980,-0.122912}, + {0.163980,1.256745}, + {0.706734,0.124522}, + {-0.361175,0.101887}, + {1.057818,-0.426948}, + {-0.675053,1.031729}, + {0.206726,0.279056}, + {0.389211,-0.301896}, + {1.063765,0.619761}, + {0.352544,0.613860}, + {0.128183,-0.129278}, + {-0.839177,0.102129}, + {-1.009067,0.298734}, + {0.002993,-0.360330}, + {1.224970,-0.160513}, + {1.106708,-0.229533}, + {-1.032136,-0.377685}, + {-0.236230,0.001354}, + {0.410400,0.222334}, + {0.392320,1.483927}, + {0.665122,0.691449}, + {-0.455393,-0.602445}, + {-1.351692,0.738197}, + {-0.766579,0.268302}, + {1.589365,0.864385}, + {0.070446,0.850433}, + {-0.308235,-0.135000}, + {-0.292362,-1.347597}, + {1.555687,-0.715862}, + {-0.014022,-0.045398}, + {-0.446291,1.226295}, + {-1.032951,-0.093507}, + {-0.899258,1.039720}, + {-1.078121,-0.867005}, + {0.520897,0.494706}, + {-0.211998,-0.448273}, + {0.580937,-0.430233}, + {0.179600,0.873513}, + {0.808713,-1.022514}, + {0.555485,0.127189}, + {0.880953,-0.143050}, + {1.149157,0.917433}, + {-0.893810,0.428443}, + {-1.266854,-0.409126}, + {-0.626689,0.378355}, + {-0.164413,-0.184089}, + {-0.898300,0.593376}, + {-0.547055,0.834128}, + {-1.142588,-0.422562}, + {-0.284378,-0.254682}, + {0.791523,-0.756468}, + {0.485108,-0.001937}, + {-1.059758,-0.298921}, + {0.575755,0.321922}, + {0.126469,0.056855}, + {0.481604,-0.118000}, + {-0.161121,-0.348846}, + {-0.018420,0.600699}, + {1.149129,-0.048108}, + {-0.542935,-1.132408}, + {0.615102,0.119735}, + {-0.401196,-0.056096}, + {0.240128,-0.191069}, + {-0.230665,0.650328}, + {-1.043812,0.267771}, + {-0.337422,-1.346232}, + {-1.272762,0.339037}, + {-0.577232,0.042670}, + {-0.024654,1.721493}, + {-0.290755,-0.294420}, + {0.050099,-0.241641}, + {0.523826,-0.443739}, + {1.259578,0.041380}, + {1.203733,-0.585998}, + {0.759313,-0.279728}, + {-0.270898,0.554221}, + {0.319001,0.630204}, + {-1.012906,-1.065616}, + {-0.064960,-0.895967}, + {-0.439101,-0.524601}, + {0.648934,-0.701096}, + {0.990764,-1.487838}, + {0.266843,0.072485}, + {-1.337164,-0.177902}, + {0.882257,-0.971672}, + {0.443937,1.419520}, + {0.489435,0.600496}, + {-1.048080,0.668837}, + {0.080006,-0.024016}, + {0.393861,-0.144830}, + {0.029134,-0.594013}, + {0.020636,0.866641}, + {-0.695757,-0.655914}, + {-0.145142,-0.618203}, + {-0.302988,-0.495213}, + {-0.462676,1.085804}, + {0.153729,-0.610300}, + {-0.098602,1.025134}, + {-0.571255,-1.464634}, + {-0.761817,0.959088}, + {-0.975994,-0.370398}, + {-0.313675,0.590253}, + {0.297074,0.390224}, + {-0.582347,-0.270186}, + {-0.652665,-1.353611}, + {-0.019627,0.000436}, + {0.117063,0.851400}, + {-0.123453,-0.339978}, + {-0.071860,-0.712601}, + {-0.150279,0.705257}, + {0.346280,-0.008366}, + {-0.959111,0.297700}, + {0.620350,-0.430125}, + {-0.047112,0.050720}, + {1.805691,-0.047197}, + {1.715418,-0.183448}, + {-1.158967,2.090597}, + {0.743999,-1.778906}, + {0.025331,-0.388354}, + {0.518336,-0.327919}, + {1.166154,-0.289812}, + {0.029288,1.018113}, + {0.007631,-0.292880}, + {-1.468947,0.677554}, + {0.948800,-0.363516}, + {0.363116,-1.186390}, + {0.033570,-0.368930}, + {-1.920066,-0.183494}, + {1.245028,1.360201}, + {0.157701,0.511411}, + {-0.725534,0.913929}, + {-0.642394,0.108628}, + {1.433083,0.355667}, + {-0.351948,0.578183}, + {0.229656,-1.065693}, + {-0.231833,0.177390}, + {1.099345,-0.553877}, + {-1.922732,0.038200}, + {-0.200014,1.349928}, + {0.725471,-1.057210}, + {0.242414,0.445252}, + {-0.886991,-0.408397}, + {0.510536,0.822131}, + {-0.260030,0.343419}, + {-0.214564,-1.138471}, + {-0.008637,-0.579129}, + {-0.761397,-0.872982}, + {0.350951,0.624380}, + {0.900611,0.816234}, + {-0.522778,0.207549}, + {-0.760791,0.034648}, + {0.375186,0.362076}, + {0.112175,0.831388}, + {-1.242682,-0.022903}, + {0.331423,0.701496}, + {0.253687,-0.488079}, + {-0.873518,0.279186}, + {0.231592,-0.385780}, + {-0.701089,-0.501785}, + {-0.241921,-1.391418}, + {0.019241,0.106733}, + {0.591344,-1.051357}, + {0.745421,-0.610140}, + {-0.606596,0.169312}, + {-0.372797,-0.501536}, + {-0.768757,0.841569}, + {-0.348190,0.051062}, + {0.063387,0.584047}, + {0.329073,-0.791211}, + {0.514938,0.740972}, + {0.273985,-0.582246}, + {-0.967329,0.578559}, + {0.415417,0.124701}, + {-0.098539,0.385786}, + {-0.004510,-0.248503}, + {0.555897,0.242153}, + {1.579329,0.015322}, + {0.230998,1.990804}, + {0.363098,0.553719}, + {1.562863,0.478130}, + {0.026208,0.305355}, + {1.116516,0.360515}, + {-0.982566,-0.465728}, + {-0.508676,-0.878270}, + {-0.144291,0.415225}, + {-1.350074,-0.098142}, + {1.616341,-1.518052}, + {0.104774,0.015461}, + {0.374867,-1.531420}, + {-0.416475,-0.114543}, + {-0.739622,-1.138037}, + {-0.923005,1.062459}, + {-0.664320,-0.280073}, + {-1.156293,-0.337499}, + {-0.689945,0.344369}, + {1.058939,0.443670}, + {-1.285207,0.147568}, + {0.475596,0.835141}, + {-0.239945,1.476067}, + {0.025039,0.541449}, + {-0.101321,-0.682732}, + {-0.546186,-0.130474}, + {-0.433541,0.503623}, + {0.464975,1.359146}, + {-0.567927,0.964406}, + {-1.219789,-1.539823}, + {-0.016740,0.669833}, + {0.182447,-0.271553}, + {-1.320623,1.306323}, + {-0.000075,-0.219999}, + {-1.536075,0.914474}, + {-1.404556,-1.020084}, + {-0.150083,0.236011}, + {0.516978,0.585327}, + {0.241503,0.030283}, + {-0.329743,0.849644}, + {-0.537257,1.132562}, + {0.817902,-0.281236}, + {1.432319,0.095690}, + {0.632687,-0.576622}, + {-0.734149,0.271036}, + {0.459345,-0.277828}, + {0.305288,-0.697961}, + {-1.187887,0.415304}, + {0.796687,-0.667703}, + {0.059859,0.503282}, + {-0.674526,0.557001}, + {0.761860,-0.342605}, + {-0.553691,-0.066432}, + {0.158447,0.486740}, + {0.871085,-0.243732}, + {-0.618374,0.322577}, + {0.211178,-0.228494}, + {0.256709,-0.631463}, + {0.136058,-0.407427}, + {0.386538,-0.076609}, + {0.363731,0.067482}, + {-0.693882,0.964447}, + {1.052294,-0.778507}, + {-0.404876,-1.906265}, + {0.357725,-0.223712}, + {-0.899349,-0.135851}, + {0.297922,-0.353175}, + {0.378138,0.542955}, + {0.948882,-0.008489}, + {-1.168557,-0.095203}, + {0.196487,1.331091}, + {-1.592780,-0.195128}, + {0.496292,0.257436}, + {0.094574,0.257786}, + {0.179735,0.175672}, + {-0.773849,-0.867187}, + {-0.218875,-0.151987}, + {-1.457404,0.561553}, + {-0.766543,-1.240765}, + {-0.311424,-0.241690}, + {1.593359,-0.990696}, + {-1.347961,-0.110373}, + {0.087199,-0.249410}, + {-0.381577,0.193060}, + {1.290974,0.330803}, + {-0.264855,-0.062533}, + {1.932407,-0.669281}, + {1.404137,-0.854353}, + {0.032966,-0.375454}, + {-0.665186,-0.403770}, + {-0.669869,0.889790}, + {0.897455,-0.188428}, + {0.730249,1.021129}, + {-0.843537,-0.297006}, + {0.429220,-0.539707}, + {0.449427,-0.771936}, + {-0.429601,0.576114}, + {0.055077,-0.604795}, + {-0.278586,0.300688}, + {0.067531,-1.925382}, + {-0.924128,-0.958812}, + {-0.337994,-0.727637}, + {-0.457529,1.034296}, + {0.370646,-0.836115}, + {-0.467752,0.409464}, + {-0.334921,-0.540654}, + {0.832486,0.959241}, + {0.746558,0.657005}, + {-0.318685,-1.230673}, + {-0.169521,0.642337}, + {0.789263,0.831460}, + {0.223756,0.414123}, + {-0.325954,-0.321332}, + {0.075028,0.967698}, + {0.216434,-0.716844}, + {-0.776716,0.826807}, + {-0.074531,0.812789}, + {-0.537597,1.026980}, + {0.152495,0.982402}, + {0.413097,-0.552747}, + {0.611235,-0.071720}, + {-0.491325,-0.356869}, + {-0.486791,-0.626587}, + {0.204293,-0.436972}, + {-0.211208,-0.432147}, + {-0.561132,1.073539}, + {-0.070137,-0.184257}, + {-1.115610,-0.477053}, + {1.018256,0.435396}, + {0.301658,-0.197887}, + {-0.147236,1.059088}, + {-0.888603,0.328241}, + {-1.070295,-0.599636}, + {0.316661,0.365444}, + {-0.212919,-0.409418}, + {-0.753071,0.087512}, + {0.404576,0.038580}, + {-1.504748,-0.267729}, + {-0.313997,-0.930065}, + {-0.236354,-1.238931}, + {-0.376294,0.405383}, + {1.291459,-0.346108}, + {-0.297634,0.589772}, + {0.110657,-0.512851}, + {-1.955329,-0.456873}, + {-1.247619,0.482959}, + {0.083895,-0.640105}, + {-0.396012,1.108095}, + {0.909912,-0.470332}, + {-0.049822,-0.096660}, + {0.363109,0.186229}, + {-0.314218,-0.256700}, + {-0.295377,-0.825150}, + {-0.122935,0.847107}, + {0.254378,0.637229}, + {0.103655,1.262402}, + {0.673758,-0.803048}, + {0.318196,-0.206245}, + {0.385547,0.450488}, + {-1.392342,0.052822}, + {-0.665772,0.103675}, + {0.426712,-1.222266}, + {-0.075608,-0.769710}, + {-0.548068,-0.642260}, + {0.647223,0.860224}, + {0.483236,0.514534}, + {0.398769,0.050907}, + {1.229950,0.745029}, + {0.911489,1.188746}, + {-0.099161,-0.697764}, + {0.247348,-0.284992}, + {-0.248089,-0.862396}, + {0.846203,-1.166603}, + {0.906759,0.708414}, + {-1.122335,-0.402972}, + {-0.118882,-0.437190}, + {-0.430711,0.992516}, + {-0.985280,-0.933490}, + {0.753059,-1.029240}, + {0.074035,1.011795}, + {-0.554878,-0.736494}, + {0.137578,-0.170962}, + {0.010941,0.160870}, + {-0.287390,-0.081999}, + {-0.915608,-0.288509}, + {1.009344,0.455340}, + {-1.170750,0.374210}, + {-0.509900,0.696984}, + {-0.073667,0.542572}, + {0.508428,-0.509940}, + {0.162651,-0.619031}, + {-0.894067,-0.370045}, + {-1.100994,0.144700}, + {-0.361678,0.973850}, + {-0.592640,0.709252}, + {0.482369,0.464118}, + {0.646740,0.794370}, + {-1.518095,-0.047480}, + {-2.480153,0.558073}, + {0.171995,-0.118977}, + {-0.307031,-0.408313}, + {0.667857,0.886201}, + {1.215072,-1.815363}, + {0.636451,-0.999552}, + {1.038871,0.746703}, + {0.799771,-0.633650}, + {-0.478658,0.963576}, + {0.660793,-0.396006}, + {-0.366382,-0.010134}, + {-0.126455,0.550368}, + {-0.295040,-0.019897}, + {-0.189119,0.144486}, + {-0.409427,-0.246134}, + {-0.749594,1.158845}, + {-0.619952,-0.568661}, + {0.418661,-0.682120}, + {0.022881,-0.611217}, + {0.745549,-0.999202}, + {0.223803,-1.326778}, + {-0.512690,-0.409827}, + {0.730464,0.154411}, + {0.304366,0.129614}, + {1.037600,-0.642403}, + {-1.589766,0.575436}, + {1.303312,1.195870}, + {-0.048468,-0.161105}, + {-0.583344,0.721412}, + {-0.598792,-1.629398}, + {-1.184964,0.686923}, + {-0.206515,0.128982}, + {-1.354328,0.347421}, + {-0.305114,-0.063748}, + {-0.148754,1.025688}, + {1.386647,-0.299267}, + {0.623479,0.660380}, + {0.111936,-0.215479}, + {0.164504,-0.448971}, + {-1.298132,-0.229643}, + {-0.544931,0.273312}, + {0.708111,1.131149}, + {-1.025639,0.983595}, + {-0.874828,0.448445}, + {0.083092,0.131569}, + {-0.199073,0.111786}, + {0.471144,-0.582538}, + {-0.002063,-1.209889}, + {0.036177,-0.191428}, + {0.048523,-0.482262}, + {-0.591823,0.022019}, + {-0.957858,0.379499}, + {-0.388964,-0.030605}, + {-1.067693,-0.564523}, + {0.683215,0.452901}, + {-0.417523,-0.888896}, + {0.116388,-0.001175}, + {-0.530451,-0.402808}, + {-0.501828,-0.447776}, + {-0.312741,-0.320066}, + {0.239558,0.274188}, + {0.413057,-0.479391}, + {0.804059,0.228824}, + {0.251042,-0.392509}, + {-0.977828,-0.114416}, + {0.706358,0.019025}, + {-0.604572,-0.619421}, + {-0.965764,0.532922}, + {-0.557196,-0.448498}, + {0.117221,-2.151584}, + {0.339451,0.235127}, + {1.163795,0.355797}, + {-0.724402,0.409418}, + {0.255004,0.576204}, + {-0.258374,0.349667}, + {1.028698,-0.794530}, + {0.527963,1.589823}, + {0.719742,-0.748712}, + {0.368928,-0.686335}, + {0.065692,0.585041}, + {-0.125019,-0.273104}, + {-0.241274,-0.481545}, + {0.254201,0.650913}, + {-0.612250,0.134043}, + {-0.040628,1.546205}, + {-0.153613,-0.158336}, + {0.573747,-0.368891}, + {0.247576,-0.546121}, + {-0.327529,-0.227120}, + {0.909237,0.293783}, + {-0.641484,1.032472}, + {0.945376,-0.976555}, + {-0.097696,-1.005641}, + {0.280105,0.778472}, + {0.129635,-0.266768}, + {0.163724,-0.064104}, + {0.234504,-0.013251}, + {-0.745244,2.072479}, + {-1.437508,0.815776}, + {-0.742229,-0.540598}, + {0.532092,-0.390349}, + {0.231447,-0.072878}, + {0.459868,-0.668039}, + {-1.085061,0.706084}, + {0.666810,-0.686744}, + {0.881553,0.001870}, + {0.028822,-1.283565}, + {-0.420608,0.313733}, + {-0.114939,-0.901210}, + {-0.382738,0.663378}, + {-0.159187,0.391378}, + {0.413518,0.011760}, + {-1.145054,-0.174115}, + {0.657089,-0.093871}, + {0.439769,-0.078178}, + {-0.876726,-1.290887}, + {-0.194151,-0.120212}, + {-0.573588,-0.601036}, + {0.480740,-0.445964}, + {0.246870,0.914457}, + {1.507856,-0.333776}, + {1.176638,0.254658}, + {0.571415,0.268885}, + {-0.635128,0.650310}, + {0.383027,-0.382331}, + {0.464641,-0.511072}, + {0.874510,-0.963842}, + {-0.540770,-0.325872}, + {0.253789,-0.123098}, + {-0.270305,0.172002}, + {-1.031316,0.278028}, + {-0.332885,-0.499473}, + {0.120825,-0.860634}, + {-0.643136,-0.068827}, + {-0.040357,0.200742}, + {-0.933480,0.185052}, + {0.771612,-0.286406}, + {0.939360,-0.140307}, + {0.028340,0.302658}, + {-1.188171,-0.068560}, + {-0.180113,0.072284}, + {-0.550815,-0.947792}, + {-0.643721,-0.045899}, + {0.092203,-0.288068}, + {0.439139,0.467489}, + {0.682732,-0.634377}, + {-0.736317,-0.107723}, + {-0.237552,-1.170557}, + {-1.265348,-0.851037}, + {-0.117957,-0.085973}, + {1.102227,-0.027409}, + {0.201656,0.258550}, + {-0.341302,0.345698}, + {-0.226687,0.021001}, + {0.300950,0.747520}, + {-0.548719,-0.764005}, + {0.342371,0.650129}, + {-0.197264,-0.406966}, + {0.253969,0.590828}, + {-0.654232,-0.911205}, + {-0.069347,-0.649115}, + {-0.302273,-0.962710}, + {-0.858735,-0.734358}, + {0.824973,0.347623}, + {0.561939,-0.332102}, + {-0.149910,-0.141332}, + {-0.329960,-0.276681}, + {-0.477825,0.796294}, + {-0.929950,-1.013256}, + {0.660669,-1.277091}, + {0.992162,0.447772}, + {-0.304259,1.500934}, + {-0.057727,0.903363}, + {0.674917,0.876704}, + {-0.634144,-0.191583}, + {0.845197,-1.233301}, + {-1.661000,0.075804}, + {-0.514972,0.235703}, + {0.140527,0.185480}, + {-0.234079,-1.451824}, + {-0.405753,0.462321}, + {1.170499,0.117621}, + {0.131879,0.114231}, + {0.965116,-0.378527}, + {0.206708,-0.220844}, + {-0.187811,0.488983}, + {-0.661154,-0.013639}, + {-1.372899,-0.391042}, + {-0.208436,0.141927}, + {-0.900758,0.338770}, + {-1.061068,-0.473609}, + {-0.442850,-0.150059}, + {-0.656915,-0.213440}, + {-0.519110,0.388374}, + {0.552973,0.412297}, + {0.246784,0.360372}, + {0.037668,-0.058916}, + {-1.348537,-0.018245}, + {-0.618509,0.055222}, + {0.618511,-0.123750}, + {-0.034437,-0.099757}, + {0.323428,-0.652759}, + {0.154987,0.899311}, + {1.781830,-0.153147}, + {0.035979,1.188616}, + {0.488400,0.697546}, + {-0.446666,0.281943}, + {-0.453892,0.528215}, + {-0.688147,-1.008588}, + {-0.390631,0.389458}, + {-1.194630,-0.928712}, + {0.678735,-0.466324}, + {0.976499,-0.038259}, + {1.396877,-0.138085}, + {-1.430019,0.335065}, + {-0.055289,-0.927780}, + {0.485662,0.485284}, + {0.201981,0.537132}, + {0.363088,1.731858}, + {-0.668758,0.465720}, + {0.077665,0.666078}, + {-1.566421,0.040135}, + {-0.355676,-1.374433}, + {-1.271148,0.473298}, + {-0.709383,-1.088175}, + {0.072900,-0.383878}, + {-0.221073,0.694508}, + {0.979392,0.358300}, + {-0.468658,-1.257957}, + {-0.986421,-0.688206}, + {0.774736,0.025302}, + {-0.350405,-1.379404}, + {0.265043,-0.179214}, + {0.632730,0.655965}, + {-0.580958,0.073589}, + {-0.674751,-0.329321}, + {-0.157258,0.366028}, + {-0.167454,0.458918}, + {0.360995,-0.045800}, + {0.541670,0.414036}, + {-0.953282,0.396081}, + {-0.640341,-0.815884}, + {0.099247,0.488115}, + {1.028320,-1.065518}, + {-0.608843,-0.394921}, + {-0.660332,0.127980}, + {1.215143,-0.784662}, + {-0.597942,0.410855}, + {-0.460977,-1.731878}, + {-1.125346,-0.522925}, + {0.160018,-0.890953}, + {0.354174,0.463096}, + {0.432617,0.091890}, + {-0.537692,0.916233}, + {-0.231298,-1.123082}, + {0.448289,0.048934}, + {0.141959,0.248023}, + {-0.239098,1.258853}, + {0.659532,0.029834}, + {1.296697,-0.068587}, + {-0.566528,0.709376}, + {-0.408385,-0.069338}, + {-0.390137,0.783384}, + {-1.620428,-0.505653}, + {0.410443,-0.303323}, + {-0.550195,-0.764973}, + {-0.576556,0.263301}, + {-0.600212,0.262565}, + {-0.122290,-0.126754}, + {0.331186,-1.519006}, + {-0.345319,-0.461422}, + {-0.572596,0.480422}, + {1.103205,0.915259}, + {0.118307,1.801626}, + {-0.764045,0.235550}, + {-0.022141,1.201361}, + {0.028013,0.044403}, + {0.488177,0.026615}, + {-0.623776,-0.232662}, + {-0.961218,0.888319}, + {0.486462,-0.519644}, + {0.199430,-0.047332}, + {0.947899,1.148955}, + {0.169357,-1.336189}, + {-0.930552,-0.016437}, + {-0.518731,0.323647}, + {1.068277,-0.408039}, + {0.873528,-0.510827}, + {-0.062329,-0.013528}, + {0.016866,0.267559}, + {1.056129,-1.027253}, + {-0.539801,0.935748}, + {0.096848,-0.037621}, + {-0.095070,-0.255447}, + {-0.848099,0.443100}, + {0.639670,-0.048560}, + {0.923418,-0.283416}, + {1.456548,-1.294075}, + {-1.764045,-0.439263}, + {0.461557,0.172525}, + {-0.436138,0.071867}, + {-0.673432,0.538713}, + {0.312169,0.260254}, + {0.103237,-0.512787}, + {-1.493843,0.399438}, + {0.819913,1.366162}, + {-0.016400,1.497652}, + {0.215513,-0.225488}, + {-0.017414,-0.407048}, + {-0.020617,0.629335}, + {0.224152,0.982394}, + {-0.511165,-0.579162}, + {0.007663,0.124781}, + {0.108301,0.792560}, + {0.158005,0.407386}, + {-0.182543,-0.165334}, + {1.159181,-0.510782}, + {0.280196,-1.062985}, + {0.236496,-0.145702}, + {-0.422758,1.424397}, + {-0.331449,-0.193450}, + {0.192874,-0.427651}, + {0.112059,0.188264}, + {-0.272202,0.107938}, + {-0.760328,-0.363161}, + {-0.726426,1.597634}, + {-0.071579,0.949224}, + {0.308458,0.255762}, + {1.021180,-0.266580}, + {0.143714,0.679690}, + {0.402213,-0.431472}, + {0.325377,-0.219868}, + {1.102590,0.967718}, + {0.358516,-0.734835}, + {0.014624,0.178090}, + {0.448299,-0.407042}, + {-0.611858,-0.011623}, + {1.077674,-0.250480}, + {-0.299770,0.274045}, + {-0.091250,0.162794}, + {0.263684,0.580732}, + {-0.524096,0.453355}, + {1.220175,-0.439485}, + {0.505437,0.769273}, + {-0.448804,-0.993002}, + {-0.443388,-0.483274}, + {-0.523477,-0.401425}, + {-0.313273,-0.056149}, + {0.050769,0.557578}, + {-0.702026,-0.345979}, + {-0.323416,0.362591}, + {0.804164,0.415913}, + {0.366415,0.231610}, + {-0.674289,2.719386}, + {-0.390476,-0.001017}, + {0.634584,0.043129}, + {-0.165932,-0.088890}, + {-0.084003,0.164003}, + {0.326900,-0.176912}, + {0.846530,-0.575045}, + {0.379000,-0.560151}, + {-0.045598,-1.256528}, + {0.004132,-0.330289}, + {0.801731,0.102068}, + {0.310208,-0.016975}, + {0.804024,-0.848600}, + {0.530551,0.564239}, + {-0.217442,-0.406346}, + {0.482194,-0.354971}, + {1.013284,0.341576}, + {-0.189813,-0.158867}, + {0.057823,0.314484}, + {-0.385227,0.961346}, + {-0.252099,0.877088}, + {-0.150246,0.399242}, + {0.227240,-0.011056}, + {-0.906256,0.232546}, + {0.447790,0.615224}, + {0.710736,0.413033}, + {0.332351,0.394525}, + {-1.111575,-0.892920}, + {0.671354,0.236546}, + {-0.530462,0.833944}, + {-0.487734,-0.933744}, + {-0.279573,0.015821}, + {0.150636,0.941044}, + {-0.490255,-1.718709}, + {-0.562611,-0.050636}, + {0.161397,-0.336955}, + {-0.581458,0.013550}, + {1.301819,-0.243034}, + {0.328760,-0.383835}, + {-0.558614,0.312557}, + {-0.994847,-0.123656}, + {-0.946885,-0.460904}, + {-0.150270,0.629816}, + {0.059610,-0.005996}, + {-0.577683,-0.466143}, + {-0.471025,-0.278965}, + {-0.148945,-0.324783}, + {1.276411,0.305076}, + {0.980279,-0.070273}, + {1.162642,0.100148}, + {1.843762,0.357636}, + {-1.342349,-0.353233}, + {-0.436687,-0.095269}, + {-0.805848,0.606225}, + {0.871641,-1.329340}, + {0.184974,1.265810}, + {-0.244617,-0.882645}, + {-0.907868,-0.039793}, + {1.031712,0.603956}, + {-0.320916,0.296021}, + {0.769198,0.408169}, + {0.273306,-1.560085}, + {-0.845221,-0.120352}, + {-0.292803,-0.487164}, + {-1.188451,1.021220}, + {0.712612,-0.904145}, + {1.536593,0.458014}, + {0.948114,-0.292910}, + {0.183039,-0.763955}, + {2.157607,-0.224608}, + {-0.273569,-0.394222}, + {-0.431183,0.416926}, + {0.132424,-0.348722}, + {0.753581,1.216860}, + {-0.337171,-0.893545}, + {-1.120653,-0.243974}, + {1.019687,0.181340}, + {1.477047,-0.821085}, + {0.046624,-0.107856}, + {0.433614,-0.195993}, + {-0.405870,-1.017501}, + {-0.050243,0.119354}, + {-0.671673,0.243350}, + {-0.315893,1.721316}, + {-0.083615,0.238805}, + {-1.037536,0.577163}, + {-0.913802,-0.523424}, + {1.219618,-0.315761}, + {1.146100,0.517259}, + {-0.895445,-1.015857}, + {0.514174,0.575290}, + {-0.123435,0.745106}, + {0.702053,0.848669}, + {-0.342611,-0.957096}, + {-0.289839,-0.316382}, + {-0.397795,0.021996}, + {-0.677843,0.971322}, + {0.361514,-0.183216}, + {0.080051,-0.295673}, + {1.160202,-0.910675}, + {-0.150463,0.736822}, + {-0.709405,-0.203295}, + {-0.350063,0.552303}, + {-0.721111,0.319029}, + {-0.253701,-0.103668}, + {-0.750172,-0.320345}, + {-1.206247,-0.063426}, + {-1.373506,0.124767}, + {0.508866,0.460720}, + {-1.336954,0.210008}, + {-0.631641,-0.072041}, + {0.928787,-1.037158}, + {0.032754,1.022849}, + {0.666725,-0.698994}, + {-0.426685,0.073876}, + {0.641602,0.815373}, + {0.375179,-0.463772}, + {-0.233340,1.332766}, + {-0.588562,0.673215}, + {-1.583380,0.174935}, + {0.183747,-0.026180}, + {-0.037925,-0.435531}, + {0.421545,-1.077913}, + {0.739201,0.256848}, + {0.278009,-0.012421}, + {1.071530,-1.464473}, + {0.879311,0.140050}, + {0.690285,-0.379450}, + {-0.359215,0.696639}, + {0.445641,1.003849}, + {-0.471426,0.216653}, + {0.747519,-0.191435}, + {0.609888,1.087821}, + {-0.114237,0.707995}, + {0.310145,-0.068274}, + {0.238114,0.520310}, + {0.188092,-0.863861}, + {-0.272074,0.545071}, + {-0.584299,0.335263}, + {0.568218,0.803199}, + {-0.430740,0.419229}, + {-0.900838,0.175793}, + {0.241127,0.980598}, + {0.229357,-0.402579}, + {-0.005071,0.451806}, + {-0.169403,0.001801}, + {0.498114,0.632898}, + {0.880223,-0.529746}, + {-0.868428,0.322017}, + {-0.934466,0.316410}, + {-0.153631,-0.037373}, + {-0.402630,-0.960009}, + {0.069345,1.147181}, + {0.538025,0.497931}, + {-0.752724,0.353508}, + {1.119766,0.340039}, + {2.267532,-0.419679}, + {0.867285,-0.861810}, + {-0.219850,0.147761}, + {-1.333873,0.140060}, + {0.349306,-0.296989}, + {1.246670,-0.360293}, + {0.448126,1.393103}, + {0.458653,-0.009429}, + {0.897902,0.163413}, + {-0.423687,0.569503}, + {0.533119,-0.220683}, + {-0.561732,-0.975309}, + {0.881865,0.101322}, + {-0.304062,0.840913}, + {0.773744,-0.251265}, + {0.767785,-0.089005}, + {0.093558,0.166969}, + {-0.144223,0.543223}, + {0.599210,-0.139195}, + {-0.757562,0.974285}, + {1.287608,-1.166102}, + {0.851889,0.840470}, + {-0.060754,1.083686}, + {0.613368,0.304015}, + {-0.379987,-0.439814}, + {-0.329733,-0.112941}, + {-0.424859,-0.739637}, + {-1.793210,-1.188762}, + {-0.635379,-0.904453}, + {0.257752,-1.166231}, + {0.795667,-1.099593}, + {0.943045,-0.741673}, + {0.132503,-0.740775}, + {-0.441437,-0.158045}, + {0.625827,-0.791281}, + {0.206786,0.183906}, + {0.838373,-0.394791}, + {0.800490,0.460415}, + {0.158553,0.035947}, + {0.941686,1.030037}, + {-0.449424,0.181222}, + {-0.064192,0.321760}, + {-0.818197,-0.517869}, + {-1.001442,-0.964262}, + {-0.341690,0.209038}, + {0.769880,-0.509106}, + {-1.800834,-0.977495}, + {0.934141,-0.956871}, + {-0.544929,-0.234843}, + {0.052514,-0.188411}, + {0.020671,0.409432}, + {-0.446867,0.177584}, + {-0.018809,0.439592}, + {-1.004284,-1.141000}, + {0.165529,-0.054725}, + {0.209767,0.617396}, + {-0.141390,-0.133027}, + {-0.035609,0.141281}, + {-0.178184,1.191617}, + {0.543428,0.601854}, + {-0.095008,-0.455613}, + {-0.059113,0.233037}, + {0.233059,-0.139516}, + {0.272380,-1.266193}, + {0.618656,0.116292}, + {-0.009285,0.623049}, + {0.096660,0.123946}, + {-1.580974,0.525244}, + {0.206597,1.002594}, + {0.089974,-0.500957}, + {1.895818,0.543035}, + {-0.305681,0.122755}, + {0.221252,0.227730}, + {-0.820677,-0.365112}, + {0.947046,0.458062}, + {0.542810,-0.838007}, + {-0.052196,-0.075847}, + {0.814450,-0.744863}, + {-0.567190,0.264126}, + {0.237717,0.018269}, + {-0.703420,0.405742}, + {0.614185,0.753346}, + {-1.418353,0.214996}, + {-0.860688,0.915467}, + {-0.360367,-0.260405}, + {1.472941,0.435927}, + {0.446222,0.730291}, + {-0.144925,-0.561438}, + {-1.750887,-0.525869}, + {0.340149,-0.191235}, + {0.377149,0.915875}, + {0.114776,0.838241}, + {1.129547,-0.141350}, + {0.184851,-0.695700}, + {-0.534036,-0.634324}, + {-0.340427,0.321547}, + {-0.404642,-0.697021}, + {-0.253808,-0.192746}, + {-0.596530,-0.932647}, + {-0.838994,-0.405391}, + {-0.755491,-0.342310}, + {-0.057286,-0.358306}, + {-1.447241,1.301361}, + {-1.313619,-1.013152}, + {-0.571824,0.109239}, + {-0.260698,0.606990}, + {0.070246,0.534229}, + {0.597517,-0.037879}, + {-1.094173,-0.410137}, + {-0.254631,-0.246340}, + {0.431483,-0.376672}, + {0.519113,0.214955}, + {-0.076563,0.738583}, + {0.205809,-1.447609}, + {-0.810528,-0.234393}, + {0.229555,0.246711}, + {0.927126,0.590173}, + {-0.466521,-1.469152}, + {0.695727,1.527739}, + {-1.704484,-0.591690}, + {0.307858,0.231491}, + {-0.995968,0.318885}, + {0.661263,-0.555950}, + {-0.712018,0.863494}, + {0.187289,-0.103648}, + {0.148728,0.440236}, + {-0.416693,0.421814}, + {-0.285165,-1.497392}, + {-1.351142,-0.185347}, + {0.484214,-0.136529}, + {0.573682,-1.192687}, + {0.410345,-0.315465}, + {0.848424,0.671905}, + {-1.103233,0.644873}, + {1.299410,0.565215}, + {-0.461676,0.064235}, + {-1.379040,-0.432968}, + {-1.015434,-1.145416}, + {0.129534,0.363062}, + {0.104220,0.288515}, + {1.543944,-1.307105}, + {0.221840,0.109014}, + {-0.184143,0.370434}, + {0.058980,0.873678}, + {0.551447,-0.039445}, + {-0.270308,0.105572}, + {0.469465,-0.104565}, + {0.015573,0.788276}, + {0.749307,1.602021}, + {-0.203181,-0.465786}, + {0.133115,-1.936805}, + {-0.429016,-0.726444}, + {-0.149023,-0.362963}, + {0.397963,-0.235261}, + {1.558527,0.044457}, + {-0.972298,0.805232}, + {-0.807760,-0.399592}, + {0.280215,0.243919}, + {0.137227,-1.792080}, + {-0.651625,0.507164}, + {0.275789,-0.969788}, + {-0.254710,-0.494221}, + {-0.568344,-0.391331}, + {-0.403117,-0.847222}, + {0.850632,0.551661}, + {0.375400,0.202567}, + {0.407655,0.339162}, + {-0.077186,-0.944989}, + {0.853879,0.321790}, + {-0.878723,1.078369}, + {0.402514,0.134404}, + {-0.636014,0.028282}, + {-0.306382,-0.725383}, + {0.596217,0.775472}, + {0.743227,0.136710}, + {0.318624,0.141530}, + {-2.436086,1.380653}, + {-1.525091,-0.330171}, + {0.786829,-0.068407}, + {-0.268204,0.051274}, + {0.026261,-0.264944}, + {0.284678,0.800642}, + {1.139380,-0.635677}, + {0.531484,1.095444}, + {0.061698,-1.585712}, + {-0.200152,-0.292121}, + {0.511662,1.497851}, + {-1.734319,0.421699}, + {0.730265,-0.139450}, + {-0.853009,-0.131672}, + {0.279669,0.232947}, + {-0.265099,-0.688263}, + {-0.929645,-0.286772}, + {-0.125102,-1.125642}, + {1.064545,0.166148}, + {0.733526,-0.916868}, + {-0.934886,0.513751}, + {1.207510,1.425677}, + {-0.027745,0.571540}, + {-1.475919,-1.304595}, + {0.891606,-0.522466}, + {-1.132359,-0.916251}, + {0.769611,1.058327}, + {-0.787181,-0.146081}, + {-0.219027,0.104576}, + {-0.095533,0.083469}, + {-0.115227,0.014563}, + {-1.070410,0.746173}, + {1.109839,-1.229791}, + {-0.326565,0.830876}, + {0.286977,0.532019}, + {-0.769394,0.226197}, + {0.754521,0.827572}, + {-0.361735,-0.367817}, + {-0.546435,-0.902863}, + {0.746461,-0.939287}, + {-0.625963,1.456091}, + {-0.244332,0.173159}, + {0.735755,0.338783}, + {1.161011,-0.592912}, + {0.316221,-0.277843}, + {-0.515322,-0.171536}, + {-0.073174,0.804972}, + {1.050407,-1.065537}, + {0.484378,0.954140}, + {0.939704,-0.717131}, + {-0.746289,0.125873}, + {0.306167,0.822975}, + {-0.688430,-0.009492}, + {0.473809,-0.195759}, + {-0.291123,-0.887642}, + {-1.113639,-0.205191}, + {0.507462,-1.139016}, + {-1.047570,1.061075}, + {0.076114,0.502083}, + {-0.009567,0.771579}, + {0.277710,-1.082459}, + {-0.030487,-0.792313}, + {-0.005490,-0.038347}, + {-0.070947,-0.641452}, + {0.064114,-1.279288}, + {-0.735976,-0.177716}, + {-1.173461,-0.963224}, + {0.642447,-1.215458}, + {-0.542537,-0.779186}, + {0.208617,0.707524}, + {-0.815926,0.734432}, + {-1.362503,0.826668}, + {0.171331,-0.098047}, + {0.299502,-0.977795}, + {-1.423973,0.972393}, + {1.079616,-1.087319}, + {-0.301928,0.824269}, + {1.239375,0.407183}, + {0.060999,-0.016179}, + {0.804982,-0.385257}, + {-0.012938,0.677340}, + {-0.121473,1.046107}, + {-0.173294,-0.590221}, + {0.680903,0.172555}, + {0.901474,-0.638362}, + {-0.754168,0.954427}, + {-1.017190,0.458050}, + {-0.893258,-0.651492}, + {-1.223616,0.734166}, + {-0.551561,0.465105}, + {-0.472743,-1.538767}, + {-0.643332,0.237332}, + {-1.403355,-0.712716}, + {-0.696300,0.281854}, + {0.063601,0.242936}, + {0.140091,-0.361881}, + {-0.466220,0.056740}, + {0.400082,0.655608}, + {-0.218787,0.165453}, + {0.162508,0.460463}, + {0.196531,0.805585}, + {0.867586,-0.796481}, + {-0.103192,-0.372709}, + {1.480107,-0.244144}, + {-0.377288,-0.616448}, + {0.827771,0.615012}, + {0.241670,-0.067976}, + {0.159564,-0.039752}, + {0.202995,-0.531926}, + {-0.635295,-0.300095}, + {-0.112240,-0.452463}, + {-0.005874,-1.283824}, + {-0.902111,-0.502776}, + {0.246129,0.198008}, + {0.478389,0.145563}, + {0.441332,0.687473}, + {-0.247149,0.184176}, + {-0.789643,-0.991969}, + {-1.231853,-0.521080}, + {0.419307,-1.074857}, + {0.844709,0.320482}, + {1.197865,0.314086}, + {-0.515979,0.581945}, + {-0.331012,-0.496182}, + {-0.030485,0.691218}, + {-0.148168,0.839336}, + {-0.386217,-0.545061}, + {0.377549,-2.132758}, + {-0.636174,-0.065140}, + {-0.578408,0.476528}, + {-0.770655,0.716478}, + {-0.315434,0.652659}, + {-0.095634,0.084278}, + {-0.454542,0.493002}, + {-0.466113,-0.638183}, + {-0.452908,0.032110}, + {0.612871,-0.006891}, + {-0.519763,-0.980015}, + {0.216004,1.044187}, + {-0.522556,-1.037992}, + {0.191915,-0.608267}, + {1.409379,-0.193706}, + {-0.007437,-0.406039}, + {-0.109688,-0.212492}, + {0.014242,-0.315274}, + {-1.498715,-0.045784}, + {0.823582,-0.518037}, + {0.453221,-0.453072}, + {0.308668,0.963767}, + {-0.639039,-0.106259}, + {-0.295817,-1.112948}, + {0.149772,1.651655}, + {-0.190802,0.742309}, + {-0.697535,0.406187}, + {0.803067,-0.505165}, + {-0.543679,-0.703909}, + {-0.455789,0.354645}, + {-0.801542,-0.036586}, + {0.803856,-0.099847}, + {-1.193883,-0.353241}, + {1.075654,0.052465}, + {-0.258694,-0.040366}, + {-0.699399,-0.209583}, + {-0.215574,-0.004929}, + {0.632563,0.109047}, + {-0.472713,1.246852}, + {0.558519,0.764899}, + {-1.312153,-0.650642}, + {0.319234,0.096798}, + {-0.116014,1.918017}, + {0.348943,-0.098542}, + {-0.517133,-0.367209}, + {-0.032548,-1.034303}, + {0.328535,-0.909280}, + {0.458397,1.012904}, + {0.159957,0.751975}, + {0.448532,1.165521}, + {-0.289242,-1.073650}, + {0.221077,0.996689}, + {0.271276,0.400481}, + {-0.293484,0.257531}, + {0.380645,-0.869409}, + {1.060007,-1.185366}, + {-0.683863,-0.654862}, + {0.335272,0.036245}, + {-0.230655,0.834185}, + {-0.012915,-0.531325}, + {0.024833,-1.050938}, + {-0.708008,0.918939}, + {-0.825306,-0.060127}, + {0.253139,0.491280}, + {0.680471,0.175579}, + {-0.198326,-0.665312}, + {-0.922970,-0.808154}, + {0.156470,-0.797370}, + {-0.783536,-0.469965}, + {0.341051,0.873579}, + {-2.007647,0.681225}, + {0.364041,-0.508894}, + {-0.015955,0.350543}, + {-0.291678,-0.998941}, + {0.239003,-0.487403}, + {-0.327758,-0.508257}, + {-0.539391,-0.798760}, + {-0.540462,-0.564731}, + {-0.620798,0.707924}, + {0.256000,0.452068}, + {0.385059,1.172229}, + {0.360328,-0.171884}, + {-0.572500,0.532958}, + {0.648164,0.071339}, + {-1.027705,-1.054336}, + {0.522261,-0.590621}, + {-0.019556,0.572396}, + {0.607990,0.481700}, + {-1.322499,0.788470}, + {-0.684229,-0.473861}, + {-1.265839,1.105980}, + {-0.581971,-0.124401}, + {0.444034,0.102150}, + {0.794992,0.031055}, + {0.603776,0.000266}, + {0.877366,0.024301}, + {0.277579,0.682971}, + {-0.109226,0.230966}, + {-0.935434,0.116535}, + {-0.083082,0.334694}, + {0.362059,-0.024471}, + {0.753738,0.122144}, + {0.304294,1.505981}, + {0.271106,-0.317919}, + {-0.465618,-0.059502}, + {-0.373175,-0.755986}, + {0.387614,-0.416476}, + {-0.748802,-0.395856}, + {-0.013579,-1.476338}, + {-0.366869,0.317716}, + {-0.979219,-0.200391}, + {-0.153407,-0.447562}, + {-0.255245,0.351090}, + {0.998840,-0.545270}, + {0.186904,-0.240711}, + {0.153329,-0.943938}, + {0.247078,0.571677}, + {0.192360,1.104895}, + {-0.551067,0.802267}, + {-0.124506,0.860949}, + {-0.139002,-0.104195}, + {-0.642611,-0.508259}, + {0.157868,0.859140}, + {0.019725,0.207020}, + {-0.653316,1.187525}, + {1.329306,-0.509686}, + {0.694674,0.256705}, + {0.202853,0.851294}, + {-0.441419,1.428209}, + {0.156150,-0.080560}, + {0.715021,-0.899171}, + {-0.239049,-0.631319}, + {0.195295,0.575186}, + {-1.311572,-0.865187}, + {0.570106,0.651064}, + {0.208959,-1.023329}, + {0.906490,-0.109625}, + {-0.781286,-0.253333}, + {0.231546,0.707965}, + {-1.265833,1.067884}, + {0.815263,1.165205}, + {1.466715,0.385384}, + {0.535490,0.581761}, + {-0.472358,-0.470277}, + {0.983264,0.384383}, + {0.727058,0.443847}, + {-0.416272,-0.472738}, + {0.376082,-0.134460}, + {-0.503839,-0.901079}, + {0.682625,1.008080}, + {-1.386979,-1.091660}, + {0.213387,0.535684}, + {-0.957192,-0.557212}, + {-0.067069,-1.051855}, + {-0.101157,-0.178941}, + {-1.306964,-0.631127}, + {0.926961,-0.083734}, + {-0.264348,-0.487315}, + {0.627269,-0.923797}, + {1.086963,0.082439}, + {-0.149566,-1.399193}, + {0.389143,-0.198131}, + {-0.031070,0.505173}, + {1.081145,-0.421980}, + {-0.365429,-0.412667}, + {-0.376916,0.370359}, + {0.531009,1.324279}, + {0.522575,-0.338998}, + {0.502957,-0.482424}, + {-0.562535,-0.545277}, + {-0.397874,-0.045620}, + {-0.210300,-0.937677}, + {0.678832,-1.456153}, + {-0.290273,0.095165}, + {0.631624,0.517150}, + {-0.411457,0.459952}, + {1.217812,-0.542939}, + {0.073630,-0.234428}, + {0.054958,-0.570539}, + {-1.128586,0.230127}, + {0.720559,0.058370}, + {-1.035968,0.077082}, + {-0.608327,-0.358758}, + {0.269851,0.489804}, + {-0.406969,-0.549994}, + {0.527270,-0.654157}, + {1.027706,-0.593285}, + {-0.471971,-0.594411}, + {0.040449,-0.467310}, + {-0.290221,0.851614}, + {-0.226635,-0.794078}, + {0.447274,0.236763}, + {-0.785187,-0.067945}, + {0.712972,0.436643}, + {-0.088441,1.299909}, + {0.475924,0.408473}, + {0.209117,0.539048}, + {0.714783,-0.513016}, + {0.106957,0.344444}, + {-0.517943,0.098828}, + {1.248470,0.110160}, + {-0.164676,0.715642}, + {0.116579,0.701060}, + {-0.338202,1.285789}, + {0.252122,0.401489}, + {0.208841,0.077311}, + {0.254678,0.806815}, + {0.234503,-0.687878}, + {-0.017710,1.099931}, + {1.248068,-1.577695}, + {-2.177322,0.634684}, + {0.383749,-0.488257}, + {0.626473,0.894318}, + {0.950392,-1.224503}, + {-1.592308,0.183474}, + {-0.883620,0.459040}, + {0.335251,-0.492958}, + {-1.452049,0.645747}, + {0.654540,-0.613036}, + {-0.786306,0.621635}, + {-0.835920,1.214810}, + {-0.402804,-0.379300}, + {-0.167140,-1.088577}, + {2.017823,-0.733220}, + {1.277852,0.045432}, + {-0.655324,-0.273020}, + {-0.502679,-1.294652}, + {0.139179,0.305881}, + {0.476464,0.374818}, + {-1.204706,0.929919}, + {-0.703096,0.426476}, + {-0.170932,-0.224981}, + {-0.351279,-0.400379}, + {0.267640,0.852748}, + {0.272721,-0.274755}, + {0.394744,0.261766}, + {-0.427077,-1.197927}, + {0.469152,-0.246978}, + {-0.068939,-0.212535}, + {0.567020,0.581239}, + {1.773606,-1.261858}, + {0.258176,-1.131465}, + {-1.103839,-0.289925}, + {1.177229,-0.690317}, + {0.137438,-0.884592}, + {0.116897,-0.623741}, + {1.231751,-1.044646}, + {0.653054,-0.008248}, + {-1.025754,0.353121}, + {0.152087,-0.684942}, + {0.970565,0.373987}, + {-0.392564,-0.069188}, + {-0.268254,0.066466}, + {1.288850,-0.546856}, + {-0.879522,1.075044}, + {0.398109,0.957102}, + {0.937518,-0.970381}, + {1.315683,0.004675}, + {0.656915,0.923958}, + {0.964084,0.332777}, + {-0.544967,-0.260763}, + {0.161974,-0.230332}, + {0.086070,1.573961}, + {-0.383494,0.130120}, + {1.082890,0.057498}, + {-1.410456,-0.461719}, + {0.540485,0.691271}, + {-0.278103,0.291339}, + {0.180835,0.081187}, + {0.648822,-0.143641}, + {-1.616721,0.284309}, + {0.850766,-0.295949}, + {-0.452081,-0.318424}, + {-0.672436,0.363193}, + {0.330021,-0.103062}, + {-1.201214,0.695691}, + {-0.176974,-0.049101}, + {0.034254,-0.001430}, + {-0.581966,-1.404542}, + {1.233772,0.845893}, + {0.770042,-0.222329}, + {-0.134528,1.408050}, + {0.981347,0.143636}, + {0.145948,1.099040}, + {0.710827,0.052673}, + {0.557771,-0.481154}, + {-0.146756,-1.008837}, + {-0.689552,-0.880902}, + {0.001022,0.756353}, + {0.222483,0.013501}, + {0.905978,0.432735}, + {-0.497583,-0.437051}, + {0.010372,-0.231759}, + {-0.834391,0.245930}, + {0.869406,-1.488002}, + {-1.420173,0.137089}, + {0.055164,0.678866}, + {0.811665,1.025276}, + {0.375303,0.608999}, + {-0.615345,-0.077846}, + {-0.186463,0.319902}, + {0.005719,0.915684}, + {0.318663,-0.507730}, + {-0.803895,0.451266}, + {0.160835,0.158185}, + {1.633081,0.429963}, + {-0.791587,0.563798}, + {-0.778932,-0.083845}, + {-0.746995,0.259063}, + {-0.374430,0.379522}, + {-0.025126,-0.204688}, + {-0.991074,0.045919}, + {-0.136845,-0.414905}, + {0.899845,1.310109}, + {-0.868625,-0.129578}, + {1.148100,0.070605}, + {-0.810213,-0.433737}, + {1.207818,-0.151042}, + {-0.515970,-0.141577}, + {-0.161548,0.388756}, + {-0.679441,-0.108745}, + {-0.858860,0.144068}, + {-0.111455,-0.935162}, + {-0.512453,0.281827}, + {0.802022,-0.977459}, + {-0.488174,0.273547}, + {-0.555684,0.973625}, + {-1.467122,1.287905}, + {0.769233,-0.351832}, + {0.214904,0.347022}, + {0.942995,0.470266}, + {-1.265858,-1.103599}, + {0.786352,-0.915630}, + {0.377453,0.259392}, + {0.364408,-0.253769}, + {-0.939662,0.510476}, + {-0.611435,0.630746}, + {0.496403,0.350935}, + {0.780776,-0.376306}, + {0.329368,-0.560035}, + {-0.104896,-0.414545}, + {0.459736,-0.818950}, + {0.101952,0.759826}, + {0.234506,0.195742}, + {1.165165,1.081672}, + {-0.741395,-0.556266}, + {0.136652,-0.063647}, + {-0.380017,0.025288}, + {-1.149874,1.004539}, + {0.233882,0.583344}, + {1.407491,-0.873973}, + {0.124950,0.137739}, + {0.077742,0.655085}, + {0.756326,0.693924}, + {-0.978230,-0.590244}, + {-0.318209,-0.151183}, + {1.590341,0.137861}, + {-0.091311,-0.581231}, + {0.362381,-0.416706}, + {0.646778,-0.246347}, + {0.432081,-0.436533}, + {0.467351,0.177888}, + {-0.192966,1.332833}, + {-0.364669,0.036797}, + {-0.426350,0.041546}, + {-0.468050,0.813732}, + {-1.082121,-0.356209}, + {0.795313,0.513634}, + {0.286996,0.171098}, + {0.534304,-0.756041}, + {-0.676098,0.413430}, + {-0.707209,0.964446}, + {-0.144614,-0.627121}, + {1.280522,-1.317728}, + {-0.159645,-0.237936}, + {-0.582439,-0.659814}, + {-0.070758,-1.089956}, + {-0.148674,-1.374329}, + {-0.179882,0.506686}, + {0.086493,-0.791614}, + {0.489759,-0.403031}, + {-0.314327,-0.111422}, + {-0.412931,0.493597}, + {0.253975,0.712494}, + {0.449653,0.383925}, + {-0.170046,-0.209558}, + {0.146663,0.741047}, + {-0.391870,-0.091945}, + {-0.442016,0.119528}, + {-0.802004,-1.400078}, + {-0.352020,-0.673484}, + {1.178405,0.222166}, + {0.401656,-0.176436}, + {-0.270939,-0.198899}, + {-0.695723,-0.566735}, + {0.834854,-1.471402}, + {-0.289106,0.437823}, + {0.251627,0.054241}, + {0.029125,-0.307041}, + {-1.487735,1.231129}, + {0.333572,-0.223186}, + {0.038154,1.081929}, + {-0.087970,-1.036150}, + {0.592180,0.133148}, + {0.093161,-0.294506}, + {-0.296535,0.495623}, + {-0.522146,1.313928}, + {-0.714640,-0.532988}, + {0.398263,0.293071}, + {-0.596224,1.223075}, + {0.479882,-1.180554}, + {-0.065416,-0.710133}, + {-0.889315,-0.315524}, + {0.962241,-0.055537}, + {-0.221264,0.112333}, + {0.322420,-0.571722}, + {1.192841,0.558100}, + {0.521199,0.138154}, + {0.716695,0.106324}, + {0.711628,-0.260564}, + {0.189505,-0.382577}, + {-0.438235,-0.546217}, + {0.077497,-0.092175}, + {-0.202673,-0.048951}, + {1.487370,-0.747006}, + {-1.031527,-0.820128}, + {-1.649929,-0.105742}, + {-0.347869,-0.458435}, + {-0.029234,-1.320993}, + {1.253876,0.585886}, + {0.436760,2.430056}, + {0.545664,0.470634}, + {0.901732,-0.856095}, + {0.662886,0.977089}, + {1.075384,-0.075824}, + {0.209674,0.063782}, + {-0.126499,0.482599}, + {-0.507162,0.208925}, + {0.247866,-0.354774}, + {0.054885,-1.024517}, + {0.204562,0.827382}, + {-0.883562,-0.740692}, + {0.849976,-0.019489}, + {0.263688,0.251006}, + {-0.330082,-0.061291}, + {-0.083851,1.370921}, + {0.295784,0.875275}, + {-0.425539,-0.283223}, + {-0.640975,0.136141}, + {-0.173006,0.465478}, + {-0.895481,0.477515}, + {0.229261,1.220279}, + {-0.407060,1.466588}, + {1.295396,0.176855}, + {-0.632605,0.786648}, + {-1.121659,0.268616}, + {-0.847703,-0.305246}, + {1.663789,1.656323}, + {-0.523322,-0.547465}, + {-0.792665,0.115445}, + {-0.824945,0.042476}, + {0.901073,0.249932}, + {1.130116,-1.907218}, + {-0.859768,-1.577612}, + {-0.191384,0.566792}, + {0.676686,-0.623231}, + {-0.793064,-0.852185}, + {0.027490,-0.460866}, + {0.540012,-1.738204}, + {-0.751769,-1.401695}, + {-0.652675,-2.187214}, + {0.546582,0.366436}, + {0.191392,-0.194236}, + {0.143155,0.472797}, + {-0.850023,-0.135606}, + {-0.377306,0.072815}, + {1.283611,0.519238}, + {0.216310,0.401307}, + {0.612385,0.376774}, + {0.509529,-1.018581}, + {0.718140,-0.664603}, + {-0.092749,-0.580942}, + {0.408930,-0.062835}, + {-0.082806,-1.497458}, + {-0.474417,-0.431005}, + {-0.261473,0.207407}, + {-0.241734,0.107672}, + {-1.042802,-0.161642}, + {0.155338,0.029191}, + {0.742596,0.009836}, + {1.004603,-0.548445}, + {-0.772076,0.004202}, + {0.684254,-1.908420}, + {-0.643584,-0.503343}, + {-0.602398,0.352084}, + {0.637940,0.050408}, + {-0.282541,-0.673629}, + {-0.218095,-0.677067}, + {0.028687,-0.173118}, + {0.599385,0.120223}, + {-0.635225,1.055321}, + {-0.321093,-1.072140}, + {0.301278,-0.518003}, + {-0.301802,0.560499}, + {0.404168,-0.160419}, + {0.439423,-0.123051}, + {-0.001024,-0.084182}, + {-0.222399,0.398534}, + {-0.032543,0.290847}, + {-0.686894,0.642376}, + {-0.376391,-0.292043}, + {1.291833,-0.282113}, + {-0.432943,0.047899}, + {-0.268253,-1.565101}, + {-0.079616,-0.299536}, + {0.117126,-0.616435}, + {0.920777,-1.547713}, + {0.672508,-0.938412}, + {-0.127227,0.039824}, + {0.497527,0.137301}, + {-1.150554,-0.242356}, + {0.526140,0.662427}, + {0.332716,0.387359}, + {0.193252,-0.748491}, + {0.879236,1.244841}, + {-0.320852,0.438523}, + {0.655207,0.250311}, + {0.798317,-0.037761}, + {1.759320,0.543552}, + {0.796490,0.394488}, + {-0.426451,0.104660}, + {-0.596812,0.295484}, + {-0.586590,-0.761865}, + {-1.204936,1.145020}, + {-0.858949,0.734240}, + {0.417170,-1.861530}, + {-1.380253,0.411880}, + {0.940440,-1.547216}, + {0.392789,0.067926}, + {0.752023,-0.870322}, + {0.120743,-0.084171}, + {0.226500,-0.038959}, + {-0.199741,0.982130}, + {-1.435202,1.924533}, + {-0.681303,-0.685655}, + {-0.017819,0.316710}, + {-0.419371,0.291876}, + {-0.419993,-0.704322}, + {-0.167402,-0.653200}, + {0.689883,1.667397}, + {0.656809,-0.191279}, + {1.349286,0.707932}, + {-0.417382,-0.503832}, + {-0.314839,0.076203}, + {0.018604,0.103821}, + {-0.670877,0.305072}, + {0.238125,-0.177294}, + {-0.711169,0.115679}, + {0.098621,-0.114667}, + {-0.836724,0.797509}, + {-1.266489,0.300376}, + {-1.574358,-0.601570}, + {0.109701,-0.625894}, + {0.799278,-2.008089}, + {0.734900,1.439041}, + {-0.172757,0.297516}, + {0.123756,0.251462}, + {-0.605374,0.019162}, + {-0.277414,0.527217}, + {1.598600,-0.465976}, + {0.478046,-0.621558}, + {-0.032111,0.513916}, + {-0.406663,0.473997}, + {0.377026,-1.022417}, + {0.261630,-0.600598}, + {0.192450,-0.761462}, + {-0.945120,1.662247}, + {1.445931,-0.381166}, + {0.796386,-0.527247}, + {0.570342,-0.165144}, + {-0.260445,0.197738}, + {-0.396075,0.035099}, + {0.438589,0.193911}, + {0.279975,0.803087}, + {-0.718632,-0.043015}, + {-0.073136,-0.144147}, + {0.091844,-1.245899}, + {1.133630,1.064059}, + {0.333917,-1.059628}, + {-0.475974,0.272878}, + {1.618769,0.338515}, + {-0.026654,0.173819}, + {-0.832746,-1.291872}, + {1.459739,-1.787186}, + {0.152053,0.719499}, + {-0.845311,0.148728}, + {0.096770,0.236791}, + {0.788550,0.590381}, + {0.589643,0.130083}, + {0.556591,1.302659}, + {-0.149560,0.050103}, + {0.917707,-0.486145}, + {-0.059802,1.519826}, + {-1.072536,0.667091}, + {-0.111194,1.228050}, + {-0.229775,0.154698}, + {-0.371433,0.541268}, + {0.403110,0.104249}, + {-0.766373,-1.209893}, + {-0.133097,0.781221}, + {0.018198,-0.190757}, + {0.547760,-0.448064}, + {-0.733735,0.187525}, + {0.308738,0.575826}, + {0.120420,-0.748615}, + {-0.162974,-1.656815}, + {0.495299,1.294132}, + {0.284833,0.326106}, + {0.304357,-0.029696}, + {-0.114308,-0.998843}, + {1.147646,0.007336}, + {0.889660,0.377428}, + {1.101746,-0.075572}, + {-0.630002,0.224827}, + {-0.447421,-0.680766}, + {-0.398164,-0.758312}, + {1.162091,0.872670}, + {-0.153320,0.100257}, + {-1.053855,-0.142606}, + {-0.151297,-1.709248}, + {-0.088670,-0.030046}, + {-0.039511,-0.751111}, + {-0.268719,0.233002}, + {0.107060,0.944089}, + {-0.528369,0.218636}, + {0.379463,-1.271446}, + {0.845463,-0.200500}, + {0.449410,-0.308035}, + {-1.125393,-1.368811}, + {-0.707799,0.752393}, + {0.224584,0.957984}, + {-0.076844,-0.185815}, + {-0.276454,-0.875122}, + {-0.308372,-0.078258}, + {0.710906,-0.432983}, + {0.086967,-0.475256}, + {-0.484939,-0.239784}, + {0.527071,1.381910}, + {1.207738,0.764537}, + {-1.166732,0.156223}, + {-0.928368,-0.713470}, + {0.232623,0.248816}, + {0.234335,-0.713494}, + {0.506899,-0.538864}, + {0.923647,0.164175}, + {0.589798,0.487695}, + {-0.068928,-0.289141}, + {0.770468,0.393273}, + {-0.850038,1.509075}, + {-0.050092,-1.065967}, + {0.044840,-0.642072}, + {1.538218,-0.718189}, + {-0.483958,0.310072}, + {0.883513,0.423129}, + {0.577394,-0.913756}, + {0.369553,-0.000248}, + {1.306622,-0.676905}, + {-0.161439,-0.092252}, + {0.124913,0.545292}, + {-0.055785,-0.270095}, + {-0.654485,1.619946}, + {0.010064,-0.415884}, + {0.561868,-0.574773}, + {0.417682,0.121106}, + {0.447357,-1.403651}, + {0.036032,0.849953}, + {-0.310738,-0.139296}, + {-0.340548,1.709065}, + {0.324753,-0.829858}, + {-0.482715,1.278533}, + {0.027337,0.634282}, + {0.543259,-1.129644}, + {-0.176542,0.641092}, + {0.513499,0.270266}, + {0.592728,1.200615}, + {-0.168299,0.071350}, + {-0.028778,-1.609077}, + {0.100068,-0.177816}, + {0.179793,0.405800}, + {-0.550998,-0.189012}, + {-0.374629,-0.335207}, + {0.489373,-0.863435}, + {-0.909667,-0.243295}, + {-1.905582,0.828148}, + {-0.322044,0.578390}, + {0.172952,0.392945}, + {-1.349845,-0.593467}, + {0.385443,-0.834331}, + {-0.520047,-0.256327}, + {-0.168864,-0.011272}, + {0.705916,0.337266}, + {-0.613837,0.309663}, + {0.732870,0.082069}, + {-0.446717,0.037997}, + {0.503221,-0.919048}, + {-1.227801,-0.644395}, + {-0.110226,0.472814}, + {-0.153520,-1.426752}, + {-0.372143,-0.995245}, + {0.041903,1.617146}, + {-1.716966,-0.094746}, + {0.110050,0.506537}, + {0.441591,0.285438}, + {-0.422717,0.030475}, + {-0.546275,1.427064}, + {0.597491,-0.001582}, + {-0.227799,0.278393}, + {-0.711928,-0.389254}, + {-0.316276,-0.045449}, + {-0.246906,0.142129}, + {-0.017644,0.530840}, + {-0.846558,0.285732}, + {0.024601,1.550225}, + {0.135991,-0.281795}, + {1.076094,-0.393152}, + {0.469595,0.373539}, + {0.700686,-0.192217}, + {-1.044613,-0.031666}, + {-0.172857,0.037056}, + {0.216986,-0.221328}, + {1.202936,0.262729}, + {0.736136,0.660856}, + {0.310616,-0.895782}, + {0.756943,-0.860938}, + {0.491193,0.919560}, + {-0.391990,-1.038218}, + {0.630603,0.076034}, + {-1.672313,0.931548}, + {0.031370,-0.235708}, + {-0.059540,-0.730453}, + {1.751460,-0.083331}, + {-0.312742,1.042875}, + {-1.327894,-0.601739}, + {1.130657,-0.489036}, + {-0.578349,-0.452027}, + {0.442817,-0.010612}, + {0.568033,0.646896}, + {-0.209657,0.511084}, + {0.185712,-0.492029}, + {1.604476,-0.325909}, + {-0.804376,-0.713345}, + {-1.315856,0.385873}, + {-0.221093,1.328622}, + {-0.759605,0.387801}, + {0.152179,-0.162878}, + {-0.218474,-0.005204}, + {0.375890,-0.799244}, + {0.637063,-1.137409}, + {0.594361,0.315677}, + {0.645739,0.636245}, + {0.658041,-0.321056}, + {0.070071,1.391222}, + {0.721141,-0.400061}, + {-0.352948,0.195410}, + {-1.271695,0.849227}, + {-0.501393,-0.054339}, + {0.423696,1.085774}, + {-1.135309,0.703848}, + {-0.274176,0.653380}, + {-0.316789,-0.988309}, + {0.711998,1.178853}, + {0.467890,0.383039}, + {-0.361315,0.586150}, + {-1.992977,0.823878}, + {0.390939,0.167472}, + {0.110536,0.002095}, + {-1.247517,-0.665658}, + {0.121696,0.179633}, + {-1.365006,0.556461}, + {0.408822,-0.155980}, + {-0.730116,0.123973}, + {0.684268,-1.776762}, + {-0.649453,-0.171713}, + {-0.372612,-0.050829}, + {0.376350,0.556347}, + {-0.100789,-0.048297}, + {0.535745,-0.486194}, + {-0.461672,-0.184145}, + {0.397655,-0.685573}, + {-0.322562,-0.405548}, + {-0.139347,0.980121}, + {0.383183,-0.416704}, + {0.405772,0.305710}, + {1.287783,1.488584}, + {0.032704,0.960170}, + {-0.996629,-0.613880}, + {0.344951,0.741074}, + {0.012855,0.279797}, + {0.059268,0.437106}, + {1.099804,-0.690001}, + {2.066302,-1.011066}, + {-1.138329,0.358600}, + {0.915106,0.661313}, + {-0.890883,-0.368142}, + {-1.368238,0.378705}, + {-0.336150,0.507975}, + {-0.706113,0.234963}, + {-0.606888,-0.970039}, + {-0.527169,0.523949}, + {0.018031,-0.474310}, + {0.741809,-0.091430}, + {-0.009929,0.576888}, + {0.874371,0.333460}, + {-0.254588,0.654464}, + {0.261702,1.313061}, + {-1.277335,1.378973}, + {-0.138901,-0.173082}, + {0.924853,0.129874}, + {-0.387252,0.001449}, + {0.101334,-0.534299}, + {1.166440,-0.414895}, + {1.069226,0.257124}, + {0.900367,-0.135723}, + {1.218319,-0.472790}, + {0.508176,-0.583053}, + {0.556299,0.001431}, + {0.941767,0.240470}, + {1.019062,-1.238945}, + {-1.044413,0.547817}, + {0.739657,0.372119}, + {-1.127057,-0.032632}, + {1.021823,-2.155687}, + {0.154893,-0.768565}, + {0.222839,-0.891271}, + {-0.021271,-0.349137}, + {-0.498438,-0.404658}, + {0.713753,-1.281305}, + {0.516202,-0.400977}, + {0.375070,-0.381473}, + {0.611029,-0.695506}, + {0.329870,0.978420}, + {-0.440990,-0.627980}, + {1.106160,-0.673187}, + {0.330761,0.960060}, + {0.002016,-0.375526}, + {-0.418742,-0.230493}, + {0.889310,0.259182}, + {-0.743094,0.859461}, + {-0.639141,0.046149}, + {-0.825368,1.113567}, + {-0.183710,-1.099516}, + {-0.688241,0.048768}, + {-0.567826,0.016499}, + {-0.252604,-0.505972}, + {0.125737,-0.032586}, + {-0.289104,0.481842}, + {0.197078,-0.361814}, + {1.702697,-0.135121}, + {-0.313162,-0.195712}, + {0.373467,-0.638017}, + {0.265985,0.688793}, + {-0.930620,-0.543390}, + {0.266031,0.127381}, + {-1.131799,-0.707161}, + {0.294857,-1.044248}, + {0.844394,-1.509590}, + {-0.012985,0.455971}, + {0.934720,0.325752}, + {0.477097,-0.617656}, + {-0.186792,0.919832}, + {0.661168,-1.463831}, + {-0.052266,-0.007023}, + {-0.417000,-0.630278}, + {-0.201517,0.049327}, + {0.324582,0.488122}, + {-1.135622,1.088472}, + {-0.839457,0.576660}, + {0.776228,-0.246711}, + {-0.060646,0.204187}, + {-1.666099,-0.412724}, + {-0.302620,0.413709}, + {0.134609,-0.417098}, + {0.667218,-0.505744}, + {0.310204,-0.163001}, + {2.227881,0.439271}, + {-0.402395,-0.165319}, + {-0.381247,0.233719}, + {-0.070232,-0.083912}, + {0.705271,0.505574}, + {-0.574528,-0.237527}, + {-0.097888,0.687548}, + {-0.287092,-0.392327}, + {0.771057,-2.105183}, + {-0.424797,-0.712019}, + {-1.141051,-0.262563}, + {1.245465,-0.173175}, + {-0.809671,0.478984}, + {0.420857,-1.118626}, + {-0.774501,0.206551}, + {-0.371353,-0.523965}, + {-0.475349,0.782751}, + {0.354270,0.297627}, + {0.429063,-0.301249}, + {-0.253951,-0.024314}, + {0.542049,0.210328}, + {-1.288145,0.902746}, + {-0.610673,-0.457713}, + {0.560486,-0.045507}, + {1.012326,0.160808}, + {0.739327,0.227113}, + {0.440689,-0.364347}, + {0.043907,-0.902520}, + {0.107084,-0.850966}, + {-0.864312,-0.936915}, + {-0.983595,1.279503}, + {-0.826804,-0.510867}, + {0.410159,-0.166249}, + {0.234942,0.048679}, + {-0.440864,-1.871740}, + {-0.277232,0.058905}, + {0.865167,-1.085117}, + {0.323421,0.865950}, + {0.078567,0.487181}, + {-0.106628,0.112398}, + {-0.701141,-0.631292}, + {-0.241547,-0.907031}, + {-1.058655,1.194515}, + {-0.245933,-0.291151}, + {0.090384,-0.078327}, + {-1.804471,0.305652}, + {-0.710208,-0.044177}, + {-1.637185,0.634789}, + {0.322701,0.202198}, + {0.592642,0.027099}, + {0.106661,0.220082}, + {0.374884,0.031143}, + {0.466431,0.144924}, + {-0.435113,-0.045018}, + {-0.812143,0.850339}, + {-0.723946,0.392704}, + {-2.151521,-0.712553}, + {0.450893,-0.280685}, + {0.819631,0.669219}, + {0.173790,-0.823862}, + {1.252888,-0.450119}, + {-0.760925,0.126633}, + {0.100797,0.669706}, + {0.636397,0.644360}, + {0.314358,0.426072}, + {0.399418,-0.772800}, + {-0.648593,-0.341262}, + {-0.247134,0.264055}, + {1.077773,0.975354}, + {0.523563,-0.791219}, + {-0.796902,-0.163962}, + {-0.615911,0.149349}, + {0.954916,-1.262222}, + {0.678034,1.207517}, + {-0.372992,-0.431473}, + {-1.124813,-1.597092}, + {-0.447033,-0.087720}, + {-0.720631,0.709710}, + {0.384703,0.910101}, + {-0.247341,-1.476532}, + {-1.241862,1.322373}, + {-0.310325,0.816418}, + {-0.050700,-0.416219}, + {0.309471,-0.192610}, + {0.371081,0.778064}, + {-0.510419,-1.055190}, + {0.127094,0.388637}, + {-0.255658,-0.020784}, + {-0.239095,-0.235771}, + {0.860355,0.144748}, + {0.175697,0.666209}, + {0.161710,-1.018808}, + {0.208616,-0.113253}, + {0.322261,-0.153970}, + {0.115609,0.527421}, + {-1.142425,-0.174532}, + {-0.867659,-0.160025}, + {0.702013,-0.499588}, + {-0.305717,-0.468403}, + {1.015578,-0.486232}, + {0.012654,0.647932}, + {0.650411,0.663774}, + {0.064881,0.712345}, + {-0.408083,-0.026499}, + {0.129269,0.557035}, + {-1.311066,0.784364}, + {-0.811294,-0.539442}, + {-0.783403,-0.385913}, + {0.661821,0.125770}, + {-0.659564,0.069575}, + {0.995148,0.349592}, + {0.148861,-0.577855}, + {1.019181,-0.324607}, + {0.569564,-0.397281}, + {0.908002,0.954231}, + {1.214742,-0.616921}, + {-0.173224,0.454581}, + {-2.116294,-0.837803}, + {-0.363546,0.105419}, + {0.440872,0.067274}, + {-0.101457,0.086710}, + {0.335032,1.011214}, + {-0.212784,1.709394}, + {-0.609104,0.294062}, + {0.257849,-0.420324}, + {-1.753260,-0.996065}, + {0.233278,0.392532}, + {0.347599,0.585661}, + {0.445643,-0.462247}, + {1.049963,0.117133}, + {0.839655,-0.356217}, + {0.703241,0.033581}, + {0.271280,-0.196860}, + {0.065959,-0.921553}, + {0.405906,-0.688962}, + {0.098046,0.333902}, + {-0.014572,0.211136}, + {-0.737884,0.177744}, + {-0.649906,-1.604793}, + {0.293595,0.706452}, + {-0.066643,1.517094}, + {0.441195,-0.173964}, + {1.195227,0.123771}, + {-1.135443,-1.413717}, + {0.006356,-1.017804}, + {0.722946,0.103556}, + {-0.003354,0.488708}, + {0.474062,0.159755}, + {0.324770,0.895972}, + {-0.553939,0.154297}, + {-0.103416,0.898922}, + {-1.072220,-0.410260}, + {-0.053047,-0.030047}, + {0.070087,-0.725415}, + {0.165223,-0.558910}, + {0.782904,-0.136372}, + {-0.041688,-0.135373}, + {0.334520,-0.033481}, + {0.801873,-0.133751}, + {0.209301,0.597294}, + {0.618379,1.223616}, + {0.888198,-0.672384}, + {-1.214205,0.041896}, + {-0.207532,-0.540674}, + {0.992363,-1.169905}, + {0.940801,-0.242385}, + {-0.708174,0.635987}, + {-0.369966,0.143612}, + {1.281108,0.086508}, + {0.250887,-0.332167}, + {-0.515793,-0.631672}, + {1.136276,0.346349}, + {-0.464252,1.668219}, + {0.525805,-0.141030}, + {0.999260,1.590780}, + {0.605581,-0.060022}, + {1.056390,-0.048178}, + {-0.968752,0.185265}, + {-1.340377,-0.330139}, + {-1.046545,0.051473}, + {-0.450882,0.258781}, + {0.243010,0.998613}, + {0.421506,-0.706489}, + {0.656187,-0.851819}, + {-1.749329,-0.182724}, + {0.266263,0.302166}, + {0.344290,-0.491448}, + {0.946706,1.671205}, + {1.056879,-0.219540}, + {0.627745,-0.729454}, + {0.433355,-0.250281}, + {-0.200019,-1.300245}, + {1.255424,-1.022037}, + {-0.061801,-0.646340}, + {-0.232252,0.533970}, + {-0.395477,0.369443}, + {-0.623953,-0.526531}, + {-0.820382,1.716970}, + {0.140594,0.061758}, + {-1.036810,0.403211}, + {-0.469993,-0.107368}, + {1.205792,0.275994}, + {0.959943,0.019721}, + {0.573598,0.123293}, + {-1.420059,-1.132904}, + {0.290727,0.167288}, + {0.365799,0.542990}, + {0.516968,-0.612634}, + {0.160027,-0.390477}, + {-0.347292,0.029547}, + {-0.004609,1.121404}, + {-0.335175,-0.015666}, + {0.908113,0.229171}, + {0.545009,1.480549}, + {-1.220973,1.093788}, + {0.479628,-1.425169}, + {-0.513786,1.062727}, + {0.357421,-0.804394}, + {-1.061941,0.223873}, + {-0.385252,0.110396}, + {-1.640287,-0.021951}, + {0.623028,-0.060477}, + {-0.550756,0.678768}, + {0.135673,0.837449}, + {0.751838,-0.180054}, + {0.954815,-0.866757}, + {0.604536,1.476877}, + {-0.286459,0.372774}, + {0.376627,-0.910916}, + {1.217027,0.101736}, + {0.011181,-0.874826}, + {-0.722030,0.489939}, + {0.311409,-0.260903}, + {0.226439,-0.416559}, + {-0.217666,0.618687}, + {-0.882251,-0.420330}, + {0.562126,-0.226552}, + {-0.133127,-0.134644}, + {0.969153,-0.508304}, + {0.405205,-0.871967}, + {-1.017625,0.079112}, + {-0.736203,-0.949411}, + {0.250579,0.868592}, + {0.584736,0.487773}, + {-0.200735,0.406254}, + {-0.169967,-0.174164}, + {-0.926833,-0.008126}, + {-1.276335,-0.436210}, + {-1.055847,-0.464811}, + {1.382819,-0.892263}, + {0.549810,-0.254992}, + {-1.222183,-0.947043}, + {0.548589,-0.517754}, + {0.330987,1.018993}, + {0.025173,0.069526}, + {0.574042,-1.129914}, + {1.165371,-0.221953}, + {-0.047741,-0.296772}, + {0.651998,0.263669}, + {-0.694023,0.443470}, + {-0.956615,-0.672689}, + {0.016381,-0.458048}, + {0.982982,-0.048522}, + {0.181067,-0.514465}, + {-0.391139,-0.223578}, + {0.161096,-0.653129}, + {-0.351802,-0.290479}, + {-0.314563,0.489580}, + {-0.146600,0.217679}, + {-0.626463,-1.314274}, + {-0.425276,0.036105}, + {0.653590,-0.842355}, + {0.326039,-0.509672}, + {-0.469673,0.286035}, + {-0.123351,0.467094}, + {0.413046,1.210950}, + {-1.022797,-0.785435}, + {0.675002,0.772235}, + {-0.862771,-0.220066}, + {-0.231169,-0.567071}, + {-0.022879,-1.662436}, + {0.191818,-0.220743}, + {-0.011754,-1.811256}, + {0.535316,-0.223392}, + {0.073030,1.008182}, + {0.433603,1.040546}, + {0.057488,-0.260627}, + {-0.750304,-0.190874}, + {-1.484162,-0.249188}, + {0.555514,-0.171803}, + {0.541373,0.623842}, + {-0.324439,-0.112460}, + {0.079769,-0.353481}, + {0.330382,1.054412}, + {-0.106034,0.995793}, + {-0.382467,0.382232}, + {-0.036929,-0.393942}, + {0.511558,-1.203157}, + {-0.669114,-0.507821}, + {-0.717810,-0.040914}, + {-1.754621,0.344004}, + {-0.597845,-1.199356}, + {1.760979,0.700903}, + {0.625006,-0.444735}, + {-0.348717,-0.247748}, + {0.174249,0.142504}, + {0.819233,0.294173}, + {-0.031325,-0.221121}, + {0.591852,0.560305}, + {-0.018918,-0.672425}, + {0.779234,-0.181712}, + {-1.059580,0.442549}, + {-0.326264,1.377449}, + {-0.788614,-1.350767}, + {0.216709,0.414704}, + {0.220819,0.108199}, + {-0.359007,0.600802}, + {-0.309663,0.778317}, + {0.757247,0.732882}, + {-0.492180,0.313444}, + {-0.869761,-1.301811}, + {-0.125626,-0.676394}, + {0.295449,-0.241053}, + {1.054322,0.797473}, + {-0.287078,-0.504316}, + {-0.537100,-0.231610}, + {0.613905,-0.234007}, + {0.741154,0.141237}, + {0.626367,-0.853201}, + {0.755579,-0.402972}, + {0.791054,0.600208}, + {-0.063499,-0.518131}, + {-0.489265,-0.036842}, + {-0.949063,0.023314}, + {-0.515292,-0.340645}, + {1.479585,0.191550}, + {-0.606714,-0.320708}, + {0.466669,0.522580}, + {-0.863079,1.451320}, + {0.528683,0.847398}, + {0.542235,-0.755739}, + {0.118265,0.135243}, + {-0.740312,-0.861944}, + {-0.435756,0.830366}, + {-0.109372,-0.213866}, + {-0.553930,-0.845500}, + {-1.099287,-0.297620}, + {0.106898,-0.424559}, + {-0.378716,0.193142}, + {0.213494,1.033237}, + {-0.853118,-0.760434}, + {-0.206960,0.322096}, + {0.515476,-0.382595}, + {-0.452647,0.010086}, + {-0.802250,-0.678852}, + {0.294123,0.686175}, + {0.858965,0.189241}, + {0.605752,-1.104271}, + {1.481873,0.508996}, + {-1.116676,0.289812}, + {-0.707222,-0.382630}, + {-0.079025,1.156617}, + {0.639524,-0.001944}, + {-0.088679,-1.253192}, + {-0.321477,0.741010}, + {0.995588,-0.064482}, + {-0.881360,1.360842}, + {-0.297000,-0.072434}, + {0.060998,0.138554}, + {0.421436,-0.022213}, + {0.600608,-0.843743}, + {-0.093266,-0.799977}, + {-0.270330,-0.551698}, + {-0.586570,0.075585}, + {0.535896,-0.937339}, + {-0.196885,-1.152215}, + {-0.824956,-0.668942}, + {-0.259150,0.564970}, + {1.163106,-0.343775}, + {-0.211627,0.887391}, + {-1.519484,-0.692918}, + {0.630723,-0.711066}, + {-0.804122,-0.662480}, + {0.839553,1.605451}, + {-0.326213,0.368434}, + {0.059140,-1.102124}, + {0.237029,0.146990}, + {-0.696770,-0.008057}, + {-1.171176,0.075899}, + {-0.147349,0.040450}, + {0.129807,-1.078745}, + {-1.346480,-0.102841}, + {1.923088,-0.340920}, + {0.604509,-0.631306}, + {0.830188,0.900687}, + {-0.244172,-0.131295}, + {-1.297096,0.273955}, + {-0.851825,1.248525}, + {-0.198894,-0.720303}, + {0.603852,0.405432}, + {0.164840,0.543281}, + {1.671773,0.067980}, + {0.038583,0.297031}, + {0.507509,-0.744625}, + {0.359393,0.748717}, + {-0.212608,-0.358101}, + {0.126437,1.165712}, + {-0.248434,-0.585575}, + {-0.263564,1.882286}, + {0.197666,-0.007268}, + {1.382641,-2.141275}, + {0.372177,-1.454355}, + {-1.179644,0.104261}, + {1.106674,-0.282933}, + {-0.265928,-0.626704}, + {-0.561107,0.452555}, + {-1.300538,0.287714}, + {-1.015374,0.573758}, + {-0.607617,-0.309770}, + {-0.023152,-0.760109}, + {-0.194123,0.599047}, + {0.647420,-0.037263}, + {0.106358,0.238426}, + {-0.392097,0.094144}, + {0.661177,0.412145}, + {-1.399599,1.957816}, + {0.148234,0.471031}, + {0.286092,0.528837}, + {-0.391787,0.921074}, + {0.195292,0.118754}, + {-0.136761,0.298155}, + {-0.378985,-0.604095}, + {1.371422,-0.622111}, + {0.857070,0.509011}, + {0.066269,-0.029824}, + {-1.377703,0.529433}, + {-0.694186,-0.441324}, + {-0.257793,1.275458}, + {-0.672277,-0.654115}, + {-0.809306,0.145106}, + {0.670659,-0.012692}, + {0.157773,0.013152}, + {-0.462958,-0.012297}, + {0.827130,1.661564}, + {0.397882,0.120724}, + {1.117614,1.225687}, + {0.476878,0.490050}, + {0.724769,1.113002}, + {0.586609,-0.560797}, + {-1.361147,0.474845}, + {-0.007226,0.580620}, + {-0.701521,0.864232}, + {0.994535,0.306268}, + {0.370349,1.237807}, + {-0.242788,-1.443067}, + {0.473815,-0.479609}, + {-0.389546,0.026009}, + {-0.338480,0.878802}, + {0.435504,-0.420076}, + {0.889075,0.161873}, + {0.138696,-0.566162}, + {0.217055,0.953271}, + {0.839538,0.048184}, + {-0.059206,-1.142293}, + {0.665060,-0.676547}, + {0.221557,0.086282}, + {-1.173015,0.335912}, + {0.457360,-0.040303}, + {0.575889,-1.213594}, + {0.658439,-0.011276}, + {-1.457696,-0.189237}, + {-0.800412,0.566585}, + {-0.102734,-0.661830}, + {-0.348242,0.424874}, + {0.353335,1.852790}, + {1.435363,0.984674}, + {0.405182,-0.313471}, + {-0.641495,1.885674}, + {1.945466,1.286943}, + {-1.031042,-0.000691}, + {-0.513774,-1.070626}, + {1.364844,-0.285854}, + {-0.121790,-1.095977}, + {-1.249687,0.021067}, + {-0.075555,0.781338}, + {0.954208,-0.915902}, + {-1.027627,-0.406509}, + {-1.513386,0.885096}, + {-0.487952,-0.456337}, + {-1.052057,0.867359}, + {-0.145713,0.278056}, + {-0.756226,-0.964303}, + {-0.446097,-0.089467}, + {0.169928,-0.361224}, + {0.397326,-0.307696}, + {-0.034144,-0.246857}, + {-0.696100,-0.538312}, + {-0.534972,0.210185}, + {0.816251,-0.647654}, + {-0.705987,-0.908852}, + {-0.615467,-1.097666}, + {-0.159338,-0.149510}, + {-0.937470,0.880936}, + {-0.320957,-0.048574}, + {-0.372401,-0.285898}, + {-0.358402,-0.568311}, + {0.708385,-1.254534}, + {0.829644,0.011912}, + {0.285381,-1.031588}, + {0.017740,-0.349993}, + {-0.022239,-0.439243}, + {-1.430300,-0.497895}, + {0.170766,-0.701765}, + {0.175088,0.629816}, + {-0.098450,0.984733}, + {-0.506275,0.273047}, + {0.386685,0.226191}, + {-0.849597,0.026814}, + {0.331172,-0.400903}, + {-0.166717,0.322664}, + {0.840811,0.163583}, + {-1.492836,0.838920}, + {-1.518271,0.133282}, + {0.411785,0.665886}, + {-1.288775,0.573578}, + {-0.679826,0.216065}, + {1.072059,0.678109}, + {0.327039,0.057915}, + {0.748172,-1.016021}, + {0.766777,0.338616}, + {-0.154979,1.088221}, + {-0.233660,-0.592573}, + {0.733229,-0.356964}, + {-0.716623,0.333791}, + {0.201190,-0.773714}, + {0.312616,-0.148537}, + {0.290474,-0.743141}, + {-0.227709,-0.668733}, + {-1.515149,1.270848}, + {0.226198,-0.729829}, + {-0.181346,-1.271070}, + {-1.045326,-0.092295}, + {1.642772,-1.645010}, + {1.017090,-1.591010}, + {0.095373,-1.289559}, + {1.964387,0.348377}, + {-0.950861,0.367564}, + {0.556953,0.768761}, + {-0.203486,0.439205}, + {0.491570,0.168439}, + {-0.687148,-0.295486}, + {-0.740794,-0.566119}, + {-0.024076,0.456466}, + {0.109395,-0.274543}, + {-0.793800,-1.014024}, + {0.292454,0.541633}, + {-0.595307,0.963837}, + {-0.657843,-0.867296}, + {0.204862,-0.344086}, + {-0.578269,-0.345403}, + {-0.780437,-0.385625}, + {-0.273820,0.505994}, + {1.004484,-0.156356}, + {-0.868964,0.266448}, + {0.143031,-0.803470}, + {0.101618,-0.081850}, + {0.193181,-0.062062}, + {-0.861275,0.852923}, + {0.288135,-0.426406}, + {-0.928134,0.099686}, + {-0.181721,1.615686}, + {-0.136660,0.020212}, + {0.072772,0.114802}, + {0.202198,-0.238392}, + {-0.251007,0.316880}, + {0.349716,-0.792136}, + {-1.213064,-0.842004}, + {0.862678,-0.028549}, + {-0.973473,0.006869}, + {0.233388,-0.345947}, + {1.041065,0.708671}, + {0.324049,-1.771873}, + {-0.185275,0.653364}, + {0.628341,0.054329}, + {-0.164341,0.487005}, + {0.393343,-0.037375}, + {-0.532730,1.366482}, + {0.106510,0.798337}, + {-0.801100,-0.368808}, + {0.492501,-0.594827}, + {-0.157276,-0.210969}, + {1.430722,-0.123353}, + {0.869858,-0.330376}, + {-0.870905,-0.576319}, + {0.488152,-0.077766}, + {-1.352852,-0.983699}, + {-0.071516,0.008669}, + {0.038294,-0.659775}, + {-0.638838,-1.453811}, + {0.365078,0.936548}, + {-0.176761,0.029567}, + {-0.637139,0.811721}, + {0.199638,-0.298378}, + {-0.555570,0.019142}, + {-0.091645,0.610158}, + {0.877453,0.174360}, + {-0.568953,0.103565}, + {-0.832229,0.324979}, + {0.712774,0.870009}, + {-0.278872,-0.588582}, + {0.435542,0.494374}, + {-0.065868,0.021952}, + {1.423758,-0.393834}, + {-0.477059,0.827165}, + {0.627414,-0.276227}, + {1.000520,0.682515}, + {0.607696,0.206943}, + {-0.154464,0.495945}, + {-0.124329,-0.829138}, + {-0.087112,-0.220509}, + {-0.465875,-0.382839}, + {-1.017272,0.487396}, + {-0.547511,0.237748}, + {-0.038977,0.393638}, + {1.026923,-0.597241}, + {-0.621617,-0.717375}, + {0.667387,0.914740}, + {-0.608364,-0.851361}, + {0.615870,0.510211}, + {0.292743,0.514543}, + {0.347583,1.275365}, + {0.200986,-0.420921}, + {1.374615,-0.215986}, + {-0.414803,0.434964}, + {-1.476929,-1.362368}, + {0.636865,0.488148}, + {1.114926,0.262444}, + {0.082692,-0.670997}, + {1.966723,1.124746}, + {-0.046586,-1.173584}, + {-0.363377,-0.208166}, + {0.501587,0.594431}, + {-0.168038,0.767871}, + {0.323440,0.680381}, + {1.067349,0.560431}, + {-0.772885,-1.138626}, + {0.518494,0.322721}, + {0.685843,-0.056191}, + {0.787104,-0.784384}, + {0.609174,-0.220906}, + {-0.006505,0.671218}, + {0.460238,-0.684338}, + {0.438095,1.508562}, + {0.009417,0.237749}, + {0.393314,1.196541}, + {-0.583606,1.070722}, + {-0.169269,-0.926174}, + {-0.066992,-0.301332}, + {0.497741,-1.198867}, + {-1.090838,0.548678}, + {-0.004155,-0.024343}, + {-0.612437,-0.656401}, + {-0.663257,-0.093885}, + {-0.174069,0.911494}, + {0.367565,0.610990}, + {-0.144097,-0.435430}, + {1.104616,-1.845717}, + {-0.972594,0.334831}, + {-0.794574,-0.392847}, + {0.311997,0.561151}, + {0.586292,-0.042105}, + {-1.605228,-0.279692}, + {-0.382017,2.388282}, + {1.055212,0.335750}, + {0.209281,0.138650}, + {-0.385178,-0.272430}, + {0.548245,-0.025245}, + {-0.638262,-0.021417}, + {-1.294383,-0.197757}, + {0.423815,0.591952}, + {-0.071987,-0.562847}, + {-0.126977,1.038596}, + {0.496448,0.840634}, + {-1.185477,0.042048}, + {-0.823043,-0.368610}, + {1.008274,-0.231597}, + {-0.660260,0.296490}, + {-0.743515,0.208480}, + {0.379941,-1.003447}, + {0.968945,0.294877}, + {-0.698481,-1.144907}, + {-1.162786,0.387927}, + {-0.293235,0.428785}, + {0.718636,-0.315848}, + {0.107103,-0.828505}, + {0.356476,-0.645877}, + {0.505071,-0.331163}, + {-0.649298,-0.398312}, + {-0.090610,-0.074341}, + {0.200451,-0.421806}, + {0.908067,-0.168388}, + {-0.846288,0.033026}, + {-0.189659,-0.925072}, + {-0.023812,0.459475}, + {1.602866,0.714233}, + {-0.575714,-0.238446}, + {0.846762,-0.832419}, + {0.120918,0.182480}, + {-0.570597,-0.373300}, + {0.419728,0.612563}, + {-0.320002,-0.948555}, + {0.318035,-0.186493}, + {-0.127286,0.112951}, + {-0.141023,0.135715}, + {1.060583,0.677137}, + {0.101330,0.199317}, + {0.803035,-0.452390}, + {-0.340576,0.650283}, + {0.902556,-0.144691}, + {-0.893404,0.858889}, + {-0.007600,-0.345112}, + {0.111926,-0.168442}, + {1.039893,-0.469075}, + {0.240538,-0.826278}, + {0.826768,0.578478}, + {1.046184,0.665426}, + {0.038550,0.215966}, + {-0.635648,0.508181}, + {-0.146230,0.638788}, + {-0.362399,-0.629495}, + {0.542586,0.843847}, + {0.167182,-0.792296}, + {-0.855717,0.083743}, + {-1.036334,-0.085065}, + {-0.324723,-0.030988}, + {-1.833660,-0.410648}, + {-0.001357,-0.829866}, + {-0.104752,-0.284616}, + {-0.816835,-1.210435}, + {-0.052255,-0.543345}, + {-0.367505,0.092323}, + {-0.736559,-0.520296}, + {0.201749,0.054396}, + {-0.199049,0.602651}, + {0.404682,-0.309862}, + {-0.317471,1.036744}, + {-0.098938,-0.818030}, + {-0.814101,-1.260633}, + {0.763575,0.457821}, + {0.358938,-0.131199}, + {-0.301845,0.650210}, + {-0.029168,-0.595484}, + {-0.369691,0.223720}, + {0.194581,0.025750}, + {-0.460265,0.156045}, + {0.305830,0.208558}, + {0.223866,0.641668}, + {0.026609,0.558788}, + {0.356247,0.373533}, + {0.237883,-1.069953}, + {0.147891,-0.805516}, + {0.188977,-0.068435}, + {0.292733,-0.380567}, + {0.221952,1.563443}, + {0.345474,-0.145997}, + {0.562837,0.992170}, + {0.931969,1.306009}, + {1.241908,0.118149}, + {0.565906,-0.246496}, + {-0.585196,0.203570}, + {0.711276,-0.200387}, + {-0.376149,0.513875}, + {1.192035,-0.156803}, + {-0.862564,0.588024}, + {0.388852,-1.356642}, + {0.725190,0.687537}, + {0.257052,0.151601}, + {0.411402,0.594166}, + {-0.047136,-1.330878}, + {1.164207,-0.046186}, + {-0.200303,0.780709}, + {-1.433552,0.524817}, + {0.560902,0.219424}, + {1.472746,0.370998}, + {0.004523,0.852842}, + {-0.707314,-0.502471}, + {-0.705225,-0.568235}, + {-1.031248,0.407625}, + {1.060594,0.382613}, + {1.464419,-0.586019}, + {-0.605902,-0.458757}, + {0.929307,0.153506}, + {-0.016372,0.282450}, + {-1.208132,-0.830801}, + {-0.126240,-0.367972}, + {-0.499330,0.674812}, + {1.438503,0.217270}, + {0.740691,0.305890}, + {-0.108512,0.515161}, + {-0.078081,-0.658439}, + {0.032558,-0.295751}, + {-0.340864,-0.476425}, + {-0.013541,1.071300}, + {-0.316971,0.276887}, + {-0.154365,-0.266247}, + {0.612401,0.295050}, + {0.668963,-0.540567}, + {0.158289,0.472776}, + {-0.166571,1.587298}, + {-0.159732,0.238475}, + {0.347017,0.964527}, + {0.004723,1.073330}, + {0.829038,-0.522273}, + {-0.541649,0.245743}, + {-0.766282,-1.376811}, + {1.171373,-0.879527}, + {0.569829,0.378677}, + {0.416307,0.145570}, + {-0.123077,-0.283547}, + {-0.896898,0.201798}, + {-0.435349,-0.464885}, + {1.650033,0.637224}, + {0.965961,0.150970}, + {1.166701,0.751840}, + {-0.127525,0.401022}, + {0.092153,0.492356}, + {-0.022106,0.491025}, + {0.385129,1.227755}, + {-0.436923,0.728795}, + {-0.022073,-0.802340}, + {1.216361,-1.280683}, + {-0.519844,-0.069400}, + {0.409208,-0.807452}, + {-0.368572,0.226689}, + {0.076268,0.839854}, + {0.287471,-0.764709}, + {1.363614,0.454507}, + {-1.102576,0.253968}, + {-0.046986,-0.270808}, + {-0.736602,0.092040}, + {1.165091,-0.216918}, + {0.127164,0.453077}, + {-0.886593,0.861856}, + {0.158112,-0.594493}, + {-0.030994,0.470361}, + {-0.261688,0.126497}, + {0.600867,0.028243}, + {-0.982395,0.004090}, + {-0.507128,-0.005293}, + {-0.731200,-1.445173}, + {-1.293737,-0.514366}, + {0.105943,-0.405240}, + {0.207327,-0.755563}, + {-0.023598,0.754680}, + {1.402186,-0.206298}, + {-0.127333,0.036313}, + {1.399904,-0.297810}, + {-0.974748,0.286854}, + {1.124209,1.335946}, + {-0.128752,0.673476}, + {0.713310,0.757828}, + {-0.843100,-0.537106}, + {-0.715673,0.477791}, + {-0.382188,-0.826056}, + {0.390282,-0.250610}, + {0.514525,1.058072}, + {-0.896554,1.141563}, + {0.829613,0.348516}, + {0.238624,0.417594}, + {-0.105300,-1.182838}, + {1.532616,-0.028817}, + {-0.894122,-0.090487}, + {-0.389445,0.360247}, + {1.821895,0.589262}, + {-1.125450,0.413939}, + {0.161053,1.207355}, + {-0.222854,0.366948}, + {0.533803,0.516122}, + {-0.531179,-0.721872}, + {-0.763610,0.387296}, + {-1.006094,-0.714480}, + {-0.053524,2.039535}, + {0.715739,-0.315490}, + {0.112799,-0.374255}, + {0.012495,-0.075747}, + {0.777265,-1.168285}, + {-0.030666,-0.933422}, + {-0.621612,0.877107}, + {1.613176,-0.222628}, + {0.762815,0.849391}, + {-0.616282,0.927940}, + {-0.508595,-0.736129}, + {-0.282486,0.049873}, + {0.685474,-0.516179}, + {-0.167842,-1.278946}, + {-0.341434,0.561593}, + {-0.450187,0.553444}, + {-0.284804,0.812548}, + {0.660818,0.289406}, + {-0.851014,-1.087384}, + {-0.046101,1.015682}, + {-0.127992,-0.773456}, + {0.306108,-0.585527}, + {0.058395,1.365709}, + {-1.008366,-0.490221}, + {0.982199,0.335153}, + {-0.577732,0.243236}, + {0.835171,1.062171}, + {0.861717,-0.878783}, + {0.076238,0.653993}, + {0.882457,-1.182033}, + {0.395471,0.707660}, + {0.175015,0.113237}, + {-0.326660,-0.420746}, + {-0.270266,-0.064866}, + {1.219132,0.257211}, + {0.532239,-1.366118}, + {-0.063139,0.364975}, + {-0.538459,-0.301802}, + {-0.066699,1.443469}, + {1.349248,-0.063832}, + {0.640151,-0.177954}, + {-0.281434,-0.418631}, + {0.205809,0.035216}, + {-0.593818,-0.007308}, + {0.083672,-0.018417}, + {0.229748,-1.197985}, + {0.617426,-0.238514}, + {0.627780,1.027152}, + {-0.525954,0.502738}, + {-0.494039,0.268553}, + {-0.565555,1.133933}, + {0.692407,-0.156891}, + {-1.132269,-1.404156}, + {0.952331,0.232551}, + {0.542762,0.026346}, + {-0.223407,-0.463245}, + {-0.889800,-1.076883}, + {1.183630,0.315594}, + {-0.424457,-2.145227}, + {2.273507,0.093040}, + {1.217376,-0.209756}, + {-0.118041,0.061581}, + {-0.281683,-0.337646}, + {0.681924,-0.618740}, + {0.366107,0.349009}, + {0.162105,-0.360180}, + {0.626527,-0.551253}, + {-0.406674,1.130650}, + {-0.210328,-0.182414}, + {0.362503,-0.512021}, + {-0.628315,-0.024001}, + {0.504299,0.803734}, + {1.120537,0.920166}, + {0.908672,-0.033387}, + {-0.253838,1.298045}, + {0.481005,0.131980}, + {-0.135943,0.437193}, + {0.267186,0.026759}, + {0.542714,-0.264004}, + {-1.206726,-0.419685}, + {-0.699274,0.238968}, + {0.463989,-0.510916}, + {0.043349,-0.214415}, + {0.160823,0.541792}, + {-0.242431,-0.210894}, + {0.511331,-0.176104}, + {1.048913,0.488046}, + {0.365260,-0.066836}, + {-1.066309,-0.093985}, + {0.542119,0.501833}, + {-1.244972,-0.372142}, + {-0.753972,-0.096356}, + {-0.291842,0.016194}, + {-0.477053,-0.804632}, + {-0.078449,-0.379581}, + {0.753739,-0.537456}, + {0.100513,-0.310604}, + {1.368776,0.717445}, + {0.764968,-0.075108}, + {0.053403,0.448399}, + {0.582609,-0.788861}, + {0.049464,-0.413320}, + {-1.015383,-0.153174}, + {-1.441094,1.226203}, + {-0.935850,0.636812}, + {0.714004,-0.531381}, + {-0.467397,0.354665}, + {-0.132670,0.678550}, + {0.491754,-0.263982}, + {0.137027,-0.063034}, + {-0.320801,0.061453}, + {-0.682060,0.697585}, + {0.772583,-0.400500}, + {-0.702765,0.154811}, + {0.248536,-0.291513}, + {1.213524,-1.416038}, + {-0.169976,-0.794819}, + {0.012138,0.740188}, + {0.700987,-0.962213}, + {0.654398,1.372495}, + {0.267751,0.491715}, + {0.380491,-0.409166}, + {0.697133,-0.296663}, + {-0.210519,0.303294}, + {-0.557089,0.942688}, + {0.250830,0.597076}, + {0.836891,0.383697}, + {-0.781979,-1.371013}, + {-0.312390,-0.764450}, + {-0.475572,0.060645}, + {0.756715,-0.479073}, + {-0.018402,0.967757}, + {-1.118602,0.402060}, + {-0.050789,0.033776}, + {-0.378991,-0.301264}, + {0.550866,-0.472333}, + {0.695695,-0.564736}, + {-1.022700,0.001319}, + {-0.995349,-0.179992}, + {-0.160696,-0.561579}, + {-1.238996,1.005039}, + {0.164585,0.869884}, + {-0.474996,0.425370}, + {-0.437417,1.116224}, + {-0.429658,0.009218}, + {-0.525544,-0.272148}, + {0.695156,-0.102539}, + {-0.850466,-0.358257}, + {0.079718,-1.212420}, + {0.484277,0.505628}, + {0.433427,0.521144}, + {1.357588,-0.280115}, + {-1.050502,0.461743}, + {0.092603,0.569536}, + {0.031757,0.460663}, + {-0.412955,0.613726}, + {-0.236422,-0.089493}, + {0.459335,0.304540}, + {-0.753505,-0.235785}, + {0.355571,-0.811544}, + {0.221435,-0.954573}, + {-2.346443,1.114150}, + {-0.490478,0.349986}, + {-0.652118,0.839932}, + {0.946405,-0.288780}, + {0.892454,0.348067}, + {0.154899,0.070845}, + {-0.145795,0.359580}, + {1.398316,-0.468739}, + {1.048537,0.085309}, + {-0.840074,-0.159959}, + {-0.514107,0.060504}, + {-1.325402,-0.340374}, + {0.838967,0.991954}, + {-1.218276,-1.408265}, + {0.335541,-0.565783}, + {-0.954269,0.937467}, + {-0.559335,-0.134362}, + {1.943719,-1.403866}, + {-0.460487,-0.682805}, + {0.681467,-0.850286}, + {-0.644147,0.907500}, + {-0.369335,0.124141}, + {-0.290076,-0.249195}, + {-1.372572,0.399371}, + {-0.216078,0.112425}, + {0.202706,-0.571132}, + {0.007932,0.238452}, + {0.622883,-0.361681}, + {-1.659769,-0.052142}, + {0.913395,-0.548796}, + {-1.546375,-0.177939}, + {0.033195,0.124151}, + {-1.002228,0.568683}, + {-0.552731,-0.057954}, + {-1.386417,-0.250903}, + {-0.685426,0.169422}, + {-0.419053,-0.687470}, + {0.203790,1.177844}, + {0.101606,0.434861}, + {1.212102,-1.394154}, + {-0.376188,0.550320}, + {0.845756,0.440839}, + {0.313480,-0.822269}, + {-0.806734,-0.209968}, + {0.235863,-0.633919}, + {-0.345711,-1.139946}, + {0.420142,0.087180}, + {0.522750,0.494215}, + {-0.415381,-0.544665}, + {-0.805989,-0.717142}, + {0.591845,-0.006759}, + {-1.082991,-0.056471}, + {-1.529968,1.037963}, + {-0.255855,-1.785748}, + {-0.454847,-0.034732}, + {-0.272457,0.141042}, + {-0.539356,0.233351}, + {-1.123501,0.381575}, + {-1.362791,-0.485143}, + {0.867246,-0.554638}, + {-0.592859,-0.071347}, + {0.029115,0.338592}, + {0.892906,-0.530447}, + {-0.942275,-0.950575}, + {0.681004,-0.812727}, + {-0.682861,-0.748591}, + {0.852113,0.476257}, + {0.789010,-0.330489}, + {0.615453,0.653533}, + {1.319493,-1.499355}, + {0.423842,-0.348825}, + {0.157478,-0.767351}, + {1.477448,1.666978}, + {0.067225,-0.415903}, + {0.744507,-0.884219}, + {0.040268,0.058540}, + {-1.735353,0.366785}, + {0.153680,0.237515}, + {0.667468,0.542703}, + {0.436021,0.493232}, + {0.563348,-1.182141}, + {-0.003835,-0.322843}, + {-0.656232,-0.176493}, + {-0.873231,0.360992}, + {0.136123,1.085468}, + {-0.510539,0.320659}, + {-0.312098,0.046118}, + {-0.421199,-1.437631}, + {-0.215423,0.161690}, + {1.307419,-0.284457}, + {-0.563560,-0.119780}, + {-1.600169,0.228748}, + {-1.421886,0.023649}, + {-0.189495,0.797349}, + {-0.165802,0.372003}, + {-0.221700,-0.219905}, + {0.534275,-0.120511}, + {-0.248351,-0.805280}, + {0.034413,0.744190}, + {-0.642193,-0.452466}, + {-0.599072,-0.680422}, + {-1.724224,0.426709}, + {-0.790234,-0.730923}, + {0.088659,-1.035535}, + {-0.275351,-0.733153}, + {-1.102652,-0.046605}, + {-0.757406,0.374197}, + {1.053567,-1.538006}, + {0.088439,-0.294301}, + {0.516494,0.576207}, + {0.909468,-0.056118}, + {0.067821,-0.686035}, + {-1.044428,0.968891}, + {0.557625,-0.843896}, + {-0.446400,0.872971}, + {0.354836,1.692407}, + {-1.197610,-0.164863}, + {1.193169,-0.074590}, + {0.564380,-0.167004}, + {1.458768,0.101084}, + {-1.659323,-0.179509}, + {-0.637948,-1.333850}, + {0.521633,-0.111609}, + {0.159952,0.245567}, + {0.557457,0.552443}, + {-0.541189,-0.269047}, + {0.178323,0.718181}, + {-0.148046,1.282756}, + {0.396217,-0.918592}, + {-1.196000,-1.302291}, + {-1.147016,1.087835}, + {-0.697901,0.120563}, + {-0.416445,-0.085792}, + {-0.575136,1.047383}, + {-0.108410,0.806852}, + {0.103438,0.190436}, + {-0.514501,0.205539}, + {-1.158432,0.436651}, + {1.837359,0.282446}, + {2.898165,0.605520}, + {-0.638636,-1.383828}, + {-0.422205,-1.159697}, + {0.439481,1.089898}, + {-0.440211,0.267563}, + {0.055757,-0.465994}, + {0.203813,-1.372535}, + {-0.369227,-0.991863}, + {0.502829,0.205971}, + {-0.168711,0.991037}, + {-0.441042,-0.002326}, + {0.323292,-0.197988}, + {0.245345,0.967783}, + {-1.106120,-0.247019}, + {-0.701892,-0.940481}, + {0.089337,0.099586}, + {-0.484300,0.499526}, + {1.270932,0.213534}, + {0.769257,0.759910}, + {-0.001945,0.582357}, + {-1.013147,0.480989}, + {0.541451,0.216142}, + {0.984260,-0.129450}, + {0.593683,-0.154239}, + {-1.381179,1.039958}, + {0.586204,-0.209757}, + {0.373642,0.368349}, + {0.322644,0.122887}, + {-0.760574,0.101006}, + {-0.369533,0.356949}, + {0.793169,0.343188}, + {-0.088122,-0.026515}, + {-0.134987,-0.622070}, + {-0.209032,0.730416}, + {-0.633736,-0.964829}, + {0.004523,0.680249}, + {-0.251489,-0.161656}, + {-1.236883,0.834379}, + {0.158569,-0.243367}, + {-0.728852,0.382640}, + {0.132910,-0.265206}, + {0.491294,1.636521}, + {-1.199529,-0.648592}, + {0.655339,-0.600365}, + {-0.088940,0.359795}, + {-0.344506,1.674392}, + {-0.074931,-0.684859}, + {-0.600775,0.495819}, + {0.546661,-0.283537}, + {0.816700,1.018373}, + {1.345432,0.093005}, + {-0.429347,-1.242027}, + {-0.195153,0.520674}, + {0.051187,-0.285221}, + {-0.157695,0.732045}, + {0.525571,0.750470}, + {-1.647741,0.695828}, + {0.729457,-1.305992}, + {-0.156214,0.275815}, + {-0.271609,-1.109912}, + {-0.884156,1.468249}, + {0.772042,-0.843589}, + {1.124620,0.188741}, + {-0.613738,-1.412528}, + {1.392810,0.203713}, + {0.414216,-0.811126}, + {0.049929,-0.015404}, + {-1.845246,0.585689}, + {0.311221,-0.174248}, + {0.322036,0.428788}, + {0.323903,-1.877702}, + {0.723333,-0.843178}, + {-1.316829,-0.626211}, + {-0.457250,-0.296858}, + {0.460788,-0.256206}, + {1.858779,0.618149}, + {1.520473,0.618939}, + {0.182818,-0.609792}, + {0.093293,-0.511200}, + {-0.796530,0.280311}, + {0.314653,0.441506}, + {0.145929,-0.171299}, + {0.989340,-0.023398}, + {0.382977,0.962526}, + {-0.234472,0.204414}, + {-0.168631,0.970621}, + {-0.359397,-0.238005}, + {-1.160084,-0.108981}, + {1.026957,0.611603}, + {0.594561,0.074036}, + {-0.703831,-0.612982}, + {-0.920383,0.335892}, + {0.779956,-0.290330}, + {0.160028,-0.530884}, + {-0.462821,-0.124964}, + {-0.021306,-0.500310}, + {-0.640899,-0.880880}, + {-0.168131,0.249834}, + {-0.181111,0.256184}, + {0.201675,-1.172094}, + {-1.107592,-0.654002}, + {0.618958,-1.100837}, + {-0.613276,-0.606221}, + {0.589475,0.793413}, + {-0.799120,-1.033400}, + {0.461943,0.180295}, + {-0.992388,0.078304}, + {0.249753,-0.552251}, + {1.140054,0.813340}, + {-0.380441,-0.427859}, + {0.140464,-0.478517}, + {-0.693361,1.211238}, + {0.156036,-0.216601}, + {0.403554,-1.008049}, + {-0.867654,1.706051}, + {-0.451461,0.206311}, + {-1.312167,-0.321273}, + {0.304323,1.501758}, + {-1.237910,0.416220}, + {-0.246990,-0.517017}, + {0.921878,1.665267}, + {0.680523,0.333206}, + {-0.250695,-0.780680}, + {0.017056,-1.185064}, + {0.833909,-0.065707}, + {-1.048432,-0.304359}, + {-0.079640,0.971286}, + {0.860137,1.148088}, + {-0.222327,0.443586}, + {0.569845,0.484530}, + {0.709289,0.527264}, + {-0.437060,1.058135}, + {0.441519,0.926605}, + {0.563086,-0.036039}, + {0.731869,1.018196}, + {0.715868,-0.555336}, + {0.083263,-0.392260}, + {-0.432371,0.271707}, + {-0.323319,0.838910}, + {-0.250503,-0.369677}, + {-0.341576,-0.046356}, + {1.703584,0.832092}, + {0.305570,0.700940}, + {0.313809,0.320696}, + {-0.232152,-0.195104}, + {-0.160822,0.383805}, + {-0.782644,0.821497}, + {0.317483,0.561839}, + {0.292112,-0.787810}, + {0.682217,-0.036886}, + {-0.234958,-0.342815}, + {1.489802,0.394218}, + {-0.780212,0.082822}, + {0.012921,1.219529}, + {-0.309442,1.310485}, + {0.805021,0.916130}, + {-0.164403,-0.490808}, + {-2.442305,0.477766}, + {0.306204,0.782185}, + {-0.642253,0.034201}, + {-0.734342,0.374860}, + {-0.534225,-0.141448}, + {-1.039800,0.243934}, + {-0.758901,0.139142}, + {0.772172,-0.221432}, + {-0.227259,-0.494436}, + {-0.797240,0.203608}, + {-0.526939,-1.003768}, + {0.604457,-0.836335}, + {-1.042733,-1.031733}, + {0.351133,-1.552611}, + {0.193510,-0.593573}, + {-0.158616,-0.000909}, + {0.477336,0.765709}, + {0.294301,-0.549073}, + {2.252452,0.421725}, + {-0.648990,-0.424124}, + {-0.564920,-0.189999}, + {-0.270131,0.078961}, + {0.772736,0.336949}, + {0.313340,-0.927747}, + {-0.573263,0.583021}, + {0.470820,-1.055331}, + {0.581432,0.212701}, + {-0.711626,0.384798}, + {0.162031,-0.175657}, + {0.742236,-0.643734}, + {0.803206,-0.132745}, + {0.613025,-0.690771}, + {0.291435,1.290752}, + {0.501168,0.658611}, + {-1.443138,-0.434044}, + {0.661785,0.822570}, + {-1.374180,0.778183}, + {0.382538,-0.753720}, + {-0.517099,0.294458}, + {0.849115,0.536175}, + {1.511322,-0.255960}, + {-0.446477,-0.510725}, + {0.351935,-0.058662}, + {-0.309950,-0.683659}, + {-0.315003,0.260157}, + {0.056499,-0.463872}, + {-0.865618,-0.396466}, + {-1.294184,0.061282}, + {1.011925,0.144531}, + {0.932576,-0.379779}, + {1.018562,0.158520}, + {-0.048017,0.052001}, + {-0.917482,-1.278635}, + {-0.098721,-0.152092}, + {1.017871,0.028110}, + {-0.268018,-0.393909}, + {0.293293,0.208300}, + {-0.580657,-0.411407}, + {1.031302,0.428409}, + {1.910617,-0.467351}, + {-0.831919,1.592028}, + {0.663417,-0.384198}, + {1.046530,-0.066088}, + {0.351843,0.024416}, + {0.571277,-0.833007}, + {-0.079296,-0.149397}, + {0.413530,-0.701706}, + {0.210312,-0.385820}, + {-0.140847,-0.268188}, + {0.139115,1.298546}, + {-1.143262,-0.441174}, + {-0.027645,0.535143}, + {-0.405058,-0.616212}, + {0.316847,-0.050931}, + {0.349966,-0.763656}, + {-0.103767,0.410991}, + {-1.917632,-0.571364}, + {-0.242820,-1.010565}, + {-0.127771,-0.753536}, + {0.604908,-0.475209}, + {0.013372,0.837038}, + {0.608820,0.079690}, + {-0.142643,-0.181203}, + {-0.281800,-0.574404}, + {1.254414,0.387417}, + {0.880432,-0.334068}, + {-0.222264,-1.359749}, + {-0.157873,0.904339}, + {-0.249764,-0.463576}, + {0.667664,0.499756}, + {-0.267900,0.673011}, + {0.640840,1.260412}, + {0.484117,-0.429452}, + {0.592152,-0.003510}, + {0.506192,-0.201848}, + {1.247699,0.171432}, + {0.353386,0.996887}, + {0.078137,-0.308590}, + {-0.018745,-1.037419}, + {1.093397,0.245313}, + {0.750051,1.199990}, + {-0.094081,-0.586781}, + {0.051596,-0.731723}, + {0.455013,1.276353}, + {-0.195394,-0.845165}, + {-0.520628,0.355488}, + {-0.688832,-0.070661}, + {0.375953,0.177470}, + {1.142021,0.354608}, + {-0.475901,0.038190}, + {0.364796,0.118211}, + {-0.675976,-0.263314}, + {-0.552894,0.232846}, + {-0.464710,-0.158232}, + {-0.258691,-0.053579}, + {0.279914,-0.374251}, + {-0.442636,-0.032047}, + {-0.444012,-0.548113}, + {-0.360146,0.089110}, + {0.490385,0.171563}, + {1.123041,-0.550139}, + {0.543533,0.079109}, + {-0.637200,-1.014626}, + {0.046707,-0.245370}, + {-0.257292,1.703984}, + {-0.071662,-0.589401}, + {0.108536,0.405153}, + {-0.344097,0.282119}, + {-0.245578,0.106487}, + {-0.401110,-1.258960}, + {0.107488,0.353920}, + {0.608643,-0.021585}, + {0.440527,-1.022432}, + {0.213325,0.187777}, + {-0.052628,-0.281017}, + {0.235210,0.007120}, + {-1.235719,0.155901}, + {-0.268724,1.113432}, + {-0.121335,0.019839}, + {0.189913,1.015487}, + {0.865889,0.697982}, + {0.197149,0.792114}, + {-0.117071,0.639035}, + {-1.306955,0.275980}, + {0.252452,0.322515}, + {-0.529397,-0.478036}, + {0.936446,-1.395706}, + {0.400833,0.024500}, + {-0.502883,-0.102895}, + {0.273595,0.753245}, + {-0.343074,0.091902}, + {0.304226,-0.867240}, + {-0.180509,-1.078705}, + {-0.205455,0.858649}, + {0.774539,0.517635}, + {-0.823959,0.593452}, + {0.732369,0.153099}, + {0.672588,-0.633125}, + {0.002290,-0.941901}, + {0.176569,-0.579932}, + {0.171845,-0.870413}, + {-0.293425,0.175049}, + {-0.137718,0.217686}, + {1.044936,0.061606}, + {-0.758815,0.807341}, + {-0.336751,-0.164385}, + {1.008626,0.256348}, + {-0.723706,0.047971}, + {-0.050905,-0.353985}, + {0.390970,-0.158517}, + {0.119335,0.109838}, + {-0.041174,-0.673703}, + {-0.556070,-0.401985}, + {-0.509192,0.543375}, + {0.625149,-0.084801}, + {-0.744969,0.178757}, + {-0.163163,0.168014}, + {-0.749477,0.577796}, + {-0.154530,0.089817}, + {0.437073,-0.946214}, + {-0.116608,-1.099246}, + {0.666880,0.264435}, + {0.474793,-0.843138}, + {0.617247,0.069116}, + {0.294487,0.030065}, + {-0.337986,0.559117}, + {-0.227776,0.882621}, + {1.101572,-1.080786}, + {0.070565,-0.664384}, + {-0.451764,-0.457432}, + {-0.576313,-0.841245}, + {0.068010,0.274456}, + {-0.710972,1.045372}, + {-0.080175,-0.636644}, + {-1.167785,-0.908857}, + {-0.040623,0.027782}, + {2.470891,-0.352323}, + {0.225188,-0.216579}, + {-0.911285,-0.883839}, + {1.575339,0.857027}, + {-0.480260,0.028266}, + {-1.400611,-0.208040}, + {-0.607262,0.315214}, + {-1.413554,-0.086775}, + {-0.078748,0.091694}, + {-0.823326,-0.045219}, + {0.179688,0.157220}, + {0.503945,-0.069413}, + {0.384609,1.810637}, + {-0.036682,0.018567}, + {-0.630811,-0.597114}, + {-0.672791,-0.931285}, + {1.222804,1.107029}, + {-0.313392,0.591602}, + {1.095544,1.771690}, + {-0.798560,1.745435}, + {1.543951,0.832816}, + {0.126556,1.114287}, + {0.213435,1.321216}, + {-0.224136,-1.359183}, + {1.477972,-0.350192}, + {-0.077844,-0.795493}, + {-0.231997,-0.564458}, + {0.801618,-0.460815}, + {-1.183569,1.681266}, + {0.800365,-1.537642}, + {-0.329589,-0.279386}, + {0.146069,-0.294189}, + {0.197825,0.827717}, + {-0.649584,1.974452}, + {-1.281819,1.044606}, + {0.908785,-0.571095}, + {1.096563,-0.008991}, + {1.743241,0.314216}, + {0.653207,0.687347}, + {-0.304444,-0.200533}, + {0.317770,0.204985}, + {1.680031,-1.270921}, + {0.013470,0.101117}, + {0.035178,0.125471}, + {-0.496304,-1.027426}, + {-0.803857,-0.277048}, + {0.785028,-0.689768}, + {0.339297,0.190250}, + {0.464936,-0.560609}, + {-0.775980,-0.128567}, + {-0.724656,0.021571}, + {0.116261,-1.049885}, + {-0.856403,0.530206}, + {0.067380,-0.690871}, + {-0.101626,0.190740}, + {-0.230450,0.733674}, + {1.510300,-0.232611}, + {-0.558900,0.743672}, + {0.328636,-0.130287}, + {0.037062,0.836783}, + {0.228297,-1.114284}, + {0.591880,-0.742029}, + {1.016332,0.389831}, + {0.501144,0.220041}, + {-0.682226,0.173825}, + {0.194447,-0.220124}, + {-0.201636,0.483213}, + {-0.346227,0.693268}, + {0.089963,0.776428}, + {0.784136,-0.216991}, + {1.351173,0.460213}, + {0.948340,0.389235}, + {0.856649,-0.280823}, + {-0.281458,-0.467549}, + {0.712758,-0.473551}, + {-0.113624,-0.180662}, + {0.827903,-0.935301}, + {0.384431,0.183861}, + {-0.116835,0.143097}, + {0.437151,0.673442}, + {-0.259116,1.211244}, + {-0.832708,0.005765}, + {0.579745,-0.839210}, + {-0.272578,0.846526}, + {0.006319,-0.191822}, + {-0.543038,-2.053956}, + {0.577765,-0.226179}, + {-0.864414,0.264531}, + {-0.081640,-0.316889}, + {-0.733387,-0.029103}, + {-0.856447,0.102918}, + {1.118355,-0.516612}, + {-0.953002,0.614206}, + {0.317643,0.733096}, + {-0.268814,0.548796}, + {1.819432,-1.055275}, + {-0.311760,0.400650}, + {0.198343,-1.247555}, + {-0.027410,0.778872}, + {-0.508919,0.444286}, + {-1.171694,0.019824}, + {1.248879,0.012588}, + {-0.703571,-1.267101}, + {-0.351630,0.717535}, + {0.712341,0.238149}, + {-0.921778,0.823704}, + {0.183744,-0.465176}, + {0.967624,0.110433}, + {0.638384,-0.733964}, + {0.023469,-0.341078}, + {0.457953,0.148002}, + {-0.387642,0.886603}, + {-0.069635,-0.580919}, + {-0.059943,-1.223428}, + {0.912288,0.393697}, + {0.642983,0.930647}, + {0.910222,0.601928}, + {-0.445410,-0.667141}, + {-1.572064,0.279244}, + {1.978238,0.802084}, + {-0.397479,-0.061574}, + {0.410751,0.408608}, + {-0.708602,-0.186290}, + {-0.230716,0.939863}, + {0.243815,0.220266}, + {0.510986,0.986593}, + {-0.697529,0.649296}, + {-0.586676,-0.694978}, + {1.365805,0.060623}, + {0.669724,0.191354}, + {1.712433,0.794664}, + {1.420112,0.316341}, + {0.241010,0.642880}, + {-0.543402,-0.040763}, + {0.566228,-0.271359}, + {-0.161257,0.334876}, + {0.599455,1.548617}, + {-0.164632,-0.789523}, + {-0.166458,-1.089323}, + {-0.603273,-0.989075}, + {0.528595,0.451579}, + {-0.312701,0.087580}, + {0.052067,-0.329935}, + {-0.422394,-0.867374}, + {0.543689,0.209453}, + {-0.559684,-1.177563}, + {0.467575,-0.097401}, + {0.369629,-0.501474}, + {0.404819,0.203655}, + {1.147670,0.855509}, + {-0.639961,0.122152}, + {0.634182,-0.589714}, + {-1.383792,0.081240}, + {-0.762136,-0.308434}, + {0.795235,-0.419563}, + {-0.464381,1.585393}, + {1.078462,0.518624}, + {0.096101,-0.470606}, + {-1.483047,-0.692461}, + {-0.298531,0.776764}, + {0.119121,-0.885261}, + {0.117578,0.531321}, + {-0.917483,1.214456}, + {0.103637,-0.543026}, + {-0.029330,-0.442023}, + {0.667382,-0.559059}, + {0.454800,1.315120}, + {-0.121242,1.135188}, + {-0.488542,0.095236}, + {1.029647,0.289141}, + {-0.103825,-0.536353}, + {0.328875,0.038776}, + {0.506639,-0.670018}, + {0.579004,0.162704}, + {0.390291,0.091227}, + {-1.290292,-0.652858}, + {-0.408826,0.011857}, + {0.767200,0.888858}, + {1.439873,0.872966}, + {1.146577,0.749942}, + {0.081693,-0.305140}, + {-0.129388,1.025387}, + {-0.634484,-0.843138}, + {0.172444,0.005313}, + {-0.657469,-0.089850}, + {-0.760529,-0.081906}, + {-0.426315,-1.084558}, + {-0.979330,-0.160143}, + {-0.044730,0.574946}, + {-1.527934,0.139190}, + {-0.115705,-0.468978}, + {0.394550,-0.231006}, + {0.586208,-0.529691}, + {0.437290,-1.153886}, + {0.808557,1.623821}, + {-1.472277,0.306073}, + {0.113523,-0.990164}, + {-0.436942,-0.152251}, + {0.906011,-0.455300}, + {-0.137609,-0.290251}, + {0.467302,-0.253409}, + {-0.677977,-0.643365}, + {-0.258209,0.117683}, + {0.237770,0.579862}, + {0.361357,0.184037}, + {-0.768527,-0.431966}, + {-0.374232,0.070814}, + {-0.271652,0.701989}, + {-1.650963,1.243199}, + {0.817481,-0.130520}, + {0.093297,1.182986}, + {-0.740615,0.357099}, + {0.190737,1.086730}, + {-0.326431,-0.458982}, + {0.123048,1.118810}, + {-0.006755,0.087656}, + {0.321461,0.525849}, + {-0.567447,-0.412553}, + {-0.516657,-1.118277}, + {-0.343009,-0.119105}, + {0.491223,1.372952}, + {0.179821,0.053473}, + {-0.238648,0.029409}, + {0.222945,0.156960}, + {0.310281,0.281777}, + {-0.992198,-0.975749}, + {-0.432296,-0.289497}, + {-1.121582,-0.621216}, + {-0.079473,-0.549632}, + {0.673944,0.250442}, + {-1.170647,0.816044}, + {0.009351,-0.038545}, + {0.202295,0.376773}, + {0.207996,-0.767330}, + {-0.683128,0.462706}, + {0.363351,0.668791}, + {-0.236248,0.234738}, + {0.236777,0.097248}, + {-0.079751,-0.322131}, + {0.422070,0.380715}, + {0.465275,-0.117293}, + {0.914394,0.070100}, + {-0.328927,-1.087863}, + {0.009725,-0.714301}, + {0.694105,-0.275872}, + {0.038939,-1.079395}, + {0.761932,1.210910}, + {0.753418,0.067086}, + {-0.215663,-0.159486}, + {-0.187086,0.872605}, + {-0.142958,0.220448}, + {0.273894,-0.555399}, + {-0.650689,-0.402346}, + {0.897581,0.328779}, + {-0.338363,1.002994}, + {-0.328070,0.563372}, + {-0.550288,0.856980}, + {-0.977701,-1.482775}, + {2.446075,-0.651519}, + {0.653114,0.245545}, + {0.481750,1.570437}, + {-0.925317,0.286313}, + {0.723354,0.222318}, + {0.684692,-1.247687}, + {-0.189216,-0.475236}, + {-0.640211,0.212953}, + {-0.053677,0.669794}, + {-0.330972,-0.472563}, + {0.194653,-1.044945}, + {-0.541368,-0.021547}, + {0.683410,-0.394597}, + {0.106472,-0.419672}, + {0.760465,0.199993}, + {-1.179110,0.112292}, + {0.055066,0.377698}, + {0.909270,-1.560735}, + {0.401362,1.350247}, + {0.187297,-0.004588}, + {-0.039523,1.088870}, + {-0.268140,0.216489}, + {0.164274,1.288643}, + {-1.308630,0.008255}, + {-0.828187,0.539431}, + {0.171691,1.194553}, + {0.299761,-0.052910}, + {1.722756,-0.697963}, + {-0.251873,-0.722015}, + {0.079270,-0.072157}, + {-0.932151,-0.304344}, + {0.207095,0.052868}, + {1.088320,-1.003559}, + {0.850424,-0.709885}, + {0.649069,-1.639259}, + {0.383301,-0.409913}, + {0.170324,-0.407571}, + {0.752730,0.520546}, + {0.243588,0.101737}, + {-0.487145,0.946709}, + {-0.484323,-0.380167}, + {0.224305,-0.272019}, + {0.059913,-0.726160}, + {-0.285819,-0.028296}, + {-1.484445,-0.022900}, + {0.166353,0.255178}, + {-1.161566,0.903064}, + {0.494498,0.797073}, + {-0.297146,-0.147285}, + {-0.236315,0.665692}, + {-0.085679,0.279219}, + {-0.870393,0.141386}, + {-0.014293,-0.542938}, + {-0.365326,0.980887}, + {0.203701,-0.711214}, + {-0.407262,0.445812}, + {1.421543,-0.606156}, + {1.347169,0.048977}, + {-1.433734,0.817061}, + {1.146370,-0.793382}, + {0.319925,-0.854738}, + {0.438860,2.145962}, + {1.166341,-0.365637}, + {0.683141,0.055309}, + {-1.130258,0.470611}, + {-0.142316,0.723606}, + {-1.167357,0.251633}, + {-0.061046,-0.144651}, + {-0.028701,-0.462089}, + {-0.018132,0.169646}, + {-0.671335,0.900461}, + {0.116801,-0.593090}, + {0.085282,-0.067586}, + {-0.411836,0.548411}, + {0.260672,-1.297764}, + {-0.232586,-0.692774}, + {-0.797251,0.519497}, + {0.493274,0.128724}, + {-0.452326,-0.942666}, + {-1.259305,0.165846}, + {-0.397245,-0.650621}, + {-0.827247,-0.027941}, + {0.400771,0.899915}, + {-1.510673,-0.552102}, + {-0.016118,-1.664885}, + {0.468835,-0.256144}, + {-0.095802,-0.449476}, + {-0.334430,-1.538678}, + {0.005072,0.053176}, + {0.276647,-0.648527}, + {0.087667,0.067103}, + {0.853516,0.367063}, + {0.694817,-0.772811}, + {0.402106,-0.764670}, + {0.563088,0.747578}, + {-0.268367,1.277181}, + {-0.749042,-0.032805}, + {1.254513,0.221049}, + {-0.610276,0.267629}, + {-0.316447,1.420839}, + {-1.922798,-0.390022}, + {0.556385,0.484709}, + {0.027270,0.139172}, + {-0.726247,-0.156295}, + {-0.120574,1.445949}, + {0.876597,0.011245}, + {-0.056240,-0.228567}, + {-0.008902,-0.187852}, + {0.322713,-0.491207}, + {-0.362863,0.473453}, + {-0.712861,-0.365141}, + {-0.742098,-0.136880}, + {0.111748,1.005100}, + {-0.464041,-0.288319}, + {-0.591913,0.416452}, + {0.517190,0.391430}, + {1.195625,0.788324}, + {0.410152,0.138649}, + {-1.371791,1.228180}, + {-0.101232,0.141153}, + {-0.710496,-0.154048}, + {-0.808498,-0.383805}, + {-0.018569,-0.202316}, + {1.184777,-1.079341}, + {-1.306705,0.345682}, + {-0.154691,0.011843}, + {0.661710,0.500578}, + {-0.343929,0.779614}, + {0.543034,1.214597}, + {-1.348330,0.139834}, + {0.117324,0.850516}, + {-0.108573,-0.567512}, + {-0.543670,-0.506252}, + {0.763259,-0.023357}, + {-0.124683,-0.687557}, + {-0.298014,0.912602}, + {0.205308,0.618330}, + {1.529908,-0.085205}, + {0.956008,-0.652740}, + {-0.068925,-1.092457}, + {-0.637354,-0.419358}, + {1.268680,-0.243073}, + {-0.136088,-0.425454}, + {-1.136538,1.501422}, + {-0.865629,0.163418}, + {1.489446,-0.425663}, + {-0.176186,-0.697113}, + {0.053611,-0.207498}, + {0.453244,0.901965}, + {0.045845,1.465057}, + {0.863726,-0.540462}, + {-0.043928,0.683414}, + {0.115106,-1.021701}, + {0.247975,0.286382}, + {0.801124,0.684719}, + {-0.492425,-0.671975}, + {-0.738085,-0.372832}, + {0.246402,0.622964}, + {1.316755,0.124231}, + {0.061890,0.559458}, + {-0.016314,0.518483}, + {0.065088,-0.564502}, + {-1.075867,-0.098767}, + {0.178467,0.098481}, + {-0.008945,-0.802168}, + {-0.811757,0.814761}, + {1.059392,-0.846953}, + {-0.343747,0.373055}, + {0.758821,-1.176281}, + {-0.647837,-0.951149}, + {-0.817682,0.112162}, + {1.173084,-0.558803}, + {-0.604647,0.144875}, + {-0.132176,0.361366}, + {-0.668269,0.061026}, + {0.246659,0.201436}, + {1.226810,-0.619724}, + {-0.468072,-0.019591}, + {0.966661,0.482886}, + {0.583820,0.926226}, + {0.852546,0.572840}, + {-0.649207,-0.545958}, + {0.255183,-0.155787}, + {-0.025898,0.078114}, + {-0.201309,-0.225492}, + {0.525905,0.410706}, + {0.177865,1.477507}, + {2.457610,-1.850447}, + {0.151478,1.000617}, + {1.360119,-0.754828}, + {0.157215,-0.492841}, + {-0.566692,1.324305}, + {0.620154,0.754623}, + {0.074979,-0.860552}, + {-0.222454,0.021736}, + {-1.408236,-1.307141}, + {-0.544968,0.463417}, + {-0.595774,-0.743040}, + {0.559990,0.480234}, + {-1.168589,-0.203965}, + {0.281098,-0.105368}, + {0.641682,-0.360390}, + {0.836257,-0.373430}, + {-0.805041,0.752649}, + {0.441466,-0.719064}, + {-1.832253,1.143759}, + {-0.247786,-0.438656}, + {-0.870375,0.850503}, + {-0.375699,0.159219}, + {-1.124725,0.793712}, + {-0.723709,0.342564}, + {-0.633437,-0.558060}, + {-0.135905,-0.355088}, + {-2.183977,-0.007379}, + {1.116177,0.159945}, + {1.490166,0.480268}, + {0.164575,-0.726484}, + {-0.520145,0.297363}, + {-0.641292,-0.643205}, + {-0.067693,-0.128819}, + {0.413410,0.031469}, + {-0.760742,1.425786}, + {0.085627,-0.041021}, + {0.114922,0.384508}, + {-0.225939,-0.065478}, + {0.023267,1.057989}, + {1.470100,-0.598823}, + {0.723707,-1.348607}, + {0.035084,-1.125010}, + {-0.454672,0.069253}, + {0.809724,-0.071756}, + {0.083234,0.221237}, + {-0.377449,1.091443}, + {0.402802,0.357787}, + {-0.684853,-0.705112}, + {-0.625051,-0.136144}, + {1.018437,-0.307444}, + {-0.339611,0.577613}, + {-0.559291,-0.331159}, + {-0.661887,0.404697}, + {-0.412244,-0.877878}, + {-0.591570,-0.072583}, + {-0.437359,0.868594}, + {0.926766,-0.479234}, + {-0.939874,0.960508}, + {-0.216226,-2.190387}, + {0.373954,-0.239234}, + {0.735172,-0.368192}, + {0.925092,0.361395}, + {0.238858,-1.067577}, + {0.211254,0.055615}, + {0.067811,-0.232802}, + {-0.256948,-1.231779}, + {-0.231535,-1.085856}, + {1.027191,0.635764}, + {-1.039482,-0.284762}, + {0.802325,0.903988}, + {-0.407235,-0.165035}, + {-0.645411,0.570917}, + {-0.631895,-0.866667}, + {-0.413516,-0.479763}, + {-0.327054,0.889851}, + {-0.660647,1.168247}, + {-0.054201,-0.157478}, + {0.021347,1.157376}, + {-0.281979,0.310791}, + {1.078613,-0.998599}, + {0.978329,-0.316584}, + {0.227859,-0.057813}, + {0.879319,1.029731}, + {0.007877,-0.338237}, + {-0.023282,0.856635}, + {0.802926,0.658965}, + {-0.654637,-0.321326}, + {-0.486953,-0.278102}, + {0.399871,-0.703921}, + {0.137966,-0.143648}, + {-1.382161,-0.633032}, + {0.994994,0.454662}, + {-0.563795,-0.296766}, + {0.395332,-0.055457}, + {0.879708,-0.963628}, + {-0.321128,-0.149853}, + {-0.072034,-0.491397}, + {0.094058,-0.301073}, + {0.846232,0.232090}, + {0.286858,-0.066615}, + {-0.642041,0.413146}, + {0.464097,0.354731}, + {0.102751,1.804440}, + {0.377422,0.609243}, + {0.654797,-0.435679}, + {0.472210,-0.209745}, + {-0.641060,-0.154395}, + {-1.512229,0.312514}, + {-0.668791,-1.337721}, + {-0.568657,-0.277971}, + {0.842358,1.337541}, + {-0.633354,0.123400}, + {-0.236926,1.438454}, + {-0.524131,0.461021}, + {-0.027427,0.041582}, + {-0.630328,-0.951639}, + {0.467582,-0.775196}, + {-0.645079,-0.410044}, + {1.050603,1.068060}, + {-0.144830,0.117018}, + {-0.428974,-0.059010}, + {0.343620,-1.481687}, + {-0.117022,0.802153}, + {0.371381,0.568841}, + {-0.713658,-0.166011}, + {-0.262867,-0.772913}, + {1.097425,0.118692}, + {-0.682499,0.040285}, + {-0.088318,-0.101135}, + {0.596149,0.381073}, + {-1.594536,0.711970}, + {-0.520008,0.491471}, + {0.042324,0.355744}, + {-0.736938,-0.529835}, + {-0.648401,0.855958}, + {-0.338084,-0.351747}, + {0.672677,0.892670}, + {0.361092,-0.678357}, + {2.079292,0.329758}, + {0.234354,0.449063}, + {0.246854,-0.747312}, + {-0.254858,-0.378022}, + {0.391048,0.078144}, + {-1.322392,1.109864}, + {-0.392252,1.133680}, + {0.317787,-1.119124}, + {-1.125500,0.590658}, + {0.651714,-0.019948}, + {-0.188271,-0.587491}, + {0.512942,0.238828}, + {-0.089800,0.880141}, + {-0.020669,-0.745277}, + {-0.393933,0.425016}, + {-0.706385,-0.337056}, + {-0.072274,-0.466942}, + {1.361972,1.600456}, + {-0.536411,0.143837}, + {-1.315825,-0.345262}, + {0.586610,-0.105453}, + {0.361835,-0.310457}, + {0.162424,-0.455937}, + {-0.266229,0.468748}, + {0.608348,0.237188}, + {-0.338820,0.469070}, + {0.825241,-0.122825}, + {-1.296042,-1.106153}, + {0.782186,1.012854}, + {0.546063,0.108291}, + {-0.675564,-0.118591}, + {0.959435,-0.617240}, + {0.253049,0.642651}, + {-0.717033,0.421230}, + {0.065648,-0.236145}, + {0.787941,-0.725300}, + {-0.214982,-0.330445}, + {-0.005308,0.843855}, + {0.569761,-1.404632}, + {-0.847684,0.288276}, + {-1.351673,0.398555}, + {-0.653094,0.359977}, + {-0.451479,-0.175236}, + {0.250162,1.082506}, + {1.720280,-0.173550}, + {0.043283,0.495568}, + {-0.467075,-0.286571}, + {-0.516911,0.372184}, + {-0.644850,0.027566}, + {0.412044,-0.228306}, + {0.441079,-0.818598}, + {0.597972,0.496661}, + {-0.751802,0.592583}, + {-0.172332,-0.063214}, + {-0.486652,0.453796}, + {-0.789048,0.001233}, + {-0.037757,-0.424086}, + {0.610775,0.085934}, + {1.357820,0.385392}, + {0.772897,0.561994}, + {-0.547971,0.343509}, + {-0.305912,-0.659965}, + {-0.150391,0.051106}, + {-0.659545,0.811236}, + {1.156720,-1.403491}, + {0.250035,0.752173}, + {-1.033130,1.467901}, + {-0.081366,0.567584}, + {-0.189016,0.757573}, + {-0.062907,0.109766}, + {0.519387,-0.073148}, + {0.852716,1.480028}, + {-0.332826,-0.335259}, + {0.699783,1.177709}, + {-1.501976,-0.869618}, + {0.011903,0.566373}, + {0.240645,0.815848}, + {0.022006,0.778674}, + {-0.311565,-0.232334}, + {0.412026,0.252313}, + {-0.541887,0.196055}, + {1.576042,1.850318}, + {0.801784,0.173800}, + {-0.910855,-0.685674}, + {2.049228,-0.222369}, + {-0.354029,1.030187}, + {0.323162,-0.505727}, + {-0.125605,-0.829970}, + {0.512979,0.187703}, + {-1.013040,-1.303101}, + {0.013997,0.121938}, + {0.058118,0.257561}, + {-0.258403,0.395440}, + {-0.670940,1.122375}, + {-1.432201,-0.379968}, + {-0.814277,-0.812373}, + {-0.559929,0.609962}, + {0.363925,0.849823}, + {0.621028,-0.837635}, + {-0.240268,-0.472030}, + {0.072362,1.038756}, + {0.227193,-0.732684}, + {-0.658857,0.208278}, + {-1.534011,0.239111}, + {-0.154706,-0.173726}, + {-1.368605,-1.607920}, + {0.111885,0.436946}, + {-0.125141,1.156338}, + {-0.468032,-1.283854}, + {-0.095271,-1.024174}, + {-0.298550,0.045489}, + {0.683411,0.029385}, + {0.549679,-0.031146}, + {0.498454,-0.530899}, + {-0.477430,0.323974}, + {0.791994,0.089182}, + {0.361261,0.618991}, + {0.562423,0.394355}, + {0.244952,0.570213}, + {0.006620,2.036926}, + {-1.886519,-0.587302}, + {0.648386,0.606893}, + {-1.081200,1.050888}, + {0.376747,-0.048129}, + {-0.587935,0.543545}, + {1.449966,-0.385258}, + {0.268650,1.464783}, + {-0.781591,-0.348916}, + {0.585803,-0.636496}, + {0.978237,1.172719}, + {0.668928,-0.068851}, + {-1.466985,0.045779}, + {-1.179510,1.101713}, + {0.904752,0.497169}, + {0.097355,-0.293205}, + {-0.172173,-0.181016}, + {-0.501643,-0.080642}, + {0.581053,-0.218558}, + {-0.895757,0.375873}, + {-0.483364,0.120657}, + {-0.423777,0.643739}, + {0.124416,-1.106641}, + {-1.457878,-0.321679}, + {0.659524,-0.761259}, + {0.364923,-0.166847}, + {-1.388401,-0.199159}, + {1.588209,-0.604498}, + {1.309079,-0.352915}, + {-0.347980,0.189430}, + {0.911844,-1.078087}, + {0.278893,-0.835737}, + {-0.982551,-0.254161}, + {-0.431526,0.412463}, + {-0.477069,0.486325}, + {0.573694,0.715416}, + {1.143420,2.072284}, + {-0.857854,-0.906373}, + {-0.297631,0.413436}, + {-0.467294,-0.331288}, + {0.982162,-0.975864}, + {0.285199,0.043006}, + {-0.812961,0.340233}, + {1.431540,1.133126}, + {0.102308,0.190565}, + {1.476116,0.637898}, + {0.434583,0.580426}, + {0.046831,-0.794218}, + {-0.341083,0.192367}, + {-0.279135,-0.299876}, + {0.296558,0.569512}, + {0.147472,0.329278}, + {-1.388735,1.020627}, + {0.602259,0.386248}, + {-0.528118,1.134901}, + {-0.181877,-0.564929}, + {-0.553234,0.469098}, + {-1.455098,-0.185264}, + {0.800772,0.396759}, + {-1.234805,0.736313}, + {0.761554,-0.175533}, + {-0.650272,-1.001478}, + {0.515606,-0.160728}, + {1.523529,0.422419}, + {0.327472,0.391494}, + {0.747341,0.126178}, + {0.796575,0.604781}, + {-0.579325,0.723723}, + {0.188695,-0.270173}, + {0.608637,-0.176246}, + {0.357106,-0.187142}, + {-0.476938,0.579994}, + {-0.159003,-0.546717}, + {0.805633,0.436189}, + {-0.000267,-0.078362}, + {0.388497,0.613782}, + {-0.616919,0.325909}, + {-0.139824,0.506477}, + {-0.357327,-0.352587}, + {0.465315,0.517060}, + {-0.402298,0.401676}, + {-1.052840,1.068351}, + {0.089254,-0.088566}, + {1.553712,-0.490081}, + {0.796169,0.313496}, + {0.221044,0.079029}, + {0.735658,0.515442}, + {0.088796,-0.414440}, + {0.177135,0.018821}, + {-0.136482,0.116556}, + {0.998341,1.750061}, + {1.539176,-0.444703}, + {-0.005825,-1.174685}, + {-0.546142,-1.060067}, + {-0.238276,-0.411240}, + {1.270839,1.815292}, + {0.238926,-0.014318}, + {-0.433391,1.175325}, + {0.365434,0.514461}, + {0.549538,-0.875982}, + {-0.052031,0.088336}, + {0.056105,0.755373}, + {-0.739169,1.345512}, + {0.022259,0.310272}, + {-0.143530,0.226380}, + {0.377260,-2.217078}, + {1.266910,0.770192}, + {-1.430207,-0.389470}, + {0.373033,0.954533}, + {-0.032998,0.458503}, + {0.033109,0.876798}, + {1.254053,-0.868324}, + {-0.750205,-1.243251}, + {0.178780,-0.059218}, + {-0.138437,-1.864862}, + {-0.057342,0.724688}, + {0.255896,1.443441}, + {0.554522,-0.149032}, + {0.535395,0.518631}, + {0.178084,-1.333335}, + {-1.146268,-0.525930}, + {-0.444915,-0.179534}, + {-1.827258,0.610506}, + {-0.970571,0.433014}, + {-0.851848,-1.408017}, + {-0.010547,0.425406}, + {-0.438689,-0.641632}, + {0.982537,0.523425}, + {0.194053,0.040519}, + {-2.164144,-0.712796}, + {-0.286878,-1.289071}, + {-1.189324,0.191043}, + {-0.178947,0.227410}, + {0.543007,-0.209633}, + {-0.504561,0.558697}, + {-0.476418,-0.360136}, + {-0.066349,0.311321}, + {0.205228,0.537992}, + {-0.431381,0.691561}, + {0.373215,-0.698683}, + {-0.021947,-0.774605}, + {0.587365,-1.799103}, + {0.808319,-0.623221}, + {1.089104,0.969406}, + {-0.309144,0.148429}, + {-0.370805,0.696824}, + {0.232746,0.498690}, + {0.207694,0.370303}, + {-0.921240,-1.399620}, + {-0.553996,0.380382}, + {-0.578575,0.448331}, + {0.429058,-0.213727}, + {-0.710646,-0.159683}, + {1.620601,0.839856}, + {-0.118776,0.365243}, + {1.473897,0.572852}, + {0.186774,0.121951}, + {0.610082,-0.416502}, + {-0.680911,0.926587}, + {-0.677998,0.322929}, + {0.386026,0.195354}, + {0.127726,0.580091}, + {0.103026,-0.655300}, + {-0.285589,0.668215}, + {-0.304495,0.862677}, + {0.676639,-0.908045}, + {-0.101844,-1.374433}, + {0.111932,-0.315504}, + {-0.786232,0.096354}, + {0.412804,1.171453}, + {0.242855,0.419671}, + {-1.122453,0.072119}, + {-0.954008,-1.360665}, + {0.490884,-0.394485}, + {1.407058,-0.197984}, + {0.516526,-0.041076}, + {-0.356944,0.119194}, + {0.114765,-0.432646}, + {-0.616070,-0.812770}, + {-1.283144,0.352879}, + {-0.675260,0.248547}, + {0.037469,0.111532}, + {1.808690,0.215876}, + {-0.262605,0.390434}, + {-0.528473,-0.590598}, + {0.067823,1.025179}, + {-0.134779,0.388853}, + {-0.856184,-0.137929}, + {-1.322880,-0.587829}, + {0.255339,0.957455}, + {0.691181,0.120283}, + {-0.138113,-0.681550}, + {-0.839258,-0.647184}, + {0.717937,-0.342172}, + {-0.002496,0.085833}, + {0.066570,0.376295}, + {-1.184694,-0.306608}, + {-0.765986,-0.240214}, + {-1.484250,-0.148429}, + {-0.381439,1.124766}, + {-0.350007,0.336370}, + {0.235697,-1.183933}, + {1.443619,0.581121}, + {0.491068,-0.099921}, + {0.093451,0.902716}, + {0.505893,1.686718}, + {-0.385501,-1.017724}, + {-0.541630,0.466243}, + {0.186522,-0.926013}, + {-0.447201,-0.317000}, + {-0.142966,-1.103298}, + {0.144505,-0.006342}, + {1.660683,-0.528652}, + {-0.863812,-0.656971}, + {0.373327,-0.447680}, + {0.064399,-0.006573}, + {0.273959,-0.067186}, + {0.158321,-0.040345}, + {-0.809976,1.524938}, + {0.265150,0.968352}, + {-0.561451,0.122076}, + {-0.238906,0.602495}, + {-0.682023,-1.518610}, + {0.226352,0.239321}, + {0.249679,-0.450287}, + {1.424126,-0.421314}, + {0.347601,-1.256083}, + {-0.161817,-0.558341}, + {-0.698010,1.392321}, + {0.854525,-0.180275}, + {-0.607136,-0.163008}, + {-0.201352,-0.463324}, + {0.177265,0.445976}, + {-1.139061,-0.711736}, + {0.071346,0.954147}, + {-0.007381,-0.234975}, + {0.122223,0.301816}, + {0.744879,-0.147205}, + {0.885961,0.569310}, + {-0.584466,0.194479}, + {-0.356190,-0.486432}, + {-0.604637,0.312954}, + {-0.571192,0.009307}, + {-1.645607,-1.013357}, + {0.767907,0.911892}, + {-0.292811,-0.436490}, + {0.754294,-0.258061}, + {-0.020915,-0.553060}, + {0.513940,0.367752}, + {-0.039909,-0.308901}, + {-0.426255,-0.427997}, + {0.031096,-0.350317}, + {0.183359,0.337084}, + {-1.442484,0.931023}, + {0.285229,0.747264}, + {1.284922,-0.542352}, + {-0.580213,-0.744180}, + {-1.258930,1.722668}, + {-0.259699,-0.002504}, + {0.488400,0.053418}, + {0.626716,-0.067078}, + {-0.262059,-0.661936}, + {-0.826681,1.076488}, + {-0.313348,0.452737}, + {0.751086,-0.240226}, + {-0.201071,-0.293798}, + {0.498236,0.533344}, + {0.445915,-0.498216}, + {-0.476964,-0.992134}, + {0.124767,0.528058}, + {-0.175549,0.108257}, + {-0.983469,1.220194}, + {-1.365000,0.620389}, + {0.126352,1.586583}, + {0.698377,-0.366504}, + {-0.972605,-0.070712}, + {-0.173680,0.387337}, + {-1.296066,-0.326749}, + {0.074632,1.409292}, + {0.273771,0.567147}, + {1.247218,0.334758}, + {0.109021,0.319268}, + {0.782710,0.115378}, + {0.481173,-0.827708}, + {-0.539717,-0.877906}, + {0.746934,1.005647}, + {-0.621987,0.129283}, + {0.413268,0.131652}, + {-1.265124,0.249034}, + {-0.352113,0.553744}, + {0.639651,-0.490536}, + {-0.207383,-0.516105}, + {0.300740,0.271305}, + {-0.778036,-0.864931}, + {0.237860,-0.011126}, + {0.147210,0.427180}, + {-0.038382,1.535662}, + {-1.191819,0.386445}, + {0.553605,0.469841}, + {0.060159,0.320722}, + {0.628356,0.798504}, + {0.141494,0.747546}, + {0.356586,-0.813978}, + {-0.526579,0.129332}, + {-0.142047,-0.183652}, + {0.142306,-1.230296}, + {0.163303,0.973984}, + {0.741797,-0.963034}, + {-0.953978,1.630063}, + {0.782292,0.927006}, + {0.269555,-0.483264}, + {-0.225813,-0.846876}, + {-0.147398,0.037824}, + {-1.151203,0.182452}, + {-0.051871,1.116905}, + {0.618385,0.772501}, + {-0.806309,-0.676225}, + {0.314484,0.962604}, + {-0.877810,0.165547}, + {-0.278775,0.828332}, + {-0.193032,0.607956}, + {0.481850,0.406728}, + {0.189260,0.564026}, + {0.101573,-0.153646}, + {0.141078,0.577827}, + {0.442071,-0.654711}, + {-0.497890,-0.069597}, + {-0.896127,0.092677}, + {1.379386,-1.739856}, + {0.049072,0.076701}, + {-0.000871,-0.137247}, + {-1.069033,1.216272}, + {1.305900,-1.105981}, + {-0.038746,0.948692}, + {0.097514,-0.182169}, + {0.504969,0.301159}, + {-0.070645,-0.338149}, + {-0.648749,1.116034}, + {0.019086,0.366446}, + {0.061191,-0.513735}, + {-0.412078,0.343295}, + {-1.006799,-0.785297}, + {0.728767,-0.194047}, + {-0.294156,0.632371}, + {-0.674312,-1.092083}, + {-0.662882,-0.689872}, + {-1.090220,-0.610777}, + {0.103421,0.205088}, + {0.654995,-0.196212}, + {0.811050,-1.173118}, + {0.047948,0.235323}, + {0.657132,0.634237}, + {0.807551,0.684801}, + {0.066354,-0.968132}, + {-0.109448,-0.718459}, + {-1.570057,0.383556}, + {1.177749,-0.333918}, + {-0.076754,-0.018363}, + {1.147423,0.535147}, + {-1.099482,-1.047722}, + {0.202256,0.611263}, + {0.355965,0.186135}, + {0.638869,0.248176}, + {0.423701,0.167180}, + {0.140065,-1.046322}, + {-0.128061,0.389472}, + {-0.073327,-0.620858}, + {0.551739,-0.001060}, + {-0.010351,-0.343739}, + {0.273292,0.077655}, + {0.018582,-0.649334}, + {0.858083,-0.239483}, + {0.434152,-0.516887}, + {-1.191059,0.970440}, + {-1.078976,-1.186674}, + {1.220491,0.830858}, + {0.392834,-0.620787}, + {0.570976,1.188011}, + {0.659424,-0.514683}, + {0.396493,0.413003}, + {1.064244,-1.299914}, + {-0.395576,-0.151052}, + {-1.016292,-0.124868}, + {0.339642,0.187616}, + {-0.732745,0.330348}, + {0.064742,0.443943}, + {0.986493,-0.439466}, + {0.469584,-0.447904}, + {0.721960,0.754263}, + {0.157520,-0.324514}, + {-0.114010,-0.285823}, + {-0.771222,-0.402135}, + {0.327920,0.786586}, + {-0.761432,-0.278662}, + {0.019400,-0.367941}, + {1.070777,0.601845}, + {0.456113,-0.819699}, + {0.879266,-1.927595}, + {0.205047,-0.103213}, + {0.499241,0.410470}, + {0.833646,-1.356775}, + {0.148523,0.231443}, + {0.561257,-0.947881}, + {0.003637,-0.389497}, + {0.433277,0.984572}, + {-0.048365,-0.418898}, + {-0.136111,-1.207308}, + {1.922850,1.447618}, + {0.384710,0.640459}, + {0.139125,0.130501}, + {0.571578,-0.186558}, + {0.682121,0.751595}, + {0.321521,-1.559149}, + {-0.371364,-0.545437}, + {0.621527,0.318470}, + {-0.035350,0.128997}, + {0.478967,0.282489}, + {-1.726296,0.075075}, + {-0.410562,-0.229728}, + {0.248913,0.103229}, + {-1.158596,0.232259}, + {0.162925,0.185782}, + {0.954972,-0.172445}, + {-1.023235,-0.827372}, + {0.386385,0.418922}, + {-1.535752,-0.171385}, + {-0.052104,0.779521}, + {0.578034,-0.561471}, + {0.132959,0.311450}, + {-0.343702,-0.401046}, + {0.245350,0.969726}, + {0.396674,0.108288}, + {-1.432259,0.419970}, + {0.341158,0.317464}, + {-0.330617,-0.606965}, + {-0.152268,-0.472867}, + {-0.060637,0.458003}, + {-0.571015,-0.285286}, + {-0.689380,-0.890630}, + {1.280908,0.748947}, + {-0.541963,0.307449}, + {1.509660,0.796404}, + {1.759599,-0.190714}, + {0.431596,-0.064444}, + {0.781975,-0.726109}, + {-0.225672,-0.453357}, + {-1.213446,0.029801}, + {-0.502440,0.933800}, + {0.526578,0.291420}, + {0.147412,0.134833}, + {0.512102,0.625511}, + {1.456875,1.380586}, + {-0.290328,-1.063807}, + {0.101380,-0.817843}, + {0.113163,0.126724}, + {1.215953,0.725106}, + {0.201676,0.845303}, + {0.239325,-0.398681}, + {0.164998,-0.338345}, + {-0.108562,-0.506582}, + {-0.489327,0.543874}, + {0.661906,-0.354970}, + {-0.265596,0.563607}, + {-0.884218,0.854292}, + {1.321217,-1.368510}, + {0.081827,-1.410110}, + {-0.219351,0.885236}, + {-0.982823,0.858992}, + {-1.274274,-1.011328}, + {-1.067975,0.067140}, + {0.436583,-0.052909}, + {-0.404171,-0.153187}, + {-0.582062,0.600456}, + {0.023155,0.627493}, + {-0.685279,-0.017384}, + {0.548277,-0.244152}, + {-0.115240,0.053806}, + {0.060231,0.740503}, + {-0.145329,0.863530}, + {-1.448378,0.298489}, + {0.240402,-0.369060}, + {1.430967,1.095404}, + {0.331176,0.532789}, + {0.065128,0.165151}, + {-0.301511,-0.764322}, + {1.104458,0.230971}, + {-0.659759,-0.691340}, + {-0.814781,-0.814180}, + {0.417795,1.175324}, + {0.289451,0.400148}, + {-0.418076,0.131680}, + {-1.362387,0.205250}, + {-0.014391,0.377274}, + {-1.409865,-1.379234}, + {0.541087,1.912687}, + {-0.029290,-0.841498}, + {0.466166,0.092614}, + {0.184014,-0.060701}, + {0.809956,1.648975}, + {-0.773957,0.556490}, + {-0.526512,-0.408391}, + {0.241741,0.658692}, + {-0.542720,1.687133}, + {-0.516997,-0.467089}, + {0.739354,0.421007}, + {-0.042296,-0.146626}, + {-0.269594,-0.550475}, + {-1.523314,-1.306939}, + {0.250566,0.617745}, + {0.504463,-0.722584}, + {-0.179117,-0.083309}, + {1.874666,0.664473}, + {0.786372,-0.183692}, + {-0.791371,-0.105155}, + {0.546627,-0.378284}, + {-0.682557,0.353458}, + {-1.551750,-1.178922}, + {0.004591,-0.364755}, + {0.595242,-0.129436}, + {-0.525592,-0.317380}, + {-0.090858,-0.976245}, + {-0.485468,0.291478}, + {0.149195,0.432197}, + {-0.614205,-0.776327}, + {-0.282117,0.839998}, + {-0.805384,-0.020502}, + {0.822789,-1.368598}, + {-0.626826,0.998920}, + {0.496481,-0.497299}, + {1.668775,0.382570}, + {0.548438,-1.033250}, + {1.007271,0.933075}, + {0.183149,-0.380990}, + {1.293787,-0.119620}, + {0.774773,0.143392}, + {-0.274284,-0.302211}, + {0.451132,-0.154428}, + {-0.025212,0.110100}, + {-1.359157,0.348165}, + {0.013577,0.207362}, + {1.101108,1.741819}, + {-1.147832,-0.970628}, + {-0.792563,-0.451914}, + {-0.065555,0.248664}, + {-1.252769,0.225012}, + {0.954973,-1.085338}, + {0.121842,-0.845815}, + {-1.622493,0.134620}, + {-0.785575,-1.165826}, + {-0.155585,-0.299899}, + {0.204921,1.247232}, + {0.190846,0.982351}, + {-0.086519,0.188154}, + {0.911527,-0.410064}, + {-0.589303,0.001458}, + {-0.461175,-0.753628}, + {-0.703909,-0.266743}, + {-0.552377,-0.836142}, + {-0.316481,-0.804232}, + {-1.208979,-0.807974}, + {-0.405595,-0.324402}, + {0.556275,0.511671}, + {0.755633,-0.192398}, + {0.361233,-0.288166}, + {-0.271475,-0.290048}, + {0.036496,1.048269}, + {-0.230503,0.604447}, + {1.000254,-0.234682}, + {0.120851,-0.393787}, + {-1.135812,-0.005555}, + {0.117785,0.102412}, + {0.269803,0.306705}, + {-1.000569,-0.211454}, + {-0.921295,-0.318864}, + {0.015830,-0.276718}, + {0.855560,0.052771}, + {-0.331353,0.532554}, + {-0.998449,-0.148572}, + {1.087764,1.700836}, + {-0.433519,1.028843}, + {0.238422,-0.076953}, + {-0.789252,-0.068322}, + {0.231041,0.257196}, + {-0.119942,0.994053}, + {-1.624463,0.592305}, + {0.489505,0.330256}, + {-0.791727,-0.240149}, + {0.023486,0.405492}, + {-0.712725,1.139520}, + {-0.397841,0.392477}, + {-0.172113,-0.103673}, + {-0.916898,-0.115494}, + {-0.740514,-0.159728}, + {0.030016,0.438515}, + {-0.189621,0.505697}, + {-0.312361,-0.485750}, + {0.395219,-0.191466}, + {-0.681995,0.910094}, + {-0.886425,0.038644}, + {-0.363377,0.254644}, + {1.213012,0.273619}, + {0.387538,-0.267483}, + {0.184534,-0.031493}, + {-0.082584,0.185597}, + {-0.168003,-1.103117}, + {-0.130390,0.133329}, + {-0.641604,-1.152805}, + {0.930567,0.868625}, + {-0.667303,0.040410}, + {0.885582,-0.805815}, + {1.203275,0.842920}, + {-1.398472,-0.587075}, + {-1.319309,-0.535182}, + {0.187520,0.267047}, + {1.366326,0.361960}, + {0.099778,-0.157978}, + {-0.133780,-0.185177}, + {0.536479,-0.703430}, + {-1.744925,0.483704}, + {-0.188968,-0.117653}, + {0.100862,-0.201597}, + {1.112205,0.886361}, + {1.065932,0.187435}, + {-0.515742,-1.160125}, + {-0.302570,0.686457}, + {0.650096,-0.027069}, + {-0.038160,1.315195}, + {0.325478,-0.873972}, + {-1.071418,0.172045}, + {0.086233,-0.410727}, + {0.062731,0.419938}, + {-0.067950,0.160374}, + {-0.871875,-0.789548}, + {-0.533510,0.417835}, + {0.549437,-0.061798}, + {0.230347,0.244062}, + {-0.664741,-0.647699}, + {0.866195,-0.509121}, + {-0.455236,-1.065637}, + {-0.098402,-0.964385}, + {0.972477,0.831164}, + {1.126182,1.212522}, + {-1.214912,-0.489044}, + {-0.145521,-0.082823}, + {0.172649,0.507886}, + {0.816966,0.723179}, + {0.286767,0.813230}, + {-0.292067,0.442358}, + {-0.242028,0.403211}, + {0.810219,-0.296835}, + {-0.965484,0.781090}, + {0.030609,1.430429}, + {-0.113167,-0.735173}, + {0.679344,0.038494}, + {-0.296711,1.173452}, + {0.205363,0.307279}, + {0.236531,-0.902335}, + {1.474420,1.009479}, + {-0.794636,-1.088974}, + {-0.600780,-0.630495}, + {-0.120746,0.153255}, + {-0.074198,-1.159780}, + {0.479216,-0.756744}, + {-0.061359,-0.464196}, + {0.266948,0.499785}, + {0.466252,-0.801677}, + {-0.739398,-1.104281}, + {-0.209888,0.342897}, + {0.317751,0.652312}, + {-0.108828,-0.502183}, + {0.311654,-0.272723}, + {-1.213448,0.887512}, + {-0.156897,0.247416}, + {0.684845,0.663784}, + {-0.834150,-1.557275}, + {-0.111679,-0.539638}, + {-0.629201,-0.244997}, + {0.345529,-0.729459}, + {-0.573635,0.569731}, + {0.202781,1.168916}, + {0.299240,0.698863}, + {-0.303744,0.092127}, + {-0.770121,-0.010426}, + {0.785242,-0.473798}, + {-0.258107,-1.614886}, + {-0.364306,0.445393}, + {-0.030830,-0.396489}, + {-0.861569,-0.618809}, + {-0.467142,-0.065045}, + {1.496496,0.390095}, + {-0.664346,-0.666512}, + {-1.078531,-0.683208}, + {-1.035570,0.332805}, + {0.334032,0.923234}, + {-0.352618,1.163516}, + {0.487088,0.813483}, + {-0.108438,0.111755}, + {-0.242763,-0.716151}, + {0.048218,-0.411570}, + {-0.682291,-0.100047}, + {-0.347302,-0.541596}, + {-0.055860,0.329776}, + {-0.486827,0.763519}, + {0.936834,0.378179}, + {0.560789,-0.581682}, + {0.062925,-1.147451}, + {0.370209,0.604113}, + {0.303006,0.781933}, + {-0.771395,1.640898}, + {0.367795,-0.936096}, + {-0.948469,-0.645591}, + {-1.338969,0.458720}, + {-0.119671,0.943494}, + {-0.504578,1.348833}, + {0.087662,0.180008}, + {-0.400353,-0.940478}, + {-1.020622,0.010305}, + {-0.572008,0.916672}, + {0.777239,-0.920403}, + {-0.246385,-1.900782}, + {0.368677,-0.397907}, + {-0.213803,1.423726}, + {-0.529380,0.287280}, + {0.674833,0.865517}, + {0.214032,0.083444}, + {-1.354788,0.121986}, + {-0.147398,-0.259880}, + {-0.236661,0.083370}, + {1.070576,-0.674437}, + {-1.696654,-0.863431}, + {-0.288571,-0.088433}, + {-1.178608,0.352638}, + {-0.686168,-0.664879}, + {-0.727181,0.139968}, + {0.704379,0.011108}, + {-0.097122,-0.414411}, + {0.833092,-0.416375}, + {1.679856,-0.186026}, + {-0.188038,-0.789648}, + {0.788024,1.319672}, + {-0.111910,-0.429271}, + {0.026979,-0.973063}, + {-0.822299,-0.468297}, + {-0.020743,-0.075185}, + {-0.196015,-0.653514}, + {-0.531606,0.126889}, + {0.683125,0.196602}, + {-0.642640,-1.115938}, + {0.216297,0.501497}, + {-0.798830,-0.596719}, + {0.118774,-0.356140}, + {-1.144614,-0.125928}, + {0.782631,0.924172}, + {-1.170188,-0.199186}, + {-1.219077,1.060124}, + {-0.426246,0.782024}, + {0.022011,1.753737}, + {-1.176024,1.096339}, + {0.892655,0.511964}, + {0.162166,0.613459}, + {0.089108,0.600362}, + {0.727923,0.549506}, + {0.043496,-0.772287}, + {0.545886,-1.494124}, + {-0.208190,-0.121938}, + {0.457878,-0.436767}, + {0.202868,1.137949}, + {0.442543,-0.970062}, + {-0.938356,0.524556}, + {-0.206104,-0.650013}, + {-0.241362,-0.130104}, + {0.825974,0.375147}, + {-1.030467,0.349799}, + {0.165765,0.053764}, + {0.539089,0.219063}, + {-0.920803,-0.360764}, + {-1.501808,0.467059}, + {0.010156,-0.026508}, + {0.296985,1.309064}, + {0.255845,0.369301}, + {0.282236,0.181767}, + {-0.599911,0.417191}, + {-0.124009,-0.052300}, + {1.762523,-0.638097}, + {1.559969,-0.392161}, + {0.788940,-1.012021}, + {-0.889773,0.829916}, + {-0.758505,0.629368}, + {0.149425,0.205740}, + {-1.489133,0.519999}, + {0.274081,-0.473210}, + {-0.400278,-0.605729}, + {-0.034848,-0.711428}, + {0.797203,0.653726}, + {0.684081,0.306657}, + {-0.898558,0.487512}, + {0.531034,-0.804407}, + {-0.189209,0.079728}, + {-0.236203,0.887653}, + {-1.055849,-0.030049}, + {0.157577,0.262297}, + {0.816064,0.614824}, + {-0.517684,-0.651690}, + {0.817597,0.142859}, + {0.632049,0.746048}, + {-0.004080,-0.044616}, + {-0.443800,-0.623657}, + {-1.950154,0.292959}, + {0.849712,0.756986}, + {-0.331359,0.267557}, + {0.110510,0.822703}, + {1.123170,-0.844141}, + {-0.779840,0.699576}, + {0.039398,0.256364}, + {0.701604,-1.071505}, + {0.068249,-0.334658}, + {-0.092711,-0.747982}, + {0.279999,0.476331}, + {-0.250376,-0.152404}, + {-0.633183,-0.303464}, + {-0.871779,-0.289203}, + {0.520590,0.441538}, + {0.411185,0.050415}, + {0.299688,0.061898}, + {0.006655,0.250882}, + {0.663987,-0.250278}, + {-0.435304,0.428809}, + {-0.954020,0.275075}, + {-0.534693,-0.019677}, + {-0.454147,-0.287202}, + {-0.410159,0.876545}, + {0.167473,0.702159}, + {-0.798929,-0.035521}, + {0.321676,0.347692}, + {0.817898,0.460273}, + {-0.129380,0.029044}, + {0.252003,-0.312483}, + {-0.794911,2.260189}, + {1.196671,-0.508444}, + {0.658018,0.454661}, + {-0.110961,1.988064}, + {1.027958,-0.139970}, + {0.371965,0.512944}, + {-0.889717,-0.561569}, + {-0.385539,1.492987}, + {0.182554,-0.293347}, + {-0.678913,-0.180265}, + {-0.619095,0.804020}, + {-0.246786,0.065080}, + {0.732415,0.287005}, + {-0.433814,0.359104}, + {-1.062615,0.398734}, + {-0.068996,-0.161415}, + {0.177600,-0.169124}, + {-1.098818,0.257113}, + {-0.199506,-0.234330}, + {-0.457931,-0.929827}, + {1.267319,-0.665283}, + {0.569162,0.128109}, + {-0.894920,-0.343725}, + {-1.047250,0.194854}, + {0.145325,1.000184}, + {-0.485785,0.176002}, + {0.416958,0.181212}, + {-0.538063,1.408044}, + {0.396945,0.376793}, + {-0.650388,0.600960}, + {-0.336692,0.041523}, + {0.762633,0.056195}, + {-0.101801,1.060078}, + {0.008753,0.341367}, + {1.213057,0.650804}, + {-0.242555,0.605359}, + {-0.096545,0.505888}, + {-0.218160,0.065450}, + {-0.392291,-0.153585}, + {-0.382276,-0.435595}, + {-0.566462,0.503745}, + {0.742303,0.092767}, + {-0.706119,-0.446348}, + {0.846034,-0.169926}, + {-0.800204,0.067673}, + {0.393443,-0.252153}, + {-1.189230,-0.417032}, + {-0.258718,-0.577801}, + {0.148415,-0.218861}, + {-0.242399,-0.722251}, + {-0.554846,0.266552}, + {-0.154566,0.345374}, + {-0.178620,-0.620674}, + {-1.452684,0.547125}, + {0.742394,-0.579851}, + {-0.535252,0.818573}, + {-0.373753,-0.844847}, + {-0.307951,-0.485154}, + {-1.055151,-0.234469}, + {-0.617500,0.155782}, + {-0.632949,-0.514511}, + {0.321217,-0.177787}, + {0.810575,0.867079}, + {-0.739780,0.080659}, + {-0.702951,-0.542686}, + {-0.849406,-0.434737}, + {-0.107667,1.546333}, + {-0.481642,0.249243}, + {-0.434692,0.925578}, + {-0.649042,0.190168}, + {0.543056,0.387398}, + {0.229006,1.749723}, + {-0.659196,1.496811}, + {-1.112472,-1.378348}, + {-0.347713,0.655806}, + {-0.333020,-0.442177}, + {-0.010896,0.243385}, + {0.396435,-0.937387}, + {-1.542977,-0.081353}, + {-0.988957,-1.301314}, + {-0.671717,0.385106}, + {-0.475757,-0.051430}, + {-0.152665,-0.430897}, + {0.226653,-1.286005}, + {-0.121291,-0.593614}, + {-0.416353,0.289417}, + {0.641212,-0.014396}, + {0.625740,0.289628}, + {0.109355,-0.864110}, + {-1.304982,0.864331}, + {0.540706,-0.034820}, + {1.160577,0.426277}, + {0.897177,0.120431}, + {0.166315,0.025191}, + {-1.194892,-0.817293}, + {-0.018821,-0.365376}, + {0.419874,-0.904719}, + {-0.376988,1.270798}, + {0.591134,-0.413071}, + {0.765301,0.183033}, + {0.425363,-2.200343}, + {0.282538,-0.115302}, + {0.471367,-0.189218}, + {0.072332,-1.738241}, + {0.705167,1.306461}, + {0.517418,-0.123308}, + {0.665696,0.768678}, + {0.799159,0.744041}, + {0.388496,0.054943}, + {-0.509369,-0.466480}, + {-0.932773,-0.129384}, + {-1.766512,0.342952}, + {-0.411573,-0.953764}, + {-0.376695,-0.388200}, + {0.253429,0.762383}, + {-0.238802,-0.837494}, + {-0.568870,0.170795}, + {0.970388,1.303336}, + {-0.483732,-0.759695}, + {-0.067874,-0.877486}, + {0.361803,-0.828496}, + {0.148481,-0.631609}, + {0.188760,0.682836}, + {0.233787,1.072984}, + {0.607324,0.052559}, + {-0.462668,-0.875849}, + {0.513511,-0.625931}, + {0.029210,-0.447513}, + {0.480831,0.480287}, + {-0.664907,-0.973077}, + {0.188319,-1.203828}, + {0.022725,-0.215416}, + {-0.426508,0.568704}, + {0.696166,-0.153401}, + {-0.888605,0.283359}, + {-1.887684,-0.631214}, + {-0.027258,-0.755818}, + {0.463172,0.099262}, + {0.176597,0.408871}, + {0.139626,0.475139}, + {-0.512137,-0.095797}, + {0.142498,0.791082}, + {1.714745,0.050486}, + {-0.151700,1.001408}, + {-0.187926,-1.189337}, + {-1.047952,0.351206}, + {-0.605363,0.923878}, + {-0.880344,-0.236752}, + {0.158545,0.536012}, + {-0.702132,-0.383830}, + {-0.232765,-0.434727}, + {-0.332018,0.111265}, + {-0.115645,1.224794}, + {1.130556,1.039947}, + {-0.684674,0.389432}, + {-0.495957,-0.819223}, + {-0.287520,0.044088}, + {-0.120997,-0.373808}, + {0.344498,-0.861474}, + {-0.287849,-0.627099}, + {-1.624836,1.107974}, + {-0.161896,0.734496}, + {0.922077,0.415761}, + {-0.092261,-0.792858}, + {0.740678,0.637053}, + {0.009040,-1.221702}, + {-0.151925,-1.520832}, + {-0.926963,1.228550}, + {1.592761,-0.740545}, + {0.975686,-0.204006}, + {-0.510445,-0.013318}, + {-0.116722,-1.460534}, + {0.050564,-0.696307}, + {0.238704,-0.306242}, + {-0.056267,-0.039088}, + {0.367015,0.155718}, + {0.828479,0.364074}, + {-0.066791,-0.263206}, + {-0.206769,-0.176020}, + {0.607347,-0.204373}, + {-0.328140,0.234530}, + {-0.149728,0.964312}, + {-0.673761,-0.476774}, + {-0.531880,1.004618}, + {-0.115795,-0.702836}, + {0.150798,-1.577178}, + {-0.261606,-0.115086}, + {-0.466822,-0.540959}, + {0.188110,-0.368671}, + {1.054299,0.152076}, + {0.955712,-0.861367}, + {-0.203463,1.366727}, + {0.633374,0.651992}, + {-1.391364,0.818343}, + {0.956846,1.464320}, + {-0.393481,0.977886}, + {0.069476,1.092029}, + {-0.819219,0.095735}, + {-0.358142,-0.433980}, + {0.880563,0.408356}, + {-0.110838,0.733042}, + {0.767039,0.273039}, + {0.484175,1.024151}, + {0.506067,-0.462739}, + {0.138992,0.524270}, + {0.438017,-0.334267}, + {-0.480006,-1.227354}, + {-0.549142,0.321805}, + {0.558154,0.085036}, + {-1.561828,1.403826}, + {0.792447,-1.514236}, + {0.340796,0.383640}, + {-1.368843,-0.478391}, + {0.058797,0.152301}, + {-1.186850,0.309630}, + {0.008511,0.569976}, + {0.499503,0.907362}, + {-0.582328,-1.193703}, + {0.457649,0.390902}, + {0.080038,0.404945}, + {0.509056,-1.101939}, + {-0.172094,0.524935}, + {-0.856769,-1.342524}, + {0.600361,0.564700}, + {0.669194,-0.792939}, + {1.645031,-1.295386}, + {-0.563368,-1.044735}, + {1.573442,0.369752}, + {-0.476873,1.693162}, + {0.009118,-0.394260}, + {-1.892748,0.376392}, + {0.527800,0.693088}, + {0.174069,1.074548}, + {0.421630,-0.272748}, + {-0.328084,0.643263}, + {-1.074268,-0.336496}, + {1.380511,-0.549909}, + {0.446078,-0.836703}, + {0.094413,0.555130}, + {2.359104,0.198856}, + {-0.171100,1.095922}, + {0.554416,-0.723893}, + {-1.692759,-0.111848}, + {-0.968574,-0.811231}, + {-1.243309,-0.641704}, + {0.374876,-0.441376}, + {-0.298878,0.934476}, + {0.959066,0.185512}, + {-0.372387,0.626353}, + {-0.200447,0.974171}, + {-0.656902,-0.411072}, + {0.606477,0.609449}, + {0.596347,-0.335998}, + {-0.680908,-0.373738}, + {-0.714886,-0.319760}, + {-1.232879,-0.543364}, + {0.597159,0.750747}, + {-0.092650,0.649143}, + {1.312315,0.577498}, + {0.949531,0.577766}, + {-0.536287,-0.256933}, + {0.026927,0.209819}, + {-0.506280,0.975751}, + {-0.100592,-0.496428}, + {0.703664,0.977937}, + {0.439077,0.642939}, + {-1.186330,-0.562701}, + {0.834602,-0.346392}, + {-1.140063,1.278697}, + {-0.176394,-0.177266}, + {-1.911734,-0.158996}, + {-0.938247,-1.139427}, + {0.430852,-0.519788}, + {0.552453,0.347402}, + {0.397558,-0.621711}, + {0.395750,-0.030026}, + {-0.318682,0.526152}, + {-0.086843,0.198691}, + {-0.463806,1.322882}, + {0.021087,0.405731}, + {-0.997044,-0.774766}, + {-0.693620,0.425756}, + {-0.093692,0.639838}, + {0.605591,0.305130}, + {-1.280314,0.984296}, + {-0.058598,-1.163590}, + {0.649775,-0.003839}, + {-0.268283,0.754608}, + {-1.297487,0.615832}, + {0.619815,-0.088227}, + {-0.447024,0.734463}, + {0.342713,0.254090}, + {-0.076577,1.067338}, + {-0.580665,-0.362452}, + {0.233286,-0.620338}, + {-0.934433,0.379823}, + {0.933342,0.231465}, + {-0.859952,0.114437}, + {-0.856929,0.585641}, + {-0.943033,-0.113384}, + {1.038475,0.201911}, + {-0.469030,-0.388884}, + {-0.118337,-0.297191}, + {-0.702286,-0.240531}, + {-0.513404,-0.591197}, + {0.324736,0.499129}, + {0.131897,-0.425180}, + {-0.464172,1.168790}, + {-0.606129,0.482431}, + {-0.947150,-0.266069}, + {0.443681,-1.910554}, + {-0.022401,-0.327754}, + {0.551598,0.923532}, + {0.223361,-0.385604}, + {0.185751,0.593156}, + {-0.184030,0.754766}, + {1.395817,0.028574}, + {0.475188,0.054661}, + {-0.277480,0.125616}, + {-0.496862,-1.147994}, + {-0.004339,-1.205962}, + {-0.143203,-0.265497}, + {0.125309,-0.043515}, + {0.366992,0.512033}, + {0.824571,0.106918}, + {-1.068985,0.132551}, + {1.832261,0.084296}, + {0.263801,-1.200894}, + {-1.508048,0.915831}, + {0.482696,-0.426293}, + {0.033090,-1.904729}, + {-2.108846,-0.435991}, + {-0.176570,0.183011}, + {-0.552305,0.353128}, + {-0.238016,0.185723}, + {-1.105006,-0.940637}, + {-0.819965,-0.929777}, + {0.157431,0.682561}, + {-0.217550,0.640647}, + {0.203090,-0.654541}, + {-0.077923,1.061114}, + {0.255508,-1.220831}, + {-0.166887,-0.641701}, + {-0.366592,0.125942}, + {-1.173483,0.813176}, + {0.808734,-0.982589}, + {-0.278042,1.861455}, + {-0.065514,0.269957}, + {0.906470,0.226526}, + {-0.120529,-0.080793}, + {0.417512,0.156899}, + {-0.907569,-0.097119}, + {0.263494,-0.109026}, + {0.189893,-0.050584}, + {-0.790905,0.939795}, + {-0.170601,-0.628612}, + {0.350909,-0.626418}, + {-0.386598,-0.927327}, + {-0.453768,0.023829}, + {0.914262,0.275209}, + {-0.562420,-0.398459}, + {-0.630268,1.978496}, + {0.221322,1.406665}, + {0.469280,0.011328}, + {1.173789,0.177916}, + {-0.299844,0.272473}, + {0.251780,-0.111125}, + {-0.773700,1.126264}, + {-0.141209,0.420552}, + {0.799946,-0.075850}, + {-1.245327,0.658100}, + {0.291694,0.510028}, + {-0.794185,-0.184348}, + {0.558676,-0.725595}, + {0.104020,0.146003}, + {0.687901,0.258342}, + {0.447092,1.306396}, + {0.252250,-0.596987}, + {-0.576601,0.104527}, + {-0.528980,0.897886}, + {0.319621,0.007942}, + {-0.271045,-1.032491}, + {0.106805,-1.171924}, + {-0.117934,-0.002040}, + {0.937400,0.094878}, + {0.767345,0.456467}, + {-0.248117,1.399906}, + {-0.019431,0.029962}, + {-0.553835,-0.199065}, + {0.973482,-0.555913}, + {-1.158272,0.011195}, + {0.289042,-0.022439}, + {-0.242274,0.051491}, + {-0.784552,0.046357}, + {0.089161,-0.070526}, + {-0.347404,-0.479778}, + {-0.387975,-0.227373}, + {0.209500,-1.064529}, + {1.636459,-0.994817}, + {0.962069,-0.828699}, + {0.599537,0.180033}, + {0.403511,-1.375267}, + {-0.030051,0.364420}, + {0.255406,-0.152639}, + {-0.842737,-0.083531}, + {0.265162,-0.110579}, + {0.023556,-1.674108}, + {0.998462,-0.391540}, + {-0.236300,-0.679450}, + {-0.135786,0.684768}, + {-0.166010,0.165157}, + {0.727715,-0.372501}, + {-0.189725,0.488845}, + {-0.295131,-0.024017}, + {0.260305,-0.897897}, + {0.282883,-0.374545}, + {-0.131905,0.759994}, + {0.642608,-0.501903}, + {0.235753,-0.019992}, + {0.234917,-0.917430}, + {-0.187950,-0.955321}, + {-1.679033,-0.077540}, + {0.057969,-0.182145}, + {0.806970,0.187450}, + {-1.255149,-1.161657}, + {0.071722,-1.622885}, + {0.743520,-0.598178}, + {-0.541128,0.760663}, + {-0.690128,-0.163725}, + {-0.713829,1.032708}, + {-0.184282,0.073560}, + {-1.631399,-1.104151}, + {-0.287196,-1.050644}, + {-0.861881,0.837003}, + {0.658268,-0.445585}, + {-0.492519,-0.822022}, + {-0.042083,0.453774}, + {-1.060994,0.621202}, + {0.552598,-0.448519}, + {0.547632,-0.643752}, + {-0.180073,-0.870508}, + {-0.301082,0.100829}, + {-0.185883,0.378342}, + {-1.021355,-0.041632}, + {0.835251,0.146685}, + {0.367444,1.012175}, + {-0.336391,0.016233}, + {-1.065102,0.040814}, + {-0.949472,0.846319}, + {1.291102,0.795366}, + {-0.487972,1.266731}, + {0.385963,-1.232202}, + {-0.274804,-0.575065}, + {0.142511,0.996808}, + {-1.127767,0.320745}, + {-1.464213,-0.001272}, + {-1.263870,-0.925822}, + {0.440001,1.508906}, + {-1.938712,-1.470684}, + {-0.186008,0.087603}, + {0.166957,-0.114873}, + {-0.546288,0.060052}, + {-0.451944,-0.677336}, + {0.110307,-0.073643}, + {-2.575184,-0.348193}, + {0.686896,-0.114358}, + {0.104536,-0.295687}, + {1.742926,0.023467}, + {-0.764176,0.383341}, + {0.143325,0.194010}, + {0.520979,0.503754}, + {1.008110,-0.184279}, + {0.707282,0.233438}, + {-1.342322,-0.476836}, + {-0.162102,-0.516986}, + {-1.555440,0.272954}, + {1.012432,-0.043494}, + {-0.081673,1.117860}, + {0.403470,0.057254}, + {-0.517038,-0.110340}, + {0.475128,0.752501}, + {-0.489141,-0.553330}, + {-0.636345,-0.926923}, + {0.379515,0.423726}, + {0.263556,-0.838201}, + {1.364556,-0.420440}, + {-0.269874,0.091490}, + {-1.434258,0.014961}, + {-0.590992,0.091827}, + {-0.308413,0.016741}, + {0.349648,-1.591085}, + {-0.118712,1.184347}, + {0.187251,1.433784}, + {0.562964,1.318689}, + {-0.861674,-0.392680}, + {0.002905,0.622487}, + {-0.151723,-1.179258}, + {-0.070747,0.053384}, + {0.525404,-0.554260}, + {-0.343545,-0.118922}, + {-0.507229,-0.864504}, + {0.500450,-0.403323}, + {0.377233,0.949879}, + {-0.833561,-0.056483}, + {-0.725906,-0.705636}, + {0.922402,-0.108117}, + {0.242458,-0.509338}, + {1.107595,0.489720}, + {-1.198374,-0.015819}, + {-0.413664,-0.441380}, + {0.218345,-1.315292}, + {0.497907,-0.042786}, + {1.204892,-0.699516}, + {-0.555751,0.313409}, + {0.379257,-0.609355}, + {0.950328,-0.278547}, + {-0.755355,0.813622}, + {0.513696,-0.533451}, + {-0.495311,0.409720}, + {0.112153,-1.160556}, + {0.353378,0.752034}, + {0.459675,-0.527592}, + {0.546631,0.123779}, + {0.828528,0.384762}, + {-0.369489,0.154474}, + {-0.505704,0.615962}, + {-0.473887,0.076201}, + {0.008357,-0.357277}, + {0.129246,-0.337053}, + {-0.257137,-0.189718}, + {-1.475479,0.652016}, + {0.204440,-0.454342}, + {1.032094,-0.103206}, + {-1.053839,0.656926}, + {0.190919,-0.204573}, + {-0.069636,-0.090363}, + {-1.022143,0.421546}, + {0.117690,-0.596925}, + {0.668920,-0.202848}, + {0.414527,0.111164}, + {0.569160,-0.332882}, + {-0.740114,-0.838751}, + {-0.811449,0.332958}, + {0.165041,-0.548386}, + {0.586089,1.162788}, + {-0.441744,0.705830}, + {0.345507,0.417786}, + {-0.150969,-0.217414}, + {0.980970,-0.395728}, + {0.202029,0.053837}, + {-0.567949,-0.756414}, + {0.838055,-0.962655}, + {0.185033,-0.842624}, + {0.505452,-0.230980}, + {0.500792,-1.312236}, + {0.098343,0.520689}, + {-0.927027,-0.045385}, + {0.569641,0.548063}, + {-0.798887,1.354409}, + {-1.055338,0.516666}, + {-1.035704,0.360430}, + {-0.184264,0.067661}, + {0.570477,0.590137}, + {0.551827,0.899930}, + {0.533855,1.304288}, + {0.350958,-0.358284}, + {-1.384382,-0.753483}, + {0.601123,-2.156966}, + {-0.554389,0.059956}, + {-0.871086,-0.106200}, + {0.558179,0.180493}, + {0.531430,-0.025180}, + {-0.795320,0.260424}, + {0.692222,-0.238340}, + {0.169459,0.823660}, + {0.299030,0.761034}, + {-0.698652,-0.351722}, + {0.368231,0.434130}, + {0.185790,-1.403230}, + {-0.799883,-0.119406}, + {0.736042,0.392089}, + {-0.666826,-0.832812}, + {-0.513339,0.050691}, + {-0.587525,0.355240}, + {-0.517997,0.850523}, + {-0.899883,0.695032}, + {-0.206738,0.938988}, + {-0.699376,-0.248451}, + {0.788660,-0.329191}, + {-0.803143,0.755641}, + {-0.347574,-0.096980}, + {0.655063,-0.198669}, + {0.324775,-0.654269}, + {0.921286,-0.437049}, + {0.744575,-0.148011}, + {-1.499490,0.208673}, + {1.813010,1.936063}, + {-0.330382,0.942141}, + {-0.175160,0.095578}, + {-0.688972,0.621992}, + {-0.710787,0.337475}, + {0.082558,-0.051458}, + {0.108929,-1.049616}, + {0.411274,0.385344}, + {0.016239,-0.562674}, + {0.921934,0.406952}, + {0.524669,-0.237757}, + {-0.660776,-0.152646}, + {-0.149333,0.000891}, + {-0.254695,-0.615310}, + {-0.756202,0.840237}, + {-0.309718,-0.633714}, + {-0.218646,-1.024427}, + {-0.085284,0.238786}, + {-0.127700,-0.176234}, + {0.641768,-0.561286}, + {-1.032711,-0.515069}, + {1.363094,-0.095828}, + {1.534582,0.380000}, + {0.805601,0.320919}, + {0.701193,-0.161937}, + {0.262605,-0.457002}, + {0.345692,-0.485455}, + {0.973676,1.050191}, + {0.563517,-0.896698}, + {-1.052935,-0.655316}, + {-0.231460,-0.146481}, + {-0.979474,0.060279}, + {-1.088586,-0.421800}, + {0.161069,1.003289}, + {0.090253,-0.088947}, + {-0.547361,-1.206487}, + {0.246441,1.106913}, + {-0.706636,-0.015038}, + {0.132891,1.002612}, + {-0.295681,0.231105}, + {-1.153732,-0.996986}, + {-0.501629,-0.644197}, + {0.295345,-0.691762}, + {-1.440078,-0.607401}, + {0.101169,0.934845}, + {0.071043,-0.644190}, + {0.614922,-0.503042}, + {1.037925,-0.411965}, + {-0.852186,0.229310}, + {0.299200,-0.324206}, + {-0.088801,-0.474293}, + {-2.187987,-0.562442}, + {0.874113,-0.747951}, + {0.575873,-0.728991}, + {-0.846189,0.157840}, + {-1.429388,0.899668}, + {0.146948,-0.004011}, + {1.408618,-0.212564}, + {-0.215899,-0.253146}, + {1.498321,-0.772136}, + {-0.877108,-0.120817}, + {1.817143,0.201466}, + {-0.209176,0.538539}, + {1.517331,-0.539165}, + {-0.251656,0.628209}, + {-0.629867,1.537735}, + {0.022098,1.206070}, + {-0.360631,-0.347506}, + {0.752599,0.256274}, + {0.417381,-0.329550}, + {-1.519437,-1.728036}, + {-0.414089,-0.630542}, + {-0.364826,0.403330}, + {0.581478,0.594084}, + {0.663563,0.961159}, + {0.825272,1.573900}, + {-0.367023,-0.988905}, + {-0.073497,0.708838}, + {1.148249,-0.415716}, + {-0.101004,0.106337}, + {-0.928442,-1.408122}, + {0.469680,-0.047484}, + {-0.960126,-0.904661}, + {-1.132264,-0.188708}, + {-0.016658,-0.199830}, + {-1.075654,-0.338366}, + {0.061431,1.126846}, + {-1.081800,-0.415970}, + {1.123256,-0.127503}, + {-1.145737,-0.191834}, + {-0.793043,-0.118410}, + {-1.196367,1.014650}, + {1.527032,-1.381034}, + {0.647338,-0.080257}, + {-0.804731,0.453449}, + {-0.516077,0.480638}, + {0.530282,-0.739929}, + {0.269033,-1.963435}, + {1.477697,0.784988}, + {0.311743,0.788590}, + {-0.325671,0.653941}, + {-0.233521,-0.206602}, + {-0.278201,0.128288}, + {1.135366,-1.284597}, + {-0.763170,-0.012900}, + {0.438701,0.811553}, + {-0.249020,-0.316173}, + {0.561871,-0.138876}, + {0.726334,1.041021}, + {0.098118,-0.710592}, + {-0.572228,0.067081}, + {0.734250,0.106212}, + {-0.105387,0.013023}, + {-0.089425,0.237119}, + {-0.955892,0.328177}, + {-0.219179,0.170715}, + {0.931844,-0.349402}, + {-0.006197,-1.310244}, + {1.151184,0.469394}, + {1.308615,1.117283}, + {-0.431605,0.200205}, + {0.191977,-0.367832}, + {0.236475,0.821365}, + {-0.941490,0.282290}, + {-0.006772,0.760460}, + {0.184771,-0.364421}, + {-0.329091,-1.396452}, + {-0.459936,0.172703}, + {-0.153217,1.302087}, + {0.098202,-0.527384}, + {-1.355245,0.009842}, + {-0.924139,0.157557}, + {-0.100397,-0.408893}, + {0.217141,-0.593144}, + {-0.156430,1.211818}, + {0.011004,-0.314417}, + {0.131301,-0.060106}, + {0.399402,-0.219055}, + {0.392387,-0.631019}, + {-0.341266,0.461355}, + {0.426031,-0.852869}, + {-0.101110,0.790776}, + {-0.436091,1.765631}, + {0.568398,0.767510}, + {-0.271711,-0.480995}, + {-0.249560,-0.882825}, + {-0.381369,1.034425}, + {-0.503866,0.598387}, + {0.876082,-1.385329}, + {0.063173,0.213468}, + {0.543796,-0.225159}, + {-0.032141,0.017681}, + {0.493171,0.162913}, + {0.686035,0.268915}, + {0.175293,1.136665}, + {0.157721,0.697172}, + {-1.127321,0.592262}, + {0.166970,-0.343138}, + {0.194866,0.189738}, + {-0.288449,1.476208}, + {-0.421817,1.014786}, + {0.126023,-0.775427}, + {0.394521,-0.989582}, + {-1.089528,-0.055308}, + {0.200147,0.011439}, + {1.903990,0.358153}, + {0.664392,-0.905588}, + {0.539781,0.841634}, + {0.582682,0.671146}, + {-0.024278,-0.572103}, + {0.185635,-0.697631}, + {0.106066,0.699490}, + {0.246818,0.300906}, + {1.189828,-0.227730}, + {-0.013825,-0.769516}, + {-0.684393,0.018085}, + {1.218080,-1.701471}, + {0.424389,-0.592234}, + {1.403248,-0.017446}, + {0.013415,-0.977801}, + {0.369274,0.430111}, + {0.381919,1.117175}, + {0.816133,-0.715540}, + {0.035215,-0.105043}, + {0.556964,-0.135119}, + {-0.673203,1.053060}, + {-0.516621,0.494257}, + {0.450111,-0.035975}, + {-0.421140,1.411773}, + {-0.535489,0.037563}, + {-0.574600,-1.377926}, + {0.032767,-0.640636}, + {-0.459555,-0.203066}, + {-0.434567,0.545250}, + {0.650357,0.652128}, + {-0.892425,1.283559}, + {0.692184,0.557113}, + {0.751736,-0.211262}, + {0.313737,-0.163152}, + {-0.247115,-0.034955}, + {0.491416,-1.537278}, + {0.930530,-1.108210}, + {-0.556112,-1.391934}, + {-0.961302,0.326983}, + {1.662905,-0.278552}, + {-0.313318,-1.433712}, + {-1.000577,0.559144}, + {0.216728,0.878720}, + {0.487019,-0.649528}, + {-0.623891,-0.371940}, + {-0.040803,0.208126}, + {0.315032,0.149693}, + {-0.198370,-1.011750}, + {-0.824018,1.104106}, + {-0.353701,0.822379}, + {-0.123394,-1.055204}, + {-0.737870,-0.757284}, + {-0.634799,-0.464904}, + {-1.763571,-0.369890}, + {0.047103,0.948021}, + {0.847644,0.119019}, + {0.504559,-0.136831}, + {0.049168,0.250676}, + {-0.407130,0.581465}, + {-0.424114,-0.237635}, + {-0.576690,-0.447438}, + {-0.534590,-0.285313}, + {-0.525026,0.509418}, + {0.991170,0.776430}, + {0.082037,-0.154868}, + {-0.738468,1.113500}, + {-1.376870,-0.237227}, + {0.182010,0.599488}, + {-0.012601,0.360641}, + {-0.874033,0.846574}, + {-0.453102,0.527465}, + {-0.140117,0.979272}, + {0.469908,-0.563083}, + {0.494906,0.205413}, + {-0.152124,1.445632}, + {-1.070697,-0.417032}, + {0.620584,1.098607}, + {0.647829,-0.212808}, + {0.329902,0.206018}, + {0.769611,0.068876}, + {0.595618,-1.179969}, + {0.134816,1.155849}, + {0.132816,-0.826840}, + {-0.204456,-0.005218}, + {0.565919,-0.406434}, + {1.076761,0.279015}, + {-0.824357,-0.318681}, + {0.536584,1.190336}, + {-0.837780,-0.783722}, + {-0.365623,-0.592565}, + {0.140732,-0.354577}, + {-0.318893,0.197879}, + {-0.650844,0.142190}, + {0.611141,-0.819490}, + {0.824394,-1.997252}, + {1.188414,-0.772520}, + {0.495803,0.456638}, + {-0.793332,1.358671}, + {-1.208357,0.747812}, + {0.639802,-0.096943}, + {0.128095,-0.588363}, + {0.114812,0.593784}, + {-0.189818,-0.088502}, + {-0.281234,0.074641}, + {-0.318011,0.468384}, + {-0.032031,0.092814}, + {0.280203,0.824080}, + {0.375190,0.631836}, + {0.434939,-0.102007}, + {-0.537006,-1.514559}, + {0.203213,-0.319343}, + {-0.141183,-1.038148}, + {-0.218501,-0.477195}, + {-0.338538,-0.751898}, + {-0.686068,0.283823}, + {0.062352,1.559887}, + {-0.241352,-1.511161}, + {0.720157,-0.832961}, + {0.558763,-0.548703}, + {0.263548,0.902844}, + {0.842079,-0.167704}, + {-0.542509,0.454977}, + {0.903157,0.620579}, + {0.964410,0.047286}, + {-0.955672,0.944376}, + {0.860074,1.300853}, + {0.512725,0.794600}, + {-0.450602,0.516415}, + {-0.447504,0.181518}, + {-0.437303,0.401800}, + {-0.578495,-0.043247}, + {0.617911,-0.345819}, + {-0.552715,-1.044463}, + {-0.867800,-0.875333}, + {0.481378,-0.046626}, + {0.191387,-0.016629}, + {-0.518826,-0.671362}, + {-0.076694,0.392508}, + {0.019799,-0.500523}, + {1.539289,0.191522}, + {0.268896,0.472991}, + {-0.122127,-0.508825}, + {0.314364,-0.019904}, + {-0.144547,0.440958}, + {0.265538,0.198174}, + {0.863341,-0.176679}, + {0.122943,-0.154642}, + {0.043506,0.107960}, + {0.099631,-0.078301}, + {-0.560396,0.316725}, + {1.286545,0.635450}, + {-0.358192,-0.438848}, + {1.039133,-0.132411}, + {1.186643,0.405783}, + {-1.001651,-0.156892}, + {-1.179719,-0.490621}, + {-0.721972,0.717535}, + {-1.029560,-0.455562}, + {-0.077975,0.563804}, + {-0.813295,0.621995}, + {0.618189,0.598485}, + {-1.199978,-0.777894}, + {-0.290504,0.990481}, + {-0.031754,0.345115}, + {-0.368322,1.005785}, + {0.599679,-0.895852}, + {-0.590234,-0.096684}, + {-0.496663,-0.691375}, + {0.088853,0.700215}, + {-0.183732,0.242244}, + {-0.643606,-0.335184}, + {0.121277,-0.906499}, + {0.241237,1.352691}, + {-0.254636,-0.459023}, + {-0.621434,-0.262442}, + {-1.261593,0.823850}, + {0.524973,0.145684}, + {0.664583,-0.298579}, + {0.609610,-0.078780}, + {0.203934,-0.123287}, + {-0.774268,-0.471319}, + {-0.207046,1.271445}, + {-0.236533,-0.485094}, + {-0.597981,1.115511}, + {-0.406298,0.760957}, + {0.694472,-0.379866}, + {-0.372914,0.292032}, + {0.784017,0.922657}, + {0.297901,0.163029}, + {-0.904827,-0.819312}, + {0.561786,0.562537}, + {-0.239547,0.126229}, + {-1.407316,-0.320167}, + {-0.134303,-1.366530}, + {-0.531725,-0.336818}, + {0.623285,0.322439}, + {-0.335097,0.897800}, + {0.695935,-0.312405}, + {0.095367,0.409572}, + {-0.765337,-0.211423}, + {-1.131867,-0.623383}, + {-0.267968,-0.286704}, + {-0.404970,-0.309191}, + {1.379609,0.251604}, + {0.331291,0.143124}, + {-0.913650,0.804486}, + {-1.218644,0.871913}, + {0.039236,0.744136}, + {1.449769,0.975760}, + {-0.210467,0.262295}, + {0.405987,0.424655}, + {0.999384,0.627690}, + {1.164600,0.133861}, + {-0.175488,1.427081}, + {-1.744108,0.555451}, + {0.302610,-0.688230}, + {-0.529522,-1.322584}, + {-0.223304,-0.289473}, + {0.668378,0.179522}, + {0.084177,0.492469}, + {0.266502,-0.068043}, + {0.764533,-0.106614}, + {-0.317832,0.270595}, + {-0.444143,-0.228776}, + {0.108340,-0.373711}, + {-0.027397,-0.010145}, + {-0.613227,0.902768}, + {-0.557055,0.429239}, + {0.373258,-0.228158}, + {-0.631503,-0.356203}, + {0.643938,-0.284783}, + {-0.784050,-0.572626}, + {-0.207974,-0.145033}, + {0.006310,0.173822}, + {-0.106005,0.111244}, + {2.363675,-0.471391}, + {0.972607,0.013920}, + {1.130367,-0.608325}, + {-0.479318,-0.017402}, + {-0.647306,0.746952}, + {1.365227,0.174166}, + {0.586382,-0.751731}, + {-0.467157,1.701264}, + {-0.531539,0.869207}, + {-0.610338,0.132307}, + {0.356638,0.108132}, + {-0.568649,-0.676443}, + {0.089214,-0.008608}, + {-0.984149,0.709467}, + {0.597348,0.413095}, + {0.139796,1.022797}, + {-1.032483,-0.315232}, + {0.021779,-1.284263}, + {0.891663,-0.443996}, + {-0.684480,-0.817773}, + {0.401035,0.351907}, + {0.217196,-0.252169}, + {-1.349881,-0.517501}, + {0.816430,-0.091990}, + {-0.502108,-0.698291}, + {-0.086025,0.915485}, + {-0.682122,-0.322046}, + {0.706000,0.763462}, + {0.796854,0.455243}, + {1.366467,1.196075}, + {0.417067,-0.256263}, + {0.015371,0.451181}, + {-0.400583,0.178607}, + {0.179912,-0.117066}, + {0.597156,-0.688654}, + {-0.661676,-0.820197}, + {0.085683,-0.217177}, + {-0.706450,-1.381830}, + {0.028548,1.200703}, + {-0.920667,0.289784}, + {0.160350,-0.351146}, + {-0.804724,-0.618602}, + {0.024888,0.647150}, + {-0.098113,0.173361}, + {0.697754,0.291105}, + {-1.408036,1.022388}, + {0.469920,0.445517}, + {0.384059,0.532228}, + {-0.151818,0.944132}, + {-0.090433,0.327546}, + {-0.879679,-1.070965}, + {-0.495967,0.063480}, + {-0.358409,-0.789978}, + {-0.699352,-0.883109}, + {-1.947079,0.913473}, + {-0.641222,-0.030654}, + {-1.419634,-0.263358}, + {-0.287427,1.075618}, + {1.041925,0.333373}, + {1.035917,-0.384391}, + {-0.742460,0.756039}, + {0.484778,0.439710}, + {-0.454690,-0.553386}, + {-0.860744,-0.035129}, + {-0.063566,0.489990}, + {0.107992,0.565035}, + {-0.016311,0.236242}, + {0.309996,0.522161}, + {0.839932,1.127528}, + {0.213453,-1.064570}, + {-0.716013,0.561550}, + {-0.277888,-0.545995}, + {-0.080229,-0.275056}, + {-1.231363,-0.438038}, + {-0.221378,1.152323}, + {0.465562,-0.015422}, + {-0.636983,-1.776097}, + {0.994972,1.153935}, + {-0.840363,-1.044283}, + {-0.147775,-0.659287}, + {-1.008426,1.195206}, + {0.221680,0.312210}, + {0.391826,0.267132}, + {-0.300629,0.352818}, + {1.088779,0.848130}, + {-0.087740,-1.562253}, + {-0.636828,0.356063}, + {0.255724,-0.928242}, + {0.197228,-1.313775}, + {-0.363243,-0.477933}, + {0.342319,1.332603}, + {-0.687342,-0.697300}, + {0.588366,-0.220649}, + {0.718963,1.534212}, + {0.378261,-0.815048}, + {0.008267,-0.048339}, + {-0.337132,-0.394747}, + {-0.429718,-1.955695}, + {0.422312,0.648188}, + {-0.225384,-1.038982}, + {-0.074649,-0.432788}, + {1.197830,0.224400}, + {0.179256,0.174055}, + {0.324657,-0.153234}, + {-0.008755,-0.720614}, + {1.171336,1.386902}, + {-0.502534,0.544987}, + {-0.874559,-0.045977}, + {0.641911,0.309244}, + {-0.852252,-0.189481}, + {0.905778,-0.240689}, + {0.805296,0.190095}, + {0.583950,0.500505}, + {0.927808,-0.289025}, + {-0.161069,-1.142641}, + {-0.829648,-1.067679}, + {0.160495,-0.177610}, + {-0.669901,0.538416}, + {-0.417880,-0.610111}, + {-0.641121,0.118270}, + {-0.307481,0.182497}, + {-0.098936,-0.300794}, + {0.079945,-1.126696}, + {0.767377,-0.205567}, + {-0.229164,-0.681283}, + {-0.938784,0.869544}, + {0.729480,-0.893640}, + {0.318684,0.291873}, + {-0.063858,-1.269459}, + {-0.394907,0.032640}, + {0.041145,-0.695384}, + {0.903121,-0.762764}, + {-0.236944,-1.403906}, + {0.010014,-0.107070}, + {-0.144645,0.624289}, + {0.889531,-0.018986}, + {0.956051,1.297021}, + {-0.096103,-0.738099}, + {-0.795984,-1.097452}, + {-0.394740,0.151985}, + {0.109809,-0.515633}, + {1.331729,-1.680084}, + {1.546974,0.279037}, + {-1.785160,-0.221012}, + {0.122575,-0.919889}, + {-0.788030,1.561325}, + {-0.205935,0.088416}, + {-0.265662,0.431570}, + {0.115537,0.899615}, + {0.471598,0.669058}, + {-0.214156,0.254611}, + {0.970194,1.044374}, + {-0.486194,0.026669}, + {0.232387,0.010928}, + {0.162715,0.243238}, + {-0.554603,0.305242}, + {0.050873,0.089235}, + {0.866591,0.431844}, + {-0.137254,0.419949}, + {-0.444023,-0.814751}, + {0.405856,0.278733}, + {-0.006847,-0.084791}, + {0.661887,0.366497}, + {0.036938,-1.474893}, + {0.074623,0.527883}, + {-0.932561,-1.217377}, + {-0.579955,-0.770222}, + {0.496777,-0.398753}, + {0.415390,0.029064}, + {-0.368869,0.318877}, + {-0.083926,0.115238}, + {-0.165148,0.315531}, + {-0.201764,-1.548454}, + {-0.837318,-1.399309}, + {0.078016,-0.732903}, + {-0.094333,-0.160290}, + {0.732228,-1.029345}, + {0.690766,0.425063}, + {-0.896572,-0.514863}, + {0.781318,-0.797095}, + {-0.121511,0.255802}, + {1.919578,-0.769384}, + {-0.060926,0.430455}, + {-0.409906,-0.249459}, + {-0.460218,-0.783980}, + {-0.191177,0.609070}, + {1.020451,-0.427484}, + {0.388170,-0.559406}, + {0.583320,0.030542}, + {-1.179019,0.739794}, + {1.513305,0.344903}, + {-1.082705,-0.638275}, + {-0.426897,0.254435}, + {-0.481466,0.047423}, + {0.330028,-0.364721}, + {0.571710,0.131679}, + {0.796521,-1.303731}, + {-0.192941,-0.043661}, + {-0.182032,1.445423}, + {-0.370906,0.132620}, + {1.865372,-0.256694}, + {0.122110,-0.042592}, + {-0.484049,0.625328}, + {0.498676,-0.447230}, + {-0.698297,-0.450146}, + {0.197802,0.388351}, + {-0.270285,0.053455}, + {0.113784,-0.200340}, + {0.144229,0.267333}, + {0.085266,1.105437}, + {-0.021050,1.100430}, + {1.668020,-1.591069}, + {1.074784,-0.878131}, + {-0.687458,-1.410101}, + {0.945055,0.057837}, + {-0.968993,-0.249526}, + {-0.095768,-0.004312}, + {0.539684,-0.120041}, + {-0.690336,-0.784441}, + {-0.070364,0.818636}, + {0.306879,-0.280708}, + {-0.072888,0.404632}, + {-1.158507,1.076282}, + {-1.311557,0.016792}, + {-1.276006,0.450810}, + {0.052812,-0.238705}, + {1.449476,-0.258773}, + {-0.935995,-0.005463}, + {-0.355631,0.492401}, + {-0.612492,0.524131}, + {0.838550,0.621703}, + {0.198766,-1.213802}, + {0.114797,-0.883231}, + {0.323205,-0.912574}, + {-0.492987,0.031387}, + {0.613420,-1.264507}, + {-0.452913,-0.543444}, + {0.252574,0.848988}, + {0.177081,1.145831}, + {-0.172781,-0.088674}, + {-0.380519,-0.210205}, + {-0.333186,-1.162848}, + {0.424112,-0.009379}, + {-0.876016,0.594356}, + {0.191680,-0.347826}, + {-0.001609,-0.647491}, + {-0.410415,-0.735499}, + {-0.001733,-0.310524}, + {-0.323841,0.482596}, + {-0.242955,0.027559}, + {0.502454,0.491188}, + {0.014760,0.136650}, + {0.969240,-0.064603}, + {-0.230129,-0.410373}, + {0.068982,0.158729}, + {-0.264938,1.121409}, + {-0.330733,-1.289736}, + {-0.310857,-0.416680}, + {-0.995101,0.426949}, + {0.044670,-0.644963}, + {-0.370186,-0.419359}, + {-0.198722,0.626537}, + {0.250446,-0.321014}, + {-0.199294,0.428196}, + {0.287559,0.661812}, + {-0.819334,-0.182923}, + {0.627230,0.073635}, + {-0.254799,0.086437}, + {0.629778,-0.238849}, + {-0.214531,-0.833867}, + {-0.370971,-1.340886}, + {-0.838782,0.085272}, + {0.699287,0.326143}, + {0.969557,0.265905}, + {0.224255,1.026885}, + {-0.705422,0.039940}, + {2.677294,0.824637}, + {-0.872479,0.726054}, + {-0.356049,-0.644072}, + {1.247068,-0.283382}, + {-0.052734,0.460700}, + {-0.219080,-0.773459}, + {-0.404964,1.015079}, + {-0.613011,-0.740705}, + {-0.224677,0.053237}, + {0.894221,0.740370}, + {1.156185,-0.712990}, + {0.292658,-0.216708}, + {-0.066752,1.055119}, + {1.357077,0.220257}, + {0.460298,0.433686}, + {-1.604282,0.281681}, + {0.013828,-0.330717}, + {0.170076,-0.933305}, + {1.041761,-0.252779}, + {-0.246114,-0.576060}, + {1.480525,0.007697}, + {0.441859,0.826016}, + {0.295619,-1.276915}, + {0.915688,0.319889}, + {0.022048,0.222383}, + {1.378602,-1.120309}, + {-0.027128,0.227251}, + {-0.029159,0.234012}, + {-1.232345,-1.709367}, + {0.443828,0.107305}, + {-0.853740,-1.028442}, + {0.423166,-0.208449}, + {0.437276,0.123764}, + {-0.405086,-0.566809}, + {-0.459850,-0.615080}, + {0.015966,-0.560154}, + {-0.524545,0.824488}, + {0.590298,1.680262}, + {-0.074765,1.037196}, + {1.410833,-0.872378}, + {0.595534,-0.084257}, + {0.283239,-0.652858}, + {-0.046879,-0.046124}, + {-0.369435,0.393944}, + {1.852725,0.076027}, + {-1.092554,-0.019375}, + {-1.380574,-1.233999}, + {0.377688,0.527289}, + {-0.179858,0.250972}, + {0.411598,0.469015}, + {0.284770,-0.983034}, + {0.950896,-0.086210}, + {0.315096,0.753994}, + {-0.153846,-0.582036}, + {-0.642368,-0.187750}, + {0.048072,0.639136}, + {-0.556765,-1.105212}, + {0.180486,-0.178092}, + {0.924552,-0.298329}, + {-0.232289,-1.459794}, + {-0.210924,-0.352326}, + {-0.743565,0.331766}, + {0.804067,-0.756999}, + {-1.120228,1.402332}, + {-0.563865,-0.766699}, + {-1.241026,-0.016935}, + {-1.083249,0.663982}, + {-0.696610,0.197940}, + {0.240815,-1.001368}, + {0.338313,-1.016316}, + {-0.333358,-0.619444}, + {0.114418,-0.274406}, + {-0.048887,0.026654}, + {0.319559,-0.940490}, + {-0.772192,-0.627506}, + {0.732077,0.628962}, + {-0.517531,-0.461387}, + {0.366764,-0.719179}, + {0.537746,0.869680}, + {0.349716,-0.212016}, + {-1.339703,0.494797}, + {-0.261270,0.480154}, + {-1.071839,-2.066688}, + {-0.370999,-0.038925}, + {-0.747227,0.085586}, + {-0.942602,-0.057338}, + {-0.072358,1.097723}, + {-0.205848,-1.136328}, + {0.597227,0.197329}, + {0.676518,0.381645}, + {-0.874854,-0.479414}, + {-1.999738,-0.565455}, + {-0.664048,-0.574682}, + {0.186569,0.411274}, + {-0.110267,-0.357864}, + {0.302705,-1.743357}, + {-0.319344,-0.476152}, + {-0.640334,-0.720226}, + {-0.910033,-0.422789}, + {-0.208408,0.548207}, + {-0.964300,0.002179}, + {0.824444,0.424217}, + {-1.032269,-0.762202}, + {0.105175,0.447058}, + {-0.012006,0.049305}, + {-0.937920,0.289750}, + {-1.253273,0.757789}, + {-0.762061,0.328438}, + {-0.241415,1.027135}, + {0.243270,0.013979}, + {-1.109143,-0.208914}, + {0.090512,-0.386316}, + {1.503883,0.622403}, + {0.175205,1.011719}, + {0.386237,-0.727356}, + {1.030490,-0.207293}, + {-0.934681,-0.637268}, + {0.390874,0.381332}, + {0.183902,1.098244}, + {-0.785477,1.103963}, + {0.665390,0.256809}, + {0.263688,-0.503673}, + {-0.166081,-0.926605}, + {-0.557337,0.532023}, + {-0.195427,1.271505}, + {-0.474249,0.447195}, + {0.443875,1.233854}, + {-0.269777,-0.979940}, + {-0.022060,0.544843}, + {0.313713,-0.853284}, + {-0.096390,2.008847}, + {0.439922,-0.335096}, + {0.896690,-0.588963}, + {-0.844743,0.183750}, + {0.781349,-0.755606}, + {-0.765362,0.170504}, + {-1.628206,-0.216829}, + {0.500102,-0.059625}, + {-0.304791,0.107158}, + {0.557697,-0.477804}, + {0.583642,0.627863}, + {-0.121640,-0.409209}, + {-1.120829,-1.076884}, + {-0.536931,0.178972}, + {-0.417448,-0.458302}, + {0.718477,-1.059868}, + {0.610038,-0.423881}, + {0.999029,-0.368049}, + {-0.197010,0.618818}, + {-0.092802,0.280660}, + {-0.884475,0.746423}, + {-0.218251,0.164965}, + {-0.421409,0.312894}, + {-0.658414,0.399046}, + {0.745212,-0.200538}, + {0.941667,-0.785267}, + {0.521849,0.859422}, + {-0.473471,0.762251}, + {0.397426,-0.176657}, + {-0.323150,0.760653}, + {-0.998414,1.716395}, + {0.740360,-0.938944}, + {0.023348,1.116443}, + {1.069598,-0.382364}, + {-1.043662,0.236812}, + {-0.382172,-0.980040}, + {-0.349019,0.364638}, + {-0.298100,-1.107602}, + {0.456000,0.116486}, + {0.877536,0.868085}, + {0.048209,-1.069550}, + {0.661781,-1.278720}, + {0.359336,0.813250}, + {-0.123966,-0.468063}, + {0.430191,0.023114}, + {-0.135566,-0.319366}, + {0.968871,-0.115512}, + {-0.394328,-0.170491}, + {-0.009694,-1.061476}, + {0.046248,-0.139918}, + {0.368727,0.177700}, + {0.414373,-0.767674}, + {0.759806,0.895111}, + {-1.039452,-0.596694}, + {0.098206,0.950569}, + {-1.174535,-0.768597}, + {0.623601,-0.766489}, + {1.209239,-0.052878}, + {-0.452015,-0.009341}, + {0.690382,0.542857}, + {-0.108723,0.123140}, + {-0.529691,0.324165}, + {1.478203,-0.911289}, + {1.068649,-0.374113}, + {0.299869,0.396780}, + {0.430316,0.155351}, + {0.013919,-0.121839}, + {0.039700,0.017585}, + {-0.571082,-0.704321}, + {-0.736133,1.469112}, + {0.703268,-0.091642}, + {0.386893,0.603817}, + {0.172514,-0.849675}, + {0.607745,0.054904}, + {0.271231,-0.590061}, + {0.913552,-0.116009}, + {-1.138750,0.486391}, + {-0.076353,-0.638643}, + {-0.498974,0.588957}, + {-0.246757,-1.191164}, + {-0.997522,0.317823}, + {-0.041872,0.542933}, + {1.096147,0.311412}, + {-0.397941,-0.073418}, + {-0.674415,-0.476303}, + {0.129485,-0.144863}, + {-0.320564,-0.468116}, + {-0.409642,-0.561575}, + {0.221420,-0.215094}, + {-0.958367,0.609774}, + {-0.465613,0.040251}, + {0.382094,-1.384503}, + {0.918899,0.048990}, + {-0.078886,0.735926}, + {-0.090336,-0.471819}, + {-0.263712,-0.599983}, + {0.620502,-0.130819}, + {-0.335282,0.318506}, + {0.052591,0.963759}, + {-0.671888,0.668188}, + {-0.372171,-0.042465}, + {0.471828,-0.469881}, + {-0.393130,-1.355191}, + {0.245535,-0.797273}, + {-0.293227,-0.997773}, + {-0.191794,-0.927120}, + {0.484915,-1.363790}, + {0.318464,0.435871}, + {-0.854547,-0.351262}, + {-0.218097,-0.360717}, + {0.263629,-0.076017}, + {-0.414797,0.096633}, + {0.897394,-0.109831}, + {0.962227,-0.804732}, + {0.151329,1.627499}, + {0.990435,0.235665}, + {0.290903,0.311037}, + {0.160010,-0.053403}, + {-0.069998,0.302710}, + {0.084036,0.853274}, + {0.560929,-0.560850}, + {-0.106112,0.314448}, + {-0.421578,-0.268470}, + {-0.785387,-0.750187}, + {-1.189174,-0.084856}, + {0.466530,0.976102}, + {0.880929,-0.457008}, + {-0.729195,-0.675082}, + {0.104374,-0.633442}, + {0.757444,-0.949991}, + {0.008917,0.692426}, + {-0.338838,0.532756}, + {0.794670,0.717730}, + {-0.709404,1.043684}, + {0.579162,0.487640}, + {-0.404886,0.060629}, + {1.349450,-0.355399}, + {0.770612,-1.464736}, + {0.347219,0.274775}, + {0.354646,-0.020434}, + {0.465359,-0.985538}, + {0.385781,1.068191}, + {-0.106262,1.103081}, + {-0.599815,-0.997276}, + {-0.492767,-0.081408}, + {-0.245567,0.057807}, + {0.120883,0.308476}, + {-1.143013,-0.054048}, + {0.398061,0.717026}, + {-0.600222,0.456605}, + {-0.984594,-0.328664}, + {0.330060,0.028399}, + {0.273902,-1.559059}, + {0.491818,0.871726}, + {-0.827789,-0.540048}, + {0.065844,0.068222}, + {-0.808401,1.160869}, + {-1.274150,-0.355051}, + {0.561683,0.271525}, + {-0.413291,-0.224445}, + {-0.344482,-0.270754}, + {-0.669051,0.246237}, + {-0.049024,-0.250489}, + {0.977734,-0.366526}, + {-0.742840,0.329251}, + {-0.793661,-0.540377}, + {-0.164454,-0.041182}, + {0.796305,-0.095571}, + {-0.168732,0.018351}, + {-0.010513,1.211849}, + {-0.994831,-0.709750}, + {-1.282949,0.285938}, + {0.864976,0.026893}, + {-0.160674,-0.991054}, + {0.235256,0.436919}, + {1.212801,-0.909780}, + {0.529844,0.976362}, + {0.946160,-0.680521}, + {0.094877,0.672648}, + {-0.675454,-0.322118}, + {0.305372,-0.550007}, + {0.912401,1.035879}, + {1.131467,-0.138706}, + {-0.253731,-0.964860}, + {0.051329,-1.529624}, + {-0.113924,0.173806}, + {0.884102,0.159153}, + {-0.227632,0.877234}, + {1.010051,-1.543880}, + {0.809937,-0.173659}, + {0.332144,-0.243052}, + {-0.906095,0.676593}, + {0.073033,-1.548259}, + {0.458666,0.050823}, + {-0.289121,1.068049}, + {-0.383643,0.011142}, + {0.134420,0.076707}, + {0.466514,-0.043312}, + {0.438283,-1.522376}, + {0.163508,-0.193750}, + {0.487026,0.542501}, + {-0.200524,0.459230}, + {0.262819,1.505884}, + {0.653087,-0.201042}, + {0.233565,-0.547870}, + {-1.017089,0.878535}, + {0.228269,-0.679254}, + {1.248531,-0.791408}, + {0.439579,1.697946}, + {0.592039,-0.339903}, + {-0.109908,0.453321}, + {-1.115247,0.010700}, + {-0.164818,1.131623}, + {2.025510,-0.505251}, + {-0.309346,-1.373256}, + {0.537120,-0.360283}, + {-0.104894,0.296882}, + {0.024801,0.978248}, + {-0.937777,-1.070944}, + {-0.198826,-0.783295}, + {-1.127480,-0.610347}, + {0.298001,0.024948}, + {0.145368,0.794536}, + {0.612907,-0.059654}, + {0.782929,-0.048403}, + {-0.435378,-1.436197}, + {0.169811,0.516786}, + {-0.116510,0.319035}, + {0.538300,0.841565}, + {-0.155311,0.492565}, + {0.620200,0.730660}, + {-0.015916,0.419497}, + {0.164181,-1.630272}, + {0.824648,0.320043}, + {-1.560239,0.572704}, + {-0.252823,0.296962}, + {-0.746081,0.958339}, + {0.082239,-1.217646}, + {-0.567736,0.000241}, + {0.427482,0.476159}, + {-0.459043,1.161889}, + {0.254120,-0.488463}, + {-0.023313,-0.723543}, + {-0.293002,-0.169112}, + {0.089490,-0.261529}, + {0.247961,0.791363}, + {-1.110516,-0.166830}, + {0.983670,-1.198302}, + {0.519375,-0.785171}, + {-0.619925,0.150262}, + {0.569926,0.149914}, + {0.719057,-0.514677}, + {0.458531,-0.475477}, + {0.571393,1.036797}, + {-0.827266,-1.069063}, + {-0.208821,0.601468}, + {0.601543,-0.246378}, + {-0.545977,-0.481944}, + {-0.142618,-0.493885}, + {0.104624,-0.885512}, + {-0.806208,-1.172703}, + {-0.327891,-0.764616}, + {-0.111412,0.778570}, + {-0.025417,-0.823612}, + {-0.064253,0.146300}, + {0.897841,0.233453}, + {0.170462,-0.208221}, + {0.469815,0.534622}, + {0.464492,0.082733}, + {0.852167,-0.277563}, + {0.042076,-0.252323}, + {-0.639666,-0.218750}, + {0.344882,-0.710013}, + {-0.897684,0.020080}, + {0.969355,-0.131562}, + {-1.412936,0.152039}, + {0.762647,-1.063394}, + {-0.706248,-0.458628}, + {-0.193334,0.251486}, + {-0.278574,-0.609158}, + {-0.000444,0.167283}, + {-0.191255,-0.598270}, + {0.113407,0.082497}, + {1.361065,0.155568}, + {-0.171486,0.161889}, + {1.639261,-0.316890}, + {-0.129987,-0.110577}, + {-0.802764,1.330457}, + {-0.147106,0.095728}, + {0.820872,1.110744}, + {-0.391447,0.136340}, + {0.927357,0.908692}, + {1.225880,-0.741652}, + {0.166896,-2.018048}, + {-0.072197,-0.734190}, + {-0.188537,0.562295}, + {-0.419001,0.597966}, + {1.012061,-0.032231}, + {-1.265661,-0.098692}, + {-0.363672,0.493087}, + {-1.277901,0.568014}, + {0.094125,0.641038}, + {0.366210,-0.871913}, + {-0.406243,1.248265}, + {-0.265139,0.291993}, + {-0.711300,-0.517739}, + {0.551969,0.211300}, + {0.863097,0.620748}, + {-0.791252,0.292823}, + {-0.859584,-0.514999}, + {-0.222594,0.242104}, + {-0.529240,1.091900}, + {0.056589,-0.206772}, + {-0.206678,0.117667}, + {-0.372107,0.346623}, + {0.197375,0.175770}, + {0.109383,-0.285298}, + {-0.128606,-0.575351}, + {-1.350885,-0.629351}, + {-0.549311,-0.890107}, + {-0.052058,-0.399744}, + {0.117226,-0.822548}, + {-0.522921,-0.747784}, + {0.696853,0.225147}, + {1.404505,0.031853}, + {-0.199716,0.923465}, + {-0.366027,-0.965298}, + {0.254400,0.565191}, + {0.720813,-0.011776}, + {0.048742,0.485636}, + {0.463885,-0.445094}, + {-0.354658,-0.258331}, + {-0.512308,0.875492}, + {0.109512,-0.704183}, + {-0.359123,-0.222049}, + {2.094077,-0.596104}, + {0.099119,0.151596}, + {1.272189,-0.870022}, + {-1.203661,0.080126}, + {-0.402370,-0.038618}, + {-1.465566,0.187786}, + {-0.188615,-0.551253}, + {-0.144342,-0.651031}, + {0.466536,-0.902577}, + {0.442013,-0.756855}, + {0.651331,0.059349}, + {-0.580323,-0.556246}, + {1.443369,0.532876}, + {-0.410520,0.142482}, + {-0.638481,-1.620247}, + {1.107948,0.449859}, + {-0.053538,0.595051}, + {-0.660756,0.271631}, + {-0.110972,0.102598}, + {-0.853215,0.693121}, + {-0.815886,0.697183}, + {0.444707,0.103685}, + {-0.147454,1.248558}, + {-0.304216,0.147728}, + {-0.380406,0.389584}, + {0.869539,-0.442373}, + {0.367415,0.370479}, + {-0.860426,0.294945}, + {-0.310280,-0.101136}, + {-0.724660,-0.542268}, + {0.084686,-0.384017}, + {0.620385,-0.343553}, + {0.193432,-0.835223}, + {0.342748,0.073244}, + {-0.208107,0.866350}, + {-0.433622,-0.098584}, + {-1.050180,0.800354}, + {1.140817,-0.095778}, + {0.074059,0.720540}, + {0.324579,-0.250899}, + {0.908664,-0.424491}, + {-0.349658,0.492219}, + {-0.416368,-0.443491}, + {-0.093378,0.249512}, + {-1.388730,0.610637}, + {0.516564,-1.098854}, + {-0.860684,0.484278}, + {-0.183881,-0.463325}, + {-0.461003,-0.667445}, + {0.768848,0.198854}, + {0.229416,-1.256209}, + {0.480655,-0.403404}, + {0.479239,-0.007571}, + {-1.318306,0.738942}, + {1.469443,-0.959983}, + {0.253482,0.333056}, + {0.017190,1.742204}, + {-0.519932,0.898752}, + {-0.452267,-0.316200}, + {0.022717,1.692417}, + {0.796237,-0.765617}, + {-0.812041,-0.198540}, + {0.884469,-0.078862}, + {0.030191,-0.787176}, + {1.126078,-0.516637}, + {-1.102333,0.446474}, + {0.446080,-0.315343}, + {-0.062631,-0.265291}, + {-0.853606,-0.044797}, + {1.077386,-0.224226}, + {-0.147136,-0.399345}, + {0.166629,-0.401479}, + {0.257271,0.174285}, + {-0.244527,-0.825127}, + {-0.798872,0.420259}, + {0.491059,0.151109}, + {-1.041543,-1.289491}, + {-0.331789,-1.527598}, + {-0.083175,0.394579}, + {-0.323992,0.766890}, + {0.902158,0.010174}, + {1.662799,-0.272640}, + {-0.497409,-0.677542}, + {-0.849235,0.346076}, + {0.747101,0.412698}, + {1.611062,0.866991}, + {0.163223,-0.262013}, + {0.741905,0.535948}, + {-0.239992,0.315095}, + {1.073907,0.578535}, + {-0.344179,0.817836}, + {-0.620181,-0.707425}, + {0.834661,0.312322}, + {-1.019361,-0.609310}, + {1.785614,-0.162301}, + {0.529534,0.672965}, + {0.486672,0.153629}, + {-0.288024,-0.719498}, + {0.413983,0.270909}, + {1.374466,0.087559}, + {0.163283,0.494934}, + {-0.234819,0.954579}, + {0.012206,-0.678054}, + {1.572847,-1.076632}, + {-0.599282,-0.633372}, + {1.095665,-0.655620}, + {-0.684687,-0.201969}, + {-0.549440,0.045874}, + {0.322676,0.581203}, + {0.148109,0.304196}, + {-0.253076,0.734066}, + {-0.251967,0.042417}, + {0.045715,-0.031266}, + {1.116937,1.123835}, + {0.483493,0.290907}, + {0.068072,0.333893}, + {-0.429817,-0.931647}, + {-0.480528,-0.164660}, + {-0.775073,0.535179}, + {-0.275572,-0.740592}, + {0.448695,-0.532992}, + {0.393924,-0.730806}, + {-0.932048,-1.011165}, + {-0.001888,0.395913}, + {-0.030311,0.267041}, + {0.251709,-0.163471}, + {0.758127,1.170676}, + {-0.971904,0.719459}, + {-0.677315,1.283372}, + {0.015133,0.474236}, + {0.250784,0.239230}, + {-0.284132,0.714203}, + {0.344950,0.419915}, + {1.583594,-0.064074}, + {0.576677,0.349100}, + {0.125629,0.022908}, + {0.377394,-0.234506}, + {-0.563284,-0.715614}, + {0.101048,-0.920563}, + {0.608430,0.161613}, + {-0.928742,-0.992338}, + {-0.294843,-0.399957}, + {-0.365761,0.504701}, + {0.306154,0.060709}, + {0.715237,0.113832}, + {-0.231447,-0.747493}, + {-0.137875,0.022192}, + {0.270512,-0.373718}, + {-0.284239,-0.283799}, + {0.279434,0.240517}, + {0.968853,-1.661595}, + {0.795511,0.040827}, + {0.756925,-0.008006}, + {0.410158,0.188364}, + {0.212647,0.160361}, + {-0.274239,0.135422}, + {-0.748007,0.121514}, + {1.889864,-0.426021}, + {-1.118363,0.603299}, + {-1.079087,0.214901}, + {0.881102,0.533797}, + {0.977096,0.271883}, + {-0.593182,-0.608447}, + {-0.831317,-0.259562}, + {-1.046078,-0.378692}, + {-0.521179,1.064548}, + {0.310178,-0.242294}, + {-0.276422,-0.319965}, + {-0.581592,-1.175487}, + {0.078785,0.414402}, + {0.384824,-0.029560}, + {0.350595,-0.015079}, + {-0.505694,0.346891}, + {-0.244162,-0.431912}, + {0.179140,0.408671}, + {-1.683719,-0.175195}, + {-0.439600,-0.848327}, + {0.214818,-0.535441}, + {0.799181,1.313585}, + {-0.476475,1.275140}, + {-0.281987,-0.003127}, + {-0.659120,0.672635}, + {-0.061892,-0.705050}, + {-1.224782,0.446358}, + {0.016139,0.676888}, + {0.102488,0.468285}, + {0.270256,1.292447}, + {-0.872090,0.046884}, + {0.843556,-0.407998}, + {1.131680,-0.756558}, + {0.414796,-1.380356}, + {-0.696230,-1.001295}, + {-0.356978,0.947810}, + {0.203772,-1.057518}, + {-0.328018,0.786771}, + {0.943286,1.338451}, + {-1.157899,-0.594093}, + {0.126929,1.437347}, + {1.125664,-0.410598}, + {1.476748,-0.336433}, + {0.391183,0.754958}, + {-0.538390,1.039711}, + {0.539183,0.253245}, + {-0.738926,-1.328143}, + {0.843172,-0.517204}, + {-1.094296,0.432451}, + {-0.207836,0.579061}, + {-0.780287,-0.213072}, + {0.251006,-0.069137}, + {0.847453,0.521498}, + {-0.110487,-0.550587}, + {1.366744,0.051771}, + {0.111898,-0.116679}, + {0.457595,0.211260}, + {-0.224542,-0.247515}, + {-0.075318,-0.913189}, + {0.413131,0.636904}, + {0.442816,-0.725927}, + {-0.269415,-1.101203}, + {1.238631,-0.048564}, + {-0.867622,-0.029135}, + {-1.272665,-0.426738}, + {-0.358993,1.214374}, + {0.223994,0.430413}, + {-0.069366,-0.065533}, + {-1.151986,-0.046081}, + {-0.034817,-0.587513}, + {0.820362,-0.805810}, + {-0.002677,-0.479108}, + {-0.501825,-0.402321}, + {0.479133,0.520280}, + {-0.023935,0.157521}, + {-0.805270,-0.213889}, + {-0.652714,-1.133157}, + {0.141114,0.750052}, + {-0.870557,0.131878}, + {-0.537313,0.243984}, + {0.270492,1.388730}, + {0.351691,-1.026747}, + {0.265859,-0.073035}, + {0.876907,0.008793}, + {-0.015669,0.222651}, + {-0.458046,-0.172892}, + {0.480864,-0.236468}, + {-0.304051,0.883748}, + {1.386217,0.196728}, + {-0.448091,0.725679}, + {0.279281,1.432388}, + {-1.090792,-0.202419}, + {0.531809,-0.405696}, + {-0.038049,0.323853}, + {-0.027231,-0.016436}, + {-0.716140,-0.504110}, + {0.323352,-0.270107}, + {-0.253368,-1.019154}, + {-0.779463,-0.217103}, + {-0.579380,-0.994819}, + {1.349996,0.012975}, + {0.343522,-0.422818}, + {0.277107,-1.468269}, + {1.635924,-0.133051}, + {-0.184484,0.613490}, + {0.452174,1.169168}, + {-0.116411,0.804015}, + {-0.040472,0.200894}, + {-0.451595,0.380316}, + {-0.018660,-0.980569}, + {1.037949,1.233064}, + {1.095728,0.983920}, + {0.472751,-0.243982}, + {0.234380,0.303549}, + {-0.706062,1.365919}, + {-1.056416,-0.147830}, + {0.003918,0.621718}, + {-0.866214,-0.038261}, + {0.019575,-0.379413}, + {0.205000,0.142153}, + {-0.272811,0.136060}, + {-1.150797,-1.754010}, + {0.777102,0.334033}, + {0.144743,0.082452}, + {0.409845,1.246999}, + {-0.848828,-0.844270}, + {0.336356,1.069431}, + {-0.261880,0.472035}, + {-0.274440,-0.250428}, + {0.096055,1.333042}, + {-1.150019,-0.005824}, + {-0.345565,1.491009}, + {0.434845,0.644814}, + {-0.995453,0.103214}, + {-0.248426,-0.545754}, + {0.087275,1.536388}, + {-1.950359,0.672084}, + {0.687779,0.938171}, + {0.592318,-0.358229}, + {0.719642,-0.071983}, + {-0.080845,0.708763}, + {0.136255,-1.235083}, + {-0.251003,-0.912274}, + {-0.884002,-0.310324}, + {0.031525,0.320763}, + {0.556086,-0.250977}, + {0.090584,0.172983}, + {-0.360676,0.948733}, + {-0.090851,0.465571}, + {-0.059321,0.271202}, + {0.377821,0.928997}, + {-2.122083,-0.662680}, + {0.606876,-0.740523}, + {0.304647,-1.075289}, + {0.104366,0.294334}, + {-0.618571,-1.125453}, + {0.347400,-0.197963}, + {0.740467,-0.980580}, + {0.567211,0.587097}, + {-0.009102,0.368841}, + {0.365819,1.246754}, + {0.408926,-0.573655}, + {0.629943,0.031990}, + {-0.888191,-1.455036}, + {-0.192010,-1.721713}, + {-0.525795,-0.883365}, + {-0.688342,-0.233976}, + {-1.231810,0.919714}, + {-0.171857,0.047815}, + {0.829192,0.498064}, + {-0.164813,0.833731}, + {-0.835674,1.420757}, + {0.117641,0.408307}, + {0.061907,-0.340905}, + {0.328647,0.483077}, + {-0.334550,-0.634442}, + {-1.143177,0.176319}, + {0.945986,-0.429932}, + {0.962872,-0.156957}, + {0.316408,-0.309555}, + {-0.071834,0.467993}, + {0.374919,0.531204}, + {-0.061652,-0.441122}, + {0.296652,-0.735807}, + {0.635521,0.547129}, + {-0.820187,-0.119987}, + {-0.256993,-0.874678}, + {-1.176903,0.375631}, + {-0.389114,1.458620}, + {-1.499695,1.086553}, + {0.662846,-0.346478}, + {1.134804,0.260529}, + {-0.353432,0.041867}, + {0.599759,-0.706760}, + {0.233411,-0.191501}, + {0.069271,-0.371072}, + {-0.299719,-0.158599}, + {0.156862,0.287897}, + {0.044521,-1.565973}, + {0.647652,-0.050318}, + {-0.625813,0.313538}, + {-0.305193,0.707469}, + {-0.889292,-0.615903}, + {0.108968,0.323345}, + {0.891658,0.530089}, + {-0.619121,0.542110}, + {-0.173821,-0.076271}, + {-0.066656,-0.380613}, + {1.201157,-0.868830}, + {-0.269634,-0.547771}, + {-0.166608,0.337899}, + {-0.580004,0.028538}, + {-0.178471,0.256375}, + {0.479790,-0.353481}, + {-0.141978,-0.140536}, + {0.573456,-1.096426}, + {-1.407537,0.376742}, + {-0.000291,-0.159343}, + {0.566129,1.021878}, + {0.592375,0.213044}, + {-1.093385,-0.195052}, + {-1.227213,-0.283957}, + {-1.107600,-0.512341}, + {0.405843,-0.034674}, + {-0.628223,-1.573836}, + {-0.424388,-1.127573}, + {1.352502,0.703620}, + {0.260965,0.940215}, + {0.564688,-0.617820}, + {0.627958,-1.090734}, + {-0.519309,-0.170822}, + {-0.018574,0.160240}, + {0.581393,0.735974}, + {-1.723723,-0.001348}, + {0.426947,0.152603}, + {1.732577,-0.140408}, + {0.733090,-1.014674}, + {0.548625,-0.606929}, + {-0.104524,-0.976971}, + {0.002059,0.365576}, + {-0.437915,-0.973652}, + {0.409557,-0.489978}, + {-0.000720,0.508669}, + {0.256095,-1.595859}, + {0.287175,0.564402}, + {0.876617,-1.300599}, + {-0.980624,0.538104}, + {-0.197058,-0.835753}, + {0.293510,1.023684}, + {-1.124246,-0.346680}, + {1.728107,0.223808}, + {0.608823,0.314713}, + {-0.678436,-0.934938}, + {0.467041,-0.286489}, + {0.304061,0.659360}, + {0.433362,-0.114714}, + {0.470833,0.482791}, + {0.136415,0.001946}, + {-0.192213,1.062735}, + {1.160425,1.197857}, + {0.570082,-0.708591}, + {-0.674925,-0.979498}, + {0.258815,-0.140179}, + {0.765330,0.060888}, + {-1.138194,-0.547729}, + {-0.342221,-0.331377}, + {0.487680,-0.431774}, + {0.195766,-0.563726}, + {-0.515654,-2.231175}, + {-0.514830,1.422505}, + {-0.818513,0.454493}, + {0.380391,0.182849}, + {-0.069606,1.071475}, + {-1.175893,0.278782}, + {-1.024879,-0.018088}, + {0.047685,-0.767415}, + {-0.451445,0.575550}, + {0.806845,-0.635450}, + {0.137154,0.051450}, + {0.484762,0.473028}, + {1.476065,-0.375153}, + {0.038745,0.227390}, + {1.613348,-0.285214}, + {0.027663,-0.441607}, + {0.327132,0.393034}, + {0.097041,1.118078}, + {-1.373910,-0.535039}, + {-0.830631,0.886098}, + {0.712699,0.117282}, + {-0.435669,0.900266}, + {-0.230984,0.260017}, + {-1.134322,0.277879}, + {1.217344,0.070220}, + {-0.322548,0.229832}, + {-0.912984,1.081382}, + {0.945157,-0.653585}, + {0.109940,-0.208093}, + {-0.750971,-0.827736}, + {0.077654,-0.623765}, + {1.218827,-0.344685}, + {-0.313002,0.296601}, + {0.400554,0.568839}, + {0.304519,-0.601576}, + {0.373664,1.261417}, + {0.019345,0.795808}, + {-0.078023,-0.626856}, + {0.116647,0.074558}, + {0.563238,-0.563330}, + {-2.463399,0.442332}, + {-0.109267,0.048086}, + {0.519121,0.180174}, + {0.193848,-0.161425}, + {-0.042920,0.296486}, + {0.073707,-1.348922}, + {0.617742,-0.148470}, + {0.261979,-0.030175}, + {1.197662,-1.031986}, + {-0.180963,0.326171}, + {-0.182722,0.138127}, + {0.333006,-0.298385}, + {0.118052,0.145749}, + {-0.378857,-0.353684}, + {-0.874132,-0.138412}, + {1.049590,-0.258466}, + {-0.227425,0.931924}, + {0.060564,0.378351}, + {0.371015,-0.349550}, + {-0.143444,-0.217476}, + {-0.247485,-0.046193}, + {-0.765423,0.386454}, + {0.075810,0.747783}, + {-0.562521,-0.075906}, + {0.409856,-0.469514}, + {-0.135998,-0.492786}, + {0.986502,-0.462649}, + {-0.068894,0.801619}, + {-0.162736,0.525729}, + {-0.453916,0.283674}, + {-0.123426,-1.358265}, + {1.200608,-0.396901}, + {0.577734,-0.019945}, + {-0.436619,0.346352}, + {0.830315,0.899719}, + {-0.064963,1.026769}, + {-0.019483,-1.140266}, + {-0.248584,0.297740}, + {-0.203858,0.942282}, + {-0.081061,-0.362369}, + {0.963064,0.245140}, + {-0.061346,0.970336}, + {-1.223766,-1.442024}, + {-0.659296,-0.305137}, + {-0.168098,0.526909}, + {0.244864,0.201375}, + {-1.037356,-0.409374}, + {-0.342768,0.074298}, + {-0.126356,0.583275}, + {0.700812,0.148717}, + {1.123453,-0.594402}, + {-0.880209,-0.000771}, + {0.508231,0.583812}, + {0.461500,-1.305179}, + {-0.352762,-0.342643}, + {0.026590,1.641167}, + {0.172356,-0.551779}, + {0.624259,1.319173}, + {-0.343181,0.521502}, + {-0.377493,0.564330}, + {0.463338,0.107471}, + {-1.020304,0.501309}, + {1.214700,-0.385908}, + {0.246930,0.896288}, + {-1.150099,0.525414}, + {0.598091,-0.621490}, + {-0.551424,0.044236}, + {0.503002,0.175473}, + {-0.326038,0.203589}, + {0.000174,-0.755465}, + {-0.076286,0.193240}, + {0.751071,-0.851721}, + {-1.638472,-0.078066}, + {0.277348,0.196780}, + {0.017669,-0.946993}, + {-0.808836,0.460763}, + {0.389572,-0.585954}, + {-0.536593,-0.448112}, + {0.668181,-0.374583}, + {-0.103420,-0.222061}, + {0.033553,0.915602}, + {-0.727955,-0.942821}, + {0.227992,-0.544748}, + {0.215369,0.016803}, + {-0.331175,-0.358666}, + {-0.369147,-1.683768}, + {0.287561,1.754403}, + {0.730502,1.075420}, + {0.098139,0.193287}, + {-0.220536,-0.547638}, + {-0.708086,0.229183}, + {-0.066645,0.221207}, + {-0.544498,0.224689}, + {0.909845,0.066686}, + {-0.417147,-1.561040}, + {-0.588530,-0.271389}, + {0.765381,0.630382}, + {-1.536043,0.954170}, + {-0.007504,-0.251426}, + {0.320371,-0.415162}, + {-1.079865,-0.015651}, + {1.246319,-0.288800}, + {1.664357,0.873397}, + {1.274888,-0.286462}, + {0.089238,0.521546}, + {-0.850328,-0.204610}, + {-1.344064,-0.175840}, + {1.059629,0.597417}, + {1.396640,-0.558153}, + {-1.299523,-0.700533}, + {-0.303029,-0.016323}, + {-0.571055,-0.101430}, + {0.240632,-0.156008}, + {-0.210472,-0.676508}, + {-0.377210,-0.257232}, + {-0.458563,0.394798}, + {-1.298114,0.535994}, + {0.348716,1.486169}, + {-0.551518,0.095552}, + {-0.454461,0.613793}, + {0.589896,0.608956}, + {0.024315,-0.615423}, + {0.108640,0.657051}, + {0.277486,0.095590}, + {0.112263,0.590235}, + {-1.676875,0.295265}, + {-0.641851,0.429911}, + {0.112035,-0.999186}, + {0.407359,1.310697}, + {0.123607,-0.285048}, + {-0.584768,0.856268}, + {0.365845,-1.606895}, + {0.118025,0.980790}, + {0.976487,-0.548793}, + {-0.608533,0.177190}, + {-0.254552,0.490015}, + {-0.764686,-0.476040}, + {0.339780,0.307140}, + {1.071418,-0.394981}, + {0.343840,-0.138409}, + {0.050959,0.206412}, + {-0.132190,1.024308}, + {-0.531174,-0.997495}, + {0.107836,0.197144}, + {0.006508,0.051268}, + {-1.180682,-0.078210}, + {-0.301054,0.221919}, + {-0.198790,-2.154487}, + {1.281974,-0.406055}, + {0.248667,0.220739}, + {-0.151733,0.572224}, + {-0.887702,-0.282886}, + {-0.035221,0.961347}, + {-1.071469,0.514402}, + {-1.341250,0.603023}, + {-0.080709,0.493279}, + {0.437681,-0.565973}, + {0.221259,1.582183}, + {-0.409386,0.729511}, + {0.982076,-0.071098}, + {-1.001791,-0.519130}, + {-0.121082,-0.007075}, + {-0.339436,1.234458}, + {1.513595,0.969100}, + {-0.583819,0.253911}, + {0.177078,-0.732721}, + {1.010067,0.995855}, + {-1.355505,0.888006}, + {-0.332757,0.204762}, + {0.021403,1.025592}, + {-1.217885,0.139156}, + {0.889080,0.092179}, + {-1.102149,0.293526}, + {0.435463,-0.449178}, + {0.080275,0.169176}, + {-0.709930,-1.149043}, + {0.196490,-0.626610}, + {0.000069,-0.943691}, + {0.223655,0.039723}, + {-0.560770,-0.882470}, + {-0.807256,0.094114}, + {-0.058225,-0.349692}, + {-0.500905,-1.096078}, + {-0.962775,0.327158}, + {0.282785,-0.401214}, + {0.361234,-0.934402}, + {0.576734,-0.359076}, + {-1.413799,0.265539}, + {-1.117609,-0.837082}, + {0.180753,-0.472530}, + {-0.120835,-0.959192}, + {-0.157811,0.176422}, + {-0.850684,0.325782}, + {0.828223,0.792925}, + {0.054204,0.579626}, + {-1.121286,-0.414842}, + {-0.113676,0.001080}, + {0.642904,0.453393}, + {-1.026285,0.939691}, + {0.521202,0.352828}, + {0.456312,-0.206836}, + {0.058434,-0.053600}, + {0.115901,0.497408}, + {1.204157,-0.447713}, + {0.345992,-0.395337}, + {0.164925,1.328079}, + {0.069910,0.657455}, + {0.884794,0.478670}, + {0.805589,0.626931}, + {-0.169274,-0.328030}, + {-0.535077,0.102330}, + {-0.946526,0.154656}, + {0.358642,-1.362812}, + {-0.676983,-0.652080}, + {0.992864,-0.004017}, + {-0.410549,0.342659}, + {-1.235267,0.713491}, + {-0.398621,0.103696}, + {-0.820035,0.801927}, + {1.200059,0.099361}, + {0.165502,0.725726}, + {-0.591579,0.903920}, + {-0.843723,0.547834}, + {0.773809,0.403580}, + {-0.110340,-0.128695}, + {-0.642852,0.256573}, + {0.020826,-0.020841}, + {-2.163248,0.136883}, + {-0.964862,0.387295}, + {0.687709,0.453517}, + {-0.112839,-0.567023}, + {-0.409633,0.580404}, + {-0.395668,1.251119}, + {0.347308,-0.652184}, + {1.734678,-0.822788}, + {0.601811,-0.259379}, + {0.378296,-0.866471}, + {0.498403,-0.656762}, + {0.504824,0.489810}, + {0.639843,0.108016}, + {-0.224104,0.234376}, + {0.009714,-1.168003}, + {0.019711,0.237093}, + {0.442850,0.092101}, + {0.202559,0.660920}, + {-0.738652,-1.371965}, + {-1.297719,0.932182}, + {0.739608,1.592722}, + {0.287503,-0.045919}, + {1.222096,-0.184544}, + {-0.022342,-1.348633}, + {-0.384473,0.250028}, + {0.001750,-0.224717}, + {-0.339904,-0.227850}, + {-0.775438,-1.310795}, + {0.571535,0.293371}, + {-0.324597,0.227490}, + {0.169930,1.145261}, + {-1.551123,-0.199599}, + {0.903788,-0.358227}, + {-0.622574,-0.635810}, + {-0.045168,1.216837}, + {0.093370,2.013175}, + {-0.171013,-0.524670}, + {0.035948,0.841222}, + {-0.592962,0.383082}, + {0.304794,-0.702133}, + {0.779021,0.240417}, + {1.021212,0.841250}, + {-0.373074,-0.296006}, + {-0.522088,1.139662}, + {-0.268210,-0.251780}, + {-0.668865,-0.925004}, + {-0.197566,0.255127}, + {1.441911,1.117605}, + {0.359801,0.069378}, + {0.485969,-1.028166}, + {0.009410,1.004055}, + {-0.386974,-1.624570}, + {0.923300,0.143629}, + {0.181342,0.541303}, + {0.292919,0.079149}, + {0.324985,-0.714574}, + {1.032349,-0.142324}, + {-0.163295,0.054984}, + {-1.028432,-0.229401}, + {0.459060,-0.443054}, + {-0.236741,-0.785944}, + {-0.703899,-1.736899}, + {-0.586833,-0.513491}, + {-1.517056,-0.084420}, + {0.292003,-0.016637}, + {0.700051,-0.583601}, + {0.526109,0.250151}, + {-0.227784,-0.209721}, + {1.818833,-0.253432}, + {-0.360458,-0.668042}, + {0.666832,-0.166561}, + {-0.358616,-0.418329}, + {-0.412887,0.836863}, + {0.467107,0.455230}, + {0.592494,1.202728}, + {-0.049518,-0.533706}, + {-1.002130,0.544990}, + {-0.257809,-0.145484}, + {-0.507467,-0.453834}, + {0.291788,0.724311}, + {-0.135188,0.157332}, + {0.631982,0.964860}, + {-1.346895,0.067204}, + {-0.288235,0.488706}, + {-2.477087,1.241502}, + {-0.518612,-0.435361}, + {0.955342,0.489972}, + {1.169275,0.407173}, + {0.213697,0.494150}, + {1.485172,0.045033}, + {0.153003,0.092241}, + {-0.308640,-0.601813}, + {-0.228943,0.489280}, + {-1.169407,-1.772660}, + {0.178640,0.792597}, + {-0.165417,0.292843}, + {1.369952,-1.611009}, + {0.852707,-0.827966}, + {0.821978,-0.004446}, + {0.649031,-0.812858}, + {0.973973,-0.310191}, + {-0.044568,-1.440362}, + {0.765165,-0.538318}, + {0.073737,0.997220}, + {1.234533,0.305244}, + {0.063294,0.158006}, + {0.169849,0.859146}, + {-0.719410,-1.068298}, + {0.116258,-0.709057}, + {-0.930144,-0.632747}, + {-0.181414,-0.975216}, + {0.795997,0.192359}, + {0.066111,-1.055039}, + {-0.298799,-0.559138}, + {-0.603013,-0.082259}, + {0.209757,1.372754}, + {0.347500,0.495824}, + {0.676474,-0.072774}, + {0.550261,-1.227179}, + {-0.263165,0.041038}, + {-0.546702,-0.491019}, + {0.738601,-0.021821}, + {-0.575464,-0.045919}, + {0.123871,-0.075287}, + {-1.083198,-1.254586}, + {-0.183814,-1.052704}, + {-0.881953,0.291254}, + {0.295336,-0.371557}, + {0.023762,-0.165479}, + {0.922082,0.683317}, + {0.324383,-0.491146}, + {1.171481,-0.557506}, + {0.470032,0.663233}, + {-0.433687,0.881275}, + {0.569872,1.163325}, + {-1.147629,1.276498}, + {-1.667829,0.173502}, + {1.509836,-0.393443}, + {0.061339,-0.994588}, + {1.297176,-0.289000}, + {-0.222211,1.274974}, + {0.171856,-0.708127}, + {-0.762371,0.928647}, + {0.489001,-0.717858}, + {0.273726,-0.144006}, + {0.089858,0.479527}, + {-0.415939,-0.754283}, + {-0.820428,-1.308644}, + {0.246597,0.476980}, + {-0.061898,-0.518679}, + {-0.002501,-0.563025}, + {0.160470,-0.497633}, + {0.654653,-0.058246}, + {-0.346737,0.304705}, + {-0.730579,-0.133753}, + {0.332384,0.151924}, + {-0.769060,0.340191}, + {-0.946356,0.802338}, + {-0.185563,-0.701926}, + {-0.018478,0.385360}, + {-0.763889,-0.171119}, + {0.136434,-1.151131}, + {0.944360,0.351269}, + {0.234035,0.460682}, + {-0.126511,-0.343346}, + {-0.129577,0.714668}, + {0.831803,1.425489}, + {-0.311698,0.471973}, + {0.374336,-0.532622}, + {-1.287929,0.086859}, + {-0.960906,-0.551099}, + {-1.322977,0.426687}, + {0.566247,-1.476259}, + {-0.042332,-0.595204}, + {-0.217199,0.570666}, + {-0.336883,0.586814}, + {0.991186,1.090638}, + {-0.112997,0.343201}, + {0.936285,0.699872}, + {1.134616,0.605336}, + {-0.332672,0.412190}, + {-0.131705,-0.706994}, + {0.966135,0.922373}, + {1.133423,-0.652360}, + {-1.177552,-0.186519}, + {0.708659,-0.078514}, + {-0.951753,-0.658081}, + {0.498906,0.236519}, + {0.282086,-1.164112}, + {0.256290,-0.187041}, + {0.292859,-0.420021}, + {0.670422,-0.359978}, + {-0.031479,-0.211732}, + {-0.243913,-0.094388}, + {-0.214352,0.162763}, + {-0.671425,1.172721}, + {-0.345164,-0.766127}, + {-0.628780,-0.950380}, + {-0.275698,0.202610}, + {-0.358559,0.974356}, + {0.409593,0.965904}, + {-0.287768,-0.284934}, + {-0.817917,0.034221}, + {0.282824,-0.083509}, + {0.266940,0.414989}, + {-0.839039,0.602647}, + {-0.030358,-0.143335}, + {-0.461787,-1.323753}, + {-0.947434,0.034506}, + {0.206777,0.393953}, + {0.110051,0.039027}, + {-0.255445,-0.418588}, + {-0.824977,-0.529115}, + {-0.847940,0.003400}, + {-0.227448,-0.605217}, + {-0.658428,-0.129496}, + {-0.070069,-0.874316}, + {-0.452178,-0.509891}, + {0.006794,0.737596}, + {-0.173131,-0.491329}, + {-0.018882,0.037139}, + {1.012352,-1.428883}, + {0.341480,-0.177353}, + {0.088907,1.263644}, + {-0.007106,-0.035769}, + {0.494848,-0.291677}, + {1.029770,1.640336}, + {-0.019924,-0.576639}, + {1.078143,0.161988}, + {-1.158261,-0.009208}, + {-0.920354,0.385655}, + {-0.103172,-0.424669}, + {-0.128917,0.361840}, + {0.451312,-0.151329}, + {0.486818,-0.792695}, + {0.173666,-0.625128}, + {-1.227586,0.233996}, + {-0.567889,0.022017}, + {-0.012878,0.076646}, + {-0.423646,0.335511}, + {-0.989293,1.156415}, + {-0.977194,0.382489}, + {-1.465169,0.221222}, + {-0.821043,-0.880370}, + {0.953556,0.320459}, + {-0.493348,1.015682}, + {-0.041491,-1.401656}, + {0.110917,-1.090802}, + {-0.787109,0.792470}, + {-1.183552,-0.605356}, + {-0.466455,0.123053}, + {1.377708,0.488188}, + {1.036160,-0.429887}, + {-0.195443,0.367498}, + {-0.649320,-0.214917}, + {0.818471,-0.314367}, + {-1.095956,-1.066370}, + {1.010551,1.357206}, + {-0.522272,-1.266004}, + {0.742807,-0.658170}, + {0.137677,-0.996820}, + {-0.269035,-0.313754}, + {0.231487,1.580343}, + {0.050224,-0.237917}, + {0.022147,0.008968}, + {-0.118094,-0.562883}, + {0.746369,-0.220601}, + {0.103125,-1.486236}, + {-0.018752,0.345496}, + {-0.026367,0.124820}, + {-0.095584,0.426964}, + {0.299398,-0.036745}, + {0.876858,0.071707}, + {0.080784,0.101691}, + {-0.365802,-0.832668}, + {-0.066045,-0.042815}, + {-1.336839,-0.309595}, + {-1.855670,0.090094}, + {0.142864,0.213680}, + {0.170087,-0.748118}, + {0.757840,-0.487161}, + {-0.008566,0.015099}, + {-0.574190,0.366625}, + {0.850847,-0.670065}, + {-0.088781,-0.552472}, + {0.065881,-0.562275}, + {2.174229,-0.693270}, + {0.545383,0.173825}, + {0.179404,-1.118853}, + {-0.706263,0.644413}, + {-0.201256,0.026020}, + {0.371367,0.027994}, + {0.695924,-0.856474}, + {-0.068587,-0.377147}, + {-1.335474,-0.381794}, + {-0.705342,-0.264330}, + {1.211854,0.734180}, + {0.689579,-0.829674}, + {0.236230,-0.519350}, + {-0.373274,-0.203030}, + {0.522275,0.190464}, + {-0.984102,0.184132}, + {0.608537,0.528305}, + {0.645580,-0.632723}, + {0.106191,-1.924526}, + {-0.860820,0.172286}, + {-0.017002,-0.413171}, + {-0.870914,-0.915141}, + {-0.032162,-0.022238}, + {1.063524,0.208230}, + {0.208620,0.392565}, + {1.534353,0.353688}, + {0.503624,0.611747}, + {1.441714,0.373080}, + {-1.685419,0.553616}, + {-1.251072,1.088477}, + {0.030551,0.653043}, + {0.348223,-0.875562}, + {-0.158646,-1.827145}, + {-0.599854,-1.150166}, + {-0.622279,1.015380}, + {-0.045192,0.068378}, + {0.289380,0.241892}, + {0.780663,-0.317637}, + {-0.624796,-0.111034}, + {0.156313,0.625074}, + {-0.887464,0.338653}, + {0.276127,-1.089799}, + {0.393729,-0.259418}, + {0.290756,0.344205}, + {-1.690691,0.271341}, + {1.070050,-0.375246}, + {-0.518340,-0.146201}, + {-0.136899,-0.031255}, + {-0.732118,0.763056}, + {0.595604,-0.170473}, + {0.313932,0.752164}, + {1.258402,-0.021841}, + {-1.271193,0.594328}, + {1.074153,0.128659}, + {0.478066,-0.276071}, + {-0.358573,0.984028}, + {0.423156,0.233965}, + {-0.177399,0.151124}, + {0.079737,0.146108}, + {-0.800067,-0.511673}, + {0.506933,-0.549296}, + {0.699370,-0.759465}, + {0.195093,1.236176}, + {0.557245,1.418542}, + {0.287210,1.479131}, + {0.668788,-0.448889}, + {-0.463056,0.926393}, + {1.124722,-0.224757}, + {1.118837,-0.244739}, + {-0.214775,0.121754}, + {-0.086324,-0.784099}, + {1.274702,0.512876}, + {1.060185,1.325123}, + {0.193620,0.390433}, + {-0.286823,0.231843}, + {-0.351578,0.727546}, + {-1.647569,0.062221}, + {0.356859,-0.256082}, + {0.266346,0.400761}, + {-0.225153,-0.791734}, + {0.522282,0.074414}, + {-0.375861,-0.448761}, + {-0.533274,0.056055}, + {-0.400783,-0.040651}, + {0.436361,0.406416}, + {0.165936,0.403954}, + {0.851735,1.253902}, + {-0.996147,0.302040}, + {0.979640,0.288274}, + {-0.020106,-0.155534}, + {-0.392568,-0.327217}, + {-0.200327,0.496539}, + {-0.233763,-0.423968}, + {-0.976208,-0.408918}, + {-0.571268,-0.378235}, + {0.224025,-0.154206}, + {-0.176338,0.225973}, + {0.355614,-0.189466}, + {-0.450087,0.567394}, + {-0.659818,1.574000}, + {-0.724889,0.197115}, + {-1.355431,-0.664189}, + {-0.203199,0.667343}, + {-0.361135,0.152712}, + {-0.007547,-0.222527}, + {-0.546892,-0.387338}, + {1.044558,-0.663379}, + {0.326269,-0.004359}, + {-0.012900,0.714057}, + {-0.032278,-0.204936}, + {-0.152106,0.539984}, + {-0.484380,-0.174141}, + {-0.480804,-0.521659}, + {0.019051,-0.512885}, + {-0.371011,-0.457457}, + {0.637777,-0.575044}, + {1.426366,0.512612}, + {0.266994,0.797655}, + {-0.824664,-0.336600}, + {-0.422137,-0.905715}, + {0.656471,0.209458}, + {-0.864761,-0.058947}, + {1.312581,0.409720}, + {0.093477,1.303098}, + {-0.495575,0.491653}, + {0.616295,0.289625}, + {0.019085,0.370022}, + {-1.785266,0.062761}, + {-0.110044,-0.749797}, + {1.685633,0.914155}, + {0.759099,0.624272}, + {-0.950030,1.223722}, + {0.414424,-0.410528}, + {0.183760,-0.081691}, + {-0.402176,-0.026614}, + {-0.349344,-0.746451}, + {-0.669819,0.784265}, + {0.124418,0.632759}, + {0.541258,-1.198492}, + {-0.866841,0.005112}, + {-0.420861,0.310081}, + {-0.492845,2.040430}, + {0.289183,-0.025633}, + {0.333462,-0.545470}, + {0.620450,-0.664730}, + {-0.966239,0.477068}, + {-0.280518,0.588544}, + {0.855581,0.526154}, + {0.176645,-0.532816}, + {0.243194,-0.347975}, + {0.121295,1.046375}, + {0.468586,-0.344088}, + {-0.350739,-0.403584}, + {-0.631745,-0.782817}, + {-0.949273,-1.150875}, + {0.922169,-1.684543}, + {-0.345543,-0.015945}, + {0.837118,0.348048}, + {-0.849669,0.097854}, + {-0.950003,-0.284938}, + {-0.827245,1.274905}, + {0.582750,0.674266}, + {0.863202,-0.250190}, + {0.661880,0.368907}, + {0.037276,-0.913114}, + {0.165824,1.259230}, + {0.058122,0.701148}, + {-0.309547,-0.432040}, + {-0.596559,-0.618049}, + {0.889281,0.852314}, + {0.257575,-0.140190}, + {0.466566,-1.164941}, + {-0.846649,-0.024130}, + {-0.006130,-0.345342}, + {0.554810,-0.369790}, + {0.132936,-1.245072}, + {-0.708319,-0.243577}, + {-0.938221,0.593895}, + {-0.035179,0.513441}, + {-0.049975,1.127913}, + {-0.672031,0.159578}, + {-0.023330,1.155255}, + {0.143090,1.023505}, + {0.115199,0.309062}, + {-1.199697,0.879078}, + {0.519932,0.063135}, + {0.186381,0.036151}, + {-0.474750,1.313004}, + {-1.041353,0.036701}, + {-0.089927,-0.772333}, + {0.090568,-0.837483}, + {-0.048569,-0.259303}, + {1.571934,-0.955589}, + {-0.022494,-0.250567}, + {-0.308409,0.008499}, + {-0.198203,-0.449276}, + {-0.294832,-0.776042}, + {0.258584,-0.160882}, + {0.168586,-0.668421}, + {-0.607039,-0.175648}, + {-1.595333,0.275002}, + {0.354293,-1.433081}, + {-1.076825,0.444679}, + {0.112063,0.403675}, + {-0.019937,-0.526304}, + {0.878192,1.126714}, + {-0.555291,-0.177409}, + {0.618919,-1.270440}, + {-0.718783,-0.636622}, + {1.023238,-0.542857}, + {0.482907,0.146108}, + {1.333821,1.330160}, + {1.132981,-0.772368}, + {-0.543637,-0.834221}, + {0.775740,0.171336}, + {0.801106,-0.771147}, + {-0.561803,0.079096}, + {0.652019,-0.040842}, + {-0.654772,-0.774603}, + {0.405766,-0.335507}, + {-0.131693,-0.202866}, + {-1.261224,0.358867}, + {0.573502,0.072986}, + {-0.658929,-0.659778}, + {-0.667468,-0.367979}, + {1.363660,0.358243}, + {0.355715,0.497317}, + {0.186055,-0.513256}, + {-0.427157,-0.478966}, + {1.490717,-0.058493}, + {-0.952606,-0.205605}, + {1.437961,0.595822}, + {1.113979,0.821148}, + {-1.993044,0.178065}, + {0.062770,-1.172124}, + {-0.601798,-0.508838}, + {0.404892,0.157432}, + {0.446296,-0.198539}, + {-2.000248,-0.062555}, + {0.418983,-0.605122}, + {1.044428,1.430575}, + {-0.225956,0.016324}, + {0.516675,0.456090}, + {-0.117366,-0.642548}, + {0.821745,0.347570}, + {0.439764,0.695177}, + {-0.216506,-0.082014}, + {1.389264,-0.080676}, + {-0.185223,-0.603367}, + {-0.860185,-0.740634}, + {-0.146111,-0.173600}, + {-0.208919,0.975808}, + {-0.323668,-0.191408}, + {0.325369,0.387206}, + {-1.016963,0.031901}, + {-0.607601,-1.373026}, + {-0.029588,1.154785}, + {-0.134545,-0.252350}, + {0.776553,-0.133224}, + {0.543461,0.280061}, + {-0.890756,-0.743419}, + {-1.170665,1.021231}, + {0.518692,-0.016268}, + {0.959604,0.190010}, + {-0.985259,-0.574513}, + {0.772275,-0.572044}, + {-0.989352,-0.007084}, + {-0.843395,-0.709321}, + {-0.701267,0.196028}, + {-0.479826,0.888804}, + {1.012193,1.019070}, + {0.706742,0.197803}, + {-0.979845,-0.049822}, + {-0.200635,-0.291375}, + {0.049786,-0.795526}, + {1.237530,0.009952}, + {-1.067907,0.940046}, + {-0.112405,-0.397752}, + {-0.046100,-0.102711}, + {0.453746,0.537092}, + {-0.187188,-0.759559}, + {0.717383,-0.561168}, + {-0.164953,-0.323824}, + {-0.166557,0.021823}, + {-0.783368,-0.429656}, + {0.794975,-0.230617}, + {-0.527327,-0.780894}, + {-0.872325,0.014350}, + {0.054789,0.241499}, + {0.738298,-0.228210}, + {0.060773,0.996415}, + {0.241621,-1.596309}, + {0.445850,0.578241}, + {0.315976,1.201028}, + {-1.511131,-0.670994}, + {-0.110134,0.130493}, + {-0.265378,0.556605}, + {-0.552998,0.389953}, + {0.085908,0.759607}, + {-1.029355,0.404668}, + {0.516605,-0.500285}, + {-0.014747,0.186171}, + {-0.662889,0.914909}, + {1.133404,0.043481}, + {0.942736,-1.022847}, + {-1.367925,0.662538}, + {0.202927,-0.261840}, + {-0.080038,0.255562}, + {0.334206,0.344507}, + {0.909260,0.161783}, + {0.279950,-0.442240}, + {-0.132812,1.284395}, + {0.561415,-0.874174}, + {-0.040063,0.004187}, + {0.139506,0.273340}, + {0.678991,-0.833389}, + {-1.242484,-0.045382}, + {0.256214,-0.213426}, + {-0.587563,-0.587595}, + {0.078473,0.384032}, + {-0.277039,1.136410}, + {-0.092972,-1.062368}, + {-0.023888,-0.080233}, + {-0.452956,-0.444322}, + {1.328310,-0.992490}, + {-0.474930,0.347850}, + {0.523240,-0.003848}, + {-0.051859,0.435035}, + {0.353494,-0.243220}, + {-1.096435,1.075703}, + {-0.289883,0.126013}, + {1.309579,0.419419}, + {-0.249474,-1.277937}, + {0.370228,-0.619822}, + {-0.162931,-0.986185}, + {0.529442,0.663374}, + {0.206235,-0.141314}, + {0.327230,0.297918}, + {0.258588,-0.423171}, + {-0.397341,0.502437}, + {0.021206,0.592566}, + {-0.289367,0.413864}, + {0.910642,0.392091}, + {-1.057228,-0.461395}, + {1.001500,0.315649}, + {-0.090014,-0.918110}, + {0.318253,0.558070}, + {0.211192,-0.014893}, + {0.522386,-0.366099}, + {0.090398,-0.703867}, + {1.622834,0.018082}, + {-0.071737,-1.007484}, + {-0.664638,-0.104874}, + {-0.189868,-0.515833}, + {0.358739,0.281609}, + {-0.622523,0.089106}, + {0.361331,0.095296}, + {1.085784,0.080787}, + {0.478981,-0.441729}, + {1.068931,0.439744}, + {-0.628892,0.424033}, + {-0.196324,0.379911}, + {-0.789710,-0.283177}, + {-0.806679,-1.377374}, + {1.599832,1.186046}, + {0.412645,0.144409}, + {0.327430,1.119619}, + {1.057958,1.303142}, + {0.432599,0.474891}, + {0.284130,-0.147951}, + {0.137384,-0.946542}, + {-1.047473,0.054293}, + {-0.143269,-0.396173}, + {0.134200,-1.117673}, + {0.904095,-0.967660}, + {0.784155,-0.589834}, + {-0.329207,-1.584818}, + {1.336969,-0.965850}, + {0.562061,0.584660}, + {-0.860259,-0.550482}, + {0.553302,0.170503}, + {0.384839,0.442235}, + {-0.123665,0.795758}, + {-2.267570,1.579904}, + {-0.985957,0.263810}, + {-0.114123,-0.105293}, + {-0.073897,-0.131005}, + {0.394013,0.420781}, + {1.294967,-0.725636}, + {0.392888,-0.237295}, + {0.708169,-0.947210}, + {0.598124,-0.131921}, + {0.392268,1.238404}, + {0.565937,-1.492817}, + {-0.620915,0.218253}, + {-0.187653,-0.500112}, + {-0.225466,-0.457223}, + {0.298875,0.099610}, + {0.214690,-0.399322}, + {-0.679138,-0.038895}, + {0.118053,0.472370}, + {-0.488826,-0.872846}, + {-1.119422,-0.036171}, + {-0.075847,-0.265969}, + {-1.290590,-1.483111}, + {0.903551,1.081328}, + {-0.903254,-0.425745}, + {-1.654210,-0.592746}, + {-0.834468,0.360416}, + {-0.517414,-0.268347}, + {0.219221,-0.942583}, + {-0.159846,0.647089}, + {0.022067,-0.112729}, + {1.161820,-1.200230}, + {-1.140920,-0.081036}, + {-1.039243,-0.377205}, + {0.314333,0.565306}, + {-1.575490,0.432187}, + {0.468719,0.702260}, + {-0.496647,-0.982869}, + {0.807580,0.126209}, + {-1.232223,-0.694859}, + {0.344013,0.146694}, + {0.352479,-0.248874}, + {0.500112,0.240281}, + {0.150882,0.007734}, + {1.025832,0.271827}, + {0.087793,-0.911808}, + {0.239715,-0.182878}, + {-0.488536,-1.404765}, + {0.245387,-0.004696}, + {-0.830521,0.880491}, + {0.083542,0.285857}, + {0.921577,-0.685627}, + {0.695468,-0.133940}, + {0.939971,1.828094}, + {0.789922,0.759310}, + {0.403211,0.030107}, + {0.016796,0.689851}, + {1.084819,-0.186630}, + {-0.903993,-0.024230}, + {0.712283,-1.107485}, + {-0.931592,0.898492}, + {-0.696849,1.388040}, + {0.542043,-1.230688}, + {-0.217901,1.160492}, + {-0.093252,-0.025223}, + {-0.766154,0.653670}, + {-0.042860,0.814345}, + {-0.196778,-0.716831}, + {0.540037,0.172703}, + {-0.361556,-0.529404}, + {-0.422260,-0.060487}, + {0.516217,-0.838463}, + {0.084237,0.024053}, + {-0.942743,-0.718373}, + {-0.665473,-0.812679}, + {-0.055540,0.324464}, + {-1.050179,0.765823}, + {0.374960,0.619826}, + {0.099384,0.440820}, + {-1.375869,0.145126}, + {-1.168991,-0.089796}, + {-0.464068,0.467425}, + {0.141780,1.426938}, + {0.483327,1.031467}, + {-0.966008,-0.779106}, + {-0.735806,0.516178}, + {-0.139286,0.109933}, + {1.469544,0.847398}, + {0.027674,-0.409753}, + {-0.025074,-1.939206}, + {-0.240214,-0.034248}, + {0.650895,-0.982693}, + {0.425554,-0.059190}, + {-0.496271,0.495123}, + {-1.237870,1.392917}, + {0.256191,-0.155617}, + {0.586083,-0.158262}, + {-0.078923,-0.643073}, + {-0.331194,-1.453308}, + {-0.144171,-0.906848}, + {0.966641,-0.220992}, + {-0.423391,0.041833}, + {-0.824277,0.698242}, + {-0.861274,0.529953}, + {0.179762,-1.130919}, + {-0.996767,-0.193545}, + {0.453175,1.234067}, + {1.485681,0.094392}, + {1.051655,0.052776}, + {-0.134871,0.796853}, + {0.864630,-0.781504}, + {0.780484,-0.400513}, + {0.331109,0.578865}, + {0.776426,-1.263769}, + {0.572772,-0.326729}, + {0.372413,0.005622}, + {0.941942,-1.305397}, + {0.303917,-1.556093}, + {0.189437,1.234819}, + {0.508129,0.382806}, + {-1.116871,-0.360450}, + {0.422168,-0.982315}, + {0.594919,0.466410}, + {1.035624,0.463855}, + {-0.783077,-0.390978}, + {1.236459,1.182626}, + {-0.387814,-0.332232}, + {0.086563,1.162983}, + {-0.346845,-0.245300}, + {0.221111,-0.315026}, + {-0.125533,-0.386266}, + {1.007383,-1.514431}, + {0.408173,-0.652894}, + {-0.444993,0.620328}, + {-0.081295,0.024145}, + {-1.171356,0.146286}, + {-0.654750,-0.194256}, + {1.094476,0.948711}, + {-0.885556,-0.313736}, + {-0.013248,0.284773}, + {-0.687804,-0.472138}, + {-0.155912,-1.113625}, + {-0.819529,0.183507}, + {1.128618,1.019696}, + {-0.355820,-0.271205}, + {-1.577226,0.085216}, + {0.538217,-0.298420}, + {0.076116,-0.620804}, + {0.154589,-1.126306}, + {0.598211,0.261215}, + {-1.007944,1.678870}, + {0.224117,-0.226210}, + {-1.489159,0.965365}, + {-0.297128,-0.374228}, + {0.750106,0.539997}, + {0.386862,0.676595}, + {0.966769,-0.407596}, + {0.384334,-1.359028}, + {-0.664215,-0.143987}, + {0.039815,-0.249599}, + {-1.121556,0.013060}, + {0.991496,1.175812}, + {-0.353957,-0.926145}, + {0.416137,0.633272}, + {-0.347908,-0.060762}, + {-1.001857,-1.669313}, + {0.715754,-0.308980}, + {0.493890,0.621634}, + {0.080629,-0.165597}, + {0.066092,-0.718772}, + {-0.340841,0.667852}, + {0.031320,-1.351725}, + {0.793912,0.365991}, + {0.094964,0.747321}, + {-1.342909,0.528676}, + {-0.173577,-0.344160}, + {-0.196297,-0.688651}, + {0.159112,0.542697}, + {0.329935,0.154517}, + {1.185337,0.700728}, + {-0.704310,-0.402117}, + {-0.316785,-0.310172}, + {-1.232388,-1.015449}, + {-0.043209,0.901854}, + {-0.340189,-2.254502}, + {-0.603832,0.362719}, + {0.962932,-0.001934}, + {1.768897,0.121106}, + {0.679471,0.866237}, + {-0.737197,-1.149965}, + {1.225298,-0.618371}, + {-0.296798,-1.468710}, + {-1.678878,0.063437}, + {0.479002,0.192428}, + {0.346018,-1.538752}, + {-1.206099,-0.295383}, + {1.053135,0.455640}, + {-0.560954,0.547959}, + {0.643517,-0.909463}, + {-0.098024,-0.246867}, + {0.931635,-0.252753}, + {0.148997,-0.323576}, + {0.050144,-0.171018}, + {-0.267956,0.294251}, + {0.333497,0.911259}, + {-0.365215,0.268823}, + {0.144195,-0.701040}, + {-1.526851,-0.129927}, + {1.142833,0.635755}, + {-0.586324,0.067496}, + {1.134076,-0.946287}, + {-0.493528,-0.592981}, + {-0.425575,0.286177}, + {0.092149,0.506148}, + {-0.271803,-1.297036}, + {0.026268,0.441668}, + {1.237103,0.694613}, + {0.582480,-0.500776}, + {-0.919241,0.616013}, + {0.539933,-0.765108}, + {-0.238804,-0.015991}, + {0.251532,1.010740}, + {0.018575,1.538529}, + {1.164247,0.775468}, + {-0.724490,0.704236}, + {0.572185,-0.261278}, + {-0.165192,-0.473733}, + {-0.275442,-0.214077}, + {0.529682,0.079349}, + {-1.043063,0.590297}, + {-0.312898,0.982987}, + {-0.347152,-0.300360}, + {0.198617,-1.545474}, + {-0.137123,0.206520}, + {1.406277,0.504897}, + {-0.230632,-0.020974}, + {1.165849,1.286086}, + {0.567973,0.251033}, + {0.730319,-0.018651}, + {-1.173668,0.011321}, + {-0.036457,-0.751900}, + {-0.615665,0.447886}, + {-0.452895,-0.069779}, + {0.673152,-0.178631}, + {-0.327908,-0.701133}, + {0.721903,-0.259445}, + {0.096390,-0.755208}, + {0.558453,-0.050797}, + {0.264645,0.199839}, + {-0.894315,0.312986}, + {-0.216785,-0.394039}, + {-1.143224,0.400516}, + {-1.356620,0.072608}, + {1.362480,-0.018613}, + {1.142226,-0.983870}, + {0.627630,0.620440}, + {0.660075,-0.739872}, + {0.579792,-1.280997}, + {0.651826,0.602429}, + {1.895455,-0.274354}, + {-0.906672,-0.429069}, + {-0.803452,0.029061}, + {0.481015,1.138218}, + {1.032808,-0.296512}, + {-0.832241,0.455665}, + {0.539383,1.075476}, + {-0.438440,0.887938}, + {0.424835,-0.368019}, + {-0.135554,0.584722}, + {0.599934,1.286793}, + {-1.006594,0.727090}, + {0.911023,0.076265}, + {0.337550,1.120384}, + {-0.895655,0.047860}, + {0.266564,-0.467233}, + {-0.048357,0.118508}, + {-0.702445,-0.560325}, + {0.480256,-1.121399}, + {0.654894,0.949342}, + {-0.417652,-0.110876}, + {0.709040,-0.321438}, + {-0.238239,-0.984386}, + {-0.301674,-0.706961}, + {0.472112,1.348416}, + {-0.288396,-0.181889}, + {-0.450683,-0.267402}, + {-0.308414,-1.071811}, + {-0.417105,0.973953}, + {-1.553241,-0.142268}, + {0.128366,0.111307}, + {-0.927474,-0.051060}, + {1.101826,-0.477989}, + {-0.242754,0.084899}, + {-0.746846,1.115605}, + {-1.127438,-0.172875}, + {-0.155172,-0.399688}, + {-1.837735,0.530750}, + {-1.374064,0.363114}, + {-0.097395,0.053473}, + {0.609195,-0.274619}, + {1.734941,0.890505}, + {0.779686,-0.972688}, + {0.585193,-1.045163}, + {0.248025,-0.300921}, + {-0.152088,0.863592}, + {0.576776,-0.435392}, + {-0.660678,-1.619638}, + {-0.049095,0.111165}, + {-0.054992,0.933530}, + {0.502694,0.260923}, + {-0.330115,-0.374907}, + {0.738413,0.897929}, + {-0.134611,-0.079508}, + {-0.501918,0.744600}, + {1.092964,0.366548}, + {-0.569112,-0.575195}, + {-0.361389,-0.543941}, + {-0.246589,1.583851}, + {0.115483,0.436651}, + {0.709692,-0.027134}, + {-0.201305,-0.325035}, + {-0.081069,-0.613508}, + {-0.204912,0.899014}, + {-0.052638,-0.313595}, + {-0.055242,-0.450843}, + {-1.021730,-0.600249}, + {0.649428,0.166285}, + {-0.566037,-0.062804}, + {0.020980,0.775753}, + {-0.665180,0.091810}, + {0.475532,0.480182}, + {-0.392908,0.497955}, + {-0.911233,-1.270771}, + {0.008075,-0.360294}, + {0.692020,-0.075024}, + {-0.731113,-0.013576}, + {0.768481,0.871268}, + {-0.414806,-0.177137}, + {-0.085437,-0.311006}, + {0.611962,0.398797}, + {-1.456806,0.915209}, + {0.234176,-0.108086}, + {0.392467,-0.300692}, + {-1.290682,-0.075481}, + {0.661390,0.746033}, + {-0.613522,-0.349294}, + {-0.658477,1.050708}, + {-0.966256,-0.650581}, + {-0.356483,-0.515624}, + {0.776759,1.027077}, + {-1.230686,-1.756435}, + {1.443473,0.351437}, + {-1.627666,0.332377}, + {-0.893450,0.724938}, + {-1.214274,0.674931}, + {0.575030,-1.220913}, + {0.436178,-0.146204}, + {0.255927,-0.642819}, + {0.837765,0.357972}, + {0.413942,0.336704}, + {-0.491814,0.029299}, + {0.577770,-0.709864}, + {0.618412,-0.094846}, + {1.113511,0.720462}, + {-1.276252,-1.169819}, + {-0.221518,0.034718}, + {1.175932,0.480262}, + {-1.089821,-0.091391}, + {-0.050210,0.483209}, + {0.570865,-0.312307}, + {0.218860,-0.555332}, + {0.085193,0.903061}, + {-0.177520,-0.161550}, + {-0.920380,-0.285077}, + {1.144318,-0.822307}, + {-0.443889,-0.246271}, + {1.751176,0.442665}, + {-0.171192,0.036515}, + {1.478796,0.623020}, + {0.988539,-0.047767}, + {-0.656993,1.766078}, + {0.175814,-0.815643}, + {0.621924,0.409207}, + {-0.576310,0.039971}, + {-1.353919,-0.486915}, + {-0.387561,-1.061818}, + {-0.119924,1.290992}, + {-0.230595,-0.112278}, + {-0.740619,-0.035881}, + {0.143479,-1.215912}, + {0.210367,1.334086}, + {-0.308564,-0.243013}, + {-0.152059,-0.489945}, + {-0.321632,0.092499}, + {1.924499,-0.416900}, + {-0.096596,-0.427458}, + {0.269636,0.757454}, + {-0.150174,-0.186291}, + {0.865667,-0.424643}, + {0.370408,0.371389}, + {-0.766370,-0.272893}, + {-0.222344,0.995829}, + {-0.468779,1.033146}, + {-0.149001,0.896831}, + {-0.755959,-1.024279}, + {1.217738,-0.762323}, + {0.534823,0.219960}, + {-0.070087,-0.996893}, + {0.319844,-0.482557}, + {0.360326,-1.036808}, + {0.175977,0.088674}, + {-1.461705,0.208011}, + {0.077773,-0.162524}, + {0.054694,-0.539832}, + {-0.096807,0.513069}, + {-0.100006,0.909039}, + {1.406467,-0.680385}, + {-0.474095,0.657180}, + {-0.266534,-0.258199}, + {-0.155174,0.776743}, + {-0.786856,-1.189942}, + {-0.191945,-0.142069}, + {1.405201,0.141338}, + {0.792400,0.879229}, + {0.517136,-0.068225}, + {-0.073672,0.710877}, + {-0.308993,-0.293807}, + {-0.242238,0.739423}, + {0.319612,1.603955}, + {0.275246,-1.560017}, + {0.990727,0.848362}, + {0.559344,-0.346077}, + {-1.078959,-0.356477}, + {-0.070324,0.894042}, + {-0.528587,0.035779}, + {-1.258713,0.379885}, + {-0.290864,0.053989}, + {-0.225357,-0.508803}, + {-0.752478,-0.581330}, + {0.126417,-0.906446}, + {-0.993092,0.097985}, + {0.016474,1.418872}, + {-0.886978,1.124599}, + {-0.864118,0.032904}, + {0.105550,0.529514}, + {-0.447701,-0.032437}, + {-0.815386,0.312394}, + {1.531759,0.864403}, + {0.463851,-0.299624}, + {1.193057,-0.699033}, + {-0.904051,1.118158}, + {-0.019004,-0.938424}, + {0.479988,-0.435766}, + {0.614927,0.556017}, + {-0.620773,0.176160}, + {-0.040731,-0.961046}, + {1.396722,0.475938}, + {-0.651834,-0.578144}, + {-1.231469,0.391926}, + {0.074102,0.218066}, + {-0.780426,0.939099}, + {0.266873,0.597431}, + {0.035461,-0.147601}, + {-0.041518,-1.551616}, + {-0.652796,0.186071}, + {-0.515741,0.854016}, + {0.260025,-0.565384}, + {-0.507427,-1.442764}, + {1.156603,-0.625163}, + {-0.277430,-0.146397}, + {0.786110,-0.385100}, + {0.187860,0.259149}, + {-0.708870,0.857568}, + {0.258114,-0.517658}, + {-1.593806,1.354268}, + {0.769054,1.115951}, + {-0.320025,0.831390}, + {0.362127,-0.478752}, + {0.463627,-0.562727}, + {0.105345,-0.459347}, + {-1.973697,-0.097140}, + {-0.329367,0.850698}, + {-0.703448,-0.335789}, + {0.450011,1.121062}, + {0.654028,-0.721941}, + {0.397198,0.029445}, + {0.299006,0.140008}, + {-1.278916,-0.883708}, + {-0.442195,0.297563}, + {0.159308,-0.023143}, + {0.282331,-0.269534}, + {1.455855,0.834365}, + {0.520331,-0.449560}, + {-0.163163,0.285191}, + {-0.485547,-0.381264}, + {0.182946,-0.895494}, + {-1.239939,0.220402}, + {-0.161033,-0.885029}, + {-1.573787,-0.436694}, + {0.431696,-0.262095}, + {-0.044572,-0.808512}, + {-1.515339,-0.713970}, + {-0.072136,-0.707279}, + {0.083839,0.736988}, + {0.609676,-0.073344}, + {-0.218284,0.410031}, + {-0.145884,-0.759804}, + {1.449489,0.119417}, + {-0.924116,-0.784971}, + {0.396728,-0.420324}, + {0.442812,0.065814}, + {0.300979,0.512297}, + {0.720141,0.898594}, + {-0.335842,-0.181875}, + {-0.558501,-0.374812}, + {-0.124859,0.840644}, + {-0.457252,-0.211346}, + {-0.502385,-0.919004}, + {-0.681491,0.752273}, + {-0.596193,-1.541557}, + {0.244109,-0.338625}, + {0.598338,-0.141999}, + {-0.132257,0.405104}, + {-0.402130,0.664641}, + {-0.985068,0.337142}, + {0.289973,0.153776}, + {-0.086672,0.267755}, + {-1.157864,1.082877}, + {0.138765,1.203857}, + {0.157440,-0.081841}, + {0.183486,1.244150}, + {-1.021782,-0.631884}, + {-0.147782,-0.684714}, + {0.196621,0.546394}, + {-0.631778,-0.068033}, + {-0.138504,-0.409385}, + {-0.600232,0.098769}, + {-0.817953,0.213884}, + {0.961003,0.245662}, + {0.790531,0.562720}, + {-0.703499,1.039309}, + {0.479667,-1.119048}, + {-0.013366,0.839971}, + {-0.034365,0.640450}, + {-1.399523,0.355804}, + {0.260801,0.147967}, + {0.065808,0.546078}, + {-0.347448,0.098553}, + {0.821639,0.246355}, + {-1.628820,-0.597563}, + {-0.248049,0.428404}, + {-0.053644,1.339589}, + {-0.477780,-0.236885}, + {0.582341,-0.895865}, + {0.551673,-0.940215}, + {0.810823,0.355256}, + {-0.718213,-0.553310}, + {0.761180,-1.567887}, + {-1.354477,0.587993}, + {-0.280057,0.265041}, + {-0.485069,-0.830335}, + {-0.898486,-0.123829}, + {-0.065445,-0.810844}, + {-0.075952,0.012324}, + {0.489889,-0.201254}, + {0.502262,-0.204768}, + {0.228861,0.614161}, + {0.686882,0.221387}, + {-0.191478,-0.314977}, + {-0.163156,0.201862}, + {0.981396,-0.176446}, + {0.031663,0.040162}, + {0.765293,0.204843}, + {-1.423840,0.580181}, + {0.661978,-0.453962}, + {-0.198973,-0.676154}, + {0.975239,0.071402}, + {0.514612,1.173023}, + {0.395354,-0.237298}, + {0.218742,-0.040218}, + {1.092119,0.149444}, + {-0.066491,1.171302}, + {0.600378,-0.193844}, + {-0.522677,-0.422476}, + {-0.450177,-0.922771}, + {0.814332,0.819734}, + {0.611399,0.414148}, + {-0.102235,1.090889}, + {0.172764,0.367310}, + {-0.386690,0.711734}, + {-0.308570,0.399715}, + {-0.067773,0.037268}, + {0.897905,-0.893449}, + {0.499070,-0.204820}, + {1.054001,0.253654}, + {-1.022458,-0.025210}, + {0.791977,-0.988702}, + {0.083416,-0.657610}, + {-0.203881,-0.187619}, + {1.728950,0.829113}, + {-0.980056,0.458782}, + {-0.475889,-0.471833}, + {-0.597087,-0.425042}, + {1.065324,0.775118}, + {0.503802,-0.715574}, + {0.017682,-0.631690}, + {-0.846011,-0.086879}, + {-1.073453,-0.572789}, + {0.668645,0.492660}, + {0.202993,0.029645}, + {-0.464086,0.246619}, + {-0.899470,-0.353428}, + {0.399672,-0.546029}, + {-0.121598,1.584198}, + {0.616540,0.126347}, + {1.654014,-0.991907}, + {0.329572,-0.377064}, + {-0.771268,0.203136}, + {0.866739,-0.212090}, + {-0.105599,0.598985}, + {0.124672,0.816280}, + {0.148568,-0.916659}, + {0.156576,-0.534549}, + {0.963588,1.376216}, + {0.514055,-0.130478}, + {-0.228784,0.663864}, + {0.478723,-0.412546}, + {-0.851050,-1.062536}, + {0.424482,0.064766}, + {-0.229494,0.000992}, + {1.328704,-0.161219}, + {-0.001671,1.095202}, + {0.127424,0.140526}, + {0.072691,0.881068}, + {-0.449420,-1.174092}, + {-0.002478,0.730130}, + {-0.264893,1.106372}, + {-0.113501,0.098044}, + {0.445563,-1.652426}, + {-0.648095,-0.615132}, + {-0.791597,0.312268}, + {-0.592599,0.128912}, + {0.193724,-0.027621}, + {-0.246776,1.475506}, + {0.154953,0.056356}, + {-0.256764,-0.209585}, + {1.243059,0.094700}, + {-1.263590,1.488868}, + {-0.715768,1.026954}, + {-0.069072,-0.394451}, + {-0.054306,0.165971}, + {-0.905233,0.403129}, + {-0.220554,-0.122628}, + {0.364791,0.286679}, + {0.785926,-0.769723}, + {-0.735274,2.193241}, + {1.277747,0.699746}, + {0.279424,0.904941}, + {-0.202973,0.086592}, + {-0.778679,-0.431290}, + {0.160730,-0.785100}, + {-0.503414,-0.322093}, + {0.592752,-0.398302}, + {-0.224174,0.376569}, + {-0.504882,0.240802}, + {0.639766,0.479862}, + {-0.548174,0.076778}, + {0.839506,-1.051851}, + {-0.614694,0.201207}, + {0.946087,0.430684}, + {-0.128392,0.666809}, + {0.392418,0.875509}, + {-0.468207,-0.038870}, + {-0.222987,-1.094249}, + {-0.745045,-0.662640}, + {-0.282590,-0.848140}, + {0.273818,-0.451490}, + {-0.107371,0.883462}, + {1.090884,-0.618116}, + {0.320881,-0.288501}, + {-0.802570,-0.344983}, + {0.293442,0.998732}, + {-0.027360,0.016971}, + {-0.520384,1.021780}, + {-1.029293,0.643514}, + {0.544240,-0.294024}, + {0.814885,0.293088}, + {-0.217184,-1.607462}, + {1.042856,-0.193162}, + {-0.482617,0.001200}, + {1.290766,0.396281}, + {0.541096,0.190732}, + {-0.185152,0.422218}, + {-0.395013,-0.856063}, + {0.129098,-0.208842}, + {-1.216610,0.501032}, + {-0.578368,-0.077011}, + {-0.142931,-0.107519}, + {-0.049935,-1.347985}, + {-0.169092,-0.532516}, + {0.473700,-0.739075}, + {-0.372626,-0.612488}, + {0.695860,0.589931}, + {0.090898,0.189706}, + {1.451253,0.155602}, + {0.630673,1.074650}, + {0.523568,1.240808}, + {-0.333037,-1.525041}, + {0.828902,0.384816}, + {0.705692,-0.123515}, + {-0.161236,-1.091553}, + {-0.905419,1.093307}, + {-0.353888,-0.534408}, + {0.604700,-1.082505}, + {0.014201,-0.516866}, + {-2.169492,1.453974}, + {1.951017,0.818724}, + {0.494091,-0.791937}, + {0.118409,-0.206657}, + {1.085713,0.213897}, + {0.301931,-0.566131}, + {-0.259674,0.527941}, + {0.980986,0.596725}, + {-0.596668,-1.134933}, + {0.625839,0.458710}, + {-0.334225,-0.120566}, + {1.771062,-1.026789}, + {0.151459,-1.012159}, + {-0.330544,0.845122}, + {-1.728633,-1.435125}, + {0.140577,-0.610380}, + {0.822159,0.635061}, + {-0.201738,0.393073}, + {0.440206,-0.257053}, + {0.260232,-0.046157}, + {-0.020715,0.469076}, + {-0.449526,-0.525654}, + {1.069078,1.418019}, + {-0.433268,-0.165652}, + {-0.085426,-0.660526}, + {-0.843452,-1.075621}, + {0.160153,-0.609560}, + {0.532025,-0.402982}, + {1.053319,-0.606113}, + {-0.912064,0.532538}, + {0.288336,-0.224900}, + {1.049554,-0.798748}, + {0.062931,0.248464}, + {1.171278,-0.296591}, + {-0.258426,-0.410351}, + {0.945094,0.478489}, + {-1.461804,1.046522}, + {-0.633659,0.358206}, + {0.250690,1.106278}, + {0.430452,-0.309765}, + {-0.308992,0.553894}, + {0.779977,0.398830}, + {-0.294969,0.376904}, + {0.220612,0.065218}, + {-0.920859,-0.345626}, + {0.187574,0.099608}, + {-1.349871,-0.183671}, + {0.130552,0.361476}, + {-0.141677,0.506033}, + {0.618300,1.618166}, + {0.475492,0.079416}, + {0.714330,-0.370986}, + {-0.573479,0.180490}, + {-0.137712,-0.060913}, + {0.515423,-0.368048}, + {0.244133,1.174597}, + {-0.525398,0.663225}, + {0.578443,-0.543669}, + {1.201958,0.923160}, + {-0.111823,-0.487590}, + {-0.073718,0.190523}, + {0.649657,-0.659715}, + {-0.409310,0.134954}, + {-1.326234,-1.272925}, + {1.305404,0.226864}, + {-0.392474,-0.933792}, + {-0.007464,-1.287274}, + {-0.446668,-0.005931}, + {0.098037,-1.037468}, + {1.342139,0.517189}, + {0.428876,0.529115}, + {0.527585,-0.589122}, + {0.132382,0.288948}, + {-0.088091,-0.529385}, + {-0.211020,0.106296}, + {-0.618083,-0.302373}, + {1.818536,0.685940}, + {-0.922613,-0.342791}, + {-1.840156,0.792622}, + {-0.553622,-0.586101}, + {0.623642,-1.195093}, + {-1.132636,0.579581}, + {0.093510,-0.770117}, + {-0.885828,-1.187070}, + {-0.293717,-0.805523}, + {0.400295,-0.348303}, + {0.607811,-0.144559}, + {-0.692936,-0.145218}, + {0.725639,-0.758167}, + {-0.143427,-1.162858}, + {0.782318,-0.861163}, + {-0.606077,-0.183103}, + {0.022532,-0.331872}, + {-0.240756,-1.411801}, + {0.278457,0.187169}, + {0.424589,0.760281}, + {0.483186,-0.084917}, + {-1.213938,-0.432077}, + {-0.429109,0.225001}, + {0.175712,0.073672}, + {1.027955,0.430115}, + {-0.106412,-1.172744}, + {-0.400012,0.691001}, + {0.488778,0.654797}, + {0.674586,0.222262}, + {-0.040199,0.757857}, + {0.335755,-0.779464}, + {-0.011836,0.511340}, + {-0.287985,0.242453}, + {-0.323989,-0.022321}, + {-1.788818,-0.594621}, + {-0.126588,-0.670139}, + {-0.582553,-0.282272}, + {-0.172383,-1.483735}, + {0.097068,0.374952}, + {1.145251,-0.041021}, + {-0.661188,-0.015538}, + {0.478935,-0.798933}, + {0.483136,-0.932957}, + {-0.692102,0.831164}, + {0.387143,-0.210910}, + {-0.369834,-0.499064}, + {-0.552389,0.968678}, + {0.706835,0.672863}, + {0.884666,-1.374115}, + {-0.892116,-0.645080}, + {0.212438,-0.363604}, + {0.120562,0.094899}, + {-0.607090,0.509514}, + {0.391938,-0.197226}, + {1.477689,-0.894952}, + {0.067956,0.305202}, + {-0.377072,-1.118688}, + {0.238509,-0.640692}, + {0.985068,-1.082955}, + {1.406457,0.016522}, + {-0.195835,0.951245}, + {-0.668623,0.196354}, + {0.629538,-0.359206}, + {-2.110332,-0.600784}, + {0.218971,-0.422251}, + {0.327340,-0.702791}, + {-0.506006,-0.186140}, + {0.342203,0.477097}, + {-0.211730,-0.864108}, + {-0.065807,0.211029}, + {-0.227760,0.316405}, + {0.086344,0.613594}, + {0.237860,1.320884}, + {0.473216,-0.549211}, + {0.498238,-0.583895}, + {0.286832,0.326195}, + {-0.476474,0.218899}, + {-0.563894,0.557927}, + {0.272322,0.469703}, + {-0.749019,-0.736560}, + {0.161585,0.085403}, + {0.056852,0.115904}, + {-0.388830,-0.672548}, + {0.884869,-0.590201}, + {0.566593,0.608661}, + {-0.516091,-0.918691}, + {1.642885,1.310890}, + {0.696677,0.124297}, + {0.445759,2.250527}, + {0.322959,0.688997}, + {0.016110,-0.780982}, + {1.171736,0.361072}, + {1.343905,1.272841}, + {0.592350,0.019416}, + {0.152619,-0.147421}, + {-0.704640,0.341073}, + {1.099323,-0.430740}, + {-0.840177,-0.697932}, + {-1.442964,0.718412}, + {0.164263,0.523929}, + {-0.111350,-0.289444}, + {1.050958,0.639940}, + {-0.763601,-0.206712}, + {-0.631193,-0.041356}, + {0.663994,0.322670}, + {-0.258825,1.093934}, + {0.337754,-0.472584}, + {-0.618973,0.215902}, + {0.770590,-1.183008}, + {1.114851,-0.199457}, + {1.027480,1.933290}, + {-0.609203,1.103349}, + {-0.541345,0.547887}, + {0.276828,-0.095631}, + {1.215758,-0.061026}, + {-0.865888,-0.313945}, + {0.134350,-0.986536}, + {0.333627,0.278205}, + {0.229353,-0.313560}, + {0.822267,-0.147288}, + {1.790442,-0.772786}, + {0.614975,-0.867141}, + {0.824009,-0.340756}, + {0.242416,0.525339}, + {-0.913436,1.352899}, + {0.085737,0.921626}, + {0.600046,0.518829}, + {0.840608,-0.399042}, + {0.744769,0.036632}, + {-0.040337,0.836790}, + {0.069399,0.963537}, + {0.190218,-1.028734}, + {0.357859,-0.557734}, + {-0.160823,-0.761802}, + {0.679527,0.810942}, + {-0.334324,0.388009}, + {0.635341,-0.443085}, + {1.119667,1.031693}, + {0.702179,-0.010668}, + {0.687804,0.335793}, + {-1.218997,0.360120}, + {-0.015499,0.167078}, + {0.772188,-0.754889}, + {1.119482,0.633941}, + {0.789910,-0.165533}, + {-0.352196,-0.008508}, + {0.863554,0.258157}, + {0.200500,0.053978}, + {-0.201635,0.202142}, + {-0.195493,0.605893}, + {-0.351966,-0.907111}, + {-0.185199,-1.375999}, + {-0.288755,0.112778}, + {-0.601478,0.546465}, + {-0.254146,0.433599}, + {1.287544,0.188691}, + {0.748493,0.772074}, + {-0.185359,-0.704725}, + {0.297589,-0.523805}, + {-1.228142,0.231061}, + {-0.238207,-1.513225}, + {-1.093305,-0.811754}, + {-1.360744,-0.232347}, + {0.770614,2.942337}, + {-1.054750,-0.772966}, + {0.639057,-0.927998}, + {-0.300836,-0.163147}, + {-0.393160,-0.264180}, + {-0.502845,1.088386}, + {-0.790613,0.905711}, + {-0.312306,-0.234891}, + {0.024799,0.486804}, + {-0.059798,1.341482}, + {-0.463482,0.141503}, + {-0.142495,0.482216}, + {-0.584915,0.774424}, + {0.727377,0.857342}, + {-0.250533,-0.538912}, + {-0.708249,-0.711566}, + {-1.633626,-0.948018}, + {-0.654737,0.568716}, + {-0.452462,0.609938}, + {0.103789,0.356140}, + {-0.028716,0.443183}, + {1.028940,0.846843}, + {-1.932886,-0.497384}, + {-0.029238,-0.196571}, + {0.059763,-0.375114}, + {-0.336361,-0.329419}, + {0.088773,-0.164776}, + {0.765711,0.371364}, + {0.204439,0.390603}, + {-0.110530,1.504023}, + {-0.431800,0.089282}, + {-0.819449,-0.350066}, + {-0.974220,0.564947}, + {0.125759,0.339755}, + {0.317493,-0.006911}, + {-1.013535,-0.202630}, + {0.112258,0.117162}, + {-0.531978,0.042502}, + {-0.940156,0.121649}, + {-0.725521,0.466195}, + {-0.416124,0.485405}, + {0.336967,0.057276}, + {-0.421566,-0.168387}, + {-0.015320,0.831380}, + {-1.056343,-0.068795}, + {0.549310,-1.282829}, + {-0.194868,0.315490}, + {0.003948,-0.561034}, + {0.479671,-0.065741}, + {-0.425547,0.760606}, + {0.488399,-0.579394}, + {-0.424074,-0.366667}, + {0.044047,1.152952}, + {-0.830197,-0.460495}, + {-0.814327,0.057209}, + {1.553867,-0.219049}, + {0.774422,0.590411}, + {0.363240,-0.485420}, + {0.185316,0.168755}, + {-0.564670,-0.244371}, + {0.792661,-0.638865}, + {-0.024050,-0.436980}, + {1.350849,-0.888220}, + {-0.143934,0.300172}, + {0.586975,0.568336}, + {-0.081438,-0.547728}, + {0.492427,0.008414}, + {0.215698,-0.171356}, + {0.462206,0.692607}, + {-0.431732,-0.509402}, + {-1.299840,-1.348103}, + {-0.738818,-0.011450}, + {-0.193146,-1.086403}, + {0.998385,-0.142121}, + {-0.217947,-0.430734}, + {-0.035329,-1.851256}, + {-0.353180,0.927875}, + {0.107119,0.623563}, + {0.012206,-0.271749}, + {-0.307655,0.692549}, + {-0.622138,-0.761409}, + {0.442970,-0.480029}, + {0.796093,0.551437}, + {0.009668,-0.449114}, + {-0.116923,-0.003272}, + {0.747452,0.198782}, + {1.585947,-0.584168}, + {0.062659,-2.154515}, + {-1.470887,-0.702686}, + {-0.377002,-0.215950}, + {-1.380013,0.062652}, + {0.664140,0.181371}, + {1.034914,1.310640}, + {0.810257,-0.623334}, + {0.768412,-0.116447}, + {-0.043917,1.459535}, + {-0.441852,-0.598940}, + {0.028953,-0.184729}, + {-0.076069,0.867122}, + {-0.752365,-0.121888}, + {0.348209,-0.710583}, + {1.006050,-0.709281}, + {0.321016,0.506845}, + {-1.004044,0.592095}, + {1.476868,1.249852}, + {0.404023,-0.215948}, + {-0.786363,0.092388}, + {0.312994,-1.676486}, + {0.877315,0.390367}, + {0.304297,1.872417}, + {0.488998,-0.499786}, + {0.018221,-0.372451}, + {-1.630813,0.961882}, + {-0.677563,0.211437}, + {-0.795802,0.135461}, + {0.520392,0.265735}, + {0.785026,0.446039}, + {-0.362354,-0.016902}, + {-0.318927,-0.455923}, + {-0.333291,0.675215}, + {-1.334583,0.593424}, + {1.430517,-0.375052}, + {-0.502683,-0.736192}, + {-0.710810,-0.141498}, + {-0.252294,0.092360}, + {0.626259,-0.169977}, + {-0.267358,-0.042655}, + {0.193435,0.364396}, + {0.847771,-0.951427}, + {-0.521408,0.066863}, + {1.582067,-0.274576}, + {-0.618104,0.064801}, + {0.613930,-0.093315}, + {0.117743,0.435939}, + {1.262775,0.798231}, + {-0.609864,0.402638}, + {-0.433813,-0.204178}, + {0.343590,-0.619007}, + {-0.178302,0.528886}, + {0.558275,-0.569073}, + {-0.158423,-0.646560}, + {0.527513,0.661901}, + {-0.991489,0.090190}, + {-0.352216,-0.296703}, + {-0.809827,-0.667036}, + {-0.509143,0.613069}, + {-0.175233,0.802702}, + {-0.393206,-0.142194}, + {0.443495,-0.739842}, + {-0.493505,-0.346109}, + {0.291099,0.973915}, + {-0.121100,-0.623550}, + {0.464915,-0.564442}, + {-0.544471,0.680835}, + {-0.476296,0.594486}, + {-0.646494,-0.116102}, + {-0.912840,0.857731}, + {0.608502,0.100114}, + {0.831568,-1.091763}, + {0.233161,0.780343}, + {-0.197179,0.037707}, + {-0.367386,-0.575712}, + {-0.755259,0.477536}, + {0.467144,-0.619239}, + {-0.321884,0.010948}, + {0.452682,0.145276}, + {-0.220426,-0.550002}, + {-0.256978,0.137362}, + {0.680658,-0.565345}, + {-1.750026,-0.017867}, + {-0.323665,-0.262173}, + {-0.097985,0.422237}, + {-1.404647,-0.993924}, + {-0.588194,0.571803}, + {-1.200961,0.921556}, + {0.193916,2.152188}, + {1.013266,-0.106129}, + {0.235823,2.080106}, + {-0.108434,-0.729457}, + {-0.408723,-0.348886}, + {-0.302859,1.484877}, + {-0.312681,-0.505828}, + {0.018735,-0.122920}, + {0.355886,-0.484280}, + {-0.135969,0.761103}, + {0.390779,1.771250}, + {-0.145102,-1.388635}, + {-0.416709,-0.621879}, + {0.126479,-0.899692}, + {-1.448828,0.318005}, + {0.672198,0.308803}, + {-1.764904,0.014698}, + {0.467586,0.731148}, + {-0.866142,-0.129121}, + {1.095405,1.415374}, + {-0.288686,1.532333}, + {-0.694974,-0.572545}, + {-0.296954,-0.918548}, + {0.185017,-0.335333}, + {0.106725,-0.810778}, + {-0.266406,-0.574720}, + {1.024931,0.523381}, + {0.111210,1.033764}, + {1.104428,0.317206}, + {0.138012,-0.485474}, + {-0.075850,-0.936313}, + {-0.691784,0.547524}, + {-0.960452,-0.600781}, + {-0.806045,-0.461982}, + {1.408073,-0.255135}, + {0.150425,-0.658298}, + {0.240710,-0.413124}, + {0.206125,1.431848}, + {-0.706788,-0.747984}, + {0.209810,0.344959}, + {0.940145,1.819041}, + {-0.423045,1.613672}, + {0.691372,0.408910}, + {0.291379,1.694717}, + {-0.022473,-0.483715}, + {1.506409,-0.487754}, + {-0.950211,0.174272}, + {0.437884,0.334518}, + {-0.059121,-0.187999}, + {-0.706148,0.532011}, + {1.247993,-0.173918}, + {0.403025,-0.456743}, + {0.101642,-0.201338}, + {0.220295,0.098694}, + {-0.544353,-1.008343}, + {0.706586,-0.476523}, + {0.291079,-0.150127}, + {-0.041337,-0.659792}, + {-0.493954,-0.757686}, + {-0.198818,-0.425300}, + {0.765368,-0.713655}, + {0.129659,-0.656772}, + {0.752741,0.605671}, + {0.059329,1.098435}, + {-0.095906,-1.236300}, + {-0.192572,-0.654089}, + {0.060002,-0.407818}, + {1.023894,-0.192512}, + {-0.012820,-0.526931}, + {-0.853581,-0.349135}, + {0.422981,-0.199832}, + {-0.884115,-1.022837}, + {0.051870,2.156258}, + {0.511633,0.370017}, + {1.100921,0.287222}, + {-1.091726,-0.326993}, + {1.065161,-0.088250}, + {1.295012,0.347661}, + {-0.186661,0.274683}, + {0.453460,0.453078}, + {-0.019832,-1.655232}, + {0.033441,-0.077400}, + {0.083820,-0.808385}, + {0.161770,1.034907}, + {-0.408970,0.435216}, + {0.710238,0.172596}, + {0.070505,0.071455}, + {-0.157619,1.133331}, + {0.934837,0.290817}, + {-0.142153,-1.033463}, + {-0.805522,-0.609104}, + {-0.713519,0.333743}, + {0.766007,0.180658}, + {-0.210227,-0.404890}, + {-1.432711,0.510194}, + {-1.527153,-0.138670}, + {-1.413773,-1.392381}, + {1.162048,-1.121023}, + {0.375536,0.334633}, + {0.277678,0.377802}, + {0.353273,-0.438537}, + {-0.000468,0.519358}, + {-1.862624,-0.213202}, + {0.231657,-0.206180}, + {0.579498,1.438150}, + {-0.818714,0.244540}, + {-0.414526,-0.963580}, + {1.434481,-0.200950}, + {-0.706870,-0.490200}, + {-0.445819,0.232220}, + {0.014789,0.903088}, + {0.823644,0.019996}, + {-0.257175,1.092355}, + {0.233427,1.236390}, + {-1.569737,0.596411}, + {0.289963,-0.304775}, + {-0.652898,-0.307950}, + {0.677093,0.468114}, + {0.199346,-0.368715}, + {-0.122099,-0.856128}, + {0.527088,-0.699184}, + {0.098459,-0.383729}, + {0.127642,0.100256}, + {-0.743423,-0.133080}, + {-1.904618,-0.208222}, + {-0.311420,0.441420}, + {0.314336,-0.480474}, + {-0.822712,-0.862232}, + {-0.009480,1.146566}, + {-0.001370,-0.736855}, + {-0.643167,-0.430793}, + {-1.377535,0.367134}, + {0.117747,-0.018534}, + {0.118661,-0.605605}, + {-0.428251,0.078424}, + {-0.755322,0.026743}, + {0.108427,-0.429369}, + {-0.546590,-0.242576}, + {-1.123375,0.034104}, + {-0.178010,0.215736}, + {0.555579,-0.157472}, + {0.008256,-1.040877}, + {0.300994,0.502246}, + {-0.596434,-0.574450}, + {0.650520,-0.251038}, + {-1.202669,0.119406}, + {1.207843,-0.367324}, + {-0.839307,-0.511398}, + {-1.142954,0.350094}, + {1.745947,-0.663306}, + {-0.197524,-0.058007}, + {0.604840,0.358341}, + {-0.629763,-1.061339}, + {0.714119,-0.671946}, + {-0.957979,0.108516}, + {-0.204673,-0.841928}, + {-0.224796,1.403409}, + {0.057728,-0.276108}, + {0.022420,0.907590}, + {-0.442873,-0.197745}, + {0.070502,0.367408}, + {1.111314,-0.115300}, + {-1.214722,0.435263}, + {-0.623381,-0.183199}, + {0.842462,0.271952}, + {0.223962,-0.253993}, + {0.784241,-0.623105}, + {-0.460386,0.244667}, + {0.057513,-0.844943}, + {0.252052,1.072527}, + {0.045339,0.090347}, + {-1.550655,-0.849565}, + {0.698342,1.719761}, + {0.625755,-0.059108}, + {0.461099,0.873655}, + {-0.178899,-0.905113}, + {0.378758,0.050943}, + {-0.024118,0.005723}, + {0.139377,-1.441619}, + {0.746170,-0.864942}, + {2.244304,0.225823}, + {0.941294,0.456267}, + {0.681838,0.479907}, + {0.555077,0.448809}, + {0.113034,0.326665}, + {0.290276,-0.323618}, + {-0.310803,-0.740078}, + {0.288215,0.147328}, + {0.122018,-0.901168}, + {1.102202,-1.702754}, + {-0.681899,1.076125}, + {-0.823461,-0.531651}, + {0.608237,-0.372707}, + {-0.681661,-0.191809}, + {0.079867,-1.266244}, + {-0.317741,-0.703671}, + {0.034086,0.942178}, + {0.168887,0.177944}, + {-0.613740,0.025035}, + {1.089925,0.392534}, + {0.075943,0.040485}, + {0.566377,-0.156880}, + {0.660386,0.045064}, + {-0.906557,0.350211}, + {-0.616084,0.671656}, + {-0.353653,-0.928423}, + {1.334011,-0.377983}, + {0.733590,0.190001}, + {-0.583415,-0.285064}, + {1.339272,0.266120}, + {-0.537001,-0.258520}, + {-0.448141,-0.050157}, + {0.740691,0.648732}, + {1.056314,-0.629005}, + {-1.160330,0.410656}, + {0.633715,-0.113482}, + {0.220648,-0.289338}, + {-1.356221,-1.047442}, + {-0.799830,-0.402114}, + {-0.855423,-0.218579}, + {0.533292,-0.955058}, + {-0.590952,-0.359871}, + {-1.003588,-0.950145}, + {0.031010,-0.073887}, + {-0.970717,0.112552}, + {0.905541,0.082191}, + {1.109198,0.621634}, + {0.061115,-0.182655}, + {0.519211,0.584771}, + {0.453454,1.105118}, + {0.307900,-0.290329}, + {-1.310764,-1.192390}, + {-0.990446,-0.449249}, + {-0.636245,-1.136897}, + {0.194571,-0.105070}, + {0.972256,0.693447}, + {-0.291198,1.374025}, + {0.144387,1.382765}, + {-0.101333,-0.022509}, + {-0.474852,0.062917}, + {-0.543704,-0.461692}, + {0.714138,-0.106485}, + {0.040096,0.285104}, + {0.590028,1.369938}, + {0.501543,-0.043429}, + {2.614600,1.102147}, + {0.255439,-1.183224}, + {-1.069301,0.552063}, + {0.505847,0.666774}, + {0.018523,2.289326}, + {-0.261409,-0.381025}, + {-0.633168,-0.802063}, + {-0.221651,-0.314856}, + {0.314198,1.603044}, + {1.173064,1.017943}, + {-0.665682,-0.159433}, + {-1.758748,-0.064417}, + {1.147580,0.950364}, + {0.550126,-0.366558}, + {0.065759,0.113614}, + {0.956481,1.179104}, + {0.433038,-0.684553}, + {-0.367835,-0.136092}, + {-1.108652,-0.501821}, + {0.014093,-0.724897}, + {0.474274,0.071691}, + {-0.878852,-0.454418}, + {-0.111987,0.397469}, + {0.980863,0.508451}, + {0.567833,-0.325126}, + {0.117299,-0.350239}, + {0.496458,-0.149528}, + {-0.712447,0.404552}, + {0.050514,-0.370253}, + {0.209666,-0.591714}, + {-0.392540,-1.209119}, + {-0.075244,0.496292}, + {-0.294131,-1.102998}, + {-0.209255,0.078796}, + {0.109577,-0.306647}, + {-0.214269,0.731213}, + {1.862247,0.688064}, + {-0.992337,0.128817}, + {0.056261,2.006550}, + {-0.259084,0.729512}, + {0.491870,-0.795017}, + {0.176987,0.094347}, + {-0.319391,0.300136}, + {-0.069294,-0.021210}, + {1.038121,-1.099239}, + {1.734655,-0.131408}, + {0.361025,1.818288}, + {-0.758635,-0.906905}, + {1.433721,-0.082347}, + {-0.327756,-1.150218}, + {0.449566,0.413723}, + {0.983053,-0.867287}, + {-0.937329,-0.376043}, + {-0.126866,-0.124008}, + {-0.438458,-0.453466}, + {-0.101627,0.012617}, + {0.582181,-0.133631}, + {0.121428,-0.222195}, + {-0.608804,0.004610}, + {-0.280329,-0.071507}, + {0.776663,-0.049369}, + {0.603737,-0.528278}, + {-1.155587,0.324328}, + {-1.123362,-0.454602}, + {0.767449,-0.921822}, + {-0.352388,-0.357436}, + {0.309848,0.070129}, + {-0.656513,-0.652553}, + {-0.381851,0.355358}, + {0.495213,0.523033}, + {1.153773,1.092873}, + {0.668633,-0.859082}, + {-0.746353,-0.312026}, + {1.048775,0.535930}, + {0.279033,-0.054578}, + {-0.111243,-0.422662}, + {-0.136422,0.053799}, + {-0.056102,0.342915}, + {-1.088014,-0.730922}, + {0.878624,-0.890989}, + {-0.729911,-0.058834}, + {-1.333908,-1.160115}, + {-0.684287,-0.253154}, + {-1.079448,-0.270283}, + {0.151333,-1.649204}, + {0.253875,0.108594}, + {0.235712,0.387503}, + {-0.899825,0.496213}, + {-0.610484,-0.533034}, + {0.496822,-0.243569}, + {-0.524167,0.235972}, + {-1.610220,-0.155522}, + {-0.796686,1.243795}, + {-0.581308,-0.236754}, + {-0.209195,-0.037144}, + {0.184881,-0.083576}, + {0.396540,-0.490520}, + {0.508980,1.096300}, + {-0.094454,0.369221}, + {0.680896,1.252947}, + {-0.440938,-0.853486}, + {-0.157199,-1.304081}, + {-1.447599,0.971928}, + {0.626587,0.396517}, + {0.836229,0.966611}, + {1.381874,-0.246085}, + {-0.414028,-0.280956}, + {0.980019,-0.334138}, + {-1.644429,-0.389069}, + {0.225519,0.368235}, + {1.116159,-0.726131}, + {-0.733320,0.355245}, + {0.988265,-1.747007}, + {0.840822,0.138793}, + {-0.117871,0.688465}, + {0.657025,0.157528}, + {-0.117520,0.629271}, + {-0.645882,-0.938485}, + {0.980639,0.197481}, + {0.320092,-0.621575}, + {1.315216,0.186380}, + {-1.150480,-1.020916}, + {1.148288,-0.445450}, + {-0.049133,0.097262}, + {0.210559,-0.338083}, + {-0.164647,1.698560}, + {-0.134143,-0.581370}, + {-0.100706,0.043457}, + {-0.251067,-0.907292}, + {0.551859,-0.013725}, + {0.299242,-0.340345}, + {-0.247395,1.075102}, + {-0.032695,-1.479628}, + {0.250204,0.334675}, + {0.859668,-0.605057}, + {0.362075,0.166596}, + {0.432570,-0.747261}, + {0.674745,-0.020640}, + {0.361038,0.375811}, + {0.009795,0.744204}, + {-0.437627,-0.150132}, + {-1.149837,0.074239}, + {-0.717292,-1.450907}, + {1.485412,0.238923}, + {-0.577879,-0.010250}, + {0.641200,-0.964459}, + {-0.088981,0.206840}, + {0.593610,-0.502221}, + {-1.008813,0.283182}, + {-0.009605,-0.090918}, + {-1.338922,0.333185}, + {-1.074846,-1.517178}, + {0.539697,-0.906593}, + {0.275416,-0.647435}, + {1.139667,1.074978}, + {0.070698,-0.375933}, + {0.008435,1.196329}, + {-0.222550,0.250323}, + {0.275090,-0.128200}, + {0.279230,0.576149}, + {-0.362237,0.693913}, + {-0.614259,0.504714}, + {0.812049,-1.100580}, + {-0.370461,0.966923}, + {1.198670,-0.644836}, + {-0.031461,0.128519}, + {-0.122097,0.053159}, + {1.315332,-1.008152}, + {-0.754167,-0.305309}, + {-0.485979,0.476556}, + {0.823664,1.071616}, + {-0.183654,-0.551620}, + {0.748615,0.994233}, + {-0.119972,0.065139}, + {-0.849627,-1.159702}, + {-0.444765,0.256956}, + {0.209474,-0.472828}, + {-0.525549,-1.027303}, + {1.757616,0.445698}, + {0.160525,0.088103}, + {0.435382,0.227305}, + {0.218477,0.170341}, + {-0.580507,-0.450303}, + {0.398378,0.017052}, + {-0.031351,-0.247548}, + {-2.316506,-1.483557}, + {-0.443973,-0.691774}, + {-0.510807,0.699816}, + {-1.037649,0.345879}, + {-1.257505,0.629094}, + {-0.000852,-0.321557}, + {-0.373482,-0.402662}, + {-0.022826,-1.218651}, + {0.025138,0.767667}, + {0.356935,-1.465306}, + {-0.020640,-0.323252}, + {0.602591,-0.289913}, + {0.046297,0.283469}, + {-0.283535,-0.047672}, + {-0.166785,-0.277583}, + {-2.385793,1.082178}, + {-0.050855,0.483435}, + {-0.239055,-0.165545}, + {0.505107,0.359352}, + {-0.855951,-1.185629}, + {-0.394709,0.226833}, + {1.257326,-0.916278}, + {-0.745575,-0.046165}, + {-2.243851,-0.696840}, + {0.551393,0.147983}, + {0.291053,-0.204270}, + {0.161488,-0.475875}, + {-0.528262,0.575247}, + {-0.986426,0.773656}, + {-0.744878,-0.909927}, + {0.320911,0.629702}, + {-0.323660,-0.506678}, + {0.028159,-0.259382}, + {0.460460,-0.163144}, + {-0.813206,-0.350558}, + {1.044790,0.293066}, + {-0.132596,1.665505}, + {0.395208,-1.153663}, + {0.924725,-0.269132}, + {-0.982288,-0.672640}, + {0.021874,0.182806}, + {0.249894,0.425458}, + {-0.636470,-0.070118}, + {0.024546,-0.394318}, + {-0.114422,-0.016105}, + {0.604817,0.799636}, + {0.172222,0.798172}, + {-0.091129,0.328291}, + {0.590852,1.199025}, + {-1.487713,0.087366}, + {-1.108675,-0.555536}, + {-0.692600,0.090637}, + {0.911874,0.392273}, + {0.402013,0.091871}, + {-2.169173,0.338864}, + {0.067482,-1.073878}, + {-0.036547,1.460194}, + {0.266305,0.645196}, + {0.003120,0.423355}, + {-0.238731,0.052394}, + {-1.065448,-0.598678}, + {0.055241,0.168619}, + {0.562618,1.551298}, + {-0.301688,-0.337400}, + {0.547448,0.323789}, + {0.788771,0.516224}, + {0.132486,0.681322}, + {-0.323760,-0.904475}, + {-0.871126,-0.916061}, + {-1.544630,0.204207}, + {-0.082182,0.441189}, + {-0.325721,0.084840}, + {-0.000671,-0.910962}, + {-1.548705,-0.305130}, + {1.464460,1.600289}, + {-1.349656,0.526047}, + {-1.552741,0.906982}, + {-0.519449,-0.233318}, + {0.355732,0.331088}, + {-0.489145,0.230703}, + {-0.970139,0.363476}, + {-1.624033,-0.509895}, + {0.174146,0.821782}, + {0.724604,-1.376511}, + {1.393602,-0.607327}, + {-0.510112,1.657338}, + {0.015431,-0.001536}, + {-0.130508,-1.555322}, + {0.000549,-0.198261}, + {0.311467,1.081502}, + {0.243611,-1.360408}, + {-0.894903,-0.713205}, + {0.388720,-0.109925}, + {0.521072,0.398730}, + {0.574843,0.157766}, + {-0.617189,-0.437769}, + {-0.211497,0.748437}, + {0.702855,0.433536}, + {0.432827,-0.382179}, + {0.447150,1.156332}, + {-0.241624,0.581731}, + {1.292169,0.119941}, + {0.294642,-0.871407}, + {0.078200,-0.381604}, + {1.032330,0.908219}, + {0.814741,-0.010627}, + {-0.355983,-0.219502}, + {-0.243898,-0.682654}, + {0.635359,-1.737373}, + {-0.107756,-0.345466}, + {-1.263305,-0.370563}, + {0.175980,0.376202}, + {1.108166,-0.738982}, + {-0.840360,-0.285063}, + {-0.324492,-0.354966}, + {0.478240,0.505811}, + {0.319641,0.856630}, + {-0.332756,0.510426}, + {2.005001,0.405899}, + {0.155406,-1.227927}, + {0.289207,0.937761}, + {0.051751,-0.221727}, + {0.149748,0.268723}, + {-1.025125,0.344019}, + {0.582839,-0.321769}, + {-0.775607,1.441111}, + {0.027304,-0.584074}, + {0.863740,0.627974}, + {-1.060986,0.321724}, + {-0.281804,-0.212668}, + {-0.329657,0.371799}, + {0.531848,-0.158105}, + {0.026672,-0.486360}, + {-0.218047,0.635491}, + {0.666709,0.993036}, + {0.459120,0.452677}, + {0.248002,0.115551}, + {0.206833,-1.105758}, + {-1.569637,-0.151421}, + {0.180787,0.166870}, + {1.226875,1.017497}, + {-1.217281,-0.448781}, + {-1.565721,0.396797}, + {-0.217848,-0.273230}, + {-0.526096,0.662491}, + {-1.229207,0.003437}, + {0.383000,-0.372112}, + {1.650689,0.790800}, + {0.536051,1.136376}, + {-0.392390,-0.182759}, + {-0.163732,-1.005985}, + {-1.140970,0.475364}, + {0.184716,-1.063705}, + {0.945672,-0.647324}, + {0.317886,-0.600098}, + {-0.396886,0.775971}, + {0.101952,-0.090515}, + {0.276508,1.253623}, + {-0.416748,0.718122}, + {-0.099947,-0.530635}, + {-1.499713,0.042544}, + {0.397603,-0.268105}, + {0.204542,-1.122999}, + {-0.983787,-0.646320}, + {0.250761,-0.124317}, + {0.473183,0.341900}, + {-0.705158,0.158472}, + {0.371776,0.467056}, + {0.257410,-1.623932}, + {0.092234,-1.078695}, + {-0.295587,0.833320}, + {-0.531598,-0.934193}, + {0.124603,-0.162051}, + {-0.040780,-0.840548}, + {0.785678,0.974760}, + {-0.282413,0.507355}, + {0.057080,-0.754205}, + {-0.817044,0.275642}, + {0.449437,0.089153}, + {-0.482425,0.004603}, + {1.564964,-1.225545}, + {-0.296003,1.012181}, + {0.691527,0.516007}, + {0.861031,-0.816600}, + {0.276897,-0.215415}, + {-0.478248,1.152079}, + {-0.243767,0.552381}, + {-0.615166,0.120121}, + {-0.258476,-0.311377}, + {-0.105806,-1.233470}, + {0.933500,0.163247}, + {0.430437,1.092868}, + {-1.072369,-0.214236}, + {-0.893004,0.971634}, + {-0.207458,-0.661337}, + {0.591135,0.252093}, + {-0.044583,0.323754}, + {0.455226,0.549888}, + {1.492632,0.101093}, + {-0.299396,-0.684097}, + {0.378218,-0.334619}, + {0.232610,-0.041219}, + {0.051506,0.557403}, + {1.217142,-1.249841}, + {0.292157,1.470057}, + {0.044903,0.071167}, + {-0.290396,0.496778}, + {-0.181920,0.671063}, + {-0.579713,-1.039686}, + {-1.356184,0.198084}, + {0.175306,1.691410}, + {1.030813,-0.581909}, + {-0.959255,-0.444030}, + {-0.357172,-0.625541}, + {0.681264,0.143548}, + {-0.065022,-1.255416}, + {-0.025972,0.751640}, + {0.195418,0.198967}, + {-0.581082,1.283469}, + {0.990660,0.778059}, + {-0.282029,1.107940}, + {-0.273763,0.542701}, + {0.995269,0.786820}, + {-0.232447,0.365286}, + {0.704749,1.074984}, + {0.644010,0.101394}, + {0.378756,-0.170049}, + {0.796258,0.096740}, + {0.728484,0.048925}, + {-0.029005,1.135049}, + {-1.414461,0.100530}, + {0.195218,1.644827}, + {-1.140545,0.941779}, + {-0.380364,-0.295396}, + {-0.489642,0.720380}, + {0.491530,1.084624}, + {0.771087,0.723882}, + {-0.079504,-0.260956}, + {0.512847,0.722547}, + {0.807801,-0.638746}, + {-0.235408,-2.425129}, + {-0.331496,-0.883682}, + {-0.331335,0.149970}, + {0.777123,0.876489}, + {1.812793,-0.280792}, + {-0.603163,0.962356}, + {-0.433949,0.895134}, + {0.611068,-0.002651}, + {-0.050707,-0.939219}, + {0.333190,-0.695877}, + {1.033787,-0.977412}, + {1.029110,0.572951}, + {-0.703830,0.009984}, + {-0.605666,0.240015}, + {-0.892166,-0.256507}, + {0.310084,-0.876146}, + {1.405525,0.188992}, + {-0.818726,0.673212}, + {0.010904,-1.077932}, + {-1.260912,0.553293}, + {-0.193185,0.554862}, + {-0.169833,-0.541666}, + {0.022431,-0.220661}, + {-0.072948,0.560653}, + {-0.643691,-0.722108}, + {-0.414350,-0.104367}, + {0.708357,0.463080}, + {0.714304,-0.151360}, + {-0.658587,-0.887861}, + {0.149199,0.432913}, + {-0.530458,0.445705}, + {1.826116,1.011888}, + {0.656833,0.119869}, + {-0.563687,0.624626}, + {-0.525881,0.838023}, + {0.361541,0.559821}, + {-1.743937,0.165666}, + {-1.349337,1.152104}, + {-0.049679,0.493514}, + {1.987946,-0.325951}, + {0.055513,0.426012}, + {-1.269326,0.122713}, + {-0.773301,-0.328201}, + {0.863300,0.397242}, + {1.404658,0.490418}, + {0.697909,-1.272366}, + {0.346984,0.771560}, + {-0.275198,1.462558}, + {0.614286,-0.583483}, + {0.491689,-0.121321}, + {0.868958,-0.218826}, + {0.802647,0.609581}, + {-0.178894,-0.484794}, + {1.554270,-0.459034}, + {-0.578008,-0.604401}, + {0.141200,-0.810175}, + {0.444930,1.801883}, + {-0.510472,0.370071}, + {0.280709,-1.144972}, + {0.020627,-1.159767}, + {-0.815817,-0.708195}, + {1.525475,-1.186390}, + {0.277199,0.101433}, + {-0.263937,-0.366057}, + {-0.084328,-0.735973}, + {-1.014961,-0.808112}, + {-0.463739,0.359998}, + {-0.195469,-0.339523}, + {-0.016981,0.736436}, + {-0.265756,0.651378}, + {1.181170,0.229175}, + {0.508341,-0.387702}, + {0.232816,0.750349}, + {0.118147,0.881985}, + {0.775509,-1.072872}, + {0.126875,-0.169368}, + {0.733796,-1.038803}, + {-0.002779,1.199573}, + {-0.771687,-0.819622}, + {-0.160414,1.766988}, + {-0.554493,-0.822178}, + {-0.966927,-0.264584}, + {-1.666005,0.562460}, + {-1.142024,-0.696414}, + {0.406841,0.433538}, + {-0.370948,-1.115653}, + {0.136048,0.160321}, + {0.288581,1.454045}, + {0.877842,-0.195856}, + {-0.788680,-1.099470}, + {-0.132225,1.177897}, + {0.090549,0.626800}, + {-0.773979,-0.074852}, + {0.684609,0.690323}, + {0.177050,-1.167072}, + {-0.324256,-0.482870}, + {-0.176754,-0.424217}, + {-1.014998,-0.298680}, + {-0.474555,-0.796117}, + {0.283239,0.175760}, + {0.614617,0.095776}, + {-0.294539,-0.581832}, + {-0.411225,-0.981276}, + {0.042082,0.873893}, + {-0.603924,0.401098}, + {-0.783720,-0.094055}, + {-0.750818,1.155413}, + {-0.229883,-0.177973}, + {-0.439507,0.600696}, + {1.064919,0.193246}, + {-0.304774,0.765127}, + {-0.423589,1.423282}, + {0.226341,0.048299}, + {-0.491662,0.021729}, + {-1.190822,-0.192527}, + {0.236763,-1.021980}, + {0.347245,0.305465}, + {0.437791,-0.174323}, + {0.293884,-1.183318}, + {0.090410,-0.351897}, + {0.127531,0.572262}, + {-1.046283,-0.452403}, + {0.940061,-0.475348}, + {-0.986271,0.443950}, + {0.220640,1.032270}, + {0.286851,-0.234600}, + {0.875448,-0.665507}, + {0.054512,0.468117}, + {-0.130507,1.089372}, + {-0.035702,0.486985}, + {0.069264,-0.306520}, + {-0.066945,-0.482707}, + {0.452421,0.252962}, + {0.597328,-0.457166}, + {-0.475184,-0.265545}, + {0.663543,-0.025896}, + {0.284485,0.141732}, + {0.041567,-0.957668}, + {0.290973,-0.844633}, + {-0.681949,-1.232429}, + {0.017290,0.318637}, + {-0.575524,-0.211416}, + {0.508609,0.616042}, + {0.019156,1.014363}, + {-0.230623,-0.152963}, + {0.390757,0.179639}, + {-0.076114,0.571760}, + {-0.385456,0.807338}, + {1.161341,-1.117539}, + {0.108692,-0.217050}, + {0.124773,-0.057939}, + {0.460042,-0.075353}, + {0.381092,-0.249534}, + {0.421018,0.484359}, + {0.008405,-0.001483}, + {-1.033700,0.064492}, + {0.168744,-0.730623}, + {-0.456130,-0.563921}, + {-0.042797,-0.009800}, + {0.296420,0.994668}, + {-0.431712,-0.260015}, + {-0.851644,0.160001}, + {0.315681,-0.696367}, + {2.018690,1.186418}, + {-0.250355,-0.220666}, + {0.748427,-0.192764}, + {-0.047138,-0.852542}, + {0.211458,1.086426}, + {0.871051,-0.574737}, + {-0.562745,0.929652}, + {0.283267,-0.955651}, + {-1.076759,-0.129783}, + {0.675245,0.669145}, + {-0.702168,-0.896492}, + {-0.291861,0.305292}, + {-0.395244,0.389980}, + {1.207996,0.801305}, + {0.975263,-0.313611}, + {-1.106120,0.102991}, + {0.171218,0.482130}, + {0.049836,0.344150}, + {-0.574798,0.577927}, + {0.172133,0.333449}, + {-1.172473,0.893130}, + {1.350215,-0.102154}, + {0.456540,0.882785}, + {0.794284,-1.919899}, + {0.870210,0.114615}, + {0.286346,0.295210}, + {0.213541,1.053429}, + {0.087514,-0.244276}, + {-0.872078,0.726523}, + {0.614549,0.116808}, + {-0.631306,-1.519765}, + {-0.542784,1.390314}, + {0.087673,0.809103}, + {-1.379197,-0.585950}, + {0.481568,0.087880}, + {-0.119636,-0.372124}, + {0.016361,-0.024546}, + {0.371448,-0.472289}, + {-0.572025,0.092977}, + {0.848296,0.441249}, + {-0.453304,0.205288}, + {-0.271298,0.488850}, + {-0.281843,-0.272080}, + {-0.630517,-0.095495}, + {-0.762736,-0.986147}, + {0.057032,0.993819}, + {-0.237911,-1.264914}, + {0.382413,-0.189031}, + {1.303322,-0.407785}, + {0.538644,0.342608}, + {0.330098,-0.259188}, + {-1.271100,-0.197699}, + {1.826721,0.415414}, + {0.508481,-0.379909}, + {-0.724041,-0.599641}, + {-1.260518,-1.057946}, + {-0.374209,-0.096198}, + {0.392033,1.122224}, + {-0.810644,0.587815}, + {0.365400,1.456110}, + {0.729153,0.098419}, + {-0.225790,-0.539353}, + {-0.858060,0.189621}, + {0.376242,-0.480459}, + {0.232259,-0.269844}, + {0.129211,1.283390}, + {-0.948935,0.157627}, + {0.613247,0.455174}, + {-0.868574,0.557501}, + {0.133104,1.933073}, + {0.493281,-0.734954}, + {-0.317203,0.085507}, + {-0.072179,-0.635623}, + {-0.985795,1.545802}, + {0.274456,-0.767398}, + {0.728872,0.296392}, + {0.593057,0.123323}, + {-0.183197,1.056002}, + {-0.032735,-0.029408}, + {0.677645,0.164514}, + {0.091211,-0.485727}, + {-2.498205,0.808644}, + {0.996395,0.003573}, + {0.266711,-0.454450}, + {-0.263794,-0.040333}, + {0.354992,-0.771940}, + {1.172659,-0.469942}, + {-0.367261,-0.704077}, + {-0.143653,0.755396}, + {1.250809,-0.502261}, + {1.019959,-0.368994}, + {1.590169,-0.138417}, + {0.177393,0.277887}, + {-0.611047,0.094640}, + {-0.549878,-0.036917}, + {0.807628,0.821926}, + {-0.010075,0.421684}, + {-1.108953,-0.164506}, + {-1.299036,-0.726626}, + {0.671054,-0.292631}, + {0.742427,-0.086543}, + {-1.439898,-0.338884}, + {-0.130204,0.124819}, + {0.283823,0.657034}, + {-0.109731,-1.711867}, + {-0.245196,0.209915}, + {0.134997,-0.672792}, + {0.052287,-0.037615}, + {0.660337,-0.488347}, + {-0.874463,-0.641201}, + {-0.570408,0.594626}, + {0.681125,1.678168}, + {0.795936,-1.473398}, + {0.778924,-0.690375}, + {0.431527,-0.973408}, + {-0.440928,-0.786162}, + {0.032495,-0.001239}, + {0.384671,0.422006}, + {-0.232534,0.009146}, + {-0.797171,0.074804}, + {0.273856,-1.269545}, + {-0.171058,-0.791818}, + {1.061619,-0.008526}, + {1.034158,-0.217879}, + {-1.073993,0.364692}, + {0.025259,0.399442}, + {-0.054965,0.068811}, + {-0.267747,-0.643064}, + {1.461066,-0.012076}, + {-0.836750,1.168916}, + {0.751557,0.373319}, + {0.284049,-0.561823}, + {0.913427,0.006951}, + {0.604871,0.613051}, + {0.938690,0.069825}, + {0.501171,-0.252792}, + {0.173783,0.437109}, + {-0.295979,-0.584728}, + {0.268176,-0.073450}, + {-0.039777,0.110535}, + {0.448278,-0.594228}, + {-0.298566,-0.370610}, + {0.359251,1.950238}, + {0.585298,-0.306953}, + {0.002142,-0.517386}, + {0.039309,0.239663}, + {-0.535150,0.901889}, + {0.909644,-0.597911}, + {1.686969,-0.229593}, + {-0.675714,-0.593584}, + {-0.388048,-1.333594}, + {0.141555,-0.868886}, + {0.566275,0.216197}, + {0.132033,0.260242}, + {0.623869,0.696830}, + {0.374297,-0.755016}, + {-0.375173,-0.919679}, + {0.062230,0.203455}, + {-1.171487,1.698409}, + {-0.657380,-0.503744}, + {0.414301,0.170470}, + {-0.611193,-0.370376}, + {0.470375,-0.330994}, + {-0.990314,0.032083}, + {-1.312575,-0.450515}, + {0.164736,-0.128481}, + {-0.912458,-1.485285}, + {-0.073236,-0.747723}, + {0.278586,-0.044914}, + {-0.449681,-1.314391}, + {0.509207,1.963487}, + {0.443624,-1.487975}, + {0.605531,0.966878}, + {0.884828,1.743505}, + {-0.335874,-0.307016}, + {-0.615678,0.670790}, + {0.953036,0.532101}, + {0.825614,0.299899}, + {0.399454,-0.946779}, + {-0.563757,-0.802924}, + {-0.023567,0.554864}, + {0.046483,-0.362895}, + {-0.330303,0.001323}, + {0.433488,0.570663}, + {-0.127014,1.545073}, + {0.235044,-0.692703}, + {0.339960,-0.764085}, + {0.765956,-0.657851}, + {1.077800,-0.036173}, + {0.431734,-0.931291}, + {0.205175,1.147130}, + {-0.058883,-0.741478}, + {0.538996,0.374879}, + {-0.435105,0.405032}, + {0.930107,0.775706}, + {0.158508,-0.559880}, + {-0.043020,-0.139690}, + {0.218128,-0.940794}, + {0.107406,-0.191890}, + {-0.040673,-0.450419}, + {0.710685,-0.272868}, + {0.214608,-0.733148}, + {-0.440708,-0.166709}, + {0.216889,-1.104968}, + {0.114942,0.352891}, + {0.515426,0.834965}, + {-0.186585,-0.424557}, + {1.257561,-0.686647}, + {-0.278166,-1.068819}, + {0.045243,-0.149820}, + {-0.806871,0.387979}, + {0.040414,-0.705648}, + {-0.016666,1.472054}, + {-0.427683,0.185384}, + {0.017081,0.122558}, + {-1.422488,0.695789}, + {0.084603,1.586049}, + {-0.226098,-0.072565}, + {-0.689706,0.246104}, + {0.644654,0.604549}, + {-0.260322,1.463776}, + {-0.430197,0.702709}, + {-0.736554,1.401740}, + {0.204332,-0.375610}, + {-0.939807,1.309502}, + {-0.037928,0.882787}, + {-0.338569,0.066617}, + {0.075071,0.541251}, + {0.172982,1.021832}, + {0.431851,-0.387000}, + {0.307106,-0.919275}, + {0.988648,-0.253024}, + {-0.673928,0.782128}, + {-0.688000,-0.918977}, + {-0.027596,0.365924}, + {-0.017926,1.175705}, + {0.199711,-0.926633}, + {0.739217,-0.155412}, + {-0.592162,0.021539}, + {0.080983,-0.276297}, + {0.537674,-0.246176}, + {0.015238,0.398952}, + {-0.027734,-0.249279}, + {-1.378429,0.127339}, + {-0.809060,1.028061}, + {0.218043,-0.052562}, + {0.856957,1.006954}, + {-1.011526,0.164596}, + {0.476552,0.826400}, + {0.022545,0.496168}, + {-0.593984,0.825097}, + {-0.170301,-0.015034}, + {0.206013,0.981045}, + {0.558955,-2.047671}, + {-0.285619,-0.535242}, + {0.338595,-0.054516}, + {-0.320398,0.326921}, + {-1.165209,-0.830182}, + {-0.247664,-0.461885}, + {0.566396,-0.099876}, + {-0.062142,0.605779}, + {0.862879,0.021585}, + {-0.964586,-0.456012}, + {0.383126,-0.226075}, + {1.125091,0.452775}, + {0.287649,1.076596}, + {0.090020,0.540193}, + {-0.329572,1.895356}, + {0.883979,-0.133990}, + {0.777596,0.934683}, + {0.305673,-0.097759}, + {0.445752,0.546775}, + {0.438676,-0.401466}, + {0.515517,0.663239}, + {-0.861769,-0.334754}, + {-1.155387,1.376435}, + {0.693576,0.380899}, + {-0.233764,-1.427252}, + {-0.512225,0.275704}, + {-1.300603,-0.025943}, + {-0.886231,0.393107}, + {0.203813,-1.151956}, + {1.065475,0.274747}, + {1.298933,-0.171110}, + {-0.034164,-0.546428}, + {1.344656,0.280082}, + {0.303208,-0.150756}, + {-0.278895,0.217139}, + {0.774302,0.280649}, + {-0.397168,-0.748535}, + {-0.154686,-0.416415}, + {0.108531,-0.707248}, + {1.044479,0.517916}, + {-1.079087,-0.181141}, + {-0.618875,-0.601089}, + {-0.903401,1.369553}, + {-0.434703,1.004383}, + {0.084219,-0.594635}, + {0.760134,0.396506}, + {-0.868353,0.425362}, + {0.190516,-0.470775}, + {0.130523,-0.050180}, + {1.613252,-0.894441}, + {-1.230645,0.027123}, + {-0.207136,1.406158}, + {0.097428,0.373589}, + {1.101023,0.803449}, + {1.891159,-1.054308}, + {-0.158666,-0.325728}, + {0.218607,-0.427098}, + {0.581789,-0.007118}, + {0.407515,0.254448}, + {0.153202,-1.566655}, + {1.270156,0.791481}, + {-0.807984,-1.293868}, + {-0.631812,0.190605}, + {1.684536,0.502642}, + {-0.623167,-0.326260}, + {0.460536,1.490078}, + {-0.633215,-0.730038}, + {0.455857,-0.569264}, + {1.113987,0.512264}, + {-0.303183,-0.813196}, + {1.242308,0.346664}, + {0.235454,0.588078}, + {0.884906,-0.682330}, + {-0.870385,0.197874}, + {-0.392108,1.132213}, + {0.139987,0.749446}, + {0.057771,-0.617700}, + {-0.090352,0.118191}, + {0.007506,0.480385}, + {-0.183661,-0.349638}, + {-0.201963,1.476555}, + {-0.705242,-0.479413}, + {0.975864,0.280884}, + {0.972210,0.753330}, + {0.338783,-0.040685}, + {-0.054492,0.060498}, + {-0.159293,0.819645}, + {-1.053555,0.401428}, + {0.115345,-0.107756}, + {-0.194026,0.187454}, + {0.439241,-0.428716}, + {-0.065278,-1.075082}, + {-0.272430,0.840665}, + {-0.259244,0.669703}, + {0.033760,-1.203906}, + {0.088858,-0.092993}, + {-0.855095,-0.299047}, + {-0.255525,0.089061}, + {-0.202798,0.134231}, + {0.574524,0.323405}, + {-0.355686,-0.509011}, + {-0.238557,0.035684}, + {-0.381287,-0.557626}, + {0.657797,0.952902}, + {-0.077875,0.403221}, + {-0.237508,1.411722}, + {0.652551,-0.088574}, + {-0.013073,0.581057}, + {0.570232,-0.572671}, + {1.442937,-1.109803}, + {0.997920,-0.010095}, + {-0.152155,0.277499}, + {-0.584876,-0.218181}, + {0.717679,-0.143585}, + {-0.075248,-0.695632}, + {-1.576641,-0.266963}, + {-0.228247,-1.087442}, + {-0.672358,-0.340599}, + {-0.682509,-0.975534}, + {0.412126,0.155315}, + {0.540229,-0.913902}, + {-0.949688,-0.498559}, + {0.038080,-0.334697}, + {-0.844788,0.671919}, + {-0.340829,-1.268134}, + {0.033822,1.867938}, + {-0.995863,-0.338217}, + {0.179299,-0.122295}, + {-0.037869,-0.933049}, + {-0.750164,-0.719282}, + {-0.833977,1.003917}, + {0.932833,0.760645}, + {0.867564,0.655081}, + {-0.504874,-0.636730}, + {0.714318,-1.290905}, + {-0.672831,0.341525}, + {0.278639,0.168889}, + {-1.057328,-0.938548}, + {-0.028958,0.765673}, + {0.659485,-0.427439}, + {-0.688018,0.905752}, + {0.593115,-1.081085}, + {1.020607,-1.035200}, + {-0.288406,0.254196}, + {0.681091,-0.195788}, + {-0.405965,0.877370}, + {0.247328,-1.348181}, + {0.193907,-0.618541}, + {0.104252,-0.480525}, + {-1.219477,-0.511557}, + {-0.355216,0.903456}, + {-1.510029,-0.513418}, + {-0.622239,1.647319}, + {1.211936,-0.279494}, + {-0.944064,0.760953}, + {0.165329,0.746784}, + {1.123063,0.150372}, + {0.591389,0.426566}, + {-0.763105,0.099885}, + {-0.233567,-0.051927}, + {0.451271,0.672933}, + {-0.319276,-0.725166}, + {0.090943,0.256992}, + {-0.740401,0.083129}, + {-0.493689,0.594996}, + {-1.160349,0.225323}, + {-0.120932,-0.308355}, + {-0.242434,0.784263}, + {-0.564637,-0.499833}, + {-0.094070,-0.250553}, + {-0.953770,-0.371332}, + {1.661581,0.171338}, + {0.341775,0.270245}, + {0.118130,0.083808}, + {-0.079126,-0.216981}, + {0.338884,0.258435}, + {0.264433,-0.841639}, + {0.232893,-1.129943}, + {1.240106,-0.052206}, + {0.209045,0.058734}, + {0.520361,0.888685}, + {-0.349822,-0.636562}, + {0.594371,1.144844}, + {0.075638,0.714484}, + {-0.784900,-0.809998}, + {0.662100,-0.092575}, + {0.056696,0.432525}, + {-1.239459,0.384416}, + {-0.006458,0.746883}, + {-0.290814,-0.506631}, + {0.561491,-0.077239}, + {-1.024084,0.663394}, + {-0.157999,-0.050504}, + {1.085344,-0.554264}, + {-0.708002,0.222259}, + {-0.593735,-0.009698}, + {0.223185,0.251755}, + {-1.023014,0.387383}, + {0.397333,0.864350}, + {1.103984,0.475520}, + {0.352685,-0.245976}, + {0.549224,0.087034}, + {-0.472024,0.633377}, + {-0.620719,-0.384944}, + {-0.442898,-0.177685}, + {-1.124416,1.350868}, + {0.618839,0.158407}, + {0.718180,0.334085}, + {-0.107034,-1.414157}, + {0.390844,-0.348879}, + {0.416452,-0.381163}, + {0.016589,0.693169}, + {0.210261,1.649291}, + {0.151838,0.205813}, + {-0.595573,-0.768804}, + {-0.160431,-0.717857}, + {-0.510800,-0.293505}, + {-0.818709,0.437824}, + {0.545773,0.032159}, + {0.676537,-0.059850}, + {-0.311443,-1.175198}, + {0.157728,-1.121027}, + {0.012740,0.536150}, + {-0.639492,0.488597}, + {-0.070496,-0.204313}, + {0.234541,0.328949}, + {0.236419,-0.139396}, + {-0.288891,0.889796}, + {0.148007,1.176270}, + {0.546853,0.583059}, + {-0.361551,1.330611}, + {1.183964,1.397033}, + {-0.993293,0.519104}, + {-0.712212,-0.401528}, + {0.445422,-1.006540}, + {0.778229,-0.924857}, + {0.140488,-0.120001}, + {-0.930823,0.679986}, + {0.269149,-1.501842}, + {0.630853,-0.526320}, + {0.957876,-0.802863}, + {0.190233,-1.009434}, + {-0.185559,0.932629}, + {0.050613,-0.086777}, + {0.020035,-0.059037}, + {-0.511718,-0.355513}, + {-0.795821,0.050420}, + {-0.656840,1.891314}, + {-0.055379,0.405881}, + {0.539094,0.845218}, + {-1.014806,0.375225}, + {-0.503707,1.354756}, + {0.124660,-1.563966}, + {-0.465392,-0.054315}, + {-0.437257,0.566359}, + {-0.082575,-0.150215}, + {-0.133522,0.536886}, + {0.594595,1.933791}, + {0.914843,-0.872862}, + {-0.247467,-0.433828}, + {-0.064788,0.077212}, + {0.778095,-0.045493}, + {0.366523,1.293263}, + {0.094333,0.230801}, + {-0.614536,0.463331}, + {0.430178,1.113947}, + {-0.150038,0.174521}, + {0.438024,0.254990}, + {0.480884,-1.856722}, + {-0.666409,-0.255484}, + {-0.457158,-0.599194}, + {-0.450171,0.118477}, + {0.497637,-0.101183}, + {-1.705586,0.405099}, + {0.259566,0.922599}, + {0.672946,-0.407264}, + {0.324409,0.900242}, + {-0.243075,-0.163768}, + {0.051280,0.490307}, + {0.571128,0.105678}, + {0.345743,-1.177099}, + {-0.869364,-0.068202}, + {-0.334410,0.647972}, + {0.476318,-0.010292}, + {-0.404522,0.623306}, + {-1.162121,-1.071830}, + {-0.627528,-0.384318}, + {-0.337665,-1.341870}, + {0.041529,0.841819}, + {-0.201762,-0.736758}, + {0.184452,-0.757867}, + {-0.709406,-0.513657}, + {-0.135826,-1.416885}, + {-0.764527,-0.630076}, + {-0.759073,1.284986}, + {-0.016376,-1.529208}, + {1.348773,-0.176343}, + {-0.604174,0.991312}, + {-0.281693,-1.131040}, + {0.070203,0.284520}, + {-1.229019,-0.521961}, + {-0.321063,-0.524171}, + {-0.284333,-0.886437}, + {0.325590,-0.528520}, + {0.254426,-0.232536}, + {0.263271,-0.448853}, + {-0.872268,0.657765}, + {-0.819516,-0.328243}, + {-0.259070,0.625280}, + {-0.590739,-0.670188}, + {0.493374,0.019055}, + {1.344704,-0.174393}, + {-1.182374,-1.425261}, + {-0.666870,0.434800}, + {-0.225687,0.069924}, + {0.375164,1.016698}, + {0.327044,-0.675835}, + {0.497187,0.790896}, + {-0.054661,-0.971456}, + {0.260230,0.159026}, + {-1.246029,-0.535410}, + {-0.124982,0.871965}, + {1.010443,1.001963}, + {0.452742,-0.029144}, + {0.117958,-0.136449}, + {0.148605,-0.229105}, + {0.251393,0.825563}, + {0.730487,0.258166}, + {-0.610108,0.505836}, + {0.797900,0.109366}, + {-0.107968,0.039054}, + {0.252653,-0.138314}, + {0.035959,0.047755}, + {-1.412453,-0.353756}, + {-0.174516,-1.100457}, + {-0.405645,0.021713}, + {-1.214659,-0.958074}, + {-0.598051,-0.067393}, + {0.459193,-0.091313}, + {-0.584458,-0.757231}, + {-0.806303,-0.669604}, + {0.808333,0.602605}, + {-0.258282,-0.747621}, + {0.089092,-0.642856}, + {-0.730287,0.033052}, + {0.087943,-0.788594}, + {0.341008,-0.211460}, + {0.000571,0.004990}, + {0.670368,-0.386947}, + {0.557711,-0.002995}, + {-0.293485,-0.872980}, + {-0.783528,0.580868}, + {-1.146005,1.580005}, + {-0.361812,1.094479}, + {0.124733,0.413218}, + {-0.158285,-0.637446}, + {0.364533,0.669450}, + {-0.382480,0.147327}, + {-1.131368,-0.908078}, + {-0.134073,0.755815}, + {0.085353,0.234990}, + {0.038784,-0.362630}, + {-1.186840,-0.015796}, + {0.464353,0.494665}, + {-0.835406,0.374020}, + {-0.321494,0.250667}, + {0.327866,0.142119}, + {0.104908,0.694259}, + {0.081477,-0.930475}, + {-1.022207,0.157953}, + {1.114196,-0.318852}, + {-0.153446,-0.083414}, + {-0.004149,-1.802615}, + {0.061545,-0.040178}, + {-0.799257,-0.743362}, + {-0.208531,-0.357144}, + {-0.319060,1.569294}, + {0.077045,-0.067189}, + {-0.161677,0.635664}, + {-1.405501,-0.763577}, + {-0.397846,0.381495}, + {-0.609449,0.151477}, + {0.790843,0.583281}, + {-0.125419,-0.673059}, + {0.048552,-0.170964}, + {0.251041,1.361702}, + {0.146372,-0.095489}, + {0.636802,0.172758}, + {0.019193,0.213042}, + {-1.039100,-1.241302}, + {-0.564480,-0.945689}, + {0.486241,-0.284521}, + {0.331050,-1.330519}, + {-0.267252,-0.434646}, + {0.766397,-0.345934}, + {-0.200744,0.569833}, + {-0.041749,1.160658}, + {-0.166904,0.567353}, + {-0.647654,-0.482519}, + {1.259189,0.238637}, + {-0.061864,-1.133994}, + {0.709167,0.066215}, + {0.421481,0.512487}, + {0.539837,0.885868}, + {-0.840289,-1.137802}, + {1.081907,-0.754870}, + {0.139268,-0.120622}, + {1.964821,1.068368}, + {0.623684,0.427752}, + {-0.307559,-0.061760}, + {-0.075474,-0.859298}, + {0.856064,-0.238438}, + {0.100253,0.302974}, + {-0.637176,-0.566873}, + {-0.008290,0.282227}, + {1.214723,0.715509}, + {-0.162779,-1.789175}, + {-0.134063,0.710633}, + {-0.519932,0.522329}, + {0.204941,0.159361}, + {-0.482306,-0.376938}, + {-0.188561,0.397104}, + {0.440798,0.479065}, + {0.765870,0.912747}, + {-0.419145,-1.087277}, + {0.200862,0.291699}, + {1.606653,0.419064}, + {-0.231721,-0.095246}, + {-0.709828,-0.172976}, + {0.156692,-0.203509}, + {-1.074669,0.010797}, + {0.247751,-0.531622}, + {0.596496,-0.743859}, + {-0.167848,0.769772}, + {-0.600885,-0.306912}, + {-1.540693,0.221595}, + {0.449488,-0.651038}, + {-0.250910,-0.287887}, + {-0.367598,0.361719}, + {0.494129,0.106607}, + {-0.074593,-1.892982}, + {0.883074,0.395411}, + {-1.092268,0.178541}, + {-0.087335,-0.713201}, + {-0.276838,-0.297331}, + {0.652034,-0.294585}, + {0.545522,-0.253011}, + {0.923416,0.397211}, + {-1.625554,-0.069215}, + {0.004244,-0.025244}, + {0.961205,1.110819}, + {-0.183857,-0.022013}, + {0.193756,0.316726}, + {-2.046393,-0.164273}, + {-0.368365,-0.635641}, + {-0.977759,0.639374}, + {-0.511194,0.291523}, + {-0.240401,0.676329}, + {0.444406,0.962063}, + {-0.276425,1.306324}, + {-0.632475,-0.521505}, + {-2.202754,-0.707231}, + {0.036750,-1.180940}, + {1.569251,-0.049689}, + {0.398289,0.888255}, + {0.348308,-1.632712}, + {-0.564295,-0.266565}, + {0.269295,-0.357566}, + {0.717308,-0.386385}, + {0.055096,1.001055}, + {-0.316491,0.558610}, + {-0.104349,-0.364259}, + {-0.628408,0.275177}, + {-0.793190,-0.708380}, + {0.273673,-0.761222}, + {-0.324338,0.469933}, + {-0.879443,1.299100}, + {-1.259126,0.852917}, + {-0.076886,-0.512190}, + {0.102022,-0.181585}, + {0.519581,0.053206}, + {0.001434,-0.202726}, + {-1.015981,0.459688}, + {1.125770,0.940926}, + {0.312231,0.424855}, + {-0.499418,-0.502875}, + {0.517807,0.069577}, + {-0.973119,0.268788}, + {0.374483,-0.502729}, + {0.003039,-0.024829}, + {-0.040855,1.072277}, + {-0.951793,-0.475118}, + {-0.710944,-0.003773}, + {-0.114791,1.219599}, + {-0.245796,0.792555}, + {-0.003881,0.164329}, + {0.352843,0.700678}, + {1.098609,-0.455416}, + {0.890404,-0.589496}, + {0.004892,-0.535082}, + {1.442431,-0.702892}, + {-0.366707,-1.095639}, + {1.025595,0.172890}, + {0.938371,0.195878}, + {0.126380,0.673834}, + {-0.578430,0.938407}, + {-0.502260,0.910490}, + {0.254066,0.433385}, + {-0.220341,1.040807}, + {1.453578,0.343099}, + {-0.608675,-0.498692}, + {0.073501,0.011211}, + {-0.829259,0.377760}, + {-0.079486,-1.685480}, + {1.145159,-0.985214}, + {0.098902,-0.864296}, + {0.393820,1.649395}, + {-0.734563,0.744368}, + {-0.147095,-1.257531}, + {-1.627407,-1.136028}, + {0.467873,1.041606}, + {0.757500,-0.414132}, + {0.831162,-1.034454}, + {0.816375,0.500999}, + {0.702928,1.649657}, + {0.080263,-0.721470}, + {-1.187533,-0.047103}, + {-0.150313,1.708622}, + {0.493906,-0.679800}, + {0.594035,-0.186757}, + {-0.240079,1.222442}, + {-0.360900,0.050265}, + {0.144905,0.624081}, + {1.181170,0.285112}, + {0.290493,0.604750}, + {1.092495,0.412827}, + {0.562585,0.524007}, + {0.341804,0.235361}, + {-1.162588,-0.993807}, + {0.413398,0.629788}, + {-0.085675,0.234139}, + {0.096242,-0.149101}, + {-0.237502,-0.226784}, + {1.018918,0.053213}, + {-0.242669,-0.787538}, + {0.756043,-0.235274}, + {0.919413,0.564605}, + {1.108872,0.879978}, + {-0.581288,0.281426}, + {-0.326461,1.233718}, + {-0.079129,-1.162175}, + {0.349478,-0.844907}, + {0.027088,-0.819916}, + {0.170056,0.187616}, + {0.502767,-0.666850}, + {0.961324,-0.584669}, + {0.710063,0.119446}, + {0.239278,0.976768}, + {-0.014996,0.524941}, + {0.008554,0.179727}, + {-0.393247,-0.037826}, + {0.718612,-0.978392}, + {-0.225419,-0.038771}, + {-0.227036,-0.165385}, + {0.121599,-0.197455}, + {1.134869,0.485862}, + {-0.947191,-0.134063}, + {-0.654587,1.189330}, + {0.443246,-0.706134}, + {-0.830123,-0.240530}, + {-0.113430,1.241655}, + {-0.108660,-1.135730}, + {0.036003,-0.841002}, + {-0.157794,0.185786}, + {-0.483079,0.099628}, + {0.280081,0.479144}, + {1.939184,-0.257319}, + {-0.687604,0.274654}, + {0.281510,0.228436}, + {-0.028762,-0.144790}, + {-0.171744,0.621507}, + {-0.370458,-0.435995}, + {-0.369755,0.546579}, + {1.695030,0.039443}, + {1.240829,-0.834031}, + {0.295979,-0.031126}, + {-0.422307,-0.218957}, + {0.139370,0.067480}, + {0.184715,-0.646348}, + {-0.818519,0.518805}, + {-0.103088,0.886249}, + {-0.138199,-0.692871}, + {-0.039802,0.305166}, + {0.227665,0.707830}, + {0.407761,-0.090334}, + {-0.148850,1.035646}, + {0.706539,0.838360}, + {-1.216193,0.118999}, + {-1.145744,-0.154962}, + {-1.072350,0.028873}, + {0.816804,-0.037296}, + {-0.223583,0.078154}, + {0.551985,-0.137222}, + {-0.434480,-0.170241}, + {-0.717792,0.161839}, + {0.404747,-0.083635}, + {0.457787,0.137080}, + {-0.205589,0.734910}, + {-0.788705,1.504406}, + {0.647835,-0.940490}, + {1.096260,-0.020625}, + {-0.515190,0.721472}, + {0.151921,0.029406}, + {-1.071512,-0.382693}, + {-0.666773,0.643925}, + {0.473907,0.434675}, + {0.281689,0.152364}, + {1.231462,0.143107}, + {0.422616,0.642618}, + {-0.860802,1.066102}, + {0.180806,-0.160456}, + {-0.171602,1.259847}, + {-1.080608,-1.537974}, + {0.247965,-0.391762}, + {-0.597206,-0.026325}, + {0.806679,0.506041}, + {-0.448461,-0.551637}, + {0.609211,1.564775}, + {-0.584254,-0.421677}, + {-0.115819,0.092741}, + {0.630211,-0.423075}, + {0.219037,0.467483}, + {0.330857,0.747908}, + {-0.653036,0.009290}, + {-0.785070,-0.874116}, + {1.707815,0.381228}, + {0.023747,-1.518223}, + {-0.937137,-0.965197}, + {0.640566,0.933056}, + {-0.594679,-0.574540}, + {0.296794,-0.291891}, + {-0.714825,0.378028}, + {0.757843,0.220650}, + {1.019762,2.070884}, + {1.052090,-0.108974}, + {0.617214,-1.030121}, + {0.234111,1.070887}, + {0.325029,1.415523}, + {-1.411232,-0.591198}, + {0.955943,0.862474}, + {-1.524439,0.478968}, + {0.161252,-0.000874}, + {-1.682225,-0.113368}, + {-0.714802,0.379857}, + {0.815552,-0.386556}, + {0.565304,0.508925}, + {0.033944,-0.055679}, + {-0.160544,-0.364665}, + {1.167740,-0.747209}, + {-0.114289,-0.426222}, + {0.998961,-0.781649}, + {0.480485,-0.325437}, + {0.818972,1.053668}, + {-0.759151,0.662107}, + {-0.533949,1.213625}, + {-0.348061,-0.399280}, + {-0.612857,0.282472}, + {-0.155041,0.177124}, + {1.564518,0.497387}, + {-0.259280,0.598564}, + {-0.330630,-0.194511}, + {-0.927641,0.683062}, + {-0.492680,0.187990}, + {-0.486909,0.556354}, + {-1.016376,0.123981}, + {0.605410,0.661383}, + {-1.259776,-0.139097}, + {0.687748,-0.124519}, + {1.076749,1.172916}, + {0.826104,0.453227}, + {0.916044,0.484496}, + {-0.220030,0.081309}, + {-0.762988,-0.501734}, + {0.156663,-0.397336}, + {-0.645976,-0.464085}, + {0.013181,-0.690831}, + {1.418278,-0.223876}, + {0.138929,0.135069}, + {0.576396,-0.082604}, + {0.341489,0.166084}, + {0.239311,0.512591}, + {-0.705057,0.281017}, + {-0.216695,0.700219}, + {-0.052454,-1.245938}, + {-0.553732,-1.127581}, + {-0.875834,0.839077}, + {0.590675,-0.603937}, + {1.115400,0.110295}, + {-0.433421,0.192051}, + {0.724311,-0.663050}, + {-0.511338,-0.678864}, + {0.319840,-0.020854}, + {-1.173155,0.013443}, + {0.379830,0.418095}, + {-1.047586,0.754616}, + {-0.458533,-0.744747}, + {0.039738,0.740735}, + {-0.448691,-1.323799}, + {-0.614500,0.274110}, + {-0.954928,1.710574}, + {-1.115993,0.162485}, + {1.193523,-0.172836}, + {-0.813587,-0.815742}, + {0.432139,-0.761635}, + {0.539046,-0.256594}, + {0.293082,0.217539}, + {0.390536,-0.019131}, + {-0.520508,-0.341834}, + {-0.124911,-0.157248}, + {-0.637428,-0.090345}, + {-1.047505,0.197182}, + {1.028592,0.057271}, + {0.228695,-0.421307}, + {0.160562,0.065647}, + {-0.125276,0.570122}, + {0.771720,-0.929429}, + {-0.885627,-0.643624}, + {0.674625,0.505683}, + {-0.361914,-0.577650}, + {0.053097,-0.825371}, + {1.336278,-0.384586}, + {0.004049,0.906965}, + {-1.072504,0.415022}, + {0.802524,-0.826920}, + {-0.955720,0.142124}, + {-0.125373,1.113202}, + {0.334120,0.836902}, + {0.835931,-0.122422}, + {1.106213,-0.047726}, + {2.296859,0.078391}, + {0.366122,-0.430429}, + {0.701139,-0.605645}, + {-0.146080,-1.767753}, + {0.016836,1.135654}, + {-0.176842,-0.909804}, + {0.161320,0.030687}, + {0.095294,-0.085024}, + {-0.777534,-0.732828}, + {-0.415510,0.843213}, + {-0.064383,1.441395}, + {-0.077757,-0.848909}, + {0.344072,-0.405862}, + {-0.685213,-0.152876}, + {2.219878,-0.147536}, + {-0.259629,-0.346784}, + {-0.154063,-0.256064}, + {-0.347575,-0.135536}, + {-0.507167,-0.471854}, + {1.053886,1.000078}, + {0.899577,0.115105}, + {-0.044331,-0.789282}, + {-0.151879,-1.288516}, + {0.121111,-1.153694}, + {1.329053,0.966325}, + {-0.678745,0.814417}, + {-0.257457,-0.282341}, + {-0.962823,-0.351230}, + {0.873445,0.133721}, + {0.627689,-0.454924}, + {-0.255754,-0.414715}, + {0.018030,1.186715}, + {-0.957481,0.875629}, + {-0.117672,-0.173647}, + {0.174636,-0.871127}, + {-0.384196,0.778462}, + {0.082789,0.383797}, + {-0.701027,-1.355462}, + {0.668719,0.695236}, + {-0.042132,2.102093}, + {1.413857,-0.300645}, + {-0.112820,-0.849034}, + {-0.612251,0.816555}, + {0.608860,0.226898}, + {-0.179368,-0.087384}, + {0.040499,0.002180}, + {-0.737672,0.256065}, + {-0.161481,0.832177}, + {1.099151,0.426534}, + {-0.235701,-0.127462}, + {-0.152026,-0.390955}, + {-0.543015,-0.478542}, + {-1.160759,0.623038}, + {-0.202691,0.593749}, + {1.786126,-0.318883}, + {1.316698,0.020550}, + {0.169104,-0.060324}, + {1.045560,-0.056788}, + {1.020056,-0.597922}, + {-1.645949,0.293017}, + {0.923375,-0.090014}, + {-0.844203,-0.218401}, + {-0.239957,0.368485}, + {-0.309986,0.239761}, + {-1.016587,-0.062435}, + {-0.767244,0.118052}, + {0.277478,0.074426}, + {0.683305,-1.041466}, + {-0.808274,-1.614546}, + {0.394355,0.811173}, + {0.796282,-1.296704}, + {-0.714204,0.137774}, + {0.196927,0.370427}, + {-0.376269,-0.542680}, + {0.791492,-0.123199}, + {0.321249,0.521318}, + {1.046344,0.661679}, + {-0.141206,-0.238853}, + {-0.383405,0.290032}, + {0.376350,0.432868}, + {-0.049260,-0.368856}, + {0.408613,-0.014061}, + {-0.326055,0.816902}, + {-0.026001,-0.589331}, + {-0.072918,0.200475}, + {0.331867,-1.316811}, + {0.435541,-0.935694}, + {0.510818,1.141595}, + {-0.190277,-1.450792}, + {0.173657,-0.279898}, + {0.438387,-0.236168}, + {-0.079822,-1.188886}, + {0.332160,-0.026150}, + {-0.156566,-0.711998}, + {1.519541,0.155118}, + {-0.252771,0.027134}, + {-0.051493,0.730522}, + {1.034388,-0.494617}, + {0.585226,-0.142609}, + {-0.056058,0.636934}, + {0.427097,-0.139863}, + {0.142636,-0.376670}, + {0.261685,-0.129577}, + {0.622429,-0.458139}, + {0.558685,-1.457037}, + {-0.302307,-0.237556}, + {0.667578,-0.893159}, + {0.394038,-0.616568}, + {-1.053062,-0.607413}, + {-0.102774,0.550373}, + {-0.151209,-0.605143}, + {0.982131,-0.044701}, + {0.872422,0.300385}, + {-1.738852,-0.042787}, + {-0.927014,0.312879}, + {1.133143,0.059571}, + {-1.447607,-0.203064}, + {0.844638,-0.610940}, + {-0.131441,-0.383945}, + {0.185690,0.504708}, + {0.873802,-0.522457}, + {-0.241741,-0.833009}, + {-0.527447,-0.384432}, + {-0.313053,0.007224}, + {-0.144519,-1.752126}, + {-0.350914,0.331914}, + {0.019446,0.830710}, + {-0.361050,0.087871}, + {0.136350,-0.729097}, + {-0.727329,-1.483267}, + {0.506054,-0.485436}, + {0.062342,0.447545}, + {0.577105,0.248545}, + {-0.160478,0.636342}, + {0.874559,0.051499}, + {0.105072,-0.821176}, + {-0.398886,0.154675}, + {-0.622607,0.598468}, + {-0.199183,-0.205099}, + {-0.450282,-0.153537}, + {0.663143,-0.304326}, + {-0.184256,-1.048931}, + {-0.162581,0.645661}, + {-1.044422,-0.455806}, + {-1.229037,-0.793770}, + {-2.194331,-0.034931}, + {0.302824,0.337893}, + {-0.190657,0.691359}, + {0.829411,0.226586}, + {-0.425507,-0.020147}, + {-0.664468,0.683717}, + {-0.671081,-0.230903}, + {-0.907480,-1.183741}, + {0.554297,-0.117632}, + {0.096878,0.871193}, + {-1.083314,0.379586}, + {-0.234206,-0.116224}, + {1.369810,0.686732}, + {-0.721421,-1.029317}, + {-0.368926,0.569493}, + {1.046382,0.740596}, + {0.360666,0.448457}, + {0.480405,0.359113}, + {-0.086104,-0.363264}, + {0.238387,0.695863}, + {-0.736684,1.072959}, + {0.386997,-0.744110}, + {-0.437168,-0.232638}, + {-1.153335,-0.780908}, + {-0.684055,0.692340}, + {0.289389,0.249867}, + {-1.698004,0.639394}, + {0.394495,0.268874}, + {-0.603894,0.330558}, + {1.253198,0.211305}, + {-0.322306,0.240516}, + {0.102897,0.083584}, + {0.309184,-1.627874}, + {-0.390228,0.139204}, + {-0.089614,0.647020}, + {-0.121180,-1.208862}, + {0.826558,-0.115660}, + {0.495726,-0.898881}, + {-0.312265,0.328451}, + {-0.575407,-0.648683}, + {-0.432874,-0.055634}, + {0.299794,-0.672465}, + {0.755398,-1.216531}, + {-0.785094,0.381940}, + {1.177524,-0.442002}, + {-0.690561,-0.399181}, + {0.280850,1.343907}, + {-0.409116,0.423859}, + {1.752878,0.134327}, + {0.051034,-0.396984}, + {0.519335,0.260097}, + {0.669303,-0.512912}, + {-0.121664,-0.181888}, + {1.193699,-0.767988}, + {1.019133,-0.321132}, + {0.967335,-0.098405}, + {1.413661,-0.166381}, + {-0.125145,0.663141}, + {0.401551,-0.358640}, + {-0.253575,0.814815}, + {-0.102327,-0.276315}, + {-0.122363,-0.012399}, + {0.113221,0.159392}, + {0.425525,-2.019792}, + {-2.296354,0.492443}, + {-0.954148,-0.237086}, + {0.238738,-0.639157}, + {-1.761694,-0.164252}, + {0.737287,0.200460}, + {-0.162938,-0.768438}, + {-0.782868,-0.626567}, + {-2.246589,-0.509916}, + {-0.310067,-0.836668}, + {-1.464033,-0.333291}, + {1.315826,-0.280998}, + {0.002046,1.347203}, + {1.070363,0.251329}, + {0.246476,0.663615}, + {-0.845820,-0.236884}, + {0.093058,0.749687}, + {-1.111095,1.211477}, + {0.009610,0.450174}, + {0.915608,0.234386}, + {0.143672,0.205552}, + {1.527516,0.145242}, + {0.460513,1.555029}, + {-0.555127,-0.285376}, + {0.145695,0.896220}, + {1.217480,-0.305496}, + {0.414556,-0.502992}, + {0.603741,-0.844504}, + {0.129219,0.575608}, + {-0.283013,1.040908}, + {-1.255234,-0.534709}, + {1.088903,0.197861}, + {-0.058756,0.425937}, + {0.123779,-1.040665}, + {0.637367,-0.271180}, + {-0.103176,-1.697012}, + {-0.158588,0.656751}, + {-0.967854,-0.951648}, + {0.086897,-0.516020}, + {-0.373714,-0.748635}, + {0.596132,-0.522697}, + {-0.983889,-0.989551}, + {-0.467885,-0.141256}, + {0.830302,0.458530}, + {-0.760114,0.632394}, + {-0.274484,1.063399}, + {0.388037,0.224930}, + {1.249109,-0.166835}, + {-0.449788,-0.325036}, + {0.042710,-0.844489}, + {0.146003,1.006131}, + {-0.220865,-0.302253}, + {1.058335,1.753412}, + {0.002717,-0.206278}, + {-0.435205,0.096155}, + {0.045458,0.308059}, + {0.985575,-0.174125}, + {0.888946,0.271600}, + {-0.928001,0.303726}, + {0.508220,0.392928}, + {1.126653,0.623124}, + {-0.026042,-0.803140}, + {-0.924908,1.178639}, + {0.420452,1.218289}, + {0.232925,-0.244339}, + {-0.786826,0.421704}, + {-1.480250,-0.437413}, + {-0.876270,-1.154740}, + {-1.039014,0.278444}, + {0.540032,-0.043074}, + {-0.333186,0.620742}, + {0.264837,0.039240}, + {-0.323505,0.012675}, + {-0.409204,-0.767399}, + {0.025022,0.921557}, + {0.331678,0.765442}, + {0.655658,0.673464}, + {0.122603,1.712084}, + {0.671768,1.118615}, + {-0.304646,-0.327486}, + {0.200620,0.635266}, + {1.151679,-0.567691}, + {0.063835,-0.149801}, + {1.857157,0.061181}, + {-0.314228,-0.969461}, + {1.172970,0.214697}, + {-0.123463,0.139130}, + {-1.037067,0.729725}, + {0.375812,-0.068514}, + {0.007778,0.344010}, + {-0.498291,0.686760}, + {-0.021774,0.153344}, + {-0.106309,0.126358}, + {-1.635683,-0.251761}, + {0.280908,0.489367}, + {-0.706807,0.816537}, + {-0.831300,-0.192401}, + {0.178349,-0.073416}, + {0.680202,-0.971835}, + {-1.256339,-0.648133}, + {0.699942,0.382164}, + {-0.150262,-0.545250}, + {-0.612851,-1.036643}, + {0.778548,0.694659}, + {0.419950,-0.302441}, + {0.364074,1.256622}, + {-0.157228,-0.261850}, + {-0.107384,-0.158219}, + {0.493916,-0.735154}, + {-0.157863,0.679501}, + {-0.238097,0.159096}, + {-0.151747,-0.515968}, + {-0.196244,0.393762}, + {0.981312,-0.958934}, + {-0.172524,0.221805}, + {-1.038868,-0.156395}, + {-0.540427,-0.434566}, + {0.143654,-0.576748}, + {1.394838,0.011972}, + {-0.567336,1.449890}, + {0.016188,-0.586559}, + {0.018122,0.164911}, + {0.282832,-0.041033}, + {0.516311,-0.903365}, + {-0.074153,0.774443}, + {0.525149,-0.511892}, + {-0.064105,0.462937}, + {-0.550807,-0.740917}, + {-0.159709,0.095051}, + {0.856954,0.712022}, + {0.184713,-0.093683}, + {0.562640,-0.866336}, + {1.091445,0.202260}, + {0.504672,-0.248524}, + {0.172117,0.391537}, + {-0.067218,-0.440004}, + {0.287740,1.212661}, + {-0.562285,-0.146228}, + {0.218122,0.047461}, + {0.593255,-0.355369}, + {-0.533896,-0.299014}, + {-0.568450,-0.278213}, + {0.203598,0.537438}, + {-0.938066,0.704581}, + {-0.917601,0.791035}, + {-0.839964,-0.649079}, + {1.307890,0.264572}, + {-0.599850,-0.634273}, + {0.460067,-0.969037}, + {-0.646018,0.708979}, + {-0.452636,0.224816}, + {0.494858,0.238132}, + {-0.011522,-1.346647}, + {0.000576,-0.737202}, + {0.100013,-0.266210}, + {1.318841,0.403066}, + {-0.639935,-0.303449}, + {0.675628,-0.063920}, + {-0.097399,0.502298}, + {1.924211,-0.661343}, + {-0.193195,-0.836120}, + {-0.879425,-1.065778}, + {-0.777720,0.991738}, + {0.449743,-0.615344}, + {-0.163401,-0.484593}, + {-0.295979,0.797219}, + {-0.293076,0.655861}, + {-0.012079,-1.170280}, + {0.217685,-0.808306}, + {0.521063,0.052078}, + {-0.051550,-0.734594}, + {-0.035872,-1.275539}, + {-0.111903,0.457933}, + {1.585142,-1.073931}, + {-0.630589,-0.097644}, + {0.196150,-0.329361}, + {0.786858,-0.651981}, + {0.353044,-0.508077}, + {0.633349,0.050938}, + {0.292792,-1.147545}, + {-1.636248,0.076500}, + {0.121149,0.667182}, + {-0.485428,0.822637}, + {0.042791,0.346486}, + {-0.406830,0.061469}, + {0.260006,0.078180}, + {0.480654,-0.228662}, + {0.069106,0.904044}, + {0.689995,-0.355703}, + {1.356396,0.165978}, + {-1.216395,-0.167056}, + {0.806751,-0.082865}, + {1.379444,0.548229}, + {0.082448,-0.566330}, + {-0.153881,-0.613327}, + {-0.400828,-1.175044}, + {0.007904,0.187198}, + {0.017020,0.469228}, + {-0.635306,0.814212}, + {-0.686244,-1.695371}, + {0.635513,-0.061291}, + {-0.425817,0.149979}, + {0.251848,-0.710921}, + {-0.046316,0.161009}, + {0.286905,-0.673584}, + {-0.816487,-0.090565}, + {-0.587562,1.125426}, + {-0.388150,-0.088164}, + {-0.855313,-1.030685}, + {0.137949,0.442570}, + {-0.500305,0.481672}, + {-0.569691,-0.277656}, + {1.232236,2.015065}, + {-0.544907,-1.314194}, + {-1.063375,-0.275894}, + {-0.061552,-0.173145}, + {0.552244,0.176811}, + {-0.276732,-0.699921}, + {-1.723753,-0.289518}, + {-1.246463,1.183601}, + {-0.500170,0.373240}, + {0.651110,0.202271}, + {-1.201287,-0.164245}, + {-0.252490,0.060805}, + {0.267841,0.166147}, + {0.217199,0.233845}, + {0.487467,1.765281}, + {-1.323439,1.017541}, + {-1.689664,0.253096}, + {0.024758,0.480120}, + {0.663608,0.503539}, + {0.951764,-0.395559}, + {0.811294,0.409032}, + {-0.687545,0.241462}, + {-0.320659,0.006277}, + {-0.239229,1.109935}, + {1.192667,0.419789}, + {0.461142,0.131372}, + {0.087449,0.030492}, + {1.724236,-1.133479}, + {-0.233717,0.474440}, + {-0.107867,-0.340221}, + {-0.260094,-0.871921}, + {1.512797,-0.186811}, + {-1.150296,0.161701}, + {1.270353,-1.064373}, + {-0.208916,-0.609819}, + {0.266445,-0.850148}, + {-0.191666,-1.143687}, + {0.624237,0.402745}, + {-0.146100,-0.313531}, + {-0.394306,-0.512183}, + {0.748664,1.567171}, + {1.172201,-0.075086}, + {-0.203625,-0.403359}, + {0.801120,0.219087}, + {0.483011,-0.186969}, + {-0.822249,0.790955}, + {-0.826600,0.057749}, + {-0.340349,-1.708476}, + {-0.612349,0.017105}, + {-0.405678,0.770708}, + {-0.882441,-0.884726}, + {-0.760047,0.956302}, + {-0.134529,-0.806649}, + {-0.616061,-0.717116}, + {-0.786351,0.960517}, + {0.995470,0.823887}, + {0.803940,-0.068840}, + {-0.780356,0.796537}, + {0.754690,0.462261}, + {0.558489,-1.826939}, + {0.565941,-0.533679}, + {-0.349220,-0.565535}, + {-0.117447,-0.033437}, + {0.306679,0.561986}, + {-0.452673,0.002558}, + {0.656129,-0.312644}, + {-0.137241,0.808405}, + {0.023718,-0.818979}, + {0.316627,0.723533}, + {0.245948,-0.220425}, + {0.018669,-0.033499}, + {-0.384480,-0.064193}, + {1.059643,1.011290}, + {0.255465,0.122262}, + {0.892933,0.377851}, + {-1.057426,-1.072620}, + {0.376262,0.020682}, + {-0.318577,-1.103330}, + {0.820800,0.258835}, + {0.084963,-0.566530}, + {-0.270657,0.173413}, + {-0.630122,0.411348}, + {-0.140339,0.070918}, + {-0.580496,1.695575}, + {0.184591,-0.255626}, + {-1.595309,0.220755}, + {-1.086653,-0.518954}, + {-0.092904,-1.828520}, + {-1.560213,-0.345541}, + {-0.107258,0.421123}, + {1.333753,0.427132}, + {0.651096,-0.307819}, + {1.547703,0.021547}, + {-0.938925,0.799421}, + {0.161495,1.637137}, + {-0.566160,0.009561}, + {0.765734,1.847262}, + {-0.099619,1.217570}, + {-1.646296,1.143879}, + {-0.341561,0.208659}, + {-0.829797,-0.078640}, + {0.230420,0.260061}, + {-1.115321,-0.415304}, + {-0.759305,1.137078}, + {0.119318,0.326539}, + {0.634494,-0.172025}, + {0.951927,1.084809}, + {-0.481045,-0.125166}, + {-0.147533,-1.237017}, + {-0.194932,0.304319}, + {-0.055354,-0.773023}, + {-0.610176,0.526057}, + {-1.442512,0.301773}, + {0.806472,0.525891}, + {0.442248,0.868214}, + {-0.735627,-0.085293}, + {-0.527279,-0.419674}, + {-0.485876,-0.318730}, + {0.619257,-0.096117}, + {0.256008,-0.511587}, + {0.402021,0.667654}, + {1.085013,0.181906}, + {-1.075699,-0.590304}, + {0.149918,0.698889}, + {1.232178,-0.974211}, + {0.299137,-0.807070}, + {-0.363717,1.920628}, + {0.520819,-1.006913}, + {0.237037,-0.181282}, + {-0.473254,0.538424}, + {-0.693209,0.205641}, + {0.196816,-1.365328}, + {1.294426,-0.457957}, + {-1.201707,0.159986}, + {-0.434547,1.602358}, + {0.640590,-1.134317}, + {0.145536,-0.201253}, + {-0.295678,-0.144970}, + {0.474340,0.506270}, + {0.626337,0.119856}, + {-0.389066,-1.331761}, + {1.112996,-0.698493}, + {0.218681,0.173533}, + {1.403960,-0.330757}, + {0.473726,0.286873}, + {-0.065860,-0.094907}, + {0.245194,-0.785259}, + {-0.737379,0.731098}, + {0.888062,0.554072}, + {1.481762,-0.047101}, + {0.422688,0.158868}, + {0.569769,-0.263568}, + {-1.225339,-0.094437}, + {-1.449739,0.636898}, + {-0.257917,-0.053649}, + {0.155706,-0.122416}, + {0.953568,0.325125}, + {-0.798452,1.472069}, + {0.052703,-0.295397}, + {0.456338,-0.736016}, + {0.529491,-0.568515}, + {-0.233975,1.120665}, + {-0.680203,-1.295243}, + {-0.466273,-0.062131}, + {-0.131288,1.168066}, + {-0.385004,-1.409355}, + {-0.314060,-0.015362}, + {-0.874063,-0.686612}, + {-0.445655,-1.003053}, + {0.928618,0.248422}, + {0.478245,-0.872451}, + {-0.240218,0.229832}, + {-0.207487,1.315485}, + {0.708097,-0.459610}, + {0.324259,-1.091280}, + {-1.452807,0.091208}, + {1.395570,-1.863330}, + {0.999160,-1.241401}, + {0.280141,-0.706033}, + {-0.925961,0.469675}, + {-0.688460,-0.963031}, + {0.119873,0.226830}, + {-0.106209,-0.158092}, + {0.677296,-0.307387}, + {0.390625,0.002007}, + {-1.651675,0.216743}, + {0.079875,0.792000}, + {0.235602,0.452420}, + {0.777284,-0.266590}, + {-0.895642,-0.021410}, + {0.254087,0.034999}, + {-0.270512,-0.127041}, + {-0.256159,-0.869917}, + {0.373497,1.048321}, + {-0.762650,-0.290650}, + {-0.578370,-0.111365}, + {-1.982232,-0.062361}, + {0.578377,-0.656604}, + {-0.468886,0.154771}, + {0.844443,1.791920}, + {0.097667,-1.339984}, + {0.210075,1.094129}, + {-0.206117,0.067388}, + {0.421055,0.203273}, + {0.584588,0.986430}, + {0.133407,-0.641132}, + {-1.170174,-0.263451}, + {-0.157218,-0.021621}, + {1.475833,-0.127775}, + {0.078896,0.799595}, + {-1.587069,-0.475999}, + {0.695471,0.483917}, + {0.025792,-0.441905}, + {1.007477,0.041037}, + {-0.181478,-0.017029}, + {0.036815,-0.111715}, + {-0.465989,0.179141}, + {0.794247,0.927431}, + {0.285622,-0.418923}, + {-0.068971,-0.305474}, + {-0.463998,-0.444865}, + {0.699853,-1.012322}, + {0.151237,1.087834}, + {-0.146684,0.233955}, + {0.567227,-0.089576}, + {-0.224722,0.477183}, + {1.199889,1.553201}, + {0.760053,0.017195}, + {0.261229,0.445578}, + {-0.705770,-1.755211}, + {0.290944,0.079387}, + {0.133894,-0.691097}, + {-0.059663,2.211638}, + {0.370996,-0.939649}, + {0.112302,1.366692}, + {0.188262,-0.356295}, + {-0.612580,0.733432}, + {0.619933,0.144186}, + {0.278577,0.110054}, + {0.225926,0.612772}, + {-0.729589,0.857299}, + {1.264619,0.408863}, + {-0.628055,-1.407078}, + {-0.514858,-0.744270}, + {0.619405,1.047669}, + {-0.199934,0.731997}, + {0.418989,-0.042346}, + {0.785841,-0.113664}, + {-0.932752,-0.678127}, + {-0.806044,0.573963}, + {0.587483,0.194597}, + {-0.103663,0.283307}, + {-0.433701,1.184546}, + {0.790999,0.223614}, + {1.419865,1.046606}, + {-0.830056,0.788822}, + {-0.242103,-0.605081}, + {-1.753848,-0.814530}, + {0.527669,0.991027}, + {-0.240201,-0.427279}, + {0.856250,0.646151}, + {1.153696,0.714506}, + {0.866539,0.692044}, + {0.203711,0.315015}, + {-0.285981,-0.182996}, + {0.789261,-0.986318}, + {-0.144656,0.102805}, + {-0.151745,-0.054796}, + {-0.093111,0.849218}, + {0.517938,0.271205}, + {0.552012,-0.102406}, + {1.085765,0.387176}, + {0.084600,1.884932}, + {-0.054731,-0.030402}, + {1.382310,-0.885943}, + {0.098738,0.889079}, + {1.144495,-0.059725}, + {-0.899532,0.664015}, + {-0.181939,0.217922}, + {0.321437,0.396019}, + {0.285473,-1.089756}, + {0.586511,0.295108}, + {-0.372205,0.500376}, + {-0.078211,0.182058}, + {0.011147,-0.495137}, + {0.896627,-0.426638}, + {-0.092586,-0.308805}, + {0.601102,1.063945}, + {0.749759,-1.427166}, + {1.055874,0.699219}, + {-0.903965,-0.438794}, + {-0.707729,0.384313}, + {-0.101038,0.921657}, + {-0.485551,0.820867}, + {0.236179,-0.929859}, + {1.125738,-0.530163}, + {0.077800,-1.861208}, + {-0.730572,0.920142}, + {-0.898268,0.339665}, + {-0.317154,0.181412}, + {-0.160429,-1.323295}, + {-0.400514,-0.563102}, + {-0.014542,0.576620}, + {-0.381432,-0.415218}, + {-0.377208,0.718852}, + {-0.705579,1.318340}, + {1.530143,-0.271100}, + {-0.221327,-0.588484}, + {-0.022733,-0.642035}, + {0.030789,-0.791981}, + {-0.766666,-0.492790}, + {-0.749544,-0.073490}, + {0.447054,-0.800807}, + {1.070489,0.825108}, + {-0.727046,0.726992}, + {-0.060446,-1.037320}, + {-0.328770,0.190905}, + {-0.128967,-0.434271}, + {-0.186546,0.312983}, + {0.935917,-0.100236}, + {-0.047536,-0.213380}, + {0.082069,-0.603080}, + {-0.913393,-0.849605}, + {-0.457231,-0.796030}, + {0.682990,0.778589}, + {0.209229,-0.807062}, + {0.272420,1.125802}, + {0.036284,1.629727}, + {0.104411,-0.167382}, + {-0.626081,-0.031098}, + {-0.351775,-1.618939}, + {0.413605,0.257989}, + {-0.370629,0.161392}, + {-0.330446,0.806375}, + {0.390219,-0.746819}, + {-0.509487,-0.047151}, + {-0.273129,-0.108304}, + {-0.319689,-0.338005}, + {0.842067,0.281057}, + {0.055884,0.234417}, + {-0.365933,0.614457}, + {-0.454615,1.448888}, + {-0.699608,-1.033875}, + {-0.372957,0.671612}, + {-0.133444,-0.030193}, + {-0.924223,0.603383}, + {-0.516276,0.204182}, + {-0.382316,-0.235633}, + {-0.187827,-1.054536}, + {-0.442085,0.354249}, + {0.622665,0.610810}, + {0.265960,-0.284553}, + {0.040194,-0.911782}, + {-0.509020,0.860569}, + {0.600634,-1.182167}, + {0.151219,0.454662}, + {-0.418144,0.065874}, + {-1.569977,1.023171}, + {0.266306,0.219226}, + {0.791286,0.244977}, + {-0.241393,0.875145}, + {-0.318656,-1.030454}, + {-0.022462,0.214741}, + {-0.619332,0.153986}, + {-1.020611,-1.628587}, + {0.479077,0.439942}, + {1.740772,1.610355}, + {0.003287,0.194352}, + {0.566085,0.121822}, + {-1.147140,0.412844}, + {1.376034,0.118976}, + {0.420202,-1.038233}, + {0.373144,0.162301}, + {0.794360,0.106407}, + {-0.962990,-0.802783}, + {0.056256,0.007095}, + {-0.708347,-0.662442}, + {-0.959655,1.323960}, + {-0.529900,0.259971}, + {1.193998,0.563030}, + {0.939263,1.103177}, + {-0.385987,0.149407}, + {-0.476455,-1.133539}, + {0.308749,0.266472}, + {-0.497402,0.161375}, + {-0.740784,0.032059}, + {-0.760730,-0.593766}, + {-0.063348,-0.060021}, + {0.633546,-1.329736}, + {0.834383,0.497996}, + {-0.600352,0.731318}, + {-0.447242,0.431888}, + {-1.343652,-0.365840}, + {0.777551,-0.685316}, + {-0.680872,-0.406050}, + {-0.586652,-0.305786}, + {-0.554828,0.022048}, + {-0.699549,-0.247367}, + {1.389279,-0.742174}, + {-0.065282,-1.308684}, + {-0.261274,-0.493450}, + {-0.733425,0.887315}, + {-0.025220,-0.501261}, + {0.241883,-0.683133}, + {-0.140739,0.262319}, + {-2.045143,-1.409459}, + {1.343072,0.855186}, + {-0.035921,-0.283506}, + {0.106737,0.720865}, + {0.406583,0.040440}, + {0.214985,1.947726}, + {0.438985,-0.798479}, + {-0.217059,0.167267}, + {1.243574,0.015551}, + {-0.125817,-0.046205}, + {-1.183831,-1.384855}, + {-0.322551,0.251363}, + {-0.722839,0.595898}, + {0.551627,-0.760119}, + {1.054220,0.065259}, + {0.591739,-0.191866}, + {0.296816,-0.332836}, + {1.165112,-0.248075}, + {0.248393,-0.545047}, + {1.311024,-0.407092}, + {0.591438,-1.621612}, + {-0.052964,-0.001681}, + {-0.298430,-0.248136}, + {0.275239,-0.088719}, + {-0.147969,-0.645551}, + {-0.505692,0.261343}, + {0.309140,0.959088}, + {0.921434,0.629677}, + {0.748760,1.088213}, + {-0.680151,-0.335191}, + {-0.613400,0.493749}, + {0.727131,-0.030512}, + {-0.379323,-1.035416}, + {-0.211766,-0.796419}, + {-0.454060,0.049283}, + {-0.049881,0.070106}, + {-0.279312,0.046965}, + {-0.397766,0.760498}, + {0.520312,-0.439711}, + {0.331968,-1.409079}, + {0.427486,0.218783}, + {1.003588,-0.080820}, + {1.556979,-0.423669}, + {0.619977,0.469522}, + {-0.045054,-0.809393}, + {-0.528064,-0.036637}, + {-0.482697,0.131513}, + {-0.460037,0.505505}, + {-0.324516,-0.389828}, + {0.460368,-0.314426}, + {-0.560330,-0.324922}, + {-0.376507,-0.059857}, + {-0.851451,-0.423302}, + {0.336302,-0.960355}, + {1.612286,-1.262715}, + {0.637618,-0.176273}, + {0.382746,0.450728}, + {0.643770,0.137805}, + {-0.321537,1.065434}, + {-0.913438,-1.344611}, + {0.123579,-0.525252}, + {-0.684321,-0.050399}, + {0.092025,-0.049197}, + {0.230247,-0.846072}, + {-0.567252,1.537805}, + {-0.113614,-0.004427}, + {0.694251,-0.089008}, + {-0.303172,-0.350574}, + {0.609402,-0.434146}, + {0.107243,-0.651101}, + {1.272207,-0.348857}, + {-0.502908,0.151282}, + {-0.145185,-1.741187}, + {0.660613,-0.230215}, + {0.178185,-0.686348}, + {1.272619,-0.158281}, + {-0.280741,0.764747}, + {0.044990,-0.769996}, + {0.417010,0.096608}, + {0.062595,1.686842}, + {2.151472,0.043530}, + {0.715346,1.734442}, + {0.098966,-0.998731}, + {0.599808,0.342824}, + {-0.343734,0.708030}, + {-0.128109,-0.806256}, + {0.761198,0.210038}, + {-0.138642,0.040832}, + {-0.062262,0.648355}, + {1.277507,0.552877}, + {-0.927193,-0.325931}, + {-0.249534,-0.771760}, + {0.521253,-0.650575}, + {0.616145,1.180146}, + {-0.318551,-0.126697}, + {-0.526436,-0.915103}, + {1.171009,1.586755}, + {-1.579776,-0.032072}, + {0.379730,-0.424383}, + {0.219217,-0.851723}, + {0.557224,0.464978}, + {-0.216519,0.253208}, + {0.972628,0.385579}, + {0.412359,0.086125}, + {0.876441,-0.274872}, + {-0.407527,-0.657947}, + {0.541719,0.812008}, + {0.772499,0.092084}, + {0.502839,0.363918}, + {0.146701,0.081139}, + {-0.007951,-0.624450}, + {-0.605555,-1.647412}, + {-0.169302,-0.077049}, + {-0.244837,-0.620332}, + {0.764241,-0.522473}, + {-1.133782,0.258060}, + {0.948375,0.016726}, + {1.587208,-0.235768}, + {0.424286,0.560435}, + {0.366718,-0.229027}, + {0.114061,-0.120273}, + {-0.032553,-0.706649}, + {-1.656256,0.469776}, + {-0.800075,0.163134}, + {0.184989,-0.490187}, + {-0.066939,0.069671}, + {-0.124030,-0.278587}, + {0.098588,-0.516323}, + {0.641825,0.433273}, + {0.039826,-1.896522}, + {0.544579,0.174252}, + {-1.136703,0.508232}, + {0.473606,-0.928168}, + {-0.262024,0.277016}, + {-0.525881,-0.940302}, + {0.774239,0.928604}, + {0.475874,-0.471899}, + {-0.803854,0.030975}, + {-0.993059,-1.988145}, + {0.006261,-0.462312}, + {0.304373,-0.219476}, + {-0.064896,0.411816}, + {-0.565623,0.410175}, + {0.451946,0.896558}, + {0.579193,-0.666237}, + {1.111956,-0.324559}, + {0.958126,0.875141}, + {-2.376995,0.139360}, + {-0.174255,-0.647183}, + {0.014742,0.174545}, + {-0.527097,-1.346987}, + {1.514308,1.010371}, + {0.148586,0.574571}, + {-0.282640,0.894507}, + {-0.099804,0.189072}, + {-0.371499,-0.000976}, + {0.094502,1.606489}, + {-0.417943,0.639646}, + {0.660216,-0.605938}, + {-0.545899,-0.550059}, + {1.076567,-0.745220}, + {0.405227,0.711701}, + {-0.366586,0.196052}, + {0.860394,0.269181}, + {-1.127270,0.202607}, + {0.136211,0.475897}, + {0.459787,0.495293}, + {0.544301,-0.482145}, + {0.365063,0.234250}, + {-0.593792,-0.434170}, + {-0.426111,-1.761006}, + {0.869614,-0.020494}, + {-0.467603,0.072709}, + {-0.324193,-0.665541}, + {0.777996,-0.277466}, + {-0.283302,0.615438}, + {-1.708614,0.792042}, + {0.621137,-0.463159}, + {0.521234,0.742400}, + {-0.133299,-0.939262}, + {-0.160119,-0.770287}, + {-0.512796,0.969515}, + {0.315453,-1.192219}, + {1.288366,0.188477}, + {0.555009,0.515260}, + {0.190975,-0.611313}, + {0.181731,0.979969}, + {1.256390,-0.748626}, + {-0.335278,-0.480621}, + {-0.671001,0.965038}, + {-0.104705,0.209754}, + {-0.085875,-1.716713}, + {-1.640847,-0.669974}, + {0.447848,-0.348934}, + {0.265837,1.298157}, + {0.752559,1.353997}, + {-1.107378,1.884381}, + {-0.974856,0.729668}, + {-0.408192,0.715443}, + {0.256093,-1.141904}, + {-1.426772,0.454018}, + {-0.379814,-0.020252}, + {0.808918,-0.270355}, + {0.032856,-0.539366}, + {-1.792033,-0.556382}, + {-0.749878,0.045814}, + {-1.284019,0.264061}, + {-0.644668,0.334991}, + {0.167439,0.463690}, + {0.781219,0.368265}, + {-0.260223,-0.044352}, + {-0.071616,-0.070425}, + {-1.084332,0.404648}, + {-1.607982,-0.417932}, + {0.755238,-0.174306}, + {0.185585,1.881097}, + {-0.015098,0.559027}, + {-0.177597,-0.752248}, + {-0.550116,-1.060073}, + {-0.358345,-0.425293}, + {0.348800,-0.817303}, + {-0.881309,-0.246413}, + {0.925273,-0.021585}, + {-0.725402,0.242012}, + {0.185628,0.275909}, + {-0.422986,1.393526}, + {0.628901,-0.118229}, + {0.317355,-0.260886}, + {0.700872,-0.179362}, + {-0.261562,-0.299310}, + {0.255547,0.459484}, + {0.874547,-0.523117}, + {1.173201,1.024590}, + {-0.996085,-0.014251}, + {-0.936499,-0.186035}, + {-0.124365,-0.515926}, + {-1.063564,-0.984708}, + {0.564578,-1.758164}, + {-0.798557,-0.294069}, + {-0.100377,0.060186}, + {-0.199967,-0.488498}, + {0.888361,-0.509741}, + {0.983519,1.571630}, + {0.112599,1.056708}, + {0.873252,0.482406}, + {0.452934,-0.285808}, + {-0.043803,-0.750535}, + {0.403150,0.892230}, + {-0.396320,-0.357763}, + {-0.332699,-0.116355}, + {0.593079,0.468945}, + {0.284203,0.714000}, + {0.215099,-0.285505}, + {-1.147423,0.160707}, + {-0.762612,1.411527}, + {0.472681,0.269305}, + {0.255840,-0.160359}, + {-0.055088,1.194371}, + {-0.698704,-0.799073}, + {-1.285369,0.675681}, + {1.004399,-0.126013}, + {-0.548650,0.989301}, + {-0.348031,0.143843}, + {0.019998,-0.340962}, + {1.023248,0.761331}, + {-0.902970,-1.223627}, + {-0.279665,0.623119}, + {-0.366014,0.496679}, + {-0.813344,-0.457467}, + {-0.372345,0.539890}, + {-0.485404,-0.267196}, + {0.536624,0.644437}, + {1.607247,0.297879}, + {0.220415,0.883121}, + {-0.610471,-0.507677}, + {0.457363,0.253781}, + {-0.258994,0.833024}, + {-0.261108,-1.096423}, + {-0.890548,-0.267881}, + {-0.514366,-0.459512}, + {0.812269,-0.123179}, + {-0.034540,0.119925}, + {-0.180841,0.846220}, + {-0.752312,-0.637519}, + {1.026199,1.242000}, + {0.197854,-1.717988}, + {0.475428,0.194479}, + {0.292648,-0.864272}, + {0.947169,-0.161454}, + {-0.464096,-0.510604}, + {1.153502,0.164372}, + {0.487626,-1.698067}, + {-0.435832,-0.248461}, + {0.986247,0.332766}, + {0.573550,0.450706}, + {0.217594,-0.594628}, + {0.411145,0.714235}, + {-0.635136,1.259112}, + {0.505637,0.257079}, + {1.088652,0.088325}, + {-0.412997,1.426823}, + {0.773139,0.811379}, + {1.222511,-1.367456}, + {0.062337,0.036862}, + {-0.941056,-0.307414}, + {-0.219902,0.345179}, + {-0.822663,-0.150728}, + {-0.830573,0.243392}, + {0.184643,-1.254941}, + {0.044543,2.065648}, + {-0.303212,0.177042}, + {-1.024625,-0.575737}, + {-1.766237,-0.128839}, + {1.166984,-1.325277}, + {0.296716,-0.350582}, + {0.108368,-0.173239}, + {0.820007,-0.685029}, + {-1.179457,-1.230915}, + {0.373694,-0.295121}, + {0.792136,0.427746}, + {0.908489,0.134038}, + {0.112420,0.145958}, + {-0.528428,-0.719873}, + {-1.018138,-0.106810}, + {0.487126,0.785684}, + {-0.459239,1.922989}, + {0.315122,-0.019843}, + {0.271436,1.009157}, + {-0.561563,-0.748185}, + {-0.823416,-0.551511}, + {-0.966122,-1.600366}, + {0.213364,-0.578518}, + {0.495633,-0.444785}, + {-0.527658,1.519762}, + {-0.069264,0.878791}, + {-0.269854,0.404970}, + {-0.610037,-0.956304}, + {0.484475,0.633773}, + {-0.168591,-0.969952}, + {0.484383,1.817719}, + {0.141585,0.111118}, + {-1.199097,-0.051283}, + {-0.528354,0.347269}, + {0.475852,0.415654}, + {0.228798,0.835716}, + {-0.253920,0.038539}, + {1.462540,-0.489890}, + {-0.104670,-0.701368}, + {-0.022712,-0.856311}, + {-1.130025,0.873925}, + {-0.019534,-0.883438}, + {-0.193835,0.406293}, + {-0.387684,0.052551}, + {1.298327,-0.709101}, + {-0.310405,0.001679}, + {-0.481614,-0.685795}, + {-1.062058,-0.520206}, + {-1.344745,-0.153656}, + {-0.831422,0.037292}, + {0.400435,1.234084}, + {0.727975,0.204297}, + {0.824147,-0.809614}, + {0.702855,-0.127743}, + {-1.649216,1.142318}, + {0.341254,0.448017}, + {-0.898656,-0.789927}, + {1.058227,-0.602215}, + {-1.095050,-0.894509}, + {-0.599427,-0.153097}, + {-0.102633,0.228645}, + {0.508210,0.665789}, + {-0.535104,0.147440}, + {-1.277860,-1.283381}, + {-0.023286,0.344266}, + {-0.632160,0.903716}, + {0.360618,-0.187216}, + {-0.390545,0.532805}, + {-0.595274,1.078196}, + {0.211172,-0.862871}, + {0.328564,-0.792903}, + {0.829098,0.198476}, + {-0.566607,1.373401}, + {-0.019308,0.285081}, + {-0.888302,0.700636}, + {0.148316,0.138057}, + {1.181460,0.019935}, + {0.392411,0.162331}, + {-0.247861,0.263792}, + {0.505014,-0.182329}, + {0.628016,1.287511}, + {0.212292,1.024624}, + {0.687431,1.089767}, + {0.564834,-0.028119}, + {0.371715,-1.099486}, + {0.357609,0.070059}, + {2.215728,0.181810}, + {0.836665,-0.244650}, + {-0.220496,0.330559}, + {0.676588,0.472829}, + {-0.829341,-0.226416}, + {0.744014,-0.881448}, + {-0.729316,-0.218085}, + {-0.984519,-0.858390}, + {-0.487788,0.244053}, + {-0.671190,-0.312322}, + {0.049124,0.288241}, + {-1.004947,0.620259}, + {-0.321884,-0.417017}, + {-0.493885,0.523531}, + {-0.059619,-0.791344}, + {-0.457605,0.691495}, + {0.170169,-0.246006}, + {1.075328,-0.540974}, + {-0.079762,0.947477}, + {-0.010670,-0.267796}, + {0.943646,0.021645}, + {-0.285628,-0.533131}, + {-0.326849,0.040866}, + {-1.421573,-0.739533}, + {1.107711,-0.003967}, + {1.000615,-0.065396}, + {0.312538,-0.117636}, + {-0.125344,-0.171464}, + {-1.212099,-0.453897}, + {0.288620,-0.519846}, + {-0.248802,-1.402444}, + {-0.310674,0.442311}, + {0.098956,0.041407}, + {-0.145050,1.286205}, + {-0.429898,0.190147}, + {-1.606072,0.685533}, + {0.367341,0.528374}, + {-0.074278,-0.544411}, + {0.109107,0.601468}, + {-0.454410,0.957520}, + {0.453384,0.097285}, + {-1.143893,0.610775}, + {1.249307,-0.776195}, + {0.494955,1.337840}, + {0.242363,0.197588}, + {-0.114836,-0.076961}, + {-0.517306,0.086171}, + {0.536084,0.234221}, + {-0.269984,-0.404274}, + {0.607933,-0.179944}, + {1.480986,0.514357}, + {-1.274472,-0.307237}, + {0.687074,1.058117}, + {-0.400117,0.313936}, + {-0.791993,-0.417857}, + {-0.561613,-0.645294}, + {0.656279,-0.373169}, + {0.740039,-0.034331}, + {-0.240484,-0.434931}, + {-0.485973,0.426967}, + {0.234931,1.122127}, + {0.391140,-0.409224}, + {0.549154,0.884721}, + {-0.915296,-0.762616}, + {0.305934,-0.771631}, + {-0.760185,0.255838}, + {0.140172,0.086197}, + {-0.136659,-1.801038}, + {-0.285519,-1.066988}, + {-0.359939,1.554395}, + {0.289408,0.825934}, + {0.461379,-0.152002}, + {-0.806281,0.378343}, + {-1.253917,-1.287774}, + {-0.911462,-0.640941}, + {0.986825,0.222918}, + {0.108762,0.707578}, + {0.028426,1.052636}, + {0.337372,0.262425}, + {-0.074310,-0.230538}, + {-0.746241,-0.364158}, + {0.184766,0.326757}, + {0.299052,0.408284}, + {0.454029,0.336521}, + {-0.418725,-0.640634}, + {-0.358958,0.325470}, + {-0.113820,1.106193}, + {0.097508,-0.640975}, + {0.004309,0.013634}, + {-0.103721,-0.180842}, + {0.500274,0.105109}, + {1.541197,0.972081}, + {0.441451,-0.455017}, + {0.040723,-0.995386}, + {0.963317,-0.421559}, + {1.402597,0.107761}, + {1.587690,0.790156}, + {-0.360062,0.069757}, + {0.272024,-0.645917}, + {0.182518,-0.169444}, + {-0.720138,0.570094}, + {-0.219343,-0.714791}, + {0.364707,0.085334}, + {1.238324,-0.048266}, + {-0.069206,0.421442}, + {-0.369665,0.405097}, + {-0.125755,1.815291}, + {1.339344,-0.722225}, + {0.212585,0.318092}, + {0.198631,-0.060546}, + {0.526265,0.353971}, + {-0.432338,0.914161}, + {-0.259149,-0.485961}, + {0.186000,-1.204080}, + {0.143559,0.179813}, + {0.174681,-0.217002}, + {-0.535888,0.862929}, + {0.138733,0.315051}, + {-0.281155,-0.621632}, + {0.825205,1.046364}, + {-1.448150,0.028607}, + {1.043647,-0.708319}, + {0.579024,-0.187058}, + {0.462025,-0.051373}, + {0.080543,-0.987185}, + {-0.422065,1.038899}, + {1.245455,0.673572}, + {0.120575,-0.872393}, + {-0.935692,-0.049482}, + {0.833592,0.112002}, + {-0.280053,-0.923684}, + {-0.352881,-0.159811}, + {0.006592,0.880995}, + {-0.334637,0.319727}, + {1.600511,0.559890}, + {-0.063299,0.518006}, + {0.767673,-0.342292}, + {0.894664,-1.056244}, + {0.218239,-1.485107}, + {1.313901,-0.284383}, + {0.416552,0.516669}, + {-0.945374,-0.353124}, + {-1.444466,-0.478877}, + {0.595701,-0.530269}, + {0.321203,-0.859422}, + {-0.202144,0.563280}, + {-0.921581,-0.435354}, + {-0.709879,-0.080659}, + {0.850755,0.425879}, + {0.371517,-0.722259}, + {-0.655815,-0.005035}, + {0.270087,0.539163}, + {-0.233616,0.091892}, + {0.062617,-0.648446}, + {0.581563,-0.013480}, + {-0.959711,2.092442}, + {-1.236567,-0.286320}, + {0.048573,-0.041422}, + {-0.491037,-1.454069}, + {1.001908,0.754578}, + {-0.301879,0.407477}, + {0.642198,0.246582}, + {0.224810,0.092193}, + {-0.272613,0.953599}, + {-0.427767,1.107148}, + {-0.212575,-0.673377}, + {0.074416,-0.040497}, + {0.889662,0.397214}, + {-0.188469,0.498567}, + {0.687591,1.144973}, + {1.150738,-0.377170}, + {-0.700195,0.414603}, + {-1.226960,-0.280948}, + {0.047836,-1.929469}, + {-0.082189,-0.056623}, + {-0.601386,-0.154564}, + {-0.462696,0.956185}, + {0.425110,0.342661}, + {-0.840692,0.701600}, + {-0.504892,0.547409}, + {0.111847,0.714410}, + {0.239928,-0.645067}, + {-0.108924,-0.190042}, + {-0.383790,0.092672}, + {-1.208346,0.551190}, + {0.603143,0.029640}, + {-1.009036,-0.200890}, + {-0.446945,-1.003718}, + {0.765485,-1.039887}, + {-0.480552,-0.196850}, + {-0.203509,-0.820593}, + {0.688553,0.072149}, + {0.703177,-0.301738}, + {0.086873,0.336471}, + {-0.087231,-0.206545}, + {0.269569,-0.857498}, + {0.233124,0.128947}, + {-0.484636,0.170069}, + {-0.537166,0.776772}, + {0.175699,-0.230826}, + {0.085410,-0.018865}, + {0.034945,-0.185273}, + {0.569387,0.834000}, + {0.947868,-0.930988}, + {-0.100640,0.458731}, + {1.002459,0.121581}, + {1.059436,-0.068274}, + {-0.421766,-0.185124}, + {0.812700,-0.879198}, + {1.381454,-0.394813}, + {0.765729,-0.434247}, + {-0.715909,-0.355391}, + {0.073886,1.283928}, + {0.489919,-0.471248}, + {0.194977,1.066605}, + {-0.578221,-0.425253}, + {-0.406449,1.355422}, + {-0.264036,-1.141037}, + {-0.684424,0.475471}, + {-0.556184,1.217787}, + {-0.098804,0.291072}, + {-2.004840,-0.218550}, + {0.675484,0.712235}, + {-0.467058,0.550342}, + {-0.743855,2.418363}, + {-0.778534,0.962859}, + {-0.835465,-0.887622}, + {0.044832,1.405487}, + {0.309662,-1.836249}, + {0.206982,-0.439087}, + {0.960534,-2.043925}, + {-0.543298,1.356592}, + {0.928993,-0.616757}, + {0.549173,0.603967}, + {-0.430636,-0.012406}, + {0.260641,0.304006}, + {0.440114,-0.450592}, + {0.231095,0.277928}, + {0.209124,-0.466697}, + {-0.960677,-1.002757}, + {1.075456,-0.462500}, + {-0.606526,0.152494}, + {-0.182662,-0.659743}, + {1.384662,-0.357479}, + {-1.330588,-1.047178}, + {0.502764,0.377201}, + {-0.247289,0.855959}, + {-0.012699,-0.113936}, + {0.364142,0.075726}, + {-0.269392,1.005615}, + {1.370532,0.307236}, + {1.142868,0.386704}, + {0.440215,-0.324471}, + {-0.033589,-0.638411}, + {-0.327272,1.068003}, + {-0.543571,-0.273416}, + {-0.365062,-0.542959}, + {1.250943,0.688743}, + {0.472615,-0.098602}, + {1.445136,0.536558}, + {0.784735,-0.170791}, + {0.064371,-0.779831}, + {0.308675,-0.603152}, + {1.586819,0.666450}, + {0.639744,-1.202155}, + {-0.627964,1.088006}, + {-0.476573,0.282566}, + {0.027772,0.994415}, + {0.334959,1.192618}, + {0.504855,0.281254}, + {0.413815,0.195150}, + {-0.592291,1.052660}, + {0.079286,-1.324581}, + {0.235540,-0.732265}, + {-0.005819,-0.171668}, + {0.067451,-0.441117}, + {0.607046,-0.160835}, + {-0.162694,0.829134}, + {0.421080,0.189770}, + {-0.116096,-0.441471}, + {-1.205497,-0.460146}, + {0.111566,0.707898}, + {-0.674216,0.010199}, + {-0.516917,-0.340492}, + {-0.253736,-0.133809}, + {0.293164,-0.493820}, + {0.094884,1.329867}, + {0.888509,0.028852}, + {0.507446,0.428109}, + {0.777171,-1.230643}, + {0.888975,-0.258522}, + {0.494596,0.073523}, + {-0.528695,-0.616262}, + {-0.133796,1.596729}, + {0.042732,0.994114}, + {0.187107,-0.683293}, + {1.709562,-0.422073}, + {-0.501284,-0.984705}, + {0.979104,0.114013}, + {0.619612,0.148485}, + {0.265311,0.436067}, + {-1.104922,0.399318}, + {-0.844686,0.364787}, + {0.045931,-1.764657}, + {0.234470,0.330008}, + {-0.745766,0.634961}, + {1.040822,-1.192880}, + {-0.924936,-0.069478}, + {-0.559008,1.068087}, + {-0.001940,-1.409943}, + {-0.963420,-0.425440}, + {-0.355644,-0.262865}, + {-0.325353,0.688031}, + {-0.505974,0.930113}, + {-0.513432,0.014631}, + {-0.641167,-0.464992}, + {0.989676,0.899411}, + {0.475176,1.152172}, + {-0.649576,-0.471232}, + {-0.544376,0.273234}, + {-1.936626,0.360009}, + {-0.788292,-0.146180}, + {0.029239,0.663837}, + {0.089389,-0.405482}, + {-1.006432,0.041522}, + {0.065737,0.170432}, + {-0.536108,0.463754}, + {0.249146,-0.505395}, + {0.371547,-0.812264}, + {-0.037906,-1.072131}, + {0.484523,-1.128252}, + {-0.715915,-0.328589}, + {-0.274512,0.228612}, + {-0.058716,0.021879}, + {0.702693,-0.158524}, + {-0.151997,0.473194}, + {-0.852896,-0.326452}, + {-0.100443,0.365915}, + {-0.955887,0.394822}, + {-0.208727,-0.344079}, + {-0.131318,0.157507}, + {0.210001,0.434525}, + {-1.062122,-0.117708}, + {-0.346687,-0.182016}, + {0.654369,-0.500059}, + {-0.307734,-0.826574}, + {0.155367,1.735056}, + {1.858707,-0.541347}, + {-0.268982,0.440984}, + {0.216965,-1.158686}, + {-0.431159,-1.260753}, + {-1.785308,-0.584553}, + {0.261771,0.584204}, + {1.451317,-0.742810}, + {-0.004668,-0.752829}, + {-0.024921,1.245290}, + {0.595504,0.565095}, + {0.960266,-0.329771}, + {0.326327,0.550239}, + {-0.863137,0.203973}, + {-0.380078,-0.435468}, + {1.090459,-0.823282}, + {-0.356638,0.283852}, + {0.682541,0.012101}, + {-0.308431,0.770005}, + {1.199072,0.069286}, + {-1.046700,1.675759}, + {-0.077715,0.534336}, + {-0.222926,0.910906}, + {0.261806,0.566523}, + {0.420022,-0.553801}, + {-1.412877,0.700632}, + {0.797401,0.323269}, + {-0.694224,0.960901}, + {0.533299,0.850659}, + {-0.991622,1.002736}, + {-0.028049,0.666471}, + {0.715754,-0.271882}, + {0.578916,0.553135}, + {0.231987,0.123384}, + {-0.109185,-1.359211}, + {-0.398565,0.173967}, + {-0.043014,-0.665217}, + {-1.225856,0.628940}, + {-0.929289,-1.132390}, + {1.603272,0.818561}, + {-0.103226,-0.692397}, + {0.141116,1.383120}, + {-0.400579,0.668820}, + {0.143826,-0.222660}, + {0.333041,-0.807693}, + {-0.320005,0.808184}, + {0.629822,-0.286580}, + {-0.772778,1.724556}, + {1.386505,0.462035}, + {-0.229246,-1.474260}, + {-0.503459,1.044767}, + {-0.250001,0.561403}, + {0.012072,-0.058950}, + {0.756583,0.503015}, + {-0.335019,-0.761904}, + {-0.682864,0.003814}, + {0.068344,0.231416}, + {0.256777,-0.369994}, + {-0.282520,-0.095213}, + {-0.187083,-0.559020}, + {-0.026183,-0.522028}, + {-0.650853,-0.769108}, + {0.035804,-0.431890}, + {0.030008,-0.399347}, + {-0.287980,-0.145851}, + {-0.677012,-0.560565}, + {-1.049641,-0.861592}, + {0.312580,0.091289}, + {-0.963485,0.211167}, + {0.287165,-0.371532}, + {0.555650,-0.838435}, + {0.395525,-0.449511}, + {0.252774,-0.490994}, + {-0.688084,-0.314271}, + {-0.402613,0.309283}, + {0.511800,-0.453051}, + {1.035475,-0.441895}, + {-0.655559,0.204947}, + {-0.683300,-0.428916}, + {0.387642,0.043918}, + {-0.179349,-0.651814}, + {-0.493107,1.155292}, + {-0.030356,0.289986}, + {0.652280,1.046866}, + {0.057809,1.266974}, + {0.215742,1.064339}, + {0.447729,-0.632852}, + {0.279966,-0.339154}, + {-0.166371,-1.026682}, + {0.421910,0.351254}, + {-0.254637,-0.154264}, + {-1.334090,-0.110719}, + {-0.566168,-1.155950}, + {-0.558998,0.207397}, + {-0.055417,0.648158}, + {-0.241039,-0.287178}, + {-0.582347,-1.040992}, + {-0.289176,0.447352}, + {0.564223,-0.500253}, + {0.200212,0.121773}, + {0.752287,0.131198}, + {-0.586207,-0.250267}, + {0.752385,-1.118821}, + {-0.454050,0.686154}, + {0.421964,-0.071049}, + {0.385670,0.105139}, + {-0.883155,0.420629}, + {0.582838,0.829220}, + {1.599990,0.302506}, + {-0.711621,-0.048242}, + {-0.769061,-0.939823}, + {-0.570805,1.221850}, + {0.746084,0.370521}, + {-1.095763,0.542099}, + {0.507870,-0.028658}, + {-0.006494,-0.140681}, + {1.123004,0.639325}, + {0.023228,-0.243014}, + {2.006419,-0.925360}, + {0.244315,0.241295}, + {0.714233,0.041423}, + {0.930361,1.159843}, + {-0.439284,-1.104778}, + {-2.044038,1.046255}, + {-0.247643,-0.295368}, + {-0.496474,-0.188701}, + {0.427399,-0.103610}, + {-0.048929,-0.755309}, + {-0.378127,-0.657410}, + {0.647217,0.149609}, + {0.628906,-1.593151}, + {-0.581867,-0.372896}, + {-0.483963,-0.772021}, + {-1.279053,-0.372171}, + {-0.505264,-0.021054}, + {-1.130825,0.247607}, + {0.329896,1.593840}, + {-0.312292,-0.619026}, + {-0.024599,0.020700}, + {-0.647591,-0.690874}, + {1.248162,1.039611}, + {-0.252032,0.173910}, + {0.311838,-0.632350}, + {-1.024234,0.131065}, + {0.035961,-1.216873}, + {0.477173,0.507557}, + {-1.295462,-0.451069}, + {-0.377181,1.110673}, + {0.706351,-0.382557}, + {-0.134564,-0.499312}, + {0.566652,-0.673370}, + {-0.967847,-0.852623}, + {-0.139758,-2.138448}, + {-0.176702,0.054714}, + {0.043205,0.100348}, + {-1.012144,-0.515393}, + {0.620692,-0.001168}, + {-0.231469,0.384359}, + {0.167537,0.294412}, + {-0.061414,-0.366999}, + {0.731633,0.876544}, + {1.154343,0.803758}, + {0.412281,0.559052}, + {-0.371725,-1.273328}, + {0.957476,-1.378973}, + {0.289512,-0.991069}, + {-0.578394,-1.421610}, + {0.015914,0.322132}, + {0.106358,-1.449675}, + {-0.069120,0.739722}, + {0.531874,-0.371638}, + {0.657279,0.323686}, + {0.037083,-0.796566}, + {1.061708,-0.965017}, + {0.413730,0.054267}, + {0.521430,1.075811}, + {0.856354,-0.905745}, + {0.373586,-0.270185}, + {0.791206,-0.986693}, + {0.729893,0.860268}, + {0.043905,-0.429560}, + {-0.656692,-1.039828}, + {0.555913,1.767401}, + {0.303388,-0.323869}, + {-0.125446,-0.255745}, + {1.117126,0.195974}, + {-0.992980,0.304440}, + {-0.382740,0.426044}, + {-0.223638,-0.152487}, + {1.023637,-0.350714}, + {0.245655,-0.157361}, + {-0.111659,-0.614165}, + {0.354600,0.026794}, + {-0.027813,0.532690}, + {0.245690,0.739772}, + {-0.504872,-0.794998}, + {-0.809269,-1.094385}, + {-1.001891,-0.480770}, + {-0.465059,0.023020}, + {0.229876,-0.151501}, + {-1.141435,-0.029146}, + {-0.937562,-0.801157}, + {-0.195200,-2.144830}, + {0.101337,0.587135}, + {0.153064,-0.325187}, + {-0.583504,-1.060043}, + {-0.098906,-0.330180}, + {-0.216563,-0.818141}, + {-0.211935,-0.707920}, + {0.636668,0.028993}, + {-0.758271,-0.108885}, + {-0.706584,0.097759}, + {1.376119,0.384825}, + {0.420516,1.213370}, + {1.030631,-0.077473}, + {-1.252726,1.002692}, + {0.487495,0.456548}, + {0.682253,0.398622}, + {0.147446,-0.079877}, + {0.722369,-0.614144}, + {0.378631,-0.601790}, + {0.075497,0.837757}, + {0.199081,0.445597}, + {0.535089,0.570803}, + {-0.122319,0.373349}, + {-0.321298,0.741177}, + {0.903177,-0.013977}, + {-0.583050,-0.924612}, + {0.066698,1.396794}, + {0.408667,0.958962}, + {-0.738580,-1.497866}, + {0.600777,-0.398895}, + {0.254742,0.347824}, + {-0.265817,0.876722}, + {0.907423,0.129822}, + {-0.114962,-0.826617}, + {-0.240360,-0.143947}, + {0.148077,-0.071668}, + {-0.212910,1.016550}, + {-0.013388,-1.067770}, + {0.046668,-0.442470}, + {0.256538,-0.318212}, + {-0.250360,1.417343}, + {-0.775082,1.038648}, + {1.220756,-0.342349}, + {-0.032158,-0.172829}, + {0.922113,0.382379}, + {1.047628,0.944538}, + {0.885199,-0.041166}, + {-1.458274,0.373000}, + {0.855979,0.373876}, + {0.431145,0.483826}, + {-0.019854,-1.320043}, + {0.213858,-0.134150}, + {-1.273584,-0.203977}, + {-0.916604,0.918129}, + {-0.768406,-1.109353}, + {-0.278667,-0.372253}, + {0.878634,0.434317}, + {-1.182409,0.691791}, + {-0.166143,0.370502}, + {-0.371636,-0.617445}, + {0.836100,-1.092805}, + {0.179593,2.209969}, + {-0.760372,-0.186876}, + {0.580655,0.070447}, + {0.637695,-1.328039}, + {-0.210008,0.169876}, + {0.107828,-1.200689}, + {0.689020,0.461975}, + {0.799638,-0.225619}, + {0.549319,0.257945}, + {-0.169926,-0.062423}, + {-1.000681,-1.230883}, + {-0.280677,-0.889594}, + {-0.365240,0.176973}, + {-0.496268,-1.327882}, + {-0.051553,1.031328}, + {-1.118158,1.437687}, + {0.069181,-0.263582}, + {0.034310,0.657226}, + {-0.665250,-0.249209}, + {-0.265277,-0.231715}, + {0.768583,-0.439151}, + {-0.516311,1.258394}, + {-1.062635,-0.480988}, + {0.768868,1.387988}, + {-0.133561,-0.253474}, + {0.174635,-0.763359}, + {0.207988,0.224757}, + {0.171049,1.245499}, + {-0.923550,1.085739}, + {0.631564,-1.467559}, + {-0.160409,0.068830}, + {-0.008023,-1.455924}, + {0.180831,-0.762764}, + {0.303099,2.221159}, + {0.032024,0.734284}, + {0.086762,-0.565552}, + {-0.273328,1.536368}, + {-0.101105,-0.703900}, + {0.023821,-0.404259}, + {0.138986,-0.943679}, + {-0.511459,0.739696}, + {-1.031153,0.329790}, + {-0.038206,-0.799769}, + {0.440881,-0.555912}, + {0.023990,-0.531059}, + {0.659228,-0.843024}, + {-0.826474,-0.770692}, + {0.946334,-1.545003}, + {0.261025,-0.113739}, + {0.048911,-1.179110}, + {0.060770,-0.859467}, + {-0.785178,-0.587693}, + {-0.381189,0.094381}, + {0.630990,-0.822901}, + {0.013473,-0.408986}, + {-1.789311,0.714900}, + {1.519795,-0.195693}, + {-0.701243,0.864168}, + {-0.915110,0.072452}, + {-1.261997,1.360065}, + {-0.163284,0.527620}, + {0.649672,-0.335824}, + {0.610109,0.962789}, + {1.048801,-0.879891}, + {-1.064425,-1.265436}, + {0.105428,-0.129546}, + {1.539402,-0.029218}, + {-0.431054,-0.384473}, + {0.440965,-1.503971}, + {-0.553600,0.461140}, + {0.432415,-0.588674}, + {0.466966,0.767686}, + {-1.282511,-0.822551}, + {-0.405750,-0.169677}, + {-0.529296,-0.256420}, + {0.333425,-0.212289}, + {0.351865,-1.052035}, + {-0.372759,-0.324327}, + {0.496838,0.426941}, + {0.521469,0.729775}, + {-0.360286,0.330552}, + {-0.939280,-0.731402}, + {-0.589460,0.375702}, + {0.473278,0.562849}, + {0.907852,0.477585}, + {-1.161415,0.674441}, + {-0.978026,0.108291}, + {-0.646718,0.244958}, + {-0.037385,-0.220525}, + {-0.453012,0.255493}, + {0.903459,-0.255742}, + {-0.099331,0.318876}, + {0.002754,-0.225539}, + {0.134105,-0.165745}, + {1.240310,-0.105975}, + {0.009197,0.949681}, + {-0.673977,0.458706}, + {0.679855,-0.534481}, + {-0.073767,0.277108}, + {0.277924,-0.047804}, + {0.415045,-0.608651}, + {0.122556,0.982192}, + {-0.446661,-0.313225}, + {1.173726,1.220580}, + {-1.593188,0.789350}, + {-1.834105,-1.079304}, + {0.107095,-0.091381}, + {1.110756,0.061581}, + {-0.917192,0.734789}, + {0.348696,-1.323831}, + {0.010933,1.090009}, + {-0.106413,-0.322089}, + {-0.860837,-0.506303}, + {0.627199,0.541836}, + {-0.139889,-0.512866}, + {0.637993,0.510208}, + {-1.167249,-0.146076}, + {-0.862119,0.394909}, + {-1.240754,0.494548}, + {-0.376744,0.672959}, + {-0.999381,0.637653}, + {-1.391600,0.390940}, + {0.955660,-0.769621}, + {0.310879,-0.798671}, + {0.408795,-0.452281}, + {-0.974719,-0.029192}, + {0.311104,0.273352}, + {0.026062,-0.858645}, + {0.556329,0.206713}, + {0.094267,-1.481594}, + {-0.356078,0.544259}, + {-0.033796,-0.245353}, + {0.203784,0.331156}, + {0.096733,2.575388}, + {-0.381793,0.290671}, + {-0.116102,-0.156839}, + {0.161793,0.594064}, + {-0.321204,-1.339815}, + {-1.090421,-0.762797}, + {0.787900,0.459478}, + {0.243785,0.940882}, + {-0.153906,0.841058}, + {-0.936971,1.541452}, + {-0.439278,-0.322908}, + {-1.066801,-0.222840}, + {0.629434,-0.352457}, + {-0.202999,0.278222}, + {-0.505916,0.969990}, + {0.396149,-0.315510}, + {-0.829205,-0.140890}, + {-0.660853,-0.447071}, + {-0.699586,0.850048}, + {-0.706088,0.377818}, + {-0.876828,0.869990}, + {0.937227,-0.354026}, + {-1.149567,-0.878271}, + {-0.807950,-0.806797}, + {-0.733349,-1.050036}, + {0.134549,-1.452923}, + {0.623023,0.412688}, + {0.119168,-1.377420}, + {0.682589,0.820573}, + {0.800743,-0.117315}, + {-0.930976,-0.305719}, + {0.007050,0.193402}, + {1.580681,0.605792}, + {0.281324,0.201371}, + {0.005740,1.007009}, + {0.993450,-0.268242}, + {0.289972,-0.080020}, + {0.206252,0.023882}, + {-0.015665,-2.024198}, + {0.371283,-1.340106}, + {-0.213033,-0.457500}, + {0.263077,-0.366399}, + {0.710898,-1.090262}, + {0.677746,-1.151681}, + {1.238201,-0.610042}, + {0.325461,-1.103737}, + {-0.980765,-0.488024}, + {-0.077484,0.774584}, + {0.496364,0.004649}, + {0.643821,1.447878}, + {-0.743024,-1.112741}, + {-0.195607,0.639318}, + {-0.080202,0.412438}, + {0.916875,0.189103}, + {-0.106268,0.390295}, + {0.715604,-0.486286}, + {0.115849,1.370489}, + {-0.576103,1.129486}, + {0.935521,-0.616187}, + {-0.914664,0.196014}, + {0.360647,0.177486}, + {0.442306,-0.048782}, + {-1.345507,0.159373}, + {-1.024007,-1.295577}, + {0.303087,-0.450638}, + {0.225152,-0.356881}, + {-0.503513,-0.770894}, + {-0.333461,-1.843134}, + {-0.432863,-0.889999}, + {-0.784493,-0.566774}, + {0.410618,0.701420}, + {0.136290,-1.037936}, + {0.145021,0.974063}, + {0.529589,0.128197}, + {-0.676674,-0.971814}, + {-0.270406,1.019808}, + {0.096367,-0.838265}, + {0.318717,-0.762441}, + {0.397090,0.756928}, + {0.648969,0.667148}, + {-0.913693,-0.162627}, + {0.119623,0.022965}, + {0.555892,0.378100}, + {0.900717,0.703179}, + {-0.046262,-0.721821}, + {-1.181653,0.505205}, + {0.465203,-0.477470}, + {0.046090,-0.627510}, + {-0.363122,-0.091161}, + {0.953653,1.039114}, + {-0.789380,-0.928026}, + {0.162396,0.803479}, + {-0.835156,-0.260672}, + {0.250119,-0.467056}, + {0.218336,0.454615}, + {0.209926,1.190928}, + {-1.178592,-0.891917}, + {0.550639,-0.793167}, + {-1.985065,-1.044282}, + {-0.196421,-0.054591}, + {0.084188,-0.363259}, + {-0.505210,-0.803844}, + {1.240644,-0.301110}, + {0.512258,-0.469191}, + {-1.549377,0.756018}, + {-0.614481,-0.080973}, + {-0.744195,-0.048617}, + {0.879512,-0.837412}, + {-1.089793,1.223308}, + {1.011531,0.192099}, + {0.335207,-0.361593}, + {0.976295,-0.603421}, + {-0.220526,-0.371096}, + {-1.002946,0.716884}, + {-0.444541,-0.037052}, + {-0.477626,0.295812}, + {-1.046918,-2.279811}, + {0.133746,-0.120300}, + {0.279460,0.397052}, + {-0.663998,0.035170}, + {1.121487,0.680845}, + {1.108689,1.142655}, + {0.380884,1.253683}, + {0.106635,-0.096270}, + {0.651713,-1.297000}, + {0.481130,-0.876693}, + {-2.086800,0.062748}, + {0.502741,0.743331}, + {-0.634120,0.417364}, + {0.332408,-1.807629}, + {0.288393,-0.248269}, + {-0.589845,0.528027}, + {-0.953016,0.010891}, + {1.215645,-1.463684}, + {0.179478,-0.118753}, + {0.304072,0.579308}, + {-0.786558,-1.384700}, + {1.545828,0.671325}, + {-1.103380,0.496542}, + {0.566262,0.207667}, + {0.168035,-0.084493}, + {-0.745029,0.787807}, + {-0.008405,0.486130}, + {-1.256400,-0.811337}, + {-0.421056,-0.997844}, + {-0.129980,-0.010057}, + {0.683615,0.299871}, + {0.171174,-0.371855}, + {0.239929,-0.288358}, + {0.736989,0.844517}, + {0.502939,-0.293006}, + {-0.078536,-0.030891}, + {0.889214,0.617627}, + {0.107697,-0.504655}, + {-0.322943,-0.180390}, + {-0.659880,-0.211751}, + {-0.425630,1.220749}, + {1.564708,1.804423}, + {-0.562868,0.198486}, + {-0.064851,-0.014952}, + {-0.685409,0.304867}, + {1.341588,0.203554}, + {0.391212,-0.841740}, + {0.700891,0.658326}, + {-0.301305,0.902339}, + {-0.046588,0.019530}, + {0.415121,-0.949705}, + {-0.410635,-0.231837}, + {0.615095,1.334066}, + {-0.067261,0.324586}, + {0.167043,-1.136141}, + {0.422422,0.696197}, + {0.584087,0.667480}, + {-0.551074,0.249301}, + {0.421860,-0.454014}, + {-0.585820,-0.664637}, + {-0.071516,0.815123}, + {-0.541864,0.195446}, + {0.866604,-1.519052}, + {-1.811300,0.473683}, + {-0.412564,0.863621}, + {-0.125827,-0.223240}, + {0.963505,0.064195}, + {0.096324,-0.017230}, + {-0.559212,0.385040}, + {-0.071234,0.362721}, + {-0.783611,-1.711285}, + {-0.466996,-0.665663}, + {-0.422348,0.153831}, + {0.031726,0.347303}, + {0.126585,0.194805}, + {1.089699,-0.115948}, + {0.261952,1.193404}, + {-0.062577,0.658827}, + {1.046650,1.250723}, + {0.343986,-0.385875}, + {0.398418,-1.112678}, + {0.397788,0.432553}, + {-0.081351,-0.869887}, + {0.115778,-1.810748}, + {1.089135,0.283668}, + {0.348676,-0.215081}, + {0.990831,0.340013}, + {-0.429526,0.150394}, + {-0.209451,-0.426354}, + {1.251426,0.387939}, + {-0.941099,-0.048392}, + {0.553432,0.490465}, + {0.820341,-0.892655}, + {-0.469979,0.215954}, + {-0.111752,-0.518634}, + {-0.322742,0.282748}, + {-0.131831,-0.096259}, + {0.928465,0.491990}, + {-0.131168,0.713177}, + {1.182858,-0.137778}, + {0.498624,0.596945}, + {-0.340255,1.333451}, + {-0.263143,-0.178530}, + {-0.853000,-0.367513}, + {0.645533,0.217256}, + {-0.222484,-0.050816}, + {-0.889767,0.961630}, + {-0.559303,-0.335849}, + {0.755808,1.224325}, + {-0.295347,-0.382986}, + {0.154238,0.489334}, + {0.806167,0.600666}, + {-1.440967,0.906005}, + {0.400307,-1.289369}, + {-1.322768,0.271201}, + {0.721328,-0.415260}, + {0.328246,0.162043}, + {1.063849,-0.169918}, + {0.661691,0.188712}, + {-0.393050,-0.106635}, + {-0.924026,-0.264599}, + {-0.379871,-0.638547}, + {1.648221,0.026247}, + {1.111263,0.149709}, + {0.176878,-1.278937}, + {0.734091,0.194270}, + {0.643210,-0.024985}, + {-0.703541,-0.377990}, + {0.786560,0.295150}, + {1.646656,-0.147934}, + {-0.361062,0.674906}, + {-0.317120,0.143807}, + {-1.310888,-0.164024}, + {0.035068,0.189815}, + {-0.787682,0.694272}, + {-0.057575,-0.198782}, + {0.037946,-1.261234}, + {0.789551,0.167209}, + {0.163492,1.280868}, + {1.486117,0.344385}, + {-0.259139,-0.046155}, + {-0.720616,-0.687107}, + {0.332266,0.269337}, + {0.677660,-0.080123}, + {0.221776,0.671525}, + {-1.286564,-1.026638}, + {-0.137566,-0.439496}, + {1.253971,-1.647977}, + {-1.082200,-0.445719}, + {-0.166409,-0.650523}, + {-0.453263,0.213402}, + {-0.017712,-0.128208}, + {-0.032769,-0.405644}, + {-0.219371,-0.017666}, + {-0.799480,-1.769117}, + {-0.532850,0.965634}, + {-0.686125,-1.467377}, + {-0.633034,-0.389067}, + {-0.150331,0.782007}, + {-0.691980,0.730198}, + {-0.597063,-0.279026}, + {0.834946,0.396175}, + {-0.078053,-0.123351}, + {-0.571384,-0.618287}, + {0.325004,0.114546}, + {0.411609,1.274331}, + {0.206788,-0.139653}, + {-1.090128,0.800625}, + {-0.412709,0.694443}, + {-0.162932,1.311011}, + {0.397417,-0.737950}, + {-0.100183,0.447697}, + {1.213408,-1.126972}, + {0.034492,0.978029}, + {-0.872335,-0.584584}, + {0.568310,0.904579}, + {-0.453700,0.703082}, + {-1.230769,0.813793}, + {-0.851555,0.357280}, + {0.604006,0.281641}, + {0.411237,0.367925}, + {-0.750405,-1.252638}, + {0.260416,0.091677}, + {0.333514,-1.104021}, + {0.782219,0.587118}, + {-0.200975,-0.528729}, + {-0.332689,-1.636132}, + {-0.415304,-0.010511}, + {-0.121022,0.354709}, + {0.994143,0.280846}, + {0.138590,-0.213242}, + {-0.193256,-0.095752}, + {-0.441602,0.259315}, + {0.948753,0.001788}, + {0.898141,-0.750677}, + {1.346054,0.626588}, + {0.381400,-0.493532}, + {-1.338972,0.327082}, + {0.220140,-0.344755}, + {0.656912,-0.469924}, + {1.263170,0.096743}, + {0.070575,-0.775336}, + {0.716447,1.747781}, + {0.298510,0.135103}, + {0.022491,0.885968}, + {0.142852,0.482053}, + {-0.434061,-0.439810}, + {0.694127,0.094622}, + {0.448201,-0.299757}, + {0.087507,0.008116}, + {0.250792,0.103017}, + {-0.059841,-0.687843}, + {-0.071647,0.860597}, + {0.728315,0.820186}, + {-0.640044,0.101480}, + {0.211384,0.028702}, + {-0.457781,0.490619}, + {-0.178352,-0.304710}, + {-0.563754,-0.733470}, + {-0.770274,0.082873}, + {-0.762355,1.140889}, + {0.797291,0.304485}, + {-0.057014,-0.903306}, + {-0.158813,0.075113}, + {-0.874554,0.299985}, + {-1.282132,-0.277777}, + {0.150378,-1.322159}, + {0.433856,-0.000391}, + {0.119086,-0.850105}, + {0.204912,0.316619}, + {-0.757190,-0.377894}, + {-0.896753,1.076560}, + {1.182092,-0.196822}, + {0.699797,0.526050}, + {0.405838,-0.496715}, + {-0.834600,-0.037964}, + {0.545939,0.047411}, + {-0.771625,0.127979}, + {0.625542,0.978054}, + {0.578050,1.339611}, + {-0.854615,-0.162544}, + {0.803070,-1.575209}, + {-0.722438,0.809655}, + {0.812986,-0.021617}, + {0.617012,0.621875}, + {-0.694562,-0.359274}, + {0.819084,0.571131}, + {0.605917,-0.877233}, + {-0.166467,-0.432090}, + {-0.763237,0.021539}, + {-1.007144,0.682364}, + {-0.012074,-1.138787}, + {-0.793479,0.734741}, + {0.950373,-0.774179}, + {0.714255,-0.444826}, + {-1.824486,-1.178179}, + {0.286283,-1.022538}, + {0.371641,0.412646}, + {1.221297,-0.075273}, + {0.513217,0.452413}, + {0.015385,-0.341663}, + {-0.926360,0.470885}, + {-0.515633,0.282595}, + {-0.876782,0.148065}, + {-0.204097,-0.416771}, + {0.581214,0.730282}, + {0.150986,-0.721883}, + {-0.919574,-0.518872}, + {-1.025393,1.032902}, + {-0.571691,-0.523905}, + {0.336729,0.277443}, + {0.077651,0.017905}, + {-0.049717,0.473017}, + {-0.410902,-0.770257}, + {-0.847206,0.198044}, + {0.356753,0.100081}, + {0.580691,0.400755}, + {0.718459,0.870265}, + {0.779366,0.466430}, + {-1.046243,-1.317550}, + {-0.248241,-0.184969}, + {0.626921,0.660065}, + {0.772665,-1.467408}, + {0.189100,0.479679}, + {-1.027175,1.032229}, + {-0.110106,-0.214123}, + {-0.434741,0.523121}, + {-0.947316,0.197282}, + {0.241363,0.711876}, + {-0.790393,-0.270092}, + {-0.264741,0.345775}, + {0.814247,-0.835493}, + {0.947799,0.460240}, + {0.505144,0.380228}, + {-0.473087,-0.638790}, + {0.543595,-0.001347}, + {-0.682112,0.627895}, + {-0.405487,0.778655}, + {0.090159,-1.164412}, + {-1.021743,-1.421425}, + {-0.149220,-0.891920}, + {0.763872,-0.387818}, + {0.447078,0.686021}, + {0.054443,0.941294}, + {0.946171,-0.217788}, + {-0.490974,1.129098}, + {0.729449,0.252452}, + {0.815682,-0.189074}, + {0.788805,-1.240450}, + {0.942122,-1.379303}, + {-0.702094,0.893805}, + {-1.031257,0.993462}, + {-0.515607,-1.598744}, + {-1.242896,0.696992}, + {0.462112,-1.234721}, + {-1.005724,0.703223}, + {0.475509,1.468536}, + {0.087152,0.401476}, + {-1.961801,0.527485}, + {-0.277783,0.792785}, + {0.499758,-0.094692}, + {0.592984,-0.740657}, + {-0.369076,-0.004060}, + {0.610104,-0.671913}, + {-0.127590,0.291879}, + {-0.769939,-0.549296}, + {-0.110371,-0.651391}, + {-0.324962,-0.638560}, + {-0.366826,1.409327}, + {0.365052,-0.587005}, + {-0.316704,-0.411182}, + {-0.769326,-0.018427}, + {0.918326,-0.205236}, + {1.455609,1.087051}, + {0.844860,-0.653147}, + {1.020463,0.280075}, + {0.559389,-0.768862}, + {-1.792332,-0.215746}, + {0.196068,-0.074482}, + {-0.613620,-0.906514}, + {-0.602302,1.210484}, + {1.537292,0.306783}, + {-0.008903,-0.974294}, + {-0.532771,-0.265199}, + {-0.018499,-0.535834}, + {-0.014195,0.748767}, + {0.353076,-0.075319}, + {0.434187,0.928206}, + {-0.355526,0.282319}, + {0.211333,0.311046}, + {-0.589182,-0.031620}, + {1.002223,0.023921}, + {-0.601628,-0.329293}, + {0.424415,0.068179}, + {-1.155585,0.516343}, + {0.515025,0.512588}, + {-0.779358,0.737289}, + {-0.532136,-0.528990}, + {0.246092,0.038006}, + {-1.225133,0.620487}, + {-0.200500,-0.297832}, + {-0.419124,-0.629269}, + {0.857102,-0.394516}, + {-0.627349,0.023525}, + {-0.480722,0.194265}, + {-0.967646,-0.289770}, + {-0.811645,0.778058}, + {-0.330038,0.486357}, + {-0.188439,0.216193}, + {0.089880,-0.920053}, + {0.123710,-0.395635}, + {0.590314,0.051432}, + {-0.400984,0.472685}, + {-0.482473,-0.081664}, + {1.021624,1.195570}, + {-0.641330,-0.310074}, + {-0.191657,-0.668057}, + {0.057035,0.868019}, + {0.161342,0.290908}, + {-0.914313,1.611466}, + {0.752373,1.180590}, + {-0.023547,1.358874}, + {-0.891893,0.622478}, + {-0.627566,-0.215932}, + {0.569484,-0.032047}, + {0.151811,0.537318}, + {0.643493,-0.211765}, + {-0.277706,0.641965}, + {-0.055308,0.040286}, + {0.133963,-0.238700}, + {-0.927043,0.438230}, + {0.737539,-1.090991}, + {-0.258609,0.790912}, + {-0.248323,-0.881598}, + {0.220905,1.051752}, + {0.439683,-0.240808}, + {-0.081260,-0.429267}, + {-0.893930,-0.301145}, + {0.216628,0.563682}, + {0.495748,-0.625961}, + {-0.484015,-1.195660}, + {-0.717614,-0.328233}, + {-0.601530,-0.572201}, + {-0.055818,0.060060}, + {0.301962,0.128367}, + {-0.314449,-0.022201}, + {-1.088724,0.633684}, + {-0.576006,0.352197}, + {-0.476385,-0.096264}, + {-1.326078,-0.103745}, + {-0.458658,-0.228827}, + {0.123811,0.703156}, + {-1.208584,0.467840}, + {0.733960,0.272324}, + {-0.531940,0.601927}, + {-0.203491,0.765397}, + {0.282851,0.489174}, + {-1.410437,0.224490}, + {-0.438276,-0.013360}, + {-0.061401,-0.259781}, + {-0.014421,-0.307778}, + {-0.475161,1.111264}, + {0.769111,0.441227}, + {0.172795,-0.268608}, + {0.979869,0.135185}, + {-0.528977,-0.205653}, + {-0.045259,0.027604}, + {0.722821,0.789841}, + {-0.039846,-0.938385}, + {0.589344,0.223276}, + {-1.022671,-0.084817}, + {0.041763,-1.074842}, + {-0.588962,0.459411}, + {0.305630,-0.951329}, + {-0.688286,-0.717012}, + {-0.239280,-0.054100}, + {0.466996,-0.578716}, + {0.515927,-0.146469}, + {0.728230,1.345576}, + {0.418004,1.320527}, + {-0.518194,0.757005}, + {0.012964,-1.615714}, + {-0.952324,-0.315730}, + {-0.857139,0.027421}, + {0.114293,0.309591}, + {-0.844651,-0.223144}, + {-0.928183,1.192097}, + {-1.023982,-0.343621}, + {-1.048939,-0.345626}, + {0.164567,0.377517}, + {0.836105,-0.111800}, + {0.071700,0.607273}, + {0.144912,0.349067}, + {0.722128,-0.075779}, + {-0.279779,-0.260383}, + {-0.049156,1.120738}, + {-0.640154,-0.228391}, + {-0.039753,0.150724}, + {-0.415397,-0.463677}, + {-0.723847,-0.209406}, + {-0.524332,-1.037805}, + {0.171327,-1.435469}, + {-0.089687,-0.415936}, + {-1.225215,0.133157}, + {-0.018497,-0.644647}, + {0.396236,-0.355851}, + {0.225700,0.899203}, + {0.287114,-0.691831}, + {0.674085,-0.073870}, + {2.000654,-0.623437}, + {-0.252822,-0.415741}, + {0.052088,0.016210}, + {-0.332988,-0.849652}, + {0.026695,-0.376094}, + {0.742096,0.969579}, + {-1.635731,0.339533}, + {-0.208349,0.686132}, + {0.828001,-0.603493}, + {-0.078836,-0.444070}, + {1.364974,0.631664}, + {-0.160620,0.335231}, + {-1.378768,-0.907673}, + {-0.293646,0.072013}, + {1.524592,-1.461770}, + {0.083610,-1.746190}, + {0.102486,0.149103}, + {0.691698,0.227990}, + {0.028614,-0.864596}, + {-0.152066,0.125449}, + {-1.205134,1.186200}, + {0.848843,-0.061847}, + {1.081665,0.049303}, + {-0.108837,-0.099148}, + {0.262042,-0.490003}, + {-0.254991,0.361463}, + {-0.477565,0.096211}, + {-0.137706,-1.119345}, + {0.538644,0.486454}, + {0.035114,0.001732}, + {-0.695087,0.063591}, + {-1.648017,0.977367}, + {-0.224997,0.395787}, + {-0.727539,-0.234162}, + {0.078225,-0.026224}, + {0.772412,-0.439717}, + {-0.403974,0.204029}, + {-1.104881,-0.012786}, + {-0.672931,-0.415948}, + {-0.863229,-2.233172}, + {1.063307,-0.258525}, + {-0.529432,-0.708843}, + {-0.176069,-1.026002}, + {-0.384993,-0.904576}, + {0.042330,-1.765663}, + {0.851313,1.091533}, + {0.180840,0.453570}, + {0.337128,0.182821}, + {1.363286,-1.181451}, + {1.137031,-0.433505}, + {-1.325181,-0.200399}, + {0.394546,0.006217}, + {0.723817,-0.068463}, + {1.050909,0.065058}, + {0.084242,-0.420440}, + {-0.238302,0.258881}, + {0.174215,-0.677729}, + {-0.711756,0.276335}, + {-0.129577,-0.515158}, + {0.866331,0.116316}, + {1.575856,0.566488}, + {0.235497,-0.285233}, + {-0.831974,-0.236821}, + {-0.817600,1.539514}, + {-0.485036,0.295694}, + {-1.575127,0.044856}, + {0.181119,0.710358}, + {-0.056993,-0.238132}, + {0.091941,0.490274}, + {0.339556,1.201109}, + {-1.241956,1.033717}, + {-0.653462,-1.105622}, + {-0.351127,0.017888}, + {-0.240821,-0.475748}, + {-0.456277,0.573568}, + {-0.419904,-1.058360}, + {0.052939,-0.291801}, + {-0.975645,0.317124}, + {-0.277843,1.312881}, + {-0.980414,-0.689515}, + {-0.328660,0.125761}, + {0.002261,0.540834}, + {0.289127,-0.906076}, + {-0.583909,0.091516}, + {-0.105622,0.534255}, + {0.498881,-1.752227}, + {-0.372611,-0.300411}, + {0.805897,1.430785}, + {1.128088,-0.203904}, + {-0.080504,-0.025175}, + {0.109551,0.071366}, + {-1.018953,0.755951}, + {0.666092,0.991101}, + {0.947680,-0.016049}, + {2.030778,-1.308712}, + {-0.536376,-0.093177}, + {-0.979295,-0.287391}, + {-0.720582,-0.666863}, + {-1.329793,-0.141597}, + {1.120330,0.296339}, + {-0.683593,-1.193189}, + {-0.890008,-0.339326}, + {0.108370,0.364104}, + {0.761248,0.181091}, + {0.852765,1.409425}, + {-0.232370,1.404779}, + {-0.951683,-0.337612}, + {-2.093378,-0.985796}, + {-0.708897,0.096981}, + {-0.369032,-0.081507}, + {0.668578,0.410819}, + {-1.449941,1.474340}, + {-0.077746,-0.719201}, + {-0.522293,-0.151163}, + {-0.458998,-0.377810}, + {-0.371088,-0.656185}, + {-0.692675,0.536793}, + {-0.856001,0.770941}, + {0.787694,-0.616170}, + {0.666946,-1.360541}, + {0.649554,-0.692776}, + {-1.149561,-0.060654}, + {-1.017696,-1.553694}, + {0.594676,-0.308209}, + {-0.414485,0.300271}, + {0.914811,-1.373936}, + {0.593489,-0.368620}, + {-0.414122,0.825231}, + {-0.946035,-0.712426}, + {-0.027283,-0.856090}, + {0.824075,-0.537887}, + {-0.670569,-1.076879}, + {1.250980,-0.782317}, + {0.225270,-0.377829}, + {0.977247,1.198198}, + {-0.255252,0.458703}, + {0.859036,2.174261}, + {-0.392631,0.739821}, + {-0.219855,0.169863}, + {0.412017,0.686208}, + {0.191456,0.548503}, + {0.762538,-0.306864}, + {-0.618637,-0.991173}, + {-0.286232,-1.189813}, + {0.409556,0.705714}, + {0.604650,-0.285883}, + {-0.037553,-0.284563}, + {-1.752832,0.885716}, + {0.662262,0.178240}, + {-0.668130,-0.398971}, + {2.333495,-0.030369}, + {0.431917,-0.014914}, + {-0.339628,-0.075137}, + {0.979382,0.620025}, + {0.024547,-0.548793}, + {-1.198934,0.571377}, + {0.089618,0.417351}, + {-0.696845,0.721676}, + {0.227661,-0.375026}, + {-0.168858,-0.092691}, + {0.407953,-0.657836}, + {0.508885,-0.088453}, + {0.062845,-0.270386}, + {-0.087209,-0.221708}, + {-1.042531,0.650343}, + {-0.637231,0.804756}, + {-0.316632,0.521297}, + {-0.284839,0.380972}, + {0.756041,0.089078}, + {0.367135,-0.050171}, + {0.673788,-0.328597}, + {-0.475960,1.277835}, + {0.050328,-0.406764}, + {-1.253687,0.528663}, + {1.121088,-0.753455}, + {0.576634,0.414912}, + {1.154879,-0.107302}, + {0.079544,0.382389}, + {0.259826,-0.087435}, + {1.064498,0.528704}, + {-0.698877,-1.021912}, + {1.273747,0.566923}, + {-0.151776,1.226809}, + {-0.116914,0.456137}, + {-0.758612,0.838042}, + {0.174788,0.207897}, + {-1.054368,-0.062673}, + {0.303920,0.414262}, + {0.444540,-1.599911}, + {-0.263430,0.748950}, + {0.673118,0.295838}, + {0.558813,-1.015097}, + {-0.182189,0.099479}, + {-0.290746,-0.204886}, + {-0.429349,-0.670610}, + {-1.054783,-0.017990}, + {0.438704,1.112183}, + {1.172061,0.466392}, + {0.572237,0.341187}, + {0.617213,-0.632464}, + {0.122765,0.496952}, + {-0.366828,0.476781}, + {0.023184,0.226708}, + {-0.410027,-1.070367}, + {-1.411039,0.798430}, + {0.635652,-1.202681}, + {1.131089,-0.782675}, + {0.310544,0.006326}, + {0.525788,-1.242739}, + {0.347988,0.586708}, + {-1.343655,1.265193}, + {0.573006,0.820707}, + {-0.145902,-0.883328}, + {0.129940,0.855404}, + {0.877836,-0.239222}, + {-0.451520,-0.558787}, + {0.326841,-1.498916}, + {-0.472055,-0.088465}, + {0.420626,0.747670}, + {0.365096,-0.779117}, + {0.779887,-1.025049}, + {0.268789,0.955912}, + {0.427846,0.416261}, + {0.351268,1.579771}, + {0.085293,-1.166684}, + {0.108972,-1.064624}, + {-0.566448,-0.214947}, + {-0.132223,-0.361406}, + {-0.136036,0.118975}, + {0.427266,0.217945}, + {0.189904,-0.598306}, + {0.020599,0.225899}, + {-1.566003,0.465088}, + {-0.151238,-0.690998}, + {0.644967,-1.305515}, + {-1.005521,0.212625}, + {-0.201626,0.124733}, + {0.712140,0.508869}, + {0.934268,0.418607}, + {1.930008,-0.584650}, + {-0.667467,1.471271}, + {0.925854,0.010608}, + {-0.540775,-0.332686}, + {-1.356718,0.347897}, + {1.008829,0.621137}, + {1.266918,-0.344629}, + {-1.128488,-0.418674}, + {0.157524,0.139078}, + {-0.080731,-1.515912}, + {0.138870,1.536295}, + {0.096079,-0.738967}, + {0.055822,0.790336}, + {0.775557,-0.154829}, + {-0.762535,-0.407425}, + {-1.166020,0.176498}, + {-0.001453,0.874596}, + {0.086572,0.749436}, + {-0.497314,1.108861}, + {1.253067,0.882093}, + {0.043620,0.847310}, + {1.124285,0.394422}, + {-0.028010,-0.424847}, + {0.502442,-0.944102}, + {-0.624064,-0.633988}, + {-1.314388,-0.197072}, + {-0.878207,1.312132}, + {0.164886,-0.109184}, + {-1.477262,-0.055125}, + {-0.030013,-0.699816}, + {-1.298661,1.409137} +}; \ No newline at end of file diff --git a/codec2/tags/0.4.1/src/octave.c b/codec2/tags/0.4.1/src/octave.c new file mode 100644 index 00000000..2ff5ad14 --- /dev/null +++ b/codec2/tags/0.4.1/src/octave.c @@ -0,0 +1,85 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: octave.c + AUTHOR......: David Rowe + DATE CREATED: April 28 2012 + + Functions to save C arrays in GNU Octave matrix format. The output text + file can be directly read into Octave using "load filename". + +\*---------------------------------------------------------------------------*/ + + +/* + Copyright (C) 2012 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, 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 . +*/ + +#include +#include "octave.h" + +void octave_save_int(FILE *f, char name[], int data[], int rows, int cols) +{ + int r,c; + + fprintf(f, "# name: %s\n", name); + fprintf(f, "# type: matrix\n"); + fprintf(f, "# rows: %d\n", rows); + fprintf(f, "# columns: %d\n", cols); + + for(r=0; r. +*/ + +#ifndef __OCTAVE__ +#define __OCTAVE__ + +#include "comp.h" + +void octave_save_int(FILE *f, char name[], int data[], int rows, int cols); +void octave_save_float(FILE *f, char name[], float data[], int rows, int cols, int col_len); +void octave_save_complex(FILE *f, char name[], COMP data[], int rows, int cols, int col_len); + +#endif diff --git a/codec2/tags/0.4.1/src/os.h b/codec2/tags/0.4.1/src/os.h new file mode 100644 index 00000000..ee250286 --- /dev/null +++ b/codec2/tags/0.4.1/src/os.h @@ -0,0 +1,53 @@ +/* Generate using fir1(47,1/2) in Octave */ + +const float fdmdv_os_filter[]= { + -0.0008215855034550382, + -0.0007833023901802921, + 0.001075563790768233, + 0.001199092367787555, + -0.001765309502928316, + -0.002055372115328064, + 0.002986877604154257, + 0.003462567920638414, + -0.004856570111126334, + -0.005563143845031497, + 0.007533613299748122, + 0.008563932468880897, + -0.01126857129039911, + -0.01280782411693687, + 0.01651443896361847, + 0.01894875110322284, + -0.02421604439474981, + -0.02845107338464062, + 0.03672973563400258, + 0.04542046150312214, + -0.06189165826716491, + -0.08721876380763803, + 0.1496157094199961, + 0.4497962274137046, + 0.4497962274137046, + 0.1496157094199961, + -0.08721876380763803, + -0.0618916582671649, + 0.04542046150312216, + 0.03672973563400257, + -0.02845107338464062, + -0.02421604439474984, + 0.01894875110322284, + 0.01651443896361848, + -0.01280782411693687, + -0.0112685712903991, + 0.008563932468880899, + 0.007533613299748123, + -0.005563143845031501, + -0.004856570111126346, + 0.003462567920638419, + 0.002986877604154259, + -0.002055372115328063, + -0.001765309502928318, + 0.001199092367787557, + 0.001075563790768233, + -0.0007833023901802925, + -0.0008215855034550383 +}; + diff --git a/codec2/tags/0.4.1/src/pack.c b/codec2/tags/0.4.1/src/pack.c new file mode 100644 index 00000000..b0625645 --- /dev/null +++ b/codec2/tags/0.4.1/src/pack.c @@ -0,0 +1,140 @@ +/* + Copyright (C) 2010 Perens LLC + + 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 . +*/ + +#include "defines.h" +#include "quantise.h" +#include + +/* Compile-time constants */ +/* Size of unsigned char in bits. Assumes 8 bits-per-char. */ +static const unsigned int WordSize = 8; + +/* Mask to pick the bit component out of bitIndex. */ +static const unsigned int IndexMask = 0x7; + +/* Used to pick the word component out of bitIndex. */ +static const unsigned int ShiftRight = 3; + +/** Pack a bit field into a bit string, encoding the field in Gray code. + * + * The output is an array of unsigned char data. The fields are efficiently + * packed into the bit string. The Gray coding is a naive attempt to reduce + * the effect of single-bit errors, we expect to do a better job as the + * codec develops. + * + * This code would be simpler if it just set one bit at a time in the string, + * but would hit the same cache line more often. I'm not sure the complexity + * gains us anything here. + * + * Although field is currently of int type rather than unsigned for + * compatibility with the rest of the code, indices are always expected to + * be >= 0. + */ +void +pack( + unsigned char * bitArray, /* The output bit string. */ + unsigned int * bitIndex, /* Index into the string in BITS, not bytes.*/ + int field, /* The bit field to be packed. */ + unsigned int fieldWidth/* Width of the field in BITS, not bytes. */ + ) +{ + pack_natural_or_gray(bitArray, bitIndex, field, fieldWidth, 1); +} + +void +pack_natural_or_gray( + unsigned char * bitArray, /* The output bit string. */ + unsigned int * bitIndex, /* Index into the string in BITS, not bytes.*/ + int field, /* The bit field to be packed. */ + unsigned int fieldWidth,/* Width of the field in BITS, not bytes. */ + unsigned int gray /* non-zero for gray coding */ + ) +{ + if (gray) { + /* Convert the field to Gray code */ + field = (field >> 1) ^ field; + } + + do { + unsigned int bI = *bitIndex; + unsigned int bitsLeft = WordSize - (bI & IndexMask); + unsigned int sliceWidth = + bitsLeft < fieldWidth ? bitsLeft : fieldWidth; + unsigned int wordIndex = bI >> ShiftRight; + + bitArray[wordIndex] |= + ((unsigned char)((field >> (fieldWidth - sliceWidth)) + << (bitsLeft - sliceWidth))); + + *bitIndex = bI + sliceWidth; + fieldWidth -= sliceWidth; + } while ( fieldWidth != 0 ); +} + +/** Unpack a field from a bit string, converting from Gray code to binary. + * + */ +int +unpack( + const unsigned char * bitArray, /* The input bit string. */ + unsigned int * bitIndex, /* Index into the string in BITS, not bytes.*/ + unsigned int fieldWidth/* Width of the field in BITS, not bytes. */ + ) +{ + return unpack_natural_or_gray(bitArray, bitIndex, fieldWidth, 1); +} + +/** Unpack a field from a bit string, to binary, optionally using + * natural or Gray code. + * + */ +int +unpack_natural_or_gray( + const unsigned char * bitArray, /* The input bit string. */ + unsigned int * bitIndex, /* Index into the string in BITS, not bytes.*/ + unsigned int fieldWidth,/* Width of the field in BITS, not bytes. */ + unsigned int gray /* non-zero for Gray coding */ + ) +{ + unsigned int field = 0; + unsigned int t; + + do { + unsigned int bI = *bitIndex; + unsigned int bitsLeft = WordSize - (bI & IndexMask); + unsigned int sliceWidth = + bitsLeft < fieldWidth ? bitsLeft : fieldWidth; + + field |= (((bitArray[bI >> ShiftRight] >> (bitsLeft - sliceWidth)) & ((1 << sliceWidth) - 1)) << (fieldWidth - sliceWidth)); + + *bitIndex = bI + sliceWidth; + fieldWidth -= sliceWidth; + } while ( fieldWidth != 0 ); + + if (gray) { + /* Convert from Gray code to binary. Works for maximum 8-bit fields. */ + t = field ^ (field >> 8); + t ^= (t >> 4); + t ^= (t >> 2); + t ^= (t >> 1); + } + else { + t = field; + } + + return t; +} diff --git a/codec2/tags/0.4.1/src/phase.c b/codec2/tags/0.4.1/src/phase.c new file mode 100644 index 00000000..08a2cf41 --- /dev/null +++ b/codec2/tags/0.4.1/src/phase.c @@ -0,0 +1,199 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: phase.c + AUTHOR......: David Rowe + DATE CREATED: 1/2/09 + + Functions for modelling and synthesising phase. + +\*---------------------------------------------------------------------------*/ + +/* + 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 . +*/ + +#include "defines.h" +#include "phase.h" +#include "kiss_fft.h" +#include "comp.h" +#include "sine.h" + +#include +#include +#include +#include +#include + + +/*---------------------------------------------------------------------------*\ + + phase_synth_zero_order() + + Synthesises phases based on SNR and a rule based approach. No phase + parameters are required apart from the SNR (which can be reduced to a + 1 bit V/UV decision per frame). + + The phase of each harmonic is modelled as the phase of a LPC + synthesis filter excited by an impulse. Unlike the first order + model the position of the impulse is not transmitted, so we create + an excitation pulse train using a rule based approach. + + Consider a pulse train with a pulse starting time n=0, with pulses + repeated at a rate of Wo, the fundamental frequency. A pulse train + in the time domain is equivalent to harmonics in the frequency + domain. We can make an excitation pulse train using a sum of + sinsusoids: + + for(m=1; m<=L; m++) + ex[n] = cos(m*Wo*n) + + Note: the Octave script ../octave/phase.m is an example of this if + you would like to try making a pulse train. + + The phase of each excitation harmonic is: + + arg(E[m]) = mWo + + where E[m] are the complex excitation (freq domain) samples, + arg(x), just returns the phase of a complex sample x. + + As we don't transmit the pulse position for this model, we need to + synthesise it. Now the excitation pulses occur at a rate of Wo. + This means the phase of the first harmonic advances by N samples + over a synthesis frame of N samples. For example if Wo is pi/20 + (200 Hz), then over a 10ms frame (N=80 samples), the phase of the + first harmonic would advance (pi/20)*80 = 4*pi or two complete + cycles. + + We generate the excitation phase of the fundamental (first + harmonic): + + arg[E[1]] = Wo*N; + + We then relate the phase of the m-th excitation harmonic to the + phase of the fundamental as: + + arg(E[m]) = m*arg(E[1]) + + This E[m] then gets passed through the LPC synthesis filter to + determine the final harmonic phase. + + Comparing to speech synthesised using original phases: + + - Through headphones speech synthesised with this model is not as + good. Through a loudspeaker it is very close to original phases. + + - If there are voicing errors, the speech can sound clicky or + staticy. If V speech is mistakenly declared UV, this model tends to + synthesise impulses or clicks, as there is usually very little shift or + dispersion through the LPC filter. + + - When combined with LPC amplitude modelling there is an additional + drop in quality. I am not sure why, theory is interformant energy + is raised making any phase errors more obvious. + + NOTES: + + 1/ This synthesis model is effectively the same as a simple LPC-10 + vocoders, and yet sounds much better. Why? Conventional wisdom + (AMBE, MELP) says mixed voicing is required for high quality + speech. + + 2/ I am pretty sure the Lincoln Lab sinusoidal coding guys (like xMBE + also from MIT) first described this zero phase model, I need to look + up the paper. + + 3/ Note that this approach could cause some discontinuities in + the phase at the edge of synthesis frames, as no attempt is made + to make sure that the phase tracks are continuous (the excitation + phases are continuous, but not the final phases after filtering + by the LPC spectra). Technically this is a bad thing. However + this may actually be a good thing, disturbing the phase tracks a + bit. More research needed, e.g. test a synthesis model that adds + a small delta-W to make phase tracks line up for voiced + harmonics. + +\*---------------------------------------------------------------------------*/ + +void phase_synth_zero_order( + kiss_fft_cfg fft_fwd_cfg, + MODEL *model, + float *ex_phase, /* excitation phase of fundamental */ + COMP A[] +) +{ + int m, b; + float phi_, new_phi, r; + COMP Ex[MAX_AMP+1]; /* excitation samples */ + COMP A_[MAX_AMP+1]; /* synthesised harmonic samples */ + COMP H[MAX_AMP+1]; /* LPC freq domain samples */ + + r = TWO_PI/(FFT_ENC); + + /* Sample phase at harmonics */ + + for(m=1; m<=model->L; m++) { + b = (int)(m*model->Wo/r + 0.5); + phi_ = -atan2f(A[b].imag, A[b].real); + H[m].real = cosf(phi_); + H[m].imag = sinf(phi_); + } + + /* + Update excitation fundamental phase track, this sets the position + of each pitch pulse during voiced speech. After much experiment + I found that using just this frame's Wo improved quality for UV + sounds compared to interpolating two frames Wo like this: + + ex_phase[0] += (*prev_Wo+model->Wo)*N/2; + */ + + ex_phase[0] += (model->Wo)*N; + ex_phase[0] -= TWO_PI*floorf(ex_phase[0]/TWO_PI + 0.5); + + for(m=1; m<=model->L; m++) { + + /* generate excitation */ + + if (model->voiced) { + + Ex[m].real = cosf(ex_phase[0]*m); + Ex[m].imag = sinf(ex_phase[0]*m); + } + else { + + /* When a few samples were tested I found that LPC filter + phase is not needed in the unvoiced case, but no harm in + keeping it. + */ + float phi = TWO_PI*(float)codec2_rand()/CODEC2_RAND_MAX; + Ex[m].real = cosf(phi); + Ex[m].imag = sinf(phi); + } + + /* filter using LPC filter */ + + A_[m].real = H[m].real*Ex[m].real - H[m].imag*Ex[m].imag; + A_[m].imag = H[m].imag*Ex[m].real + H[m].real*Ex[m].imag; + + /* modify sinusoidal phase */ + + new_phi = atan2f(A_[m].imag, A_[m].real+1E-12); + model->phi[m] = new_phi; + } + +} + diff --git a/codec2/tags/0.4.1/src/phase.h b/codec2/tags/0.4.1/src/phase.h new file mode 100644 index 00000000..03e1c507 --- /dev/null +++ b/codec2/tags/0.4.1/src/phase.h @@ -0,0 +1,39 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: phase.h + AUTHOR......: David Rowe + DATE CREATED: 1/2/09 + + Functions for modelling phase. + +\*---------------------------------------------------------------------------*/ + +/* + 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 . +*/ + +#ifndef __PHASE__ +#define __PHASE__ + +#include "kiss_fft.h" +#include "comp.h" + +void phase_synth_zero_order(kiss_fft_cfg fft_dec_cfg, + MODEL *model, + float *ex_phase, + COMP A[]); + +#endif diff --git a/codec2/tags/0.4.1/src/phaseexp.c b/codec2/tags/0.4.1/src/phaseexp.c new file mode 100644 index 00000000..be2ad9be --- /dev/null +++ b/codec2/tags/0.4.1/src/phaseexp.c @@ -0,0 +1,1455 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: phaseexp.c + AUTHOR......: David Rowe + DATE CREATED: June 2012 + + Experimental functions for quantising, modelling and synthesising phase. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2012 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 . +*/ + +#include "defines.h" +#include "phase.h" +#include "kiss_fft.h" +#include "comp.h" + +#include +#include +#include +#include +#include + +/* Bruce Perens' funcs to load codebook files */ + +struct codebook { + unsigned int k; + unsigned int log2m; + unsigned int m; + COMP *cb; + unsigned int offset; +}; + +static const char format[] = +"The table format must be:\n" +"\tTwo integers describing the dimensions of the codebook.\n" +"\tThen, enough numbers to fill the specified dimensions.\n"; + +float get_float(FILE * in, const char * name, char * * cursor, char * buffer, int size) +{ + for ( ; ; ) { + char * s = *cursor; + char c; + + while ( (c = *s) != '\0' && !isdigit(c) && c != '-' && c != '.' ) + s++; + + /* Comments start with "#" and continue to the end of the line. */ + if ( c != '\0' && c != '#' ) { + char * end = 0; + float f = 0; + + f = strtod(s, &end); + + if ( end != s ) + *cursor = end; + return f; + } + + if ( fgets(buffer, size, in) == NULL ) { + fprintf(stderr, "%s: Format error. %s\n", name, format); + exit(1); + } + *cursor = buffer; + } +} + +static struct codebook *load(const char * name) +{ + FILE *file; + char line[2048]; + char *cursor = line; + struct codebook *b = malloc(sizeof(struct codebook)); + int i; + int size; + float angle; + + file = fopen(name, "rt"); + assert(file != NULL); + + *cursor = '\0'; + + b->k = (int)get_float(file, name, &cursor, line, sizeof(line)); + b->m = (int)get_float(file, name ,&cursor, line, sizeof(line)); + size = b->k * b->m; + + b->cb = (COMP *)malloc(size * sizeof(COMP)); + + for ( i = 0; i < size; i++ ) { + angle = get_float(file, name, &cursor, line, sizeof(line)); + b->cb[i].real = cos(angle); + b->cb[i].imag = sin(angle); + } + + fclose(file); + + return b; +} + + +/* states for phase experiments */ + +struct PEXP { + float phi1; + float phi_prev[MAX_AMP]; + float Wo_prev; + int frames; + float snr; + float var; + int var_n; + struct codebook *vq1,*vq2,*vq3,*vq4,*vq5; + float vq_var; + int vq_var_n; + MODEL prev_model; + int state; +}; + + +/*---------------------------------------------------------------------------* \ + + phase_experiment_create() + + Inits states for phase quantisation experiments. + +\*---------------------------------------------------------------------------*/ + +struct PEXP * phase_experiment_create() { + struct PEXP *pexp; + int i; + + pexp = (struct PEXP *)malloc(sizeof(struct PEXP)); + assert (pexp != NULL); + + pexp->phi1 = 0; + for(i=0; iphi_prev[i] = 0.0; + pexp->Wo_prev = 0.0; + pexp->frames = 0; + pexp->snr = 0.0; + pexp->var = 0.0; + pexp->var_n = 0; + + /* smoothed 10th order for 1st 1 khz */ + //pexp->vq1 = load("../unittest/ph1_10_1024.txt"); + //pexp->vq1->offset = 0; + + /* load experimental phase VQ */ + + //pexp->vq1 = load("../unittest/testn1_20_1024.txt"); + pexp->vq1 = load("../unittest/test.txt"); + //pexp->vq2 = load("../unittest/testn21_40_1024.txt"); + pexp->vq2 = load("../unittest/test11_20_1024.txt"); + pexp->vq3 = load("../unittest/test21_30_1024.txt"); + pexp->vq4 = load("../unittest/test31_40_1024.txt"); + pexp->vq5 = load("../unittest/test41_60_1024.txt"); + pexp->vq1->offset = 0; + pexp->vq2->offset = 10; + pexp->vq3->offset = 20; + pexp->vq4->offset = 30; + pexp->vq5->offset = 40; + + pexp->vq_var = 0.0; + pexp->vq_var_n = 0; + + pexp->state = 0; + + return pexp; +} + + +/*---------------------------------------------------------------------------* \ + + phase_experiment_destroy() + +\*---------------------------------------------------------------------------*/ + +void phase_experiment_destroy(struct PEXP *pexp) { + assert(pexp != NULL); + if (pexp->snr != 0.0) + printf("snr: %4.2f dB\n", pexp->snr/pexp->frames); + if (pexp->var != 0.0) + printf("var...: %4.3f std dev...: %4.3f (%d non zero phases)\n", + pexp->var/pexp->var_n, sqrt(pexp->var/pexp->var_n), pexp->var_n); + if (pexp->vq_var != 0.0) + printf("vq var: %4.3f vq std dev: %4.3f (%d non zero phases)\n", + pexp->vq_var/pexp->vq_var_n, sqrt(pexp->vq_var/pexp->vq_var_n), pexp->vq_var_n); + free(pexp); +} + + +/*---------------------------------------------------------------------------* \ + + Various test and experimental functions ................ + +\*---------------------------------------------------------------------------*/ + +/* Bubblesort to find highest amplitude harmonics */ + +struct AMPINDEX { + float amp; + int index; +}; + +static void bubbleSort(struct AMPINDEX numbers[], int array_size) +{ + int i, j; + struct AMPINDEX temp; + + for (i = (array_size - 1); i > 0; i--) + { + for (j = 1; j <= i; j++) + { + //printf("i %d j %d %f %f \n", i, j, numbers[j-1].amp, numbers[j].amp); + if (numbers[j-1].amp < numbers[j].amp) + { + temp = numbers[j-1]; + numbers[j-1] = numbers[j]; + numbers[j] = temp; + } + } + } +} + + +static void print_pred_error(struct PEXP *pexp, MODEL *model, int start, int end, float mag_thresh) { + int i; + float mag; + + mag = 0.0; + for(i=start; i<=end; i++) + mag += model->A[i]*model->A[i]; + mag = 10*log10(mag/(end-start)); + + if (mag > mag_thresh) { + for(i=start; i<=end; i++) { + float pred = pexp->phi_prev[i] + N*i*(model->Wo + pexp->Wo_prev)/2.0; + float err = pred - model->phi[i]; + err = atan2(sin(err),cos(err)); + printf("%f\n",err); + } + //printf("\n"); + } + +} + + +static void predict_phases(struct PEXP *pexp, MODEL *model, int start, int end) { + int i; + + for(i=start; i<=end; i++) { + model->phi[i] = pexp->phi_prev[i] + N*i*model->Wo; + } + +} +static float refine_Wo(struct PEXP *pexp, + MODEL *model, + int start, + int end); + +/* Fancy state based phase prediction. Actually works OK on most utterances, + but could use some tuning. Breaks down a bit on mmt1. */ + +static void predict_phases_state(struct PEXP *pexp, MODEL *model, int start, int end) { + int i, next_state; + float best_Wo, dWo; + + //best_Wo = refine_Wo(pexp, model, start, end); + //best_Wo = (model->Wo + pexp->Wo_prev)/2.0; + best_Wo = model->Wo; + + dWo = fabs(model->Wo - pexp->Wo_prev)/model->Wo; + next_state = pexp->state; + switch(pexp->state) { + case 0: + if (dWo < 0.1) { + /* UV -> V transition, so start with phases in lock. They will + drift a bit over voiced track which is kinda what we want, so + we don't get clicky speech. + */ + next_state = 1; + for(i=start; i<=end; i++) + pexp->phi_prev[i] = i*pexp->phi1; + } + + break; + case 1: + if (dWo > 0.1) + next_state = 0; + break; + } + pexp->state = next_state; + + if (pexp->state == 0) + for(i=start; i<=end; i++) { + model->phi[i] = PI*(1.0 - 2.0*rand()/RAND_MAX); + } + else + for(i=start; i<=end; i++) { + model->phi[i] = pexp->phi_prev[i] + N*i*best_Wo; + } + printf("state %d\n", pexp->state); +} + +static void struct_phases(struct PEXP *pexp, MODEL *model, int start, int end) { + int i; + + for(i=start; i<=end; i++) + model->phi[i] = pexp->phi1*i; + +} + + +static void predict_phases2(struct PEXP *pexp, MODEL *model, int start, int end) { + int i; + float pred, str, diff; + + for(i=start; i<=end; i++) { + pred = pexp->phi_prev[i] + N*i*model->Wo; + str = pexp->phi1*i; + diff = str - pred; + diff = atan2(sin(diff), cos(diff)); + if (diff > 0) + pred += PI/16; + else + pred -= PI/16; + model->phi[i] = pred; + } + +} + +static void rand_phases(MODEL *model, int start, int end) { + int i; + + for(i=start; i<=end; i++) + model->phi[i] = PI*(1.0 - 2.0*(float)rand()/RAND_MAX); + +} + +static void quant_phase(float *phase, float min, float max, int bits) { + int levels = 1 << bits; + int index; + float norm, step; + + norm = (*phase - min)/(max - min); + index = floor(levels*norm); + + //printf("phase %f norm %f index %d ", *phase, norm, index); + if (index < 0 ) index = 0; + if (index > (levels-1)) index = levels-1; + //printf("index %d ", index); + step = (max - min)/levels; + *phase = min + step*index + 0.5*step; + //printf("step %f phase %f\n", step, *phase); +} + +static void quant_phases(MODEL *model, int start, int end, int bits) { + int i; + + for(i=start; i<=end; i++) { + quant_phase(&model->phi[i], -PI, PI, bits); + } +} + +static void fixed_bits_per_frame(struct PEXP *pexp, MODEL *model, int m, int budget) { + int res, finished; + + res = 3; + finished = 0; + + while(!finished) { + if (m > model->L/2) + res = 2; + if (((budget - res) < 0) || (m > model->L)) + finished = 1; + else { + quant_phase(&model->phi[m], -PI, PI, res); + budget -= res; + m++; + } + } + printf("m: %d L: %d budget: %d\n", m, model->L, budget); + predict_phases(pexp, model, m, model->L); + //rand_phases(model, m, model->L); +} + +/* used to plot histogram of quantisation error, for 3 bits, 8 levels, + should be uniform between +/- PI/8 */ + +static void check_phase_quant(MODEL *model, float tol) +{ + int m; + float phi_before[MAX_AMP]; + + for(m=1; m<=model->L; m++) + phi_before[m] = model->phi[m]; + + quant_phases(model, 1, model->L, 3); + + for(m=1; m<=model->L; m++) { + float err = phi_before[m] - model->phi[m]; + printf("%f\n", err); + if (fabs(err) > tol) + exit(0); + } +} + + +static float est_phi1(MODEL *model, int start, int end) +{ + int m; + float delta, s, c, phi1_est; + + if (end > model->L) + end = model->L; + + s = c = 0.0; + for(m=start; mphi[m+1] - model->phi[m]; + s += sin(delta); + c += cos(delta); + } + + phi1_est = atan2(s,c); + + return phi1_est; +} + +static void print_phi1_pred_error(MODEL *model, int start, int end) +{ + int m; + float phi1_est; + + phi1_est = est_phi1(model, start, end); + + for(m=start; mphi[m+1] - model->phi[m] - phi1_est; + err = atan2(sin(err),cos(err)); + printf("%f\n", err); + } +} + + +static void first_order_band(MODEL *model, int start, int end, float phi1_est) +{ + int m; + float pred_err, av_pred_err; + float c,s; + + s = c = 0.0; + for(m=start; mphi[m] - phi1_est*m; + s += sin(pred_err); + c += cos(pred_err); + } + + av_pred_err = atan2(s,c); + for(m=start; mphi[m] = av_pred_err + phi1_est*m; + model->phi[m] = atan2(sin(model->phi[m]), cos(model->phi[m])); + } + +} + + +static void sub_linear(MODEL *model, int start, int end, float phi1_est) +{ + int m; + + for(m=start; mphi[m] = m*phi1_est; + } +} + + +static void top_amp(struct PEXP *pexp, MODEL *model, int start, int end, int n_harm, int pred) +{ + int removed = 0, not_removed = 0; + int top, i, j; + struct AMPINDEX sorted[MAX_AMP]; + + /* sort into ascending order of amplitude */ + + printf("\n"); + for(i=start,j=0; iA[i]; + sorted[j].index = i; + printf("%f ", model->A[i]); + } + bubbleSort(sorted, end-start); + + printf("\n"); + for(j=0; jA[i] == sorted[j].amp) { + top = 1; + assert(i == sorted[j].index); + } + } + + #define ALTTOP + #ifdef ALTTOP + model->phi[i] = 0.0; /* make sure */ + if (top) { + model->phi[i] = i*pexp->phi1; + removed++; + } + else { + model->phi[i] = PI*(1.0 - 2.0*(float)rand()/RAND_MAX); // note: try rand for higher harms + removed++; + } + #else + if (!top) { + model->phi[i] = 0.0; /* make sure */ + if (pred) { + //model->phi[i] = pexp->phi_prev[i] + i*N*(model->Wo + pexp->Wo_prev)/2.0; + model->phi[i] = i*model->phi[1]; + } + else + model->phi[i] = PI*(1.0 - 2.0*(float)rand()/RAND_MAX); // note: try rand for higher harms + removed++; + } + else { + /* need to make this work thru budget of bits */ + quant_phase(&model->phi[i], -PI, PI, 3); + not_removed++; + } + #endif + } + printf("dim: %d rem %d not_rem %d\n", end-start, removed, not_removed); + +} + + +static void limit_prediction_error(struct PEXP *pexp, MODEL *model, int start, int end, float limit) +{ + int i; + float pred, pred_error, error; + + for(i=start; i<=end; i++) { + pred = pexp->phi_prev[i] + N*i*(model->Wo + pexp->Wo_prev)/2.0; + pred_error = pred - model->phi[i]; + pred_error -= TWO_PI*floor((pred_error+PI)/TWO_PI); + quant_phase(&pred_error, -limit, limit, 2); + + error = pred - pred_error - model->phi[i]; + error -= TWO_PI*floor((error+PI)/TWO_PI); + printf("%f\n", pred_error); + model->phi[i] = pred - pred_error; + } +} + + +static void quant_prediction_error(struct PEXP *pexp, MODEL *model, int start, int end, float limit) +{ + int i; + float pred, pred_error; + + for(i=start; i<=end; i++) { + pred = pexp->phi_prev[i] + N*i*(model->Wo + pexp->Wo_prev)/2.0; + pred_error = pred - model->phi[i]; + pred_error -= TWO_PI*floor((pred_error+PI)/TWO_PI); + + printf("%f\n", pred_error); + model->phi[i] = pred - pred_error; + } +} + + +static void print_sparse_pred_error(struct PEXP *pexp, MODEL *model, int start, int end, float mag_thresh) +{ + int i, index; + float mag, pred, error; + float sparse_pe[MAX_AMP]; + + mag = 0.0; + for(i=start; i<=end; i++) + mag += model->A[i]*model->A[i]; + mag = 10*log10(mag/(end-start)); + + if (mag > mag_thresh) { + for(i=0; iphi_prev[i] + N*i*(model->Wo + pexp->Wo_prev)/2.0; + error = pred - model->phi[i]; + error = atan2(sin(error),cos(error)); + + index = MAX_AMP*i*model->Wo/PI; + assert(index < MAX_AMP); + sparse_pe[index] = error; + } + + /* dump spare phase vector in polar format */ + + for(i=0; iL; m++) { + signal += model->A[m]*model->A[m]; + diff = cos(model->phi[m]) - cos(before[m]); + noise += pow(model->A[m]*diff, 2.0); + diff = sin(model->phi[m]) - sin(before[m]); + noise += pow(model->A[m]*diff, 2.0); + //printf("%f %f\n", before[m], model->phi[m]); + } + //printf("%f %f snr = %f\n", signal, noise, 10.0*log10(signal/noise)); + pexp->snr += 10.0*log10(signal/noise); +} + + +static void update_variance_calc(struct PEXP *pexp, MODEL *model, float before[]) +{ + int m; + float diff; + + for(m=1; mL; m++) { + diff = model->phi[m] - before[m]; + diff = atan2(sin(diff), cos(diff)); + pexp->var += diff*diff; + } + pexp->var_n += model->L; +} + +void print_vec(COMP cb[], int d, int e) +{ + int i,j; + + for(j=0; jWo + pexp->Wo_prev)/2.0; + best_var = 1E32; + for(Wo=0.97*Wo_est; Wo<=1.03*Wo_est; Wo+=0.001*Wo_est) { + + /* predict phase and sum differences between harmonics */ + + var = 0.0; + for(i=start; i<=end; i++) { + pred = pexp->phi_prev[i] + N*i*Wo; + error = pred - model->phi[i]; + error = atan2(sin(error),cos(error)); + var += error*error; + } + + if (var < best_var) { + best_var = var; + best_Wo = Wo; + } + } + + return best_Wo; +} + + +static void split_vq(COMP sparse_pe_out[], struct PEXP *pexp, struct codebook *vq, float weights[], COMP sparse_pe_in[]) +{ + int i, j, non_zero, vq_ind; + + //printf("\n offset %d k %d m %d j: ", vq->offset, vq->k, vq->m); + vq_ind = vq_phase(vq->cb, &sparse_pe_in[vq->offset], &weights[vq->offset], vq->k, vq->m, &pexp->vq_var); + + non_zero = 0; + for(i=0, j=vq->offset; ik; i++,j++) { + //printf("%f ", atan2(sparse_pe[i].imag, sparse_pe[i].real)); + if ((sparse_pe_in[j].real != 0.0) && (sparse_pe_in[j].imag != 0.0)) { + //printf("%d ", j); + sparse_pe_out[j] = vq->cb[vq->k * vq_ind + i]; + non_zero++; + } + } + pexp->vq_var_n += non_zero; +} + + +static void sparse_vq_pred_error(struct PEXP *pexp, + MODEL *model +) +{ + int i, index; + float pred, error, error_q_angle, best_Wo; + COMP sparse_pe_in[MAX_AMP], sparse_pe_out[MAX_AMP]; + float weights[MAX_AMP]; + COMP error_q_rect; + + best_Wo = refine_Wo(pexp, model, 1, model->L); + //best_Wo = (model->Wo + pexp->Wo_prev)/2.0; + + /* transform to sparse pred error vector */ + + for(i=0; iL; i++) { + pred = pexp->phi_prev[i] + N*i*best_Wo; + error = pred - model->phi[i]; + + index = MAX_AMP*i*model->Wo/PI; + assert(index < MAX_AMP); + sparse_pe_in[index].real = cos(error); + sparse_pe_in[index].imag = sin(error); + sparse_pe_out[index] = sparse_pe_in[index]; + weights[index] = model->A[i]; + //printf("%d ", index); + } + + /* vector quantise */ + + split_vq(sparse_pe_out, pexp, pexp->vq1, weights, sparse_pe_in); + split_vq(sparse_pe_out, pexp, pexp->vq2, weights, sparse_pe_in); + split_vq(sparse_pe_out, pexp, pexp->vq3, weights, sparse_pe_in); + split_vq(sparse_pe_out, pexp, pexp->vq4, weights, sparse_pe_in); + split_vq(sparse_pe_out, pexp, pexp->vq5, weights, sparse_pe_in); + + /* transform quantised phases back */ + + for(i=1; i<=model->L; i++) { + pred = pexp->phi_prev[i] + N*i*best_Wo; + + index = MAX_AMP*i*model->Wo/PI; + assert(index < MAX_AMP); + error_q_rect = sparse_pe_out[index]; + error_q_angle = atan2(error_q_rect.imag, error_q_rect.real); + model->phi[i] = pred - error_q_angle; + model->phi[i] = atan2(sin(model->phi[i]), cos(model->phi[i])); + } +} + + +static void predict_phases1(struct PEXP *pexp, MODEL *model, int start, int end) { + int i; + float best_Wo; + + best_Wo = refine_Wo(pexp, model, 1, model->L); + + for(i=start; i<=end; i++) { + model->phi[i] = pexp->phi_prev[i] + N*i*best_Wo; + } +} + + +/* + This functions tests theory that some bands can be combined together + due to less frequency resolution at higher frequencies. This will + reduce the amount of information we need to encode. +*/ + +void smooth_phase(struct PEXP *pexp, MODEL *model, int mode) +{ + int m, i, j, index, step, v, en, nav, st; + COMP sparse_pe_in[MAX_AMP], av; + COMP sparse_pe_out[MAX_AMP]; + COMP smoothed[MAX_AMP]; + float best_Wo, pred, err; + float weights[MAX_AMP]; + float avw, smoothed_weights[MAX_AMP]; + COMP smoothed_in[MAX_AMP], smoothed_out[MAX_AMP]; + + best_Wo = refine_Wo(pexp, model, 1, model->L); + + for(m=0; mL; m++) { + pred = pexp->phi_prev[m] + N*m*best_Wo; + err = model->phi[m] - pred; + err = atan2(sin(err),cos(err)); + + index = MAX_AMP*m*model->Wo/PI; + assert(index < MAX_AMP); + sparse_pe_in[index].real = model->A[m]*cos(err); + sparse_pe_in[index].imag = model->A[m]*sin(err); + sparse_pe_out[index] = sparse_pe_in[index]; + weights[index] = model->A[m]; + } + + /* now combine samples at high frequencies to reduce dimension */ + + step = 2; + st = 0; + for(i=st,v=0; i (MAX_AMP-1)) + en = MAX_AMP-1; + for(j=i; jvq1, smoothed_weights, smoothed_in); + for(i=0; i (MAX_AMP-1)) + en = MAX_AMP-1; + for(j=i; jL; m++) { + index = MAX_AMP*m*model->Wo/PI; + assert(index < MAX_AMP); + pred = pexp->phi_prev[m] + N*m*best_Wo; + err = atan2(sparse_pe_out[index].imag, sparse_pe_out[index].real); + model->phi[m] = pred + err; + } + +} + +/* + Another version of a functions that tests the theory that some bands + can be combined together due to less frequency resolution at higher + frequencies. This will reduce the amount of information we need to + encode. +*/ + +void smooth_phase2(struct PEXP *pexp, MODEL *model) { + float m; + float step; + int a,b,h,i; + float best_Wo, pred, err, s,c, phi1_; + + best_Wo = refine_Wo(pexp, model, 1, model->L); + + step = (float)model->L/30; + printf("\nL: %d step: %3.2f am,bm: ", model->L, step); + for(m=(float)model->L/4; m<=model->L; m+=step) { + a = floor(m); + b = floor(m+step); + if (b > model->L) b = model->L; + h = b-a; + + printf("%d,%d,(%d) ", a, b, h); + c = s = 0.0; + if (h>1) { + for(i=a; iphi_prev[i] + N*i*best_Wo; + err = model->phi[i] - pred; + c += cos(err); s += sin(err); + } + phi1_ = atan2(s,c); + for(i=a; iphi_prev[i] + N*i*best_Wo; + printf("%d: %4.3f -> ", i, model->phi[i]); + model->phi[i] = pred + phi1_; + model->phi[i] = atan2(sin(model->phi[i]),cos(model->phi[i])); + printf("%4.3f ", model->phi[i]); + } + } + } +} + + +#define MAX_BINS 40 +//static float bins[] = {2600.0, 2800.0, 3000.0, 3200.0, 3400.0, 3600.0, 3800.0, 4000.0}; +static float bins[] = {/* + + 1000.0, 1100.0, 1200.0, 1300.0, 1400.0, + 1500.0, 1600.0, 1700.0, 1800.0, 1900.0,*/ + + 2000.0, 2400.0, 2800.0, + 3000.0, 3400.0, 3600.0, 4000.0}; + +void smooth_phase3(struct PEXP *pexp, MODEL *model) { + int m, i; + int nbins; + int b; + float f, best_Wo, pred, err; + COMP av[MAX_BINS]; + + nbins = sizeof(bins)/sizeof(float); + best_Wo = refine_Wo(pexp, model, 1, model->L); + + /* clear all bins */ + + for(i=0; iL; m++) { + f = m*model->Wo*FS/TWO_PI; + if (f > bins[0]) { + + /* find bin */ + + for(i=0; i bins[i]) && (f <= bins[i+1])) + b = i; + assert(b < MAX_BINS); + + /* est predicted phase from average */ + + pred = pexp->phi_prev[m] + N*m*best_Wo; + err = model->phi[m] - pred; + av[b].real += cos(err); av[b].imag += sin(err); + } + + } + + /* use averages to est phases */ + + for(m=1; m<=model->L; m++) { + f = m*model->Wo*FS/TWO_PI; + if (f > bins[0]) { + + /* find bin */ + + for(i=0; i bins[i]) && (f <= bins[i+1])) + b = i; + assert(b < MAX_BINS); + + /* add predicted phase error to this bin */ + + printf("L %d m %d f %4.f b %d\n", model->L, m, f, b); + + pred = pexp->phi_prev[m] + N*m*best_Wo; + err = atan2(av[b].imag, av[b].real); + printf(" %d: %4.3f -> ", m, model->phi[m]); + model->phi[m] = pred + err; + model->phi[m] = atan2(sin(model->phi[m]),cos(model->phi[m])); + printf("%4.3f\n", model->phi[m]); + } + } + printf("\n"); +} + + +/* + Try to code the phase of the largest amplitude in each band. Randomise the + phase of the other harmonics. The theory is that only the largest harmonic + will be audible. +*/ + +void cb_phase1(struct PEXP *pexp, MODEL *model) { + int m, i; + int nbins; + int b; + float f, best_Wo; + float max_val[MAX_BINS]; + int max_ind[MAX_BINS]; + + nbins = sizeof(bins)/sizeof(float); + best_Wo = refine_Wo(pexp, model, 1, model->L); + + for(i=0; iL; m++) { + f = m*model->Wo*FS/TWO_PI; + if (f > bins[0]) { + + /* find bin */ + + for(i=0; i bins[i]) && (f <= bins[i+1])) + b = i; + assert(b < MAX_BINS); + + if (model->A[m] > max_val[b]) { + max_val[b] = model->A[m]; + max_ind[b] = m; + } + } + + } + + /* randomise phase of other harmonics */ + + for(m=1; m<=model->L; m++) { + f = m*model->Wo*FS/TWO_PI; + if (f > bins[0]) { + + /* find bin */ + + for(i=0; i bins[i]) && (f <= bins[i+1])) + b = i; + assert(b < MAX_BINS); + + if (m != max_ind[b]) + model->phi[m] = pexp->phi_prev[m] + N*m*best_Wo; + } + } +} + + +/* + Theory is only the phase of the envelope of signal matters within a + Critical Band. So we estimate the position of an impulse that + approximates the envelope of the signal. +*/ + +void cb_phase2(struct PEXP *pexp, MODEL *model) { + int st, m, i, a, b, step; + float diff,w,c,s,phi1_; + float A[MAX_AMP]; + + for(m=1; m<=model->L; m++) { + A[m] = model->A[m]; + model->A[m] = 0; + } + + st = 2*model->L/4; + step = 3; + model->phi[1] = pexp->phi_prev[1] + (pexp->Wo_prev+model->Wo)*N/2.0; + + printf("L=%d ", model->L); + for(m=st; m model->L) + b = model->L; + + c = s = 0; + for(i=a; iphi[i+1] - model->phi[i]; + //w = (model->A[i+1] + model->A[i])/2; + w = 1.0; + c += w*cos(diff); s += w*sin(diff); + } + phi1_ = atan2(s,c); + printf("replacing: "); + for(i=a; iphi[i] = i*phi1_; + //model->phi[i] = i*model->phi[1]; + //model->phi[i] = m*(pexp->Wo_prev+model->Wo)*N/2.0; + model->A[m] = A[m]; + printf("%d ", i); + } + printf(" . "); + } + printf("\n"); +} + + +static void smooth_phase4(MODEL *model) { + int m; + float phi_m, phi_m_1; + + if (model->L > 25) { + printf("\nL %d\n", model->L); + for(m=model->L/2; m<=model->L; m+=2) { + if ((m+1) <= model->L) { + phi_m = (model->phi[m] - model->phi[m+1])/2.0; + phi_m_1 = (model->phi[m+1] - model->phi[m])/2.0; + model->phi[m] = phi_m; + model->phi[m+1] = phi_m_1; + printf("%d %4.3f %4.3f ", m, phi_m, phi_m_1); + } + } + } + +} + +/* try repeating last frame, just advance phases to account for time shift */ + +static void repeat_phases(struct PEXP *pexp, MODEL *model) { + int m; + + *model = pexp->prev_model; + for(m=1; m<=model->L; m++) + model->phi[m] += N*m*model->Wo; + +} + +/*---------------------------------------------------------------------------*\ + + phase_experiment() + + Phase quantisation experiments. + +\*---------------------------------------------------------------------------*/ + +void phase_experiment(struct PEXP *pexp, MODEL *model, char *arg) { + int m; + float before[MAX_AMP]; + + assert(pexp != NULL); + memcpy(before, &model->phi[0], sizeof(float)*MAX_AMP); + + if (strcmp(arg,"q3") == 0) { + quant_phases(model, 1, model->L, 3); + update_snr_calc(pexp, model, before); + update_variance_calc(pexp, model, before); + } + + if (strcmp(arg,"dec2") == 0) { + if ((pexp->frames % 2) != 0) { + predict_phases(pexp, model, 1, model->L); + update_snr_calc(pexp, model, before); + update_variance_calc(pexp, model, before); + } + } + + if (strcmp(arg,"repeat") == 0) { + if ((pexp->frames % 2) != 0) { + repeat_phases(pexp, model); + update_snr_calc(pexp, model, before); + update_variance_calc(pexp, model, before); + } + } + + if (strcmp(arg,"vq") == 0) { + sparse_vq_pred_error(pexp, model); + update_snr_calc(pexp, model, before); + update_variance_calc(pexp, model, before); + } + + if (strcmp(arg,"pred") == 0) + predict_phases_state(pexp, model, 1, model->L); + + if (strcmp(arg,"pred1k") == 0) + predict_phases(pexp, model, 1, model->L/4); + + if (strcmp(arg,"smooth") == 0) { + smooth_phase(pexp, model,0); + update_snr_calc(pexp, model, before); + } + if (strcmp(arg,"smoothtrain") == 0) + smooth_phase(pexp, model,1); + if (strcmp(arg,"smoothvq") == 0) { + smooth_phase(pexp, model,2); + update_snr_calc(pexp, model, before); + } + + if (strcmp(arg,"smooth2") == 0) + smooth_phase2(pexp, model); + if (strcmp(arg,"smooth3") == 0) + smooth_phase3(pexp, model); + if (strcmp(arg,"smooth4") == 0) + smooth_phase4(model); + if (strcmp(arg,"vqsmooth3") == 0) { + sparse_vq_pred_error(pexp, model); + smooth_phase3(pexp, model); + } + + if (strcmp(arg,"cb1") == 0) { + cb_phase1(pexp, model); + update_snr_calc(pexp, model, before); + } + + if (strcmp(arg,"top") == 0) { + //top_amp(pexp, model, 1, model->L/4, 4, 1); + //top_amp(pexp, model, model->L/4, model->L/3, 4, 1); + //top_amp(pexp, model, model->L/3+1, model->L/2, 4, 1); + //top_amp(pexp, model, model->L/2, model->L, 6, 1); + //rand_phases(model, model->L/2, 3*model->L/4); + //struct_phases(pexp, model, model->L/2, 3*model->L/4); + //update_snr_calc(pexp, model, before); + } + + if (strcmp(arg,"pred23") == 0) { + predict_phases2(pexp, model, model->L/2, model->L); + update_snr_calc(pexp, model, before); + } + + if (strcmp(arg,"struct23") == 0) { + struct_phases(pexp, model, model->L/2, 3*model->L/4 ); + update_snr_calc(pexp, model, before); + } + + if (strcmp(arg,"addnoise") == 0) { + int m; + float max; + + max = 0; + for(m=1; m<=model->L; m++) + if (model->A[m] > max) + max = model->A[m]; + max = 20.0*log10(max); + for(m=1; m<=model->L; m++) + if (20.0*log10(model->A[m]) < (max-20)) { + model->phi[m] += (PI/4)*(1.0 -2.0*rand()/RAND_MAX); + //printf("m %d\n", m); + } + } + + /* normalise phases */ + + for(m=1; m<=model->L; m++) + model->phi[m] = atan2(sin(model->phi[m]), cos(model->phi[m])); + + /* update states */ + + //best_Wo = refine_Wo(pexp, model, model->L/2, model->L); + pexp->phi1 += N*model->Wo; + + for(m=1; m<=model->L; m++) + pexp->phi_prev[m] = model->phi[m]; + pexp->Wo_prev = model->Wo; + pexp->frames++; + pexp->prev_model = *model; +} + +#ifdef OLD_STUFF + //quant_phases(model, 1, model->L, 3); + //update_variance_calc(pexp, model, before); + //print_sparse_pred_error(pexp, model, 1, model->L, 40.0); + + //sparse_vq_pred_error(pexp, model); + + //quant_phases(model, model->L/4+1, model->L, 3); + + //predict_phases1(pexp, model, 1, model->L/4); + //quant_phases(model, model->L/4+1, model->L, 3); + + //quant_phases(model, 1, model->L/8, 3); + + //update_snr_calc(pexp, model, before); + //update_variance_calc(pexp, model, before); + + //fixed_bits_per_frame(pexp, model, 40); + //struct_phases(pexp, model, 1, model->L/4); + //rand_phases(model, 10, model->L); + //for(m=1; m<=model->L; m++) + // model->A[m] = 0.0; + //model->A[model->L/2] = 1000; + //repeat_phases(model, 20); + //predict_phases(pexp, model, 1, model->L/4); + //quant_phases(model, 1, 10, 3); + //quant_phases(model, 10, 20, 2); + //repeat_phases(model, 20); + //rand_phases(model, 3*model->L/4, model->L); + // print_phi1_pred_error(model, 1, model->L); + //predict_phases(pexp, model, 1, model->L/4); + //first_order_band(model, model->L/4, model->L/2); + //first_order_band(model, model->L/2, 3*model->L/4); + //if (fabs(model->Wo - pexp->Wo_prev)< 0.1*model->Wo) + + //print_pred_error(pexp, model, 1, model->L, 40.0); + //print_sparse_pred_error(pexp, model, 1, model->L, 40.0); + + //phi1_est = est_phi1(model, 1, model->L/4); + //print_phi1_pred_error(model, 1, model->L/4); + + //first_order_band(model, 1, model->L/4, phi1_est); + //sub_linear(model, 1, model->L/4, phi1_est); + + //top_amp(pexp, model, 1, model->L/4, 4); + //top_amp(pexp, model, model->L/4, model->L/2, 4); + + //first_order_band(model, 1, model->L/4, phi1_est); + //first_order_band(model, model->L/4, model->L/2, phi1_est); + + //if (fabs(model->Wo - pexp->Wo_prev) > 0.2*model->Wo) + // rand_phases(model, model->L/2, model->L); + + //top_amp(pexp, model, 1, model->L/4, 4); + //top_amp(pexp, model, model->L/4, model->L/2, 8); + //top_amp(pexp, model, model->L/4+1, model->L/2, 10, 1); + //top_amp(pexp, model, 1, model->L/4, 10, 1); + //top_amp(pexp, model, model->L/4+1, 3*model->L/4, 10, 1); + //top_amp(pexp, model, 1, 3*model->L/4, 20, 1); + + #ifdef REAS_CAND1 + predict_phases(pexp, model, 1, model->L/4); + top_amp(pexp, model, model->L/4+1, 3*model->L/4, 10, 1); + rand_phases(model, 3*model->L/4+1, model->L); + #endif + + #ifdef REAS_CAND2 + if ((pexp->frames % 2) == 0) { + //printf("quant\n"); + predict_phases(pexp, model, 1, model->L/4); + //top_amp(pexp, model, model->L/4+1, 3*model->L/4, 20, 1); + top_amp(pexp, model, model->L/4+1, 7*model->L/8, 20, 1); + rand_phases(model, 7*model->L/8+1, model->L); + } + else { + //printf("predict\n"); + predict_phases(pexp, model, 1, model->L); + } + #endif + + //#define REAS_CAND3 + #ifdef REAS_CAND3 + if ((pexp->frames % 3) != 0) { + printf("pred\n"); + predict_phases(pexp, model, 1, model->L); + } + else { + predict_phases(pexp, model, 1, model->L/4); + fixed_bits_per_frame(pexp, model, model->L/4+1, 60); + } + #endif + //predict_phases(pexp, model, model->L/4, model->L); + + + //print_pred_error(pexp, model, 1, model->L); + //limit_prediction_error(pexp, model, model->L/2, model->L, PI/2); +#endif diff --git a/codec2/tags/0.4.1/src/phaseexp.h b/codec2/tags/0.4.1/src/phaseexp.h new file mode 100644 index 00000000..b43db75e --- /dev/null +++ b/codec2/tags/0.4.1/src/phaseexp.h @@ -0,0 +1,39 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: phaseexp.h + AUTHOR......: David Rowe + DATE CREATED: June 2012 + + Experimental functions for quantising, modelling and synthesising phase. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2012 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 . +*/ + +#ifndef __PHASEEXP__ +#define __PHASEEXP__ + +#include "kiss_fft.h" + +struct PEXP; + +struct PEXP * phase_experiment_create(); +void phase_experiment_destroy(struct PEXP *pexp); +void phase_experiment(struct PEXP *pexp, MODEL *model, char *arg); + +#endif diff --git a/codec2/tags/0.4.1/src/pilot_coeff.h b/codec2/tags/0.4.1/src/pilot_coeff.h new file mode 100644 index 00000000..b284af93 --- /dev/null +++ b/codec2/tags/0.4.1/src/pilot_coeff.h @@ -0,0 +1,34 @@ +/* Generated by pilot_coeff_file() Octave function */ + +const float pilot_coeff[]={ + 0.00223001, + 0.00301037, + 0.00471258, + 0.0075934, + 0.0118145, + 0.0174153, + 0.0242969, + 0.0322204, + 0.0408199, + 0.0496286, + 0.0581172, + 0.0657392, + 0.0719806, + 0.0764066, + 0.0787022, + 0.0787022, + 0.0764066, + 0.0719806, + 0.0657392, + 0.0581172, + 0.0496286, + 0.0408199, + 0.0322204, + 0.0242969, + 0.0174153, + 0.0118145, + 0.0075934, + 0.00471258, + 0.00301037, + 0.00223001 +}; diff --git a/codec2/tags/0.4.1/src/pilots_coh.h b/codec2/tags/0.4.1/src/pilots_coh.h new file mode 100644 index 00000000..92711950 --- /dev/null +++ b/codec2/tags/0.4.1/src/pilots_coh.h @@ -0,0 +1,6 @@ +/* Generated by write_pilot_file() Octave function */ + +float pilots_coh[][PILOTS_NC]={ + { 1.000000, -1.000000, 1.000000, -1.000000, 1.000000, -1.000000, -1.000000}, + { -1.000000, 1.000000, 1.000000, -1.000000, 1.000000, 1.000000, 1.000000} +}; \ No newline at end of file diff --git a/codec2/tags/0.4.1/src/postfilter.c b/codec2/tags/0.4.1/src/postfilter.c new file mode 100644 index 00000000..fc88c0ea --- /dev/null +++ b/codec2/tags/0.4.1/src/postfilter.c @@ -0,0 +1,142 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: postfilter.c + AUTHOR......: David Rowe + DATE CREATED: 13/09/09 + + Postfilter to improve sound quality for speech with high levels of + background noise. Unlike mixed-excitation models requires no bits + to be transmitted to handle background noise. + +\*---------------------------------------------------------------------------*/ + +/* + 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 . +*/ + +#include +#include +#include +#include + +#include "defines.h" +#include "comp.h" +#include "dump.h" +#include "sine.h" +#include "postfilter.h" + +/*---------------------------------------------------------------------------*\ + + DEFINES + +\*---------------------------------------------------------------------------*/ + +#define BG_THRESH 40.0 /* only consider low levels signals for bg_est */ +#define BG_BETA 0.1 /* averaging filter constant */ +#define BG_MARGIN 6.0 /* harmonics this far above BG noise are + randomised. Helped make bg noise less + spikey (impulsive) for mmt1, but speech was + perhaps a little rougher. + */ + +/*---------------------------------------------------------------------------*\ + + postfilter() + + The post filter is designed to help with speech corrupted by + background noise. The zero phase model tends to make speech with + background noise sound "clicky". With high levels of background + noise the low level inter-formant parts of the spectrum will contain + noise rather than speech harmonics, so modelling them as voiced + (i.e. a continuous, non-random phase track) is inaccurate. + + Some codecs (like MBE) have a mixed voicing model that breaks the + spectrum into voiced and unvoiced regions. Several bits/frame + (5-12) are required to transmit the frequency selective voicing + information. Mixed excitation also requires accurate voicing + estimation (parameter estimators always break occasionally under + exceptional conditions). + + In our case we use a post filter approach which requires no + additional bits to be transmitted. The decoder measures the average + level of the background noise during unvoiced frames. If a harmonic + is less than this level it is made unvoiced by randomising it's + phases. + + This idea is rather experimental. Some potential problems that may + happen: + + 1/ If someone says "aaaaaaaahhhhhhhhh" will background estimator track + up to speech level? This would be a bad thing. + + 2/ If background noise suddenly dissapears from the source speech does + estimate drop quickly? What is noise suddenly re-appears? + + 3/ Background noise with a non-flat sepctrum. Current algorithm just + comsiders scpetrum as a whole, but this could be broken up into + bands, each with their own estimator. + + 4/ Males and females with the same level of background noise. Check + performance the same. Changing Wo affects width of each band, may + affect bg energy estimates. + + 5/ Not sure what happens during long periods of voiced speech + e.g. "sshhhhhhh" + +\*---------------------------------------------------------------------------*/ + +void postfilter( + MODEL *model, + float *bg_est +) +{ + int m, uv; + float e, thresh; + + /* determine average energy across spectrum */ + + e = 1E-12; + for(m=1; m<=model->L; m++) + e += model->A[m]*model->A[m]; + + assert(e > 0.0); + e = 10.0*log10f(e/model->L); + + /* If beneath threhold, update bg estimate. The idea + of the threshold is to prevent updating during high level + speech. */ + + if ((e < BG_THRESH) && !model->voiced) + *bg_est = *bg_est*(1.0 - BG_BETA) + e*BG_BETA; + + /* now mess with phases during voiced frames to make any harmonics + less then our background estimate unvoiced. + */ + + uv = 0; + thresh = powf(10.0, (*bg_est + BG_MARGIN)/20.0); + if (model->voiced) + for(m=1; m<=model->L; m++) + if (model->A[m] < thresh) { + model->phi[m] = TWO_PI*(float)codec2_rand()/CODEC2_RAND_MAX; + uv++; + } + +#ifdef DUMP + dump_bg(e, *bg_est, 100.0*uv/model->L); +#endif + +} diff --git a/codec2/tags/0.4.1/src/postfilter.h b/codec2/tags/0.4.1/src/postfilter.h new file mode 100644 index 00000000..bf080b1b --- /dev/null +++ b/codec2/tags/0.4.1/src/postfilter.h @@ -0,0 +1,33 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: postfilter.h + AUTHOR......: David Rowe + DATE CREATED: 13/09/09 + + Postfilter header 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 . +*/ + +#ifndef __POSTFILTER__ +#define __POSTFILTER__ + +void postfilter(MODEL *model, float *bg_est); + +#endif diff --git a/codec2/tags/0.4.1/src/quantise.c b/codec2/tags/0.4.1/src/quantise.c new file mode 100644 index 00000000..fe1ebe78 --- /dev/null +++ b/codec2/tags/0.4.1/src/quantise.c @@ -0,0 +1,2138 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: quantise.c + AUTHOR......: David Rowe + DATE CREATED: 31/5/92 + + Quantisation functions for the sinusoidal coder. + +\*---------------------------------------------------------------------------*/ + +/* + 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 . + +*/ + +#include +#include +#include +#include +#include +#include + +#include "defines.h" +#include "dump.h" +#include "quantise.h" +#include "lpc.h" +#include "lsp.h" +#include "kiss_fft.h" +#undef PROFILE +#include "machdep.h" + +#define LSP_DELTA1 0.01 /* grid spacing for LSP root searches */ + +/*---------------------------------------------------------------------------*\ + + FUNCTION HEADERS + +\*---------------------------------------------------------------------------*/ + +float speech_to_uq_lsps(float lsp[], float ak[], float Sn[], float w[], + int order); + +/*---------------------------------------------------------------------------*\ + + FUNCTIONS + +\*---------------------------------------------------------------------------*/ + +int lsp_bits(int i) { + return lsp_cb[i].log2m; +} + +int lspd_bits(int i) { + return lsp_cbd[i].log2m; +} + +#ifndef CORTEX_M4 +int mel_bits(int i) { + return mel_cb[i].log2m; +} + +int lspmelvq_cb_bits(int i) { + return lspmelvq_cb[i].log2m; +} +#endif + +#ifdef __EXPERIMENTAL__ +int lspdt_bits(int i) { + return lsp_cbdt[i].log2m; +} +#endif + +int lsp_pred_vq_bits(int i) { + return lsp_cbjvm[i].log2m; +} + +/*---------------------------------------------------------------------------*\ + + quantise_init + + Loads the entire LSP quantiser comprised of several vector quantisers + (codebooks). + +\*---------------------------------------------------------------------------*/ + +void quantise_init() +{ +} + +/*---------------------------------------------------------------------------*\ + + quantise + + 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(const float * cb, float vec[], float w[], int k, int m, float *se) +/* float cb[][K]; current VQ codebook */ +/* float vec[]; vector to quantise */ +/* float w[]; weighting vector */ +/* int k; dimension of vectors */ +/* int m; size of codebook */ +/* float *se; accumulated squared error */ +{ + float e; /* current error */ + long besti; /* best index so far */ + float beste; /* best error so far */ + long j; + int i; + float diff; + + besti = 0; + beste = 1E32; + for(j=0; j 0); + mbest = (struct MBEST *)malloc(sizeof(struct MBEST)); + assert(mbest != NULL); + + mbest->entries = entries; + mbest->list = (struct MBEST_LIST *)malloc(entries*sizeof(struct MBEST_LIST)); + assert(mbest->list != NULL); + + for(i=0; ientries; i++) { + for(j=0; jlist[i].index[j] = 0; + mbest->list[i].error = 1E32; + } + + return mbest; +} + + +static void mbest_destroy(struct MBEST *mbest) { + assert(mbest != NULL); + free(mbest->list); + free(mbest); +} + + +/*---------------------------------------------------------------------------*\ + + mbest_insert + + Insert the results of a vector to codebook entry comparison. The + list is ordered in order or error, so those entries with the + smallest error will be first on the list. + +\*---------------------------------------------------------------------------*/ + +static void mbest_insert(struct MBEST *mbest, int index[], float error) { + int i, j, found; + struct MBEST_LIST *list = mbest->list; + int entries = mbest->entries; + + found = 0; + for(i=0; ii; j--) + list[j] = list[j-1]; + for(j=0; jentries; i++) { + for(j=0; jlist[i].index[j]); + fprintf(stderr, " %f\n", mbest->list[i].error); + } +} + + +/*---------------------------------------------------------------------------*\ + + mbest_search + + Searches vec[] to a codebbook of vectors, and maintains a list of the mbest + closest matches. + +\*---------------------------------------------------------------------------*/ + +static void mbest_search( + const float *cb, /* VQ codebook to search */ + float vec[], /* target vector */ + float w[], /* weighting vector */ + int k, /* dimension of vector */ + int m, /* number on entries in codebook */ + struct MBEST *mbest, /* list of closest matches */ + int index[] /* indexes that lead us here */ +) +{ + float e; + int i,j; + float diff; + + for(j=0; jlist[j].index[0]; + for(i=0; ilist[j].index[1]; + index[1] = n2 = mbest_stage2->list[j].index[0]; + for(i=0; ilist[0].index[2]; + n2 = mbest_stage3->list[0].index[1]; + n3 = mbest_stage3->list[0].index[0]; + mse = 0.0; + for (i=0;i max_Rw) + max_Rw = Rw[i]; + if (Rw[i] < min_Rw) + min_Rw = Rw[i]; + + } + + PROFILE_SAMPLE_AND_LOG(tr, tww, " R"); + + #ifdef DUMP + if (dump) + dump_Rw(Rw); + #endif + + /* create post filter mag spectrum and apply ------------------*/ + + /* measure energy before post filtering */ + + e_before = 1E-4; + for(i=0; iL; m++) { + am = (int)((m - 0.5)*model->Wo/r + 0.5); + bm = (int)((m + 0.5)*model->Wo/r + 0.5); + Em = 0.0; + + for(i=am; iA[m]*model->A[m]; + noise += (model->A[m] - Am)*(model->A[m] - Am); + + /* This code significantly improves perf of LPC model, in + particular when combined with phase0. The LPC spectrum tends + to track just under the peaks of the spectral envelope, and + just above nulls. This algorithm does the reverse to + compensate - raising the amplitudes of spectral peaks, while + attenuating the null. This enhances the formants, and + supresses the energy between formants. */ + + if (sim_pf) { + if (Am > model->A[m]) + Am *= 0.7; + if (Am < model->A[m]) + Am *= 1.4; + } + + model->A[m] = Am; + } + *snr = 10.0*log10f(signal/noise); + + PROFILE_SAMPLE_AND_LOG2(tpf, " rec"); +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: encode_Wo() + AUTHOR......: David Rowe + DATE CREATED: 22/8/2010 + + Encodes Wo using a WO_LEVELS quantiser. + +\*---------------------------------------------------------------------------*/ + +int encode_Wo(float Wo, int bits) +{ + int index, Wo_levels = 1< (Wo_levels-1)) index = Wo_levels-1; + + return index; +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: decode_Wo() + AUTHOR......: David Rowe + DATE CREATED: 22/8/2010 + + Decodes Wo using a WO_LEVELS quantiser. + +\*---------------------------------------------------------------------------*/ + +float decode_Wo(int index, int bits) +{ + float Wo_min = TWO_PI/P_MAX; + float Wo_max = TWO_PI/P_MIN; + float step; + float Wo; + int Wo_levels = 1< (Wo_levels-1)) index = Wo_levels-1; + + return index; +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: decode_log_Wo() + AUTHOR......: David Rowe + DATE CREATED: 22/8/2010 + + Decodes Wo using a WO_LEVELS quantiser in the log domain. + +\*---------------------------------------------------------------------------*/ + +float decode_log_Wo(int index, int bits) +{ + float Wo_min = TWO_PI/P_MAX; + float Wo_max = TWO_PI/P_MIN; + float step; + float Wo; + int Wo_levels = 1< max_index) index = max_index; + if (index < min_index) index = min_index; + //printf("max_index: %d min_index: %d hard index: %d ", + // max_index, min_index, index); + + /* mask so that only LSB WO_DT_BITS remain, bit WO_DT_BITS is the sign bit */ + + mask = ((1 << WO_DT_BITS) - 1); + index &= mask; + //printf("mask: 0x%x index: 0x%x\n", mask, index); + + return index; +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: decode_Wo_dt() + AUTHOR......: David Rowe + DATE CREATED: 6 Nov 2011 + + Decodes Wo using WO_DT_BITS difference from last frame. + +\*---------------------------------------------------------------------------*/ + +float decode_Wo_dt(int index, float prev_Wo) +{ + float Wo_min = TWO_PI/P_MAX; + float Wo_max = TWO_PI/P_MIN; + float step; + float Wo; + int mask; + + /* sign extend index */ + + //printf("DEC index: %d "); + if (index & (1 << (WO_DT_BITS-1))) { + mask = ~((1 << WO_DT_BITS) - 1); + index |= mask; + } + //printf("DEC mask: 0x%x index: %d \n", mask, index); + + step = (Wo_max - Wo_min)/WO_LEVELS; + Wo = prev_Wo + step*(index); + + /* bit errors can make us go out of range leading to all sorts of + probs like seg faults */ + + if (Wo > Wo_max) Wo = Wo_max; + if (Wo < Wo_min) Wo = Wo_min; + + return Wo; +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: speech_to_uq_lsps() + AUTHOR......: David Rowe + DATE CREATED: 22/8/2010 + + Analyse a windowed frame of time domain speech to determine LPCs + which are the converted to LSPs for quantisation and transmission + over the channel. + +\*---------------------------------------------------------------------------*/ + +float speech_to_uq_lsps(float lsp[], + float ak[], + float Sn[], + float w[], + int order +) +{ + int i, roots; + float Wn[M]; + float R[order+1]; + float e, E; + + e = 0.0; + for(i=0; iWo < (PI*150.0/4000)) { + model->A[1] *= 0.032; + } +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: encode_energy() + AUTHOR......: David Rowe + DATE CREATED: 22/8/2010 + + Encodes LPC energy using an E_LEVELS quantiser. + +\*---------------------------------------------------------------------------*/ + +int encode_energy(float e, int bits) +{ + int index, e_levels = 1< (e_levels-1)) index = e_levels-1; + + return index; +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: decode_energy() + AUTHOR......: David Rowe + DATE CREATED: 22/8/2010 + + Decodes energy using a E_LEVELS quantiser. + +\*---------------------------------------------------------------------------*/ + +float decode_energy(int index, int bits) +{ + float e_min = E_MIN_DB; + float e_max = E_MAX_DB; + float step; + float e; + int e_levels = 1<.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]; + +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: quantise_WoE() + AUTHOR......: Jean-Marc Valin & David Rowe + DATE CREATED: 29 Feb 2012 + + Experimental joint Wo and LPC energy vector quantiser developed by + Jean-Marc Valin. Exploits correlations between the difference in + the log pitch and log energy from frame to frame. For example + both the pitch and energy tend to only change by small amounts + during voiced speech, however it is important that these changes be + coded carefully. During unvoiced speech they both change a lot but + the ear is less sensitve to errors so coarser quantisation is OK. + + The ear is sensitive to log energy and loq pitch so we quantise in + these domains. That way the error measure used to quantise the + values is close to way the ear senses errors. + + See http://jmspeex.livejournal.com/10446.html + +\*---------------------------------------------------------------------------*/ + +void quantise_WoE(MODEL *model, float *e, float xq[]) +{ + int i, n1; + float x[2]; + float err[2]; + float w[2]; + const float *codebook1 = ge_cb[0].cb; + int nb_entries = ge_cb[0].m; + int ndim = ge_cb[0].k; + float Wo_min = TWO_PI/P_MAX; + float Wo_max = TWO_PI/P_MIN; + + x[0] = log10f((model->Wo/PI)*4000.0/50.0)/log10f(2); + x[1] = 10.0*log10f(1e-4 + *e); + + compute_weights2(x, xq, w); + for (i=0;iWo = powf(2.0, xq[0])*(PI*50.0)/4000.0; + + /* bit errors can make us go out of range leading to all sorts of + probs like seg faults */ + + if (model->Wo > Wo_max) model->Wo = Wo_max; + if (model->Wo < Wo_min) model->Wo = Wo_min; + + model->L = PI/model->Wo; /* if we quantise Wo re-compute L */ + + *e = powf(10.0, xq[1]/10.0); +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: encode_WoE() + AUTHOR......: Jean-Marc Valin & David Rowe + DATE CREATED: 11 May 2012 + + Joint Wo and LPC energy vector quantiser developed my Jean-Marc + Valin. Returns index, and updated states xq[]. + +\*---------------------------------------------------------------------------*/ + +int encode_WoE(MODEL *model, float e, float xq[]) +{ + int i, n1; + float x[2]; + float err[2]; + float w[2]; + const float *codebook1 = ge_cb[0].cb; + int nb_entries = ge_cb[0].m; + int ndim = ge_cb[0].k; + + assert((1<Wo/PI)*4000.0/50.0)/log10f(2); + x[1] = 10.0*log10f(1e-4 + e); + + compute_weights2(x, xq, w); + for (i=0;iWo = powf(2.0, xq[0])*(PI*50.0)/4000.0; + + /* bit errors can make us go out of range leading to all sorts of + probs like seg faults */ + + if (model->Wo > Wo_max) model->Wo = Wo_max; + if (model->Wo < Wo_min) model->Wo = Wo_min; + + model->L = PI/model->Wo; /* if we quantise Wo re-compute L */ + + *e = powf(10.0, xq[1]/10.0); +} + diff --git a/codec2/tags/0.4.1/src/quantise.h b/codec2/tags/0.4.1/src/quantise.h new file mode 100644 index 00000000..edd9922e --- /dev/null +++ b/codec2/tags/0.4.1/src/quantise.h @@ -0,0 +1,138 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: quantise.h + AUTHOR......: David Rowe + DATE CREATED: 31/5/92 + + Quantisation functions for the sinusoidal coder. + +\*---------------------------------------------------------------------------*/ + +/* + 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 . +*/ + +#ifndef __QUANTISE__ +#define __QUANTISE__ + +#include "kiss_fft.h" +#include "comp.h" + +#define WO_BITS 7 +#define WO_LEVELS (1<. +*/ + +/*---------------------------------------------------------------------------*\ + + INCLUDES + +\*---------------------------------------------------------------------------*/ + +#include +#include +#include + +#include "defines.h" +#include "sine.h" +#include "kiss_fft.h" + +#define HPF_BETA 0.125 + +/*---------------------------------------------------------------------------*\ + + HEADERS + +\*---------------------------------------------------------------------------*/ + +void hs_pitch_refinement(MODEL *model, COMP Sw[], float pmin, float pmax, + float pstep); + +/*---------------------------------------------------------------------------*\ + + FUNCTIONS + +\*---------------------------------------------------------------------------*/ + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: make_analysis_window + AUTHOR......: David Rowe + DATE CREATED: 11/5/94 + + Init function that generates the time domain analysis window and it's DFT. + +\*---------------------------------------------------------------------------*/ + +void make_analysis_window(kiss_fft_cfg fft_fwd_cfg, float w[], COMP W[]) +{ + float m; + COMP wshift[FFT_ENC]; + COMP temp; + int i,j; + + /* + Generate Hamming window centered on M-sample pitch analysis window + + 0 M/2 M-1 + |-------------|-------------| + |-------|-------| + NW samples + + All our analysis/synthsis is centred on the M/2 sample. + */ + + m = 0.0; + for(i=0; iWo + 5; + pmin = TWO_PI/model->Wo - 5; + pstep = 1.0; + hs_pitch_refinement(model,Sw,pmin,pmax,pstep); + + /* Fine refinement */ + + pmax = TWO_PI/model->Wo + 1; + pmin = TWO_PI/model->Wo - 1; + pstep = 0.25; + hs_pitch_refinement(model,Sw,pmin,pmax,pstep); + + /* Limit range */ + + if (model->Wo < TWO_PI/P_MAX) + model->Wo = TWO_PI/P_MAX; + if (model->Wo > TWO_PI/P_MIN) + model->Wo = TWO_PI/P_MIN; + + model->L = floorf(PI/model->Wo); +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: hs_pitch_refinement + AUTHOR......: David Rowe + DATE CREATED: 27/5/94 + + Harmonic sum pitch refinement function. + + pmin pitch search range minimum + pmax pitch search range maximum + step pitch search step size + model current pitch estimate in model.Wo + + model refined pitch estimate in model.Wo + +\*---------------------------------------------------------------------------*/ + +void hs_pitch_refinement(MODEL *model, COMP Sw[], float pmin, float pmax, float pstep) +{ + int m; /* loop variable */ + int b; /* bin for current harmonic centre */ + float E; /* energy for current pitch*/ + float Wo; /* current "test" fundamental freq. */ + float Wom; /* Wo that maximises E */ + float Em; /* mamimum energy */ + float r, one_on_r; /* number of rads/bin */ + float p; /* current pitch */ + + /* Initialisation */ + + model->L = PI/model->Wo; /* use initial pitch est. for L */ + Wom = model->Wo; + Em = 0.0; + r = TWO_PI/FFT_ENC; + one_on_r = 1.0/r; + + /* Determine harmonic sum for a range of Wo values */ + + for(p=pmin; p<=pmax; p+=pstep) { + E = 0.0; + Wo = TWO_PI/p; + + /* Sum harmonic magnitudes */ + for(m=1; m<=model->L; m++) { + b = (int)(m*Wo*one_on_r + 0.5); + E += Sw[b].real*Sw[b].real + Sw[b].imag*Sw[b].imag; + } + /* Compare to see if this is a maximum */ + + if (E > Em) { + Em = E; + Wom = Wo; + } + } + + model->Wo = Wom; +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: estimate_amplitudes + AUTHOR......: David Rowe + DATE CREATED: 27/5/94 + + Estimates the complex amplitudes of the harmonics. + +\*---------------------------------------------------------------------------*/ + +void estimate_amplitudes(MODEL *model, COMP Sw[], COMP W[], int est_phase) +{ + int i,m; /* loop variables */ + int am,bm; /* bounds of current harmonic */ + int b; /* DFT bin of centre of current harmonic */ + float den; /* denominator of amplitude expression */ + float r, one_on_r; /* number of rads/bin */ + int offset; + COMP Am; + + r = TWO_PI/FFT_ENC; + one_on_r = 1.0/r; + + for(m=1; m<=model->L; m++) { + den = 0.0; + am = (int)((m - 0.5)*model->Wo*one_on_r + 0.5); + bm = (int)((m + 0.5)*model->Wo*one_on_r + 0.5); + b = (int)(m*model->Wo/r + 0.5); + + /* Estimate ampltude of harmonic */ + + den = 0.0; + Am.real = Am.imag = 0.0; + offset = FFT_ENC/2 - (int)(m*model->Wo*one_on_r + 0.5); + for(i=am; iA[m] = sqrtf(den); + + if (est_phase) { + + /* Estimate phase of harmonic, this is expensive in CPU for + embedded devicesso we make it an option */ + + model->phi[m] = atan2f(Sw[b].imag,Sw[b].real); + } + } +} + +/*---------------------------------------------------------------------------*\ + + est_voicing_mbe() + + Returns the error of the MBE cost function for a fiven F0. + + Note: I think a lot of the operations below can be simplified as + W[].imag = 0 and has been normalised such that den always equals 1. + +\*---------------------------------------------------------------------------*/ + +float est_voicing_mbe( + MODEL *model, + COMP Sw[], + COMP W[], + COMP Sw_[], /* DFT of all voiced synthesised signal */ + /* useful for debugging/dump file */ + COMP Ew[]) /* DFT of error */ +{ + int i,l,al,bl,m; /* loop variables */ + COMP Am; /* amplitude sample for this band */ + int offset; /* centers Hw[] about current harmonic */ + float den; /* denominator of Am expression */ + float error; /* accumulated error between original and synthesised */ + float Wo; + float sig, snr; + float elow, ehigh, eratio; + float sixty; + + sig = 1E-4; + for(l=1; l<=model->L/4; l++) { + sig += model->A[l]*model->A[l]; + } + for(i=0; iWo; + error = 1E-4; + + /* Just test across the harmonics in the first 1000 Hz (L/4) */ + + for(l=1; l<=model->L/4; l++) { + Am.real = 0.0; + Am.imag = 0.0; + den = 0.0; + al = ceilf((l - 0.5)*Wo*FFT_ENC/TWO_PI); + bl = ceilf((l + 0.5)*Wo*FFT_ENC/TWO_PI); + + /* Estimate amplitude of harmonic assuming harmonic is totally voiced */ + + offset = FFT_ENC/2 - l*Wo*FFT_ENC/TWO_PI + 0.5; + for(m=al; m V_THRESH) + model->voiced = 1; + else + model->voiced = 0; + + /* post processing, helps clean up some voicing errors ------------------*/ + + /* + Determine the ratio of low freqency to high frequency energy, + voiced speech tends to be dominated by low frequency energy, + unvoiced by high frequency. This measure can be used to + determine if we have made any gross errors. + */ + + elow = ehigh = 1E-4; + for(l=1; l<=model->L/2; l++) { + elow += model->A[l]*model->A[l]; + } + for(l=model->L/2; l<=model->L; l++) { + ehigh += model->A[l]*model->A[l]; + } + eratio = 10.0*log10f(elow/ehigh); + + /* Look for Type 1 errors, strongly V speech that has been + accidentally declared UV */ + + if (model->voiced == 0) + if (eratio > 10.0) + model->voiced = 1; + + /* Look for Type 2 errors, strongly UV speech that has been + accidentally declared V */ + + if (model->voiced == 1) { + if (eratio < -10.0) + model->voiced = 0; + + /* A common source of Type 2 errors is the pitch estimator + gives a low (50Hz) estimate for UV speech, which gives a + good match with noise due to the close harmoonic spacing. + These errors are much more common than people with 50Hz3 + pitch, so we have just a small eratio threshold. */ + + sixty = 60.0*TWO_PI/FS; + if ((eratio < -4.0) && (model->Wo <= sixty)) + model->voiced = 0; + } + //printf(" v: %d snr: %f eratio: %3.2f %f\n",model->voiced,snr,eratio,dF0); + + return snr; +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: make_synthesis_window + AUTHOR......: David Rowe + DATE CREATED: 11/5/94 + + Init function that generates the trapezoidal (Parzen) sythesis window. + +\*---------------------------------------------------------------------------*/ + +void make_synthesis_window(float Pn[]) +{ + int i; + float win; + + /* Generate Parzen window in time domain */ + + win = 0.0; + for(i=0; i 10ms sound poor. The effect can also + be seen when synthesising test signals like single sine waves, some + sort of amplitude modulation at the frame rate. + + Another possibility is using a larger FFT size (1024 or 2048). + */ + +#define FFT_SYNTHESIS +#ifdef FFT_SYNTHESIS + /* Now set up frequency domain synthesised speech */ + for(l=1; l<=model->L; l++) { + //for(l=model->L/2; l<=model->L; l++) { + //for(l=1; l<=model->L/4; l++) { + b = (int)(l*model->Wo*FFT_DEC/TWO_PI + 0.5); + if (b > ((FFT_DEC/2)-1)) { + b = (FFT_DEC/2)-1; + } + Sw_[b].real = model->A[l]*cosf(model->phi[l]); + Sw_[b].imag = model->A[l]*sinf(model->phi[l]); + Sw_[FFT_DEC-b].real = Sw_[b].real; + Sw_[FFT_DEC-b].imag = -Sw_[b].imag; + } + + /* Perform inverse DFT */ + + kiss_fft(fft_inv_cfg, (kiss_fft_cpx *)Sw_, (kiss_fft_cpx *)sw_); +#else + /* + Direct time domain synthesis using the cos() function. Works + well at 10ms and 20ms frames rates. Note synthesis window is + still used to handle overlap-add between adjacent frames. This + could be simplified as we don't need to synthesise where Pn[] + is zero. + */ + for(l=1; l<=model->L; l++) { + for(i=0,j=-N+1; iA[l]*cosf(j*model->Wo*l + model->phi[l]); + } + for(i=N-1,j=0; i<2*N; i++,j++) + Sw_[j].real += 2.0*model->A[l]*cosf(j*model->Wo*l + model->phi[l]); + } +#endif + + /* Overlap add to previous samples */ + + for(i=0; i. +*/ + +#ifndef __SINE__ +#define __SINE__ + +#include "defines.h" +#include "comp.h" +#include "kiss_fft.h" + +void make_analysis_window(kiss_fft_cfg fft_fwd_cfg, float w[], COMP W[]); +float hpf(float x, float states[]); +void dft_speech(kiss_fft_cfg fft_fwd_cfg, COMP Sw[], float Sn[], float w[]); +void two_stage_pitch_refinement(MODEL *model, COMP Sw[]); +void estimate_amplitudes(MODEL *model, COMP Sw[], COMP W[], int est_phase); +float est_voicing_mbe(MODEL *model, COMP Sw[], COMP W[], COMP Sw_[],COMP Ew[]); +void make_synthesis_window(float Pn[]); +void synthesise(kiss_fft_cfg fft_inv_cfg, float Sn_[], MODEL *model, float Pn[], int shift); + +#define CODEC2_RAND_MAX 32767 +int codec2_rand(void); + +#endif diff --git a/codec2/tags/0.4.1/src/ssbfilt_coeff.h b/codec2/tags/0.4.1/src/ssbfilt_coeff.h new file mode 100644 index 00000000..457f03a8 --- /dev/null +++ b/codec2/tags/0.4.1/src/ssbfilt_coeff.h @@ -0,0 +1,107 @@ +/* 600 - 2600 Hz FIR filter coeffs */ +/* Generated by make_ssbfilt Octave script */ + +#define SSBFILT_N 100 + +float ssbfilt_coeff[]={ + 0.000065, + -0.000030, + 0.000041, + 0.000010, + -0.000128, + -0.000072, + -0.000007, + -0.000095, + -0.000063, + 0.000016, + -0.000000, + 0.000022, + -0.000115, + -0.000233, + -0.000023, + -0.000315, + -0.000725, + 0.000073, + 0.000380, + -0.000345, + 0.000895, + 0.002401, + 0.001241, + 0.001409, + 0.003106, + 0.001236, + -0.001117, + -0.001091, + -0.003184, + -0.005981, + -0.006904, + -0.007920, + -0.005588, + -0.002546, + -0.003476, + 0.005155, + 0.017465, + 0.010772, + 0.013033, + 0.035082, + 0.018466, + -0.010261, + 0.016676, + 0.004890, + -0.076807, + -0.055969, + -0.007360, + -0.155769, + -0.203150, + 0.179458, + 0.475523, + 0.179458, + -0.203150, + -0.155769, + -0.007360, + -0.055969, + -0.076807, + 0.004890, + 0.016676, + -0.010261, + 0.018466, + 0.035082, + 0.013033, + 0.010772, + 0.017465, + 0.005155, + -0.003476, + -0.002546, + -0.005588, + -0.007920, + -0.006904, + -0.005981, + -0.003184, + -0.001091, + -0.001117, + 0.001236, + 0.003106, + 0.001409, + 0.001241, + 0.002401, + 0.000895, + -0.000345, + 0.000380, + 0.000073, + -0.000725, + -0.000315, + -0.000023, + -0.000233, + -0.000115, + 0.000022, + -0.000000, + 0.000016, + -0.000063, + -0.000095, + -0.000007, + -0.000072, + -0.000128, + 0.000010, + 0.000041, + -0.000030 +}; \ No newline at end of file diff --git a/codec2/tags/0.4.1/src/test_bits.h b/codec2/tags/0.4.1/src/test_bits.h new file mode 100644 index 00000000..d1c01a03 --- /dev/null +++ b/codec2/tags/0.4.1/src/test_bits.h @@ -0,0 +1,164 @@ +/* Generated by test_bits_file() Octave function */ + +const int test_bits[]={ + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1 +}; diff --git a/codec2/tags/0.4.1/src/test_bits_coh.h b/codec2/tags/0.4.1/src/test_bits_coh.h new file mode 100644 index 00000000..b01299c6 --- /dev/null +++ b/codec2/tags/0.4.1/src/test_bits_coh.h @@ -0,0 +1,564 @@ +/* Generated by test_bits_coh_file() Octave function */ + +const int test_bits_coh[]={ + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0 +}; diff --git a/codec2/tags/0.4.1/src/varicode.c b/codec2/tags/0.4.1/src/varicode.c new file mode 100644 index 00000000..21f7cce1 --- /dev/null +++ b/codec2/tags/0.4.1/src/varicode.c @@ -0,0 +1,486 @@ +//========================================================================== +// Name: varicode.h +// Purpose: Varicode encoded and decode functions +// Created: Nov 24, 2012 +// Authors: David Rowe +// +// To test: +// $ gcc varicode.c -o varicode -DVARICODE_UNITTEST -Wall +// $ ./varicode +// +// License: +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU 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 General Public License +// along with this program; if not, see . +// +//========================================================================== + +#include +#include +#include +#include +#include +#include "varicode.h" +#include "varicode_table.h" + + +/* + output is an unpacked array of bits of maximum size max_out. Note + unpacked arrays are a more suitable form for modulator input. + + Code 1 covers the entire ASCII char set. +*/ + +int varicode_encode1(short varicode_out[], char ascii_in[], int max_out, int n_in) { + int n_out, index, n_zeros, v_len; + unsigned short byte1, byte2, packed; + + n_out = 0; + + while(n_in && (n_out < max_out)) { + + assert((unsigned int)(*ascii_in) < 128); + + index = 2*(unsigned int)(*ascii_in); + byte1 = varicode_table1[index]; + byte2 = varicode_table1[index+1]; + packed = (byte1 << 8) + byte2; + + //printf("n_in: %d ascii_in: %c index: %d packed 0x%x\n", n_in, *ascii_in, index, packed); + ascii_in++; + + n_zeros = 0; + v_len = 0; + while ((n_zeros < 2) && (n_out < max_out) && (v_len <= VARICODE_MAX_BITS)) { + if (packed & 0x8000) { + *varicode_out = 1; + n_zeros = 0; + } + else { + *varicode_out = 0; + n_zeros++; + } + //printf("packed: 0x%x *varicode_out: %d n_zeros: %d v_len: %d\n", packed, *varicode_out, n_zeros,v_len ); + packed <<= 1; + varicode_out++; + n_out++; + v_len++; + } + assert(v_len <= VARICODE_MAX_BITS); + + n_in--; + } + + return n_out; +} + + +/* + Code 2 covers a subset, but is more efficient that Code 1 (282 + compared to 1315 bits on unittest) Unsupported characters are + replaced by spaces. We encode/decode two bits at a time. +*/ + +int varicode_encode2(short varicode_out[], char ascii_in[], int max_out, int n_in) { + int n_out, n_zeros, v_len, i; + unsigned short packed; + + n_out = 0; + + while(n_in && (n_out < max_out)) { + + packed = varicode_table2[0]; // default to space if char not found + + // see if our character exists + for(i=0; istate = 0; + dec_states->n_zeros = 0; + dec_states->v_len = 0; + dec_states->packed = 0; + dec_states->code_num = code_num; + dec_states->n_in = 0; + dec_states->in[0] = dec_states->in[1] = 0; +} + + +void varicode_set_code_num(struct VARICODE_DEC *dec_states, int code_num) +{ + assert((code_num == 1) || (code_num == 2)); + dec_states->code_num = code_num; +} + + +/* Code 1 decode function, accepts one bit at a time */ + +static int decode_one_bit(struct VARICODE_DEC *s, char *single_ascii, short varicode_in, int long_code) +{ + int found=0, i; + unsigned short byte1, byte2; + + //printf("decode_one_bit : state: %d varicode_in: %d packed: 0x%x n_zeros: %d\n", + // s->state, varicode_in, s->packed, s->n_zeros); + + if (s->state == 0) { + if (!varicode_in) + return 0; + else + s->state = 1; + } + + if (s->state == 1) { + if (varicode_in) { + s->packed |= (0x8000 >> s->v_len); + s->n_zeros = 0; + } + else { + s->n_zeros++; + } + s->v_len++; + found = 0; + + /* end of character code */ + + if (s->n_zeros == 2) { + if (s->v_len) { + /* run thru table but note with bit errors we might not actually find a match */ + + byte1 = s->packed >> 8; + //printf("looking for byte1 : 0x%x ... ", byte1); + byte2 = s->packed & 0xff; + + for(i=0; i<128; i++) { + if ((byte1 == varicode_table1[2*i]) && (byte2 == varicode_table1[2*i+1])) { + found = 1; + *single_ascii = i; + } + } + } + varicode_decode_init(s, s->code_num); + } + + /* code can run too long if we have a bit error */ + + if (s->v_len > VARICODE_MAX_BITS) + varicode_decode_init(s, s->code_num); + } + + return found; +} + + +/* Code 2 decode function, accepts two bits at a time */ + +static int decode_two_bits(struct VARICODE_DEC *s, char *single_ascii, short varicode_in1, short varicode_in2) +{ + int found=0, i; + unsigned short byte1; + + if (s->state == 0) { + if (!(varicode_in1 || varicode_in2)) + return 0; + else + s->state = 1; + } + + if (s->state == 1) { + if (varicode_in1) + s->packed |= (0x8000 >> s->v_len); + if (varicode_in2) + s->packed |= (0x4000 >> s->v_len); + if (varicode_in1 || varicode_in2) + s->n_zeros = 0; + else + s->n_zeros+=2; + + s->v_len+=2; + + found = 0; + + /* end of character code */ + + if (s->n_zeros == 2) { + if (s->v_len) { + /* run thru table but note with bit errors we might not actually find a match */ + + byte1 = s->packed >> 8; + //printf("looking for byte1 : 0x%x ... ", byte1); + for(i=0; icode_num); + } + + /* code can run too long if we have a bit error */ + + if (s->v_len > VARICODE_MAX_BITS) + varicode_decode_init(s, s->code_num); + } + + return found; +} + + +int varicode_decode1(struct VARICODE_DEC *dec_states, char ascii_out[], short varicode_in[], int max_out, int n_in) { + int output, n_out; + char single_ascii = 0; + + n_out = 0; + + //printf("varicode_decode: n_in: %d\n", n_in); + + while(n_in && (n_out < max_out)) { + output = decode_one_bit(dec_states, &single_ascii, varicode_in[0], 0); + varicode_in++; + n_in--; + + if (output) { + *ascii_out++ = single_ascii; + n_out++; + } + } + + return n_out; +} + + +int varicode_decode2(struct VARICODE_DEC *dec_states, char ascii_out[], short varicode_in[], int max_out, int n_in) { + int output, n_out; + char single_ascii = 0; + + n_out = 0; + + //printf("varicode_decode2: n_in: %d varicode_in[0] %d dec_states->n_in: %d\n", n_in, varicode_in[0], dec_states->n_in); + //printf("%d ", varicode_in[0]); + while(n_in && (n_out < max_out)) { + + // keep two bit buffer so we can process two at a time + + dec_states->in[0] = dec_states->in[1]; + dec_states->in[1] = varicode_in[0]; + dec_states->n_in++; + varicode_in++; + n_in--; + + if (dec_states->n_in == 2) { + output = decode_two_bits(dec_states, &single_ascii, dec_states->in[0], dec_states->in[1]); + + dec_states->n_in = 0; + + if (output) { + //printf(" output: %d single_ascii: 0x%x %c\n", output, (int)single_ascii, single_ascii); + *ascii_out++ = single_ascii; + n_out++; + } + } + } + + return n_out; +} + + +int varicode_decode(struct VARICODE_DEC *dec_states, char ascii_out[], short varicode_in[], int max_out, int n_in) { + if (dec_states->code_num == 1) + return varicode_decode1(dec_states, ascii_out, varicode_in, max_out, n_in); + else + return varicode_decode2(dec_states, ascii_out, varicode_in, max_out, n_in); +} + + +#ifdef VARICODE_UNITTEST +void test_varicode(int code_num) { + char *ascii_in; + short *varicode; + int i, n_varicode_bits_out, n_ascii_chars_out, length, half, n_out, j, len; + char *ascii_out; + struct VARICODE_DEC dec_states; + + if (code_num == 1) { + printf("long code:\n"); + length = sizeof(varicode_table1)/2; + } + else { + printf("short code:\n"); + length = sizeof(varicode_table2)/2; + } + //length = 10; + ascii_in = (char*)malloc(length); + varicode = (short*)malloc(VARICODE_MAX_BITS*sizeof(short)*length); + ascii_out = (char*)malloc(length); + + // 1. test all Varicode codes ------------------------------------------------------------- + + if (code_num == 1) { + for(i=0; i. +// +//========================================================================== + +#ifndef __VARICODE__ +#define __VARICODE__ + +#ifdef __cplusplus +extern "C" { + +#endif + +#define VARICODE_MAX_BITS (10+2) /* max varicode bits for each ascii character */ + /* 10 bits for code plus 2 0 bits for inter-character space */ + +struct VARICODE_DEC { + int state; + int n_zeros; + int v_len; + unsigned short packed; + int code_num; + int n_in; + int in[2]; +}; + +int varicode_encode(short varicode_out[], char ascii_in[], int max_out, int n_in, int code_num); +void varicode_decode_init(struct VARICODE_DEC *dec_states, int code_num); +int varicode_decode(struct VARICODE_DEC *dec_states, char ascii_out[], short varicode_in[], int max_out, int n_in); +void varicode_set_code_num(struct VARICODE_DEC *dec_states, int code_num); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/codec2/tags/0.4.1/src/varicode_table.h b/codec2/tags/0.4.1/src/varicode_table.h new file mode 100644 index 00000000..08f38fd5 --- /dev/null +++ b/codec2/tags/0.4.1/src/varicode_table.h @@ -0,0 +1,338 @@ +//========================================================================== +// Name: varicode_table.h +// Purpose: Varicode look up table +// Created: Nov 24, 2012 +// Authors: Clint Turner, KA7OEI, Peter Martinez, G3PLX +// +// License: +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU 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 General Public License +// along with this program; if not, see . +// +//========================================================================== + +/* The following table defines the PKS31 varicode. There are 128 entries, +corresponding to ASCII characters 0-127 with two bytes for each entry. The bits +for the varicode are to be shifted out MSB-first for both bytes, with the first byte +in the table being the first one to be sent. + +More than one zero in sequence signifies the end of the character (i.e. +two zeroes are the intercharacter sequence, so at least two zeroes should always be +sent before the next character is sent. + +This file is constructed with information from the article "PSK31 Fundamentals" +by Peter Martinez, G3PLX by Clint Turner, KA7OEI +*/ +unsigned char const varicode_table1[256] = { + 0b10101010, + 0b11000000, // 0 NUL + 0b10110110, + 0b11000000, // 1 SOH + 0b10111011, + 0b01000000, // 2 STX + 0b11011101, + 0b11000000, // 3 ETX + 0b10111010, + 0b11000000, // 4 EOT + 0b11010111, + 0b11000000, // 5 ENQ + 0b10111011, + 0b11000000, // 6 ACK + 0b10111111, + 0b01000000, // 7 BEL + 0b10111111, + 0b11000000, // 8 BS + 0b11101111, + 0b00000000, // 9 HT + 0b11101000, + 0b00000000, // 10 LF + 0b11011011, + 0b11000000, // 11 VT + 0b10110111, + 0b01000000, // 12 FF + 0b11111000, + 0b00000000, // 13 CR + 0b11011101, + 0b01000000, // 14 SO + 0b11101010, + 0b11000000, // 15 SI + 0b10111101, + 0b11000000, // 16 DLE + 0b10111101, + 0b01000000, // 17 DC1 + 0b11101011, + 0b01000000, // 18 DC2 + 0b11101011, + 0b11000000, // 19 DC3 + 0b11010110, + 0b11000000, // 20 DC4 + 0b11011010, + 0b11000000, // 21 NAK + 0b11011011, + 0b01000000, // 22 SYN + 0b11010101, + 0b11000000, // 23 ETB + 0b11011110, + 0b11000000, // 24 CAN + 0b11011111, + 0b01000000, // 25 EM + 0b11101101, + 0b11000000, // 26 SUB + 0b11010101, + 0b01000000, // 27 ESC + 0b11010111, + 0b01000000, // 28 FS + 0b11101110, + 0b11000000, // 29 GS + 0b10111110, + 0b11000000, // 30 RS + 0b11011111, + 0b11000000, // 31 US + 0b10000000, + 0b00000000, // 32 SP + 0b11111111, + 0b10000000, // 33 ! + 0b10101111, + 0b10000000, // 34 " + 0b11111010, + 0b10000000, // 35 # + 0b11101101, + 0b10000000, // 36 $ + 0b10110101, + 0b01000000, // 37 % + 0b10101110, + 0b11000000, // 38 & + 0b10111111, + 0b10000000, // 39 ' + 0b11111011, + 0b00000000, // 40 ( + 0b11110111, + 0b00000000, // 41 ) + 0b10110111, + 0b10000000, // 42 * + 0b11101111, + 0b10000000, // 43 + + 0b11101010, + 0b00000000, // 44 , + 0b11010100, + 0b00000000, // 45 - + 0b10101110, + 0b00000000, // 46 . + 0b11010111, + 0b10000000, // 47 / + 0b10110111, + 0b00000000, // 48 0 + 0b10111101, + 0b00000000, // 49 1 + 0b11101101, + 0b00000000, // 50 2 + 0b11111111, + 0b00000000, // 51 3 + 0b10111011, + 0b10000000, // 52 4 + 0b10101101, + 0b10000000, // 53 5 + 0b10110101, + 0b10000000, // 54 6 + 0b11010110, + 0b10000000, // 55 7 + 0b11010101, + 0b10000000, // 56 8 + 0b11011011, + 0b10000000, // 57 9 + 0b11110101, + 0b00000000, // 58 : + 0b11011110, + 0b10000000, // 59 ; + 0b11110110, + 0b10000000, // 60 < + 0b10101010, + 0b00000000, // 61 = + 0b11101011, + 0b10000000, // 62 > + 0b10101011, + 0b11000000, // 63 ? + 0b10101111, + 0b01000000, // 64 @ + 0b11111010, + 0b00000000, // 65 A + 0b11101011, + 0b00000000, // 66 B + 0b10101101, + 0b00000000, // 67 C + 0b10110101, + 0b00000000, // 68 D + 0b11101110, + 0b00000000, // 69 E + 0b11011011, + 0b00000000, // 70 F + 0b11111101, + 0b00000000, // 71 G + 0b10101010, + 0b10000000, // 72 H + 0b11111110, + 0b00000000, // 73 I + 0b11111110, + 0b10000000, // 74 J + 0b10111110, + 0b10000000, // 75 K + 0b11010111, + 0b00000000, // 76 L + 0b10111011, + 0b00000000, // 77 M + 0b11011101, + 0b00000000, // 78 N + 0b10101011, + 0b00000000, // 79 O + 0b11010101, + 0b00000000, // 80 P + 0b11101110, + 0b10000000, // 81 Q + 0b10101111, + 0b00000000, // 82 R + 0b11011110, + 0b00000000, // 83 S + 0b11011010, + 0b00000000, // 84 T + 0b10101011, + 0b10000000, // 85 U + 0b11011010, + 0b10000000, // 86 V + 0b10101110, + 0b10000000, // 87 W + 0b10111010, + 0b10000000, // 88 X + 0b10111101, + 0b10000000, // 89 Y + 0b10101011, + 0b01000000, // 90 Z + 0b11111011, + 0b10000000, // 91 [ + 0b11110111, + 0b10000000, // 92 "\" + 0b11111101, + 0b10000000, // 93 ] + 0b10101111, + 0b11000000, // 94 ^ + 0b10110110, + 0b10000000, // 95 _ (underline) + 0b10110111, + 0b11000000, // 96 ` + 0b10110000, + 0b00000000, // 97 a + 0b10111110, + 0b00000000, // 98 b + 0b10111100, + 0b00000000, // 99 c + 0b10110100, + 0b00000000, // 100 d + 0b11000000, + 0b00000000, // 101 e + 0b11110100, + 0b00000000, // 102 f + 0b10110110, + 0b00000000, // 103 g + 0b10101100, + 0b00000000, // 104 h + 0b11010000, + 0b00000000, // 105 i + 0b11110101, + 0b10000000, // 106 j + 0b10111111, + 0b00000000, // 107 k + 0b11011000, + 0b00000000, // 108 l + 0b11101100, + 0b00000000, // 109 m + 0b11110000, + 0b00000000, // 110 n + 0b11100000, + 0b00000000, // 111 o + 0b11111100, + 0b00000000, // 112 p + 0b11011111, + 0b10000000, // 113 q + 0b10101000, + 0b00000000, // 114 r + 0b10111000, + 0b00000000, // 115 s + 0b10100000, + 0b00000000, // 116 t + 0b11011100, + 0b00000000, // 117 u + 0b11110110, + 0b00000000, // 118 v + 0b11010110, + 0b00000000, // 119 w + 0b11011111, + 0b00000000, // 120 x + 0b10111010, + 0b00000000, // 121 y + 0b11101010, + 0b10000000, // 122 z + 0b10101101, + 0b11000000, // 123 { + 0b11011101, + 0b10000000, // 124 | + 0b10101101, + 0b01000000, // 125 } + 0b10110101, + 0b11000000, // 126 ~ + 0b11101101, + 0b01000000, // 127 (del) +}; + +// This code was used on FDMDV version 1, and is more compact that Code 1, but only covers a subset +// of the ASCII cahacter set + +char const varicode_table2[] = { + + ' ' ,0b11000000, + 13 ,0b01000000, // CR, end of message + '=' ,0b10000000, + '1' ,0b11110000, + '2' ,0b01110000, + '3' ,0b10110000, + '4' ,0b11010000, + '5' ,0b01010000, + '6' ,0b10010000, + '7' ,0b11100000, + '8' ,0b01100000, + '9' ,0b10100000, + 'a' ,0b11111100, + 'b' ,0b01111100, + 'c' ,0b10111100, + 'd' ,0b11011100, + 'e' ,0b01011100, + 'f' ,0b10011100, + 'g' ,0b11101100, + 'h' ,0b01101100, + 'i' ,0b10101100, + 'j' ,0b11110100, + 'k' ,0b01110100, + 'l' ,0b10110100, + 'm' ,0b11010100, + 'n' ,0b01010100, + 'o' ,0b10010100, + 'p' ,0b11100100, + 'q' ,0b01100100, + 'r' ,0b10100100, + 's' ,0b11111000, + 't' ,0b01111000, + 'u' ,0b10111000, + 'v' ,0b11011000, + 'w' ,0b01011000, + 'x' ,0b10011000, + 'y' ,0b11101000, + 'z' ,0b01101000, + '0' ,0b10101000 +}; + diff --git a/codec2/tags/0.4.1/stm32/Makefile b/codec2/tags/0.4.1/stm32/Makefile new file mode 100644 index 00000000..ba9ceeb1 --- /dev/null +++ b/codec2/tags/0.4.1/stm32/Makefile @@ -0,0 +1,422 @@ +# Makefile for stm32f4 Codec 2 test programs + +################################################### + +FLOAT_TYPE=hard + +################################################### + +BINPATH= +CC=$(BINPATH)arm-none-eabi-gcc +OBJCOPY=$(BINPATH)arm-none-eabi-objcopy +SIZE=$(BINPATH)arm-none-eabi-size + +################################################### + +CFLAGS = -std=gnu99 -O0 -g -Wall -Tstm32_flash.ld -DSTM32F40_41xxx -DCORTEX_M4 +CFLAGS += -mlittle-endian -mthumb -mthumb-interwork -nostartfiles -mcpu=cortex-m4 + +ifeq ($(FLOAT_TYPE), hard) +CFLAGS += -fsingle-precision-constant -Wdouble-promotion +#CFLAGS += -fsingle-precision-constant +CFLAGS += -mfpu=fpv4-sp-d16 -mfloat-abi=hard -D__FPU_PRESENT=1 -D__FPU_USED=1 +else +CFLAGS += -msoft-float +endif + +################################################### + +# Definitions for the STM32F4 Standard Peripheral Library + +PERIPHLIBURL = http://www.st.com/st-web-ui/static/active/en/st_prod_software_internet/resource/technical/software/firmware/ +PERIPHLIBZIP = stm32f4_dsp_stdperiph_lib.zip +PERIPHLIBVER = V1.4.0 +PERIPHLIBNAME = STM32F4xx_DSP_StdPeriph_Lib +PERIPHLIBDIR = $(PERIPHLIBNAME) +CMSIS = $(PERIPHLIBDIR)/Libraries/CMSIS +STM32F4LIB = $(PERIPHLIBDIR)/Libraries/STM32F4xx_StdPeriph_Driver +STM32F4TEMPLATE = $(PERIPHLIBDIR)/Project/STM32F4xx_StdPeriph_Templates +DSPLIB = $(PERIPHLIBDIR)/Libraries/CMSIS/DSP_Lib + +CFLAGS += -DUSE_STDPERIPH_DRIVER -I$(STM32F4LIB)/inc -I$(STM32F4TEMPLATE) +CFLAGS += -I$(CMSIS)/Include -I$(CMSIS)/Device/ST/STM32F4xx/Include +CFLAGS += -DARM_MATH_CM4 + +################################################### + +# Codec 2 + +CODEC2_SRC=../src +CODEC2_SRCS=\ +$(CODEC2_SRC)/lpc.c \ +$(CODEC2_SRC)/nlp.c \ +$(CODEC2_SRC)/postfilter.c \ +$(CODEC2_SRC)/sine.c \ +$(CODEC2_SRC)/codec2.c \ +$(CODEC2_SRC)/kiss_fft.c \ +$(CODEC2_SRC)/interp.c \ +$(CODEC2_SRC)/lsp.c \ +$(CODEC2_SRC)/phase.c \ +$(CODEC2_SRC)/quantise.c \ +$(CODEC2_SRC)/pack.c \ +$(CODEC2_SRC)/codebook.c \ +$(CODEC2_SRC)/codebookd.c \ +$(CODEC2_SRC)/codebookjvm.c \ +$(CODEC2_SRC)/codebookge.c \ +$(CODEC2_SRC)/dump.c \ +$(CODEC2_SRC)/fdmdv.c \ +$(CODEC2_SRC)/freedv_api.c \ +$(CODEC2_SRC)/varicode.c \ +$(CODEC2_SRC)/golay23.c + +CFLAGS += -D__EMBEDDED__ + +#enable this for dump files to help verify optimisation +#CFLAGS += -DDUMP + +CFLAGS += -I../src +CFLAGS += -I../unittest +CFLAGS += -Iinc + +FFT_TEST_SRCS = \ +$(DSPLIB)/Examples/arm_fft_bin_example/arm_fft_bin_data.c \ +fft_test.c \ +src/startup_stm32f4xx.s \ +stm32f4_machdep.c \ +gdb_stdio.c \ +../src/kiss_fft.c + +################################################### + +vpath %.c src +vpath %.a lib + +ROOT=$(shell pwd) + +# Library paths + +LIBPATHS = + +# Libraries to link + +LIBS = libstm32f4.a -lg -lnosys -lm + +# startup file + +SRCS += src/startup_stm32f4xx.s src/init.c + +OBJS = $(SRCS:.c=.o) + +################################################### + +all: libstm32f4.a codec2_profile.elf fft_test.elf dac_ut.elf dac_play.elf adc_rec.elf pwm_ut.elf fdmdv_profile.elf sm1000_leds_switches_ut.elf sm1000.elf adcdac_ut.elf freedv_tx_profile.elf freedv_rx_profile.elf adc_sd.elf usb_vcp_ut.elf tuner_ut.elf fast_dac_ut.elf adc_sfdr_ut.elf + +dl/$(PERIPHLIBZIP): + mkdir -p dl + cd dl; wget $(PERIPHLIBURL)/$(PERIPHLIBZIP) + +$(PERIPHLIBDIR): dl/$(PERIPHLIBZIP) + cd dl; unzip $(PERIPHLIBZIP) + mv dl/$(PERIPHLIBDIR)_$(PERIPHLIBVER) $(PERIPHLIBDIR) + +libstm32f4.a: $(PERIPHLIBDIR) + $(MAKE) $(STM32F4TEMPLATE)/system_stm32f4xx.o + for F in $(STM32F4LIB)/src/*.c ; do $(MAKE) $${F%.c}.o ; done + for F in $(CMSIS)/DSP_Lib/Source/*/*.c ; do $(MAKE) $${F%.c}.o ; done + find $(PERIPHLIBDIR) -type f -name '*.o' -exec $(AR) crs libstm32f4.a {} ";" + +#################################################### + +CODEC2_PROFILE_SRCS=\ +src/codec2_profile.c \ +src/gdb_stdio.c \ +src/stm32f4_machdep.c \ +src/startup_stm32f4xx.s \ +src/init.c \ +src/system_stm32f4xx.c +CODEC2_PROFILE_SRCS += $(CODEC2_SRCS) + +codec2_profile.elf: $(CODEC2_PROFILE_SRCS) + $(CC) $(CFLAGS) -DPROFILE $^ -o $@ $(LIBPATHS) $(LIBS) + +fft_test.elf: $(FFT_TEST_SRCS) + $(CC) $(CFLAGS) $^ -o $@ $(LIBPATHS) $(LIBS) + +DAC_UT_SRCS=\ +src/dac_ut.c \ +../src/fifo.c \ +src/stm32f4_dac.c \ +src/debugblinky.c \ +src/system_stm32f4xx.c \ +src/startup_stm32f4xx.s \ +src/init.c + +dac_ut.elf: $(DAC_UT_SRCS) + $(CC) $(CFLAGS) -O0 $^ -o $@ $(LIBPATHS) $(LIBS) + $(OBJCOPY) -O binary dac_ut.elf dac_ut.bin + +FAST_DAC_UT_SRCS=\ +src/fast_dac_ut.c \ +../src/fifo.c \ +src/iir_duc.c \ +src/gdb_stdio.c \ +src/stm32f4_dacduc.c \ +src/debugblinky.c \ +src/system_stm32f4xx.c \ +src/startup_stm32f4xx.s \ +src/init.c + +fast_dac_ut.elf: $(FAST_DAC_UT_SRCS) + $(CC) $(CFLAGS) -O3 $^ -o $@ $(LIBPATHS) $(LIBS) + $(OBJCOPY) -O binary fast_dac_ut.elf fast_dac_ut.bin + +ADCDAC_UT_SRCS=\ +src/adcdac_ut.c \ +../src/fifo.c \ +src/stm32f4_dac.c \ +src/stm32f4_adc.c \ +src/sm1000_leds_switches.c \ +src/debugblinky.c \ +src/system_stm32f4xx.c \ +src/startup_stm32f4xx.s \ +src/init.c + +adcdac_ut.elf: $(ADCDAC_UT_SRCS) + $(CC) $(CFLAGS) -O0 $^ -o $@ $(LIBPATHS) $(LIBS) + $(OBJCOPY) -O binary adcdac_ut.elf adcdac_ut.bin + +DAC_PLAY_SRCS=\ +src/dac_play.c \ +../src/fifo.c \ +gdb_stdio.c \ +src/stm32f4_dac.c \ +src/debugblinky.c \ +src/system_stm32f4xx.c \ +src/startup_stm32f4xx.s \ +src/init.c + +dac_play.elf: $(DAC_PLAY_SRCS) + $(CC) $(CFLAGS) -O0 $^ -o $@ $(LIBPATHS) $(LIBS) + +ADC_REC_SRCS=\ +src/adc_rec.c \ +../src/fifo.c \ +gdb_stdio.c \ +src/stm32f4_adc.c \ +src/debugblinky.c \ +src/system_stm32f4xx.c \ +src/startup_stm32f4xx.s \ +src/init.c + +adc_rec.elf: $(ADC_REC_SRCS) + $(CC) $(CFLAGS) $^ -o $@ $(LIBPATHS) $(LIBS) + +ADC_SD_SRCS=\ +src/adc_sd.c \ +../src/fifo.c \ +gdb_stdio.c \ +src/stm32f4_adc.c \ +src/stm32f4_dac.c \ +src/debugblinky.c \ +src/system_stm32f4xx.c \ +src/startup_stm32f4xx.s \ +src/init.c + +adc_sd.elf: $(ADC_SD_SRCS) + $(CC) $(CFLAGS) $^ -o $@ $(LIBPATHS) $(LIBS) + +PWM_UT_SRCS=\ +gdb_stdio.c \ +src/stm32f4_pwm.c \ +src/system_stm32f4xx.c \ +src/startup_stm32f4xx.s \ +src/init.c + +pwm_ut.elf: $(PWM_UT_SRCS) + $(CC) $(CFLAGS) $^ -o $@ $(LIBPATHS) $(LIBS) + +POWER_UT_SRCS=\ +src/power_ut.c \ +gdb_stdio.c \ +../src/fifo.c \ +src/stm32f4_adc.c \ +src/stm32f4_dac.c \ +src/debugblinky.c \ +src/system_stm32f4xx.c \ +src/startup_stm32f4xx.s \ +src/init.c \ +src/stm32f4_machdep.c \ + +POWER_UT_SRCS += $(CODEC2_SRCS) + +power_ut.elf: $(POWER_UT_SRCS) + $(CC) $(CFLAGS) $^ -o $@ $(LIBPATHS) $(LIBS) + +USB_VCP=\ +usb_conf/usb_bsp.c \ +usb_conf/usbd_desc.c \ +usb_conf/usbd_usr.c \ +usb_lib/cdc/usbd_cdc_core.c \ +usb_lib/cdc/usbd_cdc_vcp.c \ +usb_lib/core/usbd_core.c \ +usb_lib/core/usbd_ioreq.c \ +usb_lib/core/usbd_req.c \ +usb_lib/otg/usb_core.c \ +usb_lib/otg/usb_dcd.c \ +usb_lib/otg/usb_dcd_int.c + +USB_VCP_UT=\ +src/usb_vcp_ut.c \ +src/stm32f4_usb_vcp.c \ +src/sm1000_leds_switches.c \ +src/system_stm32f4xx.c \ +src/startup_stm32f4xx.s \ +src/init.c + +USB_VCP_UT+=$(USB_VCP) + +CFLAGS += -Iusb_conf -Iusb_lib/cdc -Iusb_lib/core -Iusb_lib/otg + +usb_vcp_ut.elf: $(USB_VCP_UT) + $(CC) $(CFLAGS) $^ -o $@ $(LIBPATHS) $(LIBS) + +FDMDV_PROFILE_SRCS=\ +src/fdmdv_profile.c \ +gdb_stdio.c \ +src/system_stm32f4xx.c \ +src/startup_stm32f4xx.s \ +src/init.c \ +src/stm32f4_machdep.c + +FDMDV_PROFILE_SRCS += $(CODEC2_SRCS) + +fdmdv_profile.elf: $(FDMDV_PROFILE_SRCS) + $(CC) $(CFLAGS) -DPROFILE $^ -o $@ $(LIBPATHS) $(LIBS) + +SM1000_LEDS_SWITCHES_UT_SRCS=\ +src/sm1000_leds_switches_ut.c \ +src/sm1000_leds_switches.c \ +src/system_stm32f4xx.c \ +src/startup_stm32f4xx.s \ +src/init.c + +sm1000_leds_switches_ut.elf: $(SM1000_LEDS_SWITCHES_UT_SRCS) + $(CC) $(CFLAGS) $^ -o $@ $(LIBPATHS) $(LIBS) + +SM1000_SRCS=\ +src/sm1000_main.c \ +src/sm1000_leds_switches.c \ +../src/fifo.c \ +src/debugblinky.c \ +src/system_stm32f4xx.c \ +src/startup_stm32f4xx.s \ +src/init.c + +SM1000_SRCS += $(CODEC2_SRCS) + +src/stm32f4_dac.o: src/stm32f4_dac.c + $(CC) $(CFLAGS) $^ -c -o $@ + +src/stm32f4_adc.o: src/stm32f4_adc.c + $(CC) $(CFLAGS) $^ -c -o $@ + +sm1000.elf: $(SM1000_SRCS) src/stm32f4_dac.o src/stm32f4_adc.o + $(CC) $(CFLAGS) -O3 $^ -o $@ $(LIBPATHS) $(LIBS) + $(OBJCOPY) -O binary sm1000.elf sm1000.bin + +FREEDV_TX_PROFILE_SRCS=\ +src/freedv_tx_profile.c \ +src/stm32f4_machdep.c \ +gdb_stdio.c \ +src/system_stm32f4xx.c \ +src/startup_stm32f4xx.s \ +src/init.c + +FREEDV_TX_PROFILE_SRCS += $(CODEC2_SRCS) + +freedv_tx_profile.elf: $(FREEDV_TX_PROFILE_SRCS) + $(CC) $(CFLAGS) -DPROFILE $^ -o $@ $(LIBPATHS) $(LIBS) + +FREEDV_RX_PROFILE_SRCS=\ +src/freedv_rx_profile.c \ +src/stm32f4_machdep.c \ +gdb_stdio.c \ +src/system_stm32f4xx.c \ +src/startup_stm32f4xx.s \ +src/init.c + +FREEDV_RX_PROFILE_SRCS += $(CODEC2_SRCS) + +freedv_rx_profile.elf: $(FREEDV_RX_PROFILE_SRCS) + $(CC) $(CFLAGS) $^ -o $@ $(LIBPATHS) $(LIBS) + +FDMDV_DUMP_RT_SRCS=\ +src/fdmdv_dump_rt.c \ +src/sm1000_leds_switches.c \ +../src/fifo.c \ +src/debugblinky.c \ +gdb_stdio.c \ +src/system_stm32f4xx.c \ +src/startup_stm32f4xx.s \ +src/init.c + +FDMDV_DUMP_RT_SRCS += $(CODEC2_SRCS) + +fdmdv_dump_rt.elf: $(FDMDV_DUMP_RT_SRCS) src/stm32f4_dac.o src/stm32f4_adc.o + $(CC) $(CFLAGS) -O3 $^ -o $@ $(LIBPATHS) $(LIBS) + +# --------------------------------------------------------------------------- + +TUNER_UT_SRCS=\ +src/tuner_ut.c \ +gdb_stdio.c \ +../src/fifo.c \ +src/stm32f4_dac.c \ +src/iir_tuner.c \ +src/sm1000_leds_switches.c \ +src/debugblinky.c \ +src/system_stm32f4xx.c \ +src/startup_stm32f4xx.s \ +src/init.c \ +../src/fm.c + +# this needs to be compiled without the optimiser or ugly things happen +# would be nice to work out why as ISRs need to run fast + +src/stm32f4_adc_tuner.o: src/stm32f4_adc_tuner.c + $(CC) $(CFLAGS) $^ -c -o $@ + +tuner_ut.elf: $(TUNER_UT_SRCS) src/stm32f4_adc_tuner.o + $(CC) $(CFLAGS) -O3 $^ -o $@ $(LIBPATHS) $(LIBS) + $(OBJCOPY) -O binary tuner_ut.elf tuner_ut.bin + +# --------------------------------------------------------------------------- + +ADC_SFDR_UT_SRCS=\ +src/adc_sfdr_ut.c \ +gdb_stdio.c \ +../src/fifo.c \ +src/iir_tuner.c \ +src/sm1000_leds_switches.c \ +src/debugblinky.c \ +src/system_stm32f4xx.c \ +src/startup_stm32f4xx.s \ +src/init.c \ + +# this needs to be compiled without the optimiser or ugly things happen +# would be nice to work out why as ISRs need to run fast + +src/stm32f4_adc_tuner.o: src/stm32f4_adc_tuner.c + $(CC) $(CFLAGS) $^ -c -o $@ + +adc_sfdr_ut.elf: $(ADC_SFDR_UT_SRCS) src/stm32f4_adc_tuner.o + $(CC) $(CFLAGS) -O3 $^ -o $@ $(LIBPATHS) $(LIBS) + $(OBJCOPY) -O binary adc_sfdr_ut.elf adc_sfdr_ut.bin + +# --------------------------------------------------------------------------------- + +clean: + rm -f *.o + rm -f *.elf + rm -f libstm32f4.a + find $(PERIPHLIBDIR) -type f -name '*.o' -exec rm {} \; diff --git a/codec2/tags/0.4.1/stm32/README.txt b/codec2/tags/0.4.1/stm32/README.txt new file mode 100644 index 00000000..aa0572b4 --- /dev/null +++ b/codec2/tags/0.4.1/stm32/README.txt @@ -0,0 +1,147 @@ +README.txt +codec2 support for the stm32f4 +David Rowe August 2015 + +Quickstart +========== + +The Makefile generates several programs used in Codec 2 development on +the STM32F4, including sm1000.bin, the firmware for the SM1000. + +1. Find stm32f4_dsp_stdperiph_lib.zip on the InterWebs and place it in + codec2-dev/stm32/dl. The latest version is available from st.com, + however this may not compile cleanly. Here is how to obtain + version 1.4: + + $ cd codec-dev/stm32 + $ mkdir dl + $ cd dl + $ wget http://rowetel.com/downloads/codec2/smartmic/stm32f4_dsp_stdperiph_lib.zip + +2. Install the toolchain, on Ubuntu 14 this is: + + $ sudo apt-get install gcc-arm-none-eabi + +3. $ make (and cross your fingers) + +You may need to mess about with the Makefile to get it to work, +e.g. BINPATH, PERIPHLIBURL. A better build system is hopefully on +it's way. Contact me if you can help. + +Not quite so Quickstart +======================= + +Note: This section needs some editing. It deals with the running the +semi-hosting used for development system. + +gdb_stdio system +---------------- + +stutil contains a gdb server that talks to the target firmware. +stutil has been patched to allow "semihosting": stdio requests on the +target are re-directed to the host PC. So if you call printf on the +target, it appears on the host PC console. With printf/fread/fwrite +and gdb it makes developing on bare metal just like developing on any +command line gcc system. + +The root path for files accessed by the target is the path st-util is +run from. + +Getting Started +--------------- + +. Install arm toolchain binary + + $ cd ~ + $ wget https://launchpad.net/gcc-arm-embedded/4.7/4.7-2013-q1-update/+download/gcc-arm-none-eabi-4_7-2013q1-20130313-linux.tar.bz2 + $ tar xjf gcc-arm-none-eabi-4_7-2013q1-20130313-linux.tar.bz2 + +. Build codec2 unit test: + + $ cd codec2_dev/stm32 + In Makefile: edit the BINPATH variable for your toolchain location + edit PERIPHLIBVER for the current version of the peripheral + library, currently V1.3.0 + delete power_ut.elf target from the all: target + $ make + after make downloads the peripheral library, you will get a compile error: + #error "Please select first the target STM32F4xx device used in your application (in stm32f4xx.h file)" + edit STM32F4xx_DSP_StdPeriph_Lib_V1.3.0/Libraries/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h + and at the top of that file, uncomment the appropriate line for your target + processor. + $ make + +. Build stlink: + + $ cd ~ + $ git clone https://github.com/shenki/stlink.git + $ cd stlink + ~/stlink$ sudo apt-get install libusb-1.0-0-dev libelf-dev automake + ~/stlink$ ./autogen.sh + ~/stlink$ ./configure + ~/stlink$ make + +. Place a copy of hts1a.raw in the stlink directory and start st-util: + + ~/stlink$ cp ~/codec2-dev/raw/hts1a.raw stm_in.raw + ~/stlink$ sudo ./st-util -f /home/david/codec2-dev/stm32/stm32f4_codec2.elf + +. In _another_ console start gdb: + + $ ~/codec2-dev/stm32$ ~/gcc-arm-none-eabi-4_7-2013q1/bin/arm-none-eabi-gdb stm32f4_codec2.elf + + (gdb) tar ext :4242 + + (gdb) load + `/home/david/codec2-dev/stm32/fft_test.elf' has changed; re-reading symbols. + Loading section .isr_vector, size 0x188 lma 0x8000000 + Loading section .text, size 0x1a4b4 lma 0x8000188 + Loading section .data, size 0x28f0 lma 0x801a63c + Start address 0x800a885, load size 118572 + Transfer rate: 13 KB/sec, 10779 bytes/write. + +. Power cycle Discovery. + +. Stop st-util using ctrl-C, then restart st-util + +. Back to gdb: + + (gdb) tar ext :4242 + A program is being debugged already. Kill it? (y or n) y + Remote connection closed + (gdb) tar ext :4242 + Remote debugging using :4242 + Reset_Handler () at lib/startup_stm32f4xx.s:69 + 69 movs r1, #0 + + (gdb) c + Continuing. + +. gdb will prints various debug messages, and the codec output file + will be written to ~/stlink. + + ~/stlink$ play -r 8000 -s -2 stm_out.raw + +Process +------- + +1. Profiling macros, grep on TIMER_xxxx + +2. Enable DUMP variable in Makefile to dump files, note profiling + times will be corrupted by this due to latency in talking to Host + +3. Compare outputs using octave/diff_codec. Example: + + octave:> diff_codec("~/stlink/ref/hts1a_out_1300.raw", "~/stlink/hts1a_out_1300.raw","~/stlink/stm32f4", "~/stlink/ref/stm32f4") + +Gotcha +------ + +Using printf rather than gdb_stdio_printf, regular stdio functions are +stubbed out so will link, just nothing will happen. + +TODO +---- + + + check if "CFLAGS: -mlittle-endian -mthumb -mthumb-interwork" needed + + double check if _fini hack is OK (src/init.c) diff --git a/codec2/tags/0.4.1/stm32/inc/debugblinky.h b/codec2/tags/0.4.1/stm32/inc/debugblinky.h new file mode 100644 index 00000000..0561272c --- /dev/null +++ b/codec2/tags/0.4.1/stm32/inc/debugblinky.h @@ -0,0 +1,33 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: debugblinky.h + AUTHOR......: David Rowe + DATE CREATED: 12 August 2014 + + Configures GPIO pins used for debug blinkies + +\*---------------------------------------------------------------------------*/ + +/* + 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 . +*/ + +#ifndef __DEBUGBLINKY__ +#define __DEBUGBLINKY__ + +void init_debug_blinky(void); + +#endif diff --git a/codec2/tags/0.4.1/stm32/inc/gdb_stdio.h b/codec2/tags/0.4.1/stm32/inc/gdb_stdio.h new file mode 100644 index 00000000..eafabca4 --- /dev/null +++ b/codec2/tags/0.4.1/stm32/inc/gdb_stdio.h @@ -0,0 +1,47 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: gdb_stdio.h + AUTHOR......: David Rowe + DATE CREATED: April 23 2013 + + Some stdio I/O functions that perform I/O on the host using gdb. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2013 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 . +*/ + +#ifndef __GDB_STDIO__ +#define __GDB_STDIO__ + +#include +#include + +void gdb_stdio_fprintf(FILE *file, const char *format, ...); +void gdb_stdio_printf(const char *format, ...); +FILE *gdb_stdio_fopen(char file_name[], char mode[]); +void gdb_stdio_fclose(FILE *file); +int gdb_stdio_fwrite(void *ptr, int size, int nmemb, FILE *file); +int gdb_stdio_fread(void *ptr, int size, int nmemb, FILE *file); + +#define printf gdb_stdio_printf +#define fopen gdb_stdio_fopen +#define fclose gdb_stdio_fclose +#define fread gdb_stdio_fread +#define fwrite gdb_stdio_fwrite + +#endif diff --git a/codec2/tags/0.4.1/stm32/inc/iir_duc.h b/codec2/tags/0.4.1/stm32/inc/iir_duc.h new file mode 100644 index 00000000..b20b0b5e --- /dev/null +++ b/codec2/tags/0.4.1/stm32/inc/iir_duc.h @@ -0,0 +1,37 @@ + /*---------------------------------------------------------------------------*\ + + FILE........: iir_duc.h + AUTHOR......: Brady O'Brien + DATE CREATED: 6 Mar 2015 + + Interapolator/Filter for IF upconversion + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2015 Brady O'Brien + + 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 . +*/ + +#ifndef __IIR_DUC_H +#define __IIR_DUC_H +#include "comp.h" + +void iir_upconv(float modin[],unsigned short dac_out[]); +void iir_upconv_fixp(int modin[], unsigned short dac_out[]); +void upconv_48c_80r(COMP comp_8[],int real_80[],int count); +void upconv_8c_80r(COMP comp_8[],float real_80[],int count); + +#endif diff --git a/codec2/tags/0.4.1/stm32/inc/iir_tuner.h b/codec2/tags/0.4.1/stm32/inc/iir_tuner.h new file mode 100644 index 00000000..7788a8d8 --- /dev/null +++ b/codec2/tags/0.4.1/stm32/inc/iir_tuner.h @@ -0,0 +1,36 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: iir_tuner.h + AUTHOR......: David Rowe + DATE CREATED: 20 Feb 2015 + + Header file for IIR tuner function. + +\*---------------------------------------------------------------------------*/ + +/* + 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 . +*/ + +#ifndef __IIR_TUNER__ +#define __IIR_TUNER__ + +#define IIR_TUNER_DEC_50_10_FILT_MEM 100 + +void iir_tuner(float dec_50[], unsigned short adc_buf[]); +void iir_tuner_dec_50_to_10(float dec_10[], float dec_50[], int n); + +#endif diff --git a/codec2/tags/0.4.1/stm32/inc/sm1000_leds_switches.h b/codec2/tags/0.4.1/stm32/inc/sm1000_leds_switches.h new file mode 100644 index 00000000..b98f74df --- /dev/null +++ b/codec2/tags/0.4.1/stm32/inc/sm1000_leds_switches.h @@ -0,0 +1,46 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: sm1000_leds_switches.h + AUTHOR......: David Rowe + DATE CREATED: 18 July 2014 + + Functions for controlling LEDs and reading switches on SM1000. + +\*---------------------------------------------------------------------------*/ + +/* + 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 . +*/ + +#ifndef __LEDS_SWITCHES__ +#define __LEDS_SWITCHES__ + +void sm1000_leds_switches_init(void); + +void led_pwr(int state); +void led_ptt(int state); +void led_rt(int state); +void led_err(int state); +void not_cptt(int state); + +int switch_ptt(void); +int switch_select(void); +int switch_back(void); +int ext_ptt(void); + +void ColorfulRingOfDeath(int code); + +#endif diff --git a/codec2/tags/0.4.1/stm32/inc/stm32f4_adc.h b/codec2/tags/0.4.1/stm32/inc/stm32f4_adc.h new file mode 100644 index 00000000..d819fa72 --- /dev/null +++ b/codec2/tags/0.4.1/stm32/inc/stm32f4_adc.h @@ -0,0 +1,37 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: stm32f4_adc.h + AUTHOR......: David Rowe + DATE CREATED: 30 May 2014 + + Two channel FIFO buffered ADC driver module for STM32F4. + +\*---------------------------------------------------------------------------*/ + +/* + 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 . +*/ + +#ifndef __STM32F4_ADC__ +#define __STM32F4_ADC__ + +#define ADC_BUF_SZ 320 + +void adc_open(int fifo_sz); +int adc1_read(short buf[], int n); /* ADC1 Pin PA1 */ +int adc2_read(short buf[], int n); /* ADC2 Pin PA2 */ + +#endif diff --git a/codec2/tags/0.4.1/stm32/inc/stm32f4_adc_tuner.h b/codec2/tags/0.4.1/stm32/inc/stm32f4_adc_tuner.h new file mode 100644 index 00000000..6c7c7559 --- /dev/null +++ b/codec2/tags/0.4.1/stm32/inc/stm32f4_adc_tuner.h @@ -0,0 +1,40 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: stm32f4_adc_tuner.h + AUTHOR......: David Rowe + DATE CREATED: 19 Feb 2015 + + Single channel ADC driver module for STM32F4 that samples pin PA1 at + 2 MHz and down converts to 50 kHz, with "tuning" centred at 500 kHz. + +\*---------------------------------------------------------------------------*/ + +/* + 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 . +*/ + +#ifndef __STM32F4_ADC_TUNER__ +#define __STM32F4_ADC_TUNER__ + +#define ADC_TUNER_M 55 /* decimation rate */ +#define ADC_TUNER_N 160 +#define ADC_TUNER_BUF_SZ (ADC_TUNER_M*ADC_TUNER_N) + +void adc_open(int fifo_sz); +int adc1_read(short buf[], int n); /* ADC1 Pin PA1 */ +void adc_set_tuner_en(short flag); /* disable tuner to get raw ADC samples written to fifo */ + +#endif diff --git a/codec2/tags/0.4.1/stm32/inc/stm32f4_dac.h b/codec2/tags/0.4.1/stm32/inc/stm32f4_dac.h new file mode 100644 index 00000000..d0b82592 --- /dev/null +++ b/codec2/tags/0.4.1/stm32/inc/stm32f4_dac.h @@ -0,0 +1,37 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: stm32f4_dac.h + AUTHOR......: David Rowe + DATE CREATED: 1 June 2013 + + Two channel FIFO buffered DAC driver module for STM32F4. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2013 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 . +*/ + +#ifndef __STM32F4_DAC__ +#define __STM32F4_DAC__ + +#define DAC_BUF_SZ 320 + +void dac_open(int fifo_sz); +int dac1_write(short buf[], int n); /* DAC1 pin PA4 */ +int dac2_write(short buf[], int n); /* DAC2 pin PA5 */ + +#endif diff --git a/codec2/tags/0.4.1/stm32/inc/stm32f4_dacduc.h b/codec2/tags/0.4.1/stm32/inc/stm32f4_dacduc.h new file mode 100644 index 00000000..6a1ba20c --- /dev/null +++ b/codec2/tags/0.4.1/stm32/inc/stm32f4_dacduc.h @@ -0,0 +1,42 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: stm32f4_dac.h + AUTHOR......: David Rowe + DATE CREATED: 1 June 2013 + + Two channel FIFO buffered DAC driver module for STM32F4. DAC1 is fixed at + Fs=2Mhz + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2013 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 . +*/ + +#ifndef __STM32F4_DAC__ +#define __STM32F4_DAC__ + +#define DUC_N 160 +#define DUC_M 25 +#define DUC_48N 96 //This is 3/5th DUC_N +#define DAC_DUC_BUF_SZ DUC_M*DUC_N +#define DAC_BUF_SZ 2048 + +void fast_dac_open(int dac1_fifo_size,int dac2_fifo_size); +int dac1_write(short buf[], int n); /* DAC1 pin PA4 */ +int dac2_write(short buf[], int n); /* DAC2 pin PA5 */ + +#endif diff --git a/codec2/tags/0.4.1/stm32/inc/stm32f4_usb_vcp.h b/codec2/tags/0.4.1/stm32/inc/stm32f4_usb_vcp.h new file mode 100644 index 00000000..384f3f0b --- /dev/null +++ b/codec2/tags/0.4.1/stm32/inc/stm32f4_usb_vcp.h @@ -0,0 +1,23 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: stm32f4_usb_vcp.h + AUTHOR......: David Rowe + DATE CREATED: 4 Sep 2014 + + USB Virtual COM Port (VCP) module. + +\*---------------------------------------------------------------------------*/ + +#ifndef __STM32F4_USB_VCP__ +#define __STM32F4_USB_VCP__ + +#include + +void usb_vcp_init(void); + +int VCP_get_char(uint8_t *buf); +int VCP_get_string(uint8_t *buf); +void VCP_put_char(uint8_t buf); +void VCP_send_str(uint8_t* buf); + +#endif diff --git a/codec2/tags/0.4.1/stm32/inc/stm32f4xx_conf.h b/codec2/tags/0.4.1/stm32/inc/stm32f4xx_conf.h new file mode 100644 index 00000000..a791166d --- /dev/null +++ b/codec2/tags/0.4.1/stm32/inc/stm32f4xx_conf.h @@ -0,0 +1,94 @@ +/** + ****************************************************************************** + * @file stm32f4xx_conf.h + * @author MCD Application Team + * @version V1.0.0 + * @date 19-September-2011 + * @brief Library configuration file. + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_CONF_H +#define __STM32F4xx_CONF_H + +#if defined (HSE_VALUE) +/* Redefine the HSE value; it's equal to 8 MHz on the STM32F4-DISCOVERY Kit */ + #undef HSE_VALUE + #define HSE_VALUE ((uint32_t)8000000) +#endif /* HSE_VALUE */ + +/* Includes ------------------------------------------------------------------*/ +/* Uncomment the line below to enable peripheral header file inclusion */ +#include "stm32f4xx_adc.h" +#include "stm32f4xx_can.h" +#include "stm32f4xx_crc.h" +#include "stm32f4xx_cryp.h" +#include "stm32f4xx_dac.h" +#include "stm32f4xx_dbgmcu.h" +#include "stm32f4xx_dcmi.h" +#include "stm32f4xx_dma.h" +#include "stm32f4xx_exti.h" +#include "stm32f4xx_flash.h" +#include "stm32f4xx_fsmc.h" +#include "stm32f4xx_hash.h" +#include "stm32f4xx_gpio.h" +#include "stm32f4xx_i2c.h" +#include "stm32f4xx_iwdg.h" +#include "stm32f4xx_pwr.h" +#include "stm32f4xx_rcc.h" +#include "stm32f4xx_rng.h" +#include "stm32f4xx_rtc.h" +#include "stm32f4xx_sdio.h" +#include "stm32f4xx_spi.h" +#include "stm32f4xx_syscfg.h" +#include "stm32f4xx_tim.h" +#include "stm32f4xx_usart.h" +#include "stm32f4xx_wwdg.h" +#include "misc.h" /* High level functions for NVIC and SysTick (add-on to CMSIS functions) */ + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ + +/* If an external clock source is used, then the value of the following define + should be set to the value of the external clock source, else, if no external + clock is used, keep this define commented */ +/*#define I2S_EXTERNAL_CLOCK_VAL 12288000 */ /* Value of the external clock in Hz */ + + +/* Uncomment the line below to expanse the "assert_param" macro in the + Standard Peripheral Library drivers code */ +/* #define USE_FULL_ASSERT 1 */ + +/* Exported macro ------------------------------------------------------------*/ +#ifdef USE_FULL_ASSERT + +/** + * @brief The assert_param macro is used for function's parameters check. + * @param expr: If expr is false, it calls assert_failed function + * which reports the name of the source file and the source + * line number of the call that failed. + * If expr is true, it returns no value. + * @retval None + */ + #define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__)) +/* Exported functions ------------------------------------------------------- */ + void assert_failed(uint8_t* file, uint32_t line); +#else + #define assert_param(expr) ((void)0) +#endif /* USE_FULL_ASSERT */ + +#endif /* __STM32F4xx_CONF_H */ + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/codec2/tags/0.4.1/stm32/src/adc_rec.c b/codec2/tags/0.4.1/stm32/src/adc_rec.c new file mode 100644 index 00000000..c31c899d --- /dev/null +++ b/codec2/tags/0.4.1/stm32/src/adc_rec.c @@ -0,0 +1,76 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: adc_rec.c + AUTHOR......: David Rowe + DATE CREATED: 30 May 2014 + + Records a 16 kHz sample rate raw file from one of the ADC channels, + which are connected to pins PA1 (ADC1) and PA2 (ADC2). + + Note the semi-hosting system isn't fast enough to transfer 2 16 kHz + streams at once. + + ~/stlink$ sudo ./st-util -f ~/codec2-dev/stm32/adc_rec.elf + ~/codec2-dev/stm32$ ~/gcc-arm-none-eabi-4_7-2013q1/bin/arm-none-eabi-gdb adc_rec.elf + + (when finished) + $ play -r 16000 -s -2 ~/stlink/adc.raw + + adc1 -> "from radio" + adc2 -> "mic amp" + +\*---------------------------------------------------------------------------*/ + +/* + 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 . +*/ + +#include +#include "stm32f4_adc.h" +#include "gdb_stdio.h" +#include "stm32f4xx_gpio.h" + +#define REC_TIME_SECS 10 +#define N (ADC_BUF_SZ*6) +#define FS 16000 + +extern int adc_overflow1; +extern int adc_overflow2; + +int main(void){ + short buf[N]; + FILE *fadc; + int i, bufs; + + fadc = fopen("adc.raw", "wb"); + if (fadc == NULL) { + printf("Error opening input file: adc.raw\n\nTerminating....\n"); + exit(1); + } + bufs = FS*REC_TIME_SECS/N; + + printf("Starting!\n"); + adc_open(4*N); + + for(i=0; i. +*/ + +#include +#include +#include "stm32f4_adc.h" +#include "stm32f4_dac.h" +#include "gdb_stdio.h" + +#define REC_TIME_SECS 10 +#define N (ADC_BUF_SZ*4) +#define FS 16000 + +static float calc_sd(short x[], int n) { + float sum, mean, sum_diff, sd; + int i; + + sum = 0.0; + for(i=0; i. +*/ + +#include +#include +#include "gdb_stdio.h" +#include "stm32f4_dac.h" +#include "stm32f4_adc_tuner.h" +#include "iir_tuner.h" +#include "sm1000_leds_switches.h" +#include "../src/codec2_fm.h" +#include "stm32f4xx.h" + +#define BUFS 10 +#define FS 2E6 +#define N 1024 + +extern int adc_overflow1; + +int main(void) { + unsigned short unsigned_buf[N]; + short buf[N]; + int sam; + int i, j, fifo_sz; + FILE *fadc; + + fadc = fopen("adc.raw", "wb"); + if (fadc == NULL) { + printf("Error opening output file: adc.raw\n\nTerminating....\n"); + exit(1); + } + fifo_sz = ADC_TUNER_BUF_SZ; + printf("Starting! bufs: %d %d\n", BUFS, fifo_sz); + + adc_open(fifo_sz); + adc_set_tuner_en(0); /* dump raw samples, no tuner */ + + sm1000_leds_switches_init(); + + for (i=0; iODR |= (1 << 3); + fwrite(buf, sizeof(short), N, fadc); + GPIOE->ODR &= ~(1 << 3); + } + fclose(fadc); + + printf("Finished!\n"); +} + diff --git a/codec2/tags/0.4.1/stm32/src/adcdac_ut.c b/codec2/tags/0.4.1/stm32/src/adcdac_ut.c new file mode 100644 index 00000000..423f45aa --- /dev/null +++ b/codec2/tags/0.4.1/stm32/src/adcdac_ut.c @@ -0,0 +1,70 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: adcdac_ut.c + AUTHOR......: David Rowe + DATE CREATED: May 31 201310 Aug 2014 + + Echoes ADC2 input (mic) to DAC2 output (speaker) on SM1000. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2013 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 . +*/ + +#include +#include "stm32f4_dac.h" +#include "stm32f4_adc.h" +#include "sm1000_leds_switches.h" + +#define SINE_SAMPLES 32 + + +/* 32 sample sine wave which at Fs=16kHz will be 500Hz. Note samples + are 16 bit 2's complement, the DAC driver convertsto 12 bit + unsigned. */ + +short aSine[] = { + -16, 6384, 12528, 18192, 23200, 27232, 30256, 32128, + 32752, 32128, 30256, 27232, 23152, 18192, 12528, 6384, + -16, -6416, -12560, -18224, -23184, -27264, -30288, -32160, + -32768, -32160, -30288, -27264, -23184, -18224, -12560, -6416 +}; + +int main(void) { + short buf[SINE_SAMPLES]; + int i; + + dac_open(4*DAC_BUF_SZ); + adc_open(4*ADC_BUF_SZ); + sm1000_leds_switches_init(); + + while (1) { + + /* keep DAC FIFOs topped up */ + + while(adc2_read(buf, SINE_SAMPLES) == -1); + + if (!switch_select()) { + for(i=0; i. +*/ + +#include +#include +#include +#include + +#include "stm32f4xx_conf.h" +#include "stm32f4xx.h" +#include "gdb_stdio.h" +#include "codec2.h" +#include "dump.h" +#include "sine.h" +#include "machdep.h" + +#ifdef __EMBEDDED__ +#define printf gdb_stdio_printf +#define fopen gdb_stdio_fopen +#define fclose gdb_stdio_fclose +#define fread gdb_stdio_fread +#define fwrite gdb_stdio_fwrite +#endif + +static void c2demo(int mode, char inputfile[], char outputfile[]) +{ + struct CODEC2 *codec2; + short *inbuf, *outbuf; + unsigned char *bits; + int nsam, nbit; + FILE *fin, *fout; + int frame; + PROFILE_VAR(enc_start, dec_start); + + codec2 = codec2_create(mode); + nsam = codec2_samples_per_frame(codec2); + outbuf = (short*)malloc(nsam*sizeof(short)); + inbuf = (short*)malloc(nsam*sizeof(short)); + nbit = codec2_bits_per_frame(codec2); + bits = (unsigned char*)malloc(nbit*sizeof(char)); + + fin = fopen(inputfile, "rb"); + if (fin == NULL) { + printf("Error opening input file: %s\n\nTerminating....\n",inputfile); + exit(1); + } + + fout = fopen(outputfile, "wb"); + if (fout == NULL) { + printf("Error opening output file: %s\n\nTerminating....\n",outputfile); + exit(1); + } + + #ifdef DUMP + dump_on("stm32f4"); + #endif + frame = 0; + + while (fread(inbuf, sizeof(short), nsam, fin) == nsam) { + PROFILE_SAMPLE(enc_start); + codec2_encode(codec2, bits, inbuf); + PROFILE_SAMPLE_AND_LOG(dec_start, enc_start, " enc"); + codec2_decode(codec2, outbuf, bits); + PROFILE_SAMPLE_AND_LOG2(dec_start, " dec"); + PROFILE_SAMPLE_AND_LOG2(enc_start, " enc & dec"); + fwrite((char*)outbuf, sizeof(short), nsam, fout); + printf("frame: %d\n", ++frame); + machdep_profile_print_logged_samples(); + } + + #ifdef DUMP + dump_off("sm32f4"); + #endif + + fclose(fin); + fclose(fout); + free(inbuf); + free(outbuf); + free(bits); + codec2_destroy(codec2); +} + +#define SPEED_TEST_SAMPLES 24000 + +static void c2speedtest(int mode, char inputfile[]) +{ + struct CODEC2 *codec2; + short *inbuf, *outbuf, *pinbuf; + unsigned char *bits; + int nsam, nbit, nframes; + FILE *fin; + int f, nread; + + codec2 = codec2_create(mode); + nsam = codec2_samples_per_frame(codec2); + nframes = SPEED_TEST_SAMPLES/nsam; + outbuf = (short*)malloc(nsam*sizeof(short)); + inbuf = (short*)malloc(SPEED_TEST_SAMPLES*sizeof(short)); + nbit = codec2_bits_per_frame(codec2); + bits = (unsigned char*)malloc(nbit*sizeof(char)); + + fin = fopen(inputfile, "rb"); + if (fin == NULL) { + printf("Error opening input file: %s\nTerminating....\n",inputfile); + exit(1); + } + + nread = fread(inbuf, sizeof(short), SPEED_TEST_SAMPLES, fin); + if (nread != SPEED_TEST_SAMPLES) { + printf("error reading %s, %d samples reqd, %d read\n", + inputfile, SPEED_TEST_SAMPLES, nread); + } + fclose(fin); + + pinbuf = inbuf; + for(f=0; fODR = (1 << 13); + codec2_encode(codec2, bits, pinbuf); + pinbuf += nsam; + GPIOD->ODR &= ~(1 << 13); + codec2_decode(codec2, outbuf, bits); + } + + free(inbuf); + free(outbuf); + free(bits); + codec2_destroy(codec2); +} + +void gpio_init() { + RCC->AHB1ENR |= RCC_AHB1ENR_GPIODEN; // enable the clock to GPIOD + GPIOD->MODER = (1 << 26); // set pin 13 to be general + // purpose output +} + +int main(int argc, char *argv[]) { + gpio_init(); + machdep_profile_init (); + + printf("Starting c2demo\n"); + + /* File I/O test for profiling or (with #define DUMP) + dumping states for optimisation and tiuning */ + + c2demo(CODEC2_MODE_1600, "stm_in.raw", "stm_out.raw"); + + printf("Starting c2 speed test\n"); + + /* Another test of execution speed. Look at PD13 with a + oscilliscope. On time is enc, off is dec */ + + c2speedtest(CODEC2_MODE_1600, "stm_in.raw"); + + printf("Finished\n"); + + return 0; +} + diff --git a/codec2/tags/0.4.1/stm32/src/dac_it.c b/codec2/tags/0.4.1/stm32/src/dac_it.c new file mode 100644 index 00000000..2b614fc4 --- /dev/null +++ b/codec2/tags/0.4.1/stm32/src/dac_it.c @@ -0,0 +1,205 @@ +/** + ****************************************************************************** + * @file DMA/DMA_FLASHToRAM/stm32f4xx_it.c + * @author MCD Application Team + * @version V1.1.0 + * @date 18-January-2013 + * @brief Main Interrupt Service Routines. + * This file provides template for all exceptions handler and + * peripherals interrupt service routine. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2013 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ +int interrupts; + + +/* Includes ------------------------------------------------------------------*/ +#include "dac_it.h" + +/** @addtogroup STM32F4xx_StdPeriph_Examples + * @{ + */ + +/** @addtogroup DMA_FLASHToRAM + * @{ + */ + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ + +/******************************************************************************/ +/* Cortex-M4 Processor Exceptions Handlers */ +/******************************************************************************/ + +/** + * @brief This function handles NMI exception. + * @param None + * @retval None + */ +void NMI_Handler(void) +{ +} + +/** + * @brief This function handles Hard Fault exception. + * @param None + * @retval None + */ +void HardFault_Handler(void) +{ + /* Go to infinite loop when Hard Fault exception occurs */ + while (1) + { + } +} + +/** + * @brief This function handles Memory Manage exception. + * @param None + * @retval None + */ +void MemManage_Handler(void) +{ + /* Go to infinite loop when Memory Manage exception occurs */ + while (1) + { + } +} + +/** + * @brief This function handles Bus Fault exception. + * @param None + * @retval None + */ +void BusFault_Handler(void) +{ + /* Go to infinite loop when Bus Fault exception occurs */ + while (1) + { + } +} + +/** + * @brief This function handles Usage Fault exception. + * @param None + * @retval None + */ +void UsageFault_Handler(void) +{ + /* Go to infinite loop when Usage Fault exception occurs */ + while (1) + { + } +} + +/** + * @brief This function handles SVCall exception. + * @param None + * @retval None + */ +void SVC_Handler(void) +{ +} + +/** + * @brief This function handles Debug Monitor exception. + * @param None + * @retval None + */ +void DebugMon_Handler(void) +{ +} + +/** + * @brief This function handles PendSVC exception. + * @param None + * @retval None + */ +void PendSV_Handler(void) +{ +} + +/** + * @brief This function handles SysTick Handler. + * @param None + * @retval None + */ +void SysTick_Handler(void) +{ +} + +/******************************************************************************/ +/* STM32F4xx Peripherals Interrupt Handlers */ +/* Add here the Interrupt Handler for the used peripheral(s) (PPP), for the */ +/* available peripheral interrupt handler's name please refer to the startup */ +/* file (startup_stm32f40xx.s/startup_stm32f427x.s). */ +/******************************************************************************/ + +/** + * @brief This function handles DMA Stream interrupt request. + * @param None + * @retval None + */ +void DMA1_Stream6_IRQHandler(void) +{ + + /* Transfer half empty interrupt */ + + if(DMA_GetITStatus(DMA1_Stream6, DMA_IT_HTIF6) != RESET)) + { + /* fill first half from fifo */ + + fifo_read(DMA1_Stream6_fifo, dac_buf, DAC_BUF_SZ/2); + + /* Clear DMA Stream Transfer Complete interrupt pending bit */ + + DMA_ClearITPendingBit(DMA1_Stream6, DMA_IT_HTIF6); + + interrupts++; + } + + /* Transfer complete interrupt */ + + if(DMA_GetITStatus(DMA1_Stream6, DMA_IT_TCIF6) != RESET)) + { + /* fill second half from fifo */ + + fifo_read(DMA1_Stream6_fifo, &dac_buf[DAC_BUF_SZ/2], DAC_BUF_SZ/2); + + /* Clear DMA Stream Transfer Complete interrupt pending bit */ + + DMA_ClearITPendingBit(DMA1_Stream6, DMA_IT_TCIF6); + + interrupts++; + } +} + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/codec2/tags/0.4.1/stm32/src/dac_play.c b/codec2/tags/0.4.1/stm32/src/dac_play.c new file mode 100644 index 00000000..96777ebb --- /dev/null +++ b/codec2/tags/0.4.1/stm32/src/dac_play.c @@ -0,0 +1,63 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: dac_play.c + AUTHOR......: David Rowe + DATE CREATED: 1 June 2013 + + Plays a 16 kHz sample rate raw file to the STM32F4 DACs. DAC1 is + connected to pin PA4, DAC2 is connected to pin PA5. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2013 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 . +*/ + +#include +#include "stm32f4_dac.h" +#include "gdb_stdio.h" + +#define N (5*DAC_BUF_SZ) + +int main(void) { + short buf[N]; + FILE *fplay; + + dac_open(2*N); + + while(1) { + fplay = fopen("stm_in.raw", "rb"); + if (fplay == NULL) { + printf("Error opening input file: stm_in.raw\n\nTerminating....\n"); + exit(1); + } + + printf("Starting!\n"); + + while(fread(buf, sizeof(short), N, fplay) == N) { + while(dac1_write(buf, N) == -1); + while(dac2_write(buf, N) == -1); + } + + printf("Finished!\n"); + fclose(fplay); + } + + /* let FIFO empty */ + + while(1); +} + diff --git a/codec2/tags/0.4.1/stm32/src/dac_ut.c b/codec2/tags/0.4.1/stm32/src/dac_ut.c new file mode 100644 index 00000000..bfe9def1 --- /dev/null +++ b/codec2/tags/0.4.1/stm32/src/dac_ut.c @@ -0,0 +1,59 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: dac_ut.c + AUTHOR......: David Rowe + DATE CREATED: May 31 2013 + + Plays a 500 Hz sine wave sampled at 16 kHz out of PA5 on a Discovery board, + or the speaker output of the SM1000. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2013 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 . +*/ + +#include +#include "stm32f4_dac.h" + +#define SINE_SAMPLES 32 + + +/* 32 sample sine wave which at Fs=16kHz will be 500Hz. Note samples + are 16 bit 2's complement, the DAC driver convertsto 12 bit + unsigned. */ + +short aSine[] = { + -16, 6384, 12528, 18192, 23200, 27232, 30256, 32128, + 32752, 32128, 30256, 27232, 23152, 18192, 12528, 6384, + -16, -6416, -12560, -18224, -23184, -27264, -30288, -32160, + -32768, -32160, -30288, -27264, -23184, -18224, -12560, -6416 +}; + +int main(void) { + + dac_open(4*DAC_BUF_SZ); + + while (1) { + + /* keep DAC FIFOs topped up */ + + dac1_write((short*)aSine, SINE_SAMPLES); + dac2_write((short*)aSine, SINE_SAMPLES); + } + +} + diff --git a/codec2/tags/0.4.1/stm32/src/debugblinky.c b/codec2/tags/0.4.1/stm32/src/debugblinky.c new file mode 100644 index 00000000..7e38fd17 --- /dev/null +++ b/codec2/tags/0.4.1/stm32/src/debugblinky.c @@ -0,0 +1,45 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: debugblinky.c + AUTHOR......: David Rowe + DATE CREATED: 12 August 2014 + + Configures GPIO pins used for debug blinkies + +\*---------------------------------------------------------------------------*/ + +/* + 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 . +*/ + +#include "stm32f4xx.h" + +void init_debug_blinky(void) { + GPIO_InitTypeDef GPIO_InitStruct; + + /* PE0-3 used to indicate activity */ + + RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE); + + GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3; + GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT; + GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; + GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL; + GPIO_Init(GPIOE, &GPIO_InitStruct); + +} + diff --git a/codec2/tags/0.4.1/stm32/src/fast_dac_ut.c b/codec2/tags/0.4.1/stm32/src/fast_dac_ut.c new file mode 100644 index 00000000..faa8865c --- /dev/null +++ b/codec2/tags/0.4.1/stm32/src/fast_dac_ut.c @@ -0,0 +1,115 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: dac_ut.c + AUTHOR......: David Rowe + DATE CREATED: May 31 2013 + + Plays a 500 Hz sine wave sampled at 16 kHz out of PA5 on a Discovery board, + or the speaker output of the SM1000. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2013 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 . +*/ + +#include +#include +#include "stm32f4_dacduc.h" +#include "iir_duc.h" +#include "stm32f4xx.h" +#include +#include +#include "gdb_stdio.h" +#include "comp.h" +//#include "gmsk_test_dat_m4.h" +#define SINE_SAMPLES 32 + + +/* 32 sample sine wave which at Fs=16kHz will be 500Hz. Note samples + are 16 bit 2's complement, the DAC driver convertsto 12 bit + unsigned. */ + +short aWave[] = {4095,0,4095,0,4095,0,4095,0,4095,0,4095,0,4095,0,4095,0,4095,0,4095,0,4095,0,4095,0,4095,0,4095,0,4095,0,4095,0, + 4095,0,4095,0,4095,0,4095,0,4095,0,4095,0,4095,0,4095,0,4095,0,4095,0,4095,0,4095,0,4095,0,4095,0,4095,0,4095,0,}; + +short aSine[] = {1600, 3200, 1601, 0, 1600, 3200, 1601, 0, 1600, 3200, 1601, 0, 1600, 3200, 1601, 0, 1600, 3200, 1601, 0, 1600, 3200, 1601, 0, 1600, 3200, 1600, 0, 1600, 3200, 1601, 0 +}; + +//Sine at Fs/4 +float f4sine[] = {1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0, +1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0, +1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0, +1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,-1,0,}; + +//Intermediate 80k real before tx +int tx_imm[DUC_N]; + +//Complex input to chain +COMP comp_in[DUC_N/10]; + +unsigned short outbuf[DAC_DUC_BUF_SZ]; + +void setup_timer() +{ + RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); + + TIM_TimeBaseInitTypeDef timerInitStructure; + timerInitStructure.TIM_Prescaler = 84; + timerInitStructure.TIM_CounterMode = TIM_CounterMode_Up; + timerInitStructure.TIM_Period = 0x8FFFFFFF; + timerInitStructure.TIM_ClockDivision = 0; + timerInitStructure.TIM_RepetitionCounter = 0; + TIM_TimeBaseInit(TIM2, &timerInitStructure); + TIM_Cmd(TIM2, ENABLE); +} + +int main(void) { + int tstart,tup,tend,cyc,i; + + memset((void*)outbuf,0,sizeof(short)*DAC_DUC_BUF_SZ); + setup_timer(); + fast_dac_open(2*DAC_DUC_BUF_SZ,2*DAC_BUF_SZ); + tstart=tend=tup=cyc=0; + //Initalize complex input with signal at zero + for(i=0;iGMSK_TEST_LEN) + // cyc=0; + if(cyc%10000==0){ + printf("48c80r takes %d uSecs\n",tup-tstart); + printf("iir upconvert takes %d uSecs\n",tend-tup); + } + tstart = TIM_GetCounter(TIM2); + + upconv_48c_80r(comp_in,tx_imm,1); + + tup = TIM_GetCounter(TIM2); + + iir_upconv_fixp(tx_imm,outbuf); + + tend = TIM_GetCounter(TIM2); + + //Sit and spin until we can get more samples into the dac + while(dac1_write((short*)outbuf,DAC_DUC_BUF_SZ)<0); + } + +} + diff --git a/codec2/tags/0.4.1/stm32/src/fdmdv_dump_rt.c b/codec2/tags/0.4.1/stm32/src/fdmdv_dump_rt.c new file mode 100644 index 00000000..00cdccad --- /dev/null +++ b/codec2/tags/0.4.1/stm32/src/fdmdv_dump_rt.c @@ -0,0 +1,154 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: fdmdv_dump_rt.c + AUTHOR......: David Rowe + DATE CREATED: 9 Sep 2014 + + Runs the fdmdv demod in real time for a few seconds then dumps some + modem info to a text file for plotting in Octave. Way to verify the + "from radio" SM1000 hardware, ADC, and demod on the SM1000. + + Requires FreeDV signal to be sent to CN6 of SM1000. + + Octave: + + load scatter.txt + l=length(scatter) + plot(scatter(:,1:2:l),scatter(:,2:2:l),'+') + +\*---------------------------------------------------------------------------*/ + +/* + 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 . +*/ + +#include +#include +#include +#include +#include + +#include +#include "stm32f4_adc.h" +#include "stm32f4_dac.h" +#include "freedv_api.h" +#include "codec2_fdmdv.h" +#include "sm1000_leds_switches.h" +#include "gdb_stdio.h" + +#ifdef __EMBEDDED__ +#define printf gdb_stdio_printf +#define fprintf gdb_stdio_fprintf +#define fopen gdb_stdio_fopen +#define fclose gdb_stdio_fclose +#define fread gdb_stdio_fread +#define fwrite gdb_stdio_fwrite +#endif + +#define FREEDV_NSAMPLES_16K (2*FREEDV_NSAMPLES) +#define START_LOG_FRAMES 100 +#define LOG_FRAMES 10 +#define STOP_LOG_FRAMES (START_LOG_FRAMES+LOG_FRAMES) +#define NC 16 + +int main(void) { + struct freedv *f; + short adc16k[FDMDV_OS_TAPS_16K+FREEDV_NSAMPLES_16K]; + short dac16k[FREEDV_NSAMPLES_16K]; + short adc8k[FREEDV_NSAMPLES]; + short dac8k[FDMDV_OS_TAPS_8K+FREEDV_NSAMPLES]; + + int nin, nout, i, j, frames, lines; + + COMP *symb, *psymb; + + /* init all the drivers for various peripherals */ + + sm1000_leds_switches_init(); + dac_open(4*DAC_BUF_SZ); + adc_open(4*ADC_BUF_SZ); + f = freedv_open(FREEDV_MODE_1600); + + /* clear filter memories */ + + for(i=0; itotal_bit_errors = 0; + + if (adc1_read(&adc16k[FDMDV_OS_TAPS_16K], 2*nin) == 0) { + GPIOE->ODR = (1 << 3); + fdmdv_16_to_8_short(adc8k, &adc16k[FDMDV_OS_TAPS_16K], nin); + nout = freedv_rx(f, &dac8k[FDMDV_OS_TAPS_8K], adc8k); + fdmdv_8_to_16_short(dac16k, &dac8k[FDMDV_OS_TAPS_8K], nout); + dac2_write(dac16k, 2*nout); + led_ptt(0); led_rt(f->fdmdv_stats.sync); led_err(f->total_bit_errors); + GPIOE->ODR &= ~(1 << 3); + +#define TMP1 +#ifdef TMP1 + if (f->fdmdv_stats.sync) + frames++; + if ((frames >= START_LOG_FRAMES) && (lines < LOG_FRAMES)) { + for(i=0; i<=f->fdmdv_stats.Nc; i++) + psymb[i] = f->fdmdv_stats.rx_symbols[i]; + psymb += (f->fdmdv_stats.Nc+1); + lines++; + } + + if (frames >= STOP_LOG_FRAMES) { + FILE *ft = fopen("scatter.txt", "wt"); + assert(ft != NULL); + printf("Writing scatter file....\n"); + for(j=0; jfdmdv_stats.Nc; i++) { + fprintf(ft, "%f\t%f\t", + (double)symb[j*(f->fdmdv_stats.Nc+1)+i].real, + (double)symb[j*(f->fdmdv_stats.Nc+1)+i].imag); + printf("line: %d\n", j); + } + fprintf(ft, "\n"); + } + fclose(ft); + printf("SNR = %3.2f dB\nfinished!\n", (double)f->fdmdv_stats.snr_est); + while(1); + } +#endif + } + + } /* while(1) ... */ +} + diff --git a/codec2/tags/0.4.1/stm32/src/fdmdv_profile.c b/codec2/tags/0.4.1/stm32/src/fdmdv_profile.c new file mode 100644 index 00000000..05b8d623 --- /dev/null +++ b/codec2/tags/0.4.1/stm32/src/fdmdv_profile.c @@ -0,0 +1,149 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: fdmdv_profile.c + AUTHOR......: David Rowe + DATE CREATED: 18 July 2014 + + Profiling FDMDV modem operation on the STM32F4. + +\*---------------------------------------------------------------------------*/ + +/* + 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 . +*/ + +#include +#include +#include +#include +#include + +#include "stm32f4xx_conf.h" +#include "stm32f4xx.h" +#include "gdb_stdio.h" +#include "codec2_fdmdv.h" +#include "dump.h" +#include "sine.h" +#include "machdep.h" + +#ifdef __EMBEDDED__ +#define printf gdb_stdio_printf +#define fopen gdb_stdio_fopen +#define fclose gdb_stdio_fclose +#define fread gdb_stdio_fread +#define fwrite gdb_stdio_fwrite +#endif + +#define TEST_FRAMES 25 +#define CHANNEL_BUF_SIZE (10*FDMDV_NOM_SAMPLES_PER_FRAME) + +static int channel_count = 0; +static COMP channel[CHANNEL_BUF_SIZE]; + +static void channel_in(COMP tx_fdm[], int nout) { + int i; + + /* add M tx samples to end of buffer */ + + assert((channel_count + nout) < CHANNEL_BUF_SIZE); + for(i=0; i Refer + * \link arm_fft_bin_example_f32.c \endlink + * + */ + + +/** \example arm_fft_bin_example_f32.c + */ + + +#include "arm_math.h" +#include "gdb_stdio.h" +#include "machdep.h" +#include "kiss_fft.h" + +#define TEST_LENGTH_SAMPLES 1024 + +/* ------------------------------------------------------------------- +* External Input and Output buffer Declarations for FFT Bin Example +* ------------------------------------------------------------------- */ +extern float32_t testInput_f32_10khz[TEST_LENGTH_SAMPLES]; +static float32_t testOutput[TEST_LENGTH_SAMPLES/2]; +static float32_t kiss_complex_out[TEST_LENGTH_SAMPLES]; + +/* ------------------------------------------------------------------ +* Global variables for FFT Bin Example +* ------------------------------------------------------------------- */ +uint32_t fftSize = TEST_LENGTH_SAMPLES/2; +uint32_t ifftFlag = 0; +uint32_t doBitReverse = 1; + +/* Reference index at which max energy of bin ocuurs */ +uint32_t refIndex = 213, testIndex = 0; + +/* ---------------------------------------------------------------------- +* Max magnitude FFT Bin test +* ------------------------------------------------------------------- */ + +void SystemInit(void); + +int main(void) +{ + + arm_status status; + arm_cfft_radix2_instance_f32 S; + float32_t maxValue; + unsigned int fft_start, kiss_fft_start; + kiss_fft_cfg fft_fwd_cfg; + + SystemInit(); + machdep_profile_init(); + fft_fwd_cfg = kiss_fft_alloc(fftSize, 0, NULL, NULL); + kiss_fft_start = machdep_profile_sample(); + kiss_fft(fft_fwd_cfg, (kiss_fft_cpx *)testInput_f32_10khz, + (kiss_fft_cpx *)kiss_complex_out); + machdep_profile_sample_and_log(kiss_fft_start, " kiss_fft"); + + status = ARM_MATH_SUCCESS; + + /* Initialize the CFFT/CIFFT module */ + status = arm_cfft_radix2_init_f32(&S, fftSize, ifftFlag, doBitReverse); + + /* Process the data through the CFFT/CIFFT module */ + fft_start = machdep_profile_sample(); + arm_cfft_radix2_f32(&S, testInput_f32_10khz); + machdep_profile_sample_and_log(fft_start, " fft"); + machdep_profile_print_logged_samples(); + + /* Process the data through the Complex Magnitude Module for + calculating the magnitude at each bin */ + arm_cmplx_mag_f32(testInput_f32_10khz, testOutput,fftSize); + + /* Calculates maxValue and returns corresponding BIN value */ + arm_max_f32(testOutput, fftSize, &maxValue, &testIndex); + + if(testIndex != refIndex) + { + status = ARM_MATH_TEST_FAILURE; + } + + /* ---------------------------------------------------------------------- + ** Loop here if the signals fail the PASS check. + ** This denotes a test failure + ** ------------------------------------------------------------------- */ + + if( status != ARM_MATH_SUCCESS) + { + while(1); + } + + while(1); /* main function does not return */ + + return 0; +} + + /** \endlink */ + + +/* + * Dummy function to avoid compiler error + */ +void _init() { } + + + diff --git a/codec2/tags/0.4.1/stm32/src/freedv_rx_profile.c b/codec2/tags/0.4.1/stm32/src/freedv_rx_profile.c new file mode 100644 index 00000000..65b43ae1 --- /dev/null +++ b/codec2/tags/0.4.1/stm32/src/freedv_rx_profile.c @@ -0,0 +1,136 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: freedv_rx_profile.c + AUTHOR......: David Rowe + DATE CREATED: 13 August 2014 + + Profiling freedv_rx() operation on the STM32F4. + +\*---------------------------------------------------------------------------*/ + +/* + 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 . +*/ + +#define PROFILE + +#include +#include +#include +#include +#include + +#include "stm32f4xx_conf.h" +#include "stm32f4xx.h" +#include "gdb_stdio.h" +#include "freedv_api.h" +#include "machdep.h" +#include "codec2_fdmdv.h" + +#ifdef __EMBEDDED__ +#define printf gdb_stdio_printf +#define fopen gdb_stdio_fopen +#define fclose gdb_stdio_fclose +#define fread gdb_stdio_fread +#define fwrite gdb_stdio_fwrite +#define fprintf gdb_stdio_fprintf +#endif + +#define FREEDV_NSAMPLES_16K (2*FREEDV_NSAMPLES) + +int main(int argc, char *argv[]) { + struct freedv *f; + FILE *fin, *fout, *ftotal; + int frame, nin_16k, nin, i, nout = 0; + int n_samples, n_samples_16k; + int sync; + float snr_est; + + PROFILE_VAR(fdmdv_16_to_8_start, freedv_rx_start, fdmdv_8_to_16_start); + + machdep_profile_init(); + + f = freedv_open(FREEDV_MODE_1600); + n_samples = freedv_get_n_speech_samples(f); + n_samples_16k = 2*n_samples; + + short adc16k[FDMDV_OS_TAPS_16K+n_samples_16k]; + short dac16k[n_samples_16k]; + short adc8k[n_samples]; + short dac8k[FDMDV_OS_TAPS_8K+n_samples]; + + // Receive --------------------------------------------------------------------- + + frame = 0; + + fin = fopen("mod_16k.raw", "rb"); + if (fin == NULL) { + printf("Error opening input file\n"); + exit(1); + } + + fout = fopen("speechout_16k.raw", "wb"); + if (fout == NULL) { + printf("Error opening output file\n"); + exit(1); + } + + ftotal = fopen("total.txt", "wt"); + assert(ftotal != NULL); + + /* clear filter memories */ + + for(i=0; i. +*/ + +#include +#include +#include +#include + +#include "stm32f4xx_conf.h" +#include "stm32f4xx.h" +#include "gdb_stdio.h" +#include "freedv_api.h" +#include "machdep.h" + +#ifdef __EMBEDDED__ +#define printf gdb_stdio_printf +#define fopen gdb_stdio_fopen +#define fclose gdb_stdio_fclose +#define fread gdb_stdio_fread +#define fwrite gdb_stdio_fwrite +#endif + +int main(int argc, char *argv[]) { + struct freedv *f; + FILE *fin, *fout; + int frame, n_samples; + PROFILE_VAR(freedv_start); + + machdep_profile_init(); + + f = freedv_open(FREEDV_MODE_1600); + n_samples = freedv_get_n_speech_samples(f); + short inbuf[n_samples], outbuf[n_samples]; + + // Transmit --------------------------------------------------------------------- + + fin = fopen("stm_in.raw", "rb"); + if (fin == NULL) { + printf("Error opening input file\n"); + exit(1); + } + + fout = fopen("mod.raw", "wb"); + if (fout == NULL) { + printf("Error opening output file\n"); + exit(1); + } + + frame = 0; + + while (fread(inbuf, sizeof(short), n_samples, fin) == n_samples) { + PROFILE_SAMPLE(freedv_start); + freedv_tx(f, outbuf, inbuf); + PROFILE_SAMPLE_AND_LOG2(freedv_start, " freedv_tx"); + + fwrite(outbuf, sizeof(short), n_samples, fout); + printf("frame: %d\n", ++frame); + machdep_profile_print_logged_samples(); + } + + fclose(fin); + fclose(fout); + + return 0; +} + diff --git a/codec2/tags/0.4.1/stm32/src/gdb_stdio.c b/codec2/tags/0.4.1/stm32/src/gdb_stdio.c new file mode 100644 index 00000000..942d7bae --- /dev/null +++ b/codec2/tags/0.4.1/stm32/src/gdb_stdio.c @@ -0,0 +1,125 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: gdb_stdio.c + AUTHOR......: David Rowe + DATE CREATED: April 23 2013 + + Some stdio I/O functions that perform I/O on the host using gdb. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2013 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 . +*/ + +#include +#include +#include +#include "gdb_stdio.h" + +#define MAX_STR 2048 + +/* command codes we use to signal host */ + +#define GDB_STDIO_PRINTF 1 +#define GDB_STDIO_FOPEN 2 +#define GDB_STDIO_FCLOSE 3 +#define GDB_STDIO_FWRITE 4 +#define GDB_STDIO_FREAD 5 +#define GDB_STDIO_FPRINTF 6 + +/* globals we use to communicate with host */ + +volatile int gdb_stdio_func = 0; +volatile int gdb_stdio_ret = 0; +volatile char *gdb_stdio_pstr1; +volatile char *gdb_stdio_pstr2; +volatile int gdb_stdio_strlen1; +volatile int gdb_stdio_strlen2; +volatile FILE *gdb_stdio_file; +volatile void *gdb_stdio_ptr; +volatile int gdb_stdio_size; +volatile int gdb_stdio_nmem; + +void gdb_stdio_fprintf(FILE *file, const char *format, ...) { + va_list arg; + char str[MAX_STR]; + + va_start(arg, format); + vsnprintf(str, MAX_STR, format, arg); + va_end(arg); + gdb_stdio_file = file; + gdb_stdio_pstr1 = str; + gdb_stdio_strlen1 = strlen(str); + + gdb_stdio_func = GDB_STDIO_FPRINTF; + while(gdb_stdio_func); +} + +void gdb_stdio_printf(const char *format, ...) { + va_list arg; + char str[MAX_STR]; + + va_start(arg, format); + vsnprintf(str, MAX_STR, format, arg); + va_end(arg); + gdb_stdio_pstr1 = str; + gdb_stdio_strlen1 = strlen(str); + + gdb_stdio_func = GDB_STDIO_PRINTF; + while(gdb_stdio_func); +} + +FILE *gdb_stdio_fopen(char file_name[], char mode[]) { + gdb_stdio_pstr1 = file_name; + gdb_stdio_pstr2 = mode; + gdb_stdio_strlen1 = strlen(file_name); + gdb_stdio_strlen2 = strlen(mode); + + gdb_stdio_func = GDB_STDIO_FOPEN; + while(gdb_stdio_func); + return (FILE*)gdb_stdio_ret; +} + +void gdb_stdio_fclose(FILE *file) { + gdb_stdio_file = file; + + gdb_stdio_func = GDB_STDIO_FCLOSE; + while(gdb_stdio_func); +} + +int gdb_stdio_fwrite(void *ptr, int size, int nmem, FILE *file) { + gdb_stdio_ptr = ptr; + gdb_stdio_size = size; + gdb_stdio_nmem = nmem; + gdb_stdio_file = file; + + gdb_stdio_func = GDB_STDIO_FWRITE; + while(gdb_stdio_func); + return gdb_stdio_ret; +} + +int gdb_stdio_fread(void *ptr, int size, int nmem, FILE *file) { + gdb_stdio_ptr = ptr; + gdb_stdio_size = size; + gdb_stdio_nmem = nmem; + gdb_stdio_file = file; + + gdb_stdio_func = GDB_STDIO_FREAD; + while(gdb_stdio_func); + return gdb_stdio_ret; +} + diff --git a/codec2/tags/0.4.1/stm32/src/iir_duc.c b/codec2/tags/0.4.1/stm32/src/iir_duc.c new file mode 100644 index 00000000..47262f72 --- /dev/null +++ b/codec2/tags/0.4.1/stm32/src/iir_duc.c @@ -0,0 +1,371 @@ + /*---------------------------------------------------------------------------*\ + + FILE........: iir_duc.c + AUTHOR......: Brady O'Brien + DATE CREATED: 6 Mar 2015 + + Interapolator/Filter for IF upconversion + + Unit testing: + + ~/codec2-dev/stm32$ gcc -D__UNITTEST__ -Iinc src/iir_duc.c -o iir_duc -lm -Wall -I../src/ + ~/codec2-dev/stm32$ ./iir_duc + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2015 Brady O'Brien + + 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 . +*/ + +#include "stm32f4_dacduc.h" +#include "iir_duc.h" + +#define BETA1 0.99002 // B1MUL/(2**B1SHFT) +#define B1MUL 32441 +#define B1SMUL -38328 +#define B1SHFT 15 // 10 bits gives us plenty of headroom between 31 bits of int and 14 bits of ADC +#define B2MUL 24593 // This actually matches BETA2 exactly with the supplied BETA1 +#define B2SHFT 15 // 10 is also the lowest we can go without beta1=1 +#define BETA2 (1.0 - (1.0-BETA1)*DUC_M) // B2MUL/(2**B2SHFT) +#define IN_SCALE 2.0 //Input scaling factor. Should be as large as the amplitude of the incoming samples +#define DAC_SCALE 4096 //Maximum output to DAC +#define DAC_SCALE_2 2040 + + +//IIR and FIR filter states. Global for go fast. +float f_1,f_2,f; +int n_1,n_2,n,m_1,m_2,m; + +/* + Upconvert and bandpass filter a chunk of spectrum from Fs/M to Fs. We're going for 700khz here. + modin needs to be DUC_N long and dac_out needs to be DUC_N*DUC_M long. This +*/ + +void iir_upconv(float modin[], unsigned short dac_out[]){ + int i,j,k; + int m; + k=0; + //Iterate through input samples and apply pre-eq FIR, interpolate, and apply BPF IIR + for(i=0;i>B1SHFT) - ((B1MUL*n_2)>>B1SHFT); //Apply one cycle of IIR. This feeds the fir-ed sample into the output filter + n_2 = n_1; + n_1 = n; + dac_out[k]=(unsigned short)(n+DAC_SCALE_2); + k++; + //now do the rest of the filtering. Because we're zero-stuffing we can neglect the sample from the fir filter. + for(j=1;j>B1SHFT) - ((B1MUL*n_2)>>B1SHFT); + n_2 = n_1; + n_1 = n; + dac_out[k]=(unsigned short)((n)+DAC_SCALE_2); + } + } +} + +/* + Upconvert and bandpass filter a chunk of spectrum from Fs/M to Fs. We're going for 700khz here. + modin needs to be DUC_N long and dac_out needs to be DUC_N*DUC_M long. This +*/ + +void iir_upconv_fixp(int modin[], unsigned short dac_out[]){ + int i,j,k; + int l; + k=0; + //Iterate through input samples and apply pre-eq FIR, interpolate, and apply BPF IIR + for(i=0;i>4; + m = l+((m_2*B2MUL)>>B2SHFT); + m_2 = m_1; + m_1 = l; //Scale fir output and convert to fixed. + //m = (int)((f/(IN_SCALE))*DAC_SCALE_2); //Scale fir output and convert to fixed + n = m + ((B1SMUL*n_1)>>B1SHFT) - ((B1MUL*n_2)>>B1SHFT); //Apply one cycle of IIR. This feeds the fir-ed sample into the output filter + n_2 = n_1; + n_1 = n; + dac_out[k]=(unsigned short)(n+DAC_SCALE_2); + k++; + //now do the rest of the filtering. Because we're zero-stuffing we can neglect the sample from the fir filter. + for(j=1;j>B1SHFT) - ((B1MUL*n_2)>>B1SHFT); + n_2 = n_1; + n_1 = n; + dac_out[k]=(unsigned short)((n)+DAC_SCALE_2); + } + } +} + +#define F48C80R_LEN 25 +#define F48C80R_MUL 4096 +static int js3 = 0; //Index for downsampling +static int js5 = 0; //Index for upsampling +static unsigned int w48c80r; //Phase for real to comp conversion +static int ptr_48c80r; //Pointer in fir delay lines +static int fir_48c80r[]; //Fir filter coeffs +static int fir_48c80r_re[F48C80R_LEN*2]; //Real delay line. Can probably be made much smaller. +static int fir_48c80r_im[F48C80R_LEN*2]; //Imag delay line. Can probably be made much smaller. +static int * sel_48c80r[2] = {fir_48c80r_re,fir_48c80r_im}; //Selector used to optimize out branches in inner loops + +/* + Interpolate and shift from 48k complex to 80k real, centered on Fs/4. + comp_8 - Input samples - 8Kc complex - must be DUC_48N*count long + upout - Output samples - must be DUC_N*count long + count - how many chunks of samples must be processed +*/ + +void upconv_48c_80r(COMP comp_48[],int real_80[],int count){ + int i,j,k; //Loop counters + int ret; //Temp vars + int nr,ni; //Temp vars + int inidx = 0; //Input index + int outidx = 0; + int ncs_48c80r[3]; + for(i=0;i=F48C80R_LEN) + ptr_48c80r-=F48C80R_LEN; + } + if(js3==0){ //Downsample by 3 + ni=0; + /*This loop computes the FIR filter. It only computes from either the re or the im delay line, + depending on comp->re phase It also skips all 'zeros' in the delay line */ + for(k=js5;k>14; //Scale back result; should probably just return int + outidx++; + js3=3; + w48c80r+=3; + } + ptr_48c80r++; + js3--; + js5--; + } + } +} + +#define F8C80R_LEN 42 //Number of taps in the 8C80R filters +#define F8C80R_MUL 4096 +static int int1r,int2r,int3r,int4r,int5r,cmb1r,cmb2r,cmb3r,cmb4r,cmb5r; //States for re combs and integrators +static int int1i,int2i,int3i,int4i,int5i,cmb1i,cmb2i,cmb3i,cmb4i,cmb5i; //States for im combs and integrators +static int ptr_8c80r; //circular buffer ptr fir_8c80r_re +static int w8c80r = 0; //Omega for upconversion + +static int fir_8c80r_cic_i[]; //FIR Coeffs +static int fir_8c80r_re[F8C80R_LEN*2]; //FIR delay line for re +static int fir_8c80r_im[F8C80R_LEN*2]; //FIR delay line for im + +/* + Interpolate and shift from 8k complex to 80k real, centered on Fs/4. + comp_8 - Input samples - 8Kc complex - must be (DUC_N/10)*count long + upout - Output samples - must be DUC_N*count long + count - how many chunks of samples must be processed +*/ + +void upconv_8c_80r(COMP comp_8[],float real_80[],int count){ + int i,j,k; //Loop indices + float ret; //Temporary variables + int nr,ni; + int cmbr,cmbi,cmbrr,cmbii,rein,imin; //More temporaries + int inidx = 0; //Index of input + int outidx = 0; //Index of output + for(i=0;i>14; + ni+=(fir_8c80r_cic_i[k]*fir_8c80r_im[ptr_8c80r+k])>>14; + } + ptr_8c80r++; //Spin the dealy line index + if(ptr_8c80r>=F8C80R_LEN) + ptr_8c80r=0; + rein=nr; + imin=ni; + cmbr = rein - cmb1r; cmb1r = rein; //Comb 1 real + cmbrr = cmbr - cmb2r; cmb2r = cmbr; //Comb 2 real + cmbr = cmbrr - cmb3r; cmb3r = cmbrr; //Comb 3 real + cmbrr = cmbr - cmb4r; cmb4r = cmbr; //Comb 4 real + cmbr = cmbrr - cmb5r; cmb5r = cmbrr; + + cmbi = imin - cmb1i; cmb1i = imin; //Comb 1 im + cmbii = cmbi - cmb2i; cmb2i = cmbi; //Comb 2 im + cmbi = cmbii - cmb3i; cmb3i = cmbii; //Comb 3 im + cmbii = cmbi - cmb4i; cmb4i = cmbi; //Comb 4 im + cmbi = cmbii - cmb5i; cmb5i = cmbii; //Comb 4 im + //Do first cycle of integration + int1r = cmbr + int1r; //Integrator stage 1 re + int2r = int1r + int2r; //Integrator stage 2 re + int3r = int2r + int3r; //Integrator stage 3 re + int4r = int3r + int4r; //Integrator stage 4 re + int5i = int4i + int5i; + + int1i = cmbi + int1i; //Integrator stage 1 im + int2i = int1i + int2i; //Integrator stage 2 im + int3i = int2i + int3i; //Integrator stage 3 im + int4i = int3i + int4i; //Integrator stage 4 im + int5r = int4r + int5r; + //Convert this complex into real and cancel out the gain from CIC + //This should probably spit out integers instead of going back to float + switch(w8c80r&0x3){ //Do comp->real conversion by hand + case 0:ret=(float)(-int5i>>7);break; + case 1:ret=(float)(int5r>>7);break; + case 2:ret=(float)(int5i>>7);break; + case 3:ret=(float)(-int5r>>7);break; + } + real_80[outidx] = ret/8192; //Divide by 4096 to cancel out gain + outidx++; + w8c80r++; //spin omega + //Next 4 stages of integration. Stage 1 can be ignored because of zero stuffing. + for(k=1;k<5;k++){ + int2r = int1r + int2r; //Integrator stage 2 re + int3r = int2r + int3r; //Integrator stage 3 re + int4r = int3r + int4r; //Integrator stage 4 re + int5r = int4r + int5r; + int2i = int1i + int2i; //Integrator stage 2 im + int3i = int2i + int3i; //Integrator stage 3 im + int4i = int3i + int4i; //Integrator stage 4 im + int5i = int4i + int5i; + switch(w8c80r&0x3){ //Do comp->real conversion by hand + case 0:ret=(float)(-int5i>>7);break; + case 1:ret=(float)(int5r>>7);break; + case 2:ret=(float)(int5i>>7);break; + case 3:ret=(float)(-int5r>>7);break; + } + real_80[outidx] = ret/8192; //Cancel out gain from all that. + outidx++; + w8c80r++; + } + } + } +} + +#ifdef __UNITTEST__ + +#include +#include +#include +#include + +#define FS 80000 +#define AMP_MAX 1 + +#define NOUT_BUFS 500 +#define NIN (NOUT_BUFS*DUC_N) +#define NOUT (NIN*DUC_M) + +void synth_line(float us[], float f, float amp, int n) { + float w, sam; + int i; + + w = 2*M_PI*f/(float)FS; + + for(i=0; i. +*/ + +#ifdef __UNITTEST__ + +#include +#include +#include + +#endif + +#include "stm32f4_adc_tuner.h" +#include "iir_tuner.h" + +/* Filter coefficients of IIR tuner (BETA1) and FIR equaliser (BETA2). + Note neat trick to relate BETA2 to BETA1 by the decimation rate */ + +#define BETA1 .9990234375 // B1MUL/(2**B1SHFT) +#define B1MUL 1023 +#define B1SMUL 1204 +#define B1SHFT 10 // 10 bits gives us plenty of headroom between 31 bits of int and 14 bits of ADC +#define B2MUL 979 // This actually matches BETA2 exactly with the supplied BETA1 +#define B2SHFT 10 // 10 is also the lowest we can go without beta1=1 +#define BETA2 (1.0 - (1.0-BETA1)*ADC_TUNER_M)// B2MUL/(2**B2SHFT) + +#define FIXED_IIR //Define this to compile a fixed point IIR filter + +/* filter states - we keep them global due to the need for speed */ + +#ifdef FIXED_IIR +int n_2, n_1, o_2, o_1; +#else +float y_2, y_1, z_2, z_1; +#endif + +/* + ADC -> signed conversion - IIR BPF - Decimate - FIR Equaliser -> FIFO +*/ + +void iir_tuner(float dec_50[], unsigned short adc_buf[]) { + int i, j, k; + float x, y, z; + int n, m, o; + + for(i=0, j=0; i>B1SHFT) - ((B1MUL*n_2)>>B1SHFT); + n_2 = n_1; + n_1 = n; + #else + x = (int)adc_buf[i] - 32768; + y = x - (BETA1*y_2); + y_2 = y_1; + y_1 = y; + #endif + } + + /* Equaliser FIR filter, notch at Fs/(4*ADC_TUNER_M) to smooth out + IIR BPF passband response */ + #ifdef FIXED_IIR + o = n + ((B2MUL*o_2)>>B2SHFT); + dec_50[j] = (float)o; + o_2 = o_1; + o_1 = n; + #else + z=y+BETA2*z_2; + dec_50[j] = z; + z_2 = z_1; + z_1 = y; + #endif + + } +} + + +/* BPF at 12.5 kHz +/- 2000 Hz, and decimate down to Fs = 10kHz */ + +static float fir_50_to_10[]; +void iir_tuner_dec_50_to_10(float dec_10[], float dec_50[], int n) { + int i,j,k; + float acc; + + for(i=0,k=0; i Fs=10kHz short ---------------------------------------------*/ + + for(i=0; i. +*/ + +#include +#include +#include +#include + +#include "stm32f4xx_conf.h" +#include "stm32f4xx.h" +#include "stm32f4_adc.h" +#include "stm32f4_dac.h" +#include "gdb_stdio.h" +#include "codec2.h" +#include "dump.h" +#include "sine.h" +#include "machdep.h" + +#ifdef __EMBEDDED__ +#define printf gdb_stdio_printf +#define fopen gdb_stdio_fopen +#define fclose gdb_stdio_fclose +#define fread gdb_stdio_fread +#define fwrite gdb_stdio_fwrite +#endif + +#define SPEED_TEST_SAMPLES 24000 + +/* modification of test used to measure codec2 execuation speed. We read/write ADC/DAC + but dont do anything with the samples, as they are at 16 kHz and codec needs 8 kHz. Just + trying to exercise everything to get a feel for power consumption */ + +static void c2speedtest(int mode, char inputfile[]) +{ + struct CODEC2 *codec2; + short *inbuf, *outbuf, *pinbuf, *dummy_buf; + unsigned char *bits; + int nsam, nbit, nframes; + FILE *fin; + int f, nread; + + codec2 = codec2_create(mode); + nsam = codec2_samples_per_frame(codec2); + nframes = SPEED_TEST_SAMPLES/nsam; + outbuf = (short*)malloc(nsam*sizeof(short)); + inbuf = (short*)malloc(SPEED_TEST_SAMPLES*sizeof(short)); + nbit = codec2_bits_per_frame(codec2); + bits = (unsigned char*)malloc(nbit*sizeof(char)); + dummy_buf = (short*)malloc(2*nsam*sizeof(short)); + + fin = fopen(inputfile, "rb"); + if (fin == NULL) { + printf("Error opening input file: %s\nTerminating....\n",inputfile); + exit(1); + } + + printf("reading samples ....\n"); + nread = fread(inbuf, sizeof(short), SPEED_TEST_SAMPLES, fin); + if (nread != SPEED_TEST_SAMPLES) { + printf("error reading %s, %d samples reqd, %d read\n", + inputfile, SPEED_TEST_SAMPLES, nread); + } + fclose(fin); + + pinbuf = inbuf; + for(f=0; fODR = (1 << 13); + codec2_encode(codec2, bits, pinbuf); + pinbuf += nsam; + GPIOD->ODR &= ~(1 << 13); + //printf("Codec 2 dec\n"); + codec2_decode(codec2, outbuf, bits); + + //printf("write to DAC\n"); + while(dac1_write(dummy_buf, nsam*2) == -1); /* runs at Fs = 16kHz */ + //printf("."); + } + + free(inbuf); + free(outbuf); + free(bits); + codec2_destroy(codec2); +} + +void gpio_init() { + RCC->AHB1ENR |= RCC_AHB1ENR_GPIODEN; // enable the clock to GPIOD + GPIOD->MODER = (1 << 26); // set pin 13 to be general + // purpose output +} + +int main(int argc, char *argv[]) { + SystemInit(); + gpio_init(); + machdep_profile_init (); + adc_open(4*DAC_BUF_SZ); + dac_open(4*DAC_BUF_SZ); + + printf("Starting power_ut\n"); + + c2speedtest(CODEC2_MODE_1600, "stm_in.raw"); + + printf("Finished\n"); + + return 0; +} + diff --git a/codec2/tags/0.4.1/stm32/src/sine.c b/codec2/tags/0.4.1/stm32/src/sine.c new file mode 100644 index 00000000..254a61ec --- /dev/null +++ b/codec2/tags/0.4.1/stm32/src/sine.c @@ -0,0 +1,648 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: sine.c + AUTHOR......: David Rowe + DATE CREATED: 19/8/2010 + + Sinusoidal analysis and synthesis functions. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 1990-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 . +*/ + +/*---------------------------------------------------------------------------*\ + + INCLUDES + +\*---------------------------------------------------------------------------*/ + +#include +#include +#include + +#include "defines.h" +#include "sine.h" +#include "kiss_fft.h" + +#define HPF_BETA 0.125 + +/*---------------------------------------------------------------------------*\ + + HEADERS + +\*---------------------------------------------------------------------------*/ + +void hs_pitch_refinement(MODEL *model, COMP Sw[], float pmin, float pmax, + float pstep); + +/*---------------------------------------------------------------------------*\ + + FUNCTIONS + +\*---------------------------------------------------------------------------*/ + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: make_analysis_window + AUTHOR......: David Rowe + DATE CREATED: 11/5/94 + + Init function that generates the time domain analysis window and it's DFT. + +\*---------------------------------------------------------------------------*/ + +void make_analysis_window(kiss_fft_cfg fft_fwd_cfg, float w[], COMP W[]) +{ + float m; + COMP wshift[FFT_ENC]; + COMP temp; + int i,j; + + /* + Generate Hamming window centered on M-sample pitch analysis window + + 0 M/2 M-1 + |-------------|-------------| + |-------|-------| + NW samples + + All our analysis/synthsis is centred on the M/2 sample. + */ + + m = 0.0; + for(i=0; iWo + 5; + pmin = TWO_PI/model->Wo - 5; + pstep = 1.0; + hs_pitch_refinement(model,Sw,pmin,pmax,pstep); + + /* Fine refinement */ + + pmax = TWO_PI/model->Wo + 1; + pmin = TWO_PI/model->Wo - 1; + pstep = 0.25; + hs_pitch_refinement(model,Sw,pmin,pmax,pstep); + + /* Limit range */ + + if (model->Wo < TWO_PI/P_MAX) + model->Wo = TWO_PI/P_MAX; + if (model->Wo > TWO_PI/P_MIN) + model->Wo = TWO_PI/P_MIN; + + model->L = floor(PI/model->Wo); +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: hs_pitch_refinement + AUTHOR......: David Rowe + DATE CREATED: 27/5/94 + + Harmonic sum pitch refinement function. + + pmin pitch search range minimum + pmax pitch search range maximum + step pitch search step size + model current pitch estimate in model.Wo + + model refined pitch estimate in model.Wo + +\*---------------------------------------------------------------------------*/ + +void hs_pitch_refinement(MODEL *model, COMP Sw[], float pmin, float pmax, float pstep) +{ + int m; /* loop variable */ + int b; /* bin for current harmonic centre */ + float E; /* energy for current pitch*/ + float Wo; /* current "test" fundamental freq. */ + float Wom; /* Wo that maximises E */ + float Em; /* mamimum energy */ + float r, one_on_r; /* number of rads/bin */ + float p; /* current pitch */ + + /* Initialisation */ + + model->L = PI/model->Wo; /* use initial pitch est. for L */ + Wom = model->Wo; + Em = 0.0; + r = TWO_PI/FFT_ENC; + one_on_r = 1.0/r; + + /* Determine harmonic sum for a range of Wo values */ + + for(p=pmin; p<=pmax; p+=pstep) { + E = 0.0; + Wo = TWO_PI/p; + + /* Sum harmonic magnitudes */ + for(m=1; m<=model->L; m++) { + b = (int)(m*Wo*one_on_r + 0.5); + E += Sw[b].real*Sw[b].real + Sw[b].imag*Sw[b].imag; + } + /* Compare to see if this is a maximum */ + + if (E > Em) { + Em = E; + Wom = Wo; + } + } + + model->Wo = Wom; +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: estimate_amplitudes + AUTHOR......: David Rowe + DATE CREATED: 27/5/94 + + Estimates the complex amplitudes of the harmonics. + +\*---------------------------------------------------------------------------*/ + +void estimate_amplitudes(MODEL *model, COMP Sw[], COMP W[], int est_phase) +{ + int i,m; /* loop variables */ + int am,bm; /* bounds of current harmonic */ + int b; /* DFT bin of centre of current harmonic */ + float den; /* denominator of amplitude expression */ + float r, one_on_r; /* number of rads/bin */ + int offset; + COMP Am; + + r = TWO_PI/FFT_ENC; + one_on_r = 1.0/r; + + for(m=1; m<=model->L; m++) { + den = 0.0; + am = (int)((m - 0.5)*model->Wo*one_on_r + 0.5); + bm = (int)((m + 0.5)*model->Wo*one_on_r + 0.5); + b = (int)(m*model->Wo/r + 0.5); + + /* Estimate ampltude of harmonic */ + + den = 0.0; + Am.real = Am.imag = 0.0; + offset = FFT_ENC/2 - (int)(m*model->Wo*one_on_r + 0.5); + for(i=am; iA[m] = sqrtf(den); + + if (est_phase) { + + /* Estimate phase of harmonic, this is expensive in CPU for + embedded devicesso we make it an option */ + + model->phi[m] = atan2(Sw[b].imag,Sw[b].real); + } + } +} + +/*---------------------------------------------------------------------------*\ + + est_voicing_mbe() + + Returns the error of the MBE cost function for a fiven F0. + + Note: I think a lot of the operations below can be simplified as + W[].imag = 0 and has been normalised such that den always equals 1. + +\*---------------------------------------------------------------------------*/ + +float est_voicing_mbe( + MODEL *model, + COMP Sw[], + COMP W[], + COMP Sw_[], /* DFT of all voiced synthesised signal */ + /* useful for debugging/dump file */ + COMP Ew[], /* DFT of error */ + float prev_Wo) +{ + int i,l,al,bl,m; /* loop variables */ + COMP Am; /* amplitude sample for this band */ + int offset; /* centers Hw[] about current harmonic */ + float den; /* denominator of Am expression */ + float error; /* accumulated error between original and synthesised */ + float Wo; + float sig, snr; + float elow, ehigh, eratio; + float sixty; + + sig = 1E-4; + for(l=1; l<=model->L/4; l++) { + sig += model->A[l]*model->A[l]; + } + for(i=0; iWo; + error = 1E-4; + + /* Just test across the harmonics in the first 1000 Hz (L/4) */ + + for(l=1; l<=model->L/4; l++) { + Am.real = 0.0; + Am.imag = 0.0; + den = 0.0; + al = ceil((l - 0.5)*Wo*FFT_ENC/TWO_PI); + bl = ceil((l + 0.5)*Wo*FFT_ENC/TWO_PI); + + /* Estimate amplitude of harmonic assuming harmonic is totally voiced */ + + offset = FFT_ENC/2 - l*Wo*FFT_ENC/TWO_PI + 0.5; + for(m=al; m V_THRESH) + model->voiced = 1; + else + model->voiced = 0; + + /* post processing, helps clean up some voicing errors ------------------*/ + + /* + Determine the ratio of low freqency to high frequency energy, + voiced speech tends to be dominated by low frequency energy, + unvoiced by high frequency. This measure can be used to + determine if we have made any gross errors. + */ + + elow = ehigh = 1E-4; + for(l=1; l<=model->L/2; l++) { + elow += model->A[l]*model->A[l]; + } + for(l=model->L/2; l<=model->L; l++) { + ehigh += model->A[l]*model->A[l]; + } + eratio = 10.0*log10f(elow/ehigh); + + /* Look for Type 1 errors, strongly V speech that has been + accidentally declared UV */ + + if (model->voiced == 0) + if (eratio > 10.0) + model->voiced = 1; + + /* Look for Type 2 errors, strongly UV speech that has been + accidentally declared V */ + + if (model->voiced == 1) { + if (eratio < -10.0) + model->voiced = 0; + + /* A common source of Type 2 errors is the pitch estimator + gives a low (50Hz) estimate for UV speech, which gives a + good match with noise due to the close harmoonic spacing. + These errors are much more common than people with 50Hz3 + pitch, so we have just a small eratio threshold. */ + + sixty = 60.0*TWO_PI/FS; + if ((eratio < -4.0) && (model->Wo <= sixty)) + model->voiced = 0; + } + //printf(" v: %d snr: %f eratio: %3.2f %f\n",model->voiced,snr,eratio,dF0); + + return snr; +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: make_synthesis_window + AUTHOR......: David Rowe + DATE CREATED: 11/5/94 + + Init function that generates the trapezoidal (Parzen) sythesis window. + +\*---------------------------------------------------------------------------*/ + +void make_synthesis_window(float Pn[]) +{ + int i; + float win; + + /* Generate Parzen window in time domain */ + + win = 0.0; + for(i=0; i 10ms sound poor. The effect can also + be seen when synthesising test signals like single sine waves, some + sort of amplitude modulation at the frame rate. + + Another possibility is using a larger FFT size (1024 or 2048). + */ + +#define FFT_SYNTHESIS +#ifdef FFT_SYNTHESIS + /* Now set up frequency domain synthesised speech */ + for(l=1; l<=model->L; l++) { + //for(l=model->L/2; l<=model->L; l++) { + //for(l=1; l<=model->L/4; l++) { + b = (int)(l*model->Wo*FFT_DEC/TWO_PI + 0.5); + if (b > ((FFT_DEC/2)-1)) { + b = (FFT_DEC/2)-1; + } + Sw_[b].real = model->A[l]*cosf(model->phi[l]); + Sw_[b].imag = model->A[l]*sinf(model->phi[l]); + Sw_[FFT_DEC-b].real = Sw_[b].real; + Sw_[FFT_DEC-b].imag = -Sw_[b].imag; + } + + /* Perform inverse DFT */ + + kiss_fft(fft_inv_cfg, (kiss_fft_cpx *)Sw_, (kiss_fft_cpx *)sw_); +#else + /* + Direct time domain synthesis using the cos() function. Works + well at 10ms and 20ms frames rates. Note synthesis window is + still used to handle overlap-add between adjacent frames. This + could be simplified as we don't need to synthesise where Pn[] + is zero. + */ + for(l=1; l<=model->L; l++) { + for(i=0,j=-N+1; iA[l]*cos(j*model->Wo*l + model->phi[l]); + } + for(i=N-1,j=0; i<2*N; i++,j++) + Sw_[j].real += 2.0*model->A[l]*cos(j*model->Wo*l + model->phi[l]); + } +#endif + + /* Overlap add to previous samples */ + + for(i=0; i. +*/ + +#ifndef __SINE__ +#define __SINE__ + +#include "defines.h" +#include "comp.h" +#include "kiss_fft.h" + +void make_analysis_window(kiss_fft_cfg fft_fwd_cfg, float w[], COMP W[]); +float hpf(float x, float states[]); +void dft_speech(kiss_fft_cfg fft_fwd_cfg, COMP Sw[], float Sn[], float w[]); +void two_stage_pitch_refinement(MODEL *model, COMP Sw[]); +void estimate_amplitudes(MODEL *model, COMP Sw[], COMP W[], int est_phase); +float est_voicing_mbe(MODEL *model, COMP Sw[], COMP W[], COMP Sw_[],COMP Ew[], + float prev_Wo); +void make_synthesis_window(float Pn[]); +void synthesise(kiss_fft_cfg fft_inv_cfg, float Sn_[], MODEL *model, float Pn[], int shift); + +#define CODEC2_RAND_MAX 32767 +int codec2_rand(void); + +#endif diff --git a/codec2/tags/0.4.1/stm32/src/sm1000_leds_switches.c b/codec2/tags/0.4.1/stm32/src/sm1000_leds_switches.c new file mode 100644 index 00000000..e630cf07 --- /dev/null +++ b/codec2/tags/0.4.1/stm32/src/sm1000_leds_switches.c @@ -0,0 +1,160 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: sm1000_leds_switches.c + AUTHOR......: David Rowe + DATE CREATED: 18 July 2014 + + Functions for controlling LEDs and reading switches on the SM1000. + +\*---------------------------------------------------------------------------*/ + +/* + 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 . +*/ + +#define _CPTT GPIO_Pin_10 +#define LED_PWR GPIO_Pin_12 +#define LED_PTT GPIO_Pin_13 +#define LED_RT GPIO_Pin_14 +#define LED_ERR GPIO_Pin_15 +#define SWITCH_PTT GPIO_Pin_7 +#define SWITCH_SELECT GPIO_Pin_0 +#define SWITCH_BACK GPIO_Pin_1 +#define EXT_PTT GPIO_Pin_8 + +#include +#include +#include "sm1000_leds_switches.h" + +void sm1000_leds_switches_init(void) { + GPIO_InitTypeDef GPIO_InitStruct; + + RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE); + + /* output pins */ + + GPIO_InitStruct.GPIO_Pin = LED_PWR | LED_PTT | LED_RT | LED_ERR | _CPTT; + GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT; + GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz; + GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; + GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL; + GPIO_Init(GPIOD, &GPIO_InitStruct); + + /* input pins */ + + GPIO_InitStruct.GPIO_Pin = SWITCH_PTT | SWITCH_SELECT | SWITCH_BACK; + GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN; + GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz; + GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL; /* we have our own external pull ups */ + GPIO_Init(GPIOD, &GPIO_InitStruct); + + GPIO_InitStruct.GPIO_Pin = EXT_PTT; + GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN; + GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz; + GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP; /* use internal pull up */ + GPIO_Init(GPIOD, &GPIO_InitStruct); + + +} + +void led_pwr(int state) { + if (state) + GPIOD->ODR |= (1 << 12); + else + GPIOD->ODR &= ~(1 << 12); +} + +void led_ptt(int state) { + if (state) + GPIOD->ODR |= (1 << 13); + else + GPIOD->ODR &= ~(1 << 13); +} + +void led_rt(int state) { + if (state) + GPIOD->ODR |= (1 << 14); + else + GPIOD->ODR &= ~(1 << 14); +} + +void led_err(int state) { + if (state) + GPIOD->ODR |= (1 << 15); + else + GPIOD->ODR &= ~(1 << 15); +} + +void not_cptt(int state) { + if (state) + GPIOD->ODR |= (1 << 10); + else + GPIOD->ODR &= ~(1 << 10); +} + +int switch_ptt(void) { + return GPIOD->IDR & (1 << 7); +} + +int switch_select(void) { + return GPIOD->IDR & (1 << 0); +} + +int switch_back(void) { + return GPIOD->IDR & (1 << 1); +} + +int ext_ptt(void) { + return GPIOD->IDR & (1 << 8); +} + +/* + FUNCTION: ColorfulRingOfDeath() + AUTHOR..: xenovacivus + + Colourful ring of death, blink LEDs like crazy forever if something + really nasty happens. Adapted from USB Virtual COM Port (VCP) + module adapted from code I found here: + + https://github.com/xenovacivus/STM32DiscoveryVCP + + Call this to indicate a failure. Blinks the STM32F4 discovery LEDs + in sequence. At 168Mhz, the blinking will be very fast - about 5 + Hz. Keep that in mind when debugging, knowing the clock speed + might help with debugging. +*/ + +int mycode; /* examine this with debugger if it dies */ + +void ColorfulRingOfDeath(int code) { + mycode = code; + uint16_t ring = 1; + while (1) { + uint32_t count = 0; + while (count++ < 5000000); + + GPIOD->BSRRH = (ring << 12); + ring = ring << 1; + if (ring >= 1<<4) { + ring = 1; + } + GPIOD->BSRRL = (ring << 12); + } +} +void HardFault_Handler(void) { ColorfulRingOfDeath(1); } +void MemManage_Handler(void) { ColorfulRingOfDeath(2); } +void BusFault_Handler(void) { ColorfulRingOfDeath(3); } +void UsageFault_Handler(void){ ColorfulRingOfDeath(4); } diff --git a/codec2/tags/0.4.1/stm32/src/sm1000_leds_switches_ut.c b/codec2/tags/0.4.1/stm32/src/sm1000_leds_switches_ut.c new file mode 100644 index 00000000..ae0e8fe7 --- /dev/null +++ b/codec2/tags/0.4.1/stm32/src/sm1000_leds_switches_ut.c @@ -0,0 +1,41 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: sm1000_leds_switches_ut.c + AUTHOR......: David Rowe + DATE CREATED: August 5 2014 + + Unit Test program for the SM1000 switches and LEDs driver. + +\*---------------------------------------------------------------------------*/ + +/* + 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 . +*/ + +#include +#include "sm1000_leds_switches.h" + +int main(void) { + sm1000_leds_switches_init(); + + while(1) { + led_pwr(switch_select()); + led_ptt(switch_ptt()); + led_rt(switch_back()); + led_err(!switch_back()); + } +} + diff --git a/codec2/tags/0.4.1/stm32/src/sm1000_main.c b/codec2/tags/0.4.1/stm32/src/sm1000_main.c new file mode 100644 index 00000000..56a2b951 --- /dev/null +++ b/codec2/tags/0.4.1/stm32/src/sm1000_main.c @@ -0,0 +1,248 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: sm1000_main.c + AUTHOR......: David Rowe + DATE CREATED: August 5 2014 + + Main program for SM1000. + + TODO + + [ ] make led blink 1-2-3 times for "mode" + +\*---------------------------------------------------------------------------*/ + +/* + 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 . +*/ + +#include "stm32f4_adc.h" +#include "stm32f4_dac.h" +#include "freedv_api.h" +#include "codec2_fdmdv.h" +#include "sm1000_leds_switches.h" +#include +#include + +#define FREEDV_NSAMPLES_16K (2*FREEDV_NSAMPLES) + +#define FIFTY_MS 50 +#define MAX_MODES 3 +#define ANALOG 0 +#define DV 1 +#define TONE 2 + +#define SS_IDLE 0 +#define SS_DEBOUNCE_DOWN 1 +#define SS_WAIT_BUTTON_UP 2 +#define SS_DEBOUNCE_UP 3 + +typedef struct { + int state; + int mode; +} SWITCH_STATE; + +unsigned int downTicker; + +void SysTick_Handler(void); +void iterate_select_state_machine(SWITCH_STATE *ss); + +#define SINE_SAMPLES 32 + +/* 32 sample sine wave which at Fs=16kHz will be 500Hz. Note samples + are 16 bit 2's complement, the DAC driver convertsto 12 bit + unsigned. */ + +short aSine[] = { + -16, 6384, 12528, 18192, 23200, 27232, 30256, 32128, + 32752, 32128, 30256, 27232, 23152, 18192, 12528, 6384, + -16, -6416, -12560, -18224, -23184, -27264, -30288, -32160, + -32768, -32160, -30288, -27264, -23184, -18224, -12560, -6416 +}; + +int main(void) { + struct freedv *f; + SWITCH_STATE ss; + int nin, nout, i; + int n_samples, n_samples_16k; + + /* init all the drivers for various peripherals */ + + SysTick_Config(SystemCoreClock/168000); /* 1 kHz SysTick */ + sm1000_leds_switches_init(); + dac_open(4*DAC_BUF_SZ); + adc_open(4*ADC_BUF_SZ); + f = freedv_open(FREEDV_MODE_1600); + n_samples = freedv_get_n_speech_samples(f); + n_samples_16k = 2*n_samples; + + short adc16k[FDMDV_OS_TAPS_16K+n_samples_16k]; + short dac16k[n_samples_16k]; + short adc8k[n_samples]; + short dac8k[FDMDV_OS_TAPS_8K+n_samples]; + + /* put outputs into a known state */ + + led_pwr(1); led_ptt(0); led_rt(0); led_err(0); not_cptt(1); + + /* clear filter memories */ + + for(i=0; iODR = (1 << 3); + + /* clipping indicator */ + + led_err(0); + for (i=0; i 28000) + led_err(1); + } + + fdmdv_16_to_8_short(adc8k, &adc16k[FDMDV_OS_TAPS_16K], n_samples); + + if (ss.mode == ANALOG) { + for(i=0; iODR &= ~(1 << 3); + } + + } + else { + + /* Receive --------------------------------------------------------------------------*/ + + not_cptt(1); led_ptt(0); + + /* ADC1 is the demod in signal from the radio rx, DAC2 is the SM1000 speaker */ + + if (ss.mode == ANALOG) { + + if (adc1_read(&adc16k[FDMDV_OS_TAPS_16K], n_samples_16k) == 0) { + fdmdv_16_to_8_short(adc8k, &adc16k[FDMDV_OS_TAPS_16K], n_samples); + for(i=0; iODR = (1 << 3); + fdmdv_16_to_8_short(adc8k, &adc16k[FDMDV_OS_TAPS_16K], nin); + nout = freedv_rx(f, &dac8k[FDMDV_OS_TAPS_8K], adc8k); + fdmdv_8_to_16_short(dac16k, &dac8k[FDMDV_OS_TAPS_8K], nout); + dac2_write(dac16k, 2*nout); + led_rt(freedv_get_sync(f)); led_err(freedv_get_total_bit_errors(f)); + GPIOE->ODR &= ~(1 << 3); + } + } + + } + } /* while(1) ... */ +} + +/* + * SysTick Interrupt Handler + */ + +void SysTick_Handler(void) +{ + if (downTicker > 0) { + downTicker--; + } +} + +/* Select button state machine. Debounces switches and enables cycling + through ANALOG-DV-TONE modes */ + +void iterate_select_state_machine(SWITCH_STATE *ss) { + int next_state; + + next_state = ss->state; + switch(ss->state) { + case SS_IDLE: + if (switch_select() == 0) { + downTicker = FIFTY_MS; + next_state = SS_DEBOUNCE_DOWN; + } + break; + case SS_DEBOUNCE_DOWN: + if (downTicker == 0) { + ss->mode++; + if (ss->mode >= MAX_MODES) + ss->mode = 0; + next_state = SS_WAIT_BUTTON_UP; + } + break; + case SS_WAIT_BUTTON_UP: + if (switch_select() == 1) { + downTicker = FIFTY_MS; + next_state = SS_DEBOUNCE_UP; + } + break; + case SS_DEBOUNCE_UP: + if (downTicker == 0) { + next_state = SS_IDLE; + } + break; + } + ss->state = next_state; +} + diff --git a/codec2/tags/0.4.1/stm32/src/startup_stm32f4xx.s b/codec2/tags/0.4.1/stm32/src/startup_stm32f4xx.s new file mode 100644 index 00000000..658ab363 --- /dev/null +++ b/codec2/tags/0.4.1/stm32/src/startup_stm32f4xx.s @@ -0,0 +1,512 @@ +/** + ****************************************************************************** + * @file startup_stm32f4xx.s + * @author MCD Application Team + * @version V1.0.0 + * @date 30-September-2011 + * @brief STM32F4xx Devices vector table for Atollic TrueSTUDIO toolchain. + * This module performs: + * - Set the initial SP + * - Set the initial PC == Reset_Handler, + * - Set the vector table entries with the exceptions ISR address + * - Configure the clock system and the external SRAM mounted on + * STM324xG-EVAL board to be used as data memory (optional, + * to be enabled by user) + * - Branches to main in the C library (which eventually + * calls main()). + * After Reset the Cortex-M4 processor is in Thread mode, + * priority is Privileged, and the Stack is set to Main. + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + + .syntax unified + .cpu cortex-m3 + .fpu softvfp + .thumb + +.global g_pfnVectors +.global Default_Handler + +/* start address for the initialization values of the .data section. +defined in linker script */ +.word _sidata +/* start address for the .data section. defined in linker script */ +.word _sdata +/* end address for the .data section. defined in linker script */ +.word _edata +/* start address for the .bss section. defined in linker script */ +.word _sbss +/* end address for the .bss section. defined in linker script */ +.word _ebss +/* stack used for SystemInit_ExtMemCtl; always internal RAM used */ + +/** + * @brief This is the code that gets called when the processor first + * starts execution following a reset event. Only the absolutely + * necessary set is performed, after which the application + * supplied main() routine is called. + * @param None + * @retval : None +*/ + + .section .text.Reset_Handler + .weak Reset_Handler + .type Reset_Handler, %function +Reset_Handler: + +/* Copy the data segment initializers from flash to SRAM */ + movs r1, #0 + b LoopCopyDataInit + +CopyDataInit: + ldr r3, =_sidata + ldr r3, [r3, r1] + str r3, [r0, r1] + adds r1, r1, #4 + +LoopCopyDataInit: + ldr r0, =_sdata + ldr r3, =_edata + adds r2, r0, r1 + cmp r2, r3 + bcc CopyDataInit + ldr r2, =_sbss + b LoopFillZerobss +/* Zero fill the bss segment. */ +FillZerobss: + movs r3, #0 + str r3, [r2], #4 + +LoopFillZerobss: + ldr r3, = _ebss + cmp r2, r3 + bcc FillZerobss + +/* Call the clock system intitialization function.*/ + bl SystemInit +/* Call static constructors */ + bl __libc_init_array +/* Call the application's entry point.*/ + bl main + bx lr +.size Reset_Handler, .-Reset_Handler + +/** + * @brief This is the code that gets called when the processor receives an + * unexpected interrupt. This simply enters an infinite loop, preserving + * the system state for examination by a debugger. + * @param None + * @retval None +*/ + .section .text.Default_Handler,"ax",%progbits +Default_Handler: +Infinite_Loop: + b Infinite_Loop + .size Default_Handler, .-Default_Handler +/****************************************************************************** +* +* The minimal vector table for a Cortex M3. Note that the proper constructs +* must be placed on this to ensure that it ends up at physical address +* 0x0000.0000. +* +*******************************************************************************/ + .section .isr_vector,"a",%progbits + .type g_pfnVectors, %object + .size g_pfnVectors, .-g_pfnVectors + + +g_pfnVectors: + .word _estack + .word Reset_Handler + .word NMI_Handler + .word HardFault_Handler + .word MemManage_Handler + .word BusFault_Handler + .word UsageFault_Handler + .word 0 + .word 0 + .word 0 + .word 0 + .word SVC_Handler + .word DebugMon_Handler + .word 0 + .word PendSV_Handler + .word SysTick_Handler + + /* External Interrupts */ + .word WWDG_IRQHandler /* Window WatchDog */ + .word PVD_IRQHandler /* PVD through EXTI Line detection */ + .word TAMP_STAMP_IRQHandler /* Tamper and TimeStamps through the EXTI line */ + .word RTC_WKUP_IRQHandler /* RTC Wakeup through the EXTI line */ + .word FLASH_IRQHandler /* FLASH */ + .word RCC_IRQHandler /* RCC */ + .word EXTI0_IRQHandler /* EXTI Line0 */ + .word EXTI1_IRQHandler /* EXTI Line1 */ + .word EXTI2_IRQHandler /* EXTI Line2 */ + .word EXTI3_IRQHandler /* EXTI Line3 */ + .word EXTI4_IRQHandler /* EXTI Line4 */ + .word DMA1_Stream0_IRQHandler /* DMA1 Stream 0 */ + .word DMA1_Stream1_IRQHandler /* DMA1 Stream 1 */ + .word DMA1_Stream2_IRQHandler /* DMA1 Stream 2 */ + .word DMA1_Stream3_IRQHandler /* DMA1 Stream 3 */ + .word DMA1_Stream4_IRQHandler /* DMA1 Stream 4 */ + .word DMA1_Stream5_IRQHandler /* DMA1 Stream 5 */ + .word DMA1_Stream6_IRQHandler /* DMA1 Stream 6 */ + .word ADC_IRQHandler /* ADC1, ADC2 and ADC3s */ + .word CAN1_TX_IRQHandler /* CAN1 TX */ + .word CAN1_RX0_IRQHandler /* CAN1 RX0 */ + .word CAN1_RX1_IRQHandler /* CAN1 RX1 */ + .word CAN1_SCE_IRQHandler /* CAN1 SCE */ + .word EXTI9_5_IRQHandler /* External Line[9:5]s */ + .word TIM1_BRK_TIM9_IRQHandler /* TIM1 Break and TIM9 */ + .word TIM1_UP_TIM10_IRQHandler /* TIM1 Update and TIM10 */ + .word TIM1_TRG_COM_TIM11_IRQHandler /* TIM1 Trigger and Commutation and TIM11 */ + .word TIM1_CC_IRQHandler /* TIM1 Capture Compare */ + .word TIM2_IRQHandler /* TIM2 */ + .word TIM3_IRQHandler /* TIM3 */ + .word TIM4_IRQHandler /* TIM4 */ + .word I2C1_EV_IRQHandler /* I2C1 Event */ + .word I2C1_ER_IRQHandler /* I2C1 Error */ + .word I2C2_EV_IRQHandler /* I2C2 Event */ + .word I2C2_ER_IRQHandler /* I2C2 Error */ + .word SPI1_IRQHandler /* SPI1 */ + .word SPI2_IRQHandler /* SPI2 */ + .word USART1_IRQHandler /* USART1 */ + .word USART2_IRQHandler /* USART2 */ + .word USART3_IRQHandler /* USART3 */ + .word EXTI15_10_IRQHandler /* External Line[15:10]s */ + .word RTC_Alarm_IRQHandler /* RTC Alarm (A and B) through EXTI Line */ + .word OTG_FS_WKUP_IRQHandler /* USB OTG FS Wakeup through EXTI line */ + .word TIM8_BRK_TIM12_IRQHandler /* TIM8 Break and TIM12 */ + .word TIM8_UP_TIM13_IRQHandler /* TIM8 Update and TIM13 */ + .word TIM8_TRG_COM_TIM14_IRQHandler /* TIM8 Trigger and Commutation and TIM14 */ + .word TIM8_CC_IRQHandler /* TIM8 Capture Compare */ + .word DMA1_Stream7_IRQHandler /* DMA1 Stream7 */ + .word FSMC_IRQHandler /* FSMC */ + .word SDIO_IRQHandler /* SDIO */ + .word TIM5_IRQHandler /* TIM5 */ + .word SPI3_IRQHandler /* SPI3 */ + .word UART4_IRQHandler /* UART4 */ + .word UART5_IRQHandler /* UART5 */ + .word TIM6_DAC_IRQHandler /* TIM6 and DAC1&2 underrun errors */ + .word TIM7_IRQHandler /* TIM7 */ + .word DMA2_Stream0_IRQHandler /* DMA2 Stream 0 */ + .word DMA2_Stream1_IRQHandler /* DMA2 Stream 1 */ + .word DMA2_Stream2_IRQHandler /* DMA2 Stream 2 */ + .word DMA2_Stream3_IRQHandler /* DMA2 Stream 3 */ + .word DMA2_Stream4_IRQHandler /* DMA2 Stream 4 */ + .word ETH_IRQHandler /* Ethernet */ + .word ETH_WKUP_IRQHandler /* Ethernet Wakeup through EXTI line */ + .word CAN2_TX_IRQHandler /* CAN2 TX */ + .word CAN2_RX0_IRQHandler /* CAN2 RX0 */ + .word CAN2_RX1_IRQHandler /* CAN2 RX1 */ + .word CAN2_SCE_IRQHandler /* CAN2 SCE */ + .word OTG_FS_IRQHandler /* USB OTG FS */ + .word DMA2_Stream5_IRQHandler /* DMA2 Stream 5 */ + .word DMA2_Stream6_IRQHandler /* DMA2 Stream 6 */ + .word DMA2_Stream7_IRQHandler /* DMA2 Stream 7 */ + .word USART6_IRQHandler /* USART6 */ + .word I2C3_EV_IRQHandler /* I2C3 event */ + .word I2C3_ER_IRQHandler /* I2C3 error */ + .word OTG_HS_EP1_OUT_IRQHandler /* USB OTG HS End Point 1 Out */ + .word OTG_HS_EP1_IN_IRQHandler /* USB OTG HS End Point 1 In */ + .word OTG_HS_WKUP_IRQHandler /* USB OTG HS Wakeup through EXTI */ + .word OTG_HS_IRQHandler /* USB OTG HS */ + .word DCMI_IRQHandler /* DCMI */ + .word CRYP_IRQHandler /* CRYP crypto */ + .word HASH_RNG_IRQHandler /* Hash and Rng */ + .word FPU_IRQHandler /* FPU */ + + +/******************************************************************************* +* +* Provide weak aliases for each Exception handler to the Default_Handler. +* As they are weak aliases, any function with the same name will override +* this definition. +* +*******************************************************************************/ + .weak NMI_Handler + .thumb_set NMI_Handler,Default_Handler + + .weak HardFault_Handler + .thumb_set HardFault_Handler,Default_Handler + + .weak MemManage_Handler + .thumb_set MemManage_Handler,Default_Handler + + .weak BusFault_Handler + .thumb_set BusFault_Handler,Default_Handler + + .weak UsageFault_Handler + .thumb_set UsageFault_Handler,Default_Handler + + .weak SVC_Handler + .thumb_set SVC_Handler,Default_Handler + + .weak DebugMon_Handler + .thumb_set DebugMon_Handler,Default_Handler + + .weak PendSV_Handler + .thumb_set PendSV_Handler,Default_Handler + + .weak SysTick_Handler + .thumb_set SysTick_Handler,Default_Handler + + .weak WWDG_IRQHandler + .thumb_set WWDG_IRQHandler,Default_Handler + + .weak PVD_IRQHandler + .thumb_set PVD_IRQHandler,Default_Handler + + .weak TAMP_STAMP_IRQHandler + .thumb_set TAMP_STAMP_IRQHandler,Default_Handler + + .weak RTC_WKUP_IRQHandler + .thumb_set RTC_WKUP_IRQHandler,Default_Handler + + .weak FLASH_IRQHandler + .thumb_set FLASH_IRQHandler,Default_Handler + + .weak RCC_IRQHandler + .thumb_set RCC_IRQHandler,Default_Handler + + .weak EXTI0_IRQHandler + .thumb_set EXTI0_IRQHandler,Default_Handler + + .weak EXTI1_IRQHandler + .thumb_set EXTI1_IRQHandler,Default_Handler + + .weak EXTI2_IRQHandler + .thumb_set EXTI2_IRQHandler,Default_Handler + + .weak EXTI3_IRQHandler + .thumb_set EXTI3_IRQHandler,Default_Handler + + .weak EXTI4_IRQHandler + .thumb_set EXTI4_IRQHandler,Default_Handler + + .weak DMA1_Stream0_IRQHandler + .thumb_set DMA1_Stream0_IRQHandler,Default_Handler + + .weak DMA1_Stream1_IRQHandler + .thumb_set DMA1_Stream1_IRQHandler,Default_Handler + + .weak DMA1_Stream2_IRQHandler + .thumb_set DMA1_Stream2_IRQHandler,Default_Handler + + .weak DMA1_Stream3_IRQHandler + .thumb_set DMA1_Stream3_IRQHandler,Default_Handler + + .weak DMA1_Stream4_IRQHandler + .thumb_set DMA1_Stream4_IRQHandler,Default_Handler + + .weak DMA1_Stream5_IRQHandler + .thumb_set DMA1_Stream5_IRQHandler,Default_Handler + + .weak DMA1_Stream6_IRQHandler + .thumb_set DMA1_Stream6_IRQHandler,Default_Handler + + .weak ADC_IRQHandler + .thumb_set ADC_IRQHandler,Default_Handler + + .weak CAN1_TX_IRQHandler + .thumb_set CAN1_TX_IRQHandler,Default_Handler + + .weak CAN1_RX0_IRQHandler + .thumb_set CAN1_RX0_IRQHandler,Default_Handler + + .weak CAN1_RX1_IRQHandler + .thumb_set CAN1_RX1_IRQHandler,Default_Handler + + .weak CAN1_SCE_IRQHandler + .thumb_set CAN1_SCE_IRQHandler,Default_Handler + + .weak EXTI9_5_IRQHandler + .thumb_set EXTI9_5_IRQHandler,Default_Handler + + .weak TIM1_BRK_TIM9_IRQHandler + .thumb_set TIM1_BRK_TIM9_IRQHandler,Default_Handler + + .weak TIM1_UP_TIM10_IRQHandler + .thumb_set TIM1_UP_TIM10_IRQHandler,Default_Handler + + .weak TIM1_TRG_COM_TIM11_IRQHandler + .thumb_set TIM1_TRG_COM_TIM11_IRQHandler,Default_Handler + + .weak TIM1_CC_IRQHandler + .thumb_set TIM1_CC_IRQHandler,Default_Handler + + .weak TIM2_IRQHandler + .thumb_set TIM2_IRQHandler,Default_Handler + + .weak TIM3_IRQHandler + .thumb_set TIM3_IRQHandler,Default_Handler + + .weak TIM4_IRQHandler + .thumb_set TIM4_IRQHandler,Default_Handler + + .weak I2C1_EV_IRQHandler + .thumb_set I2C1_EV_IRQHandler,Default_Handler + + .weak I2C1_ER_IRQHandler + .thumb_set I2C1_ER_IRQHandler,Default_Handler + + .weak I2C2_EV_IRQHandler + .thumb_set I2C2_EV_IRQHandler,Default_Handler + + .weak I2C2_ER_IRQHandler + .thumb_set I2C2_ER_IRQHandler,Default_Handler + + .weak SPI1_IRQHandler + .thumb_set SPI1_IRQHandler,Default_Handler + + .weak SPI2_IRQHandler + .thumb_set SPI2_IRQHandler,Default_Handler + + .weak USART1_IRQHandler + .thumb_set USART1_IRQHandler,Default_Handler + + .weak USART2_IRQHandler + .thumb_set USART2_IRQHandler,Default_Handler + + .weak USART3_IRQHandler + .thumb_set USART3_IRQHandler,Default_Handler + + .weak EXTI15_10_IRQHandler + .thumb_set EXTI15_10_IRQHandler,Default_Handler + + .weak RTC_Alarm_IRQHandler + .thumb_set RTC_Alarm_IRQHandler,Default_Handler + + .weak OTG_FS_WKUP_IRQHandler + .thumb_set OTG_FS_WKUP_IRQHandler,Default_Handler + + .weak TIM8_BRK_TIM12_IRQHandler + .thumb_set TIM8_BRK_TIM12_IRQHandler,Default_Handler + + .weak TIM8_UP_TIM13_IRQHandler + .thumb_set TIM8_UP_TIM13_IRQHandler,Default_Handler + + .weak TIM8_TRG_COM_TIM14_IRQHandler + .thumb_set TIM8_TRG_COM_TIM14_IRQHandler,Default_Handler + + .weak TIM8_CC_IRQHandler + .thumb_set TIM8_CC_IRQHandler,Default_Handler + + .weak DMA1_Stream7_IRQHandler + .thumb_set DMA1_Stream7_IRQHandler,Default_Handler + + .weak FSMC_IRQHandler + .thumb_set FSMC_IRQHandler,Default_Handler + + .weak SDIO_IRQHandler + .thumb_set SDIO_IRQHandler,Default_Handler + + .weak TIM5_IRQHandler + .thumb_set TIM5_IRQHandler,Default_Handler + + .weak SPI3_IRQHandler + .thumb_set SPI3_IRQHandler,Default_Handler + + .weak UART4_IRQHandler + .thumb_set UART4_IRQHandler,Default_Handler + + .weak UART5_IRQHandler + .thumb_set UART5_IRQHandler,Default_Handler + + .weak TIM6_DAC_IRQHandler + .thumb_set TIM6_DAC_IRQHandler,Default_Handler + + .weak TIM7_IRQHandler + .thumb_set TIM7_IRQHandler,Default_Handler + + .weak DMA2_Stream0_IRQHandler + .thumb_set DMA2_Stream0_IRQHandler,Default_Handler + + .weak DMA2_Stream1_IRQHandler + .thumb_set DMA2_Stream1_IRQHandler,Default_Handler + + .weak DMA2_Stream2_IRQHandler + .thumb_set DMA2_Stream2_IRQHandler,Default_Handler + + .weak DMA2_Stream3_IRQHandler + .thumb_set DMA2_Stream3_IRQHandler,Default_Handler + + .weak DMA2_Stream4_IRQHandler + .thumb_set DMA2_Stream4_IRQHandler,Default_Handler + + .weak ETH_IRQHandler + .thumb_set ETH_IRQHandler,Default_Handler + + .weak ETH_WKUP_IRQHandler + .thumb_set ETH_WKUP_IRQHandler,Default_Handler + + .weak CAN2_TX_IRQHandler + .thumb_set CAN2_TX_IRQHandler,Default_Handler + + .weak CAN2_RX0_IRQHandler + .thumb_set CAN2_RX0_IRQHandler,Default_Handler + + .weak CAN2_RX1_IRQHandler + .thumb_set CAN2_RX1_IRQHandler,Default_Handler + + .weak CAN2_SCE_IRQHandler + .thumb_set CAN2_SCE_IRQHandler,Default_Handler + + .weak OTG_FS_IRQHandler + .thumb_set OTG_FS_IRQHandler,Default_Handler + + .weak DMA2_Stream5_IRQHandler + .thumb_set DMA2_Stream5_IRQHandler,Default_Handler + + .weak DMA2_Stream6_IRQHandler + .thumb_set DMA2_Stream6_IRQHandler,Default_Handler + + .weak DMA2_Stream7_IRQHandler + .thumb_set DMA2_Stream7_IRQHandler,Default_Handler + + .weak USART6_IRQHandler + .thumb_set USART6_IRQHandler,Default_Handler + + .weak I2C3_EV_IRQHandler + .thumb_set I2C3_EV_IRQHandler,Default_Handler + + .weak I2C3_ER_IRQHandler + .thumb_set I2C3_ER_IRQHandler,Default_Handler + + .weak OTG_HS_EP1_OUT_IRQHandler + .thumb_set OTG_HS_EP1_OUT_IRQHandler,Default_Handler + + .weak OTG_HS_EP1_IN_IRQHandler + .thumb_set OTG_HS_EP1_IN_IRQHandler,Default_Handler + + .weak OTG_HS_WKUP_IRQHandler + .thumb_set OTG_HS_WKUP_IRQHandler,Default_Handler + + .weak OTG_HS_IRQHandler + .thumb_set OTG_HS_IRQHandler,Default_Handler + + .weak DCMI_IRQHandler + .thumb_set DCMI_IRQHandler,Default_Handler + + .weak CRYP_IRQHandler + .thumb_set CRYP_IRQHandler,Default_Handler + + .weak HASH_RNG_IRQHandler + .thumb_set HASH_RNG_IRQHandler,Default_Handler + + .weak FPU_IRQHandler + .thumb_set FPU_IRQHandler,Default_Handler + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/codec2/tags/0.4.1/stm32/src/stm32f4_adc.c b/codec2/tags/0.4.1/stm32/src/stm32f4_adc.c new file mode 100644 index 00000000..cecdbe1d --- /dev/null +++ b/codec2/tags/0.4.1/stm32/src/stm32f4_adc.c @@ -0,0 +1,272 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: stm32f4_adc.c + AUTHOR......: David Rowe + DATE CREATED: 4 June 2013 + + Two channel ADC driver module for STM32F4. Pin PA1 connects to ADC1, pin + PA2 connects to ADC2. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2013 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 . +*/ + +#include +#include +#include + +#include "stm32f4xx_adc.h" +#include "stm32f4xx_gpio.h" +#include "stm32f4xx_rcc.h" + +#include "codec2_fifo.h" +#include "stm32f4_adc.h" +#include "debugblinky.h" + +struct FIFO *adc1_fifo; +struct FIFO *adc2_fifo; +unsigned short adc_buf[ADC_BUF_SZ]; +int adc_overflow1, adc_overflow2; +int half,full; + +#define ADCx_DR_ADDRESS ((uint32_t)0x4001204C) +#define DMA_CHANNELx DMA_Channel_0 +#define DMA_STREAMx DMA2_Stream0 +#define ADCx ADC1 + +void adc_configure(); + +static void tim2_config(void); + +void adc_open(int fifo_sz) { + adc1_fifo = fifo_create(fifo_sz); + assert(adc1_fifo != NULL); + adc2_fifo = fifo_create(fifo_sz); + assert(adc2_fifo != NULL); + + tim2_config(); + adc_configure(); + init_debug_blinky(); +} + +/* n signed 16 bit samples in buf[] if return != -1 */ + +int adc1_read(short buf[], int n) { + return fifo_read(adc1_fifo, buf, n); +} + +/* n signed 16 bit samples in buf[] if return != -1 */ + +int adc2_read(short buf[], int n) { + return fifo_read(adc2_fifo, buf, n); +} + + +static void tim2_config(void) +{ + TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; + + /* TIM2 Periph clock enable */ + RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); + + /* -------------------------------------------------------- + + TIM2 input clock (TIM2CLK) is set to 2 * APB1 clock (PCLK1), since + APB1 prescaler is different from 1 (see system_stm32f4xx.c and Fig + 13 clock tree figure in DM0031020.pdf). + + Sample rate Fs = 2*PCLK1/TIM_ClockDivision + = (HCLK/2)/TIM_ClockDivision + + ----------------------------------------------------------- */ + + /* Time base configuration */ + + TIM_TimeBaseStructInit(&TIM_TimeBaseStructure); + TIM_TimeBaseStructure.TIM_Period = 5250; + TIM_TimeBaseStructure.TIM_Prescaler = 0; + TIM_TimeBaseStructure.TIM_ClockDivision = 0; + TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; + TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); + + /* TIM2 TRGO selection */ + + TIM_SelectOutputTrigger(TIM2, TIM_TRGOSource_Update); + + /* TIM2 enable counter */ + + TIM_Cmd(TIM2, ENABLE); +} + + +void adc_configure(){ + ADC_InitTypeDef ADC_init_structure; + GPIO_InitTypeDef GPIO_initStructre; + DMA_InitTypeDef DMA_InitStructure; + NVIC_InitTypeDef NVIC_InitStructure; + + // Clock configuration + + RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE); + RCC_AHB1PeriphClockCmd(RCC_AHB1ENR_GPIOAEN,ENABLE); + RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE); + + // Analog pin configuration ADC1->PA1, ADC2->PA2 + + GPIO_initStructre.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2; + GPIO_initStructre.GPIO_Mode = GPIO_Mode_AN; + GPIO_initStructre.GPIO_PuPd = GPIO_PuPd_NOPULL; + GPIO_Init(GPIOA,&GPIO_initStructre); + + // ADC structure configuration + + ADC_DeInit(); + ADC_init_structure.ADC_DataAlign = ADC_DataAlign_Left; + ADC_init_structure.ADC_Resolution = ADC_Resolution_12b; + ADC_init_structure.ADC_ContinuousConvMode = DISABLE; + ADC_init_structure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T2_TRGO; + ADC_init_structure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_Rising; + ADC_init_structure.ADC_NbrOfConversion = 2; + ADC_init_structure.ADC_ScanConvMode = ENABLE; + ADC_Init(ADCx,&ADC_init_structure); + + // Select the channel to be read from + + ADC_RegularChannelConfig(ADCx,ADC_Channel_1,1,ADC_SampleTime_144Cycles); + ADC_RegularChannelConfig(ADCx,ADC_Channel_2,2,ADC_SampleTime_144Cycles); + //ADC_VBATCmd(ENABLE); + + /* DMA configuration **************************************/ + + DMA_DeInit(DMA_STREAMx); + DMA_InitStructure.DMA_Channel = DMA_CHANNELx; + DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADCx_DR_ADDRESS; + DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)adc_buf; + DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory; + DMA_InitStructure.DMA_BufferSize = ADC_BUF_SZ; + DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; + DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; + DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; + DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; + DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; + DMA_InitStructure.DMA_Priority = DMA_Priority_High; + DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; + DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull; + DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; + DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; + DMA_Init(DMA_STREAMx, &DMA_InitStructure); + + /* Enable DMA request after last transfer (Single-ADC mode) */ + + ADC_DMARequestAfterLastTransferCmd(ADCx, ENABLE); + + /* Enable ADC1 DMA */ + + ADC_DMACmd(ADCx, ENABLE); + + /* DMA2_Stream0 enable */ + + DMA_Cmd(DMA_STREAMx, ENABLE); + + /* Enable DMA Half & Complete interrupts */ + + DMA_ITConfig(DMA2_Stream0, DMA_IT_TC | DMA_IT_HT, ENABLE); + + /* Enable the DMA Stream IRQ Channel */ + + NVIC_InitStructure.NVIC_IRQChannel = DMA2_Stream0_IRQn; + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; + NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; + NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; + NVIC_Init(&NVIC_InitStructure); + + // Enable and start ADC conversion + + ADC_Cmd(ADC1,ENABLE); + ADC_SoftwareStartConv(ADC1); +} + +/* + This function handles DMA Stream interrupt request. +*/ + +void DMA2_Stream0_IRQHandler(void) { + int i, j, sam; + short signed_buf1[ADC_BUF_SZ/2]; + short signed_buf2[ADC_BUF_SZ/2]; + + GPIOE->ODR |= (1 << 0); + + /* Half transfer interrupt */ + + if(DMA_GetITStatus(DMA2_Stream0, DMA_IT_HTIF0) != RESET) { + half++; + + /* convert to signed */ + + for(i=0, j=0; iODR &= ~(1 << 0); +} + diff --git a/codec2/tags/0.4.1/stm32/src/stm32f4_adc_tuner.c b/codec2/tags/0.4.1/stm32/src/stm32f4_adc_tuner.c new file mode 100644 index 00000000..9d74130b --- /dev/null +++ b/codec2/tags/0.4.1/stm32/src/stm32f4_adc_tuner.c @@ -0,0 +1,282 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: stm32f4_adc_tuner.c + AUTHOR......: David Rowe + DATE CREATED: 19 Feb 2015 + + Single channel ADC driver module for STM32F4 that samples pin PA1 at + 2 MHz and down converts to 50 kHz, with "tuning" centred at 500 kHz. + + See codec2-dev/octave.m for a simulation model. + +\*---------------------------------------------------------------------------*/ + +/* + 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 . +*/ + +#include +#include +#include + +#include "stm32f4xx_adc.h" +#include "stm32f4xx_gpio.h" +#include "stm32f4xx_rcc.h" + +#include "codec2_fifo.h" +#include "stm32f4_adc_tuner.h" +#include "debugblinky.h" +#include "iir_tuner.h" + +struct FIFO *adc1_fifo; +unsigned short adc_buf[ADC_TUNER_BUF_SZ]; +int adc_overflow1; +int half,full; +static short tuner_en = 1; + +#define ADCx_DR_ADDRESS ((uint32_t)0x4001204C) +#define DMA_CHANNELx DMA_Channel_0 +#define DMA_STREAMx DMA2_Stream0 +#define ADCx ADC1 + +void adc_configure(); + +static void tim2_config(void); + + +void adc_open(int fifo_sz) { + adc1_fifo = fifo_create(fifo_sz); + assert(adc1_fifo != NULL); + + tim2_config(); + adc_configure(); + init_debug_blinky(); +} + + +/* n signed 16 bit samples in buf[] if return != -1 */ + +int adc1_read(short buf[], int n) { + return fifo_read(adc1_fifo, buf, n); +} + + +void adc_set_tuner_en(short flag) +{ + tuner_en = flag; +} + +static void tim2_config(void) +{ + TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; + + /* TIM2 Periph clock enable */ + RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); + + /* -------------------------------------------------------- + + TIM2 input clock (TIM2CLK) is set to 2 * APB1 clock (PCLK1), since + APB1 prescaler is different from 1 (see system_stm32f4xx.c and Fig + 13 clock tree figure in DM0031020.pdf). + + Sample rate Fs = 2*PCLK1/)TIM_ClockDivision+1) + = (HCLK/2)/(TIM_ClockDivision+1) + + Note from David: The +1 was discovered empirically, still not sure + if it's right. + + ----------------------------------------------------------- */ + + /* Time base configuration */ + + TIM_TimeBaseStructInit(&TIM_TimeBaseStructure); + TIM_TimeBaseStructure.TIM_Period = 41; + TIM_TimeBaseStructure.TIM_Prescaler = 0; + TIM_TimeBaseStructure.TIM_ClockDivision = 0; + TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; + TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); + + /* TIM2 TRGO selection */ + + TIM_SelectOutputTrigger(TIM2, TIM_TRGOSource_Update); + + /* TIM2 enable counter */ + + TIM_Cmd(TIM2, ENABLE); +} + + +void adc_configure() { + ADC_InitTypeDef ADC_init_structure; + GPIO_InitTypeDef GPIO_initStructre; + DMA_InitTypeDef DMA_InitStructure; + NVIC_InitTypeDef NVIC_InitStructure; + + // Clock configuration + + RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE); + RCC_AHB1PeriphClockCmd(RCC_AHB1ENR_GPIOAEN,ENABLE); + RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE); + + // Analog pin configuration ADC1->PA1 + + GPIO_initStructre.GPIO_Pin = GPIO_Pin_1; + GPIO_initStructre.GPIO_Mode = GPIO_Mode_AN; + GPIO_initStructre.GPIO_PuPd = GPIO_PuPd_NOPULL; + GPIO_Init(GPIOA,&GPIO_initStructre); + + // ADC structure configuration + + ADC_DeInit(); + ADC_init_structure.ADC_DataAlign = ADC_DataAlign_Left; + ADC_init_structure.ADC_Resolution = ADC_Resolution_12b; + ADC_init_structure.ADC_ContinuousConvMode = DISABLE; + ADC_init_structure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T2_TRGO; + ADC_init_structure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_Rising; + ADC_init_structure.ADC_NbrOfConversion = 1; + ADC_Init(ADCx,&ADC_init_structure); + + // Select the channel to be read from + + ADC_RegularChannelConfig(ADCx,ADC_Channel_1,1,ADC_SampleTime_3Cycles); + + /* DMA configuration **************************************/ + + DMA_DeInit(DMA_STREAMx); + DMA_InitStructure.DMA_Channel = DMA_CHANNELx; + DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADCx_DR_ADDRESS; + DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)adc_buf; + DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory; + DMA_InitStructure.DMA_BufferSize = ADC_TUNER_BUF_SZ; + DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; + DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; + DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; + DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; + DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; + DMA_InitStructure.DMA_Priority = DMA_Priority_High; + DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; + DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull; + DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; + DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; + DMA_Init(DMA_STREAMx, &DMA_InitStructure); + + /* Enable DMA request after last transfer (Single-ADC mode) */ + + ADC_DMARequestAfterLastTransferCmd(ADCx, ENABLE); + + /* Enable ADC1 DMA */ + + ADC_DMACmd(ADCx, ENABLE); + + /* DMA2_Stream0 enable */ + + DMA_Cmd(DMA_STREAMx, ENABLE); + + /* Enable DMA Half & Complete interrupts */ + + DMA_ITConfig(DMA2_Stream0, DMA_IT_TC | DMA_IT_HT, ENABLE); + + /* Enable the DMA Stream IRQ Channel */ + + NVIC_InitStructure.NVIC_IRQChannel = DMA2_Stream0_IRQn; + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; + NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; + NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; + NVIC_Init(&NVIC_InitStructure); + + // Enable and start ADC conversion + + ADC_Cmd(ADC1,ENABLE); + ADC_SoftwareStartConv(ADC1); +} + + +/* + This function handles DMA Stream interrupt request. + + ADC_TUNER_BUF_SZ = 45 * 160 = 7200, so one interrupt every 7200/2 = 3600 samples + or interrupts at a rate of 2E6/3600 = 555.56 Hz. +*/ + +void DMA2_Stream0_IRQHandler(void) { + float dec_buf[ADC_TUNER_N/2]; + int i; + + /* PE0 is asserted high for the duration of this ISR */ + + GPIOE->ODR |= (1 << 0); + + //#define DUMMY_SIGNAL + #ifdef DUMMY_SIGNAL + + /* Fs/4 sine wave, right in the middle of the pass band ! */ + + for(i=0; iODR &= ~(1 << 0); +} + diff --git a/codec2/tags/0.4.1/stm32/src/stm32f4_dac.c b/codec2/tags/0.4.1/stm32/src/stm32f4_dac.c new file mode 100644 index 00000000..75416a39 --- /dev/null +++ b/codec2/tags/0.4.1/stm32/src/stm32f4_dac.c @@ -0,0 +1,398 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: stm32f4_dac.c + AUTHOR......: David Rowe + DATE CREATED: 1 June 2013 + + DAC driver module for STM32F4. DAC1 is connected to pin PA4, DAC2 + is connected to pin PA5. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2013 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 . +*/ + +#include +#include +#include +#include "stm32f4xx.h" +#include "codec2_fifo.h" +#include "stm32f4_dac.h" +#include "debugblinky.h" + +/* write to these registers for 12 bit left aligned data, as per data sheet + make sure 4 least sig bits set to 0 */ + +#define DAC_DHR12R1_ADDRESS 0x40007408 +#define DAC_DHR12R2_ADDRESS 0x40007414 + +#define DAC_MAX 4096 /* maximum amplitude */ + +/* y=mx+c mapping of samples16 bit shorts to DAC samples. Table: 74 + of data sheet indicates With DAC buffer on, DAC range is limited to + 0x0E0 to 0xF1C at VREF+ = 3.6 V, we have Vref=3.3V which is close. + */ + +#define M ((3868.0-224.0)/65536.0) +#define C 2047.0 + +static struct FIFO *dac1_fifo; +static struct FIFO *dac2_fifo; + +static unsigned short dac1_buf[DAC_BUF_SZ]; +static unsigned short dac2_buf[DAC_BUF_SZ]; + +static void tim6_config(void); +static void dac1_config(void); +static void dac2_config(void); + +int dac_underflow; + +void dac_open(int fifo_size) { + + memset(dac1_buf, 32768, sizeof(short)*DAC_BUF_SZ); + memset(dac2_buf, 32768, sizeof(short)*DAC_BUF_SZ); + + /* Create fifos */ + + dac1_fifo = fifo_create(fifo_size); + dac2_fifo = fifo_create(fifo_size); + assert(dac1_fifo != NULL); + assert(dac2_fifo != NULL); + + /* Turn on the clocks we need -----------------------------------------------*/ + + /* DMA1 clock enable */ + RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE); + /* GPIOA clock enable (to be used with DAC) */ + RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); + /* DAC Periph clock enable */ + RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE); + + /* GPIO Pin configuration DAC1->PA.4, DAC2->PA.5 configuration --------------*/ + + GPIO_InitTypeDef GPIO_InitStructure; + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; + GPIO_Init(GPIOA, &GPIO_InitStructure); + + /* Timer and DAC 1 & 2 Configuration ----------------------------------------*/ + + tim6_config(); + dac1_config(); + dac2_config(); + + init_debug_blinky(); +} + +/* Call these puppies to send samples to the DACs. For your + convenience they accept signed 16 bit samples. */ + +int dac1_write(short buf[], int n) { + return fifo_write(dac1_fifo, buf, n); +} + +int dac2_write(short buf[], int n) { + return fifo_write(dac2_fifo, buf, n); +} + +static void tim6_config(void) +{ + TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; + + /* TIM6 Periph clock enable */ + RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE); + + /* -------------------------------------------------------- + + TIM6 input clock (TIM6CLK) is set to 2 * APB1 clock (PCLK1), since + APB1 prescaler is different from 1 (see system_stm32f4xx.c and Fig + 13 clock tree figure in DM0031020.pdf). + + Sample rate Fs = 2*PCLK1/TIM_ClockDivision + = (HCLK/2)/TIM_ClockDivision + + ----------------------------------------------------------- */ + + /* Time base configuration */ + + TIM_TimeBaseStructInit(&TIM_TimeBaseStructure); + TIM_TimeBaseStructure.TIM_Period = 5250; + TIM_TimeBaseStructure.TIM_Prescaler = 0; + TIM_TimeBaseStructure.TIM_ClockDivision = 0; + TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; + TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure); + + /* TIM6 TRGO selection */ + + TIM_SelectOutputTrigger(TIM6, TIM_TRGOSource_Update); + + /* TIM6 enable counter */ + + TIM_Cmd(TIM6, ENABLE); +} + +static void dac1_config(void) +{ + DAC_InitTypeDef DAC_InitStructure; + DMA_InitTypeDef DMA_InitStructure; + NVIC_InitTypeDef NVIC_InitStructure; + + /* DAC channel 1 Configuration */ + + /* + This line fixed a bug that cost me 5 days, bad wave amplitude + value, and some STM32F4 periph library bugs caused triangle wave + geneartion to be enable resulting in a low level tone on the + SM1000, that we thought was caused by analog issues like layour + or power supply biasing + */ + DAC_StructInit(&DAC_InitStructure); + + DAC_InitStructure.DAC_Trigger = DAC_Trigger_T6_TRGO; + DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None; + DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Enable; + DAC_Init(DAC_Channel_1, &DAC_InitStructure); + + /* DMA1_Stream5 channel7 configuration **************************************/ + /* Table 35 page 219 of the monster data sheet */ + + DMA_DeInit(DMA1_Stream5); + DMA_InitStructure.DMA_Channel = DMA_Channel_7; + DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)DAC_DHR12R1_ADDRESS; + DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)dac1_buf; + DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral; + DMA_InitStructure.DMA_BufferSize = DAC_BUF_SZ; + DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; + DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; + DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; + DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; + DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; + DMA_InitStructure.DMA_Priority = DMA_Priority_High; + DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; + DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull; + DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; + DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; + DMA_Init(DMA1_Stream5, &DMA_InitStructure); + + /* Enable DMA Half & Complete interrupts */ + + DMA_ITConfig(DMA1_Stream5, DMA_IT_TC | DMA_IT_HT, ENABLE); + + /* Enable the DMA Stream IRQ Channel */ + + NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream5_IRQn; + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; + NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; + NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; + NVIC_Init(&NVIC_InitStructure); + + /* Enable DMA1_Stream5 */ + + DMA_Cmd(DMA1_Stream5, ENABLE); + + /* Enable DAC Channel 1 */ + + DAC_Cmd(DAC_Channel_1, ENABLE); + + /* Enable DMA for DAC Channel 1 */ + + DAC_DMACmd(DAC_Channel_1, ENABLE); +} + +static void dac2_config(void) +{ + DAC_InitTypeDef DAC_InitStructure; + DMA_InitTypeDef DMA_InitStructure; + NVIC_InitTypeDef NVIC_InitStructure; + + /* DAC channel 2 Configuration (see notes in dac1_config() above) */ + + DAC_StructInit(&DAC_InitStructure); + DAC_InitStructure.DAC_Trigger = DAC_Trigger_T6_TRGO; + DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None; + DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Enable; + DAC_Init(DAC_Channel_2, &DAC_InitStructure); + + /* DMA1_Stream6 channel7 configuration **************************************/ + + DMA_DeInit(DMA1_Stream6); + DMA_InitStructure.DMA_Channel = DMA_Channel_7; + DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)DAC_DHR12R2_ADDRESS; + DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)dac2_buf; + DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral; + DMA_InitStructure.DMA_BufferSize = DAC_BUF_SZ; + DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; + DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; + DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; + DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; + DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; + DMA_InitStructure.DMA_Priority = DMA_Priority_High; + DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; + DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull; + DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; + DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; + DMA_Init(DMA1_Stream6, &DMA_InitStructure); + + /* Enable DMA Half & Complete interrupts */ + + DMA_ITConfig(DMA1_Stream6, DMA_IT_TC | DMA_IT_HT, ENABLE); + + /* Enable the DMA Stream IRQ Channel */ + + NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream6_IRQn; + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; + NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; + NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; + NVIC_Init(&NVIC_InitStructure); + + /* Enable DMA1_Stream6 */ + + DMA_Cmd(DMA1_Stream6, ENABLE); + + /* Enable DAC Channel 2 */ + + DAC_Cmd(DAC_Channel_2, ENABLE); + + /* Enable DMA for DAC Channel 2 */ + + DAC_DMACmd(DAC_Channel_2, ENABLE); + +} + +/******************************************************************************/ +/* STM32F4xx Peripherals Interrupt Handlers */ +/* Add here the Interrupt Handler for the used peripheral(s) (PPP), for the */ +/* available peripheral interrupt handler's name please refer to the startup */ +/* file (startup_stm32f40xx.s/startup_stm32f427x.s). */ +/******************************************************************************/ + +/* + This function handles DMA1 Stream 5 interrupt request for DAC1. +*/ + +void DMA1_Stream5_IRQHandler(void) { + int i, j, sam; + short signed_buf[DAC_BUF_SZ/2]; + + GPIOE->ODR |= (1 << 1); + + /* Transfer half empty interrupt - refill first half */ + + if(DMA_GetITStatus(DMA1_Stream5, DMA_IT_HTIF5) != RESET) { + /* fill first half from fifo */ + + if (fifo_read(dac1_fifo, signed_buf, DAC_BUF_SZ/2) == -1) { + memset(signed_buf, 0, sizeof(short)*DAC_BUF_SZ/2); + dac_underflow++; + } + + /* convert to unsigned */ + + for(i=0; iODR &= ~(1 << 1); +} + +/* + This function handles DMA1 Stream 6 interrupt request for DAC2. +*/ + +void DMA1_Stream6_IRQHandler(void) { + int i, j, sam; + short signed_buf[DAC_BUF_SZ/2]; + + GPIOE->ODR |= (1 << 2); + + /* Transfer half empty interrupt - refill first half */ + + if(DMA_GetITStatus(DMA1_Stream6, DMA_IT_HTIF6) != RESET) { + /* fill first half from fifo */ + + if (fifo_read(dac2_fifo, signed_buf, DAC_BUF_SZ/2) == -1) { + memset(signed_buf, 0, sizeof(short)*DAC_BUF_SZ/2); + dac_underflow++; + } + + /* convert to unsigned */ + + for(i=0; iODR &= ~(1 << 2); +} + diff --git a/codec2/tags/0.4.1/stm32/src/stm32f4_dacduc.c b/codec2/tags/0.4.1/stm32/src/stm32f4_dacduc.c new file mode 100644 index 00000000..ec683c37 --- /dev/null +++ b/codec2/tags/0.4.1/stm32/src/stm32f4_dacduc.c @@ -0,0 +1,416 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: stm32f4_dac.c + AUTHOR......: David Rowe + DATE CREATED: 1 June 2013 + + DAC driver module for STM32F4. DAC1 if fixed at Fs of 2Mhz. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2013 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 . +*/ + +#include +#include +#include +#include "stm32f4xx.h" +#include "codec2_fifo.h" +#include "stm32f4_dacduc.h" +#include "debugblinky.h" + +/* write to these registers for 12 bit left aligned data, as per data sheet + make sure 4 least sig bits set to 0 */ + +#define DAC_DHR12R1_ADDRESS 0x40007408 +#define DAC_DHR12R2_ADDRESS 0x40007414 + +#define DAC_MAX 4096 /* maximum amplitude */ + +/* y=mx+c mapping of samples16 bit shorts to DAC samples. Table: 74 + of data sheet indicates With DAC buffer on, DAC range is limited to + 0x0E0 to 0xF1C at VREF+ = 3.6 V, we have Vref=3.3V which is close. + */ + +#define M ((3868.0-224.0)/65536.0) +#define C 2047.0 + + +static struct FIFO *dac1_fifo; +static struct FIFO *dac2_fifo; + +static unsigned short dac1_buf[DAC_DUC_BUF_SZ]; +static unsigned short dac2_buf[DAC_BUF_SZ]; + +static void tim6_config(void); +static void tim7_config(void); +static void dac1_config(void); +static void dac2_config(void); + +int dac_underflow; + +void fast_dac_open(int dac1_fifo_size,int dac2_fifo_size) { + + memset(dac1_buf, 32768, sizeof(short)*DAC_DUC_BUF_SZ); + memset(dac2_buf, 32768, sizeof(short)*DAC_BUF_SZ); + + /* Create fifos */ + + dac1_fifo = fifo_create(dac1_fifo_size); + dac2_fifo = fifo_create(dac2_fifo_size); + assert(dac1_fifo != NULL); + assert(dac2_fifo != NULL); + + /* Turn on the clocks we need -----------------------------------------------*/ + + /* DMA1 clock enable */ + RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE); + /* GPIOA clock enable (to be used with DAC) */ + RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); + /* DAC Periph clock enable */ + RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE); + + /* GPIO Pin configuration DAC1->PA.4, DAC2->PA.5 configuration --------------*/ + + GPIO_InitTypeDef GPIO_InitStructure; + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; + GPIO_Init(GPIOA, &GPIO_InitStructure); + + /* Timer and DAC 1 & 2 Configuration ----------------------------------------*/ + tim7_config(); + tim6_config(); + dac1_config(); + dac2_config(); + + init_debug_blinky(); +} + + +/* Call these puppies to send samples to the DACs. For your + convenience they accept signed 16 bit samples. */ + +int dac1_write(short buf[], int n) { + return fifo_write(dac1_fifo, buf, n); +} + +int dac2_write(short buf[], int n) { + return fifo_write(dac2_fifo, buf, n); +} + +static void tim6_config(void) +{ + TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; + + /* TIM6 Periph clock enable */ + RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE); + + /* -------------------------------------------------------- + + TIM6 input clock (TIM6CLK) is set to 2 * APB1 clock (PCLK1), since + APB1 prescaler is different from 1 (see system_stm32f4xx.c and Fig + 13 clock tree figure in DM0031020.pdf). + + Sample rate Fs = 2*PCLK1/TIM_ClockDivision + = (HCLK/2)/TIM_ClockDivision + + ----------------------------------------------------------- */ + + /* Time base configuration */ + + TIM_TimeBaseStructInit(&TIM_TimeBaseStructure); + TIM_TimeBaseStructure.TIM_Period = 5250; + TIM_TimeBaseStructure.TIM_Prescaler = 0; + TIM_TimeBaseStructure.TIM_ClockDivision = 0; + TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; + TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure); + + /* TIM6 TRGO selection */ + + TIM_SelectOutputTrigger(TIM6, TIM_TRGOSource_Update); + + /* TIM6 enable counter */ + + TIM_Cmd(TIM6, ENABLE); +} + +/* Sets up tim7 to run at a high sample rate */ +void tim7_config(void) +{ + /* Set up tim7 */ + + + TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; + + /* TIM7 Periph clock enable */ + RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM7, ENABLE); + + /* -------------------------------------------------------- + + + TIM7 input clock (TIM7CLK) is set to 2 * APB1 clock (PCLK1), since + APB1 prescaler is different from 1 (see system_stm32f4xx.c and Fig + 13 clock tree figure in DM0031020.pdf). + + Sample rate Fs = 2*PCLK1/TIM_ClockDivision + = (HCLK/2)/TIM_ClockDivision + + ----------------------------------------------------------- */ + + /* Time base configuration */ + + TIM_TimeBaseStructInit(&TIM_TimeBaseStructure); + TIM_TimeBaseStructure.TIM_Period = 41; + TIM_TimeBaseStructure.TIM_Prescaler = 0; + TIM_TimeBaseStructure.TIM_ClockDivision = 0; + TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; + TIM_TimeBaseInit(TIM7, &TIM_TimeBaseStructure); + + /* TIM7 TRGO selection */ + + TIM_SelectOutputTrigger(TIM7, TIM_TRGOSource_Update); + + /* TIM7 enable counter */ + + TIM_Cmd(TIM7, ENABLE); +} + +static void dac1_config(void) +{ + DAC_InitTypeDef DAC_InitStructure; + DMA_InitTypeDef DMA_InitStructure; + NVIC_InitTypeDef NVIC_InitStructure; + + /* DAC channel 1 Configuration */ + + /* + This line fixed a bug that cost me 5 days, bad wave amplitude + value, and some STM32F4 periph library bugs caused triangle wave + geneartion to be enable resulting in a low level tone on the + SM1000, that we thought was caused by analog issues like layour + or power supply biasing + */ + DAC_StructInit(&DAC_InitStructure); + + DAC_InitStructure.DAC_Trigger = DAC_Trigger_T7_TRGO; + DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None; + + /*External buffering is needed to get nice square samples at Fs=2Mhz. See DM00129215.pdf */ + DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable; + DAC_Init(DAC_Channel_1, &DAC_InitStructure); + + /* DMA1_Stream5 channel7 configuration **************************************/ + /* Table 35 page 219 of the monster data sheet */ + + DMA_DeInit(DMA1_Stream5); + DMA_InitStructure.DMA_Channel = DMA_Channel_7; + DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)DAC_DHR12R1_ADDRESS; + DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)dac1_buf; + DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral; + DMA_InitStructure.DMA_BufferSize = DAC_DUC_BUF_SZ; + DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; + DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; + DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; + DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; + DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; + DMA_InitStructure.DMA_Priority = DMA_Priority_High; + DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; + DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull; + DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; + DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; + DMA_Init(DMA1_Stream5, &DMA_InitStructure); + + /* Enable DMA Half & Complete interrupts */ + + DMA_ITConfig(DMA1_Stream5, DMA_IT_TC | DMA_IT_HT, ENABLE); + + /* Enable the DMA Stream IRQ Channel */ + + NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream5_IRQn; + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; + NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; + NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; + NVIC_Init(&NVIC_InitStructure); + + /* Enable DMA1_Stream5 */ + + DMA_Cmd(DMA1_Stream5, ENABLE); + + /* Enable DAC Channel 1 */ + + DAC_Cmd(DAC_Channel_1, ENABLE); + + /* Enable DMA for DAC Channel 1 */ + + DAC_DMACmd(DAC_Channel_1, ENABLE); +} + +static void dac2_config(void) +{ + DAC_InitTypeDef DAC_InitStructure; + DMA_InitTypeDef DMA_InitStructure; + NVIC_InitTypeDef NVIC_InitStructure; + + /* DAC channel 2 Configuration (see notes in dac1_config() above) */ + + DAC_StructInit(&DAC_InitStructure); + DAC_InitStructure.DAC_Trigger = DAC_Trigger_T6_TRGO; + DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None; + DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Enable; + DAC_Init(DAC_Channel_2, &DAC_InitStructure); + + /* DMA1_Stream6 channel7 configuration **************************************/ + + DMA_DeInit(DMA1_Stream6); + DMA_InitStructure.DMA_Channel = DMA_Channel_7; + DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)DAC_DHR12R2_ADDRESS; + DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)dac2_buf; + DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral; + DMA_InitStructure.DMA_BufferSize = DAC_BUF_SZ; + DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; + DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; + DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; + DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; + DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; + DMA_InitStructure.DMA_Priority = DMA_Priority_High; + DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; + DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull; + DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; + DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; + DMA_Init(DMA1_Stream6, &DMA_InitStructure); + + /* Enable DMA Half & Complete interrupts */ + + DMA_ITConfig(DMA1_Stream6, DMA_IT_TC | DMA_IT_HT, ENABLE); + + /* Enable the DMA Stream IRQ Channel */ + + NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream6_IRQn; + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; + NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; + NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; + NVIC_Init(&NVIC_InitStructure); + + /* Enable DMA1_Stream6 */ + + DMA_Cmd(DMA1_Stream6, ENABLE); + + /* Enable DAC Channel 2 */ + + DAC_Cmd(DAC_Channel_2, ENABLE); + + /* Enable DMA for DAC Channel 2 */ + + DAC_DMACmd(DAC_Channel_2, ENABLE); + +} + +/******************************************************************************/ +/* STM32F4xx Peripherals Interrupt Handlers */ +/* Add here the Interrupt Handler for the used peripheral(s) (PPP), for the */ +/* available peripheral interrupt handler's name please refer to the startup */ +/* file (startup_stm32f40xx.s/startup_stm32f427x.s). */ +/******************************************************************************/ + +/* + This function handles DMA1 Stream 5 interrupt request for DAC1. +*/ + +void DMA1_Stream5_IRQHandler(void) { + GPIOE->ODR |= (1 << 1); + + /* Transfer half empty interrupt - refill first half */ + + if(DMA_GetITStatus(DMA1_Stream5, DMA_IT_HTIF5) != RESET) { + /* fill first half from fifo */ + fifo_read(dac1_fifo, (short*)dac1_buf, DAC_DUC_BUF_SZ/2); + + /* Clear DMA Stream Transfer Complete interrupt pending bit */ + DMA_ClearITPendingBit(DMA1_Stream5, DMA_IT_HTIF5); + } + + /* Transfer complete interrupt - refill 2nd half */ + + if(DMA_GetITStatus(DMA1_Stream5, DMA_IT_TCIF5) != RESET) { + /* fill second half from fifo */ + fifo_read(dac1_fifo, (short*)(dac1_buf+DAC_DUC_BUF_SZ/2), DAC_DUC_BUF_SZ/2); + + /* Clear DMA Stream Transfer Complete interrupt pending bit */ + DMA_ClearITPendingBit(DMA1_Stream5, DMA_IT_TCIF5); + } + + GPIOE->ODR &= ~(1 << 1); +} + +/* + This function handles DMA1 Stream 6 interrupt request for DAC2. +*/ + +void DMA1_Stream6_IRQHandler(void) { + int i, j, sam; + short signed_buf[DAC_BUF_SZ/2]; + + GPIOE->ODR |= (1 << 2); + + /* Transfer half empty interrupt - refill first half */ + + if(DMA_GetITStatus(DMA1_Stream6, DMA_IT_HTIF6) != RESET) { + /* fill first half from fifo */ + + if (fifo_read(dac2_fifo, signed_buf, DAC_BUF_SZ/2) == -1) { + memset(signed_buf, 0, sizeof(short)*DAC_BUF_SZ/2); + dac_underflow++; + } + + /* convert to unsigned */ + + for(i=0; iODR &= ~(1 << 2); +} + diff --git a/codec2/tags/0.4.1/stm32/src/stm32f4_machdep.c b/codec2/tags/0.4.1/stm32/src/stm32f4_machdep.c new file mode 100644 index 00000000..5dd39c4c --- /dev/null +++ b/codec2/tags/0.4.1/stm32/src/stm32f4_machdep.c @@ -0,0 +1,86 @@ + +/*---------------------------------------------------------------------------*\ + + FILE........: stm32f4_machdep.c + AUTHOR......: David Rowe + DATE CREATED: May 2 2013 + + STM32F4 implementation of the machine dependant timer functions, + e.g. profiling using a clock cycle counter.. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2013 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 . +*/ + +#include +#include "machdep.h" +#include "gdb_stdio.h" + +volatile unsigned int *DWT_CYCCNT = (volatile unsigned int *)0xE0001004; +volatile unsigned int *DWT_CONTROL = (volatile unsigned int *)0xE0001000; +volatile unsigned int *SCB_DEMCR = (volatile unsigned int *)0xE000EDFC; + +#define CORE_CLOCK 168E6 +#define BUF_SZ 4096 + +static char buf[BUF_SZ]; + +void machdep_profile_init(void) +{ + static int enabled = 0; + + if (!enabled) { + *SCB_DEMCR = *SCB_DEMCR | 0x01000000; + *DWT_CYCCNT = 0; // reset the counter + *DWT_CONTROL = *DWT_CONTROL | 1 ; // enable the counter + + enabled = 1; + } + *buf = 0; +} + +void machdep_profile_reset(void) +{ + *DWT_CYCCNT = 0; // reset the counter +} + +unsigned int machdep_profile_sample(void) { + return *DWT_CYCCNT; +} + +/* log to a buffer, we only call printf after timing finished as it is slow */ + +unsigned int machdep_profile_sample_and_log(unsigned int start, char s[]) +{ + char tmp[80]; + float msec; + + unsigned int dwt = *DWT_CYCCNT - start; + msec = 1000.0*(float)dwt/CORE_CLOCK; + sprintf(tmp, "%s %5.2f msecs\n",s,(double)msec); + if ((strlen(buf) + strlen(tmp)) < BUF_SZ) + strcat(buf, tmp); + return *DWT_CYCCNT; +} + +void machdep_profile_print_logged_samples(void) +{ + gdb_stdio_printf("%s", buf); + *buf = 0; +} + diff --git a/codec2/tags/0.4.1/stm32/src/stm32f4_pwm.c b/codec2/tags/0.4.1/stm32/src/stm32f4_pwm.c new file mode 100644 index 00000000..2d467e00 --- /dev/null +++ b/codec2/tags/0.4.1/stm32/src/stm32f4_pwm.c @@ -0,0 +1,239 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: stm32f4_pwm.c + AUTHOR......: David Rowe + DATE CREATED: 26 June 2013 + + PWM driver module for STM32F4. + + TODO: + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2013 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 . +*/ + + +#include +#include +#include +#include "gdb_stdio.h" + +#include "stm32f4xx_gpio.h" +#include "stm32f4xx_rcc.h" + +#define TIM1_CCR3_ADDRESS 0x4001003C +//#define TIM1_CCR3_ADDRESS 0x4001223C +#define SINE_SAMPLES 32 + +TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; +TIM_OCInitTypeDef TIM_OCInitStructure; +uint16_t uhTimerPeriod; +uint16_t aSRC_Buffer[SINE_SAMPLES] = {0, 0, 0}; + +/* 32 sample sine wave which at Fs=16kHz will be 500Hz. Not sampels + are 16 bit 2's complement, the DAC driver convertsto 12 bit + unsigned. */ + +short aSine[SINE_SAMPLES] = { + -16, 6384, 12528, 18192, 23200, 27232, 30256, 32128, 32752, 32128, + 30256, 27232, 23152, 18192, 12528, 6384, -16, -6416, -12560, -18224, + -23184, -27264, -30288, -32160, -32768, -32160, -30288, -27264, -23184, -18224, + -12560, -6416 +}; + +void Timer1Config(); + +#define FS 16000 + +int main(void){ + Timer1Config(); + while(1); +} + +/* DR: TIM_Config configures a couple of I/O pins for PWM output from + Timer1 Channel 3. Note I dont think any of this is needed, except + perhaps to check timer frequency. Can be removed down the track. */ + +/** + * @brief Configure the TIM1 Pins. + * @param None + * @retval None + */ +static void TIM_Config(void) +{ + GPIO_InitTypeDef GPIO_InitStructure; + DMA_InitTypeDef DMA_InitStructure; + + /* GPIOA and GPIOB clock enable */ + RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB, ENABLE); + + /* GPIOA Configuration: Channel 3 as alternate function push-pull */ + + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 ; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ; + GPIO_Init(GPIOA, &GPIO_InitStructure); + GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_TIM1); + + /* GPIOB Configuration: Channel 3N as alternate function push-pull */ + + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15; + GPIO_Init(GPIOB, &GPIO_InitStructure); + GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_TIM1); + +#ifdef DR_OFF + /* DMA clock enable */ + RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2 , ENABLE); + + DMA_DeInit(DMA2_Stream6); + DMA_InitStructure.DMA_Channel = DMA_Channel_6; + DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(TIM1_CCR3_ADDRESS) ; + DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)aSRC_Buffer; + DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral; + DMA_InitStructure.DMA_BufferSize = SINE_SAMPLES; + DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; + DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; + DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; + DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_HalfWord; + DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; + DMA_InitStructure.DMA_Priority = DMA_Priority_High; + DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; + DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full; + DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; + DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; + + DMA_Init(DMA2_Stream6, &DMA_InitStructure); +#endif +} + +void Timer1Config() { + int i; + + /* TIM Configuration */ + + TIM_Config(); + + /* TIM1 example ------------------------------------------------- + + TIM1 input clock (TIM1CLK) is set to 2 * APB2 clock (PCLK2), since APB2 + prescaler is different from 1. + TIM1CLK = 2 * PCLK2 + PCLK2 = HCLK / 2 + => TIM1CLK = 2 * (HCLK / 2) = HCLK = SystemCoreClock + + TIM1CLK = SystemCoreClock, Prescaler = 0, TIM1 counter clock = SystemCoreClock + SystemCoreClock is set to 168 MHz for STM32F4xx devices. + + The objective is to configure TIM1 channel 3 to generate complementary PWM + signal with a frequency equal to F KHz: + - TIM1_Period = (SystemCoreClock / F) - 1 + + The number of this repetitive requests is defined by the TIM1 Repetion counter, + each 3 Update Requests, the TIM1 Channel 3 Duty Cycle changes to the next new + value defined by the aSRC_Buffer. + + Note: + SystemCoreClock variable holds HCLK frequency and is defined in system_stm32f4xx.c file. + Each time the core clock (HCLK) changes, user had to call SystemCoreClockUpdate() + function to update SystemCoreClock variable value. Otherwise, any configuration + based on this variable will be incorrect. + -----------------------------------------------------------------------------*/ + + /* Compute the value to be set in ARR regiter to generate signal frequency at FS */ + +#ifdef TMP + uhTimerPeriod = (SystemCoreClock / FS ) - 1; + //gdb_stdio_printf("uhTimerPeriod = %d\n", uhTimerPeriod); + + /* Compute CCR1 values to generate a duty cycle at 50% */ + + for(i=0; i
© COPYRIGHT 2011 STMicroelectronics
+ ****************************************************************************** + */ + +/** @addtogroup CMSIS + * @{ + */ + +/** @addtogroup stm32f4xx_system + * @{ + */ + +/** @addtogroup STM32F4xx_System_Private_Includes + * @{ + */ + +#include "stm32f4xx.h" + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_Defines + * @{ + */ + +/************************* Miscellaneous Configuration ************************/ +/*!< Uncomment the following line if you need to use external SRAM mounted + on STM324xG_EVAL board as data memory */ +/* #define DATA_IN_ExtSRAM */ + +/*!< Uncomment the following line if you need to relocate your vector Table in + Internal SRAM. */ +/* #define VECT_TAB_SRAM */ +#define VECT_TAB_OFFSET 0x00 /*!< Vector Table base offset field. + This value must be a multiple of 0x200. */ +/******************************************************************************/ + +/************************* PLL Parameters *************************************/ +/* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N */ +#define PLL_M 8 +#define PLL_N 336 + +/* SYSCLK = PLL_VCO / PLL_P */ +#define PLL_P 2 + +/* USB OTG FS, SDIO and RNG Clock = PLL_VCO / PLLQ */ +#define PLL_Q 7 + +/* PLLI2S_VCO = (HSE_VALUE Or HSI_VALUE / PLL_M) * PLLI2S_N + I2SCLK = PLLI2S_VCO / PLLI2S_R */ +#define START_I2SCLOCK 0 +#define PLLI2S_N 352 +#define PLLI2S_R 2 + +/******************************************************************************/ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_Variables + * @{ + */ + +uint32_t SystemCoreClock = 168000000; + +__I uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9}; + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_FunctionPrototypes + * @{ + */ + +static void SetSysClock(void); +#ifdef DATA_IN_ExtSRAM +static void SystemInit_ExtMemCtl(void); +#endif /* DATA_IN_ExtSRAM */ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_Functions + * @{ + */ + +/** + * @brief Setup the microcontroller system + * Initialize the Embedded Flash Interface, the PLL and update the + * SystemFrequency variable. + * @param None + * @retval None + */ +void SystemInit(void) +{ + /* FPU settings ------------------------------------------------------------*/ +#if (__FPU_PRESENT == 1) && (__FPU_USED == 1) + SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 Full Access */ +#endif + /* Reset the RCC clock configuration to the default reset state ------------*/ + /* Set HSION bit */ + RCC->CR |= (uint32_t)0x00000001; + + /* Reset CFGR register */ + RCC->CFGR = 0x00000000; + + /* Reset HSEON, CSSON and PLLON bits */ + RCC->CR &= (uint32_t)0xFEF6FFFF; + + /* Reset PLLCFGR register */ + RCC->PLLCFGR = 0x24003010; + + /* Reset HSEBYP bit */ + RCC->CR &= (uint32_t)0xFFFBFFFF; + + /* Disable all interrupts */ + RCC->CIR = 0x00000000; + +#ifdef DATA_IN_ExtSRAM + SystemInit_ExtMemCtl(); +#endif /* DATA_IN_ExtSRAM */ + + /* Configure the System clock source, PLL Multiplier and Divider factors, + AHB/APBx prescalers and Flash settings ----------------------------------*/ + SetSysClock(); + + /* Configure the Vector Table location add offset address ------------------*/ +#ifdef VECT_TAB_SRAM + SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */ +#else + SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */ +#endif +} + +/** + * @brief Update SystemCoreClock variable according to Clock Register Values. + * The SystemCoreClock variable contains the core clock (HCLK), it can + * be used by the user application to setup the SysTick timer or configure + * other parameters. + * + * @note Each time the core clock (HCLK) changes, this function must be called + * to update SystemCoreClock variable value. Otherwise, any configuration + * based on this variable will be incorrect. + * + * @note - The system frequency computed by this function is not the real + * frequency in the chip. It is calculated based on the predefined + * constant and the selected clock source: + * + * - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(*) + * + * - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(**) + * + * - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(**) + * or HSI_VALUE(*) multiplied/divided by the PLL factors. + * + * (*) HSI_VALUE is a constant defined in stm32f4xx.h file (default value + * 16 MHz) but the real value may vary depending on the variations + * in voltage and temperature. + * + * (**) HSE_VALUE is a constant defined in stm32f4xx.h file (default value + * 25 MHz), user has to ensure that HSE_VALUE is same as the real + * frequency of the crystal used. Otherwise, this function may + * have wrong result. + * + * - The result of this function could be not correct when using fractional + * value for HSE crystal. + * + * @param None + * @retval None + */ +void SystemCoreClockUpdate(void) +{ + uint32_t tmp = 0, pllvco = 0, pllp = 2, pllsource = 0, pllm = 2; + + /* Get SYSCLK source -------------------------------------------------------*/ + tmp = RCC->CFGR & RCC_CFGR_SWS; + + switch (tmp) + { + case 0x00: /* HSI used as system clock source */ + SystemCoreClock = HSI_VALUE; + break; + case 0x04: /* HSE used as system clock source */ + SystemCoreClock = HSE_VALUE; + break; + case 0x08: /* PLL used as system clock source */ + + /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N + SYSCLK = PLL_VCO / PLL_P + */ + pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) >> 22; + pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM; + + if (pllsource != 0) + { + /* HSE used as PLL clock source */ + pllvco = (HSE_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6); + } + else + { + /* HSI used as PLL clock source */ + pllvco = (HSI_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6); + } + + pllp = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >>16) + 1 ) *2; + SystemCoreClock = pllvco/pllp; + break; + default: + SystemCoreClock = HSI_VALUE; + break; + } + /* Compute HCLK frequency --------------------------------------------------*/ + /* Get HCLK prescaler */ + tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> 4)]; + /* HCLK frequency */ + SystemCoreClock >>= tmp; +} + +/** + * @brief Configures the System clock source, PLL Multiplier and Divider factors, + * AHB/APBx prescalers and Flash settings + * @Note This function should be called only once the RCC clock configuration + * is reset to the default reset state (done in SystemInit() function). + * @param None + * @retval None + */ +static void SetSysClock(void) +{ + /******************************************************************************/ + /* PLL (clocked by HSE) used as System clock source */ + /******************************************************************************/ + __IO uint32_t StartUpCounter = 0, HSEStatus = 0; + + /* Enable HSE */ + RCC->CR |= ((uint32_t)RCC_CR_HSEON); + + /* Wait till HSE is ready and if Time out is reached exit */ + do + { + HSEStatus = RCC->CR & RCC_CR_HSERDY; + StartUpCounter++; + } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT)); + + if ((RCC->CR & RCC_CR_HSERDY) != RESET) + { + HSEStatus = (uint32_t)0x01; + } + else + { + HSEStatus = (uint32_t)0x00; + } + + if (HSEStatus == (uint32_t)0x01) + { + /* Select regulator voltage output Scale 1 mode, System frequency up to 168 MHz */ + RCC->APB1ENR |= RCC_APB1ENR_PWREN; + PWR->CR |= PWR_CR_VOS; + + /* HCLK = SYSCLK / 1*/ + RCC->CFGR |= RCC_CFGR_HPRE_DIV1; + + /* PCLK2 = HCLK / 2*/ + RCC->CFGR |= RCC_CFGR_PPRE2_DIV2; + + /* PCLK1 = HCLK / 4*/ + RCC->CFGR |= RCC_CFGR_PPRE1_DIV4; + + /* Configure the main PLL */ + RCC->PLLCFGR = PLL_M | (PLL_N << 6) | (((PLL_P >> 1) -1) << 16) | + (RCC_PLLCFGR_PLLSRC_HSE) | (PLL_Q << 24); + + /* Enable the main PLL */ + RCC->CR |= RCC_CR_PLLON; + + /* Wait till the main PLL is ready */ + while((RCC->CR & RCC_CR_PLLRDY) == 0) + { + } + + /* Configure Flash prefetch, Instruction cache, Data cache and wait state */ + FLASH->ACR = FLASH_ACR_ICEN |FLASH_ACR_DCEN |FLASH_ACR_LATENCY_5WS; + + /* Select the main PLL as system clock source */ + RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW)); + RCC->CFGR |= RCC_CFGR_SW_PLL; + + /* Wait till the main PLL is used as system clock source */ + while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS ) != RCC_CFGR_SWS_PLL); + { + } + } + else + { /* If HSE fails to start-up, the application will have wrong clock + configuration. User can add here some code to deal with this error */ + } + + + /******************************************************************************/ + /* I2S clock configuration */ + /******************************************************************************/ + +#if START_I2SCLOCK + /* PLLI2S clock used as I2S clock source */ + RCC->CFGR &= ~RCC_CFGR_I2SSRC; + + /* Configure PLLI2S */ + RCC->PLLI2SCFGR = (PLLI2S_N << 6) | (PLLI2S_R << 28); + + /* Enable PLLI2S */ + RCC->CR |= ((uint32_t)RCC_CR_PLLI2SON); + + /* Wait till PLLI2S is ready */ + while((RCC->CR & RCC_CR_PLLI2SRDY) == 0) + { + } +#endif +} + +/** + * @brief Setup the external memory controller. Called in startup_stm32f4xx.s + * before jump to __main + * @param None + * @retval None + */ +#ifdef DATA_IN_ExtSRAM +/** + * @brief Setup the external memory controller. + * Called in startup_stm32f4xx.s before jump to main. + * This function configures the external SRAM mounted on STM324xG_EVAL board + * This SRAM will be used as program data memory (including heap and stack). + * @param None + * @retval None + */ +void SystemInit_ExtMemCtl(void) +{ + /*-- GPIOs Configuration -----------------------------------------------------*/ + /* + +-------------------+--------------------+------------------+------------------+ + + SRAM pins assignment + + +-------------------+--------------------+------------------+------------------+ + | PD0 <-> FSMC_D2 | PE0 <-> FSMC_NBL0 | PF0 <-> FSMC_A0 | PG0 <-> FSMC_A10 | + | PD1 <-> FSMC_D3 | PE1 <-> FSMC_NBL1 | PF1 <-> FSMC_A1 | PG1 <-> FSMC_A11 | + | PD4 <-> FSMC_NOE | PE3 <-> FSMC_A19 | PF2 <-> FSMC_A2 | PG2 <-> FSMC_A12 | + | PD5 <-> FSMC_NWE | PE4 <-> FSMC_A20 | PF3 <-> FSMC_A3 | PG3 <-> FSMC_A13 | + | PD8 <-> FSMC_D13 | PE7 <-> FSMC_D4 | PF4 <-> FSMC_A4 | PG4 <-> FSMC_A14 | + | PD9 <-> FSMC_D14 | PE8 <-> FSMC_D5 | PF5 <-> FSMC_A5 | PG5 <-> FSMC_A15 | + | PD10 <-> FSMC_D15 | PE9 <-> FSMC_D6 | PF12 <-> FSMC_A6 | PG9 <-> FSMC_NE2 | + | PD11 <-> FSMC_A16 | PE10 <-> FSMC_D7 | PF13 <-> FSMC_A7 |------------------+ + | PD12 <-> FSMC_A17 | PE11 <-> FSMC_D8 | PF14 <-> FSMC_A8 | + | PD13 <-> FSMC_A18 | PE12 <-> FSMC_D9 | PF15 <-> FSMC_A9 | + | PD14 <-> FSMC_D0 | PE13 <-> FSMC_D10 |------------------+ + | PD15 <-> FSMC_D1 | PE14 <-> FSMC_D11 | + | | PE15 <-> FSMC_D12 | + +-------------------+--------------------+ + */ + /* Enable GPIOD, GPIOE, GPIOF and GPIOG interface clock */ + RCC->AHB1ENR = 0x00000078; + + /* Connect PDx pins to FSMC Alternate function */ + GPIOD->AFR[0] = 0x00cc00cc; + GPIOD->AFR[1] = 0xcc0ccccc; + /* Configure PDx pins in Alternate function mode */ + GPIOD->MODER = 0xaaaa0a0a; + /* Configure PDx pins speed to 100 MHz */ + GPIOD->OSPEEDR = 0xffff0f0f; + /* Configure PDx pins Output type to push-pull */ + GPIOD->OTYPER = 0x00000000; + /* No pull-up, pull-down for PDx pins */ + GPIOD->PUPDR = 0x00000000; + + /* Connect PEx pins to FSMC Alternate function */ + GPIOE->AFR[0] = 0xc00cc0cc; + GPIOE->AFR[1] = 0xcccccccc; + /* Configure PEx pins in Alternate function mode */ + GPIOE->MODER = 0xaaaa828a; + /* Configure PEx pins speed to 100 MHz */ + GPIOE->OSPEEDR = 0xffffc3cf; + /* Configure PEx pins Output type to push-pull */ + GPIOE->OTYPER = 0x00000000; + /* No pull-up, pull-down for PEx pins */ + GPIOE->PUPDR = 0x00000000; + + /* Connect PFx pins to FSMC Alternate function */ + GPIOF->AFR[0] = 0x00cccccc; + GPIOF->AFR[1] = 0xcccc0000; + /* Configure PFx pins in Alternate function mode */ + GPIOF->MODER = 0xaa000aaa; + /* Configure PFx pins speed to 100 MHz */ + GPIOF->OSPEEDR = 0xff000fff; + /* Configure PFx pins Output type to push-pull */ + GPIOF->OTYPER = 0x00000000; + /* No pull-up, pull-down for PFx pins */ + GPIOF->PUPDR = 0x00000000; + + /* Connect PGx pins to FSMC Alternate function */ + GPIOG->AFR[0] = 0x00cccccc; + GPIOG->AFR[1] = 0x000000c0; + /* Configure PGx pins in Alternate function mode */ + GPIOG->MODER = 0x00080aaa; + /* Configure PGx pins speed to 100 MHz */ + GPIOG->OSPEEDR = 0x000c0fff; + /* Configure PGx pins Output type to push-pull */ + GPIOG->OTYPER = 0x00000000; + /* No pull-up, pull-down for PGx pins */ + GPIOG->PUPDR = 0x00000000; + + /*-- FSMC Configuration ------------------------------------------------------*/ + /* Enable the FSMC interface clock */ + RCC->AHB3ENR = 0x00000001; + + /* Configure and enable Bank1_SRAM2 */ + FSMC_Bank1->BTCR[2] = 0x00001015; + FSMC_Bank1->BTCR[3] = 0x00010603; + FSMC_Bank1E->BWTR[2] = 0x0fffffff; + /* + Bank1_SRAM2 is configured as follow: + + p.FSMC_AddressSetupTime = 3; + p.FSMC_AddressHoldTime = 0; + p.FSMC_DataSetupTime = 6; + p.FSMC_BusTurnAroundDuration = 1; + p.FSMC_CLKDivision = 0; + p.FSMC_DataLatency = 0; + p.FSMC_AccessMode = FSMC_AccessMode_A; + + FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM2; + FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable; + FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_PSRAM; + FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b; + FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable; + FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait = FSMC_AsynchronousWait_Disable; + FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low; + FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable; + FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState; + FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable; + FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable; + FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable; + FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable; + FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p; + FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p; + */ +} +#endif /* DATA_IN_ExtSRAM */ + + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/codec2/tags/0.4.1/stm32/src/timer_ut.c b/codec2/tags/0.4.1/stm32/src/timer_ut.c new file mode 100644 index 00000000..967c87df --- /dev/null +++ b/codec2/tags/0.4.1/stm32/src/timer_ut.c @@ -0,0 +1,179 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: timer_ut.c + AUTHOR......: David Rowe + DATE CREATED: 3 Jan 2014 + + Unit test STM32F4 timer hardware. + +\*---------------------------------------------------------------------------*/ + +/* + 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 . +*/ + +#include +#include +#include + +#include "stm32f4xx_gpio.h" +#include "stm32f4xx_rcc.h" + +#include "gdb_stdio.h" + +#define TIM1_CCR3_ADDRESS 0x4001223C + +TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; +TIM_OCInitTypeDef TIM_OCInitStructure; +TIM_BDTRInitTypeDef TIM_BDTRInitStructure; +uint16_t uhTimerPeriod; +uint16_t aSRC_Buffer[3] = {0, 0, 0}; + +void Timer1Config(); +#define FS 3500000 + +int main(void){ + Timer1Config(); + } + +/* DR: TIM_Config configures a couple of I/O pins for PWM output from + Timer1 Channel 3. Note I dont think any of this is needed, except + perhaps to check timer frequency. Can be removed down the track. */ + +/** + * @brief Configure the TIM1 Pins. + * @param None + * @retval None + */ +static void TIM_Config(void) +{ + GPIO_InitTypeDef GPIO_InitStructure; + + /* GPIOA and GPIOB clock enable */ + RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB, ENABLE); + + /* GPIOA Configuration: Channel 3 as alternate function push-pull */ + /* Discovery board pin PA10 */ + + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 ; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ; + GPIO_Init(GPIOA, &GPIO_InitStructure); + GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_TIM1); + + /* GPIOB Configuration: Channel 3N as alternate function push-pull */ + /* Discovery board pin PB15 */ + + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15; + GPIO_Init(GPIOB, &GPIO_InitStructure); + GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_TIM1); +} + +void Timer1Config() { + + /* TIM Configuration */ + + TIM_Config(); + + /* TIM1 example ------------------------------------------------- + + TIM1 input clock (TIM1CLK) is set to 2 * APB2 clock (PCLK2), since APB2 + prescaler is different from 1. + TIM1CLK = 2 * PCLK2 + PCLK2 = HCLK / 2 + => TIM1CLK = 2 * (HCLK / 2) = HCLK = SystemCoreClock + + TIM1CLK = SystemCoreClock, Prescaler = 0, TIM1 counter clock = SystemCoreClock + SystemCoreClock is set to 168 MHz for STM32F4xx devices. + + The objective is to configure TIM1 channel 3 to generate complementary PWM + signal with a frequency equal to F KHz: + - TIM1_Period = (SystemCoreClock / F) - 1 + + The number of this repetitive requests is defined by the TIM1 Repetion counter, + each 3 Update Requests, the TIM1 Channel 3 Duty Cycle changes to the next new + value defined by the aSRC_Buffer. + + Note: + SystemCoreClock variable holds HCLK frequency and is defined in system_stm32f4xx.c file. + Each time the core clock (HCLK) changes, user had to call SystemCoreClockUpdate() + function to update SystemCoreClock variable value. Otherwise, any configuration + based on this variable will be incorrect. + -----------------------------------------------------------------------------*/ + + /* Compute the value to be set in ARR regiter to generate signal frequency at FS Hz */ + uhTimerPeriod = (SystemCoreClock / FS ) - 1; + /* Compute CCR1 value to generate a duty cycle at 50% */ + aSRC_Buffer[0] = (uint16_t) (((uint32_t) 5 * (uhTimerPeriod - 1)) / 10); + /* Compute CCR1 value to generate a duty cycle at 37.5% */ + aSRC_Buffer[1] = (uint16_t) (((uint32_t) 375 * (uhTimerPeriod - 1)) / 1000); + /* Compute CCR1 value to generate a duty cycle at 25% */ + aSRC_Buffer[2] = (uint16_t) (((uint32_t) 25 * (uhTimerPeriod - 1)) / 100); + + /* TIM1 Peripheral Configuration -------------------------------------------*/ + /* TIM1 clock enable */ + RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); + + /* Time Base configuration */ + + TIM_DeInit(TIM1); + TIM_TimeBaseStructure.TIM_Prescaler = 0; + TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; + TIM_TimeBaseStructure.TIM_Period = uhTimerPeriod; + TIM_TimeBaseStructure.TIM_ClockDivision = 0; + TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; + + TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); + + /* Channel 3 Configuration in PWM mode */ + + /* I think we just ned to enable channel 3 somehow, but without + (or optionally with) actual ouput to a GPIO pin. */ + + TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; + TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; + TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable; + TIM_OCInitStructure.TIM_Pulse = aSRC_Buffer[0]; + TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; + TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low; + TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set; + TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset; + + TIM_OC3Init(TIM1, &TIM_OCInitStructure); + + /* Enable preload feature */ + TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable); + + /* Automatic Output enable, Break, dead time and lock configuration*/ + TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable; + TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable; + //TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_1; + TIM_BDTRInitStructure.TIM_DeadTime = 11; + //TIM_BDTRInitStructure.TIM_Break = TIM_Break_Enable; + //TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_High; + TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable; + + TIM_BDTRConfig(TIM1, &TIM_BDTRInitStructure); + + /* TIM1 counter enable */ + TIM_Cmd(TIM1, ENABLE); + + /* Main Output Enable */ + TIM_CtrlPWMOutputs(TIM1, ENABLE); +} + diff --git a/codec2/tags/0.4.1/stm32/src/tuner_ut.c b/codec2/tags/0.4.1/stm32/src/tuner_ut.c new file mode 100644 index 00000000..ac522000 --- /dev/null +++ b/codec2/tags/0.4.1/stm32/src/tuner_ut.c @@ -0,0 +1,122 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: tuner_ut.c + AUTHOR......: David Rowe + DATE CREATED: 20 Feb 2015 + + Unit test for high speed ADC radio tuner, samples signal centred at + 500kHz using Fs=2 MHz and uploads to host at Fs=10 kHz. + +\*---------------------------------------------------------------------------*/ + +/* + 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 . +*/ + +#include +#include +#include "gdb_stdio.h" +#include "stm32f4_dac.h" +#include "stm32f4_adc_tuner.h" +#include "iir_tuner.h" +#include "sm1000_leds_switches.h" +#include "../src/codec2_fm.h" +#include "stm32f4xx.h" + +#define REC_TIME_SECS 10 +#define FS 50000 +#define N 5000 + +extern int adc_overflow1; + +int main(void) { + float tuner_out[IIR_TUNER_DEC_50_10_FILT_MEM+N/2]; + float fm_out[N/2]; + //float dec_10[(N/2)/5]; + short dec_10_short[(N/2)]; + int bufs, i, j, k, fifo_sz, bn; + FILE *ftuner; + struct FM *fm; + + ftuner = fopen("tuner.raw", "wb"); + if (ftuner == NULL) { + printf("Error opening input file: tuner.raw\n\nTerminating....\n"); + exit(1); + } + bufs = FS*REC_TIME_SECS/N; + fifo_sz = ((4*N/ADC_TUNER_N)+1)*ADC_TUNER_N; + printf("Starting! bufs: %d %d\n", bufs, fifo_sz); + + //dac_open(DAC_BUF_SZ); + adc_open(fifo_sz); + sm1000_leds_switches_init(); + + fm = fm_create(N/2); + fm->Fs = 44400.0; + fm->fm_max = 3000.0; + fm->fd = 5000.0; + fm->fc = fm->Fs/4; + + i = 0; bn = 0; + while(1) { + /* wait for buffer of Fs=50kHz tuner output samples */ + + while(adc1_read((short *)&tuner_out[IIR_TUNER_DEC_50_10_FILT_MEM], N) == -1); + + /* The semi-hosting system can only handle Fs=16kHz and below so resample down + to Fs=10 kHz and convert to shorts */ + + #ifdef SSB + iir_tuner_dec_50_to_10(dec_10, &tuner_out[IIR_TUNER_DEC_50_10_FILT_MEM], N/2); + for(j=0; jODR |= (1 << 3); + /* + for(j=0; jODR &= ~(1 << 3); + + for(j=0,k=0; j +#include +#include "stm32f4_usb_vcp.h" +#include "sm1000_leds_switches.h" + +volatile uint32_t ticker, downTicker; + +int main(void) { + + sm1000_leds_switches_init(); + usb_vcp_init(); + SysTick_Config(SystemCoreClock/1000); + + while (1) { + + /* Blink the orange LED at 1Hz */ + + if (500 == ticker) { + GPIOD->BSRRH = GPIO_Pin_13; + } + else if (1000 == ticker) { + ticker = 0; + GPIOD->BSRRL = GPIO_Pin_13; + } + + + /* If there's data on the virtual serial port: + * - Echo it back + * - Turn the green LED on for 10ms + */ + uint8_t theByte; + if (VCP_get_char(&theByte)) { + VCP_put_char(theByte); + + + GPIOD->BSRRL = GPIO_Pin_12; + downTicker = 10; + } + if (0 == downTicker) { + GPIOD->BSRRH = GPIO_Pin_12; + } + } + + return 0; +} + +/* + * Interrupt Handler + */ + +void SysTick_Handler(void) +{ + ticker++; + if (downTicker > 0) + { + downTicker--; + } +} + diff --git a/codec2/tags/0.4.1/stm32/src/usb_vsp_ut.c b/codec2/tags/0.4.1/stm32/src/usb_vsp_ut.c new file mode 100644 index 00000000..8f0c9f4d --- /dev/null +++ b/codec2/tags/0.4.1/stm32/src/usb_vsp_ut.c @@ -0,0 +1,192 @@ + +#define HSE_VALUE ((uint32_t)8000000) /* STM32 discovery uses a 8Mhz external crystal */ + +#include "stm32f4xx_conf.h" +#include "stm32f4xx.h" +#include "stm32f4xx_gpio.h" +#include "stm32f4xx_rcc.h" +#include "stm32f4xx_exti.h" +#include "usbd_cdc_core.h" +#include "usbd_usr.h" +#include "usbd_desc.h" +#include "usbd_cdc_vcp.h" +#include "usb_dcd_int.h" + +volatile uint32_t ticker, downTicker; + +/* + * The USB data must be 4 byte aligned if DMA is enabled. This macro handles + * the alignment, if necessary (it's actually magic, but don't tell anyone). + */ +__ALIGN_BEGIN USB_OTG_CORE_HANDLE USB_OTG_dev __ALIGN_END; + + +void init(); +void ColorfulRingOfDeath(void); + +/* + * Define prototypes for interrupt handlers here. The conditional "extern" + * ensures the weak declarations from startup_stm32f4xx.c are overridden. + */ +#ifdef __cplusplus + extern "C" { +#endif + +void SysTick_Handler(void); +void NMI_Handler(void); +void HardFault_Handler(void); +void MemManage_Handler(void); +void BusFault_Handler(void); +void UsageFault_Handler(void); +void SVC_Handler(void); +void DebugMon_Handler(void); +void PendSV_Handler(void); +void OTG_FS_IRQHandler(void); +void OTG_FS_WKUP_IRQHandler(void); + +#ifdef __cplusplus +} +#endif + + + +int main(void) +{ + /* Set up the system clocks */ + SystemInit(); + + /* Initialize USB, IO, SysTick, and all those other things you do in the morning */ + init(); + + + while (1) + { + /* Blink the orange LED at 1Hz */ + if (500 == ticker) + { + GPIOD->BSRRH = GPIO_Pin_13; + } + else if (1000 == ticker) + { + ticker = 0; + GPIOD->BSRRL = GPIO_Pin_13; + } + + + /* If there's data on the virtual serial port: + * - Echo it back + * - Turn the green LED on for 10ms + */ + uint8_t theByte; + if (VCP_get_char(&theByte)) + { + VCP_put_char(theByte); + + + GPIOD->BSRRL = GPIO_Pin_12; + downTicker = 10; + } + if (0 == downTicker) + { + GPIOD->BSRRH = GPIO_Pin_12; + } + } + + return 0; +} + + +void init() +{ + /* STM32F4 discovery LEDs */ + GPIO_InitTypeDef LED_Config; + + /* Always remember to turn on the peripheral clock... If not, you may be up till 3am debugging... */ + RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE); + LED_Config.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13| GPIO_Pin_14| GPIO_Pin_15; + LED_Config.GPIO_Mode = GPIO_Mode_OUT; + LED_Config.GPIO_OType = GPIO_OType_PP; + LED_Config.GPIO_Speed = GPIO_Speed_25MHz; + LED_Config.GPIO_PuPd = GPIO_PuPd_NOPULL; + GPIO_Init(GPIOD, &LED_Config); + + + + /* Setup SysTick or CROD! */ + if (SysTick_Config(SystemCoreClock / 1000)) + { + ColorfulRingOfDeath(); + } + + + /* Setup USB */ + USBD_Init(&USB_OTG_dev, + USB_OTG_FS_CORE_ID, + &USR_desc, + &USBD_CDC_cb, + &USR_cb); + + return; +} + +/* + * Call this to indicate a failure. Blinks the STM32F4 discovery LEDs + * in sequence. At 168Mhz, the blinking will be very fast - about 5 Hz. + * Keep that in mind when debugging, knowing the clock speed might help + * with debugging. + */ +void ColorfulRingOfDeath(void) +{ + uint16_t ring = 1; + while (1) + { + uint32_t count = 0; + while (count++ < 500000); + + GPIOD->BSRRH = (ring << 12); + ring = ring << 1; + if (ring >= 1<<4) + { + ring = 1; + } + GPIOD->BSRRL = (ring << 12); + } +} + +/* + * Interrupt Handlers + */ + +void SysTick_Handler(void) +{ + ticker++; + if (downTicker > 0) + { + downTicker--; + } +} + +void NMI_Handler(void) {} +void HardFault_Handler(void) { ColorfulRingOfDeath(); } +void MemManage_Handler(void) { ColorfulRingOfDeath(); } +void BusFault_Handler(void) { ColorfulRingOfDeath(); } +void UsageFault_Handler(void){ ColorfulRingOfDeath(); } +void SVC_Handler(void) {} +void DebugMon_Handler(void) {} +void PendSV_Handler(void) {} + +void OTG_FS_IRQHandler(void) +{ + USBD_OTG_ISR_Handler (&USB_OTG_dev); +} + +void OTG_FS_WKUP_IRQHandler(void) +{ + if(USB_OTG_dev.cfg.low_power) + { + *(uint32_t *)(0xE000ED10) &= 0xFFFFFFF9 ; + SystemInit(); + USB_OTG_UngateClock(&USB_OTG_dev); + } + EXTI_ClearITPendingBit(EXTI_Line18); +} diff --git a/codec2/tags/0.4.1/stm32/stlink/elfsym.c b/codec2/tags/0.4.1/stm32/stlink/elfsym.c new file mode 100644 index 00000000..1a62981b --- /dev/null +++ b/codec2/tags/0.4.1/stm32/stlink/elfsym.c @@ -0,0 +1,145 @@ +/* + elfsym.c + + Read symbol adresses from a .elf file. + + Based on libelf-howto.c from: http://em386.blogspot.com + + Unit test with: + + gcc elfsym.c -o elfsym -D__UNITTEST__ -Wall -lelf + ./elfsym elf_file.elf +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "elfsym.h" + +#define ERR -1 + +int elfsym_open(char file[]) { + int fd; /* File Descriptor */ + char *base_ptr; /* ptr to our object in memory */ + struct stat elf_stats; /* fstat struct */ + + if((fd = open(file, O_RDWR)) == ERR) { + printf("couldnt open %s\n", file); + return ERR; + } + + if((fstat(fd, &elf_stats))) { + printf("could not fstat %s\n", file); + close(fd); + return ERR; + } + + if((base_ptr = (char *) malloc(elf_stats.st_size)) == NULL) { + fprintf(stderr, "could not malloc\n"); + close(fd); + return ERR; + } + + if((read(fd, base_ptr, elf_stats.st_size)) < elf_stats.st_size) { + fprintf(stderr, "could not read %s\n", file); + free(base_ptr); + close(fd); + return ERR; + } + + /* Check libelf version first */ + + if(elf_version(EV_CURRENT) == EV_NONE) { + fprintf(stderr, "WARNING Elf Library is out of date!\n"); + } + + free(base_ptr); + + return fd; +} + + +void elfsym_close(int fd) { + close(fd); +} + +unsigned int elfsym_get_symbol_address(int fd, char symbol_name[]) +{ + Elf_Scn *scn; /* Section Descriptor */ + Elf_Data *edata; /* Data Descriptor */ + GElf_Sym sym; /* Symbol */ + GElf_Shdr shdr; /* Section Header */ + Elf *elf; /* Our Elf pointer for libelf */ + unsigned int symbol_address; + int symbol_count; + int i; + + /* Iterate through section headers, stop when we find symbols, + and check for match */ + + elf = elf_begin(fd, ELF_C_READ, NULL); + if (elf == 0) { + fprintf(stderr, "could not elf_begin\n"); + } + symbol_address = 0; + scn = NULL; + + while((scn = elf_nextscn(elf, scn)) != 0) { + gelf_getshdr(scn, &shdr); + + // When we find a section header marked SHT_SYMTAB stop and get symbols + edata = NULL; + if(shdr.sh_type == SHT_SYMTAB) { + // edata points to our symbol table + edata = elf_getdata(scn, edata); + + // how many symbols are there? this number comes from the size of + // the section divided by the entry size + symbol_count = shdr.sh_size / shdr.sh_entsize; + + // loop through to grab all symbols + for(i = 0; i < symbol_count; i++) { + // libelf grabs the symbol data using gelf_getsym() + gelf_getsym(edata, i, &sym); + + if (strcmp(symbol_name, + elf_strptr(elf, shdr.sh_link, sym.st_name)) == 0) { + symbol_address = sym.st_value; + } + } + + } + } + + return symbol_address; +} + +#ifdef __UNITTEST__ + +int main(int argc, char *argv[]) +{ + int fd; + unsigned int flag_addr, ptr_addr, file_addr, len_addr; + + fd = elfsym_open(argv[1]); + flag_addr = elfsym_get_symbol_address(fd, "syscalls_gdb_flag"); + ptr_addr = elfsym_get_symbol_address(fd, "syscalls_gdb_ptr"); + file_addr = elfsym_get_symbol_address(fd, "syscalls_gdb_file"); + len_addr = elfsym_get_symbol_address(fd, "syscalls_gdb_len"); + elfsym_close(fd); + + printf("flag_addr: 0x%x\n", flag_addr); + printf("ptr_addr: 0x%x\n", ptr_addr); + printf("file_addr: 0x%x\n", file_addr); + printf("len_addr: 0x%x\n", len_addr); + + return 0; +} + +#endif diff --git a/codec2/tags/0.4.1/stm32/stlink/elfsym.h b/codec2/tags/0.4.1/stm32/stlink/elfsym.h new file mode 100644 index 00000000..fcd287ab --- /dev/null +++ b/codec2/tags/0.4.1/stm32/stlink/elfsym.h @@ -0,0 +1,14 @@ +/* + elfsym.h + + Read symbol adresses from a .elf file. +*/ + +#ifndef __ELFSYM__ +#define __ELFSYM__ + +int elfsym_open(char file[]); +void elfsym_close(int fd); +unsigned int elfsym_get_symbol_address(int fd, char symbol_name[]); + +#endif diff --git a/codec2/tags/0.4.1/stm32/stlink/stlink.patch b/codec2/tags/0.4.1/stm32/stlink/stlink.patch new file mode 100644 index 00000000..74cf2401 --- /dev/null +++ b/codec2/tags/0.4.1/stm32/stlink/stlink.patch @@ -0,0 +1,428 @@ +diff --git Makefile.am Makefile.am +index a315dd7..7406216 100644 +--- Makefile.am ++++ Makefile.am +@@ -7,7 +7,7 @@ bin_PROGRAMS = st-flash st-util + noinst_LIBRARIES = libstlink.a + + st_flash_SOURCES = flash/main.c +-st_util_SOURCES = gdbserver/gdb-remote.c gdbserver/gdb-remote.h gdbserver/gdb-server.c mingw/mingw.c mingw/mingw.h ++st_util_SOURCES = gdbserver/gdb-remote.c gdbserver/gdb-remote.h gdbserver/gdb-server.c gdbserver/elfsym.c mingw/mingw.c mingw/mingw.h + + CFILES = \ + src/stlink-common.c \ +@@ -24,14 +24,14 @@ HFILES = \ + + libstlink_a_SOURCES = $(CFILES) $(HFILES) + +-libstlink_a_CPPFLAGS = -std=gnu99 -Wall -Wextra -O2 ++libstlink_a_CPPFLAGS = -std=gnu99 -Wall -Wextra -g + libstlink_a_LIBADD = $(LIBOBJS) + + st_flash_LDADD = libstlink.a +-st_flash_CPPFLAGS = -std=gnu99 -Wall -Wextra -O2 -I$(top_srcdir)/src -I$(top_srcdir)/mingw ++st_flash_CPPFLAGS = -std=gnu99 -Wall -Wextra -g -I$(top_srcdir)/src -I$(top_srcdir)/mingw + +-st_util_LDADD = libstlink.a +-st_util_CPPFLAGS = -std=gnu99 -Wall -Wextra -O2 -I$(top_srcdir)/src -I$(top_srcdir)/mingw ++st_util_LDADD = libstlink.a -lelf ++st_util_CPPFLAGS = -std=gnu99 -Wall -Wextra -g -I$(top_srcdir)/src -I$(top_srcdir)/mingw + + EXTRA_DIST = autogen.sh + +diff --git gdbserver/Makefile gdbserver/Makefile +index bd5c73d..6763388 100644 +--- gdbserver/Makefile ++++ gdbserver/Makefile +@@ -1,12 +1,11 @@ + PRG := st-util +-OBJS = gdb-remote.o gdb-server.o ++OBJS = gdb-remote.o gdb-server.o elfsym.o + + CFLAGS+=-g -Wall -Werror -std=gnu99 -I../src + LDFLAGS=-L.. -lstlink + + # libusb location +-LDFLAGS+=`pkg-config --libs libusb-1.0` +-CFLAGS+=`pkg-config --cflags libusb-1.0` ++LDFLAGS+=`pkg-config --libs libusb-1.0` -lelfCFLAGS+=`pkg-config --cflags libusb-1.0` + + all: $(PRG) + +diff --git gdbserver/gdb-server.c gdbserver/gdb-server.c +index f92fc05..e54d136 100644 +--- gdbserver/gdb-server.c ++++ gdbserver/gdb-server.c +@@ -1,11 +1,12 @@ + /* -*- tab-width:8 -*- */ +-#define DEBUG 0 ++//#define DEBUG 0 + /* + Copyright (C) 2011 Peter Zotov + Use of this source code is governed by a BSD-style + license that can be found in the LICENSE file. + */ + ++#include + #include + #include + #include +@@ -20,14 +21,29 @@ + #include + #include + #endif ++#include ++#include ++#include + + #include + + #include "gdb-remote.h" ++#include "elfsym.h" + + #define DEFAULT_LOGGING_LEVEL 50 + #define DEFAULT_GDB_LISTEN_PORT 4242 + ++/* stdio command codes from target */ ++ ++#define GDB_STDIO_PRINTF 1 ++#define GDB_STDIO_FOPEN 2 ++#define GDB_STDIO_FCLOSE 3 ++#define GDB_STDIO_FWRITE 4 ++#define GDB_STDIO_FREAD 5 ++#define GDB_STDIO_FPRINTF 6 ++ ++#define MAX_STR 256 ++ + #define STRINGIFY_inner(name) #name + #define STRINGIFY(name) STRINGIFY_inner(name) + +@@ -46,11 +62,12 @@ typedef struct _st_state_t { + // "/dev/serial/by-id/usb-FTDI_TTL232R-3V3_FTE531X6-if00-port0" is only 58 chars + char devicename[100]; + int logging_level; +- int listen_port; ++ int listen_port; ++ char elf_filename[255]; + } st_state_t; + + +-int serve(stlink_t *sl, int port); ++int serve(stlink_t *sl, int port, char *elf_filename); + char* make_memory_map(stlink_t *sl); + + +@@ -76,13 +93,14 @@ int parse_options(int argc, char** argv, st_state_t *st) { + " -p 4242, --listen_port=1234\n" + "\t\t\tSet the gdb server listen port. " + "(default port: " STRINGIFY(DEFAULT_GDB_LISTEN_PORT) ")\n" ++ " -f \tenable File I/O of target executable elf_filename" + ; + + + int option_index = 0; + int c; + int q; +- while ((c = getopt_long(argc, argv, "hv::d:s:1p:", long_options, &option_index)) != -1) { ++ while ((c = getopt_long(argc, argv, "hv::d:s:1p:1f:", long_options, &option_index)) != -1) { + switch (c) { + case 0: + printf("XXXXX Shouldn't really normally come here, only if there's no corresponding option\n"); +@@ -110,25 +128,29 @@ int parse_options(int argc, char** argv, st_state_t *st) { + strcpy(st->devicename, optarg); + } + break; +- case '1': +- st->stlink_version = 1; +- break; +- case 's': +- sscanf(optarg, "%i", &q); +- if (q < 0 || q > 2) { +- fprintf(stderr, "stlink version %d unknown!\n", q); +- exit(EXIT_FAILURE); +- } +- st->stlink_version = q; +- break; +- case 'p': +- sscanf(optarg, "%i", &q); +- if (q < 0) { +- fprintf(stderr, "Can't use a negative port to listen on: %d\n", q); +- exit(EXIT_FAILURE); +- } +- st->listen_port = q; +- break; ++ case '1': ++ st->stlink_version = 1; ++ break; ++ case 's': ++ sscanf(optarg, "%i", &q); ++ if (q < 0 || q > 2) { ++ fprintf(stderr, "stlink version %d unknown!\n", q); ++ exit(EXIT_FAILURE); ++ } ++ st->stlink_version = q; ++ break; ++ case 'p': ++ sscanf(optarg, "%i", &q); ++ if (q < 0) { ++ fprintf(stderr, "Can't use a negative port to listen on: %d\n", q); ++ exit(EXIT_FAILURE); ++ } ++ st->listen_port = q; ++ break; ++ case 'f': ++ sscanf(optarg, "%s", st->elf_filename); ++ printf("-f arg; %s\n", st->elf_filename); ++ break; + } + } + +@@ -162,7 +184,7 @@ int main(int argc, char** argv) { + sl = stlink_v1_open(state.logging_level); + if(sl == NULL) return 1; + break; +- } ++ } + + printf("Chip ID is %08x, Core ID is %08x.\n", sl->chip_id, sl->core_id); + +@@ -177,7 +199,7 @@ int main(int argc, char** argv) { + } + #endif + +- while(serve(sl, state.listen_port) == 0); ++ while(serve(sl, state.listen_port, state.elf_filename) == 0); + + #ifdef __MINGW32__ + winsock_error: +@@ -625,7 +647,179 @@ error: + return error; + } + +-int serve(stlink_t *sl, int port) { ++static unsigned int func_addr, ret_addr, pstr1_addr, pstr2_addr; ++static unsigned int strlen1_addr, strlen2_addr, file_addr, ptr_addr; ++static unsigned int size_addr, nmem_addr; ++ ++static void write_buffer(stlink_t *sl, int target_addr, char* buf, size_t size) { ++ /* write the buffer right after the loader */ ++ size_t chunk = size & ~0x3; ++ size_t rem = size & 0x3; ++ ++ if (chunk) { ++ memcpy(sl->q_buf, buf, chunk); ++ stlink_write_mem32(sl, target_addr, chunk); ++ } ++ if (rem) { ++ memcpy(sl->q_buf, buf+chunk, rem); ++ stlink_write_mem8(sl, target_addr+chunk, rem); ++ } ++} ++ ++static void read_buffer(stlink_t *sl, int target_addr, char* buf, size_t size) { ++ unsigned adj_start = target_addr % 4; ++ unsigned count_rnd = (size + adj_start + 4 - 1) / 4 * 4; ++ size_t i; ++ ++ stlink_read_mem32(sl, target_addr - adj_start, count_rnd); ++ ++ for(i=0; iq_buf[i + adj_start]; ++} ++ ++static void fileio(stlink_t *sl) ++{ ++ int func, pstr1, pstr2, strlen1, strlen2, ptr, size, nmem; ++ int ret = 0; ++ FILE *file; ++ char file_name[MAX_STR]; ++ char mode[MAX_STR]; ++ char *buf; ++ ++ stlink_read_mem32(sl, func_addr, 4); ++ func = read_uint32(sl->q_buf, 0); ++ ++ /* func != 0 means target has requested a system call */ ++ ++ switch(func) { ++ ++ case GDB_STDIO_PRINTF: ++ stlink_read_mem32(sl, pstr1_addr, 4); ++ pstr1 = read_uint32(sl->q_buf, 0); ++ stlink_read_mem32(sl, strlen1_addr, 4); ++ strlen1 = read_uint32(sl->q_buf, 0); ++ buf = (char*)malloc(strlen1+1); ++ assert(buf != NULL); ++ read_buffer(sl, pstr1, buf, strlen1); ++ buf[strlen1] = 0; ++ #ifdef DEBUG ++ //printf("gdb_stdio printf pstr1: 0x%0x strlen1: %d buf: %s\n", pstr1, strlen1, buf); ++ #endif ++ fputs(buf, stdout); ++ free(buf); ++ ++ break; ++ ++ case GDB_STDIO_FPRINTF: ++ stlink_read_mem32(sl, file_addr, 4); ++ file = (FILE*)read_uint32(sl->q_buf, 0); ++ stlink_read_mem32(sl, pstr1_addr, 4); ++ pstr1 = read_uint32(sl->q_buf, 0); ++ stlink_read_mem32(sl, strlen1_addr, 4); ++ strlen1 = read_uint32(sl->q_buf, 0); ++ buf = (char*)malloc(strlen1+1); ++ assert(buf != NULL); ++ read_buffer(sl, pstr1, buf, strlen1); ++ buf[strlen1] = 0; ++ #ifdef DEBUG ++ //printf("gdb_stdio fprintf pstr1: 0x%0x strlen1: %d buf: %s file: 0x%x\n", pstr1, strlen1, buf, (unsigned int)file); ++ #endif ++ fputs(buf, file); ++ free(buf); ++ ++ break; ++ ++ case GDB_STDIO_FOPEN: ++ stlink_read_mem32(sl, pstr1_addr, 4); ++ pstr1 = read_uint32(sl->q_buf, 0); ++ stlink_read_mem32(sl, strlen1_addr, 4); ++ strlen1 = read_uint32(sl->q_buf, 0); ++ assert(strlen1 < MAX_STR); ++ read_buffer(sl, pstr1, file_name, strlen1); ++ file_name[strlen1] = 0; ++ ++ stlink_read_mem32(sl, pstr2_addr, 4); ++ pstr2 = read_uint32(sl->q_buf, 0); ++ stlink_read_mem32(sl, strlen2_addr, 4); ++ strlen2 = read_uint32(sl->q_buf, 0); ++ assert(strlen2 < MAX_STR); ++ read_buffer(sl, pstr2, mode, strlen2); ++ mode[strlen2] = 0; ++ ++ file = fopen(file_name, mode); ++ ++ ret = (int)file; ++ #ifdef DEBUG ++ printf("gdb_stdio fopen file_name: %s mode: %s file: 0x%x\n", file_name, mode, (unsigned int)file); ++ #endif ++ break; ++ ++ case GDB_STDIO_FCLOSE: ++ stlink_read_mem32(sl, file_addr, 4); ++ file = (FILE*)read_uint32(sl->q_buf, 0); ++ fclose(file); ++ ++ #ifdef DEBUG ++ printf("gdb_stdio fclose file: 0x%x\n", (unsigned int)file); ++ #endif ++ break; ++ ++ case GDB_STDIO_FWRITE: ++ stlink_read_mem32(sl, ptr_addr, 4); ++ ptr = read_uint32(sl->q_buf, 0); ++ stlink_read_mem32(sl, size_addr, 4); ++ size = read_uint32(sl->q_buf, 0); ++ stlink_read_mem32(sl, nmem_addr, 4); ++ nmem = read_uint32(sl->q_buf, 0); ++ stlink_read_mem32(sl, file_addr, 4); ++ file = (FILE*)read_uint32(sl->q_buf, 0); ++ ++ buf = (char*)malloc(size*nmem); ++ assert(buf != NULL); ++ read_buffer(sl, ptr, buf, size*nmem); ++ ret = fwrite(buf, size, nmem, file); ++ free(buf); ++ #ifdef DEBUG ++ printf("gdb_stdio fwrite ptr: 0x%x size: %d nmem: %d file: 0x%x\n", ++ ptr, size, nmem, (unsigned int)file); ++ #endif ++ break; ++ ++ case GDB_STDIO_FREAD: ++ stlink_read_mem32(sl, ptr_addr, 4); ++ ptr = read_uint32(sl->q_buf, 0); ++ stlink_read_mem32(sl, size_addr, 4); ++ size = read_uint32(sl->q_buf, 0); ++ stlink_read_mem32(sl, nmem_addr, 4); ++ nmem = read_uint32(sl->q_buf, 0); ++ stlink_read_mem32(sl, file_addr, 4); ++ file = (FILE*)read_uint32(sl->q_buf, 0); ++ ++ buf = (char*)malloc(size*nmem); ++ assert(buf != NULL); ++ ret = fread(buf, size, nmem, file); ++ write_buffer(sl, ptr, buf, size*nmem); ++ free(buf); ++ ++ #ifdef DEBUG ++ printf("gdb_stdio fread ptr: 0x%x size: %d nmem: %d file: 0x%x\n", ++ ptr, size, nmem, (unsigned int)file); ++ #endif ++ break; ++ } ++ ++ if (func) { ++ memcpy(sl->q_buf, &ret, sizeof(int)); ++ stlink_write_mem32(sl, ret_addr, 4); ++ ++ func = 0; ++ memcpy(sl->q_buf, &func, sizeof(int)); ++ stlink_write_mem32(sl, func_addr, 4); ++ } ++} ++ ++ ++int serve(stlink_t *sl, int port, char *elf_filename) { + int sock = socket(AF_INET, SOCK_STREAM, 0); + if(sock < 0) { + perror("socket"); +@@ -650,7 +844,33 @@ int serve(stlink_t *sl, int port) { + perror("listen"); + return 1; + } +- ++ ++ /* init for file I/O */ ++ ++ func_addr = ret_addr = pstr1_addr = pstr2_addr = strlen1_addr = strlen2_addr = 0; ++ file_addr = ptr_addr = size_addr = nmem_addr = 0; ++ ++ printf("elf_filename: %s----------------------------------\n", elf_filename); ++ if (*elf_filename != 0) { ++ int fd = elfsym_open(elf_filename); ++ if (fd == -1) ++ exit(0); ++ func_addr = elfsym_get_symbol_address(fd, "gdb_stdio_func"); ++ ret_addr = elfsym_get_symbol_address(fd, "gdb_stdio_ret"); ++ pstr1_addr = elfsym_get_symbol_address(fd, "gdb_stdio_pstr1"); ++ pstr2_addr = elfsym_get_symbol_address(fd, "gdb_stdio_pstr2"); ++ strlen1_addr = elfsym_get_symbol_address(fd, "gdb_stdio_strlen1"); ++ strlen2_addr = elfsym_get_symbol_address(fd, "gdb_stdio_strlen2"); ++ file_addr = elfsym_get_symbol_address(fd, "gdb_stdio_file"); ++ ptr_addr = elfsym_get_symbol_address(fd, "gdb_stdio_ptr"); ++ size_addr = elfsym_get_symbol_address(fd, "gdb_stdio_size"); ++ nmem_addr = elfsym_get_symbol_address(fd, "gdb_stdio_nmem"); ++ elfsym_close(fd); ++ #ifdef DEBUG ++ printf("func_addr: 0x%x\n", func_addr); ++ #endif ++ } ++ + start_again: + stlink_force_debug(sl); + stlink_reset(sl); +@@ -924,8 +1144,13 @@ start_again: + if(sl->core_stat == STLINK_CORE_HALTED) { + break; + } ++ ++ /* file I/O if enabled */ ++ ++ if (*elf_filename != 0) ++ fileio(sl); + +- usleep(100000); ++ usleep(10000); + } + + reply = strdup("S05"); // TRAP diff --git a/codec2/tags/0.4.1/stm32/stm32_flash.ld b/codec2/tags/0.4.1/stm32/stm32_flash.ld new file mode 100644 index 00000000..6822ffad --- /dev/null +++ b/codec2/tags/0.4.1/stm32/stm32_flash.ld @@ -0,0 +1,116 @@ +ENTRY(Reset_Handler) + +/* Highest address of the user mode stack */ +_estack = 0x20020000; /* end of 128K RAM on AHB bus*/ + +/* Generate a link error if heap and stack don't fit into RAM */ +_Min_Heap_Size = 0; /* required amount of heap */ +_Min_Stack_Size = 0x400; /* required amount of stack */ + +/* Specify the memory areas */ +MEMORY +{ + FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 1024K + RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 128K + CCM (rwx) : ORIGIN = 0x10000000, LENGTH = 64K +} + +SECTIONS +{ + .isr_vector : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) + . = ALIGN(4); + } >FLASH + + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + + KEEP (*(.init)) + KEEP (*(.fini)) + + . = ALIGN(4); + _etext = .; /* define a global symbols at end of code */ + _exit = .; + } >FLASH + + + .ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH + .ARM : { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } >FLASH + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } >FLASH + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } >FLASH + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(.fini_array*)) + KEEP (*(SORT(.fini_array.*))) + PROVIDE_HIDDEN (__fini_array_end = .); + } >FLASH + + /* used by the startup to initialize data */ + _sidata = .; + + /* Initialized data sections goes into RAM, load LMA copy after code */ + .data : AT ( _sidata ) + { + . = ALIGN(4); + _sdata = .; /* create a global symbol at data start */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + + . = ALIGN(4); + _edata = .; /* define a global symbol at data end */ + } >RAM + + /* Uninitialized data section */ + . = ALIGN(4); + .bss : + { + /* This is used by the startup in order to initialize the .bss secion */ + _sbss = .; /* define a global symbol at bss start */ + __bss_start__ = _sbss; + *(.bss) + *(.bss*) + *(COMMON) + + . = ALIGN(4); + _ebss = .; /* define a global symbol at bss end */ + __bss_end__ = _ebss; + } >RAM + + /* User_heap_stack section, used to check that there is enough RAM left */ + ._user_heap_stack : + { + . = ALIGN(4); + PROVIDE ( end = . ); + PROVIDE ( _end = . ); + . = . + _Min_Heap_Size; + . = . + _Min_Stack_Size; + . = ALIGN(4); + } >RAM +} diff --git a/codec2/tags/0.4.1/stm32/stm32_ram.ld b/codec2/tags/0.4.1/stm32/stm32_ram.ld new file mode 100644 index 00000000..88c735a3 --- /dev/null +++ b/codec2/tags/0.4.1/stm32/stm32_ram.ld @@ -0,0 +1,116 @@ +ENTRY(Reset_Handler) + +/* Highest address of the user mode stack */ +_estack = 0x20020000; /* end of 128K RAM on AHB bus*/ + +/* Generate a link error if heap and stack don't fit into RAM */ +_Min_Heap_Size = 0; /* required amount of heap */ +_Min_Stack_Size = 0x400; /* required amount of stack */ + +/* Specify the memory areas */ +MEMORY +{ + FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 1024K + RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 128K + CCM (rwx) : ORIGIN = 0x10000000, LENGTH = 64K +} + +SECTIONS +{ + .isr_vector : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) + . = ALIGN(4); + } >RAM + + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + + KEEP (*(.init)) + KEEP (*(.fini)) + + . = ALIGN(4); + _etext = .; /* define a global symbols at end of code */ + _exit = .; + } >RAM + + + .ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >RAM + .ARM : { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } >RAM + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } >RAM + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } >RAM + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(.fini_array*)) + KEEP (*(SORT(.fini_array.*))) + PROVIDE_HIDDEN (__fini_array_end = .); + } >RAM + + /* used by the startup to initialize data */ + _sidata = .; + + /* Initialized data sections goes into RAM, load LMA copy after code */ + .data : AT ( _sidata ) + { + . = ALIGN(4); + _sdata = .; /* create a global symbol at data start */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + + . = ALIGN(4); + _edata = .; /* define a global symbol at data end */ + } >RAM + + /* Uninitialized data section */ + . = ALIGN(4); + .bss : + { + /* This is used by the startup in order to initialize the .bss secion */ + _sbss = .; /* define a global symbol at bss start */ + __bss_start__ = _sbss; + *(.bss) + *(.bss*) + *(COMMON) + + . = ALIGN(4); + _ebss = .; /* define a global symbol at bss end */ + __bss_end__ = _ebss; + } >RAM + + /* User_heap_stack section, used to check that there is enough RAM left */ + ._user_heap_stack : + { + . = ALIGN(4); + PROVIDE ( end = . ); + PROVIDE ( _end = . ); + . = . + _Min_Heap_Size; + . = . + _Min_Stack_Size; + . = ALIGN(4); + } >RAM +} diff --git a/codec2/tags/0.4.1/stm32/usb_conf/usb_bsp.c b/codec2/tags/0.4.1/stm32/usb_conf/usb_bsp.c new file mode 100644 index 00000000..e16e150b --- /dev/null +++ b/codec2/tags/0.4.1/stm32/usb_conf/usb_bsp.c @@ -0,0 +1,337 @@ +/** + ****************************************************************************** + * @file usb_bsp.c + * @author MCD Application Team + * @version V1.0.0 + * @date 19-September-2011 + * @brief This file is responsible to offer board support package and is + * configurable by user. + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "usb_bsp.h" +#include "usbd_conf.h" +#include "stm32f4xx_conf.h" +#include "stm32f4xx_gpio.h" +#include "stm32f4xx_exti.h" +#include "stm32f4xx_rcc.h" +#include "misc.h" + + +void USB_OTG_BSP_ConfigVBUS(USB_OTG_CORE_HANDLE *pdev) { + +} + +void USB_OTG_BSP_DriveVBUS(USB_OTG_CORE_HANDLE *pdev,uint8_t state) { + +} + + +/** +* @brief USB_OTG_BSP_Init +* Initilizes BSP configurations +* @param None +* @retval None +*/ + +void USB_OTG_BSP_Init(USB_OTG_CORE_HANDLE *pdev) +{ + GPIO_InitTypeDef GPIO_InitStructure; + +#ifndef USE_ULPI_PHY +#ifdef USB_OTG_FS_LOW_PWR_MGMT_SUPPORT + EXTI_InitTypeDef EXTI_InitStructure; + NVIC_InitTypeDef NVIC_InitStructure; +#endif +#endif + + + #ifdef USE_USB_OTG_FS + + RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOA , ENABLE); + + /* Configure SOF VBUS ID DM DP Pins */ + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | + GPIO_Pin_9 | + GPIO_Pin_11 | + GPIO_Pin_12; + + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ; + GPIO_Init(GPIOA, &GPIO_InitStructure); + + GPIO_PinAFConfig(GPIOA,GPIO_PinSource8,GPIO_AF_OTG1_FS) ; + GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_OTG1_FS) ; + GPIO_PinAFConfig(GPIOA,GPIO_PinSource11,GPIO_AF_OTG1_FS) ; + GPIO_PinAFConfig(GPIOA,GPIO_PinSource12,GPIO_AF_OTG1_FS) ; + + /* this for ID line debug */ + + + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; + GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; + GPIO_Init(GPIOA, &GPIO_InitStructure); + GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_OTG1_FS) ; + + RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); + RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_OTG_FS, ENABLE) ; + #else // USE_USB_OTG_HS + + #ifdef USE_ULPI_PHY // ULPI + RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | + RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOH | + RCC_AHB1Periph_GPIOI, ENABLE); + + + GPIO_PinAFConfig(GPIOA,GPIO_PinSource3, GPIO_AF_OTG2_HS) ; // D0 + GPIO_PinAFConfig(GPIOA,GPIO_PinSource5, GPIO_AF_OTG2_HS) ; // CLK + GPIO_PinAFConfig(GPIOB,GPIO_PinSource0, GPIO_AF_OTG2_HS) ; // D1 + GPIO_PinAFConfig(GPIOB,GPIO_PinSource1, GPIO_AF_OTG2_HS) ; // D2 + GPIO_PinAFConfig(GPIOB,GPIO_PinSource5, GPIO_AF_OTG2_HS) ; // D7 + GPIO_PinAFConfig(GPIOB,GPIO_PinSource10,GPIO_AF_OTG2_HS) ; // D3 + GPIO_PinAFConfig(GPIOB,GPIO_PinSource11,GPIO_AF_OTG2_HS) ; // D4 + GPIO_PinAFConfig(GPIOB,GPIO_PinSource12,GPIO_AF_OTG2_HS) ; // D5 + GPIO_PinAFConfig(GPIOB,GPIO_PinSource13,GPIO_AF_OTG2_HS) ; // D6 + GPIO_PinAFConfig(GPIOH,GPIO_PinSource4, GPIO_AF_OTG2_HS) ; // NXT + GPIO_PinAFConfig(GPIOI,GPIO_PinSource11,GPIO_AF_OTG2_HS) ; // DIR + GPIO_PinAFConfig(GPIOC,GPIO_PinSource0, GPIO_AF_OTG2_HS) ; // STP + + // CLK + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 ; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + GPIO_Init(GPIOA, &GPIO_InitStructure); + + // D0 + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 ; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ; + GPIO_Init(GPIOA, &GPIO_InitStructure); + + + + // D1 D2 D3 D4 D5 D6 D7 + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | + GPIO_Pin_5 | GPIO_Pin_10 | + GPIO_Pin_11| GPIO_Pin_12 | + GPIO_Pin_13 ; + + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ; + GPIO_Init(GPIOB, &GPIO_InitStructure); + + + // STP + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 ; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + GPIO_Init(GPIOC, &GPIO_InitStructure); + + //NXT + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + GPIO_Init(GPIOH, &GPIO_InitStructure); + + + //DIR + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 ; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + GPIO_Init(GPIOI, &GPIO_InitStructure); + + + RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_OTG_HS | + RCC_AHB1Periph_OTG_HS_ULPI, ENABLE) ; + + #else + #ifdef USE_I2C_PHY + RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOB , ENABLE); + /* Configure RESET INTN SCL SDA (Phy/I2C) Pins */ + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | + GPIO_Pin_1 | + GPIO_Pin_10 | + GPIO_Pin_11; + + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + GPIO_Init(GPIOB, &GPIO_InitStructure); + + GPIO_PinAFConfig(GPIOB,GPIO_PinSource0,GPIO_AF_OTG2_FS) ; + GPIO_PinAFConfig(GPIOB,GPIO_PinSource1,GPIO_AF_OTG2_FS) ; + GPIO_PinAFConfig(GPIOB,GPIO_PinSource10,GPIO_AF_OTG2_FS) ; + GPIO_PinAFConfig(GPIOB,GPIO_PinSource11,GPIO_AF_OTG2_FS); + RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_OTG_HS, ENABLE) ; + + #else + + RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB , ENABLE); + + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | + GPIO_Pin_13 | + GPIO_Pin_14 | + GPIO_Pin_15; + + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + GPIO_Init(GPIOB, &GPIO_InitStructure); + + GPIO_PinAFConfig(GPIOB,GPIO_PinSource12, GPIO_AF_OTG2_FS) ; + GPIO_PinAFConfig(GPIOB,GPIO_PinSource13,GPIO_AF_OTG2_FS) ; + GPIO_PinAFConfig(GPIOB,GPIO_PinSource14,GPIO_AF_OTG2_FS) ; + GPIO_PinAFConfig(GPIOB,GPIO_PinSource15,GPIO_AF_OTG2_FS) ; + RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_OTG_HS, ENABLE) ; + #endif + #endif // USE_ULPI_PHY + + #endif //USB_OTG_HS + + + /* enable the PWR clock */ + RCC_APB1PeriphResetCmd(RCC_APB1Periph_PWR, ENABLE); + + /* Configure the Key button in EXTI mode */ + //STM_EVAL_PBInit(BUTTON_USER, BUTTON_MODE_EXTI); + +#ifdef USB_OTG_FS_LOW_PWR_MGMT_SUPPORT + EXTI_ClearITPendingBit(EXTI_Line18); + + EXTI_InitStructure.EXTI_Line = EXTI_Line18; + EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; + EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; + EXTI_InitStructure.EXTI_LineCmd = ENABLE; + EXTI_Init(&EXTI_InitStructure); + + EXTI_ClearITPendingBit(EXTI_Line18); + + NVIC_InitStructure.NVIC_IRQChannel = OTG_FS_WKUP_IRQn; + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; + NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; + NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; + NVIC_Init(&NVIC_InitStructure); + + EXTI_ClearITPendingBit(EXTI_Line18); +#endif + +#ifdef USB_OTG_HS_LOW_PWR_MGMT_SUPPORT + EXTI_ClearITPendingBit(EXTI_Line20); + + EXTI_InitStructure.EXTI_Line = EXTI_Line20; + EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; + EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; + EXTI_InitStructure.EXTI_LineCmd = ENABLE; + EXTI_Init(&EXTI_InitStructure); + + EXTI_ClearITPendingBit(EXTI_Line20); + + NVIC_InitStructure.NVIC_IRQChannel = OTG_HS_WKUP_IRQn; + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; + NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; + NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; + NVIC_Init(&NVIC_InitStructure); + + EXTI_ClearITPendingBit(EXTI_Line20); +#endif + + EXTI_ClearITPendingBit(EXTI_Line0); +} +/** +* @brief USB_OTG_BSP_EnableInterrupt +* Enabele USB Global interrupt +* @param None +* @retval None +*/ +void USB_OTG_BSP_EnableInterrupt(USB_OTG_CORE_HANDLE *pdev) +{ + NVIC_InitTypeDef NVIC_InitStructure; + + NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); +#ifdef USE_USB_OTG_HS + NVIC_InitStructure.NVIC_IRQChannel = OTG_HS_IRQn; +#else + NVIC_InitStructure.NVIC_IRQChannel = OTG_FS_IRQn; +#endif + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; + NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; + NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; + NVIC_Init(&NVIC_InitStructure); +#ifdef USB_OTG_HS_DEDICATED_EP1_ENABLED + NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); + NVIC_InitStructure.NVIC_IRQChannel = OTG_HS_EP1_OUT_IRQn; + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; + NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; + NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; + NVIC_Init(&NVIC_InitStructure); + + NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); + NVIC_InitStructure.NVIC_IRQChannel = OTG_HS_EP1_IN_IRQn; + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; + NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; + NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; + NVIC_Init(&NVIC_InitStructure); +#endif +} +/** +* @brief USB_OTG_BSP_uDelay +* This function provides delay time in micro sec +* @param usec : Value of delay required in micro sec +* @retval None +*/ +void USB_OTG_BSP_uDelay (const uint32_t usec) +{ + uint32_t count = 0; + const uint32_t utime = (120 * usec / 7); + do + { + if ( ++count > utime ) + { + return ; + } + } + while (1); +} + + +/** +* @brief USB_OTG_BSP_mDelay +* This function provides delay time in milli sec +* @param msec : Value of delay required in milli sec +* @retval None +*/ +void USB_OTG_BSP_mDelay (const uint32_t msec) +{ + USB_OTG_BSP_uDelay(msec * 1000); +} +/** +* @} +*/ + +/** +* @} +*/ + +/** +* @} +*/ + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/codec2/tags/0.4.1/stm32/usb_conf/usb_bsp.h b/codec2/tags/0.4.1/stm32/usb_conf/usb_bsp.h new file mode 100644 index 00000000..0584e9b9 --- /dev/null +++ b/codec2/tags/0.4.1/stm32/usb_conf/usb_bsp.h @@ -0,0 +1,97 @@ +/** + ****************************************************************************** + * @file usb_bsp.h + * @author MCD Application Team + * @version V2.0.0 + * @date 22-July-2011 + * @brief Specific api's relative to the used hardware platform + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __USB_BSP__H__ +#define __USB_BSP__H__ + +/* Includes ------------------------------------------------------------------*/ +#include "usb_core.h" +#include "stm32f4xx.h" + +/** @addtogroup USB_OTG_DRIVER + * @{ + */ + +/** @defgroup USB_BSP + * @brief This file is the + * @{ + */ + + +/** @defgroup USB_BSP_Exported_Defines + * @{ + */ +/** + * @} + */ + + +/** @defgroup USB_BSP_Exported_Types + * @{ + */ +/** + * @} + */ + + +/** @defgroup USB_BSP_Exported_Macros + * @{ + */ +/** + * @} + */ + +/** @defgroup USB_BSP_Exported_Variables + * @{ + */ +/** + * @} + */ + +/** @defgroup USB_BSP_Exported_FunctionsPrototype + * @{ + */ +void BSP_Init(void); + +void USB_OTG_BSP_Init (USB_OTG_CORE_HANDLE *pdev); +void USB_OTG_BSP_uDelay (const uint32_t usec); +void USB_OTG_BSP_mDelay (const uint32_t msec); +void USB_OTG_BSP_EnableInterrupt (USB_OTG_CORE_HANDLE *pdev); +#ifdef USE_HOST_MODE +void USB_OTG_BSP_ConfigVBUS(USB_OTG_CORE_HANDLE *pdev); +void USB_OTG_BSP_DriveVBUS(USB_OTG_CORE_HANDLE *pdev,uint8_t state); +#endif +/** + * @} + */ + +#endif //__USB_BSP__H__ + +/** + * @} + */ + +/** + * @} + */ +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ + diff --git a/codec2/tags/0.4.1/stm32/usb_conf/usb_conf.h b/codec2/tags/0.4.1/stm32/usb_conf/usb_conf.h new file mode 100644 index 00000000..736e6492 --- /dev/null +++ b/codec2/tags/0.4.1/stm32/usb_conf/usb_conf.h @@ -0,0 +1,287 @@ +/** + ****************************************************************************** + * @file usb_conf.h + * @author MCD Application Team + * @version V2.0.0 + * @date 22-July-2011 + * @brief general low level driver configuration + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __USB_CONF__H__ +#define __USB_CONF__H__ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx.h" + + +/** @addtogroup USB_OTG_DRIVER + * @{ + */ + +/** @defgroup USB_CONF + * @brief USB low level driver configuration file + * @{ + */ + +/** @defgroup USB_CONF_Exported_Defines + * @{ + */ + +/* USB Core and PHY interface configuration. + Tip: To avoid modifying these defines each time you need to change the USB + configuration, you can declare the needed define in your toolchain + compiler preprocessor. + */ +#ifndef USE_USB_OTG_FS +#define USE_USB_OTG_FS +#endif /* USE_USB_OTG_FS */ + +#ifndef USE_USB_OTG_HS + //#define USE_USB_OTG_HS +#endif /* USE_USB_OTG_HS */ + +#ifndef USE_ULPI_PHY +#define USE_ULPI_PHY +#endif /* USE_ULPI_PHY */ + +#ifndef USE_EMBEDDED_PHY + //#define USE_EMBEDDED_PHY +#endif /* USE_EMBEDDED_PHY */ + +#ifndef USE_I2C_PHY + //#define USE_I2C_PHY +#endif /* USE_I2C_PHY */ + + +#ifdef USE_USB_OTG_FS + #define USB_OTG_FS_CORE +#endif + +#ifdef USE_USB_OTG_HS + #define USB_OTG_HS_CORE +#endif + +/******************************************************************************* +* FIFO Size Configuration in Device mode +* +* (i) Receive data FIFO size = RAM for setup packets + +* OUT endpoint control information + +* data OUT packets + miscellaneous +* Space = ONE 32-bits words +* --> RAM for setup packets = 10 spaces +* (n is the nbr of CTRL EPs the device core supports) +* --> OUT EP CTRL info = 1 space +* (one space for status information written to the FIFO along with each +* received packet) +* --> data OUT packets = (Largest Packet Size / 4) + 1 spaces +* (MINIMUM to receive packets) +* --> OR data OUT packets = at least 2*(Largest Packet Size / 4) + 1 spaces +* (if high-bandwidth EP is enabled or multiple isochronous EPs) +* --> miscellaneous = 1 space per OUT EP +* (one space for transfer complete status information also pushed to the +* FIFO with each endpoint's last packet) +* +* (ii)MINIMUM RAM space required for each IN EP Tx FIFO = MAX packet size for +* that particular IN EP. More space allocated in the IN EP Tx FIFO results +* in a better performance on the USB and can hide latencies on the AHB. +* +* (iii) TXn min size = 16 words. (n : Transmit FIFO index) +* (iv) When a TxFIFO is not used, the Configuration should be as follows: +* case 1 : n > m and Txn is not used (n,m : Transmit FIFO indexes) +* --> Txm can use the space allocated for Txn. +* case2 : n < m and Txn is not used (n,m : Transmit FIFO indexes) +* --> Txn should be configured with the minimum space of 16 words +* (v) The FIFO is used optimally when used TxFIFOs are allocated in the top +* of the FIFO.Ex: use EP1 and EP2 as IN instead of EP1 and EP3 as IN ones. +*******************************************************************************/ + +/******************************************************************************* +* FIFO Size Configuration in Host mode +* +* (i) Receive data FIFO size = (Largest Packet Size / 4) + 1 or +* 2x (Largest Packet Size / 4) + 1, If a +* high-bandwidth channel or multiple isochronous +* channels are enabled +* +* (ii) For the host nonperiodic Transmit FIFO is the largest maximum packet size +* for all supported nonperiodic OUT channels. Typically, a space +* corresponding to two Largest Packet Size is recommended. +* +* (iii) The minimum amount of RAM required for Host periodic Transmit FIFO is +* the largest maximum packet size for all supported periodic OUT channels. +* If there is at least one High Bandwidth Isochronous OUT endpoint, +* then the space must be at least two times the maximum packet size for +* that channel. +*******************************************************************************/ + +/****************** USB OTG HS CONFIGURATION **********************************/ +#ifdef USB_OTG_HS_CORE + #define RX_FIFO_HS_SIZE 512 + #define TX0_FIFO_HS_SIZE 512 + #define TX1_FIFO_HS_SIZE 512 + #define TX2_FIFO_HS_SIZE 0 + #define TX3_FIFO_HS_SIZE 0 + #define TX4_FIFO_HS_SIZE 0 + #define TX5_FIFO_HS_SIZE 0 + #define TXH_NP_HS_FIFOSIZ 96 + #define TXH_P_HS_FIFOSIZ 96 + + //#define USB_OTG_HS_LOW_PWR_MGMT_SUPPORT + //#define USB_OTG_HS_SOF_OUTPUT_ENABLED + + //#define USB_OTG_INTERNAL_VBUS_ENABLED + #define USB_OTG_EXTERNAL_VBUS_ENABLED + + #ifdef USE_ULPI_PHY + #define USB_OTG_ULPI_PHY_ENABLED + #endif + #ifdef USE_EMBEDDED_PHY + #define USB_OTG_EMBEDDED_PHY_ENABLED + #endif + #ifdef USE_I2C_PHY + #define USB_OTG_I2C_PHY_ENABLED + #endif + #define USB_OTG_HS_INTERNAL_DMA_ENABLED + #define USB_OTG_HS_DEDICATED_EP1_ENABLED +#endif + +/****************** USB OTG FS CONFIGURATION **********************************/ +#ifdef USB_OTG_FS_CORE + #define RX_FIFO_FS_SIZE 128 + #define TX0_FIFO_FS_SIZE 64 + #define TX1_FIFO_FS_SIZE 128 + #define TX2_FIFO_FS_SIZE 0 + #define TX3_FIFO_FS_SIZE 0 + #define TXH_NP_FS_FIFOSIZ 96 + #define TXH_P_FS_FIFOSIZ 96 + + //#define USB_OTG_FS_LOW_PWR_MGMT_SUPPORT + //#define USB_OTG_FS_SOF_OUTPUT_ENABLED +#endif + +/****************** USB OTG MODE CONFIGURATION ********************************/ +//#define USE_HOST_MODE +#define USE_DEVICE_MODE +//#define USE_OTG_MODE + + +#ifndef USB_OTG_FS_CORE + #ifndef USB_OTG_HS_CORE + #error "USB_OTG_HS_CORE or USB_OTG_FS_CORE should be defined" + #endif +#endif + + +#ifndef USE_DEVICE_MODE + #ifndef USE_HOST_MODE + #error "USE_DEVICE_MODE or USE_HOST_MODE should be defined" + #endif +#endif + +#ifndef USE_USB_OTG_HS + #ifndef USE_USB_OTG_FS + #error "USE_USB_OTG_HS or USE_USB_OTG_FS should be defined" + #endif +#else //USE_USB_OTG_HS + #ifndef USE_ULPI_PHY + #ifndef USE_EMBEDDED_PHY + #ifndef USE_I2C_PHY + #error "USE_ULPI_PHY or USE_EMBEDDED_PHY or USE_I2C_PHY should be defined" + #endif + #endif + #endif +#endif + +/****************** C Compilers dependant keywords ****************************/ +/* In HS mode and when the DMA is used, all variables and data structures dealing + with the DMA during the transaction process should be 4-bytes aligned */ +#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED + #if defined (__GNUC__) /* GNU Compiler */ + #define __ALIGN_END __attribute__ ((aligned (4))) + #define __ALIGN_BEGIN + #else + #define __ALIGN_END + #if defined (__CC_ARM) /* ARM Compiler */ + #define __ALIGN_BEGIN __align(4) + #elif defined (__ICCARM__) /* IAR Compiler */ + #define __ALIGN_BEGIN + #elif defined (__TASKING__) /* TASKING Compiler */ + #define __ALIGN_BEGIN __align(4) + #endif /* __CC_ARM */ + #endif /* __GNUC__ */ +#else + #define __ALIGN_BEGIN + #define __ALIGN_END +#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */ + +/* __packed keyword used to decrease the data type alignment to 1-byte */ +#if defined (__CC_ARM) /* ARM Compiler */ + #define __packed __packed +#elif defined (__ICCARM__) /* IAR Compiler */ + #define __packed __packed +#elif defined ( __GNUC__ ) /* GNU Compiler */ + #define __packed __attribute__ ((__packed__)) +#elif defined (__TASKING__) /* TASKING Compiler */ + #define __packed __unaligned +#endif /* __CC_ARM */ + +/** + * @} + */ + + +/** @defgroup USB_CONF_Exported_Types + * @{ + */ +/** + * @} + */ + + +/** @defgroup USB_CONF_Exported_Macros + * @{ + */ +/** + * @} + */ + +/** @defgroup USB_CONF_Exported_Variables + * @{ + */ +/** + * @} + */ + +/** @defgroup USB_CONF_Exported_FunctionsPrototype + * @{ + */ +/** + * @} + */ + + +#endif //__USB_CONF__H__ + + +/** + * @} + */ + +/** + * @} + */ +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ + diff --git a/codec2/tags/0.4.1/stm32/usb_conf/usbd_conf.h b/codec2/tags/0.4.1/stm32/usb_conf/usbd_conf.h new file mode 100644 index 00000000..0ecf0b34 --- /dev/null +++ b/codec2/tags/0.4.1/stm32/usb_conf/usbd_conf.h @@ -0,0 +1,95 @@ +/** + ****************************************************************************** + * @file usbd_conf.h + * @author MCD Application Team + * @version V1.0.0 + * @date 22-July-2011 + * @brief USB Device configuration file + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __USBD_CONF__H__ +#define __USBD_CONF__H__ + +/** @defgroup USB_CONF_Exported_Defines + * @{ + */ +#define USBD_CFG_MAX_NUM 1 +#define USBD_ITF_MAX_NUM 1 +#define USB_MAX_STR_DESC_SIZ 100 + +/** @defgroup USB_VCP_Class_Layer_Parameter + * @{ + */ +#define CDC_IN_EP 0x81 /* EP1 for data IN */ +#define CDC_OUT_EP 0x01 /* EP1 for data OUT */ +#define CDC_CMD_EP 0x82 /* EP2 for CDC commands */ + +/* CDC Endpoints parameters: you can fine tune these values depending on the needed baudrates and performance. */ +#ifdef USE_USB_OTG_HS + #define CDC_DATA_MAX_PACKET_SIZE 512 /* Endpoint IN & OUT Packet size */ + #define CDC_CMD_PACKET_SZE 8 /* Control Endpoint Packet size */ + + #define CDC_IN_FRAME_INTERVAL 40 /* Number of micro-frames between IN transfers */ + #define APP_RX_DATA_SIZE 2048 /* Total size of IN buffer: + APP_RX_DATA_SIZE*8/MAX_BAUDARATE*1000 should be > CDC_IN_FRAME_INTERVAL*8 */ +#else + #define CDC_DATA_MAX_PACKET_SIZE 64 /* Endpoint IN & OUT Packet size */ + #define CDC_CMD_PACKET_SZE 8 /* Control Endpoint Packet size */ + + #define CDC_IN_FRAME_INTERVAL 5 /* Number of frames between IN transfers */ + #define APP_RX_DATA_SIZE 2048 /* Total size of IN buffer: + APP_RX_DATA_SIZE*8/MAX_BAUDARATE*1000 should be > CDC_IN_FRAME_INTERVAL */ +#endif /* USE_USB_OTG_HS */ + +#define APP_FOPS VCP_fops +/** + * @} + */ + +/** @defgroup USB_CONF_Exported_Types + * @{ + */ +/** + * @} + */ + + +/** @defgroup USB_CONF_Exported_Macros + * @{ + */ +/** + * @} + */ + +/** @defgroup USB_CONF_Exported_Variables + * @{ + */ +/** + * @} + */ + +/** @defgroup USB_CONF_Exported_FunctionsPrototype + * @{ + */ +/** + * @} + */ + + +#endif //__USBD_CONF__H__ + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ + diff --git a/codec2/tags/0.4.1/stm32/usb_conf/usbd_desc.c b/codec2/tags/0.4.1/stm32/usb_conf/usbd_desc.c new file mode 100644 index 00000000..36930303 --- /dev/null +++ b/codec2/tags/0.4.1/stm32/usb_conf/usbd_desc.c @@ -0,0 +1,324 @@ +/** + ****************************************************************************** + * @file usbd_desc.c + * @author MCD Application Team + * @version V1.0.0 + * @date 19-September-2011 + * @brief This file provides the USBD descriptors and string formating method. + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include +#include "usbd_core.h" +#include "usbd_desc.h" +#include "usbd_req.h" +#include "usbd_conf.h" +#include "usb_regs.h" + +/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY + * @{ + */ + + +/** @defgroup USBD_DESC + * @brief USBD descriptors module + * @{ + */ + +/** @defgroup USBD_DESC_Private_TypesDefinitions + * @{ + */ +/** + * @} + */ + + +/** @defgroup USBD_DESC_Private_Defines + * @{ + */ + +#define USBD_VID 0x0483 + +#define USBD_PID 0x5740 + +/** @defgroup USB_String_Descriptors + * @{ + */ +#define USBD_LANGID_STRING 0x409 +#define USBD_MANUFACTURER_STRING "STMicroelectronics" + +#define USBD_PRODUCT_HS_STRING "STM32 Virtual ComPort in HS mode" +#define USBD_SERIALNUMBER_HS_STRING "00000000050B" + +#define USBD_PRODUCT_FS_STRING "STM32 Virtual ComPort in FS Mode" +#define USBD_SERIALNUMBER_FS_STRING "00000000050C" + +#define USBD_CONFIGURATION_HS_STRING "VCP Config" +#define USBD_INTERFACE_HS_STRING "VCP Interface" + +#define USBD_CONFIGURATION_FS_STRING "VCP Config" +#define USBD_INTERFACE_FS_STRING "VCP Interface" +/** + * @} + */ + + +/** @defgroup USBD_DESC_Private_Macros + * @{ + */ +/** + * @} + */ + + +/** @defgroup USBD_DESC_Private_Variables + * @{ + */ + +USBD_DEVICE USR_desc = +{ + USBD_USR_DeviceDescriptor, + USBD_USR_LangIDStrDescriptor, + USBD_USR_ManufacturerStrDescriptor, + USBD_USR_ProductStrDescriptor, + USBD_USR_SerialStrDescriptor, + USBD_USR_ConfigStrDescriptor, + USBD_USR_InterfaceStrDescriptor, + +}; + +#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED + #if defined ( __ICCARM__ ) /*!< IAR Compiler */ + #pragma data_alignment=4 + #endif +#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */ +/* USB Standard Device Descriptor */ +__ALIGN_BEGIN uint8_t USBD_DeviceDesc[USB_SIZ_DEVICE_DESC] __ALIGN_END = + { + 0x12, /*bLength */ + USB_DEVICE_DESCRIPTOR_TYPE, /*bDescriptorType*/ + 0x00, /*bcdUSB */ + 0x02, + 0x00, /*bDeviceClass*/ + 0x00, /*bDeviceSubClass*/ + 0x00, /*bDeviceProtocol*/ + USB_OTG_MAX_EP0_SIZE, /*bMaxPacketSize*/ + LOBYTE(USBD_VID), /*idVendor*/ + HIBYTE(USBD_VID), /*idVendor*/ + LOBYTE(USBD_PID), /*idVendor*/ + HIBYTE(USBD_PID), /*idVendor*/ + 0x00, /*bcdDevice rel. 2.00*/ + 0x02, + USBD_IDX_MFC_STR, /*Index of manufacturer string*/ + USBD_IDX_PRODUCT_STR, /*Index of product string*/ + USBD_IDX_SERIAL_STR, /*Index of serial number string*/ + USBD_CFG_MAX_NUM /*bNumConfigurations*/ + } ; /* USB_DeviceDescriptor */ + +#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED + #if defined ( __ICCARM__ ) /*!< IAR Compiler */ + #pragma data_alignment=4 + #endif +#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */ +/* USB Standard Device Descriptor */ +__ALIGN_BEGIN uint8_t USBD_DeviceQualifierDesc[USB_LEN_DEV_QUALIFIER_DESC] __ALIGN_END = +{ + USB_LEN_DEV_QUALIFIER_DESC, + USB_DESC_TYPE_DEVICE_QUALIFIER, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x40, + 0x01, + 0x00, +}; + +#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED + #if defined ( __ICCARM__ ) /*!< IAR Compiler */ + #pragma data_alignment=4 + #endif +#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */ +/* USB Standard Device Descriptor */ +__ALIGN_BEGIN uint8_t USBD_LangIDDesc[USB_SIZ_STRING_LANGID] __ALIGN_END = +{ + USB_SIZ_STRING_LANGID, + USB_DESC_TYPE_STRING, + LOBYTE(USBD_LANGID_STRING), + HIBYTE(USBD_LANGID_STRING), +}; +/** + * @} + */ + + +/** @defgroup USBD_DESC_Private_FunctionPrototypes + * @{ + */ +/** + * @} + */ + + +/** @defgroup USBD_DESC_Private_Functions + * @{ + */ + +/** +* @brief USBD_USR_DeviceDescriptor +* return the device descriptor +* @param speed : current device speed +* @param length : pointer to data length variable +* @retval pointer to descriptor buffer +*/ +uint8_t * USBD_USR_DeviceDescriptor( uint8_t speed , uint16_t *length) +{ + *length = sizeof(USBD_DeviceDesc); + return USBD_DeviceDesc; +} + +/** +* @brief USBD_USR_LangIDStrDescriptor +* return the LangID string descriptor +* @param speed : current device speed +* @param length : pointer to data length variable +* @retval pointer to descriptor buffer +*/ +uint8_t * USBD_USR_LangIDStrDescriptor( uint8_t speed , uint16_t *length) +{ + *length = sizeof(USBD_LangIDDesc); + return USBD_LangIDDesc; +} + + +/** +* @brief USBD_USR_ProductStrDescriptor +* return the product string descriptor +* @param speed : current device speed +* @param length : pointer to data length variable +* @retval pointer to descriptor buffer +*/ +uint8_t * USBD_USR_ProductStrDescriptor( uint8_t speed , uint16_t *length) +{ + + if(speed == 0) + { + USBD_GetString ((uint8_t*)USBD_PRODUCT_HS_STRING, USBD_StrDesc, length); + } + else + { + USBD_GetString ((uint8_t*)USBD_PRODUCT_FS_STRING, USBD_StrDesc, length); + } + + assert(*length < USB_MAX_STR_DESC_SIZ); + + return USBD_StrDesc; +} + +/** +* @brief USBD_USR_ManufacturerStrDescriptor +* return the manufacturer string descriptor +* @param speed : current device speed +* @param length : pointer to data length variable +* @retval pointer to descriptor buffer +*/ +uint8_t * USBD_USR_ManufacturerStrDescriptor( uint8_t speed , uint16_t *length) +{ + USBD_GetString ((uint8_t*)USBD_MANUFACTURER_STRING, USBD_StrDesc, length); + assert(*length < USB_MAX_STR_DESC_SIZ); + return USBD_StrDesc; +} + +/** +* @brief USBD_USR_SerialStrDescriptor +* return the serial number string descriptor +* @param speed : current device speed +* @param length : pointer to data length variable +* @retval pointer to descriptor buffer +*/ +uint8_t * USBD_USR_SerialStrDescriptor( uint8_t speed , uint16_t *length) +{ + if(speed == USB_OTG_SPEED_HIGH) + { + USBD_GetString ((uint8_t*)USBD_SERIALNUMBER_HS_STRING, USBD_StrDesc, length); + } + else + { + USBD_GetString ((uint8_t*)USBD_SERIALNUMBER_FS_STRING, USBD_StrDesc, length); + } + assert(*length < USB_MAX_STR_DESC_SIZ); + return USBD_StrDesc; +} + +/** +* @brief USBD_USR_ConfigStrDescriptor +* return the configuration string descriptor +* @param speed : current device speed +* @param length : pointer to data length variable +* @retval pointer to descriptor buffer +*/ +uint8_t * USBD_USR_ConfigStrDescriptor( uint8_t speed , uint16_t *length) +{ + if(speed == USB_OTG_SPEED_HIGH) + { + USBD_GetString ((uint8_t*)USBD_CONFIGURATION_HS_STRING, USBD_StrDesc, length); + } + else + { + USBD_GetString ((uint8_t*)USBD_CONFIGURATION_FS_STRING, USBD_StrDesc, length); + } + assert(*length < USB_MAX_STR_DESC_SIZ); + return USBD_StrDesc; +} + + +/** +* @brief USBD_USR_InterfaceStrDescriptor +* return the interface string descriptor +* @param speed : current device speed +* @param length : pointer to data length variable +* @retval pointer to descriptor buffer +*/ +uint8_t * USBD_USR_InterfaceStrDescriptor( uint8_t speed , uint16_t *length) +{ + if(speed == 0) + { + USBD_GetString ((uint8_t*)USBD_INTERFACE_HS_STRING, USBD_StrDesc, length); + } + else + { + USBD_GetString ((uint8_t*)USBD_INTERFACE_FS_STRING, USBD_StrDesc, length); + } + assert(*length < USB_MAX_STR_DESC_SIZ); + return USBD_StrDesc; +} + +/** + * @} + */ + + +/** + * @} + */ + + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ + diff --git a/codec2/tags/0.4.1/stm32/usb_conf/usbd_desc.h b/codec2/tags/0.4.1/stm32/usb_conf/usbd_desc.h new file mode 100644 index 00000000..ed999dc6 --- /dev/null +++ b/codec2/tags/0.4.1/stm32/usb_conf/usbd_desc.h @@ -0,0 +1,114 @@ +/** + ****************************************************************************** + * @file usbd_desc.h + * @author MCD Application Team + * @version V1.0.0 + * @date 19-September-2011 + * @brief header file for the usbd_desc.c file + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ + +#ifndef __USB_DESC_H +#define __USB_DESC_H + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_def.h" + +/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY + * @{ + */ + +/** @defgroup USB_DESC + * @brief general defines for the usb device library file + * @{ + */ + +/** @defgroup USB_DESC_Exported_Defines + * @{ + */ +#define USB_DEVICE_DESCRIPTOR_TYPE 0x01 +#define USB_CONFIGURATION_DESCRIPTOR_TYPE 0x02 +#define USB_STRING_DESCRIPTOR_TYPE 0x03 +#define USB_INTERFACE_DESCRIPTOR_TYPE 0x04 +#define USB_ENDPOINT_DESCRIPTOR_TYPE 0x05 +#define USB_SIZ_DEVICE_DESC 18 +#define USB_SIZ_STRING_LANGID 4 + +/** + * @} + */ + + +/** @defgroup USBD_DESC_Exported_TypesDefinitions + * @{ + */ +/** + * @} + */ + + + +/** @defgroup USBD_DESC_Exported_Macros + * @{ + */ +/** + * @} + */ + +/** @defgroup USBD_DESC_Exported_Variables + * @{ + */ +extern uint8_t USBD_DeviceDesc [USB_SIZ_DEVICE_DESC]; +extern uint8_t USBD_StrDesc[USB_MAX_STR_DESC_SIZ]; +extern uint8_t USBD_OtherSpeedCfgDesc[USB_LEN_CFG_DESC]; +extern uint8_t USBD_DeviceQualifierDesc[USB_LEN_DEV_QUALIFIER_DESC]; +extern uint8_t USBD_LangIDDesc[USB_SIZ_STRING_LANGID]; +extern USBD_DEVICE USR_desc; +/** + * @} + */ + +/** @defgroup USBD_DESC_Exported_FunctionsPrototype + * @{ + */ + + +uint8_t * USBD_USR_DeviceDescriptor( uint8_t speed , uint16_t *length); +uint8_t * USBD_USR_LangIDStrDescriptor( uint8_t speed , uint16_t *length); +uint8_t * USBD_USR_ManufacturerStrDescriptor ( uint8_t speed , uint16_t *length); +uint8_t * USBD_USR_ProductStrDescriptor ( uint8_t speed , uint16_t *length); +uint8_t * USBD_USR_SerialStrDescriptor( uint8_t speed , uint16_t *length); +uint8_t * USBD_USR_ConfigStrDescriptor( uint8_t speed , uint16_t *length); +uint8_t * USBD_USR_InterfaceStrDescriptor( uint8_t speed , uint16_t *length); + +#ifdef USB_SUPPORT_USER_STRING_DESC +uint8_t * USBD_USR_USRStringDesc (uint8_t speed, uint8_t idx , uint16_t *length); +#endif /* USB_SUPPORT_USER_STRING_DESC */ + +/** + * @} + */ + +#endif /* __USBD_DESC_H */ + +/** + * @} + */ + +/** +* @} +*/ +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/codec2/tags/0.4.1/stm32/usb_conf/usbd_usr.c b/codec2/tags/0.4.1/stm32/usb_conf/usbd_usr.c new file mode 100644 index 00000000..395400d2 --- /dev/null +++ b/codec2/tags/0.4.1/stm32/usb_conf/usbd_usr.c @@ -0,0 +1,126 @@ +/** + ****************************************************************************** + * @file usbd_usr.c + * @author MCD Application Team + * @version V1.0.0 + * @date 19-September-2011 + * @brief This file includes the user application layer + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +#include "usbd_usr.h" +#include "usbd_ioreq.h" + +USBD_Usr_cb_TypeDef USR_cb = +{ + USBD_USR_Init, + USBD_USR_DeviceReset, + USBD_USR_DeviceConfigured, + USBD_USR_DeviceSuspended, + USBD_USR_DeviceResumed, + + USBD_USR_DeviceConnected, + USBD_USR_DeviceDisconnected, +}; + + +/** +* @brief USBD_USR_Init +* Displays the message on LCD for host lib initialization +* @param None +* @retval None +*/ +void USBD_USR_Init(void) +{ + +} + +/** +* @brief USBD_USR_DeviceReset +* Displays the message on LCD on device Reset Event +* @param speed : device speed +* @retval None +*/ +void USBD_USR_DeviceReset(uint8_t speed ) +{ + switch (speed) + { + case USB_OTG_SPEED_HIGH: + break; + + case USB_OTG_SPEED_FULL: + break; + default: + break; + + } +} + + +/** +* @brief USBD_USR_DeviceConfigured +* Displays the message on LCD on device configuration Event +* @param None +* @retval Staus +*/ +void USBD_USR_DeviceConfigured (void) +{ +} + + +/** +* @brief USBD_USR_DeviceConnected +* Displays the message on LCD on device connection Event +* @param None +* @retval Staus +*/ +void USBD_USR_DeviceConnected (void) +{ +} + + +/** +* @brief USBD_USR_DeviceDisonnected +* Displays the message on LCD on device disconnection Event +* @param None +* @retval Staus +*/ +void USBD_USR_DeviceDisconnected (void) +{ +} + +/** +* @brief USBD_USR_DeviceSuspended +* Displays the message on LCD on device suspend Event +* @param None +* @retval None +*/ +void USBD_USR_DeviceSuspended(void) +{ + /* Users can do their application actions here for the USB-Reset */ +} + + +/** +* @brief USBD_USR_DeviceResumed +* Displays the message on LCD on device resume Event +* @param None +* @retval None +*/ +void USBD_USR_DeviceResumed(void) +{ + /* Users can do their application actions here for the USB-Reset */ +} + + diff --git a/codec2/tags/0.4.1/stm32/usb_lib/cdc/usbd_cdc_core.c b/codec2/tags/0.4.1/stm32/usb_lib/cdc/usbd_cdc_core.c new file mode 100644 index 00000000..8d1f15d3 --- /dev/null +++ b/codec2/tags/0.4.1/stm32/usb_lib/cdc/usbd_cdc_core.c @@ -0,0 +1,811 @@ +/** + ****************************************************************************** + * @file usbd_cdc_core.c + * @author MCD Application Team + * @version V1.0.0 + * @date 22-July-2011 + * @brief This file provides the high layer firmware functions to manage the + * following functionalities of the USB CDC Class: + * - Initialization and Configuration of high and low layer + * - Enumeration as CDC Device (and enumeration for each implemented memory interface) + * - OUT/IN data transfer + * - Command IN transfer (class requests management) + * - Error management + * + * @verbatim + * + * =================================================================== + * CDC Class Driver Description + * =================================================================== + * This driver manages the "Universal Serial Bus Class Definitions for Communications Devices + * Revision 1.2 November 16, 2007" and the sub-protocol specification of "Universal Serial Bus + * Communications Class Subclass Specification for PSTN Devices Revision 1.2 February 9, 2007" + * This driver implements the following aspects of the specification: + * - Device descriptor management + * - Configuration descriptor management + * - Enumeration as CDC device with 2 data endpoints (IN and OUT) and 1 command endpoint (IN) + * - Requests management (as described in section 6.2 in specification) + * - Abstract Control Model compliant + * - Union Functional collection (using 1 IN endpoint for control) + * - Data interface class + + * @note + * For the Abstract Control Model, this core allows only transmitting the requests to + * lower layer dispatcher (ie. usbd_cdc_vcp.c/.h) which should manage each request and + * perform relative actions. + * + * These aspects may be enriched or modified for a specific user application. + * + * This driver doesn't implement the following aspects of the specification + * (but it is possible to manage these features with some modifications on this driver): + * - Any class-specific aspect relative to communication classes should be managed by user application. + * - All communication classes other than PSTN are not managed + * + * @endverbatim + * + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_cdc_core.h" +#include "usbd_desc.h" +#include "usbd_req.h" + + +/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY + * @{ + */ + + +/** @defgroup usbd_cdc + * @brief usbd core module + * @{ + */ + +/** @defgroup usbd_cdc_Private_TypesDefinitions + * @{ + */ +/** + * @} + */ + + +/** @defgroup usbd_cdc_Private_Defines + * @{ + */ +/** + * @} + */ + + +/** @defgroup usbd_cdc_Private_Macros + * @{ + */ +/** + * @} + */ + + +/** @defgroup usbd_cdc_Private_FunctionPrototypes + * @{ + */ + +/********************************************* + CDC Device library callbacks + *********************************************/ +static uint8_t usbd_cdc_Init (void *pdev, uint8_t cfgidx); +static uint8_t usbd_cdc_DeInit (void *pdev, uint8_t cfgidx); +static uint8_t usbd_cdc_Setup (void *pdev, USB_SETUP_REQ *req); +static uint8_t usbd_cdc_EP0_RxReady (void *pdev); +static uint8_t usbd_cdc_DataIn (void *pdev, uint8_t epnum); +static uint8_t usbd_cdc_DataOut (void *pdev, uint8_t epnum); +static uint8_t usbd_cdc_SOF (void *pdev); + +/********************************************* + CDC specific management functions + *********************************************/ +static void Handle_USBAsynchXfer (void *pdev); +static uint8_t *USBD_cdc_GetCfgDesc (uint8_t speed, uint16_t *length); +#ifdef USE_USB_OTG_HS +static uint8_t *USBD_cdc_GetOtherCfgDesc (uint8_t speed, uint16_t *length); +#endif +/** + * @} + */ + +/** @defgroup usbd_cdc_Private_Variables + * @{ + */ +extern CDC_IF_Prop_TypeDef APP_FOPS; +extern uint8_t USBD_DeviceDesc [USB_SIZ_DEVICE_DESC]; + +#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED + #if defined ( __ICCARM__ ) /*!< IAR Compiler */ + #pragma data_alignment=4 + #endif +#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */ +__ALIGN_BEGIN uint8_t usbd_cdc_CfgDesc [USB_CDC_CONFIG_DESC_SIZ] __ALIGN_END ; + +#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED + #if defined ( __ICCARM__ ) /*!< IAR Compiler */ + #pragma data_alignment=4 + #endif +#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */ +__ALIGN_BEGIN uint8_t usbd_cdc_OtherCfgDesc [USB_CDC_CONFIG_DESC_SIZ] __ALIGN_END ; + +#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED + #if defined ( __ICCARM__ ) /*!< IAR Compiler */ + #pragma data_alignment=4 + #endif +#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */ +__ALIGN_BEGIN static __IO uint32_t usbd_cdc_AltSet __ALIGN_END = 0; + +#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED + #if defined ( __ICCARM__ ) /*!< IAR Compiler */ + #pragma data_alignment=4 + #endif +#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */ +__ALIGN_BEGIN uint8_t USB_Rx_Buffer [CDC_DATA_MAX_PACKET_SIZE] __ALIGN_END ; + +#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED + #if defined ( __ICCARM__ ) /*!< IAR Compiler */ + #pragma data_alignment=4 + #endif +#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */ +__ALIGN_BEGIN uint8_t APP_Rx_Buffer [APP_RX_DATA_SIZE] __ALIGN_END ; + + +#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED + #if defined ( __ICCARM__ ) /*!< IAR Compiler */ + #pragma data_alignment=4 + #endif +#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */ +__ALIGN_BEGIN uint8_t CmdBuff[CDC_CMD_PACKET_SZE] __ALIGN_END ; + +uint32_t APP_Rx_ptr_in = 0; +uint32_t APP_Rx_ptr_out = 0; +uint32_t APP_Rx_length = 0; + +uint8_t USB_Tx_State = 0; + +static uint32_t cdcCmd = 0xFF; +static uint32_t cdcLen = 0; + +/* CDC interface class callbacks structure */ +USBD_Class_cb_TypeDef USBD_CDC_cb = +{ + usbd_cdc_Init, + usbd_cdc_DeInit, + usbd_cdc_Setup, + NULL, /* EP0_TxSent, */ + usbd_cdc_EP0_RxReady, + usbd_cdc_DataIn, + usbd_cdc_DataOut, + usbd_cdc_SOF, + NULL, + NULL, + USBD_cdc_GetCfgDesc, +#ifdef USE_USB_OTG_HS + USBD_cdc_GetOtherCfgDesc, /* use same cobfig as per FS */ +#endif /* USE_USB_OTG_HS */ +}; + +#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED + #if defined ( __ICCARM__ ) /*!< IAR Compiler */ + #pragma data_alignment=4 + #endif +#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */ +/* USB CDC device Configuration Descriptor */ +__ALIGN_BEGIN uint8_t usbd_cdc_CfgDesc[USB_CDC_CONFIG_DESC_SIZ] __ALIGN_END = +{ + /*Configuration Descriptor*/ + 0x09, /* bLength: Configuration Descriptor size */ + USB_CONFIGURATION_DESCRIPTOR_TYPE, /* bDescriptorType: Configuration */ + USB_CDC_CONFIG_DESC_SIZ, /* wTotalLength:no of returned bytes */ + 0x00, + 0x02, /* bNumInterfaces: 2 interface */ + 0x01, /* bConfigurationValue: Configuration value */ + 0x00, /* iConfiguration: Index of string descriptor describing the configuration */ + 0xC0, /* bmAttributes: self powered */ + 0x32, /* MaxPower 0 mA */ + + /*---------------------------------------------------------------------------*/ + + /*Interface Descriptor */ + 0x09, /* bLength: Interface Descriptor size */ + USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType: Interface */ + /* Interface descriptor type */ + 0x00, /* bInterfaceNumber: Number of Interface */ + 0x00, /* bAlternateSetting: Alternate setting */ + 0x01, /* bNumEndpoints: One endpoints used */ + 0x02, /* bInterfaceClass: Communication Interface Class */ + 0x02, /* bInterfaceSubClass: Abstract Control Model */ + 0x01, /* bInterfaceProtocol: Common AT commands */ + 0x00, /* iInterface: */ + + /*Header Functional Descriptor*/ + 0x05, /* bLength: Endpoint Descriptor size */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x00, /* bDescriptorSubtype: Header Func Desc */ + 0x10, /* bcdCDC: spec release number */ + 0x01, + + /*Call Management Functional Descriptor*/ + 0x05, /* bFunctionLength */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x01, /* bDescriptorSubtype: Call Management Func Desc */ + 0x00, /* bmCapabilities: D0+D1 */ + 0x01, /* bDataInterface: 1 */ + + /*ACM Functional Descriptor*/ + 0x04, /* bFunctionLength */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x02, /* bDescriptorSubtype: Abstract Control Management desc */ + 0x02, /* bmCapabilities */ + + /*Union Functional Descriptor*/ + 0x05, /* bFunctionLength */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x06, /* bDescriptorSubtype: Union func desc */ + 0x00, /* bMasterInterface: Communication class interface */ + 0x01, /* bSlaveInterface0: Data Class Interface */ + + /*Endpoint 2 Descriptor*/ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: Endpoint */ + CDC_CMD_EP, /* bEndpointAddress */ + 0x03, /* bmAttributes: Interrupt */ + LOBYTE(CDC_CMD_PACKET_SZE), /* wMaxPacketSize: */ + HIBYTE(CDC_CMD_PACKET_SZE), +#ifdef USE_USB_OTG_HS + 0x10, /* bInterval: */ +#else + 0xFF, /* bInterval: */ +#endif /* USE_USB_OTG_HS */ + + /*---------------------------------------------------------------------------*/ + + /*Data class interface descriptor*/ + 0x09, /* bLength: Endpoint Descriptor size */ + USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType: */ + 0x01, /* bInterfaceNumber: Number of Interface */ + 0x00, /* bAlternateSetting: Alternate setting */ + 0x02, /* bNumEndpoints: Two endpoints used */ + 0x0A, /* bInterfaceClass: CDC */ + 0x00, /* bInterfaceSubClass: */ + 0x00, /* bInterfaceProtocol: */ + 0x00, /* iInterface: */ + + /*Endpoint OUT Descriptor*/ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: Endpoint */ + CDC_OUT_EP, /* bEndpointAddress */ + 0x02, /* bmAttributes: Bulk */ + LOBYTE(CDC_DATA_MAX_PACKET_SIZE), /* wMaxPacketSize: */ + HIBYTE(CDC_DATA_MAX_PACKET_SIZE), + 0x00, /* bInterval: ignore for Bulk transfer */ + + /*Endpoint IN Descriptor*/ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: Endpoint */ + CDC_IN_EP, /* bEndpointAddress */ + 0x02, /* bmAttributes: Bulk */ + LOBYTE(CDC_DATA_MAX_PACKET_SIZE), /* wMaxPacketSize: */ + HIBYTE(CDC_DATA_MAX_PACKET_SIZE), + 0x00 /* bInterval: ignore for Bulk transfer */ +} ; + +#ifdef USE_USB_OTG_HS +#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED + #if defined ( __ICCARM__ ) /*!< IAR Compiler */ + #pragma data_alignment=4 + #endif +#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */ +__ALIGN_BEGIN uint8_t usbd_cdc_OtherCfgDesc[USB_CDC_CONFIG_DESC_SIZ] __ALIGN_END = +{ + 0x09, /* bLength: Configuation Descriptor size */ + USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION, + USB_CDC_CONFIG_DESC_SIZ, + 0x00, + 0x02, /* bNumInterfaces: 2 interfaces */ + 0x01, /* bConfigurationValue: */ + 0x04, /* iConfiguration: */ + 0xC0, /* bmAttributes: */ + 0x32, /* MaxPower 100 mA */ + + /*Interface Descriptor */ + 0x09, /* bLength: Interface Descriptor size */ + USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType: Interface */ + /* Interface descriptor type */ + 0x00, /* bInterfaceNumber: Number of Interface */ + 0x00, /* bAlternateSetting: Alternate setting */ + 0x01, /* bNumEndpoints: One endpoints used */ + 0x02, /* bInterfaceClass: Communication Interface Class */ + 0x02, /* bInterfaceSubClass: Abstract Control Model */ + 0x01, /* bInterfaceProtocol: Common AT commands */ + 0x00, /* iInterface: */ + + /*Header Functional Descriptor*/ + 0x05, /* bLength: Endpoint Descriptor size */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x00, /* bDescriptorSubtype: Header Func Desc */ + 0x10, /* bcdCDC: spec release number */ + 0x01, + + /*Call Management Functional Descriptor*/ + 0x05, /* bFunctionLength */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x01, /* bDescriptorSubtype: Call Management Func Desc */ + 0x00, /* bmCapabilities: D0+D1 */ + 0x01, /* bDataInterface: 1 */ + + /*ACM Functional Descriptor*/ + 0x04, /* bFunctionLength */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x02, /* bDescriptorSubtype: Abstract Control Management desc */ + 0x02, /* bmCapabilities */ + + /*Union Functional Descriptor*/ + 0x05, /* bFunctionLength */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x06, /* bDescriptorSubtype: Union func desc */ + 0x00, /* bMasterInterface: Communication class interface */ + 0x01, /* bSlaveInterface0: Data Class Interface */ + + /*Endpoint 2 Descriptor*/ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: Endpoint */ + CDC_CMD_EP, /* bEndpointAddress */ + 0x03, /* bmAttributes: Interrupt */ + LOBYTE(CDC_CMD_PACKET_SZE), /* wMaxPacketSize: */ + HIBYTE(CDC_CMD_PACKET_SZE), + 0xFF, /* bInterval: */ + + /*---------------------------------------------------------------------------*/ + + /*Data class interface descriptor*/ + 0x09, /* bLength: Endpoint Descriptor size */ + USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType: */ + 0x01, /* bInterfaceNumber: Number of Interface */ + 0x00, /* bAlternateSetting: Alternate setting */ + 0x02, /* bNumEndpoints: Two endpoints used */ + 0x0A, /* bInterfaceClass: CDC */ + 0x00, /* bInterfaceSubClass: */ + 0x00, /* bInterfaceProtocol: */ + 0x00, /* iInterface: */ + + /*Endpoint OUT Descriptor*/ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: Endpoint */ + CDC_OUT_EP, /* bEndpointAddress */ + 0x02, /* bmAttributes: Bulk */ + 0x40, /* wMaxPacketSize: */ + 0x00, + 0x00, /* bInterval: ignore for Bulk transfer */ + + /*Endpoint IN Descriptor*/ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: Endpoint */ + CDC_IN_EP, /* bEndpointAddress */ + 0x02, /* bmAttributes: Bulk */ + 0x40, /* wMaxPacketSize: */ + 0x00, + 0x00 /* bInterval */ +}; +#endif /* USE_USB_OTG_HS */ + +/** + * @} + */ + +/** @defgroup usbd_cdc_Private_Functions + * @{ + */ + +/** + * @brief usbd_cdc_Init + * Initilaize the CDC interface + * @param pdev: device instance + * @param cfgidx: Configuration index + * @retval status + */ +static uint8_t usbd_cdc_Init (void *pdev, + uint8_t cfgidx) +{ + uint8_t *pbuf; + + /* Open EP IN */ + DCD_EP_Open(pdev, + CDC_IN_EP, + CDC_DATA_IN_PACKET_SIZE, + USB_OTG_EP_BULK); + + /* Open EP OUT */ + DCD_EP_Open(pdev, + CDC_OUT_EP, + CDC_DATA_OUT_PACKET_SIZE, + USB_OTG_EP_BULK); + + /* Open Command IN EP */ + DCD_EP_Open(pdev, + CDC_CMD_EP, + CDC_CMD_PACKET_SZE, + USB_OTG_EP_INT); + + pbuf = (uint8_t *)USBD_DeviceDesc; + pbuf[4] = DEVICE_CLASS_CDC; + pbuf[5] = DEVICE_SUBCLASS_CDC; + + /* Initialize the Interface physical components */ + APP_FOPS.pIf_Init(); + + /* Prepare Out endpoint to receive next packet */ + DCD_EP_PrepareRx(pdev, + CDC_OUT_EP, + (uint8_t*)(USB_Rx_Buffer), + CDC_DATA_OUT_PACKET_SIZE); + + return USBD_OK; +} + +/** + * @brief usbd_cdc_Init + * DeInitialize the CDC layer + * @param pdev: device instance + * @param cfgidx: Configuration index + * @retval status + */ +static uint8_t usbd_cdc_DeInit (void *pdev, + uint8_t cfgidx) +{ + /* Open EP IN */ + DCD_EP_Close(pdev, + CDC_IN_EP); + + /* Open EP OUT */ + DCD_EP_Close(pdev, + CDC_OUT_EP); + + /* Open Command IN EP */ + DCD_EP_Close(pdev, + CDC_CMD_EP); + + /* Restore default state of the Interface physical components */ + APP_FOPS.pIf_DeInit(); + + return USBD_OK; +} + +/** + * @brief usbd_cdc_Setup + * Handle the CDC specific requests + * @param pdev: instance + * @param req: usb requests + * @retval status + */ +static uint8_t usbd_cdc_Setup (void *pdev, + USB_SETUP_REQ *req) +{ + uint16_t len; + uint8_t *pbuf; + + switch (req->bmRequest & USB_REQ_TYPE_MASK) + { + /* CDC Class Requests -------------------------------*/ + case USB_REQ_TYPE_CLASS : + /* Check if the request is a data setup packet */ + if (req->wLength) + { + /* Check if the request is Device-to-Host */ + if (req->bmRequest & 0x80) + { + /* Get the data to be sent to Host from interface layer */ + APP_FOPS.pIf_Ctrl(req->bRequest, CmdBuff, req->wLength); + + /* Send the data to the host */ + USBD_CtlSendData (pdev, + CmdBuff, + req->wLength); + } + else /* Host-to-Device requeset */ + { + /* Set the value of the current command to be processed */ + cdcCmd = req->bRequest; + cdcLen = req->wLength; + + /* Prepare the reception of the buffer over EP0 + Next step: the received data will be managed in usbd_cdc_EP0_TxSent() + function. */ + USBD_CtlPrepareRx (pdev, + CmdBuff, + req->wLength); + } + } + else /* No Data request */ + { + /* Transfer the command to the interface layer */ + APP_FOPS.pIf_Ctrl(req->bRequest, NULL, 0); + } + + return USBD_OK; + + default: + USBD_CtlError (pdev, req); + return USBD_FAIL; + + + + /* Standard Requests -------------------------------*/ + case USB_REQ_TYPE_STANDARD: + switch (req->bRequest) + { + case USB_REQ_GET_DESCRIPTOR: + if( (req->wValue >> 8) == CDC_DESCRIPTOR_TYPE) + { +#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED + pbuf = usbd_cdc_Desc; +#else + pbuf = usbd_cdc_CfgDesc + 9 + (9 * USBD_ITF_MAX_NUM); +#endif + len = MIN(USB_CDC_DESC_SIZ , req->wLength); + } + + USBD_CtlSendData (pdev, + pbuf, + len); + break; + + case USB_REQ_GET_INTERFACE : + USBD_CtlSendData (pdev, + (uint8_t *)&usbd_cdc_AltSet, + 1); + break; + + case USB_REQ_SET_INTERFACE : + if ((uint8_t)(req->wValue) < USBD_ITF_MAX_NUM) + { + usbd_cdc_AltSet = (uint8_t)(req->wValue); + } + else + { + /* Call the error management function (command will be nacked */ + USBD_CtlError (pdev, req); + } + break; + } + } + return USBD_OK; +} + +/** + * @brief usbd_cdc_EP0_RxReady + * Data received on control endpoint + * @param pdev: device device instance + * @retval status + */ +static uint8_t usbd_cdc_EP0_RxReady (void *pdev) +{ + if (cdcCmd != NO_CMD) + { + /* Process the data */ + APP_FOPS.pIf_Ctrl(cdcCmd, CmdBuff, cdcLen); + + /* Reset the command variable to default value */ + cdcCmd = NO_CMD; + } + + return USBD_OK; +} + +/** + * @brief usbd_audio_DataIn + * Data sent on non-control IN endpoint + * @param pdev: device instance + * @param epnum: endpoint number + * @retval status + */ +static uint8_t usbd_cdc_DataIn (void *pdev, uint8_t epnum) +{ + uint16_t USB_Tx_ptr; + uint16_t USB_Tx_length; + + if (USB_Tx_State == 1) + { + if (APP_Rx_length == 0) + { + USB_Tx_State = 0; + } + else + { + if (APP_Rx_length > CDC_DATA_IN_PACKET_SIZE){ + USB_Tx_ptr = APP_Rx_ptr_out; + USB_Tx_length = CDC_DATA_IN_PACKET_SIZE; + + APP_Rx_ptr_out += CDC_DATA_IN_PACKET_SIZE; + APP_Rx_length -= CDC_DATA_IN_PACKET_SIZE; + } + else + { + USB_Tx_ptr = APP_Rx_ptr_out; + USB_Tx_length = APP_Rx_length; + + APP_Rx_ptr_out += APP_Rx_length; + APP_Rx_length = 0; + } + + /* Prepare the available data buffer to be sent on IN endpoint */ + DCD_EP_Tx (pdev, + CDC_IN_EP, + (uint8_t*)&APP_Rx_Buffer[USB_Tx_ptr], + USB_Tx_length); + } + } + + return USBD_OK; +} + +/** + * @brief usbd_audio_DataOut + * Data received on non-control Out endpoint + * @param pdev: device instance + * @param epnum: endpoint number + * @retval status + */ +static uint8_t usbd_cdc_DataOut (void *pdev, uint8_t epnum) +{ + uint16_t USB_Rx_Cnt; + + /* Get the received data buffer and update the counter */ + USB_Rx_Cnt = ((USB_OTG_CORE_HANDLE*)pdev)->dev.out_ep[epnum].xfer_count; + + /* USB data will be immediately processed, this allow next USB traffic being + NAKed till the end of the application Xfer */ + APP_FOPS.pIf_DataRx(USB_Rx_Buffer, USB_Rx_Cnt); + + /* Prepare Out endpoint to receive next packet */ + DCD_EP_PrepareRx(pdev, + CDC_OUT_EP, + (uint8_t*)(USB_Rx_Buffer), + CDC_DATA_OUT_PACKET_SIZE); + + return USBD_OK; +} + +/** + * @brief usbd_audio_SOF + * Start Of Frame event management + * @param pdev: instance + * @param epnum: endpoint number + * @retval status + */ +static uint8_t usbd_cdc_SOF (void *pdev) +{ + static uint32_t FrameCount = 0; + + if (FrameCount++ == CDC_IN_FRAME_INTERVAL) + { + /* Reset the frame counter */ + FrameCount = 0; + + /* Check the data to be sent through IN pipe */ + Handle_USBAsynchXfer(pdev); + } + + return USBD_OK; +} + +/** + * @brief Handle_USBAsynchXfer + * Send data to USB + * @param pdev: instance + * @retval None + */ +static void Handle_USBAsynchXfer (void *pdev) +{ + uint16_t USB_Tx_ptr; + uint16_t USB_Tx_length; + + if(USB_Tx_State != 1) + { + if (APP_Rx_ptr_out == APP_RX_DATA_SIZE) + { + APP_Rx_ptr_out = 0; + } + + if(APP_Rx_ptr_out == APP_Rx_ptr_in) + { + USB_Tx_State = 0; + return; + } + + if(APP_Rx_ptr_out > APP_Rx_ptr_in) /* rollback */ + { + APP_Rx_length = APP_RX_DATA_SIZE - APP_Rx_ptr_out; + + } + else + { + APP_Rx_length = APP_Rx_ptr_in - APP_Rx_ptr_out; + + } +#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED + APP_Rx_length &= ~0x03; +#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */ + + if (APP_Rx_length > CDC_DATA_IN_PACKET_SIZE) + { + USB_Tx_ptr = APP_Rx_ptr_out; + USB_Tx_length = CDC_DATA_IN_PACKET_SIZE; + + APP_Rx_ptr_out += CDC_DATA_IN_PACKET_SIZE; + APP_Rx_length -= CDC_DATA_IN_PACKET_SIZE; + } + else + { + USB_Tx_ptr = APP_Rx_ptr_out; + USB_Tx_length = APP_Rx_length; + + APP_Rx_ptr_out += APP_Rx_length; + APP_Rx_length = 0; + } + USB_Tx_State = 1; + + DCD_EP_Tx (pdev, + CDC_IN_EP, + (uint8_t*)&APP_Rx_Buffer[USB_Tx_ptr], + USB_Tx_length); + } + +} + +/** + * @brief USBD_cdc_GetCfgDesc + * Return configuration descriptor + * @param speed : current device speed + * @param length : pointer data length + * @retval pointer to descriptor buffer + */ +static uint8_t *USBD_cdc_GetCfgDesc (uint8_t speed, uint16_t *length) +{ + *length = sizeof (usbd_cdc_CfgDesc); + return usbd_cdc_CfgDesc; +} + +/** + * @brief USBD_cdc_GetCfgDesc + * Return configuration descriptor + * @param speed : current device speed + * @param length : pointer data length + * @retval pointer to descriptor buffer + */ +#ifdef USE_USB_OTG_HS +static uint8_t *USBD_cdc_GetOtherCfgDesc (uint8_t speed, uint16_t *length) +{ + *length = sizeof (usbd_cdc_OtherCfgDesc); + return usbd_cdc_OtherCfgDesc; +} +#endif +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/codec2/tags/0.4.1/stm32/usb_lib/cdc/usbd_cdc_core.h b/codec2/tags/0.4.1/stm32/usb_lib/cdc/usbd_cdc_core.h new file mode 100644 index 00000000..926f42e1 --- /dev/null +++ b/codec2/tags/0.4.1/stm32/usb_lib/cdc/usbd_cdc_core.h @@ -0,0 +1,137 @@ +/** + ****************************************************************************** + * @file usbd_cdc_core.h + * @author MCD Application Team + * @version V1.0.0 + * @date 22-July-2011 + * @brief header file for the usbd_cdc_core.c file. + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ + +#ifndef __USB_CDC_CORE_H_ +#define __USB_CDC_CORE_H_ + +#include "usbd_ioreq.h" + +/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY + * @{ + */ + +/** @defgroup usbd_cdc + * @brief This file is the Header file for USBD_cdc.c + * @{ + */ + + +/** @defgroup usbd_cdc_Exported_Defines + * @{ + */ +#define USB_CDC_CONFIG_DESC_SIZ (67) +#define USB_CDC_DESC_SIZ (67-9) + +#define CDC_DESCRIPTOR_TYPE 0x21 + +#define DEVICE_CLASS_CDC 0x02 +#define DEVICE_SUBCLASS_CDC 0x00 + + +#define USB_DEVICE_DESCRIPTOR_TYPE 0x01 +#define USB_CONFIGURATION_DESCRIPTOR_TYPE 0x02 +#define USB_STRING_DESCRIPTOR_TYPE 0x03 +#define USB_INTERFACE_DESCRIPTOR_TYPE 0x04 +#define USB_ENDPOINT_DESCRIPTOR_TYPE 0x05 + +#define STANDARD_ENDPOINT_DESC_SIZE 0x09 + +#define CDC_DATA_IN_PACKET_SIZE *(uint16_t *)(((USB_OTG_CORE_HANDLE *)pdev)->dev.pConfig_descriptor + 57) + +#define CDC_DATA_OUT_PACKET_SIZE *(uint16_t *)(((USB_OTG_CORE_HANDLE *)pdev)->dev.pConfig_descriptor + 64) + +/*---------------------------------------------------------------------*/ +/* CDC definitions */ +/*---------------------------------------------------------------------*/ + +/**************************************************/ +/* CDC Requests */ +/**************************************************/ +#define SEND_ENCAPSULATED_COMMAND 0x00 +#define GET_ENCAPSULATED_RESPONSE 0x01 +#define SET_COMM_FEATURE 0x02 +#define GET_COMM_FEATURE 0x03 +#define CLEAR_COMM_FEATURE 0x04 +#define SET_LINE_CODING 0x20 +#define GET_LINE_CODING 0x21 +#define SET_CONTROL_LINE_STATE 0x22 +#define SEND_BREAK 0x23 +#define NO_CMD 0xFF + +/** + * @} + */ + + +/** @defgroup USBD_CORE_Exported_TypesDefinitions + * @{ + */ +typedef struct _CDC_IF_PROP +{ + uint16_t (*pIf_Init) (void); + uint16_t (*pIf_DeInit) (void); + uint16_t (*pIf_Ctrl) (uint32_t Cmd, uint8_t* Buf, uint32_t Len); + uint16_t (*pIf_DataTx) (uint8_t* Buf, uint32_t Len); + uint16_t (*pIf_DataRx) (uint8_t* Buf, uint32_t Len); +} +CDC_IF_Prop_TypeDef; +/** + * @} + */ + + + +/** @defgroup USBD_CORE_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup USBD_CORE_Exported_Variables + * @{ + */ + +extern USBD_Class_cb_TypeDef USBD_CDC_cb; +/** + * @} + */ + +/** @defgroup USB_CORE_Exported_Functions + * @{ + */ +/** + * @} + */ + +#endif // __USB_CDC_CORE_H_ +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/codec2/tags/0.4.1/stm32/usb_lib/cdc/usbd_cdc_vcp.c b/codec2/tags/0.4.1/stm32/usb_lib/cdc/usbd_cdc_vcp.c new file mode 100644 index 00000000..84ae6489 --- /dev/null +++ b/codec2/tags/0.4.1/stm32/usb_lib/cdc/usbd_cdc_vcp.c @@ -0,0 +1,280 @@ +/** + ****************************************************************************** + * @file usbd_cdc_vcp.c + * @author MCD Application Team + * @version V1.0.0 + * @date 22-July-2011 + * @brief Generic media access Layer. + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED +#pragma data_alignment = 4 +#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */ + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_cdc_vcp.h" +#include "stm32f4xx_conf.h" +#include "stm32f4xx_usart.h" + +/* Private variables ---------------------------------------------------------*/ +LINE_CODING linecoding = { + 115200, /* baud rate*/ + 0x00, /* stop bits-1*/ + 0x00, /* parity - none*/ + 0x08 /* nb. of bits 8*/ +}; + +USART_InitTypeDef USART_InitStructure; + +/* These are external variables imported from CDC core to be used for IN + transfer management. */ +extern uint8_t APP_Rx_Buffer[]; /* Write CDC received data in this buffer. + These data will be sent over USB IN endpoint + in the CDC core functions. */ +extern uint32_t APP_Rx_ptr_in; /* Increment this pointer or roll it back to + start address when writing received data + in the buffer APP_Rx_Buffer. */ + +/* Private function prototypes -----------------------------------------------*/ +static uint16_t VCP_Init(void); +static uint16_t VCP_DeInit(void); +static uint16_t VCP_Ctrl(uint32_t Cmd, uint8_t* Buf, uint32_t Len); +static uint16_t VCP_DataTx(uint8_t* Buf, uint32_t Len); +static uint16_t VCP_DataRx(uint8_t* Buf, uint32_t Len); + +CDC_IF_Prop_TypeDef VCP_fops = { VCP_Init, VCP_DeInit, VCP_Ctrl, VCP_DataTx, + VCP_DataRx }; + +/* Private functions ---------------------------------------------------------*/ +/** + * @brief VCP_Init + * Initializes the Media on the STM32 + * @param None + * @retval Result of the opeartion (USBD_OK in all cases) + */ +static uint16_t VCP_Init(void) { + return USBD_OK; +} + +/** + * @brief VCP_DeInit + * DeInitializes the Media on the STM32 + * @param None + * @retval Result of the opeartion (USBD_OK in all cases) + */ +static uint16_t VCP_DeInit(void) { + return USBD_OK; +} + +/** + * @brief VCP_Ctrl + * Manage the CDC class requests + * @param Cmd: Command code + * @param Buf: Buffer containing command data (request parameters) + * @param Len: Number of data to be sent (in bytes) + * @retval Result of the opeartion (USBD_OK in all cases) + */ +static uint16_t VCP_Ctrl(uint32_t Cmd, uint8_t* Buf, uint32_t Len) { + switch (Cmd) { + case SEND_ENCAPSULATED_COMMAND: + /* Not needed for this driver */ + break; + + case GET_ENCAPSULATED_RESPONSE: + /* Not needed for this driver */ + break; + + case SET_COMM_FEATURE: + /* Not needed for this driver */ + break; + + case GET_COMM_FEATURE: + /* Not needed for this driver */ + break; + + case CLEAR_COMM_FEATURE: + /* Not needed for this driver */ + break; + + case SET_LINE_CODING: + /* Not needed for this driver */ + break; + + case GET_LINE_CODING: + Buf[0] = (uint8_t) (linecoding.bitrate); + Buf[1] = (uint8_t) (linecoding.bitrate >> 8); + Buf[2] = (uint8_t) (linecoding.bitrate >> 16); + Buf[3] = (uint8_t) (linecoding.bitrate >> 24); + Buf[4] = linecoding.format; + Buf[5] = linecoding.paritytype; + Buf[6] = linecoding.datatype; + break; + + case SET_CONTROL_LINE_STATE: + /* Not needed for this driver */ + break; + + case SEND_BREAK: + /* Not needed for this driver */ + break; + + default: + break; + } + + return USBD_OK; +} + +/** + * @brief putchar + * Sends one char over the USB serial link. + * @param buf: char to be sent + * @retval none + */ + +void VCP_put_char(uint8_t buf) { + VCP_DataTx(&buf, 1); +} + +void VCP_send_str(uint8_t* buf) { + uint32_t i = 0; + while (*(buf + i)) { + i++; + } + VCP_DataTx(buf, i); +} + +void VCP_send_buffer(uint8_t* buf, int len) { + VCP_DataTx(buf, len); +} + +/** + * @brief VCP_DataTx + * CDC received data to be send over USB IN endpoint are managed in + * this function. + * @param Buf: Buffer of data to be sent + * @param Len: Number of data to be sent (in bytes) + * @retval Result of the opeartion: USBD_OK if all operations are OK else VCP_FAIL + */ +static uint16_t VCP_DataTx(uint8_t* Buf, uint32_t Len) { + uint32_t i = 0; + while (i < Len) { + APP_Rx_Buffer[APP_Rx_ptr_in] = *(Buf + i); + APP_Rx_ptr_in++; + i++; + /* To avoid buffer overflow */ + if (APP_Rx_ptr_in == APP_RX_DATA_SIZE) { + APP_Rx_ptr_in = 0; + } + } + + return USBD_OK; +} + +/** + * @brief VCP_DataRx + * Data received over USB OUT endpoint are sent over CDC interface + * through this function. + * + * @note + * This function will block any OUT packet reception on USB endpoint + * until exiting this function. If you exit this function before transfer + * is complete on CDC interface (ie. using DMA controller) it will result + * in receiving more data while previous ones are still not sent. + * + * @param Buf: Buffer of data to be received + * @param Len: Number of data received (in bytes) + * @retval Result of the opeartion: USBD_OK if all operations are OK else VCP_FAIL + */ + +#define APP_TX_BUF_SIZE 128 +uint8_t APP_Tx_Buffer[APP_TX_BUF_SIZE]; +uint32_t APP_tx_ptr_head; +uint32_t APP_tx_ptr_tail; + +static uint16_t VCP_DataRx(uint8_t* Buf, uint32_t Len) { + uint32_t i; + + for (i = 0; i < Len; i++) { + APP_Tx_Buffer[APP_tx_ptr_head] = *(Buf + i); + APP_tx_ptr_head++; + if (APP_tx_ptr_head == APP_TX_BUF_SIZE) + APP_tx_ptr_head = 0; + + if (APP_tx_ptr_head == APP_tx_ptr_tail) + return USBD_FAIL; + } + + return USBD_OK; +} + +int VCP_get_char(uint8_t *buf) { + if (APP_tx_ptr_head == APP_tx_ptr_tail) + return 0; + + *buf = APP_Tx_Buffer[APP_tx_ptr_tail]; + APP_tx_ptr_tail++; + if (APP_tx_ptr_tail == APP_TX_BUF_SIZE) + APP_tx_ptr_tail = 0; + + return 1; +} + +int VCP_get_string(uint8_t *buf) { + if (APP_tx_ptr_head == APP_tx_ptr_tail) + return 0; + + while (!APP_Tx_Buffer[APP_tx_ptr_tail] + || APP_Tx_Buffer[APP_tx_ptr_tail] == '\n' + || APP_Tx_Buffer[APP_tx_ptr_tail] == '\r') { + APP_tx_ptr_tail++; + if (APP_tx_ptr_tail == APP_TX_BUF_SIZE) + APP_tx_ptr_tail = 0; + if (APP_tx_ptr_head == APP_tx_ptr_tail) + return 0; + } + + int i = 0; + do { + *(buf + i) = APP_Tx_Buffer[i + APP_tx_ptr_tail]; + i++; + + if ((APP_tx_ptr_tail + i) == APP_TX_BUF_SIZE) + i = -APP_tx_ptr_tail; + if (APP_tx_ptr_head == (APP_tx_ptr_tail + i)) + return 0; + + } while (APP_Tx_Buffer[APP_tx_ptr_tail + i] + && APP_Tx_Buffer[APP_tx_ptr_tail + i] != '\n' + && APP_Tx_Buffer[APP_tx_ptr_tail + i] != '\r'); + + *(buf + i) = 0; + APP_tx_ptr_tail += i; + if (APP_tx_ptr_tail >= APP_TX_BUF_SIZE) + APP_tx_ptr_tail -= APP_TX_BUF_SIZE; + return i; +} + +/** + * @brief EVAL_COM_IRQHandler + * + * @param None. + * @retval None. + */ +void EVAL_COM_IRQHandler(void) { + +} + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/codec2/tags/0.4.1/stm32/usb_lib/cdc/usbd_cdc_vcp.h b/codec2/tags/0.4.1/stm32/usb_lib/cdc/usbd_cdc_vcp.h new file mode 100644 index 00000000..98c4d823 --- /dev/null +++ b/codec2/tags/0.4.1/stm32/usb_lib/cdc/usbd_cdc_vcp.h @@ -0,0 +1,68 @@ +/** + ****************************************************************************** + * @file usbd_cdc_vcp.h + * @author MCD Application Team + * @version V1.0.0 + * @date 22-July-2011 + * @brief Header for usbd_cdc_vcp.c file. + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __USBD_CDC_VCP_H +#define __USBD_CDC_VCP_H + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_conf.h" + +#include "usbd_cdc_core.h" +#include "usbd_conf.h" +#include + +/* Exported typef ------------------------------------------------------------*/ +/* The following structures groups all needed parameters to be configured for the + ComPort. These parameters can modified on the fly by the host through CDC class + command class requests. */ +typedef struct +{ + uint32_t bitrate; + uint8_t format; + uint8_t paritytype; + uint8_t datatype; +}LINE_CODING; + +/* Exported constants --------------------------------------------------------*/ +/* The following define is used to route the USART IRQ handler to be used. + The IRQ handler function is implemented in the usbd_cdc_vcp.c file. */ +#ifdef USE_STM322xG_EVAL + #define EVAL_COM_IRQHandler USART3_IRQHandler +#elif defined(USE_STM3210C_EVAL) + #define EVAL_COM_IRQHandler USART2_IRQHandler +#endif /* USE_STM322xG_EVAL */ + +void VCP_put_char(uint8_t buf); +void VCP_send_str(uint8_t* buf); +int VCP_get_char(uint8_t *buf); +int VCP_get_string(uint8_t *buf); +void VCP_send_buffer(uint8_t* buf, int len); + +#define DEFAULT_CONFIG 0 +#define OTHER_CONFIG 1 + +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ + +#endif /* __USBD_CDC_VCP_H */ + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/codec2/tags/0.4.1/stm32/usb_lib/core/usbd_core.c b/codec2/tags/0.4.1/stm32/usb_lib/core/usbd_core.c new file mode 100644 index 00000000..2a51d3ae --- /dev/null +++ b/codec2/tags/0.4.1/stm32/usb_lib/core/usbd_core.c @@ -0,0 +1,476 @@ +/** + ****************************************************************************** + * @file usbd_core.c + * @author MCD Application Team + * @version V1.0.0 + * @date 22-July-2011 + * @brief This file provides all the USBD core functions. + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_core.h" +#include "usbd_req.h" +#include "usbd_ioreq.h" +#include "usb_dcd_int.h" +#include "usb_bsp.h" + +/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY +* @{ +*/ + + +/** @defgroup USBD_CORE +* @brief usbd core module +* @{ +*/ + +/** @defgroup USBD_CORE_Private_TypesDefinitions +* @{ +*/ +/** +* @} +*/ + + +/** @defgroup USBD_CORE_Private_Defines +* @{ +*/ + +/** +* @} +*/ + + +/** @defgroup USBD_CORE_Private_Macros +* @{ +*/ +/** +* @} +*/ + + + + +/** @defgroup USBD_CORE_Private_FunctionPrototypes +* @{ +*/ +static uint8_t USBD_SetupStage(USB_OTG_CORE_HANDLE *pdev); +static uint8_t USBD_DataOutStage(USB_OTG_CORE_HANDLE *pdev , uint8_t epnum); +static uint8_t USBD_DataInStage(USB_OTG_CORE_HANDLE *pdev , uint8_t epnum); +static uint8_t USBD_SOF(USB_OTG_CORE_HANDLE *pdev); +static uint8_t USBD_Reset(USB_OTG_CORE_HANDLE *pdev); +static uint8_t USBD_Suspend(USB_OTG_CORE_HANDLE *pdev); +static uint8_t USBD_Resume(USB_OTG_CORE_HANDLE *pdev); +#ifdef VBUS_SENSING_ENABLED +static uint8_t USBD_DevConnected(USB_OTG_CORE_HANDLE *pdev); +static uint8_t USBD_DevDisconnected(USB_OTG_CORE_HANDLE *pdev); +#endif +static uint8_t USBD_IsoINIncomplete(USB_OTG_CORE_HANDLE *pdev); +static uint8_t USBD_IsoOUTIncomplete(USB_OTG_CORE_HANDLE *pdev); +/** +* @} +*/ + +/** @defgroup USBD_CORE_Private_Variables +* @{ +*/ + + + +USBD_DCD_INT_cb_TypeDef USBD_DCD_INT_cb = +{ + USBD_DataOutStage, + USBD_DataInStage, + USBD_SetupStage, + USBD_SOF, + USBD_Reset, + USBD_Suspend, + USBD_Resume, + USBD_IsoINIncomplete, + USBD_IsoOUTIncomplete, +#ifdef VBUS_SENSING_ENABLED +USBD_DevConnected, +USBD_DevDisconnected, +#endif +}; + +USBD_DCD_INT_cb_TypeDef *USBD_DCD_INT_fops = &USBD_DCD_INT_cb; +/** +* @} +*/ + +/** @defgroup USBD_CORE_Private_Functions +* @{ +*/ + +/** +* @brief USBD_Init +* Initailizes the device stack and load the class driver +* @param pdev: device instance +* @param core_address: USB OTG core ID +* @param class_cb: Class callback structure address +* @param usr_cb: User callback structure address +* @retval None +*/ +void USBD_Init(USB_OTG_CORE_HANDLE *pdev, + USB_OTG_CORE_ID_TypeDef coreID, + USBD_DEVICE *pDevice, + USBD_Class_cb_TypeDef *class_cb, + USBD_Usr_cb_TypeDef *usr_cb) +{ + /* Hardware Init */ + USB_OTG_BSP_Init(pdev); + + USBD_DeInit(pdev); + + /*Register class and user callbacks */ + pdev->dev.class_cb = class_cb; + pdev->dev.usr_cb = usr_cb; + pdev->dev.usr_device = pDevice; + + /* set USB OTG core params */ + DCD_Init(pdev , coreID); + + /* Upon Init call usr callback */ + pdev->dev.usr_cb->Init(); + + /* Enable Interrupts */ + USB_OTG_BSP_EnableInterrupt(pdev); +} + +/** +* @brief USBD_DeInit +* Re-Initialize th deviuce library +* @param pdev: device instance +* @retval status: status +*/ +USBD_Status USBD_DeInit(USB_OTG_CORE_HANDLE *pdev) +{ + /* Software Init */ + + return USBD_OK; +} + +/** +* @brief USBD_SetupStage +* Handle the setup stage +* @param pdev: device instance +* @retval status +*/ +static uint8_t USBD_SetupStage(USB_OTG_CORE_HANDLE *pdev) +{ + USB_SETUP_REQ req; + + USBD_ParseSetupRequest(pdev , &req); + + switch (req.bmRequest & 0x1F) + { + case USB_REQ_RECIPIENT_DEVICE: + USBD_StdDevReq (pdev, &req); + break; + + case USB_REQ_RECIPIENT_INTERFACE: + USBD_StdItfReq(pdev, &req); + break; + + case USB_REQ_RECIPIENT_ENDPOINT: + USBD_StdEPReq(pdev, &req); + break; + + default: + DCD_EP_Stall(pdev , req.bmRequest & 0x80); + break; + } + return USBD_OK; +} + +/** +* @brief USBD_DataOutStage +* Handle data out stage +* @param pdev: device instance +* @param epnum: endpoint index +* @retval status +*/ +static uint8_t USBD_DataOutStage(USB_OTG_CORE_HANDLE *pdev , uint8_t epnum) +{ + USB_OTG_EP *ep; + + if(epnum == 0) + { + ep = &pdev->dev.out_ep[0]; + if ( pdev->dev.device_state == USB_OTG_EP0_DATA_OUT) + { + if(ep->rem_data_len > ep->maxpacket) + { + ep->rem_data_len -= ep->maxpacket; + + if(pdev->cfg.dma_enable == 1) + { + /* in slave mode this, is handled by the RxSTSQLvl ISR */ + ep->xfer_buff += ep->maxpacket; + } + USBD_CtlContinueRx (pdev, + ep->xfer_buff, + MIN(ep->rem_data_len ,ep->maxpacket)); + } + else + { + if((pdev->dev.class_cb->EP0_RxReady != NULL)&& + (pdev->dev.device_status == USB_OTG_CONFIGURED)) + { + pdev->dev.class_cb->EP0_RxReady(pdev); + } + USBD_CtlSendStatus(pdev); + } + } + } + else if((pdev->dev.class_cb->DataOut != NULL)&& + (pdev->dev.device_status == USB_OTG_CONFIGURED)) + { + pdev->dev.class_cb->DataOut(pdev, epnum); + } + return USBD_OK; +} + +/** +* @brief USBD_DataInStage +* Handle data in stage +* @param pdev: device instance +* @param epnum: endpoint index +* @retval status +*/ +static uint8_t USBD_DataInStage(USB_OTG_CORE_HANDLE *pdev , uint8_t epnum) +{ + USB_OTG_EP *ep; + + if(epnum == 0) + { + ep = &pdev->dev.in_ep[0]; + if ( pdev->dev.device_state == USB_OTG_EP0_DATA_IN) + { + if(ep->rem_data_len > ep->maxpacket) + { + ep->rem_data_len -= ep->maxpacket; + if(pdev->cfg.dma_enable == 1) + { + /* in slave mode this, is handled by the TxFifoEmpty ISR */ + ep->xfer_buff += ep->maxpacket; + } + USBD_CtlContinueSendData (pdev, + ep->xfer_buff, + ep->rem_data_len); + } + else + { /* last packet is MPS multiple, so send ZLP packet */ + if((ep->total_data_len % ep->maxpacket == 0) && + (ep->total_data_len >= ep->maxpacket) && + (ep->total_data_len < ep->ctl_data_len )) + { + + USBD_CtlContinueSendData(pdev , NULL, 0); + ep->ctl_data_len = 0; + } + else + { + if((pdev->dev.class_cb->EP0_TxSent != NULL)&& + (pdev->dev.device_status == USB_OTG_CONFIGURED)) + { + pdev->dev.class_cb->EP0_TxSent(pdev); + } + USBD_CtlReceiveStatus(pdev); + } + } + } + } + else if((pdev->dev.class_cb->DataIn != NULL)&& + (pdev->dev.device_status == USB_OTG_CONFIGURED)) + { + pdev->dev.class_cb->DataIn(pdev, epnum); + } + return USBD_OK; +} + +/** +* @brief USBD_Reset +* Handle Reset event +* @param pdev: device instance +* @retval status +*/ + +static uint8_t USBD_Reset(USB_OTG_CORE_HANDLE *pdev) +{ + /* Open EP0 OUT */ + DCD_EP_Open(pdev, + 0x00, + USB_OTG_MAX_EP0_SIZE, + EP_TYPE_CTRL); + + /* Open EP0 IN */ + DCD_EP_Open(pdev, + 0x80, + USB_OTG_MAX_EP0_SIZE, + EP_TYPE_CTRL); + + /* Upon Reset call usr call back */ + pdev->dev.device_status = USB_OTG_DEFAULT; + pdev->dev.usr_cb->DeviceReset(pdev->cfg.speed); + + return USBD_OK; +} + +/** +* @brief USBD_Resume +* Handle Resume event +* @param pdev: device instance +* @retval status +*/ + +static uint8_t USBD_Resume(USB_OTG_CORE_HANDLE *pdev) +{ + /* Upon Resume call usr call back */ + pdev->dev.usr_cb->DeviceResumed(); + pdev->dev.device_status = USB_OTG_CONFIGURED; + return USBD_OK; +} + + +/** +* @brief USBD_Suspend +* Handle Suspend event +* @param pdev: device instance +* @retval status +*/ + +static uint8_t USBD_Suspend(USB_OTG_CORE_HANDLE *pdev) +{ + + pdev->dev.device_status = USB_OTG_SUSPENDED; + /* Upon Resume call usr call back */ + pdev->dev.usr_cb->DeviceSuspended(); + return USBD_OK; +} + + +/** +* @brief USBD_SOF +* Handle SOF event +* @param pdev: device instance +* @retval status +*/ + +static uint8_t USBD_SOF(USB_OTG_CORE_HANDLE *pdev) +{ + if(pdev->dev.class_cb->SOF) + { + pdev->dev.class_cb->SOF(pdev); + } + return USBD_OK; +} +/** +* @brief USBD_SetCfg +* Configure device and start the interface +* @param pdev: device instance +* @param cfgidx: configuration index +* @retval status +*/ + +USBD_Status USBD_SetCfg(USB_OTG_CORE_HANDLE *pdev, uint8_t cfgidx) +{ + pdev->dev.class_cb->Init(pdev, cfgidx); + + /* Upon set config call usr call back */ + pdev->dev.usr_cb->DeviceConfigured(); + return USBD_OK; +} + +/** +* @brief USBD_ClrCfg +* Clear current configuration +* @param pdev: device instance +* @param cfgidx: configuration index +* @retval status: USBD_Status +*/ +USBD_Status USBD_ClrCfg(USB_OTG_CORE_HANDLE *pdev, uint8_t cfgidx) +{ + pdev->dev.class_cb->DeInit(pdev, cfgidx); + return USBD_OK; +} + +/** +* @brief USBD_IsoINIncomplete +* Handle iso in incomplete event +* @param pdev: device instance +* @retval status +*/ +static uint8_t USBD_IsoINIncomplete(USB_OTG_CORE_HANDLE *pdev) +{ + pdev->dev.class_cb->IsoINIncomplete(pdev); + return USBD_OK; +} + +/** +* @brief USBD_IsoOUTIncomplete +* Handle iso out incomplete event +* @param pdev: device instance +* @retval status +*/ +static uint8_t USBD_IsoOUTIncomplete(USB_OTG_CORE_HANDLE *pdev) +{ + pdev->dev.class_cb->IsoOUTIncomplete(pdev); + return USBD_OK; +} + +#ifdef VBUS_SENSING_ENABLED +/** +* @brief USBD_DevConnected +* Handle device connection event +* @param pdev: device instance +* @retval status +*/ +static uint8_t USBD_DevConnected(USB_OTG_CORE_HANDLE *pdev) +{ + pdev->dev.usr_cb->DeviceConnected(); + return USBD_OK; +} + +/** +* @brief USBD_DevDisconnected +* Handle device disconnection event +* @param pdev: device instance +* @retval status +*/ +static uint8_t USBD_DevDisconnected(USB_OTG_CORE_HANDLE *pdev) +{ + pdev->dev.usr_cb->DeviceDisconnected(); + pdev->dev.class_cb->DeInit(pdev, 0); + return USBD_OK; +} +#endif +/** +* @} +*/ + + +/** +* @} +*/ + + +/** +* @} +*/ + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ + diff --git a/codec2/tags/0.4.1/stm32/usb_lib/core/usbd_core.h b/codec2/tags/0.4.1/stm32/usb_lib/core/usbd_core.h new file mode 100644 index 00000000..fb20acf6 --- /dev/null +++ b/codec2/tags/0.4.1/stm32/usb_lib/core/usbd_core.h @@ -0,0 +1,114 @@ +/** + ****************************************************************************** + * @file usbd_core.h + * @author MCD Application Team + * @version V1.0.0 + * @date 22-July-2011 + * @brief Header file for usbd_core.c + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __USBD_CORE_H +#define __USBD_CORE_H + +/* Includes ------------------------------------------------------------------*/ +#include "usb_dcd.h" +#include "usbd_def.h" +#include "usbd_conf.h" + +/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY + * @{ + */ + +/** @defgroup USBD_CORE + * @brief This file is the Header file for usbd_core.c file + * @{ + */ + + +/** @defgroup USBD_CORE_Exported_Defines + * @{ + */ + +typedef enum { + USBD_OK = 0, + USBD_BUSY, + USBD_FAIL, +}USBD_Status; +/** + * @} + */ + + +/** @defgroup USBD_CORE_Exported_TypesDefinitions + * @{ + */ + + +/** + * @} + */ + + + +/** @defgroup USBD_CORE_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup USBD_CORE_Exported_Variables + * @{ + */ + +/** + * @} + */ + +/** @defgroup USBD_CORE_Exported_FunctionsPrototype + * @{ + */ +void USBD_Init(USB_OTG_CORE_HANDLE *pdev, + USB_OTG_CORE_ID_TypeDef coreID, + USBD_DEVICE *pDevice, + USBD_Class_cb_TypeDef *class_cb, + USBD_Usr_cb_TypeDef *usr_cb); + +USBD_Status USBD_DeInit(USB_OTG_CORE_HANDLE *pdev); + +USBD_Status USBD_ClrCfg(USB_OTG_CORE_HANDLE *pdev, uint8_t cfgidx); + +USBD_Status USBD_SetCfg(USB_OTG_CORE_HANDLE *pdev, uint8_t cfgidx); + +/** + * @} + */ + +#endif /* __USBD_CORE_H */ + +/** + * @} + */ + +/** +* @} +*/ + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ + + + diff --git a/codec2/tags/0.4.1/stm32/usb_lib/core/usbd_def.h b/codec2/tags/0.4.1/stm32/usb_lib/core/usbd_def.h new file mode 100644 index 00000000..a8c86710 --- /dev/null +++ b/codec2/tags/0.4.1/stm32/usb_lib/core/usbd_def.h @@ -0,0 +1,149 @@ +/** + ****************************************************************************** + * @file usbd_def.h + * @author MCD Application Team + * @version V1.0.0 + * @date 22-July-2011 + * @brief general defines for the usb device library + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ + +#ifndef __USBD_DEF_H +#define __USBD_DEF_H +/* Includes ------------------------------------------------------------------*/ +#include "usbd_conf.h" + +/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY + * @{ + */ + +/** @defgroup USB_DEF + * @brief general defines for the usb device library file + * @{ + */ + +/** @defgroup USB_DEF_Exported_Defines + * @{ + */ + +#ifndef NULL +#define NULL 0 +#endif + +#define USB_LEN_DEV_QUALIFIER_DESC 0x0A +#define USB_LEN_DEV_DESC 0x12 +#define USB_LEN_CFG_DESC 0x09 +#define USB_LEN_IF_DESC 0x09 +#define USB_LEN_EP_DESC 0x07 +#define USB_LEN_OTG_DESC 0x03 + +#define USBD_IDX_LANGID_STR 0x00 +#define USBD_IDX_MFC_STR 0x01 +#define USBD_IDX_PRODUCT_STR 0x02 +#define USBD_IDX_SERIAL_STR 0x03 +#define USBD_IDX_CONFIG_STR 0x04 +#define USBD_IDX_INTERFACE_STR 0x05 + +#define USB_REQ_TYPE_STANDARD 0x00 +#define USB_REQ_TYPE_CLASS 0x20 +#define USB_REQ_TYPE_VENDOR 0x40 +#define USB_REQ_TYPE_MASK 0x60 + +#define USB_REQ_RECIPIENT_DEVICE 0x00 +#define USB_REQ_RECIPIENT_INTERFACE 0x01 +#define USB_REQ_RECIPIENT_ENDPOINT 0x02 +#define USB_REQ_RECIPIENT_MASK 0x03 + +#define USB_REQ_GET_STATUS 0x00 +#define USB_REQ_CLEAR_FEATURE 0x01 +#define USB_REQ_SET_FEATURE 0x03 +#define USB_REQ_SET_ADDRESS 0x05 +#define USB_REQ_GET_DESCRIPTOR 0x06 +#define USB_REQ_SET_DESCRIPTOR 0x07 +#define USB_REQ_GET_CONFIGURATION 0x08 +#define USB_REQ_SET_CONFIGURATION 0x09 +#define USB_REQ_GET_INTERFACE 0x0A +#define USB_REQ_SET_INTERFACE 0x0B +#define USB_REQ_SYNCH_FRAME 0x0C + +#define USB_DESC_TYPE_DEVICE 1 +#define USB_DESC_TYPE_CONFIGURATION 2 +#define USB_DESC_TYPE_STRING 3 +#define USB_DESC_TYPE_INTERFACE 4 +#define USB_DESC_TYPE_ENDPOINT 5 +#define USB_DESC_TYPE_DEVICE_QUALIFIER 6 +#define USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION 7 + + +#define USB_CONFIG_REMOTE_WAKEUP 2 +#define USB_CONFIG_SELF_POWERED 1 + +#define USB_FEATURE_EP_HALT 0 +#define USB_FEATURE_REMOTE_WAKEUP 1 +#define USB_FEATURE_TEST_MODE 2 + +/** + * @} + */ + + +/** @defgroup USBD_DEF_Exported_TypesDefinitions + * @{ + */ +/** + * @} + */ + + + +/** @defgroup USBD_DEF_Exported_Macros + * @{ + */ +#define SWAPBYTE(addr) (((uint16_t)(*((uint8_t *)(addr)))) + \ + (((uint16_t)(*(((uint8_t *)(addr)) + 1))) << 8)) + +#define LOBYTE(x) ((uint8_t)(x & 0x00FF)) +#define HIBYTE(x) ((uint8_t)((x & 0xFF00) >>8)) +/** + * @} + */ + +/** @defgroup USBD_DEF_Exported_Variables + * @{ + */ + +/** + * @} + */ + +/** @defgroup USBD_DEF_Exported_FunctionsPrototype + * @{ + */ + +/** + * @} + */ + +#endif /* __USBD_DEF_H */ + +/** + * @} + */ + +/** +* @} +*/ +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/codec2/tags/0.4.1/stm32/usb_lib/core/usbd_ioreq.c b/codec2/tags/0.4.1/stm32/usb_lib/core/usbd_ioreq.c new file mode 100644 index 00000000..6964766b --- /dev/null +++ b/codec2/tags/0.4.1/stm32/usb_lib/core/usbd_ioreq.c @@ -0,0 +1,237 @@ +/** + ****************************************************************************** + * @file usbd_ioreq.c + * @author MCD Application Team + * @version V1.0.0 + * @date 22-July-2011 + * @brief This file provides the IO requests APIs for control endpoints. + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_ioreq.h" +/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY + * @{ + */ + + +/** @defgroup USBD_IOREQ + * @brief control I/O requests module + * @{ + */ + +/** @defgroup USBD_IOREQ_Private_TypesDefinitions + * @{ + */ +/** + * @} + */ + + +/** @defgroup USBD_IOREQ_Private_Defines + * @{ + */ + +/** + * @} + */ + + +/** @defgroup USBD_IOREQ_Private_Macros + * @{ + */ +/** + * @} + */ + + +/** @defgroup USBD_IOREQ_Private_Variables + * @{ + */ + +/** + * @} + */ + + +/** @defgroup USBD_IOREQ_Private_FunctionPrototypes + * @{ + */ +/** + * @} + */ + + +/** @defgroup USBD_IOREQ_Private_Functions + * @{ + */ + +/** +* @brief USBD_CtlSendData +* send data on the ctl pipe +* @param pdev: device instance +* @param buff: pointer to data buffer +* @param len: length of data to be sent +* @retval status +*/ +USBD_Status USBD_CtlSendData (USB_OTG_CORE_HANDLE *pdev, + uint8_t *pbuf, + uint16_t len) +{ + USBD_Status ret = USBD_OK; + + pdev->dev.in_ep[0].total_data_len = len; + pdev->dev.in_ep[0].rem_data_len = len; + pdev->dev.device_state = USB_OTG_EP0_DATA_IN; + + DCD_EP_Tx (pdev, 0, pbuf, len); + + return ret; +} + +/** +* @brief USBD_CtlContinueSendData +* continue sending data on the ctl pipe +* @param pdev: device instance +* @param buff: pointer to data buffer +* @param len: length of data to be sent +* @retval status +*/ +USBD_Status USBD_CtlContinueSendData (USB_OTG_CORE_HANDLE *pdev, + uint8_t *pbuf, + uint16_t len) +{ + USBD_Status ret = USBD_OK; + + DCD_EP_Tx (pdev, 0, pbuf, len); + + + return ret; +} + +/** +* @brief USBD_CtlPrepareRx +* receive data on the ctl pipe +* @param pdev: USB OTG device instance +* @param buff: pointer to data buffer +* @param len: length of data to be received +* @retval status +*/ +USBD_Status USBD_CtlPrepareRx (USB_OTG_CORE_HANDLE *pdev, + uint8_t *pbuf, + uint16_t len) +{ + USBD_Status ret = USBD_OK; + + pdev->dev.out_ep[0].total_data_len = len; + pdev->dev.out_ep[0].rem_data_len = len; + pdev->dev.device_state = USB_OTG_EP0_DATA_OUT; + + DCD_EP_PrepareRx (pdev, + 0, + pbuf, + len); + + + return ret; +} + +/** +* @brief USBD_CtlContinueRx +* continue receive data on the ctl pipe +* @param pdev: USB OTG device instance +* @param buff: pointer to data buffer +* @param len: length of data to be received +* @retval status +*/ +USBD_Status USBD_CtlContinueRx (USB_OTG_CORE_HANDLE *pdev, + uint8_t *pbuf, + uint16_t len) +{ + USBD_Status ret = USBD_OK; + + DCD_EP_PrepareRx (pdev, + 0, + pbuf, + len); + return ret; +} +/** +* @brief USBD_CtlSendStatus +* send zero lzngth packet on the ctl pipe +* @param pdev: USB OTG device instance +* @retval status +*/ +USBD_Status USBD_CtlSendStatus (USB_OTG_CORE_HANDLE *pdev) +{ + USBD_Status ret = USBD_OK; + pdev->dev.device_state = USB_OTG_EP0_STATUS_IN; + DCD_EP_Tx (pdev, + 0, + NULL, + 0); + + USB_OTG_EP0_OutStart(pdev); + + return ret; +} + +/** +* @brief USBD_CtlReceiveStatus +* receive zero lzngth packet on the ctl pipe +* @param pdev: USB OTG device instance +* @retval status +*/ +USBD_Status USBD_CtlReceiveStatus (USB_OTG_CORE_HANDLE *pdev) +{ + USBD_Status ret = USBD_OK; + pdev->dev.device_state = USB_OTG_EP0_STATUS_OUT; + DCD_EP_PrepareRx ( pdev, + 0, + NULL, + 0); + + USB_OTG_EP0_OutStart(pdev); + + return ret; +} + + +/** +* @brief USBD_GetRxCount +* returns the received data length +* @param pdev: USB OTG device instance +* epnum: endpoint index +* @retval Rx Data blength +*/ +uint16_t USBD_GetRxCount (USB_OTG_CORE_HANDLE *pdev , uint8_t epnum) +{ + return pdev->dev.out_ep[epnum].xfer_count; +} + +/** + * @} + */ + + +/** + * @} + */ + + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/codec2/tags/0.4.1/stm32/usb_lib/core/usbd_ioreq.h b/codec2/tags/0.4.1/stm32/usb_lib/core/usbd_ioreq.h new file mode 100644 index 00000000..ca755f2b --- /dev/null +++ b/codec2/tags/0.4.1/stm32/usb_lib/core/usbd_ioreq.h @@ -0,0 +1,115 @@ +/** + ****************************************************************************** + * @file usbd_ioreq.h + * @author MCD Application Team + * @version V1.0.0 + * @date 22-July-2011 + * @brief header file for the usbd_ioreq.c file + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ + +#ifndef __USBD_IOREQ_H_ +#define __USBD_IOREQ_H_ + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_def.h" +#include "usbd_core.h" + +/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY + * @{ + */ + +/** @defgroup USBD_IOREQ + * @brief header file for the usbd_ioreq.c file + * @{ + */ + +/** @defgroup USBD_IOREQ_Exported_Defines + * @{ + */ +/** + * @} + */ + + +/** @defgroup USBD_IOREQ_Exported_Types + * @{ + */ + + +/** + * @} + */ + + + +/** @defgroup USBD_IOREQ_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup USBD_IOREQ_Exported_Variables + * @{ + */ + +/** + * @} + */ + +/** @defgroup USBD_IOREQ_Exported_FunctionsPrototype + * @{ + */ + +USBD_Status USBD_CtlSendData (USB_OTG_CORE_HANDLE *pdev, + uint8_t *buf, + uint16_t len); + +USBD_Status USBD_CtlContinueSendData (USB_OTG_CORE_HANDLE *pdev, + uint8_t *pbuf, + uint16_t len); + +USBD_Status USBD_CtlPrepareRx (USB_OTG_CORE_HANDLE *pdev, + uint8_t *pbuf, + uint16_t len); + +USBD_Status USBD_CtlContinueRx (USB_OTG_CORE_HANDLE *pdev, + uint8_t *pbuf, + uint16_t len); + +USBD_Status USBD_CtlSendStatus (USB_OTG_CORE_HANDLE *pdev); + +USBD_Status USBD_CtlReceiveStatus (USB_OTG_CORE_HANDLE *pdev); + +uint16_t USBD_GetRxCount (USB_OTG_CORE_HANDLE *pdev , + uint8_t epnum); + +/** + * @} + */ + +#endif /* __USBD_IOREQ_H_ */ + +/** + * @} + */ + +/** +* @} +*/ +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/codec2/tags/0.4.1/stm32/usb_lib/core/usbd_req.c b/codec2/tags/0.4.1/stm32/usb_lib/core/usbd_req.c new file mode 100644 index 00000000..f08d26c6 --- /dev/null +++ b/codec2/tags/0.4.1/stm32/usb_lib/core/usbd_req.c @@ -0,0 +1,868 @@ +/** + ****************************************************************************** + * @file usbd_req.c + * @author MCD Application Team + * @version V1.0.0 + * @date 22-July-2011 + * @brief This file provides the standard USB requests following chapter 9. + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_req.h" +#include "usbd_ioreq.h" +#include "usbd_desc.h" + + +/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY + * @{ + */ + + +/** @defgroup USBD_REQ + * @brief USB standard requests module + * @{ + */ + +/** @defgroup USBD_REQ_Private_TypesDefinitions + * @{ + */ +/** + * @} + */ + + +/** @defgroup USBD_REQ_Private_Defines + * @{ + */ + +/** + * @} + */ + + +/** @defgroup USBD_REQ_Private_Macros + * @{ + */ +/** + * @} + */ + + +/** @defgroup USBD_REQ_Private_Variables + * @{ + */ + +#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED + #if defined ( __ICCARM__ ) /*!< IAR Compiler */ + #pragma data_alignment=4 + #endif +#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */ +__ALIGN_BEGIN uint32_t USBD_ep_status __ALIGN_END = 0; + +#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED + #if defined ( __ICCARM__ ) /*!< IAR Compiler */ + #pragma data_alignment=4 + #endif +#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */ +__ALIGN_BEGIN uint32_t USBD_default_cfg __ALIGN_END = 0; + +#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED + #if defined ( __ICCARM__ ) /*!< IAR Compiler */ + #pragma data_alignment=4 + #endif +#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */ +__ALIGN_BEGIN uint32_t USBD_cfg_status __ALIGN_END = 0; + +#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED + #if defined ( __ICCARM__ ) /*!< IAR Compiler */ + #pragma data_alignment=4 + #endif +#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */ +__ALIGN_BEGIN uint8_t USBD_StrDesc[USB_MAX_STR_DESC_SIZ] __ALIGN_END ; +/** + * @} + */ + + +/** @defgroup USBD_REQ_Private_FunctionPrototypes + * @{ + */ +static void USBD_GetDescriptor(USB_OTG_CORE_HANDLE *pdev, + USB_SETUP_REQ *req); + +static void USBD_SetAddress(USB_OTG_CORE_HANDLE *pdev, + USB_SETUP_REQ *req); + +static void USBD_SetConfig(USB_OTG_CORE_HANDLE *pdev, + USB_SETUP_REQ *req); + +static void USBD_GetConfig(USB_OTG_CORE_HANDLE *pdev, + USB_SETUP_REQ *req); + +static void USBD_GetStatus(USB_OTG_CORE_HANDLE *pdev, + USB_SETUP_REQ *req); + +static void USBD_SetFeature(USB_OTG_CORE_HANDLE *pdev, + USB_SETUP_REQ *req); + +static void USBD_ClrFeature(USB_OTG_CORE_HANDLE *pdev, + USB_SETUP_REQ *req); + +static uint8_t USBD_GetLen(uint8_t *buf); +/** + * @} + */ + + +/** @defgroup USBD_REQ_Private_Functions + * @{ + */ + + +/** +* @brief USBD_StdDevReq +* Handle standard usb device requests +* @param pdev: device instance +* @param req: usb request +* @retval status +*/ +USBD_Status USBD_StdDevReq (USB_OTG_CORE_HANDLE *pdev, USB_SETUP_REQ *req) +{ + USBD_Status ret = USBD_OK; + + switch (req->bRequest) + { + case USB_REQ_GET_DESCRIPTOR: + + USBD_GetDescriptor (pdev, req) ; + break; + + case USB_REQ_SET_ADDRESS: + USBD_SetAddress(pdev, req); + break; + + case USB_REQ_SET_CONFIGURATION: + USBD_SetConfig (pdev , req); + break; + + case USB_REQ_GET_CONFIGURATION: + USBD_GetConfig (pdev , req); + break; + + case USB_REQ_GET_STATUS: + USBD_GetStatus (pdev , req); + break; + + + case USB_REQ_SET_FEATURE: + USBD_SetFeature (pdev , req); + break; + + case USB_REQ_CLEAR_FEATURE: + USBD_ClrFeature (pdev , req); + break; + + default: + USBD_CtlError(pdev , req); + break; + } + + return ret; +} + +/** +* @brief USBD_StdItfReq +* Handle standard usb interface requests +* @param pdev: USB OTG device instance +* @param req: usb request +* @retval status +*/ +USBD_Status USBD_StdItfReq (USB_OTG_CORE_HANDLE *pdev, USB_SETUP_REQ *req) +{ + USBD_Status ret = USBD_OK; + + switch (pdev->dev.device_status) + { + case USB_OTG_CONFIGURED: + + if (LOBYTE(req->wIndex) <= USBD_ITF_MAX_NUM) + { + pdev->dev.class_cb->Setup (pdev, req); + + if((req->wLength == 0)&& (ret == USBD_OK)) + { + USBD_CtlSendStatus(pdev); + } + } + else + { + USBD_CtlError(pdev , req); + } + break; + + default: + USBD_CtlError(pdev , req); + break; + } + return ret; +} + +/** +* @brief USBD_StdEPReq +* Handle standard usb endpoint requests +* @param pdev: USB OTG device instance +* @param req: usb request +* @retval status +*/ +USBD_Status USBD_StdEPReq (USB_OTG_CORE_HANDLE *pdev, USB_SETUP_REQ *req) +{ + + uint8_t ep_addr; + USBD_Status ret = USBD_OK; + + ep_addr = LOBYTE(req->wIndex); + + switch (req->bRequest) + { + + case USB_REQ_SET_FEATURE : + + switch (pdev->dev.device_status) + { + case USB_OTG_ADDRESSED: + if ((ep_addr != 0x00) && (ep_addr != 0x80)) + { + DCD_EP_Stall(pdev , ep_addr); + } + break; + + case USB_OTG_CONFIGURED: + if (req->wValue == USB_FEATURE_EP_HALT) + { + if ((ep_addr != 0x00) && (ep_addr != 0x80)) + { + DCD_EP_Stall(pdev , ep_addr); + + } + } + pdev->dev.class_cb->Setup (pdev, req); + USBD_CtlSendStatus(pdev); + + break; + + default: + USBD_CtlError(pdev , req); + break; + } + break; + + case USB_REQ_CLEAR_FEATURE : + + switch (pdev->dev.device_status) + { + case USB_OTG_ADDRESSED: + if ((ep_addr != 0x00) && (ep_addr != 0x80)) + { + DCD_EP_Stall(pdev , ep_addr); + } + break; + + case USB_OTG_CONFIGURED: + if (req->wValue == USB_FEATURE_EP_HALT) + { + if ((ep_addr != 0x00) && (ep_addr != 0x80)) + { + DCD_EP_ClrStall(pdev , ep_addr); + pdev->dev.class_cb->Setup (pdev, req); + } + USBD_CtlSendStatus(pdev); + } + break; + + default: + USBD_CtlError(pdev , req); + break; + } + break; + + case USB_REQ_GET_STATUS: + switch (pdev->dev.device_status) + { + case USB_OTG_ADDRESSED: + if ((ep_addr != 0x00) && (ep_addr != 0x80)) + { + DCD_EP_Stall(pdev , ep_addr); + } + break; + + case USB_OTG_CONFIGURED: + + + if ((ep_addr & 0x80)== 0x80) + { + if(pdev->dev.in_ep[ep_addr & 0x7F].is_stall) + { + USBD_ep_status = 0x0001; + } + else + { + USBD_ep_status = 0x0000; + } + } + else if ((ep_addr & 0x80)== 0x00) + { + if(pdev->dev.out_ep[ep_addr].is_stall) + { + USBD_ep_status = 0x0001; + } + + else + { + USBD_ep_status = 0x0000; + } + } + USBD_CtlSendData (pdev, + (uint8_t *)&USBD_ep_status, + 2); + break; + + default: + USBD_CtlError(pdev , req); + break; + } + break; + + default: + break; + } + return ret; +} +/** +* @brief USBD_GetDescriptor +* Handle Get Descriptor requests +* @param pdev: device instance +* @param req: usb request +* @retval status +*/ +static void USBD_GetDescriptor(USB_OTG_CORE_HANDLE *pdev, + USB_SETUP_REQ *req) +{ + uint16_t len; + uint8_t *pbuf; + + switch (req->wValue >> 8) + { + case USB_DESC_TYPE_DEVICE: + pbuf = pdev->dev.usr_device->GetDeviceDescriptor(pdev->cfg.speed, &len); + if ((req->wLength == 64) ||( pdev->dev.device_status == USB_OTG_DEFAULT)) + { + len = 8; + } + break; + + case USB_DESC_TYPE_CONFIGURATION: + pbuf = (uint8_t *)pdev->dev.class_cb->GetConfigDescriptor(pdev->cfg.speed, &len); +#ifdef USB_OTG_HS_CORE + if((pdev->cfg.speed == USB_OTG_SPEED_FULL )&& + (pdev->cfg.phy_itface == USB_OTG_ULPI_PHY)) + { + pbuf = (uint8_t *)pdev->dev.class_cb->GetOtherConfigDescriptor(pdev->cfg.speed, &len); + } +#endif + pbuf[1] = USB_DESC_TYPE_CONFIGURATION; + pdev->dev.pConfig_descriptor = pbuf; + break; + + case USB_DESC_TYPE_STRING: + switch ((uint8_t)(req->wValue)) + { + case USBD_IDX_LANGID_STR: + pbuf = pdev->dev.usr_device->GetLangIDStrDescriptor(pdev->cfg.speed, &len); + break; + + case USBD_IDX_MFC_STR: + pbuf = pdev->dev.usr_device->GetManufacturerStrDescriptor(pdev->cfg.speed, &len); + break; + + case USBD_IDX_PRODUCT_STR: + pbuf = pdev->dev.usr_device->GetProductStrDescriptor(pdev->cfg.speed, &len); + break; + + case USBD_IDX_SERIAL_STR: + pbuf = pdev->dev.usr_device->GetSerialStrDescriptor(pdev->cfg.speed, &len); + break; + + case USBD_IDX_CONFIG_STR: + pbuf = pdev->dev.usr_device->GetConfigurationStrDescriptor(pdev->cfg.speed, &len); + break; + + case USBD_IDX_INTERFACE_STR: + pbuf = pdev->dev.usr_device->GetInterfaceStrDescriptor(pdev->cfg.speed, &len); + break; + + default: +#ifdef USB_SUPPORT_USER_STRING_DESC + pbuf = pdev->dev.class_cb->GetUsrStrDescriptor(pdev->cfg.speed, (req->wValue) , &len); + break; +#else + USBD_CtlError(pdev , req); + return; +#endif /* USBD_CtlError(pdev , req); */ + } + break; + case USB_DESC_TYPE_DEVICE_QUALIFIER: +#ifdef USB_OTG_HS_CORE + if(pdev->cfg.speed == USB_OTG_SPEED_HIGH ) + { + + pbuf = (uint8_t *)pdev->dev.class_cb->GetConfigDescriptor(pdev->cfg.speed, &len); + + USBD_DeviceQualifierDesc[4]= pbuf[14]; + USBD_DeviceQualifierDesc[5]= pbuf[15]; + USBD_DeviceQualifierDesc[6]= pbuf[16]; + + pbuf = USBD_DeviceQualifierDesc; + len = USB_LEN_DEV_QUALIFIER_DESC; + break; + } + else + { + USBD_CtlError(pdev , req); + return; + } +#else + USBD_CtlError(pdev , req); + return; +#endif + + case USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION: +#ifdef USB_OTG_HS_CORE + + if(pdev->cfg.speed == USB_OTG_SPEED_HIGH ) + { + pbuf = (uint8_t *)pdev->dev.class_cb->GetOtherConfigDescriptor(pdev->cfg.speed, &len); + pbuf[1] = USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION; + break; + } + else + { + USBD_CtlError(pdev , req); + return; + } +#else + USBD_CtlError(pdev , req); + return; +#endif + + + default: + USBD_CtlError(pdev , req); + return; + } + + if((len != 0)&& (req->wLength != 0)) + { + + len = MIN(len , req->wLength); + + USBD_CtlSendData (pdev, + pbuf, + len); + } + +} + +/** +* @brief USBD_SetAddress +* Set device address +* @param pdev: device instance +* @param req: usb request +* @retval status +*/ +static void USBD_SetAddress(USB_OTG_CORE_HANDLE *pdev, + USB_SETUP_REQ *req) +{ + uint8_t dev_addr; + + if ((req->wIndex == 0) && (req->wLength == 0)) + { + dev_addr = (uint8_t)(req->wValue) & 0x7F; + + if (pdev->dev.device_status == USB_OTG_CONFIGURED) + { + USBD_CtlError(pdev , req); + } + else + { + pdev->dev.device_address = dev_addr; + DCD_EP_SetAddress(pdev, dev_addr); + USBD_CtlSendStatus(pdev); + + if (dev_addr != 0) + { + pdev->dev.device_status = USB_OTG_ADDRESSED; + } + else + { + pdev->dev.device_status = USB_OTG_DEFAULT; + } + } + } + else + { + USBD_CtlError(pdev , req); + } +} + +/** +* @brief USBD_SetConfig +* Handle Set device configuration request +* @param pdev: device instance +* @param req: usb request +* @retval status +*/ +static void USBD_SetConfig(USB_OTG_CORE_HANDLE *pdev, + USB_SETUP_REQ *req) +{ + + static uint8_t cfgidx; + + cfgidx = (uint8_t)(req->wValue); + + if (cfgidx > USBD_CFG_MAX_NUM ) + { + USBD_CtlError(pdev , req); + } + else + { + switch (pdev->dev.device_status) + { + case USB_OTG_ADDRESSED: + if (cfgidx) + { + pdev->dev.device_config = cfgidx; + pdev->dev.device_status = USB_OTG_CONFIGURED; + USBD_SetCfg(pdev , cfgidx); + USBD_CtlSendStatus(pdev); + } + else + { + USBD_CtlSendStatus(pdev); + } + break; + + case USB_OTG_CONFIGURED: + if (cfgidx == 0) + { + pdev->dev.device_status = USB_OTG_ADDRESSED; + pdev->dev.device_config = cfgidx; + USBD_ClrCfg(pdev , cfgidx); + USBD_CtlSendStatus(pdev); + + } + else if (cfgidx != pdev->dev.device_config) + { + /* Clear old configuration */ + USBD_ClrCfg(pdev , pdev->dev.device_config); + + /* set new configuration */ + pdev->dev.device_config = cfgidx; + USBD_SetCfg(pdev , cfgidx); + USBD_CtlSendStatus(pdev); + } + else + { + USBD_CtlSendStatus(pdev); + } + break; + + default: + USBD_CtlError(pdev , req); + break; + } + } +} + +/** +* @brief USBD_GetConfig +* Handle Get device configuration request +* @param pdev: device instance +* @param req: usb request +* @retval status +*/ +static void USBD_GetConfig(USB_OTG_CORE_HANDLE *pdev, + USB_SETUP_REQ *req) +{ + + if (req->wLength != 1) + { + USBD_CtlError(pdev , req); + } + else + { + switch (pdev->dev.device_status ) + { + case USB_OTG_ADDRESSED: + + USBD_CtlSendData (pdev, + (uint8_t *)&USBD_default_cfg, + 1); + break; + + case USB_OTG_CONFIGURED: + + USBD_CtlSendData (pdev, + &pdev->dev.device_config, + 1); + break; + + default: + USBD_CtlError(pdev , req); + break; + } + } +} + +/** +* @brief USBD_GetStatus +* Handle Get Status request +* @param pdev: device instance +* @param req: usb request +* @retval status +*/ +static void USBD_GetStatus(USB_OTG_CORE_HANDLE *pdev, + USB_SETUP_REQ *req) +{ + + switch (pdev->dev.device_status) + { + case USB_OTG_ADDRESSED: + case USB_OTG_CONFIGURED: + + if (pdev->dev.DevRemoteWakeup) + { + USBD_cfg_status = USB_CONFIG_SELF_POWERED | USB_CONFIG_REMOTE_WAKEUP; + } + else + { + USBD_cfg_status = USB_CONFIG_SELF_POWERED; + } + + USBD_CtlSendData (pdev, + (uint8_t *)&USBD_cfg_status, + 1); + break; + + default : + USBD_CtlError(pdev , req); + break; + } +} + + +/** +* @brief USBD_SetFeature +* Handle Set device feature request +* @param pdev: device instance +* @param req: usb request +* @retval status +*/ +static void USBD_SetFeature(USB_OTG_CORE_HANDLE *pdev, + USB_SETUP_REQ *req) +{ + + USB_OTG_DCTL_TypeDef dctl; + uint8_t test_mode = 0; + + if (req->wValue == USB_FEATURE_REMOTE_WAKEUP) + { + pdev->dev.DevRemoteWakeup = 1; + pdev->dev.class_cb->Setup (pdev, req); + USBD_CtlSendStatus(pdev); + } + + else if ((req->wValue == USB_FEATURE_TEST_MODE) && + ((req->wIndex & 0xFF) == 0)) + { + dctl.d32 = USB_OTG_READ_REG32(&pdev->regs.DREGS->DCTL); + + test_mode = req->wIndex >> 8; + switch (test_mode) + { + case 1: // TEST_J + dctl.b.tstctl = 1; + break; + + case 2: // TEST_K + dctl.b.tstctl = 2; + break; + + case 3: // TEST_SE0_NAK + dctl.b.tstctl = 3; + break; + + case 4: // TEST_PACKET + dctl.b.tstctl = 4; + break; + + case 5: // TEST_FORCE_ENABLE + dctl.b.tstctl = 5; + break; + } + USB_OTG_WRITE_REG32(&pdev->regs.DREGS->DCTL, dctl.d32); + USBD_CtlSendStatus(pdev); + } + +} + + +/** +* @brief USBD_ClrFeature +* Handle clear device feature request +* @param pdev: device instance +* @param req: usb request +* @retval status +*/ +static void USBD_ClrFeature(USB_OTG_CORE_HANDLE *pdev, + USB_SETUP_REQ *req) +{ + switch (pdev->dev.device_status) + { + case USB_OTG_ADDRESSED: + case USB_OTG_CONFIGURED: + if (req->wValue == USB_FEATURE_REMOTE_WAKEUP) + { + pdev->dev.DevRemoteWakeup = 0; + pdev->dev.class_cb->Setup (pdev, req); + USBD_CtlSendStatus(pdev); + } + break; + + default : + USBD_CtlError(pdev , req); + break; + } +} + +/** +* @brief USBD_ParseSetupRequest +* Copy buffer into setup structure +* @param pdev: device instance +* @param req: usb request +* @retval None +*/ + +void USBD_ParseSetupRequest( USB_OTG_CORE_HANDLE *pdev, + USB_SETUP_REQ *req) +{ + req->bmRequest = *(uint8_t *) (pdev->dev.setup_packet); + req->bRequest = *(uint8_t *) (pdev->dev.setup_packet + 1); + req->wValue = SWAPBYTE (pdev->dev.setup_packet + 2); + req->wIndex = SWAPBYTE (pdev->dev.setup_packet + 4); + req->wLength = SWAPBYTE (pdev->dev.setup_packet + 6); + + pdev->dev.in_ep[0].ctl_data_len = req->wLength ; + pdev->dev.device_state = USB_OTG_EP0_SETUP; +} + +/** +* @brief USBD_CtlError +* Handle USB low level Error +* @param pdev: device instance +* @param req: usb request +* @retval None +*/ + +void USBD_CtlError( USB_OTG_CORE_HANDLE *pdev, + USB_SETUP_REQ *req) +{ + if((req->bmRequest & 0x80) == 0x80) + { + DCD_EP_Stall(pdev , 0x80); + } + else + { + if(req->wLength == 0) + { + DCD_EP_Stall(pdev , 0x80); + } + else + { + DCD_EP_Stall(pdev , 0); + } + } + USB_OTG_EP0_OutStart(pdev); +} + + +/** + * @brief USBD_GetString + * Convert Ascii string into unicode one + * @param desc : descriptor buffer + * @param unicode : Formatted string buffer (unicode) + * @param len : descriptor length + * @retval None + */ +void USBD_GetString(uint8_t *desc, uint8_t *unicode, uint16_t *len) +{ + uint8_t idx = 0; + + if (desc != NULL) + { + *len = USBD_GetLen(desc) * 2 + 2; + unicode[idx++] = *len; + unicode[idx++] = USB_DESC_TYPE_STRING; + + while (*desc != NULL) + { + unicode[idx++] = *desc++; + unicode[idx++] = 0x00; + } + } +} + +/** + * @brief USBD_GetLen + * return the string length + * @param buf : pointer to the ascii string buffer + * @retval string length + */ +static uint8_t USBD_GetLen(uint8_t *buf) +{ + uint8_t len = 0; + + while (*buf != NULL) + { + len++; + buf++; + } + + return len; +} +/** + * @} + */ + + +/** + * @} + */ + + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/codec2/tags/0.4.1/stm32/usb_lib/core/usbd_req.h b/codec2/tags/0.4.1/stm32/usb_lib/core/usbd_req.h new file mode 100644 index 00000000..9aa9e44a --- /dev/null +++ b/codec2/tags/0.4.1/stm32/usb_lib/core/usbd_req.h @@ -0,0 +1,102 @@ +/** + ****************************************************************************** + * @file usbd_req.h + * @author MCD Application Team + * @version V1.0.0 + * @date 22-July-2011 + * @brief header file for the usbd_req.c file + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ + +#ifndef __USB_REQUEST_H_ +#define __USB_REQUEST_H_ + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_def.h" +#include "usbd_core.h" +#include "usbd_conf.h" + + +/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY + * @{ + */ + +/** @defgroup USBD_REQ + * @brief header file for the usbd_ioreq.c file + * @{ + */ + +/** @defgroup USBD_REQ_Exported_Defines + * @{ + */ +/** + * @} + */ + + +/** @defgroup USBD_REQ_Exported_Types + * @{ + */ +/** + * @} + */ + + + +/** @defgroup USBD_REQ_Exported_Macros + * @{ + */ +/** + * @} + */ + +/** @defgroup USBD_REQ_Exported_Variables + * @{ + */ +/** + * @} + */ + +/** @defgroup USBD_REQ_Exported_FunctionsPrototype + * @{ + */ + +USBD_Status USBD_StdDevReq (USB_OTG_CORE_HANDLE *pdev, USB_SETUP_REQ *req); +USBD_Status USBD_StdItfReq (USB_OTG_CORE_HANDLE *pdev, USB_SETUP_REQ *req); +USBD_Status USBD_StdEPReq (USB_OTG_CORE_HANDLE *pdev, USB_SETUP_REQ *req); +void USBD_ParseSetupRequest( USB_OTG_CORE_HANDLE *pdev, + USB_SETUP_REQ *req); + +void USBD_CtlError( USB_OTG_CORE_HANDLE *pdev, + USB_SETUP_REQ *req); + +void USBD_GetString(uint8_t *desc, uint8_t *unicode, uint16_t *len); +/** + * @} + */ + +#endif /* __USB_REQUEST_H_ */ + +/** + * @} + */ + +/** +* @} +*/ + + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/codec2/tags/0.4.1/stm32/usb_lib/core/usbd_usr.h b/codec2/tags/0.4.1/stm32/usb_lib/core/usbd_usr.h new file mode 100644 index 00000000..44e7b1dd --- /dev/null +++ b/codec2/tags/0.4.1/stm32/usb_lib/core/usbd_usr.h @@ -0,0 +1,135 @@ +/** + ****************************************************************************** + * @file usbd_usr.h + * @author MCD Application Team + * @version V1.0.0 + * @date 22-July-2011 + * @brief Header file for usbd_usr.c + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __USBD_USR_H__ +#define __USBD_USR_H__ + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_core.h" + + +/** @addtogroup USBD_USER + * @{ + */ + +/** @addtogroup USBD_MSC_DEMO_USER_CALLBACKS + * @{ + */ + +/** @defgroup USBD_USR + * @brief This file is the Header file for usbd_usr.c + * @{ + */ + + +/** @defgroup USBD_USR_Exported_Types + * @{ + */ + +extern USBD_Usr_cb_TypeDef USR_cb; +extern USBD_Usr_cb_TypeDef USR_FS_cb; +extern USBD_Usr_cb_TypeDef USR_HS_cb; + + + +/** + * @} + */ + + + +/** @defgroup USBD_USR_Exported_Defines + * @{ + */ + +/** + * @} + */ + +/** @defgroup USBD_USR_Exported_Macros + * @{ + */ +/** + * @} + */ + +/** @defgroup USBD_USR_Exported_Variables + * @{ + */ + +void USBD_USR_Init(void); +void USBD_USR_DeviceReset (uint8_t speed); +void USBD_USR_DeviceConfigured (void); +void USBD_USR_DeviceSuspended(void); +void USBD_USR_DeviceResumed(void); + +void USBD_USR_DeviceConnected(void); +void USBD_USR_DeviceDisconnected(void); + +void USBD_USR_FS_Init(void); +void USBD_USR_FS_DeviceReset (uint8_t speed); +void USBD_USR_FS_DeviceConfigured (void); +void USBD_USR_FS_DeviceSuspended(void); +void USBD_USR_FS_DeviceResumed(void); + +void USBD_USR_FS_DeviceConnected(void); +void USBD_USR_FS_DeviceDisconnected(void); + +void USBD_USR_HS_Init(void); +void USBD_USR_HS_DeviceReset (uint8_t speed); +void USBD_USR_HS_DeviceConfigured (void); +void USBD_USR_HS_DeviceSuspended(void); +void USBD_USR_HS_DeviceResumed(void); + +void USBD_USR_HS_DeviceConnected(void); +void USBD_USR_HS_DeviceDisconnected(void); + +/** + * @} + */ + +/** @defgroup USBD_USR_Exported_FunctionsPrototype + * @{ + */ +/** + * @} + */ + +#endif /*__USBD_USR_H__*/ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ + + + + diff --git a/codec2/tags/0.4.1/stm32/usb_lib/otg/usb_core.c b/codec2/tags/0.4.1/stm32/usb_lib/otg/usb_core.c new file mode 100644 index 00000000..74e432ac --- /dev/null +++ b/codec2/tags/0.4.1/stm32/usb_lib/otg/usb_core.c @@ -0,0 +1,2187 @@ +/** + ****************************************************************************** + * @file usb_core.c + * @author MCD Application Team + * @version V2.0.0 + * @date 22-July-2011 + * @brief USB-OTG Core Layer + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "usb_core.h" +#include "usb_bsp.h" + + +/** @addtogroup USB_OTG_DRIVER +* @{ +*/ + +/** @defgroup USB_CORE +* @brief This file includes the USB-OTG Core Layer +* @{ +*/ + + +/** @defgroup USB_CORE_Private_Defines +* @{ +*/ + +/** +* @} +*/ + + +/** @defgroup USB_CORE_Private_TypesDefinitions +* @{ +*/ +/** +* @} +*/ + + + +/** @defgroup USB_CORE_Private_Macros +* @{ +*/ +/** +* @} +*/ + + +/** @defgroup USB_CORE_Private_Variables +* @{ +*/ +/** +* @} +*/ + + +/** @defgroup USB_CORE_Private_FunctionPrototypes +* @{ +*/ +/** +* @} +*/ + + +/** @defgroup USB_CORE_Private_Functions +* @{ +*/ + +/** +* @brief USB_OTG_EnableCommonInt +* Initializes the commmon interrupts, used in both device and modes +* @param pdev : Selected device +* @retval None +*/ +static void USB_OTG_EnableCommonInt(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_GINTMSK_TypeDef int_mask; + + int_mask.d32 = 0; + /* Clear any pending USB_OTG Interrupts */ +#ifndef USE_OTG_MODE + USB_OTG_WRITE_REG32( &pdev->regs.GREGS->GOTGINT, 0xFFFFFFFF); +#endif + /* Clear any pending interrupts */ + USB_OTG_WRITE_REG32( &pdev->regs.GREGS->GINTSTS, 0xFFFFFFFF); + /* Enable the interrupts in the INTMSK */ + int_mask.b.wkupintr = 1; + int_mask.b.usbsuspend = 1; + +#ifdef USE_OTG_MODE + int_mask.b.otgintr = 1; + int_mask.b.sessreqintr = 1; + int_mask.b.conidstschng = 1; +#endif + USB_OTG_WRITE_REG32( &pdev->regs.GREGS->GINTMSK, int_mask.d32); +} + +/** +* @brief USB_OTG_CoreReset : Soft reset of the core +* @param pdev : Selected device +* @retval USB_OTG_STS : status +*/ +static USB_OTG_STS USB_OTG_CoreReset(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_STS status = USB_OTG_OK; + __IO USB_OTG_GRSTCTL_TypeDef greset; + uint32_t count = 0; + + greset.d32 = 0; + /* Wait for AHB master IDLE state. */ + do + { + USB_OTG_BSP_uDelay(3); + greset.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->GRSTCTL); + if (++count > 200000) + { + return USB_OTG_OK; + } + } + while (greset.b.ahbidle == 0); + /* Core Soft Reset */ + count = 0; + greset.b.csftrst = 1; + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GRSTCTL, greset.d32 ); + do + { + greset.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->GRSTCTL); + if (++count > 200000) + { + break; + } + } + while (greset.b.csftrst == 1); + /* Wait for 3 PHY Clocks*/ + USB_OTG_BSP_uDelay(3); + return status; +} + +/** +* @brief USB_OTG_WritePacket : Writes a packet into the Tx FIFO associated +* with the EP +* @param pdev : Selected device +* @param src : source pointer +* @param ch_ep_num : end point number +* @param bytes : No. of bytes +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_WritePacket(USB_OTG_CORE_HANDLE *pdev, + uint8_t *src, + uint8_t ch_ep_num, + uint16_t len) +{ + USB_OTG_STS status = USB_OTG_OK; + if (pdev->cfg.dma_enable == 0) + { + uint32_t count32b= 0 , i= 0; + __IO uint32_t *fifo; + + count32b = (len + 3) / 4; + fifo = pdev->regs.DFIFO[ch_ep_num]; + for (i = 0; i < count32b; i++, src+=4) + { + USB_OTG_WRITE_REG32( fifo, *((__packed uint32_t *)src) ); + } + } + return status; +} + + +/** +* @brief USB_OTG_ReadPacket : Reads a packet from the Rx FIFO +* @param pdev : Selected device +* @param dest : Destination Pointer +* @param bytes : No. of bytes +* @retval None +*/ +void *USB_OTG_ReadPacket(USB_OTG_CORE_HANDLE *pdev, + uint8_t *dest, + uint16_t len) +{ + uint32_t i=0; + uint32_t count32b = (len + 3) / 4; + + __IO uint32_t *fifo = pdev->regs.DFIFO[0]; + + for ( i = 0; i < count32b; i++, dest += 4 ) + { + *(__packed uint32_t *)dest = USB_OTG_READ_REG32(fifo); + + } + return ((void *)dest); +} + +/** +* @brief USB_OTG_SelectCore +* Initialize core registers address. +* @param pdev : Selected device +* @param coreID : USB OTG Core ID +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_SelectCore(USB_OTG_CORE_HANDLE *pdev, + USB_OTG_CORE_ID_TypeDef coreID) +{ + uint32_t i , baseAddress = 0; + USB_OTG_STS status = USB_OTG_OK; + + pdev->cfg.dma_enable = 0; + + /* at startup the core is in FS mode */ + pdev->cfg.speed = USB_OTG_SPEED_FULL; + pdev->cfg.mps = USB_OTG_FS_MAX_PACKET_SIZE ; + + /* initialize device cfg following its address */ + if (coreID == USB_OTG_FS_CORE_ID) + { + baseAddress = USB_OTG_FS_BASE_ADDR; + pdev->cfg.coreID = USB_OTG_FS_CORE_ID; + pdev->cfg.host_channels = 8 ; + pdev->cfg.dev_endpoints = 4 ; + pdev->cfg.TotalFifoSize = 320; /* in 32-bits */ + pdev->cfg.phy_itface = USB_OTG_EMBEDDED_PHY; + +#ifdef USB_OTG_FS_SOF_OUTPUT_ENABLED + pdev->cfg.Sof_output = 1; +#endif + +#ifdef USB_OTG_FS_LOW_PWR_MGMT_SUPPORT + pdev->cfg.low_power = 1; +#endif + } + else if (coreID == USB_OTG_HS_CORE_ID) + { + baseAddress = USB_OTG_HS_BASE_ADDR; + pdev->cfg.coreID = USB_OTG_HS_CORE_ID; + pdev->cfg.host_channels = 12 ; + pdev->cfg.dev_endpoints = 6 ; + pdev->cfg.TotalFifoSize = 1280;/* in 32-bits */ + +#ifdef USB_OTG_ULPI_PHY_ENABLED + pdev->cfg.phy_itface = USB_OTG_ULPI_PHY; +#else + #ifdef USB_OTG_EMBEDDED_PHY_ENABLED + pdev->cfg.phy_itface = USB_OTG_EMBEDDED_PHY; + #else + #ifdef USB_OTG_I2C_PHY_ENABLED + pdev->cfg.phy_itface = USB_OTG_I2C_PHY; + #endif + #endif +#endif + +#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED + pdev->cfg.dma_enable = 1; +#endif + +#ifdef USB_OTG_HS_SOF_OUTPUT_ENABLED + pdev->cfg.Sof_output = 1; +#endif + +#ifdef USB_OTG_HS_LOW_PWR_MGMT_SUPPORT + pdev->cfg.low_power = 1; +#endif + + } + + pdev->regs.GREGS = (USB_OTG_GREGS *)(baseAddress + \ + USB_OTG_CORE_GLOBAL_REGS_OFFSET); + pdev->regs.DREGS = (USB_OTG_DREGS *) (baseAddress + \ + USB_OTG_DEV_GLOBAL_REG_OFFSET); + + for (i = 0; i < pdev->cfg.dev_endpoints; i++) + { + pdev->regs.INEP_REGS[i] = (USB_OTG_INEPREGS *) \ + (baseAddress + USB_OTG_DEV_IN_EP_REG_OFFSET + \ + (i * USB_OTG_EP_REG_OFFSET)); + pdev->regs.OUTEP_REGS[i] = (USB_OTG_OUTEPREGS *) \ + (baseAddress + USB_OTG_DEV_OUT_EP_REG_OFFSET + \ + (i * USB_OTG_EP_REG_OFFSET)); + } + pdev->regs.HREGS = (USB_OTG_HREGS *)(baseAddress + \ + USB_OTG_HOST_GLOBAL_REG_OFFSET); + pdev->regs.HPRT0 = (uint32_t *)(baseAddress + USB_OTG_HOST_PORT_REGS_OFFSET); + + for (i = 0; i < pdev->cfg.host_channels; i++) + { + pdev->regs.HC_REGS[i] = (USB_OTG_HC_REGS *)(baseAddress + \ + USB_OTG_HOST_CHAN_REGS_OFFSET + \ + (i * USB_OTG_CHAN_REGS_OFFSET)); + } + for (i = 0; i < pdev->cfg.host_channels; i++) + { + pdev->regs.DFIFO[i] = (uint32_t *)(baseAddress + USB_OTG_DATA_FIFO_OFFSET +\ + (i * USB_OTG_DATA_FIFO_SIZE)); + } + pdev->regs.PCGCCTL = (uint32_t *)(baseAddress + USB_OTG_PCGCCTL_OFFSET); + + return status; +} + + +/** +* @brief USB_OTG_CoreInit +* Initializes the USB_OTG controller registers and prepares the core +* device mode or host mode operation. +* @param pdev : Selected device +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_CoreInit(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_STS status = USB_OTG_OK; + USB_OTG_GUSBCFG_TypeDef usbcfg; + USB_OTG_GCCFG_TypeDef gccfg; + USB_OTG_GI2CCTL_TypeDef i2cctl; + USB_OTG_GAHBCFG_TypeDef ahbcfg; + + usbcfg.d32 = 0; + gccfg.d32 = 0; + ahbcfg.d32 = 0; + + + + if (pdev->cfg.phy_itface == USB_OTG_ULPI_PHY) + { + gccfg.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->GCCFG); + gccfg.b.pwdn = 0; + + if (pdev->cfg.Sof_output) + { + gccfg.b.sofouten = 1; + } + USB_OTG_WRITE_REG32 (&pdev->regs.GREGS->GCCFG, gccfg.d32); + + /* Init The ULPI Interface */ + usbcfg.d32 = 0; + usbcfg.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->GUSBCFG); + + usbcfg.b.physel = 0; /* HS Interface */ +#ifdef USB_OTG_INTERNAL_VBUS_ENABLED + usbcfg.b.ulpi_ext_vbus_drv = 0; /* Use internal VBUS */ +#else + #ifdef USB_OTG_EXTERNAL_VBUS_ENABLED + usbcfg.b.ulpi_ext_vbus_drv = 1; /* Use external VBUS */ + #endif +#endif + usbcfg.b.term_sel_dl_pulse = 0; /* Data line pulsing using utmi_txvalid */ + usbcfg.b.ulpi_utmi_sel = 1; /* ULPI seleInterfacect */ + + usbcfg.b.phyif = 0; /* 8 bits */ + usbcfg.b.ddrsel = 0; /* single data rate */ + + usbcfg.b.ulpi_fsls = 0; + usbcfg.b.ulpi_clk_sus_m = 0; + USB_OTG_WRITE_REG32 (&pdev->regs.GREGS->GUSBCFG, usbcfg.d32); + + /* Reset after a PHY select */ + USB_OTG_CoreReset(pdev); + + if(pdev->cfg.dma_enable == 1) + { + + ahbcfg.b.hburstlen = 5; /* 64 x 32-bits*/ + ahbcfg.b.dmaenable = 1; + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GAHBCFG, ahbcfg.d32); + + } + } + else /* FS interface (embedded Phy or I2C Phy) */ + { + + usbcfg.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->GUSBCFG);; + usbcfg.b.physel = 1; /* FS Interface */ + USB_OTG_WRITE_REG32 (&pdev->regs.GREGS->GUSBCFG, usbcfg.d32); + /* Reset after a PHY select and set Host mode */ + USB_OTG_CoreReset(pdev); + /* Enable the I2C interface and deactivate the power down*/ + gccfg.d32 = 0; + gccfg.b.pwdn = 1; + + if(pdev->cfg.phy_itface == USB_OTG_I2C_PHY) + { + gccfg.b.i2cifen = 1; + } + gccfg.b.vbussensingA = 1 ; + gccfg.b.vbussensingB = 1 ; +#ifndef VBUS_SENSING_ENABLED + gccfg.b.disablevbussensing = 1; +#endif + + if(pdev->cfg.Sof_output) + { + gccfg.b.sofouten = 1; + } + + USB_OTG_WRITE_REG32 (&pdev->regs.GREGS->GCCFG, gccfg.d32); + USB_OTG_BSP_mDelay(20); + /* Program GUSBCFG.OtgUtmifsSel to I2C*/ + usbcfg.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->GUSBCFG); + + if(pdev->cfg.phy_itface == USB_OTG_I2C_PHY) + { + usbcfg.b.otgutmifssel = 1; + } + + USB_OTG_WRITE_REG32 (&pdev->regs.GREGS->GUSBCFG, usbcfg.d32); + + if(pdev->cfg.phy_itface == USB_OTG_I2C_PHY) + { + /*Program GI2CCTL.I2CEn*/ + i2cctl.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->GI2CCTL); + i2cctl.b.i2cdevaddr = 1; + i2cctl.b.i2cen = 0; + i2cctl.b.dat_se0 = 1; + i2cctl.b.addr = 0x2D; + USB_OTG_WRITE_REG32 (&pdev->regs.GREGS->GI2CCTL, i2cctl.d32); + + USB_OTG_BSP_mDelay(200); + + i2cctl.b.i2cen = 1; + USB_OTG_WRITE_REG32 (&pdev->regs.GREGS->GI2CCTL, i2cctl.d32); + USB_OTG_BSP_mDelay(200); + } + } + /* case the HS core is working in FS mode */ + if(pdev->cfg.dma_enable == 1) + { + + ahbcfg.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->GAHBCFG); + ahbcfg.b.hburstlen = 5; /* 64 x 32-bits*/ + ahbcfg.b.dmaenable = 1; + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GAHBCFG, ahbcfg.d32); + + } + /* initialize OTG features */ +#ifdef USE_OTG_MODE + usbcfg.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->GUSBCFG); + usbcfg.b.hnpcap = 1; + usbcfg.b.srpcap = 1; + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GUSBCFG, usbcfg.d32); + USB_OTG_EnableCommonInt(pdev); +#endif + return status; +} +/** +* @brief USB_OTG_EnableGlobalInt +* Enables the controller's Global Int in the AHB Config reg +* @param pdev : Selected device +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_EnableGlobalInt(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_STS status = USB_OTG_OK; + USB_OTG_GAHBCFG_TypeDef ahbcfg; + + ahbcfg.d32 = 0; + ahbcfg.b.glblintrmsk = 1; /* Enable interrupts */ + USB_OTG_MODIFY_REG32(&pdev->regs.GREGS->GAHBCFG, 0, ahbcfg.d32); + return status; +} + + +/** +* @brief USB_OTG_DisableGlobalInt +* Enables the controller's Global Int in the AHB Config reg +* @param pdev : Selected device +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_DisableGlobalInt(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_STS status = USB_OTG_OK; + USB_OTG_GAHBCFG_TypeDef ahbcfg; + ahbcfg.d32 = 0; + ahbcfg.b.glblintrmsk = 1; /* Enable interrupts */ + USB_OTG_MODIFY_REG32(&pdev->regs.GREGS->GAHBCFG, ahbcfg.d32, 0); + return status; +} + + +/** +* @brief USB_OTG_FlushTxFifo : Flush a Tx FIFO +* @param pdev : Selected device +* @param num : FO num +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_FlushTxFifo (USB_OTG_CORE_HANDLE *pdev , uint32_t num ) +{ + USB_OTG_STS status = USB_OTG_OK; + __IO USB_OTG_GRSTCTL_TypeDef greset; + + uint32_t count = 0; + greset.d32 = 0; + greset.b.txfflsh = 1; + greset.b.txfnum = num; + USB_OTG_WRITE_REG32( &pdev->regs.GREGS->GRSTCTL, greset.d32 ); + do + { + greset.d32 = USB_OTG_READ_REG32( &pdev->regs.GREGS->GRSTCTL); + if (++count > 200000) + { + break; + } + } + while (greset.b.txfflsh == 1); + /* Wait for 3 PHY Clocks*/ + USB_OTG_BSP_uDelay(3); + return status; +} + + +/** +* @brief USB_OTG_FlushRxFifo : Flush a Rx FIFO +* @param pdev : Selected device +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_FlushRxFifo( USB_OTG_CORE_HANDLE *pdev ) +{ + USB_OTG_STS status = USB_OTG_OK; + __IO USB_OTG_GRSTCTL_TypeDef greset; + uint32_t count = 0; + + greset.d32 = 0; + greset.b.rxfflsh = 1; + USB_OTG_WRITE_REG32( &pdev->regs.GREGS->GRSTCTL, greset.d32 ); + do + { + greset.d32 = USB_OTG_READ_REG32( &pdev->regs.GREGS->GRSTCTL); + if (++count > 200000) + { + break; + } + } + while (greset.b.rxfflsh == 1); + /* Wait for 3 PHY Clocks*/ + USB_OTG_BSP_uDelay(3); + return status; +} + + +/** +* @brief USB_OTG_SetCurrentMode : Set ID line +* @param pdev : Selected device +* @param mode : (Host/device) +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_SetCurrentMode(USB_OTG_CORE_HANDLE *pdev , uint8_t mode) +{ + USB_OTG_STS status = USB_OTG_OK; + USB_OTG_GUSBCFG_TypeDef usbcfg; + + usbcfg.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->GUSBCFG); + + usbcfg.b.force_host = 0; + usbcfg.b.force_dev = 0; + + if ( mode == HOST_MODE) + { + usbcfg.b.force_host = 1; + } + else if ( mode == DEVICE_MODE) + { + usbcfg.b.force_dev = 1; + } + + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GUSBCFG, usbcfg.d32); + USB_OTG_BSP_mDelay(50); + return status; +} + + +/** +* @brief USB_OTG_GetMode : Get current mode +* @param pdev : Selected device +* @retval current mode +*/ +uint32_t USB_OTG_GetMode(USB_OTG_CORE_HANDLE *pdev) +{ + return (USB_OTG_READ_REG32(&pdev->regs.GREGS->GINTSTS ) & 0x1); +} + + +/** +* @brief USB_OTG_IsDeviceMode : Check if it is device mode +* @param pdev : Selected device +* @retval num_in_ep +*/ +uint8_t USB_OTG_IsDeviceMode(USB_OTG_CORE_HANDLE *pdev) +{ + return (USB_OTG_GetMode(pdev) != HOST_MODE); +} + + +/** +* @brief USB_OTG_IsHostMode : Check if it is host mode +* @param pdev : Selected device +* @retval num_in_ep +*/ +uint8_t USB_OTG_IsHostMode(USB_OTG_CORE_HANDLE *pdev) +{ + return (USB_OTG_GetMode(pdev) == HOST_MODE); +} + + +/** +* @brief USB_OTG_ReadCoreItr : returns the Core Interrupt register +* @param pdev : Selected device +* @retval Status +*/ +uint32_t USB_OTG_ReadCoreItr(USB_OTG_CORE_HANDLE *pdev) +{ + uint32_t v = 0; + v = USB_OTG_READ_REG32(&pdev->regs.GREGS->GINTSTS); + v &= USB_OTG_READ_REG32(&pdev->regs.GREGS->GINTMSK); + return v; +} + + +/** +* @brief USB_OTG_ReadOtgItr : returns the USB_OTG Interrupt register +* @param pdev : Selected device +* @retval Status +*/ +uint32_t USB_OTG_ReadOtgItr (USB_OTG_CORE_HANDLE *pdev) +{ + return (USB_OTG_READ_REG32 (&pdev->regs.GREGS->GOTGINT)); +} + +#ifdef USE_HOST_MODE +/** +* @brief USB_OTG_CoreInitHost : Initializes USB_OTG controller for host mode +* @param pdev : Selected device +* @retval status +*/ +USB_OTG_STS USB_OTG_CoreInitHost(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_STS status = USB_OTG_OK; + USB_OTG_FSIZ_TypeDef nptxfifosize; + USB_OTG_FSIZ_TypeDef ptxfifosize; + USB_OTG_HCFG_TypeDef hcfg; + +#ifdef USE_OTG_MODE + USB_OTG_OTGCTL_TypeDef gotgctl; +#endif + + uint32_t i = 0; + + nptxfifosize.d32 = 0; + ptxfifosize.d32 = 0; +#ifdef USE_OTG_MODE + gotgctl.d32 = 0; +#endif + hcfg.d32 = 0; + + + /* configure charge pump IO */ + USB_OTG_BSP_ConfigVBUS(pdev); + + /* Restart the Phy Clock */ + USB_OTG_WRITE_REG32(pdev->regs.PCGCCTL, 0); + + /* Initialize Host Configuration Register */ + USB_OTG_InitFSLSPClkSel(pdev , HCFG_48_MHZ); /* in init phase */ + + hcfg.d32 = USB_OTG_READ_REG32(&pdev->regs.HREGS->HCFG); + hcfg.b.fslssupp = 0; + USB_OTG_WRITE_REG32(&pdev->regs.HREGS->HCFG, hcfg.d32); + + /* Configure data FIFO sizes */ + /* Rx FIFO */ +#ifdef USB_OTG_FS_CORE + if(pdev->cfg.coreID == USB_OTG_FS_CORE_ID) + { + /* set Rx FIFO size */ + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GRXFSIZ, RX_FIFO_FS_SIZE); + nptxfifosize.b.startaddr = RX_FIFO_FS_SIZE; + nptxfifosize.b.depth = TXH_NP_FS_FIFOSIZ; + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->DIEPTXF0_HNPTXFSIZ, nptxfifosize.d32); + + ptxfifosize.b.startaddr = RX_FIFO_FS_SIZE + TXH_NP_FS_FIFOSIZ; + ptxfifosize.b.depth = TXH_P_FS_FIFOSIZ; + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->HPTXFSIZ, ptxfifosize.d32); + } +#endif +#ifdef USB_OTG_HS_CORE + if (pdev->cfg.coreID == USB_OTG_HS_CORE_ID) + { + /* set Rx FIFO size */ + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GRXFSIZ, RX_FIFO_HS_SIZE); + nptxfifosize.b.startaddr = RX_FIFO_HS_SIZE; + nptxfifosize.b.depth = TXH_NP_HS_FIFOSIZ; + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->DIEPTXF0_HNPTXFSIZ, nptxfifosize.d32); + + ptxfifosize.b.startaddr = RX_FIFO_HS_SIZE + TXH_NP_HS_FIFOSIZ; + ptxfifosize.b.depth = TXH_P_HS_FIFOSIZ; + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->HPTXFSIZ, ptxfifosize.d32); + } +#endif + +#ifdef USE_OTG_MODE + /* Clear Host Set HNP Enable in the USB_OTG Control Register */ + gotgctl.b.hstsethnpen = 1; + USB_OTG_MODIFY_REG32( &pdev->regs.GREGS->GOTGCTL, gotgctl.d32, 0); +#endif + + /* Make sure the FIFOs are flushed. */ + USB_OTG_FlushTxFifo(pdev, 0x10 ); /* all Tx FIFOs */ + USB_OTG_FlushRxFifo(pdev); + + + /* Clear all pending HC Interrupts */ + for (i = 0; i < pdev->cfg.host_channels; i++) + { + USB_OTG_WRITE_REG32( &pdev->regs.HC_REGS[i]->HCINT, 0xFFFFFFFF ); + USB_OTG_WRITE_REG32( &pdev->regs.HC_REGS[i]->HCGINTMSK, 0 ); + } +#ifndef USE_OTG_MODE + USB_OTG_DriveVbus(pdev, 1); +#endif + + USB_OTG_EnableHostInt(pdev); + return status; +} + +/** +* @brief USB_OTG_IsEvenFrame +* This function returns the frame number for sof packet +* @param pdev : Selected device +* @retval Frame number +*/ +uint8_t USB_OTG_IsEvenFrame (USB_OTG_CORE_HANDLE *pdev) +{ + return !(USB_OTG_READ_REG32(&pdev->regs.HREGS->HFNUM) & 0x1); +} + +/** +* @brief USB_OTG_DriveVbus : set/reset vbus +* @param pdev : Selected device +* @param state : VBUS state +* @retval None +*/ +void USB_OTG_DriveVbus (USB_OTG_CORE_HANDLE *pdev, uint8_t state) +{ + USB_OTG_HPRT0_TypeDef hprt0; + + hprt0.d32 = 0; + + /* enable disable the external charge pump */ + USB_OTG_BSP_DriveVBUS(pdev, state); + + /* Turn on the Host port power. */ + hprt0.d32 = USB_OTG_ReadHPRT0(pdev); + if ((hprt0.b.prtpwr == 0 ) && (state == 1 )) + { + hprt0.b.prtpwr = 1; + USB_OTG_WRITE_REG32(pdev->regs.HPRT0, hprt0.d32); + } + if ((hprt0.b.prtpwr == 1 ) && (state == 0 )) + { + hprt0.b.prtpwr = 0; + USB_OTG_WRITE_REG32(pdev->regs.HPRT0, hprt0.d32); + } + + USB_OTG_BSP_mDelay(200); +} +/** +* @brief USB_OTG_EnableHostInt: Enables the Host mode interrupts +* @param pdev : Selected device +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_EnableHostInt(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_STS status = USB_OTG_OK; + USB_OTG_GINTMSK_TypeDef intmsk; + intmsk.d32 = 0; + /* Disable all interrupts. */ + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GINTMSK, 0); + + /* Clear any pending interrupts. */ + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GINTSTS, 0xFFFFFFFF); + + /* Enable the common interrupts */ + USB_OTG_EnableCommonInt(pdev); + + if (pdev->cfg.dma_enable == 0) + { + intmsk.b.rxstsqlvl = 1; + } + intmsk.b.portintr = 1; + intmsk.b.hcintr = 1; + intmsk.b.disconnect = 1; + intmsk.b.sofintr = 1; + intmsk.b.incomplisoout = 1; + USB_OTG_MODIFY_REG32(&pdev->regs.GREGS->GINTMSK, intmsk.d32, intmsk.d32); + return status; +} + +/** +* @brief USB_OTG_InitFSLSPClkSel : Initializes the FSLSPClkSel field of the +* HCFG register on the PHY type +* @param pdev : Selected device +* @param freq : clock frequency +* @retval None +*/ +void USB_OTG_InitFSLSPClkSel(USB_OTG_CORE_HANDLE *pdev , uint8_t freq) +{ + USB_OTG_HCFG_TypeDef hcfg; + + hcfg.d32 = USB_OTG_READ_REG32(&pdev->regs.HREGS->HCFG); + hcfg.b.fslspclksel = freq; + USB_OTG_WRITE_REG32(&pdev->regs.HREGS->HCFG, hcfg.d32); +} + + +/** +* @brief USB_OTG_ReadHPRT0 : Reads HPRT0 to modify later +* @param pdev : Selected device +* @retval HPRT0 value +*/ +uint32_t USB_OTG_ReadHPRT0(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_HPRT0_TypeDef hprt0; + + hprt0.d32 = USB_OTG_READ_REG32(pdev->regs.HPRT0); + hprt0.b.prtena = 0; + hprt0.b.prtconndet = 0; + hprt0.b.prtenchng = 0; + hprt0.b.prtovrcurrchng = 0; + return hprt0.d32; +} + + +/** +* @brief USB_OTG_ReadHostAllChannels_intr : Register PCD Callbacks +* @param pdev : Selected device +* @retval Status +*/ +uint32_t USB_OTG_ReadHostAllChannels_intr (USB_OTG_CORE_HANDLE *pdev) +{ + return (USB_OTG_READ_REG32 (&pdev->regs.HREGS->HAINT)); +} + + +/** +* @brief USB_OTG_ResetPort : Reset Host Port +* @param pdev : Selected device +* @retval status +* @note : (1)The application must wait at least 10 ms (+ 10 ms security) +* before clearing the reset bit. +*/ +uint32_t USB_OTG_ResetPort(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_HPRT0_TypeDef hprt0; + + hprt0.d32 = USB_OTG_ReadHPRT0(pdev); + hprt0.b.prtrst = 1; + USB_OTG_WRITE_REG32(pdev->regs.HPRT0, hprt0.d32); + USB_OTG_BSP_mDelay (10); /* See Note #1 */ + hprt0.b.prtrst = 0; + USB_OTG_WRITE_REG32(pdev->regs.HPRT0, hprt0.d32); + USB_OTG_BSP_mDelay (20); + return 1; +} + + +/** +* @brief USB_OTG_HC_Init : Prepares a host channel for transferring packets +* @param pdev : Selected device +* @param hc_num : channel number +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_HC_Init(USB_OTG_CORE_HANDLE *pdev , uint8_t hc_num) +{ + USB_OTG_STS status = USB_OTG_OK; + uint32_t intr_enable = 0; + USB_OTG_HCGINTMSK_TypeDef hcintmsk; + USB_OTG_GINTMSK_TypeDef gintmsk; + USB_OTG_HCCHAR_TypeDef hcchar; + USB_OTG_HCINTn_TypeDef hcint; + + + gintmsk.d32 = 0; + hcintmsk.d32 = 0; + hcchar.d32 = 0; + + /* Clear old interrupt conditions for this host channel. */ + hcint.d32 = 0xFFFFFFFF; + USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[hc_num]->HCINT, hcint.d32); + + /* Enable channel interrupts required for this transfer. */ + hcintmsk.d32 = 0; + + if (pdev->cfg.dma_enable == 1) + { + hcintmsk.b.ahberr = 1; + } + + switch (pdev->host.hc[hc_num].ep_type) + { + case EP_TYPE_CTRL: + case EP_TYPE_BULK: + hcintmsk.b.xfercompl = 1; + hcintmsk.b.stall = 1; + hcintmsk.b.xacterr = 1; + hcintmsk.b.datatglerr = 1; + hcintmsk.b.nak = 1; + if (pdev->host.hc[hc_num].ep_is_in) + { + hcintmsk.b.bblerr = 1; + } + else + { + hcintmsk.b.nyet = 1; + if (pdev->host.hc[hc_num].do_ping) + { + hcintmsk.b.ack = 1; + } + } + break; + case EP_TYPE_INTR: + hcintmsk.b.xfercompl = 1; + hcintmsk.b.nak = 1; + hcintmsk.b.stall = 1; + hcintmsk.b.xacterr = 1; + hcintmsk.b.datatglerr = 1; + hcintmsk.b.frmovrun = 1; + + if (pdev->host.hc[hc_num].ep_is_in) + { + hcintmsk.b.bblerr = 1; + } + + break; + case EP_TYPE_ISOC: + hcintmsk.b.xfercompl = 1; + hcintmsk.b.frmovrun = 1; + hcintmsk.b.ack = 1; + + if (pdev->host.hc[hc_num].ep_is_in) + { + hcintmsk.b.xacterr = 1; + hcintmsk.b.bblerr = 1; + } + break; + } + + + USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[hc_num]->HCGINTMSK, hcintmsk.d32); + + + /* Enable the top level host channel interrupt. */ + intr_enable = (1 << hc_num); + USB_OTG_MODIFY_REG32(&pdev->regs.HREGS->HAINTMSK, 0, intr_enable); + + /* Make sure host channel interrupts are enabled. */ + gintmsk.b.hcintr = 1; + USB_OTG_MODIFY_REG32(&pdev->regs.GREGS->GINTMSK, 0, gintmsk.d32); + + /* Program the HCCHAR register */ + hcchar.d32 = 0; + hcchar.b.devaddr = pdev->host.hc[hc_num].dev_addr; + hcchar.b.epnum = pdev->host.hc[hc_num].ep_num; + hcchar.b.epdir = pdev->host.hc[hc_num].ep_is_in; + hcchar.b.lspddev = (pdev->host.hc[hc_num].speed == HPRT0_PRTSPD_LOW_SPEED); + hcchar.b.eptype = pdev->host.hc[hc_num].ep_type; + hcchar.b.mps = pdev->host.hc[hc_num].max_packet; + if (pdev->host.hc[hc_num].ep_type == HCCHAR_INTR) + { + hcchar.b.oddfrm = 1; + } + USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[hc_num]->HCCHAR, hcchar.d32); + return status; +} + + +/** +* @brief USB_OTG_HC_StartXfer : Start transfer +* @param pdev : Selected device +* @param hc_num : channel number +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_HC_StartXfer(USB_OTG_CORE_HANDLE *pdev , uint8_t hc_num) +{ + USB_OTG_STS status = USB_OTG_OK; + USB_OTG_HCCHAR_TypeDef hcchar; + USB_OTG_HCTSIZn_TypeDef hctsiz; + USB_OTG_HNPTXSTS_TypeDef hnptxsts; + USB_OTG_HPTXSTS_TypeDef hptxsts; + USB_OTG_GINTMSK_TypeDef intmsk; + uint16_t len_words = 0; + + uint16_t num_packets; + uint16_t max_hc_pkt_count; + + max_hc_pkt_count = 256; + hctsiz.d32 = 0; + hcchar.d32 = 0; + intmsk.d32 = 0; + + /* Compute the expected number of packets associated to the transfer */ + if (pdev->host.hc[hc_num].xfer_len > 0) + { + num_packets = (pdev->host.hc[hc_num].xfer_len + \ + pdev->host.hc[hc_num].max_packet - 1) / pdev->host.hc[hc_num].max_packet; + + if (num_packets > max_hc_pkt_count) + { + num_packets = max_hc_pkt_count; + pdev->host.hc[hc_num].xfer_len = num_packets * \ + pdev->host.hc[hc_num].max_packet; + } + } + else + { + num_packets = 1; + } + if (pdev->host.hc[hc_num].ep_is_in) + { + pdev->host.hc[hc_num].xfer_len = num_packets * \ + pdev->host.hc[hc_num].max_packet; + } + /* Initialize the HCTSIZn register */ + hctsiz.b.xfersize = pdev->host.hc[hc_num].xfer_len; + hctsiz.b.pktcnt = num_packets; + hctsiz.b.pid = pdev->host.hc[hc_num].data_pid; + USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[hc_num]->HCTSIZ, hctsiz.d32); + + if (pdev->cfg.dma_enable == 1) + { + USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[hc_num]->HCDMA, (unsigned int)pdev->host.hc[hc_num].xfer_buff); + } + + + hcchar.d32 = USB_OTG_READ_REG32(&pdev->regs.HC_REGS[hc_num]->HCCHAR); + hcchar.b.oddfrm = USB_OTG_IsEvenFrame(pdev); + + /* Set host channel enable */ + hcchar.b.chen = 1; + hcchar.b.chdis = 0; + USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[hc_num]->HCCHAR, hcchar.d32); + + if (pdev->cfg.dma_enable == 0) /* Slave mode */ + { + if((pdev->host.hc[hc_num].ep_is_in == 0) && + (pdev->host.hc[hc_num].xfer_len > 0)) + { + switch(pdev->host.hc[hc_num].ep_type) + { + /* Non periodic transfer */ + case EP_TYPE_CTRL: + case EP_TYPE_BULK: + + hnptxsts.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->HNPTXSTS); + len_words = (pdev->host.hc[hc_num].xfer_len + 3) / 4; + + /* check if there is enough space in FIFO space */ + if(len_words > hnptxsts.b.nptxfspcavail) + { + /* need to process data in nptxfempty interrupt */ + intmsk.b.nptxfempty = 1; + USB_OTG_MODIFY_REG32( &pdev->regs.GREGS->GINTMSK, 0, intmsk.d32); + } + + break; + /* Periodic transfer */ + case EP_TYPE_INTR: + case EP_TYPE_ISOC: + hptxsts.d32 = USB_OTG_READ_REG32(&pdev->regs.HREGS->HPTXSTS); + len_words = (pdev->host.hc[hc_num].xfer_len + 3) / 4; + /* check if there is enough space in FIFO space */ + if(len_words > hptxsts.b.ptxfspcavail) /* split the transfer */ + { + /* need to process data in ptxfempty interrupt */ + intmsk.b.ptxfempty = 1; + USB_OTG_MODIFY_REG32( &pdev->regs.GREGS->GINTMSK, 0, intmsk.d32); + } + break; + + default: + break; + } + + /* Write packet into the Tx FIFO. */ + USB_OTG_WritePacket(pdev, + pdev->host.hc[hc_num].xfer_buff , + hc_num, pdev->host.hc[hc_num].xfer_len); + } + } + return status; +} + + +/** +* @brief USB_OTG_HC_Halt : Halt channel +* @param pdev : Selected device +* @param hc_num : channel number +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_HC_Halt(USB_OTG_CORE_HANDLE *pdev , uint8_t hc_num) +{ + USB_OTG_STS status = USB_OTG_OK; + USB_OTG_HNPTXSTS_TypeDef nptxsts; + USB_OTG_HPTXSTS_TypeDef hptxsts; + USB_OTG_HCCHAR_TypeDef hcchar; + + nptxsts.d32 = 0; + hptxsts.d32 = 0; + hcchar.d32 = USB_OTG_READ_REG32(&pdev->regs.HC_REGS[hc_num]->HCCHAR); + hcchar.b.chen = 1; + hcchar.b.chdis = 1; + + /* Check for space in the request queue to issue the halt. */ + if (hcchar.b.eptype == HCCHAR_CTRL || hcchar.b.eptype == HCCHAR_BULK) + { + nptxsts.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->HNPTXSTS); + if (nptxsts.b.nptxqspcavail == 0) + { + hcchar.b.chen = 0; + } + } + else + { + hptxsts.d32 = USB_OTG_READ_REG32(&pdev->regs.HREGS->HPTXSTS); + if (hptxsts.b.ptxqspcavail == 0) + { + hcchar.b.chen = 0; + } + } + USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[hc_num]->HCCHAR, hcchar.d32); + return status; +} + +/** +* @brief Issue a ping token +* @param None +* @retval : None +*/ +USB_OTG_STS USB_OTG_HC_DoPing(USB_OTG_CORE_HANDLE *pdev , uint8_t hc_num) +{ + USB_OTG_STS status = USB_OTG_OK; + USB_OTG_HCCHAR_TypeDef hcchar; + USB_OTG_HCTSIZn_TypeDef hctsiz; + + hctsiz.d32 = 0; + hctsiz.b.dopng = 1; + hctsiz.b.pktcnt = 1; + USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[hc_num]->HCTSIZ, hctsiz.d32); + + hcchar.d32 = USB_OTG_READ_REG32(&pdev->regs.HC_REGS[hc_num]->HCCHAR); + hcchar.b.chen = 1; + hcchar.b.chdis = 0; + USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[hc_num]->HCCHAR, hcchar.d32); + return status; +} + +/** +* @brief Stop the device and clean up fifo's +* @param None +* @retval : None +*/ +void USB_OTG_StopHost(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_HCCHAR_TypeDef hcchar; + uint32_t i; + + USB_OTG_WRITE_REG32(&pdev->regs.HREGS->HAINTMSK , 0); + USB_OTG_WRITE_REG32(&pdev->regs.HREGS->HAINT, 0xFFFFFFFF); + /* Flush out any leftover queued requests. */ + + for (i = 0; i < pdev->cfg.host_channels; i++) + { + hcchar.d32 = USB_OTG_READ_REG32(&pdev->regs.HC_REGS[i]->HCCHAR); + hcchar.b.chen = 0; + hcchar.b.chdis = 1; + hcchar.b.epdir = 0; + USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[i]->HCCHAR, hcchar.d32); + } + + /* Flush the FIFO */ + USB_OTG_FlushRxFifo(pdev); + USB_OTG_FlushTxFifo(pdev , 0x10 ); +} +#endif +#ifdef USE_DEVICE_MODE +/* PCD Core Layer */ + +/** +* @brief USB_OTG_InitDevSpeed :Initializes the DevSpd field of DCFG register +* depending the PHY type and the enumeration speed of the device. +* @param pdev : Selected device +* @retval : None +*/ +void USB_OTG_InitDevSpeed(USB_OTG_CORE_HANDLE *pdev , uint8_t speed) +{ + USB_OTG_DCFG_TypeDef dcfg; + + dcfg.d32 = USB_OTG_READ_REG32(&pdev->regs.DREGS->DCFG); + dcfg.b.devspd = speed; + USB_OTG_WRITE_REG32(&pdev->regs.DREGS->DCFG, dcfg.d32); +} + + +/** +* @brief USB_OTG_CoreInitDev : Initializes the USB_OTG controller registers +* for device mode +* @param pdev : Selected device +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_CoreInitDev (USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_STS status = USB_OTG_OK; + USB_OTG_DEPCTL_TypeDef depctl; + uint32_t i; + USB_OTG_DCFG_TypeDef dcfg; + USB_OTG_FSIZ_TypeDef nptxfifosize; + USB_OTG_FSIZ_TypeDef txfifosize; + USB_OTG_DIEPMSK_TypeDef msk; + USB_OTG_DTHRCTL_TypeDef dthrctl; + + depctl.d32 = 0; + dcfg.d32 = 0; + nptxfifosize.d32 = 0; + txfifosize.d32 = 0; + msk.d32 = 0; + + /* Restart the Phy Clock */ + USB_OTG_WRITE_REG32(pdev->regs.PCGCCTL, 0); + /* Device configuration register */ + dcfg.d32 = USB_OTG_READ_REG32( &pdev->regs.DREGS->DCFG); + dcfg.b.perfrint = DCFG_FRAME_INTERVAL_80; + USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DCFG, dcfg.d32 ); + +#ifdef USB_OTG_FS_CORE + if(pdev->cfg.coreID == USB_OTG_FS_CORE_ID ) + { + + /* Set Full speed phy */ + USB_OTG_InitDevSpeed (pdev , USB_OTG_SPEED_PARAM_FULL); + + /* set Rx FIFO size */ + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GRXFSIZ, RX_FIFO_FS_SIZE); + + /* EP0 TX*/ + nptxfifosize.b.depth = TX0_FIFO_FS_SIZE; + nptxfifosize.b.startaddr = RX_FIFO_FS_SIZE; + USB_OTG_WRITE_REG32( &pdev->regs.GREGS->DIEPTXF0_HNPTXFSIZ, nptxfifosize.d32 ); + + + /* EP1 TX*/ + txfifosize.b.startaddr = nptxfifosize.b.startaddr + nptxfifosize.b.depth; + txfifosize.b.depth = TX1_FIFO_FS_SIZE; + USB_OTG_WRITE_REG32( &pdev->regs.GREGS->DIEPTXF[0], txfifosize.d32 ); + + + /* EP2 TX*/ + txfifosize.b.startaddr += txfifosize.b.depth; + txfifosize.b.depth = TX2_FIFO_FS_SIZE; + USB_OTG_WRITE_REG32( &pdev->regs.GREGS->DIEPTXF[1], txfifosize.d32 ); + + + /* EP3 TX*/ + txfifosize.b.startaddr += txfifosize.b.depth; + txfifosize.b.depth = TX3_FIFO_FS_SIZE; + USB_OTG_WRITE_REG32( &pdev->regs.GREGS->DIEPTXF[2], txfifosize.d32 ); + } +#endif +#ifdef USB_OTG_HS_CORE + if(pdev->cfg.coreID == USB_OTG_HS_CORE_ID ) + { + + /* Set High speed phy */ + + if(pdev->cfg.phy_itface == USB_OTG_ULPI_PHY) + { + USB_OTG_InitDevSpeed (pdev , USB_OTG_SPEED_PARAM_HIGH); + } + else /* set High speed phy in Full speed mode */ + { + USB_OTG_InitDevSpeed (pdev , USB_OTG_SPEED_PARAM_HIGH_IN_FULL); + } + + /* set Rx FIFO size */ + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GRXFSIZ, RX_FIFO_HS_SIZE); + + /* EP0 TX*/ + nptxfifosize.b.depth = TX0_FIFO_HS_SIZE; + nptxfifosize.b.startaddr = RX_FIFO_HS_SIZE; + USB_OTG_WRITE_REG32( &pdev->regs.GREGS->DIEPTXF0_HNPTXFSIZ, nptxfifosize.d32 ); + + + /* EP1 TX*/ + txfifosize.b.startaddr = nptxfifosize.b.startaddr + nptxfifosize.b.depth; + txfifosize.b.depth = TX1_FIFO_HS_SIZE; + USB_OTG_WRITE_REG32( &pdev->regs.GREGS->DIEPTXF[0], txfifosize.d32 ); + + + /* EP2 TX*/ + txfifosize.b.startaddr += txfifosize.b.depth; + txfifosize.b.depth = TX2_FIFO_HS_SIZE; + USB_OTG_WRITE_REG32( &pdev->regs.GREGS->DIEPTXF[1], txfifosize.d32 ); + + + /* EP3 TX*/ + txfifosize.b.startaddr += txfifosize.b.depth; + txfifosize.b.depth = TX3_FIFO_HS_SIZE; + USB_OTG_WRITE_REG32( &pdev->regs.GREGS->DIEPTXF[2], txfifosize.d32 ); + + /* EP4 TX*/ + txfifosize.b.startaddr += txfifosize.b.depth; + txfifosize.b.depth = TX4_FIFO_HS_SIZE; + USB_OTG_WRITE_REG32( &pdev->regs.GREGS->DIEPTXF[3], txfifosize.d32 ); + + + /* EP5 TX*/ + txfifosize.b.startaddr += txfifosize.b.depth; + txfifosize.b.depth = TX5_FIFO_HS_SIZE; + USB_OTG_WRITE_REG32( &pdev->regs.GREGS->DIEPTXF[4], txfifosize.d32 ); + } +#endif + /* Flush the FIFOs */ + USB_OTG_FlushTxFifo(pdev , 0x10); /* all Tx FIFOs */ + USB_OTG_FlushRxFifo(pdev); + /* Clear all pending Device Interrupts */ + USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DIEPMSK, 0 ); + USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DOEPMSK, 0 ); + USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DAINT, 0xFFFFFFFF ); + USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DAINTMSK, 0 ); + + for (i = 0; i < pdev->cfg.dev_endpoints; i++) + { + depctl.d32 = USB_OTG_READ_REG32(&pdev->regs.INEP_REGS[i]->DIEPCTL); + if (depctl.b.epena) + { + depctl.d32 = 0; + depctl.b.epdis = 1; + depctl.b.snak = 1; + } + else + { + depctl.d32 = 0; + } + USB_OTG_WRITE_REG32( &pdev->regs.INEP_REGS[i]->DIEPCTL, depctl.d32); + USB_OTG_WRITE_REG32( &pdev->regs.INEP_REGS[i]->DIEPTSIZ, 0); + USB_OTG_WRITE_REG32( &pdev->regs.INEP_REGS[i]->DIEPINT, 0xFF); + } + for (i = 0; i < pdev->cfg.dev_endpoints; i++) + { + USB_OTG_DEPCTL_TypeDef depctl; + depctl.d32 = USB_OTG_READ_REG32(&pdev->regs.OUTEP_REGS[i]->DOEPCTL); + if (depctl.b.epena) + { + depctl.d32 = 0; + depctl.b.epdis = 1; + depctl.b.snak = 1; + } + else + { + depctl.d32 = 0; + } + USB_OTG_WRITE_REG32( &pdev->regs.OUTEP_REGS[i]->DOEPCTL, depctl.d32); + USB_OTG_WRITE_REG32( &pdev->regs.OUTEP_REGS[i]->DOEPTSIZ, 0); + USB_OTG_WRITE_REG32( &pdev->regs.OUTEP_REGS[i]->DOEPINT, 0xFF); + } + msk.d32 = 0; + msk.b.txfifoundrn = 1; + USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DIEPMSK, msk.d32, msk.d32); + + if (pdev->cfg.dma_enable == 1) + { + dthrctl.d32 = 0; + dthrctl.b.non_iso_thr_en = 1; + dthrctl.b.iso_thr_en = 1; + dthrctl.b.tx_thr_len = 64; + dthrctl.b.rx_thr_en = 1; + dthrctl.b.rx_thr_len = 64; + USB_OTG_WRITE_REG32(&pdev->regs.DREGS->DTHRCTL, dthrctl.d32); + } + USB_OTG_EnableDevInt(pdev); + return status; +} + + +/** +* @brief USB_OTG_EnableDevInt : Enables the Device mode interrupts +* @param pdev : Selected device +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_EnableDevInt(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_STS status = USB_OTG_OK; + USB_OTG_GINTMSK_TypeDef intmsk; + + intmsk.d32 = 0; + + /* Disable all interrupts. */ + USB_OTG_WRITE_REG32( &pdev->regs.GREGS->GINTMSK, 0); + /* Clear any pending interrupts */ + USB_OTG_WRITE_REG32( &pdev->regs.GREGS->GINTSTS, 0xFFFFFFFF); + /* Enable the common interrupts */ + USB_OTG_EnableCommonInt(pdev); + + if (pdev->cfg.dma_enable == 0) + { + intmsk.b.rxstsqlvl = 1; + } + + /* Enable interrupts matching to the Device mode ONLY */ + intmsk.b.usbsuspend = 1; + intmsk.b.usbreset = 1; + intmsk.b.enumdone = 1; + intmsk.b.inepintr = 1; + intmsk.b.outepintr = 1; + intmsk.b.sofintr = 1; + + intmsk.b.incomplisoin = 1; + intmsk.b.incomplisoout = 1; +#ifdef VBUS_SENSING_ENABLED + intmsk.b.sessreqintr = 1; + intmsk.b.otgintr = 1; +#endif + USB_OTG_MODIFY_REG32( &pdev->regs.GREGS->GINTMSK, intmsk.d32, intmsk.d32); + return status; +} + + +/** +* @brief USB_OTG_GetDeviceSpeed +* Get the device speed from the device status register +* @param None +* @retval status +*/ +enum USB_OTG_SPEED USB_OTG_GetDeviceSpeed (USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_DSTS_TypeDef dsts; + enum USB_OTG_SPEED speed = USB_SPEED_UNKNOWN; + + + dsts.d32 = USB_OTG_READ_REG32(&pdev->regs.DREGS->DSTS); + + switch (dsts.b.enumspd) + { + case DSTS_ENUMSPD_HS_PHY_30MHZ_OR_60MHZ: + speed = USB_SPEED_HIGH; + break; + case DSTS_ENUMSPD_FS_PHY_30MHZ_OR_60MHZ: + case DSTS_ENUMSPD_FS_PHY_48MHZ: + speed = USB_SPEED_FULL; + break; + + case DSTS_ENUMSPD_LS_PHY_6MHZ: + speed = USB_SPEED_LOW; + break; + } + + return speed; +} +/** +* @brief enables EP0 OUT to receive SETUP packets and configures EP0 +* for transmitting packets +* @param None +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_EP0Activate(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_STS status = USB_OTG_OK; + USB_OTG_DSTS_TypeDef dsts; + USB_OTG_DEPCTL_TypeDef diepctl; + USB_OTG_DCTL_TypeDef dctl; + + dctl.d32 = 0; + /* Read the Device Status and Endpoint 0 Control registers */ + dsts.d32 = USB_OTG_READ_REG32(&pdev->regs.DREGS->DSTS); + diepctl.d32 = USB_OTG_READ_REG32(&pdev->regs.INEP_REGS[0]->DIEPCTL); + /* Set the MPS of the IN EP based on the enumeration speed */ + switch (dsts.b.enumspd) + { + case DSTS_ENUMSPD_HS_PHY_30MHZ_OR_60MHZ: + case DSTS_ENUMSPD_FS_PHY_30MHZ_OR_60MHZ: + case DSTS_ENUMSPD_FS_PHY_48MHZ: + diepctl.b.mps = DEP0CTL_MPS_64; + break; + case DSTS_ENUMSPD_LS_PHY_6MHZ: + diepctl.b.mps = DEP0CTL_MPS_8; + break; + } + USB_OTG_WRITE_REG32(&pdev->regs.INEP_REGS[0]->DIEPCTL, diepctl.d32); + dctl.b.cgnpinnak = 1; + USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DCTL, dctl.d32, dctl.d32); + return status; +} + + +/** +* @brief USB_OTG_EPActivate : Activates an EP +* @param pdev : Selected device +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_EPActivate(USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep) +{ + USB_OTG_STS status = USB_OTG_OK; + USB_OTG_DEPCTL_TypeDef depctl; + USB_OTG_DAINT_TypeDef daintmsk; + __IO uint32_t *addr; + + + depctl.d32 = 0; + daintmsk.d32 = 0; + /* Read DEPCTLn register */ + if (ep->is_in == 1) + { + addr = &pdev->regs.INEP_REGS[ep->num]->DIEPCTL; + daintmsk.ep.in = 1 << ep->num; + } + else + { + addr = &pdev->regs.OUTEP_REGS[ep->num]->DOEPCTL; + daintmsk.ep.out = 1 << ep->num; + } + /* If the EP is already active don't change the EP Control + * register. */ + depctl.d32 = USB_OTG_READ_REG32(addr); + if (!depctl.b.usbactep) + { + depctl.b.mps = ep->maxpacket; + depctl.b.eptype = ep->type; + depctl.b.txfnum = ep->tx_fifo_num; + depctl.b.setd0pid = 1; + depctl.b.usbactep = 1; + USB_OTG_WRITE_REG32(addr, depctl.d32); + } + /* Enable the Interrupt for this EP */ +#ifdef USB_OTG_HS_DEDICATED_EP1_ENABLED + if((ep->num == 1)&&(pdev->cfg.coreID == USB_OTG_HS_CORE_ID)) + { + USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DEACHMSK, 0, daintmsk.d32); + } + else +#endif + USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DAINTMSK, 0, daintmsk.d32); + return status; +} + + +/** +* @brief USB_OTG_EPDeactivate : Deactivates an EP +* @param pdev : Selected device +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_EPDeactivate(USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep) +{ + USB_OTG_STS status = USB_OTG_OK; + USB_OTG_DEPCTL_TypeDef depctl; + USB_OTG_DAINT_TypeDef daintmsk; + __IO uint32_t *addr; + + depctl.d32 = 0; + daintmsk.d32 = 0; + /* Read DEPCTLn register */ + if (ep->is_in == 1) + { + addr = &pdev->regs.INEP_REGS[ep->num]->DIEPCTL; + daintmsk.ep.in = 1 << ep->num; + } + else + { + addr = &pdev->regs.OUTEP_REGS[ep->num]->DOEPCTL; + daintmsk.ep.out = 1 << ep->num; + } + depctl.b.usbactep = 0; + USB_OTG_WRITE_REG32(addr, depctl.d32); + /* Disable the Interrupt for this EP */ + +#ifdef USB_OTG_HS_DEDICATED_EP1_ENABLED + if((ep->num == 1)&&(pdev->cfg.coreID == USB_OTG_HS_CORE_ID)) + { + USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DEACHMSK, daintmsk.d32, 0); + } + else +#endif + USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DAINTMSK, daintmsk.d32, 0); + return status; +} + + +/** +* @brief USB_OTG_EPStartXfer : Handle the setup for data xfer for an EP and +* starts the xfer +* @param pdev : Selected device +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_EPStartXfer(USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep) +{ + USB_OTG_STS status = USB_OTG_OK; + USB_OTG_DEPCTL_TypeDef depctl; + USB_OTG_DEPXFRSIZ_TypeDef deptsiz; + USB_OTG_DSTS_TypeDef dsts; + uint32_t fifoemptymsk = 0; + + depctl.d32 = 0; + deptsiz.d32 = 0; + /* IN endpoint */ + if (ep->is_in == 1) + { + depctl.d32 = USB_OTG_READ_REG32(&(pdev->regs.INEP_REGS[ep->num]->DIEPCTL)); + deptsiz.d32 = USB_OTG_READ_REG32(&(pdev->regs.INEP_REGS[ep->num]->DIEPTSIZ)); + /* Zero Length Packet? */ + if (ep->xfer_len == 0) + { + deptsiz.b.xfersize = 0; + deptsiz.b.pktcnt = 1; + } + else + { + /* Program the transfer size and packet count + * as follows: xfersize = N * maxpacket + + * short_packet pktcnt = N + (short_packet + * exist ? 1 : 0) + */ + deptsiz.b.xfersize = ep->xfer_len; + deptsiz.b.pktcnt = (ep->xfer_len - 1 + ep->maxpacket) / ep->maxpacket; + + if (ep->type == EP_TYPE_ISOC) + { + deptsiz.b.mc = 1; + } + } + USB_OTG_WRITE_REG32(&pdev->regs.INEP_REGS[ep->num]->DIEPTSIZ, deptsiz.d32); + + if (pdev->cfg.dma_enable == 1) + { + USB_OTG_WRITE_REG32(&pdev->regs.INEP_REGS[ep->num]->DIEPDMA, ep->dma_addr); + } + else + { + if (ep->type != EP_TYPE_ISOC) + { + /* Enable the Tx FIFO Empty Interrupt for this EP */ + if (ep->xfer_len > 0) + { + fifoemptymsk = 1 << ep->num; + USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DIEPEMPMSK, 0, fifoemptymsk); + } + } + } + + + if (ep->type == EP_TYPE_ISOC) + { + dsts.d32 = USB_OTG_READ_REG32(&pdev->regs.DREGS->DSTS); + + if (((dsts.b.soffn)&0x1) == 0) + { + depctl.b.setd1pid = 1; + } + else + { + depctl.b.setd0pid = 1; + } + } + + /* EP enable, IN data in FIFO */ + depctl.b.cnak = 1; + depctl.b.epena = 1; + USB_OTG_WRITE_REG32(&pdev->regs.INEP_REGS[ep->num]->DIEPCTL, depctl.d32); + + if (ep->type == EP_TYPE_ISOC) + { + USB_OTG_WritePacket(pdev, ep->xfer_buff, ep->num, ep->xfer_len); + } + } + else + { + /* OUT endpoint */ + depctl.d32 = USB_OTG_READ_REG32(&(pdev->regs.OUTEP_REGS[ep->num]->DOEPCTL)); + deptsiz.d32 = USB_OTG_READ_REG32(&(pdev->regs.OUTEP_REGS[ep->num]->DOEPTSIZ)); + /* Program the transfer size and packet count as follows: + * pktcnt = N + * xfersize = N * maxpacket + */ + if (ep->xfer_len == 0) + { + deptsiz.b.xfersize = ep->maxpacket; + deptsiz.b.pktcnt = 1; + } + else + { + deptsiz.b.pktcnt = (ep->xfer_len + (ep->maxpacket - 1)) / ep->maxpacket; + deptsiz.b.xfersize = deptsiz.b.pktcnt * ep->maxpacket; + } + USB_OTG_WRITE_REG32(&pdev->regs.OUTEP_REGS[ep->num]->DOEPTSIZ, deptsiz.d32); + + if (pdev->cfg.dma_enable == 1) + { + USB_OTG_WRITE_REG32(&pdev->regs.OUTEP_REGS[ep->num]->DOEPDMA, ep->dma_addr); + } + + if (ep->type == EP_TYPE_ISOC) + { + if (ep->even_odd_frame) + { + depctl.b.setd1pid = 1; + } + else + { + depctl.b.setd0pid = 1; + } + } + /* EP enable */ + depctl.b.cnak = 1; + depctl.b.epena = 1; + USB_OTG_WRITE_REG32(&pdev->regs.OUTEP_REGS[ep->num]->DOEPCTL, depctl.d32); + } + return status; +} + + +/** +* @brief USB_OTG_EP0StartXfer : Handle the setup for a data xfer for EP0 and +* starts the xfer +* @param pdev : Selected device +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_EP0StartXfer(USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep) +{ + USB_OTG_STS status = USB_OTG_OK; + USB_OTG_DEPCTL_TypeDef depctl; + USB_OTG_DEP0XFRSIZ_TypeDef deptsiz; + USB_OTG_INEPREGS *in_regs; + uint32_t fifoemptymsk = 0; + + depctl.d32 = 0; + deptsiz.d32 = 0; + /* IN endpoint */ + if (ep->is_in == 1) + { + in_regs = pdev->regs.INEP_REGS[0]; + depctl.d32 = USB_OTG_READ_REG32(&in_regs->DIEPCTL); + deptsiz.d32 = USB_OTG_READ_REG32(&in_regs->DIEPTSIZ); + /* Zero Length Packet? */ + if (ep->xfer_len == 0) + { + deptsiz.b.xfersize = 0; + deptsiz.b.pktcnt = 1; + + } + else + { + if (ep->xfer_len > ep->maxpacket) + { + ep->xfer_len = ep->maxpacket; + deptsiz.b.xfersize = ep->maxpacket; + } + else + { + deptsiz.b.xfersize = ep->xfer_len; + } + deptsiz.b.pktcnt = 1; + } + USB_OTG_WRITE_REG32(&in_regs->DIEPTSIZ, deptsiz.d32); + + if (pdev->cfg.dma_enable == 1) + { + USB_OTG_WRITE_REG32(&pdev->regs.INEP_REGS[ep->num]->DIEPDMA, ep->dma_addr); + } + + /* EP enable, IN data in FIFO */ + depctl.b.cnak = 1; + depctl.b.epena = 1; + USB_OTG_WRITE_REG32(&in_regs->DIEPCTL, depctl.d32); + + + + if (pdev->cfg.dma_enable == 0) + { + /* Enable the Tx FIFO Empty Interrupt for this EP */ + if (ep->xfer_len > 0) + { + { + fifoemptymsk |= 1 << ep->num; + USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DIEPEMPMSK, 0, fifoemptymsk); + } + } + } + } + else + { + /* OUT endpoint */ + depctl.d32 = USB_OTG_READ_REG32(&pdev->regs.OUTEP_REGS[ep->num]->DOEPCTL); + deptsiz.d32 = USB_OTG_READ_REG32(&pdev->regs.OUTEP_REGS[ep->num]->DOEPTSIZ); + /* Program the transfer size and packet count as follows: + * xfersize = N * (maxpacket + 4 - (maxpacket % 4)) + * pktcnt = N */ + if (ep->xfer_len == 0) + { + deptsiz.b.xfersize = ep->maxpacket; + deptsiz.b.pktcnt = 1; + } + else + { + ep->xfer_len = ep->maxpacket; + deptsiz.b.xfersize = ep->maxpacket; + deptsiz.b.pktcnt = 1; + } + USB_OTG_WRITE_REG32(&pdev->regs.OUTEP_REGS[ep->num]->DOEPTSIZ, deptsiz.d32); + if (pdev->cfg.dma_enable == 1) + { + USB_OTG_WRITE_REG32(&pdev->regs.OUTEP_REGS[ep->num]->DOEPDMA, ep->dma_addr); + } + /* EP enable */ + depctl.b.cnak = 1; + depctl.b.epena = 1; + USB_OTG_WRITE_REG32 (&(pdev->regs.OUTEP_REGS[ep->num]->DOEPCTL), depctl.d32); + + } + return status; +} + + +/** +* @brief USB_OTG_EPSetStall : Set the EP STALL +* @param pdev : Selected device +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_EPSetStall(USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep) +{ + USB_OTG_STS status = USB_OTG_OK; + USB_OTG_DEPCTL_TypeDef depctl; + __IO uint32_t *depctl_addr; + + depctl.d32 = 0; + if (ep->is_in == 1) + { + depctl_addr = &(pdev->regs.INEP_REGS[ep->num]->DIEPCTL); + depctl.d32 = USB_OTG_READ_REG32(depctl_addr); + /* set the disable and stall bits */ + if (depctl.b.epena) + { + depctl.b.epdis = 1; + } + depctl.b.stall = 1; + USB_OTG_WRITE_REG32(depctl_addr, depctl.d32); + } + else + { + depctl_addr = &(pdev->regs.OUTEP_REGS[ep->num]->DOEPCTL); + depctl.d32 = USB_OTG_READ_REG32(depctl_addr); + /* set the stall bit */ + depctl.b.stall = 1; + USB_OTG_WRITE_REG32(depctl_addr, depctl.d32); + } + return status; +} + + +/** +* @brief Clear the EP STALL +* @param pdev : Selected device +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_EPClearStall(USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep) +{ + USB_OTG_STS status = USB_OTG_OK; + USB_OTG_DEPCTL_TypeDef depctl; + __IO uint32_t *depctl_addr; + + depctl.d32 = 0; + + if (ep->is_in == 1) + { + depctl_addr = &(pdev->regs.INEP_REGS[ep->num]->DIEPCTL); + } + else + { + depctl_addr = &(pdev->regs.OUTEP_REGS[ep->num]->DOEPCTL); + } + depctl.d32 = USB_OTG_READ_REG32(depctl_addr); + /* clear the stall bits */ + depctl.b.stall = 0; + if (ep->type == EP_TYPE_INTR || ep->type == EP_TYPE_BULK) + { + depctl.b.setd0pid = 1; /* DATA0 */ + } + USB_OTG_WRITE_REG32(depctl_addr, depctl.d32); + return status; +} + + +/** +* @brief USB_OTG_ReadDevAllOutEp_itr : returns OUT endpoint interrupt bits +* @param pdev : Selected device +* @retval OUT endpoint interrupt bits +*/ +uint32_t USB_OTG_ReadDevAllOutEp_itr(USB_OTG_CORE_HANDLE *pdev) +{ + uint32_t v; + v = USB_OTG_READ_REG32(&pdev->regs.DREGS->DAINT); + v &= USB_OTG_READ_REG32(&pdev->regs.DREGS->DAINTMSK); + return ((v & 0xffff0000) >> 16); +} + + +/** +* @brief USB_OTG_ReadDevOutEP_itr : returns Device OUT EP Interrupt register +* @param pdev : Selected device +* @param ep : end point number +* @retval Device OUT EP Interrupt register +*/ +uint32_t USB_OTG_ReadDevOutEP_itr(USB_OTG_CORE_HANDLE *pdev , uint8_t epnum) +{ + uint32_t v; + v = USB_OTG_READ_REG32(&pdev->regs.OUTEP_REGS[epnum]->DOEPINT); + v &= USB_OTG_READ_REG32(&pdev->regs.DREGS->DOEPMSK); + return v; +} + + +/** +* @brief USB_OTG_ReadDevAllInEPItr : Get int status register +* @param pdev : Selected device +* @retval int status register +*/ +uint32_t USB_OTG_ReadDevAllInEPItr(USB_OTG_CORE_HANDLE *pdev) +{ + uint32_t v; + v = USB_OTG_READ_REG32(&pdev->regs.DREGS->DAINT); + v &= USB_OTG_READ_REG32(&pdev->regs.DREGS->DAINTMSK); + return (v & 0xffff); +} + +/** +* @brief configures EPO to receive SETUP packets +* @param None +* @retval : None +*/ +void USB_OTG_EP0_OutStart(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_DEP0XFRSIZ_TypeDef doeptsize0; + doeptsize0.d32 = 0; + doeptsize0.b.supcnt = 3; + doeptsize0.b.pktcnt = 1; + doeptsize0.b.xfersize = 8 * 3; + USB_OTG_WRITE_REG32( &pdev->regs.OUTEP_REGS[0]->DOEPTSIZ, doeptsize0.d32 ); + + if (pdev->cfg.dma_enable == 1) + { + USB_OTG_DEPCTL_TypeDef doepctl; + doepctl.d32 = 0; + USB_OTG_WRITE_REG32( &pdev->regs.OUTEP_REGS[0]->DOEPDMA, + (uint32_t)&pdev->dev.setup_packet); + + /* EP enable */ + doepctl.d32 = USB_OTG_READ_REG32(&pdev->regs.OUTEP_REGS[0]->DOEPCTL); + doepctl.b.epena = 1; + doepctl.d32 = 0x80008000; + USB_OTG_WRITE_REG32( &pdev->regs.OUTEP_REGS[0]->DOEPCTL, doepctl.d32); + } +} + +/** +* @brief USB_OTG_RemoteWakeup : active remote wakeup signalling +* @param None +* @retval : None +*/ +void USB_OTG_ActiveRemoteWakeup(USB_OTG_CORE_HANDLE *pdev) +{ + + USB_OTG_DCTL_TypeDef dctl; + USB_OTG_DSTS_TypeDef dsts; + USB_OTG_PCGCCTL_TypeDef power; + + if (pdev->dev.DevRemoteWakeup) + { + dsts.d32 = USB_OTG_READ_REG32(&pdev->regs.DREGS->DSTS); + if(dsts.b.suspsts == 1) + { + if(pdev->cfg.low_power) + { + /* un-gate USB Core clock */ + power.d32 = USB_OTG_READ_REG32(&pdev->regs.PCGCCTL); + power.b.gatehclk = 0; + power.b.stoppclk = 0; + USB_OTG_WRITE_REG32(pdev->regs.PCGCCTL, power.d32); + } + /* active Remote wakeup signaling */ + dctl.d32 = 0; + dctl.b.rmtwkupsig = 1; + USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DCTL, 0, dctl.d32); + USB_OTG_BSP_mDelay(5); + USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DCTL, dctl.d32, 0 ); + } + } +} + + +/** +* @brief USB_OTG_UngateClock : active USB Core clock +* @param None +* @retval : None +*/ +void USB_OTG_UngateClock(USB_OTG_CORE_HANDLE *pdev) +{ + if(pdev->cfg.low_power) + { + + USB_OTG_DSTS_TypeDef dsts; + USB_OTG_PCGCCTL_TypeDef power; + + dsts.d32 = USB_OTG_READ_REG32(&pdev->regs.DREGS->DSTS); + + if(dsts.b.suspsts == 1) + { + /* un-gate USB Core clock */ + power.d32 = USB_OTG_READ_REG32(&pdev->regs.PCGCCTL); + power.b.gatehclk = 0; + power.b.stoppclk = 0; + USB_OTG_WRITE_REG32(pdev->regs.PCGCCTL, power.d32); + + } + } +} + +/** +* @brief Stop the device and clean up fifo's +* @param None +* @retval : None +*/ +void USB_OTG_StopDevice(USB_OTG_CORE_HANDLE *pdev) +{ + uint32_t i; + + pdev->dev.device_status = 1; + + for (i = 0; i < pdev->cfg.dev_endpoints ; i++) + { + USB_OTG_WRITE_REG32( &pdev->regs.INEP_REGS[i]->DIEPINT, 0xFF); + USB_OTG_WRITE_REG32( &pdev->regs.OUTEP_REGS[i]->DOEPINT, 0xFF); + } + + USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DIEPMSK, 0 ); + USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DOEPMSK, 0 ); + USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DAINTMSK, 0 ); + USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DAINT, 0xFFFFFFFF ); + + /* Flush the FIFO */ + USB_OTG_FlushRxFifo(pdev); + USB_OTG_FlushTxFifo(pdev , 0x10 ); +} + +/** +* @brief returns the EP Status +* @param pdev : Selected device +* ep : endpoint structure +* @retval : EP status +*/ + +uint32_t USB_OTG_GetEPStatus(USB_OTG_CORE_HANDLE *pdev ,USB_OTG_EP *ep) +{ + USB_OTG_DEPCTL_TypeDef depctl; + __IO uint32_t *depctl_addr; + uint32_t Status = 0; + + depctl.d32 = 0; + if (ep->is_in == 1) + { + depctl_addr = &(pdev->regs.INEP_REGS[ep->num]->DIEPCTL); + depctl.d32 = USB_OTG_READ_REG32(depctl_addr); + + if (depctl.b.stall == 1) + Status = USB_OTG_EP_TX_STALL; + else if (depctl.b.naksts == 1) + Status = USB_OTG_EP_TX_NAK; + else + Status = USB_OTG_EP_TX_VALID; + + } + else + { + depctl_addr = &(pdev->regs.OUTEP_REGS[ep->num]->DOEPCTL); + depctl.d32 = USB_OTG_READ_REG32(depctl_addr); + if (depctl.b.stall == 1) + Status = USB_OTG_EP_RX_STALL; + else if (depctl.b.naksts == 1) + Status = USB_OTG_EP_RX_NAK; + else + Status = USB_OTG_EP_RX_VALID; + } + + /* Return the current status */ + return Status; +} + +/** +* @brief Set the EP Status +* @param pdev : Selected device +* Status : new Status +* ep : EP structure +* @retval : None +*/ +void USB_OTG_SetEPStatus (USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep , uint32_t Status) +{ + USB_OTG_DEPCTL_TypeDef depctl; + __IO uint32_t *depctl_addr; + + depctl.d32 = 0; + + /* Process for IN endpoint */ + if (ep->is_in == 1) + { + depctl_addr = &(pdev->regs.INEP_REGS[ep->num]->DIEPCTL); + depctl.d32 = USB_OTG_READ_REG32(depctl_addr); + + if (Status == USB_OTG_EP_TX_STALL) + { + USB_OTG_EPSetStall(pdev, ep); return; + } + else if (Status == USB_OTG_EP_TX_NAK) + depctl.b.snak = 1; + else if (Status == USB_OTG_EP_TX_VALID) + { + if (depctl.b.stall == 1) + { + ep->even_odd_frame = 0; + USB_OTG_EPClearStall(pdev, ep); + return; + } + depctl.b.cnak = 1; + depctl.b.usbactep = 1; + depctl.b.epena = 1; + } + else if (Status == USB_OTG_EP_TX_DIS) + depctl.b.usbactep = 0; + } + else /* Process for OUT endpoint */ + { + depctl_addr = &(pdev->regs.OUTEP_REGS[ep->num]->DOEPCTL); + depctl.d32 = USB_OTG_READ_REG32(depctl_addr); + + if (Status == USB_OTG_EP_RX_STALL) { + depctl.b.stall = 1; + } + else if (Status == USB_OTG_EP_RX_NAK) + depctl.b.snak = 1; + else if (Status == USB_OTG_EP_RX_VALID) + { + if (depctl.b.stall == 1) + { + ep->even_odd_frame = 0; + USB_OTG_EPClearStall(pdev, ep); + return; + } + depctl.b.cnak = 1; + depctl.b.usbactep = 1; + depctl.b.epena = 1; + } + else if (Status == USB_OTG_EP_RX_DIS) + { + depctl.b.usbactep = 0; + } + } + + USB_OTG_WRITE_REG32(depctl_addr, depctl.d32); +} + +#endif +/** +* @} +*/ + +/** +* @} +*/ + +/** +* @} +*/ + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/codec2/tags/0.4.1/stm32/usb_lib/otg/usb_core.h b/codec2/tags/0.4.1/stm32/usb_lib/otg/usb_core.h new file mode 100644 index 00000000..82a09e15 --- /dev/null +++ b/codec2/tags/0.4.1/stm32/usb_lib/otg/usb_core.h @@ -0,0 +1,408 @@ +/** + ****************************************************************************** + * @file usb_core.h + * @author MCD Application Team + * @version V2.0.0 + * @date 22-July-2011 + * @brief Header of the Core Layer + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __USB_CORE_H__ +#define __USB_CORE_H__ + +/* Includes ------------------------------------------------------------------*/ +#include "usb_conf.h" +#include "usb_regs.h" +#include "usb_defines.h" + + +/** @addtogroup USB_OTG_DRIVER + * @{ + */ + +/** @defgroup USB_CORE + * @brief usb otg driver core layer + * @{ + */ + + +/** @defgroup USB_CORE_Exported_Defines + * @{ + */ + +#define USB_OTG_EP0_IDLE 0 +#define USB_OTG_EP0_SETUP 1 +#define USB_OTG_EP0_DATA_IN 2 +#define USB_OTG_EP0_DATA_OUT 3 +#define USB_OTG_EP0_STATUS_IN 4 +#define USB_OTG_EP0_STATUS_OUT 5 +#define USB_OTG_EP0_STALL 6 + +#define USB_OTG_EP_TX_DIS 0x0000 +#define USB_OTG_EP_TX_STALL 0x0010 +#define USB_OTG_EP_TX_NAK 0x0020 +#define USB_OTG_EP_TX_VALID 0x0030 + +#define USB_OTG_EP_RX_DIS 0x0000 +#define USB_OTG_EP_RX_STALL 0x1000 +#define USB_OTG_EP_RX_NAK 0x2000 +#define USB_OTG_EP_RX_VALID 0x3000 +/** + * @} + */ +#define MAX_DATA_LENGTH 0xFF + +/** @defgroup USB_CORE_Exported_Types + * @{ + */ + + +typedef enum { + USB_OTG_OK = 0, + USB_OTG_FAIL +}USB_OTG_STS; + +typedef enum { + HC_IDLE = 0, + HC_XFRC, + HC_HALTED, + HC_NAK, + HC_NYET, + HC_STALL, + HC_XACTERR, + HC_BBLERR, + HC_DATATGLERR, +}HC_STATUS; + +typedef enum { + URB_IDLE = 0, + URB_DONE, + URB_NOTREADY, + URB_ERROR, + URB_STALL +}URB_STATE; + +typedef enum { + CTRL_START = 0, + CTRL_XFRC, + CTRL_HALTED, + CTRL_NAK, + CTRL_STALL, + CTRL_XACTERR, + CTRL_BBLERR, + CTRL_DATATGLERR, + CTRL_FAIL +}CTRL_STATUS; + + +typedef struct USB_OTG_hc +{ + uint8_t dev_addr ; + uint8_t ep_num; + uint8_t ep_is_in; + uint8_t speed; + uint8_t do_ping; + uint8_t ep_type; + uint16_t max_packet; + uint8_t data_pid; + uint8_t *xfer_buff; + uint32_t xfer_len; + uint32_t xfer_count; + uint8_t toggle_in; + uint8_t toggle_out; + uint32_t dma_addr; +} +USB_OTG_HC , *PUSB_OTG_HC; + +typedef struct USB_OTG_ep +{ + uint8_t num; + uint8_t is_in; + uint8_t is_stall; + uint8_t type; + uint8_t data_pid_start; + uint8_t even_odd_frame; + uint16_t tx_fifo_num; + uint32_t maxpacket; + /* transaction level variables*/ + uint8_t *xfer_buff; + uint32_t dma_addr; + uint32_t xfer_len; + uint32_t xfer_count; + /* Transfer level variables*/ + uint32_t rem_data_len; + uint32_t total_data_len; + uint32_t ctl_data_len; + +} + +USB_OTG_EP , *PUSB_OTG_EP; + + + +typedef struct USB_OTG_core_cfg +{ + uint8_t host_channels; + uint8_t dev_endpoints; + uint8_t speed; + uint8_t dma_enable; + uint16_t mps; + uint16_t TotalFifoSize; + uint8_t phy_itface; + uint8_t Sof_output; + uint8_t low_power; + uint8_t coreID; + +} +USB_OTG_CORE_CFGS, *PUSB_OTG_CORE_CFGS; + + + +typedef struct usb_setup_req { + + uint8_t bmRequest; + uint8_t bRequest; + uint16_t wValue; + uint16_t wIndex; + uint16_t wLength; +} USB_SETUP_REQ; + +typedef struct _Device_TypeDef +{ + uint8_t *(*GetDeviceDescriptor)( uint8_t speed , uint16_t *length); + uint8_t *(*GetLangIDStrDescriptor)( uint8_t speed , uint16_t *length); + uint8_t *(*GetManufacturerStrDescriptor)( uint8_t speed , uint16_t *length); + uint8_t *(*GetProductStrDescriptor)( uint8_t speed , uint16_t *length); + uint8_t *(*GetSerialStrDescriptor)( uint8_t speed , uint16_t *length); + uint8_t *(*GetConfigurationStrDescriptor)( uint8_t speed , uint16_t *length); + uint8_t *(*GetInterfaceStrDescriptor)( uint8_t speed , uint16_t *length); +} USBD_DEVICE, *pUSBD_DEVICE; + +typedef struct USB_OTG_hPort +{ + void (*Disconnect) (void *phost); + void (*Connect) (void *phost); + uint8_t ConnStatus; + uint8_t DisconnStatus; + uint8_t ConnHandled; + uint8_t DisconnHandled; +} USB_OTG_hPort_TypeDef; + +typedef struct _Device_cb +{ + uint8_t (*Init) (void *pdev , uint8_t cfgidx); + uint8_t (*DeInit) (void *pdev , uint8_t cfgidx); + /* Control Endpoints*/ + uint8_t (*Setup) (void *pdev , USB_SETUP_REQ *req); + uint8_t (*EP0_TxSent) (void *pdev ); + uint8_t (*EP0_RxReady) (void *pdev ); + /* Class Specific Endpoints*/ + uint8_t (*DataIn) (void *pdev , uint8_t epnum); + uint8_t (*DataOut) (void *pdev , uint8_t epnum); + uint8_t (*SOF) (void *pdev); + uint8_t (*IsoINIncomplete) (void *pdev); + uint8_t (*IsoOUTIncomplete) (void *pdev); + + uint8_t *(*GetConfigDescriptor)( uint8_t speed , uint16_t *length); +#ifdef USB_OTG_HS_CORE + uint8_t *(*GetOtherConfigDescriptor)( uint8_t speed , uint16_t *length); +#endif + +#ifdef USB_SUPPORT_USER_STRING_DESC + uint8_t *(*GetUsrStrDescriptor)( uint8_t speed ,uint8_t index, uint16_t *length); +#endif + +} USBD_Class_cb_TypeDef; + + + +typedef struct _USBD_USR_PROP +{ + void (*Init)(void); + void (*DeviceReset)(uint8_t speed); + void (*DeviceConfigured)(void); + void (*DeviceSuspended)(void); + void (*DeviceResumed)(void); + + void (*DeviceConnected)(void); + void (*DeviceDisconnected)(void); + +} +USBD_Usr_cb_TypeDef; + +typedef struct _DCD +{ + uint8_t device_config; + uint8_t device_state; + uint8_t device_status; + uint8_t device_address; + uint32_t DevRemoteWakeup; + USB_OTG_EP in_ep [USB_OTG_MAX_TX_FIFOS]; + USB_OTG_EP out_ep [USB_OTG_MAX_TX_FIFOS]; + uint8_t setup_packet [8*3]; + USBD_Class_cb_TypeDef *class_cb; + USBD_Usr_cb_TypeDef *usr_cb; + USBD_DEVICE *usr_device; + uint8_t *pConfig_descriptor; + } +DCD_DEV , *DCD_PDEV; + + +typedef struct _HCD +{ + uint8_t Rx_Buffer [MAX_DATA_LENGTH]; + __IO uint32_t ConnSts; + __IO uint32_t ErrCnt[USB_OTG_MAX_TX_FIFOS]; + __IO uint32_t XferCnt[USB_OTG_MAX_TX_FIFOS]; + __IO HC_STATUS HC_Status[USB_OTG_MAX_TX_FIFOS]; + __IO URB_STATE URB_State[USB_OTG_MAX_TX_FIFOS]; + USB_OTG_HC hc [USB_OTG_MAX_TX_FIFOS]; + uint16_t channel [USB_OTG_MAX_TX_FIFOS]; + USB_OTG_hPort_TypeDef *port_cb; +} +HCD_DEV , *USB_OTG_USBH_PDEV; + + +typedef struct _OTG +{ + uint8_t OTG_State; + uint8_t OTG_PrevState; + uint8_t OTG_Mode; +} +OTG_DEV , *USB_OTG_USBO_PDEV; + +typedef struct USB_OTG_handle +{ + USB_OTG_CORE_CFGS cfg; + USB_OTG_CORE_REGS regs; +#ifdef USE_DEVICE_MODE + DCD_DEV dev; +#endif +#ifdef USE_HOST_MODE + HCD_DEV host; +#endif +#ifdef USE_OTG_MODE + OTG_DEV otg; +#endif +} +USB_OTG_CORE_HANDLE , *PUSB_OTG_CORE_HANDLE; + +/** + * @} + */ + + +/** @defgroup USB_CORE_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup USB_CORE_Exported_Variables + * @{ + */ +/** + * @} + */ + +/** @defgroup USB_CORE_Exported_FunctionsPrototype + * @{ + */ + + +USB_OTG_STS USB_OTG_CoreInit (USB_OTG_CORE_HANDLE *pdev); +USB_OTG_STS USB_OTG_SelectCore (USB_OTG_CORE_HANDLE *pdev, + USB_OTG_CORE_ID_TypeDef coreID); +USB_OTG_STS USB_OTG_EnableGlobalInt (USB_OTG_CORE_HANDLE *pdev); +USB_OTG_STS USB_OTG_DisableGlobalInt(USB_OTG_CORE_HANDLE *pdev); +void* USB_OTG_ReadPacket (USB_OTG_CORE_HANDLE *pdev , + uint8_t *dest, + uint16_t len); +USB_OTG_STS USB_OTG_WritePacket (USB_OTG_CORE_HANDLE *pdev , + uint8_t *src, + uint8_t ch_ep_num, + uint16_t len); +USB_OTG_STS USB_OTG_FlushTxFifo (USB_OTG_CORE_HANDLE *pdev , uint32_t num); +USB_OTG_STS USB_OTG_FlushRxFifo (USB_OTG_CORE_HANDLE *pdev); + +uint32_t USB_OTG_ReadCoreItr (USB_OTG_CORE_HANDLE *pdev); +uint32_t USB_OTG_ReadOtgItr (USB_OTG_CORE_HANDLE *pdev); +uint8_t USB_OTG_IsHostMode (USB_OTG_CORE_HANDLE *pdev); +uint8_t USB_OTG_IsDeviceMode (USB_OTG_CORE_HANDLE *pdev); +uint32_t USB_OTG_GetMode (USB_OTG_CORE_HANDLE *pdev); +USB_OTG_STS USB_OTG_PhyInit (USB_OTG_CORE_HANDLE *pdev); +USB_OTG_STS USB_OTG_SetCurrentMode (USB_OTG_CORE_HANDLE *pdev, + uint8_t mode); + +/*********************** HOST APIs ********************************************/ +#ifdef USE_HOST_MODE +USB_OTG_STS USB_OTG_CoreInitHost (USB_OTG_CORE_HANDLE *pdev); +USB_OTG_STS USB_OTG_EnableHostInt (USB_OTG_CORE_HANDLE *pdev); +USB_OTG_STS USB_OTG_HC_Init (USB_OTG_CORE_HANDLE *pdev, uint8_t hc_num); +USB_OTG_STS USB_OTG_HC_Halt (USB_OTG_CORE_HANDLE *pdev, uint8_t hc_num); +USB_OTG_STS USB_OTG_HC_StartXfer (USB_OTG_CORE_HANDLE *pdev, uint8_t hc_num); +USB_OTG_STS USB_OTG_HC_DoPing (USB_OTG_CORE_HANDLE *pdev , uint8_t hc_num); +uint32_t USB_OTG_ReadHostAllChannels_intr (USB_OTG_CORE_HANDLE *pdev); +uint32_t USB_OTG_ResetPort (USB_OTG_CORE_HANDLE *pdev); +uint32_t USB_OTG_ReadHPRT0 (USB_OTG_CORE_HANDLE *pdev); +void USB_OTG_DriveVbus (USB_OTG_CORE_HANDLE *pdev, uint8_t state); +void USB_OTG_InitFSLSPClkSel (USB_OTG_CORE_HANDLE *pdev ,uint8_t freq); +uint8_t USB_OTG_IsEvenFrame (USB_OTG_CORE_HANDLE *pdev) ; +void USB_OTG_StopHost (USB_OTG_CORE_HANDLE *pdev); +#endif +/********************* DEVICE APIs ********************************************/ +#ifdef USE_DEVICE_MODE +USB_OTG_STS USB_OTG_CoreInitDev (USB_OTG_CORE_HANDLE *pdev); +USB_OTG_STS USB_OTG_EnableDevInt (USB_OTG_CORE_HANDLE *pdev); +uint32_t USB_OTG_ReadDevAllInEPItr (USB_OTG_CORE_HANDLE *pdev); +enum USB_OTG_SPEED USB_OTG_GetDeviceSpeed (USB_OTG_CORE_HANDLE *pdev); +USB_OTG_STS USB_OTG_EP0Activate (USB_OTG_CORE_HANDLE *pdev); +USB_OTG_STS USB_OTG_EPActivate (USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep); +USB_OTG_STS USB_OTG_EPDeactivate(USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep); +USB_OTG_STS USB_OTG_EPStartXfer (USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep); +USB_OTG_STS USB_OTG_EP0StartXfer(USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep); +USB_OTG_STS USB_OTG_EPSetStall (USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep); +USB_OTG_STS USB_OTG_EPClearStall (USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep); +uint32_t USB_OTG_ReadDevAllOutEp_itr (USB_OTG_CORE_HANDLE *pdev); +uint32_t USB_OTG_ReadDevOutEP_itr (USB_OTG_CORE_HANDLE *pdev , uint8_t epnum); +uint32_t USB_OTG_ReadDevAllInEPItr (USB_OTG_CORE_HANDLE *pdev); +void USB_OTG_InitDevSpeed (USB_OTG_CORE_HANDLE *pdev , uint8_t speed); +uint8_t USBH_IsEvenFrame (USB_OTG_CORE_HANDLE *pdev); +void USB_OTG_EP0_OutStart(USB_OTG_CORE_HANDLE *pdev); +void USB_OTG_ActiveRemoteWakeup(USB_OTG_CORE_HANDLE *pdev); +void USB_OTG_UngateClock(USB_OTG_CORE_HANDLE *pdev); +void USB_OTG_StopDevice(USB_OTG_CORE_HANDLE *pdev); +void USB_OTG_SetEPStatus (USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep , uint32_t Status); +uint32_t USB_OTG_GetEPStatus(USB_OTG_CORE_HANDLE *pdev ,USB_OTG_EP *ep); +#endif +/** + * @} + */ + +#endif /* __USB_CORE_H__ */ + + +/** + * @} + */ + +/** + * @} + */ +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ + diff --git a/codec2/tags/0.4.1/stm32/usb_lib/otg/usb_dcd.c b/codec2/tags/0.4.1/stm32/usb_lib/otg/usb_dcd.c new file mode 100644 index 00000000..a74522f5 --- /dev/null +++ b/codec2/tags/0.4.1/stm32/usb_lib/otg/usb_dcd.c @@ -0,0 +1,475 @@ +/** + ****************************************************************************** + * @file usb_dcd.c + * @author MCD Application Team + * @version V2.0.0 + * @date 22-July-2011 + * @brief Peripheral Device Interface Layer + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +#include "usb_conf.h" +#ifdef USE_DEVICE_MODE +/* Includes ------------------------------------------------------------------*/ +#include "usb_dcd.h" +#include "usb_bsp.h" + + +/** @addtogroup USB_OTG_DRIVER +* @{ +*/ + +/** @defgroup USB_DCD +* @brief This file is the interface between EFSL ans Host mass-storage class +* @{ +*/ + + +/** @defgroup USB_DCD_Private_Defines +* @{ +*/ +/** +* @} +*/ + + +/** @defgroup USB_DCD_Private_TypesDefinitions +* @{ +*/ +/** +* @} +*/ + + + +/** @defgroup USB_DCD_Private_Macros +* @{ +*/ +/** +* @} +*/ + + +/** @defgroup USB_DCD_Private_Variables +* @{ +*/ +/** +* @} +*/ + + +/** @defgroup USB_DCD_Private_FunctionPrototypes +* @{ +*/ + +/** +* @} +*/ + + +/** @defgroup USB_DCD_Private_Functions +* @{ +*/ + + + +void DCD_Init(USB_OTG_CORE_HANDLE *pdev , + USB_OTG_CORE_ID_TypeDef coreID) +{ + uint32_t i; + USB_OTG_EP *ep; + + USB_OTG_SelectCore (pdev , coreID); + + pdev->dev.device_status = USB_OTG_DEFAULT; + pdev->dev.device_address = 0; + + /* Init ep structure */ + for (i = 0; i < pdev->cfg.dev_endpoints ; i++) + { + ep = &pdev->dev.in_ep[i]; + /* Init ep structure */ + ep->is_in = 1; + ep->num = i; + ep->tx_fifo_num = i; + /* Control until ep is actvated */ + ep->type = EP_TYPE_CTRL; + ep->maxpacket = USB_OTG_MAX_EP0_SIZE; + ep->xfer_buff = 0; + ep->xfer_len = 0; + } + + for (i = 0; i < pdev->cfg.dev_endpoints; i++) + { + ep = &pdev->dev.out_ep[i]; + /* Init ep structure */ + ep->is_in = 0; + ep->num = i; + ep->tx_fifo_num = i; + /* Control until ep is activated */ + ep->type = EP_TYPE_CTRL; + ep->maxpacket = USB_OTG_MAX_EP0_SIZE; + ep->xfer_buff = 0; + ep->xfer_len = 0; + } + + USB_OTG_DisableGlobalInt(pdev); + + /*Init the Core (common init.) */ + USB_OTG_CoreInit(pdev); + + + /* Force Device Mode*/ + USB_OTG_SetCurrentMode(pdev, DEVICE_MODE); + + /* Init Device */ + USB_OTG_CoreInitDev(pdev); + + + /* Enable USB Global interrupt */ + USB_OTG_EnableGlobalInt(pdev); +} + + +/** +* @brief Configure an EP +* @param pdev : Device instance +* @param epdesc : Endpoint Descriptor +* @retval : status +*/ +uint32_t DCD_EP_Open(USB_OTG_CORE_HANDLE *pdev , + uint8_t ep_addr, + uint16_t ep_mps, + uint8_t ep_type) +{ + USB_OTG_EP *ep; + + if ((ep_addr & 0x80) == 0x80) + { + ep = &pdev->dev.in_ep[ep_addr & 0x7F]; + } + else + { + ep = &pdev->dev.out_ep[ep_addr & 0x7F]; + } + ep->num = ep_addr & 0x7F; + + ep->is_in = (0x80 & ep_addr) != 0; + ep->maxpacket = ep_mps; + ep->type = ep_type; + if (ep->is_in) + { + /* Assign a Tx FIFO */ + ep->tx_fifo_num = ep->num; + } + /* Set initial data PID. */ + if (ep_type == USB_OTG_EP_BULK ) + { + ep->data_pid_start = 0; + } + USB_OTG_EPActivate(pdev , ep ); + return 0; +} +/** +* @brief called when an EP is disabled +* @param pdev: device instance +* @param ep_addr: endpoint address +* @retval : status +*/ +uint32_t DCD_EP_Close(USB_OTG_CORE_HANDLE *pdev , uint8_t ep_addr) +{ + USB_OTG_EP *ep; + + if ((ep_addr&0x80) == 0x80) + { + ep = &pdev->dev.in_ep[ep_addr & 0x7F]; + } + else + { + ep = &pdev->dev.out_ep[ep_addr & 0x7F]; + } + ep->num = ep_addr & 0x7F; + ep->is_in = (0x80 & ep_addr) != 0; + USB_OTG_EPDeactivate(pdev , ep ); + return 0; +} + + +/** +* @brief DCD_EP_PrepareRx +* @param pdev: device instance +* @param ep_addr: endpoint address +* @param pbuf: pointer to Rx buffer +* @param buf_len: data length +* @retval : status +*/ +uint32_t DCD_EP_PrepareRx( USB_OTG_CORE_HANDLE *pdev, + uint8_t ep_addr, + uint8_t *pbuf, + uint16_t buf_len) +{ + USB_OTG_EP *ep; + + ep = &pdev->dev.out_ep[ep_addr & 0x7F]; + + /*setup and start the Xfer */ + ep->xfer_buff = pbuf; + ep->xfer_len = buf_len; + ep->xfer_count = 0; + ep->is_in = 0; + ep->num = ep_addr & 0x7F; + + if (pdev->cfg.dma_enable == 1) + { + ep->dma_addr = (uint32_t)pbuf; + } + + if ( ep->num == 0 ) + { + USB_OTG_EP0StartXfer(pdev , ep); + } + else + { + USB_OTG_EPStartXfer(pdev, ep ); + } + return 0; +} + +/** +* @brief Transmit data over USB +* @param pdev: device instance +* @param ep_addr: endpoint address +* @param pbuf: pointer to Tx buffer +* @param buf_len: data length +* @retval : status +*/ +uint32_t DCD_EP_Tx ( USB_OTG_CORE_HANDLE *pdev, + uint8_t ep_addr, + uint8_t *pbuf, + uint32_t buf_len) +{ + USB_OTG_EP *ep; + + ep = &pdev->dev.in_ep[ep_addr & 0x7F]; + + /* Setup and start the Transfer */ + ep->is_in = 1; + ep->num = ep_addr & 0x7F; + ep->xfer_buff = pbuf; + ep->dma_addr = (uint32_t)pbuf; + ep->xfer_count = 0; + ep->xfer_len = buf_len; + + if ( ep->num == 0 ) + { + USB_OTG_EP0StartXfer(pdev , ep); + } + else + { + USB_OTG_EPStartXfer(pdev, ep ); + } + return 0; +} + + +/** +* @brief Stall an endpoint. +* @param pdev: device instance +* @param epnum: endpoint address +* @retval : status +*/ +uint32_t DCD_EP_Stall (USB_OTG_CORE_HANDLE *pdev, uint8_t epnum) +{ + USB_OTG_EP *ep; + if ((0x80 & epnum) == 0x80) + { + ep = &pdev->dev.in_ep[epnum & 0x7F]; + } + else + { + ep = &pdev->dev.out_ep[epnum]; + } + + ep->is_stall = 1; + ep->num = epnum & 0x7F; + ep->is_in = ((epnum & 0x80) == 0x80); + + USB_OTG_EPSetStall(pdev , ep); + return (0); +} + + +/** +* @brief Clear stall condition on endpoints. +* @param pdev: device instance +* @param epnum: endpoint address +* @retval : status +*/ +uint32_t DCD_EP_ClrStall (USB_OTG_CORE_HANDLE *pdev, uint8_t epnum) +{ + USB_OTG_EP *ep; + if ((0x80 & epnum) == 0x80) + { + ep = &pdev->dev.in_ep[epnum & 0x7F]; + } + else + { + ep = &pdev->dev.out_ep[epnum]; + } + + ep->is_stall = 0; + ep->num = epnum & 0x7F; + ep->is_in = ((epnum & 0x80) == 0x80); + + USB_OTG_EPClearStall(pdev , ep); + return (0); +} + + +/** +* @brief This Function flushes the FIFOs. +* @param pdev: device instance +* @param epnum: endpoint address +* @retval : status +*/ +uint32_t DCD_EP_Flush (USB_OTG_CORE_HANDLE *pdev , uint8_t epnum) +{ + + if ((epnum & 0x80) == 0x80) + { + USB_OTG_FlushTxFifo(pdev, epnum & 0x7F); + } + else + { + USB_OTG_FlushRxFifo(pdev); + } + + return (0); +} + + +/** +* @brief This Function set USB device address +* @param pdev: device instance +* @param address: new device address +* @retval : status +*/ +void DCD_EP_SetAddress (USB_OTG_CORE_HANDLE *pdev, uint8_t address) +{ + USB_OTG_DCFG_TypeDef dcfg; + dcfg.d32 = 0; + dcfg.b.devaddr = address; + USB_OTG_MODIFY_REG32( &pdev->regs.DREGS->DCFG, 0, dcfg.d32); +} + +/** +* @brief Connect device (enable internal pull-up) +* @param pdev: device instance +* @retval : None +*/ +void DCD_DevConnect (USB_OTG_CORE_HANDLE *pdev) +{ +#ifndef USE_OTG_MODE + USB_OTG_DCTL_TypeDef dctl; + dctl.d32 = USB_OTG_READ_REG32(&pdev->regs.DREGS->DCTL); + /* Connect device */ + dctl.b.sftdiscon = 0; + USB_OTG_WRITE_REG32(&pdev->regs.DREGS->DCTL, dctl.d32); + USB_OTG_BSP_mDelay(3); +#endif +} + + +/** +* @brief Disconnect device (disable internal pull-up) +* @param pdev: device instance +* @retval : None +*/ +void DCD_DevDisconnect (USB_OTG_CORE_HANDLE *pdev) +{ +#ifndef USE_OTG_MODE + USB_OTG_DCTL_TypeDef dctl; + dctl.d32 = USB_OTG_READ_REG32(&pdev->regs.DREGS->DCTL); + /* Disconnect device for 3ms */ + dctl.b.sftdiscon = 1; + USB_OTG_WRITE_REG32(&pdev->regs.DREGS->DCTL, dctl.d32); + USB_OTG_BSP_mDelay(3); +#endif +} + + +/** +* @brief returns the EP Status +* @param pdev : Selected device +* epnum : endpoint address +* @retval : EP status +*/ + +uint32_t DCD_GetEPStatus(USB_OTG_CORE_HANDLE *pdev ,uint8_t epnum) +{ + USB_OTG_EP *ep; + uint32_t Status = 0; + + if ((0x80 & epnum) == 0x80) + { + ep = &pdev->dev.in_ep[epnum & 0x7F]; + } + else + { + ep = &pdev->dev.out_ep[epnum]; + } + + Status = USB_OTG_GetEPStatus(pdev ,ep); + + /* Return the current status */ + return Status; +} + +/** +* @brief Set the EP Status +* @param pdev : Selected device +* Status : new Status +* epnum : EP address +* @retval : None +*/ +void DCD_SetEPStatus (USB_OTG_CORE_HANDLE *pdev , uint8_t epnum , uint32_t Status) +{ + USB_OTG_EP *ep; + + if ((0x80 & epnum) == 0x80) + { + ep = &pdev->dev.in_ep[epnum & 0x7F]; + } + else + { + ep = &pdev->dev.out_ep[epnum]; + } + + USB_OTG_SetEPStatus(pdev ,ep , Status); +} + +/** +* @} +*/ + +/** +* @} +*/ + +/** +* @} +*/ +#endif + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/codec2/tags/0.4.1/stm32/usb_lib/otg/usb_dcd.h b/codec2/tags/0.4.1/stm32/usb_lib/otg/usb_dcd.h new file mode 100644 index 00000000..6bfd8993 --- /dev/null +++ b/codec2/tags/0.4.1/stm32/usb_lib/otg/usb_dcd.h @@ -0,0 +1,158 @@ +/** + ****************************************************************************** + * @file usb_dcd.h + * @author MCD Application Team + * @version V2.0.0 + * @date 22-July-2011 + * @brief Peripheral Driver Header file + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __DCD_H__ +#define __DCD_H__ + +/* Includes ------------------------------------------------------------------*/ +#include "usb_core.h" + + +/** @addtogroup USB_OTG_DRIVER +* @{ +*/ + +/** @defgroup USB_DCD +* @brief This file is the +* @{ +*/ + + +/** @defgroup USB_DCD_Exported_Defines +* @{ +*/ +#define USB_OTG_EP_CONTROL 0 +#define USB_OTG_EP_ISOC 1 +#define USB_OTG_EP_BULK 2 +#define USB_OTG_EP_INT 3 +#define USB_OTG_EP_MASK 3 + +/* Device Status */ +#define USB_OTG_DEFAULT 1 +#define USB_OTG_ADDRESSED 2 +#define USB_OTG_CONFIGURED 3 +#define USB_OTG_SUSPENDED 4 + +/** +* @} +*/ + + +/** @defgroup USB_DCD_Exported_Types +* @{ +*/ +/******************************************************************************** +Data structure type +********************************************************************************/ +typedef struct +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bEndpointAddress; + uint8_t bmAttributes; + uint16_t wMaxPacketSize; + uint8_t bInterval; +} +EP_DESCRIPTOR , *PEP_DESCRIPTOR; + +/** +* @} +*/ + + +/** @defgroup USB_DCD_Exported_Macros +* @{ +*/ +/** +* @} +*/ + +/** @defgroup USB_DCD_Exported_Variables +* @{ +*/ +/** +* @} +*/ + +/** @defgroup USB_DCD_Exported_FunctionsPrototype +* @{ +*/ +/******************************************************************************** +EXPORTED FUNCTION FROM THE USB-OTG LAYER +********************************************************************************/ +void DCD_Init(USB_OTG_CORE_HANDLE *pdev , + USB_OTG_CORE_ID_TypeDef coreID); + +void DCD_DevConnect (USB_OTG_CORE_HANDLE *pdev); +void DCD_DevDisconnect (USB_OTG_CORE_HANDLE *pdev); +void DCD_EP_SetAddress (USB_OTG_CORE_HANDLE *pdev, + uint8_t address); +uint32_t DCD_EP_Open(USB_OTG_CORE_HANDLE *pdev , + uint8_t ep_addr, + uint16_t ep_mps, + uint8_t ep_type); + +uint32_t DCD_EP_Close (USB_OTG_CORE_HANDLE *pdev, + uint8_t ep_addr); + + +uint32_t DCD_EP_PrepareRx ( USB_OTG_CORE_HANDLE *pdev, + uint8_t ep_addr, + uint8_t *pbuf, + uint16_t buf_len); + +uint32_t DCD_EP_Tx (USB_OTG_CORE_HANDLE *pdev, + uint8_t ep_addr, + uint8_t *pbuf, + uint32_t buf_len); +uint32_t DCD_EP_Stall (USB_OTG_CORE_HANDLE *pdev, + uint8_t epnum); +uint32_t DCD_EP_ClrStall (USB_OTG_CORE_HANDLE *pdev, + uint8_t epnum); +uint32_t DCD_EP_Flush (USB_OTG_CORE_HANDLE *pdev, + uint8_t epnum); +uint32_t DCD_Handle_ISR(USB_OTG_CORE_HANDLE *pdev); + +uint32_t DCD_GetEPStatus(USB_OTG_CORE_HANDLE *pdev , + uint8_t epnum); + +void DCD_SetEPStatus (USB_OTG_CORE_HANDLE *pdev , + uint8_t epnum , + uint32_t Status); + +/** +* @} +*/ + + +#endif //__DCD_H__ + + +/** +* @} +*/ + +/** +* @} +*/ +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ + diff --git a/codec2/tags/0.4.1/stm32/usb_lib/otg/usb_dcd_int.c b/codec2/tags/0.4.1/stm32/usb_lib/otg/usb_dcd_int.c new file mode 100644 index 00000000..5b47017a --- /dev/null +++ b/codec2/tags/0.4.1/stm32/usb_lib/otg/usb_dcd_int.c @@ -0,0 +1,889 @@ +/** + ****************************************************************************** + * @file usb_dcd_int.c + * @author MCD Application Team + * @version V2.0.0 + * @date 22-July-2011 + * @brief Peripheral Device interrupt subroutines + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +#include "usb_conf.h" +#ifdef USE_DEVICE_MODE +/* Includes ------------------------------------------------------------------*/ +#include "usb_dcd_int.h" +/** @addtogroup USB_OTG_DRIVER +* @{ +*/ + +/** @defgroup USB_DCD_INT +* @brief This file contains the interrupt subroutines for the Device mode. +* @{ +*/ + + +/** @defgroup USB_DCD_INT_Private_Defines +* @{ +*/ +/** +* @} +*/ + + +/** @defgroup USB_DCD_INT_Private_TypesDefinitions +* @{ +*/ +/** +* @} +*/ + + + +/** @defgroup USB_DCD_INT_Private_Macros +* @{ +*/ +/** +* @} +*/ + + +/** @defgroup USB_DCD_INT_Private_Variables +* @{ +*/ +/** +* @} +*/ + + +/** @defgroup USB_DCD_INT_Private_FunctionPrototypes +* @{ +*/ +/* static functions */ +static uint32_t DCD_ReadDevInEP (USB_OTG_CORE_HANDLE *pdev, uint8_t epnum); + +/* Interrupt Handlers */ +static uint32_t DCD_HandleInEP_ISR(USB_OTG_CORE_HANDLE *pdev); +static uint32_t DCD_HandleOutEP_ISR(USB_OTG_CORE_HANDLE *pdev); +static uint32_t DCD_HandleSof_ISR(USB_OTG_CORE_HANDLE *pdev); + +static uint32_t DCD_HandleRxStatusQueueLevel_ISR(USB_OTG_CORE_HANDLE *pdev); +static uint32_t DCD_WriteEmptyTxFifo(USB_OTG_CORE_HANDLE *pdev , uint32_t epnum); + +static uint32_t DCD_HandleUsbReset_ISR(USB_OTG_CORE_HANDLE *pdev); +static uint32_t DCD_HandleEnumDone_ISR(USB_OTG_CORE_HANDLE *pdev); +static uint32_t DCD_HandleResume_ISR(USB_OTG_CORE_HANDLE *pdev); +static uint32_t DCD_HandleUSBSuspend_ISR(USB_OTG_CORE_HANDLE *pdev); + +static uint32_t DCD_IsoINIncomplete_ISR(USB_OTG_CORE_HANDLE *pdev); +static uint32_t DCD_IsoOUTIncomplete_ISR(USB_OTG_CORE_HANDLE *pdev); +#ifdef VBUS_SENSING_ENABLED +static uint32_t DCD_SessionRequest_ISR(USB_OTG_CORE_HANDLE *pdev); +static uint32_t DCD_OTG_ISR(USB_OTG_CORE_HANDLE *pdev); +#endif + +/** +* @} +*/ + + +/** @defgroup USB_DCD_INT_Private_Functions +* @{ +*/ + + +#ifdef USB_OTG_HS_DEDICATED_EP1_ENABLED +/** +* @brief USBD_OTG_EP1OUT_ISR_Handler +* handles all USB Interrupts +* @param pdev: device instance +* @retval status +*/ +uint32_t USBD_OTG_EP1OUT_ISR_Handler (USB_OTG_CORE_HANDLE *pdev) +{ + + USB_OTG_DOEPINTn_TypeDef doepint; + USB_OTG_DEPXFRSIZ_TypeDef deptsiz; + + doepint.d32 = USB_OTG_READ_REG32(&pdev->regs.OUTEP_REGS[1]->DOEPINT); + doepint.d32&= USB_OTG_READ_REG32(&pdev->regs.DREGS->DOUTEP1MSK); + + /* Transfer complete */ + if ( doepint.b.xfercompl ) + { + /* Clear the bit in DOEPINTn for this interrupt */ + CLEAR_OUT_EP_INTR(1, xfercompl); + if (pdev->cfg.dma_enable == 1) + { + deptsiz.d32 = USB_OTG_READ_REG32(&(pdev->regs.OUTEP_REGS[1]->DOEPTSIZ)); + /*ToDo : handle more than one single MPS size packet */ + pdev->dev.out_ep[1].xfer_count = pdev->dev.out_ep[1].maxpacket - \ + deptsiz.b.xfersize; + } + /* Inform upper layer: data ready */ + /* RX COMPLETE */ + USBD_DCD_INT_fops->DataOutStage(pdev , 1); + + } + + /* Endpoint disable */ + if ( doepint.b.epdisabled ) + { + /* Clear the bit in DOEPINTn for this interrupt */ + CLEAR_OUT_EP_INTR(1, epdisabled); + } + /* AHB Error */ + if ( doepint.b.ahberr ) + { + CLEAR_OUT_EP_INTR(1, ahberr); + } + return 1; +} + +/** +* @brief USBD_OTG_EP1IN_ISR_Handler +* handles all USB Interrupts +* @param pdev: device instance +* @retval status +*/ +uint32_t USBD_OTG_EP1IN_ISR_Handler (USB_OTG_CORE_HANDLE *pdev) +{ + + USB_OTG_DIEPINTn_TypeDef diepint; + uint32_t fifoemptymsk, msk, emp; + + msk = USB_OTG_READ_REG32(&pdev->regs.DREGS->DINEP1MSK); + emp = USB_OTG_READ_REG32(&pdev->regs.DREGS->DIEPEMPMSK); + msk |= ((emp >> 1 ) & 0x1) << 7; + diepint.d32 = USB_OTG_READ_REG32(&pdev->regs.INEP_REGS[1]->DIEPINT) & msk; + + if ( diepint.b.xfercompl ) + { + fifoemptymsk = 0x1 << 1; + USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DIEPEMPMSK, fifoemptymsk, 0); + CLEAR_IN_EP_INTR(1, xfercompl); + /* TX COMPLETE */ + USBD_DCD_INT_fops->DataInStage(pdev , 1); + } + if ( diepint.b.ahberr ) + { + CLEAR_IN_EP_INTR(1, ahberr); + } + if ( diepint.b.epdisabled ) + { + CLEAR_IN_EP_INTR(1, epdisabled); + } + if ( diepint.b.timeout ) + { + CLEAR_IN_EP_INTR(1, timeout); + } + if (diepint.b.intktxfemp) + { + CLEAR_IN_EP_INTR(1, intktxfemp); + } + if (diepint.b.intknepmis) + { + CLEAR_IN_EP_INTR(1, intknepmis); + } + if (diepint.b.inepnakeff) + { + CLEAR_IN_EP_INTR(1, inepnakeff); + } + if (diepint.b.emptyintr) + { + DCD_WriteEmptyTxFifo(pdev , 1); + CLEAR_IN_EP_INTR(1, emptyintr); + } + return 1; +} +#endif + +/** +* @brief STM32_USBF_OTG_ISR_Handler +* handles all USB Interrupts +* @param pdev: device instance +* @retval status +*/ +uint32_t USBD_OTG_ISR_Handler (USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_GINTSTS_TypeDef gintr_status; + uint32_t retval = 0; + + if (USB_OTG_IsDeviceMode(pdev)) /* ensure that we are in device mode */ + { + gintr_status.d32 = USB_OTG_ReadCoreItr(pdev); + if (!gintr_status.d32) /* avoid spurious interrupt */ + { + return 0; + } + + if (gintr_status.b.outepintr) + { + retval |= DCD_HandleOutEP_ISR(pdev); + } + + if (gintr_status.b.inepint) + { + retval |= DCD_HandleInEP_ISR(pdev); + } + + if (gintr_status.b.modemismatch) + { + USB_OTG_GINTSTS_TypeDef gintsts; + + /* Clear interrupt */ + gintsts.d32 = 0; + gintsts.b.modemismatch = 1; + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GINTSTS, gintsts.d32); + } + + if (gintr_status.b.wkupintr) + { + retval |= DCD_HandleResume_ISR(pdev); + } + + if (gintr_status.b.usbsuspend) + { + retval |= DCD_HandleUSBSuspend_ISR(pdev); + } + if (gintr_status.b.sofintr) + { + retval |= DCD_HandleSof_ISR(pdev); + + } + + if (gintr_status.b.rxstsqlvl) + { + retval |= DCD_HandleRxStatusQueueLevel_ISR(pdev); + + } + + if (gintr_status.b.usbreset) + { + retval |= DCD_HandleUsbReset_ISR(pdev); + + } + if (gintr_status.b.enumdone) + { + retval |= DCD_HandleEnumDone_ISR(pdev); + } + + if (gintr_status.b.incomplisoin) + { + retval |= DCD_IsoINIncomplete_ISR(pdev); + } + + if (gintr_status.b.incomplisoout) + { + retval |= DCD_IsoOUTIncomplete_ISR(pdev); + } +#ifdef VBUS_SENSING_ENABLED + if (gintr_status.b.sessreqintr) + { + retval |= DCD_SessionRequest_ISR(pdev); + } + + if (gintr_status.b.otgintr) + { + retval |= DCD_OTG_ISR(pdev); + } +#endif + } + return retval; +} + +#ifdef VBUS_SENSING_ENABLED +/** +* @brief DCD_SessionRequest_ISR +* Indicates that the USB_OTG controller has detected a connection +* @param pdev: device instance +* @retval status +*/ +static uint32_t DCD_SessionRequest_ISR(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_GINTSTS_TypeDef gintsts; + USBD_DCD_INT_fops->DevConnected (pdev); + + /* Clear interrupt */ + gintsts.d32 = 0; + gintsts.b.sessreqintr = 1; + USB_OTG_WRITE_REG32 (&pdev->regs.GREGS->GINTSTS, gintsts.d32); + return 1; +} + +/** +* @brief DCD_OTG_ISR +* Indicates that the USB_OTG controller has detected an OTG event: +* used to detect the end of session i.e. disconnection +* @param pdev: device instance +* @retval status +*/ +static uint32_t DCD_OTG_ISR(USB_OTG_CORE_HANDLE *pdev) +{ + + USB_OTG_GOTGINT_TypeDef gotgint; + + gotgint.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->GOTGINT); + + if (gotgint.b.sesenddet) + { + USBD_DCD_INT_fops->DevDisconnected (pdev); + } + /* Clear OTG interrupt */ + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GOTGINT, gotgint.d32); + return 1; +} +#endif +/** +* @brief DCD_HandleResume_ISR +* Indicates that the USB_OTG controller has detected a resume or +* remote Wake-up sequence +* @param pdev: device instance +* @retval status +*/ +static uint32_t DCD_HandleResume_ISR(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_GINTSTS_TypeDef gintsts; + USB_OTG_DCTL_TypeDef devctl; + USB_OTG_PCGCCTL_TypeDef power; + + if(pdev->cfg.low_power) + { + /* un-gate USB Core clock */ + power.d32 = USB_OTG_READ_REG32(&pdev->regs.PCGCCTL); + power.b.gatehclk = 0; + power.b.stoppclk = 0; + USB_OTG_WRITE_REG32(pdev->regs.PCGCCTL, power.d32); + } + + /* Clear the Remote Wake-up Signaling */ + devctl.d32 = 0; + devctl.b.rmtwkupsig = 1; + USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DCTL, devctl.d32, 0); + + /* Inform upper layer by the Resume Event */ + USBD_DCD_INT_fops->Resume (pdev); + + /* Clear interrupt */ + gintsts.d32 = 0; + gintsts.b.wkupintr = 1; + USB_OTG_WRITE_REG32 (&pdev->regs.GREGS->GINTSTS, gintsts.d32); + return 1; +} + +/** +* @brief USB_OTG_HandleUSBSuspend_ISR +* Indicates that SUSPEND state has been detected on the USB +* @param pdev: device instance +* @retval status +*/ +static uint32_t DCD_HandleUSBSuspend_ISR(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_GINTSTS_TypeDef gintsts; + USB_OTG_PCGCCTL_TypeDef power; + USB_OTG_DSTS_TypeDef dsts; + + USBD_DCD_INT_fops->Suspend (pdev); + + dsts.d32 = USB_OTG_READ_REG32(&pdev->regs.DREGS->DSTS); + + /* Clear interrupt */ + gintsts.d32 = 0; + gintsts.b.usbsuspend = 1; + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GINTSTS, gintsts.d32); + + if((pdev->cfg.low_power) && (dsts.b.suspsts == 1)) + { + /* switch-off the clocks */ + power.d32 = 0; + power.b.stoppclk = 1; + USB_OTG_MODIFY_REG32(pdev->regs.PCGCCTL, 0, power.d32); + + power.b.gatehclk = 1; + USB_OTG_MODIFY_REG32(pdev->regs.PCGCCTL, 0, power.d32); + + /* Request to enter Sleep mode after exit from current ISR */ + SCB->SCR |= (SCB_SCR_SLEEPDEEP_Msk | SCB_SCR_SLEEPONEXIT_Msk); + } + return 1; +} + +/** +* @brief DCD_HandleInEP_ISR +* Indicates that an IN EP has a pending Interrupt +* @param pdev: device instance +* @retval status +*/ +static uint32_t DCD_HandleInEP_ISR(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_DIEPINTn_TypeDef diepint; + + uint32_t ep_intr; + uint32_t epnum = 0; + uint32_t fifoemptymsk; + diepint.d32 = 0; + ep_intr = USB_OTG_ReadDevAllInEPItr(pdev); + + while ( ep_intr ) + { + if (ep_intr&0x1) /* In ITR */ + { + diepint.d32 = DCD_ReadDevInEP(pdev , epnum); /* Get In ITR status */ + if ( diepint.b.xfercompl ) + { + fifoemptymsk = 0x1 << epnum; + USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DIEPEMPMSK, fifoemptymsk, 0); + CLEAR_IN_EP_INTR(epnum, xfercompl); + /* TX COMPLETE */ + USBD_DCD_INT_fops->DataInStage(pdev , epnum); + + if (pdev->cfg.dma_enable == 1) + { + if((epnum == 0) && (pdev->dev.device_state == USB_OTG_EP0_STATUS_IN)) + { + /* prepare to rx more setup packets */ + USB_OTG_EP0_OutStart(pdev); + } + } + } + if ( diepint.b.ahberr ) + { + CLEAR_IN_EP_INTR(epnum, ahberr); + } + if ( diepint.b.timeout ) + { + CLEAR_IN_EP_INTR(epnum, timeout); + } + if (diepint.b.intktxfemp) + { + CLEAR_IN_EP_INTR(epnum, intktxfemp); + } + if (diepint.b.intknepmis) + { + CLEAR_IN_EP_INTR(epnum, intknepmis); + } + if (diepint.b.inepnakeff) + { + CLEAR_IN_EP_INTR(epnum, inepnakeff); + } + if ( diepint.b.epdisabled ) + { + CLEAR_IN_EP_INTR(epnum, epdisabled); + } + if (diepint.b.emptyintr) + { + + DCD_WriteEmptyTxFifo(pdev , epnum); + + CLEAR_IN_EP_INTR(epnum, emptyintr); + } + } + epnum++; + ep_intr >>= 1; + } + + return 1; +} + +/** +* @brief DCD_HandleOutEP_ISR +* Indicates that an OUT EP has a pending Interrupt +* @param pdev: device instance +* @retval status +*/ +static uint32_t DCD_HandleOutEP_ISR(USB_OTG_CORE_HANDLE *pdev) +{ + uint32_t ep_intr; + USB_OTG_DOEPINTn_TypeDef doepint; + USB_OTG_DEPXFRSIZ_TypeDef deptsiz; + uint32_t epnum = 0; + + doepint.d32 = 0; + + /* Read in the device interrupt bits */ + ep_intr = USB_OTG_ReadDevAllOutEp_itr(pdev); + + while ( ep_intr ) + { + if (ep_intr&0x1) + { + + doepint.d32 = USB_OTG_ReadDevOutEP_itr(pdev, epnum); + + /* Transfer complete */ + if ( doepint.b.xfercompl ) + { + /* Clear the bit in DOEPINTn for this interrupt */ + CLEAR_OUT_EP_INTR(epnum, xfercompl); + if (pdev->cfg.dma_enable == 1) + { + deptsiz.d32 = USB_OTG_READ_REG32(&(pdev->regs.OUTEP_REGS[epnum]->DOEPTSIZ)); + /*ToDo : handle more than one single MPS size packet */ + pdev->dev.out_ep[epnum].xfer_count = pdev->dev.out_ep[epnum].maxpacket - \ + deptsiz.b.xfersize; + } + /* Inform upper layer: data ready */ + /* RX COMPLETE */ + USBD_DCD_INT_fops->DataOutStage(pdev , epnum); + + if (pdev->cfg.dma_enable == 1) + { + if((epnum == 0) && (pdev->dev.device_state == USB_OTG_EP0_STATUS_OUT)) + { + /* prepare to rx more setup packets */ + USB_OTG_EP0_OutStart(pdev); + } + } + } + /* Endpoint disable */ + if ( doepint.b.epdisabled ) + { + /* Clear the bit in DOEPINTn for this interrupt */ + CLEAR_OUT_EP_INTR(epnum, epdisabled); + } + /* AHB Error */ + if ( doepint.b.ahberr ) + { + CLEAR_OUT_EP_INTR(epnum, ahberr); + } + /* Setup Phase Done (control EPs) */ + if ( doepint.b.setup ) + { + + /* inform the upper layer that a setup packet is available */ + /* SETUP COMPLETE */ + USBD_DCD_INT_fops->SetupStage(pdev); + CLEAR_OUT_EP_INTR(epnum, setup); + } + } + epnum++; + ep_intr >>= 1; + } + return 1; +} + +/** +* @brief DCD_HandleSof_ISR +* Handles the SOF Interrupts +* @param pdev: device instance +* @retval status +*/ +static uint32_t DCD_HandleSof_ISR(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_GINTSTS_TypeDef GINTSTS; + + + USBD_DCD_INT_fops->SOF(pdev); + + /* Clear interrupt */ + GINTSTS.d32 = 0; + GINTSTS.b.sofintr = 1; + USB_OTG_WRITE_REG32 (&pdev->regs.GREGS->GINTSTS, GINTSTS.d32); + + return 1; +} + +/** +* @brief DCD_HandleRxStatusQueueLevel_ISR +* Handles the Rx Status Queue Level Interrupt +* @param pdev: device instance +* @retval status +*/ +static uint32_t DCD_HandleRxStatusQueueLevel_ISR(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_GINTMSK_TypeDef int_mask; + USB_OTG_DRXSTS_TypeDef status; + USB_OTG_EP *ep; + + /* Disable the Rx Status Queue Level interrupt */ + int_mask.d32 = 0; + int_mask.b.rxstsqlvl = 1; + USB_OTG_MODIFY_REG32( &pdev->regs.GREGS->GINTMSK, int_mask.d32, 0); + + /* Get the Status from the top of the FIFO */ + status.d32 = USB_OTG_READ_REG32( &pdev->regs.GREGS->GRXSTSP ); + + ep = &pdev->dev.out_ep[status.b.epnum]; + + switch (status.b.pktsts) + { + case STS_GOUT_NAK: + break; + case STS_DATA_UPDT: + if (status.b.bcnt) + { + USB_OTG_ReadPacket(pdev,ep->xfer_buff, status.b.bcnt); + ep->xfer_buff += status.b.bcnt; + ep->xfer_count += status.b.bcnt; + } + break; + case STS_XFER_COMP: + break; + case STS_SETUP_COMP: + break; + case STS_SETUP_UPDT: + /* Copy the setup packet received in FIFO into the setup buffer in RAM */ + USB_OTG_ReadPacket(pdev , pdev->dev.setup_packet, 8); + ep->xfer_count += status.b.bcnt; + break; + default: + break; + } + + /* Enable the Rx Status Queue Level interrupt */ + USB_OTG_MODIFY_REG32( &pdev->regs.GREGS->GINTMSK, 0, int_mask.d32); + + return 1; +} + +/** +* @brief DCD_WriteEmptyTxFifo +* check FIFO for the next packet to be loaded +* @param pdev: device instance +* @retval status +*/ +static uint32_t DCD_WriteEmptyTxFifo(USB_OTG_CORE_HANDLE *pdev, uint32_t epnum) +{ + USB_OTG_DTXFSTSn_TypeDef txstatus; + USB_OTG_EP *ep; + uint32_t len = 0; + uint32_t len32b; + txstatus.d32 = 0; + + ep = &pdev->dev.in_ep[epnum]; + + len = ep->xfer_len - ep->xfer_count; + + if (len > ep->maxpacket) + { + len = ep->maxpacket; + } + + len32b = (len + 3) / 4; + txstatus.d32 = USB_OTG_READ_REG32( &pdev->regs.INEP_REGS[epnum]->DTXFSTS); + + + + while (txstatus.b.txfspcavail > len32b && + ep->xfer_count < ep->xfer_len && + ep->xfer_len != 0) + { + /* Write the FIFO */ + len = ep->xfer_len - ep->xfer_count; + + if (len > ep->maxpacket) + { + len = ep->maxpacket; + } + len32b = (len + 3) / 4; + + USB_OTG_WritePacket (pdev , ep->xfer_buff, epnum, len); + + ep->xfer_buff += len; + ep->xfer_count += len; + + txstatus.d32 = USB_OTG_READ_REG32(&pdev->regs.INEP_REGS[epnum]->DTXFSTS); + } + + return 1; +} + +/** +* @brief DCD_HandleUsbReset_ISR +* This interrupt occurs when a USB Reset is detected +* @param pdev: device instance +* @retval status +*/ +static uint32_t DCD_HandleUsbReset_ISR(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_DAINT_TypeDef daintmsk; + USB_OTG_DOEPMSK_TypeDef doepmsk; + USB_OTG_DIEPMSK_TypeDef diepmsk; + USB_OTG_DCFG_TypeDef dcfg; + USB_OTG_DCTL_TypeDef dctl; + USB_OTG_GINTSTS_TypeDef gintsts; + uint32_t i; + + dctl.d32 = 0; + daintmsk.d32 = 0; + doepmsk.d32 = 0; + diepmsk.d32 = 0; + dcfg.d32 = 0; + gintsts.d32 = 0; + + /* Clear the Remote Wake-up Signaling */ + dctl.b.rmtwkupsig = 1; + USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DCTL, dctl.d32, 0 ); + + /* Flush the Tx FIFO */ + USB_OTG_FlushTxFifo(pdev , 0 ); + + for (i = 0; i < pdev->cfg.dev_endpoints ; i++) + { + USB_OTG_WRITE_REG32( &pdev->regs.INEP_REGS[i]->DIEPINT, 0xFF); + USB_OTG_WRITE_REG32( &pdev->regs.OUTEP_REGS[i]->DOEPINT, 0xFF); + } + USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DAINT, 0xFFFFFFFF ); + + daintmsk.ep.in = 1; + daintmsk.ep.out = 1; + USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DAINTMSK, daintmsk.d32 ); + + doepmsk.b.setup = 1; + doepmsk.b.xfercompl = 1; + doepmsk.b.ahberr = 1; + doepmsk.b.epdisabled = 1; + USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DOEPMSK, doepmsk.d32 ); +#ifdef USB_OTG_HS_DEDICATED_EP1_ENABLED + USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DOUTEP1MSK, doepmsk.d32 ); +#endif + diepmsk.b.xfercompl = 1; + diepmsk.b.timeout = 1; + diepmsk.b.epdisabled = 1; + diepmsk.b.ahberr = 1; + diepmsk.b.intknepmis = 1; + USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DIEPMSK, diepmsk.d32 ); +#ifdef USB_OTG_HS_DEDICATED_EP1_ENABLED + USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DINEP1MSK, diepmsk.d32 ); +#endif + /* Reset Device Address */ + dcfg.d32 = USB_OTG_READ_REG32( &pdev->regs.DREGS->DCFG); + dcfg.b.devaddr = 0; + USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DCFG, dcfg.d32); + + + /* setup EP0 to receive SETUP packets */ + USB_OTG_EP0_OutStart(pdev); + + /* Clear interrupt */ + gintsts.d32 = 0; + gintsts.b.usbreset = 1; + USB_OTG_WRITE_REG32 (&pdev->regs.GREGS->GINTSTS, gintsts.d32); + + /*Reset internal state machine */ + USBD_DCD_INT_fops->Reset(pdev); + return 1; +} + +/** +* @brief DCD_HandleEnumDone_ISR +* Read the device status register and set the device speed +* @param pdev: device instance +* @retval status +*/ +static uint32_t DCD_HandleEnumDone_ISR(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_GINTSTS_TypeDef gintsts; + USB_OTG_GUSBCFG_TypeDef gusbcfg; + + USB_OTG_EP0Activate(pdev); + + /* Set USB turn-around time based on device speed and PHY interface. */ + gusbcfg.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->GUSBCFG); + + /* Full or High speed */ + if ( USB_OTG_GetDeviceSpeed(pdev) == USB_SPEED_HIGH) + { + pdev->cfg.speed = USB_OTG_SPEED_HIGH; + pdev->cfg.mps = USB_OTG_HS_MAX_PACKET_SIZE ; + gusbcfg.b.usbtrdtim = 9; + } + else + { + pdev->cfg.speed = USB_OTG_SPEED_FULL; + pdev->cfg.mps = USB_OTG_FS_MAX_PACKET_SIZE ; + gusbcfg.b.usbtrdtim = 5; + } + + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GUSBCFG, gusbcfg.d32); + + /* Clear interrupt */ + gintsts.d32 = 0; + gintsts.b.enumdone = 1; + USB_OTG_WRITE_REG32( &pdev->regs.GREGS->GINTSTS, gintsts.d32 ); + return 1; +} + + +/** +* @brief DCD_IsoINIncomplete_ISR +* handle the ISO IN incomplete interrupt +* @param pdev: device instance +* @retval status +*/ +static uint32_t DCD_IsoINIncomplete_ISR(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_GINTSTS_TypeDef gintsts; + + gintsts.d32 = 0; + + USBD_DCD_INT_fops->IsoINIncomplete (pdev); + + /* Clear interrupt */ + gintsts.b.incomplisoin = 1; + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GINTSTS, gintsts.d32); + + return 1; +} + +/** +* @brief DCD_IsoOUTIncomplete_ISR +* handle the ISO OUT incomplete interrupt +* @param pdev: device instance +* @retval status +*/ +static uint32_t DCD_IsoOUTIncomplete_ISR(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_GINTSTS_TypeDef gintsts; + + gintsts.d32 = 0; + + USBD_DCD_INT_fops->IsoOUTIncomplete (pdev); + + /* Clear interrupt */ + gintsts.b.incomplisoout = 1; + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GINTSTS, gintsts.d32); + return 1; +} +/** +* @brief DCD_ReadDevInEP +* Reads ep flags +* @param pdev: device instance +* @retval status +*/ +static uint32_t DCD_ReadDevInEP (USB_OTG_CORE_HANDLE *pdev, uint8_t epnum) +{ + uint32_t v, msk, emp; + msk = USB_OTG_READ_REG32(&pdev->regs.DREGS->DIEPMSK); + emp = USB_OTG_READ_REG32(&pdev->regs.DREGS->DIEPEMPMSK); + msk |= ((emp >> epnum) & 0x1) << 7; + v = USB_OTG_READ_REG32(&pdev->regs.INEP_REGS[epnum]->DIEPINT) & msk; + return v; +} + + + +/** +* @} +*/ + +/** +* @} +*/ + +/** +* @} +*/ +#endif + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/codec2/tags/0.4.1/stm32/usb_lib/otg/usb_dcd_int.h b/codec2/tags/0.4.1/stm32/usb_lib/otg/usb_dcd_int.h new file mode 100644 index 00000000..9df1a417 --- /dev/null +++ b/codec2/tags/0.4.1/stm32/usb_lib/otg/usb_dcd_int.h @@ -0,0 +1,121 @@ +/** + ****************************************************************************** + * @file usb_dcd_int.h + * @author MCD Application Team + * @version V2.0.0 + * @date 22-July-2011 + * @brief Peripheral Device Interface Layer + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef USB_DCD_INT_H__ +#define USB_DCD_INT_H__ + +/* Includes ------------------------------------------------------------------*/ +#include "usb_dcd.h" + + + +/** @addtogroup USB_OTG_DRIVER + * @{ + */ + +/** @defgroup USB_DCD_INT + * @brief This file is the + * @{ + */ + + +/** @defgroup USB_DCD_INT_Exported_Defines + * @{ + */ + +typedef struct _USBD_DCD_INT +{ + uint8_t (* DataOutStage) (USB_OTG_CORE_HANDLE *pdev , uint8_t epnum); + uint8_t (* DataInStage) (USB_OTG_CORE_HANDLE *pdev , uint8_t epnum); + uint8_t (* SetupStage) (USB_OTG_CORE_HANDLE *pdev); + uint8_t (* SOF) (USB_OTG_CORE_HANDLE *pdev); + uint8_t (* Reset) (USB_OTG_CORE_HANDLE *pdev); + uint8_t (* Suspend) (USB_OTG_CORE_HANDLE *pdev); + uint8_t (* Resume) (USB_OTG_CORE_HANDLE *pdev); + uint8_t (* IsoINIncomplete) (USB_OTG_CORE_HANDLE *pdev); + uint8_t (* IsoOUTIncomplete) (USB_OTG_CORE_HANDLE *pdev); + + uint8_t (* DevConnected) (USB_OTG_CORE_HANDLE *pdev); + uint8_t (* DevDisconnected) (USB_OTG_CORE_HANDLE *pdev); + +}USBD_DCD_INT_cb_TypeDef; + +extern USBD_DCD_INT_cb_TypeDef *USBD_DCD_INT_fops; +/** + * @} + */ + + +/** @defgroup USB_DCD_INT_Exported_Types + * @{ + */ +/** + * @} + */ + +/** @defgroup USB_DCD_INT_Exported_Macros + * @{ + */ + +#define CLEAR_IN_EP_INTR(epnum,intr) \ + diepint.d32=0; \ + diepint.b.intr = 1; \ + USB_OTG_WRITE_REG32(&pdev->regs.INEP_REGS[epnum]->DIEPINT,diepint.d32); + +#define CLEAR_OUT_EP_INTR(epnum,intr) \ + doepint.d32=0; \ + doepint.b.intr = 1; \ + USB_OTG_WRITE_REG32(&pdev->regs.OUTEP_REGS[epnum]->DOEPINT,doepint.d32); + +/** + * @} + */ + +/** @defgroup USB_DCD_INT_Exported_Variables + * @{ + */ +/** + * @} + */ + +/** @defgroup USB_DCD_INT_Exported_FunctionsPrototype + * @{ + */ + +uint32_t USBD_OTG_ISR_Handler (USB_OTG_CORE_HANDLE *pdev); + +/** + * @} + */ + + +#endif // USB_DCD_INT_H__ + +/** + * @} + */ + +/** + * @} + */ +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ + diff --git a/codec2/tags/0.4.1/stm32/usb_lib/otg/usb_defines.h b/codec2/tags/0.4.1/stm32/usb_lib/otg/usb_defines.h new file mode 100644 index 00000000..b119c258 --- /dev/null +++ b/codec2/tags/0.4.1/stm32/usb_lib/otg/usb_defines.h @@ -0,0 +1,244 @@ +/** + ****************************************************************************** + * @file usb_defines.h + * @author MCD Application Team + * @version V2.0.0 + * @date 22-July-2011 + * @brief Header of the Core Layer + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __USB_DEF_H__ +#define __USB_DEF_H__ + +/* Includes ------------------------------------------------------------------*/ +#include "usb_conf.h" + +/** @addtogroup USB_OTG_DRIVER + * @{ + */ + +/** @defgroup USB_DEFINES + * @brief This file is the + * @{ + */ + + +/** @defgroup USB_DEFINES_Exported_Defines + * @{ + */ +/** + * @} + */ + + +/** @defgroup _CORE_DEFINES_ + * @{ + */ + +#define USB_OTG_SPEED_PARAM_HIGH 0 +#define USB_OTG_SPEED_PARAM_HIGH_IN_FULL 1 +#define USB_OTG_SPEED_PARAM_FULL 3 + +#define USB_OTG_SPEED_HIGH 0 +#define USB_OTG_SPEED_FULL 1 + +#define USB_OTG_ULPI_PHY 1 +#define USB_OTG_EMBEDDED_PHY 2 +#define USB_OTG_I2C_PHY 3 + +/** + * @} + */ + + +/** @defgroup _GLOBAL_DEFINES_ + * @{ + */ +#define GAHBCFG_TXFEMPTYLVL_EMPTY 1 +#define GAHBCFG_TXFEMPTYLVL_HALFEMPTY 0 +#define GAHBCFG_GLBINT_ENABLE 1 +#define GAHBCFG_INT_DMA_BURST_SINGLE 0 +#define GAHBCFG_INT_DMA_BURST_INCR 1 +#define GAHBCFG_INT_DMA_BURST_INCR4 3 +#define GAHBCFG_INT_DMA_BURST_INCR8 5 +#define GAHBCFG_INT_DMA_BURST_INCR16 7 +#define GAHBCFG_DMAENABLE 1 +#define GAHBCFG_TXFEMPTYLVL_EMPTY 1 +#define GAHBCFG_TXFEMPTYLVL_HALFEMPTY 0 +#define GRXSTS_PKTSTS_IN 2 +#define GRXSTS_PKTSTS_IN_XFER_COMP 3 +#define GRXSTS_PKTSTS_DATA_TOGGLE_ERR 5 +#define GRXSTS_PKTSTS_CH_HALTED 7 +/** + * @} + */ + + +/** @defgroup _OnTheGo_DEFINES_ + * @{ + */ +#define MODE_HNP_SRP_CAPABLE 0 +#define MODE_SRP_ONLY_CAPABLE 1 +#define MODE_NO_HNP_SRP_CAPABLE 2 +#define MODE_SRP_CAPABLE_DEVICE 3 +#define MODE_NO_SRP_CAPABLE_DEVICE 4 +#define MODE_SRP_CAPABLE_HOST 5 +#define MODE_NO_SRP_CAPABLE_HOST 6 +#define A_HOST 1 +#define A_SUSPEND 2 +#define A_PERIPHERAL 3 +#define B_PERIPHERAL 4 +#define B_HOST 5 +#define DEVICE_MODE 0 +#define HOST_MODE 1 +#define OTG_MODE 2 +/** + * @} + */ + + +/** @defgroup __DEVICE_DEFINES_ + * @{ + */ +#define DSTS_ENUMSPD_HS_PHY_30MHZ_OR_60MHZ 0 +#define DSTS_ENUMSPD_FS_PHY_30MHZ_OR_60MHZ 1 +#define DSTS_ENUMSPD_LS_PHY_6MHZ 2 +#define DSTS_ENUMSPD_FS_PHY_48MHZ 3 + +#define DCFG_FRAME_INTERVAL_80 0 +#define DCFG_FRAME_INTERVAL_85 1 +#define DCFG_FRAME_INTERVAL_90 2 +#define DCFG_FRAME_INTERVAL_95 3 + +#define DEP0CTL_MPS_64 0 +#define DEP0CTL_MPS_32 1 +#define DEP0CTL_MPS_16 2 +#define DEP0CTL_MPS_8 3 + +#define EP_SPEED_LOW 0 +#define EP_SPEED_FULL 1 +#define EP_SPEED_HIGH 2 + +#define EP_TYPE_CTRL 0 +#define EP_TYPE_ISOC 1 +#define EP_TYPE_BULK 2 +#define EP_TYPE_INTR 3 +#define EP_TYPE_MSK 3 + +#define STS_GOUT_NAK 1 +#define STS_DATA_UPDT 2 +#define STS_XFER_COMP 3 +#define STS_SETUP_COMP 4 +#define STS_SETUP_UPDT 6 +/** + * @} + */ + + +/** @defgroup __HOST_DEFINES_ + * @{ + */ +#define HC_PID_DATA0 0 +#define HC_PID_DATA2 1 +#define HC_PID_DATA1 2 +#define HC_PID_SETUP 3 + +#define HPRT0_PRTSPD_HIGH_SPEED 0 +#define HPRT0_PRTSPD_FULL_SPEED 1 +#define HPRT0_PRTSPD_LOW_SPEED 2 + +#define HCFG_30_60_MHZ 0 +#define HCFG_48_MHZ 1 +#define HCFG_6_MHZ 2 + +#define HCCHAR_CTRL 0 +#define HCCHAR_ISOC 1 +#define HCCHAR_BULK 2 +#define HCCHAR_INTR 3 + +#define MIN(a, b) (((a) < (b)) ? (a) : (b)) + +/** + * @} + */ + + +/** @defgroup USB_DEFINES_Exported_Types + * @{ + */ + +typedef enum +{ + USB_OTG_HS_CORE_ID = 0, + USB_OTG_FS_CORE_ID = 1 +}USB_OTG_CORE_ID_TypeDef; +/** + * @} + */ + + +/** @defgroup USB_DEFINES_Exported_Macros + * @{ + */ +/** + * @} + */ + +/** @defgroup USB_DEFINES_Exported_Variables + * @{ + */ +/** + * @} + */ + +/** @defgroup USB_DEFINES_Exported_FunctionsPrototype + * @{ + */ +/** + * @} + */ + + +/** @defgroup Internal_Macro's + * @{ + */ +#define USB_OTG_READ_REG32(reg) (*(__IO uint32_t *)reg) +#define USB_OTG_WRITE_REG32(reg,value) (*(__IO uint32_t *)reg = value) +#define USB_OTG_MODIFY_REG32(reg,clear_mask,set_mask) \ + USB_OTG_WRITE_REG32(reg, (((USB_OTG_READ_REG32(reg)) & ~clear_mask) | set_mask ) ) + +/******************************************************************************** + ENUMERATION TYPE +********************************************************************************/ +enum USB_OTG_SPEED { + USB_SPEED_UNKNOWN = 0, + USB_SPEED_LOW, + USB_SPEED_FULL, + USB_SPEED_HIGH +}; + +#endif //__USB_DEFINES__H__ + + +/** + * @} + */ + +/** + * @} + */ +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ + diff --git a/codec2/tags/0.4.1/stm32/usb_lib/otg/usb_regs.h b/codec2/tags/0.4.1/stm32/usb_lib/otg/usb_regs.h new file mode 100644 index 00000000..cd71ddfa --- /dev/null +++ b/codec2/tags/0.4.1/stm32/usb_lib/otg/usb_regs.h @@ -0,0 +1,1206 @@ +/** + ****************************************************************************** + * @file usb_regs.h + * @author MCD Application Team + * @version V2.0.0 + * @date 22-July-2011 + * @brief hardware registers + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __USB_OTG_REGS_H__ +#define __USB_OTG_REGS_H__ + +/* Includes ------------------------------------------------------------------*/ +#include "usb_conf.h" + + +/** @addtogroup USB_OTG_DRIVER + * @{ + */ + +/** @defgroup USB_REGS + * @brief This file is the + * @{ + */ + + +/** @defgroup USB_REGS_Exported_Defines + * @{ + */ + +#define USB_OTG_HS_BASE_ADDR 0x40040000 +#define USB_OTG_FS_BASE_ADDR 0x50000000 + +#define USB_OTG_CORE_GLOBAL_REGS_OFFSET 0x000 +#define USB_OTG_DEV_GLOBAL_REG_OFFSET 0x800 +#define USB_OTG_DEV_IN_EP_REG_OFFSET 0x900 +#define USB_OTG_EP_REG_OFFSET 0x20 +#define USB_OTG_DEV_OUT_EP_REG_OFFSET 0xB00 +#define USB_OTG_HOST_GLOBAL_REG_OFFSET 0x400 +#define USB_OTG_HOST_PORT_REGS_OFFSET 0x440 +#define USB_OTG_HOST_CHAN_REGS_OFFSET 0x500 +#define USB_OTG_CHAN_REGS_OFFSET 0x20 +#define USB_OTG_PCGCCTL_OFFSET 0xE00 +#define USB_OTG_DATA_FIFO_OFFSET 0x1000 +#define USB_OTG_DATA_FIFO_SIZE 0x1000 + + +#define USB_OTG_MAX_TX_FIFOS 15 + +#define USB_OTG_HS_MAX_PACKET_SIZE 512 +#define USB_OTG_FS_MAX_PACKET_SIZE 64 +#define USB_OTG_MAX_EP0_SIZE 64 +/** + * @} + */ + +/** @defgroup USB_REGS_Exported_Types + * @{ + */ + +/** @defgroup __USB_OTG_Core_register + * @{ + */ +typedef struct _USB_OTG_GREGS //000h +{ + __IO uint32_t GOTGCTL; /* USB_OTG Control and Status Register 000h*/ + __IO uint32_t GOTGINT; /* USB_OTG Interrupt Register 004h*/ + __IO uint32_t GAHBCFG; /* Core AHB Configuration Register 008h*/ + __IO uint32_t GUSBCFG; /* Core USB Configuration Register 00Ch*/ + __IO uint32_t GRSTCTL; /* Core Reset Register 010h*/ + __IO uint32_t GINTSTS; /* Core Interrupt Register 014h*/ + __IO uint32_t GINTMSK; /* Core Interrupt Mask Register 018h*/ + __IO uint32_t GRXSTSR; /* Receive Sts Q Read Register 01Ch*/ + __IO uint32_t GRXSTSP; /* Receive Sts Q Read & POP Register 020h*/ + __IO uint32_t GRXFSIZ; /* Receive FIFO Size Register 024h*/ + __IO uint32_t DIEPTXF0_HNPTXFSIZ; /* EP0 / Non Periodic Tx FIFO Size Register 028h*/ + __IO uint32_t HNPTXSTS; /* Non Periodic Tx FIFO/Queue Sts reg 02Ch*/ + __IO uint32_t GI2CCTL; /* I2C Access Register 030h*/ + uint32_t Reserved34; /* PHY Vendor Control Register 034h*/ + __IO uint32_t GCCFG; /* General Purpose IO Register 038h*/ + __IO uint32_t CID; /* User ID Register 03Ch*/ + uint32_t Reserved40[48]; /* Reserved 040h-0FFh*/ + __IO uint32_t HPTXFSIZ; /* Host Periodic Tx FIFO Size Reg 100h*/ + __IO uint32_t DIEPTXF[USB_OTG_MAX_TX_FIFOS];/* dev Periodic Transmit FIFO */ +} +USB_OTG_GREGS; +/** + * @} + */ + + +/** @defgroup __device_Registers + * @{ + */ +typedef struct _USB_OTG_DREGS // 800h +{ + __IO uint32_t DCFG; /* dev Configuration Register 800h*/ + __IO uint32_t DCTL; /* dev Control Register 804h*/ + __IO uint32_t DSTS; /* dev Status Register (RO) 808h*/ + uint32_t Reserved0C; /* Reserved 80Ch*/ + __IO uint32_t DIEPMSK; /* dev IN Endpoint Mask 810h*/ + __IO uint32_t DOEPMSK; /* dev OUT Endpoint Mask 814h*/ + __IO uint32_t DAINT; /* dev All Endpoints Itr Reg 818h*/ + __IO uint32_t DAINTMSK; /* dev All Endpoints Itr Mask 81Ch*/ + uint32_t Reserved20; /* Reserved 820h*/ + uint32_t Reserved9; /* Reserved 824h*/ + __IO uint32_t DVBUSDIS; /* dev VBUS discharge Register 828h*/ + __IO uint32_t DVBUSPULSE; /* dev VBUS Pulse Register 82Ch*/ + __IO uint32_t DTHRCTL; /* dev thr 830h*/ + __IO uint32_t DIEPEMPMSK; /* dev empty msk 834h*/ + __IO uint32_t DEACHINT; /* dedicated EP interrupt 838h*/ + __IO uint32_t DEACHMSK; /* dedicated EP msk 83Ch*/ + uint32_t Reserved40; /* dedicated EP mask 840h*/ + __IO uint32_t DINEP1MSK; /* dedicated EP mask 844h*/ + uint32_t Reserved44[15]; /* Reserved 844-87Ch*/ + __IO uint32_t DOUTEP1MSK; /* dedicated EP msk 884h*/ +} +USB_OTG_DREGS; +/** + * @} + */ + + +/** @defgroup __IN_Endpoint-Specific_Register + * @{ + */ +typedef struct _USB_OTG_INEPREGS +{ + __IO uint32_t DIEPCTL; /* dev IN Endpoint Control Reg 900h + (ep_num * 20h) + 00h*/ + uint32_t Reserved04; /* Reserved 900h + (ep_num * 20h) + 04h*/ + __IO uint32_t DIEPINT; /* dev IN Endpoint Itr Reg 900h + (ep_num * 20h) + 08h*/ + uint32_t Reserved0C; /* Reserved 900h + (ep_num * 20h) + 0Ch*/ + __IO uint32_t DIEPTSIZ; /* IN Endpoint Txfer Size 900h + (ep_num * 20h) + 10h*/ + __IO uint32_t DIEPDMA; /* IN Endpoint DMA Address Reg 900h + (ep_num * 20h) + 14h*/ + __IO uint32_t DTXFSTS;/*IN Endpoint Tx FIFO Status Reg 900h + (ep_num * 20h) + 18h*/ + uint32_t Reserved18; /* Reserved 900h+(ep_num*20h)+1Ch-900h+ (ep_num * 20h) + 1Ch*/ +} +USB_OTG_INEPREGS; +/** + * @} + */ + + +/** @defgroup __OUT_Endpoint-Specific_Registers + * @{ + */ +typedef struct _USB_OTG_OUTEPREGS +{ + __IO uint32_t DOEPCTL; /* dev OUT Endpoint Control Reg B00h + (ep_num * 20h) + 00h*/ + __IO uint32_t DOUTEPFRM; /* dev OUT Endpoint Frame number B00h + (ep_num * 20h) + 04h*/ + __IO uint32_t DOEPINT; /* dev OUT Endpoint Itr Reg B00h + (ep_num * 20h) + 08h*/ + uint32_t Reserved0C; /* Reserved B00h + (ep_num * 20h) + 0Ch*/ + __IO uint32_t DOEPTSIZ; /* dev OUT Endpoint Txfer Size B00h + (ep_num * 20h) + 10h*/ + __IO uint32_t DOEPDMA; /* dev OUT Endpoint DMA Address B00h + (ep_num * 20h) + 14h*/ + uint32_t Reserved18[2]; /* Reserved B00h + (ep_num * 20h) + 18h - B00h + (ep_num * 20h) + 1Ch*/ +} +USB_OTG_OUTEPREGS; +/** + * @} + */ + + +/** @defgroup __Host_Mode_Register_Structures + * @{ + */ +typedef struct _USB_OTG_HREGS +{ + __IO uint32_t HCFG; /* Host Configuration Register 400h*/ + __IO uint32_t HFIR; /* Host Frame Interval Register 404h*/ + __IO uint32_t HFNUM; /* Host Frame Nbr/Frame Remaining 408h*/ + uint32_t Reserved40C; /* Reserved 40Ch*/ + __IO uint32_t HPTXSTS; /* Host Periodic Tx FIFO/ Queue Status 410h*/ + __IO uint32_t HAINT; /* Host All Channels Interrupt Register 414h*/ + __IO uint32_t HAINTMSK; /* Host All Channels Interrupt Mask 418h*/ +} +USB_OTG_HREGS; +/** + * @} + */ + + +/** @defgroup __Host_Channel_Specific_Registers + * @{ + */ +typedef struct _USB_OTG_HC_REGS +{ + __IO uint32_t HCCHAR; + __IO uint32_t HCSPLT; + __IO uint32_t HCINT; + __IO uint32_t HCGINTMSK; + __IO uint32_t HCTSIZ; + __IO uint32_t HCDMA; + uint32_t Reserved[2]; +} +USB_OTG_HC_REGS; +/** + * @} + */ + + +/** @defgroup __otg_Core_registers + * @{ + */ +typedef struct USB_OTG_core_regs //000h +{ + USB_OTG_GREGS *GREGS; + USB_OTG_DREGS *DREGS; + USB_OTG_HREGS *HREGS; + USB_OTG_INEPREGS *INEP_REGS[USB_OTG_MAX_TX_FIFOS]; + USB_OTG_OUTEPREGS *OUTEP_REGS[USB_OTG_MAX_TX_FIFOS]; + USB_OTG_HC_REGS *HC_REGS[USB_OTG_MAX_TX_FIFOS]; + __IO uint32_t *HPRT0; + __IO uint32_t *DFIFO[USB_OTG_MAX_TX_FIFOS]; + __IO uint32_t *PCGCCTL; +} +USB_OTG_CORE_REGS , *PUSB_OTG_CORE_REGS; +typedef union _USB_OTG_OTGCTL_TypeDef +{ + uint32_t d32; + struct + { +uint32_t sesreqscs : + 1; +uint32_t sesreq : + 1; +uint32_t Reserved2_7 : + 6; +uint32_t hstnegscs : + 1; +uint32_t hnpreq : + 1; +uint32_t hstsethnpen : + 1; +uint32_t devhnpen : + 1; +uint32_t Reserved12_15 : + 4; +uint32_t conidsts : + 1; +uint32_t Reserved17 : + 1; +uint32_t asesvld : + 1; +uint32_t bsesvld : + 1; +uint32_t currmod : + 1; +uint32_t Reserved21_31 : + 11; + } + b; +} USB_OTG_OTGCTL_TypeDef ; +typedef union _USB_OTG_GOTGINT_TypeDef +{ + uint32_t d32; + struct + { +uint32_t Reserved0_1 : + 2; +uint32_t sesenddet : + 1; +uint32_t Reserved3_7 : + 5; +uint32_t sesreqsucstschng : + 1; +uint32_t hstnegsucstschng : + 1; +uint32_t reserver10_16 : + 7; +uint32_t hstnegdet : + 1; +uint32_t adevtoutchng : + 1; +uint32_t debdone : + 1; +uint32_t Reserved31_20 : + 12; + } + b; +} USB_OTG_GOTGINT_TypeDef ; +typedef union _USB_OTG_GAHBCFG_TypeDef +{ + uint32_t d32; + struct + { +uint32_t glblintrmsk : + 1; +uint32_t hburstlen : + 4; +uint32_t dmaenable : + 1; +uint32_t Reserved : + 1; +uint32_t nptxfemplvl_txfemplvl : + 1; +uint32_t ptxfemplvl : + 1; +uint32_t Reserved9_31 : + 23; + } + b; +} USB_OTG_GAHBCFG_TypeDef ; +typedef union _USB_OTG_GUSBCFG_TypeDef +{ + uint32_t d32; + struct + { +uint32_t toutcal : + 3; +uint32_t phyif : + 1; +uint32_t ulpi_utmi_sel : + 1; +uint32_t fsintf : + 1; +uint32_t physel : + 1; +uint32_t ddrsel : + 1; +uint32_t srpcap : + 1; +uint32_t hnpcap : + 1; +uint32_t usbtrdtim : + 4; +uint32_t nptxfrwnden : + 1; +uint32_t phylpwrclksel : + 1; +uint32_t otgutmifssel : + 1; +uint32_t ulpi_fsls : + 1; +uint32_t ulpi_auto_res : + 1; +uint32_t ulpi_clk_sus_m : + 1; +uint32_t ulpi_ext_vbus_drv : + 1; +uint32_t ulpi_int_vbus_indicator : + 1; +uint32_t term_sel_dl_pulse : + 1; +uint32_t Reserved : + 6; +uint32_t force_host : + 1; +uint32_t force_dev : + 1; +uint32_t corrupt_tx : + 1; + } + b; +} USB_OTG_GUSBCFG_TypeDef ; +typedef union _USB_OTG_GRSTCTL_TypeDef +{ + uint32_t d32; + struct + { +uint32_t csftrst : + 1; +uint32_t hsftrst : + 1; +uint32_t hstfrm : + 1; +uint32_t intknqflsh : + 1; +uint32_t rxfflsh : + 1; +uint32_t txfflsh : + 1; +uint32_t txfnum : + 5; +uint32_t Reserved11_29 : + 19; +uint32_t dmareq : + 1; +uint32_t ahbidle : + 1; + } + b; +} USB_OTG_GRSTCTL_TypeDef ; +typedef union _USB_OTG_GINTMSK_TypeDef +{ + uint32_t d32; + struct + { +uint32_t Reserved0 : + 1; +uint32_t modemismatch : + 1; +uint32_t otgintr : + 1; +uint32_t sofintr : + 1; +uint32_t rxstsqlvl : + 1; +uint32_t nptxfempty : + 1; +uint32_t ginnakeff : + 1; +uint32_t goutnakeff : + 1; +uint32_t Reserved8 : + 1; +uint32_t i2cintr : + 1; +uint32_t erlysuspend : + 1; +uint32_t usbsuspend : + 1; +uint32_t usbreset : + 1; +uint32_t enumdone : + 1; +uint32_t isooutdrop : + 1; +uint32_t eopframe : + 1; +uint32_t Reserved16 : + 1; +uint32_t epmismatch : + 1; +uint32_t inepintr : + 1; +uint32_t outepintr : + 1; +uint32_t incomplisoin : + 1; +uint32_t incomplisoout : + 1; +uint32_t Reserved22_23 : + 2; +uint32_t portintr : + 1; +uint32_t hcintr : + 1; +uint32_t ptxfempty : + 1; +uint32_t Reserved27 : + 1; +uint32_t conidstschng : + 1; +uint32_t disconnect : + 1; +uint32_t sessreqintr : + 1; +uint32_t wkupintr : + 1; + } + b; +} USB_OTG_GINTMSK_TypeDef ; +typedef union _USB_OTG_GINTSTS_TypeDef +{ + uint32_t d32; + struct + { +uint32_t curmode : + 1; +uint32_t modemismatch : + 1; +uint32_t otgintr : + 1; +uint32_t sofintr : + 1; +uint32_t rxstsqlvl : + 1; +uint32_t nptxfempty : + 1; +uint32_t ginnakeff : + 1; +uint32_t goutnakeff : + 1; +uint32_t Reserved8 : + 1; +uint32_t i2cintr : + 1; +uint32_t erlysuspend : + 1; +uint32_t usbsuspend : + 1; +uint32_t usbreset : + 1; +uint32_t enumdone : + 1; +uint32_t isooutdrop : + 1; +uint32_t eopframe : + 1; +uint32_t intimerrx : + 1; +uint32_t epmismatch : + 1; +uint32_t inepint: + 1; +uint32_t outepintr : + 1; +uint32_t incomplisoin : + 1; +uint32_t incomplisoout : + 1; +uint32_t Reserved22_23 : + 2; +uint32_t portintr : + 1; +uint32_t hcintr : + 1; +uint32_t ptxfempty : + 1; +uint32_t Reserved27 : + 1; +uint32_t conidstschng : + 1; +uint32_t disconnect : + 1; +uint32_t sessreqintr : + 1; +uint32_t wkupintr : + 1; + } + b; +} USB_OTG_GINTSTS_TypeDef ; +typedef union _USB_OTG_DRXSTS_TypeDef +{ + uint32_t d32; + struct + { +uint32_t epnum : + 4; +uint32_t bcnt : + 11; +uint32_t dpid : + 2; +uint32_t pktsts : + 4; +uint32_t fn : + 4; +uint32_t Reserved : + 7; + } + b; +} USB_OTG_DRXSTS_TypeDef ; +typedef union _USB_OTG_GRXSTS_TypeDef +{ + uint32_t d32; + struct + { +uint32_t chnum : + 4; +uint32_t bcnt : + 11; +uint32_t dpid : + 2; +uint32_t pktsts : + 4; +uint32_t Reserved : + 11; + } + b; +} USB_OTG_GRXFSTS_TypeDef ; +typedef union _USB_OTG_FSIZ_TypeDef +{ + uint32_t d32; + struct + { +uint32_t startaddr : + 16; +uint32_t depth : + 16; + } + b; +} USB_OTG_FSIZ_TypeDef ; +typedef union _USB_OTG_HNPTXSTS_TypeDef +{ + uint32_t d32; + struct + { +uint32_t nptxfspcavail : + 16; +uint32_t nptxqspcavail : + 8; +uint32_t nptxqtop_terminate : + 1; +uint32_t nptxqtop_timer : + 2; +uint32_t nptxqtop : + 2; +uint32_t chnum : + 2; +uint32_t Reserved : + 1; + } + b; +} USB_OTG_HNPTXSTS_TypeDef ; +typedef union _USB_OTG_DTXFSTSn_TypeDef +{ + uint32_t d32; + struct + { +uint32_t txfspcavail : + 16; +uint32_t Reserved : + 16; + } + b; +} USB_OTG_DTXFSTSn_TypeDef ; +typedef union _USB_OTG_GI2CCTL_TypeDef +{ + uint32_t d32; + struct + { +uint32_t rwdata : + 8; +uint32_t regaddr : + 8; +uint32_t addr : + 7; +uint32_t i2cen : + 1; +uint32_t ack : + 1; +uint32_t i2csuspctl : + 1; +uint32_t i2cdevaddr : + 2; +uint32_t dat_se0: + 1; +uint32_t Reserved : + 1; +uint32_t rw : + 1; +uint32_t bsydne : + 1; + } + b; +} USB_OTG_GI2CCTL_TypeDef ; +typedef union _USB_OTG_GCCFG_TypeDef +{ + uint32_t d32; + struct + { +uint32_t Reserved_in : + 16; +uint32_t pwdn : + 1; +uint32_t i2cifen : + 1; +uint32_t vbussensingA : + 1; +uint32_t vbussensingB : + 1; +uint32_t sofouten : + 1; +uint32_t disablevbussensing : + 1; +uint32_t Reserved_out : + 10; + } + b; +} USB_OTG_GCCFG_TypeDef ; + +typedef union _USB_OTG_DCFG_TypeDef +{ + uint32_t d32; + struct + { +uint32_t devspd : + 2; +uint32_t nzstsouthshk : + 1; +uint32_t Reserved3 : + 1; +uint32_t devaddr : + 7; +uint32_t perfrint : + 2; +uint32_t Reserved13_17 : + 5; +uint32_t epmscnt : + 4; + } + b; +} USB_OTG_DCFG_TypeDef ; +typedef union _USB_OTG_DCTL_TypeDef +{ + uint32_t d32; + struct + { +uint32_t rmtwkupsig : + 1; +uint32_t sftdiscon : + 1; +uint32_t gnpinnaksts : + 1; +uint32_t goutnaksts : + 1; +uint32_t tstctl : + 3; +uint32_t sgnpinnak : + 1; +uint32_t cgnpinnak : + 1; +uint32_t sgoutnak : + 1; +uint32_t cgoutnak : + 1; +uint32_t Reserved : + 21; + } + b; +} USB_OTG_DCTL_TypeDef ; +typedef union _USB_OTG_DSTS_TypeDef +{ + uint32_t d32; + struct + { +uint32_t suspsts : + 1; +uint32_t enumspd : + 2; +uint32_t errticerr : + 1; +uint32_t Reserved4_7: + 4; +uint32_t soffn : + 14; +uint32_t Reserved22_31 : + 10; + } + b; +} USB_OTG_DSTS_TypeDef ; +typedef union _USB_OTG_DIEPINTn_TypeDef +{ + uint32_t d32; + struct + { +uint32_t xfercompl : + 1; +uint32_t epdisabled : + 1; +uint32_t ahberr : + 1; +uint32_t timeout : + 1; +uint32_t intktxfemp : + 1; +uint32_t intknepmis : + 1; +uint32_t inepnakeff : + 1; +uint32_t emptyintr : + 1; +uint32_t txfifoundrn : + 1; +uint32_t Reserved08_31 : + 23; + } + b; +} USB_OTG_DIEPINTn_TypeDef ; +typedef union _USB_OTG_DIEPINTn_TypeDef USB_OTG_DIEPMSK_TypeDef ; +typedef union _USB_OTG_DOEPINTn_TypeDef +{ + uint32_t d32; + struct + { +uint32_t xfercompl : + 1; +uint32_t epdisabled : + 1; +uint32_t ahberr : + 1; +uint32_t setup : + 1; +uint32_t Reserved04_31 : + 28; + } + b; +} USB_OTG_DOEPINTn_TypeDef ; +typedef union _USB_OTG_DOEPINTn_TypeDef USB_OTG_DOEPMSK_TypeDef ; + +typedef union _USB_OTG_DAINT_TypeDef +{ + uint32_t d32; + struct + { +uint32_t in : + 16; +uint32_t out : + 16; + } + ep; +} USB_OTG_DAINT_TypeDef ; + +typedef union _USB_OTG_DTHRCTL_TypeDef +{ + uint32_t d32; + struct + { +uint32_t non_iso_thr_en : + 1; +uint32_t iso_thr_en : + 1; +uint32_t tx_thr_len : + 9; +uint32_t Reserved11_15 : + 5; +uint32_t rx_thr_en : + 1; +uint32_t rx_thr_len : + 9; +uint32_t Reserved26_31 : + 6; + } + b; +} USB_OTG_DTHRCTL_TypeDef ; +typedef union _USB_OTG_DEPCTL_TypeDef +{ + uint32_t d32; + struct + { +uint32_t mps : + 11; +uint32_t reserved : + 4; +uint32_t usbactep : + 1; +uint32_t dpid : + 1; +uint32_t naksts : + 1; +uint32_t eptype : + 2; +uint32_t snp : + 1; +uint32_t stall : + 1; +uint32_t txfnum : + 4; +uint32_t cnak : + 1; +uint32_t snak : + 1; +uint32_t setd0pid : + 1; +uint32_t setd1pid : + 1; +uint32_t epdis : + 1; +uint32_t epena : + 1; + } + b; +} USB_OTG_DEPCTL_TypeDef ; +typedef union _USB_OTG_DEPXFRSIZ_TypeDef +{ + uint32_t d32; + struct + { +uint32_t xfersize : + 19; +uint32_t pktcnt : + 10; +uint32_t mc : + 2; +uint32_t Reserved : + 1; + } + b; +} USB_OTG_DEPXFRSIZ_TypeDef ; +typedef union _USB_OTG_DEP0XFRSIZ_TypeDef +{ + uint32_t d32; + struct + { +uint32_t xfersize : + 7; +uint32_t Reserved7_18 : + 12; +uint32_t pktcnt : + 2; +uint32_t Reserved20_28 : + 9; +uint32_t supcnt : + 2; + uint32_t Reserved31; + } + b; +} USB_OTG_DEP0XFRSIZ_TypeDef ; +typedef union _USB_OTG_HCFG_TypeDef +{ + uint32_t d32; + struct + { +uint32_t fslspclksel : + 2; +uint32_t fslssupp : + 1; + } + b; +} USB_OTG_HCFG_TypeDef ; +typedef union _USB_OTG_HFRMINTRVL_TypeDef +{ + uint32_t d32; + struct + { +uint32_t frint : + 16; +uint32_t Reserved : + 16; + } + b; +} USB_OTG_HFRMINTRVL_TypeDef ; + +typedef union _USB_OTG_HFNUM_TypeDef +{ + uint32_t d32; + struct + { +uint32_t frnum : + 16; +uint32_t frrem : + 16; + } + b; +} USB_OTG_HFNUM_TypeDef ; +typedef union _USB_OTG_HPTXSTS_TypeDef +{ + uint32_t d32; + struct + { +uint32_t ptxfspcavail : + 16; +uint32_t ptxqspcavail : + 8; +uint32_t ptxqtop_terminate : + 1; +uint32_t ptxqtop_timer : + 2; +uint32_t ptxqtop : + 2; +uint32_t chnum : + 2; +uint32_t ptxqtop_odd : + 1; + } + b; +} USB_OTG_HPTXSTS_TypeDef ; +typedef union _USB_OTG_HPRT0_TypeDef +{ + uint32_t d32; + struct + { +uint32_t prtconnsts : + 1; +uint32_t prtconndet : + 1; +uint32_t prtena : + 1; +uint32_t prtenchng : + 1; +uint32_t prtovrcurract : + 1; +uint32_t prtovrcurrchng : + 1; +uint32_t prtres : + 1; +uint32_t prtsusp : + 1; +uint32_t prtrst : + 1; +uint32_t Reserved9 : + 1; +uint32_t prtlnsts : + 2; +uint32_t prtpwr : + 1; +uint32_t prttstctl : + 4; +uint32_t prtspd : + 2; +uint32_t Reserved19_31 : + 13; + } + b; +} USB_OTG_HPRT0_TypeDef ; +typedef union _USB_OTG_HAINT_TypeDef +{ + uint32_t d32; + struct + { +uint32_t chint : + 16; +uint32_t Reserved : + 16; + } + b; +} USB_OTG_HAINT_TypeDef ; +typedef union _USB_OTG_HAINTMSK_TypeDef +{ + uint32_t d32; + struct + { +uint32_t chint : + 16; +uint32_t Reserved : + 16; + } + b; +} USB_OTG_HAINTMSK_TypeDef ; +typedef union _USB_OTG_HCCHAR_TypeDef +{ + uint32_t d32; + struct + { +uint32_t mps : + 11; +uint32_t epnum : + 4; +uint32_t epdir : + 1; +uint32_t Reserved : + 1; +uint32_t lspddev : + 1; +uint32_t eptype : + 2; +uint32_t multicnt : + 2; +uint32_t devaddr : + 7; +uint32_t oddfrm : + 1; +uint32_t chdis : + 1; +uint32_t chen : + 1; + } + b; +} USB_OTG_HCCHAR_TypeDef ; +typedef union _USB_OTG_HCSPLT_TypeDef +{ + uint32_t d32; + struct + { +uint32_t prtaddr : + 7; +uint32_t hubaddr : + 7; +uint32_t xactpos : + 2; +uint32_t compsplt : + 1; +uint32_t Reserved : + 14; +uint32_t spltena : + 1; + } + b; +} USB_OTG_HCSPLT_TypeDef ; +typedef union _USB_OTG_HCINTn_TypeDef +{ + uint32_t d32; + struct + { +uint32_t xfercompl : + 1; +uint32_t chhltd : + 1; +uint32_t ahberr : + 1; +uint32_t stall : + 1; +uint32_t nak : + 1; +uint32_t ack : + 1; +uint32_t nyet : + 1; +uint32_t xacterr : + 1; +uint32_t bblerr : + 1; +uint32_t frmovrun : + 1; +uint32_t datatglerr : + 1; +uint32_t Reserved : + 21; + } + b; +} USB_OTG_HCINTn_TypeDef ; +typedef union _USB_OTG_HCTSIZn_TypeDef +{ + uint32_t d32; + struct + { +uint32_t xfersize : + 19; +uint32_t pktcnt : + 10; +uint32_t pid : + 2; +uint32_t dopng : + 1; + } + b; +} USB_OTG_HCTSIZn_TypeDef ; +typedef union _USB_OTG_HCGINTMSK_TypeDef +{ + uint32_t d32; + struct + { +uint32_t xfercompl : + 1; +uint32_t chhltd : + 1; +uint32_t ahberr : + 1; +uint32_t stall : + 1; +uint32_t nak : + 1; +uint32_t ack : + 1; +uint32_t nyet : + 1; +uint32_t xacterr : + 1; +uint32_t bblerr : + 1; +uint32_t frmovrun : + 1; +uint32_t datatglerr : + 1; +uint32_t Reserved : + 21; + } + b; +} USB_OTG_HCGINTMSK_TypeDef ; +typedef union _USB_OTG_PCGCCTL_TypeDef +{ + uint32_t d32; + struct + { +uint32_t stoppclk : + 1; +uint32_t gatehclk : + 1; +uint32_t Reserved : + 30; + } + b; +} USB_OTG_PCGCCTL_TypeDef ; + +/** + * @} + */ + + +/** @defgroup USB_REGS_Exported_Macros + * @{ + */ +/** + * @} + */ + +/** @defgroup USB_REGS_Exported_Variables + * @{ + */ +/** + * @} + */ + +/** @defgroup USB_REGS_Exported_FunctionsPrototype + * @{ + */ +/** + * @} + */ + + +#endif //__USB_OTG_REGS_H__ + + +/** + * @} + */ + +/** + * @} + */ +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ + diff --git a/codec2/tags/0.4.1/unittest/CMakeLists.txt b/codec2/tags/0.4.1/unittest/CMakeLists.txt new file mode 100644 index 00000000..ad4ba7e2 --- /dev/null +++ b/codec2/tags/0.4.1/unittest/CMakeLists.txt @@ -0,0 +1,103 @@ +add_definitions(-DFLOATING_POINT -DVAR_ARRAYS) +include_directories(../src) + +add_executable(genres genres.c ../src/lpc.c) +target_link_libraries(genres codec2) + +add_executable(genlsp genlsp.c ../src/lpc.c ../src/lsp.c) +target_link_libraries(genlsp codec2) + +add_executable(extract extract.c) +target_link_libraries(extract codec2) + +add_executable(vqtrain vqtrain.c) +target_link_libraries(vqtrain codec2) + +add_executable(vqtrainjnd vqtrainjnd.c) +target_link_libraries(vqtrainjnd codec2) + +add_executable(vqtrainph vqtrainph.c) +target_link_libraries(vqtrainph codec2) + +add_executable(vqtrainsp vqtrainsp.c) +target_link_libraries(vqtrainsp codec2) + +add_executable(genphdata genphdata.c) +target_link_libraries(genphdata codec2) + +add_executable(genampdata genampdata.c) +target_link_libraries(genampdata codec2) + +add_executable(polar2rect polar2rect.c) +target_link_libraries(polar2rect codec2) + +add_executable(vq_train_jvm vq_train_jvm.c) +target_link_libraries(vq_train_jvm codec2) + +set(CODEBOOKS ../src/codebook.c ../src/codebookd.c ../src/codebookvq.c ../src/codebookjnd.c ../src/codebookdt.c ../src/codebookjvm.c ../src/codebookvqanssi.c ../src/codebookge.c) + +add_executable(tnlp tnlp.c ../src/sine.c ../src/nlp.c ../src/kiss_fft.c ../src/dump.c) +target_link_libraries(tnlp codec2) + +add_executable(tinterp tinterp.c ../src/sine.c ../src/kiss_fft.c ../src/interp.c ../src/lpc.c ../src/lsp.c ../src/quantise.c ${CODEBOOKS} ../src/dump.c) +target_link_libraries(tinterp codec2) + +add_executable(tquant tquant.c ../src/quantise.c ../src/lpc.c ../src/lsp.c ../src/dump.c ../src/kiss_fft.c ${CODEBOOKS}) +target_link_libraries(tquant codec2) + +add_executable(scalarlsptest scalarlsptest.c ../src/quantise.c ../src/lpc.c ../src/lsp.c ../src/dump.c ../src/kiss_fft.c ${CODEBOOKS}) +target_link_libraries(scalarlsptest codec2) + +add_executable(tfdmdv tfdmdv.c ../src/fdmdv.c ../src/kiss_fft.c ../src/octave.c) +target_link_libraries(tfdmdv codec2) + +add_executable(tcohpsk tcohpsk.c ../src/cohpsk.c ../src/octave.c) +target_link_libraries(tcohpsk codec2) + +add_executable(test_cohpsk_ch test_cohpsk_ch.c ../src/cohpsk.c ../src/octave.c) +target_link_libraries(test_cohpsk_ch codec2) + +add_executable(t16_8 t16_8.c ../src/fdmdv.c ../src/kiss_fft.c) +target_link_libraries(t16_8 codec2) + +add_executable(t16_8_short t16_8_short.c ../src/fdmdv.c ../src/kiss_fft.c) +target_link_libraries(t16_8_short codec2) + +#add_executable(t48_8 t48_8.c ../src/fdmdv.c ../src/kiss_fft.c) +#target_link_libraries(t48_8 codec2) + +add_executable(lspsync lspsync.c ../src/quantise.c ../src/lpc.c ../src/lsp.c ../src/dump.c ../src/kiss_fft.c ../src/codec2.c ../src/sine.c ../src/nlp.c ../src/postfilter.c ../src/phase.c ../src/interp.c ../src/pack.c ${CODEBOOKS}) +target_link_libraries(lspsync codec2) + +add_executable(create_interleaver create_interleaver.c) +target_link_libraries(create_interleaver codec2) + +add_executable(tlspsens tlspsens.c ../src/quantise.c ../src/lpc.c ../src/lsp.c ../src/dump.c ../src/kiss_fft.c ../src/codec2.c ../src/sine.c ../src/nlp.c ../src/pack.c ../src/interp.c ../src/postfilter.c ../src/phase.c ${CODEBOOKS}) +target_link_libraries(tlspsens codec2) + +add_executable(tprede tprede.c ../src/lpc.c) +target_link_libraries(tprede codec2) + +add_executable(pre pre.c ../src/lpc.c) +target_link_libraries(pre codec2) + +add_executable(de de.c ../src/lpc.c) +target_link_libraries(de codec2) + +add_executable(tfifo tfifo.c ../src/fifo.c) +target_link_libraries(tfifo codec2 ${CMAKE_THREAD_LIBS_INIT}) + +add_executable(speexnoisesup speexnoisesup.c) +target_link_libraries(speexnoisesup ${SPEEXDSP_LIBRARY}) +set_target_properties(speexnoisesup + PROPERTIES INCLUDE_DIRECTORIES ${SPEEXDSP_INCLUDE_DIR} +) + +add_executable(fdmdv_mem fdmdv_mem.c) + +add_executable(raw2h raw2h.c) +target_link_libraries(raw2h codec2) + +add_definitions(-D__UNITTEST__) +add_executable(c2validate c2validate.c) +target_link_libraries(c2validate codec2) diff --git a/codec2/tags/0.4.1/unittest/Makefile.am b/codec2/tags/0.4.1/unittest/Makefile.am new file mode 100644 index 00000000..998446fb --- /dev/null +++ b/codec2/tags/0.4.1/unittest/Makefile.am @@ -0,0 +1,114 @@ +AM_CFLAGS = -I../src -fPIC -g -DFLOATING_POINT -DVAR_ARRAYS -O2 -Wall +AUTOMAKE_OPTS = gnu +NAME = libcodec2 +AM_CPPFLAGS = $(AM_CFLAGS) + +noinst_PROGRAMS = genres genlsp extract vqtrain vqtrainjnd tnlp tinterp tquant vq_train_jvm scalarlsptest tfdmdv t48_8 lspsync create_interleaver tlspsens vqtrainph genphdata genampdata polar2rect vqtrainsp tprede pre de tfifo raw2h c2validate + +genres_SOURCES = genres.c ../src/lpc.c +genres_LDADD = $(lib_LTLIBRARIES) +genres_LDFLAGS = $(LIBS) + +genlsp_SOURCES = genlsp.c ../src/lpc.c ../src/lsp.c +genlsp_LDADD = $(lib_LTLIBRARIES) +genlsp_LDFLAGS = $(LIBS) + +extract_SOURCES = extract.c +extract_LDADD = $(lib_LTLIBRARIES) +extract_LDFLAGS = $(LIBS) + +vqtrain_SOURCES = vqtrain.c +vqtrain_LDADD = $(lib_LTLIBRARIES) +vqtrain_LDFLAGS = $(LIBS) + +vqtrainjnd_SOURCES = vqtrainjnd.c +vqtrainjnd_LDADD = $(lib_LTLIBRARIES) +vqtrainjnd_LDFLAGS = $(LIBS) + +vqtrainph_SOURCES = vqtrainph.c +vqtrainph_LDADD = $(lib_LTLIBRARIES) +vqtrainph_LDFLAGS = $(LIBS) + +vqtrainsp_SOURCES = vqtrainsp.c +vqtrainsp_LDADD = $(lib_LTLIBRARIES) +vqtrainsp_LDFLAGS = $(LIBS) + +genphdata_SOURCES = genphdata.c +genphdata_LDADD = $(lib_LTLIBRARIES) +genphdata_LDFLAGS = $(LIBS) + +genampdata_SOURCES = genampdata.c +genampdata_LDADD = $(lib_LTLIBRARIES) +genampdata_LDFLAGS = $(LIBS) + +polar2rect_SOURCES = polar2rect.c +polar2rect_LDADD = $(lib_LTLIBRARIES) +polar2rect_LDFLAGS = $(LIBS) + +vq_train_jvm_SOURCES = vq_train_jvm.c +vq_train_jvm_LDADD = $(lib_LTLIBRARIES) +vq_train_jvm_LDFLAGS = $(LIBS) + +CODEBOOKS = ../src/codebook.c ../src/codebookd.c ../src/codebookvq.c ../src/codebookjnd.c ../src/codebookdt.c ../src/codebookjvm.c ../src/codebookvqanssi.c ../src/codebookge.c + +tnlp_SOURCES = tnlp.c ../src/sine.c ../src/nlp.c ../src/kiss_fft.c ../src/dump.c +tnlp_LDADD = $(lib_LTLIBRARIES) +tnlp_LDFLAGS = $(LIBS) + +tinterp_SOURCES = tinterp.c ../src/sine.c ../src/kiss_fft.c ../src/interp.c ../src/lpc.c ../src/lsp.c ../src/quantise.c $(CODEBOOKS) ../src/dump.c +tinterp_LDADD = $(lib_LTLIBRARIES) +tinterp_LDFLAGS = $(LIBS) + +tquant_SOURCES = tquant.c ../src/quantise.c ../src/lpc.c ../src/lsp.c ../src/dump.c ../src/kiss_fft.c $(CODEBOOKS) +tquant_LDADD = $(lib_LTLIBRARIES) +tquant_LDFLAGS = $(LIBS) + +scalarlsptest_SOURCES = scalarlsptest.c ../src/quantise.c ../src/lpc.c ../src/lsp.c ../src/dump.c ../src/kiss_fft.c $(CODEBOOKS) +scalarlsptest_LDADD = $(lib_LTLIBRARIES) +scalarlsptest_LDFLAGS = $(LIBS) + +tfdmdv_SOURCES = tfdmdv.c ../src/fdmdv.c ../src/kiss_fft.c ../src/octave.c +tfdmdv_LDADD = $(lib_LTLIBRARIES) +tfdmdv_LDFLAGS = $(LIBS) + +t48_8_SOURCES = t48_8.c ../src/fdmdv.c ../src/kiss_fft.c +t48_8_LDADD = $(lib_LTLIBRARIES) +t48_8_LDFLAGS = $(LIBS) + +lspsync_SOURCES = lspsync.c ../src/quantise.c ../src/lpc.c ../src/lsp.c ../src/dump.c ../src/kiss_fft.c \ +../src/codec2.c ../src/sine.c ../src/nlp.c ../src/postfilter.c ../src/phase.c ../src/interp.c ../src/pack.c $(CODEBOOKS) +lspsync_LDADD = $(lib_LTLIBRARIES) +lspsync_LDFLAGS = $(LIBS) + +create_interleaver_SOURCES = create_interleaver.c +create_interleaver_LDADD = $(lib_LTLIBRARIES) +create_interleaver_LDFLAGS = $(LIBS) + +tlspsens_SOURCES = tlspsens.c ../src/quantise.c ../src/lpc.c ../src/lsp.c ../src/dump.c ../src/kiss_fft.c ../src/codec2.c ../src/sine.c ../src/nlp.c ../src/pack.c ../src/interp.c ../src/postfilter.c ../src/phase.c $(CODEBOOKS) +tlspsens_LDADD = $(lib_LTLIBRARIES) +tlspsens_LDFLAGS = $(LIBS) + +tprede_SOURCES = tprede.c ../src/lpc.c +tprede_LDADD = $(lib_LTLIBRARIES) +tprede_LDFLAGS = $(LIBS) + +pre_SOURCES = pre.c ../src/lpc.c +pre_LDADD = $(lib_LTLIBRARIES) +pre_LDFLAGS = $(LIBS) + +de_SOURCES = de.c ../src/lpc.c +de_LDADD = $(lib_LTLIBRARIES) +de_LDFLAGS = $(LIBS) + +tfifo_SOURCES = tfifo.c ../src/fifo.c +tfifo_LDADD = $(lib_LTLIBRARIES) -lpthread +tfifo_LDFLAGS = $(LIBS) + +raw2h_SOURCES = raw2h.c +raw2h_LDADD = $(lib_LTLIBRARIES) +raw2h_LDFLAGS = $(LIBS) + +c2validate_CFLAGS = -D__UNITTEST__ +c2validate_SOURCES = c2validate.c +c2validate_LDADD = $(lib_LTLIBRARIES) ../src/libcodec2.la +c2validate_LDFLAGS = $(LIBS) \ No newline at end of file diff --git a/codec2/tags/0.4.1/unittest/Makefile.in b/codec2/tags/0.4.1/unittest/Makefile.in new file mode 100644 index 00000000..aac2791c --- /dev/null +++ b/codec2/tags/0.4.1/unittest/Makefile.in @@ -0,0 +1,1090 @@ +# Makefile.in generated by automake 1.9.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = .. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = genres$(EXEEXT) genlsp$(EXEEXT) extract$(EXEEXT) \ + vqtrain$(EXEEXT) vqtrainjnd$(EXEEXT) tnlp$(EXEEXT) \ + tinterp$(EXEEXT) tquant$(EXEEXT) vq_train_jvm$(EXEEXT) \ + scalarlsptest$(EXEEXT) tfdmdv$(EXEEXT) t48_8$(EXEEXT) \ + lspsync$(EXEEXT) create_interleaver$(EXEEXT) tlspsens$(EXEEXT) \ + vqtrainph$(EXEEXT) genphdata$(EXEEXT) genampdata$(EXEEXT) \ + polar2rect$(EXEEXT) vqtrainsp$(EXEEXT) tprede$(EXEEXT) \ + pre$(EXEEXT) de$(EXEEXT) tfifo$(EXEEXT) raw2h$(EXEEXT) \ + c2validate$(EXEEXT) +subdir = unittest +DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_CLEAN_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_c2validate_OBJECTS = c2validate-c2validate.$(OBJEXT) +c2validate_OBJECTS = $(am_c2validate_OBJECTS) +c2validate_DEPENDENCIES = ../src/libcodec2.la +am_create_interleaver_OBJECTS = create_interleaver.$(OBJEXT) +create_interleaver_OBJECTS = $(am_create_interleaver_OBJECTS) +create_interleaver_DEPENDENCIES = +am_de_OBJECTS = de.$(OBJEXT) lpc.$(OBJEXT) +de_OBJECTS = $(am_de_OBJECTS) +de_DEPENDENCIES = +am_extract_OBJECTS = extract.$(OBJEXT) +extract_OBJECTS = $(am_extract_OBJECTS) +extract_DEPENDENCIES = +am_genampdata_OBJECTS = genampdata.$(OBJEXT) +genampdata_OBJECTS = $(am_genampdata_OBJECTS) +genampdata_DEPENDENCIES = +am_genlsp_OBJECTS = genlsp.$(OBJEXT) lpc.$(OBJEXT) lsp.$(OBJEXT) +genlsp_OBJECTS = $(am_genlsp_OBJECTS) +genlsp_DEPENDENCIES = +am_genphdata_OBJECTS = genphdata.$(OBJEXT) +genphdata_OBJECTS = $(am_genphdata_OBJECTS) +genphdata_DEPENDENCIES = +am_genres_OBJECTS = genres.$(OBJEXT) lpc.$(OBJEXT) +genres_OBJECTS = $(am_genres_OBJECTS) +genres_DEPENDENCIES = +am__objects_1 = codebook.$(OBJEXT) codebookd.$(OBJEXT) \ + codebookvq.$(OBJEXT) codebookjnd.$(OBJEXT) \ + codebookdt.$(OBJEXT) codebookjvm.$(OBJEXT) \ + codebookvqanssi.$(OBJEXT) codebookge.$(OBJEXT) +am_lspsync_OBJECTS = lspsync.$(OBJEXT) quantise.$(OBJEXT) \ + lpc.$(OBJEXT) lsp.$(OBJEXT) dump.$(OBJEXT) kiss_fft.$(OBJEXT) \ + codec2.$(OBJEXT) sine.$(OBJEXT) nlp.$(OBJEXT) \ + postfilter.$(OBJEXT) phase.$(OBJEXT) interp.$(OBJEXT) \ + pack.$(OBJEXT) $(am__objects_1) +lspsync_OBJECTS = $(am_lspsync_OBJECTS) +lspsync_DEPENDENCIES = +am_polar2rect_OBJECTS = polar2rect.$(OBJEXT) +polar2rect_OBJECTS = $(am_polar2rect_OBJECTS) +polar2rect_DEPENDENCIES = +am_pre_OBJECTS = pre.$(OBJEXT) lpc.$(OBJEXT) +pre_OBJECTS = $(am_pre_OBJECTS) +pre_DEPENDENCIES = +am_raw2h_OBJECTS = raw2h.$(OBJEXT) +raw2h_OBJECTS = $(am_raw2h_OBJECTS) +raw2h_DEPENDENCIES = +am_scalarlsptest_OBJECTS = scalarlsptest.$(OBJEXT) quantise.$(OBJEXT) \ + lpc.$(OBJEXT) lsp.$(OBJEXT) dump.$(OBJEXT) kiss_fft.$(OBJEXT) \ + $(am__objects_1) +scalarlsptest_OBJECTS = $(am_scalarlsptest_OBJECTS) +scalarlsptest_DEPENDENCIES = +am_t48_8_OBJECTS = t48_8.$(OBJEXT) fdmdv.$(OBJEXT) kiss_fft.$(OBJEXT) +t48_8_OBJECTS = $(am_t48_8_OBJECTS) +t48_8_DEPENDENCIES = +am_tfdmdv_OBJECTS = tfdmdv.$(OBJEXT) fdmdv.$(OBJEXT) \ + kiss_fft.$(OBJEXT) octave.$(OBJEXT) +tfdmdv_OBJECTS = $(am_tfdmdv_OBJECTS) +tfdmdv_DEPENDENCIES = +am_tfifo_OBJECTS = tfifo.$(OBJEXT) fifo.$(OBJEXT) +tfifo_OBJECTS = $(am_tfifo_OBJECTS) +tfifo_DEPENDENCIES = +am_tinterp_OBJECTS = tinterp.$(OBJEXT) sine.$(OBJEXT) \ + kiss_fft.$(OBJEXT) interp.$(OBJEXT) lpc.$(OBJEXT) \ + lsp.$(OBJEXT) quantise.$(OBJEXT) $(am__objects_1) \ + dump.$(OBJEXT) +tinterp_OBJECTS = $(am_tinterp_OBJECTS) +tinterp_DEPENDENCIES = +am_tlspsens_OBJECTS = tlspsens.$(OBJEXT) quantise.$(OBJEXT) \ + lpc.$(OBJEXT) lsp.$(OBJEXT) dump.$(OBJEXT) kiss_fft.$(OBJEXT) \ + codec2.$(OBJEXT) sine.$(OBJEXT) nlp.$(OBJEXT) pack.$(OBJEXT) \ + interp.$(OBJEXT) postfilter.$(OBJEXT) phase.$(OBJEXT) \ + $(am__objects_1) +tlspsens_OBJECTS = $(am_tlspsens_OBJECTS) +tlspsens_DEPENDENCIES = +am_tnlp_OBJECTS = tnlp.$(OBJEXT) sine.$(OBJEXT) nlp.$(OBJEXT) \ + kiss_fft.$(OBJEXT) dump.$(OBJEXT) +tnlp_OBJECTS = $(am_tnlp_OBJECTS) +tnlp_DEPENDENCIES = +am_tprede_OBJECTS = tprede.$(OBJEXT) lpc.$(OBJEXT) +tprede_OBJECTS = $(am_tprede_OBJECTS) +tprede_DEPENDENCIES = +am_tquant_OBJECTS = tquant.$(OBJEXT) quantise.$(OBJEXT) lpc.$(OBJEXT) \ + lsp.$(OBJEXT) dump.$(OBJEXT) kiss_fft.$(OBJEXT) \ + $(am__objects_1) +tquant_OBJECTS = $(am_tquant_OBJECTS) +tquant_DEPENDENCIES = +am_vq_train_jvm_OBJECTS = vq_train_jvm.$(OBJEXT) +vq_train_jvm_OBJECTS = $(am_vq_train_jvm_OBJECTS) +vq_train_jvm_DEPENDENCIES = +am_vqtrain_OBJECTS = vqtrain.$(OBJEXT) +vqtrain_OBJECTS = $(am_vqtrain_OBJECTS) +vqtrain_DEPENDENCIES = +am_vqtrainjnd_OBJECTS = vqtrainjnd.$(OBJEXT) +vqtrainjnd_OBJECTS = $(am_vqtrainjnd_OBJECTS) +vqtrainjnd_DEPENDENCIES = +am_vqtrainph_OBJECTS = vqtrainph.$(OBJEXT) +vqtrainph_OBJECTS = $(am_vqtrainph_OBJECTS) +vqtrainph_DEPENDENCIES = +am_vqtrainsp_OBJECTS = vqtrainsp.$(OBJEXT) +vqtrainsp_OBJECTS = $(am_vqtrainsp_OBJECTS) +vqtrainsp_DEPENDENCIES = +DEFAULT_INCLUDES = -I. -I$(srcdir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +SOURCES = $(c2validate_SOURCES) $(create_interleaver_SOURCES) \ + $(de_SOURCES) $(extract_SOURCES) $(genampdata_SOURCES) \ + $(genlsp_SOURCES) $(genphdata_SOURCES) $(genres_SOURCES) \ + $(lspsync_SOURCES) $(polar2rect_SOURCES) $(pre_SOURCES) \ + $(raw2h_SOURCES) $(scalarlsptest_SOURCES) $(t48_8_SOURCES) \ + $(tfdmdv_SOURCES) $(tfifo_SOURCES) $(tinterp_SOURCES) \ + $(tlspsens_SOURCES) $(tnlp_SOURCES) $(tprede_SOURCES) \ + $(tquant_SOURCES) $(vq_train_jvm_SOURCES) $(vqtrain_SOURCES) \ + $(vqtrainjnd_SOURCES) $(vqtrainph_SOURCES) \ + $(vqtrainsp_SOURCES) +DIST_SOURCES = $(c2validate_SOURCES) $(create_interleaver_SOURCES) \ + $(de_SOURCES) $(extract_SOURCES) $(genampdata_SOURCES) \ + $(genlsp_SOURCES) $(genphdata_SOURCES) $(genres_SOURCES) \ + $(lspsync_SOURCES) $(polar2rect_SOURCES) $(pre_SOURCES) \ + $(raw2h_SOURCES) $(scalarlsptest_SOURCES) $(t48_8_SOURCES) \ + $(tfdmdv_SOURCES) $(tfifo_SOURCES) $(tinterp_SOURCES) \ + $(tlspsens_SOURCES) $(tnlp_SOURCES) $(tprede_SOURCES) \ + $(tquant_SOURCES) $(vq_train_jvm_SOURCES) $(vqtrain_SOURCES) \ + $(vqtrainjnd_SOURCES) $(vqtrainph_SOURCES) \ + $(vqtrainsp_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GREP = @GREP@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +AM_CFLAGS = -I../src -fPIC -g -DFLOATING_POINT -DVAR_ARRAYS -O2 -Wall +AUTOMAKE_OPTS = gnu +NAME = libcodec2 +AM_CPPFLAGS = $(AM_CFLAGS) +genres_SOURCES = genres.c ../src/lpc.c +genres_LDADD = $(lib_LTLIBRARIES) +genres_LDFLAGS = $(LIBS) +genlsp_SOURCES = genlsp.c ../src/lpc.c ../src/lsp.c +genlsp_LDADD = $(lib_LTLIBRARIES) +genlsp_LDFLAGS = $(LIBS) +extract_SOURCES = extract.c +extract_LDADD = $(lib_LTLIBRARIES) +extract_LDFLAGS = $(LIBS) +vqtrain_SOURCES = vqtrain.c +vqtrain_LDADD = $(lib_LTLIBRARIES) +vqtrain_LDFLAGS = $(LIBS) +vqtrainjnd_SOURCES = vqtrainjnd.c +vqtrainjnd_LDADD = $(lib_LTLIBRARIES) +vqtrainjnd_LDFLAGS = $(LIBS) +vqtrainph_SOURCES = vqtrainph.c +vqtrainph_LDADD = $(lib_LTLIBRARIES) +vqtrainph_LDFLAGS = $(LIBS) +vqtrainsp_SOURCES = vqtrainsp.c +vqtrainsp_LDADD = $(lib_LTLIBRARIES) +vqtrainsp_LDFLAGS = $(LIBS) +genphdata_SOURCES = genphdata.c +genphdata_LDADD = $(lib_LTLIBRARIES) +genphdata_LDFLAGS = $(LIBS) +genampdata_SOURCES = genampdata.c +genampdata_LDADD = $(lib_LTLIBRARIES) +genampdata_LDFLAGS = $(LIBS) +polar2rect_SOURCES = polar2rect.c +polar2rect_LDADD = $(lib_LTLIBRARIES) +polar2rect_LDFLAGS = $(LIBS) +vq_train_jvm_SOURCES = vq_train_jvm.c +vq_train_jvm_LDADD = $(lib_LTLIBRARIES) +vq_train_jvm_LDFLAGS = $(LIBS) +CODEBOOKS = ../src/codebook.c ../src/codebookd.c ../src/codebookvq.c ../src/codebookjnd.c ../src/codebookdt.c ../src/codebookjvm.c ../src/codebookvqanssi.c ../src/codebookge.c +tnlp_SOURCES = tnlp.c ../src/sine.c ../src/nlp.c ../src/kiss_fft.c ../src/dump.c +tnlp_LDADD = $(lib_LTLIBRARIES) +tnlp_LDFLAGS = $(LIBS) +tinterp_SOURCES = tinterp.c ../src/sine.c ../src/kiss_fft.c ../src/interp.c ../src/lpc.c ../src/lsp.c ../src/quantise.c $(CODEBOOKS) ../src/dump.c +tinterp_LDADD = $(lib_LTLIBRARIES) +tinterp_LDFLAGS = $(LIBS) +tquant_SOURCES = tquant.c ../src/quantise.c ../src/lpc.c ../src/lsp.c ../src/dump.c ../src/kiss_fft.c $(CODEBOOKS) +tquant_LDADD = $(lib_LTLIBRARIES) +tquant_LDFLAGS = $(LIBS) +scalarlsptest_SOURCES = scalarlsptest.c ../src/quantise.c ../src/lpc.c ../src/lsp.c ../src/dump.c ../src/kiss_fft.c $(CODEBOOKS) +scalarlsptest_LDADD = $(lib_LTLIBRARIES) +scalarlsptest_LDFLAGS = $(LIBS) +tfdmdv_SOURCES = tfdmdv.c ../src/fdmdv.c ../src/kiss_fft.c ../src/octave.c +tfdmdv_LDADD = $(lib_LTLIBRARIES) +tfdmdv_LDFLAGS = $(LIBS) +t48_8_SOURCES = t48_8.c ../src/fdmdv.c ../src/kiss_fft.c +t48_8_LDADD = $(lib_LTLIBRARIES) +t48_8_LDFLAGS = $(LIBS) +lspsync_SOURCES = lspsync.c ../src/quantise.c ../src/lpc.c ../src/lsp.c ../src/dump.c ../src/kiss_fft.c \ +../src/codec2.c ../src/sine.c ../src/nlp.c ../src/postfilter.c ../src/phase.c ../src/interp.c ../src/pack.c $(CODEBOOKS) + +lspsync_LDADD = $(lib_LTLIBRARIES) +lspsync_LDFLAGS = $(LIBS) +create_interleaver_SOURCES = create_interleaver.c +create_interleaver_LDADD = $(lib_LTLIBRARIES) +create_interleaver_LDFLAGS = $(LIBS) +tlspsens_SOURCES = tlspsens.c ../src/quantise.c ../src/lpc.c ../src/lsp.c ../src/dump.c ../src/kiss_fft.c ../src/codec2.c ../src/sine.c ../src/nlp.c ../src/pack.c ../src/interp.c ../src/postfilter.c ../src/phase.c $(CODEBOOKS) +tlspsens_LDADD = $(lib_LTLIBRARIES) +tlspsens_LDFLAGS = $(LIBS) +tprede_SOURCES = tprede.c ../src/lpc.c +tprede_LDADD = $(lib_LTLIBRARIES) +tprede_LDFLAGS = $(LIBS) +pre_SOURCES = pre.c ../src/lpc.c +pre_LDADD = $(lib_LTLIBRARIES) +pre_LDFLAGS = $(LIBS) +de_SOURCES = de.c ../src/lpc.c +de_LDADD = $(lib_LTLIBRARIES) +de_LDFLAGS = $(LIBS) +tfifo_SOURCES = tfifo.c ../src/fifo.c +tfifo_LDADD = $(lib_LTLIBRARIES) -lpthread +tfifo_LDFLAGS = $(LIBS) +raw2h_SOURCES = raw2h.c +raw2h_LDADD = $(lib_LTLIBRARIES) +raw2h_LDFLAGS = $(LIBS) +c2validate_CFLAGS = -D__UNITTEST__ +c2validate_SOURCES = c2validate.c +c2validate_LDADD = $(lib_LTLIBRARIES) ../src/libcodec2.la +c2validate_LDFLAGS = $(LIBS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu unittest/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnu unittest/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; for p in $$list; do \ + f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f $$p $$f"; \ + rm -f $$p $$f ; \ + done +c2validate$(EXEEXT): $(c2validate_OBJECTS) $(c2validate_DEPENDENCIES) + @rm -f c2validate$(EXEEXT) + $(LINK) $(c2validate_LDFLAGS) $(c2validate_OBJECTS) $(c2validate_LDADD) $(LIBS) +create_interleaver$(EXEEXT): $(create_interleaver_OBJECTS) $(create_interleaver_DEPENDENCIES) + @rm -f create_interleaver$(EXEEXT) + $(LINK) $(create_interleaver_LDFLAGS) $(create_interleaver_OBJECTS) $(create_interleaver_LDADD) $(LIBS) +de$(EXEEXT): $(de_OBJECTS) $(de_DEPENDENCIES) + @rm -f de$(EXEEXT) + $(LINK) $(de_LDFLAGS) $(de_OBJECTS) $(de_LDADD) $(LIBS) +extract$(EXEEXT): $(extract_OBJECTS) $(extract_DEPENDENCIES) + @rm -f extract$(EXEEXT) + $(LINK) $(extract_LDFLAGS) $(extract_OBJECTS) $(extract_LDADD) $(LIBS) +genampdata$(EXEEXT): $(genampdata_OBJECTS) $(genampdata_DEPENDENCIES) + @rm -f genampdata$(EXEEXT) + $(LINK) $(genampdata_LDFLAGS) $(genampdata_OBJECTS) $(genampdata_LDADD) $(LIBS) +genlsp$(EXEEXT): $(genlsp_OBJECTS) $(genlsp_DEPENDENCIES) + @rm -f genlsp$(EXEEXT) + $(LINK) $(genlsp_LDFLAGS) $(genlsp_OBJECTS) $(genlsp_LDADD) $(LIBS) +genphdata$(EXEEXT): $(genphdata_OBJECTS) $(genphdata_DEPENDENCIES) + @rm -f genphdata$(EXEEXT) + $(LINK) $(genphdata_LDFLAGS) $(genphdata_OBJECTS) $(genphdata_LDADD) $(LIBS) +genres$(EXEEXT): $(genres_OBJECTS) $(genres_DEPENDENCIES) + @rm -f genres$(EXEEXT) + $(LINK) $(genres_LDFLAGS) $(genres_OBJECTS) $(genres_LDADD) $(LIBS) +lspsync$(EXEEXT): $(lspsync_OBJECTS) $(lspsync_DEPENDENCIES) + @rm -f lspsync$(EXEEXT) + $(LINK) $(lspsync_LDFLAGS) $(lspsync_OBJECTS) $(lspsync_LDADD) $(LIBS) +polar2rect$(EXEEXT): $(polar2rect_OBJECTS) $(polar2rect_DEPENDENCIES) + @rm -f polar2rect$(EXEEXT) + $(LINK) $(polar2rect_LDFLAGS) $(polar2rect_OBJECTS) $(polar2rect_LDADD) $(LIBS) +pre$(EXEEXT): $(pre_OBJECTS) $(pre_DEPENDENCIES) + @rm -f pre$(EXEEXT) + $(LINK) $(pre_LDFLAGS) $(pre_OBJECTS) $(pre_LDADD) $(LIBS) +raw2h$(EXEEXT): $(raw2h_OBJECTS) $(raw2h_DEPENDENCIES) + @rm -f raw2h$(EXEEXT) + $(LINK) $(raw2h_LDFLAGS) $(raw2h_OBJECTS) $(raw2h_LDADD) $(LIBS) +scalarlsptest$(EXEEXT): $(scalarlsptest_OBJECTS) $(scalarlsptest_DEPENDENCIES) + @rm -f scalarlsptest$(EXEEXT) + $(LINK) $(scalarlsptest_LDFLAGS) $(scalarlsptest_OBJECTS) $(scalarlsptest_LDADD) $(LIBS) +t48_8$(EXEEXT): $(t48_8_OBJECTS) $(t48_8_DEPENDENCIES) + @rm -f t48_8$(EXEEXT) + $(LINK) $(t48_8_LDFLAGS) $(t48_8_OBJECTS) $(t48_8_LDADD) $(LIBS) +tfdmdv$(EXEEXT): $(tfdmdv_OBJECTS) $(tfdmdv_DEPENDENCIES) + @rm -f tfdmdv$(EXEEXT) + $(LINK) $(tfdmdv_LDFLAGS) $(tfdmdv_OBJECTS) $(tfdmdv_LDADD) $(LIBS) +tfifo$(EXEEXT): $(tfifo_OBJECTS) $(tfifo_DEPENDENCIES) + @rm -f tfifo$(EXEEXT) + $(LINK) $(tfifo_LDFLAGS) $(tfifo_OBJECTS) $(tfifo_LDADD) $(LIBS) +tinterp$(EXEEXT): $(tinterp_OBJECTS) $(tinterp_DEPENDENCIES) + @rm -f tinterp$(EXEEXT) + $(LINK) $(tinterp_LDFLAGS) $(tinterp_OBJECTS) $(tinterp_LDADD) $(LIBS) +tlspsens$(EXEEXT): $(tlspsens_OBJECTS) $(tlspsens_DEPENDENCIES) + @rm -f tlspsens$(EXEEXT) + $(LINK) $(tlspsens_LDFLAGS) $(tlspsens_OBJECTS) $(tlspsens_LDADD) $(LIBS) +tnlp$(EXEEXT): $(tnlp_OBJECTS) $(tnlp_DEPENDENCIES) + @rm -f tnlp$(EXEEXT) + $(LINK) $(tnlp_LDFLAGS) $(tnlp_OBJECTS) $(tnlp_LDADD) $(LIBS) +tprede$(EXEEXT): $(tprede_OBJECTS) $(tprede_DEPENDENCIES) + @rm -f tprede$(EXEEXT) + $(LINK) $(tprede_LDFLAGS) $(tprede_OBJECTS) $(tprede_LDADD) $(LIBS) +tquant$(EXEEXT): $(tquant_OBJECTS) $(tquant_DEPENDENCIES) + @rm -f tquant$(EXEEXT) + $(LINK) $(tquant_LDFLAGS) $(tquant_OBJECTS) $(tquant_LDADD) $(LIBS) +vq_train_jvm$(EXEEXT): $(vq_train_jvm_OBJECTS) $(vq_train_jvm_DEPENDENCIES) + @rm -f vq_train_jvm$(EXEEXT) + $(LINK) $(vq_train_jvm_LDFLAGS) $(vq_train_jvm_OBJECTS) $(vq_train_jvm_LDADD) $(LIBS) +vqtrain$(EXEEXT): $(vqtrain_OBJECTS) $(vqtrain_DEPENDENCIES) + @rm -f vqtrain$(EXEEXT) + $(LINK) $(vqtrain_LDFLAGS) $(vqtrain_OBJECTS) $(vqtrain_LDADD) $(LIBS) +vqtrainjnd$(EXEEXT): $(vqtrainjnd_OBJECTS) $(vqtrainjnd_DEPENDENCIES) + @rm -f vqtrainjnd$(EXEEXT) + $(LINK) $(vqtrainjnd_LDFLAGS) $(vqtrainjnd_OBJECTS) $(vqtrainjnd_LDADD) $(LIBS) +vqtrainph$(EXEEXT): $(vqtrainph_OBJECTS) $(vqtrainph_DEPENDENCIES) + @rm -f vqtrainph$(EXEEXT) + $(LINK) $(vqtrainph_LDFLAGS) $(vqtrainph_OBJECTS) $(vqtrainph_LDADD) $(LIBS) +vqtrainsp$(EXEEXT): $(vqtrainsp_OBJECTS) $(vqtrainsp_DEPENDENCIES) + @rm -f vqtrainsp$(EXEEXT) + $(LINK) $(vqtrainsp_LDFLAGS) $(vqtrainsp_OBJECTS) $(vqtrainsp_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/c2validate-c2validate.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/codebook.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/codebookd.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/codebookdt.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/codebookge.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/codebookjnd.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/codebookjvm.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/codebookvq.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/codebookvqanssi.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/codec2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/create_interleaver.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/de.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dump.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/extract.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fdmdv.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fifo.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/genampdata.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/genlsp.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/genphdata.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/genres.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/interp.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kiss_fft.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lpc.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lsp.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lspsync.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nlp.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/octave.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pack.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/phase.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/polar2rect.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/postfilter.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pre.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/quantise.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/raw2h.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scalarlsptest.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sine.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t48_8.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tfdmdv.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tfifo.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tinterp.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tlspsens.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tnlp.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tprede.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tquant.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vq_train_jvm.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vqtrain.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vqtrainjnd.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vqtrainph.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vqtrainsp.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +c2validate-c2validate.o: c2validate.c +@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(c2validate_CFLAGS) $(CFLAGS) -MT c2validate-c2validate.o -MD -MP -MF "$(DEPDIR)/c2validate-c2validate.Tpo" -c -o c2validate-c2validate.o `test -f 'c2validate.c' || echo '$(srcdir)/'`c2validate.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/c2validate-c2validate.Tpo" "$(DEPDIR)/c2validate-c2validate.Po"; else rm -f "$(DEPDIR)/c2validate-c2validate.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='c2validate.c' object='c2validate-c2validate.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(c2validate_CFLAGS) $(CFLAGS) -c -o c2validate-c2validate.o `test -f 'c2validate.c' || echo '$(srcdir)/'`c2validate.c + +c2validate-c2validate.obj: c2validate.c +@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(c2validate_CFLAGS) $(CFLAGS) -MT c2validate-c2validate.obj -MD -MP -MF "$(DEPDIR)/c2validate-c2validate.Tpo" -c -o c2validate-c2validate.obj `if test -f 'c2validate.c'; then $(CYGPATH_W) 'c2validate.c'; else $(CYGPATH_W) '$(srcdir)/c2validate.c'; fi`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/c2validate-c2validate.Tpo" "$(DEPDIR)/c2validate-c2validate.Po"; else rm -f "$(DEPDIR)/c2validate-c2validate.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='c2validate.c' object='c2validate-c2validate.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(c2validate_CFLAGS) $(CFLAGS) -c -o c2validate-c2validate.obj `if test -f 'c2validate.c'; then $(CYGPATH_W) 'c2validate.c'; else $(CYGPATH_W) '$(srcdir)/c2validate.c'; fi` + +lpc.o: ../src/lpc.c +@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lpc.o -MD -MP -MF "$(DEPDIR)/lpc.Tpo" -c -o lpc.o `test -f '../src/lpc.c' || echo '$(srcdir)/'`../src/lpc.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/lpc.Tpo" "$(DEPDIR)/lpc.Po"; else rm -f "$(DEPDIR)/lpc.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../src/lpc.c' object='lpc.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lpc.o `test -f '../src/lpc.c' || echo '$(srcdir)/'`../src/lpc.c + +lpc.obj: ../src/lpc.c +@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lpc.obj -MD -MP -MF "$(DEPDIR)/lpc.Tpo" -c -o lpc.obj `if test -f '../src/lpc.c'; then $(CYGPATH_W) '../src/lpc.c'; else $(CYGPATH_W) '$(srcdir)/../src/lpc.c'; fi`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/lpc.Tpo" "$(DEPDIR)/lpc.Po"; else rm -f "$(DEPDIR)/lpc.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../src/lpc.c' object='lpc.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lpc.obj `if test -f '../src/lpc.c'; then $(CYGPATH_W) '../src/lpc.c'; else $(CYGPATH_W) '$(srcdir)/../src/lpc.c'; fi` + +lsp.o: ../src/lsp.c +@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lsp.o -MD -MP -MF "$(DEPDIR)/lsp.Tpo" -c -o lsp.o `test -f '../src/lsp.c' || echo '$(srcdir)/'`../src/lsp.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/lsp.Tpo" "$(DEPDIR)/lsp.Po"; else rm -f "$(DEPDIR)/lsp.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../src/lsp.c' object='lsp.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lsp.o `test -f '../src/lsp.c' || echo '$(srcdir)/'`../src/lsp.c + +lsp.obj: ../src/lsp.c +@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lsp.obj -MD -MP -MF "$(DEPDIR)/lsp.Tpo" -c -o lsp.obj `if test -f '../src/lsp.c'; then $(CYGPATH_W) '../src/lsp.c'; else $(CYGPATH_W) '$(srcdir)/../src/lsp.c'; fi`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/lsp.Tpo" "$(DEPDIR)/lsp.Po"; else rm -f "$(DEPDIR)/lsp.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../src/lsp.c' object='lsp.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lsp.obj `if test -f '../src/lsp.c'; then $(CYGPATH_W) '../src/lsp.c'; else $(CYGPATH_W) '$(srcdir)/../src/lsp.c'; fi` + +quantise.o: ../src/quantise.c +@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT quantise.o -MD -MP -MF "$(DEPDIR)/quantise.Tpo" -c -o quantise.o `test -f '../src/quantise.c' || echo '$(srcdir)/'`../src/quantise.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/quantise.Tpo" "$(DEPDIR)/quantise.Po"; else rm -f "$(DEPDIR)/quantise.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../src/quantise.c' object='quantise.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o quantise.o `test -f '../src/quantise.c' || echo '$(srcdir)/'`../src/quantise.c + +quantise.obj: ../src/quantise.c +@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT quantise.obj -MD -MP -MF "$(DEPDIR)/quantise.Tpo" -c -o quantise.obj `if test -f '../src/quantise.c'; then $(CYGPATH_W) '../src/quantise.c'; else $(CYGPATH_W) '$(srcdir)/../src/quantise.c'; fi`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/quantise.Tpo" "$(DEPDIR)/quantise.Po"; else rm -f "$(DEPDIR)/quantise.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../src/quantise.c' object='quantise.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o quantise.obj `if test -f '../src/quantise.c'; then $(CYGPATH_W) '../src/quantise.c'; else $(CYGPATH_W) '$(srcdir)/../src/quantise.c'; fi` + +dump.o: ../src/dump.c +@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dump.o -MD -MP -MF "$(DEPDIR)/dump.Tpo" -c -o dump.o `test -f '../src/dump.c' || echo '$(srcdir)/'`../src/dump.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/dump.Tpo" "$(DEPDIR)/dump.Po"; else rm -f "$(DEPDIR)/dump.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../src/dump.c' object='dump.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dump.o `test -f '../src/dump.c' || echo '$(srcdir)/'`../src/dump.c + +dump.obj: ../src/dump.c +@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dump.obj -MD -MP -MF "$(DEPDIR)/dump.Tpo" -c -o dump.obj `if test -f '../src/dump.c'; then $(CYGPATH_W) '../src/dump.c'; else $(CYGPATH_W) '$(srcdir)/../src/dump.c'; fi`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/dump.Tpo" "$(DEPDIR)/dump.Po"; else rm -f "$(DEPDIR)/dump.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../src/dump.c' object='dump.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dump.obj `if test -f '../src/dump.c'; then $(CYGPATH_W) '../src/dump.c'; else $(CYGPATH_W) '$(srcdir)/../src/dump.c'; fi` + +kiss_fft.o: ../src/kiss_fft.c +@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kiss_fft.o -MD -MP -MF "$(DEPDIR)/kiss_fft.Tpo" -c -o kiss_fft.o `test -f '../src/kiss_fft.c' || echo '$(srcdir)/'`../src/kiss_fft.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/kiss_fft.Tpo" "$(DEPDIR)/kiss_fft.Po"; else rm -f "$(DEPDIR)/kiss_fft.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../src/kiss_fft.c' object='kiss_fft.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kiss_fft.o `test -f '../src/kiss_fft.c' || echo '$(srcdir)/'`../src/kiss_fft.c + +kiss_fft.obj: ../src/kiss_fft.c +@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kiss_fft.obj -MD -MP -MF "$(DEPDIR)/kiss_fft.Tpo" -c -o kiss_fft.obj `if test -f '../src/kiss_fft.c'; then $(CYGPATH_W) '../src/kiss_fft.c'; else $(CYGPATH_W) '$(srcdir)/../src/kiss_fft.c'; fi`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/kiss_fft.Tpo" "$(DEPDIR)/kiss_fft.Po"; else rm -f "$(DEPDIR)/kiss_fft.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../src/kiss_fft.c' object='kiss_fft.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kiss_fft.obj `if test -f '../src/kiss_fft.c'; then $(CYGPATH_W) '../src/kiss_fft.c'; else $(CYGPATH_W) '$(srcdir)/../src/kiss_fft.c'; fi` + +codec2.o: ../src/codec2.c +@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT codec2.o -MD -MP -MF "$(DEPDIR)/codec2.Tpo" -c -o codec2.o `test -f '../src/codec2.c' || echo '$(srcdir)/'`../src/codec2.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/codec2.Tpo" "$(DEPDIR)/codec2.Po"; else rm -f "$(DEPDIR)/codec2.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../src/codec2.c' object='codec2.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o codec2.o `test -f '../src/codec2.c' || echo '$(srcdir)/'`../src/codec2.c + +codec2.obj: ../src/codec2.c +@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT codec2.obj -MD -MP -MF "$(DEPDIR)/codec2.Tpo" -c -o codec2.obj `if test -f '../src/codec2.c'; then $(CYGPATH_W) '../src/codec2.c'; else $(CYGPATH_W) '$(srcdir)/../src/codec2.c'; fi`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/codec2.Tpo" "$(DEPDIR)/codec2.Po"; else rm -f "$(DEPDIR)/codec2.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../src/codec2.c' object='codec2.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o codec2.obj `if test -f '../src/codec2.c'; then $(CYGPATH_W) '../src/codec2.c'; else $(CYGPATH_W) '$(srcdir)/../src/codec2.c'; fi` + +sine.o: ../src/sine.c +@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT sine.o -MD -MP -MF "$(DEPDIR)/sine.Tpo" -c -o sine.o `test -f '../src/sine.c' || echo '$(srcdir)/'`../src/sine.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/sine.Tpo" "$(DEPDIR)/sine.Po"; else rm -f "$(DEPDIR)/sine.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../src/sine.c' object='sine.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o sine.o `test -f '../src/sine.c' || echo '$(srcdir)/'`../src/sine.c + +sine.obj: ../src/sine.c +@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT sine.obj -MD -MP -MF "$(DEPDIR)/sine.Tpo" -c -o sine.obj `if test -f '../src/sine.c'; then $(CYGPATH_W) '../src/sine.c'; else $(CYGPATH_W) '$(srcdir)/../src/sine.c'; fi`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/sine.Tpo" "$(DEPDIR)/sine.Po"; else rm -f "$(DEPDIR)/sine.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../src/sine.c' object='sine.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o sine.obj `if test -f '../src/sine.c'; then $(CYGPATH_W) '../src/sine.c'; else $(CYGPATH_W) '$(srcdir)/../src/sine.c'; fi` + +nlp.o: ../src/nlp.c +@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT nlp.o -MD -MP -MF "$(DEPDIR)/nlp.Tpo" -c -o nlp.o `test -f '../src/nlp.c' || echo '$(srcdir)/'`../src/nlp.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/nlp.Tpo" "$(DEPDIR)/nlp.Po"; else rm -f "$(DEPDIR)/nlp.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../src/nlp.c' object='nlp.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o nlp.o `test -f '../src/nlp.c' || echo '$(srcdir)/'`../src/nlp.c + +nlp.obj: ../src/nlp.c +@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT nlp.obj -MD -MP -MF "$(DEPDIR)/nlp.Tpo" -c -o nlp.obj `if test -f '../src/nlp.c'; then $(CYGPATH_W) '../src/nlp.c'; else $(CYGPATH_W) '$(srcdir)/../src/nlp.c'; fi`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/nlp.Tpo" "$(DEPDIR)/nlp.Po"; else rm -f "$(DEPDIR)/nlp.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../src/nlp.c' object='nlp.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o nlp.obj `if test -f '../src/nlp.c'; then $(CYGPATH_W) '../src/nlp.c'; else $(CYGPATH_W) '$(srcdir)/../src/nlp.c'; fi` + +postfilter.o: ../src/postfilter.c +@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT postfilter.o -MD -MP -MF "$(DEPDIR)/postfilter.Tpo" -c -o postfilter.o `test -f '../src/postfilter.c' || echo '$(srcdir)/'`../src/postfilter.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/postfilter.Tpo" "$(DEPDIR)/postfilter.Po"; else rm -f "$(DEPDIR)/postfilter.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../src/postfilter.c' object='postfilter.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o postfilter.o `test -f '../src/postfilter.c' || echo '$(srcdir)/'`../src/postfilter.c + +postfilter.obj: ../src/postfilter.c +@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT postfilter.obj -MD -MP -MF "$(DEPDIR)/postfilter.Tpo" -c -o postfilter.obj `if test -f '../src/postfilter.c'; then $(CYGPATH_W) '../src/postfilter.c'; else $(CYGPATH_W) '$(srcdir)/../src/postfilter.c'; fi`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/postfilter.Tpo" "$(DEPDIR)/postfilter.Po"; else rm -f "$(DEPDIR)/postfilter.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../src/postfilter.c' object='postfilter.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o postfilter.obj `if test -f '../src/postfilter.c'; then $(CYGPATH_W) '../src/postfilter.c'; else $(CYGPATH_W) '$(srcdir)/../src/postfilter.c'; fi` + +phase.o: ../src/phase.c +@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT phase.o -MD -MP -MF "$(DEPDIR)/phase.Tpo" -c -o phase.o `test -f '../src/phase.c' || echo '$(srcdir)/'`../src/phase.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/phase.Tpo" "$(DEPDIR)/phase.Po"; else rm -f "$(DEPDIR)/phase.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../src/phase.c' object='phase.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o phase.o `test -f '../src/phase.c' || echo '$(srcdir)/'`../src/phase.c + +phase.obj: ../src/phase.c +@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT phase.obj -MD -MP -MF "$(DEPDIR)/phase.Tpo" -c -o phase.obj `if test -f '../src/phase.c'; then $(CYGPATH_W) '../src/phase.c'; else $(CYGPATH_W) '$(srcdir)/../src/phase.c'; fi`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/phase.Tpo" "$(DEPDIR)/phase.Po"; else rm -f "$(DEPDIR)/phase.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../src/phase.c' object='phase.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o phase.obj `if test -f '../src/phase.c'; then $(CYGPATH_W) '../src/phase.c'; else $(CYGPATH_W) '$(srcdir)/../src/phase.c'; fi` + +interp.o: ../src/interp.c +@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT interp.o -MD -MP -MF "$(DEPDIR)/interp.Tpo" -c -o interp.o `test -f '../src/interp.c' || echo '$(srcdir)/'`../src/interp.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/interp.Tpo" "$(DEPDIR)/interp.Po"; else rm -f "$(DEPDIR)/interp.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../src/interp.c' object='interp.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o interp.o `test -f '../src/interp.c' || echo '$(srcdir)/'`../src/interp.c + +interp.obj: ../src/interp.c +@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT interp.obj -MD -MP -MF "$(DEPDIR)/interp.Tpo" -c -o interp.obj `if test -f '../src/interp.c'; then $(CYGPATH_W) '../src/interp.c'; else $(CYGPATH_W) '$(srcdir)/../src/interp.c'; fi`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/interp.Tpo" "$(DEPDIR)/interp.Po"; else rm -f "$(DEPDIR)/interp.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../src/interp.c' object='interp.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o interp.obj `if test -f '../src/interp.c'; then $(CYGPATH_W) '../src/interp.c'; else $(CYGPATH_W) '$(srcdir)/../src/interp.c'; fi` + +pack.o: ../src/pack.c +@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT pack.o -MD -MP -MF "$(DEPDIR)/pack.Tpo" -c -o pack.o `test -f '../src/pack.c' || echo '$(srcdir)/'`../src/pack.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/pack.Tpo" "$(DEPDIR)/pack.Po"; else rm -f "$(DEPDIR)/pack.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../src/pack.c' object='pack.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o pack.o `test -f '../src/pack.c' || echo '$(srcdir)/'`../src/pack.c + +pack.obj: ../src/pack.c +@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT pack.obj -MD -MP -MF "$(DEPDIR)/pack.Tpo" -c -o pack.obj `if test -f '../src/pack.c'; then $(CYGPATH_W) '../src/pack.c'; else $(CYGPATH_W) '$(srcdir)/../src/pack.c'; fi`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/pack.Tpo" "$(DEPDIR)/pack.Po"; else rm -f "$(DEPDIR)/pack.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../src/pack.c' object='pack.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o pack.obj `if test -f '../src/pack.c'; then $(CYGPATH_W) '../src/pack.c'; else $(CYGPATH_W) '$(srcdir)/../src/pack.c'; fi` + +codebook.o: ../src/codebook.c +@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT codebook.o -MD -MP -MF "$(DEPDIR)/codebook.Tpo" -c -o codebook.o `test -f '../src/codebook.c' || echo '$(srcdir)/'`../src/codebook.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/codebook.Tpo" "$(DEPDIR)/codebook.Po"; else rm -f "$(DEPDIR)/codebook.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../src/codebook.c' object='codebook.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o codebook.o `test -f '../src/codebook.c' || echo '$(srcdir)/'`../src/codebook.c + +codebook.obj: ../src/codebook.c +@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT codebook.obj -MD -MP -MF "$(DEPDIR)/codebook.Tpo" -c -o codebook.obj `if test -f '../src/codebook.c'; then $(CYGPATH_W) '../src/codebook.c'; else $(CYGPATH_W) '$(srcdir)/../src/codebook.c'; fi`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/codebook.Tpo" "$(DEPDIR)/codebook.Po"; else rm -f "$(DEPDIR)/codebook.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../src/codebook.c' object='codebook.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o codebook.obj `if test -f '../src/codebook.c'; then $(CYGPATH_W) '../src/codebook.c'; else $(CYGPATH_W) '$(srcdir)/../src/codebook.c'; fi` + +codebookd.o: ../src/codebookd.c +@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT codebookd.o -MD -MP -MF "$(DEPDIR)/codebookd.Tpo" -c -o codebookd.o `test -f '../src/codebookd.c' || echo '$(srcdir)/'`../src/codebookd.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/codebookd.Tpo" "$(DEPDIR)/codebookd.Po"; else rm -f "$(DEPDIR)/codebookd.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../src/codebookd.c' object='codebookd.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o codebookd.o `test -f '../src/codebookd.c' || echo '$(srcdir)/'`../src/codebookd.c + +codebookd.obj: ../src/codebookd.c +@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT codebookd.obj -MD -MP -MF "$(DEPDIR)/codebookd.Tpo" -c -o codebookd.obj `if test -f '../src/codebookd.c'; then $(CYGPATH_W) '../src/codebookd.c'; else $(CYGPATH_W) '$(srcdir)/../src/codebookd.c'; fi`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/codebookd.Tpo" "$(DEPDIR)/codebookd.Po"; else rm -f "$(DEPDIR)/codebookd.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../src/codebookd.c' object='codebookd.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o codebookd.obj `if test -f '../src/codebookd.c'; then $(CYGPATH_W) '../src/codebookd.c'; else $(CYGPATH_W) '$(srcdir)/../src/codebookd.c'; fi` + +codebookvq.o: ../src/codebookvq.c +@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT codebookvq.o -MD -MP -MF "$(DEPDIR)/codebookvq.Tpo" -c -o codebookvq.o `test -f '../src/codebookvq.c' || echo '$(srcdir)/'`../src/codebookvq.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/codebookvq.Tpo" "$(DEPDIR)/codebookvq.Po"; else rm -f "$(DEPDIR)/codebookvq.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../src/codebookvq.c' object='codebookvq.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o codebookvq.o `test -f '../src/codebookvq.c' || echo '$(srcdir)/'`../src/codebookvq.c + +codebookvq.obj: ../src/codebookvq.c +@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT codebookvq.obj -MD -MP -MF "$(DEPDIR)/codebookvq.Tpo" -c -o codebookvq.obj `if test -f '../src/codebookvq.c'; then $(CYGPATH_W) '../src/codebookvq.c'; else $(CYGPATH_W) '$(srcdir)/../src/codebookvq.c'; fi`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/codebookvq.Tpo" "$(DEPDIR)/codebookvq.Po"; else rm -f "$(DEPDIR)/codebookvq.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../src/codebookvq.c' object='codebookvq.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o codebookvq.obj `if test -f '../src/codebookvq.c'; then $(CYGPATH_W) '../src/codebookvq.c'; else $(CYGPATH_W) '$(srcdir)/../src/codebookvq.c'; fi` + +codebookjnd.o: ../src/codebookjnd.c +@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT codebookjnd.o -MD -MP -MF "$(DEPDIR)/codebookjnd.Tpo" -c -o codebookjnd.o `test -f '../src/codebookjnd.c' || echo '$(srcdir)/'`../src/codebookjnd.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/codebookjnd.Tpo" "$(DEPDIR)/codebookjnd.Po"; else rm -f "$(DEPDIR)/codebookjnd.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../src/codebookjnd.c' object='codebookjnd.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o codebookjnd.o `test -f '../src/codebookjnd.c' || echo '$(srcdir)/'`../src/codebookjnd.c + +codebookjnd.obj: ../src/codebookjnd.c +@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT codebookjnd.obj -MD -MP -MF "$(DEPDIR)/codebookjnd.Tpo" -c -o codebookjnd.obj `if test -f '../src/codebookjnd.c'; then $(CYGPATH_W) '../src/codebookjnd.c'; else $(CYGPATH_W) '$(srcdir)/../src/codebookjnd.c'; fi`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/codebookjnd.Tpo" "$(DEPDIR)/codebookjnd.Po"; else rm -f "$(DEPDIR)/codebookjnd.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../src/codebookjnd.c' object='codebookjnd.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o codebookjnd.obj `if test -f '../src/codebookjnd.c'; then $(CYGPATH_W) '../src/codebookjnd.c'; else $(CYGPATH_W) '$(srcdir)/../src/codebookjnd.c'; fi` + +codebookdt.o: ../src/codebookdt.c +@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT codebookdt.o -MD -MP -MF "$(DEPDIR)/codebookdt.Tpo" -c -o codebookdt.o `test -f '../src/codebookdt.c' || echo '$(srcdir)/'`../src/codebookdt.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/codebookdt.Tpo" "$(DEPDIR)/codebookdt.Po"; else rm -f "$(DEPDIR)/codebookdt.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../src/codebookdt.c' object='codebookdt.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o codebookdt.o `test -f '../src/codebookdt.c' || echo '$(srcdir)/'`../src/codebookdt.c + +codebookdt.obj: ../src/codebookdt.c +@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT codebookdt.obj -MD -MP -MF "$(DEPDIR)/codebookdt.Tpo" -c -o codebookdt.obj `if test -f '../src/codebookdt.c'; then $(CYGPATH_W) '../src/codebookdt.c'; else $(CYGPATH_W) '$(srcdir)/../src/codebookdt.c'; fi`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/codebookdt.Tpo" "$(DEPDIR)/codebookdt.Po"; else rm -f "$(DEPDIR)/codebookdt.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../src/codebookdt.c' object='codebookdt.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o codebookdt.obj `if test -f '../src/codebookdt.c'; then $(CYGPATH_W) '../src/codebookdt.c'; else $(CYGPATH_W) '$(srcdir)/../src/codebookdt.c'; fi` + +codebookjvm.o: ../src/codebookjvm.c +@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT codebookjvm.o -MD -MP -MF "$(DEPDIR)/codebookjvm.Tpo" -c -o codebookjvm.o `test -f '../src/codebookjvm.c' || echo '$(srcdir)/'`../src/codebookjvm.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/codebookjvm.Tpo" "$(DEPDIR)/codebookjvm.Po"; else rm -f "$(DEPDIR)/codebookjvm.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../src/codebookjvm.c' object='codebookjvm.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o codebookjvm.o `test -f '../src/codebookjvm.c' || echo '$(srcdir)/'`../src/codebookjvm.c + +codebookjvm.obj: ../src/codebookjvm.c +@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT codebookjvm.obj -MD -MP -MF "$(DEPDIR)/codebookjvm.Tpo" -c -o codebookjvm.obj `if test -f '../src/codebookjvm.c'; then $(CYGPATH_W) '../src/codebookjvm.c'; else $(CYGPATH_W) '$(srcdir)/../src/codebookjvm.c'; fi`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/codebookjvm.Tpo" "$(DEPDIR)/codebookjvm.Po"; else rm -f "$(DEPDIR)/codebookjvm.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../src/codebookjvm.c' object='codebookjvm.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o codebookjvm.obj `if test -f '../src/codebookjvm.c'; then $(CYGPATH_W) '../src/codebookjvm.c'; else $(CYGPATH_W) '$(srcdir)/../src/codebookjvm.c'; fi` + +codebookvqanssi.o: ../src/codebookvqanssi.c +@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT codebookvqanssi.o -MD -MP -MF "$(DEPDIR)/codebookvqanssi.Tpo" -c -o codebookvqanssi.o `test -f '../src/codebookvqanssi.c' || echo '$(srcdir)/'`../src/codebookvqanssi.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/codebookvqanssi.Tpo" "$(DEPDIR)/codebookvqanssi.Po"; else rm -f "$(DEPDIR)/codebookvqanssi.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../src/codebookvqanssi.c' object='codebookvqanssi.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o codebookvqanssi.o `test -f '../src/codebookvqanssi.c' || echo '$(srcdir)/'`../src/codebookvqanssi.c + +codebookvqanssi.obj: ../src/codebookvqanssi.c +@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT codebookvqanssi.obj -MD -MP -MF "$(DEPDIR)/codebookvqanssi.Tpo" -c -o codebookvqanssi.obj `if test -f '../src/codebookvqanssi.c'; then $(CYGPATH_W) '../src/codebookvqanssi.c'; else $(CYGPATH_W) '$(srcdir)/../src/codebookvqanssi.c'; fi`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/codebookvqanssi.Tpo" "$(DEPDIR)/codebookvqanssi.Po"; else rm -f "$(DEPDIR)/codebookvqanssi.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../src/codebookvqanssi.c' object='codebookvqanssi.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o codebookvqanssi.obj `if test -f '../src/codebookvqanssi.c'; then $(CYGPATH_W) '../src/codebookvqanssi.c'; else $(CYGPATH_W) '$(srcdir)/../src/codebookvqanssi.c'; fi` + +codebookge.o: ../src/codebookge.c +@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT codebookge.o -MD -MP -MF "$(DEPDIR)/codebookge.Tpo" -c -o codebookge.o `test -f '../src/codebookge.c' || echo '$(srcdir)/'`../src/codebookge.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/codebookge.Tpo" "$(DEPDIR)/codebookge.Po"; else rm -f "$(DEPDIR)/codebookge.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../src/codebookge.c' object='codebookge.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o codebookge.o `test -f '../src/codebookge.c' || echo '$(srcdir)/'`../src/codebookge.c + +codebookge.obj: ../src/codebookge.c +@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT codebookge.obj -MD -MP -MF "$(DEPDIR)/codebookge.Tpo" -c -o codebookge.obj `if test -f '../src/codebookge.c'; then $(CYGPATH_W) '../src/codebookge.c'; else $(CYGPATH_W) '$(srcdir)/../src/codebookge.c'; fi`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/codebookge.Tpo" "$(DEPDIR)/codebookge.Po"; else rm -f "$(DEPDIR)/codebookge.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../src/codebookge.c' object='codebookge.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o codebookge.obj `if test -f '../src/codebookge.c'; then $(CYGPATH_W) '../src/codebookge.c'; else $(CYGPATH_W) '$(srcdir)/../src/codebookge.c'; fi` + +fdmdv.o: ../src/fdmdv.c +@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT fdmdv.o -MD -MP -MF "$(DEPDIR)/fdmdv.Tpo" -c -o fdmdv.o `test -f '../src/fdmdv.c' || echo '$(srcdir)/'`../src/fdmdv.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/fdmdv.Tpo" "$(DEPDIR)/fdmdv.Po"; else rm -f "$(DEPDIR)/fdmdv.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../src/fdmdv.c' object='fdmdv.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o fdmdv.o `test -f '../src/fdmdv.c' || echo '$(srcdir)/'`../src/fdmdv.c + +fdmdv.obj: ../src/fdmdv.c +@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT fdmdv.obj -MD -MP -MF "$(DEPDIR)/fdmdv.Tpo" -c -o fdmdv.obj `if test -f '../src/fdmdv.c'; then $(CYGPATH_W) '../src/fdmdv.c'; else $(CYGPATH_W) '$(srcdir)/../src/fdmdv.c'; fi`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/fdmdv.Tpo" "$(DEPDIR)/fdmdv.Po"; else rm -f "$(DEPDIR)/fdmdv.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../src/fdmdv.c' object='fdmdv.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o fdmdv.obj `if test -f '../src/fdmdv.c'; then $(CYGPATH_W) '../src/fdmdv.c'; else $(CYGPATH_W) '$(srcdir)/../src/fdmdv.c'; fi` + +octave.o: ../src/octave.c +@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT octave.o -MD -MP -MF "$(DEPDIR)/octave.Tpo" -c -o octave.o `test -f '../src/octave.c' || echo '$(srcdir)/'`../src/octave.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/octave.Tpo" "$(DEPDIR)/octave.Po"; else rm -f "$(DEPDIR)/octave.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../src/octave.c' object='octave.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o octave.o `test -f '../src/octave.c' || echo '$(srcdir)/'`../src/octave.c + +octave.obj: ../src/octave.c +@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT octave.obj -MD -MP -MF "$(DEPDIR)/octave.Tpo" -c -o octave.obj `if test -f '../src/octave.c'; then $(CYGPATH_W) '../src/octave.c'; else $(CYGPATH_W) '$(srcdir)/../src/octave.c'; fi`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/octave.Tpo" "$(DEPDIR)/octave.Po"; else rm -f "$(DEPDIR)/octave.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../src/octave.c' object='octave.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o octave.obj `if test -f '../src/octave.c'; then $(CYGPATH_W) '../src/octave.c'; else $(CYGPATH_W) '$(srcdir)/../src/octave.c'; fi` + +fifo.o: ../src/fifo.c +@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT fifo.o -MD -MP -MF "$(DEPDIR)/fifo.Tpo" -c -o fifo.o `test -f '../src/fifo.c' || echo '$(srcdir)/'`../src/fifo.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/fifo.Tpo" "$(DEPDIR)/fifo.Po"; else rm -f "$(DEPDIR)/fifo.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../src/fifo.c' object='fifo.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o fifo.o `test -f '../src/fifo.c' || echo '$(srcdir)/'`../src/fifo.c + +fifo.obj: ../src/fifo.c +@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT fifo.obj -MD -MP -MF "$(DEPDIR)/fifo.Tpo" -c -o fifo.obj `if test -f '../src/fifo.c'; then $(CYGPATH_W) '../src/fifo.c'; else $(CYGPATH_W) '$(srcdir)/../src/fifo.c'; fi`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/fifo.Tpo" "$(DEPDIR)/fifo.Po"; else rm -f "$(DEPDIR)/fifo.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../src/fifo.c' object='fifo.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o fifo.obj `if test -f '../src/fifo.c'; then $(CYGPATH_W) '../src/fifo.c'; else $(CYGPATH_W) '$(srcdir)/../src/fifo.c'; fi` + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool +uninstall-info-am: + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-libtool distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: + +install-exec-am: + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-info-am + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-exec \ + install-exec-am install-info install-info-am install-man \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am \ + uninstall-info-am + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/codec2/tags/0.4.1/unittest/README b/codec2/tags/0.4.1/unittest/README new file mode 100644 index 00000000..0e8776b7 --- /dev/null +++ b/codec2/tags/0.4.1/unittest/README @@ -0,0 +1,43 @@ +README +for codec2/unittest +Created David Rowe 31 July 2012 + +Training (experimental) sparse phase VQs: + +1/ In ../src/phase.c phase_experiment() enable: + + print_sparse_pred_error() + + and 'make' c2sim (in src) + +2/ Run over a training database: + + $ ./c2sim /xhome1/codec2/samples/train.spc --phaseexp > train_phtrain.txt + + a) check stats in Octave: + octave> load ../src/train_phtrain.txt + octave> std(nonzeros(train_phtrain(:,1:20))) + octave> hist(nonzeros(train_phtrain(:,1:20)),20) +3/ Extract and convert to floats vector you wish to train for example + first 20 (out of MAX_AMP == 80): + + $ ./extract ../src/train_phtrain.txt train_phtrain.flt 1 20 + +4/ Convert to rectangular: + + $ ./polar2rect train_phtrain.flt train_phtrainr.flt + +5/ Run this program: + + $ ./vqtrainph train_phtrainr.flt 20 1024 vq.txt + + Ouput is vq.txt + +Tests +----- + ++ build up insmallest possible stesp ++ impl errors v alg errors ++ use actual phase data as codebook ++ test vq with rand phases first or known data + diff --git a/codec2/tags/0.4.1/unittest/c2validate.c b/codec2/tags/0.4.1/unittest/c2validate.c new file mode 100644 index 00000000..5906017d --- /dev/null +++ b/codec2/tags/0.4.1/unittest/c2validate.c @@ -0,0 +1,103 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: c2validate.c + AUTHOR......: David Rowe + DATE CREATED: 10 April 2013 + + Encodes and decodes an array of speech samples using Codec 2 and compares + it to a previously stored output to validate Codec operation. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2013 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 . +*/ + +#include "codec2.h" +#ifdef __UNITTEST__ +#include "hts1a.h" +#include "hts1a_1300.h" +#endif + +#include +#include +#include +#ifdef __EMBEDDED__ +#include "gdb_stdio.h" +#define fopen gdb_stdio_fopen +#define fwrite gdb_stdio_fwrite +#define fclose gdb_stdio_fclose +#endif + +int c2validate(int mode, short input_samples[], short output_samples[], char outfile[], int nsamples) +{ + struct CODEC2 *codec2; + short *pinput, *poutput, *outbuf; + unsigned char *bits; + int nsam, nbit; + int nframes, i, result, j; + FILE *fout; + + codec2 = codec2_create(mode); + nsam = codec2_samples_per_frame(codec2); + outbuf = (short*)malloc(nsam*sizeof(short)); + nbit = codec2_bits_per_frame(codec2); + bits = (unsigned char*)malloc(nbit*sizeof(char)); + if (strlen(outfile)) + fout = fopen(outfile, "wb"); + else + fout = NULL; + + nframes = nsamples/nsam; + pinput = input_samples; + poutput = output_samples; + result = 1; + + for(i=0; i. +*/ + +#ifndef __C2VALIDATE__ + +int c2validate(int mode, short input_samples[], short output_samples[], char outfile[], int nsamples); + +#endif diff --git a/codec2/tags/0.4.1/unittest/create_interleaver.c b/codec2/tags/0.4.1/unittest/create_interleaver.c new file mode 100644 index 00000000..39ff99c0 --- /dev/null +++ b/codec2/tags/0.4.1/unittest/create_interleaver.c @@ -0,0 +1,48 @@ +/* + create_interleaver.c + David Rowe + May 27 2012 + + Creates an interleaver for Codec 2. +*/ + +#include +#include +#include + +int main(int argc, char * argv[]) { + int m,i, src_bit, dest_bit; + FILE *f; + int *interleaver; + + if (argc != 3) { + printf("usage: %s InterleaverBits InterleaverFile\n", argv[0]); + exit(1); + } + + m = atoi(argv[1]); + f = fopen(argv[2],"wt"); + assert(f != NULL); + + + interleaver = (int*)malloc(m*sizeof(int)); + assert(interleaver != NULL); + for(i=0; i +#include +#include +#include +#include +#include +#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. +*/ + +#include +#include +#include +#include +#include +#include +#include +#include + +#define MAX_STR 1024 +#define LEN_TARGET_NAME_RESPONSE 14 +#define N 160 + +/* message parsing state machine states */ + +#define MSGSTATE_HDR1 0 +#define MSGSTATE_HDR2 1 +#define MSGSTATE_DATA 2 + +#define LENGTH_MASK 0x1FFF /* mask for message length */ +#define TYPE_MASK 0xE0 /* mask for upper byte of header */ +#define TYPE_C 0x20 /* compressed speech from target */ +#define TYPE_UC 0x40 /* uncompressed speech from target */ + +#define MAX_MSG_LEN 8192 + +/* Control items sent to DV Dongle */ + +char target_name[] = {0x04, 0x20, 0x01, 0x00}; + +/* note [2] appears to be in error, specifies run as 0x02, stop as 0x01 */ + +char run_state_stop[] = {0x05, 0x00, 0x18, 0x00, 0x00}; +char run_state_run[] = {0x05, 0x00, 0x18, 0x00, 0x01}; + +/* Control item codes from DV Dongle */ + +char data_item_0[] = {0x42, 0x81}; +char data_item_1[] = {0x32, 0xa0}; +char run_state[] = {0x05, 0x00}; +char idle[] = {0x00, 0x00}; + +typedef struct { + short header; + char power; + char control1; + short rate[5]; + short unused[3]; + short dtmf; + short control2; + short channel_data[12]; +} COMPRESSED; + +COMPRESSED c_in; +COMPRESSED c_out; +FILE *fin, *fout, *f; +int fd, c_msg, uc_msg; + +int initport(int fd) { + struct termios options; + + // Set the options for the port... + + cfmakeraw(&options); + cfsetispeed(&options, B230400); + cfsetospeed(&options, B230400); + options.c_cflag |= (CLOCAL | CREAD); + tcsetattr(fd, TCSANOW, &options); + + return 1; +} + +int getbaud(int fd) { + struct termios termAttr; + int inputSpeed = -1; + speed_t baudRate; + + tcgetattr(fd, &termAttr); + + /* Get the input speed */ + + baudRate = cfgetispeed(&termAttr); + switch (baudRate) { + case B0: inputSpeed = 0; break; + case B50: inputSpeed = 50; break; + case B110: inputSpeed = 110; break; + case B134: inputSpeed = 134; break; + case B150: inputSpeed = 150; break; + case B200: inputSpeed = 200; break; + case B300: inputSpeed = 300; break; + case B600: inputSpeed = 600; break; + case B1200: inputSpeed = 1200; break; + case B1800: inputSpeed = 1800; break; + case B2400: inputSpeed = 2400; break; + case B4800: inputSpeed = 4800; break; + case B9600: inputSpeed = 9600; break; + case B19200: inputSpeed = 19200; break; + case B38400: inputSpeed = 38400; break; + case B57600: inputSpeed = 38400; break; + case B115200: inputSpeed = 38400; break; + case B230400: inputSpeed = 230400; break; + } + + return inputSpeed; +} + +void write_dongle(int fd, char *data, int len) { + int n; + //printf(" writing %d bytes\n", len); + n = write(fd, data, len); + if (n < 0) { + perror("write failed"); + exit(1); + } +} + +void read_dongle(int fd, char *data, int len) { + int n; + //printf(" reading %d bytes \n", len); + + n = read(fd, data, len); + if (n < 0) { + perror("read failed"); + exit(1); + } + //printf(" read %d bytes\n", len); +} + +void parse_message(int msg_type, int msg_len, char msg_data[]) { + short buf[N]; + COMPRESSED *c_out; + + //printf("msg_type: 0x%02x msg_len: %d\n", msg_type, msg_len); + + /* echo compressed speech frames back to target */ + + if (msg_type == TYPE_C) { + c_out = (COMPRESSED*)msg_data; +#ifdef TMP + printf("control1 0x%04x\n", c_out->control1 & 0xff); + printf("rate[0] 0x%04x\n", c_out->rate[0]); + printf("rate[1] 0x%04x\n", c_out->rate[1]); + printf("rate[2] 0x%04x\n", c_out->rate[2]); + printf("rate[3] 0x%04x\n", c_out->rate[3]); + printf("rate[4] 0x%04x\n", c_out->rate[4]); + printf("control2 0x%04x\n", c_out->control2 & 0xffff); + printf("cd[0] 0x%04x\n", c_out->channel_data[0] & 0xffff); + printf("cd[1] 0x%04x\n", c_out->channel_data[1] & 0xffff); + printf("cd[2] 0x%04x\n", c_out->channel_data[2] & 0xffff); + printf("cd[3] 0x%04x\n", c_out->channel_data[3] & 0xffff); + printf("cd[4] 0x%04x\n", c_out->channel_data[4] & 0xffff); + printf("cd[5] 0x%04x\n", c_out->channel_data[5] & 0xffff); + printf("cd[6] 0x%04x\n", c_out->channel_data[6] & 0xffff); + printf("uc_msg %d\n", uc_msg); +#endif + printf("bit errors %d\n", c_out->unused[2]); + memcpy(&c_in.channel_data, + &c_out->channel_data, + sizeof(c_in.channel_data)); + + write_dongle(fd, data_item_1, sizeof(data_item_1)); + write_dongle(fd, (char*)&c_in, sizeof(c_in)); + + c_msg++; + } + + /* write speech buffers to disk */ + + if (msg_type == TYPE_UC) { + + if (fout != NULL) { + fwrite(msg_data, sizeof(char), msg_len-2, fout); + printf("msg_len %d\n", msg_len); + } + + if (fin != NULL) + fread(buf, sizeof(short), N, fin); + else + memset(buf, 0, sizeof(buf)); + + write_dongle(fd, data_item_0, sizeof(data_item_0)); + write_dongle(fd, (char*)buf, sizeof(buf)); + + uc_msg++; + } +} + +int main(int argc, char **argv) { + char response[MAX_STR]; + int i; + int state, next_state; + short header; + int msg_type, msg_length; + char msg_data[MAX_MSG_LEN]; + int n, length; + int r; + + char data; + + f = fopen("/tmp/log.txt", "wt"); + assert(f != NULL); + + /* open and configure serial port */ + + fd = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NDELAY); + if (fd == -1) { + perror("open_port: Unable to open /dev/ttyS0 - "); + exit(1); + } else { + fcntl(fd, F_SETFL, 0); + } + + initport(fd); + + fin = NULL; + if (argc >= 2) { + fin = fopen(argv[1],"rb"); + assert(fin != NULL); + } + fout = NULL; + if (argc == 3) { + fout = fopen(argv[2],"wb"); + assert(fout != NULL); + } + + /* check DV Dongle is alive */ + + write_dongle(fd, target_name, sizeof(target_name)); + read_dongle(fd, response, LEN_TARGET_NAME_RESPONSE); + if (strcmp(&response[4],"DV Dongle") != 0) { + printf("DV Dongle not responding\n"); + exit(1); + } + printf("Found DV Dongle....\n"); + + c_in.header = 0x13ec; + c_in.power = 0x0; + c_in.control1 = 0x0; + +#define RATE2000 +#ifdef RATE2000 + c_in.rate[0] = 0x0028; /* 2000 bit/s, no FEC */ + c_in.rate[1] = 0x0000; + c_in.rate[2] = 0x0000; + c_in.rate[3] = 0x0000; + c_in.rate[4] = 0x6248; +#endif + +#ifdef RATE3600_1200 + c_in.rate[0] = 0x5048; /* 3600 bit/s, 1200 bit/s FEC */ + c_in.rate[1] = 0x0001; + c_in.rate[2] = 0x0000; + c_in.rate[3] = 0x2412; + c_in.rate[4] = 0x6860; +#endif + + c_in.unused[0] = 0x0; + c_in.unused[1] = 0x0; + c_in.unused[2] = 0x0; + c_in.dtmf = 0x00ff; + c_in.control2 = 0x8000; + + /* put codec in run mode */ + + write_dongle(fd, run_state_run, sizeof(run_state_run)); + //write_dongle(fd, data_item_1, sizeof(data_item_1)); + //write_dongle(fd, (char*)&c_in, sizeof(c_in)); + + state = MSGSTATE_HDR1; + header = msg_type = msg_length = n = length = 0; + c_msg = uc_msg = 0; + + for(i=0; i<100000; i++) { + /* + We can only reliably read one byte at a time. Until I + realised this there was "much wailing and gnashing of + teeth". Trying to read() n bytes read() returns n but may + actually reads some number between 1 and n. So it may only + read 1 byte int data[] but return n. + */ + r = read(fd, &data, 1); + assert(r == 1); + + /* used state machine design from ambetest103.zip, SerialPort.cpp */ + + next_state = state; + switch(state) { + case MSGSTATE_HDR1: + header = data; + next_state = MSGSTATE_HDR2; + break; + case MSGSTATE_HDR2: + header |= data<<8; + msg_length = header & LENGTH_MASK; + msg_type = header & TYPE_MASK; + //printf("%0x %d\n", msg_type, msg_length); + if (length == 2) { + parse_message(msg_type, msg_length, msg_data); + next_state = MSGSTATE_HDR1; + } + else { + if (msg_length == 0x0) + length = 8192; + else + length = msg_length - 2; + n = 0; + next_state = MSGSTATE_DATA; + } + break; + case MSGSTATE_DATA: + msg_data[n++] = data; + length--; + if (length == 0) { + parse_message(msg_type, msg_length, msg_data); + next_state = MSGSTATE_HDR1; + } + break; + } + state = next_state; + } + + printf("finished, c_msg = %d uc_msg = %d\n", c_msg, uc_msg); + + write_dongle(fd, run_state_stop, sizeof(run_state_stop)); + + close(fd); + if (fin != NULL) + fclose(fin); + if (fout != NULL) + fclose(fout); + fclose(f); + + return 0; +} diff --git a/codec2/tags/0.4.1/unittest/extract.c b/codec2/tags/0.4.1/unittest/extract.c new file mode 100644 index 00000000..2812d55e --- /dev/null +++ b/codec2/tags/0.4.1/unittest/extract.c @@ -0,0 +1,126 @@ +/*--------------------------------------------------------------------------*\ + + FILE........: extract.c + AUTHOR......: David Rowe + DATE CREATED: 23/2/95 + + This program extracts a float file of vectors from a text file + of vectors. The float files are easier to process quickly + during VQ training. A subset of the text file VQ may be + extracted to faciltate split VQ of scaler VQ design. + +\*--------------------------------------------------------------------------*/ + +/* + 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, 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 . +*/ + +#define MAX_STR 2048 /* maximum string length */ + +#include +#include +#include +#include +#include + +void scan_line(FILE *fp, float f[], int n); + +int main(int argc, char *argv[]) { + FILE *ftext; /* text file of vectors */ + FILE *ffloat; /* float file of vectors */ + int st,en; /* start and end values of vector to copy */ + float *buf; /* ptr to vector read from ftext */ + long lines; /* lines read so far */ + + if (argc != 5) { + printf("usage: %s TextFile FloatFile start(1 .. 10) end(1 .. 10)\n", argv[0]); + exit(1); + } + + /* read command line arguments and open files */ + + ftext = fopen(argv[1],"rt"); + if (ftext == NULL) { + printf("Error opening text file: %s\n",argv[1]); + exit(1); + } + + ffloat = fopen(argv[2],"wb"); + if (ffloat == NULL) { + printf("Error opening float file: %s\n",argv[2]); + exit(1); + } + + st = atoi(argv[3]); + en = atoi(argv[4]); + + buf = (float*)malloc(en*sizeof(float)); + if (buf == NULL) { + printf("Error in malloc()\n"); + exit(1); + } + + lines = 0; + while(!feof(ftext)) { + scan_line(ftext, buf, en); + if (!feof(ftext)) { + fwrite(&buf[st-1], sizeof(float), en-st+1, ffloat); + printf("\r%ld lines",++lines); + } + } + printf("\n"); + + /* clean up and exit */ + + free(buf); + fclose(ftext); + fclose(ffloat); + + return 0; +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: scan_line() + + AUTHOR......: David Rowe + DATE CREATED: 20/2/95 + + This function reads a vector of floats from a line in a text file. + +\*---------------------------------------------------------------------------*/ + +void scan_line(FILE *fp, float f[], int n) +/* FILE *fp; file ptr to text file */ +/* float f[]; array of floats to return */ +/* int n; number of floats in line */ +{ + char s[MAX_STR]; + char *ps,*pe; + int i; + + memset(s, 0, MAX_STR); + ps = pe = fgets(s,MAX_STR,fp); + if (ps == NULL) + return; + for(i=0; i. +*/ + +#include +#include +#include +#include +#include + +#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/codec2/tags/0.4.1/unittest/ge_train.c b/codec2/tags/0.4.1/unittest/ge_train.c new file mode 100644 index 00000000..57c4fa3b --- /dev/null +++ b/codec2/tags/0.4.1/unittest/ge_train.c @@ -0,0 +1,299 @@ +/* + 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, 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 . +*/ + +#include + +#include +#include +#include + +#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 +#include +#include +#include +#include +#include +#include "../src/defines.h" + +typedef struct { + float real; + float imag; +} COMP; + +#define NVEC 200000 +#define D 2 +#define E 8 + +int main(void) { + FILE *f=fopen("testamp.flt", "wb"); + int i, j, m, L, index; + float amp, noisey_amp, pitch, Wo; + float sparse_pe[MAX_AMP]; + + #ifdef TEST1 + /* D fixed amplitude vectors of E elements long, + with D=2, E=8: + + $ ./vqtrainsp testamp.flt 2 8 test.txt + + test.txt should be same as training data. + */ + for(i=0; i. +*/ + +#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 +#include +#include +#include +#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 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 +#include +#include +#include +#include +#include +#include "../src/defines.h" + +typedef struct { + float real; + float imag; +} COMP; + +#define NVEC 100000 +#define D 2 +#define E 8 + +int main(void) { + FILE *f=fopen("testph.flt", "wb"); + int i, m, L, index; + float angle, noisey_angle, pitch, Wo; + COMP c; + COMP sparse_pe[MAX_AMP]; + + #ifdef TEST1 + for(i=0; i. +*/ + +#include +#include +#include +#include + +#define N 160 +#define P 1 + +int main(int argc, char *argv[]) +{ + FILE *fin,*fres; /* input and output files */ + short buf[N]; /* buffer of 16 bit speech samples */ + float Sn[P+N]; /* input speech samples */ + float res[N]; /* residual after LPC filtering */ + float E; + float ak[P+1]; /* LP coeffs */ + + int frames; /* frames processed so far */ + int i; /* loop variables */ + + if (argc < 3) { + printf("usage: %s InputFile ResidualFile\n", argv[0]); + exit(1); + } + + /* Open files */ + + if (strcmp(argv[1], "-") == 0) fin = stdin; + else if ((fin = fopen(argv[1],"rb")) == NULL) { + printf("Error opening input file: %s\n",argv[1]); + exit(0); + } + + if (strcmp(argv[2], "-") == 0) fres = stdout; + else if ((fres = fopen(argv[2],"wb")) == NULL) { + printf("Error opening output residual file: %s\n",argv[2]); + exit(0); + } + + /* Initialise */ + + frames = 0; + for(i=0; i +#include +#include +#include "codec2.h" +#include "defines.h" +#include "quantise.h" + +#define F 6 /* look at LSP ordering in F-1 frames */ +#define CORRECT_OFFSET 10 /* LSPs start 10 bits int frame qt 2400 bit/s */ + + +static int check_candidate(char bits[], int offset) +{ + int i; + int lsp_indexes[LPC_ORD]; + float lsps[LPC_ORD]; + unsigned int nbit = offset; + int swaps; + + for(i=0; i +#include +#include +#include + +#define TWO_PI 6.283185307 +#define FS 8000.0 +#define AMP 10000.0 + +int main(int argc, char *argv[]) { + FILE *f; + int i,n; + float freq, length; + short *buf; + + if (argc != 4) { + printf("usage: %s outputFile frequencyHz lengthSecs\n", argv[0]); + exit(1); + } + + f = fopen(argv[1] ,"wb"); + freq = atof(argv[2]); + length = atof(argv[3]); + n = length*FS; + buf = (short*)malloc(sizeof(short)*n); + assert(buf != NULL); + + for(i=0; i +#include +#include +#include + +typedef struct { + float real; + float imag; +} COMP; + +int main(int argc, char *argv[]) { + FILE *fpolar; + FILE *frect; + float polar; + COMP rect; + + if (argc != 3) { + printf("usage: %s polarFile rectFile\n", argv[0]); + exit(0); + } + + fpolar = fopen(argv[1], "rb"); + assert(fpolar != NULL); + frect = fopen(argv[2], "wb"); + assert(frect != NULL); + + while (fread(&polar, sizeof(float), 1, fpolar) != 0) { + if (polar == 0.0) { + /* this values indicates the VQ training should ignore + this vector element. It's not a valid phase as it + doesn't have mangitude of 1.0 */ + rect.real = 0.0; + rect.imag = 0.0; + } + else { + rect.real = cos(polar); + rect.imag = sin(polar); + } + fwrite(&rect, sizeof(COMP), 1, frect); + } + + fclose(fpolar); + fclose(frect); + + return 0; +} diff --git a/codec2/tags/0.4.1/unittest/pre.c b/codec2/tags/0.4.1/unittest/pre.c new file mode 100644 index 00000000..49e5c99c --- /dev/null +++ b/codec2/tags/0.4.1/unittest/pre.c @@ -0,0 +1,59 @@ +/* + pre.c + David Rowe + Sep 26 2012 + + Takes audio from a file, pre-emphasises, and sends to output file. +*/ + +#include +#include +#include +#include +#include +#include +#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"); + 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 +#include +#include +#include + +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. +*/ + +#include +#include +#include + +#include "defines.h" +#include "quantise.h" + +/*---------------------------------------------------------------------------*\ + + MAIN + +\*---------------------------------------------------------------------------*/ + +int main(int argc, char *argv[]) +{ + FILE *ftrain; /* LSP training data text file */ + float lsp[LPC_ORD]; /* LSP input vector in rads */ + float lsp_hz[LPC_ORD]; /* LSP input vector in Hz */ + int vectors; /* number LSP vectors processed */ + int k,m; /* LSP vector order and codebook size */ + int index; + float wt[1]; /* weighting (not used here for scalars) */ + const float *cb; /* LSP quantiser codebook */ + int i, ret; + float total_se; + + if (argc < 2) { + printf("usage: %s InputFile\n", argv[0]); + exit(1); + } + + if ((ftrain = fopen(argv[1],"rt")) == NULL) { + printf("Error opening input file: %s\n",argv[1]); + exit(0); + } + + total_se = 0.0; + vectors = 0; + wt[0] = 1.0; + + /* Main loop */ + + while(!feof(ftrain)) { + + /* Read LSP input vector speech */ + + for (i=0; i. +*/ + +#define MAX_N 2048 /* maximum DFT size */ + +#include +#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. +*/ + +#ifndef __SD__ +#define __SD__ + +float spectral_dist(float ak1[], float ak2[], int p, int n); + +#endif /* __SD__ */ diff --git a/codec2/tags/0.4.1/unittest/speexlsptest.c b/codec2/tags/0.4.1/unittest/speexlsptest.c new file mode 100644 index 00000000..3350894a --- /dev/null +++ b/codec2/tags/0.4.1/unittest/speexlsptest.c @@ -0,0 +1,176 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: speexlsptest.c + AUTHOR......: David Rowe + DATE CREATED: 24/8/09 + + Test LPC to LSP conversion and quantisation using Speex LSP quantiser. + +\*---------------------------------------------------------------------------*/ + +/* + 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, 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 . +*/ + +#include +#include +#include +#include +#include +#include + +#define N 160 +#define P 10 + +#define LPC_FLOOR 0.0002 /* autocorrelation floor */ +#define LSP_DELTA1 0.2 /* grid spacing for LSP root searches */ +#define NDFT 256 /* DFT size for SD calculation */ + +/* Speex lag window */ + +const float lag_window[11] = { + 1.00000, 0.99716, 0.98869, 0.97474, 0.95554, 0.93140, 0.90273, 0.86998, + 0.83367, 0.79434, 0.75258 +}; + +/*---------------------------------------------------------------------------*\ + + find_aks_for_lsp() + + This function takes a frame of samples, and determines the linear + prediction coefficients for that frame of samples. Modified version of + find_aks from lpc.c to include autocorrelation noise floor and lag window + to match Speex processing steps prior to LSP conversion. + +\*---------------------------------------------------------------------------*/ + +void find_aks_for_lsp( + float Sn[], /* Nsam samples with order sample memory */ + float a[], /* order+1 LPCs with first coeff 1.0 */ + int Nsam, /* number of input speech samples */ + int order, /* order of the LPC analysis */ + float *E /* residual energy */ +) +{ + float Wn[N]; /* windowed frame of Nsam speech samples */ + float R[P+1]; /* order+1 autocorrelation values of Sn[] */ + int i; + + hanning_window(Sn,Wn,Nsam); + + autocorrelate(Wn,R,Nsam,order); + R[0] += LPC_FLOOR; + assert(order == 10); /* lag window only defined for order == 10 */ + for(i=0; i<=order; i++) + R[i] *= lag_window[i]; + levinson_durbin(R,a,order); + + *E = 0.0; + for(i=0; i<=order; i++) + *E += a[i]*R[i]; + if (*E < 0.0) + *E = 1E-12; +} + +/*---------------------------------------------------------------------------*\ + + MAIN + +\*---------------------------------------------------------------------------*/ + +int main(int argc, char *argv[]) +{ + FILE *fin; /* input speech files */ + short buf[N]; /* buffer of 16 bit speech samples */ + float Sn[P+N]; /* input speech samples */ + float E; + float ak[P+1]; /* LP coeffs */ + float ak_[P+1]; /* quantised LP coeffs */ + float lsp[P]; + float lsp_[P]; /* quantised LSPs */ + int roots; /* number of LSP roots found */ + int frames; /* frames processed so far */ + int i; /* loop variables */ + + SpeexBits bits; + + float sd; /* SD for this frame */ + float totsd; /* accumulated SD so far */ + int gt2,gt4; /* number of frames > 2 and 4 dB SD */ + int unstables; /* number of unstable LSP frames */ + + if (argc < 2) { + printf("usage: %s InputFile\n", argv[0]); + exit(0); + } + + /* Open files */ + + if ((fin = fopen(argv[1],"rb")) == NULL) { + printf("Error opening input file: %s\n",argv[1]); + exit(0); + } + + /* Initialise */ + + frames = 0; + for(i=0; i 2.0) gt2++; + if (sd > 4.0) gt4++; + totsd += sd; + } + else + unstables++; + } + + fclose(fin); + + printf("frames = %d Av sd = %3.2f dB", frames, totsd/frames); + printf(" >2 dB %3.2f%% >4 dB %3.2f%% unstables: %d\n",gt2*100.0/frames, + gt4*100.0/frames, unstables); + + return 0; +} + diff --git a/codec2/tags/0.4.1/unittest/speexnoisesup.c b/codec2/tags/0.4.1/unittest/speexnoisesup.c new file mode 100644 index 00000000..8706fd67 --- /dev/null +++ b/codec2/tags/0.4.1/unittest/speexnoisesup.c @@ -0,0 +1,59 @@ +/*----------------------------------------------------------------------------*\ + + 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 supression. + +\*----------------------------------------------------------------------------*/ + +#include +#include +#include +#include +#include +#include + +#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 (fin == stdin) fflush(stdin); + if (fout == stdout) fflush(stdout); + } + + speex_preprocess_state_destroy(st); + + fclose(fin); + fclose(fout); + + return 0; +} diff --git a/codec2/tags/0.4.1/unittest/t16_8.c b/codec2/tags/0.4.1/unittest/t16_8.c new file mode 100644 index 00000000..34d1f137 --- /dev/null +++ b/codec2/tags/0.4.1/unittest/t16_8.c @@ -0,0 +1,111 @@ +/* + t16_8.c + David Rowe + May 10 2012 + + Unit test for 16 to 8 kHz sample rate conversion functions. I + evaluated output by plotting using Octave and looking for jaggies: + + pl("../unittest/out16.raw",1,3000) + pl("../unittest/out8.raw",1,3000) + + Listening to it also shows up anything nasty: + + $ play -s -2 -r 16000 out16.raw + $ play -s -2 -r 8000 out8.raw + + */ + +#include +#include +#include +#include +#include "codec2_fdmdv.h" + +#define N8 160 /* procssing buffer size at 8 kHz */ +#define N16 (N8*FDMDV_OS) +#define FRAMES 50 +#define TWO_PI 6.283185307 +#define FS 16000 + +#define SINE + +int main() { + float in8k[FDMDV_OS_TAPS_8K + N8]; + float out16k[N16]; + short out16k_short[N16]; + FILE *f16; + + float in16k[FDMDV_OS_TAPS_16K + N16]; + float out8k[N16]; + short out8k_short[N8]; + FILE *f8; + + int i,f,t,t1; + float freq = 800.0; + + f16 = fopen("out16.raw", "wb"); + assert(f16 != NULL); + f8 = fopen("out8.raw", "wb"); + assert(f8 != NULL); + + /* clear filter memories */ + + for(i=0; i +#include +#include +#include +#include "codec2_fdmdv.h" + +#define N8 160 /* procssing buffer size at 8 kHz */ +#define N16 (N8*FDMDV_OS) +#define FRAMES 100 +#define TWO_PI 6.283185307 +#define FS 16000 + +#define SINE + +int main() { + short in8k_short[FDMDV_OS_TAPS_8K + N8]; + short out16k_short[N16]; + FILE *f16; + + short in16k_short[FDMDV_OS_TAPS_16K + N16]; + short out8k_short[N16]; + FILE *f8; + + int i,f,t,t1; + float freq = 800.0; + + f16 = fopen("out16_short.raw", "wb"); + assert(f16 != NULL); + f8 = fopen("out8.raw", "wb"); + assert(f8 != NULL); + + /* clear filter memories */ + + for(i=0; i +#include +#include +#include +#include "codec2_fdmdv.h" + +#define N8 160 /* procssing buffer size at 8 kHz */ +#define N48 (N8*FDMDV_OS) +#define MEM8 (FDMDV_OS_TAPS/FDMDV_OS) +#define FRAMES 50 +#define TWO_PI 6.283185307 +#define FS 8000 + +#define SINE + +int main() { + float in8k[MEM8 + N8]; + float out48k[N48]; + short out48k_short[N48]; + FILE *f48; + + float in48k[FDMDV_OS_TAPS + N48]; + float out8k[N48]; + short out8k_short[N8]; + FILE *f8; + + int i,f,t,t1; + float freq = 800.0; + + f48 = fopen("out48.raw", "wb"); + assert(f48 != NULL); + f8 = fopen("out8.raw", "wb"); + assert(f8 != NULL); + + /* clear filter memories */ + + for(i=0; i. +*/ + +#include +#include +#include +#include +#include +#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; iprev_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/codec2/tags/0.4.1/unittest/tcohpsk.c b/codec2/tags/0.4.1/unittest/tcohpsk.c new file mode 100644 index 00000000..d92e98dc --- /dev/null +++ b/codec2/tags/0.4.1/unittest/tcohpsk.c @@ -0,0 +1,286 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: tcohpsk.c + AUTHOR......: David Rowe + DATE CREATED: March 2015 + + Tests for the C version of the coherent PSK FDM modem. This program + outputs a file of Octave vectors that are loaded and automatically + tested against the Octave version of the modem by the Octave script + tcohpsk.m + +\*---------------------------------------------------------------------------*/ + +/* + 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, 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 . +*/ + +#include +#include +#include +#include +#include + +#include "fdmdv_internal.h" +#include "codec2_fdmdv.h" +#include "codec2_cohpsk.h" +#include "cohpsk_defs.h" +#include "cohpsk_internal.h" +#include "octave.h" +#include "comp_prim.h" +#include "noise_samples.h" + +#define FRAMES 100 /* LOG_FRAMES is #defined in cohpsk_internal.h */ +#define SYNC_FRAMES 12 /* sync state uses up extra log storage as we reprocess several times */ +#define FRAMESL (SYNC_FRAMES*FRAMES) /* worst case is every frame is out of sync */ + +#define FOFF 58.7 +#define DFOFF (-0.5/(float)COHPSK_FS) +#define ESNODB 8 +#define PPM -1500 + +extern float pilots_coh[][PILOTS_NC]; + +int main(int argc, char *argv[]) +{ + struct COHPSK *coh; + int tx_bits[COHPSK_BITS_PER_FRAME]; + COMP tx_symb[NSYMROWPILOT][COHPSK_NC*ND]; + COMP tx_fdm_frame[COHPSK_M*NSYMROWPILOT]; + COMP ch_fdm_frame[COHPSK_M*NSYMROWPILOT]; + //COMP rx_fdm_frame_bb[M*NSYMROWPILOT]; + //COMP ch_symb[NSYMROWPILOT][COHPSK_NC*ND]; + float rx_bits_sd[COHPSK_BITS_PER_FRAME]; + int rx_bits[COHPSK_BITS_PER_FRAME]; + + int tx_bits_log[COHPSK_BITS_PER_FRAME*FRAMES]; + COMP tx_symb_log[NSYMROWPILOT*FRAMES][COHPSK_NC*ND]; + COMP tx_fdm_frame_log[COHPSK_M*NSYMROWPILOT*FRAMES]; + COMP ch_fdm_frame_log[COHPSK_M*NSYMROWPILOT*FRAMES]; + COMP ch_fdm_frame_log_out[(COHPSK_M*NSYMROWPILOT+1)*FRAMES]; + //COMP rx_fdm_frame_bb_log[M*NSYMROWPILOT*FRAMES]; + //COMP ch_symb_log[NSYMROWPILOT*FRAMES][COHPSK_NC*ND]; + COMP ct_symb_ff_log[NSYMROWPILOT*FRAMES][COHPSK_NC*ND]; + float rx_amp_log[NSYMROW*FRAMES][COHPSK_NC*ND]; + float rx_phi_log[NSYMROW*FRAMES][COHPSK_NC*ND]; + COMP rx_symb_log[NSYMROW*FRAMES][COHPSK_NC*ND]; + int rx_bits_log[COHPSK_BITS_PER_FRAME*FRAMES]; + + FILE *fout; + int f, r, c, log_r, log_data_r, noise_r, ff_log_r, i; + double foff; + COMP foff_rect, phase_ch; + + struct FDMDV *fdmdv; + //COMP rx_filt[COHPSK_NC*ND][P+1]; + //int rx_filt_log_col_index = 0; + //float env[NT*P]; + //float __attribute__((unused)) rx_timing; + COMP tx_onesym[COHPSK_NC*ND]; + //COMP rx_onesym[COHPSK_NC*ND]; + //int rx_baseband_log_col_index = 0; + //COMP rx_baseband_log[COHPSK_NC*ND][(M+M/P)*NSYMROWPILOT*FRAMES]; + float f_est_log[FRAMES], sig_rms_log[FRAMES], noise_rms_log[FRAMES]; + int f_est_samples; + + int log_bits; + float EsNo, variance; + COMP scaled_noise; + int reliable_sync_bit; + int ch_fdm_frame_log_index, nin_frame, tmp, nout; + + coh = cohpsk_create(); + fdmdv = coh->fdmdv; + assert(coh != NULL); + cohpsk_set_verbose(coh, 1); + + /* these puppies are used for logging data in the bowels on the modem */ + + coh->rx_baseband_log_col_sz = (COHPSK_M+COHPSK_M/P)*NSYMROWPILOT*FRAMESL; + coh->rx_baseband_log = (COMP *)malloc(sizeof(COMP)*COHPSK_NC*ND*coh->rx_baseband_log_col_sz); + + coh->rx_filt_log_col_sz = (P+1)*NSYMROWPILOT*FRAMESL; + coh->rx_filt_log = (COMP *)malloc(sizeof(COMP)*COHPSK_NC*ND*coh->rx_filt_log_col_sz); + + coh->ch_symb_log_col_sz = COHPSK_NC*ND; + coh->ch_symb_log = (COMP *)malloc(sizeof(COMP)*NSYMROWPILOT*FRAMESL*coh->ch_symb_log_col_sz); + + coh->rx_timing_log = (float*)malloc(sizeof(float)*NSYMROWPILOT*FRAMESL); + + /* init stuff */ + + log_r = log_data_r = noise_r = log_bits = ff_log_r = f_est_samples = 0; + phase_ch.real = 1.0; phase_ch.imag = 0.0; + foff = FOFF; + + /* each carrier has power = 2, total power 2Nc, total symbol rate + NcRs, noise BW B=Fs Es/No = (C/Rs)/(N/B), N = var = + 2NcFs/NcRs(Es/No) = 2Fs/Rs(Es/No) */ + + EsNo = pow(10.0, ESNODB/10.0); + variance = 2.0*COHPSK_FS/(COHPSK_RS*EsNo); + //fprintf(stderr, "doff: %e\n", DFOFF); + + /* Main Loop ---------------------------------------------------------------------*/ + + for(f=0; ftx_filter_memory, + fdmdv->phase_tx, fdmdv->freq, &fdmdv->fbb_phase_tx, fdmdv->fbb_rect); + } + cohpsk_clip(tx_fdm_frame); + + /* --------------------------------------------------------*\ + Channel + \*---------------------------------------------------------*/ + + for(r=0; rframe = f; + + //printf("nin_frame: %d\n", nin_frame); + + assert(ch_fdm_frame_log_index < COHPSK_M*NSYMROWPILOT*FRAMES); + tmp = nin_frame; + cohpsk_demod(coh, rx_bits_sd, &reliable_sync_bit, &ch_fdm_frame_log_out[ch_fdm_frame_log_index], &nin_frame); + for(i=0; isync == 1) { + + for(r=0; rct_symb_ff_buf[r][c]; + } + } + + for(r=0; ramp_[r][c]; + rx_phi_log[log_data_r][c] = coh->phi_[r][c]; + rx_symb_log[log_data_r][c] = coh->rx_symb[r][c]; + } + } + memcpy(&rx_bits_log[COHPSK_BITS_PER_FRAME*log_bits], rx_bits, sizeof(int)*COHPSK_BITS_PER_FRAME); + log_bits++; + f_est_log[f_est_samples] = coh->f_est; + sig_rms_log[f_est_samples] = coh->sig_rms; + noise_rms_log[f_est_samples] = coh->noise_rms; + f_est_samples++;; + } + + assert(log_r <= NSYMROWPILOT*FRAMES); + assert(noise_r <= NSYMROWPILOT*COHPSK_M*FRAMES); + assert(log_data_r <= NSYMROW*FRAMES); + + printf("\r [%d]", f+1); + } + printf("\n"); + + /*---------------------------------------------------------*\ + Dump logs to Octave file for evaluation + by tcohpsk.m Octave script + \*---------------------------------------------------------*/ + + fout = fopen("tcohpsk_out.txt","wt"); + assert(fout != NULL); + fprintf(fout, "# Created by tcohpsk.c\n"); + octave_save_int(fout, "tx_bits_log_c", tx_bits_log, 1, COHPSK_BITS_PER_FRAME*FRAMES); + octave_save_complex(fout, "tx_symb_log_c", (COMP*)tx_symb_log, NSYMROWPILOT*FRAMES, COHPSK_NC*ND, COHPSK_NC*ND); + octave_save_complex(fout, "tx_fdm_frame_log_c", (COMP*)tx_fdm_frame_log, 1, COHPSK_M*NSYMROWPILOT*FRAMES, COHPSK_M*NSYMROWPILOT*FRAMES); + octave_save_complex(fout, "ch_fdm_frame_log_c", (COMP*)ch_fdm_frame_log_out, 1, nout-1, nout-1); + //octave_save_complex(fout, "rx_fdm_frame_bb_log_c", (COMP*)rx_fdm_frame_bb_log, 1, M*NSYMROWPILOT*FRAMES, M*NSYMROWPILOT*FRAMES); + octave_save_complex(fout, "rx_baseband_log_c", (COMP*)coh->rx_baseband_log, COHPSK_NC*ND, coh->rx_baseband_log_col_index, coh->rx_baseband_log_col_sz); + octave_save_complex(fout, "rx_filt_log_c", (COMP*)coh->rx_filt_log, COHPSK_NC*ND, coh->rx_filt_log_col_index, coh->rx_filt_log_col_sz); + octave_save_complex(fout, "ch_symb_log_c", (COMP*)coh->ch_symb_log, coh->ch_symb_log_r, COHPSK_NC*ND, COHPSK_NC*ND); + octave_save_float(fout, "rx_timing_log_c", (float*)coh->rx_timing_log, 1, coh->rx_timing_log_index, coh->rx_timing_log_index); + octave_save_complex(fout, "ct_symb_ff_log_c", (COMP*)ct_symb_ff_log, NSYMROWPILOT*FRAMES, COHPSK_NC*ND, COHPSK_NC*ND); + octave_save_float(fout, "rx_amp_log_c", (float*)rx_amp_log, log_data_r, COHPSK_NC*ND, COHPSK_NC*ND); + octave_save_float(fout, "rx_phi_log_c", (float*)rx_phi_log, log_data_r, COHPSK_NC*ND, COHPSK_NC*ND); + octave_save_complex(fout, "rx_symb_log_c", (COMP*)rx_symb_log, log_data_r, COHPSK_NC*ND, COHPSK_NC*ND); + octave_save_int(fout, "rx_bits_log_c", rx_bits_log, 1, COHPSK_BITS_PER_FRAME*log_bits); + octave_save_float(fout, "f_est_log_c", &f_est_log[1], 1, f_est_samples-1, f_est_samples-1); + octave_save_float(fout, "sig_rms_log_c", sig_rms_log, 1, f_est_samples, f_est_samples-1); + octave_save_float(fout, "noise_rms_log_c", noise_rms_log, 1, f_est_samples, f_est_samples); +#ifdef XX +#endif + fclose(fout); + + cohpsk_destroy(coh); + + return 0; +} + diff --git a/codec2/tags/0.4.1/unittest/tcontphase.c b/codec2/tags/0.4.1/unittest/tcontphase.c new file mode 100644 index 00000000..6761bac8 --- /dev/null +++ b/codec2/tags/0.4.1/unittest/tcontphase.c @@ -0,0 +1,186 @@ +/*---------------------------------------------------------------------------*\ + + 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, 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 . +*/ + +#define N 80 /* frame size */ +#define F 160 /* frames to synthesis */ +#define P 10 /* LPC order */ + +#include +#include +#include +#include +#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. +*/ + +#include +#include +#include +#include +#include + +#include "codec2_cohpsk.h" +#include "octave.h" +#include "comp_prim.h" +#include "noise_samples.h" +#include "cohpsk_defs.h" +#include "cohpsk_internal.h" + +#define FRAMES 100 +#define SYNC_FRAMES 12 /* sync state uses up extra log storage as we reprocess several times */ + +/* defaults with no arguments */ + +#define FOFF_HZ 0.0 +#define ES_NO_DB 8.0 +#define HF_DELAY_MS 2.0 + +#define CH_BUF_SZ (4*COHPSK_NOM_SAMPLES_PER_FRAME) + +/* This file gets generated using the function write_noise_file in tcohpsk.m. You have to run + tcohpsk first (any variant) to load the function into Octave, e.g.: + + octave:17> tcohpsk + octave:18> write_noise_file("../raw/fast_fading_samples.float", 7500, 7500*60) + octave:19> write_noise_file("../raw/slow_fading_samples.float", 75000, 7500*60) +*/ + +#define FADING_FILE_NAME "../../raw/fading_samples.float" + +int main(int argc, char *argv[]) +{ + struct COHPSK *coh; + int tx_bits[COHPSK_BITS_PER_FRAME]; + COMP tx_fdm[COHPSK_NOM_SAMPLES_PER_FRAME]; + COMP ch_fdm[COHPSK_NOM_SAMPLES_PER_FRAME]; + COMP ch_buf[CH_BUF_SZ]; + float rx_bits_sd[COHPSK_BITS_PER_FRAME]; + float *rx_amp_log; + float *rx_phi_log; + COMP *rx_symb_log; + + int f, r, i; + COMP phase_ch; + int noise_r, noise_end; + int bit_errors; + int state, nerrors, nbits, reliable_sync_bit; + float EsNo, variance; + COMP scaled_noise; + float EsNodB, foff_hz; + int fading_en, nhfdelay, ret, nin_frame, frames, framesl; + float hf_gain; + COMP *ch_fdm_delay, aspread, aspread_2ms, delayed, direct; + FILE *ffading, *fout; + int ch_buf_n; + float tx_pwr, rx_pwr, noise_pwr; + short error_pattern[COHPSK_BITS_PER_FRAME]; + int log_data_r, c, j, tmp; + + EsNodB = ES_NO_DB; + foff_hz = FOFF_HZ; + fading_en = 0; + frames = FRAMES; + if (argc == 5) { + EsNodB = atof(argv[1]); + foff_hz = atof(argv[2]); + fading_en = atoi(argv[3]); + frames = atoi(argv[4]); + } + fprintf(stderr, "EsNodB: %4.2f foff: %4.2f Hz fading: %d\n", EsNodB, foff_hz, fading_en); + + coh = cohpsk_create(); + assert(coh != NULL); + + framesl = SYNC_FRAMES*frames; + coh->ch_symb_log_col_sz = COHPSK_NC*ND; + coh->ch_symb_log = (COMP *)malloc(sizeof(COMP)*NSYMROWPILOT*framesl*coh->ch_symb_log_col_sz); + assert(coh->ch_symb_log != NULL); + + rx_amp_log = (float *)malloc(sizeof(float)*frames*NSYMROW*COHPSK_NC*ND); + assert(rx_amp_log != NULL); + rx_phi_log = (float *)malloc(sizeof(float)*frames*NSYMROW*COHPSK_NC*ND); + assert(rx_phi_log != NULL); + rx_symb_log = (COMP *)malloc(sizeof(COMP)*frames*NSYMROW*COHPSK_NC*ND); + assert(rx_symb_log != NULL); + + phase_ch.real = 1.0; phase_ch.imag = 0.0; + noise_r = 0; + noise_end = sizeof(noise)/sizeof(COMP); + ch_buf_n = 0; + + log_data_r = 0; + + /* each carrier has power = 2, total power 2Nc, total symbol rate + NcRs, noise BW B=Fs Es/No = (C/Rs)/(N/B), N = var = + 2NcFs/NcRs(Es/No) = 2Fs/Rs(Es/No) */ + + EsNo = pow(10.0, EsNodB/10.0); + variance = 2.0*COHPSK_FS/(COHPSK_RS*EsNo); + + tx_pwr = rx_pwr = noise_pwr = 0.0; + + /* init HF fading model */ + + if (fading_en) { + ffading = fopen(FADING_FILE_NAME, "rb"); + if (ffading == NULL) { + printf("Can't find fading file: %s\n", FADING_FILE_NAME); + exit(1); + } + nhfdelay = floor(HF_DELAY_MS*COHPSK_FS/1000); + ch_fdm_delay = (COMP*)malloc((nhfdelay+COHPSK_NOM_SAMPLES_PER_FRAME)*sizeof(COMP)); + assert(ch_fdm_delay != NULL); + for(i=0; i noise_end) { + noise_r = 0; + //fprintf(stderr, " [%d] noise wrap\n", f); + } + + } + + /* buffer so we can let demod Fs offset code do it's thing */ + + memcpy(&ch_buf[ch_buf_n], ch_fdm, sizeof(COMP)*COHPSK_NOM_SAMPLES_PER_FRAME); + ch_buf_n += COHPSK_NOM_SAMPLES_PER_FRAME; + assert(ch_buf_n < CH_BUF_SZ); + + /* --------------------------------------------------------*\ + Demod + \*---------------------------------------------------------*/ + + coh->frame = f; + tmp = nin_frame; + cohpsk_demod(coh, rx_bits_sd, &reliable_sync_bit, ch_buf, &tmp); + + ch_buf_n -= nin_frame; + //printf("nin_frame: %d tmp: %d ch_buf_n: %d\n", nin_frame, tmp, ch_buf_n); + assert(ch_buf_n >= 0); + if (ch_buf_n) + memcpy(ch_buf, &ch_buf[nin_frame], sizeof(COMP)*ch_buf_n); + nin_frame = tmp; + + cohpsk_put_test_bits(coh, &state, error_pattern, &bit_errors, rx_bits_sd); + nerrors += bit_errors; + nbits += COHPSK_BITS_PER_FRAME; + + if (state) { + for(r=0; ramp_[r][c]; + rx_phi_log[log_data_r*COHPSK_NC*ND+c] = coh->phi_[r][c]; + rx_symb_log[log_data_r*COHPSK_NC*ND+c] = coh->rx_symb[r][c]; + } + } + } + + } + + printf("%4.3f %d %d\n", (float)nerrors/nbits, nbits, nerrors); + printf("tx var: %f noise var: %f rx var: %f\n", + tx_pwr/(frames*COHPSK_NOM_SAMPLES_PER_FRAME), + noise_pwr/(frames*COHPSK_NOM_SAMPLES_PER_FRAME), + rx_pwr/(frames*COHPSK_NOM_SAMPLES_PER_FRAME) + ); + if (fading_en) { + free(ch_fdm_delay); + fclose(ffading); + } + cohpsk_destroy(coh); + + fout = fopen("test_cohpsk_ch_out.txt","wt"); + octave_save_complex(fout, "ch_symb_log_c", (COMP*)coh->ch_symb_log, coh->ch_symb_log_r, COHPSK_NC*ND, COHPSK_NC*ND); + octave_save_float(fout, "rx_amp_log_c", (float*)rx_amp_log, log_data_r, COHPSK_NC*ND, COHPSK_NC*ND); + octave_save_float(fout, "rx_phi_log_c", (float*)rx_phi_log, log_data_r, COHPSK_NC*ND, COHPSK_NC*ND); + octave_save_complex(fout, "rx_symb_log_c", (COMP*)rx_symb_log, log_data_r, COHPSK_NC*ND, COHPSK_NC*ND); + fclose(fout); + + return 0; +} + diff --git a/codec2/tags/0.4.1/unittest/tfdmdv.c b/codec2/tags/0.4.1/unittest/tfdmdv.c new file mode 100644 index 00000000..cd2513c7 --- /dev/null +++ b/codec2/tags/0.4.1/unittest/tfdmdv.c @@ -0,0 +1,291 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: tfdmdv.c + AUTHOR......: David Rowe + DATE CREATED: April 16 2012 + + Tests for the C version of the FDMDV modem. This program outputs a + file of Octave vectors that are loaded and automatically tested + against the Octave version of the modem by the Octave script + tfmddv.m + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2012 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, 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 . +*/ + +#include +#include +#include +#include +#include + +#include "fdmdv_internal.h" +#include "codec2_fdmdv.h" +#include "octave.h" + +#define FRAMES 35 +#define CHANNEL_BUF_SIZE (10*M) + +extern float pilot_coeff[]; + +int main(int argc, char *argv[]) +{ + struct FDMDV *fdmdv; + int tx_bits[FDMDV_BITS_PER_FRAME]; + COMP tx_symbols[FDMDV_NC+1]; + COMP tx_fdm[M]; + float channel[CHANNEL_BUF_SIZE]; + int channel_count; + COMP rx_fdm[M+M/P]; + float foff_coarse; + int nin, next_nin; + COMP rx_fdm_fcorr[M+M/P]; + COMP rx_fdm_filter[M+M/P]; + COMP rx_baseband[NC+1][M+M/P]; + COMP rx_filt[NC+1][P+1]; + float rx_timing; + float env[NT*P]; + COMP rx_symbols[FDMDV_NC+1]; + int rx_bits[FDMDV_BITS_PER_FRAME]; + float foff_fine; + int sync_bit, reliable_sync_bit; + + int tx_bits_log[FDMDV_BITS_PER_FRAME*FRAMES]; + COMP tx_symbols_log[(FDMDV_NC+1)*FRAMES]; + COMP tx_fdm_log[M*FRAMES]; + COMP pilot_baseband1_log[NPILOTBASEBAND*FRAMES]; + COMP pilot_baseband2_log[NPILOTBASEBAND*FRAMES]; + COMP pilot_lpf1_log[NPILOTLPF*FRAMES]; + COMP pilot_lpf2_log[NPILOTLPF*FRAMES]; + COMP S1_log[MPILOTFFT*FRAMES]; + COMP S2_log[MPILOTFFT*FRAMES]; + float foff_coarse_log[FRAMES]; + float foff_log[FRAMES]; + COMP rx_baseband_log[(NC+1)][(M+M/P)*FRAMES]; + int rx_baseband_log_col_index; + COMP rx_filt_log[NC+1][(P+1)*FRAMES]; + int rx_filt_log_col_index; + float env_log[NT*P*FRAMES]; + float rx_timing_log[FRAMES]; + COMP rx_symbols_log[FDMDV_NC+1][FRAMES]; + COMP phase_difference_log[FDMDV_NC+1][FRAMES]; + float sig_est_log[FDMDV_NC+1][FRAMES]; + float noise_est_log[FDMDV_NC+1][FRAMES]; + int rx_bits_log[FDMDV_BITS_PER_FRAME*FRAMES]; + float foff_fine_log[FRAMES]; + int sync_bit_log[FRAMES]; + int sync_log[FRAMES]; + int nin_log[FRAMES]; + + FILE *fout; + int f,c,i,j; + + fdmdv = fdmdv_create(FDMDV_NC); + next_nin = M; + channel_count = 0; + + rx_baseband_log_col_index = 0; + rx_filt_log_col_index = 0; + + printf("sizeof FDMDV states: %d bytes\n", sizeof(struct FDMDV)); + + for(f=0; fprev_tx_symbols, tx_bits, &fdmdv->tx_pilot_bit, 0); + memcpy(fdmdv->prev_tx_symbols, tx_symbols, sizeof(COMP)*(FDMDV_NC+1)); + tx_filter_and_upconvert(tx_fdm, FDMDV_NC , tx_symbols, fdmdv->tx_filter_memory, + fdmdv->phase_tx, fdmdv->freq, &fdmdv->fbb_phase_tx, fdmdv->fbb_rect); + + /* --------------------------------------------------------*\ + Channel + \*---------------------------------------------------------*/ + + nin = next_nin; + + //nin = M; // when debugging good idea to uncomment this to "open loop" + + /* add M tx samples to end of buffer */ + + assert((channel_count + M) < CHANNEL_BUF_SIZE); + for(i=0; ifbb_phase_rx, nin); + + /* freq offset estimation and correction */ + + //fdmdv->sync = 0; // when debugging good idea to uncomment this to "open loop" + + foff_coarse = rx_est_freq_offset(fdmdv, rx_fdm, nin, !fdmdv->sync); + + if (fdmdv->sync == 0) + fdmdv->foff = foff_coarse; + fdmdv_freq_shift(rx_fdm_fcorr, rx_fdm, -fdmdv->foff, &fdmdv->foff_phase_rect, nin); + + /* baseband processing */ + + rxdec_filter(rx_fdm_filter, rx_fdm_fcorr, fdmdv->rxdec_lpf_mem, nin); + down_convert_and_rx_filter(rx_filt, fdmdv->Nc, rx_fdm_filter, fdmdv->rx_fdm_mem, fdmdv->phase_rx, fdmdv->freq, + fdmdv->freq_pol, nin, M/Q); + rx_timing = rx_est_timing(rx_symbols, FDMDV_NC, rx_filt, fdmdv->rx_filter_mem_timing, env, nin, M); + foff_fine = qpsk_to_bits(rx_bits, &sync_bit, FDMDV_NC, fdmdv->phase_difference, fdmdv->prev_rx_symbols, rx_symbols, 0); + + //for(i=0; iprev_rx_symbols[i].real, fdmdv->prev_rx_symbols[i].imag, fdmdv->phase_difference[i].real, fdmdv->phase_difference[i].imag); + //if (f==1) + // exit(0); + + snr_update(fdmdv->sig_est, fdmdv->noise_est, FDMDV_NC, fdmdv->phase_difference); + memcpy(fdmdv->prev_rx_symbols, rx_symbols, sizeof(COMP)*(FDMDV_NC+1)); + + next_nin = M; + + if (rx_timing > 2*M/P) + next_nin += M/P; + + if (rx_timing < 0) + next_nin -= M/P; + + fdmdv->sync = freq_state(&reliable_sync_bit, sync_bit, &fdmdv->fest_state, &fdmdv->timer, fdmdv->sync_mem); + fdmdv->foff -= TRACK_COEFF*foff_fine; + + /* --------------------------------------------------------*\ + Log each vector + \*---------------------------------------------------------*/ + + memcpy(&tx_bits_log[FDMDV_BITS_PER_FRAME*f], tx_bits, sizeof(int)*FDMDV_BITS_PER_FRAME); + memcpy(&tx_symbols_log[(FDMDV_NC+1)*f], tx_symbols, sizeof(COMP)*(FDMDV_NC+1)); + memcpy(&tx_fdm_log[M*f], tx_fdm, sizeof(COMP)*M); + + memcpy(&pilot_baseband1_log[f*NPILOTBASEBAND], fdmdv->pilot_baseband1, sizeof(COMP)*NPILOTBASEBAND); + memcpy(&pilot_baseband2_log[f*NPILOTBASEBAND], fdmdv->pilot_baseband2, sizeof(COMP)*NPILOTBASEBAND); + memcpy(&pilot_lpf1_log[f*NPILOTLPF], fdmdv->pilot_lpf1, sizeof(COMP)*NPILOTLPF); + memcpy(&pilot_lpf2_log[f*NPILOTLPF], fdmdv->pilot_lpf2, sizeof(COMP)*NPILOTLPF); + memcpy(&S1_log[f*MPILOTFFT], fdmdv->S1, sizeof(COMP)*MPILOTFFT); + memcpy(&S2_log[f*MPILOTFFT], fdmdv->S2, sizeof(COMP)*MPILOTFFT); + foff_coarse_log[f] = foff_coarse; + foff_log[f] = fdmdv->foff; + + /* rx down conversion */ + + for(c=0; cphase_difference[c]; + } + + /* qpsk_to_bits() */ + + memcpy(&rx_bits_log[FDMDV_BITS_PER_FRAME*f], rx_bits, sizeof(int)*FDMDV_BITS_PER_FRAME); + for(c=0; csig_est[c]; + noise_est_log[c][f] = fdmdv->noise_est[c]; + } + foff_fine_log[f] = foff_fine; + sync_bit_log[f] = sync_bit; + + sync_log[f] = fdmdv->sync; + } + + + /*---------------------------------------------------------*\ + Dump logs to Octave file for evaluation + by tfdmdv.m Octave script + \*---------------------------------------------------------*/ + + fout = fopen("tfdmdv_out.txt","wt"); + assert(fout != NULL); + fprintf(fout, "# Created by tfdmdv.c\n"); + octave_save_int(fout, "tx_bits_log_c", tx_bits_log, 1, FDMDV_BITS_PER_FRAME*FRAMES); + octave_save_complex(fout, "tx_symbols_log_c", tx_symbols_log, 1, (FDMDV_NC+1)*FRAMES, (FDMDV_NC+1)*FRAMES); + octave_save_complex(fout, "tx_fdm_log_c", (COMP*)tx_fdm_log, 1, M*FRAMES, M*FRAMES); + octave_save_complex(fout, "pilot_lut_c", (COMP*)fdmdv->pilot_lut, 1, NPILOT_LUT, NPILOT_LUT); + octave_save_complex(fout, "pilot_baseband1_log_c", pilot_baseband1_log, 1, NPILOTBASEBAND*FRAMES, NPILOTBASEBAND*FRAMES); + octave_save_complex(fout, "pilot_baseband2_log_c", pilot_baseband2_log, 1, NPILOTBASEBAND*FRAMES, NPILOTBASEBAND*FRAMES); + octave_save_float(fout, "pilot_coeff_c", pilot_coeff, 1, NPILOTCOEFF, NPILOTCOEFF); + octave_save_complex(fout, "pilot_lpf1_log_c", pilot_lpf1_log, 1, NPILOTLPF*FRAMES, NPILOTLPF*FRAMES); + octave_save_complex(fout, "pilot_lpf2_log_c", pilot_lpf2_log, 1, NPILOTLPF*FRAMES, NPILOTLPF*FRAMES); + octave_save_complex(fout, "S1_log_c", S1_log, 1, MPILOTFFT*FRAMES, MPILOTFFT*FRAMES); + octave_save_complex(fout, "S2_log_c", S2_log, 1, MPILOTFFT*FRAMES, MPILOTFFT*FRAMES); + octave_save_float(fout, "foff_log_c", foff_log, 1, FRAMES, FRAMES); + octave_save_float(fout, "foff_coarse_log_c", foff_coarse_log, 1, FRAMES, FRAMES); + octave_save_complex(fout, "rx_baseband_log_c", (COMP*)rx_baseband_log, (FDMDV_NC+1), rx_baseband_log_col_index, (M+M/P)*FRAMES); + octave_save_complex(fout, "rx_filt_log_c", (COMP*)rx_filt_log, (FDMDV_NC+1), rx_filt_log_col_index, (P+1)*FRAMES); + octave_save_float(fout, "env_log_c", env_log, 1, NT*P*FRAMES, NT*P*FRAMES); + octave_save_float(fout, "rx_timing_log_c", rx_timing_log, 1, FRAMES, FRAMES); + octave_save_complex(fout, "rx_symbols_log_c", (COMP*)rx_symbols_log, (FDMDV_NC+1), FRAMES, FRAMES); + octave_save_complex(fout, "phase_difference_log_c", (COMP*)phase_difference_log, (FDMDV_NC+1), FRAMES, FRAMES); + octave_save_float(fout, "sig_est_log_c", (float*)sig_est_log, (FDMDV_NC+1), FRAMES, FRAMES); + octave_save_float(fout, "noise_est_log_c", (float*)noise_est_log, (FDMDV_NC+1), FRAMES, FRAMES); + octave_save_int(fout, "rx_bits_log_c", rx_bits_log, 1, FDMDV_BITS_PER_FRAME*FRAMES); + octave_save_float(fout, "foff_fine_log_c", foff_fine_log, 1, FRAMES, FRAMES); + octave_save_int(fout, "sync_bit_log_c", sync_bit_log, 1, FRAMES); + octave_save_int(fout, "sync_log_c", sync_log, 1, FRAMES); + octave_save_int(fout, "nin_log_c", nin_log, 1, FRAMES); + fclose(fout); + + fdmdv_destroy(fdmdv); + + return 0; +} + diff --git a/codec2/tags/0.4.1/unittest/tfifo.c b/codec2/tags/0.4.1/unittest/tfifo.c new file mode 100644 index 00000000..12e0d2b6 --- /dev/null +++ b/codec2/tags/0.4.1/unittest/tfifo.c @@ -0,0 +1,103 @@ +/* + tfifo.c + David Rowe + Nov 19 2012 + + Takes FIFOs, in particular thread safety. +*/ + +#include +#include +#include +#include "codec2_fifo.h" + +#define FIFO_SZ 1024 +#define WRITE_SZ 10 +#define READ_SZ 8 +#define N_MAX 100 +#define LOOPS 1000000 + +int run_thread = 1; +struct FIFO *f; + +void writer(void); +void *writer_thread(void *data); +pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; + +#define USE_THREADS +//#define USE_MUTEX + +int main() { + pthread_t awriter_thread; + int i,j; + short read_buf[READ_SZ]; + int n_out = 0; + int sucess; + + f = fifo_create(FIFO_SZ); + #ifdef USE_THREADS + pthread_create(&awriter_thread, NULL, writer_thread, NULL); + #endif + + for(i=0; i WRITE_SZ) { + for(i=0; i. +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#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; iWo); + 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/codec2/tags/0.4.1/unittest/tlspsens.c b/codec2/tags/0.4.1/unittest/tlspsens.c new file mode 100644 index 00000000..4200d570 --- /dev/null +++ b/codec2/tags/0.4.1/unittest/tlspsens.c @@ -0,0 +1,128 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: tlspsens.c + AUTHOR......: David Rowe + DATE CREATED: 31 May 2012 + + Testing bit error sensitivity of LSP bits, first step in devising an unequal + error protection scheme. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2012 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, 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 . +*/ + +#include +#include +#include +#include +#include +#include "defines.h" +#include "comp.h" +#include "codec2.h" +#include "quantise.h" +#include "interp.h" +#include "codec2_internal.h" + +float run_a_test(char raw_file_name[], int bit_to_corrupt) +{ + FILE *fin; + short buf[N]; + struct CODEC2 *c2; + kiss_fft_cfg fft_fwd_cfg; + MODEL model; + float ak[LPC_ORD+1]; + float lsps[LPC_ORD], e; + int lsp_indexes[LPC_ORD], found_bit; + float snr, snr_sum; + int frames, i, mask, index; + COMP Aw[FFT_ENC]; + + c2 = codec2_create(CODEC2_MODE_2400); + fft_fwd_cfg = kiss_fft_alloc(FFT_ENC, 0, NULL, NULL); + + fin = fopen(raw_file_name, "rb"); + assert(fin != NULL); + + /* find bit we are corrupting */ + + found_bit = 0; + for(i=0; i lsp_bits(i)) + bit_to_corrupt -= lsp_bits(i); + else { + index = i; + mask = (1 << bit_to_corrupt); + printf(" index: %d bit: %d mask: 0x%x ", index, bit_to_corrupt, mask); + found_bit = 1; + } + } + } + assert(found_bit == 1); + + /* OK test a sample file, flipping bit */ + + snr_sum = 0.0; + frames = 0; + while(fread(buf, sizeof(short), N, fin) == N) { + analyse_one_frame(c2, &model, buf); + e = speech_to_uq_lsps(lsps, ak, c2->Sn, c2->w, LPC_ORD); + encode_lsps_scalar(lsp_indexes, lsps, LPC_ORD); + + /* find and flip bit we are testing */ + + lsp_indexes[index] ^= mask; + + /* decode LSPs and measure SNR */ + + decode_lsps_scalar(lsps, lsp_indexes, LPC_ORD); + check_lsp_order(lsps, LPC_ORD); + bw_expand_lsps(lsps, LPC_ORD, 50.0, 100.0); + lsp_to_lpc(lsps, ak, LPC_ORD); + aks_to_M2(fft_fwd_cfg, ak, LPC_ORD, &model, e, &snr, 0, 0, 1, 1, LPCPF_BETA, LPCPF_GAMMA, Aw); + snr_sum += snr; + frames++; + } + + codec2_destroy(c2); + + fclose(fin); + + return snr_sum/frames; +} + +int main(int argc, char *argv[]) { + int i; + int total_lsp_bits = 0; + float snr; + + if (argc != 2) { + printf("usage: %s RawFile\n", argv[0]); + exit(1); + } + + for(i=0; i. +*/ + +#define N 80 /* frame size */ +#define M 320 /* pitch analysis window size */ +#define PITCH_MIN 20 +#define PITCH_MAX 160 +#define TNLP + +#include +#include +#include +#include + +#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 +#include +#include +#include +#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. +*/ + +#include +#include +#include +#include +#include + +#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 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 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 (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/codec2/tags/0.4.1/unittest/tsrc.c b/codec2/tags/0.4.1/unittest/tsrc.c new file mode 100644 index 00000000..0c2c604a --- /dev/null +++ b/codec2/tags/0.4.1/unittest/tsrc.c @@ -0,0 +1,64 @@ +/* + tsrc.c + David Rowe + Sat Nov 3 2012 + + Unit test for libresample code. + + */ + +#include +#include +#include +#include +#include + +#define N8 160 /* processing buffer size at 8 kHz */ +#define N48 ((int)N8*(48000/8000)) /* buf size assuming 48k max sample rate */ + +int main(int argc, char *argv[]) { + FILE *f8k, *fout; + short in8k_short[N8]; + float in8k[N8]; + float out[N48]; + short out_short[N48]; + SRC_STATE *src; + SRC_DATA data; + int error; + + if (argc != 4) { + printf("usage %s inputRawFile OutputRawFile OutputSamplerate\n", argv[0]); + exit(0); + } + + f8k = fopen(argv[1], "rb"); + assert(f8k != NULL); + + fout = fopen(argv[2], "wb"); + assert(fout != NULL); + + src = src_new(SRC_SINC_FASTEST, 1, &error); + assert(src != NULL); + + data.data_in = in8k; + data.data_out = out; + data.input_frames = N8; + data.output_frames = N48; + data.end_of_input = 0; + data.src_ratio = atof(argv[3])/8000; + printf("%f\n", data.src_ratio); + + while(fread(in8k_short, sizeof(short), N8, f8k) == N8) { + src_short_to_float_array(in8k_short, in8k, N8); + src_process(src, &data); + printf("%d %d\n", (int)data.output_frames , (int)data.output_frames_gen); + assert(data.output_frames_gen <= N48); + src_float_to_short_array(out, out_short, data.output_frames_gen); + fwrite(out_short, sizeof(short), data.output_frames_gen, fout); + } + + fclose(fout); + fclose(f8k); + + return 0; +} diff --git a/codec2/tags/0.4.1/unittest/vq_train_jvm.c b/codec2/tags/0.4.1/unittest/vq_train_jvm.c new file mode 100755 index 00000000..9da091e0 --- /dev/null +++ b/codec2/tags/0.4.1/unittest/vq_train_jvm.c @@ -0,0 +1,486 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: vq_train_jvm.c + AUTHOR......: Jean-Marc Valin + DATE CREATED: 21 Jan 2012 + + Multi-stage Vector Quantoser training program developed by Jean-Marc at + linux.conf.au 2012. Minor mods by David Rowe + +\*---------------------------------------------------------------------------*/ + +/* + 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, 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 . +*/ + + +#ifdef VALGRIND +#include +#endif + +#include +#include +#include +#include + +#define MIN(a,b) ((a)<(b)?(a):(b)) +#define COEF 0.0f +#define MAX_ENTRIES 16384 + +void compute_weights(const float *x, float *w, int ndim) +{ + int i; + w[0] = MIN(x[0], x[1]-x[0]); + for (i=1;i. +*/ + +/*-----------------------------------------------------------------------*\ + + INCLUDES + +\*-----------------------------------------------------------------------*/ + +#include +#include +#include +#include +#include +#include + +/*-----------------------------------------------------------------------*\ + + DEFINES + +\*-----------------------------------------------------------------------*/ + +#define DELTAQ 0.01 /* quiting 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, 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 se; /* squared error for this iteration */ + float Dn,Dn_1; /* current and previous iterations distortion */ + float delta; /* improvement in distortion */ + FILE *ftrain; /* file containing training set */ + FILE *fvq; /* file containing vector quantiser */ + int ret; + + /* Interpret command line arguments */ + + if (argc != 5) { + printf("usage: %s TrainFile K(dimension) M(codebook size) VQFile\n", argv[0]); + exit(1); + } + + /* Open training file */ + + ftrain = fopen(argv[1],"rb"); + if (ftrain == NULL) { + printf("Error opening training database file: %s\n",argv[1]); + exit(1); + } + + /* determine k and m, and allocate arrays */ + + k = atol(argv[2]); + m = atol(argv[3]); + printf("dimension K=%ld number of entries M=%ld\n", 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 (cb == NULL || cb == NULL || cent == NULL || vec == NULL) { + printf("Error in malloc.\n"); + exit(1); + } + + /* determine size of training set */ + + J = 0; + while(fread(vec, sizeof(float), k, ftrain) == (size_t)k) + J++; + printf("J=%ld entries in training set\n", J); + + /* set up initial codebook state from samples of training set */ + + rewind(ftrain); + ret = fread(cb, sizeof(float), k*m, ftrain); + + /* main loop */ + + Dn = 1E32; + j = 1; + do { + Dn_1 = Dn; + + /* zero centroids */ + + for(i=0; i DELTAQ) + for(i=0; i DELTAQ); + + /* save codebook to disk */ + + fvq = fopen(argv[4],"wt"); + if (fvq == NULL) { + printf("Error opening VQ file: %s\n",argv[4]); + exit(1); + } + + fprintf(fvq,"%ld %ld\n",k,m); + for(j=0; j. +*/ + +/*-----------------------------------------------------------------------*\ + + INCLUDES + +\*-----------------------------------------------------------------------*/ + +#include +#include +#include +#include +#include + +/*-----------------------------------------------------------------------*\ + + DEFINES + +\*-----------------------------------------------------------------------*/ + +#define PI 3.141592654 /* mathematical constant */ +#define MAX_POP 10 + +/*-----------------------------------------------------------------------*\ + + FUNCTION PROTOTYPES + +\*-----------------------------------------------------------------------*/ + +void zero(float v[], int k); +void acc(float v1[], float v2[], int k); +void norm(float v[], int k, long n); +void locate_lsps_jnd_steps(float lsps[], float step, int k); + +/*-----------------------------------------------------------------------* \ + + MAIN + +\*-----------------------------------------------------------------------*/ + +int main(int argc, char *argv[]) { + int k; /* dimension and codebook size */ + float *vec; /* current vector */ + int *n; /* number of vectors in this interval */ + int J; /* number of vectors in training set */ + int i,j; + FILE *ftrain; /* file containing training set */ + float *train; /* training database */ + //float *pend_train; /* last entry */ + float *pt; + int ntrain, match, vec_exists, vec_index=0, entry; + int popular[MAX_POP], pop_thresh; + FILE *fvq; + float jnd; + + /* Interpret command line arguments */ + + if (argc != 6) { + printf("usage: %s TrainFile K(dimension) JND popThresh VQFile\n", + argv[0]); + exit(1); + } + + /* Open training file */ + + ftrain = fopen(argv[1],"rb"); + if (ftrain == NULL) { + printf("Error opening training database file: %s\n",argv[1]); + exit(1); + } + + /* determine k and m, and allocate arrays */ + + k = atol(argv[2]); + jnd = atof(argv[3]); + pop_thresh = atol(argv[4]); + printf("dimension K=%d popThresh=%d JND=%3.1f Hz\n", + k, pop_thresh, jnd); + vec = (float*)malloc(sizeof(float)*k); + if (vec == NULL) { + printf("Error in malloc.\n"); + exit(1); + } + + /* determine size of training set */ + + J = 0; + while(fread(vec, sizeof(float), k, ftrain) == (size_t)k) + J++; + printf("J=%d entries in training set\n", J); + train = (float*)malloc(sizeof(float)*k*J); + if (train == NULL) { + printf("Error in malloc.\n"); + exit(1); + } + printf("training array is %d bytes\n", sizeof(float)*k*J); + + n = (int*)malloc(sizeof(int)*J); + if (n == NULL) { + printf("Error in malloc.\n"); + exit(1); + } + for(i=0; i pop_thresh) { + for(j=0; j. +*/ + +/*-----------------------------------------------------------------------*\ + + INCLUDES + +\*-----------------------------------------------------------------------*/ + +#include +#include +#include +#include +#include +#include + +typedef struct { + float real; + float imag; +} COMP; + +/*-----------------------------------------------------------------------* \ + + DEFINES + +\*-----------------------------------------------------------------------*/ + +#define DELTAQ 0.01 /* quiting distortion */ +#define MAX_STR 80 /* maximum string length */ +#define PI 3.141592654 + +/*-----------------------------------------------------------------------*\ + + FUNCTION PROTOTYPES + +\*-----------------------------------------------------------------------*/ + +void zero(COMP v[], int d); +void acc(COMP v1[], COMP v2[], int d); +void norm(COMP v[], int k); +int quantise(COMP cb[], COMP vec[], int d, int e, float *se); +void print_vec(COMP cb[], int d, int e); + +/*-----------------------------------------------------------------------* \ + + MAIN + +\*-----------------------------------------------------------------------*/ + +int main(int argc, char *argv[]) { + int d,e; /* dimension and codebook size */ + COMP *vec; /* current vector */ + COMP *cb; /* vector codebook */ + COMP *cent; /* centroids for each codebook entry */ + int *n; /* number of vectors in this interval */ + int J; /* number of vectors in training set */ + int ind; /* index of current vector */ + float se; /* total squared error for this iteration */ + float var; /* variance */ + float var_1; /* previous variance */ + float delta; /* improvement in distortion */ + FILE *ftrain; /* file containing training set */ + FILE *fvq; /* file containing vector quantiser */ + int ret; + int i,j, finished, iterations; + float b; /* equivalent number of bits */ + float improvement; + float sd_vec, sd_element, sd_theory, bits_theory; + int var_n; + + /* Interpret command line arguments */ + + if (argc != 5) { + printf("usage: %s TrainFile D(dimension) E(number of entries) VQFile\n", argv[0]); + exit(1); + } + + /* Open training file */ + + ftrain = fopen(argv[1],"rb"); + if (ftrain == NULL) { + printf("Error opening training database file: %s\n",argv[1]); + exit(1); + } + + /* determine k and m, and allocate arrays */ + + d = atoi(argv[2]); + e = atoi(argv[3]); + printf("\n"); + printf("dimension D=%d number of entries E=%d\n", d, e); + vec = (COMP*)malloc(sizeof(COMP)*d); + cb = (COMP*)malloc(sizeof(COMP)*d*e); + cent = (COMP*)malloc(sizeof(COMP)*d*e); + n = (int*)malloc(sizeof(int)*e); + if (cb == NULL || cb == NULL || cent == NULL || vec == NULL) { + printf("Error in malloc.\n"); + exit(1); + } + + /* determine size of training set */ + + J = 0; + var_n = 0; + while(fread(vec, sizeof(COMP), d, ftrain) == (size_t)d) { + for(j=0; j 1) { + if (var > 0.0) { + delta = (var_1 - var)/var; + } + else + delta = 0; + if (delta < DELTAQ) + finished = 1; + } + + if (!finished) { + /* determine new codebook from centroids */ + + for(i=0; i. +*/ + +/*-----------------------------------------------------------------------*\ + + INCLUDES + +\*-----------------------------------------------------------------------*/ + +#include +#include +#include +#include +#include +#include + +typedef struct { + float real; + float imag; +} COMP; + +/*-----------------------------------------------------------------------* \ + + DEFINES + +\*-----------------------------------------------------------------------*/ + +#define DELTAQ 0.01 /* quiting distortion */ +#define MAX_STR 80 /* maximum string length */ + +/*-----------------------------------------------------------------------*\ + + FUNCTION PROTOTYPES + +\*-----------------------------------------------------------------------*/ + +void zero(float v[], int d); +void acc(float v1[], float v2[], int d); +void norm(float v[], int k, int n[]); +int quantise(float cb[], float vec[], int d, int e, float *se); +void print_vec(float cb[], int d, int e); +void split(float cb[], int d, int b); +int gain_shape_quantise(float cb[], float vec[], int d, int e, float *se, float *best_gain); + +/*-----------------------------------------------------------------------* \ + + MAIN + +\*-----------------------------------------------------------------------*/ + +int main(int argc, char *argv[]) { + int d,e; /* dimension and codebook size */ + float *vec; /* current vector */ + float *cb; /* vector codebook */ + float *cent; /* centroids for each codebook entry */ + int *n; /* number of vectors in this interval */ + int J; /* number of vectors in training set */ + int ind; /* index of current vector */ + float se; /* total squared error for this iteration */ + float var; /* variance */ + float var_1; /* previous variance */ + float delta; /* improvement in distortion */ + FILE *ftrain; /* file containing training set */ + FILE *fvq; /* file containing vector quantiser */ + int ret; + int i,j, finished, iterations; + float sd; + int var_n, bits, b, levels; + + /* Interpret command line arguments */ + + if (argc < 5) { + printf("usage: %s TrainFile D(dimension) B(number of bits) VQFile [error.txt file]\n", argv[0]); + exit(1); + } + + /* Open training file */ + + ftrain = fopen(argv[1],"rb"); + if (ftrain == NULL) { + printf("Error opening training database file: %s\n",argv[1]); + exit(1); + } + + /* determine k and m, and allocate arrays */ + + d = atoi(argv[2]); + bits = atoi(argv[3]); + e = 1< 1) { + if (var > 0.0) { + delta = (var_1 - var)/var; + } + else + delta = 0; + if (delta < DELTAQ) + finished = 1; + } + + if (!finished) { + /* determine new codebook from centroids */ + + for(i=0; i