添加了最优化PSK接收机的代码

This commit is contained in:
warmonkey 2018-11-10 02:31:36 +08:00
parent fbd3994ecf
commit 19295899c7
13 changed files with 1113 additions and 10 deletions

View File

@ -28,7 +28,7 @@ from gnuradio.eng_option import eng_option
from gnuradio.filter import firdes
from gnuradio.qtgui import Range, RangeWidget
from optparse import OptionParser
import gpredict
#import gpredict
import kcsa
import math
import numpy as np
@ -249,7 +249,7 @@ class top_block(gr.top_block, Qt.QWidget):
self.kcsa_halfduplex_tc_0 = kcsa.halfduplex_tc(1, 0, True, 128, 4)
self.kcsa_fec_decode_b_0_0_0 = kcsa.fec_decode_b(223, False, False, True, False)
self.kcsa_fec_decode_b_0_0 = kcsa.fec_decode_b(223, False, False, True, False)
self.gpredict_doppler_0 = gpredict.doppler(self.set_fcorr, "localhost", 4532, True)
#self.gpredict_doppler_0 = gpredict.doppler(self.set_fcorr, "localhost", 4532, True)
self.freq_xlating_fir_filter_xxx_0 = filter.freq_xlating_fir_filter_ccc(down_decim, (lpf_taps), vfo+fcorr, down_samprate)
self.fir_filter_xxx_0 = filter.fir_filter_fff(1024, (np.ones(1024)/1024))
self.fir_filter_xxx_0.declare_sample_delay(0)

View File

@ -151,11 +151,11 @@ endif()
########################################################################
# Setup doxygen option
########################################################################
if(DOXYGEN_FOUND)
option(ENABLE_DOXYGEN "Build docs using Doxygen" ON)
else(DOXYGEN_FOUND)
#if(DOXYGEN_FOUND)
# option(ENABLE_DOXYGEN "Build docs using Doxygen" ON)
#else(DOXYGEN_FOUND)
option(ENABLE_DOXYGEN "Build docs using Doxygen" OFF)
endif(DOXYGEN_FOUND)
#endif(DOXYGEN_FOUND)
########################################################################
# Setup the include and linker paths
@ -201,7 +201,7 @@ add_subdirectory(swig)
add_subdirectory(python)
add_subdirectory(grc)
add_subdirectory(apps)
add_subdirectory(docs)
#add_subdirectory(docs)
########################################################################
# Install cmake search helper for this library

View File

@ -41,5 +41,5 @@ install(FILES
kcsa_fullduplex_pdu_to_stream.xml
kcsa_power_sensor.xml
kcsa_pdu_to_stream2.xml
DESTINATION share/gnuradio/grc/blocks
kcsa_psk_rx.xml DESTINATION share/gnuradio/grc/blocks
)

View File

@ -0,0 +1,76 @@
<?xml version="1.0"?>
<block>
<name>PSK Receiver</name>
<key>kcsa_psk_rx</key>
<category>[KCSA]</category>
<import>import kcsa</import>
<make>kcsa.psk_rx($mod, $sps, $sym_rate, $sym_rate_dev, $sym_bw, $carr_rate, $carr_rate_dev, $carr_bw)</make>
<param>
<name>Mod</name>
<key>mod</key>
<value>0</value>
<type>int</type>
<option>
<name>BPSK</name>
<key>0</key>
</option>
<option>
<name>QPSK</name>
<key>1</key>
</option>
<option>
<name>8PSK</name>
<key>2</key>
</option>
</param>
<param>
<name>sps</name>
<key>sps</key>
<value>4</value>
<type>int</type>
</param>
<param>
<name>Symbol Rate</name>
<key>sym_rate</key>
<value>1.0</value>
<type>real</type>
</param>
<param>
<name>Symbol Rate Dev</name>
<key>sym_rate_dev</key>
<value>0.001</value>
<type>real</type>
</param>
<param>
<name>Symbol Loop BW</name>
<key>sym_bw</key>
<value>0.01</value>
<type>real</type>
</param>
<param>
<name>Carrier Rate</name>
<key>carr_rate</key>
<value>0.0</value>
<type>real</type>
</param>
<param>
<name>Carrier Rate Dev</name>
<key>carr_rate_dev</key>
<value>3.1416/2.0</value>
<type>real</type>
</param>
<param>
<name>Carrier Loop BW</name>
<key>carr_bw</key>
<value>0.01</value>
<type>real</type>
</param>
<sink>
<name>in</name>
<type>complex</type>
</sink>
<source>
<name>out</name>
<type>complex</type>
</source>
</block>

View File

@ -45,5 +45,5 @@ install(FILES
halfduplex_pdu_to_stream.h
fullduplex_pdu_to_stream.h
power_sensor.h
DESTINATION include/kcsa
psk_rx.h DESTINATION include/kcsa
)

View File

@ -0,0 +1,56 @@
/* -*- c++ -*- */
/*
* Copyright 2018 <+YOU OR YOUR COMPANY+>.
*
* This 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 3, or (at your option)
* any later version.
*
* This software 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 software; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street,
* Boston, MA 02110-1301, USA.
*/
#ifndef INCLUDED_KCSA_PSK_RX_H
#define INCLUDED_KCSA_PSK_RX_H
#include <kcsa/api.h>
#include <gnuradio/block.h>
namespace gr {
namespace kcsa {
/*!
* \brief <+description of block+>
* \ingroup kcsa
*
*/
class KCSA_API psk_rx : virtual public gr::block
{
public:
typedef boost::shared_ptr<psk_rx> sptr;
/*!
* \brief Return a shared_ptr to a new instance of kcsa::psk_rx.
*
* To avoid accidental use of raw pointers, kcsa::psk_rx's
* constructor is in a private implementation
* class. kcsa::psk_rx::make is the public interface for
* creating new instances.
*/
static sptr make(int _mod, int sps, float sym_rate, float sym_rate_dev, float sym_bw, float carr_rate, float carr_rate_dev, float carr_bw);
};
} // namespace kcsa
} // namespace gr
#endif /* INCLUDED_KCSA_PSK_RX_H */

View File

@ -61,7 +61,8 @@ list(APPEND kcsa_sources
halfduplex_pdu_to_stream_impl.cc
fullduplex_pdu_to_stream_impl.cc
power_sensor_impl.cc
)
psk_rx_impl.cc
psk/psk_rx_cc.cc )
set(kcsa_sources "${kcsa_sources}" PARENT_SCOPE)
if(NOT kcsa_sources)

View File

