Определите задержку convolutionally закодированной и отфильтрованной ссылки. Используйте задержку, чтобы точно определить количество битовых ошибок.
Создайте модулятор 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');
Сгенерируйте случайные двоичные данные. Convolutionally кодируют данные.
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
Подтвердите, что вычисленная задержка совпадает с ожидаемой задержкой, которая равна сумме групповой задержки согласованных фильтров и traceback глубины Декодера Витерби.
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