Hard and Soft

Here soft for Raydel Abreu Espinet (CM2ESP) and for all radio amateurs —  LPPT Decoder and 72K and 80K sample bin files

Warning if your computer is less than 1 GB of RAM the LRPToffLineDecoder may run very slowly!

LRPToffLineDecoder_2014.09.01.0006.zip —  this decoder undestands RAW files.

LRPToffLineDecoder_2014.09.17.0007.zip —  Leaves a little less holes in the image.

LRPToffLineDecoder_2014.09.19.0009.zip —  Visualization of the constellation for RAW files.

LRPToffLineDecoder_2014.09.22.0010.zip — the latest version of the «Meteor-M N2» LRPT decoder.  Code optimizing.

Meteor_LRPT_001_Enrico.raw — the sample of 72K 3bit-soft bin file ( file provided by «Enrico Gobbetti» <iw2agj@gmail.com>).

Meteor-M-N2_LRPT_2014-8-8-10-33-11-834_raw.dat2014-8-8-10-51-2-110.s — the sample of 72K 8bit-soft bin file.

Meteor-M-N2_LRPT INT_2014-8-11-9-33-44-428_raw.dat2014-8-11-9-52-5-204.s — the sample of 80K 8bit-soft bin file.

Especially for Jerry Dahl and all who are interested I am  posting a photo of the antenna which is the radio reception of images from the gallery. OLYMPUS DIGITAL CAMERA     CADU

Jerry,  it is was my mistake. I gave you not CVCDU file. I gave you the CADU file with OR-ed CVCDU.  And true sync is 1ACFFC1D, of course.  Beginning of the file is very noisy and analyze better indented 100 SYNC CADU1

Hi Jerry, bottomly there is the comment about the TimeStamp. At this point, the Russian LRPT developers were too lazy to comply with the standard completely. ParcialPacketStructure-1024x656

Attention!!! There is error in BIS-MW (adopter MSU-MR to LRPT). 2-bits Sequence Flag in the CCSDS primary header is faulty. Device BIS-MW instead of the flag last segment  («10») erroneously generates the flag continuation segment («00»).

Image compression algorithm for JPEG for equipment BIS-MW (adopter MSU-MR to LRPT)

This algorithm is designed in accordance with the documents:

  1. Digital Compression and Coding of Continuous-tone Still Images, ISO/IEC 10918-1:1 1993(E);
  2. LRPT Reference Compressor and Decompressor,Ref. MO-TN-ESA-SY-0124, Issue 1.1, 15 April 2000.

JPEG compression is subjected to a minimum coding unit (MCU), which is an element of 8 pixels x 8 pixels. MCU data width of 8 bits / pixel.
For Meteor-M N1 — Line scanner is 1536 pixels, thus the scan (8 lines) is 192 MCU.                      For Meteor-M N2 — Line scanner is 1568 pixels, thus the scan (8 lines) is 196 MCU.

1. Level shift.
Data is converted into 8 bit signed representation by subtracting 128 from each element MCU.

2. Discrete Cosine Transform (DCT).
DCT is applied to each minimum coding unit (MCU). As a result of the conversion element MCU is a table 8×8 of a factor DCT.

3. Quantization.
Applied initial quantization table (HTK) is a standard according to ISO / IEC 10918-1.


This algorithm uses the method of calculating working quantization table (PTK), depending on the degree of image compression F:



PTK — Worksheet quantization table,
F — compression ratio,
HTK — initial quantization table.

The compression ratio is variable depending on the quality factor Q. The Q value factor is transferred to the segment header of partial package equipment BIS-MW of satellite «Meteor-M». Q can be set from 20 to 100.


Each element of MCU divided by the number of the working quantization table, and the result rounded to the nearest integer, with a minimum value is 1.


S — MCU DCT coefficients,
PTK — Worksheet quantization table,
Sq — MCU after quantization.

4. Entropy coding.
4.1 Zig-zag permutation.
64 the number of MCU line up one after the other with a zigzag ordering (Figure 1)

