File: s2_scrambling.cpp

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-- 1,854 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
#include "s2_scrambling.h"

/*
Adapted from LeanDVB
*/

namespace dvbs2
{
    S2Scrambling::S2Scrambling(int codenum)
    {
        uint32_t stx = 0x00001, sty = 0x3ffff;
        // x starts at codenum, wraps at index 2^18-1 by design
        for (int i = 0; i < codenum; ++i)
            stx = lfsr_x(stx);
        // First half of sequence is LSB of scrambling angle
        for (int i = 0; i < 131072; ++i)
        {
            int zn = (stx ^ sty) & 1;
            Rn[i] = zn;
            stx = lfsr_x(stx);
            sty = lfsr_y(sty);
        }
        // Second half is MSB
        for (int i = 0; i < 131072; ++i)
        {
            int zn = (stx ^ sty) & 1;
            Rn[i] |= zn << 1;
            stx = lfsr_x(stx);
            sty = lfsr_y(sty);
        }
    }

    S2Scrambling::~S2Scrambling()
    {
    }

    void S2Scrambling::reset()
    {
        pos = 0;
    }

    complex_t S2Scrambling::descramble(complex_t &p)
    {
        r = Rn[pos++];

        switch (r)
        {
        case 3:
            res.real = -p.imag;
            res.imag = p.real;
            break;
        case 2:
            res.real = -p.real;
            res.imag = -p.imag;
            break;
        case 1:
            res.real = p.imag;
            res.imag = -p.real;
            break;
        default:
            res = p;
        }

        return res;
    }

    complex_t S2Scrambling::scramble(complex_t &p)
    {
        r = Rn[pos++];

        switch (r)
        {
        case 3:
            res.imag = -p.real;
            res.real = p.imag;
            break;
        case 2:
            res.real = -p.real;
            res.imag = -p.imag;
            break;
        case 1:
            res.imag = p.real;
            res.real = -p.imag;
            break;
        default:
            res = p;
        }

        return res;
    }
}