交织基数为M,交织深度为I的卷积交织/解交织程序,延时为I*(I-1)*M.

  1 #include <iostream>
  2 #include <vector>
  3 #include <list>
  4 #include <cstdint>
  5 
  6 using namespace std;
  7 
  8 vector<uint8_t> interleaving(vector<uint8_t> &sym_din, size_t M, size_t I)
  9 {
 10     list<uint8_t> sym_fifo[I];
 11     vector<uint8_t> sym_itlv;
 12 
 13     // Initialize Data FiFo
 14     for(size_t i = 0; i < I; ++i) {
 15         for(size_t j = 0; j < M*i; ++j)
 16             sym_fifo[i].push_back(uint8_t(0));
 17     }
 18 
 19     // Interleaving
 20     for(size_t i = 0; i < sym_din.size(); ++i) {
 21         sym_fifo[size_t(i%I)].push_back(sym_din[i]);
 22         sym_itlv.push_back(sym_fifo[i%I].front());
 23         sym_fifo[i%I].pop_front();
 24     }
 25 
 26     return sym_itlv;
 27 }
 28 
 29 vector<uint8_t> deinterleaving_fifo(vector<uint8_t> &sym_din, size_t M, size_t I)
 30 {
 31     list<uint8_t> sym_fifo[I];
 32     vector<uint8_t> sym_itlv;
 33 
 34     // Initialize Data FiFo
 35     for(size_t i = 0; i < I; ++i) {
 36         for(size_t j = 0; j < M*(I - 1 - i); ++j)
 37             sym_fifo[i].push_back(uint8_t(0));
 38     }
 39 
 40     // DeInterleaving
 41     for(size_t i = 0; i < sym_din.size(); ++i) {
 42         sym_fifo[size_t(i%I)].push_back(sym_din[i]);
 43         sym_itlv.push_back(sym_fifo[i%I].front());
 44         sym_fifo[i%I].pop_front();
 45     }
 46 
 47     // DeInterleaving Delay Should be I*(I-1)*M
 48     return sym_itlv;
 49 }
 50 
 51 vector<uint8_t> deinterleaving(vector<uint8_t> &sym_din, size_t M, size_t I)
 52 {
 53     size_t branch = 0;
 54     size_t wraddr = 0;
 55     size_t rdaddr = (I - 1) * M;
 56     vector<uint8_t> sym_ram(I*(I-1)*M/2+1);
 57     vector<uint8_t> sym_itlv;
 58 
 59     // Initialize Data RAM
 60     for(size_t i = 0; i < I*(I-1)*M/2 + 1; ++i) {
 61         sym_ram[i] = uint8_t(0);
 62     }
 63 
 64     // DeInterleaving
 65     for(size_t i = 0; i < sym_din.size(); ++i) {
 66         branch = i % I;
 67 
 68         sym_ram[wraddr] = sym_din[i];
 69         wraddr = wraddr + (I-1)*M - branch * M;
 70         wraddr = wraddr >= (I*(I-1)*M/2 + 1) ? wraddr - (I*(I-1)*M/2 + 1) : wraddr;
 71 
 72         sym_itlv.push_back(sym_ram[rdaddr]);
 73         rdaddr = rdaddr + (I-1)*M - ((branch + 1) % I) * M;
 74         rdaddr = rdaddr >= (I*(I-1)*M/2 + 1) ? rdaddr - (I*(I-1)*M/2 + 1) : rdaddr;
 75     }
 76 
 77     // DeInterleaving Delay Should be I*(I-1)*M
 78     return sym_itlv;
 79 }
 80 
 81 int main(int argc, char **argv)
 82 {
 83     size_t deint_delay = 0;
 84     vector<uint8_t> sym_din;
 85     vector<uint8_t> sym_itlv;
 86     vector<uint8_t> sym_deitlv;
 87 
 88     for(size_t i = 0; i < 12*11*17*10; ++i)
 89         sym_din.push_back(i+1);
 90 
 91     sym_itlv = interleaving(sym_din, 17, 12);
 92     sym_deitlv = deinterleaving(sym_itlv, 17, 12);
 93 
 94     cout << "Interleaving:" << endl;
 95     for(vector<uint8_t>::iterator itr = sym_itlv.begin(); itr != sym_itlv.end(); ++itr) {
 96         cout << int(*itr) << ' ' << flush;
 97     }
 98     cout << endl;
 99 
100     cout << "DeInterleaving:" << endl;
101 
102     for(vector<uint8_t>::iterator itr = sym_deitlv.begin(); itr != sym_deitlv.end(); ++itr) {
103         cout << int(*itr) << ' ' << flush;
104         if(*itr == 1 && deint_delay == 0)
105             deint_delay = itr - sym_deitlv.begin();
106     }
107     cout << endl;
108     cout << "Deint Delay is " << deint_delay << endl;
109 
110     return 0;
111 }