700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 卷积交织/解交织C++程序

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

时间:2018-08-20 04:30:49

相关推荐

卷积交织/解交织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> interleaving(vector<uint8_t> &sym_din, size_t M, size_t I) 9 { 10list<uint8_t> sym_fifo[I]; 11vector<uint8_t> sym_itlv; 12 13// Initialize Data FiFo 14for(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 20for(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 26return sym_itlv; 27 } 28 29 vector<uint8_t> deinterleaving_fifo(vector<uint8_t> &sym_din, size_t M, size_t I) 30 { 31list<uint8_t> sym_fifo[I]; 32vector<uint8_t> sym_itlv; 33 34// Initialize Data FiFo 35for(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 41for(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 48return sym_itlv; 49 } 50 51 vector<uint8_t> deinterleaving(vector<uint8_t> &sym_din, size_t M, size_t I) 52 { 53size_t branch = 0; 54size_t wraddr = 0; 55size_t rdaddr = (I - 1) * M; 56vector<uint8_t> sym_ram(I*(I-1)*M/2+1); 57vector<uint8_t> sym_itlv; 58 59// Initialize Data RAM 60for(size_t i = 0; i < I*(I-1)*M/2 + 1; ++i) { 61 sym_ram[i] = uint8_t(0); 62} 63 64// DeInterleaving 65for(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 78return sym_itlv; 79 } 80 81 int main(int argc, char **argv) 82 { 83size_t deint_delay = 0; 84vector<uint8_t> sym_din; 85vector<uint8_t> sym_itlv; 86vector<uint8_t> sym_deitlv; 87 88for(size_t i = 0; i < 12*11*17*10; ++i) 89 sym_din.push_back(i+1); 90 91sym_itlv = interleaving(sym_din, 17, 12); 92sym_deitlv = deinterleaving(sym_itlv, 17, 12); 93 94cout << "Interleaving:" << endl; 95for(vector<uint8_t>::iterator itr = sym_itlv.begin(); itr != sym_itlv.end(); ++itr) { 96 cout << int(*itr) << ' ' << flush; 97} 98cout << endl; 99 100cout << "DeInterleaving:" << endl;101 102for(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}107cout << endl;108cout << "Deint Delay is " << deint_delay << endl;109 110return 0;111 }

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。