Определите задержку для сверточно закодированной и отфильтрованной линии связи. Используйте задержку для точного определения количества битовых ошибок.
Создайте пару модулятора и демодулятора QPSK. Укажите объекты для работы с битами.
qpskmod = comm.QPSKModulator('BitInput',true); qpskdemod = comm.QPSKDemodulator('BitOutput',true);
Создайте восходящую пару косинусных фильтров передачи и приема.
txfilt = comm.RaisedCosineTransmitFilter; rxfilt = comm.RaisedCosineReceiveFilter;
Создайте сверточную пару кодера и декодера Витерби.
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
Убедитесь, что вычисленная задержка соответствует ожидаемой задержке, которая равна сумме групповой задержки согласованных фильтров и глубины отслеживания декодера Витерби.
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