@ -0,0 +1,526 @@
/*
* This file was machine generated by gen_interpolator_taps.
* DO NOT EDIT BY HAND.
*/
static const int hb_ntaps = 8;
static const int hb_nsteps = 512;
static const double hb_bw = 0.25;
static const float hb_taps[hb_nsteps+1][hb_ntaps] = {
// -4 -3 -2 -1 0 1 2 3 mu
{ 0.00000e+00, 0.00000e+00, 0.00000e+00, 0.00000e+00, 1.00000e+00, 0.00000e+00, 0.00000e+00, 0.00000e+00 }, // 0/512
{ -3.86697e-05, 2.13297e-04, -6.91227e-04, 1.96394e-03, 9.99650e-01, -1.36200e-03, 3.12834e-04, -4.98927e-05 }, // 1/512
{ -7.73439e-05, 4.26696e-04, -1.38326e-03, 3.93409e-03, 9.99289e-01, -2.71776e-03, 6.24853e-04, -9.96901e-05 }, // 2/512
{ -1.16021e-04, 6.40192e-04, -2.07609e-03, 5.91044e-03, 9.98917e-01, -4.06728e-03, 9.36049e-04, -1.49391e-04 }, // 3/512
{ -1.54700e-04, 8.53777e-04, -2.76968e-03, 7.89295e-03, 9.98534e-01, -5.41054e-03, 1.24642e-03, -1.98993e-04 }, // 4/512
{ -1.93380e-04, 1.06745e-03, -3.46403e-03, 9.88159e-03, 9.98139e-01, -6.74754e-03, 1.55594e-03, -2.48496e-04 }, // 5/512
{ -2.32060e-04, 1.28119e-03, -4.15910e-03, 1.18763e-02, 9.97734e-01, -8.07826e-03, 1.86463e-03, -2.97897e-04 }, // 6/512
{ -2.70737e-04, 1.49500e-03, -4.85487e-03, 1.38772e-02, 9.97318e-01, -9.40271e-03, 2.17245e-03, -3.47196e-04 }, // 7/512
{ -3.09412e-04, 1.70888e-03, -5.55134e-03, 1.58840e-02, 9.96891e-01, -1.07209e-02, 2.47942e-03, -3.96391e-04 }, // 8/512
{ -3.48082e-04, 1.92281e-03, -6.24847e-03, 1.78969e-02, 9.96453e-01, -1.20327e-02, 2.78552e-03, -4.45480e-04 }, // 9/512
{ -3.86747e-04, 2.13679e-03, -6.94624e-03, 1.99158e-02, 9.96004e-01, -1.33383e-02, 3.09074e-03, -4.94462e-04 }, // 10/512
{ -4.25404e-04, 2.35081e-03, -7.64464e-03, 2.19406e-02, 9.95544e-01, -1.46375e-02, 3.39507e-03, -5.43336e-04 }, // 11/512
{ -4.64053e-04, 2.56486e-03, -8.34364e-03, 2.39714e-02, 9.95074e-01, -1.59305e-02, 3.69852e-03, -5.92100e-04 }, // 12/512
{ -5.02692e-04, 2.77894e-03, -9.04319e-03, 2.60080e-02, 9.94592e-01, -1.72171e-02, 4.00108e-03, -6.40760e-04 }, // 13/512
{ -5.41322e-04, 2.99305e-03, -9.74337e-03, 2.80506e-02, 9.94100e-01, -1.84973e-02, 4.30270e-03, -6.89293e-04 }, // 14/512
{ -5.79940e-04, 3.20717e-03, -1.04441e-02, 3.00990e-02, 9.93596e-01, -1.97713e-02, 4.60342e-03, -7.37720e-04 }, // 15/512
{ -6.18544e-04, 3.42130e-03, -1.11453e-02, 3.21531e-02, 9.93082e-01, -2.10389e-02, 4.90322e-03, -7.86031e-04 }, // 16/512
{ -6.57133e-04, 3.63542e-03, -1.18470e-02, 3.42131e-02, 9.92557e-01, -2.23001e-02, 5.20209e-03, -8.34225e-04 }, // 17/512
{ -6.95707e-04, 3.84954e-03, -1.25491e-02, 3.62788e-02, 9.92021e-01, -2.35550e-02, 5.50002e-03, -8.82301e-04 }, // 18/512
{ -7.34264e-04, 4.06364e-03, -1.32518e-02, 3.83503e-02, 9.91475e-01, -2.48035e-02, 5.79701e-03, -9.30258e-04 }, // 19/512
{ -7.72802e-04, 4.27773e-03, -1.39548e-02, 4.04274e-02, 9.90917e-01, -2.60456e-02, 6.09305e-03, -9.78093e-04 }, // 20/512
{ -8.11321e-04, 4.49179e-03, -1.46583e-02, 4.25101e-02, 9.90349e-01, -2.72814e-02, 6.38813e-03, -1.02581e-03 }, // 21/512
{ -8.49819e-04, 4.70581e-03, -1.53622e-02, 4.45986e-02, 9.89770e-01, -2.85107e-02, 6.68224e-03, -1.07340e-03 }, // 22/512
{ -8.88295e-04, 4.91979e-03, -1.60665e-02, 4.66926e-02, 9.89180e-01, -2.97337e-02, 6.97538e-03, -1.12086e-03 }, // 23/512
{ -9.26747e-04, 5.13372e-03, -1.67711e-02, 4.87921e-02, 9.88580e-01, -3.09503e-02, 7.26754e-03, -1.16820e-03 }, // 24/512
{ -9.65176e-04, 5.34761e-03, -1.74760e-02, 5.08972e-02, 9.87969e-01, -3.21604e-02, 7.55872e-03, -1.21541e-03 }, // 25/512
{ -1.00357e-03, 5.56142e-03, -1.81813e-02, 5.30079e-02, 9.87347e-01, -3.33641e-02, 7.84885e-03, -1.26248e-03 }, // 26/512
{ -1.04197e-03, 5.77521e-03, -1.88868e-02, 5.51239e-02, 9.86714e-01, -3.45616e-02, 8.13813e-03, -1.30947e-03 }, // 27/512
{ -1.08030e-03, 5.98884e-03, -1.95925e-02, 5.72454e-02, 9.86071e-01, -3.57525e-02, 8.42626e-03, -1.35626e-03 }, // 28/512
{ -1.11861e-03, 6.20242e-03, -2.02985e-02, 5.93723e-02, 9.85417e-01, -3.69370e-02, 8.71343e-03, -1.40295e-03 }, // 29/512
{ -1.15690e-03, 6.41592e-03, -2.10048e-02, 6.15046e-02, 9.84752e-01, -3.81151e-02, 8.99957e-03, -1.44951e-03 }, // 30/512
{ -1.19515e-03, 6.62932e-03, -2.17112e-02, 6.36423e-02, 9.84077e-01, -3.92867e-02, 9.28468e-03, -1.49593e-03 }, // 31/512
{ -1.23337e-03, 6.84261e-03, -2.24178e-02, 6.57852e-02, 9.83392e-01, -4.04519e-02, 9.56876e-03, -1.54221e-03 }, // 32/512
{ -1.27156e-03, 7.05580e-03, -2.31246e-02, 6.79334e-02, 9.82695e-01, -4.16107e-02, 9.85180e-03, -1.58835e-03 }, // 33/512
{ -1.30971e-03, 7.26887e-03, -2.38316e-02, 7.00869e-02, 9.81988e-01, -4.27630e-02, 1.01338e-02, -1.63435e-03 }, // 34/512
{ -1.34782e-03, 7.48181e-03, -2.45386e-02, 7.22456e-02, 9.81271e-01, -4.39089e-02, 1.04147e-02, -1.68022e-03 }, // 35/512
{ -1.38589e-03, 7.69461e-03, -2.52457e-02, 7.44095e-02, 9.80543e-01, -4.50483e-02, 1.06946e-02, -1.72594e-03 }, // 36/512
{ -1.42392e-03, 7.90729e-03, -2.59529e-02, 7.65786e-02, 9.79804e-01, -4.61812e-02, 1.09734e-02, -1.77150e-03 }, // 37/512
{ -1.46192e-03, 8.11982e-03, -2.66601e-02, 7.87527e-02, 9.79055e-01, -4.73077e-02, 1.12512e-02, -1.81695e-03 }, // 38/512
{ -1.49987e-03, 8.33220e-03, -2.73674e-02, 8.09319e-02, 9.78296e-01, -4.84277e-02, 1.15278e-02, -1.86224e-03 }, // 39/512
{ -1.53777e-03, 8.54441e-03, -2.80746e-02, 8.31162e-02, 9.77526e-01, -4.95412e-02, 1.18034e-02, -1.90738e-03 }, // 40/512
{ -1.57564e-03, 8.75646e-03, -2.87819e-02, 8.53055e-02, 9.76745e-01, -5.06482e-02, 1.20779e-02, -1.95237e-03 }, // 41/512
{ -1.61345e-03, 8.96834e-03, -2.94891e-02, 8.74998e-02, 9.75955e-01, -5.17488e-02, 1.23512e-02, -1.99722e-03 }, // 42/512
{ -1.65122e-03, 9.18003e-03, -3.01962e-02, 8.96991e-02, 9.75153e-01, -5.28429e-02, 1.26235e-02, -2.04191e-03 }, // 43/512
{ -1.68894e-03, 9.39154e-03, -3.09033e-02, 9.19033e-02, 9.74342e-01, -5.39305e-02, 1.28947e-02, -2.08645e-03 }, // 44/512
{ -1.72660e-03, 9.60279e-03, -3.16101e-02, 9.41121e-02, 9.73520e-01, -5.50118e-02, 1.31649e-02, -2.13087e-03 }, // 45/512
{ -1.76423e-03, 9.81398e-03, -3.23171e-02, 9.63263e-02, 9.72687e-01, -5.60862e-02, 1.34337e-02, -2.17508e-03 }, // 46/512
{ -1.80179e-03, 1.00249e-02, -3.30238e-02, 9.85450e-02, 9.71845e-01, -5.71543e-02, 1.37015e-02, -2.21915e-03 }, // 47/512
{ -1.83931e-03, 1.02356e-02, -3.37303e-02, 1.00769e-01, 9.70992e-01, -5.82159e-02, 1.39681e-02, -2.26307e-03 }, // 48/512
{ -1.87677e-03, 1.04460e-02, -3.44366e-02, 1.02997e-01, 9.70128e-01, -5.92710e-02, 1.42337e-02, -2.30684e-03 }, // 49/512
{ -1.91417e-03, 1.06563e-02, -3.51427e-02, 1.05230e-01, 9.69255e-01, -6.03195e-02, 1.44980e-02, -2.35045e-03 }, // 50/512
{ -1.95151e-03, 1.08663e-02, -3.58485e-02, 1.07467e-01, 9.68371e-01, -6.13616e-02, 1.47613e-02, -2.39389e-03 }, // 51/512
{ -1.98880e-03, 1.10760e-02, -3.65541e-02, 1.09710e-01, 9.67477e-01, -6.23972e-02, 1.50233e-02, -2.43718e-03 }, // 52/512
{ -2.02602e-03, 1.12855e-02, -3.72594e-02, 1.11957e-01, 9.66572e-01, -6.34263e-02, 1.52843e-02, -2.48030e-03 }, // 53/512
{ -2.06319e-03, 1.14948e-02, -3.79645e-02, 1.14208e-01, 9.65658e-01, -6.44488e-02, 1.55440e-02, -2.52326e-03 }, // 54/512
{ -2.10029e-03, 1.17038e-02, -3.86691e-02, 1.16464e-01, 9.64733e-01, -6.54648e-02, 1.58026e-02, -2.56605e-03 }, // 55/512
{ -2.13733e-03, 1.19125e-02, -3.93735e-02, 1.18725e-01, 9.63798e-01, -6.64743e-02, 1.60599e-02, -2.60868e-03 }, // 56/512
{ -2.17431e-03, 1.21209e-02, -4.00774e-02, 1.20990e-01, 9.62853e-01, -6.74773e-02, 1.63161e-02, -2.65114e-03 }, // 57/512
{ -2.21122e-03, 1.23291e-02, -4.07810e-02, 1.23260e-01, 9.61898e-01, -6.84737e-02, 1.65711e-02, -2.69344e-03 }, // 58/512
{ -2.24806e-03, 1.25369e-02, -4.14841e-02, 1.25534e-01, 9.60933e-01, -6.94637e-02, 1.68249e-02, -2.73556e-03 }, // 59/512
{ -2.28483e-03, 1.27445e-02, -4.21869e-02, 1.27812e-01, 9.59958e-01, -7.04471e-02, 1.70776e-02, -2.77751e-03 }, // 60/512
{ -2.32153e-03, 1.29518e-02, -4.28891e-02, 1.30094e-01, 9.58972e-01, -7.14240e-02, 1.73290e-02, -2.81930e-03 }, // 61/512
{ -2.35817e-03, 1.31587e-02, -4.35909e-02, 1.32381e-01, 9.57977e-01, -7.23943e-02, 1.75791e-02, -2.86091e-03 }, // 62/512
{ -2.39473e-03, 1.33653e-02, -4.42921e-02, 1.34673e-01, 9.56972e-01, -7.33581e-02, 1.78281e-02, -2.90235e-03 }, // 63/512
{ -2.43121e-03, 1.35716e-02, -4.49929e-02, 1.36968e-01, 9.55956e-01, -7.43154e-02, 1.80759e-02, -2.94361e-03 }, // 64/512
{ -2.46763e-03, 1.37776e-02, -4.56930e-02, 1.39268e-01, 9.54931e-01, -7.52662e-02, 1.83224e-02, -2.98470e-03 }, // 65/512
{ -2.50396e-03, 1.39832e-02, -4.63926e-02, 1.41572e-01, 9.53896e-01, -7.62104e-02, 1.85677e-02, -3.02561e-03 }, // 66/512
{ -2.54022e-03, 1.41885e-02, -4.70917e-02, 1.43879e-01, 9.52850e-01, -7.71481e-02, 1.88117e-02, -3.06634e-03 }, // 67/512
{ -2.57640e-03, 1.43934e-02, -4.77900e-02, 1.46192e-01, 9.51795e-01, -7.80792e-02, 1.90545e-02, -3.10689e-03 }, // 68/512
{ -2.61250e-03, 1.45980e-02, -4.84878e-02, 1.48508e-01, 9.50730e-01, -7.90039e-02, 1.92961e-02, -3.14727e-03 }, // 69/512
{ -2.64853e-03, 1.48022e-02, -4.91849e-02, 1.50828e-01, 9.49656e-01, -7.99219e-02, 1.95364e-02, -3.18746e-03 }, // 70/512
{ -2.68446e-03, 1.50060e-02, -4.98813e-02, 1.53152e-01, 9.48571e-01, -8.08335e-02, 1.97754e-02, -3.22747e-03 }, // 71/512
{ -2.72032e-03, 1.52095e-02, -5.05770e-02, 1.55480e-01, 9.47477e-01, -8.17385e-02, 2.00132e-02, -3.26730e-03 }, // 72/512
{ -2.75609e-03, 1.54125e-02, -5.12719e-02, 1.57812e-01, 9.46372e-01, -8.26370e-02, 2.02497e-02, -3.30695e-03 }, // 73/512
{ -2.79178e-03, 1.56152e-02, -5.19661e-02, 1.60148e-01, 9.45258e-01, -8.35290e-02, 2.04850e-02, -3.34640e-03 }, // 74/512
{ -2.82738e-03, 1.58174e-02, -5.26596e-02, 1.62487e-01, 9.44135e-01, -8.44144e-02, 2.07189e-02, -3.38568e-03 }, // 75/512
{ -2.86289e-03, 1.60193e-02, -5.33522e-02, 1.64831e-01, 9.43001e-01, -8.52933e-02, 2.09516e-02, -3.42477e-03 }, // 76/512
{ -2.89831e-03, 1.62207e-02, -5.40440e-02, 1.67178e-01, 9.41858e-01, -8.61656e-02, 2.11830e-02, -3.46367e-03 }, // 77/512
{ -2.93365e-03, 1.64217e-02, -5.47349e-02, 1.69529e-01, 9.40705e-01, -8.70314e-02, 2.14131e-02, -3.50238e-03 }, // 78/512
{ -2.96889e-03, 1.66223e-02, -5.54250e-02, 1.71884e-01, 9.39543e-01, -8.78907e-02, 2.16420e-02, -3.54090e-03 }, // 79/512
{ -3.00403e-03, 1.68225e-02, -5.61142e-02, 1.74242e-01, 9.38371e-01, -8.87435e-02, 2.18695e-02, -3.57923e-03 }, // 80/512
{ -3.03909e-03, 1.70222e-02, -5.68025e-02, 1.76604e-01, 9.37189e-01, -8.95897e-02, 2.20957e-02, -3.61736e-03 }, // 81/512
{ -3.07405e-03, 1.72214e-02, -5.74899e-02, 1.78970e-01, 9.35998e-01, -9.04294e-02, 2.23206e-02, -3.65531e-03 }, // 82/512
{ -3.10891e-03, 1.74202e-02, -5.81763e-02, 1.81339e-01, 9.34797e-01, -9.12626e-02, 2.25442e-02, -3.69306e-03 }, // 83/512
{ -3.14367e-03, 1.76185e-02, -5.88617e-02, 1.83711e-01, 9.33586e-01, -9.20893e-02, 2.27664e-02, -3.73062e-03 }, // 84/512
{ -3.17834e-03, 1.78164e-02, -5.95461e-02, 1.86087e-01, 9.32367e-01, -9.29094e-02, 2.29874e-02, -3.76798e-03 }, // 85/512
{ -3.21291e-03, 1.80138e-02, -6.02295e-02, 1.88467e-01, 9.31137e-01, -9.37230e-02, 2.32070e-02, -3.80515e-03 }, // 86/512
{ -3.24737e-03, 1.82107e-02, -6.09118e-02, 1.90850e-01, 9.29899e-01, -9.45301e-02, 2.34253e-02, -3.84211e-03 }, // 87/512
{ -3.28174e-03, 1.84071e-02, -6.15931e-02, 1.93236e-01, 9.28650e-01, -9.53307e-02, 2.36423e-02, -3.87888e-03 }, // 88/512
{ -3.31600e-03, 1.86030e-02, -6.22732e-02, 1.95626e-01, 9.27393e-01, -9.61248e-02, 2.38579e-02, -3.91546e-03 }, // 89/512
{ -3.35015e-03, 1.87984e-02, -6.29523e-02, 1.98019e-01, 9.26126e-01, -9.69123e-02, 2.40722e-02, -3.95183e-03 }, // 90/512
{ -3.38420e-03, 1.89933e-02, -6.36302e-02, 2.00415e-01, 9.24850e-01, -9.76934e-02, 2.42851e-02, -3.98800e-03 }, // 91/512
{ -3.41815e-03, 1.91877e-02, -6.43069e-02, 2.02814e-01, 9.23564e-01, -9.84679e-02, 2.44967e-02, -4.02397e-03 }, // 92/512
{ -3.45198e-03, 1.93815e-02, -6.49825e-02, 2.05217e-01, 9.22269e-01, -9.92359e-02, 2.47070e-02, -4.05973e-03 }, // 93/512
{ -3.48571e-03, 1.95749e-02, -6.56568e-02, 2.07622e-01, 9.20965e-01, -9.99975e-02, 2.49159e-02, -4.09529e-03 }, // 94/512
{ -3.51932e-03, 1.97676e-02, -6.63299e-02, 2.10031e-01, 9.19652e-01, -1.00752e-01, 2.51234e-02, -4.13065e-03 }, // 95/512
{ -3.55283e-03, 1.99599e-02, -6.70018e-02, 2.12443e-01, 9.18329e-01, -1.01501e-01, 2.53295e-02, -4.16581e-03 }, // 96/512
{ -3.58622e-03, 2.01516e-02, -6.76723e-02, 2.14858e-01, 9.16997e-01, -1.02243e-01, 2.55343e-02, -4.20075e-03 }, // 97/512
{ -3.61949e-03, 2.03427e-02, -6.83416e-02, 2.17275e-01, 9.15656e-01, -1.02979e-01, 2.57377e-02, -4.23549e-03 }, // 98/512
{ -3.65266e-03, 2.05333e-02, -6.90096e-02, 2.19696e-01, 9.14306e-01, -1.03708e-01, 2.59398e-02, -4.27003e-03 }, // 99/512
{ -3.68570e-03, 2.07233e-02, -6.96762e-02, 2.22120e-01, 9.12947e-01, -1.04430e-01, 2.61404e-02, -4.30435e-03 }, // 100/512
{ -3.71863e-03, 2.09127e-02, -7.03414e-02, 2.24546e-01, 9.11579e-01, -1.05146e-01, 2.63397e-02, -4.33847e-03 }, // 101/512
{ -3.75144e-03, 2.11015e-02, -7.10052e-02, 2.26976e-01, 9.10201e-01, -1.05856e-01, 2.65376e-02, -4.37237e-03 }, // 102/512
{ -3.78414e-03, 2.12897e-02, -7.16677e-02, 2.29408e-01, 9.08815e-01, -1.06559e-01, 2.67341e-02, -4.40607e-03 }, // 103/512
{ -3.81671e-03, 2.14774e-02, -7.23286e-02, 2.31843e-01, 9.07420e-01, -1.07256e-01, 2.69293e-02, -4.43955e-03 }, // 104/512
{ -3.84916e-03, 2.16644e-02, -7.29882e-02, 2.34281e-01, 9.06015e-01, -1.07946e-01, 2.71230e-02, -4.47282e-03 }, // 105/512
{ -3.88148e-03, 2.18509e-02, -7.36462e-02, 2.36721e-01, 9.04602e-01, -1.08630e-01, 2.73153e-02, -4.50588e-03 }, // 106/512
{ -3.91368e-03, 2.20367e-02, -7.43027e-02, 2.39164e-01, 9.03180e-01, -1.09307e-01, 2.75062e-02, -4.53872e-03 }, // 107/512
{ -3.94576e-03, 2.22218e-02, -7.49577e-02, 2.41609e-01, 9.01749e-01, -1.09978e-01, 2.76957e-02, -4.57135e-03 }, // 108/512
{ -3.97771e-03, 2.24064e-02, -7.56112e-02, 2.44057e-01, 9.00309e-01, -1.10642e-01, 2.78838e-02, -4.60376e-03 }, // 109/512
{ -4.00953e-03, 2.25903e-02, -7.62631e-02, 2.46508e-01, 8.98860e-01, -1.11300e-01, 2.80705e-02, -4.63596e-03 }, // 110/512
{ -4.04123e-03, 2.27736e-02, -7.69133e-02, 2.48961e-01, 8.97403e-01, -1.11952e-01, 2.82558e-02, -4.66794e-03 }, // 111/512
{ -4.07279e-03, 2.29562e-02, -7.75620e-02, 2.51417e-01, 8.95936e-01, -1.12597e-01, 2.84397e-02, -4.69970e-03 }, // 112/512
{ -4.10423e-03, 2.31382e-02, -7.82090e-02, 2.53875e-01, 8.94461e-01, -1.13235e-01, 2.86221e-02, -4.73125e-03 }, // 113/512
{ -4.13553e-03, 2.33195e-02, -7.88543e-02, 2.56335e-01, 8.92977e-01, -1.13867e-01, 2.88032e-02, -4.76257e-03 }, // 114/512
{ -4.16670e-03, 2.35001e-02, -7.94980e-02, 2.58798e-01, 8.91485e-01, -1.14493e-01, 2.89828e-02, -4.79368e-03 }, // 115/512
{ -4.19774e-03, 2.36801e-02, -8.01399e-02, 2.61263e-01, 8.89984e-01, -1.15113e-01, 2.91609e-02, -4.82456e-03 }, // 116/512
{ -4.22864e-03, 2.38593e-02, -8.07801e-02, 2.63730e-01, 8.88474e-01, -1.15726e-01, 2.93377e-02, -4.85523e-03 }, // 117/512
{ -4.25940e-03, 2.40379e-02, -8.14185e-02, 2.66199e-01, 8.86956e-01, -1.16332e-01, 2.95130e-02, -4.88567e-03 }, // 118/512
{ -4.29003e-03, 2.42158e-02, -8.20552e-02, 2.68671e-01, 8.85429e-01, -1.16932e-01, 2.96868e-02, -4.91589e-03 }, // 119/512
{ -4.32052e-03, 2.43930e-02, -8.26900e-02, 2.71144e-01, 8.83893e-01, -1.17526e-01, 2.98593e-02, -4.94589e-03 }, // 120/512
{ -4.35087e-03, 2.45695e-02, -8.33231e-02, 2.73620e-01, 8.82349e-01, -1.18113e-01, 3.00303e-02, -4.97566e-03 }, // 121/512
{ -4.38108e-03, 2.47452e-02, -8.39542e-02, 2.76098e-01, 8.80797e-01, -1.18694e-01, 3.01998e-02, -5.00521e-03 }, // 122/512
{ -4.41114e-03, 2.49203e-02, -8.45835e-02, 2.78578e-01, 8.79236e-01, -1.19269e-01, 3.03679e-02, -5.03454e-03 }, // 123/512
{ -4.44107e-03, 2.50946e-02, -8.52109e-02, 2.81060e-01, 8.77666e-01, -1.19837e-01, 3.05345e-02, -5.06363e-03 }, // 124/512
{ -4.47085e-03, 2.52681e-02, -8.58364e-02, 2.83543e-01, 8.76089e-01, -1.20399e-01, 3.06997e-02, -5.09251e-03 }, // 125/512
{ -4.50049e-03, 2.54410e-02, -8.64599e-02, 2.86029e-01, 8.74503e-01, -1.20955e-01, 3.08635e-02, -5.12115e-03 }, // 126/512
{ -4.52998e-03, 2.56131e-02, -8.70815e-02, 2.88517e-01, 8.72908e-01, -1.21504e-01, 3.10258e-02, -5.14957e-03 }, // 127/512
{ -4.55932e-03, 2.57844e-02, -8.77011e-02, 2.91006e-01, 8.71305e-01, -1.22047e-01, 3.11866e-02, -5.17776e-03 }, // 128/512
{ -4.58851e-03, 2.59550e-02, -8.83187e-02, 2.93497e-01, 8.69694e-01, -1.22583e-01, 3.13460e-02, -5.20572e-03 }, // 129/512
{ -4.61756e-03, 2.61248e-02, -8.89342e-02, 2.95990e-01, 8.68075e-01, -1.23113e-01, 3.15039e-02, -5.23345e-03 }, // 130/512
{ -4.64646e-03, 2.62938e-02, -8.95477e-02, 2.98484e-01, 8.66448e-01, -1.23637e-01, 3.16603e-02, -5.26095e-03 }, // 131/512
{ -4.67520e-03, 2.64621e-02, -9.01591e-02, 3.00980e-01, 8.64812e-01, -1.24154e-01, 3.18153e-02, -5.28823e-03 }, // 132/512
{ -4.70380e-03, 2.66296e-02, -9.07684e-02, 3.03478e-01, 8.63168e-01, -1.24666e-01, 3.19688e-02, -5.31527e-03 }, // 133/512
{ -4.73224e-03, 2.67962e-02, -9.13756e-02, 3.05977e-01, 8.61517e-01, -1.25171e-01, 3.21209e-02, -5.34208e-03 }, // 134/512
{ -4.76052e-03, 2.69621e-02, -9.19806e-02, 3.08478e-01, 8.59857e-01, -1.25669e-01, 3.22714e-02, -5.36865e-03 }, // 135/512
{ -4.78866e-03, 2.71272e-02, -9.25834e-02, 3.10980e-01, 8.58189e-01, -1.26161e-01, 3.24205e-02, -5.39500e-03 }, // 136/512
{ -4.81663e-03, 2.72915e-02, -9.31841e-02, 3.13484e-01, 8.56513e-01, -1.26648e-01, 3.25681e-02, -5.42111e-03 }, // 137/512
{ -4.84445e-03, 2.74549e-02, -9.37826e-02, 3.15989e-01, 8.54829e-01, -1.27127e-01, 3.27143e-02, -5.44699e-03 }, // 138/512
{ -4.87211e-03, 2.76176e-02, -9.43788e-02, 3.18496e-01, 8.53137e-01, -1.27601e-01, 3.28589e-02, -5.47263e-03 }, // 139/512
{ -4.89961e-03, 2.77794e-02, -9.49727e-02, 3.21004e-01, 8.51437e-01, -1.28068e-01, 3.30021e-02, -5.49804e-03 }, // 140/512
{ -4.92695e-03, 2.79403e-02, -9.55644e-02, 3.23513e-01, 8.49729e-01, -1.28529e-01, 3.31438e-02, -5.52321e-03 }, // 141/512
{ -4.95413e-03, 2.81005e-02, -9.61537e-02, 3.26023e-01, 8.48013e-01, -1.28984e-01, 3.32840e-02, -5.54815e-03 }, // 142/512
{ -4.98114e-03, 2.82598e-02, -9.67408e-02, 3.28535e-01, 8.46290e-01, -1.29432e-01, 3.34227e-02, -5.57285e-03 }, // 143/512
{ -5.00800e-03, 2.84182e-02, -9.73254e-02, 3.31048e-01, 8.44559e-01, -1.29874e-01, 3.35600e-02, -5.59731e-03 }, // 144/512
{ -5.03469e-03, 2.85758e-02, -9.79077e-02, 3.33561e-01, 8.42820e-01, -1.30311e-01, 3.36957e-02, -5.62154e-03 }, // 145/512
{ -5.06121e-03, 2.87325e-02, -9.84876e-02, 3.36076e-01, 8.41073e-01, -1.30740e-01, 3.38300e-02, -5.64553e-03 }, // 146/512
{ -5.08757e-03, 2.88883e-02, -9.90651e-02, 3.38592e-01, 8.39319e-01, -1.31164e-01, 3.39628e-02, -5.66928e-03 }, // 147/512
{ -5.11376e-03, 2.90433e-02, -9.96402e-02, 3.41109e-01, 8.37557e-01, -1.31581e-01, 3.40940e-02, -5.69280e-03 }, // 148/512
{ -5.13978e-03, 2.91974e-02, -1.00213e-01, 3.43627e-01, 8.35787e-01, -1.31993e-01, 3.42238e-02, -5.71607e-03 }, // 149/512
{ -5.16564e-03, 2.93506e-02, -1.00783e-01, 3.46146e-01, 8.34009e-01, -1.32398e-01, 3.43521e-02, -5.73911e-03 }, // 150/512
{ -5.19132e-03, 2.95029e-02, -1.01350e-01, 3.48666e-01, 8.32225e-01, -1.32797e-01, 3.44789e-02, -5.76190e-03 }, // 151/512
{ -5.21683e-03, 2.96543e-02, -1.01915e-01, 3.51186e-01, 8.30432e-01, -1.33189e-01, 3.46042e-02, -5.78446e-03 }, // 152/512
{ -5.24218e-03, 2.98048e-02, -1.02478e-01, 3.53708e-01, 8.28632e-01, -1.33576e-01, 3.47280e-02, -5.80677e-03 }, // 153/512
{ -5.26734e-03, 2.99543e-02, -1.03038e-01, 3.56230e-01, 8.26825e-01, -1.33957e-01, 3.48503e-02, -5.82885e-03 }, // 154/512
{ -5.29234e-03, 3.01030e-02, -1.03595e-01, 3.58753e-01, 8.25010e-01, -1.34331e-01, 3.49710e-02, -5.85068e-03 }, // 155/512
{ -5.31716e-03, 3.02507e-02, -1.04150e-01, 3.61276e-01, 8.23188e-01, -1.34699e-01, 3.50903e-02, -5.87227e-03 }, // 156/512
{ -5.34180e-03, 3.03976e-02, -1.04702e-01, 3.63800e-01, 8.21358e-01, -1.35061e-01, 3.52081e-02, -5.89362e-03 }, // 157/512
{ -5.36627e-03, 3.05434e-02, -1.05251e-01, 3.66325e-01, 8.19522e-01, -1.35417e-01, 3.53244e-02, -5.91472e-03 }, // 158/512
{ -5.39056e-03, 3.06884e-02, -1.05798e-01, 3.68850e-01, 8.17677e-01, -1.35767e-01, 3.54392e-02, -5.93558e-03 }, // 159/512
{ -5.41467e-03, 3.08323e-02, -1.06342e-01, 3.71376e-01, 8.15826e-01, -1.36111e-01, 3.55525e-02, -5.95620e-03 }, // 160/512
{ -5.43860e-03, 3.09754e-02, -1.06883e-01, 3.73902e-01, 8.13967e-01, -1.36449e-01, 3.56642e-02, -5.97658e-03 }, // 161/512
{ -5.46235e-03, 3.11175e-02, -1.07422e-01, 3.76429e-01, 8.12102e-01, -1.36781e-01, 3.57745e-02, -5.99671e-03 }, // 162/512
{ -5.48592e-03, 3.12586e-02, -1.07957e-01, 3.78956e-01, 8.10229e-01, -1.37106e-01, 3.58832e-02, -6.01660e-03 }, // 163/512
{ -5.50931e-03, 3.13987e-02, -1.08490e-01, 3.81484e-01, 8.08348e-01, -1.37426e-01, 3.59905e-02, -6.03624e-03 }, // 164/512
{ -5.53252e-03, 3.15379e-02, -1.09020e-01, 3.84011e-01, 8.06461e-01, -1.37739e-01, 3.60962e-02, -6.05564e-03 }, // 165/512
{ -5.55554e-03, 3.16761e-02, -1.09548e-01, 3.86539e-01, 8.04567e-01, -1.38047e-01, 3.62005e-02, -6.07479e-03 }, // 166/512
{ -5.57837e-03, 3.18133e-02, -1.10072e-01, 3.89067e-01, 8.02666e-01, -1.38349e-01, 3.63032e-02, -6.09370e-03 }, // 167/512
{ -5.60103e-03, 3.19495e-02, -1.10593e-01, 3.91596e-01, 8.00757e-01, -1.38644e-01, 3.64044e-02, -6.11236e-03 }, // 168/512
{ -5.62349e-03, 3.20847e-02, -1.11112e-01, 3.94124e-01, 7.98842e-01, -1.38934e-01, 3.65041e-02, -6.13078e-03 }, // 169/512
{ -5.64577e-03, 3.22189e-02, -1.11628e-01, 3.96653e-01, 7.96920e-01, -1.39217e-01, 3.66023e-02, -6.14895e-03 }, // 170/512
{ -5.66786e-03, 3.23521e-02, -1.12140e-01, 3.99181e-01, 7.94991e-01, -1.39495e-01, 3.66989e-02, -6.16687e-03 }, // 171/512
{ -5.68976e-03, 3.24843e-02, -1.12650e-01, 4.01710e-01, 7.93055e-01, -1.39767e-01, 3.67941e-02, -6.18454e-03 }, // 172/512
{ -5.71146e-03, 3.26154e-02, -1.13157e-01, 4.04238e-01, 7.91113e-01, -1.40032e-01, 3.68878e-02, -6.20197e-03 }, // 173/512
{ -5.73298e-03, 3.27456e-02, -1.13660e-01, 4.06767e-01, 7.89163e-01, -1.40292e-01, 3.69799e-02, -6.21915e-03 }, // 174/512
{ -5.75431e-03, 3.28747e-02, -1.14161e-01, 4.09295e-01, 7.87207e-01, -1.40546e-01, 3.70705e-02, -6.23608e-03 }, // 175/512
{ -5.77544e-03, 3.30027e-02, -1.14659e-01, 4.11823e-01, 7.85244e-01, -1.40794e-01, 3.71596e-02, -6.25277e-03 }, // 176/512
{ -5.79639e-03, 3.31298e-02, -1.15153e-01, 4.14351e-01, 7.83275e-01, -1.41036e-01, 3.72473e-02, -6.26921e-03 }, // 177/512
{ -5.81713e-03, 3.32558e-02, -1.15644e-01, 4.16879e-01, 7.81299e-01, -1.41272e-01, 3.73333e-02, -6.28539e-03 }, // 178/512
{ -5.83768e-03, 3.33807e-02, -1.16133e-01, 4.19406e-01, 7.79316e-01, -1.41503e-01, 3.74179e-02, -6.30133e-03 }, // 179/512
{ -5.85804e-03, 3.35046e-02, -1.16618e-01, 4.21934e-01, 7.77327e-01, -1.41727e-01, 3.75010e-02, -6.31703e-03 }, // 180/512
{ -5.87820e-03, 3.36274e-02, -1.17100e-01, 4.24460e-01, 7.75331e-01, -1.41946e-01, 3.75826e-02, -6.33247e-03 }, // 181/512
{ -5.89816e-03, 3.37491e-02, -1.17578e-01, 4.26987e-01, 7.73329e-01, -1.42158e-01, 3.76626e-02, -6.34766e-03 }, // 182/512
{ -5.91792e-03, 3.38698e-02, -1.18054e-01, 4.29513e-01, 7.71320e-01, -1.42365e-01, 3.77411e-02, -6.36260e-03 }, // 183/512
{ -5.93749e-03, 3.39894e-02, -1.18526e-01, 4.32038e-01, 7.69305e-01, -1.42566e-01, 3.78182e-02, -6.37730e-03 }, // 184/512
{ -5.95685e-03, 3.41079e-02, -1.18995e-01, 4.34563e-01, 7.67284e-01, -1.42762e-01, 3.78937e-02, -6.39174e-03 }, // 185/512
{ -5.97602e-03, 3.42253e-02, -1.19461e-01, 4.37087e-01, 7.65256e-01, -1.42951e-01, 3.79677e-02, -6.40594e-03 }, // 186/512
{ -5.99498e-03, 3.43416e-02, -1.19923e-01, 4.39611e-01, 7.63222e-01, -1.43135e-01, 3.80402e-02, -6.41988e-03 }, // 187/512
{ -6.01374e-03, 3.44568e-02, -1.20382e-01, 4.42134e-01, 7.61181e-01, -1.43313e-01, 3.81112e-02, -6.43358e-03 }, // 188/512
{ -6.03230e-03, 3.45710e-02, -1.20838e-01, 4.44656e-01, 7.59135e-01, -1.43485e-01, 3.81806e-02, -6.44702e-03 }, // 189/512
{ -6.05065e-03, 3.46840e-02, -1.21290e-01, 4.47178e-01, 7.57082e-01, -1.43652e-01, 3.82486e-02, -6.46022e-03 }, // 190/512
{ -6.06880e-03, 3.47959e-02, -1.21739e-01, 4.49698e-01, 7.55023e-01, -1.43812e-01, 3.83150e-02, -6.47316e-03 }, // 191/512
{ -6.08674e-03, 3.49066e-02, -1.22185e-01, 4.52218e-01, 7.52958e-01, -1.43968e-01, 3.83800e-02, -6.48585e-03 }, // 192/512
{ -6.10448e-03, 3.50163e-02, -1.22627e-01, 4.54737e-01, 7.50887e-01, -1.44117e-01, 3.84434e-02, -6.49829e-03 }, // 193/512
{ -6.12201e-03, 3.51248e-02, -1.23066e-01, 4.57255e-01, 7.48810e-01, -1.44261e-01, 3.85054e-02, -6.51049e-03 }, // 194/512
{ -6.13933e-03, 3.52322e-02, -1.23501e-01, 4.59773e-01, 7.46726e-01, -1.44398e-01, 3.85658e-02, -6.52243e-03 }, // 195/512
{ -6.15644e-03, 3.53384e-02, -1.23932e-01, 4.62289e-01, 7.44637e-01, -1.44531e-01, 3.86247e-02, -6.53412e-03 }, // 196/512
{ -6.17335e-03, 3.54435e-02, -1.24361e-01, 4.64804e-01, 7.42542e-01, -1.44657e-01, 3.86821e-02, -6.54555e-03 }, // 197/512
{ -6.19004e-03, 3.55475e-02, -1.24785e-01, 4.67318e-01, 7.40441e-01, -1.44778e-01, 3.87381e-02, -6.55674e-03 }, // 198/512
{ -6.20653e-03, 3.56503e-02, -1.25206e-01, 4.69831e-01, 7.38335e-01, -1.44894e-01, 3.87925e-02, -6.56768e-03 }, // 199/512
{ -6.22280e-03, 3.57519e-02, -1.25624e-01, 4.72342e-01, 7.36222e-01, -1.45004e-01, 3.88454e-02, -6.57836e-03 }, // 200/512
{ -6.23886e-03, 3.58524e-02, -1.26038e-01, 4.74853e-01, 7.34104e-01, -1.45108e-01, 3.88968e-02, -6.58880e-03 }, // 201/512
{ -6.25471e-03, 3.59517e-02, -1.26448e-01, 4.77362e-01, 7.31979e-01, -1.45206e-01, 3.89467e-02, -6.59898e-03 }, // 202/512
{ -6.27035e-03, 3.60498e-02, -1.26855e-01, 4.79870e-01, 7.29850e-01, -1.45300e-01, 3.89951e-02, -6.60891e-03 }, // 203/512
{ -6.28577e-03, 3.61468e-02, -1.27258e-01, 4.82377e-01, 7.27714e-01, -1.45387e-01, 3.90420e-02, -6.61859e-03 }, // 204/512
{ -6.30097e-03, 3.62426e-02, -1.27657e-01, 4.84882e-01, 7.25573e-01, -1.45469e-01, 3.90874e-02, -6.62802e-03 }, // 205/512
{ -6.31597e-03, 3.63372e-02, -1.28052e-01, 4.87386e-01, 7.23426e-01, -1.45545e-01, 3.91314e-02, -6.63719e-03 }, // 206/512
{ -6.33074e-03, 3.64306e-02, -1.28444e-01, 4.89888e-01, 7.21274e-01, -1.45616e-01, 3.91738e-02, -6.64612e-03 }, // 207/512
{ -6.34530e-03, 3.65227e-02, -1.28832e-01, 4.92389e-01, 7.19116e-01, -1.45682e-01, 3.92147e-02, -6.65479e-03 }, // 208/512
{ -6.35964e-03, 3.66137e-02, -1.29217e-01, 4.94888e-01, 7.16953e-01, -1.45742e-01, 3.92542e-02, -6.66322e-03 }, // 209/512
{ -6.37376e-03, 3.67035e-02, -1.29597e-01, 4.97386e-01, 7.14784e-01, -1.45796e-01, 3.92921e-02, -6.67139e-03 }, // 210/512
{ -6.38767e-03, 3.67921e-02, -1.29974e-01, 4.99882e-01, 7.12610e-01, -1.45845e-01, 3.93286e-02, -6.67931e-03 }, // 211/512
{ -6.40135e-03, 3.68795e-02, -1.30347e-01, 5.02377e-01, 7.10431e-01, -1.45889e-01, 3.93636e-02, -6.68698e-03 }, // 212/512
{ -6.41482e-03, 3.69656e-02, -1.30716e-01, 5.04869e-01, 7.08246e-01, -1.45927e-01, 3.93971e-02, -6.69440e-03 }, // 213/512
{ -6.42806e-03, 3.70505e-02, -1.31081e-01, 5.07360e-01, 7.06056e-01, -1.45960e-01, 3.94291e-02, -6.70156e-03 }, // 214/512
{ -6.44108e-03, 3.71342e-02, -1.31442e-01, 5.09849e-01, 7.03861e-01, -1.45987e-01, 3.94596e-02, -6.70848e-03 }, // 215/512
{ -6.45388e-03, 3.72167e-02, -1.31800e-01, 5.12337e-01, 7.01661e-01, -1.46009e-01, 3.94886e-02, -6.71514e-03 }, // 216/512
{ -6.46646e-03, 3.72979e-02, -1.32153e-01, 5.14822e-01, 6.99455e-01, -1.46026e-01, 3.95162e-02, -6.72155e-03 }, // 217/512
{ -6.47882e-03, 3.73779e-02, -1.32503e-01, 5.17306e-01, 6.97244e-01, -1.46037e-01, 3.95423e-02, -6.72772e-03 }, // 218/512
{ -6.49095e-03, 3.74566e-02, -1.32848e-01, 5.19787e-01, 6.95029e-01, -1.46043e-01, 3.95669e-02, -6.73363e-03 }, // 219/512
{ -6.50285e-03, 3.75341e-02, -1.33190e-01, 5.22267e-01, 6.92808e-01, -1.46043e-01, 3.95900e-02, -6.73929e-03 }, // 220/512
{ -6.51454e-03, 3.76104e-02, -1.33527e-01, 5.24744e-01, 6.90582e-01, -1.46039e-01, 3.96117e-02, -6.74470e-03 }, // 221/512
{ -6.52599e-03, 3.76853e-02, -1.33860e-01, 5.27219e-01, 6.88351e-01, -1.46029e-01, 3.96319e-02, -6.74986e-03 }, // 222/512
{ -6.53722e-03, 3.77590e-02, -1.34190e-01, 5.29693e-01, 6.86116e-01, -1.46013e-01, 3.96506e-02, -6.75477e-03 }, // 223/512
{ -6.54823e-03, 3.78315e-02, -1.34515e-01, 5.32164e-01, 6.83875e-01, -1.45993e-01, 3.96678e-02, -6.75943e-03 }, // 224/512
{ -6.55900e-03, 3.79027e-02, -1.34836e-01, 5.34633e-01, 6.81630e-01, -1.45967e-01, 3.96836e-02, -6.76384e-03 }, // 225/512
{ -6.56955e-03, 3.79726e-02, -1.35154e-01, 5.37099e-01, 6.79379e-01, -1.45936e-01, 3.96979e-02, -6.76800e-03 }, // 226/512
{ -6.57987e-03, 3.80412e-02, -1.35467e-01, 5.39563e-01, 6.77124e-01, -1.45900e-01, 3.97108e-02, -6.77191e-03 }, // 227/512
{ -6.58996e-03, 3.81085e-02, -1.35775e-01, 5.42025e-01, 6.74865e-01, -1.45859e-01, 3.97222e-02, -6.77557e-03 }, // 228/512
{ -6.59982e-03, 3.81746e-02, -1.36080e-01, 5.44485e-01, 6.72600e-01, -1.45812e-01, 3.97321e-02, -6.77898e-03 }, // 229/512
{ -6.60945e-03, 3.82393e-02, -1.36380e-01, 5.46942e-01, 6.70331e-01, -1.45760e-01, 3.97406e-02, -6.78214e-03 }, // 230/512
{ -6.61885e-03, 3.83028e-02, -1.36677e-01, 5.49397e-01, 6.68057e-01, -1.45703e-01, 3.97476e-02, -6.78505e-03 }, // 231/512
{ -6.62802e-03, 3.83650e-02, -1.36969e-01, 5.51849e-01, 6.65779e-01, -1.45641e-01, 3.97532e-02, -6.78771e-03 }, // 232/512
{ -6.63696e-03, 3.84258e-02, -1.37257e-01, 5.54298e-01, 6.63496e-01, -1.45574e-01, 3.97573e-02, -6.79012e-03 }, // 233/512
{ -6.64567e-03, 3.84854e-02, -1.37540e-01, 5.56745e-01, 6.61209e-01, -1.45502e-01, 3.97600e-02, -6.79229e-03 }, // 234/512
{ -6.65414e-03, 3.85436e-02, -1.37819e-01, 5.59189e-01, 6.58917e-01, -1.45425e-01, 3.97612e-02, -6.79421e-03 }, // 235/512
{ -6.66238e-03, 3.86006e-02, -1.38094e-01, 5.61631e-01, 6.56621e-01, -1.45343e-01, 3.97610e-02, -6.79587e-03 }, // 236/512
{ -6.67039e-03, 3.86562e-02, -1.38365e-01, 5.64070e-01, 6.54321e-01, -1.45255e-01, 3.97594e-02, -6.79730e-03 }, // 237/512
{ -6.67816e-03, 3.87105e-02, -1.38631e-01, 5.66506e-01, 6.52016e-01, -1.45163e-01, 3.97563e-02, -6.79847e-03 }, // 238/512
{ -6.68570e-03, 3.87635e-02, -1.38893e-01, 5.68939e-01, 6.49707e-01, -1.45065e-01, 3.97518e-02, -6.79939e-03 }, // 239/512
{ -6.69300e-03, 3.88151e-02, -1.39150e-01, 5.71370e-01, 6.47394e-01, -1.44963e-01, 3.97458e-02, -6.80007e-03 }, // 240/512
{ -6.70007e-03, 3.88654e-02, -1.39403e-01, 5.73797e-01, 6.45076e-01, -1.44855e-01, 3.97384e-02, -6.80050e-03 }, // 241/512
{ -6.70690e-03, 3.89144e-02, -1.39652e-01, 5.76222e-01, 6.42755e-01, -1.44743e-01, 3.97296e-02, -6.80069e-03 }, // 242/512
{ -6.71350e-03, 3.89620e-02, -1.39896e-01, 5.78644e-01, 6.40429e-01, -1.44626e-01, 3.97194e-02, -6.80063e-03 }, // 243/512
{ -6.71985e-03, 3.90083e-02, -1.40136e-01, 5.81062e-01, 6.38099e-01, -1.44503e-01, 3.97077e-02, -6.80032e-03 }, // 244/512
{ -6.72597e-03, 3.90532e-02, -1.40371e-01, 5.83478e-01, 6.35765e-01, -1.44376e-01, 3.96946e-02, -6.79976e-03 }, // 245/512
{ -6.73186e-03, 3.90968e-02, -1.40602e-01, 5.85891e-01, 6.33427e-01, -1.44244e-01, 3.96801e-02, -6.79896e-03 }, // 246/512
{ -6.73750e-03, 3.91391e-02, -1.40828e-01, 5.88300e-01, 6.31085e-01, -1.44107e-01, 3.96642e-02, -6.79792e-03 }, // 247/512
{ -6.74291e-03, 3.91800e-02, -1.41050e-01, 5.90706e-01, 6.28739e-01, -1.43965e-01, 3.96469e-02, -6.79663e-03 }, // 248/512
{ -6.74807e-03, 3.92195e-02, -1.41267e-01, 5.93109e-01, 6.26389e-01, -1.43819e-01, 3.96282e-02, -6.79509e-03 }, // 249/512
{ -6.75300e-03, 3.92576e-02, -1.41480e-01, 5.95509e-01, 6.24036e-01, -1.43667e-01, 3.96080e-02, -6.79331e-03 }, // 250/512
{ -6.75769e-03, 3.92944e-02, -1.41688e-01, 5.97905e-01, 6.21679e-01, -1.43511e-01, 3.95865e-02, -6.79129e-03 }, // 251/512
{ -6.76214e-03, 3.93299e-02, -1.41891e-01, 6.00298e-01, 6.19318e-01, -1.43350e-01, 3.95635e-02, -6.78902e-03 }, // 252/512
{ -6.76634e-03, 3.93639e-02, -1.42090e-01, 6.02688e-01, 6.16953e-01, -1.43184e-01, 3.95392e-02, -6.78651e-03 }, // 253/512
{ -6.77031e-03, 3.93966e-02, -1.42284e-01, 6.05074e-01, 6.14584e-01, -1.43013e-01, 3.95134e-02, -6.78375e-03 }, // 254/512
{ -6.77403e-03, 3.94279e-02, -1.42473e-01, 6.07457e-01, 6.12212e-01, -1.42838e-01, 3.94863e-02, -6.78075e-03 }, // 255/512
{ -6.77751e-03, 3.94578e-02, -1.42658e-01, 6.09836e-01, 6.09836e-01, -1.42658e-01, 3.94578e-02, -6.77751e-03 }, // 256/512
{ -6.78075e-03, 3.94863e-02, -1.42838e-01, 6.12212e-01, 6.07457e-01, -1.42473e-01, 3.94279e-02, -6.77403e-03 }, // 257/512
{ -6.78375e-03, 3.95134e-02, -1.43013e-01, 6.14584e-01, 6.05074e-01, -1.42284e-01, 3.93966e-02, -6.77031e-03 }, // 258/512
{ -6.78651e-03, 3.95392e-02, -1.43184e-01, 6.16953e-01, 6.02688e-01, -1.42090e-01, 3.93639e-02, -6.76634e-03 }, // 259/512
{ -6.78902e-03, 3.95635e-02, -1.43350e-01, 6.19318e-01, 6.00298e-01, -1.41891e-01, 3.93299e-02, -6.76214e-03 }, // 260/512
{ -6.79129e-03, 3.95865e-02, -1.43511e-01, 6.21679e-01, 5.97905e-01, -1.41688e-01, 3.92944e-02, -6.75769e-03 }, // 261/512
{ -6.79331e-03, 3.96080e-02, -1.43667e-01, 6.24036e-01, 5.95509e-01, -1.41480e-01, 3.92576e-02, -6.75300e-03 }, // 262/512
{ -6.79509e-03, 3.96282e-02, -1.43819e-01, 6.26389e-01, 5.93109e-01, -1.41267e-01, 3.92195e-02, -6.74807e-03 }, // 263/512
{ -6.79663e-03, 3.96469e-02, -1.43965e-01, 6.28739e-01, 5.90706e-01, -1.41050e-01, 3.91800e-02, -6.74291e-03 }, // 264/512
{ -6.79792e-03, 3.96642e-02, -1.44107e-01, 6.31085e-01, 5.88300e-01, -1.40828e-01, 3.91391e-02, -6.73750e-03 }, // 265/512
{ -6.79896e-03, 3.96801e-02, -1.44244e-01, 6.33427e-01, 5.85891e-01, -1.40602e-01, 3.90968e-02, -6.73186e-03 }, // 266/512
{ -6.79976e-03, 3.96946e-02, -1.44376e-01, 6.35765e-01, 5.83478e-01, -1.40371e-01, 3.90532e-02, -6.72597e-03 }, // 267/512
{ -6.80032e-03, 3.97077e-02, -1.44503e-01, 6.38099e-01, 5.81062e-01, -1.40136e-01, 3.90083e-02, -6.71985e-03 }, // 268/512
{ -6.80063e-03, 3.97194e-02, -1.44626e-01, 6.40429e-01, 5.78644e-01, -1.39896e-01, 3.89620e-02, -6.71350e-03 }, // 269/512
{ -6.80069e-03, 3.97296e-02, -1.44743e-01, 6.42755e-01, 5.76222e-01, -1.39652e-01, 3.89144e-02, -6.70690e-03 }, // 270/512
{ -6.80050e-03, 3.97384e-02, -1.44855e-01, 6.45076e-01, 5.73797e-01, -1.39403e-01, 3.88654e-02, -6.70007e-03 }, // 271/512
{ -6.80007e-03, 3.97458e-02, -1.44963e-01, 6.47394e-01, 5.71370e-01, -1.39150e-01, 3.88151e-02, -6.69300e-03 }, // 272/512
{ -6.79939e-03, 3.97518e-02, -1.45065e-01, 6.49707e-01, 5.68939e-01, -1.38893e-01, 3.87635e-02, -6.68570e-03 }, // 273/512
{ -6.79847e-03, 3.97563e-02, -1.45163e-01, 6.52016e-01, 5.66506e-01, -1.38631e-01, 3.87105e-02, -6.67816e-03 }, // 274/512
{ -6.79730e-03, 3.97594e-02, -1.45255e-01, 6.54321e-01, 5.64070e-01, -1.38365e-01, 3.86562e-02, -6.67039e-03 }, // 275/512
{ -6.79587e-03, 3.97610e-02, -1.45343e-01, 6.56621e-01, 5.61631e-01, -1.38094e-01, 3.86006e-02, -6.66238e-03 }, // 276/512
{ -6.79421e-03, 3.97612e-02, -1.45425e-01, 6.58917e-01, 5.59189e-01, -1.37819e-01, 3.85436e-02, -6.65414e-03 }, // 277/512
{ -6.79229e-03, 3.97600e-02, -1.45502e-01, 6.61209e-01, 5.56745e-01, -1.37540e-01, 3.84854e-02, -6.64567e-03 }, // 278/512
{ -6.79012e-03, 3.97573e-02, -1.45574e-01, 6.63496e-01, 5.54298e-01, -1.37257e-01, 3.84258e-02, -6.63696e-03 }, // 279/512
{ -6.78771e-03, 3.97532e-02, -1.45641e-01, 6.65779e-01, 5.51849e-01, -1.36969e-01, 3.83650e-02, -6.62802e-03 }, // 280/512
{ -6.78505e-03, 3.97476e-02, -1.45703e-01, 6.68057e-01, 5.49397e-01, -1.36677e-01, 3.83028e-02, -6.61885e-03 }, // 281/512
{ -6.78214e-03, 3.97406e-02, -1.45760e-01, 6.70331e-01, 5.46942e-01, -1.36380e-01, 3.82393e-02, -6.60945e-03 }, // 282/512
{ -6.77898e-03, 3.97321e-02, -1.45812e-01, 6.72600e-01, 5.44485e-01, -1.36080e-01, 3.81746e-02, -6.59982e-03 }, // 283/512
{ -6.77557e-03, 3.97222e-02, -1.45859e-01, 6.74865e-01, 5.42025e-01, -1.35775e-01, 3.81085e-02, -6.58996e-03 }, // 284/512
{ -6.77191e-03, 3.97108e-02, -1.45900e-01, 6.77124e-01, 5.39563e-01, -1.35467e-01, 3.80412e-02, -6.57987e-03 }, // 285/512
{ -6.76800e-03, 3.96979e-02, -1.45936e-01, 6.79379e-01, 5.37099e-01, -1.35154e-01, 3.79726e-02, -6.56955e-03 }, // 286/512
{ -6.76384e-03, 3.96836e-02, -1.45967e-01, 6.81630e-01, 5.34633e-01, -1.34836e-01, 3.79027e-02, -6.55900e-03 }, // 287/512
{ -6.75943e-03, 3.96678e-02, -1.45993e-01, 6.83875e-01, 5.32164e-01, -1.34515e-01, 3.78315e-02, -6.54823e-03 }, // 288/512
{ -6.75477e-03, 3.96506e-02, -1.46013e-01, 6.86116e-01, 5.29693e-01, -1.34190e-01, 3.77590e-02, -6.53722e-03 }, // 289/512
{ -6.74986e-03, 3.96319e-02, -1.46029e-01, 6.88351e-01, 5.27219e-01, -1.33860e-01, 3.76853e-02, -6.52599e-03 }, // 290/512
{ -6.74470e-03, 3.96117e-02, -1.46039e-01, 6.90582e-01, 5.24744e-01, -1.33527e-01, 3.76104e-02, -6.51454e-03 }, // 291/512
{ -6.73929e-03, 3.95900e-02, -1.46043e-01, 6.92808e-01, 5.22267e-01, -1.33190e-01, 3.75341e-02, -6.50285e-03 }, // 292/512
{ -6.73363e-03, 3.95669e-02, -1.46043e-01, 6.95029e-01, 5.19787e-01, -1.32848e-01, 3.74566e-02, -6.49095e-03 }, // 293/512
{ -6.72772e-03, 3.95423e-02, -1.46037e-01, 6.97244e-01, 5.17306e-01, -1.32503e-01, 3.73779e-02, -6.47882e-03 }, // 294/512
{ -6.72155e-03, 3.95162e-02, -1.46026e-01, 6.99455e-01, 5.14822e-01, -1.32153e-01, 3.72979e-02, -6.46646e-03 }, // 295/512
{ -6.71514e-03, 3.94886e-02, -1.46009e-01, 7.01661e-01, 5.12337e-01, -1.31800e-01, 3.72167e-02, -6.45388e-03 }, // 296/512
{ -6.70848e-03, 3.94596e-02, -1.45987e-01, 7.03861e-01, 5.09849e-01, -1.31442e-01, 3.71342e-02, -6.44108e-03 }, // 297/512
{ -6.70156e-03, 3.94291e-02, -1.45960e-01, 7.06056e-01, 5.07360e-01, -1.31081e-01, 3.70505e-02, -6.42806e-03 }, // 298/512
{ -6.69440e-03, 3.93971e-02, -1.45927e-01, 7.08246e-01, 5.04869e-01, -1.30716e-01, 3.69656e-02, -6.41482e-03 }, // 299/512
{ -6.68698e-03, 3.93636e-02, -1.45889e-01, 7.10431e-01, 5.02377e-01, -1.30347e-01, 3.68795e-02, -6.40135e-03 }, // 300/512
{ -6.67931e-03, 3.93286e-02, -1.45845e-01, 7.12610e-01, 4.99882e-01, -1.29974e-01, 3.67921e-02, -6.38767e-03 }, // 301/512
{ -6.67139e-03, 3.92921e-02, -1.45796e-01, 7.14784e-01, 4.97386e-01, -1.29597e-01, 3.67035e-02, -6.37376e-03 }, // 302/512
{ -6.66322e-03, 3.92542e-02, -1.45742e-01, 7.16953e-01, 4.94888e-01, -1.29217e-01, 3.66137e-02, -6.35964e-03 }, // 303/512
{ -6.65479e-03, 3.92147e-02, -1.45682e-01, 7.19116e-01, 4.92389e-01, -1.28832e-01, 3.65227e-02, -6.34530e-03 }, // 304/512
{ -6.64612e-03, 3.91738e-02, -1.45616e-01, 7.21274e-01, 4.89888e-01, -1.28444e-01, 3.64306e-02, -6.33074e-03 }, // 305/512
{ -6.63719e-03, 3.91314e-02, -1.45545e-01, 7.23426e-01, 4.87386e-01, -1.28052e-01, 3.63372e-02, -6.31597e-03 }, // 306/512
{ -6.62802e-03, 3.90874e-02, -1.45469e-01, 7.25573e-01, 4.84882e-01, -1.27657e-01, 3.62426e-02, -6.30097e-03 }, // 307/512
{ -6.61859e-03, 3.90420e-02, -1.45387e-01, 7.27714e-01, 4.82377e-01, -1.27258e-01, 3.61468e-02, -6.28577e-03 }, // 308/512
{ -6.60891e-03, 3.89951e-02, -1.45300e-01, 7.29850e-01, 4.79870e-01, -1.26855e-01, 3.60498e-02, -6.27035e-03 }, // 309/512
{ -6.59898e-03, 3.89467e-02, -1.45206e-01, 7.31979e-01, 4.77362e-01, -1.26448e-01, 3.59517e-02, -6.25471e-03 }, // 310/512
{ -6.58880e-03, 3.88968e-02, -1.45108e-01, 7.34104e-01, 4.74853e-01, -1.26038e-01, 3.58524e-02, -6.23886e-03 }, // 311/512
{ -6.57836e-03, 3.88454e-02, -1.45004e-01, 7.36222e-01, 4.72342e-01, -1.25624e-01, 3.57519e-02, -6.22280e-03 }, // 312/512
{ -6.56768e-03, 3.87925e-02, -1.44894e-01, 7.38335e-01, 4.69831e-01, -1.25206e-01, 3.56503e-02, -6.20653e-03 }, // 313/512
{ -6.55674e-03, 3.87381e-02, -1.44778e-01, 7.40441e-01, 4.67318e-01, -1.24785e-01, 3.55475e-02, -6.19004e-03 }, // 314/512
{ -6.54555e-03, 3.86821e-02, -1.44657e-01, 7.42542e-01, 4.64804e-01, -1.24361e-01, 3.54435e-02, -6.17335e-03 }, // 315/512
{ -6.53412e-03, 3.86247e-02, -1.44531e-01, 7.44637e-01, 4.62289e-01, -1.23932e-01, 3.53384e-02, -6.15644e-03 }, // 316/512
{ -6.52243e-03, 3.85658e-02, -1.44398e-01, 7.46726e-01, 4.59773e-01, -1.23501e-01, 3.52322e-02, -6.13933e-03 }, // 317/512
{ -6.51049e-03, 3.85054e-02, -1.44261e-01, 7.48810e-01, 4.57255e-01, -1.23066e-01, 3.51248e-02, -6.12201e-03 }, // 318/512
{ -6.49829e-03, 3.84434e-02, -1.44117e-01, 7.50887e-01, 4.54737e-01, -1.22627e-01, 3.50163e-02, -6.10448e-03 }, // 319/512
{ -6.48585e-03, 3.83800e-02, -1.43968e-01, 7.52958e-01, 4.52218e-01, -1.22185e-01, 3.49066e-02, -6.08674e-03 }, // 320/512
{ -6.47316e-03, 3.83150e-02, -1.43812e-01, 7.55023e-01, 4.49698e-01, -1.21739e-01, 3.47959e-02, -6.06880e-03 }, // 321/512
{ -6.46022e-03, 3.82486e-02, -1.43652e-01, 7.57082e-01, 4.47178e-01, -1.21290e-01, 3.46840e-02, -6.05065e-03 }, // 322/512
{ -6.44702e-03, 3.81806e-02, -1.43485e-01, 7.59135e-01, 4.44656e-01, -1.20838e-01, 3.45710e-02, -6.03230e-03 }, // 323/512
{ -6.43358e-03, 3.81112e-02, -1.43313e-01, 7.61181e-01, 4.42134e-01, -1.20382e-01, 3.44568e-02, -6.01374e-03 }, // 324/512
{ -6.41988e-03, 3.80402e-02, -1.43135e-01, 7.63222e-01, 4.39611e-01, -1.19923e-01, 3.43416e-02, -5.99498e-03 }, // 325/512
{ -6.40594e-03, 3.79677e-02, -1.42951e-01, 7.65256e-01, 4.37087e-01, -1.19461e-01, 3.42253e-02, -5.97602e-03 }, // 326/512
{ -6.39174e-03, 3.78937e-02, -1.42762e-01, 7.67284e-01, 4.34563e-01, -1.18995e-01, 3.41079e-02, -5.95685e-03 }, // 327/512
{ -6.37730e-03, 3.78182e-02, -1.42566e-01, 7.69305e-01, 4.32038e-01, -1.18526e-01, 3.39894e-02, -5.93749e-03 }, // 328/512
{ -6.36260e-03, 3.77411e-02, -1.42365e-01, 7.71320e-01, 4.29513e-01, -1.18054e-01, 3.38698e-02, -5.91792e-03 }, // 329/512
{ -6.34766e-03, 3.76626e-02, -1.42158e-01, 7.73329e-01, 4.26987e-01, -1.17578e-01, 3.37491e-02, -5.89816e-03 }, // 330/512
{ -6.33247e-03, 3.75826e-02, -1.41946e-01, 7.75331e-01, 4.24460e-01, -1.17100e-01, 3.36274e-02, -5.87820e-03 }, // 331/512
{ -6.31703e-03, 3.75010e-02, -1.41727e-01, 7.77327e-01, 4.21934e-01, -1.16618e-01, 3.35046e-02, -5.85804e-03 }, // 332/512
{ -6.30133e-03, 3.74179e-02, -1.41503e-01, 7.79316e-01, 4.19406e-01, -1.16133e-01, 3.33807e-02, -5.83768e-03 }, // 333/512
{ -6.28539e-03, 3.73333e-02, -1.41272e-01, 7.81299e-01, 4.16879e-01, -1.15644e-01, 3.32558e-02, -5.81713e-03 }, // 334/512
{ -6.26921e-03, 3.72473e-02, -1.41036e-01, 7.83275e-01, 4.14351e-01, -1.15153e-01, 3.31298e-02, -5.79639e-03 }, // 335/512
{ -6.25277e-03, 3.71596e-02, -1.40794e-01, 7.85244e-01, 4.11823e-01, -1.14659e-01, 3.30027e-02, -5.77544e-03 }, // 336/512
{ -6.23608e-03, 3.70705e-02, -1.40546e-01, 7.87207e-01, 4.09295e-01, -1.14161e-01, 3.28747e-02, -5.75431e-03 }, // 337/512
{ -6.21915e-03, 3.69799e-02, -1.40292e-01, 7.89163e-01, 4.06767e-01, -1.13660e-01, 3.27456e-02, -5.73298e-03 }, // 338/512
{ -6.20197e-03, 3.68878e-02, -1.40032e-01, 7.91113e-01, 4.04238e-01, -1.13157e-01, 3.26154e-02, -5.71146e-03 }, // 339/512
{ -6.18454e-03, 3.67941e-02, -1.39767e-01, 7.93055e-01, 4.01710e-01, -1.12650e-01, 3.24843e-02, -5.68976e-03 }, // 340/512
{ -6.16687e-03, 3.66989e-02, -1.39495e-01, 7.94991e-01, 3.99181e-01, -1.12140e-01, 3.23521e-02, -5.66786e-03 }, // 341/512
{ -6.14895e-03, 3.66023e-02, -1.39217e-01, 7.96920e-01, 3.96653e-01, -1.11628e-01, 3.22189e-02, -5.64577e-03 }, // 342/512
{ -6.13078e-03, 3.65041e-02, -1.38934e-01, 7.98842e-01, 3.94124e-01, -1.11112e-01, 3.20847e-02, -5.62349e-03 }, // 343/512
{ -6.11236e-03, 3.64044e-02, -1.38644e-01, 8.00757e-01, 3.91596e-01, -1.10593e-01, 3.19495e-02, -5.60103e-03 }, // 344/512
{ -6.09370e-03, 3.63032e-02, -1.38349e-01, 8.02666e-01, 3.89067e-01, -1.10072e-01, 3.18133e-02, -5.57837e-03 }, // 345/512
{ -6.07479e-03, 3.62005e-02, -1.38047e-01, 8.04567e-01, 3.86539e-01, -1.09548e-01, 3.16761e-02, -5.55554e-03 }, // 346/512
{ -6.05564e-03, 3.60962e-02, -1.37739e-01, 8.06461e-01, 3.84011e-01, -1.09020e-01, 3.15379e-02, -5.53252e-03 }, // 347/512
{ -6.03624e-03, 3.59905e-02, -1.37426e-01, 8.08348e-01, 3.81484e-01, -1.08490e-01, 3.13987e-02, -5.50931e-03 }, // 348/512
{ -6.01660e-03, 3.58832e-02, -1.37106e-01, 8.10229e-01, 3.78956e-01, -1.07957e-01, 3.12586e-02, -5.48592e-03 }, // 349/512
{ -5.99671e-03, 3.57745e-02, -1.36781e-01, 8.12102e-01, 3.76429e-01, -1.07422e-01, 3.11175e-02, -5.46235e-03 }, // 350/512
{ -5.97658e-03, 3.56642e-02, -1.36449e-01, 8.13967e-01, 3.73902e-01, -1.06883e-01, 3.09754e-02, -5.43860e-03 }, // 351/512
{ -5.95620e-03, 3.55525e-02, -1.36111e-01, 8.15826e-01, 3.71376e-01, -1.06342e-01, 3.08323e-02, -5.41467e-03 }, // 352/512
{ -5.93558e-03, 3.54392e-02, -1.35767e-01, 8.17677e-01, 3.68850e-01, -1.05798e-01, 3.06884e-02, -5.39056e-03 }, // 353/512
{ -5.91472e-03, 3.53244e-02, -1.35417e-01, 8.19522e-01, 3.66325e-01, -1.05251e-01, 3.05434e-02, -5.36627e-03 }, // 354/512
{ -5.89362e-03, 3.52081e-02, -1.35061e-01, 8.21358e-01, 3.63800e-01, -1.04702e-01, 3.03976e-02, -5.34180e-03 }, // 355/512
{ -5.87227e-03, 3.50903e-02, -1.34699e-01, 8.23188e-01, 3.61276e-01, -1.04150e-01, 3.02507e-02, -5.31716e-03 }, // 356/512
{ -5.85068e-03, 3.49710e-02, -1.34331e-01, 8.25010e-01, 3.58753e-01, -1.03595e-01, 3.01030e-02, -5.29234e-03 }, // 357/512
{ -5.82885e-03, 3.48503e-02, -1.33957e-01, 8.26825e-01, 3.56230e-01, -1.03038e-01, 2.99543e-02, -5.26734e-03 }, // 358/512
{ -5.80677e-03, 3.47280e-02, -1.33576e-01, 8.28632e-01, 3.53708e-01, -1.02478e-01, 2.98048e-02, -5.24218e-03 }, // 359/512
{ -5.78446e-03, 3.46042e-02, -1.33189e-01, 8.30432e-01, 3.51186e-01, -1.01915e-01, 2.96543e-02, -5.21683e-03 }, // 360/512
{ -5.76190e-03, 3.44789e-02, -1.32797e-01, 8.32225e-01, 3.48666e-01, -1.01350e-01, 2.95029e-02, -5.19132e-03 }, // 361/512
{ -5.73911e-03, 3.43521e-02, -1.32398e-01, 8.34009e-01, 3.46146e-01, -1.00783e-01, 2.93506e-02, -5.16564e-03 }, // 362/512
{ -5.71607e-03, 3.42238e-02, -1.31993e-01, 8.35787e-01, 3.43627e-01, -1.00213e-01, 2.91974e-02, -5.13978e-03 }, // 363/512
{ -5.69280e-03, 3.40940e-02, -1.31581e-01, 8.37557e-01, 3.41109e-01, -9.96402e-02, 2.90433e-02, -5.11376e-03 }, // 364/512
{ -5.66928e-03, 3.39628e-02, -1.31164e-01, 8.39319e-01, 3.38592e-01, -9.90651e-02, 2.88883e-02, -5.08757e-03 }, // 365/512
{ -5.64553e-03, 3.38300e-02, -1.30740e-01, 8.41073e-01, 3.36076e-01, -9.84876e-02, 2.87325e-02, -5.06121e-03 }, // 366/512
{ -5.62154e-03, 3.36957e-02, -1.30311e-01, 8.42820e-01, 3.33561e-01, -9.79077e-02, 2.85758e-02, -5.03469e-03 }, // 367/512
{ -5.59731e-03, 3.35600e-02, -1.29874e-01, 8.44559e-01, 3.31048e-01, -9.73254e-02, 2.84182e-02, -5.00800e-03 }, // 368/512
{ -5.57285e-03, 3.34227e-02, -1.29432e-01, 8.46290e-01, 3.28535e-01, -9.67408e-02, 2.82598e-02, -4.98114e-03 }, // 369/512
{ -5.54815e-03, 3.32840e-02, -1.28984e-01, 8.48013e-01, 3.26023e-01, -9.61537e-02, 2.81005e-02, -4.95413e-03 }, // 370/512
{ -5.52321e-03, 3.31438e-02, -1.28529e-01, 8.49729e-01, 3.23513e-01, -9.55644e-02, 2.79403e-02, -4.92695e-03 }, // 371/512
{ -5.49804e-03, 3.30021e-02, -1.28068e-01, 8.51437e-01, 3.21004e-01, -9.49727e-02, 2.77794e-02, -4.89961e-03 }, // 372/512
{ -5.47263e-03, 3.28589e-02, -1.27601e-01, 8.53137e-01, 3.18496e-01, -9.43788e-02, 2.76176e-02, -4.87211e-03 }, // 373/512
{ -5.44699e-03, 3.27143e-02, -1.27127e-01, 8.54829e-01, 3.15989e-01, -9.37826e-02, 2.74549e-02, -4.84445e-03 }, // 374/512
{ -5.42111e-03, 3.25681e-02, -1.26648e-01, 8.56513e-01, 3.13484e-01, -9.31841e-02, 2.72915e-02, -4.81663e-03 }, // 375/512
{ -5.39500e-03, 3.24205e-02, -1.26161e-01, 8.58189e-01, 3.10980e-01, -9.25834e-02, 2.71272e-02, -4.78866e-03 }, // 376/512
{ -5.36865e-03, 3.22714e-02, -1.25669e-01, 8.59857e-01, 3.08478e-01, -9.19806e-02, 2.69621e-02, -4.76052e-03 }, // 377/512
{ -5.34208e-03, 3.21209e-02, -1.25171e-01, 8.61517e-01, 3.05977e-01, -9.13756e-02, 2.67962e-02, -4.73224e-03 }, // 378/512
{ -5.31527e-03, 3.19688e-02, -1.24666e-01, 8.63168e-01, 3.03478e-01, -9.07684e-02, 2.66296e-02, -4.70380e-03 }, // 379/512
{ -5.28823e-03, 3.18153e-02, -1.24154e-01, 8.64812e-01, 3.00980e-01, -9.01591e-02, 2.64621e-02, -4.67520e-03 }, // 380/512
{ -5.26095e-03, 3.16603e-02, -1.23637e-01, 8.66448e-01, 2.98484e-01, -8.95477e-02, 2.62938e-02, -4.64646e-03 }, // 381/512
{ -5.23345e-03, 3.15039e-02, -1.23113e-01, 8.68075e-01, 2.95990e-01, -8.89342e-02, 2.61248e-02, -4.61756e-03 }, // 382/512
{ -5.20572e-03, 3.13460e-02, -1.22583e-01, 8.69694e-01, 2.93497e-01, -8.83187e-02, 2.59550e-02, -4.58851e-03 }, // 383/512
{ -5.17776e-03, 3.11866e-02, -1.22047e-01, 8.71305e-01, 2.91006e-01, -8.77011e-02, 2.57844e-02, -4.55932e-03 }, // 384/512
{ -5.14957e-03, 3.10258e-02, -1.21504e-01, 8.72908e-01, 2.88517e-01, -8.70815e-02, 2.56131e-02, -4.52998e-03 }, // 385/512
{ -5.12115e-03, 3.08635e-02, -1.20955e-01, 8.74503e-01, 2.86029e-01, -8.64599e-02, 2.54410e-02, -4.50049e-03 }, // 386/512
{ -5.09251e-03, 3.06997e-02, -1.20399e-01, 8.76089e-01, 2.83543e-01, -8.58364e-02, 2.52681e-02, -4.47085e-03 }, // 387/512
{ -5.06363e-03, 3.05345e-02, -1.19837e-01, 8.77666e-01, 2.81060e-01, -8.52109e-02, 2.50946e-02, -4.44107e-03 }, // 388/512
{ -5.03454e-03, 3.03679e-02, -1.19269e-01, 8.79236e-01, 2.78578e-01, -8.45835e-02, 2.49203e-02, -4.41114e-03 }, // 389/512
{ -5.00521e-03, 3.01998e-02, -1.18694e-01, 8.80797e-01, 2.76098e-01, -8.39542e-02, 2.47452e-02, -4.38108e-03 }, // 390/512
{ -4.97566e-03, 3.00303e-02, -1.18113e-01, 8.82349e-01, 2.73620e-01, -8.33231e-02, 2.45695e-02, -4.35087e-03 }, // 391/512
{ -4.94589e-03, 2.98593e-02, -1.17526e-01, 8.83893e-01, 2.71144e-01, -8.26900e-02, 2.43930e-02, -4.32052e-03 }, // 392/512
{ -4.91589e-03, 2.96868e-02, -1.16932e-01, 8.85429e-01, 2.68671e-01, -8.20552e-02, 2.42158e-02, -4.29003e-03 }, // 393/512
{ -4.88567e-03, 2.95130e-02, -1.16332e-01, 8.86956e-01, 2.66199e-01, -8.14185e-02, 2.40379e-02, -4.25940e-03 }, // 394/512
{ -4.85523e-03, 2.93377e-02, -1.15726e-01, 8.88474e-01, 2.63730e-01, -8.07801e-02, 2.38593e-02, -4.22864e-03 }, // 395/512
{ -4.82456e-03, 2.91609e-02, -1.15113e-01, 8.89984e-01, 2.61263e-01, -8.01399e-02, 2.36801e-02, -4.19774e-03 }, // 396/512
{ -4.79368e-03, 2.89828e-02, -1.14493e-01, 8.91485e-01, 2.58798e-01, -7.94980e-02, 2.35001e-02, -4.16670e-03 }, // 397/512
{ -4.76257e-03, 2.88032e-02, -1.13867e-01, 8.92977e-01, 2.56335e-01, -7.88543e-02, 2.33195e-02, -4.13553e-03 }, // 398/512
{ -4.73125e-03, 2.86221e-02, -1.13235e-01, 8.94461e-01, 2.53875e-01, -7.82090e-02, 2.31382e-02, -4.10423e-03 }, // 399/512
{ -4.69970e-03, 2.84397e-02, -1.12597e-01, 8.95936e-01, 2.51417e-01, -7.75620e-02, 2.29562e-02, -4.07279e-03 }, // 400/512
{ -4.66794e-03, 2.82558e-02, -1.11952e-01, 8.97403e-01, 2.48961e-01, -7.69133e-02, 2.27736e-02, -4.04123e-03 }, // 401/512
{ -4.63596e-03, 2.80705e-02, -1.11300e-01, 8.98860e-01, 2.46508e-01, -7.62631e-02, 2.25903e-02, -4.00953e-03 }, // 402/512
{ -4.60376e-03, 2.78838e-02, -1.10642e-01, 9.00309e-01, 2.44057e-01, -7.56112e-02, 2.24064e-02, -3.97771e-03 }, // 403/512
{ -4.57135e-03, 2.76957e-02, -1.09978e-01, 9.01749e-01, 2.41609e-01, -7.49577e-02, 2.22218e-02, -3.94576e-03 }, // 404/512
{ -4.53872e-03, 2.75062e-02, -1.09307e-01, 9.03180e-01, 2.39164e-01, -7.43027e-02, 2.20367e-02, -3.91368e-03 }, // 405/512
{ -4.50588e-03, 2.73153e-02, -1.08630e-01, 9.04602e-01, 2.36721e-01, -7.36462e-02, 2.18509e-02, -3.88148e-03 }, // 406/512
{ -4.47282e-03, 2.71230e-02, -1.07946e-01, 9.06015e-01, 2.34281e-01, -7.29882e-02, 2.16644e-02, -3.84916e-03 }, // 407/512
{ -4.43955e-03, 2.69293e-02, -1.07256e-01, 9.07420e-01, 2.31843e-01, -7.23286e-02, 2.14774e-02, -3.81671e-03 }, // 408/512
{ -4.40607e-03, 2.67341e-02, -1.06559e-01, 9.08815e-01, 2.29408e-01, -7.16677e-02, 2.12897e-02, -3.78414e-03 }, // 409/512
{ -4.37237e-03, 2.65376e-02, -1.05856e-01, 9.10201e-01, 2.26976e-01, -7.10052e-02, 2.11015e-02, -3.75144e-03 }, // 410/512
{ -4.33847e-03, 2.63397e-02, -1.05146e-01, 9.11579e-01, 2.24546e-01, -7.03414e-02, 2.09127e-02, -3.71863e-03 }, // 411/512
{ -4.30435e-03, 2.61404e-02, -1.04430e-01, 9.12947e-01, 2.22120e-01, -6.96762e-02, 2.07233e-02, -3.68570e-03 }, // 412/512
{ -4.27003e-03, 2.59398e-02, -1.03708e-01, 9.14306e-01, 2.19696e-01, -6.90096e-02, 2.05333e-02, -3.65266e-03 }, // 413/512
{ -4.23549e-03, 2.57377e-02, -1.02979e-01, 9.15656e-01, 2.17275e-01, -6.83416e-02, 2.03427e-02, -3.61949e-03 }, // 414/512
{ -4.20075e-03, 2.55343e-02, -1.02243e-01, 9.16997e-01, 2.14858e-01, -6.76723e-02, 2.01516e-02, -3.58622e-03 }, // 415/512
{ -4.16581e-03, 2.53295e-02, -1.01501e-01, 9.18329e-01, 2.12443e-01, -6.70018e-02, 1.99599e-02, -3.55283e-03 }, // 416/512
{ -4.13065e-03, 2.51234e-02, -1.00752e-01, 9.19652e-01, 2.10031e-01, -6.63299e-02, 1.97676e-02, -3.51932e-03 }, // 417/512
{ -4.09529e-03, 2.49159e-02, -9.99975e-02, 9.20965e-01, 2.07622e-01, -6.56568e-02, 1.95749e-02, -3.48571e-03 }, // 418/512
{ -4.05973e-03, 2.47070e-02, -9.92359e-02, 9.22269e-01, 2.05217e-01, -6.49825e-02, 1.93815e-02, -3.45198e-03 }, // 419/512
{ -4.02397e-03, 2.44967e-02, -9.84679e-02, 9.23564e-01, 2.02814e-01, -6.43069e-02, 1.91877e-02, -3.41815e-03 }, // 420/512
{ -3.98800e-03, 2.42851e-02, -9.76934e-02, 9.24850e-01, 2.00415e-01, -6.36302e-02, 1.89933e-02, -3.38420e-03 }, // 421/512
{ -3.95183e-03, 2.40722e-02, -9.69123e-02, 9.26126e-01, 1.98019e-01, -6.29523e-02, 1.87984e-02, -3.35015e-03 }, // 422/512
{ -3.91546e-03, 2.38579e-02, -9.61248e-02, 9.27393e-01, 1.95626e-01, -6.22732e-02, 1.86030e-02, -3.31600e-03 }, // 423/512
{ -3.87888e-03, 2.36423e-02, -9.53307e-02, 9.28650e-01, 1.93236e-01, -6.15931e-02, 1.84071e-02, -3.28174e-03 }, // 424/512
{ -3.84211e-03, 2.34253e-02, -9.45301e-02, 9.29899e-01, 1.90850e-01, -6.09118e-02, 1.82107e-02, -3.24737e-03 }, // 425/512
{ -3.80515e-03, 2.32070e-02, -9.37230e-02, 9.31137e-01, 1.88467e-01, -6.02295e-02, 1.80138e-02, -3.21291e-03 }, // 426/512
{ -3.76798e-03, 2.29874e-02, -9.29094e-02, 9.32367e-01, 1.86087e-01, -5.95461e-02, 1.78164e-02, -3.17834e-03 }, // 427/512
{ -3.73062e-03, 2.27664e-02, -9.20893e-02, 9.33586e-01, 1.83711e-01, -5.88617e-02, 1.76185e-02, -3.14367e-03 }, // 428/512
{ -3.69306e-03, 2.25442e-02, -9.12626e-02, 9.34797e-01, 1.81339e-01, -5.81763e-02, 1.74202e-02, -3.10891e-03 }, // 429/512
{ -3.65531e-03, 2.23206e-02, -9.04294e-02, 9.35998e-01, 1.78970e-01, -5.74899e-02, 1.72214e-02, -3.07405e-03 }, // 430/512
{ -3.61736e-03, 2.20957e-02, -8.95897e-02, 9.37189e-01, 1.76604e-01, -5.68025e-02, 1.70222e-02, -3.03909e-03 }, // 431/512
{ -3.57923e-03, 2.18695e-02, -8.87435e-02, 9.38371e-01, 1.74242e-01, -5.61142e-02, 1.68225e-02, -3.00403e-03 }, // 432/512
{ -3.54090e-03, 2.16420e-02, -8.78907e-02, 9.39543e-01, 1.71884e-01, -5.54250e-02, 1.66223e-02, -2.96889e-03 }, // 433/512
{ -3.50238e-03, 2.14131e-02, -8.70314e-02, 9.40705e-01, 1.69529e-01, -5.47349e-02, 1.64217e-02, -2.93365e-03 }, // 434/512
{ -3.46367e-03, 2.11830e-02, -8.61656e-02, 9.41858e-01, 1.67178e-01, -5.40440e-02, 1.62207e-02, -2.89831e-03 }, // 435/512
{ -3.42477e-03, 2.09516e-02, -8.52933e-02, 9.43001e-01, 1.64831e-01, -5.33522e-02, 1.60193e-02, -2.86289e-03 }, // 436/512
{ -3.38568e-03, 2.07189e-02, -8.44144e-02, 9.44135e-01, 1.62487e-01, -5.26596e-02, 1.58174e-02, -2.82738e-03 }, // 437/512
{ -3.34640e-03, 2.04850e-02, -8.35290e-02, 9.45258e-01, 1.60148e-01, -5.19661e-02, 1.56152e-02, -2.79178e-03 }, // 438/512
{ -3.30695e-03, 2.02497e-02, -8.26370e-02, 9.46372e-01, 1.57812e-01, -5.12719e-02, 1.54125e-02, -2.75609e-03 }, // 439/512
{ -3.26730e-03, 2.00132e-02, -8.17385e-02, 9.47477e-01, 1.55480e-01, -5.05770e-02, 1.52095e-02, -2.72032e-03 }, // 440/512
{ -3.22747e-03, 1.97754e-02, -8.08335e-02, 9.48571e-01, 1.53152e-01, -4.98813e-02, 1.50060e-02, -2.68446e-03 }, // 441/512
{ -3.18746e-03, 1.95364e-02, -7.99219e-02, 9.49656e-01, 1.50828e-01, -4.91849e-02, 1.48022e-02, -2.64853e-03 }, // 442/512
{ -3.14727e-03, 1.92961e-02, -7.90039e-02, 9.50730e-01, 1.48508e-01, -4.84878e-02, 1.45980e-02, -2.61250e-03 }, // 443/512
{ -3.10689e-03, 1.90545e-02, -7.80792e-02, 9.51795e-01, 1.46192e-01, -4.77900e-02, 1.43934e-02, -2.57640e-03 }, // 444/512
{ -3.06634e-03, 1.88117e-02, -7.71481e-02, 9.52850e-01, 1.43879e-01, -4.70917e-02, 1.41885e-02, -2.54022e-03 }, // 445/512
{ -3.02561e-03, 1.85677e-02, -7.62104e-02, 9.53896e-01, 1.41572e-01, -4.63926e-02, 1.39832e-02, -2.50396e-03 }, // 446/512
{ -2.98470e-03, 1.83224e-02, -7.52662e-02, 9.54931e-01, 1.39268e-01, -4.56930e-02, 1.37776e-02, -2.46763e-03 }, // 447/512
{ -2.94361e-03, 1.80759e-02, -7.43154e-02, 9.55956e-01, 1.36968e-01, -4.49929e-02, 1.35716e-02, -2.43121e-03 }, // 448/512
{ -2.90235e-03, 1.78281e-02, -7.33581e-02, 9.56972e-01, 1.34673e-01, -4.42921e-02, 1.33653e-02, -2.39473e-03 }, // 449/512
{ -2.86091e-03, 1.75791e-02, -7.23943e-02, 9.57977e-01, 1.32381e-01, -4.35909e-02, 1.31587e-02, -2.35817e-03 }, // 450/512
{ -2.81930e-03, 1.73290e-02, -7.14240e-02, 9.58972e-01, 1.30094e-01, -4.28891e-02, 1.29518e-02, -2.32153e-03 }, // 451/512
{ -2.77751e-03, 1.70776e-02, -7.04471e-02, 9.59958e-01, 1.27812e-01, -4.21869e-02, 1.27445e-02, -2.28483e-03 }, // 452/512
{ -2.73556e-03, 1.68249e-02, -6.94637e-02, 9.60933e-01, 1.25534e-01, -4.14841e-02, 1.25369e-02, -2.24806e-03 }, // 453/512
{ -2.69344e-03, 1.65711e-02, -6.84737e-02, 9.61898e-01, 1.23260e-01, -4.07810e-02, 1.23291e-02, -2.21122e-03 }, // 454/512
{ -2.65114e-03, 1.63161e-02, -6.74773e-02, 9.62853e-01, 1.20990e-01, -4.00774e-02, 1.21209e-02, -2.17431e-03 }, // 455/512
{ -2.60868e-03, 1.60599e-02, -6.64743e-02, 9.63798e-01, 1.18725e-01, -3.93735e-02, 1.19125e-02, -2.13733e-03 }, // 456/512
{ -2.56605e-03, 1.58026e-02, -6.54648e-02, 9.64733e-01, 1.16464e-01, -3.86691e-02, 1.17038e-02, -2.10029e-03 }, // 457/512
{ -2.52326e-03, 1.55440e-02, -6.44488e-02, 9.65658e-01, 1.14208e-01, -3.79645e-02, 1.14948e-02, -2.06319e-03 }, // 458/512
{ -2.48030e-03, 1.52843e-02, -6.34263e-02, 9.66572e-01, 1.11957e-01, -3.72594e-02, 1.12855e-02, -2.02602e-03 }, // 459/512
{ -2.43718e-03, 1.50233e-02, -6.23972e-02, 9.67477e-01, 1.09710e-01, -3.65541e-02, 1.10760e-02, -1.98880e-03 }, // 460/512
{ -2.39389e-03, 1.47613e-02, -6.13616e-02, 9.68371e-01, 1.07467e-01, -3.58485e-02, 1.08663e-02, -1.95151e-03 }, // 461/512
{ -2.35045e-03, 1.44980e-02, -6.03195e-02, 9.69255e-01, 1.05230e-01, -3.51427e-02, 1.06563e-02, -1.91417e-03 }, // 462/512
{ -2.30684e-03, 1.42337e-02, -5.92710e-02, 9.70128e-01, 1.02997e-01, -3.44366e-02, 1.04460e-02, -1.87677e-03 }, // 463/512
{ -2.26307e-03, 1.39681e-02, -5.82159e-02, 9.70992e-01, 1.00769e-01, -3.37303e-02, 1.02356e-02, -1.83931e-03 }, // 464/512
{ -2.21915e-03, 1.37015e-02, -5.71543e-02, 9.71845e-01, 9.85450e-02, -3.30238e-02, 1.00249e-02, -1.80179e-03 }, // 465/512
{ -2.17508e-03, 1.34337e-02, -5.60862e-02, 9.72687e-01, 9.63263e-02, -3.23171e-02, 9.81398e-03, -1.76423e-03 }, // 466/512
{ -2.13087e-03, 1.31649e-02, -5.50118e-02, 9.73520e-01, 9.41121e-02, -3.16101e-02, 9.60279e-03, -1.72660e-03 }, // 467/512
{ -2.08645e-03, 1.28947e-02, -5.39305e-02, 9.74342e-01, 9.19033e-02, -3.09033e-02, 9.39154e-03, -1.68894e-03 }, // 468/512
{ -2.04191e-03, 1.26235e-02, -5.28429e-02, 9.75153e-01, 8.96991e-02, -3.01962e-02, 9.18003e-03, -1.65122e-03 }, // 469/512
{ -1.99722e-03, 1.23512e-02, -5.17488e-02, 9.75955e-01, 8.74998e-02, -2.94891e-02, 8.96834e-03, -1.61345e-03 }, // 470/512
{ -1.95237e-03, 1.20779e-02, -5.06482e-02, 9.76745e-01, 8.53055e-02, -2.87819e-02, 8.75646e-03, -1.57564e-03 }, // 471/512
{ -1.90738e-03, 1.18034e-02, -4.95412e-02, 9.77526e-01, 8.31162e-02, -2.80746e-02, 8.54441e-03, -1.53777e-03 }, // 472/512
{ -1.86224e-03, 1.15278e-02, -4.84277e-02, 9.78296e-01, 8.09319e-02, -2.73674e-02, 8.33220e-03, -1.49987e-03 }, // 473/512
{ -1.81695e-03, 1.12512e-02, -4.73077e-02, 9.79055e-01, 7.87527e-02, -2.66601e-02, 8.11982e-03, -1.46192e-03 }, // 474/512
{ -1.77150e-03, 1.09734e-02, -4.61812e-02, 9.79804e-01, 7.65786e-02, -2.59529e-02, 7.90729e-03, -1.42392e-03 }, // 475/512
{ -1.72594e-03, 1.06946e-02, -4.50483e-02, 9.80543e-01, 7.44095e-02, -2.52457e-02, 7.69461e-03, -1.38589e-03 }, // 476/512
{ -1.68022e-03, 1.04147e-02, -4.39089e-02, 9.81271e-01, 7.22456e-02, -2.45386e-02, 7.48181e-03, -1.34782e-03 }, // 477/512
{ -1.63435e-03, 1.01338e-02, -4.27630e-02, 9.81988e-01, 7.00869e-02, -2.38316e-02, 7.26887e-03, -1.30971e-03 }, // 478/512
{ -1.58835e-03, 9.85180e-03, -4.16107e-02, 9.82695e-01, 6.79334e-02, -2.31246e-02, 7.05580e-03, -1.27156e-03 }, // 479/512
{ -1.54221e-03, 9.56876e-03, -4.04519e-02, 9.83392e-01, 6.57852e-02, -2.24178e-02, 6.84261e-03, -1.23337e-03 }, // 480/512
{ -1.49593e-03, 9.28468e-03, -3.92867e-02, 9.84077e-01, 6.36423e-02, -2.17112e-02, 6.62932e-03, -1.19515e-03 }, // 481/512
{ -1.44951e-03, 8.99957e-03, -3.81151e-02, 9.84752e-01, 6.15046e-02, -2.10048e-02, 6.41592e-03, -1.15690e-03 }, // 482/512
{ -1.40295e-03, 8.71343e-03, -3.69370e-02, 9.85417e-01, 5.93723e-02, -2.02985e-02, 6.20242e-03, -1.11861e-03 }, // 483/512
{ -1.35626e-03, 8.42626e-03, -3.57525e-02, 9.86071e-01, 5.72454e-02, -1.95925e-02, 5.98884e-03, -1.08030e-03 }, // 484/512
{ -1.30947e-03, 8.13813e-03, -3.45616e-02, 9.86714e-01, 5.51239e-02, -1.88868e-02, 5.77521e-03, -1.04197e-03 }, // 485/512
{ -1.26248e-03, 7.84885e-03, -3.33641e-02, 9.87347e-01, 5.30079e-02, -1.81813e-02, 5.56142e-03, -1.00357e-03 }, // 486/512
{ -1.21541e-03, 7.55872e-03, -3.21604e-02, 9.87969e-01, 5.08972e-02, -1.74760e-02, 5.34761e-03, -9.65176e-04 }, // 487/512
{ -1.16820e-03, 7.26754e-03, -3.09503e-02, 9.88580e-01, 4.87921e-02, -1.67711e-02, 5.13372e-03, -9.26747e-04 }, // 488/512
{ -1.12086e-03, 6.97538e-03, -2.97337e-02, 9.89180e-01, 4.66926e-02, -1.60665e-02, 4.91979e-03, -8.88295e-04 }, // 489/512
{ -1.07340e-03, 6.68224e-03, -2.85107e-02, 9.89770e-01, 4.45986e-02, -1.53622e-02, 4.70581e-03, -8.49819e-04 }, // 490/512
{ -1.02581e-03, 6.38813e-03, -2.72814e-02, 9.90349e-01, 4.25101e-02, -1.46583e-02, 4.49179e-03, -8.11321e-04 }, // 491/512
{ -9.78093e-04, 6.09305e-03, -2.60456e-02, 9.90917e-01, 4.04274e-02, -1.39548e-02, 4.27773e-03, -7.72802e-04 }, // 492/512
{ -9.30258e-04, 5.79701e-03, -2.48035e-02, 9.91475e-01, 3.83503e-02, -1.32518e-02, 4.06364e-03, -7.34264e-04 }, // 493/512
{ -8.82301e-04, 5.50002e-03, -2.35550e-02, 9.92021e-01, 3.62788e-02, -1.25491e-02, 3.84954e-03, -6.95707e-04 }, // 494/512
{ -8.34225e-04, 5.20209e-03, -2.23001e-02, 9.92557e-01, 3.42131e-02, -1.18470e-02, 3.63542e-03, -6.57133e-04 }, // 495/512
{ -7.86031e-04, 4.90322e-03, -2.10389e-02, 9.93082e-01, 3.21531e-02, -1.11453e-02, 3.42130e-03, -6.18544e-04 }, // 496/512
{ -7.37720e-04, 4.60342e-03, -1.97713e-02, 9.93596e-01, 3.00990e-02, -1.04441e-02, 3.20717e-03, -5.79940e-04 }, // 497/512
{ -6.89293e-04, 4.30270e-03, -1.84973e-02, 9.94100e-01, 2.80506e-02, -9.74337e-03, 2.99305e-03, -5.41322e-04 }, // 498/512
{ -6.40760e-04, 4.00108e-03, -1.72171e-02, 9.94592e-01, 2.60080e-02, -9.04319e-03, 2.77894e-03, -5.02692e-04 }, // 499/512
{ -5.92100e-04, 3.69852e-03, -1.59305e-02, 9.95074e-01, 2.39714e-02, -8.34364e-03, 2.56486e-03, -4.64053e-04 }, // 500/512
{ -5.43336e-04, 3.39507e-03, -1.46375e-02, 9.95544e-01, 2.19406e-02, -7.64464e-03, 2.35081e-03, -4.25404e-04 }, // 501/512
{ -4.94462e-04, 3.09074e-03, -1.33383e-02, 9.96004e-01, 1.99158e-02, -6.94624e-03, 2.13679e-03, -3.86747e-04 }, // 502/512
{ -4.45480e-04, 2.78552e-03, -1.20327e-02, 9.96453e-01, 1.78969e-02, -6.24847e-03, 1.92281e-03, -3.48082e-04 }, // 503/512
{ -3.96391e-04, 2.47942e-03, -1.07209e-02, 9.96891e-01, 1.58840e-02, -5.55134e-03, 1.70888e-03, -3.09412e-04 }, // 504/512
{ -3.47196e-04, 2.17245e-03, -9.40271e-03, 9.97318e-01, 1.38772e-02, -4.85487e-03, 1.49500e-03, -2.70737e-04 }, // 505/512
{ -2.97897e-04, 1.86463e-03, -8.07826e-03, 9.97734e-01, 1.18763e-02, -4.15910e-03, 1.28119e-03, -2.32060e-04 }, // 506/512
{ -2.48496e-04, 1.55594e-03, -6.74754e-03, 9.98139e-01, 9.88159e-03, -3.46403e-03, 1.06745e-03, -1.93380e-04 }, // 507/512
{ -1.98993e-04, 1.24642e-03, -5.41054e-03, 9.98534e-01, 7.89295e-03, -2.76968e-03, 8.53777e-04, -1.54700e-04 }, // 508/512
{ -1.49391e-04, 9.36049e-04, -4.06728e-03, 9.98917e-01, 5.91044e-03, -2.07609e-03, 6.40192e-04, -1.16021e-04 }, // 509/512
{ -9.96901e-05, 6.24853e-04, -2.71776e-03, 9.99289e-01, 3.93409e-03, -1.38326e-03, 4.26696e-04, -7.73439e-05 }, // 510/512
{ -4.98927e-05, 3.12834e-04, -1.36200e-03, 9.99650e-01, 1.96394e-03, -6.91227e-04, 2.13297e-04, -3.86697e-05 }, // 511/512
{ 0.00000e+00, 0.00000e+00, 0.00000e+00, 1.00000e+00, 0.00000e+00, 0.00000e+00, 0.00000e+00, 0.00000e+00 }, // 512/512
};