figure_1     <- Figure 1

 4.2. RLE and Huffman method.
Non-zero transform coefficients are compressed using Huffman.
4.2.1. The first of these properties (coefficient of DC) is processed separately from other properties (AC coefficients). For the first partial package MCU itself is encoded coefficient DC, and for the next 11 (for N1) or 13 (for N2) encoded difference between the current and previous MCU.


DC coefficient is encoded as follows:
According to Table F.1 of the ISO / IEC 10918-1 (Table 1) is the category number and the column number in which it is starting from zero.

table_1  <-Table 1.

Next, the table K.3 of ISO / IEC 10918-1 (Table 2) is determined codeword. Then, the codeword is attributed column number as R-bit numbers, where R is a category of a number.

table_2 <- Table.2

4.2.2. Coding of AC coefficients.
Compressing 63 AC coefficients using RLE encoding combined with Huffman. In this case, we obtain a pair of type (omit the number), where the «miss» is counter to skip zeros, and «number» — the value to be put in the next cell. According to Table F.2 of the ISO / IEC 10918-1 (Table 3) define the category (R) and the column number C (counting starts with zero column). For example, for the pair (1, -2) R = 2, C = 1.

table_3  <- Table 3

According to Table K.5 of ISO / IEC 10918-1 (in Table 4 shows part K.5) define the codeword where Size corresponds to the category number.
In our case, for Run = 1, R = Size = 2 the codeword equals 11011

table_4 <- Table 4


Then, the codeword is attributed column number as R-bit numbers, where R — the category number. For C = 1, we get 01.
So the pair (1, -2) encoded by the word: 1101101.
At the end of the sequence is a pair (0,0), which corresponds to the code 1010 (EOB — End Of Block).
ZRL encodes 15 consecutive zeros as their number exceeds 15.

5. Alignment of information.
Partial packet (user data) is an even number of bytes, so after 12 MCU encoding information is supplemented by bits «1» to parity bytes in the packet.

The End.



