С 16 PSK с пользовательским отображением символа

Создайте модулятор с 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')