View File

@ -0,0 +1,221 @@
#include "psk_rx_cc.h"
#include "hb_taps.h"
#include <cmath>
//volk_32fc_32f_dot_prod_32fc_a
#define sign(X) ((X) < 0 ? -1.0 : 1.0)
#define expj(X) (gr_complex(cosf(X), sinf(X)))
#define saturate(X, MIN, MAX) ((X) > (MAX) ? (MAX) : ((X) < (MIN) ? (MIN) : (X)))
void ctrl_loop_set_rate(struct ctrl_loop_s *c, float rate, float dev)
{
c->rate = rate;
c->rate_min = rate - dev;
c->rate_max = rate + dev;
}
void ctrl_loop_set_bw(struct ctrl_loop_s *c, float bw, float damp)
{
float denom = (1.0 + 2.0*damp*bw + bw*bw);
c->kp = (4*damp*bw) / denom;
c->ki = (4*bw*bw) / denom;
}
//adj = ctrl_loop_work(&c, err);
float ctrl_loop_work(struct ctrl_loop_s *c, float err)
{
c->rate = saturate(c->rate + c->ki * err, c->rate_min, c->rate_max);
float adj = c->rate + c->kp * err;
return adj;
}
psk_rx_cc::psk_rx_cc(
enum mod_type _mod,
int sps, //must be even
float sym_rate,
float sym_rate_dev,
float sym_bw,
float carr_rate,
float carr_rate_dev,
float carr_bw
) : dbgfile(NULL)
{
mod = _mod;
sym_phase = 0;
ctrl_loop_set_rate(&sym, sym_rate, sym_rate_dev);
ctrl_loop_set_bw(&sym, sym_bw, 1.0);
sym_adj = sym_rate;
carr_phase = 0;
ctrl_loop_set_rate(&carr, carr_rate, carr_rate_dev);
ctrl_loop_set_bw(&carr, carr_bw, 1.0);
carr_adj = carr_rate;
//hb_state = new gr_complex[hb_ntaps];
hb_state.resize(hb_ntaps, 0.0);
hb_pos = hb_ntaps - 1;
mf_ntaps = sps;
//mf_taps = new float[mf_ntaps];
//mf_state = new gr_complex[mf_ntaps];
mf_taps.resize(mf_ntaps);
mf_state.resize(mf_ntaps, 0.0);
for(int i = 0; i < sps; i++) {
mf_taps[i] = 1.0 / sps;
}
for(unsigned int i = sps; i < mf_ntaps; i++) {
mf_taps[i] = 0.0;
}
mf_pos = mf_ntaps - 1;
dd = 0;
out_decim = sps / 2;
gout = false;
y1_1 = 0.0;
y1_2 = 0.0;
dbgfile = fopen("dbg.bin", "wb");
}
psk_rx_cc::~psk_rx_cc() {
//delete [] hb_state;
//delete [] mf_state;
//delete [] mf_taps;
if(dbgfile)
fclose(dbgfile);
}
float psk_rx_cc::sym_rate()
{
return sym.rate;
}
float psk_rx_cc::carr_rate()
{
return carr.rate;
}
void psk_rx_cc::set_eye_diagram(bool en)
{
if(en) {
eye_buffer.resize(out_decim*2*8);
eye_pos = -1;
} else {
eye_buffer.clear();
}
}
std::vector<gr_complex> psk_rx_cc::eye_diagram()
{
std::vector<gr_complex> y1;
for(unsigned int i = 0; i < eye_buffer.size() - mf_ntaps; i++)
{
gr_complex yy1 = 0.0;
for(unsigned int j = 0; j < mf_ntaps; j++) {
yy1 += eye_buffer[i + j] * mf_taps[mf_ntaps-1-j];
}
y1.push_back(yy1);
}
return y1;
}
void psk_rx_cc::work(const gr_complex *in, int insize, int *consumed, gr_complex *out, int outsize, int *produced)
{
if(!in || !consumed || !out || !produced)
return;
int ii = 0, oo = 0;
while(1) {
if(sym_phase < hb_nsteps) {
int idx = floor(sym_phase);
//printf("sym_phase: %f, idx: %d\n", sym_phase, idx);
// interpolator
gr_complex y = 0.0;
for(unsigned int i = 0; i < hb_ntaps; i++) {
y += hb_taps[idx][i] * hb_state[(hb_pos - i) % hb_ntaps];
}
sym_phase += sym_adj * hb_nsteps;
// derotate
gr_complex yy = y * expj(-carr_phase);
carr_phase += carr_adj;
// matched filter
mf_pos = (mf_pos + 1 ) % mf_ntaps;
mf_state[mf_pos] = yy;
// eye diagram
if(eye_buffer.size() > 0) {
if(eye_pos >= 0) {
eye_buffer[eye_pos++] = yy;
if(eye_pos >= (int)eye_buffer.size()) {
eye_pos = -1;
}
}
}
// decimate
dd++;
if(dd >= out_decim) {
dd = 0;
gr_complex y1 = 0.0;
for(unsigned int i = 0; i < mf_ntaps; i++) {
y1 += mf_taps[i] * mf_state[(mf_pos - i) % mf_ntaps];
}
//printf("y1: %f, %f\n", real(y1), imag(y1));
if(gout) {
//symbol err
float sym_err = (real(y1 - y1_2)) * real(y1_1) + (imag(y1 - y1_2)) * imag(y1_1);
//carrier err
float carr_err;
switch (mod) {
case BPSK:
carr_err = sign(real(y1_1)) * imag(y1_1);
//carr_err = real(y1_1) * imag(y1_1);
break;
case QPSK:
carr_err = sign(real(y1_1)) * imag(y1_1) - sign(imag(y1_1)) * real(y1_1);
break;
default: carr_err = 0.0;
}
//write output
out[oo++] = y1_1;
//eye diagram sync
if(eye_buffer.size() > 0) {
if(eye_pos < 0) eye_pos = 0;
}
//loop filter
sym_adj = ctrl_loop_work(&sym, sym_err);
carr_adj = ctrl_loop_work(&carr, carr_err);
//debug output
if(dbgfile)
{
float _v1 = sym_rate();
float _v2 = carr_rate();
fwrite(&_v1, sizeof(float), 1, dbgfile);
fwrite(&_v2, sizeof(float), 1, dbgfile);
}
}
gout = !gout;
y1_2 = y1_1;
y1_1 = y1;
if(oo >= outsize) {
//exit here
*consumed = ii;
*produced = oo;
return;
}
} //decimate
} else {
hb_pos = (hb_pos + 1 ) % hb_ntaps;
hb_state[hb_pos] = in[ii++];
sym_phase -= hb_nsteps;
if(ii >= insize) {
//exit here
*consumed = ii;
*produced = oo;
return;
}
}
}
}

