В этом разделе описывается, как вычислить статистику ошибок для различных коммуникационных систем.
biterr
функция, обсуждаемая в разделе Compute SER и BER Using Simulated Data, может помочь вам собрать эмпирическую статистику ошибок, но проверка результатов путем сравнения их с теоретической статистикой ошибок является хорошей практикой. Для некоторых типов коммуникационных систем существуют выражения закрытой формы для расчета частоты битовой ошибки (BER) или приблизительной границы на BER. Функции, перечисленные в этой таблице, вычисляют выражения закрытой формы для BER или привязки к нему для заданных типов коммуникационных систем.
Тип коммуникационной системы | Функция |
---|---|
Незакодированный канал AWGN | berawgn
|
Незакодированный канал Релея и Райса с замираниями | berfading
|
Закодированный канал AWGN | bercoding |
Незакодированный канал AWGN с несовершенной синхронизацией | bersync
|
Аналитические выражения, используемые в этих функциях, рассматриваются в Аналитических выражениях и обозначениях, используемых в BER Analysis. На страницах с описанием этих функций также перечислены ссылки на одну или несколько книг, содержащих выражение закрытой формы, реализованное функцией.
Этот пример использует bercoding
функция для вычисления верхних границ BER для сверточного кодирования декодером с мягким решением.
coderate = 1/4; % Code rate
Создайте структуру, dspec
, с информацией о спектре расстояния. Задайте отношение энергии на бит к шуму степени спектральной плотности () протянуть диапазон и сгенерировать теоретические связанные результаты.
dspec.dfree = 10; % Minimum free distance of code dspec.weight = [1 0 4 0 12 0 32 0 80 0 192 0 448 0 1024 ... 0 2304 0 5120 0]; % Distance spectrum of code EbNo = 3:0.5:8; berbound = bercoding(EbNo,'conv','soft',coderate,dspec);
Постройте график теоретических связанных результатов.
semilogy(EbNo,berbound) xlabel('E_b/N_0 (dB)'); ylabel('Upper Bound on BER'); title('Theoretical Bound on BER for Convolutional Coding'); grid on;
Использование berawgn
функция, вычислите теоретические частоты ошибок символов (SERs) для импульсно-амплитудной модуляции (PAM) в области значений значения. Симулируйте 8 PAM с каналом AWGN и вычислите эмпирические SER. Сравните теоретические, а затем эмпирические SER путем построения их на том же наборе осей.
Вычислите и постройте график теоретического SER с помощью berawgn
.
rng('default') % Set random number seed for repeatability M = 8; EbNo = 0:13; [ber,ser] = berawgn(EbNo,'pam',M); semilogy(EbNo,ser,'r'); legend('Theoretical SER'); title('Theoretical Error Rate'); xlabel('E_b/N_0 (dB)'); ylabel('Symbol Error Rate'); grid on;
Вычислите эмпирический SER путем симуляции коммуникационной системы ссылки 8 PAM. Задайте параметры симуляции и предварительно выделите переменные, необходимые для результатов. Как описано в [1], потому что , добавить 3 дБ к значение при преобразовании значения в значения ОСШ.
n = 10000; % Number of symbols to process k = log2(M); % Number of bits per symbol snr = EbNo+3+10*log10(k); % In dB ynoisy = zeros(n,length(snr)); z = zeros(n,length(snr)); errVec = zeros(3,length(EbNo));
Создайте калькулятор частоты ошибок Системный объект, чтобы сравнить декодированные символы с исходными переданными символами.
errcalc = comm.ErrorRate;
Сгенерируйте случайное сообщение данных и примените PAM. Нормализуйте канал до степени сигнала. Закольцовывайте симуляцию, чтобы сгенерировать частоты ошибок в области значений значений ОСШ.
x = randi([0 M-1],n,1); % Create message signal y = pammod(x,M); % Modulate signalpower = (real(y)'*real(y))/length(real(y)); for jj = 1:length(snr) reset(errcalc) ynoisy(:,jj) = awgn(real(y),snr(jj),'measured'); % Add AWGN z(:,jj) = pamdemod(complex(ynoisy(:,jj)),M); % Demodulate errVec(:,jj) = errcalc(x,z(:,jj)); % Compute SER from simulation end
Сравните теоретические и эмпирические результаты.
hold on; semilogy(EbNo,errVec(1,:),'b.'); legend('Theoretical SER','Empirical SER'); title('Comparison of Theoretical and Empirical Error Rates'); hold off;
В этом разделе описывается, как сравнить сообщения данных, которые заходят и покидают симуляцию коммуникационной системы, и как вычислить статистику ошибок с помощью метода Монте-Карло. Симуляции могут измерять производительность системы при помощи сообщений данных перед передачей и после приема, чтобы вычислить BER или SER для коммуникационной системы. Чтобы исследовать компоненты физического слоя, используемые для моделирования и симуляции коммуникационных систем, смотрите компоненты PHY.
Аппроксимирование кривыми может быть полезным, когда у вас есть небольшой или несовершенный набор данных, но вы хотите построить гладкую кривую для целей презентации. Чтобы исследовать использование аппроксимации кривых при вычислении результатов производительности с помощью симуляции, смотрите раздел Curve Fitting for Error Rate Plots.
Пример показывает, как вычислить SER и BER с помощью biterr
и symerr
функций, соответственно. The symerr
функция сравнивает два набора данных и вычисляет количество ошибок символов и SER. The biterr
функция сравнивает два набора данных и вычисляет количество битовых ошибок и BER. Ошибка является расхождением между соответствующими точками в двух наборах данных.
Эти два набора данных обычно представляют сообщения, поступающие в передатчик, и восстановленные сообщения, покидающие приемник. Можно также сравнить данные, вводимые и покидающие другие части вашей коммуникационной системы (для примера, данные, поступающие в энкодер и данные, покидающие декодер).
Если ваша коммуникационная система использует несколько биты, чтобы представлять один символ, подсчет ошибок символов отличается от подсчета битовых ошибок. В случае подсчета символов или битов вероятность ошибки является количеством ошибок, разделенных на общее количество переданных символов или бит, соответственно.
Обычно моделирование достаточного количества данных для получения по меньшей мере 100 ошибок обеспечивает точные результаты вероятности ошибок. Если вероятность ошибки очень мала (для примера, или менее), использование семианалитического метода может вычислить результат быстрее, чем использование подхода только для симуляции. Для получения дополнительной информации смотрите Результаты Эффективности с помощью Semianalytic Technique.
Вычисление частот ошибок
Используйте symerr
функция для вычисления SER для шумного линейного блочного кода. Не применяйте цифровую модуляцию, так что каждый символ содержит один бит. Когда каждый символ является одним битом, ошибки символов и битовые ошибки одинаковы.
После искусственного добавления шума к закодированному сообщению сравните полученный шумный код с оригинальным кодом. Затем декодируйте и сравните декодированное сообщение с исходным сообщением.
m = 3; % Set parameters for Hamming code n = 2^m-1; k = n-m; msg = randi([0 1],k*200,1); % Specify 200 messages of k bits each code = encode(msg,n,k,'hamming'); codenoisy = bsc(code,0.95); % Add noise newmsg = decode(codenoisy,n,k,'hamming'); % Decode and correct errors
Вычислите SER
[~,noisyVec] = symerr(code,codenoisy); [~,decodedVec] = symerr(msg,newmsg);
Вероятность ошибки уменьшается после декодирования, потому что декодер Hamming исправляет ошибки, основанные на возможности исправления ошибок строения декодера. Поскольку генераторы случайных чисел генерируют сообщение и добавляется шум, результаты варьируются от запуска до запуска. Отображение SER.
disp(['SER in the received code: ',num2str(noisyVec(1))])
SER in the received code: 0.94571
disp(['SER after decoding: ',num2str(decodedVec(1))])
SER after decoding: 0.9675
Сравнение SER и BER
Эти команды показывают различие между ошибками символов и битовыми ошибками в различных ситуациях.
Создать два десятичных вектора с тремя элементами и показать двоичное представление. Векторная a
содержит три 2-битных символа и вектор b
содержит три 3-битных символа.
a = [1 2 3]'; b = [1 4 4]'; de2bi(a)
ans = 3×2
1 0
0 1
1 1
de2bi(b)
ans = 3×3
1 0 0
0 0 1
0 0 1
Сравните двоичные значения двух векторов и вычислите количество ошибок и вероятность ошибок при помощи biterr
и symerr
функций.
format rat % Display fractions instead of decimals [snum,srate] = symerr(a,b)
snum = 2
srate = 2/3
snum
является 2
потому что вторая и третья записи имеют бит- различия. srate
является 2/3
поскольку общее количество символов 3
.
[bnum,brate] = biterr(a,b)
bnum = 5
brate = 5/9
bnum
является 5
потому что вторые значения различаются двумя битами, а третьи - тремя битами. brate
является 5/9
поскольку общее количество бит 9
. По определению, общее количество бит является количеством записей в a
для расчетов ошибок символов или b
для расчетов битовой ошибки максимальное количество бит среди всех записей a
и b
, соответственно.
Метод, описанный в разделе Эффективности Результаты через симуляцию, может работать для большого разнообразия коммуникационных систем, но может быть запредельно длительным для небольших частот ошибок (для примера, 10-6 или меньше). Семианалитический метод является альтернативным способом вычисления частот ошибок. Семианалитический метод может привести к результатам быстрее, чем неаналитический метод, который использует моделируемые данные.
Для получения дополнительной информации о реализации семианалитического метода с использованием комбинации симуляции и анализа для определения частоты ошибок коммуникационной системы, см. semianalytic
функция.
Создание графиков вероятности ошибок с использованием semilogy
Функция
Используйте Аппроксимирование Кривыми на графике частоты ошибок
Графики вероятности ошибок могут быть полезны при изучении эффективности коммуникационной системы и часто включаются в публикации. В этом разделе рассматриваются и демонстрируются инструменты, которые вы можете использовать, чтобы создать графики частоты ошибок, изменить их в соответствии с вашими потребностями и выполнить аппроксимирование кривыми на данных о вероятности ошибок и графиках.
semilogy
ФункцияНа многих графиках частоты ошибок горизонтальная ось указывает E значения b/ N 0 в дБ, а вертикальная ось указывает частоту ошибок, используя логарифмическую (базовую 10) шкалу. Для примеров, которые создают такой график, используя semilogy
функция, см. Сравнение теоретических и эмпирических частот ошибок и график теоретических частот ошибок.
Аппроксимирование кривыми может быть полезным, когда у вас есть небольшой или несовершенный набор данных, но вы хотите построить гладкую кривую для целей презентации. berfit
функция включает аппроксимирования кривыми возможности, которые помогают вашему анализу, когда эмпирические данные описывают частоты ошибок при разных значениях E b/ N 0. Эта функция позволяет вам:
Настройте различные релевантные аспекты процесса аппроксимирования кривыми, такие как список вариантов выбора для типа функции закрытой формы, используемой для генерации подгонки.
Постройте график эмпирических данных вместе с кривой, которая berfit
соответствует данным.
Интерполируйте точки на подобранной кривой между значениями E b/ N 0 в эмпирическом наборе данных, чтобы сгладить график.
Соберите соответствующую информацию о подгонке, например, числовые значения точек вдоль подобранной кривой и коэффициенты выражения подгонки.
Примечание
berfit
функция предназначена для аппроксимирования кривыми или интерполяции, а не экстраполяции. Экстраполяция данных BER сверх порядка величины ниже наименьшего эмпирического значения BER по своей сути ненадежна.
В этом примере моделируется простой дифференциальный двоичный метод фазы сдвига keying (DBPSK) коммуникационной системы и строятся графики данных о вероятности ошибок для ряда значения. Он использует berfit
и berconfint
функции для подгонки кривой к набору эмпирических частот ошибок.
Инициализация параметров симуляции
Задайте длину входного сигнала сообщения, порядок модуляции, область значений значения для симуляции и минимальное количество ошибок, которые должны произойти до того, как симуляция вычислит частоту ошибок для заданного значение. Предварительно распределите переменные для конечных результатов и промежуточных результатов.
Как правило, для статистически точных результатов частоты ошибок минимальное количество ошибок должно быть порядка 100. Эта симуляция использует небольшое количество ошибок, чтобы сократить время запуска и проиллюстрировать, как аппроксимирование кривыми может сгладить набор результатов.
siglen = 100000; % Number of bits in each trial M = 2; % DBPSK is binary EbN0vec = 0:5; % Vector of EbN0 values minnumerr = 5; % Compute BER after only 5 errors occur numEbN0 = length(EbN0vec); % Number of EbN0 values ber = zeros(1,numEbN0); % Final BER values berVec = zeros(3,numEbN0); % Updated BER values intv = cell(1,numEbN0); % Cell array of confidence intervals
Создайте калькулятор частоты ошибок System object™.
errorCalc = comm.ErrorRate;
Закольцовывание симуляции
Симулируйте коммуникационную систему с модуляцией DBPSK и вычислите BER с помощью for
цикл, чтобы изменить значение. Внутренний while
цикл гарантирует, что минимальное количество битовых ошибок произойдет для каждого значение. Статистика вероятности ошибок сохранена для каждого значение и используется позже в этом примере при аппроксимировании кривыми и графическом изображении.
for jj = 1:numEbN0 EbN0 = EbN0vec(jj); snr = EbN0; % For binary modulation SNR = EbN0 reset(errorCalc) while (berVec(2,jj) < minnumerr) msg = randi([0,M-1],siglen,1); % Generate message sequence txsig = dpskmod(msg,M); % Modulate rxsig = awgn(txsig,snr,'measured'); % Add noise decodmsg = dpskdemod(rxsig,M); % Demodulate berVec(:,jj) = errorCalc(msg,decodmsg); % Calculate BER end
Используйте berconfint
функция для вычисления частоты ошибок в 98% доверительном интервале для значения.
[ber(jj),intv1] = berconfint(berVec(2,jj),berVec(3,jj),0.98); intv{jj} = intv1; disp(['EbN0 = ' num2str(EbN0) ' dB, ' num2str(berVec(2,jj)) ... ' errors, BER = ' num2str(ber(jj))]) end
EbN0 = 0 dB, 18392 errors, BER = 0.18392 EbN0 = 1 dB, 14307 errors, BER = 0.14307 EbN0 = 2 dB, 10190 errors, BER = 0.1019 EbN0 = 3 dB, 6940 errors, BER = 0.0694 EbN0 = 4 dB, 4151 errors, BER = 0.04151 EbN0 = 5 dB, 2098 errors, BER = 0.02098
Используйте berfit
функция для построения графика наиболее подходящей кривой, интерполяция между точками BER для получения плавного графика. Добавьте доверительные интервалы к графику.
fitEbN0 = EbN0vec(1):0.25:EbN0vec(end); % Interpolation values berfit(EbN0vec,ber,fitEbN0); hold on; for jj=1:numEbN0 semilogy([EbN0vec(jj) EbN0vec(jj)],intv{jj},'g-+'); end hold off;