From 79dd5bdcbb6c8a788d99984b1be648373472b3e3 Mon Sep 17 00:00:00 2001 From: AlexandreRouma Date: Tue, 10 Sep 2024 15:33:22 +0200 Subject: [PATCH] add beginning of DAB decoder and add missing hardware donors to the credits --- CMakeLists.txt | 5 + core/src/credits.cpp | 3 + decoder_modules/dab_decoder/CMakeLists.txt | 37 + decoder_modules/dab_decoder/src/dab_dsp.h | 280 +++ .../dab_decoder/src/dab_phase_sym.h | 2053 +++++++++++++++++ decoder_modules/dab_decoder/src/main.cpp | 163 ++ .../dab_decoder/src/optimized_algo.txt | 34 + readme.md | 1 + 8 files changed, 2576 insertions(+) create mode 100644 decoder_modules/dab_decoder/CMakeLists.txt create mode 100644 decoder_modules/dab_decoder/src/dab_dsp.h create mode 100644 decoder_modules/dab_decoder/src/dab_phase_sym.h create mode 100644 decoder_modules/dab_decoder/src/main.cpp create mode 100644 decoder_modules/dab_decoder/src/optimized_algo.txt diff --git a/CMakeLists.txt b/CMakeLists.txt index 601ddf63..8ef2f80b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -43,6 +43,7 @@ option(OPT_BUILD_PORTAUDIO_SINK "Build PortAudio Sink Module (Dependencies: port # Decoders option(OPT_BUILD_ATV_DECODER "Build ATV decoder (no dependencies required)" OFF) +option(OPT_BUILD_DAB_DECODER "Build the DAB/DAB+ decoder (no dependencies required)" OFF) option(OPT_BUILD_FALCON9_DECODER "Build the falcon9 live decoder (Dependencies: ffplay)" OFF) option(OPT_BUILD_KG_SSTV_DECODER "Build the KG SSTV (KG-STV) decoder module (no dependencies required)" OFF) option(OPT_BUILD_M17_DECODER "Build the M17 decoder module (Dependencies: codec2)" OFF) @@ -242,6 +243,10 @@ if (OPT_BUILD_ATV_DECODER) add_subdirectory("decoder_modules/atv_decoder") endif (OPT_BUILD_ATV_DECODER) +if (OPT_BUILD_DAB_DECODER) +add_subdirectory("decoder_modules/dab_decoder") +endif (OPT_BUILD_DAB_DECODER) + if (OPT_BUILD_FALCON9_DECODER) add_subdirectory("decoder_modules/falcon9_decoder") endif (OPT_BUILD_FALCON9_DECODER) diff --git a/core/src/credits.cpp b/core/src/credits.cpp index a1863fd7..31664893 100644 --- a/core/src/credits.cpp +++ b/core/src/credits.cpp @@ -37,9 +37,12 @@ namespace sdrpp_credits { const char* hardwareDonators[] = { "Aaronia AG", "Airspy", + "Alex 4Z5LV", "Analog Devices", "CaribouLabs", + "Deepace", "Ettus Research", + "Harogic", "Howard Su", "MicroPhase", "Microtelecom", diff --git a/decoder_modules/dab_decoder/CMakeLists.txt b/decoder_modules/dab_decoder/CMakeLists.txt new file mode 100644 index 00000000..c775019f --- /dev/null +++ b/decoder_modules/dab_decoder/CMakeLists.txt @@ -0,0 +1,37 @@ +cmake_minimum_required(VERSION 3.13) +project(dab_decoder) + +file(GLOB_RECURSE SRC "src/*.cpp" "src/*.c") + +include(${SDRPP_MODULE_CMAKE}) + +target_include_directories(dab_decoder PRIVATE "src/") + +if (MSVC) + # Lib path + target_include_directories(dab_decoder PRIVATE "C:/Program Files/codec2/include/") + target_link_directories(dab_decoder PRIVATE "C:/Program Files/codec2/lib") + + target_link_libraries(dab_decoder PRIVATE libcodec2) +elseif (ANDROID) + target_include_directories(dab_decoder PUBLIC + /sdr-kit/${ANDROID_ABI}/include/codec2 + ) + + target_link_libraries(dab_decoder PUBLIC + /sdr-kit/${ANDROID_ABI}/lib/libcodec2.so + ) +else () + find_package(PkgConfig) + + pkg_check_modules(LIBCODEC2 REQUIRED codec2) + + target_include_directories(dab_decoder PRIVATE ${LIBCODEC2_INCLUDE_DIRS}) + target_link_directories(dab_decoder PRIVATE ${LIBCODEC2_LIBRARY_DIRS}) + target_link_libraries(dab_decoder PRIVATE ${LIBCODEC2_LIBRARIES}) + + # Include it because for some reason pkgconfig doesn't look here? + if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin") + target_include_directories(dab_decoder PRIVATE "/usr/local/include") + endif() +endif () \ No newline at end of file diff --git a/decoder_modules/dab_decoder/src/dab_dsp.h b/decoder_modules/dab_decoder/src/dab_dsp.h new file mode 100644 index 00000000..974ca042 --- /dev/null +++ b/decoder_modules/dab_decoder/src/dab_dsp.h @@ -0,0 +1,280 @@ +#pragma once +#include +#include +#include +#include "dab_phase_sym.h" + +namespace dab { + class CyclicSync : public dsp::Processor { + using base_type = dsp::Processor; + public: + CyclicSync() {} + + // TODO: The default AGC rate is probably way too fast, plot out the avgCorr to see how much it moves + CyclicSync(dsp::stream* in, double symbolLength, double cyclicPrefixLength, double samplerate, float agcRate = 1e-3) { init(in, symbolLength, cyclicPrefixLength, samplerate, agcRate); } + + void init(dsp::stream* in, double symbolLength, double cyclicPrefixLength, double samplerate, float agcRate = 1e-3) { + // Computer the number of samples for the symbol and its cyclic prefix + symbolSamps = round(samplerate * symbolLength); + prefixSamps = round(samplerate * cyclicPrefixLength); + + // Allocate and clear the delay buffer + delayBuf = dsp::buffer::alloc(STREAM_BUFFER_SIZE + 64000); + dsp::buffer::clear(delayBuf, symbolSamps); + + // Allocate and clear the history buffer + histBuf = dsp::buffer::alloc(prefixSamps); + dsp::buffer::clear(histBuf, prefixSamps); + + // Compute the delay input addresses + delayBufInput = &delayBuf[symbolSamps]; + + // Compute the correlation AGC configuration + this->agcRate = agcRate; + agcRateInv = 1.0f - agcRate; + + base_type::init(in); + } + + void reset() { + assert(base_type::_block_init); + std::lock_guard lck(base_type::ctrlMtx); + base_type::tempStop(); + + base_type::tempStart(); + } + + int run() { + int count = base_type::_in->read(); + if (count < 0) { return -1; } + + // Copy the data into the normal delay buffer + memcpy(delayBufInput, base_type::_in->readBuf, count * sizeof(dsp::complex_t)); + + // Flush the input stream + base_type::_in->flush(); + + // Do cross-correlation + for (int i = 0; i < count; i++) { + // Get the current history slot + dsp::complex_t* slot = &histBuf[histId++]; + + // Wrap around the history slot index (TODO: Check that the history buffer's length is correct) + histId %= prefixSamps; + + // Kick out last value from the correlation + corr -= *slot; + + // Save input value and compute the new prodct + dsp::complex_t val = delayBuf[i]; + dsp::complex_t prod = val.conj()*delayBuf[i+symbolSamps]; + + // Add the new value to the correlation + *slot = prod; + + // Add the new value to the history buffer + corr += prod; + + // Compute sample amplitude + float rcorr = corr.amplitude(); + + // If a high enough peak is reached, reset the symbol counter + if (rcorr > avgCorr && rcorr > peakCorr) { // Note keeping an average level might not be needed + peakCorr = rcorr; + peakLCorr = lastCorr; + samplesSincePeak = 0; + } + + // If this is the sample right after the peak, save it + if (samplesSincePeak == 1) { + peakRCorr = rcorr; + } + + // Write the sample to the output + out.writeBuf[samplesSincePeak++] = val; + + // If the end of the symbol is reached, send it off + if (samplesSincePeak >= symbolSamps) { + if (!out.swap(symbolSamps)) { + return -1; + } + samplesSincePeak = 0; + peakCorr = 0; + } + + // Update the average correlation + lastCorr = rcorr; + + // Update the average correlation value + avgCorr = agcRate*rcorr + agcRateInv*avgCorr; + } + + // Move unused data + memmove(delayBuf, &delayBuf[count], symbolSamps * sizeof(dsp::complex_t)); + + return count; + } + + protected: + int symbolSamps; + int prefixSamps; + + int histId = 0; + dsp::complex_t* histBuf; + + dsp::complex_t* delayBuf; + dsp::complex_t* delayBufInput; + + dsp::complex_t corr = { 0.0f, 0.0f }; + + int samplesSincePeak = 0; + float lastCorr = 0.0f; + float peakCorr = 0.0f; + float peakLCorr = 0.0f; + float peakRCorr = 0.0f; + + // Note only required for DAB + float avgCorr = 0.0f; + float agcRate; + float agcRateInv; + }; + + class FrameFreqSync : public dsp::Processor { + using base_type = dsp::Processor; + public: + FrameFreqSync() {} + + FrameFreqSync(dsp::stream* in, float agcRate = 0.01f) { init(in, agcRate); } + + void init(dsp::stream* in, float agcRate = 0.01f) { + // Allocate buffers + amps = dsp::buffer::alloc(2048); + conjRef = dsp::buffer::alloc(2048); + corrIn = (dsp::complex_t*)fftwf_alloc_complex(2048); + corrOut = (dsp::complex_t*)fftwf_alloc_complex(2048); + + // Copy the phase reference + memcpy(conjRef, DAB_PHASE_SYM_CONJ, 2048 * sizeof(dsp::complex_t)); + + // Plan the FFT computation + plan = fftwf_plan_dft_1d(2048, (fftwf_complex*)corrIn, (fftwf_complex*)corrOut, FFTW_FORWARD, FFTW_ESTIMATE); + + // Compute the correlation AGC configuration + this->agcRate = agcRate; + agcRateInv = 1.0f - agcRate; + + base_type::init(in); + } + + void reset() { + assert(base_type::_block_init); + std::lock_guard lck(base_type::ctrlMtx); + base_type::tempStop(); + + base_type::tempStart(); + } + + int run() { + int count = base_type::_in->read(); + if (count < 0) { return -1; } + + // Apply frequency shift + lv_32fc_t phase = lv_cmake(1.0f, 0.0f); + lv_32fc_t phaseDelta = lv_cmake(cos(offset), sin(offset)); +#if VOLK_VERSION >= 030100 + volk_32fc_s32fc_x2_rotator2_32fc((lv_32fc_t*)_in->readBuf, (lv_32fc_t*)_in->readBuf, phaseDelta, &phase, count); +#else + volk_32fc_s32fc_x2_rotator_32fc((lv_32fc_t*)_in->readBuf, (lv_32fc_t*)_in->readBuf, phaseDelta, &phase, count); +#endif + + // Compute the amplitude amplitude of all samples + volk_32fc_magnitude_32f(amps, (lv_32fc_t*)_in->readBuf, 2048); + + // Compute the average signal level by adding up all values + float level = 0.0f; + volk_32f_accumulator_s32f(&level, amps, 2048); + + // Detect a frame sync condition + if (level < avgLvl * 0.5f) { + // Reset symbol counter + sym = 1; + + // Update the average level + avgLvl = agcRate*level + agcRateInv*avgLvl; + + // Flush the input stream and return + base_type::_in->flush(); + return count; + } + + // Update the average level + avgLvl = agcRate*level + agcRateInv*avgLvl; + + // Handle phase reference + if (sym == 1) { + // Output the symbols (DEBUG ONLY) + memcpy(corrIn, _in->readBuf, 2048 * sizeof(dsp::complex_t)); + fftwf_execute(plan); + volk_32fc_magnitude_32f(amps, (lv_32fc_t*)corrOut, 2048); + int outCount = 0; + dsp::complex_t pi4 = { cos(3.1415926535*0.25), sin(3.1415926535*0.25) }; + for (int i = -767; i < 768; i++) { + if (!i) { continue; } + int cid0 = ((i-1) >= 0) ? (i-1) : 2048+(i-1); + int cid1 = (i >= 0) ? i : 2048+i;; + out.writeBuf[outCount++] = pi4 * (corrOut[cid1] * corrOut[cid0].conj()) * (1.0f/(amps[cid0]*amps[cid0])); + } + out.swap(outCount); + + // Multiply the samples with the conjugated phase reference signal + volk_32fc_x2_multiply_32fc((lv_32fc_t*)corrIn, (lv_32fc_t*)_in->readBuf, (lv_32fc_t*)conjRef, 2048); + + // Compute the FFT of the product + fftwf_execute(plan); + + // Compute the amplitude of the bins + volk_32fc_magnitude_32f(amps, (lv_32fc_t*)corrOut, 2048); + + // Locate highest power bin + uint32_t peakId; + volk_32f_index_max_32u(&peakId, amps, 2048); + + // Obtain the value of the bins next to the peak + float peakL = amps[(peakId + 2047) % 2048]; + float peakR = amps[(peakId + 1) % 2048]; + + // Compute the integer frequency offset + float offInt = (peakId < 1024) ? (float)peakId : ((float)peakId - 2048.0f); + + // Compute the frequency offset in rad/samp + float off = 3.1415926535f * (offInt + ((peakR - peakL) / (peakR + peakL))) * (1.0f / 1024.0f); + + // Run control loop + offset -= 0.1f*off; + flog::debug("Offset: {} Hz, Error: {} Hz, Avg Level: {}", offset * (0.5f/3.1415926535f)*2.048e6, off * (0.5f/3.1415926535f)*2.048e6, avgLvl); + } + + // Increment the symbol counter + sym++; + + // Flush the input stream and return + base_type::_in->flush(); + return count; + } + + protected: + fftwf_plan plan; + + float* amps; + dsp::complex_t* conjRef; + dsp::complex_t* corrIn; + dsp::complex_t* corrOut; + + int sym; + float offset = 0.0f; + + float avgLvl = 0.0f; + float agcRate; + float agcRateInv; + }; +} \ No newline at end of file diff --git a/decoder_modules/dab_decoder/src/dab_phase_sym.h b/decoder_modules/dab_decoder/src/dab_phase_sym.h new file mode 100644 index 00000000..18ab63a7 --- /dev/null +++ b/decoder_modules/dab_decoder/src/dab_phase_sym.h @@ -0,0 +1,2053 @@ +#pragma once +#include + +dsp::complex_t DAB_PHASE_SYM_CONJ[2048] = { + { 0.003906, 0.004883 }, + { 0.026091, -0.008539 }, + { 0.010282, 0.004644 }, + { 0.024244, 0.009359 }, + { 0.020112, 0.002989 }, + { -0.003998, -0.023505 }, + { 0.006935, -0.018719 }, + { 0.007144, 0.010484 }, + { 0.008686, 0.000707 }, + { 0.028328, 0.015592 }, + { 0.018928, 0.013617 }, + { 0.007572, -0.037058 }, + { 0.015151, -0.000381 }, + { 0.021241, 0.034177 }, + { 0.019910, -0.005843 }, + { 0.000911, 0.014165 }, + { -0.013888, 0.026690 }, + { -0.008987, 0.000229 }, + { 0.005703, 0.024674 }, + { 0.025074, 0.015371 }, + { 0.018185, -0.025005 }, + { -0.001068, -0.021951 }, + { 0.003574, -0.018935 }, + { 0.004921, -0.006539 }, + { 0.004235, 0.005284 }, + { 0.010069, -0.006643 }, + { -0.000530, 0.006365 }, + { -0.005268, 0.009916 }, + { -0.003677, -0.009802 }, + { -0.019029, 0.000874 }, + { -0.015888, 0.009320 }, + { 0.011956, 0.001587 }, + { 0.015317, 0.008199 }, + { -0.003804, 0.013364 }, + { -0.002890, 0.006773 }, + { 0.009865, -0.003548 }, + { 0.005591, -0.009645 }, + { -0.001179, -0.010408 }, + { 0.000824, -0.008561 }, + { 0.009780, 0.000771 }, + { 0.018636, 0.004545 }, + { 0.003397, 0.003208 }, + { -0.005695, 0.007794 }, + { 0.011511, 0.004666 }, + { 0.003146, 0.007635 }, + { -0.010456, 0.019511 }, + { 0.004055, 0.010568 }, + { 0.005201, -0.003603 }, + { 0.000563, -0.004699 }, + { 0.002102, 0.002603 }, + { -0.007291, 0.011350 }, + { -0.002789, 0.002888 }, + { 0.007797, -0.003365 }, + { 0.001667, 0.004990 }, + { -0.001603, -0.002433 }, + { -0.000568, -0.007655 }, + { 0.001350, 0.003102 }, + { 0.004049, 0.001046 }, + { -0.000383, -0.002603 }, + { -0.001445, 0.002189 }, + { 0.000295, 0.000171 }, + { -0.001537, -0.002137 }, + { -0.000474, -0.000522 }, + { -0.000113, 0.000557 }, + { 0.000000, 0.000977 }, + { 0.001142, -0.000188 }, + { 0.000688, 0.000614 }, + { 0.001499, 0.002042 }, + { 0.000467, 0.000983 }, + { 0.000644, 0.000814 }, + { 0.000230, 0.000354 }, + { -0.005543, -0.001104 }, + { -0.001578, -0.000186 }, + { 0.005962, 0.000214 }, + { 0.003776, -0.004697 }, + { 0.003338, -0.006690 }, + { 0.004797, 0.000161 }, + { 0.005265, 0.000098 }, + { 0.000270, -0.006202 }, + { -0.012158, -0.000192 }, + { -0.011087, 0.005594 }, + { -0.000997, 0.002337 }, + { 0.001884, 0.008286 }, + { 0.001390, 0.014243 }, + { -0.004217, 0.001482 }, + { -0.000361, -0.009009 }, + { 0.009828, -0.001212 }, + { 0.000345, -0.001685 }, + { -0.005231, -0.013538 }, + { 0.000002, -0.001238 }, + { -0.003313, 0.016618 }, + { 0.006295, 0.001419 }, + { 0.015395, -0.009170 }, + { -0.002174, 0.011488 }, + { -0.009404, 0.022304 }, + { 0.004632, 0.010793 }, + { 0.011009, -0.002593 }, + { 0.014388, -0.011532 }, + { 0.015671, -0.001368 }, + { 0.000125, 0.017572 }, + { 0.000436, 0.003187 }, + { 0.024009, -0.012836 }, + { 0.011807, 0.014141 }, + { -0.004317, 0.026151 }, + { 0.022518, 0.010502 }, + { 0.019436, 0.015685 }, + { 0.000469, 0.004379 }, + { 0.019000, -0.008523 }, + { 0.008294, 0.032193 }, + { -0.013804, 0.038452 }, + { -0.001379, -0.008306 }, + { 0.001599, -0.009422 }, + { 0.009804, 0.009410 }, + { 0.004830, 0.015873 }, + { -0.024918, 0.030994 }, + { 0.001932, 0.016322 }, + { 0.023798, -0.004824 }, + { -0.004216, -0.000418 }, + { 0.009262, -0.026098 }, + { 0.017262, -0.034180 }, + { 0.001665, 0.021466 }, + { 0.024853, 0.024348 }, + { 0.014199, -0.016497 }, + { -0.016248, 0.008894 }, + { -0.000480, 0.013551 }, + { -0.010981, -0.037871 }, + { -0.030725, -0.015814 }, + { -0.010916, 0.031541 }, + { -0.011665, 0.015953 }, + { -0.025948, 0.004999 }, + { -0.017324, -0.010507 }, + { -0.003547, -0.040610 }, + { -0.000637, -0.025027 }, + { -0.015287, -0.008660 }, + { -0.006425, 0.000349 }, + { 0.032766, 0.023749 }, + { 0.021307, 0.004157 }, + { -0.026163, -0.002564 }, + { -0.027560, 0.031060 }, + { -0.008206, 0.013822 }, + { -0.015030, -0.000384 }, + { -0.015358, 0.026877 }, + { 0.017236, 0.021904 }, + { 0.038829, 0.006240 }, + { 0.021941, 0.002973 }, + { 0.005069, -0.000101 }, + { 0.002459, -0.003607 }, + { 0.003824, -0.023342 }, + { 0.011088, -0.009879 }, + { -0.001572, 0.022955 }, + { -0.023124, -0.001395 }, + { -0.012760, -0.004969 }, + { -0.003367, 0.025210 }, + { -0.003966, -0.001869 }, + { 0.008737, -0.019823 }, + { -0.007848, 0.004165 }, + { -0.030682, -0.001252 }, + { -0.000991, -0.019695 }, + { 0.016856, -0.027115 }, + { -0.005487, -0.021072 }, + { -0.014989, 0.005389 }, + { -0.019675, 0.012443 }, + { -0.016475, -0.003563 }, + { 0.005053, -0.004826 }, + { -0.000291, 0.003637 }, + { -0.013199, 0.001917 }, + { 0.003587, -0.008899 }, + { 0.004211, -0.011158 }, + { -0.014458, -0.007266 }, + { -0.011271, -0.009055 }, + { -0.003793, -0.000112 }, + { -0.004585, 0.003435 }, + { 0.002529, -0.015371 }, + { 0.005181, -0.012670 }, + { -0.004043, 0.007760 }, + { -0.007786, 0.004749 }, + { -0.003268, -0.005129 }, + { 0.003755, -0.007221 }, + { 0.008294, -0.005965 }, + { 0.002104, 0.002619 }, + { -0.002722, 0.004962 }, + { 0.002577, 0.000453 }, + { 0.000209, 0.005205 }, + { -0.005101, 0.006702 }, + { -0.000737, -0.001846 }, + { -0.000415, -0.002364 }, + { -0.001620, 0.001788 }, + { 0.002423, -0.001132 }, + { 0.001455, -0.000977 }, + { 0.000244, 0.003130 }, + { 0.001511, 0.001591 }, + { -0.000062, 0.000114 }, + { 0.000000, 0.000977 }, + { -0.000048, 0.000549 }, + { -0.000995, 0.000227 }, + { -0.000271, -0.001899 }, + { -0.000619, -0.001604 }, + { -0.001159, 0.002029 }, + { -0.002155, 0.001304 }, + { 0.000191, 0.001645 }, + { 0.001744, 0.001973 }, + { -0.007707, -0.000532 }, + { -0.007134, 0.005068 }, + { 0.002425, 0.006535 }, + { -0.007000, -0.000849 }, + { -0.009457, 0.003973 }, + { 0.005843, 0.007544 }, + { 0.005439, -0.000943 }, + { 0.000553, -0.001156 }, + { 0.002546, 0.000754 }, + { -0.004221, -0.003122 }, + { -0.005751, 0.000452 }, + { 0.004011, 0.008974 }, + { 0.004823, 0.012028 }, + { -0.002312, 0.006240 }, + { -0.006947, 0.000307 }, + { -0.011707, 0.003768 }, + { -0.007264, 0.003483 }, + { 0.007168, -0.004473 }, + { 0.000490, -0.006640 }, + { -0.008444, -0.007186 }, + { 0.015152, -0.013719 }, + { 0.016496, -0.018870 }, + { -0.015034, -0.010556 }, + { -0.017849, -0.001595 }, + { -0.007984, -0.012648 }, + { -0.000986, -0.007864 }, + { 0.012817, 0.022457 }, + { 0.008655, 0.016499 }, + { 0.011017, -0.006845 }, + { 0.016510, 0.004927 }, + { -0.014820, 0.014747 }, + { -0.021955, 0.001620 }, + { 0.002330, -0.014754 }, + { -0.008601, -0.019475 }, + { -0.012231, -0.007317 }, + { 0.010842, -0.016121 }, + { -0.001762, -0.029260 }, + { -0.030344, 0.005696 }, + { -0.018367, 0.030464 }, + { 0.008010, 0.009477 }, + { 0.008154, -0.012371 }, + { 0.015509, -0.013426 }, + { 0.029659, 0.016731 }, + { 0.000538, 0.020856 }, + { -0.010391, -0.021723 }, + { 0.023244, -0.010084 }, + { 0.008481, 0.019706 }, + { -0.013487, 0.000312 }, + { 0.015008, 0.005308 }, + { 0.017337, 0.007084 }, + { 0.003624, -0.022834 }, + { 0.018666, -0.007070 }, + { 0.023414, 0.024692 }, + { 0.014509, 0.030184 }, + { 0.008946, 0.016473 }, + { 0.004576, -0.022461 }, + { 0.005042, -0.035099 }, + { 0.014007, -0.013468 }, + { 0.025229, -0.005074 }, + { 0.005443, -0.013260 }, + { -0.016533, -0.027092 }, + { 0.011278, -0.008569 }, + { 0.026915, 0.011314 }, + { 0.021627, -0.015271 }, + { 0.033485, -0.011256 }, + { 0.004398, -0.002780 }, + { -0.015399, -0.026435 }, + { 0.031728, 0.009035 }, + { 0.032443, 0.026754 }, + { -0.000630, -0.009253 }, + { 0.010827, 0.007597 }, + { 0.007637, 0.014502 }, + { 0.000395, 0.009458 }, + { 0.020015, 0.024786 }, + { 0.010735, -0.025474 }, + { -0.012793, -0.040949 }, + { -0.022797, 0.003489 }, + { -0.030074, -0.021836 }, + { -0.009464, -0.022243 }, + { 0.018441, 0.007656 }, + { 0.007315, -0.017710 }, + { -0.009110, 0.002353 }, + { -0.004857, 0.027229 }, + { -0.015764, -0.004047 }, + { -0.030503, 0.005904 }, + { -0.002697, 0.011940 }, + { 0.025847, -0.011647 }, + { 0.008658, 0.012320 }, + { -0.009248, 0.031356 }, + { -0.014053, 0.004353 }, + { -0.022536, -0.017916 }, + { -0.015876, -0.008132 }, + { -0.009650, 0.011158 }, + { -0.005278, -0.002730 }, + { 0.015725, -0.021680 }, + { 0.008162, -0.007395 }, + { -0.014094, 0.011303 }, + { 0.004898, 0.019598 }, + { 0.014368, 0.012911 }, + { -0.004795, 0.004755 }, + { 0.001519, 0.013007 }, + { 0.011490, -0.000184 }, + { -0.001756, -0.022971 }, + { -0.003939, -0.011879 }, + { 0.003907, 0.004061 }, + { -0.006058, 0.005974 }, + { -0.014908, 0.002747 }, + { 0.000686, 0.002046 }, + { 0.008876, 0.011052 }, + { -0.006496, 0.008082 }, + { -0.007764, -0.002784 }, + { 0.002795, -0.000550 }, + { -0.002060, -0.000490 }, + { -0.003803, -0.001368 }, + { 0.002392, 0.002664 }, + { -0.000189, 0.001153 }, + { -0.002011, -0.000707 }, + { -0.000117, -0.000523 }, + { -0.000865, 0.000223 }, + { 0.000000, 0.000977 }, + { 0.000161, -0.000244 }, + { 0.000184, -0.000428 }, + { 0.002535, -0.002531 }, + { -0.000402, -0.003171 }, + { -0.004620, -0.001632 }, + { -0.000887, -0.002360 }, + { 0.005528, 0.000644 }, + { 0.007391, -0.001455 }, + { 0.002017, -0.003497 }, + { -0.003703, 0.003047 }, + { 0.000262, -0.000714 }, + { 0.003906, 0.003376 }, + { 0.002274, 0.014628 }, + { 0.006367, 0.003010 }, + { 0.005325, -0.003178 }, + { -0.003275, 0.001985 }, + { -0.000628, 0.009567 }, + { 0.000217, 0.013891 }, + { -0.006317, -0.015657 }, + { -0.003911, -0.016588 }, + { -0.011112, 0.014835 }, + { -0.023493, -0.012767 }, + { -0.008954, -0.024541 }, + { 0.005617, -0.000242 }, + { -0.002746, -0.013215 }, + { -0.006339, 0.005257 }, + { -0.003593, 0.019395 }, + { -0.012325, -0.018074 }, + { -0.013640, -0.008425 }, + { 0.010534, -0.001718 }, + { 0.018988, -0.018333 }, + { -0.008704, 0.015697 }, + { -0.018075, 0.024086 }, + { -0.014248, 0.002070 }, + { -0.028606, 0.004590 }, + { -0.012733, 0.006409 }, + { 0.011576, 0.019568 }, + { -0.002498, 0.011104 }, + { -0.001822, -0.016373 }, + { -0.004235, -0.004172 }, + { -0.029207, 0.001416 }, + { -0.003956, 0.014334 }, + { 0.018951, 0.032725 }, + { -0.014030, -0.003748 }, + { -0.019243, -0.006471 }, + { -0.004645, 0.004512 }, + { -0.007395, -0.037332 }, + { 0.011440, -0.021391 }, + { 0.015803, 0.011328 }, + { -0.021521, 0.001786 }, + { -0.030209, 0.029333 }, + { 0.006199, 0.042841 }, + { 0.024261, 0.025968 }, + { -0.000855, 0.016544 }, + { -0.019406, -0.012120 }, + { -0.006403, -0.004887 }, + { 0.004046, 0.011595 }, + { 0.010466, -0.018381 }, + { 0.019503, -0.009375 }, + { 0.018605, 0.005597 }, + { 0.019642, -0.017836 }, + { 0.002147, -0.004067 }, + { -0.035048, 0.012257 }, + { -0.023491, -0.013679 }, + { 0.010951, -0.031520 }, + { 0.000571, 0.000028 }, + { -0.011369, 0.046314 }, + { 0.006538, 0.024583 }, + { 0.026516, -0.001859 }, + { 0.022315, 0.029784 }, + { -0.016810, 0.014729 }, + { -0.023166, -0.018112 }, + { 0.018988, -0.004903 }, + { 0.005061, -0.017600 }, + { -0.017775, -0.022494 }, + { 0.031574, -0.005672 }, + { 0.026293, -0.024362 }, + { -0.030778, -0.011580 }, + { -0.005333, 0.029800 }, + { 0.026007, 0.015153 }, + { 0.016977, -0.016750 }, + { 0.034428, -0.008049 }, + { 0.019240, 0.015884 }, + { -0.018569, 0.002446 }, + { -0.000046, -0.018692 }, + { 0.007177, 0.010993 }, + { -0.008523, 0.029584 }, + { 0.006725, 0.008563 }, + { 0.011700, 0.003452 }, + { 0.005728, -0.001012 }, + { 0.008985, -0.001378 }, + { -0.003441, 0.022438 }, + { -0.010259, 0.029224 }, + { -0.003894, 0.017322 }, + { 0.002921, 0.003253 }, + { 0.018430, -0.006148 }, + { 0.014431, 0.002131 }, + { -0.000817, 0.001220 }, + { 0.004795, -0.009069 }, + { -0.003630, -0.008617 }, + { -0.013509, -0.011339 }, + { 0.009571, -0.011295 }, + { 0.017757, -0.010772 }, + { 0.008159, -0.004310 }, + { 0.016830, 0.018437 }, + { 0.015377, 0.006407 }, + { 0.002590, -0.014757 }, + { 0.010750, 0.011373 }, + { 0.018612, 0.014410 }, + { 0.006226, -0.010450 }, + { -0.008235, -0.003555 }, + { -0.010714, 0.000555 }, + { -0.001501, -0.000243 }, + { 0.003529, 0.008437 }, + { -0.002170, -0.005175 }, + { -0.000706, -0.013411 }, + { 0.002009, 0.000922 }, + { -0.005303, 0.004538 }, + { -0.001948, 0.002043 }, + { 0.005530, 0.000573 }, + { -0.003249, -0.001528 }, + { -0.006643, 0.003191 }, + { 0.000473, 0.004534 }, + { -0.001964, 0.001572 }, + { -0.004759, 0.001723 }, + { -0.000711, 0.000541 }, + { 0.000303, 0.000387 }, + { 0.000000, 0.000977 }, + { 0.000230, -0.001053 }, + { 0.000169, -0.000496 }, + { 0.001344, 0.001997 }, + { -0.000329, 0.000398 }, + { -0.000545, -0.001410 }, + { 0.004047, 0.002942 }, + { 0.001430, 0.001770 }, + { -0.000611, -0.007411 }, + { 0.005010, -0.005466 }, + { -0.002841, -0.001954 }, + { -0.004511, -0.005798 }, + { 0.017126, -0.000857 }, + { 0.010979, 0.001235 }, + { -0.011441, 0.000744 }, + { -0.000114, 0.009545 }, + { 0.009452, 0.005251 }, + { 0.010827, -0.000087 }, + { 0.019407, 0.005691 }, + { -0.001377, -0.003038 }, + { -0.018431, -0.005686 }, + { -0.007631, 0.003383 }, + { -0.017492, 0.000758 }, + { -0.013582, 0.003565 }, + { 0.014225, -0.000050 }, + { 0.004715, -0.007871 }, + { -0.001697, 0.010093 }, + { 0.012509, 0.013053 }, + { -0.007338, 0.009223 }, + { -0.017498, 0.032333 }, + { 0.010856, 0.019432 }, + { 0.020264, -0.010583 }, + { 0.013151, 0.006260 }, + { 0.007506, 0.018871 }, + { -0.013963, 0.008620 }, + { -0.024917, 0.002581 }, + { -0.010997, -0.001587 }, + { -0.001047, 0.003198 }, + { 0.010159, -0.010884 }, + { 0.017273, -0.036204 }, + { 0.007336, -0.004232 }, + { 0.019830, 0.034671 }, + { 0.034680, 0.010869 }, + { 0.011121, -0.004952 }, + { 0.009447, 0.018126 }, + { 0.026791, 0.006959 }, + { -0.000257, -0.034475 }, + { -0.028551, -0.033366 }, + { -0.018297, -0.002509 }, + { -0.001145, 0.013028 }, + { -0.011141, 0.021448 }, + { -0.031033, 0.008565 }, + { 0.000897, -0.012480 }, + { 0.027322, 0.013909 }, + { -0.011251, 0.031817 }, + { -0.006231, -0.000908 }, + { 0.020027, -0.006718 }, + { -0.023376, 0.011292 }, + { -0.026641, 0.012632 }, + { 0.016906, 0.025571 }, + { -0.004789, 0.027918 }, + { -0.040583, 0.002854 }, + { -0.031832, -0.000253 }, + { -0.002192, 0.015428 }, + { 0.027344, 0.020508 }, + { 0.025331, 0.023307 }, + { -0.007791, 0.019310 }, + { -0.021696, 0.005597 }, + { 0.008602, 0.009305 }, + { 0.016267, 0.022106 }, + { -0.028762, 0.012128 }, + { -0.027180, 0.009027 }, + { 0.003303, 0.026274 }, + { -0.009707, 0.014826 }, + { 0.005687, -0.005976 }, + { 0.010494, 0.005021 }, + { -0.038143, 0.009580 }, + { -0.017439, -0.004947 }, + { 0.020910, -0.006673 }, + { -0.003761, 0.006808 }, + { -0.006216, 0.011375 }, + { -0.006546, -0.005420 }, + { -0.013974, -0.004946 }, + { 0.017503, 0.015784 }, + { 0.019775, 0.002282 }, + { 0.008649, -0.015354 }, + { 0.026362, -0.002726 }, + { 0.001144, 0.003348 }, + { -0.025872, 0.010021 }, + { 0.006944, 0.010935 }, + { 0.014717, -0.013501 }, + { -0.013983, -0.018246 }, + { -0.002706, -0.012174 }, + { 0.016407, -0.022147 }, + { -0.005670, -0.012345 }, + { -0.017087, 0.002394 }, + { -0.005269, -0.006364 }, + { -0.003381, -0.014959 }, + { 0.014845, -0.009221 }, + { 0.029091, 0.002644 }, + { 0.005756, -0.005161 }, + { 0.000354, -0.015935 }, + { 0.010741, 0.010134 }, + { 0.002597, 0.020932 }, + { -0.000170, -0.004798 }, + { -0.007369, -0.005686 }, + { -0.012479, 0.002196 }, + { 0.004716, -0.004579 }, + { 0.005559, 0.003371 }, + { -0.005370, 0.012199 }, + { -0.001735, 0.010503 }, + { 0.001509, 0.005862 }, + { 0.004767, -0.004497 }, + { 0.006384, -0.002140 }, + { 0.005661, 0.004826 }, + { 0.008262, -0.002434 }, + { 0.001690, -0.002943 }, + { -0.005068, -0.001091 }, + { -0.004588, -0.005237 }, + { -0.004119, 0.000827 }, + { 0.002425, 0.002350 }, + { 0.003189, -0.003981 }, + { -0.002592, -0.000637 }, + { -0.000058, 0.000707 }, + { -0.000406, -0.001537 }, + { -0.001719, 0.001355 }, + { 0.001493, 0.001488 }, + { 0.000203, 0.000516 }, + { 0.000000, 0.000977 }, + { 0.001003, 0.000152 }, + { 0.000016, 0.000533 }, + { -0.000151, 0.000449 }, + { -0.000259, 0.000873 }, + { -0.000405, 0.002812 }, + { -0.005212, 0.003461 }, + { -0.004335, 0.003187 }, + { 0.003362, 0.000089 }, + { -0.002362, -0.002303 }, + { -0.003047, -0.001480 }, + { 0.004037, -0.000177 }, + { -0.003896, 0.005050 }, + { -0.002552, 0.005848 }, + { 0.003978, 0.003398 }, + { -0.003793, 0.010804 }, + { 0.000149, 0.009770 }, + { 0.007182, 0.001969 }, + { 0.004142, 0.005908 }, + { 0.004566, 0.002430 }, + { -0.000297, -0.004076 }, + { -0.003043, -0.004011 }, + { -0.001757, -0.010761 }, + { -0.013679, -0.006296 }, + { -0.013138, 0.003297 }, + { 0.011598, 0.001411 }, + { 0.018029, 0.001787 }, + { -0.004250, -0.013673 }, + { -0.007543, -0.023045 }, + { 0.015891, -0.000104 }, + { 0.016473, -0.003977 }, + { -0.002101, -0.014275 }, + { -0.010214, 0.003401 }, + { -0.007716, -0.006002 }, + { 0.013339, -0.002073 }, + { 0.021005, 0.024894 }, + { 0.005253, -0.007221 }, + { 0.018623, -0.022528 }, + { 0.028673, 0.019601 }, + { 0.008570, 0.009870 }, + { 0.000158, -0.016043 }, + { -0.009695, 0.007053 }, + { -0.005423, 0.011080 }, + { 0.024073, -0.000811 }, + { 0.016766, 0.016875 }, + { -0.012506, 0.024821 }, + { -0.024002, 0.004467 }, + { -0.013243, -0.017729 }, + { 0.021409, -0.018381 }, + { 0.026898, 0.016500 }, + { 0.003588, 0.036904 }, + { 0.004318, 0.009175 }, + { 0.011359, -0.001330 }, + { -0.001461, 0.004567 }, + { -0.035720, -0.014411 }, + { -0.027874, -0.007313 }, + { 0.033057, 0.005086 }, + { 0.012890, -0.018789 }, + { -0.025908, -0.007306 }, + { 0.019578, 0.015742 }, + { -0.000918, -0.000075 }, + { -0.042935, 0.011327 }, + { 0.010297, 0.037155 }, + { 0.014949, 0.031501 }, + { -0.020179, 0.014260 }, + { -0.012712, -0.001295 }, + { -0.021477, 0.013913 }, + { -0.011876, 0.026966 }, + { 0.014885, -0.001727 }, + { 0.022679, -0.007444 }, + { 0.040403, -0.006649 }, + { 0.008980, -0.021369 }, + { -0.022202, 0.006999 }, + { 0.024550, 0.021268 }, + { 0.018329, -0.002257 }, + { -0.016167, -0.003981 }, + { 0.017816, -0.015798 }, + { 0.012379, -0.029217 }, + { -0.015564, -0.019429 }, + { 0.008398, -0.019129 }, + { 0.006152, -0.013027 }, + { -0.012212, -0.010569 }, + { -0.003717, -0.009653 }, + { -0.005294, 0.014031 }, + { 0.000523, 0.008458 }, + { 0.014783, 0.004935 }, + { 0.009525, 0.035298 }, + { 0.015247, 0.021549 }, + { 0.015679, -0.000102 }, + { -0.016959, 0.003045 }, + { -0.020949, -0.005884 }, + { 0.007903, 0.019739 }, + { 0.001713, 0.037275 }, + { -0.023071, 0.002225 }, + { -0.021140, 0.003993 }, + { 0.000923, 0.014133 }, + { 0.021792, -0.004806 }, + { 0.013287, 0.005052 }, + { -0.010805, 0.001304 }, + { -0.008236, -0.018872 }, + { -0.003604, 0.002573 }, + { -0.015255, 0.007734 }, + { -0.013065, -0.015012 }, + { -0.003906, -0.003598 }, + { 0.003243, 0.012967 }, + { 0.012708, 0.001135 }, + { 0.004622, -0.008825 }, + { -0.010343, -0.004301 }, + { -0.005230, -0.002482 }, + { 0.007163, -0.006994 }, + { 0.007638, -0.002482 }, + { -0.003331, 0.008577 }, + { -0.011308, 0.005347 }, + { -0.006805, -0.006620 }, + { 0.000848, -0.006611 }, + { 0.002362, -0.001944 }, + { -0.000784, -0.004330 }, + { 0.001558, -0.001546 }, + { 0.008487, 0.005393 }, + { 0.003727, 0.002528 }, + { -0.004607, -0.000136 }, + { -0.002187, 0.003353 }, + { -0.000088, 0.002360 }, + { -0.000864, -0.000323 }, + { 0.000428, 0.000473 }, + { 0.000278, 0.000835 }, + { -0.000096, -0.000263 }, + { -0.000140, -0.000083 }, + { 0.000000, 0.000977 }, + { 0.000103, 0.000069 }, + { -0.001163, 0.000758 }, + { -0.000025, 0.002412 }, + { 0.000633, 0.000106 }, + { 0.001499, -0.000314 }, + { 0.005645, -0.000812 }, + { 0.000344, -0.004232 }, + { -0.003973, -0.000881 }, + { 0.005371, 0.003107 }, + { 0.003116, 0.000560 }, + { -0.001301, -0.002366 }, + { 0.010501, -0.004813 }, + { 0.005426, -0.002946 }, + { -0.008029, 0.000616 }, + { -0.001064, -0.001414 }, + { 0.003540, -0.003004 }, + { 0.005976, -0.002525 }, + { 0.006736, 0.002632 }, + { -0.008404, 0.009143 }, + { -0.004319, 0.004501 }, + { 0.006587, 0.008337 }, + { -0.008912, 0.022184 }, + { -0.001356, 0.008836 }, + { 0.012223, -0.010007 }, + { -0.009485, 0.000920 }, + { -0.002982, 0.009482 }, + { 0.017297, 0.007697 }, + { -0.002235, 0.021507 }, + { -0.007011, 0.023293 }, + { 0.008513, 0.000284 }, + { 0.011156, -0.004260 }, + { 0.017830, 0.007184 }, + { 0.010403, 0.011653 }, + { -0.009874, 0.016313 }, + { -0.008000, 0.007799 }, + { -0.000180, -0.004083 }, + { 0.000262, -0.005671 }, + { -0.006354, -0.023964 }, + { -0.012859, -0.019185 }, + { 0.009718, 0.016367 }, + { 0.032409, 0.001962 }, + { 0.013972, -0.018763 }, + { -0.007488, 0.002270 }, + { -0.003401, -0.002587 }, + { -0.004272, -0.018019 }, + { -0.024143, -0.008788 }, + { -0.030109, 0.000391 }, + { -0.011409, 0.010001 }, + { -0.001987, 0.011272 }, + { -0.003620, 0.014670 }, + { 0.000806, 0.017370 }, + { 0.009931, -0.010766 }, + { 0.025755, -0.006033 }, + { 0.025939, 0.022055 }, + { 0.008216, -0.006887 }, + { 0.002042, -0.008959 }, + { -0.011104, 0.034162 }, + { -0.009312, 0.023833 }, + { 0.031741, 0.006217 }, + { 0.020284, 0.022487 }, + { -0.029842, 0.028366 }, + { -0.011105, 0.024189 }, + { 0.022951, 0.004691 }, + { 0.023438, -0.017884 }, + { 0.022320, -0.001437 }, + { -0.010315, 0.023060 }, + { -0.029874, 0.013000 }, + { 0.016385, 0.003819 }, + { 0.015840, 0.023178 }, + { -0.032108, 0.027003 }, + { -0.007012, 0.009515 }, + { 0.024259, 0.010405 }, + { -0.000050, -0.000266 }, + { -0.003338, -0.017188 }, + { -0.006010, 0.012967 }, + { -0.028462, 0.024009 }, + { -0.012076, -0.023290 }, + { 0.008145, -0.035471 }, + { 0.005052, 0.005114 }, + { -0.000264, 0.023309 }, + { -0.026258, 0.007049 }, + { -0.024354, -0.001644 }, + { 0.014651, -0.003294 }, + { 0.008709, -0.013032 }, + { 0.004209, -0.016016 }, + { 0.026535, -0.017931 }, + { 0.001585, -0.001164 }, + { -0.014125, 0.033014 }, + { 0.006645, 0.005519 }, + { -0.010956, -0.023951 }, + { -0.023731, 0.012791 }, + { -0.007367, -0.004919 }, + { -0.023041, -0.037692 }, + { -0.035952, 0.010078 }, + { -0.010634, 0.017530 }, + { 0.006584, -0.014000 }, + { 0.003467, -0.010003 }, + { 0.001804, -0.020626 }, + { 0.004698, -0.017904 }, + { 0.002021, 0.006953 }, + { -0.004851, 0.010629 }, + { 0.003039, 0.023730 }, + { 0.012215, 0.019065 }, + { -0.005495, -0.002503 }, + { -0.018851, 0.010418 }, + { -0.002773, 0.005454 }, + { 0.003190, -0.008906 }, + { -0.004127, 0.010222 }, + { 0.010242, 0.008380 }, + { 0.021998, -0.003071 }, + { 0.008017, 0.003005 }, + { -0.003000, -0.005858 }, + { -0.002452, -0.011977 }, + { 0.001910, -0.007658 }, + { 0.006499, -0.008553 }, + { -0.000812, -0.002373 }, + { -0.007876, -0.000233 }, + { -0.002909, -0.002590 }, + { -0.002759, 0.005190 }, + { -0.004013, 0.003308 }, + { 0.000900, -0.007065 }, + { -0.001640, -0.004939 }, + { -0.006368, -0.000866 }, + { -0.002292, -0.003118 }, + { 0.001407, -0.002978 }, + { 0.000268, -0.000794 }, + { -0.000845, 0.000525 }, + { 0.000000, 0.000977 }, + { 0.000913, 0.000333 }, + { -0.002138, 0.002388 }, + { -0.003737, 0.003189 }, + { 0.002340, 0.000786 }, + { 0.003254, 0.004132 }, + { -0.003476, 0.002851 }, + { -0.000951, -0.004154 }, + { 0.005801, 0.001809 }, + { 0.005563, 0.003097 }, + { 0.002824, -0.005016 }, + { -0.001459, 0.003825 }, + { -0.001924, 0.007872 }, + { -0.001131, -0.010755 }, + { -0.007857, -0.015767 }, + { -0.005854, 0.004106 }, + { 0.001679, 0.015167 }, + { -0.004819, 0.008831 }, + { -0.010014, 0.009377 }, + { -0.004660, 0.005815 }, + { 0.005272, -0.007608 }, + { 0.012076, 0.000885 }, + { 0.002380, 0.005737 }, + { -0.004667, -0.001826 }, + { -0.000199, 0.014866 }, + { -0.005450, 0.012000 }, + { -0.005793, -0.003631 }, + { -0.000030, 0.016786 }, + { -0.013892, 0.009027 }, + { -0.030182, -0.012597 }, + { -0.022053, 0.009874 }, + { 0.007491, 0.012720 }, + { 0.027527, -0.001738 }, + { 0.013713, 0.002977 }, + { -0.006996, -0.002275 }, + { -0.003200, -0.003437 }, + { 0.012977, 0.002898 }, + { 0.006101, 0.009999 }, + { -0.012312, 0.023778 }, + { 0.001019, 0.015822 }, + { 0.003769, 0.011627 }, + { -0.013400, 0.014714 }, + { 0.009556, -0.012437 }, + { 0.003328, -0.007433 }, + { -0.032630, 0.019564 }, + { 0.006434, -0.006224 }, + { 0.027037, -0.020475 }, + { -0.008851, -0.001746 }, + { -0.005533, -0.009088 }, + { -0.008576, -0.015366 }, + { -0.001605, -0.003104 }, + { 0.041908, -0.006724 }, + { 0.021269, -0.021825 }, + { -0.000949, -0.022115 }, + { 0.016577, -0.007730 }, + { -0.015909, 0.008716 }, + { -0.023848, 0.012431 }, + { 0.006671, -0.016474 }, + { -0.018495, -0.036755 }, + { -0.026997, -0.016361 }, + { 0.003394, -0.025919 }, + { -0.006476, -0.039649 }, + { -0.021569, 0.010685 }, + { -0.011219, 0.025982 }, + { -0.010749, -0.016213 }, + { -0.001475, -0.024468 }, + { 0.034657, -0.013577 }, + { 0.037087, -0.006042 }, + { -0.002339, -0.003906 }, + { -0.008247, -0.003299 }, + { 0.005303, 0.031535 }, + { -0.005284, 0.036597 }, + { -0.017484, -0.016792 }, + { -0.032553, -0.022420 }, + { -0.026832, 0.007534 }, + { 0.003699, -0.000441 }, + { -0.005441, -0.007871 }, + { -0.008515, 0.011207 }, + { 0.033551, 0.018979 }, + { 0.039880, -0.002008 }, + { 0.005927, -0.019434 }, + { -0.013503, -0.020105 }, + { 0.005145, -0.025591 }, + { 0.022319, -0.012948 }, + { -0.016336, 0.005817 }, + { -0.024434, -0.020793 }, + { 0.017782, -0.030477 }, + { 0.003709, 0.012259 }, + { -0.004255, 0.013285 }, + { 0.021515, -0.026750 }, + { -0.008846, -0.022103 }, + { -0.025118, -0.002170 }, + { 0.007989, -0.017311 }, + { 0.010326, -0.016620 }, + { -0.007604, 0.007079 }, + { -0.020779, -0.001317 }, + { -0.024590, -0.016152 }, + { -0.009738, -0.014781 }, + { 0.005578, -0.020095 }, + { 0.007422, -0.009166 }, + { -0.009257, 0.006518 }, + { -0.003868, 0.001453 }, + { 0.029417, 0.003442 }, + { 0.013428, -0.002441 }, + { -0.013194, -0.010237 }, + { 0.000218, 0.011273 }, + { -0.004028, 0.010790 }, + { 0.002436, -0.008729 }, + { 0.026842, 0.002009 }, + { 0.010311, 0.008997 }, + { 0.000906, 0.002737 }, + { 0.008066, 0.002244 }, + { -0.002622, -0.003458 }, + { 0.002052, -0.004991 }, + { 0.001367, -0.003684 }, + { -0.015189, -0.003665 }, + { -0.009435, 0.006925 }, + { -0.007176, 0.010524 }, + { -0.010390, 0.004936 }, + { 0.002301, 0.004188 }, + { 0.003035, -0.001320 }, + { -0.003285, -0.004006 }, + { -0.000153, 0.002548 }, + { -0.001876, 0.003554 }, + { -0.003204, 0.001226 }, + { 0.000928, 0.000427 }, + { 0.001292, -0.001066 }, + { -0.000256, 0.000137 }, + { 0.000000, 0.000977 }, + { 0.000721, -0.000357 }, + { 0.000127, 0.001863 }, + { -0.000060, 0.003082 }, + { 0.002346, 0.000143 }, + { 0.001881, 0.003845 }, + { -0.002367, 0.009010 }, + { -0.001104, 0.002087 }, + { 0.000762, -0.005024 }, + { -0.006303, -0.003669 }, + { -0.006510, 0.000006 }, + { 0.001744, 0.005471 }, + { -0.002843, 0.004195 }, + { -0.007065, -0.004959 }, + { 0.005131, -0.005135 }, + { 0.015014, 0.002639 }, + { 0.006528, 0.005638 }, + { -0.011349, 0.002193 }, + { -0.008042, -0.003893 }, + { 0.005392, -0.004985 }, + { -0.006457, -0.001902 }, + { -0.007801, -0.012925 }, + { 0.006274, -0.023533 }, + { -0.002028, 0.006092 }, + { 0.004126, 0.023916 }, + { 0.012341, -0.015927 }, + { -0.014276, -0.016844 }, + { -0.018260, 0.015923 }, + { -0.007545, -0.014243 }, + { -0.018934, -0.019766 }, + { -0.018140, 0.023716 }, + { -0.013370, 0.006632 }, + { -0.010535, -0.018720 }, + { -0.002272, -0.013884 }, + { -0.005219, -0.020303 }, + { 0.002833, -0.003180 }, + { 0.009812, 0.013368 }, + { 0.012400, 0.013551 }, + { 0.037928, 0.021505 }, + { 0.018136, -0.005740 }, + { -0.024169, -0.007714 }, + { -0.003130, 0.033530 }, + { 0.007518, 0.003678 }, + { 0.005545, -0.022434 }, + { 0.034777, 0.010258 }, + { 0.027249, -0.002711 }, + { 0.013324, -0.018830 }, + { 0.016488, -0.002548 }, + { -0.006918, -0.013515 }, + { -0.006876, -0.018997 }, + { -0.004740, -0.008257 }, + { -0.025853, -0.001670 }, + { -0.012603, 0.017724 }, + { -0.019233, 0.025346 }, + { -0.034822, 0.018942 }, + { 0.002077, 0.019207 }, + { 0.002132, -0.005048 }, + { -0.019147, -0.039431 }, + { -0.010131, -0.017641 }, + { -0.031977, 0.024676 }, + { -0.028519, -0.001632 }, + { 0.005662, -0.042278 }, + { -0.012495, -0.014761 }, + { -0.006523, 0.019902 }, + { 0.019531, 0.020508 }, + { -0.005022, 0.001405 }, + { 0.004706, -0.033071 }, + { 0.021882, -0.025123 }, + { -0.021066, 0.003322 }, + { -0.016726, -0.020936 }, + { 0.019671, -0.028319 }, + { -0.004556, 0.005714 }, + { -0.009829, 0.012164 }, + { 0.021958, 0.004506 }, + { 0.011280, -0.006080 }, + { -0.000695, -0.023339 }, + { 0.021169, -0.011577 }, + { 0.024121, 0.018815 }, + { 0.004369, 0.028110 }, + { -0.011544, 0.005720 }, + { -0.005630, -0.025198 }, + { 0.024820, -0.027184 }, + { 0.025914, -0.001645 }, + { -0.004214, 0.012631 }, + { -0.004823, 0.002144 }, + { 0.004417, 0.012633 }, + { -0.001040, 0.037603 }, + { -0.003408, 0.003741 }, + { -0.008901, -0.027155 }, + { 0.001271, 0.004204 }, + { 0.015643, -0.000112 }, + { 0.000846, -0.017620 }, + { 0.008267, 0.014027 }, + { 0.027246, 0.005517 }, + { 0.007874, -0.026268 }, + { 0.004077, -0.007786 }, + { 0.011615, 0.007738 }, + { 0.001909, 0.002633 }, + { 0.013988, 0.000559 }, + { 0.009056, -0.006130 }, + { -0.020132, -0.012389 }, + { -0.011510, -0.015167 }, + { -0.001529, -0.005987 }, + { -0.004377, 0.008776 }, + { 0.008550, 0.003060 }, + { 0.003985, -0.005493 }, + { -0.006156, -0.001394 }, + { 0.000856, 0.002933 }, + { -0.002037, 0.007748 }, + { -0.006871, 0.010628 }, + { -0.007761, 0.008929 }, + { -0.010091, 0.002414 }, + { -0.000273, -0.003740 }, + { 0.008397, 0.001256 }, + { 0.006222, 0.001564 }, + { 0.002013, -0.007001 }, + { -0.003343, -0.005120 }, + { -0.002346, 0.000464 }, + { 0.000837, 0.002061 }, + { -0.000382, 0.001068 }, + { 0.000394, -0.001149 }, + { -0.001018, 0.003662 }, + { -0.001285, 0.004683 }, + { 0.002245, -0.001508 }, + { 0.000211, 0.001002 }, + { -0.000100, 0.003803 }, + { 0.002387, 0.000261 }, + { 0.000125, 0.000041 }, + { 0.000000, 0.000977 }, + { 0.000688, 0.000127 }, + { -0.000793, 0.000551 }, + { 0.000430, 0.001872 }, + { 0.001018, 0.001481 }, + { 0.000498, 0.001810 }, + { 0.000642, 0.002094 }, + { -0.001000, -0.002751 }, + { 0.000455, -0.002136 }, + { 0.004231, 0.001984 }, + { 0.002121, -0.003682 }, + { 0.003354, -0.002756 }, + { 0.010193, 0.003251 }, + { 0.004895, -0.000012 }, + { -0.001659, 0.005791 }, + { 0.004159, 0.010992 }, + { 0.006594, -0.003729 }, + { 0.008595, -0.009115 }, + { 0.005539, 0.005055 }, + { -0.009810, 0.007273 }, + { -0.005768, -0.003353 }, + { 0.001780, 0.004992 }, + { -0.011090, 0.018428 }, + { -0.007955, 0.005601 }, + { 0.003185, -0.006647 }, + { 0.006778, -0.008209 }, + { 0.007197, -0.011981 }, + { -0.012303, 0.001374 }, + { -0.009850, 0.007730 }, + { 0.010581, -0.011063 }, + { -0.002718, -0.013210 }, + { 0.008353, -0.001473 }, + { 0.027930, 0.001746 }, + { 0.005944, -0.003727 }, + { 0.016457, -0.010915 }, + { 0.020084, -0.008966 }, + { -0.017805, -0.019344 }, + { -0.000499, -0.020758 }, + { 0.019451, 0.009543 }, + { -0.004610, 0.012657 }, + { 0.001720, 0.009917 }, + { 0.010940, 0.014359 }, + { 0.001349, -0.021719 }, + { 0.003022, -0.013061 }, + { 0.003440, 0.031504 }, + { 0.000483, 0.012449 }, + { -0.017672, 0.002266 }, + { -0.030961, -0.003283 }, + { -0.000531, -0.035555 }, + { 0.028087, -0.009944 }, + { 0.027539, 0.005306 }, + { 0.010743, -0.029891 }, + { -0.014236, -0.022191 }, + { -0.019644, 0.009132 }, + { -0.015282, 0.030022 }, + { -0.010256, 0.014465 }, + { -0.006148, -0.024837 }, + { -0.024592, -0.001113 }, + { -0.020861, 0.011827 }, + { 0.003384, -0.018206 }, + { -0.005918, 0.008657 }, + { 0.004907, 0.019668 }, + { 0.038731, -0.003588 }, + { 0.019805, 0.014827 }, + { -0.021873, 0.011725 }, + { -0.013563, -0.011134 }, + { 0.029780, -0.018440 }, + { 0.017849, -0.029769 }, + { -0.032492, -0.021520 }, + { -0.020118, -0.021944 }, + { 0.003706, -0.009346 }, + { -0.008272, 0.038501 }, + { -0.011181, 0.010589 }, + { -0.021281, -0.023310 }, + { -0.019255, 0.019887 }, + { -0.010974, 0.005089 }, + { -0.033257, -0.021747 }, + { -0.010618, 0.018066 }, + { 0.022433, 0.002127 }, + { -0.004885, -0.034388 }, + { -0.017416, -0.003692 }, + { -0.013132, 0.006357 }, + { 0.004108, -0.019139 }, + { 0.031228, -0.008660 }, + { 0.000113, 0.006808 }, + { -0.003936, -0.017113 }, + { 0.034440, -0.026806 }, + { 0.008753, -0.000980 }, + { -0.007249, 0.008118 }, + { 0.000186, 0.009991 }, + { -0.010768, 0.012946 }, + { 0.017041, -0.007932 }, + { 0.020235, -0.005750 }, + { -0.007231, 0.020543 }, + { 0.002342, 0.012864 }, + { -0.018984, -0.005991 }, + { -0.034509, -0.007742 }, + { -0.003696, 0.001259 }, + { -0.010692, 0.011602 }, + { -0.012350, 0.009893 }, + { 0.010843, 0.013328 }, + { 0.001442, 0.013645 }, + { -0.002075, -0.005202 }, + { 0.003026, -0.009861 }, + { -0.002971, -0.006628 }, + { -0.002970, -0.002858 }, + { -0.006117, 0.013819 }, + { 0.001232, 0.005794 }, + { 0.007856, -0.011760 }, + { -0.004299, -0.002903 }, + { 0.003760, 0.000653 }, + { 0.012839, 0.004228 }, + { -0.002939, 0.013483 }, + { -0.009789, 0.003326 }, + { -0.009591, -0.000664 }, + { -0.007814, 0.008366 }, + { 0.001100, 0.007312 }, + { 0.002474, 0.001790 }, + { 0.001819, -0.002879 }, + { 0.003708, -0.000159 }, + { 0.001573, 0.004531 }, + { 0.000510, -0.000368 }, + { 0.000440, 0.001015 }, + { -0.000402, 0.004777 }, + { -0.001068, -0.000050 }, + { -0.001323, -0.000506 }, + { -0.000523, 0.000524 }, + { -0.000354, -0.000098 }, + { 0.000000, 0.000977 }, + { 0.000396, -0.000041 }, + { 0.001185, 0.000957 }, + { 0.001189, 0.000700 }, + { -0.001435, -0.002069 }, + { -0.000942, 0.000187 }, + { -0.001099, 0.002964 }, + { -0.002817, 0.003102 }, + { -0.002031, -0.001512 }, + { -0.005839, -0.003324 }, + { -0.003118, 0.005608 }, + { 0.001739, 0.003742 }, + { -0.008378, -0.002695 }, + { -0.006595, 0.004568 }, + { 0.005756, -0.000421 }, + { 0.006205, -0.008842 }, + { 0.004043, 0.003466 }, + { -0.004129, 0.007940 }, + { -0.001712, -0.001272 }, + { 0.010268, -0.001771 }, + { -0.001437, -0.001563 }, + { -0.004256, -0.013394 }, + { 0.004866, -0.017061 }, + { 0.002169, 0.002928 }, + { 0.010728, 0.008849 }, + { 0.001978, -0.004434 }, + { -0.009679, 0.003529 }, + { 0.009952, 0.005650 }, + { -0.002535, -0.003946 }, + { -0.014884, 0.015536 }, + { 0.003334, 0.022440 }, + { -0.015142, -0.003478 }, + { -0.018928, -0.014805 }, + { 0.002434, -0.004098 }, + { -0.006299, 0.013963 }, + { 0.007117, 0.011698 }, + { 0.026043, -0.004075 }, + { 0.020916, 0.004315 }, + { 0.016828, -0.001548 }, + { -0.011679, -0.018740 }, + { -0.011355, 0.000836 }, + { 0.016155, 0.006846 }, + { -0.008179, -0.009543 }, + { -0.000287, -0.010535 }, + { 0.027259, -0.017806 }, + { -0.009029, -0.018282 }, + { -0.005106, -0.004244 }, + { 0.020884, 0.000949 }, + { -0.010998, 0.002322 }, + { -0.017193, -0.001846 }, + { -0.006009, 0.010536 }, + { -0.013842, 0.028793 }, + { 0.000969, 0.014780 }, + { 0.004965, 0.020218 }, + { -0.002094, 0.032150 }, + { 0.007639, 0.003868 }, + { -0.010702, -0.010283 }, + { -0.033214, -0.017178 }, + { -0.015192, -0.004754 }, + { -0.003547, 0.040503 }, + { -0.016759, 0.007545 }, + { -0.023872, -0.035083 }, + { -0.010822, 0.003651 }, + { 0.020830, -0.002659 }, + { 0.026674, -0.022461 }, + { -0.009838, -0.006078 }, + { -0.016356, -0.037010 }, + { -0.002697, -0.027655 }, + { -0.027868, 0.018508 }, + { -0.024456, -0.016769 }, + { 0.012151, -0.024850 }, + { 0.009563, 0.021155 }, + { 0.015119, 0.007509 }, + { 0.020538, -0.019581 }, + { -0.017315, -0.013696 }, + { -0.014127, -0.009938 }, + { 0.022981, -0.006258 }, + { 0.024063, 0.010183 }, + { 0.007869, 0.028405 }, + { -0.022785, 0.014318 }, + { -0.030070, -0.026179 }, + { 0.012087, -0.040217 }, + { 0.023931, -0.018800 }, + { -0.002985, 0.003711 }, + { -0.009436, 0.005833 }, + { 0.019362, 0.013556 }, + { 0.037142, 0.025491 }, + { -0.010582, 0.000059 }, + { -0.031757, -0.005297 }, + { 0.016904, 0.023425 }, + { 0.010438, -0.003761 }, + { -0.006601, -0.025022 }, + { 0.031923, 0.008180 }, + { 0.020250, -0.003655 }, + { -0.010186, -0.032361 }, + { 0.000740, -0.010293 }, + { -0.003351, 0.012326 }, + { -0.002892, 0.008210 }, + { 0.000298, -0.004178 }, + { -0.021469, 0.001087 }, + { -0.023505, 0.016892 }, + { -0.018472, 0.012138 }, + { -0.009989, 0.009479 }, + { 0.018360, 0.007591 }, + { 0.004468, -0.006834 }, + { -0.021788, 0.003980 }, + { 0.000960, 0.020113 }, + { 0.005306, 0.016156 }, + { -0.012934, 0.016000 }, + { -0.002621, 0.007788 }, + { 0.001497, -0.001729 }, + { -0.004134, 0.005637 }, + { 0.003503, 0.009467 }, + { -0.000104, 0.005225 }, + { -0.007711, -0.007400 }, + { -0.002789, -0.013319 }, + { -0.002707, -0.001022 }, + { -0.004612, -0.006004 }, + { -0.001053, -0.013315 }, + { 0.002252, 0.003495 }, + { 0.005954, 0.007419 }, + { 0.004879, 0.001789 }, + { 0.000152, 0.003680 }, + { -0.000599, -0.001500 }, + { -0.000663, -0.001461 }, + { 0.000562, 0.003662 }, + { 0.001318, 0.000939 }, + { -0.000834, 0.000276 }, + { 0.000000, 0.000977 }, + { 0.000223, 0.000126 }, + { -0.000476, -0.000504 }, + { -0.000564, -0.000917 }, + { -0.004954, 0.000906 }, + { -0.005122, -0.001645 }, + { -0.001425, -0.001220 }, + { 0.000879, 0.005086 }, + { 0.005546, -0.002478 }, + { 0.000274, -0.008488 }, + { -0.007240, 0.002236 }, + { -0.001153, 0.003371 }, + { 0.001387, -0.000861 }, + { 0.002555, 0.009660 }, + { 0.005228, 0.015650 }, + { -0.002965, 0.004601 }, + { -0.003238, -0.008334 }, + { 0.008255, -0.013236 }, + { 0.012748, -0.008152 }, + { 0.003310, -0.001484 }, + { -0.006379, -0.005282 }, + { 0.014809, -0.004757 }, + { 0.024459, 0.004951 }, + { -0.010563, 0.002563 }, + { -0.006307, 0.007620 }, + { 0.023056, 0.021069 }, + { 0.005768, -0.003988 }, + { 0.004652, -0.022112 }, + { 0.022578, 0.012214 }, + { 0.006285, 0.016768 }, + { -0.005306, -0.019337 }, + { -0.010195, -0.018918 }, + { -0.013891, 0.001320 }, + { 0.003682, 0.010687 }, + { -0.002261, 0.020757 }, + { -0.017446, 0.013213 }, + { -0.001003, 0.003622 }, + { -0.002694, 0.023687 }, + { -0.009259, 0.023362 }, + { 0.010597, -0.011505 }, + { -0.005267, -0.011110 }, + { -0.032181, 0.013672 }, + { -0.005798, 0.017034 }, + { 0.007597, 0.025547 }, + { -0.020856, 0.021082 }, + { -0.025518, -0.015856 }, + { -0.003995, -0.018148 }, + { 0.010917, 0.011353 }, + { 0.003037, 0.024016 }, + { -0.022770, 0.019841 }, + { -0.022152, -0.015439 }, + { -0.005757, -0.033731 }, + { -0.013195, -0.004604 }, + { -0.018309, -0.020352 }, + { -0.008502, -0.031760 }, + { 0.012398, 0.030284 }, + { 0.020633, 0.026712 }, + { -0.017755, -0.016943 }, + { -0.028090, 0.020075 }, + { -0.005633, 0.020536 }, + { -0.032121, -0.019869 }, + { -0.024835, 0.017166 }, + { 0.018820, 0.035640 }, + { -0.002534, -0.007076 }, + { -0.013283, -0.017907 }, + { -0.000778, -0.014904 }, + { -0.007324, -0.014618 }, + { 0.020738, 0.003841 }, + { 0.033026, 0.012423 }, + { 0.024833, 0.009229 }, + { 0.034945, -0.002718 }, + { -0.007395, -0.009887 }, + { -0.026702, 0.015678 }, + { 0.014076, 0.016733 }, + { 0.000170, -0.021906 }, + { -0.001504, -0.024413 }, + { 0.029311, -0.011617 }, + { 0.012101, -0.023184 }, + { 0.003776, -0.018430 }, + { -0.009776, -0.001559 }, + { -0.039190, -0.005313 }, + { -0.020176, -0.013161 }, + { -0.010572, -0.001836 }, + { -0.014975, 0.020681 }, + { -0.001461, 0.029378 }, + { -0.007178, 0.021768 }, + { 0.002825, 0.012295 }, + { 0.006067, 0.001602 }, + { -0.025476, -0.013909 }, + { -0.017125, -0.020780 }, + { -0.008321, 0.002492 }, + { -0.019428, 0.017506 }, + { 0.005162, -0.018370 }, + { 0.004302, -0.034674 }, + { -0.012657, -0.002236 }, + { 0.012377, 0.012240 }, + { 0.012836, 0.011026 }, + { -0.009750, -0.005620 }, + { -0.004957, -0.033233 }, + { -0.007025, -0.002505 }, + { -0.019967, 0.027180 }, + { -0.009511, -0.007235 }, + { 0.013667, -0.010382 }, + { 0.016713, 0.014534 }, + { 0.005752, 0.006639 }, + { 0.008014, 0.005102 }, + { 0.009160, 0.005906 }, + { 0.002386, -0.001795 }, + { 0.009659, 0.009164 }, + { 0.014294, 0.014273 }, + { -0.002372, 0.006890 }, + { -0.012761, 0.003139 }, + { 0.001956, -0.004818 }, + { 0.011098, -0.006207 }, + { -0.002916, -0.000879 }, + { -0.006162, -0.000009 }, + { 0.002629, 0.003589 }, + { -0.000650, 0.004330 }, + { -0.001406, -0.001434 }, + { 0.001312, -0.003982 }, + { 0.001965, -0.000068 }, + { 0.008152, 0.004457 }, + { 0.005086, -0.000233 }, + { -0.001402, -0.004059 }, + { 0.002955, 0.001285 }, + { 0.003561, 0.001225 }, + { 0.000243, -0.001333 }, + { -0.000474, 0.000994 }, + { 0.000000, 0.000977 }, + { 0.000217, -0.000086 }, + { -0.001320, -0.000637 }, + { 0.000790, 0.000527 }, + { 0.000165, 0.003220 }, + { -0.000562, 0.000548 }, + { 0.004915, -0.001509 }, + { 0.000278, 0.000676 }, + { -0.000884, -0.000790 }, + { 0.002167, -0.002528 }, + { -0.007957, -0.001588 }, + { 0.001172, -0.003230 }, + { 0.013821, -0.005272 }, + { 0.004322, -0.000804 }, + { 0.005926, 0.007392 }, + { -0.005442, 0.006735 }, + { -0.024026, -0.006890 }, + { -0.006129, -0.017808 }, + { 0.000443, -0.006632 }, + { -0.010369, 0.014073 }, + { -0.001949, 0.016085 }, + { 0.013406, 0.009360 }, + { 0.021361, 0.008629 }, + { -0.004657, 0.005423 }, + { -0.020816, 0.002568 }, + { 0.008157, -0.000444 }, + { -0.003399, -0.001525 }, + { -0.016192, 0.001829 }, + { 0.019195, -0.010984 }, + { 0.002103, -0.024722 }, + { -0.020692, -0.016882 }, + { 0.010425, -0.000480 }, + { 0.009500, 0.018437 }, + { -0.011697, 0.004622 }, + { -0.018411, -0.022480 }, + { -0.021039, 0.014881 }, + { -0.012670, 0.043883 }, + { -0.009667, 0.010503 }, + { 0.015823, -0.000928 }, + { 0.039509, 0.003209 }, + { 0.001853, 0.008583 }, + { -0.005091, 0.024942 }, + { 0.023983, 0.009705 }, + { 0.004732, 0.014515 }, + { 0.003024, 0.034056 }, + { 0.016751, -0.001747 }, + { -0.016475, -0.004832 }, + { -0.023293, 0.019914 }, + { 0.013454, -0.001629 }, + { 0.010298, -0.006150 }, + { -0.025763, -0.014330 }, + { -0.019023, -0.030015 }, + { 0.004001, 0.002865 }, + { -0.020232, -0.001552 }, + { -0.023575, -0.025451 }, + { 0.015230, 0.001759 }, + { 0.027219, 0.004919 }, + { 0.032947, -0.001516 }, + { 0.014308, -0.002181 }, + { -0.024478, -0.025679 }, + { 0.010679, -0.006019 }, + { 0.040007, 0.011013 }, + { 0.005024, -0.001024 }, + { 0.002190, 0.037397 }, + { 0.011719, 0.036133 }, + { 0.015434, -0.007535 }, + { 0.030783, 0.014593 }, + { 0.015158, 0.003140 }, + { 0.009366, -0.034051 }, + { 0.014155, 0.009298 }, + { -0.015304, 0.023012 }, + { -0.023571, -0.009061 }, + { -0.012924, 0.007609 }, + { 0.002988, 0.010866 }, + { 0.027915, -0.013789 }, + { 0.001030, -0.004085 }, + { -0.023864, 0.009521 }, + { -0.002348, -0.002146 }, + { -0.000308, -0.023187 }, + { 0.014209, -0.029234 }, + { 0.031608, -0.001291 }, + { 0.005841, 0.024585 }, + { 0.003727, 0.013508 }, + { 0.009885, -0.008943 }, + { -0.014007, -0.015973 }, + { -0.025838, -0.005925 }, + { -0.021693, 0.003972 }, + { 0.003065, -0.006448 }, + { 0.012731, -0.020894 }, + { -0.016770, -0.014891 }, + { -0.007156, 0.001223 }, + { 0.010741, 0.008194 }, + { -0.009331, 0.006464 }, + { 0.000305, 0.010097 }, + { 0.008853, 0.013666 }, + { -0.011514, -0.003069 }, + { -0.007303, -0.018624 }, + { 0.008245, -0.007303 }, + { 0.017759, 0.000686 }, + { 0.007406, -0.009839 }, + { -0.012071, -0.014803 }, + { 0.006543, -0.009315 }, + { 0.006376, 0.002688 }, + { -0.018794, 0.009629 }, + { 0.001835, -0.001213 }, + { 0.003850, -0.004640 }, + { -0.017141, 0.003277 }, + { 0.005733, -0.003667 }, + { 0.008378, -0.003084 }, + { -0.010201, 0.013107 }, + { 0.002127, 0.008599 }, + { 0.000689, -0.003801 }, + { -0.008184, -0.001598 }, + { 0.002609, -0.000586 }, + { 0.001290, 0.001989 }, + { -0.005594, 0.008405 }, + { -0.001332, 0.006820 }, + { 0.004537, 0.005790 }, + { 0.006590, 0.005427 }, + { 0.000735, 0.000165 }, + { -0.004164, 0.001498 }, + { -0.001980, 0.005514 }, + { 0.000537, 0.003041 }, + { 0.001512, 0.001281 }, + { -0.000144, 0.001630 }, + { -0.000475, 0.000275 }, + { 0.000841, -0.001134 }, + { -0.000489, -0.000120 }, + { 0.000000, 0.000977 }, + { 0.001028, 0.000082 }, + { 0.001264, 0.001564 }, + { 0.001506, 0.001025 }, + { -0.000316, -0.002546 }, + { 0.000186, 0.001937 }, + { -0.002118, 0.003977 }, + { -0.005844, -0.003108 }, + { -0.000776, -0.003920 }, + { 0.000901, -0.001607 }, + { 0.000874, -0.001605 }, + { 0.005825, -0.001221 }, + { 0.001488, -0.000269 }, + { 0.000220, 0.006183 }, + { 0.010050, 0.003299 }, + { 0.009082, -0.010936 }, + { 0.000180, -0.010255 }, + { 0.001476, -0.001503 }, + { 0.006774, 0.005643 }, + { -0.004232, 0.007422 }, + { -0.013460, -0.006035 }, + { 0.002786, -0.002611 }, + { 0.004701, 0.013053 }, + { -0.007940, -0.000124 }, + { 0.001953, -0.012780 }, + { -0.000923, -0.009081 }, + { -0.011826, -0.004110 }, + { 0.003787, 0.007974 }, + { 0.005968, 0.007296 }, + { -0.007380, -0.001261 }, + { -0.010559, -0.005036 }, + { -0.012620, -0.020314 }, + { -0.006552, -0.015752 }, + { 0.003665, 0.003717 }, + { 0.005858, 0.000711 }, + { -0.008639, 0.003581 }, + { -0.020427, 0.006414 }, + { 0.012147, 0.001146 }, + { 0.022825, 0.010773 }, + { -0.009726, 0.007429 }, + { -0.000124, 0.003763 }, + { -0.008265, 0.015232 }, + { -0.030898, 0.010163 }, + { 0.019643, 0.013811 }, + { 0.016128, 0.020157 }, + { -0.037886, 0.010999 }, + { -0.013089, 0.018939 }, + { -0.008512, 0.012014 }, + { -0.025115, -0.007488 }, + { 0.000984, -0.005828 }, + { -0.021295, -0.014528 }, + { -0.041982, 0.002038 }, + { -0.006156, 0.036596 }, + { 0.009428, 0.020000 }, + { 0.021190, 0.011133 }, + { 0.020459, 0.020228 }, + { -0.013440, 0.012803 }, + { -0.013016, 0.031042 }, + { 0.002212, 0.027958 }, + { -0.007224, -0.003733 }, + { -0.005810, 0.005492 }, + { 0.014462, -0.004521 }, + { 0.022493, -0.032290 }, + { -0.001768, 0.000776 }, + { -0.024407, 0.024467 }, + { -0.028841, -0.013674 }, + { -0.029439, -0.033175 }, + { -0.001098, 0.005602 }, + { 0.018448, 0.030265 }, + { 0.009433, -0.002553 }, + { 0.030587, -0.016833 }, + { 0.023752, 0.019836 }, + { -0.015484, 0.039657 }, + { 0.003639, 0.016557 }, + { 0.006781, -0.010216 }, + { -0.024508, -0.001112 }, + { -0.003979, 0.002500 }, + { 0.002970, -0.033830 }, + { -0.033879, -0.024430 }, + { -0.032386, 0.026055 }, + { -0.003008, 0.027510 }, + { -0.007896, 0.006101 }, + { -0.021446, -0.012050 }, + { 0.010509, -0.011233 }, + { 0.020803, 0.020171 }, + { -0.022061, 0.005068 }, + { -0.009991, -0.024846 }, + { 0.020231, 0.000955 }, + { -0.005058, 0.008852 }, + { -0.001397, 0.000430 }, + { 0.012035, 0.010536 }, + { -0.010127, -0.006135 }, + { -0.001040, -0.017881 }, + { 0.015913, -0.000812 }, + { 0.010684, 0.015161 }, + { 0.014831, 0.030064 }, + { 0.009761, 0.016772 }, + { -0.001934, -0.011521 }, + { 0.001215, -0.008056 }, + { 0.010591, -0.000571 }, + { 0.011408, -0.003350 }, + { -0.005331, -0.005327 }, + { -0.007114, -0.007931 }, + { 0.006128, 0.000492 }, + { 0.003695, 0.003335 }, + { 0.013781, -0.005521 }, + { 0.017285, -0.006168 }, + { -0.007621, -0.007050 }, + { -0.000986, -0.003986 }, + { 0.015048, 0.001590 }, + { 0.000593, -0.004879 }, + { 0.002305, -0.004116 }, + { 0.012267, 0.002044 }, + { 0.003411, 0.003357 }, + { 0.001952, 0.007677 }, + { 0.006975, 0.000166 }, + { 0.002444, -0.007745 }, + { -0.004852, 0.000066 }, + { -0.006073, -0.001744 }, + { -0.000834, -0.006918 }, + { 0.003613, -0.001945 }, + { 0.003565, -0.002403 }, + { 0.001143, -0.002699 }, + { 0.000091, 0.001034 }, + { 0.000829, 0.000527 }, + { 0.000213, 0.000595 }, + { -0.000055, 0.001081 }, + { -0.000054, 0.000493 }, + { 0.000000, 0.000977 }, + { 0.000008, 0.000019 }, + { -0.001592, -0.000399 }, + { 0.000810, 0.002311 }, + { 0.002169, 0.003950 }, + { 0.000661, 0.000504 }, + { 0.005079, -0.002338 }, + { 0.002599, 0.001224 }, + { -0.003163, 0.004421 }, + { 0.000972, 0.003736 }, + { 0.000195, 0.001306 }, + { 0.000247, -0.001444 }, + { 0.004503, -0.001876 }, + { 0.000603, -0.003486 }, + { -0.002470, -0.000146 }, + { -0.007788, 0.010793 }, + { -0.010663, 0.007467 }, + { -0.006552, -0.004751 }, + { -0.009769, -0.002308 }, + { 0.001171, 0.007740 }, + { 0.013007, 0.010122 }, + { 0.001468, -0.003562 }, + { 0.006400, -0.011922 }, + { 0.009594, 0.004822 }, + { -0.001082, 0.007999 }, + { 0.010255, -0.002794 }, + { 0.002293, 0.004934 }, + { -0.012046, -0.000434 }, + { 0.007105, -0.015404 }, + { 0.001361, -0.007492 }, + { -0.009516, 0.001851 }, + { 0.013594, 0.013796 }, + { 0.014795, 0.020662 }, + { -0.009164, 0.002645 }, + { -0.014296, 0.001535 }, + { 0.010627, 0.014052 }, + { 0.023213, 0.007249 }, + { 0.001015, -0.002020 }, + { 0.005120, -0.017412 }, + { 0.020586, -0.013935 }, + { 0.010269, 0.019587 }, + { 0.018308, 0.007974 }, + { 0.014775, -0.014742 }, + { -0.003139, 0.013631 }, + { 0.006047, 0.010525 }, + { -0.010231, -0.015041 }, + { -0.024436, 0.011746 }, + { 0.008348, 0.020079 }, + { 0.021367, -0.007183 }, + { -0.001390, 0.003235 }, + { -0.028786, 0.008563 }, + { -0.015459, -0.019049 }, + { 0.014573, -0.008592 }, + { -0.021222, 0.015038 }, + { -0.029263, -0.007126 }, + { 0.022777, -0.021360 }, + { 0.021416, -0.009663 }, + { 0.014654, -0.013873 }, + { 0.006613, -0.010653 }, + { -0.026481, 0.002231 }, + { 0.006011, -0.009161 }, + { 0.029397, -0.017653 }, + { 0.015164, -0.000095 }, + { 0.041614, 0.016788 }, + { 0.023438, 0.004213 }, + { -0.007212, -0.016704 }, + { 0.013969, -0.009320 }, + { -0.003656, -0.014943 }, + { -0.014310, -0.025972 }, + { 0.003444, 0.015420 }, + { -0.012859, 0.026559 }, + { -0.013669, -0.002545 }, + { -0.003567, 0.009503 }, + { 0.002249, -0.014261 }, + { 0.006908, -0.041366 }, + { -0.022349, 0.016399 }, + { -0.017988, 0.016758 }, + { 0.001343, -0.035471 }, + { -0.027498, -0.024544 }, + { -0.007017, -0.025018 }, + { 0.032554, -0.020078 }, + { 0.014466, 0.016308 }, + { 0.005113, -0.010293 }, + { -0.008855, -0.033538 }, + { -0.037103, 0.001432 }, + { -0.035419, 0.018891 }, + { -0.021407, 0.013994 }, + { -0.001044, -0.009238 }, + { -0.001343, -0.026520 }, + { -0.019036, -0.004131 }, + { -0.001906, 0.001789 }, + { 0.008071, -0.004995 }, + { 0.004987, 0.008674 }, + { 0.026167, 0.012529 }, + { 0.022691, 0.017219 }, + { -0.007605, 0.013094 }, + { -0.011966, -0.017221 }, + { 0.018635, -0.025998 }, + { 0.032308, -0.015787 }, + { -0.011985, -0.012568 }, + { -0.029287, -0.008068 }, + { 0.004321, 0.002858 }, + { -0.003961, 0.025159 }, + { -0.022339, 0.021010 }, + { -0.008485, -0.010597 }, + { -0.000389, -0.003762 }, + { 0.003986, 0.004652 }, + { -0.002170, -0.015216 }, + { -0.004032, 0.000455 }, + { 0.015845, 0.013080 }, + { 0.009893, -0.017774 }, + { -0.004818, -0.018237 }, + { 0.002675, 0.007831 }, + { 0.005991, 0.005832 }, + { 0.010466, 0.001162 }, + { 0.006584, 0.006458 }, + { -0.007592, 0.000864 }, + { -0.000683, -0.002811 }, + { 0.004360, 0.001268 }, + { -0.002875, 0.000168 }, + { -0.002242, 0.000941 }, + { -0.001921, 0.004548 }, + { 0.001278, 0.001810 }, + { 0.004424, 0.000551 }, + { -0.000895, 0.003183 }, + { -0.001263, 0.002645 }, + { -0.000242, 0.000532 }, + { -0.001754, 0.000122 }, + { 0.000000, 0.000977 }, + { -0.000131, -0.000134 }, + { -0.000691, -0.000068 }, + { 0.000277, 0.002110 }, + { 0.000142, 0.001097 }, + { 0.000577, 0.003484 }, + { 0.002006, 0.002579 }, + { 0.000357, -0.003168 }, + { -0.003452, 0.004074 }, + { 0.001495, -0.000255 }, + { 0.004325, -0.011109 }, + { -0.004030, 0.007583 }, + { -0.001086, 0.005646 }, + { 0.000124, -0.017410 }, + { -0.012959, -0.005939 }, + { -0.006583, -0.003828 }, + { 0.007702, -0.012137 }, + { 0.000659, 0.000836 }, + { -0.009493, -0.009181 }, + { -0.010542, -0.014743 }, + { -0.013670, 0.007169 }, + { -0.019634, 0.005625 }, + { -0.007500, 0.000923 }, + { 0.012329, -0.001816 }, + { 0.009186, -0.017988 }, + { 0.001983, -0.008486 }, + { -0.005042, 0.001741 }, + { -0.007469, -0.006863 }, + { 0.021769, 0.000844 }, + { 0.030277, 0.007410 }, + { 0.007455, 0.016175 }, + { 0.004937, 0.027899 }, + { 0.002805, -0.002081 }, + { 0.018130, -0.027230 }, + { 0.033101, -0.008553 }, + { -0.012114, -0.007717 }, + { -0.021408, -0.014775 }, + { 0.012807, 0.014629 }, + { -0.010751, 0.030829 }, + { -0.028586, 0.012869 }, + { -0.006454, 0.006485 }, + { 0.010994, 0.002397 }, + { 0.015305, -0.014036 }, + { -0.010663, -0.004060 }, + { -0.016522, 0.017088 }, + { 0.003625, -0.000907 }, + { -0.005063, -0.034911 }, + { 0.011291, -0.029569 }, + { 0.032685, 0.014516 }, + { 0.006303, 0.031051 }, + { -0.003804, -0.000668 }, + { -0.007120, -0.015595 }, + { -0.028645, -0.002047 }, + { -0.033217, 0.006512 }, + { -0.011120, 0.002348 }, + { 0.022806, -0.018808 }, + { 0.003579, -0.013207 }, + { -0.022852, 0.018994 }, + { 0.019961, 0.009658 }, + { 0.013364, 0.005529 }, + { -0.018343, 0.028433 }, + { 0.024586, 0.011819 }, + { 0.017091, -0.003666 }, + { -0.031322, -0.006667 }, + { -0.014977, -0.026421 }, + { 0.014009, -0.012833 }, + { 0.020702, -0.008298 }, + { -0.004173, -0.041745 }, + { -0.020050, -0.032727 }, + { 0.000566, -0.002104 }, + { -0.023880, 0.017577 }, + { -0.032994, 0.024747 }, + { 0.009721, -0.011593 }, + { -0.010990, -0.021811 }, + { -0.030811, 0.004127 }, + { -0.003355, -0.013669 }, + { -0.007931, -0.010422 }, + { -0.003158, 0.018978 }, + { 0.013080, -0.005182 }, + { -0.001544, -0.010027 }, + { -0.005097, 0.019374 }, + { 0.014894, 0.012918 }, + { 0.030135, 0.010167 }, + { 0.007422, 0.015117 }, + { -0.014231, 0.005075 }, + { 0.010608, 0.016110 }, + { 0.001829, 0.017998 }, + { -0.033808, -0.001955 }, + { -0.033533, 0.003934 }, + { -0.026678, 0.011975 }, + { 0.007271, 0.006448 }, + { 0.023020, 0.005314 }, + { -0.022657, -0.001523 }, + { -0.012166, 0.000363 }, + { 0.016516, -0.002424 }, + { -0.016419, -0.024020 }, + { -0.018641, -0.013964 }, + { -0.001541, -0.002454 }, + { -0.006418, -0.014511 }, + { -0.002243, 0.013062 }, + { -0.006621, 0.023200 }, + { 0.000920, -0.012898 }, + { 0.019398, 0.001831 }, + { 0.004988, 0.015506 }, + { -0.006955, -0.013592 }, + { -0.003550, 0.001465 }, + { -0.002021, 0.012716 }, + { 0.006421, -0.015604 }, + { 0.013246, -0.005050 }, + { 0.017108, 0.010854 }, + { 0.004912, -0.001699 }, + { -0.018822, 0.002539 }, + { -0.012629, 0.002373 }, + { 0.004980, -0.010212 }, + { 0.009450, 0.001421 }, + { 0.009518, 0.014911 }, + { 0.004814, 0.004596 }, + { 0.009312, -0.006230 }, + { 0.008309, -0.000912 }, + { -0.007072, 0.006844 }, + { -0.002242, 0.004898 }, + { 0.004781, 0.001239 }, + { -0.001684, 0.000338 }, + { 0.001517, -0.001080 }, + { 0.002000, -0.000133 }, + { -0.002744, 0.001789 }, + { -0.001318, 0.001161 }, + { -0.000661, 0.000939 }, + { 0.000000, 0.000977 }, + { 0.000198, -0.000174 }, + { 0.000210, -0.000246 }, + { -0.000873, -0.001428 }, + { -0.002854, -0.001990 }, + { 0.000641, 0.003814 }, + { -0.002655, 0.005433 }, + { -0.007127, 0.000732 }, + { -0.001325, -0.000612 }, + { -0.004675, -0.006866 }, + { -0.008029, -0.006792 }, + { -0.002217, 0.005645 }, + { -0.003615, -0.000525 }, + { -0.004817, -0.009010 }, + { -0.005496, -0.002912 }, + { -0.006793, -0.007875 }, + { 0.000821, -0.004256 }, + { 0.008231, 0.005053 }, + { 0.006339, -0.005389 }, + { -0.010943, 0.000438 }, + { -0.019681, 0.016180 }, + { -0.000996, 0.016836 }, + { -0.000032, 0.017131 }, + { -0.016238, 0.001028 }, + { -0.019275, -0.010443 }, + { -0.018841, 0.006378 }, + { 0.001785, 0.006281 }, + { 0.016135, -0.004009 }, + { 0.000055, 0.000653 }, + { 0.014019, 0.004629 }, + { 0.022646, 0.003370 }, + { -0.017539, -0.007754 }, + { -0.022248, -0.017422 }, + { 0.011370, -0.025518 }, + { 0.011442, -0.022202 }, + { -0.015321, 0.022270 }, + { -0.017697, 0.030350 }, + { 0.016590, -0.001573 }, + { 0.023604, 0.026680 }, + { -0.015194, 0.028560 }, + { -0.025803, -0.014135 }, + { 0.002073, 0.006175 }, + { 0.010709, 0.001762 }, + { -0.003317, -0.030487 }, + { 0.013864, 0.000014 }, + { 0.037533, -0.003988 }, + { -0.005996, -0.034529 }, + { -0.040959, 0.000074 }, + { -0.009259, 0.020322 }, + { 0.010800, -0.010481 }, + { 0.023982, -0.011704 }, + { 0.025410, 0.029142 }, + { -0.008179, 0.021271 }, + { 0.007805, -0.028584 }, + { 0.029425, -0.003053 }, + { -0.007169, 0.033854 }, + { -0.011235, 0.009517 }, + { 0.005044, 0.015600 }, + { 0.004934, 0.013554 }, + { 0.016560, -0.016950 }, + { 0.008813, 0.011259 }, + { -0.005040, 0.032896 }, + { -0.015576, 0.022603 }, + { -0.028774, 0.025410 }, +}; \ No newline at end of file diff --git a/decoder_modules/dab_decoder/src/main.cpp b/decoder_modules/dab_decoder/src/main.cpp new file mode 100644 index 00000000..eac947cc --- /dev/null +++ b/decoder_modules/dab_decoder/src/main.cpp @@ -0,0 +1,163 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "dab_dsp.h" +#include + +#define CONCAT(a, b) ((std::string(a) + b).c_str()) + +SDRPP_MOD_INFO{ + /* Name: */ "dab_decoder", + /* Description: */ "DAB/DAB+ Decoder for SDR++", + /* Author: */ "Ryzerth", + /* Version: */ 0, 1, 0, + /* Max instances */ -1 +}; + +ConfigManager config; + +#define INPUT_SAMPLE_RATE 2.048e6 +#define VFO_BANDWIDTH 1.6e6 + +class M17DecoderModule : public ModuleManager::Instance { +public: + M17DecoderModule(std::string name) { + this->name = name; + + file = std::ofstream("sync4.f32", std::ios::out | std::ios::binary); + + // Load config + config.acquire(); + + config.release(true); + + // Initialize VFO + vfo = sigpath::vfoManager.createVFO(name, ImGui::WaterfallVFO::REF_CENTER, 0, VFO_BANDWIDTH, INPUT_SAMPLE_RATE, VFO_BANDWIDTH, VFO_BANDWIDTH, true); + vfo->setSnapInterval(250); + + // Initialize DSP here + csync.init(vfo->output, 1e-3, 246e-6, INPUT_SAMPLE_RATE); + ffsync.init(&csync.out); + ns.init(&ffsync.out, handler, this); + + // Start DSO Here + csync.start(); + ffsync.start(); + ns.start(); + + gui::menu.registerEntry(name, menuHandler, this, this); + } + + ~M17DecoderModule() { + gui::menu.removeEntry(name); + // Stop DSP Here + if (enabled) { + csync.stop(); + ffsync.stop(); + ns.stop(); + sigpath::vfoManager.deleteVFO(vfo); + } + + sigpath::sinkManager.unregisterStream(name); + } + + void postInit() {} + + void enable() { + double bw = gui::waterfall.getBandwidth(); + vfo = sigpath::vfoManager.createVFO(name, ImGui::WaterfallVFO::REF_CENTER, std::clamp(0, -bw / 2.0, bw / 2.0), VFO_BANDWIDTH, INPUT_SAMPLE_RATE, VFO_BANDWIDTH, VFO_BANDWIDTH, true); + vfo->setSnapInterval(250); + + // Set Input of demod here + csync.setInput(vfo->output); + + // Start DSP here + csync.start(); + ffsync.start(); + ns.start(); + + enabled = true; + } + + void disable() { + // Stop DSP here + csync.stop(); + ffsync.stop(); + ns.stop(); + + sigpath::vfoManager.deleteVFO(vfo); + enabled = false; + } + + bool isEnabled() { + return enabled; + } + +private: + static void menuHandler(void* ctx) { + M17DecoderModule* _this = (M17DecoderModule*)ctx; + + float menuWidth = ImGui::GetContentRegionAvail().x; + + if (!_this->enabled) { style::beginDisabled(); } + + _this->constDiagram.draw(); + + if (!_this->enabled) { style::endDisabled(); } + } + + std::ofstream file; + + static void handler(dsp::complex_t* data, int count, void* ctx) { + M17DecoderModule* _this = (M17DecoderModule*)ctx; + //_this->file.write((char*)data, count * sizeof(dsp::complex_t)); + + dsp::complex_t* buf = _this->constDiagram.acquireBuffer(); + memcpy(buf, data, 1024 * sizeof(dsp::complex_t)); + _this->constDiagram.releaseBuffer(); + } + + std::string name; + bool enabled = true; + + dab::CyclicSync csync; + dab::FrameFreqSync ffsync; + dsp::sink::Handler ns; + + ImGui::ConstellationDiagram constDiagram; + + // DSP Chain + VFOManager::VFO* vfo; +}; + +MOD_EXPORT void _INIT_() { + // Create default recording directory + json def = json({}); + config.setPath(core::args["root"].s() + "/dab_decoder_config.json"); + config.load(def); + config.enableAutoSave(); +} + +MOD_EXPORT ModuleManager::Instance* _CREATE_INSTANCE_(std::string name) { + return new M17DecoderModule(name); +} + +MOD_EXPORT void _DELETE_INSTANCE_(void* instance) { + delete (M17DecoderModule*)instance; +} + +MOD_EXPORT void _END_() { + config.disableAutoSave(); + config.save(); +} diff --git a/decoder_modules/dab_decoder/src/optimized_algo.txt b/decoder_modules/dab_decoder/src/optimized_algo.txt new file mode 100644 index 00000000..ec940337 --- /dev/null +++ b/decoder_modules/dab_decoder/src/optimized_algo.txt @@ -0,0 +1,34 @@ +0123456789 +--- --- + +0*4 +1*5 +2*6 + +1*5 +2*6 = L + 3*7 - 0*4 +3*7 + +2*6 +3*7 = L + 4*8 - 1*5 +4*8 + +3*7 +4*8 = L + 5*9 - 2*6 +5*9 + + + +0*5 +1*6 +2*7 + +1*6 +2*7 +3*8 + +2*7 +3*8 +4*9 + +=> Use same technique to cache the interpolation results \ No newline at end of file diff --git a/readme.md b/readme.md index 21498d43..b4b2926a 100644 --- a/readme.md +++ b/readme.md @@ -358,6 +358,7 @@ Modules in beta are still included in releases for the most part but not enabled | Name | Stage | Dependencies | Option | Built by default| Built in Release | Enabled in SDR++ by default | |---------------------|------------|--------------|-------------------------------|:---------------:|:----------------:|:---------------------------:| | atv_decoder | Unfinished | - | OPT_BUILD_ATV_DECODER | ⛔ | ⛔ | ⛔ | +| dab_decoder | Unfinished | - | OPT_BUILD_DAB_DECODER | ⛔ | ⛔ | ⛔ | | falcon9_decoder | Unfinished | ffplay | OPT_BUILD_FALCON9_DECODER | ⛔ | ⛔ | ⛔ | | kgsstv_decoder | Unfinished | - | OPT_BUILD_KGSSTV_DECODER | ⛔ | ⛔ | ⛔ | | m17_decoder | Working | - | OPT_BUILD_M17_DECODER | ⛔ | ✅ | ⛔ |