Эта тема описывает, как вычислить ошибочную статистику для различных систем связи.
biterr
функция, обсужденная в разделе Compute SERs и BERs Using Simulated Data, может помочь вам собрать эмпирическую ошибочную статистику, но проверка ваших результатов путем сравнения их с теоретической ошибочной статистикой является хорошей практикой. Для определенных типов систем связи выражения закрытой формы существуют для расчета частоты ошибок по битам (BER), или аппроксимированное привязало BER. Функции, перечисленные в этой таблице, вычисляют выражения закрытой формы для BER или привязанного это для заданных типов систем связи.
Тип системы связи | Функция |
---|---|
Незакодированный канал AWGN | berawgn
|
Незакодированный Rayleigh и Rician, исчезающий канал | berfading
|
Закодированный канал AWGN | bercoding |
Незакодированные AWGN образовывают канал с несовершенной синхронизацией | bersync
|
Аналитические выражения, используемые в этих функциях, обсуждены в Аналитических Выражениях и Обозначениях, Используемых в Анализе BER. Страницы с описанием этих функций также перечисляют ссылки на одну или несколько книг, содержащих выражения закрытой формы, реализованные функцией.
Этот пример использует bercoding
функция, чтобы вычислить верхние границы на BERs для сверточного кодирования с декодером мягкого решения.
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
функционируйте, вычислите теоретические коэффициенты ошибок символа (СЕРЫ) для импульсной амплитудной модуляции (PAM) в области значений значения. Симулируйте 8 PAM с каналом AWGN и вычислите эмпирические СЕРЫ. Сравните теоретическое и затем эмпирические СЕРЫ путем графического вывода их на том же наборе осей.
Вычислите и постройте теоретический 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.
Пример показывает, как вычислить СЕРЫ и BERs использование biterr
и symerr
функции, соответственно. symerr
функция сравнивает два набора данных и вычисляет количество ошибок символа и SER. biterr
функция сравнивает два набора данных и вычисляет количество битовых ошибок и BER. Ошибка является несоответствием между соответствующими точками в двух наборах данных.
Два набора данных обычно представляют сообщения, вводящие передатчик и восстановленные сообщения, оставляя приемник. Можно также сравнить ввод данных и отъезд других частей системы связи (например, данные, вводящие энкодер и данные, оставив декодер).
Если ваша система связи использует несколько битов, чтобы представлять один символ, подсчет ошибок символа отличается от подсчета битовых ошибок. Или в символе - или в считающем бит случае, коэффициент ошибок является количеством ошибок, разделенных на общее количество переданных символов или битов, соответственно.
Как правило, симуляция достаточного количества данных, чтобы произвести по крайней мере 100 ошибок обеспечивает точные результаты коэффициента ошибок. Если коэффициент ошибок очень мал (например, или меньше), использование полуаналитического метода может вычислить результат более быстро, чем использование подхода только для симуляции. Для получения дополнительной информации смотрите раздел Performance Results via Semianalytic Technique.
Вычислите коэффициенты ошибок
Используйте symerr
функция, чтобы вычислить СЕРЫ для шумного линейного блочного кода. Не примените цифровую модуляцию, так, чтобы каждый символ содержал один бит. Когда каждый символ является одним битом, ошибки символа и битовые ошибки являются тем же самым.
После искусственного добавления шума к закодированному сообщению сравните получившийся шумный код с оригинальным кодом. Затем декодируйте и сравните декодируемое сообщение с исходным сообщением.
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
Вычислите СЕРЫ
[~,noisyVec] = symerr(code,codenoisy); [~,decodedVec] = symerr(msg,newmsg);
Уменьшения коэффициента ошибок после декодирования, потому что декодер Хэмминга корректирует ошибки на основе возможности с коррекцией ошибок настройки декодера. Поскольку генераторы случайных чисел производят сообщение, и шум добавляется, результаты варьируются от запущенного, чтобы запуститься. Отобразите СЕРЫ.
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
, соответственно.
Метод, описанный в разделе Performance Results via Simulation, может работать на большое множество систем связи, но может быть предельно длительным для небольших коэффициентов ошибок (например, 10-6 или меньше). Полуаналитический метод является альтернативным способом вычислить коэффициенты ошибок. Полуаналитический метод может привести к результатам быстрее, чем неаналитический метод, который использует симулированные данные.
Для получения дополнительной информации о реализации полуаналитического метода с помощью комбинации симуляции и анализа, чтобы определить коэффициент ошибок системы связи, смотрите semianalytic
функция.
Графики коэффициента ошибок могут быть полезными при исследовании эффективности системы связи и часто включаются в публикации. В этом разделе рассматриваются и демонстрирует инструменты, которые можно использовать, чтобы создать графики коэффициента ошибок, изменить их, чтобы удовлетворить потребностям и выполнить аппроксимирование кривыми на данных о коэффициенте ошибок и графиках.
semilogy
ФункцияВо многих графиках коэффициента ошибок горизонтальная ось указывает на значения E b/N0 в дБ, и вертикальная ось указывает на коэффициент ошибок с помощью логарифмического (базируйтесь 10), шкала. Для примеров, которые создают такой график с помощью semilogy
функционируйте, смотрите, Сравнивают Теоретические и Эмпирические Коэффициенты ошибок и График Теоретические Коэффициенты ошибок.
Аппроксимирование кривыми может быть полезным, когда вы имеете небольшой или несовершенный набор данных, но хотите построить плавную кривую в целях представления. berfit
функция включает возможности подбора кривых, которые помогают вашему анализу, когда эмпирические данные описывают коэффициенты ошибок в различных значениях E b/N0. Эта функция позволяет:
Настройте различные соответствующие аспекты процесса подбора кривых, такие как список выборов для типа функции закрытой формы раньше генерировал подгонку.
Отобразите эмпирические данные на графике наряду с кривой это berfit
подгонки к данным.
Интерполируйте точки на кривой по экспериментальным точкам между значениями E b/N0 в вашем наборе эмпирических данных, чтобы сглаживать график.
Соберите релевантную информацию о подгонке, такой как численные значения точек вдоль кривой по экспериментальным точкам и коэффициентов подходящего выражения.
Примечание
berfit
функция предназначается для аппроксимирования кривыми или интерполяции, не экстраполяции. Экстраполирование данных о BER вне порядка величины ниже наименьшего эмпирического значения BER по сути ненадежно.
Этот пример симулирует простую систему связи дифференциального бинарного манипулирования сдвига фазы (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
Создайте Систему калькулятора коэффициента ошибок 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;