Hard and Soft: 84 комментария

  1. Jerry Dahl

    Thanks for the info. I am now successfully decoding the CADU file. The VCDU Primary Header, VCDI Data Unit Zone and Packet Primary Header is correct. No surprises.
    I noticed that the packet sequence flag is used and I’d guess to make it easier to decode the images. For APID’s 64, 65 and 66 uses sequence flags 0 and 1.
    Are the images compressed? How can I save the application data in the packets to a disk file for viewing? Can I simply write a fixed jpeg header and append packet data depending on the sequence flag? What do you suggest? Thanks for your help.
    Jerry Dahl

  2. Jerry Dahl

    Thanks again.
    I want to decode the jpeg images in my decoder but the Meteor image Segment Header is different than that listed in the Eumetsat HRPT/LRPT Direct Broadcast Services Specification. The Segment Header should be 24-bits (QFM+Q Factor) but the Meteor Header is 48-bits. Also I was expecting a 12-bit Scan Header (Qt+DC+AC). Can you provide instructions for decoding the image packets? I have a real-time system where the demodulation, FEC, and CCSDS Packets are decoded in an FPGA.

  3. Jerry Dahl


    I can now successfully decode the CADU file that you sent and de-compress partial images on APID64-67. However, the image packets contains non-standard jpeg JPG0 markers (0xFFF0) that are reserved for JPEG Extensions. Because Extension markers are application specific, the decoder does not know how to handle them. There is no standard definition in the jpeg specification.

    Can you explain how the jpeg de-compressor should handle the jpeg extension markers? With this information, the decoder should be able to decode the Meteor M N2 LRPT in real-time, the same as LRIT and HRIT, and similar to the older APT.

    Thanks for your help,

    My Jpeg decoder does not know how to handle this application specific jpeg marker and the image de-compressor fails when it

  4. booinform@gmail.com Автор записи


    Unfortunately, I’m not an expert on JPEG and so the answer to this question I have is trouble. In my software I used the source code JPEG decompressor provided by LRPT developers. Therefore, the answer will not be fast. While I can not even imagine how I can help … I will try …


    1. ROBONUKA Автор записи

      At the moment there are any faults with the ftp. On this to fix the problem download may not be available.

      16.10.2014 9:00UTC — ftp corrected

  5. Hiroshi Yamazaki JR7HOV/1

    > timer schedule’s in SDRSharp
    Is there another plugin that starts and stop recoring with frequency?
    I use one receiver for NOAA and Meteor-M N2 with easyscanner plugin.

  6. Xv Qianqian

    Thank you for this work!
    I have a question:
    The «CVCDU Check Symbols» are generated without interleaving?
    Do you know how to form the «Code generator polynomial»?
    I’m looking forward for your replying.

      1. Xv Qianqian

        Hi, ROBONUKA,
        I have met the same problem as the guy. Is it true that MATLAB’s built-in RS encoder/decoder functions cannot be used to implement the CCSDS RS standard?
        Thank you in advance.

        > I am trying to decode some data using Matlab, which was
        > originally encoded using a CCSDS implementation of Reed
        > Solomon (255, 223). I think I have a problem when using
        > the ‘rsgenpoly’ function. According to Matlab it is
        > defined as (x-alpha^B)*(x-alpha^(B+1)) … (x-alpha^(B+N-K-
        > 1)) where N=255 and K=223, whereas for CCSDS is defined as
        > (x-alpha^(11*112))(x-alpha^(11*113))…(x-alpha^(11*143)).
        > I don’t know how to set the alpha and B values in Matlab
        > to get the correct CCSDS code generator polynomial.
        > Any ideas?

        There is no way to use rsgenpoly, because it only returns generator polynomials of the form (x-alpha^B)*(x-alpha^(B+1)) … (x-alpha^(B+N-K-1)), in which alpha is a root of the primitive polynomial used to generate the field. If you try setting beta = alpha^11, the CCSDS generator would have the form (x-beta^112)(x-beta^113) … (x-beta^143) which looks promising with B=112, except that beta — although a primitive element of the field — is *not* a root of the primitive polynomial.

        You don’t have to use rsgenpoly. MATLAB allows you to specify the generator polynomial coefficients yourself, and these are given in an annex of the CCSDS standard. If you try doing this, you will find that MATLAB complains that the CCSDS generator you supply must be of the form (x-alpha^B)*(x-alpha^(B+1)) … (x-alpha^(B+N-K-1)), even though the documentation for fec.rsenc makes no mention of this limitation.

        So, simply, MATLAB’s built-in RS encoder/decoder functions cannot be used to implement the CCSDS RS standard. You have to implement the algorithms yourself.

        1. ROBONUKA Автор записи

          I use a proprietary algorithm Reed-Solomon decoder written by my colleague at work and realized and optimized me on Delphi. I do not think that Matlab is not able to accept this CCSDS RS standard. And it would be reasonable to ask this in support of Matlab. I also want to say that the coder / decoder of Reed-Solomon does not change the values of the information part of the codeword of the Reed-Solomon. And, therefore, the Reed-Solomon decoding can be skipped if the signal was strong enough.

          1. Xv Qianqian

            Thank you.
            I do want to skip the Reed-Solomon decoding. As you said, our signal is strong enough, and RS-decoding is really time-consuming compared to other part of the algorithm.
            But its no harm to work this out. I agree with your idea that the MATLAB’s built-in RS encoder/decoder functions can be used to decode our code. I’ll try.
            Thanks again!

          2. Xv Qianqian

            Добрый день!
            Какие данные содержаются в пакете калибровочных данных (APID 70)? Как кодируется «ancillary data»?

        2. ROBONUKA Автор записи

          Добрый день,

          Вы спрашивали «Как кодируется “ancillary data”?»
          Вот что написано об этом в документации разработчика:
          В поле пользовательских данных расположены 50 байт служебной информации сканера.
          Блок служебной информации выбирается из первой строки получаемой от сканера при формировании полосы обрабатываемого изображения. Состав и структура служебной информации соответствуют протоколу № И-1133/03 от 22.03.05 по составу и структуре выходной информации МСУ-МР космического аппарата “Метеор-М”, утвержденному ФГУП “РНИИКП” и ФГУП “НПП ВНИИЭМ”.

          Имеется ввиду первые 50 байт из таблицы 4 на странице http://planet.iitp.ru/english/spacecraft/meteor_m_n2_structure_eng.htm

  7. Les Hamilton

    Hi Oleg,

    It would be really useful if you could add a few one-click buttons to LRPTofflineDecoder to create Channel-1, Channel-2, Channel-5 and RGB122 images.
    These are the most common options, and these buttons would save having to change the RGB values manually for each image.

    1. ROBONUKA Автор записи

      Ok Les, I’ll think about to add these buttons. I also want to remind you that it is possible to install any combination of channels as a combination of default. To do this, there is a setting in the ini-file rgb = xxx.bmp / xxx.jpg.

      For example:


  8. Василий

    Здравствуйте Олег.
    Не смог найти на сайте вашу почту. Есть вопросы по приему метеоров.
    Напишите мне пожалуйста.

  9. Василий

    1. Почему частота дискретизации входного файла должна быть 130 кГц?
    2. Что происходит с сигналом при преобразовании в RAW? Зачем нужен этот этап.

  10. ROBONUKA Автор записи

    1. Я не эксперт в LrptRx.exe, но мне кажется, что частота дискретизации в 130 кГц была выбрана как золотая середина между скоростью обработки и потерями в демодуляции. Я использую самодельный SDR приемник и частоту дискретизации 1800 кГц и собственную программу демодуляции.
    2. Этот этап называется демодуляция сигнала. У второго метеора используется QPSK модуляция, т.е. информация (2 бита) кодируются четырьмя фазами передаваемого сигнала 0,90,180 и 270 градусов. Вот на этапе демодуляции происходит обратный процесс по переводу фазы принятого сигнала в информацию представляемую битами. Ну, примерно так (в самом общем виде).

  11. Василий

    А формат Raw файла не подскажете? Или где почитать?
    Я к чему это все. Хочу понять как все это работает и написать плагин к SDR# который будет выдавать сразу raw файл для декодирования без промежуточных преобразований.

  12. ROBONUKA Автор записи

    Похвальное желание, но боюсь, что очень сложное. LRPTOffLineDecoder кроме Raw понимает ещё S и HARD форматы. HARD это самый компактный формат из-за того, что в нем хранятся так называемые жесткие решения демодулятора, т.е. демодулятор однозначно решает какая фаза у символа и в этом случае ему достаточно двух битов на символ (по одному биту на квадратурный канал). В S формате отводится по 8 бит на квадратурный канал (по сути это просто координаты точек созвездия). А в Raw по 4 бит, но хитро. Это так называемые мягкие решения которые дают выигрыш в 3 дБ относительно жестких при использовании декодера Витерби поддерживающего мягкие решения.
    Ниже привожу функцию перевода Raw в S формат.
    function Soft3ToSoft8(aValue:byte):Int8;
    case aValue of
    else Result:=0;

  13. Василий

    чего-то не хватает. Квадрат в плагине присутствует, а декодер категорически не декодирует. Зашумленное поле и все. Пытался сохранять в S формате. Декодер различает формат только по расширению?

    1. ROBONUKA Автор записи

      А пришли мне файлы я посмотрю …
      Для демодуляции надо произвести захват по тактовой частоте и по несущей частоте и держать захваты весь сеанс так как Доплер постоянно будет изменять несущую и тактовою частоту (блок схема демодулятора нарисована, например, в окне LrptRx.exe)

    1. ROBONUKA Автор записи

      Что то с ссылкой:

      Ничего не найдено
      Возможно, владелец удалил файлы или закрыл к ним доступ.
      А может быть, вам досталась ссылка с опечаткой.

  14. Василий

    Спасибо, с этим я уже разобрался. Неправильно переводил флоат в байт. Теперь все декодируется.
    Возник ещё вопрос. Каков порядок бит в Н формате?

  15. ROBONUKA Автор записи

    В жестких решениях символ (дибит, неважно IQ или QI) который пришел первым клади в старшие разряды байта.
    Предлагаю интегрировать декодер с плагином — можно будет избавиться от ещё одного этапа.

  16. Василий

    Жесткое решение тоже заработало.
    А какие предложения на счет интеграции? Не могу сказать что все идеально работает, но работает.

  17. ROBONUKA Автор записи

    Например можно связать плагин с декодером через TCP/IP сокеты. Когда плагин начинает работу он создает серверный сокет, запускает декодер и через командную строку передает декодеру номер порта серверного сокета. Декодер подключается к этому сокету и ждет данных от него. Плагин когда видит подключение к своему сокету начинает передачу декодированных данных на подключенный клиентский сокет. Когда плагин прекращает работу он разрывает связь и это служит сигналом для декодера что данных больше не будет и можно завершаться.

  18. Василий

    Хорошее решение. Можно их посадить на фиксированный порт. Один будет передавать, другой слушать. Надо только договориться о формате служебного пакета — начало окончание передачи и формат данных.
    В сравнении с LRPTRX мой плагин требует больший уровень сигнала, рано срывается синхронизация PLL, надо поработать над этим.

    1. ROBONUKA Автор записи

      Подключение плагина к декодеру по сокету у меня в шорт-листе. Как только вернусь к LRPTOffLineDecoder постараюсь открыть сокет хотя бы в черновом варианте.

      happysat уже анонсировал в переспективе демодуляцию плагином OQPSK … Могу помочь с тестовым сигналом для отладки …

  19. Shumoff

    Что за беспорядок у вас на сайте творится? На странице одной странице несколько ссылок, на другой странице ещё несколько ссылок, на третьей странице ещё больше ссылок на разные кучи одинаковых программ, в ftp всё ещё большую в кучу свалено, скачиваешь последнюю версию выглядит как старая, скачиваешь старую просит какую-то ini.
    Что за куча мала такая непонятная, что к чему фиг разберёшь?
    Нужно сделать всё аккуратно, большу ссылку на последнюю версию, а внизу маленький списочек с предыдущими версиями. Рядом с каждой описание, какие версии рекомендуется не скачивать, какие в них отличаи…

    1. ROBONUKA Автор записи

      Добрый день!

      Уж извините, делаем как умеем. Этот сайт является любительским и не стоит предъявлять уж очень высокие требования к нему. Если есть конкретные вопросы то задавайте и проблема будет решена.

  20. Василий

    Что означают длинные тонкие белые линии пересекающие весь снимок канала? Потеря синхронизации фазы или предельное количество ошибок?
    Плагин уже неплохо работает, захватывает синхронизацию раньше и отдает позже чем LRPTRX. Но в результате больше белых линий чем с lrptRX. Куда смотреть?
    https://yadi.sk/i/6ffrmSTDg6Yw5 — плагин
    https://yadi.sk/i/yvI9AKN_g6Yyd — if recorder + lrptrx

    1. ROBONUKA Автор записи

      Добрый день,

      Скорее всего это «перескок» фазы. Смотрится в логе SyncBeforeViterbi. Лог зависит от версии. Например это может выглядеть как:
      31.03.2015 10:53:33 — 210 3541632 16384 4 48
      31.03.2015 10:53:33 — 211 3558016 16384 4 48
      31.03.2015 10:53:33 — 212 3574400 16384 4 48
      31.03.2015 10:53:33 — 213 3590784 16384 4 48
      31.03.2015 10:53:33 — 214 3607168 16384 4!! 30
      31.03.2015 10:53:33 — 215 3623552 16384 4!! 27
      31.03.2015 10:53:33 — 216 3639936 16384 4!! 28
      31.03.2015 10:53:33 — 217 3656320 16384 4!! 27
      31.03.2015 10:53:33 — 218 3672704 16384 4!! 27
      31.03.2015 10:53:33 — 219 3689088 16384 4!! 27
      31.03.2015 10:53:33 — 220 3705472 16384 4!! 30
      31.03.2015 10:53:33 — 221 3721856 16384 4!! 29
      31.03.2015 10:53:33 — 222 3738240 16384 4!! 30
      31.03.2015 10:53:33 — 223 3754624 16384 4!! 31
      31.03.2015 10:53:33 — 224 3771008 32480 5 48
      31.03.2015 10:53:33 — 225 3803488 16384 5 48
      31.03.2015 10:53:33 — 226 3819872 16384 5 48
      31.03.2015 10:53:33 — 227 3836256 16384 5 48
      где после — идут
      1) номер найденного синхромаркера (по этому номеру можно проследить дальнейшую судьбу пакета)
      2) смещение начала синхромаркера относительно начала файла в байтах.
      3) смещение начала синхромаркера относительно предыдущего синхромаркера. Правильная длина пакета 16384.
      4) Вариант захвата. Возможно 8 вариантов.
      5) Сколько совпадений с маской синхромаркера. В данном случае максимальное значение 48 (длина маски).

      Причиной перескока может быть как демодулятор так и потеря данных в свистке. В данном примере потеря данных в свистке так как есть сдвижка не кратная 16384.


  21. Василий

    https://yadi.sk/d/FlnmW8uqfyzv9 — вполне рабочая версия плагина, работает неплохо. Пишет в файл или по ТСР. Могут быть проблемы при некоторых значениях частоты дискретизации.
    https://yadi.sk/i/X5C_4j9sgFmUu — скриншот.
    Для rtl-sdr рекомендую использовать полосу тюнера 1.4 Мгц. Для AirSpy 10МГц с децимацией на 32 или 2.5 МГц с децимацией на 8.

    1. ROBONUKA Автор записи

      1) На мой вкус я бы предпочел чтобы было «Пишет в файл и/или по ТСР».
      2) Мне кажется что у плагина маловат «выходной сигнал». Оптимально для демодулятора надо чтобы средневзвешенные значения созвездий были около 70. А визуально я вижу что 50..60. На этом теряется немного в энергетике.
      3) У меня вопрос относительно именования файлов. Так как есть сейчас нормально? Если будут предложения сообщай.

    2. ROBONUKA Автор записи

      Ещё одна мысль. Чтобы сократить диапазон поиска по частоте можно рассчитывать доплеровскую добавку по телеграмме NORAD. Если откалибровать свисток, передатчик на борту(на борту их два но реально их будут менять только если один сгорит) и использовать свежие телеграммы то можно выставлять частоту очень точно. Я могу добавить такую функцию в библиотеку SGP4.dll.

    3. Sergey (UB0FAN)

      Василий, опробовал плагин. Работает отлично. Спасибо!
      Есть вопрос: можно ли предусмотреть возможность записи по-расписанию (дата, время начала записи — дата, время окончания записи)?

      1. Василий

        На данный момент вы можете записывать по расписанию сигнал промежуточной частоты или всю полосу приема для дальнейшего декодирования. В скором времени добавлю управление плагином и записью с орбитрона и подобных программ.

  22. Василий

    1. Мое мнение — лучше сохранять IF запись для будущего декодирования. Можно декодировать в разных программах, при разных настройках.
    2.Реально 50. Добавить до 70 не вопрос.
    3. Именование файлов для меня лично никакой роли не играет. Это лучше задать вопрос реальным пользователям.

  23. Василий

    Про norad подробнее. Реально необходима только начальная синхронизация при слабом сигнале. Далее, после захвата PLL, внешняя коррекция излишняя.

    1. ROBONUKA Автор записи

      Идея такая — плагин когда нет захвата вызывает функцию Dopler из библиотеки sgp4.dll и передает ей текущее время. Функция возвращает плагину доплеровскую поправку частоты. Плагин выставляет частоту приемника с учетом поправки и некоторое время пытается произвести захват. Если захват не случается то плагин рассчитывает новое актуальное значение доплеровской поправки и снова выставляет частоту приемника. И так периодически пока не случится захват. Так можно на порядок сузить зону поиска по частоте.

    1. ROBONUKA Автор записи

      Это моя библиотека на базе модели sgp4 опубликованной Др.Келсо на селестраке. сейчас в ней функции Dopler нет, но я, как дойдут руки, вставлю…

  24. Василий

    Идея с первоначальной синхронизацией оказалась очень эффективной. Теперь плагин синхронизируется раньше, теряет синхронизацию позже, и потерь данных меньше чем у LRPTRX.
    Пока работает только совместно с Orbitron, но обязательно добавлю другие трэкеры.
    Ссылка не изменилась.

    1. ROBONUKA Автор записи

      Возможно еще немного увеличить точность первоначальной синхронизации если произвести калибровку свистка. Для этого надо измерить несущую частоту метеора свистком во время кульминации КА. В это время доплер равен нулю и полученная частота Fk является «истинной» частотой метеора для данного свистка и полукомплекта аппаратуры LRPT на борту. И соответственно первоначальная частота синхронизацации будет Fk+Fdopler

  25. Василий

    Я специально, на время отладки, добавил вывод ошибки между расчетной и частотой PLL.
    Она при каждом проходе разная. Сказывается вероятно стабильность частоты rtl тюнера и точность синхронизации компьютерных часов. Разница доходит до 50 Гц.
    Надо понаблюдать.

    1. ROBONUKA Автор записи

      Да, стабильности лучше 50 герц получить сложно. Все что можно сделать это устранить систематическую ошибку которая может достигать сотен герц относительно 137100000.

  26. Евгений

    Добрый день. А нет ли боле подробной информации по тому, что содержится в потоке по таблицам 3 и 3а http://planet.iitp.ru/english/spacecraft/meteor_m_n2_structure_eng.htm или русская версия http://planet.iitp.ru/spacecraft/meteor_m_n2.htm .
    Например, не понятно в каком виде записано время измерения БСКВУ, то ли там одно число формата unixtimestamp, то ли что-то еще.
    В каком виде записаны угловые скорости(порядок байт/бит, тип данных, единицы измерения). Пытаюсь их запихать во float, получается переполнение и какая-то чепуха.
    «Время получения последних данных об угловой скорости в данном кадре» вообще загадка… 6 байт.
    «Положение связанной системы координат относительно заданной», вроде бы как 4 числа — кватернионы матрицы поворота, но опять-таки при попытке считать во float получается ерунда. То ли порядок байт/бит (little/big endian) надо определенный подбирать, то ли еще что-то.
    Ну и так далее. Более менее, как мне кажется, правильно удалось извлечь координаты и обычные скорости, они похожи на правду, а остальное все то так, то сяк.

    1. OLEG

      Satellite clock time это unsigned long int (в Дельфи longword) количество секунд от 00 ч 00 мин 00 сек первого дня последнего високосного года по шкале времени UTC+3h. Это по документации. Реально от 00:00:00 31.12.2011.

      Satellite coordinates это double в м
      Satellite velocity это float в м/с

      1. Александр

        Большое спасибо за пояснение по кватерниону, действительно получается красивый нормированный кватернион.
        Может быть подскажете еще как быть с углами (кодируются 2мя байтами) и угловыми скоростями (4 байта)?

        И еще очень интересно сверить контрольную сумму (6ой байт таблицы 3) — нужно же как-то защищаться от помех. Вероятно используется что-то вроде CRC8, однако каков порождающий многочлен — не очевидно.

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

        1. ROBONUKA Автор записи

          углы — (signed int ) * 15 угл.сек
          угл. скорости — (signed long int) * 0.0275 угл.сек

          char checksum(const char * ptr, const char * const end)
          unsigned short cs;
          for(cs = 0; ptr < end; ++ptr) { cs += (unsigned char) *ptr; } cs = (cs >> 8) + (cs & 0xFF);
          return cs + (cs > 0xFF);

          // buffer — буфер
          // i — смещение в буфере на начало проверяемого кадра ПА БИС-М ДМ
          // buffer[0] — тип кадра
          // buffer[1] — контрольная сумма
          // buffer[2]…buffer[83] — данные

          if (checksum(&buffer[i+2], &buffer[i+84]) == buffer[i+1])
          // кадр без искажения

  27. Tihomir Meščić

    Hello everyone.

    Is the source code for the LRPT Offline Decoder available? I am building my own system for receiving Meteor-M 2 images and it would be very useful for me to see it (especially the part where the image is extracted from Instrument Source Packets)

    1. Blackbolt

      I would like a copy of this as well if possible please, for educational purposes as well as personal use. Thank You


  28. Tihomir Meščić

    Hi Everyone.

    I’m trying to write my own decoder for Meteor LRPT stream. I’m stuck on the Viterbi decoder. Does Meteor use the standard CCSDS convolutional coder: r=1/2, k=7, G1=171 octal, G2= 133 octal, symbol inversion on output of G2?

      1. Tihomir Meščić

        That was it. I changed my algorithm to use the non-inverted version of G2, and now it decodes the stream properly 🙂

        I assume that the payload of each frame is XORed with the pseudo-random sequence. Does Meteor use the standard CCSDS random sequence or does it have a specific one?

          1. Tihomir Meščić

            Thanks for the info. Descrambling works fine.

            The next problem is Reed-Solomon decoding. I was 100% sure that Meteor uses the standard CCSDS RS code RS (255, 223). Meaning: 255 bytes per block, 4 blocks in a frame (255 * 4 = 1020). Each RS block would have 32 bytes of redundancy at the end, and block would be interleaved (factor: 4).

            But this does not decode the data properly. Can you help me, am I missing something important?

          2. Tihomir Meščić

            Ok, I managed to make it work. I was using the dual mode version of Reed-Solomon but it turns out that Meteor uses the non-dual mode.

            I got the ISP packets for APIDs 66, 67, 68. I just need to extract the images now. That’s going to be fun 🙂

    1. WX0MMG

      I’d like to know more about your decoder — using the SDR Play with an old version of SDR# is cumbersome. I’d rather use HDSDR or CubicSDR, if possible — how does your decoder work?

    1. ROBONUKA Автор записи

      The S-file is array of IQ couples of octets. Type of octet is signed int8. 0x11111111=-127 … 0x1000000=128. If you will be use this couples like (x,y) coordinate for painting of point on canfas you will get picture of QPSK phase constellation.

  29. Уведомление: Прием сигналов из космоса. Часть 1: Ссылки. — Marmot's Blog

  30. Андрей

    Добрый день, Олег!

    Я пытаюсь написать LRPT декодер и у меня возникло пару вопросов про interleaving. В документации сказано, что «Операция интерливинга является дополнительной функцией, подключаемой по
    внешней команде управления», однако в стандарте написано «LRPT physical layer shall perform… interleaving of the convolutionally encoded signal».

    1) А как в потоке определить используется ли interleaving?
    2) Как определить начало CADU? Согласно документации есть маркер синхронизации 1ACFFC1D, но он добавляется ДО, того как произведено кодирование Витерби.

  31. ROBONUKA Автор записи

    Добрый день!
    1) Никак. Надо знать, что используется интерливинг. Касательно LRPT с Метеора — когда используется интерливинг скорость передачи равна 80К. В настоящее время скорость 72К.
    2) Если пропустить данные через декодер Витерби то на его выходе появиться маркер 1ACFFC1D. До снятия свёрточного кодирования ( «кодирование Витерби» говорить неправильно так как Витерби придумал не метод кодирования а метод декодирования ) начало CADU можно найти по «закодированному» синхромаркеру (в документации есть его дамп), но декодировать все равно придется.

    Народ уже выложил исходные коды декодеров http://meteor.robonuka.ru/#comment-27393

  32. Уведомление: DSP на Java - Новини дня

  33. Уведомление: DSP на Java | Компьюлента

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *