Найдите задержку для закодированного и фильтрованного сигнала

Определите задержку для сверточно закодированного и отфильтрованной ссылки. Используйте задержку, чтобы точно определить количество битовых ошибок.

Создайте пару 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