View File

@ -0,0 +1,79 @@
#pragma once
#include <cstdio>
#include <gnuradio/gr_complex.h>
#include <vector>
//volk_32fc_32f_dot_prod_32fc_a
struct ctrl_loop_s {
float rate;
float rate_min;
float rate_max;
float kp;
float ki;
};
void ctrl_loop_set_rate(struct ctrl_loop_s *c, float rate, float dev);
void ctrl_loop_set_bw(struct ctrl_loop_s *c, float bw, float damp);
//adj = ctrl_loop_work(&c, err);
float ctrl_loop_work(struct ctrl_loop_s *c, float err);
class psk_rx_cc {
public:
enum mod_type {
BPSK = 0,
QPSK = 1,
_8PSK = 2,
} mod;
private:
//gr_complex *hb_state;
std::vector<gr_complex> hb_state;
unsigned int hb_pos;
unsigned int mf_ntaps;
std::vector<float> mf_taps;
std::vector<gr_complex> mf_state;
//float *mf_taps;
//gr_complex *mf_state;
unsigned int mf_pos;
struct ctrl_loop_s sym, carr;
float sym_phase, carr_phase;
float sym_adj, carr_adj;
int dd;
int out_decim;
gr_complex y1_1, y1_2;
bool gout;
bool eye_diag;
std::vector<gr_complex> eye_buffer;
int eye_pos;// -1 = sync, 0~(len-1) capture
FILE *dbgfile;
public:
psk_rx_cc(enum mod_type _mod,
int sps, //must be even
float sym_rate,
float sym_rate_dev,
float sym_bw,
float carr_rate,
float carr_rate_dev,
float carr_bw
);
~psk_rx_cc();
void work(const gr_complex *in, int insize, int *consumed,
gr_complex *out, int outsize, int *produced);
float sym_rate();
float carr_rate();
void set_eye_diagram(bool en = true);
std::vector<gr_complex> eye_diagram();
};

