卷积交织/解交织C++程序

交织基数为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 }

猜你喜欢

转载自www.cnblogs.com/lyuyangly/p/9781464.html