Передайте кодированные Ридом-Соломоном данные с использованием QPSK по каналу AWGN. Демодулируйте и декодируйте принятый сигнал и собирайте статистику ошибок. Вычислите теоретическую вероятность битовой ошибки (BER) для кодированных и некодированных данных. Постройте график результатов BER для сравнения эффективности.
Определите параметры примера.
rng(1993); % Seed random number generator for repeatable results M = 4; % Modulation order bps = log2(M); % Bits per symbol N = 7; % RS codeword length K = 5; % RS message length
Создайте модулятор, демодулятор, канал AWGN и объекты частоты ошибок.
pskModulator = comm.PSKModulator('ModulationOrder',M,'BitInput',true); pskDemodulator = comm.PSKDemodulator('ModulationOrder',M,'BitOutput',true); awgnChannel = comm.AWGNChannel('BitsPerSymbol',bps); errorRate = comm.ErrorRate;
Создайте (7,5) пару Рида-Соломона энкодера и декодера, которая принимает бит входы.
rsEncoder = comm.RSEncoder('BitInput',true,'CodewordLength',N,'MessageLength',K); rsDecoder = comm.RSDecoder('BitInput',true,'CodewordLength',N,'MessageLength',K);
Установите область значений значения и учитывают коэффициент усиления RS-кодирования. Инициализируйте матрицу статистики ошибок.
ebnoVec = (3:0.5:8)';
ebnoVecCodingGain = ebnoVec + 10*log10(K/N); % Account for RS coding gain
errorStats = zeros(length(ebnoVec),3);
Оцените вероятность битовой ошибки для каждого значение. Симуляция выполняется до 100 ошибок или обнаружены биты. Обработка основного цикла симуляции включает в себя кодирование, модуляцию, демодуляцию и декодирование.
for i = 1:length(ebnoVec) awgnChannel.EbNo = ebnoVecCodingGain(i); reset(errorRate) while errorStats(i,2) < 100 && errorStats(i,3) < 1e7 data = randi([0 1],1500,1); % Generate binary data encData = rsEncoder(data); % RS encode modData = pskModulator(encData); % Modulate rxSig = awgnChannel(modData); % Pass signal through AWGN rxData = pskDemodulator(rxSig); % Demodulate decData = rsDecoder(rxData); % RS decode errorStats(i,:) = errorRate(data,decData); % Collect error statistics end end
Подбор кривой к данным BER с помощью berfit
. Сгенерируйте оценку эффективности QPSK с использованием и без использования bercoding
и berawgn
функций.
berCurveFit = berfit(ebnoVecCodingGain,errorStats(:,1)); berwCoding = bercoding(ebnoVec,'RS','hard',N,K,'psk',M,'nondiff'); berNoCoding = berawgn(ebnoVec,'psk',M,'nondiff');
Постройте график закодированных данных BER RS, подгонку кривых данных BER, теоретической эффективности с кодированием RS и теоретической эффективности без кодирования RS. (7,5) Код RS улучшает требуется для достижения вероятность битовой ошибки приблизительно на 1,2 дБ.
semilogy(ebnoVecCodingGain,errorStats(:,1),'b*', ... ebnoVecCodingGain,berCurveFit,'c-',ebnoVecCodingGain,berwCoding,'r',ebnoVec,berNoCoding) ylabel('BER') xlabel('Eb/No (dB)') legend('RS coded BER','Curve Fit','Theory with coding','Theory no coding') grid