| 1 | warning off; |
|---|
| 2 | |
|---|
| 3 | |
|---|
| 4 | max_OFDM_symbols = 2047; |
|---|
| 5 | max_num_subcarriers = 64; |
|---|
| 6 | max_CP_length = 16; |
|---|
| 7 | max_num_baseRateSymbols = 31; |
|---|
| 8 | max_num_trainingSymbols = 15; |
|---|
| 9 | max_numBytes = 16384; |
|---|
| 10 | |
|---|
| 11 | |
|---|
| 12 | numSubcarriers = 64; |
|---|
| 13 | CPLength = 16; |
|---|
| 14 | |
|---|
| 15 | |
|---|
| 16 | tx_SISO_Mode = 1; |
|---|
| 17 | |
|---|
| 18 | |
|---|
| 19 | CRCPolynomial = hex2dec('04c11db7'); |
|---|
| 20 | CRC_Table = CRC_table_gen(CRCPolynomial); |
|---|
| 21 | |
|---|
| 22 | |
|---|
| 23 | |
|---|
| 24 | shortSymbol_freq = [0 0 0 0 0 0 0 0 1+i 0 0 0 -1+i 0 0 0 -1-i 0 0 0 1-i 0 0 0 -1-i 0 0 0 1-i 0 0 0 0 0 0 0 1-i 0 0 0 -1-i 0 0 0 1-i 0 0 0 -1-i 0 0 0 -1+i 0 0 0 1+i 0 0 0 0 0 0 0].'; |
|---|
| 25 | shortSymbol_time = ifft(fftshift(shortSymbol_freq)); |
|---|
| 26 | shortSymbol_time = shortSymbol_time(1:16).'; |
|---|
| 27 | |
|---|
| 28 | longSymbol_freq_bot = [0 0 0 0 0 0 1 1 -1 -1 1 1 -1 1 -1 1 1 1 1 1 1 -1 -1 1 1 -1 1 -1 1 1 1 1]'; |
|---|
| 29 | longSymbol_freq_top = [1 -1 -1 1 1 -1 1 -1 1 -1 -1 -1 -1 -1 1 1 -1 -1 1 -1 1 -1 1 1 1 1 0 0 0 0 0]'; |
|---|
| 30 | longSymbol_freq = [longSymbol_freq_bot ; 0 ; longSymbol_freq_top]; |
|---|
| 31 | longSymbol_time = ifft(fftshift(longSymbol_freq)).'; |
|---|
| 32 | |
|---|
| 33 | %Concatenate 10 short symbols together |
|---|
| 34 | shortsyms_10 = repmat(shortSymbol_time,1,10); |
|---|
| 35 | |
|---|
| 36 | %Concatenate and cyclicly extend two long symbols |
|---|
| 37 | %longsyms_2 = [longSymbol_time(33:64) repmat(longSymbol_time,1,2)]; |
|---|
| 38 | %longSymbol_time = linspace(-1/6, 1/6, 64); |
|---|
| 39 | longsyms_2 = [repmat(longSymbol_time,1,2) longSymbol_time(1:32)]; |
|---|
| 40 | |
|---|
| 41 | %Scale the resulting time-domain preamble to fit [-1,1] |
|---|
| 42 | preamble = 6*[0 shortsyms_10 longsyms_2]; |
|---|
| 43 | preamble_I = real(preamble);%[+1*ones(1,length(preamble)-1) -0.1]; |
|---|
| 44 | preamble_Q = imag(preamble);%[-1*ones(1,length(preamble)-1) +0.1]; |
|---|
| 45 | |
|---|
| 46 | %Configure the pilot tone registers |
|---|
| 47 | pilot1_indicies = 7 + ( (64-7) * 2^16); |
|---|
| 48 | pilot2_indicies = 21 + ( (64-21) * 2^16); |
|---|
| 49 | pilotValue_pos = hex2dec('7FFF') + (2^16 * 0); |
|---|
| 50 | pilotValue_neg = hex2dec('8000') + (2^16 * 0); |
|---|
| 51 | |
|---|
| 52 | |
|---|
| 53 | train = [0 -1 1 -1 1 -1 1 -1 1 -1 -1 -1 -1 1 1 -1 1 1 1 1 1 -1 -1 1 1 -1 -1 0 0 0 0 0 0 0 0 0 0 0 1 -1 1 1 1 -1 -1 -1 -1 1 1 -1 1 -1 1 1 -1 1 1 1 -1 -1 -1 -1 -1 -1]; |
|---|
| 54 | train = train * -1; |
|---|
| 55 | train(22) = -1; |
|---|
| 56 | train(58) = 1; |
|---|
| 57 | |
|---|
| 58 | |
|---|
| 59 | train = [train train]; |
|---|
| 60 | |
|---|
| 61 | |
|---|
| 62 | |
|---|
| 63 | BER_RAM_init_size = 2048; |
|---|
| 64 | RAM_init_size = max_numBytes; |
|---|
| 65 | |
|---|
| 66 | |
|---|
| 67 | subcarrier_masks = ones(1,numSubcarriers); |
|---|
| 68 | subcarrier_masks(1)=0; |
|---|
| 69 | subcarrier_masks(8)=0; |
|---|
| 70 | subcarrier_masks(22)=0; |
|---|
| 71 | subcarrier_masks(44)=0; |
|---|
| 72 | subcarrier_masks(58)=0; |
|---|
| 73 | subcarrier_masks([28:32])=0; |
|---|
| 74 | subcarrier_masks([33:38])=0; |
|---|
| 75 | |
|---|
| 76 | |
|---|
| 77 | |
|---|
| 78 | mod_baseRate = 2; |
|---|
| 79 | modMask_antA = 2; |
|---|
| 80 | modMask_antB = 2*(1-tx_SISO_Mode); |
|---|
| 81 | |
|---|
| 82 | modulation_antA = modMask_antA*subcarrier_masks; |
|---|
| 83 | modulation_antB = modMask_antB*subcarrier_masks; |
|---|
| 84 | |
|---|
| 85 | modulation_antA = 15*subcarrier_masks; |
|---|
| 86 | modulation_antB = 15*subcarrier_masks; |
|---|
| 87 | |
|---|
| 88 | modulation_baseRate = mod_baseRate*subcarrier_masks; |
|---|
| 89 | |
|---|
| 90 | |
|---|
| 91 | |
|---|
| 92 | subcarrier_QAM_Values = [modulation_antA modulation_antB modulation_baseRate]; |
|---|
| 93 | numBytes_BaseRateOFDMSymbol = sum(modulation_baseRate)/8; |
|---|
| 94 | |
|---|
| 95 | numBytes_AFullRateOFDMSymbol = sum(bitand(modMask_antA,modulation_antA))/8; |
|---|
| 96 | numBytes_BFullRateOFDMSymbol = sum(bitand(modMask_antB,modulation_antB))/8; |
|---|
| 97 | |
|---|
| 98 | |
|---|
| 99 | numBytes_FullRateOFDMSymbol = numBytes_AFullRateOFDMSymbol; |
|---|
| 100 | if(tx_SISO_Mode == 1) |
|---|
| 101 | numBytes_FullRateOFDMSymbol = numBytes_AFullRateOFDMSymbol; |
|---|
| 102 | else |
|---|
| 103 | numBytes_FullRateOFDMSymbol = (numBytes_AFullRateOFDMSymbol + numBytes_BFullRateOFDMSymbol)/2; |
|---|
| 104 | end |
|---|
| 105 | |
|---|
| 106 | |
|---|
| 107 | subcarrier_QAM_Values_bytes = reshape([modulation_antA modulation_antB], 2, numSubcarriers); |
|---|
| 108 | subcarrier_QAM_Values_bytes = sum(subcarrier_QAM_Values_bytes .* [ones(1,64).*2^4; ones(1,64)]); |
|---|
| 109 | |
|---|
| 110 | |
|---|
| 111 | numTrainingSymbols = 2; |
|---|
| 112 | numBaseRateSymbols = 2; |
|---|
| 113 | |
|---|
| 114 | |
|---|
| 115 | rand('state',1); |
|---|
| 116 | |
|---|
| 117 | |
|---|
| 118 | |
|---|
| 119 | pkt_numPayloadBytes = 1250; |
|---|
| 120 | |
|---|
| 121 | |
|---|
| 122 | |
|---|
| 123 | |
|---|
| 124 | |
|---|
| 125 | if(tx_SISO_Mode == 1) |
|---|
| 126 | numFullRateSymbols = 2*ceil(pkt_numPayloadBytes/numBytes_FullRateOFDMSymbol); |
|---|
| 127 | else |
|---|
| 128 | numFullRateSymbols = ceil(pkt_numPayloadBytes/numBytes_FullRateOFDMSymbol); |
|---|
| 129 | end |
|---|
| 130 | numFullRateSymbols = numFullRateSymbols + mod(numFullRateSymbols, 2); |
|---|
| 131 | |
|---|
| 132 | |
|---|
| 133 | byteIndex_numPayloadBytes = [3 2]; |
|---|
| 134 | byteIndex_simpleDynModMasks = 0; |
|---|
| 135 | numHeaderBytes = 24; |
|---|
| 136 | |
|---|
| 137 | |
|---|
| 138 | pkt_totalBytes = numHeaderBytes + pkt_numPayloadBytes + 4; |
|---|
| 139 | |
|---|
| 140 | |
|---|
| 141 | |
|---|
| 142 | |
|---|
| 143 | packetHeader = [... |
|---|
| 144 | (modMask_antA + modMask_antB*2^4) ... |
|---|
| 145 | 0 ... |
|---|
| 146 | floor((pkt_totalBytes/256))... |
|---|
| 147 | mod(pkt_totalBytes,256)... |
|---|
| 148 | zeros(1,20) ... |
|---|
| 149 | ]; |
|---|
| 150 | |
|---|
| 151 | |
|---|
| 152 | packetHeader = [fliplr(packetHeader(1:8)) fliplr(packetHeader(9:16)) fliplr(packetHeader(17:24))]; |
|---|
| 153 | |
|---|
| 154 | |
|---|
| 155 | packet = [packetHeader 1:(pkt_numPayloadBytes-length(packetHeader)-4)]; |
|---|
| 156 | |
|---|
| 157 | |
|---|
| 158 | packet = mod(packet,256); |
|---|
| 159 | |
|---|
| 160 | |
|---|
| 161 | |
|---|
| 162 | packet = [packet calcTxCRC(packet)]; |
|---|
| 163 | |
|---|
| 164 | |
|---|
| 165 | |
|---|
| 166 | simOnly_numSamples = length(preamble)+( (numSubcarriers+CPLength)*(numTrainingSymbols + numBaseRateSymbols + numFullRateSymbols/2) ); |
|---|
| 167 | |
|---|
| 168 | |
|---|
| 169 | txReg_symbolCounts = (2^16 * numFullRateSymbols) + (2^8 *numBaseRateSymbols ) + numTrainingSymbols; |
|---|
| 170 | |
|---|
| 171 | |
|---|
| 172 | |
|---|
| 173 | |
|---|
| 174 | packet_length = length(packet)-1; |
|---|
| 175 | RAM_init_values = [packet, zeros(1,RAM_init_size-1-packet_length)]; |
|---|
| 176 | |
|---|
| 177 | BER_RAM_init_values = RAM_init_values(1:BER_RAM_init_size); |
|---|
| 178 | BER_RAM_init_values = reshape(flipud(reshape(BER_RAM_init_values, 8, BER_RAM_init_size/8)), 1, BER_RAM_init_size); |
|---|
| 179 | |
|---|
| 180 | |
|---|
| 181 | lpf_h = [1.296923e-003 1.408510e-003 1.257711e-003 3.226648e-005 -2.519384e-003 -6.198394e-003 -1.022530e-002 -1.333438e-002 -1.410672e-002 -1.149196e-002 -5.345330e-003 3.224983e-003 1.190534e-002 1.770326e-002 1.787723e-002 1.101327e-002 -2.108767e-003 -1.821814e-002 -3.204219e-002 -3.756010e-002 -2.972681e-002 -6.174810e-003 3.165421e-002 7.836874e-002 1.256233e-001 1.640445e-001 1.855768e-001 1.855768e-001 1.640445e-001 1.256233e-001 7.836874e-002 3.165421e-002 -6.174810e-003 -2.972681e-002 -3.756010e-002 -3.204219e-002 -1.821814e-002 -2.108767e-003 1.101327e-002 1.787723e-002 1.770326e-002 1.190534e-002 3.224983e-003 -5.345330e-003 -1.149196e-002 -1.410672e-002 -1.333438e-002 -1.022530e-002 -6.198394e-003 -2.519384e-003 3.226648e-005 1.257711e-003 1.408510e-003 1.296923e-003]; |
|---|
| 182 | lpf_h = firpm(53,[0 .18 .21 1],[1 1 0 0]); |
|---|
| 183 | |
|---|
| 184 | lpf_h_tx = rcosfir(.25, 5, 5, 1, 'sqrt'); |
|---|
| 185 | |
|---|
| 186 | lpf_h_rx = rcosfir(.25, 5, 5, 1, 'sqrt'); |
|---|
| 187 | |
|---|
| 188 | |
|---|
| 189 | txLSFR_numBits = 13; |
|---|
| 190 | txLSFR_polynomials = {'21' '35' '0B' '1D' '35' '0B' '3D' '2B'}; |
|---|
| 191 | txLSFR_initValues = {'3F' '1B' '03' '35' '17' '0A' '74' '39'}; |
|---|
| 192 | |
|---|
| 193 | |
|---|
| 194 | modConstellation_prec = 8; |
|---|
| 195 | modConstellation_bp = 7; |
|---|
| 196 | |
|---|
| 197 | |
|---|
| 198 | |
|---|
| 199 | |
|---|
| 200 | |
|---|
| 201 | |
|---|
| 202 | |
|---|
| 203 | |
|---|
| 204 | |
|---|
| 205 | |
|---|
| 206 | modConstellation_qpsk = [1 -1]./sqrt(2); |
|---|
| 207 | |
|---|
| 208 | |
|---|
| 209 | |
|---|
| 210 | |
|---|
| 211 | |
|---|
| 212 | modConstellation_qam16 = .75*[1 3 -1 -3]./3; |
|---|
| 213 | |
|---|
| 214 | |
|---|
| 215 | |
|---|
| 216 | |
|---|
| 217 | |
|---|
| 218 | |
|---|
| 219 | |
|---|
| 220 | |
|---|
| 221 | modConstellation_qam64 = 0.875*[3 1 5 7 -3 -1 -5 -7]./7; |
|---|
| 222 | |
|---|
| 223 | |
|---|
| 224 | |
|---|
| 225 | |
|---|
| 226 | |
|---|
| 227 | |
|---|
| 228 | |
|---|
| 229 | modConstellation_qam256 = 0.9375*[3 1 5 7 11 9 13 15 -3 -1 -5 -7 -11 -9 -13 -15]./15; |
|---|
| 230 | |
|---|
| 231 | |
|---|
| 232 | |
|---|
| 233 | |
|---|
| 234 | |
|---|
| 235 | |
|---|
| 236 | [x, interpFilter] = interp(longSymbol_time, 5); |
|---|
| 237 | [x, interpFilter_4] = interp(longSymbol_time, 4); |
|---|
| 238 | |
|---|
| 239 | antB_preambleShift = 4; |
|---|
| 240 | |
|---|
| 241 | |
|---|
| 242 | |
|---|
| 243 | |
|---|
| 244 | |
|---|
| 245 | |
|---|
| 246 | tx_controlBits = (antB_preambleShift * 2^4) + (2^0 * tx_SISO_Mode) + 4*0 + 8*1; |
|---|
| 247 | |
|---|
| 248 | |
|---|
| 249 | TxRx_FFTScaling = bin2dec('010111') + (bin2dec('000101') * 2^6); |
|---|
| 250 | |
|---|
| 251 | |
|---|
| 252 | |
|---|
| 253 | TxDataScrambling_Seq = [40 198 78 63 82 173 102 245 48 111 172 115 147 230 216 93 72 65 62 2 205 242 122 90 128 83 105 97 73 10 5 252]; |
|---|
| 254 | RxDataScrambling_Seq = [40 198 78 63 82 173 102 245 48 111 172 115 147 230 216 93 72 65 62 2 205 242 122 90 128 83 105 97 73 10 5 252]; |
|---|