/////////////////////////////////////////////////////////////////////////////////// // Copyright (C) 2021 Jon Beniston, M7RCE // // // // This program is free software; you can redistribute it and/or modify // // it under the terms of the GNU General Public License as published by // // the Free Software Foundation as version 3 of the License, or // // (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // // GNU General Public License V3 for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program. If not, see . // /////////////////////////////////////////////////////////////////////////////////// #include // DVB-S coder - See ETSI EN 300 421 V1.1.2 class DVBS { static const uint8_t tsSync = 0x47; //!< Transport stream sync byte - should be at start of every TS packet static const int interleaveDepth = 12; //!< Interleaving depth static const int rsK = 239; //!< Reed-Solomon input length static const int rs2T = 16; //!< Reed-Solomon number check/parity symbols static const int rsN = rsK + rs2T; //!< Reed-Solomon block length public: static const int tsPacketLen = 188; //!< Length of transport stream packets static const int rsPacketLen = 204; //!< Length of packet after adding RS parity bytes static const int m_maxIQSymbols = 204*8; //!< Maximum number of IQ symbols per packet enum CodeRate {RATE_1_2, RATE_2_3, RATE_3_4, RATE_5_6, RATE_7_8}; DVBS(); ~DVBS(); int encode(const uint8_t *ts, uint8_t *iq); void setCodeRate(CodeRate codeRate); private: uint8_t *m_packet; //!< Buffer to hold input data + partiy bytes int m_prbsPacketCount; //!< Counts 0-7 int m_prbsIdx; //!< Index in to m_prbsLUT uint8_t **m_interleaveFIFO; //!< FIFOs for convolutional interleaving int *m_interleaveLen; //!< Length of each FIFO int *m_interleaveIdx; //!< Write index in to FIFOs CodeRate m_codeRate; //!< Convolution coding rate unsigned m_delayLine; //!< Delay line for convolution encoder int m_punctureState; //!< Puncturing state uint8_t m_prevIQ; //!< Saved bit from previous packet bool m_prevIQValid; //!< Whether there is a saved bit protected: static const uint8_t m_prbsLUT[tsPacketLen*8-1]; //!< PRBS lookup table static const uint8_t rsPoly[rs2T]; //!< Reed-Solomon generator polynomial static const uint8_t m_gfLog[256]; //!< GF(2^8) log lookup table static const uint8_t m_gfExp[512]; //!< GF(2^8) exponent lookup table static uint8_t gfMul(uint8_t a, uint8_t b); //!< GF(2^8) multiplication void scramble(const uint8_t *packetIn, uint8_t *packetOut); void reedSolomon(uint8_t *packet); void interleave(uint8_t *packet); int convolution(const uint8_t *packet, uint8_t *iq); };