Создайте модулятор с 16 PSK и Систему демодулятора objects™, в котором используется пользовательское отображение символа. Оцените, что BER в AWGN образовывает канал и сравнивает производительность с той из теоретической серо-закодированной системы PSK.
Создайте пользовательское отображение символа для схемы модуляции с 16 PSK. 16 целочисленных символов должны иметь значения, которые падают между 0 и 15.
custMap = [0 2 4 6 8 10 12 14 15 13 11 9 7 5 3 1];
Создайте модулятор с 16 PSK и пару демодулятора, задающую пользовательский символ, сопоставляющий массивом, custMap
.
pskModulator = comm.PSKModulator(16,'BitInput',true, ... 'SymbolMapping','Custom', ... 'CustomSymbolMapping',custMap); pskDemodulator = comm.PSKDemodulator(16,'BitOutput',true, ... 'SymbolMapping','Custom', ... 'CustomSymbolMapping',custMap);
Отобразите созвездие модулятора.
constellation(pskModulator)
Создайте Системный объект канала AWGN для использования с 16-ary данными.
awgnChannel = comm.AWGNChannel('BitsPerSymbol',log2(16));
Создайте объект коэффициента ошибок отследить статистику BER.
errorRate = comm.ErrorRate;
Инициализируйте векторы симуляции. Eb/No варьируется от 6 до 18 дБ на шагах на 1 дБ.
ebnoVec = 6:18; ber = zeros(size(ebnoVec));
Оцените BER путем модуляции двоичных данных, передачи его через канал AWGN, демодуляции полученного сигнала и собирания ошибочных статистических данных.
for k = 1:length(ebnoVec) % Reset the error counter for each Eb/No value reset(errorRate) % Reset the array used to collect the error statistics errVec = [0 0 0]; % Set the channel Eb/No awgnChannel.EbNo = ebnoVec(k); while errVec(2) < 200 && errVec(3) < 1e7 % Generate a 1000-symbol frame data = randi([0 1],4000,1); % Modulate the binary data modData = pskModulator(data); % Pass the modulated data through the AWGN channel rxSig = awgnChannel(modData); % Demodulate the received signal rxData = pskDemodulator(rxSig); % Collect the error statistics errVec = errorRate(data,rxData); end % Save the BER data ber(k) = errVec(1); end
Сгенерируйте теоретические данные о BER для канала AWGN с помощью berawgn
.
berTheory = berawgn(ebnoVec,'psk',16,'nondiff');
Постройте симулированные и теоретические результаты. Поскольку симулированные результаты используют модуляцию с 16 PSK, которая не использует Коды Грея, производительность не так хороша как предсказанный теорией.
figure semilogy(ebnoVec,[ber; berTheory]) xlabel('Eb/No (dB)') ylabel('BER') grid legend('Simulation','Theory','location','ne')