Перейти к содержанию
    

Zalman_

Участник
  • Постов

    51
  • Зарегистрирован

  • Посещение

Сообщения, опубликованные Zalman_


  1. Сейчас активно изучаю тему декодирования DVB-S2 сигналов и столкнулся с задачей перестановки бит в проверочной части поступаемого фрейма.

    Известно, что это делается до декодера и известно, что это необходимо из-за особенностей кодера DVB-S2.

    Информации по этому нашел не много, лишь мнения разных людей, которые с этой темой связаны.

    Можете ли "тыкнуть" где и что на эту тему можно почитать? Какие варианты реализаций известны или популярны.

    Интересно как реализуется подобный "перестановщик" + не хочется изобретать велосипед.

    Заранее спасибо!

  2. В 10.05.2023 в 09:00, des00 сказал:

    ИМХО для плис и нет других подходящих алгоритмов, либо двухпроходное либо послойное декодирование с использованием алгоритма min-sum с разными видами нормализации и аппроксимации гиперболического тангенса.

    В описании там указано:

    схема есть, но у меня) но в целом, не вижу особых проблем вам ее восстановить, заодно подтянете навыки реверс инженеринга. Начните с топа, там 4 основных модуля + память, в самом ядре еще 6 модулей. Сходство там есть, просто его не видно сразу.

    Здесь каждый делает как хочет и как удобно под конкретную архитектуру, которая зависит от организации памяти нодов/метрик, матричного умножителя, требований к производительности. Но по сути все сводится к одному: храним в ROM памяти либо базовые матрицы (как в wimax), либо полные матрицы (как в dvb), нативный или упакованный формат тут уже от архитектуры зависит.

    информации много, папка документации по кодированию у меня занимает порядка 1.2ГБ, из них LDPC порядка 300МБ. Но по сути все в статьях пишут одно и тоже. Проще всего взять матлаб/питон и написать свой LDPC декодер для какого нить Wimax. Он тоже QC-LDPC, но меньшего размера чем DVB и его проще отлаживать. У него не такая разряженная матрица и на нем можно попробовать 2-4 архитектуры декодера под разную организацию памяти.

    Выложенный DVB относиться к декодерам с широким словом (360 метрик за такт), для достижения высокой производительности. Структура памяти там в упакованном формате с перестановками, для минимизации ресурса. Он прилично весит, но и дает 250/500Мб/с при частоте ядра 250МГц, для 50/25 итераций, при этом производительность можно масштабировать в 2/4/8 раз при работе по одному блоку (для некоторых применений это важно).

    Спасибо за ответ!


    Есть небольшой вопрос по поводу работы Вашего проекта в QuestaSim 10.2c. 
    Установил рекомендованную Вами версию и все работает как часы, спасибо. 

    Есть некоторый нюанс, который я не смог найти в сети. 
    Суть нюанса:
    1) В качестве примера возьмем первый модуль (ldpc_dvb_dec_source). 
    2) После успешной компиляции Questa переходит в этап симуляции, на котором открывается окно sim. В этом окне перечислены инстансы компонентов и если щелкнуть на какой-либо из них, то в другом окне (Objects) появится список всех переменных (reg, wire и т.д.). Подобное я замечал ранее при работе с ModelSim (работал именно с ней). Проще говоря, щелкнув на нужный инстанс я мог посмотреть работу любой объявленной переменной и таким образом отладить работу какого-то внутреннего процесса. 
    3) У Вас в проекте такая возможность отсутствует. Я вижу только input/output сигналы, но нет ничего, что находится внутри.
    4) Заранее скажу, что если в окне Objects кликнуть ПКМ и перейти в пункт Show, то у меня все включено. Соответственно, сам я ничего не ограничивал. 

    Собственно вопрос. Это особенность работы QuestaSim и SystemVerilog или дело в моем малом опыте?


    UPD: проблема решена. Дело было в функции vopt, которая по дефолту оптимизировала проект, из-за чего отображались лишь входные и выходные порты

  3. 1 минуту назад, des00 сказал:

    аа, это параноидальность 10.4 квесты, там, спустя кучу лет, накрутили проверок на уникальность доступа в случае always_ff + изменили по умолчанию режим компиляции файлов на mfcu. Поэтому я до сих пор на 10.2с, возьмите ее. Так проще чем вот удаленно все это править. Как нить займусь правками под 10.4 но не сейчас

     

    Понял, спасибо

    Есть несколько вопросов по поводу Вашего декодера. 

    Никогда в жизни не писал декодеры и сейчас только вникаю в эту тему, поэтому есть вопрос на основе того, что посмотрел в различных работах (имеющих разную дату опубликования) на эту тему (статьи, диссертации, IP ядра различных компаний). Очень часто вижу параллельную или layered структуру декодеров. Предполагаю, что эти структуры обоснованы "параллелизмом" ПЛИС и поэтому чаще всего применяются.
    А какую структуру имеет Ваш декодер ? Есть ли его функциональная схема ? Я видел схожие черты Вашего декодера с другими структурами, но не смог установить явного сходства.

    Также на основе просмотра статей (отчасти беглого) я увидел, что mapping памяти для хранения проверочной матрицы H у всех различных и нет какого-то единого формата. Возможно, я ошибаюсь. 
    Так как Ваш проект можно попробовать в работе в целях изучения, то есть ли какие-то статьи/диссертации/любая другая информация на основе которой Вы писали свой декодер и "размечали" память? 
    Я столкнулся с тем, что есть разные архитектуры и разные методы разметки памяти, поэтому не знаю с чего можно было бы начать (ввиду малого опыта).

     

  4. 5 часов назад, des00 сказал:

    а вы точно забрали весь проект? Потому что эти файлы лежат в папке rtl/buffer, общие для всех кодов, а их комплияция указана в строке 11 этого скрипта

    Да, проект я взял весь (do/include/rtl/testbench). 
    Ошибочный файл "codec_buffer_nD_alogic" находится по пути rtl/buffer. 

    Заранее скажу, что с QuestaSim я мало работал, поэтому возможно, я делаю что-то не так.
    Проект пытаюсь запустить таким образом:
    1) File -> Change Directory (выбираю FEC-main/do)
    2) В консоли ввожу do do_ldpc_dvb.do
    3) Получаю следующий лог.

    Лог QuestaSim выглядит так.

    Спойлер

    do do_ldpc_dvb.do
    # ../include
    # ../rtl
    # ../testbench
    # ../work
    # QuestaSim-64 vlog 10.4c Compiler 2015.07 Jul 20 2015
    # Start time: 08:00:37 on May 10,2023
    # vlog -reportprogress 300 -work ../work -incr -sv "+incdir+../include+../rtl" ../rtl/codec_pulse_synchronizer.sv ../rtl/codec_reset_synchronizer.sv 
    # -- Compiling module codec_pulse_synchronizer
    # -- Compiling module codec_reset_synchronizer

    # Top level modules:
    #     codec_pulse_synchronizer
    #     codec_reset_synchronizer
    # End time: 08:00:37 on May 10,2023, Elapsed time: 0:00:00
    # Errors: 0, Warnings: 0
    # QuestaSim-64 vlog 10.4c Compiler 2015.07 Jul 20 2015
    # Start time: 08:00:37 on May 10,2023
    # vlog -reportprogress 300 -work ../work -incr -sv "+incdir+../include+../rtl" ../rtl/buffer/codec_abuffer.sv ../rtl/buffer/codec_abuffer_dwc.sv ../rtl/buffer/codec_buffer.sv ../rtl/buffer/codec_buffer_dwc.sv ../rtl/buffer/codec_buffer_nD_alogic.sv ../rtl/buffer/codec_buffer_nD_slogic.sv ../rtl/buffer/codec_map_dec_extr_ram.sv ../rtl/buffer/codec_map_dec_input_ram.sv ../rtl/buffer/codec_map_dec_mm.sv ../rtl/buffer/codec_map_dec_output_ram.sv ../rtl/buffer/codec_mem_ablock.sv ../rtl/buffer/codec_mem_block.sv ../rtl/buffer/codec_mem_dwc_ablock.sv ../rtl/buffer/codec_mem_dwc_block.sv 
    # -- Compiling module codec_abuffer
    # -- Compiling module codec_abuffer_dwc
    # -- Compiling module codec_buffer
    # -- Compiling module codec_buffer_dwc
    # -- Compiling module codec_buffer_nD_alogic
    # ** Error (suppressible): (vlog-7061) ../rtl/buffer/codec_buffer_nD_alogic.sv(170): Variable 'b_w_is_busy' driven in an always_ff block, may not be driven by any other process. See ../rtl/buffer/codec_buffer_nD_alogic.sv(157).
    # ** Error (suppressible): (vlog-7061) ../rtl/buffer/codec_buffer_nD_alogic.sv(171): Variable 'b_wused' driven in an always_ff block, may not be driven by any other process. See ../rtl/buffer/codec_buffer_nD_alogic.sv(158).
    # ** Error (suppressible): (vlog-7061) ../rtl/buffer/codec_buffer_nD_alogic.sv(176): Variable 'b_w_is_busy' driven in an always_ff block, may not be driven by any other process. See ../rtl/buffer/codec_buffer_nD_alogic.sv(157).
    # ** Error (suppressible): (vlog-7061) ../rtl/buffer/codec_buffer_nD_alogic.sv(179): Variable 'b_w_is_busy' driven in an always_ff block, may not be driven by any other process. See ../rtl/buffer/codec_buffer_nD_alogic.sv(157).
    # ** Error (suppressible): (vlog-7061) ../rtl/buffer/codec_buffer_nD_alogic.sv(184): Variable 'b_wused' driven in an always_ff block, may not be driven by any other process. See ../rtl/buffer/codec_buffer_nD_alogic.sv(158).
    # ** Error (suppressible): (vlog-7061) ../rtl/buffer/codec_buffer_nD_alogic.sv(203): Variable 'b_r_is_busy' driven in an always_ff block, may not be driven by any other process. See ../rtl/buffer/codec_buffer_nD_alogic.sv(160).
    # ** Error (suppressible): (vlog-7061) ../rtl/buffer/codec_buffer_nD_alogic.sv(204): Variable 'b_rused' driven in an always_ff block, may not be driven by any other process. See ../rtl/buffer/codec_buffer_nD_alogic.sv(161).
    # ** Error (suppressible): (vlog-7061) ../rtl/buffer/codec_buffer_nD_alogic.sv(209): Variable 'b_r_is_busy' driven in an always_ff block, may not be driven by any other process. See ../rtl/buffer/codec_buffer_nD_alogic.sv(160).
    # ** Error (suppressible): (vlog-7061) ../rtl/buffer/codec_buffer_nD_alogic.sv(212): Variable 'b_r_is_busy' driven in an always_ff block, may not be driven by any other process. See ../rtl/buffer/codec_buffer_nD_alogic.sv(160).
    # ** Error (suppressible): (vlog-7061) ../rtl/buffer/codec_buffer_nD_alogic.sv(217): Variable 'b_rused' driven in an always_ff block, may not be driven by any other process. See ../rtl/buffer/codec_buffer_nD_alogic.sv(161).
    # -- Compiling module codec_buffer_nD_slogic
    # ** Error (suppressible): (vlog-7061) ../rtl/buffer/codec_buffer_nD_slogic.sv(135): Variable 'b_is_busy' driven in an always_ff block, may not be driven by any other process. See ../rtl/buffer/codec_buffer_nD_slogic.sv(124).
    # ** Error (suppressible): (vlog-7061) ../rtl/buffer/codec_buffer_nD_slogic.sv(136): Variable 'b_wused' driven in an always_ff block, may not be driven by any other process. See ../rtl/buffer/codec_buffer_nD_slogic.sv(125).
    # ** Error (suppressible): (vlog-7061) ../rtl/buffer/codec_buffer_nD_slogic.sv(137): Variable 'b_rused' driven in an always_ff block, may not be driven by any other process. See ../rtl/buffer/codec_buffer_nD_slogic.sv(126).

    Дополнительно есть ошибки такого формата

    ----------------------------------------------------------------------------------------------------------------------------------
    # -- Compiling module codec_map_dec_extr_ram
    # -- Compiling module codec_map_dec_input_ram
    # -- Compiling module codec_map_dec_mm
    # -- Compiling module tb_mm
    # -- Compiling module codec_map_dec_output_ram
    # -- Compiling module codec_mem_ablock
    # -- Compiling module codec_mem_block
    # ** Error: ** while parsing file included at ../rtl/buffer/codec_mem_dwc_block.sv(75)
    # ** at ../include/define.vh(13): 'clogb2' already exists; must not be redefined as a function.
    # ** Error: ** while parsing file included at ../rtl/buffer/codec_mem_dwc_block.sv(75)
    # ** at ../include/define.vh(24): 'clog2' already exists; must not be redefined as a function.
    # ** Error: ** while parsing file included at ../rtl/buffer/codec_mem_dwc_block.sv(75)
    # ** at ../include/define.vh(35): 'max' already exists; must not be redefined as a function.
    # ** Error: ** while parsing file included at ../rtl/buffer/codec_mem_dwc_block.sv(75)
    # ** at ../include/define.vh(40): 'min' already exists; must not be redefined as a function.
    # ** Error: ** while parsing file included at ../rtl/buffer/codec_mem_dwc_block.sv(75)
    # ** at ../include/define.vh(49): 'ceil' already exists; must not be redefined as a function.
    ----------------------------------------------------------------------------------------------------------------------------------

    ----------------------------------------------------------------------------------------------------------------------------------
    # -- Compiling module ldpc_dvb_dec_2d_ctrl
    # ** Error: ** while parsing file included at ../rtl/ldpc_dvb/dec/ldpc_dvb_dec_fix.sv(143)
    # ** at ../include/define.vh(13): 'clogb2' already exists; must not be redefined as a function.
    # ** Error: ** while parsing file included at ../rtl/ldpc_dvb/dec/ldpc_dvb_dec_fix.sv(143)
    # ** at ../include/define.vh(24): 'clog2' already exists; must not be redefined as a function.
    # ** Error: ** while parsing file included at ../rtl/ldpc_dvb/dec/ldpc_dvb_dec_fix.sv(143)
    # ** at ../include/define.vh(35): 'max' already exists; must not be redefined as a function.
    # ** Error: ** while parsing file included at ../rtl/ldpc_dvb/dec/ldpc_dvb_dec_fix.sv(143)
    # ** at ../include/define.vh(40): 'min' already exists; must not be redefined as a function.
    # ** Error: ** while parsing file included at ../rtl/ldpc_dvb/dec/ldpc_dvb_dec_fix.sv(143)
    # ** at ../include/define.vh(49): 'ceil' already exists; must not be redefined as a function.
    # ** Error: ** while parsing file included at ../rtl/ldpc_dvb/dec/ldpc_dvb_dec_sink.sv(110)
    # ** at ../include/define.vh(13): 'clogb2' already exists; must not be redefined as a function.
    # ** Error: ** while parsing file included at ../rtl/ldpc_dvb/dec/ldpc_dvb_dec_sink.sv(110)
    # ** at ../include/define.vh(24): 'clog2' already exists; must not be redefined as a function.
    # ** Error: ** while parsing file included at ../rtl/ldpc_dvb/dec/ldpc_dvb_dec_sink.sv(110)
    # ** at ../include/define.vh(35): 'max' already exists; must not be redefined as a function.
    # ** Error: ** while parsing file included at ../rtl/ldpc_dvb/dec/ldpc_dvb_dec_sink.sv(110)
    # ** at ../include/define.vh(40): 'min' already exists; must not be redefined as a function.
    # ** Error: ** while parsing file included at ../rtl/ldpc_dvb/dec/ldpc_dvb_dec_sink.sv(110)
    # ** at ../include/define.vh(49): 'ceil' already exists; must not be redefined as a function.
    ----------------------------------------------------------------------------------------------------------------------------------

     

     

  5. В 29.03.2023 в 06:04, des00 сказал:

    Спасибо на добром слове.

    Перед выкладыванием проверялся синтез в вивадо 2019.2, с настройками соответствующими выложеному тестбенчу. Сам тестбенч проверялся на моделирование в менторовском симуляторе, версии 10.2с, скрипт запуска которого лежит в папке do/do_ldpc.do.

    Этих файлов там и нет, это файлы для более производительных версий кодеков, на скорости до 1Гб/с и с произвольной шириной входного интерфейса. В коде это разруливается через generate if. Реализовать их предлагается самостоятельно)

     

    Добрый день! Новичок в LDPC кодах и соответствующих декодерах. Взял Ваш проект (ldpc_dvb) для изучения. 

    Попробовал запустить симуляцию через QuestaSim 10.4c и получил следующую ошибку:
     

    # ** Note: (vsim-3812) Design is being optimized...

    # ** Error: ../rtl/ldpc_dvb/enc/ldpc_dvb_enc_ibuffer.sv(212): Module 'codec_buffer_nD_alogic' is not defined.
    # ** Error: ../rtl/buffer/codec_abuffer.sv(192): Module 'codec_buffer_nD_alogic' is not defined.
    # ** Error: ../rtl/ldpc_dvb/dec/ldpc_dvb_dec_ibuffer.sv(212): Module 'codec_buffer_nD_alogic' is not defined.
    # ** Error: ../rtl/buffer/codec_abuffer.sv(192): Module 'codec_buffer_nD_alogic' is not defined.
    # Optimization failed
    # Error loading design
    # Error: Error loading design
    #        Pausing macro execution
    # MACRO ./do_ldpc_dvb.do PAUSED at line 22

    Правильно ли я понимаю, что недостающие файлы также нужны для более производительных версий?
     

  6. 9 часов назад, des00 сказал:

    не сравнивал. но вообще нет такого понятия лучше/хуже, надо сравнивать: производительность/ресурс/ЭВК и т.д.

    зайти на гитхаб и набрать в поиске dvb-s2

    Спасибо за помощь!

  7. 6 минут назад, des00 сказал:

    Посоветовал бы написать свой декодер там работы на пару недель - месяц. Ну или по гитхабу пошарится, там этих декодеров штук несколько есть. 

    Матлабовский сильно хуже?

    А есть ссылки на репозитории с ними ? 

  8. Задача - LDPC декодер внутри FPGA. 

     

    Первый пришедший в голову вариант - декодер из MATLAB с последующей генерацией HDL.

    Источник : https://www.mathworks.com/help/wireless-hdl/ref/dvbs2ldpcdecoder.html

    При попытке сгенерировать код на основе тех параметров, которые они указывают в Algorithms -> Performance, получаю результат по блокам памяти хуже, чем у них (229 у меня, 157,5 у них).
    Настройка HDL Coder проводилась, однако результат не изменился.

    Отличия:
    - в 1 бит в шине входных данных;
    - семейство, под которое проводится генерация Kintex7 (325). 

    Из того, что нет - Hardware Support Packages. Нет, так как не пускает дальше страницы, где предлагают обновить матлаб (на данный момент версия 2022b). Не уверен, что это сильно влияет, но могу ошибаться.

    Собственно сам вопрос. В чем на ваш взгляд может быть проблема и что посоветуете в данном случае? 
    Спасибо за помощь!
     

  9. В 01.08.2022 в 15:27, petrov сказал:

    Zalman_

    причем синхрослово может начинаться с любого бита модуляционного слова.

    _

    Надеюсь синхрослово хотя бы повторяется при неправильной фазе.

    С такими короткими словами, абы как модулируемыми, надёжное обнаружение можно сделать только накоплением сигнала за много периодов вставки синхрослова, для этого потребуется память на один период.

    Да, повторяется, но при повороте фазы синхрослово будет меняться. Соответственно, нужно выявить фазу, на которую был совершен поворот и скомпенсировать этот поворот

    Про идею накопления спасибо, обдумаю

  10. В 29.07.2022 в 15:54, petrov сказал:

    Zalman_

    Данные сигналы входят в список тех сигналов, которые обрабатывает схема AHA 4540.

    _

    Какие созвездия используются?

    Все используемые созвездия модулируются одной и той же известной последовательностью 11110101000010111000 для блочной синхронизации?

    1) От BPSK до QAM-1024, включая APSK
    2) Нет, применяются разные синхропоследовательности с разной длиной цикла.

    В 29.07.2022 в 16:12, petrov сказал:

    Zalman_

    Данные сигналы входят в список тех сигналов, которые обрабатывает схема AHA 4540.

    _

    Используется нумерация точек в созвездии из даташита AHA 4540?

    Необязательно, может использоваться и другой вариант нумерации. На передающей стороне сигнал формируется так: поступает блок данных пользователя (длина цикла от 1024 до 64000 бит), на него накладывается аддитивный скремблер. Производится помехоустойчивое (ПУ) кодирование (используется Turbo Product Codes (TPC) с разной скоростью кодирования – поэтому и длины циклов разные). К закодированному блоку данных добавляется синхрокомбинация от 8 до 24 бит. Она разная и зависит от ПУ кода. Далее эти данные поступают на модулятор, причем синхрослово может начинаться с любого бита модуляционного слова. И всё это далее подается в канал связи.

    Ко мне поступает битовый поток от демодулятора. Известно - вид модуляции, длина цикла и вид синхромаркера. Неизвестно – начальная фаза захвата демодулятора. И сигнал не идеальный – с ошибками. В процессе приема могут происходить «повороты» фазы и срывы тактовой от демодулятора.

    В 31.07.2022 в 00:26, lennox сказал:

    код (32,26)(32,26)(4,3)?

    спутниковый канал, ИСЗ 'нителсат'?

     

    fcb2ce33-5a52-48e3-b420-c78416bd0464.jpg

     

    сделайте коррелятор с 'мягким входом' в синхру, т.е. задать допустимое кол-во ошибок в синхрослове и задать кол-во совпадений опоры с принятым - N раз подряд. ТОже самое на выход из синхры. типа гистерезис. работайте по знаку. 

    не уверен что это хорошая последовательность с гуд АКФ (хотя не проверял), согласованным фильтром не поймаете - короткая 

     

    спутниковый канал, ИСЗ 'нителсат'? - Да. На приложенном фото один из вариантов

    сделайте коррелятор с 'мягким входом' в синхру, т.е. задать допустимое кол-во ошибок в синхрослове и задать кол-во совпадений опоры с принятым - N раз подряд. ТОже самое на выход из синхры. типа гистерезис. работайте по знаку. - Спасибо за совет, обдумаю

  11. В 27.07.2022 в 14:38, petrov сказал:

    Zalman_

    Микросхема AHA 4540 сама осуществляет синхронизацию, зачем вы это делаете вручную?

    _

    Если это просто как образец для подражания берётся, то не стоит такое повторять, можно получше сделать, известная достаточно длинная последовательность c хорошей АКФ модулирует BPSK, обнаруживается согласованным фильтром, по ней же неоднозначность фазы устраняется.

    1. Планируется система обработки сигналов, структура которых уже давно известна и определена (отмечу, что разрабатываемая система только принимает сигнал и влиять на передающую часть я физически не могу). Данные сигналы входят в список тех сигналов, которые обрабатывает схема AHA 4540. Наиболее неприятный сигнал с точки зрения длительности периода, имеет период 16320.
    2. Делаю вручную потому, что система обработки сигналов создается на ПЛИС.
    3. Из предыдущих пунктов вытекает то, что необходимо создать либо такую же систему (по качеству работы), либо лучше.

    По итогу, не хотелось бы создавать велосипед в этой области, поэтому и прошу помощи в этом вопросе от более опытных людей.
     

  12. В 26.07.2022 в 17:32, petrov сказал:

    Zalman_

    Давайте все детали подробно, мы уже поняли что вам нужна блочная синхронизация, какая сигнализация для этого предусмотрена, как она вставляется, модулируется? Откуда это вообще взялось, кто придумал, стандарт какой?

    AHA 4540 

    Нужно сделать два выделенных блока
     

    InkedAHA4540.jpg

  13. В 25.07.2022 в 20:27, petrov сказал:

    Zalman_

    Можете сделать согласованный фильтр на сигнал +1 -1 0 0 0 0 +1 -1 0 0 0 0 +1 -1 0 0 0 0 +1 -1 ?

    Пороговое устройство, поиск максимума?

    Потом рекурсивную версию, чтобы на нули слишком много памяти не тратить?

    А чем согласованный фильтр будет отличаться от описанного мной алгоритма?
    Что в Вашем варианте, что в моем проводится анализ входного битового потока и при наличии сходства выдается флаг о том, что маркер был пойман.

    Как я понял, вы предлагаете идею, похожую на обнаружение кодов Баркера (насколько помню, там обнаружение происходит по корреляционному пику).

    Только не могу понять в чем существенное отличие от описанного мной алгоритма ?

  14. В 22.07.2022 в 15:52, des00 сказал:

    ИМХО, вас спасет только DA синхронизация на длинных последовательностях с хорошим корреляционным пиком. Длина определяется отступом 6дб от энергетики турбокода. Почитать в любой книге по связи. 

    Задача в том, что самому выбрать последовательность для синхронизации я не могу, так как необходимо настроиться на известный сигнал.
    Со своей стороны я знаю лишь маркер - 11110101000010111000.

    Синхронизатор построен по такому алгоритму, что в битовом формате среди всего поступающего потока осуществляется поиск этого маркера на протяжении нескольких циклов. Если не нахожу в предполагаемом месте, то сдвигаю на N бит и продолжаю поиск. Если нахожу маркер, то для уверенности в факте синхронизации анализирую еще 3 цикла (в сумме 4) и только после этого данные подаются на турбодекодер.

    Алгоритм работает медленно, ввиду того, что приходится последовательно анализировать несколько циклов.
    Можно ли как-то ускорить этот процесс ?

     

  15. Появилась задача по реализации синхронизатора для декодера турбокодов на ПЛИС.

    Я в этой теме новичок, пытался делать сам, но в итоге он получился не очень по качеству работы (долго входит в состояние синхронизма и плохо держит при помехах). Долго возился, в итоге решил написать сюда.

    Можете ли посоветовать учебники/статьи/сайты, где описаны варианты реализации синхронизаторов (по возможности, с учетом аппаратной платформы в виде ПЛИС)? 
    Можете поделиться какими-то наработками в коде (SV/Verilog/VHDL) по этой теме?
    Буду рад любой помощи в данном вопросе

    Заранее спасибо!)

  16. 11.03.2021 в 19:31, petrov сказал:

    Есть же CORDIC в симулинке.

    https://www.mathworks.com/help/dsp/ref/complextomagnitudeanglehdloptimized.html

    Вычисляет от любой входной разрядности типа fixdt().

    Да, спасибо, я его уже чуть позже нашел 

    Тоже хороший вариант)

  17. 29.01.2021 в 08:53, Мур сказал:

    1. Все из Матлаба.  Я только косил избыточность.. Воевал с МоделСим, у которого свои понятия о приемлемости...   atan2.vhd не является необходимым и им можно пренебречь!!!  Верно!

    2. Для разгона дизайна внесено дополнительно 11 регистров, чтобы поднять тактовую частоту.(В вашем Verilog исходнике следует сделать аналогично).  У меня этот набор с бенчем должен симулироваться без проблем.

    3. enport нужен был для обозначения момента пуска данных на вход.  Тут смело можно брать как хочется! Этот набор исходников интересен для просмотра результатов симуляции. Не более того! Можно видеть соответствие симуляции в Simulik  и в ModelSim во всем диапазоне данных.

    4. Посмотрите в RTL вьювере где стоят регистры и сделайте аналогично в версии Verilog.(Подсказка)

    Добрый день! 

    Добрался до atan2
    Возник вопрос 
    В модели, которую Вы кидали ранее, тип данных на входе atan2 - int16. С ним все работает прекрасно
    При попытке поменять его на int32, int64, fixdt выдает следующую ошибку

    "Data type mismatch. 'Input Port 1' of 'untitled/atan2' expects a signal of data type 'int16'. However, it is driven by a signal of data type 'int32'."

    Как я понял atan2 ждет данные в формате int16 и больше никакой тип данных не принимает. Это странно, так как блок Trigonometric Function принимает формат данных выше int16, что сказано в документации. 
    Встречались ли вы с данной ошибкой?
    Если да, то как удалось ее решить?



    UPD: Решение
     

    На будущее
    Есть блоки Data Type Conversion, в них обычно задается тот тип данных, который нужен на их выходе и обычно все работает и заканчивается на них, но в этой модели есть фокус
    Фокус заключается в входах и выходах подсистемы atan2, то есть если обычно (все время до этого на моей практике) входы и выходы подсистемы автоматически принимали тип данных от предыдущих блоков, то здесь тип данных на входах и выходах был четко задан, поэтому и вылезала такая ошибка.
    Следовательно, решения два:
    1) либо поставить на входах и выходах в Signal Attributes -> Data Type -> "Inherit: Auto"; - на мой взгляд самый универсальный и оптимальный вариант
    2) либо в случае жесткой необходимости "прописывать" тип данных как в Data Type Conversion, так и в входах и выходах подсистемы Atan2

  18. 1 час назад, Мур сказал:

    1. Все из Матлаба.  Я только косил избыточность.. Воевал с МоделСим, у которого свои понятия о приемлемости...   atan2.vhd не является необходимым и им можно пренебречь!!!  Верно!

    2. Для разгона дизайна внесено дополнительно 11 регистров, чтобы поднять тактовую частоту.(В вашем Verilog исходнике следует сделать аналогично).  У меня этот набор с бенчем должен симулироваться без проблем.

    3. enport нужен был для обозначения момента пуска данных на вход.  Тут смело можно брать как хочется! Этот набор исходников интересен для просмотра результатов симуляции. Не более того! Можно видеть соответствие симуляции в Simulik  и в ModelSim во всем диапазоне данных.

    4. Посмотрите в RTL вьювере где стоят регистры и сделайте аналогично в версии Verilog.(Подсказка)

    Спасибо

  19. 26.01.2021 в 13:02, Мур сказал:

    Даю с бенчем...    Критикуйте!!!   Вроде шустренко....  Извините, тут в VHDL  (((

    ATAN2.ZIP 17 kB · 7 скачиваний

    Доброго времени суток

    Добрался до того, что вы скинули

    В архиве два файла

    atan2.vhd
    Trigonometric_Function1.vhd

    1) Открыв оба файла в описании atan2.vhd написано, что "atan2 не корректен по предварительной подготовке входных данных" и лучше брать Trigonometric_Function1.vhd. Немного поковырявшись понял, что видимо генерируемый код из Simulink в файле atan2.vhd криво данные подтягивает, поэтому Вы делали свои файлы с входными данным *.dat и писали тестбенч, который все это оптимально загружает.
    Верна ли моя догадка?

    P.S.
    В самом низу писал про enport. Связано ли "atan2 не корректен по предварительной подготовке входных данных" с портом enport?
    Исходя из этого и просмотра кода, файл atan2.vhd является посредником перед основным модулем Trigonometric_Function1.vhd, который просто подготавливает данные для отправки в Trigonometric_Function1.vhd. Правильно ли я понимаю, что atan2.vhd не является необходимым и им можно пренебречь, тем самым использовать в качестве основного ядра atan2 файл Trigonometric_Function1.vhd ?

    2) Запустил параллельно модель и решил посмотреть, что сделает Simulink в плане генерации кода
    Он сгенерил такие же два файла, то есть понял откуда ноги растут

    Попытался смоделировать Ваш код
    ModelSim сначала ругался, однако, для корректной компиляции нужно было скомпилировать два файла тестбенча, а файлы atan2.vhd и Trigonometric_Function1.vhd поместить в папку, которую создает ModelSim, то есть work.
    Поместил, компиляция прошла успешно, однако, при попытке симуляции вылезла ошибка следующего вида "Error: (vsim-3173) Entity '*ATAN2/work.atan2' has no architecture."
    Как ее можно исправить? В VHDL не силен, лишь могу прочитать и то довольно примерно. 
    Почему не смоделировать код на Verilog и пользоваться? - Потому что как понял, в Вашем коде задержка составляет 3 такта, вместо 14 тактов, которые есть в коде, который создает Simulink.

    3) И есть немного вопросов по модели и коду одновременно.
    Порт enport. Какую функцию он выполняет? В модели он выполняет функцию тактирующего сигнала для задержек, а вот что делает в коде? Исходя из кода он является разрешающим и судя по коду на порт clk и enport должен приходить один и тот же тактовый сигнал, так как если enport будет тактироваться иначе, то передача данных в Trigonometric_Function1.vhd будет некорректной
    Правильно ли понимаю данный момент?

    Заранее спасибо!

  20. 2 часа назад, Мур сказал:

    Посмотрели?  Что не понравилось?...

    Пока что просто глазом пробежался
    Даже не запускал
    В ближайшее время отпишусь, как запущу

    Спасибо за помощь и предоставленные исходники кода и модели

  21.  

    3 часа назад, _pv сказал:

    не совсем верилог, но тут не принципиально, если памяти особо не жалко и не требуется очень уж большая точность, то урезать разрядность и запихать всё в таблицу вполне себе вариант:

    при округлении аргументов до 6 бит, ошибка по углу вроде уже лучше 8бит получается.

     

    
    #include <stdint.h>
    /*
    static const uint8_t atan_table[32][32] = {
      {0x20, 0x1f, 0x1d, 0x1c, 0x1a, 0x18, 0x16, 0x14, 0x12, 0x10, 0x0e, 0x0c, 0x09, 0x07, 0x04, 0x01, 0xff, 0xfc, 0xf9, 0xf7, 0xf4, 0xf2, 0xf0, 0xee, 0xec, 0xea, 0xe8, 0xe6, 0xe4, 0xe3, 0xe1, 0xe0},
      {0x21, 0x20, 0x1f, 0x1d, 0x1b, 0x1a, 0x18, 0x16, 0x13, 0x11, 0x0f, 0x0c, 0x0a, 0x07, 0x04, 0x01, 0xff, 0xfc, 0xf9, 0xf6, 0xf4, 0xf1, 0xef, 0xed, 0xea, 0xe8, 0xe6, 0xe5, 0xe3, 0xe1, 0xe0, 0xdf},
      {0x23, 0x21, 0x20, 0x1e, 0x1d, 0x1b, 0x19, 0x17, 0x15, 0x12, 0x10, 0x0d, 0x0a, 0x07, 0x05, 0x02, 0xfe, 0xfb, 0xf9, 0xf6, 0xf3, 0xf0, 0xee, 0xeb, 0xe9, 0xe7, 0xe5, 0xe3, 0xe2, 0xe0, 0xdf, 0xdd},
      {0x24, 0x23, 0x22, 0x20, 0x1e, 0x1c, 0x1a, 0x18, 0x16, 0x14, 0x11, 0x0e, 0x0b, 0x08, 0x05, 0x02, 0xfe, 0xfb, 0xf8, 0xf5, 0xf2, 0xef, 0xec, 0xea, 0xe8, 0xe6, 0xe4, 0xe2, 0xe0, 0xde, 0xdd, 0xdc},
      {0x26, 0x25, 0x23, 0x22, 0x20, 0x1e, 0x1c, 0x1a, 0x18, 0x15, 0x12, 0x0f, 0x0c, 0x09, 0x05, 0x02, 0xfe, 0xfb, 0xf7, 0xf4, 0xf1, 0xee, 0xeb, 0xe8, 0xe6, 0xe4, 0xe2, 0xe0, 0xde, 0xdd, 0xdb, 0xda},
      {0x28, 0x26, 0x25, 0x24, 0x22, 0x20, 0x1e, 0x1c, 0x19, 0x17, 0x14, 0x10, 0x0d, 0x0a, 0x06, 0x02, 0xfe, 0xfa, 0xf6, 0xf3, 0xf0, 0xec, 0xe9, 0xe7, 0xe4, 0xe2, 0xe0, 0xde, 0xdc, 0xdb, 0xda, 0xd8},
      {0x2a, 0x28, 0x27, 0x26, 0x24, 0x22, 0x20, 0x1e, 0x1b, 0x18, 0x15, 0x12, 0x0e, 0x0a, 0x06, 0x02, 0xfe, 0xfa, 0xf6, 0xf2, 0xee, 0xeb, 0xe8, 0xe5, 0xe2, 0xe0, 0xde, 0xdc, 0xda, 0xd9, 0xd8, 0xd6},
      {0x2c, 0x2a, 0x29, 0x28, 0x26, 0x24, 0x22, 0x20, 0x1d, 0x1b, 0x17, 0x14, 0x10, 0x0c, 0x07, 0x02, 0xfe, 0xf9, 0xf4, 0xf0, 0xec, 0xe9, 0xe5, 0xe3, 0xe0, 0xde, 0xdc, 0xda, 0xd8, 0xd7, 0xd6, 0xd4},
      {0x2e, 0x2d, 0x2b, 0x2a, 0x28, 0x27, 0x25, 0x23, 0x20, 0x1d, 0x1a, 0x16, 0x12, 0x0d, 0x08, 0x03, 0xfd, 0xf8, 0xf3, 0xee, 0xea, 0xe6, 0xe3, 0xe0, 0xdd, 0xdb, 0xd9, 0xd8, 0xd6, 0xd5, 0xd3, 0xd2},
      {0x30, 0x2f, 0x2e, 0x2c, 0x2b, 0x29, 0x28, 0x25, 0x23, 0x20, 0x1d, 0x19, 0x14, 0x0f, 0x09, 0x03, 0xfd, 0xf7, 0xf1, 0xec, 0xe7, 0xe3, 0xe0, 0xdd, 0xdb, 0xd8, 0xd7, 0xd5, 0xd4, 0xd2, 0xd1, 0xd0},
      {0x32, 0x31, 0x30, 0x2f, 0x2e, 0x2c, 0x2b, 0x29, 0x26, 0x23, 0x20, 0x1c, 0x17, 0x11, 0x0b, 0x04, 0xfc, 0xf5, 0xef, 0xe9, 0xe4, 0xe0, 0xdd, 0xda, 0xd7, 0xd5, 0xd4, 0xd2, 0xd1, 0xd0, 0xcf, 0xce},
      {0x34, 0x34, 0x33, 0x32, 0x31, 0x30, 0x2e, 0x2c, 0x2a, 0x27, 0x24, 0x20, 0x1b, 0x15, 0x0d, 0x05, 0xfb, 0xf3, 0xeb, 0xe5, 0xe0, 0xdc, 0xd9, 0xd6, 0xd4, 0xd2, 0xd0, 0xcf, 0xce, 0xcd, 0xcc, 0xcc},
      {0x37, 0x36, 0x36, 0x35, 0x34, 0x33, 0x32, 0x30, 0x2e, 0x2c, 0x29, 0x25, 0x20, 0x19, 0x10, 0x06, 0xfa, 0xf0, 0xe7, 0xe0, 0xdb, 0xd7, 0xd4, 0xd2, 0xd0, 0xce, 0xcd, 0xcc, 0xcb, 0xca, 0xca, 0xc9},
      {0x39, 0x39, 0x39, 0x38, 0x37, 0x36, 0x36, 0x34, 0x33, 0x31, 0x2f, 0x2b, 0x27, 0x20, 0x16, 0x08, 0xf8, 0xea, 0xe0, 0xd9, 0xd5, 0xd1, 0xcf, 0xcd, 0xcc, 0xca, 0xca, 0xc9, 0xc8, 0xc7, 0xc7, 0xc7},
      {0x3c, 0x3c, 0x3b, 0x3b, 0x3b, 0x3a, 0x3a, 0x39, 0x38, 0x37, 0x35, 0x33, 0x30, 0x2a, 0x20, 0x0d, 0xf3, 0xe0, 0xd6, 0xd0, 0xcd, 0xcb, 0xc9, 0xc8, 0xc7, 0xc6, 0xc6, 0xc5, 0xc5, 0xc5, 0xc4, 0xc4},
      {0x3f, 0x3f, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3d, 0x3d, 0x3c, 0x3b, 0x3a, 0x38, 0x33, 0x20, 0xe0, 0xcd, 0xc8, 0xc6, 0xc5, 0xc4, 0xc3, 0xc3, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc1, 0xc1},
      {0x41, 0x41, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x43, 0x43, 0x44, 0x45, 0x46, 0x48, 0x4d, 0x60, 0xa0, 0xb3, 0xb8, 0xba, 0xbb, 0xbc, 0xbd, 0xbd, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbf, 0xbf},
      {0x44, 0x44, 0x45, 0x45, 0x45, 0x46, 0x46, 0x47, 0x48, 0x49, 0x4b, 0x4d, 0x50, 0x56, 0x60, 0x73, 0x8d, 0xa0, 0xaa, 0xb0, 0xb3, 0xb5, 0xb7, 0xb8, 0xb9, 0xba, 0xba, 0xbb, 0xbb, 0xbb, 0xbc, 0xbc},
      {0x47, 0x47, 0x47, 0x48, 0x49, 0x4a, 0x4a, 0x4c, 0x4d, 0x4f, 0x51, 0x55, 0x59, 0x60, 0x6a, 0x78, 0x88, 0x96, 0xa0, 0xa7, 0xab, 0xaf, 0xb1, 0xb3, 0xb4, 0xb6, 0xb6, 0xb7, 0xb8, 0xb9, 0xb9, 0xb9},
      {0x49, 0x4a, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x50, 0x52, 0x54, 0x57, 0x5b, 0x60, 0x67, 0x70, 0x7a, 0x86, 0x90, 0x99, 0xa0, 0xa5, 0xa9, 0xac, 0xae, 0xb0, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb6, 0xb7},
      {0x4c, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x52, 0x54, 0x56, 0x59, 0x5c, 0x60, 0x65, 0x6b, 0x73, 0x7b, 0x85, 0x8d, 0x95, 0x9b, 0xa0, 0xa4, 0xa7, 0xaa, 0xac, 0xae, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb4},
      {0x4e, 0x4f, 0x50, 0x51, 0x52, 0x54, 0x55, 0x57, 0x5a, 0x5d, 0x60, 0x64, 0x69, 0x6f, 0x75, 0x7c, 0x84, 0x8b, 0x91, 0x97, 0x9c, 0xa0, 0xa3, 0xa6, 0xa9, 0xab, 0xac, 0xae, 0xaf, 0xb0, 0xb1, 0xb2},
      {0x50, 0x51, 0x52, 0x54, 0x55, 0x57, 0x58, 0x5b, 0x5d, 0x60, 0x63, 0x67, 0x6c, 0x71, 0x77, 0x7d, 0x83, 0x89, 0x8f, 0x94, 0x99, 0x9d, 0xa0, 0xa3, 0xa5, 0xa8, 0xa9, 0xab, 0xac, 0xae, 0xaf, 0xb0},
      {0x52, 0x53, 0x55, 0x56, 0x58, 0x59, 0x5b, 0x5d, 0x60, 0x63, 0x66, 0x6a, 0x6e, 0x73, 0x78, 0x7d, 0x83, 0x88, 0x8d, 0x92, 0x96, 0x9a, 0x9d, 0xa0, 0xa3, 0xa5, 0xa7, 0xa8, 0xaa, 0xab, 0xad, 0xae},
      {0x54, 0x56, 0x57, 0x58, 0x5a, 0x5c, 0x5e, 0x60, 0x63, 0x65, 0x69, 0x6c, 0x70, 0x74, 0x79, 0x7e, 0x82, 0x87, 0x8c, 0x90, 0x94, 0x97, 0x9b, 0x9d, 0xa0, 0xa2, 0xa4, 0xa6, 0xa8, 0xa9, 0xaa, 0xac},
      {0x56, 0x58, 0x59, 0x5a, 0x5c, 0x5e, 0x60, 0x62, 0x65, 0x68, 0x6b, 0x6e, 0x72, 0x76, 0x7a, 0x7e, 0x82, 0x86, 0x8a, 0x8e, 0x92, 0x95, 0x98, 0x9b, 0x9e, 0xa0, 0xa2, 0xa4, 0xa6, 0xa7, 0xa8, 0xaa},
      {0x58, 0x5a, 0x5b, 0x5c, 0x5e, 0x60, 0x62, 0x64, 0x67, 0x69, 0x6c, 0x70, 0x73, 0x76, 0x7a, 0x7e, 0x82, 0x86, 0x8a, 0x8d, 0x90, 0x94, 0x97, 0x99, 0x9c, 0x9e, 0xa0, 0xa2, 0xa4, 0xa5, 0xa6, 0xa8},
      {0x5a, 0x5b, 0x5d, 0x5e, 0x60, 0x62, 0x64, 0x66, 0x68, 0x6b, 0x6e, 0x71, 0x74, 0x77, 0x7b, 0x7e, 0x82, 0x85, 0x89, 0x8c, 0x8f, 0x92, 0x95, 0x98, 0x9a, 0x9c, 0x9e, 0xa0, 0xa2, 0xa3, 0xa5, 0xa6},
      {0x5c, 0x5d, 0x5e, 0x60, 0x62, 0x64, 0x66, 0x68, 0x6a, 0x6c, 0x6f, 0x72, 0x75, 0x78, 0x7b, 0x7e, 0x82, 0x85, 0x88, 0x8b, 0x8e, 0x91, 0x94, 0x96, 0x98, 0x9a, 0x9c, 0x9e, 0xa0, 0xa2, 0xa3, 0xa4},
      {0x5d, 0x5f, 0x60, 0x62, 0x63, 0x65, 0x67, 0x69, 0x6b, 0x6e, 0x70, 0x73, 0x76, 0x79, 0x7b, 0x7e, 0x82, 0x85, 0x87, 0x8a, 0x8d, 0x90, 0x92, 0x95, 0x97, 0x99, 0x9b, 0x9d, 0x9e, 0xa0, 0xa1, 0xa3},
      {0x5f, 0x60, 0x61, 0x63, 0x65, 0x66, 0x68, 0x6a, 0x6d, 0x6f, 0x71, 0x74, 0x76, 0x79, 0x7c, 0x7f, 0x81, 0x84, 0x87, 0x8a, 0x8c, 0x8f, 0x91, 0x93, 0x96, 0x98, 0x9a, 0x9b, 0x9d, 0x9f, 0xa0, 0xa1},
      {0x60, 0x61, 0x63, 0x64, 0x66, 0x68, 0x6a, 0x6c, 0x6e, 0x70, 0x72, 0x74, 0x77, 0x79, 0x7c, 0x7f, 0x81, 0x84, 0x87, 0x89, 0x8c, 0x8e, 0x90, 0x92, 0x94, 0x96, 0x98, 0x9a, 0x9c, 0x9d, 0x9f, 0xa0}
    };
    */
    /*
    static const uint16_t atan_table[64][64] = {
      {0x2000, 0x20ab, 0x215b, 0x2212, 0x22ce, 0x2390, 0x2459, 0x2528, 0x25fe, 0x26da, 0x27bd, 0x28a8, 0x2999, 0x2a91, 0x2b90, 0x2c96, 0x2da3, 0x2eb7, 0x2fd2, 0x30f4, 0x321b, 0x3349, 0x347d, 0x35b6, 0x36f3, 0x3836, 0x397c, 0x3ac5, 0x3c12, 0x3d60, 0x3eaf, 0x4000, 0x4150, 0x42a0, 0x43ee, 0x453a, 0x4684, 0x47ca, 0x490c, 0x4a4a, 0x4b83, 0x4cb6, 0x4de4, 0x4f0c, 0x502d, 0x5148, 0x525c, 0x5369, 0x5470, 0x556f, 0x5667, 0x5758, 0x5842, 0x5925, 0x5a02, 0x5ad7, 0x5ba6, 0x5c6f, 0x5d31, 0x5dee, 0x5ea4, 0x5f55, 0x6000, 0x60a5},
      {0x1f55, 0x2000, 0x20b1, 0x2167, 0x2224, 0x22e8, 0x23b1, 0x2482, 0x255a, 0x2638, 0x271e, 0x280b, 0x28ff, 0x29fb, 0x2afe, 0x2c09, 0x2d1c, 0x2e36, 0x2f57, 0x307f, 0x31ae, 0x32e4, 0x3420, 0x3562, 0x36a9, 0x37f5, 0x3945, 0x3a99, 0x3bf0, 0x3d49, 0x3ea4, 0x4000, 0x415b, 0x42b6, 0x440f, 0x4566, 0x46ba, 0x480b, 0x4957, 0x4a9e, 0x4be0, 0x4d1c, 0x4e51, 0x4f81, 0x50a9, 0x51ca, 0x52e4, 0x53f6, 0x5501, 0x5604, 0x5700, 0x57f5, 0x58e2, 0x59c7, 0x5aa6, 0x5b7d, 0x5c4e, 0x5d18, 0x5ddb, 0x5e98, 0x5f4f, 0x6000, 0x60ab, 0x6150},
      {0x1ea4, 0x1f4f, 0x2000, 0x20b7, 0x2174, 0x2238, 0x2303, 0x23d5, 0x24ae, 0x258f, 0x2677, 0x2767, 0x285e, 0x295e, 0x2a65, 0x2b75, 0x2c8d, 0x2dad, 0x2ed4, 0x3004, 0x313a, 0x3278, 0x33bd, 0x3508, 0x3659, 0x37b0, 0x390b, 0x3a6a, 0x3bcd, 0x3d32, 0x3e98, 0x4000, 0x4167, 0x42ce, 0x4433, 0x4595, 0x46f5, 0x4850, 0x49a6, 0x4af7, 0x4c42, 0x4d87, 0x4ec5, 0x4ffc, 0x512b, 0x5253, 0x5373, 0x548a, 0x559a, 0x56a2, 0x57a1, 0x5899, 0x5989, 0x5a71, 0x5b51, 0x5c2b, 0x5cfc, 0x5dc7, 0x5e8b, 0x5f49, 0x6000, 0x60b0, 0x615b, 0x6200},
      {0x1dee, 0x1e98, 0x1f49, 0x2000, 0x20bd, 0x2182, 0x224e, 0x2321, 0x23fb, 0x24de, 0x25c8, 0x26ba, 0x27b5, 0x28b9, 0x29c4, 0x2ad9, 0x2bf6, 0x2d1c, 0x2e4a, 0x2f81, 0x30bf, 0x3206, 0x3354, 0x34a9, 0x3605, 0x3766, 0x38cd, 0x3a38, 0x3ba6, 0x3d18, 0x3e8b, 0x4000, 0x4174, 0x42e8, 0x4459, 0x45c8, 0x4733, 0x4899, 0x49fb, 0x4b56, 0x4cac, 0x4dfa, 0x4f40, 0x507f, 0x51b5, 0x52e4, 0x5409, 0x5527, 0x563b, 0x5747, 0x584a, 0x5945, 0x5a38, 0x5b22, 0x5c04, 0x5cdf, 0x5db2, 0x5e7d, 0x5f42, 0x6000, 0x60b7, 0x6167, 0x6212, 0x62b6},
      {0x1d32, 0x1ddb, 0x1e8c, 0x1f42, 0x2000, 0x20c5, 0x2191, 0x2265, 0x2341, 0x2425, 0x2511, 0x2606, 0x2704, 0x280b, 0x291b, 0x2a34, 0x2b57, 0x2c82, 0x2db7, 0x2ef6, 0x303d, 0x318c, 0x32e4, 0x3443, 0x35aa, 0x3717, 0x388a, 0x3a02, 0x3b7e, 0x3cfd, 0x3e7e, 0x4000, 0x4182, 0x4303, 0x4482, 0x45fe, 0x4776, 0x48e9, 0x4a56, 0x4bbc, 0x4d1c, 0x4e73, 0x4fc3, 0x510a, 0x5248, 0x537d, 0x54a9, 0x55cb, 0x56e5, 0x57f5, 0x58fc, 0x59fa, 0x5aef, 0x5bdb, 0x5cbf, 0x5d9b, 0x5e6f, 0x5f3b, 0x6000, 0x60bd, 0x6174, 0x6224, 0x62ce, 0x6371},
      {0x1c6f, 0x1d18, 0x1dc8, 0x1e7e, 0x1f3b, 0x2000, 0x20cc, 0x21a1, 0x227e, 0x2363, 0x2451, 0x2549, 0x2649, 0x2754, 0x2868, 0x2986, 0x2aae, 0x2be0, 0x2d1c, 0x2e62, 0x2fb1, 0x310a, 0x326c, 0x33d6, 0x3549, 0x36c2, 0x3842, 0x39c8, 0x3b52, 0x3cdf, 0x3e6f, 0x4000, 0x4191, 0x4320, 0x44ae, 0x4638, 0x47bd, 0x493d, 0x4ab7, 0x4c29, 0x4d94, 0x4ef5, 0x504e, 0x519e, 0x52e4, 0x5420, 0x5552, 0x567a, 0x5798, 0x58ac, 0x59b6, 0x5ab7, 0x5bae, 0x5c9c, 0x5d82, 0x5e5f, 0x5f33, 0x6000, 0x60c4, 0x6182, 0x6238, 0x62e7, 0x6390, 0x6433},
      {0x1ba7, 0x1c4e, 0x1cfd, 0x1db2, 0x1e6f, 0x1f33, 0x2000, 0x20d5, 0x21b2, 0x2299, 0x2389, 0x2482, 0x2585, 0x2693, 0x27ab, 0x28ce, 0x29fb, 0x2b33, 0x2c76, 0x2dc4, 0x2f1c, 0x307f, 0x31ec, 0x3361, 0x34e0, 0x3667, 0x37f5, 0x3989, 0x3b22, 0x3cbf, 0x3e5f, 0x4000, 0x41a1, 0x4340, 0x44dd, 0x4677, 0x480b, 0x4999, 0x4b1f, 0x4c9e, 0x4e14, 0x4f81, 0x50e3, 0x523b, 0x5389, 0x54cc, 0x5604, 0x5732, 0x5854, 0x596c, 0x5a7a, 0x5b7d, 0x5c77, 0x5d67, 0x5e4d, 0x5f2b, 0x6000, 0x60cc, 0x6191, 0x624d, 0x6303, 0x63b1, 0x6459, 0x64fa},
      {0x1ad7, 0x1b7e, 0x1c2b, 0x1cdf, 0x1d9b, 0x1e5f, 0x1f2b, 0x2000, 0x20de, 0x21c5, 0x22b6, 0x23b1, 0x24b7, 0x25c8, 0x26e4, 0x280b, 0x293d, 0x2a7c, 0x2bc6, 0x2d1c, 0x2e7d, 0x2fea, 0x3162, 0x32e4, 0x3470, 0x3605, 0x37a1, 0x3945, 0x3aef, 0x3c9d, 0x3e4d, 0x4000, 0x41b2, 0x4363, 0x4511, 0x46ba, 0x485e, 0x49fb, 0x4b90, 0x4d1c, 0x4e9e, 0x5016, 0x5182, 0x52e4, 0x543a, 0x5584, 0x56c2, 0x57f5, 0x591c, 0x5a38, 0x5b48, 0x5c4e, 0x5d49, 0x5e3a, 0x5f22, 0x6000, 0x60d4, 0x61a1, 0x6264, 0x6320, 0x63d5, 0x6482, 0x6528, 0x65c8},
      {0x1a02, 0x1aa6, 0x1b52, 0x1c05, 0x1cbf, 0x1d82, 0x1e4e, 0x1f22, 0x2000, 0x20e8, 0x21da, 0x22d6, 0x23de, 0x24f2, 0x2611, 0x273c, 0x2874, 0x29b9, 0x2b0a, 0x2c68, 0x2dd3, 0x2f4a, 0x30cd, 0x325c, 0x33f6, 0x359a, 0x3747, 0x38fc, 0x3ab7, 0x3c77, 0x3e3b, 0x4000, 0x41c5, 0x4388, 0x4549, 0x4704, 0x48b8, 0x4a65, 0x4c09, 0x4da3, 0x4f32, 0x50b5, 0x522d, 0x5398, 0x54f6, 0x5647, 0x578b, 0x58c3, 0x59ef, 0x5b0e, 0x5c21, 0x5d29, 0x5e26, 0x5f18, 0x6000, 0x60de, 0x61b2, 0x627d, 0x6340, 0x63fb, 0x64ae, 0x6559, 0x65fe, 0x669b},
      {0x1925, 0x19c8, 0x1a71, 0x1b22, 0x1bdb, 0x1c9d, 0x1d67, 0x1e3b, 0x1f18, 0x2000, 0x20f2, 0x21f0, 0x22fa, 0x240f, 0x2532, 0x2661, 0x279e, 0x28e9, 0x2a41, 0x2ba7, 0x2d1c, 0x2e9e, 0x302e, 0x31ca, 0x3373, 0x3527, 0x36e5, 0x38ac, 0x3a7a, 0x3c4e, 0x3e26, 0x4000, 0x41da, 0x43b1, 0x4585, 0x4754, 0x491b, 0x4ad9, 0x4c8d, 0x4e36, 0x4fd2, 0x5162, 0x52e4, 0x5458, 0x55be, 0x5717, 0x5861, 0x599e, 0x5ace, 0x5bf0, 0x5d06, 0x5e0f, 0x5f0d, 0x6000, 0x60e7, 0x61c5, 0x6298, 0x6363, 0x6424, 0x64dd, 0x658e, 0x6638, 0x66da, 0x6776},
      {0x1842, 0x18e2, 0x1989, 0x1a38, 0x1aef, 0x1bae, 0x1c77, 0x1d4a, 0x1e26, 0x1f0d, 0x2000, 0x20fe, 0x2209, 0x2321, 0x2446, 0x2579, 0x26ba, 0x280b, 0x296a, 0x2ad9, 0x2c57, 0x2de4, 0x2f81, 0x312b, 0x32e4, 0x34a9, 0x367a, 0x3855, 0x3a38, 0x3c21, 0x3e0f, 0x4000, 0x41f0, 0x43de, 0x45c8, 0x47ab, 0x4986, 0x4b56, 0x4d1c, 0x4ed4, 0x507f, 0x521b, 0x53a8, 0x5527, 0x5695, 0x57f5, 0x5945, 0x5a87, 0x5bba, 0x5cdf, 0x5df7, 0x5f01, 0x6000, 0x60f2, 0x61d9, 0x62b6, 0x6388, 0x6451, 0x6511, 0x65c8, 0x6676, 0x671d, 0x67bd, 0x6856},
      {0x1758, 0x17f5, 0x1899, 0x1945, 0x19fa, 0x1ab7, 0x1b7e, 0x1c4e, 0x1d29, 0x1e10, 0x1f02, 0x2000, 0x210b, 0x2224, 0x234c, 0x2482, 0x25c8, 0x271e, 0x2884, 0x29fb, 0x2b83, 0x2d1c, 0x2ec5, 0x307f, 0x3248, 0x3420, 0x3605, 0x37f5, 0x39ef, 0x3bf0, 0x3df7, 0x4000, 0x4209, 0x440f, 0x4611, 0x480b, 0x49fb, 0x4be0, 0x4db7, 0x4f81, 0x513a, 0x52e4, 0x547d, 0x5604, 0x577b, 0x58e2, 0x5a38, 0x5b7d, 0x5cb4, 0x5ddb, 0x5ef4, 0x6000, 0x60fe, 0x61f0, 0x62d6, 0x63b1, 0x6482, 0x6548, 0x6606, 0x66ba, 0x6766, 0x680b, 0x68a7, 0x693d},
      {0x1667, 0x1701, 0x17a2, 0x184a, 0x18fc, 0x19b6, 0x1a7a, 0x1b48, 0x1c22, 0x1d06, 0x1df7, 0x1ef4, 0x2000, 0x211a, 0x2243, 0x237c, 0x24c5, 0x2620, 0x278d, 0x290c, 0x2a9e, 0x2c43, 0x2dfa, 0x2fc3, 0x319e, 0x3389, 0x3584, 0x378c, 0x399e, 0x3bba, 0x3ddb, 0x4000, 0x4224, 0x4446, 0x4661, 0x4874, 0x4a7c, 0x4c76, 0x4e62, 0x503c, 0x5206, 0x53bd, 0x5561, 0x56f3, 0x5872, 0x59df, 0x5b3a, 0x5c84, 0x5dbd, 0x5ee6, 0x6000, 0x610b, 0x6209, 0x62f9, 0x63de, 0x64b7, 0x6585, 0x6649, 0x6704, 0x67b5, 0x685e, 0x68ff, 0x6998, 0x6a2b},
      {0x156f, 0x1605, 0x16a2, 0x1747, 0x17f5, 0x18ac, 0x196d, 0x1a38, 0x1b0e, 0x1bf0, 0x1cdf, 0x1ddb, 0x1ee6, 0x2000, 0x212a, 0x2265, 0x23b1, 0x2511, 0x2684, 0x280b, 0x29a6, 0x2b57, 0x2d1c, 0x2ef6, 0x30e3, 0x32e4, 0x34f6, 0x3717, 0x3945, 0x3b7e, 0x3dbd, 0x4000, 0x4243, 0x4482, 0x46ba, 0x48e9, 0x4b0a, 0x4d1c, 0x4f1c, 0x510a, 0x52e4, 0x54a9, 0x5659, 0x57f5, 0x597c, 0x5aef, 0x5c4e, 0x5d9b, 0x5ed6, 0x6000, 0x6119, 0x6224, 0x6320, 0x640f, 0x64f1, 0x65c8, 0x6693, 0x6754, 0x680b, 0x68b8, 0x695e, 0x69fb, 0x6a91, 0x6b1f},
      {0x1470, 0x1501, 0x159a, 0x163b, 0x16e5, 0x1798, 0x1855, 0x191c, 0x19ef, 0x1ace, 0x1bba, 0x1cb4, 0x1dbd, 0x1ed6, 0x2000, 0x213c, 0x228b, 0x23ee, 0x2566, 0x26f5, 0x289a, 0x2a56, 0x2c29, 0x2e14, 0x3016, 0x322d, 0x3458, 0x3695, 0x38e2, 0x3b3a, 0x3d9b, 0x4000, 0x4265, 0x44c5, 0x471e, 0x496a, 0x4ba7, 0x4dd3, 0x4fea, 0x51eb, 0x53d6, 0x55aa, 0x5766, 0x590b, 0x5a99, 0x5c11, 0x5d75, 0x5ec4, 0x6000, 0x612a, 0x6242, 0x634b, 0x6446, 0x6532, 0x6611, 0x66e3, 0x67ab, 0x6868, 0x691b, 0x69c4, 0x6a65, 0x6afe, 0x6b90, 0x6c1a},
      {0x136a, 0x13f6, 0x148b, 0x1527, 0x15cc, 0x167a, 0x1732, 0x17f5, 0x18c4, 0x199e, 0x1a87, 0x1b7e, 0x1c84, 0x1d9b, 0x1ec4, 0x2000, 0x2150, 0x22b6, 0x2433, 0x25c8, 0x2776, 0x293d, 0x2b1f, 0x2d1c, 0x2f32, 0x3162, 0x33a9, 0x3605, 0x3873, 0x3aef, 0x3d75, 0x4000, 0x428b, 0x4511, 0x478d, 0x49fb, 0x4c57, 0x4e9e, 0x50cd, 0x52e4, 0x54e0, 0x56c2, 0x588a, 0x5a38, 0x5bcc, 0x5d49, 0x5eaf, 0x6000, 0x613c, 0x6264, 0x637b, 0x6482, 0x6579, 0x6661, 0x673c, 0x680b, 0x68cd, 0x6986, 0x6a34, 0x6ad9, 0x6b75, 0x6c09, 0x6c96, 0x6d1c},
      {0x125c, 0x12e4, 0x1373, 0x140a, 0x14a9, 0x1552, 0x1605, 0x16c2, 0x178c, 0x1862, 0x1945, 0x1a38, 0x1b3a, 0x1c4e, 0x1d75, 0x1eb0, 0x2000, 0x2167, 0x22e8, 0x2482, 0x2638, 0x280b, 0x29fb, 0x2c09, 0x2e36, 0x307f, 0x32e4, 0x3562, 0x37f5, 0x3a99, 0x3d49, 0x4000, 0x42b6, 0x4566, 0x480b, 0x4a9e, 0x4d1c, 0x4f81, 0x51ca, 0x53f6, 0x5604, 0x57f5, 0x59c7, 0x5b7d, 0x5d18, 0x5e98, 0x6000, 0x6150, 0x628b, 0x63b1, 0x64c5, 0x65c8, 0x66ba, 0x679e, 0x6874, 0x693d, 0x69fb, 0x6aae, 0x6b56, 0x6bf6, 0x6c8d, 0x6d1c, 0x6da3, 0x6e24},
      {0x1148, 0x11ca, 0x1253, 0x12e4, 0x137d, 0x1420, 0x14cd, 0x1584, 0x1647, 0x1717, 0x17f5, 0x18e2, 0x19df, 0x1aef, 0x1c12, 0x1d4a, 0x1e98, 0x2000, 0x2182, 0x2321, 0x24de, 0x26ba, 0x28b9, 0x2ad9, 0x2d1c, 0x2f81, 0x3206, 0x34a9, 0x3766, 0x3a38, 0x3d18, 0x4000, 0x42e8, 0x45c8, 0x4899, 0x4b56, 0x4dfa, 0x507f, 0x52e4, 0x5527, 0x5747, 0x5945, 0x5b22, 0x5cdf, 0x5e7d, 0x6000, 0x6167, 0x62b6, 0x63ee, 0x6511, 0x6620, 0x671d, 0x680b, 0x68e8, 0x69b8, 0x6a7c, 0x6b33, 0x6be0, 0x6c82, 0x6d1c, 0x6dac, 0x6e35, 0x6eb7, 0x6f32},
      {0x102e, 0x10a9, 0x112b, 0x11b6, 0x1248, 0x12e4, 0x1389, 0x143a, 0x14f6, 0x15bf, 0x1696, 0x177c, 0x1873, 0x197c, 0x1a99, 0x1bcd, 0x1d18, 0x1e7e, 0x2000, 0x21a1, 0x2363, 0x2549, 0x2754, 0x2986, 0x2be0, 0x2e62, 0x310a, 0x33d6, 0x36c2, 0x39c8, 0x3cdf, 0x4000, 0x4320, 0x4638, 0x493d, 0x4c29, 0x4ef5, 0x519e, 0x5420, 0x567a, 0x58ac, 0x5ab7, 0x5c9c, 0x5e5f, 0x6000, 0x6182, 0x62e7, 0x6433, 0x6566, 0x6684, 0x678d, 0x6884, 0x696a, 0x6a41, 0x6b0a, 0x6bc6, 0x6c76, 0x6d1c, 0x6db7, 0x6e4a, 0x6ed4, 0x6f57, 0x6fd2, 0x7047},
      {0x0f0c, 0x0f81, 0x0ffc, 0x107f, 0x110a, 0x119e, 0x123c, 0x12e4, 0x1398, 0x1458, 0x1527, 0x1605, 0x16f4, 0x17f5, 0x190b, 0x1a38, 0x1b7e, 0x1cdf, 0x1e5f, 0x2000, 0x21c5, 0x23b1, 0x25c8, 0x280b, 0x2a7c, 0x2d1c, 0x2fea, 0x32e4, 0x3605, 0x3945, 0x3c9d, 0x4000, 0x4363, 0x46ba, 0x49fb, 0x4d1c, 0x5016, 0x52e4, 0x5584, 0x57f5, 0x5a38, 0x5c4e, 0x5e3a, 0x6000, 0x61a1, 0x6320, 0x6482, 0x65c8, 0x66f4, 0x680b, 0x690c, 0x69fb, 0x6ad9, 0x6ba7, 0x6c68, 0x6d1c, 0x6dc4, 0x6e61, 0x6ef5, 0x6f80, 0x7003, 0x707f, 0x70f3, 0x7161},
      {0x0de4, 0x0e52, 0x0ec5, 0x0f40, 0x0fc3, 0x104f, 0x10e3, 0x1183, 0x122d, 0x12e4, 0x13a9, 0x147d, 0x1562, 0x1659, 0x1766, 0x188a, 0x19c8, 0x1b22, 0x1c9d, 0x1e3b, 0x2000, 0x21f0, 0x240f, 0x2661, 0x28e9, 0x2ba7, 0x2e9e, 0x31ca, 0x3527, 0x38ac, 0x3c4e, 0x4000, 0x43b1, 0x4754, 0x4ad9, 0x4e36, 0x5162, 0x5458, 0x5717, 0x599e, 0x5bf0, 0x5e0f, 0x6000, 0x61c5, 0x6363, 0x64dd, 0x6638, 0x6776, 0x6899, 0x69a6, 0x6a9e, 0x6b83, 0x6c57, 0x6d1c, 0x6dd3, 0x6e7d, 0x6f1c, 0x6fb1, 0x703c, 0x70bf, 0x713a, 0x71ae, 0x721b, 0x7282},
      {0x0cb7, 0x0d1c, 0x0d87, 0x0dfa, 0x0e74, 0x0ef6, 0x0f81, 0x1016, 0x10b6, 0x1162, 0x121b, 0x12e4, 0x13bd, 0x14a9, 0x15aa, 0x16c2, 0x17f5, 0x1945, 0x1ab7, 0x1c4e, 0x1e10, 0x2000, 0x2224, 0x2482, 0x271e, 0x29fb, 0x2d1c, 0x307f, 0x3420, 0x37f5, 0x3bf0, 0x4000, 0x440f, 0x480b, 0x4be0, 0x4f81, 0x52e4, 0x5604, 0x58e2, 0x5b7d, 0x5ddb, 0x6000, 0x61f0, 0x63b1, 0x6548, 0x66ba, 0x680b, 0x693d, 0x6a56, 0x6b56, 0x6c42, 0x6d1c, 0x6de4, 0x6e9e, 0x6f4a, 0x6fea, 0x707f, 0x710a, 0x718c, 0x7206, 0x7278, 0x72e4, 0x7349, 0x73a8},
      {0x0b83, 0x0be0, 0x0c43, 0x0cac, 0x0d1c, 0x0d94, 0x0e14, 0x0e9e, 0x0f32, 0x0fd2, 0x107f, 0x113a, 0x1206, 0x12e4, 0x13d6, 0x14e0, 0x1605, 0x1747, 0x18ac, 0x1a38, 0x1bf0, 0x1ddb, 0x2000, 0x2265, 0x2511, 0x280b, 0x2b57, 0x2ef6, 0x32e4, 0x3717, 0x3b7e, 0x4000, 0x4482, 0x48e9, 0x4d1c, 0x510a, 0x54a9, 0x57f5, 0x5aef, 0x5d9b, 0x6000, 0x6224, 0x640f, 0x65c8, 0x6754, 0x68b8, 0x69fb, 0x6b1f, 0x6c29, 0x6d1c, 0x6df9, 0x6ec5, 0x6f80, 0x702d, 0x70cd, 0x7161, 0x71eb, 0x726c, 0x72e4, 0x7354, 0x73bd, 0x7420, 0x747c, 0x74d4},
      {0x0a4a, 0x0a9e, 0x0af7, 0x0b57, 0x0bbc, 0x0c29, 0x0c9e, 0x0d1c, 0x0da3, 0x0e36, 0x0ed4, 0x0f81, 0x103d, 0x110a, 0x11ec, 0x12e4, 0x13f6, 0x1527, 0x167a, 0x17f5, 0x199e, 0x1b7e, 0x1d9b, 0x2000, 0x22b6, 0x25c8, 0x293d, 0x2d1c, 0x3162, 0x3605, 0x3aef, 0x4000, 0x4511, 0x49fb, 0x4e9e, 0x52e4, 0x56c2, 0x5a38, 0x5d49, 0x6000, 0x6264, 0x6482, 0x6661, 0x680b, 0x6986, 0x6ad9, 0x6c09, 0x6d1c, 0x6e14, 0x6ef5, 0x6fc3, 0x707f, 0x712b, 0x71ca, 0x725c, 0x72e4, 0x7361, 0x73d6, 0x7443, 0x74a9, 0x7508, 0x7561, 0x75b5, 0x7604},
      {0x090c, 0x0957, 0x09a6, 0x09fb, 0x0a56, 0x0ab7, 0x0b20, 0x0b90, 0x0c0a, 0x0c8d, 0x0d1c, 0x0db8, 0x0e62, 0x0f1c, 0x0fea, 0x10ce, 0x11ca, 0x12e4, 0x1420, 0x1584, 0x1717, 0x18e2, 0x1aef, 0x1d4a, 0x2000, 0x2321, 0x26ba, 0x2ad9, 0x2f81, 0x34a9, 0x3a38, 0x4000, 0x45c8, 0x4b56, 0x507f, 0x5527, 0x5945, 0x5cdf, 0x6000, 0x62b6, 0x6511, 0x671d, 0x68e8, 0x6a7c, 0x6be0, 0x6d1c, 0x6e35, 0x6f32, 0x7015, 0x70e3, 0x719e, 0x7248, 0x72e4, 0x7372, 0x73f6, 0x746f, 0x74e0, 0x7548, 0x75aa, 0x7604, 0x7659, 0x76a9, 0x76f3, 0x7739},
      {0x07ca, 0x080b, 0x0850, 0x089a, 0x08e9, 0x093e, 0x0999, 0x09fb, 0x0a66, 0x0ad9, 0x0b57, 0x0be0, 0x0c76, 0x0d1c, 0x0dd3, 0x0e9e, 0x0f81, 0x107f, 0x119e, 0x12e4, 0x1458, 0x1605, 0x17f5, 0x1a38, 0x1cdf, 0x2000, 0x23b1, 0x280b, 0x2d1c, 0x32e4, 0x3945, 0x4000, 0x46ba, 0x4d1c, 0x52e4, 0x57f5, 0x5c4e, 0x6000, 0x6320, 0x65c8, 0x680b, 0x69fb, 0x6ba7, 0x6d1c, 0x6e61, 0x6f80, 0x707f, 0x7161, 0x722d, 0x72e4, 0x7389, 0x7420, 0x74a9, 0x7526, 0x759a, 0x7604, 0x7667, 0x76c2, 0x7717, 0x7766, 0x77b0, 0x77f5, 0x7835, 0x7872},
      {0x0684, 0x06bb, 0x06f5, 0x0733, 0x0776, 0x07be, 0x080b, 0x085e, 0x08b9, 0x091b, 0x0986, 0x09fb, 0x0a7c, 0x0b0a, 0x0ba8, 0x0c57, 0x0d1c, 0x0dfa, 0x0ef6, 0x1016, 0x1162, 0x12e4, 0x14a9, 0x16c2, 0x1945, 0x1c4e, 0x2000, 0x2482, 0x29fb, 0x307f, 0x37f5, 0x4000, 0x480b, 0x4f81, 0x5604, 0x5b7d, 0x6000, 0x63b1, 0x66ba, 0x693d, 0x6b56, 0x6d1c, 0x6e9e, 0x6fea, 0x710a, 0x7206, 0x72e4, 0x73a8, 0x7458, 0x74f5, 0x7584, 0x7604, 0x767a, 0x76e5, 0x7747, 0x77a1, 0x77f5, 0x7842, 0x788a, 0x78cc, 0x790b, 0x7945, 0x797c, 0x79af},
      {0x053a, 0x0567, 0x0596, 0x05c8, 0x05fe, 0x0638, 0x0677, 0x06bb, 0x0704, 0x0754, 0x07ab, 0x080b, 0x0874, 0x08e9, 0x096a, 0x09fb, 0x0a9e, 0x0b57, 0x0c29, 0x0d1c, 0x0e36, 0x0f81, 0x110a, 0x12e4, 0x1527, 0x17f5, 0x1b7e, 0x2000, 0x25c8, 0x2d1c, 0x3605, 0x4000, 0x49fb, 0x52e4, 0x5a38, 0x6000, 0x6482, 0x680b, 0x6ad9, 0x6d1c, 0x6ef5, 0x707f, 0x71ca, 0x72e4, 0x73d6, 0x74a9, 0x7561, 0x7604, 0x7695, 0x7717, 0x778b, 0x77f5, 0x7854, 0x78ac, 0x78fc, 0x7945, 0x7989, 0x79c7, 0x7a01, 0x7a37, 0x7a6a, 0x7a99, 0x7ac5, 0x7aee},
      {0x03ee, 0x0410, 0x0433, 0x0459, 0x0482, 0x04ae, 0x04de, 0x0511, 0x0549, 0x0586, 0x05c8, 0x0611, 0x0661, 0x06bb, 0x071e, 0x078d, 0x080b, 0x089a, 0x093e, 0x09fb, 0x0ad9, 0x0be0, 0x0d1c, 0x0e9e, 0x107f, 0x12e4, 0x1605, 0x1a38, 0x2000, 0x280b, 0x32e4, 0x4000, 0x4d1c, 0x57f5, 0x6000, 0x65c8, 0x69fb, 0x6d1c, 0x6f80, 0x7161, 0x72e4, 0x7420, 0x7526, 0x7604, 0x76c2, 0x7766, 0x77f5, 0x7872, 0x78e2, 0x7945, 0x799e, 0x79ef, 0x7a37, 0x7a7a, 0x7ab7, 0x7aee, 0x7b22, 0x7b51, 0x7b7d, 0x7ba6, 0x7bcc, 0x7bf0, 0x7c11, 0x7c31},
      {0x02a0, 0x02b6, 0x02ce, 0x02e8, 0x0303, 0x0321, 0x0341, 0x0363, 0x0389, 0x03b2, 0x03de, 0x0410, 0x0446, 0x0482, 0x04c5, 0x0511, 0x0567, 0x05c8, 0x0638, 0x06bb, 0x0754, 0x080b, 0x08e9, 0x09fb, 0x0b57, 0x0d1c, 0x0f81, 0x12e4, 0x17f5, 0x2000, 0x2d1c, 0x4000, 0x52e4, 0x6000, 0x680b, 0x6d1c, 0x707f, 0x72e4, 0x74a9, 0x7604, 0x7717, 0x77f5, 0x78ac, 0x7945, 0x79c7, 0x7a37, 0x7a99, 0x7aee, 0x7b3a, 0x7b7d, 0x7bba, 0x7bf0, 0x7c21, 0x7c4e, 0x7c77, 0x7c9c, 0x7cbf, 0x7cdf, 0x7cfc, 0x7d18, 0x7d31, 0x7d49, 0x7d60, 0x7d74},
      {0x0150, 0x015c, 0x0168, 0x0174, 0x0182, 0x0191, 0x01a1, 0x01b2, 0x01c5, 0x01da, 0x01f0, 0x0209, 0x0224, 0x0243, 0x0265, 0x028b, 0x02b6, 0x02e8, 0x0321, 0x0363, 0x03b2, 0x0410, 0x0482, 0x0511, 0x05c8, 0x06bb, 0x080b, 0x09fb, 0x0d1c, 0x12e4, 0x2000, 0x4000, 0x6000, 0x6d1c, 0x72e4, 0x7604, 0x77f5, 0x7945, 0x7a37, 0x7aee, 0x7b7d, 0x7bf0, 0x7c4e, 0x7c9c, 0x7cdf, 0x7d18, 0x7d49, 0x7d74, 0x7d9b, 0x7dbd, 0x7ddb, 0x7df6, 0x7e0f, 0x7e26, 0x7e3a, 0x7e4d, 0x7e5f, 0x7e6f, 0x7e7d, 0x7e8b, 0x7e98, 0x7ea4, 0x7eaf, 0x7eba},
      {0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000},
      {0xfeaf, 0xfea3, 0xfe97, 0xfe8b, 0xfe7d, 0xfe6e, 0xfe5e, 0xfe4d, 0xfe3a, 0xfe25, 0xfe0f, 0xfdf6, 0xfddb, 0xfdbc, 0xfd9a, 0xfd74, 0xfd49, 0xfd17, 0xfcde, 0xfc9c, 0xfc4d, 0xfbef, 0xfb7d, 0xfaee, 0xfa37, 0xf944, 0xf7f4, 0xf604, 0xf2e3, 0xed1b, 0xdfff, 0xbfff, 0x9fff, 0x92e3, 0x8d1b, 0x89fb, 0x880a, 0x86ba, 0x85c8, 0x8511, 0x8482, 0x840f, 0x83b1, 0x8363, 0x8320, 0x82e7, 0x82b6, 0x828b, 0x8264, 0x8242, 0x8224, 0x8209, 0x81f0, 0x81d9, 0x81c5, 0x81b2, 0x81a0, 0x8190, 0x8182, 0x8174, 0x8167, 0x815b, 0x8150, 0x8145},
      {0xfd5f, 0xfd49, 0xfd31, 0xfd17, 0xfcfc, 0xfcde, 0xfcbe, 0xfc9c, 0xfc76, 0xfc4d, 0xfc21, 0xfbef, 0xfbb9, 0xfb7d, 0xfb3a, 0xfaee, 0xfa98, 0xfa37, 0xf9c7, 0xf944, 0xf8ab, 0xf7f4, 0xf716, 0xf604, 0xf4a8, 0xf2e3, 0xf07e, 0xed1b, 0xe80a, 0xdfff, 0xd2e3, 0xbfff, 0xad1b, 0x9fff, 0x97f4, 0x92e3, 0x8f80, 0x8d1b, 0x8b56, 0x89fb, 0x88e8, 0x880a, 0x8753, 0x86ba, 0x8638, 0x85c8, 0x8566, 0x8511, 0x84c5, 0x8482, 0x8445, 0x840f, 0x83de, 0x83b1, 0x8388, 0x8363, 0x8340, 0x8320, 0x8303, 0x82e7, 0x82ce, 0x82b6, 0x829f, 0x828b},
      {0xfc11, 0xfbef, 0xfbcc, 0xfba6, 0xfb7d, 0xfb51, 0xfb21, 0xfaee, 0xfab6, 0xfa79, 0xfa37, 0xf9ee, 0xf99e, 0xf944, 0xf8e1, 0xf872, 0xf7f4, 0xf765, 0xf6c1, 0xf604, 0xf526, 0xf41f, 0xf2e3, 0xf161, 0xef80, 0xed1b, 0xe9fa, 0xe5c7, 0xdfff, 0xd7f4, 0xcd1b, 0xbfff, 0xb2e3, 0xa80a, 0x9fff, 0x9a37, 0x9604, 0x92e3, 0x907f, 0x8e9e, 0x8d1b, 0x8bdf, 0x8ad9, 0x89fb, 0x893d, 0x8899, 0x880a, 0x878d, 0x871d, 0x86ba, 0x8661, 0x8610, 0x85c8, 0x8585, 0x8548, 0x8511, 0x84dd, 0x84ae, 0x8482, 0x8459, 0x8433, 0x840f, 0x83ee, 0x83ce},
      {0xfac5, 0xfa98, 0xfa69, 0xfa37, 0xfa01, 0xf9c7, 0xf988, 0xf944, 0xf8fb, 0xf8ab, 0xf854, 0xf7f4, 0xf78b, 0xf716, 0xf695, 0xf604, 0xf561, 0xf4a8, 0xf3d6, 0xf2e3, 0xf1c9, 0xf07e, 0xeef5, 0xed1b, 0xead8, 0xe80a, 0xe481, 0xdfff, 0xda37, 0xd2e3, 0xc9fa, 0xbfff, 0xb604, 0xad1b, 0xa5c7, 0x9fff, 0x9b7d, 0x97f4, 0x9526, 0x92e3, 0x910a, 0x8f80, 0x8e35, 0x8d1b, 0x8c29, 0x8b56, 0x8a9e, 0x89fb, 0x896a, 0x88e8, 0x8874, 0x880a, 0x87ab, 0x8753, 0x8703, 0x86ba, 0x8676, 0x8638, 0x85fe, 0x85c8, 0x8595, 0x8566, 0x853a, 0x8511},
      {0xf97b, 0xf944, 0xf90a, 0xf8cc, 0xf889, 0xf841, 0xf7f4, 0xf7a1, 0xf746, 0xf6e4, 0xf679, 0xf604, 0xf583, 0xf4f5, 0xf457, 0xf3a8, 0xf2e3, 0xf205, 0xf109, 0xefe9, 0xee9d, 0xed1b, 0xeb56, 0xe93d, 0xe6ba, 0xe3b1, 0xdfff, 0xdb7d, 0xd604, 0xcf80, 0xc80a, 0xbfff, 0xb7f4, 0xb07e, 0xa9fb, 0xa482, 0x9fff, 0x9c4e, 0x9945, 0x96c2, 0x94a9, 0x92e3, 0x9161, 0x9015, 0x8ef5, 0x8df9, 0x8d1b, 0x8c57, 0x8ba7, 0x8b0a, 0x8a7b, 0x89fb, 0x8985, 0x891a, 0x88b8, 0x885e, 0x880a, 0x87bd, 0x8775, 0x8733, 0x86f4, 0x86ba, 0x8683, 0x8650},
      {0xf835, 0xf7f4, 0xf7af, 0xf765, 0xf716, 0xf6c1, 0xf666, 0xf604, 0xf599, 0xf526, 0xf4a8, 0xf41f, 0xf389, 0xf2e3, 0xf22c, 0xf161, 0xf07e, 0xef80, 0xee61, 0xed1b, 0xeba7, 0xe9fa, 0xe80a, 0xe5c7, 0xe320, 0xdfff, 0xdc4e, 0xd7f4, 0xd2e3, 0xcd1b, 0xc6ba, 0xbfff, 0xb945, 0xb2e3, 0xad1b, 0xa80a, 0xa3b1, 0x9fff, 0x9cdf, 0x9a37, 0x97f4, 0x9604, 0x9458, 0x92e3, 0x919e, 0x907f, 0x8f80, 0x8e9e, 0x8dd2, 0x8d1b, 0x8c76, 0x8bdf, 0x8b56, 0x8ad9, 0x8a65, 0x89fb, 0x8998, 0x893d, 0x88e8, 0x8899, 0x884f, 0x880a, 0x87ca, 0x878d},
      {0xf6f3, 0xf6a8, 0xf659, 0xf604, 0xf5a9, 0xf548, 0xf4df, 0xf46f, 0xf3f5, 0xf372, 0xf2e3, 0xf247, 0xf19d, 0xf0e3, 0xf015, 0xef31, 0xee35, 0xed1b, 0xebdf, 0xea7b, 0xe8e8, 0xe71d, 0xe510, 0xe2b5, 0xdfff, 0xdcde, 0xd945, 0xd526, 0xd07e, 0xcb56, 0xc5c7, 0xbfff, 0xba37, 0xb4a9, 0xaf80, 0xaad8, 0xa6ba, 0xa320, 0x9fff, 0x9d49, 0x9aee, 0x98e2, 0x9717, 0x9583, 0x941f, 0x92e3, 0x91ca, 0x90cd, 0x8fea, 0x8f1c, 0x8e61, 0x8db7, 0x8d1b, 0x8c8d, 0x8c09, 0x8b90, 0x8b1f, 0x8ab7, 0x8a55, 0x89fb, 0x89a6, 0x8956, 0x890c, 0x88c6},
      {0xf5b5, 0xf561, 0xf508, 0xf4a8, 0xf443, 0xf3d6, 0xf361, 0xf2e3, 0xf25c, 0xf1c9, 0xf12b, 0xf07e, 0xefc2, 0xeef5, 0xee13, 0xed1b, 0xec09, 0xead8, 0xe985, 0xe80a, 0xe661, 0xe481, 0xe264, 0xdfff, 0xdd49, 0xda37, 0xd6c2, 0xd2e3, 0xce9d, 0xc9fa, 0xc510, 0xbfff, 0xbaee, 0xb604, 0xb161, 0xad1b, 0xa93d, 0xa5c7, 0xa2b6, 0x9fff, 0x9d9b, 0x9b7d, 0x999e, 0x97f4, 0x9679, 0x9526, 0x93f6, 0x92e3, 0x91eb, 0x910a, 0x903c, 0x8f80, 0x8ed4, 0x8e35, 0x8da3, 0x8d1b, 0x8c9e, 0x8c29, 0x8bbc, 0x8b56, 0x8af7, 0x8a9e, 0x8a4a, 0x89fb},
      {0xf47c, 0xf41f, 0xf3bc, 0xf353, 0xf2e3, 0xf26b, 0xf1eb, 0xf161, 0xf0cd, 0xf02d, 0xef80, 0xeec5, 0xedf9, 0xed1b, 0xec29, 0xeb1f, 0xe9fa, 0xe8b8, 0xe753, 0xe5c7, 0xe40f, 0xe224, 0xdfff, 0xdd9a, 0xdaee, 0xd7f4, 0xd4a8, 0xd109, 0xcd1b, 0xc8e8, 0xc481, 0xbfff, 0xbb7d, 0xb716, 0xb2e3, 0xaef5, 0xab56, 0xa80a, 0xa510, 0xa264, 0x9fff, 0x9ddb, 0x9bf0, 0x9a37, 0x98ab, 0x9747, 0x9604, 0x94e0, 0x93d6, 0x92e3, 0x9206, 0x913a, 0x907f, 0x8fd2, 0x8f32, 0x8e9e, 0x8e14, 0x8d93, 0x8d1b, 0x8cab, 0x8c42, 0x8bdf, 0x8b83, 0x8b2b},
      {0xf348, 0xf2e3, 0xf278, 0xf205, 0xf18b, 0xf109, 0xf07e, 0xefe9, 0xef49, 0xee9d, 0xede4, 0xed1b, 0xec42, 0xeb56, 0xea55, 0xe93d, 0xe80a, 0xe6ba, 0xe548, 0xe3b1, 0xe1ef, 0xdfff, 0xdddb, 0xdb7d, 0xd8e1, 0xd604, 0xd2e3, 0xcf80, 0xcbdf, 0xc80a, 0xc40f, 0xbfff, 0xbbf0, 0xb7f4, 0xb41f, 0xb07e, 0xad1b, 0xa9fb, 0xa71d, 0xa482, 0xa224, 0x9fff, 0x9e0f, 0x9c4e, 0x9ab7, 0x9945, 0x97f4, 0x96c2, 0x95a9, 0x94a9, 0x93bd, 0x92e3, 0x921b, 0x9161, 0x90b5, 0x9015, 0x8f80, 0x8ef5, 0x8e73, 0x8df9, 0x8d87, 0x8d1b, 0x8cb6, 0x8c57},
      {0xf21b, 0xf1ad, 0xf13a, 0xf0bf, 0xf03c, 0xefb0, 0xef1c, 0xee7c, 0xedd2, 0xed1b, 0xec56, 0xeb82, 0xea9d, 0xe9a6, 0xe899, 0xe775, 0xe637, 0xe4dd, 0xe362, 0xe1c4, 0xdfff, 0xde0f, 0xdbf0, 0xd99e, 0xd716, 0xd458, 0xd161, 0xce35, 0xcad8, 0xc753, 0xc3b1, 0xbfff, 0xbc4e, 0xb8ab, 0xb526, 0xb1c9, 0xae9d, 0xaba7, 0xa8e8, 0xa661, 0xa40f, 0xa1f0, 0x9fff, 0x9e3a, 0x9c9c, 0x9b22, 0x99c7, 0x9889, 0x9766, 0x9659, 0x9561, 0x947c, 0x93a8, 0x92e3, 0x922c, 0x9182, 0x90e3, 0x904e, 0x8fc3, 0x8f40, 0x8ec5, 0x8e51, 0x8de4, 0x8d7d},
      {0xf0f3, 0xf07e, 0xf003, 0xef80, 0xeef5, 0xee61, 0xedc3, 0xed1b, 0xec67, 0xeba7, 0xead8, 0xe9fa, 0xe90b, 0xe80a, 0xe6f4, 0xe5c7, 0xe481, 0xe320, 0xe1a0, 0xdfff, 0xde3a, 0xdc4e, 0xda37, 0xd7f4, 0xd583, 0xd2e3, 0xd015, 0xcd1b, 0xc9fa, 0xc6ba, 0xc362, 0xbfff, 0xbc9c, 0xb945, 0xb604, 0xb2e3, 0xafe9, 0xad1b, 0xaa7b, 0xa80a, 0xa5c7, 0xa3b1, 0xa1c5, 0x9fff, 0x9e5e, 0x9cdf, 0x9b7d, 0x9a37, 0x990b, 0x97f4, 0x96f3, 0x9604, 0x9526, 0x9458, 0x9397, 0x92e3, 0x923b, 0x919e, 0x910a, 0x907f, 0x8ffc, 0x8f80, 0x8f0c, 0x8e9e},
      {0xefd1, 0xef56, 0xeed4, 0xee49, 0xedb7, 0xed1b, 0xec76, 0xebc5, 0xeb09, 0xea40, 0xe969, 0xe883, 0xe78c, 0xe683, 0xe566, 0xe432, 0xe2e7, 0xe181, 0xdfff, 0xde5e, 0xdc9c, 0xdab6, 0xd8ab, 0xd679, 0xd41f, 0xd19d, 0xcef5, 0xcc29, 0xc93d, 0xc637, 0xc320, 0xbfff, 0xbcdf, 0xb9c7, 0xb6c2, 0xb3d6, 0xb10a, 0xae61, 0xabdf, 0xa985, 0xa753, 0xa548, 0xa363, 0xa1a0, 0x9fff, 0x9e7d, 0x9d18, 0x9bcc, 0x9a99, 0x997b, 0x9872, 0x977b, 0x9695, 0x95be, 0x94f5, 0x9439, 0x9389, 0x92e3, 0x9248, 0x91b5, 0x912b, 0x90a8, 0x902d, 0x8fb8},
      {0xeeb7, 0xee35, 0xedac, 0xed1b, 0xec82, 0xebdf, 0xeb32, 0xea7b, 0xe9b8, 0xe8e8, 0xe80a, 0xe71d, 0xe620, 0xe510, 0xe3ed, 0xe2b5, 0xe167, 0xdfff, 0xde7d, 0xdcde, 0xdb21, 0xd945, 0xd746, 0xd526, 0xd2e3, 0xd07e, 0xcdf9, 0xcb56, 0xc899, 0xc5c7, 0xc2e7, 0xbfff, 0xbd17, 0xba37, 0xb766, 0xb4a9, 0xb205, 0xaf80, 0xad1b, 0xaad8, 0xa8b8, 0xa6ba, 0xa4dd, 0xa320, 0xa182, 0x9fff, 0x9e98, 0x9d49, 0x9c11, 0x9aee, 0x99df, 0x98e2, 0x97f4, 0x9717, 0x9647, 0x9583, 0x94cc, 0x941f, 0x937d, 0x92e3, 0x9253, 0x91ca, 0x9148, 0x90cd},
      {0xeda3, 0xed1b, 0xec8c, 0xebf5, 0xeb56, 0xeaad, 0xe9fa, 0xe93d, 0xe873, 0xe79d, 0xe6ba, 0xe5c7, 0xe4c5, 0xe3b1, 0xe28a, 0xe14f, 0xdfff, 0xde98, 0xdd17, 0xdb7d, 0xd9c7, 0xd7f4, 0xd604, 0xd3f6, 0xd1c9, 0xcf80, 0xcd1b, 0xca9d, 0xc80a, 0xc566, 0xc2b6, 0xbfff, 0xbd49, 0xba99, 0xb7f4, 0xb561, 0xb2e3, 0xb07e, 0xae35, 0xac09, 0xa9fb, 0xa80a, 0xa638, 0xa482, 0xa2e7, 0xa167, 0x9fff, 0x9eaf, 0x9d74, 0x9c4e, 0x9b3a, 0x9a37, 0x9945, 0x9861, 0x978b, 0x96c2, 0x9604, 0x9551, 0x94a9, 0x9409, 0x9372, 0x92e3, 0x925c, 0x91db},
      {0xec95, 0xec09, 0xeb74, 0xead8, 0xea33, 0xe985, 0xe8cd, 0xe80a, 0xe73b, 0xe661, 0xe578, 0xe481, 0xe37b, 0xe264, 0xe13b, 0xdfff, 0xdeaf, 0xdd49, 0xdbcc, 0xda37, 0xd889, 0xd6c2, 0xd4e0, 0xd2e3, 0xd0cd, 0xce9d, 0xcc56, 0xc9fa, 0xc78c, 0xc510, 0xc28a, 0xbfff, 0xbd74, 0xbaee, 0xb872, 0xb604, 0xb3a8, 0xb161, 0xaf32, 0xad1b, 0xab1f, 0xa93d, 0xa775, 0xa5c7, 0xa433, 0xa2b6, 0xa150, 0x9fff, 0x9ec3, 0x9d9b, 0x9c84, 0x9b7d, 0x9a86, 0x999e, 0x98c3, 0x97f4, 0x9732, 0x9679, 0x95cb, 0x9526, 0x948a, 0x93f6, 0x9369, 0x92e3},
      {0xeb8f, 0xeafe, 0xea65, 0xe9c4, 0xe91a, 0xe867, 0xe7aa, 0xe6e3, 0xe610, 0xe531, 0xe445, 0xe34b, 0xe242, 0xe129, 0xdfff, 0xdec3, 0xdd74, 0xdc11, 0xda99, 0xd90a, 0xd765, 0xd5a9, 0xd3d6, 0xd1eb, 0xcfe9, 0xcdd2, 0xcba7, 0xc96a, 0xc71d, 0xc4c5, 0xc264, 0xbfff, 0xbd9a, 0xbb3a, 0xb8e1, 0xb695, 0xb458, 0xb22c, 0xb015, 0xae14, 0xac29, 0xaa55, 0xa899, 0xa6f4, 0xa566, 0xa3ee, 0xa28a, 0xa13b, 0x9fff, 0x9ed5, 0x9dbd, 0x9cb4, 0x9bb9, 0x9acd, 0x99ee, 0x991c, 0x9854, 0x9797, 0x96e4, 0x963b, 0x959a, 0x9501, 0x946f, 0x93e5},
      {0xea90, 0xe9fa, 0xe95d, 0xe8b8, 0xe80a, 0xe753, 0xe692, 0xe5c7, 0xe4f1, 0xe40f, 0xe320, 0xe224, 0xe119, 0xdfff, 0xded5, 0xdd9a, 0xdc4e, 0xdaee, 0xd97b, 0xd7f4, 0xd659, 0xd4a8, 0xd2e3, 0xd109, 0xcf1c, 0xcd1b, 0xcb09, 0xc8e8, 0xc6ba, 0xc481, 0xc242, 0xbfff, 0xbdbc, 0xbb7d, 0xb945, 0xb716, 0xb4f5, 0xb2e3, 0xb0e3, 0xaef5, 0xad1b, 0xab56, 0xa9a6, 0xa80a, 0xa683, 0xa510, 0xa3b1, 0xa264, 0xa129, 0x9fff, 0x9ee6, 0x9ddb, 0x9cdf, 0x9bf0, 0x9b0e, 0x9a37, 0x996c, 0x98ab, 0x97f4, 0x9747, 0x96a1, 0x9604, 0x956e, 0x94e0},
      {0xe998, 0xe8fe, 0xe85d, 0xe7b5, 0xe703, 0xe649, 0xe585, 0xe4b7, 0xe3dd, 0xe2f9, 0xe208, 0xe10b, 0xdfff, 0xdee5, 0xddbc, 0xdc83, 0xdb3a, 0xd9df, 0xd872, 0xd6f3, 0xd561, 0xd3bc, 0xd205, 0xd03c, 0xce61, 0xcc76, 0xca7b, 0xc873, 0xc661, 0xc445, 0xc224, 0xbfff, 0xbddb, 0xbbb9, 0xb99e, 0xb78b, 0xb583, 0xb389, 0xb19d, 0xafc3, 0xadf9, 0xac42, 0xaa9e, 0xa90c, 0xa78d, 0xa620, 0xa4c5, 0xa37b, 0xa242, 0xa119, 0x9fff, 0x9ef4, 0x9df6, 0x9d06, 0x9c21, 0x9b48, 0x9a7a, 0x99b6, 0x98fb, 0x984a, 0x97a1, 0x9700, 0x9667, 0x95d4},
      {0xe8a7, 0xe80a, 0xe766, 0xe6ba, 0xe605, 0xe548, 0xe481, 0xe3b1, 0xe2d6, 0xe1ef, 0xe0fd, 0xdfff, 0xdef4, 0xdddb, 0xdcb3, 0xdb7d, 0xda37, 0xd8e1, 0xd77b, 0xd604, 0xd47c, 0xd2e3, 0xd13a, 0xcf80, 0xcdb7, 0xcbdf, 0xc9fa, 0xc80a, 0xc610, 0xc40f, 0xc208, 0xbfff, 0xbdf6, 0xbbf0, 0xb9ee, 0xb7f4, 0xb604, 0xb41f, 0xb248, 0xb07e, 0xaec5, 0xad1b, 0xab82, 0xa9fb, 0xa884, 0xa71d, 0xa5c7, 0xa482, 0xa34b, 0xa224, 0xa10b, 0x9fff, 0x9f01, 0x9e0f, 0x9d29, 0x9c4e, 0x9b7d, 0x9ab7, 0x99f9, 0x9945, 0x9899, 0x97f4, 0x9758, 0x96c2},
      {0xe7bd, 0xe71d, 0xe676, 0xe5c7, 0xe510, 0xe451, 0xe388, 0xe2b5, 0xe1d9, 0xe0f2, 0xdfff, 0xdf01, 0xddf6, 0xdcde, 0xdbb9, 0xda86, 0xd945, 0xd7f4, 0xd695, 0xd526, 0xd3a8, 0xd21b, 0xd07e, 0xced4, 0xcd1b, 0xcb56, 0xc985, 0xc7aa, 0xc5c7, 0xc3de, 0xc1f0, 0xbfff, 0xbe0f, 0xbc21, 0xba37, 0xb854, 0xb679, 0xb4a9, 0xb2e3, 0xb12b, 0xaf80, 0xade4, 0xac57, 0xaad8, 0xa96a, 0xa80a, 0xa6ba, 0xa578, 0xa445, 0xa320, 0xa208, 0xa0fe, 0x9fff, 0x9f0d, 0x9e26, 0x9d49, 0x9c77, 0x9bae, 0x9aee, 0x9a37, 0x9989, 0x98e2, 0x9842, 0x97a9},
      {0xe6da, 0xe637, 0xe58e, 0xe4dd, 0xe424, 0xe362, 0xe298, 0xe1c4, 0xe0e7, 0xdfff, 0xdf0d, 0xde0f, 0xdd05, 0xdbf0, 0xdacd, 0xd99e, 0xd861, 0xd716, 0xd5be, 0xd458, 0xd2e3, 0xd161, 0xcfd1, 0xce35, 0xcc8c, 0xcad8, 0xc91a, 0xc753, 0xc585, 0xc3b1, 0xc1d9, 0xbfff, 0xbe25, 0xbc4e, 0xba7a, 0xb8ab, 0xb6e4, 0xb526, 0xb372, 0xb1c9, 0xb02d, 0xae9d, 0xad1b, 0xaba7, 0xaa41, 0xa8e8, 0xa79e, 0xa661, 0xa531, 0xa40f, 0xa2f9, 0xa1f0, 0xa0f2, 0x9fff, 0x9f18, 0x9e3a, 0x9d67, 0x9c9c, 0x9bdb, 0x9b22, 0x9a71, 0x99c7, 0x9925, 0x9889},
      {0xe5fd, 0xe559, 0xe4ad, 0xe3fa, 0xe340, 0xe27d, 0xe1b1, 0xe0dd, 0xdfff, 0xdf17, 0xde25, 0xdd29, 0xdc21, 0xdb0d, 0xd9ee, 0xd8c3, 0xd78b, 0xd646, 0xd4f5, 0xd397, 0xd22c, 0xd0b5, 0xcf32, 0xcda3, 0xcc09, 0xca65, 0xc8b8, 0xc703, 0xc548, 0xc388, 0xc1c4, 0xbfff, 0xbe3a, 0xbc77, 0xbab6, 0xb8fb, 0xb747, 0xb59a, 0xb3f6, 0xb25c, 0xb0cd, 0xaf4a, 0xadd2, 0xac67, 0xab09, 0xa9b8, 0xa874, 0xa73c, 0xa610, 0xa4f1, 0xa3de, 0xa2d6, 0xa1d9, 0xa0e7, 0x9fff, 0x9f21, 0x9e4d, 0x9d82, 0x9cbf, 0x9c04, 0x9b51, 0x9aa6, 0x9a01, 0x9964},
      {0xe528, 0xe481, 0xe3d4, 0xe320, 0xe264, 0xe1a0, 0xe0d4, 0xdfff, 0xdf21, 0xde3a, 0xdd49, 0xdc4e, 0xdb48, 0xda37, 0xd91b, 0xd7f4, 0xd6c2, 0xd583, 0xd439, 0xd2e3, 0xd182, 0xd015, 0xce9d, 0xcd1b, 0xcb8f, 0xc9fa, 0xc85e, 0xc6ba, 0xc510, 0xc362, 0xc1b2, 0xbfff, 0xbe4d, 0xbc9c, 0xbaee, 0xb945, 0xb7a1, 0xb604, 0xb46f, 0xb2e3, 0xb161, 0xafe9, 0xae7d, 0xad1b, 0xabc5, 0xaa7b, 0xa93d, 0xa80a, 0xa6e3, 0xa5c7, 0xa4b7, 0xa3b1, 0xa2b6, 0xa1c5, 0xa0dd, 0x9fff, 0x9f2b, 0x9e5e, 0x9d9b, 0x9cdf, 0x9c2a, 0x9b7d, 0x9ad7, 0x9a37},
      {0xe458, 0xe3b1, 0xe302, 0xe24d, 0xe190, 0xe0cc, 0xdfff, 0xdf2a, 0xde4d, 0xdd66, 0xdc76, 0xdb7d, 0xda7a, 0xd96c, 0xd854, 0xd731, 0xd604, 0xd4cc, 0xd389, 0xd23b, 0xd0e3, 0xcf80, 0xce13, 0xcc9e, 0xcb1f, 0xc998, 0xc80a, 0xc676, 0xc4dd, 0xc340, 0xc1a0, 0xbfff, 0xbe5e, 0xbcbf, 0xbb22, 0xb988, 0xb7f4, 0xb666, 0xb4e0, 0xb361, 0xb1eb, 0xb07e, 0xaf1c, 0xadc4, 0xac76, 0xab33, 0xa9fb, 0xa8cd, 0xa7ab, 0xa693, 0xa585, 0xa482, 0xa388, 0xa298, 0xa1b2, 0xa0d4, 0x9fff, 0x9f33, 0x9e6e, 0x9db2, 0x9cfc, 0x9c4e, 0x9ba6, 0x9b05},
      {0xe390, 0xe2e7, 0xe237, 0xe181, 0xe0c4, 0xdfff, 0xdf33, 0xde5e, 0xdd81, 0xdc9c, 0xdbae, 0xdab6, 0xd9b6, 0xd8ab, 0xd797, 0xd679, 0xd551, 0xd41f, 0xd2e3, 0xd19d, 0xd04e, 0xcef5, 0xcd93, 0xcc29, 0xcab6, 0xc93d, 0xc7bd, 0xc637, 0xc4ad, 0xc320, 0xc190, 0xbfff, 0xbe6e, 0xbcdf, 0xbb51, 0xb9c7, 0xb842, 0xb6c2, 0xb548, 0xb3d6, 0xb26b, 0xb10a, 0xafb1, 0xae61, 0xad1b, 0xabdf, 0xaaad, 0xa985, 0xa867, 0xa753, 0xa649, 0xa548, 0xa451, 0xa363, 0xa27d, 0xa1a0, 0xa0cc, 0x9fff, 0x9f3b, 0x9e7d, 0x9dc7, 0x9d18, 0x9c6f, 0x9bcc},
      {0xe2cd, 0xe224, 0xe173, 0xe0bd, 0xdfff, 0xdf3a, 0xde6e, 0xdd9a, 0xdcbe, 0xdbda, 0xdaee, 0xd9f9, 0xd8fb, 0xd7f4, 0xd6e4, 0xd5cb, 0xd4a8, 0xd37d, 0xd248, 0xd109, 0xcfc2, 0xce73, 0xcd1b, 0xcbbc, 0xca55, 0xc8e8, 0xc775, 0xc5fd, 0xc481, 0xc302, 0xc181, 0xbfff, 0xbe7d, 0xbcfc, 0xbb7d, 0xba01, 0xb889, 0xb716, 0xb5a9, 0xb443, 0xb2e3, 0xb18c, 0xb03c, 0xaef5, 0xadb7, 0xac82, 0xab56, 0xaa34, 0xa91a, 0xa80a, 0xa703, 0xa605, 0xa510, 0xa424, 0xa340, 0xa264, 0xa190, 0xa0c4, 0x9fff, 0x9f42, 0x9e8b, 0x9ddb, 0x9d31, 0x9c8e},
      {0xe211, 0xe167, 0xe0b6, 0xdfff, 0xdf42, 0xde7d, 0xddb1, 0xdcde, 0xdc04, 0xdb21, 0xda37, 0xd945, 0xd84a, 0xd746, 0xd63b, 0xd526, 0xd409, 0xd2e3, 0xd1b5, 0xd07e, 0xcf40, 0xcdf9, 0xccab, 0xcb56, 0xc9fa, 0xc899, 0xc732, 0xc5c7, 0xc459, 0xc2e7, 0xc174, 0xbfff, 0xbe8b, 0xbd17, 0xbba6, 0xba37, 0xb8cc, 0xb766, 0xb604, 0xb4a9, 0xb353, 0xb205, 0xb0bf, 0xaf80, 0xae4a, 0xad1b, 0xabf6, 0xaad8, 0xa9c4, 0xa8b8, 0xa7b5, 0xa6ba, 0xa5c7, 0xa4dd, 0xa3fb, 0xa320, 0xa24d, 0xa182, 0xa0bd, 0x9fff, 0x9f48, 0x9e98, 0x9ded, 0x9d49},
      {0xe15b, 0xe0b0, 0xdfff, 0xdf48, 0xde8b, 0xddc7, 0xdcfc, 0xdc2a, 0xdb51, 0xda70, 0xd988, 0xd898, 0xd7a1, 0xd6a1, 0xd59a, 0xd48a, 0xd372, 0xd252, 0xd12b, 0xcffb, 0xcec5, 0xcd87, 0xcc42, 0xcaf7, 0xc9a6, 0xc84f, 0xc6f4, 0xc595, 0xc432, 0xc2cd, 0xc167, 0xbfff, 0xbe98, 0xbd31, 0xbbcc, 0xba6a, 0xb90a, 0xb7af, 0xb659, 0xb508, 0xb3bd, 0xb278, 0xb13a, 0xb003, 0xaed4, 0xadac, 0xac8c, 0xab75, 0xaa65, 0xa95d, 0xa85e, 0xa766, 0xa676, 0xa58e, 0xa4ae, 0xa3d4, 0xa303, 0xa238, 0xa174, 0xa0b6, 0x9fff, 0x9f4f, 0x9ea4, 0x9dff},
      {0xe0aa, 0xdfff, 0xdf4e, 0xde98, 0xdddb, 0xdd17, 0xdc4e, 0xdb7d, 0xdaa5, 0xd9c7, 0xd8e1, 0xd7f4, 0xd700, 0xd604, 0xd501, 0xd3f6, 0xd2e3, 0xd1c9, 0xd0a8, 0xcf80, 0xce51, 0xcd1b, 0xcbdf, 0xca9d, 0xc956, 0xc80a, 0xc6ba, 0xc566, 0xc40f, 0xc2b6, 0xc15b, 0xbfff, 0xbea4, 0xbd49, 0xbbf0, 0xba99, 0xb945, 0xb7f4, 0xb6a8, 0xb561, 0xb41f, 0xb2e3, 0xb1ae, 0xb07e, 0xaf56, 0xae35, 0xad1b, 0xac09, 0xaafe, 0xa9fb, 0xa8ff, 0xa80a, 0xa71d, 0xa638, 0xa559, 0xa482, 0xa3b1, 0xa2e7, 0xa224, 0xa167, 0xa0b0, 0x9fff, 0x9f54, 0x9eaf},
      {0xdfff, 0xdf54, 0xdea4, 0xdded, 0xdd31, 0xdc6f, 0xdba6, 0xdad7, 0xda01, 0xd925, 0xd842, 0xd757, 0xd666, 0xd56e, 0xd46f, 0xd369, 0xd25c, 0xd148, 0xd02d, 0xcf0b, 0xcde4, 0xccb6, 0xcb82, 0xca49, 0xc90c, 0xc7c9, 0xc683, 0xc53a, 0xc3ed, 0xc29f, 0xc150, 0xbfff, 0xbeaf, 0xbd5f, 0xbc11, 0xbac5, 0xb97b, 0xb835, 0xb6f3, 0xb5b5, 0xb47c, 0xb349, 0xb21b, 0xb0f3, 0xafd2, 0xaeb7, 0xada3, 0xac96, 0xab8f, 0xaa90, 0xa998, 0xa8a7, 0xa7bd, 0xa6da, 0xa5fd, 0xa528, 0xa459, 0xa390, 0xa2ce, 0xa211, 0xa15b, 0xa0aa, 0x9fff, 0x9f5a},
      {0xdf5a, 0xdeaf, 0xddff, 0xdd49, 0xdc8d, 0xdbcc, 0xdb05, 0xda37, 0xd963, 0xd889, 0xd7a9, 0xd6c2, 0xd5d4, 0xd4e0, 0xd3e5, 0xd2e3, 0xd1db, 0xd0cd, 0xcfb8, 0xce9d, 0xcd7d, 0xcc56, 0xcb2b, 0xc9fa, 0xc8c5, 0xc78c, 0xc650, 0xc510, 0xc3ce, 0xc28a, 0xc145, 0xbfff, 0xbeb9, 0xbd74, 0xbc30, 0xbaee, 0xb9af, 0xb872, 0xb739, 0xb604, 0xb4d4, 0xb3a8, 0xb282, 0xb161, 0xb046, 0xaf32, 0xae23, 0xad1b, 0xac1a, 0xab1f, 0xaa2b, 0xa93d, 0xa856, 0xa775, 0xa69b, 0xa5c7, 0xa4fa, 0xa433, 0xa371, 0xa2b6, 0xa200, 0xa150, 0xa0a5, 0x9fff}
    };
    
    uint16_t atan2(uint8_t x, uint8_t y){
      return atan_table[(x>>2) & 0x3F][(y>>2) & 0x3F];
    }
    */
    
    /*
    uint8_t atan2(uint8_t x, uint8_t y){
      return atan_table[(x>>3) & 0x1F][(y>>3) & 0x1F];
    }
    */

    Спасибо, буду иметь ввиду

  22. 2 минуты назад, des00 сказал:

    ну и чем это вам мешает? atan2 это положить вектор на ось декартовых координат X. Накопленный угол за шаги поворота - ваше искомое. Для этого надо просто изменить входные аргументы алгоритма.

    Спасибо, обдумаю этот момент

×
×
  • Создать...