File: module_ccsds_ldpc_decoder.h

package info (click to toggle)
satdump 1.2.2%2Bgb79af48-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 81,648 kB
  • sloc: cpp: 276,768; ansic: 164,598; lisp: 1,219; sh: 283; xml: 106; makefile: 7
file content (91 lines) | stat: -rw-r--r-- 3,156 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#pragma once

#include "core/module.h"
#include <complex>
#include "common/codings/deframing/bpsk_ccsds_deframer.h"
#include <fstream>
#include "common/dsp/demod/constellation.h"
#include "common/codings/generic_correlator.h"
#include "common/dsp/utils/random.h"
#include "common/codings/ldpc/ccsds_ldpc.h"

namespace ccsds
{
    /*
    This decoder is meant to decode LDPC codes from the
    CCSDS 131.0 Specification. Everything from the 7/8
    code to the AR4JA 1/2, 2/3, 3/4 codes should be covered.
    Optionally, the actual CADUs can be in a stream of STMFs.
    */
    class CCSDSLDPCDecoderModule : public ProcessingModule
    {
    protected:
        const bool is_ccsds; // Just to know if we should output .cadu or .frm

        const std::string d_constellation_str;     // Constellation type string
        dsp::constellation_type_t d_constellation; // Constellation type
        // const bool d_iq_invert;                    // For some QPSK sats, can need to be inverted...

        const bool d_derand; // Perform derandomizion or not

        std::string d_ldpc_rate_str;            // LDPC Rate string
        codings::ldpc::ldpc_rate_t d_ldpc_rate; // LDPC Rate
        int d_ldpc_block_size;                  // LDPC Block size (for AR4JA only)
        int d_ldpc_iterations;                  // LDPC Iterations

        const bool d_internal_stream; // Does this have an internal CADU stream?
        const int d_cadu_size;        // CADU Size in bits, including ASM
        const int d_cadu_bytes;       // CADU Size in bytes, including ASM

        int d_ldpc_frame_size;
        int d_ldpc_codeword_size;
        int d_ldpc_asm_size;
        int d_ldpc_simd;
        int d_ldpc_data_size;

        int8_t *soft_buffer;
        int frames_in_ldpc_buffer;
        int8_t *ldpc_input_buffer;
        uint8_t *ldpc_output_buffer;
        uint8_t *deframer_buffer;

        std::ifstream data_in;
        std::ofstream data_out;

        std::atomic<uint64_t> filesize;
        std::atomic<uint64_t> progress;

        std::unique_ptr<CorrelatorGeneric> correlator;
        std::unique_ptr<codings::ldpc::CCSDSLDPC> ldpc_dec;
        std::unique_ptr<deframing::BPSK_CCSDS_Deframer> deframer;

        // UI Stuff
        float ber_history[200];
        dsp::Random rng;

        // UI Stuff
        float cor_history[200];

        float correlator_cor;
        bool correlator_locked;

        float ldpc_history[200];
        int ldpc_corr;

        bool is_started = false;

    public:
        CCSDSLDPCDecoderModule(std::string input_file, std::string output_file_hint, nlohmann::json parameters);
        ~CCSDSLDPCDecoderModule();
        void process();
        void drawUI(bool window);
        std::vector<ModuleDataType> getInputTypes();
        std::vector<ModuleDataType> getOutputTypes();

    public:
        static std::string getID();
        virtual std::string getIDM() { return getID(); };
        static std::vector<std::string> getParameters();
        static std::shared_ptr<ProcessingModule> getInstance(std::string input_file, std::string output_file_hint, nlohmann::json parameters);
    };
} // namespace npp