View File

@ -0,0 +1,88 @@
/* -*- c++ -*- */
/*
* Copyright 2018 <+YOU OR YOUR COMPANY+>.
*
* This 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 3, or (at your option)
* any later version.
*
* This software 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 software; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street,
* Boston, MA 02110-1301, USA.
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <gnuradio/io_signature.h>
#include "psk_rx_impl.h"
namespace gr {
namespace kcsa {
psk_rx::sptr
psk_rx::make(int _mod, int sps, float sym_rate, float sym_rate_dev, float sym_bw, float carr_rate, float carr_rate_dev, float carr_bw)
{
return gnuradio::get_initial_sptr
(new psk_rx_impl(_mod, sps, sym_rate, sym_rate_dev, sym_bw, carr_rate, carr_rate_dev, carr_bw));
}
/*
* The private constructor
*/
psk_rx_impl::psk_rx_impl(int _mod, int sps, float sym_rate, float sym_rate_dev, float sym_bw, float carr_rate, float carr_rate_dev, float carr_bw)
: gr::block("psk_rx",
gr::io_signature::make(1, 1, sizeof(gr_complex)),
gr::io_signature::make(1, 1, sizeof(gr_complex))),
d_rx((enum psk_rx_cc::mod_type)_mod, sps, sym_rate, sym_rate_dev, sym_bw, carr_rate, carr_rate_dev, carr_bw),
d_sps(sps),
d_sym_rate(sym_rate)
{
}
/*
* Our virtual destructor.
*/
psk_rx_impl::~psk_rx_impl()
{
}
void
psk_rx_impl::forecast (int noutput_items, gr_vector_int &ninput_items_required)
{
/* <+forecast+> e.g. ninput_items_required[0] = noutput_items */
ninput_items_required[0] = floor(noutput_items / d_sym_rate * d_sps) + 1;
}
int
psk_rx_impl::general_work (int noutput_items,
gr_vector_int &ninput_items,
gr_vector_const_void_star &input_items,
gr_vector_void_star &output_items)
{
const gr_complex *in = (const gr_complex *) input_items[0];
gr_complex *out = (gr_complex *) output_items[0];
int consumed, produced;
d_rx.work(in, ninput_items[0], &consumed, out, noutput_items, &produced);
// Do <+signal processing+>
// Tell runtime system how many input items we consumed on
// each input stream.
consume_each (consumed);
// Tell runtime system how many output items we produced.
return produced;
}
} /* namespace kcsa */
} /* namespace gr */

View File

@ -0,0 +1,53 @@
/* -*- c++ -*- */
/*
* Copyright 2018 <+YOU OR YOUR COMPANY+>.
*
* This 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 3, or (at your option)
* any later version.
*
* This software 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 software; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street,
* Boston, MA 02110-1301, USA.
*/
#ifndef INCLUDED_KCSA_PSK_RX_IMPL_H
#define INCLUDED_KCSA_PSK_RX_IMPL_H
#include <kcsa/psk_rx.h>
#include <psk/psk_rx_cc.h>
namespace gr {
namespace kcsa {
class psk_rx_impl : public psk_rx
{
private:
psk_rx_cc d_rx;
int d_sps;
float d_sym_rate;
public:
psk_rx_impl(int _mod, int sps, float sym_rate, float sym_rate_dev, float sym_bw, float carr_rate, float carr_rate_dev, float carr_bw);
~psk_rx_impl();
// Where all the action really happens
void forecast (int noutput_items, gr_vector_int &ninput_items_required);
int general_work(int noutput_items,
gr_vector_int &ninput_items,
gr_vector_const_void_star &input_items,
gr_vector_void_star &output_items);
};
} // namespace kcsa
} // namespace gr
#endif /* INCLUDED_KCSA_PSK_RX_IMPL_H */

View File

@ -31,6 +31,7 @@
#include "kcsa/halfduplex_pdu_to_stream.h"
#include "kcsa/fullduplex_pdu_to_stream.h"
#include "kcsa/power_sensor.h"
#include "kcsa/psk_rx.h"
%}
%include "kcsa/kiss_server.h"
@ -85,3 +86,5 @@ GR_SWIG_BLOCK_MAGIC2(kcsa, fullduplex_pdu_to_stream);
%include "kcsa/pdu_to_stream2.h"
GR_SWIG_BLOCK_MAGIC2(kcsa, pdu_to_stream2);
%include "kcsa/psk_rx.h"
GR_SWIG_BLOCK_MAGIC2(kcsa, psk_rx);