std::vector<double> LDPCDecoder::deModLlr(std::vector<double> phase, std::vector<double> quad, double n0) { if (quad.size() != phase.size()) { throw std::invalid_argument("Invalid input size"); } std::vector<double> llrs; int modSize = log2(symbols); //LLR calculation for (int s = 0; s < phase.size(); s++) { //LLR for the symbol std::vector<double> llr_symbol = llr(phase.at(s), quad.at(s), n0); for (int j = 0; j < modSize; j++) { llrs.push_back(llr_symbol.at(j)); } } llrs = deInterleave(llrs); return llrs; }
struct BPTC1969 decodeBPTC1969(bool bits[264]){ bool *infoBits; //196 info bits bool *deInterleavedBits; //196 bits static bool *payloadBits; //96 bits int blocksToFollow=0,a; unsigned char dpf=0,sap=0,bitPadding=0; struct BPTC1969 BPTC1969decode; infoBits = extractInfo(bits); deInterleavedBits = deInterleave(infoBits); payloadBits = extractPayload(deInterleavedBits); /*printf("Payload bits\n"); for(a=0;a<96;a++){ printf("%i",*(payloadBits+a)); } printf("\n");*/ if(*(payloadBits+1) == 1){ BPTC1969decode.responseRequested = true; //syslog(LOG_NOTICE,"response requested"); } else{ BPTC1969decode.responseRequested = false; //syslog(LOG_NOTICE,"NO response requested"); } for(a=4;a<8;a++){ if(*(payloadBits + a) == true) dpf = dpf + (char)(8 / pow(2,a-4)); } //syslog(LOG_NOTICE,"Data Packet Format: "); BPTC1969decode.dataPacketFormat = dpf; switch (dpf){ case 0: //syslog(LOG_NOTICE,"Unified Data Transport\n"); break; case 1: //syslog(LOG_NOTICE,"Response packet\n"); break; case 2: //syslog(LOG_NOTICE,"Data packet with unconfirmed delivery\n"); break; case 3: //syslog(LOG_NOTICE,"Data packet with confirmed delivery\n"); break; case 13: //syslog(LOG_NOTICE,"Short Data: Defined\n"); break; case 14: //syslog(LOG_NOTICE,"Short Data: Raw or Status/Precoded\n"); break; case 15: //syslog(LOG_NOTICE,"Proprietary Data Packet\n"); break; } for(a=8;a<12;a++){ if(*(payloadBits + a) == true) sap = sap + (char)(8 / pow(2,a-8)); } //syslog(LOG_NOTICE,"SAP id: "); BPTC1969decode.sapId = sap; switch (sap){ case 0: //syslog(LOG_NOTICE,"Unified Data Transport\n"); break; case 2: //syslog(LOG_NOTICE,"TCP/IP header compression\n"); break; case 3: //syslog(LOG_NOTICE,"UDP/IP header compression\n"); break; case 4: //syslog(LOG_NOTICE,"IP based Packet data\n"); break; case 5: //syslog(LOG_NOTICE,"Address Resolution Protocol(ARP)\n"); break; case 9: //syslog(LOG_NOTICE,"Proprietary Packet data\n"); break; case 10: //syslog(LOG_NOTICE,"Short Data\n"); break; } if (dpf == 13){ for(a=12;a<16;a++){//only AB in 2nd octet if(*(payloadBits + a) == true) blocksToFollow = blocksToFollow + (char)(8 / pow(2,a-12)); } BPTC1969decode.appendBlocks = blocksToFollow; //syslog(LOG_NOTICE,"Appended blocks : %i\n",blocksToFollow); for(a=72;a<80;a++){ if(*(payloadBits + a) == true) bitPadding = bitPadding + (char)(128 / pow(2,a-12)); } } return BPTC1969decode; }