diff options
author | Ron Economos <w6rz@comcast.net> | 2016-08-19 00:03:33 -0700 |
---|---|---|
committer | Ron Economos <w6rz@comcast.net> | 2016-08-19 00:03:33 -0700 |
commit | fac58ba790528a692ce4df0c4f5b1e77f1992075 (patch) | |
tree | 5197e8070d164c441db585bc35fa3660bfd72ccd /gr-dtv | |
parent | f65a6f2e2d61875668b0a5ef07495f8558f6dce8 (diff) |
gr-dtv: Reduce DVB-T transmitter CPU usage.
Diffstat (limited to 'gr-dtv')
-rw-r--r-- | gr-dtv/lib/dvbt/dvbt_bit_inner_interleaver_impl.cc | 162 | ||||
-rw-r--r-- | gr-dtv/lib/dvbt/dvbt_bit_inner_interleaver_impl.h | 5 | ||||
-rw-r--r-- | gr-dtv/lib/dvbt/dvbt_inner_coder_impl.cc | 35 | ||||
-rw-r--r-- | gr-dtv/lib/dvbt/dvbt_inner_coder_impl.h | 7 |
4 files changed, 163 insertions, 46 deletions
diff --git a/gr-dtv/lib/dvbt/dvbt_bit_inner_interleaver_impl.cc b/gr-dtv/lib/dvbt/dvbt_bit_inner_interleaver_impl.cc index 43146f02c5..bfd9bde0ad 100644 --- a/gr-dtv/lib/dvbt/dvbt_bit_inner_interleaver_impl.cc +++ b/gr-dtv/lib/dvbt/dvbt_bit_inner_interleaver_impl.cc @@ -34,36 +34,6 @@ namespace gr { const int dvbt_bit_inner_interleaver_impl::d_bsize = INTERLEAVER_BLOCK_SIZE; - int - dvbt_bit_inner_interleaver_impl::H(int e, int w) - { - int rez = 0; - - switch (e) { - case 0: - rez = w; - break; - case 1: - rez = (w + 63) % d_bsize; - break; - case 2: - rez = (w + 105) % d_bsize; - break; - case 3: - rez = (w + 42) % d_bsize; - break; - case 4: - rez = (w + 21) % d_bsize; - break; - case 5: - rez = (w + 84) % d_bsize; - break; - default: - break; - } - - return rez; - } dvbt_bit_inner_interleaver::sptr dvbt_bit_inner_interleaver::make(int nsize, \ @@ -175,7 +145,7 @@ namespace gr { int val = 0; for (int e = 0; e < d_v; e++) { - val = (val << 1) | d_b[e][H(e, w)]; + val = (val << 1) | d_b[e][d_lookup_H[w][e]]; } out[(bcount * d_bsize) + w] = val; @@ -190,6 +160,136 @@ namespace gr { return noutput_items; } + const int dvbt_bit_inner_interleaver_impl::d_lookup_H[INTERLEAVER_BLOCK_SIZE][MAX_MODULATION_ORDER] = + { + {0, 63, 105, 42, 21, 84}, + {1, 64, 106, 43, 22, 85}, + {2, 65, 107, 44, 23, 86}, + {3, 66, 108, 45, 24, 87}, + {4, 67, 109, 46, 25, 88}, + {5, 68, 110, 47, 26, 89}, + {6, 69, 111, 48, 27, 90}, + {7, 70, 112, 49, 28, 91}, + {8, 71, 113, 50, 29, 92}, + {9, 72, 114, 51, 30, 93}, + {10, 73, 115, 52, 31, 94}, + {11, 74, 116, 53, 32, 95}, + {12, 75, 117, 54, 33, 96}, + {13, 76, 118, 55, 34, 97}, + {14, 77, 119, 56, 35, 98}, + {15, 78, 120, 57, 36, 99}, + {16, 79, 121, 58, 37, 100}, + {17, 80, 122, 59, 38, 101}, + {18, 81, 123, 60, 39, 102}, + {19, 82, 124, 61, 40, 103}, + {20, 83, 125, 62, 41, 104}, + {21, 84, 0, 63, 42, 105}, + {22, 85, 1, 64, 43, 106}, + {23, 86, 2, 65, 44, 107}, + {24, 87, 3, 66, 45, 108}, + {25, 88, 4, 67, 46, 109}, + {26, 89, 5, 68, 47, 110}, + {27, 90, 6, 69, 48, 111}, + {28, 91, 7, 70, 49, 112}, + {29, 92, 8, 71, 50, 113}, + {30, 93, 9, 72, 51, 114}, + {31, 94, 10, 73, 52, 115}, + {32, 95, 11, 74, 53, 116}, + {33, 96, 12, 75, 54, 117}, + {34, 97, 13, 76, 55, 118}, + {35, 98, 14, 77, 56, 119}, + {36, 99, 15, 78, 57, 120}, + {37, 100, 16, 79, 58, 121}, + {38, 101, 17, 80, 59, 122}, + {39, 102, 18, 81, 60, 123}, + {40, 103, 19, 82, 61, 124}, + {41, 104, 20, 83, 62, 125}, + {42, 105, 21, 84, 63, 0}, + {43, 106, 22, 85, 64, 1}, + {44, 107, 23, 86, 65, 2}, + {45, 108, 24, 87, 66, 3}, + {46, 109, 25, 88, 67, 4}, + {47, 110, 26, 89, 68, 5}, + {48, 111, 27, 90, 69, 6}, + {49, 112, 28, 91, 70, 7}, + {50, 113, 29, 92, 71, 8}, + {51, 114, 30, 93, 72, 9}, + {52, 115, 31, 94, 73, 10}, + {53, 116, 32, 95, 74, 11}, + {54, 117, 33, 96, 75, 12}, + {55, 118, 34, 97, 76, 13}, + {56, 119, 35, 98, 77, 14}, + {57, 120, 36, 99, 78, 15}, + {58, 121, 37, 100, 79, 16}, + {59, 122, 38, 101, 80, 17}, + {60, 123, 39, 102, 81, 18}, + {61, 124, 40, 103, 82, 19}, + {62, 125, 41, 104, 83, 20}, + {63, 0, 42, 105, 84, 21}, + {64, 1, 43, 106, 85, 22}, + {65, 2, 44, 107, 86, 23}, + {66, 3, 45, 108, 87, 24}, + {67, 4, 46, 109, 88, 25}, + {68, 5, 47, 110, 89, 26}, + {69, 6, 48, 111, 90, 27}, + {70, 7, 49, 112, 91, 28}, + {71, 8, 50, 113, 92, 29}, + {72, 9, 51, 114, 93, 30}, + {73, 10, 52, 115, 94, 31}, + {74, 11, 53, 116, 95, 32}, + {75, 12, 54, 117, 96, 33}, + {76, 13, 55, 118, 97, 34}, + {77, 14, 56, 119, 98, 35}, + {78, 15, 57, 120, 99, 36}, + {79, 16, 58, 121, 100, 37}, + {80, 17, 59, 122, 101, 38}, + {81, 18, 60, 123, 102, 39}, + {82, 19, 61, 124, 103, 40}, + {83, 20, 62, 125, 104, 41}, + {84, 21, 63, 0, 105, 42}, + {85, 22, 64, 1, 106, 43}, + {86, 23, 65, 2, 107, 44}, + {87, 24, 66, 3, 108, 45}, + {88, 25, 67, 4, 109, 46}, + {89, 26, 68, 5, 110, 47}, + {90, 27, 69, 6, 111, 48}, + {91, 28, 70, 7, 112, 49}, + {92, 29, 71, 8, 113, 50}, + {93, 30, 72, 9, 114, 51}, + {94, 31, 73, 10, 115, 52}, + {95, 32, 74, 11, 116, 53}, + {96, 33, 75, 12, 117, 54}, + {97, 34, 76, 13, 118, 55}, + {98, 35, 77, 14, 119, 56}, + {99, 36, 78, 15, 120, 57}, + {100, 37, 79, 16, 121, 58}, + {101, 38, 80, 17, 122, 59}, + {102, 39, 81, 18, 123, 60}, + {103, 40, 82, 19, 124, 61}, + {104, 41, 83, 20, 125, 62}, + {105, 42, 84, 21, 0, 63}, + {106, 43, 85, 22, 1, 64}, + {107, 44, 86, 23, 2, 65}, + {108, 45, 87, 24, 3, 66}, + {109, 46, 88, 25, 4, 67}, + {110, 47, 89, 26, 5, 68}, + {111, 48, 90, 27, 6, 69}, + {112, 49, 91, 28, 7, 70}, + {113, 50, 92, 29, 8, 71}, + {114, 51, 93, 30, 9, 72}, + {115, 52, 94, 31, 10, 73}, + {116, 53, 95, 32, 11, 74}, + {117, 54, 96, 33, 12, 75}, + {118, 55, 97, 34, 13, 76}, + {119, 56, 98, 35, 14, 77}, + {120, 57, 99, 36, 15, 78}, + {121, 58, 100, 37, 16, 79}, + {122, 59, 101, 38, 17, 80}, + {123, 60, 102, 39, 18, 81}, + {124, 61, 103, 40, 19, 82}, + {125, 62, 104, 41, 20, 83} + }; + } /* namespace dtv */ } /* namespace gr */ diff --git a/gr-dtv/lib/dvbt/dvbt_bit_inner_interleaver_impl.h b/gr-dtv/lib/dvbt/dvbt_bit_inner_interleaver_impl.h index c5fcbe2d82..824fdb5016 100644 --- a/gr-dtv/lib/dvbt/dvbt_bit_inner_interleaver_impl.h +++ b/gr-dtv/lib/dvbt/dvbt_bit_inner_interleaver_impl.h @@ -32,6 +32,8 @@ namespace gr { private: const dvbt_configure config; + static const int d_lookup_H[126][6]; + int d_nsize; dvbt_hierarchy_t d_hierarchy; @@ -43,9 +45,6 @@ namespace gr { // Table to keep interleaved indices unsigned char * d_perm; - // Permutation function - int H(int e, int w); - public: dvbt_bit_inner_interleaver_impl(int nsize, dvb_constellation_t constellation, dvbt_hierarchy_t hierarchy, dvbt_transmission_mode_t transmission); ~dvbt_bit_inner_interleaver_impl(); diff --git a/gr-dtv/lib/dvbt/dvbt_inner_coder_impl.cc b/gr-dtv/lib/dvbt/dvbt_inner_coder_impl.cc index 54d25e49ea..9d0c93c35c 100644 --- a/gr-dtv/lib/dvbt/dvbt_inner_coder_impl.cc +++ b/gr-dtv/lib/dvbt/dvbt_inner_coder_impl.cc @@ -30,21 +30,16 @@ namespace gr { namespace dtv { - void + inline void dvbt_inner_coder_impl::generate_codeword(unsigned char in, int &x, int &y) { //insert input bit d_reg |= ((in & 0x1) << 7); - d_reg = d_reg >> 1; + d_reg = d_reg >> 1; - // TODO - do this with polynoms and bitcnt - //generate output G1=171(OCT) - x = ((d_reg >> 6) ^ (d_reg >> 5) ^ (d_reg >> 4) ^ \ - (d_reg >> 3) ^ d_reg) & 0x1; - //generate output G2=133(OCT) - y = ((d_reg >> 6) ^ (d_reg >> 4) ^ (d_reg >> 3) ^ \ - (d_reg >> 1) ^ d_reg) & 0x1; + x = d_lookup_171[d_reg]; + y = d_lookup_133[d_reg]; } //TODO - do this based on puncturing matrix @@ -55,7 +50,7 @@ namespace gr { * 00000c0c1c2 */ - void + inline void dvbt_inner_coder_impl::generate_punctured_code(dvb_code_rate_t coderate, unsigned char * in, unsigned char * out) { int x, y; @@ -251,6 +246,26 @@ namespace gr { return noutput_items; } + const int dvbt_inner_coder_impl::d_lookup_171[128] = + {0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, + 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, + 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, + 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, + 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1}; + + const int dvbt_inner_coder_impl::d_lookup_133[128] = + {0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, + 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, + 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, + 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, + 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, + 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, + 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, + 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1}; + } /* namespace dtv */ } /* namespace gr */ diff --git a/gr-dtv/lib/dvbt/dvbt_inner_coder_impl.h b/gr-dtv/lib/dvbt/dvbt_inner_coder_impl.h index 7a46a2222c..56ce828be1 100644 --- a/gr-dtv/lib/dvbt/dvbt_inner_coder_impl.h +++ b/gr-dtv/lib/dvbt/dvbt_inner_coder_impl.h @@ -32,6 +32,9 @@ namespace gr { private: const dvbt_configure config; + static const int d_lookup_171[128]; + static const int d_lookup_133[128]; + int d_ninput; int d_noutput; @@ -57,8 +60,8 @@ namespace gr { // bit output buffer unsigned char * d_out_buff; - void generate_codeword(unsigned char in, int &x, int &y); - void generate_punctured_code(dvb_code_rate_t coderate, unsigned char * in, unsigned char * out); + inline void generate_codeword(unsigned char in, int &x, int &y); + inline void generate_punctured_code(dvb_code_rate_t coderate, unsigned char * in, unsigned char * out); public: dvbt_inner_coder_impl(int ninput, int noutput, dvb_constellation_t constellation, dvbt_hierarchy_t hierarchy, dvb_code_rate_t coderate); |