交织基数为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> interleave(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 // Interleave 20 for(size_t i = 0; i < sym_din.size(); ++i) { 21 sym_fifo[size_t(i%12)].push_back(sym_din[i]); 22 sym_itlv.push_back(sym_fifo[i%12].front()); 23 sym_fifo[i%12].pop_front(); 24 } 25 26 return sym_itlv; 27 } 28 29 vector<uint8_t> deinterleave(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 // DeInterleave 41 for(size_t i = 0; i < sym_din.size(); ++i) { 42 sym_fifo[size_t(i%12)].push_back(sym_din[i]); 43 sym_itlv.push_back(sym_fifo[i%12].front()); 44 sym_fifo[i%12].pop_front(); 45 } 46 47 // DeInterleave Delay Should be I*(I-1)*M 48 return sym_itlv; 49 } 50 51 int main(int argc, char **argv) 52 { 53 size_t deint_delay = 0; 54 vector<uint8_t> sym_din; 55 vector<uint8_t> sym_itlv; 56 vector<uint8_t> sym_deitlv; 57 58 for(size_t i = 0; i < 12*17*11*204; ++i) 59 sym_din.push_back(i+1); 60 61 sym_itlv = interleave(sym_din, 17, 12); 62 sym_deitlv = deinterleave(sym_itlv, 17, 12); 63 64 cout << "Hello world!" << endl; 65 66 for(vector<uint8_t>::iterator itr = sym_din.begin(); itr != sym_din.end(); ++itr) { 67 cout << int(*itr) << ' ' << flush; 68 } 69 cout << endl; 70 71 cout << "Interleave:" << endl; 72 for(vector<uint8_t>::iterator itr = sym_itlv.begin(); itr != sym_itlv.end(); ++itr) { 73 cout << int(*itr) << ' ' << flush; 74 } 75 cout << endl; 76 77 cout << "DeInterleave:" << endl; 78 79 for(vector<uint8_t>::iterator itr = sym_deitlv.begin(); itr != sym_deitlv.end(); ++itr) { 80 cout << int(*itr) << ' ' << flush; 81 if(*itr == 1 && deint_delay == 0) 82 deint_delay = itr - sym_deitlv.begin(); 83 } 84 cout << endl; 85 cout << "Deint Delay is " << deint_delay << endl; 86 87 return 0; 88 }