Определите задержку для сверточно закодированного и отфильтрованной ссылки. Используйте задержку, чтобы точно определить количество битовых ошибок.
Создайте пару QPSK модулятора и демодулятора. Задайте объекты для работы с битами.
qpskmod = comm.QPSKModulator('BitInput',true); qpskdemod = comm.QPSKDemodulator('BitOutput',true);
Создайте пару приподнятого косинуса для передачи и приема фильтра.
txfilt = comm.RaisedCosineTransmitFilter; rxfilt = comm.RaisedCosineReceiveFilter;
Создайте сверточный энкодер и пару декодера Viterbi.
convEnc = comm.ConvolutionalEncoder; vitDec = comm.ViterbiDecoder('InputFormat','Hard');
Сгенерируйте случайные двоичные данные. Сверточно закодируйте данные.
txData = randi([0 1],1000,1); encData = convEnc(txData);
Модулируйте закодированные данные. Пропустите модулированные данные через фильтр передачи приподнятого косинуса.
modSig = qpskmod(encData); txSig = txfilt(modSig);
Пропустите отфильтрованный сигнал через канал AWGN.
rxSig = awgn(txSig,20,'measured');
Пропустите и затем демодулируйте принятый сигнал.
filtSig = rxfilt(rxSig); demodSig = qpskdemod(filtSig);
Декодируйте демодулированные данные.
rxData = vitDec(demodSig);
Найдите задержку между переданными и принятыми двоичными данными при помощи finddelay
функция.
td = finddelay(txData,rxData)
td = 44
Подтвердите, что вычисленная задержка соответствует ожидаемой задержке, которая равна сумме групповой задержки согласованных фильтров и глубине следа декодера Viterbi.
tdexpected = (txfilt.FilterSpanInSymbols + rxfilt.FilterSpanInSymbols)/2 + ...
vitDec.TracebackDepth;
isequal(td,tdexpected)
ans = logical
1
Вычислим количество битовых ошибок, отбросив последнюю td
биты из переданной последовательности и отбрасывание первого td
биты из принятой последовательности.
numErrors = biterr(txData(1:end-td),rxData(td+1:end))
numErrors = 0