OFDM系统各种调制阶数的QAM误码率(Symbol Error Rate)与 误比特率(Bit Error Rate)仿真结果
本文是OFDM系统的不同QAM调制阶数的误码率与误比特率仿真,仅考虑在高斯白噪声信道下的情景,着重分析不同信噪比下的误码(符号)率性能曲线,不关心具体的调制与解调方案,仿真结果与理论的误码率曲线进行了对比。
考虑一个简单的OFDM系统,每个频域子载波承载一个QAM调制符号,在经过不同信噪比白噪声信道之后,每个QAM调制符号的解调性能如何,每个符号对应的比特解码性能如何?理论的误码性能如何?可以参考如下代码:
clc;close all;clear %% Seting parameters
EbN0_list = 0:1:10;
Q_order_list = 2:2:10;
loopNumber = 10;
fprintf('Qm\t EbN0 \t \t EsN0 \t \t SNR_Cal \t \t ser \t\t ser_theory\t\t\t ber\t\t nloop \t\t \n');
for iQorder = 1 : length(Q_order_list)
for iEbN0 = 1 : length(EbN0_list) %% Frame structure
N_Frame = 10;
N_Symbol = 14;
N_RB = 106;
N_SC_perRB = 12;
N_SC = N_RB * N_SC_perRB;
N_Ant = 1;
N_fft_order = floor(log2(N_RB * N_SC_perRB));
N_fft = 2^(N_fft_order+1);
N_cp = N_fft/8;
EbN0 = EbN0_list(iEbN0); %% Modulation
Q_order = Q_order_list(iQorder);
Qm = 2^Q_order;
N_bit = N_Frame * N_Symbol * N_RB * N_SC_perRB * Q_order; %% Noise Calculation
SNR = EbN0 + 10 * log10(Q_order); %% Loop
for iloop = 1 :loopNumber
data_bit_in = randi([0 1], 1, N_bit);
dataSymbolsIn = bi2de(reshape(data_bit_in, Q_order, N_bit/Q_order).', 'left-msb');
dataMod = qammod(dataSymbolsIn, Qm,'UnitAveragePower', true); %% Show Constellation
%scatterplotme(dataMod) %% Resource Mapping
RE_Grid = zeros(N_RB * N_SC_perRB,N_Symbol * N_Frame);
dataMod_tmp = reshape(dataMod,N_RB * N_SC_perRB,[]); %only data
Power_Scale = 1;
RE_Grid_all = Power_Scale * dataMod_tmp; %% IFFT add CP
frame_mod_shift = ifftshift(RE_Grid_all);
ifft_data = ifft(frame_mod_shift,N_fft)*sqrt(N_fft);
%ifft_data = ifft(frame_mod_shift)*sqrt(1272);
Tx_cd = [ifft_data(N_fft-N_cp+1:end,:);ifft_data];
time_signal = reshape(Tx_cd,[],1); %% Channel
power_RE = sum(sum(abs(RE_Grid_all).^2)) / N_RB / N_SC_perRB / N_Symbol / N_Frame;
power_tp = sum(sum(abs(ifft_data).^2)) / N_RB / N_SC_perRB / N_Symbol / N_Frame; %IFFT zero padding averages the true RE Power
N0 = power_RE .* 10.^(-SNR / 10);
white_noise_starand = 1/sqrt(2)*(randn(size(time_signal)) + 1j * randn(size(time_signal)));
TransmittedSignal = time_signal + sqrt(N0) * white_noise_starand; %% Receive and Sys
ReceivedSignal = TransmittedSignal; %% FFT and Frame
frame_recieved_parallel = reshape(ReceivedSignal, N_fft + N_cp, []);
frame_Received = frame_recieved_parallel(N_cp + 1:end,:);
frame_Grid_Received = fft(frame_Received,N_fft) / sqrt(N_fft);
RE_Grid_all_Received = fftshift(frame_Grid_Received(1 : N_SC,:)); %% Demodulation
RE_PreDeMod = reshape(RE_Grid_all_Received,[],1);
dataSymbolsOut = qamdemod(RE_PreDeMod, Qm,'UnitAveragePower', true);
data_bit_out = reshape((de2bi(dataSymbolsOut, 'left-msb')).',1,[]);
power_RE_receid = sum(sum(abs(RE_PreDeMod).^2)) / N_RB / N_SC_perRB / N_Symbol / N_Frame;
snr_all(iQorder,iEbN0,iloop) = 10*log10(power_RE/(power_RE_receid - power_RE));
%% Result: Ser and Ber
%Ser
sym_err = length(find(dataSymbolsOut - dataSymbolsIn));
ser_all(iQorder,iEbN0,iloop) = sym_err / length(dataSymbolsOut);
%Ber
bit_error = sum(abs(data_bit_out - data_bit_in));
ber_all(iQorder,iEbN0,iloop) = bit_error / length(data_bit_out);
end
sers = mean(ser_all,3);
snrs = mean(snr_all,3);
bers = mean(ber_all,3);
sers_theory(iQorder,iEbN0) = QAM_SER_Theory(Qm,EbN0); fprintf('%dQAM\t%f\t %f\t %f\t %e\t\t%e\t\t%e\t\t%d\t\n', Qm, EbN0, SNR,snrs(iQorder,iEbN0),sers(iQorder,iEbN0),sers_theory(iQorder,iEbN0),bers(iQorder,iEbN0),loopNumber);
end
end figure(1)
semilogy(EbN0_list, bers(1,:), 'k--+');
hold on
grid on
semilogy(EbN0_list, bers(2,:), 'r--o');
semilogy(EbN0_list, bers(3,:), 'b--x');
semilogy(EbN0_list, bers(4,:), 'g--s');
xlabel('Eb/N0,dB');
ylabel('BER');
title('BER VERS SNR');
legend('QPSK','16QAM','256QAM','1024QAM'); figure(2)
semilogy(EbN0_list, sers(1,:), 'k--+');
hold on
grid on
semilogy(EbN0_list, sers_theory(1,:), 'k-');
semilogy(EbN0_list, sers(2,:), 'r--o');
semilogy(EbN0_list, sers_theory(2,:), 'r-');
semilogy(EbN0_list, sers(3,:), 'b--x');
semilogy(EbN0_list, sers_theory(3,:), 'b-');
semilogy(EbN0_list, sers(4,:), 'g--s');
semilogy(EbN0_list, sers_theory(4,:), 'g-');
xlabel('Eb/N0,dB');
ylabel('SER');
title('SER VERS SNR');
%SML = simulation, THR = theory
legend('QPSK-SML','QPSK-THR','16QAM-SML','16QAM-THR','256QAM-SML','256QAM-THR','1024QAM-SML','1024QAM-THR');
其中用到了一个计算理论误符号率的函数:
function SER = QAM_SER_Theory(Qm,EbN0)
%Reference https://dsplog.com/2012/01/01/symbol-error-rate-16qam-64qam-256qam/
Q_order = log2(Qm);
EsN0_DB = EbN0 + 10 * log10(Q_order);
EsN0 = 10.^( EsN0_DB/ 10);
k = sqrt(3 / (2*(Qm - 1)));
k_snr = k * sqrt(EsN0);
cer = erfc(k_snr);
SER = 2*(1 - 1/sqrt(Qm))*cer - (1 - 2/sqrt(Qm) + 1/Qm) * (cer.^2);
% cer = erfc(sqrt(EsN0/2));
% SER = cer - 1/4*cer.^2;
end
计算理论误比特率的函数需要参考文献,不过观察误码率与误比特率曲线,感觉只相差一个和常数,或许和调制阶数相关?
如下给出结果:
OFDM系统各种调制阶数的QAM误码率(Symbol Error Rate)与 误比特率(Bit Error Rate)仿真结果的更多相关文章
- 对正交频分复用OFDM系统的理解
OFDM系统 正交频分复用OFDM(Orthogonal Frenquency Division Multiplexing)是一种多载波调制技术. 基本思想:在发送端,它将高速串行数据经过串并变换形成 ...
- 多用户OFDM系统资源分配研究
首先,OFDMA 是什么? OFDM 技术的基本原理是将无线信道划分为若干互相正交的子信道,把高速串行数据流转化为低速并行子数据流,低速并行子数据流在子信道上独立传输. OFDMA 是LTE的下行多址 ...
- RFID 基础/分类/编码/调制/传输
不同频段的RFID产品会有不同的特性,本文详细介绍了无源的感应器在不同工作频率产品的特性以及主要的应用. 目前定义RFID产品的工作频率有低频.高频和甚高频的频率范围内的符合不同标准的不同的产品,而且 ...
- DVB-C系统中QAM调制与解调仿真
本文简单记录一下自己学习<通信原理>的时候调试的一个仿真DVB-C(Cable,数字有线电视)系统中QAM调制和解调的程序.自己一直是研究"信源"方面的东西,所以对&q ...
- OFDM通信系统的MATLAB仿真(1)
由于是第一篇博客,想先说点废话,其实自己早就想把学到的一些东西总结成文章随笔之类的供自己复习时查看的了.但是一是觉得自己学的的不够深入,总结也写不出什么很深刻的东西:二是觉得网上也有海量的资料了,需要 ...
- OFDM通信系统的MATLAB仿真(2)
关于OFDM系统的MATLAB仿真实现的第二篇随笔,在第一篇中,我们讨论的是信号经过AWGN信道的情况,只用添加固定噪声功率的高斯白噪声就好了.但在实际无线信道中,信道干扰常常是加性噪声.多径衰落的结 ...
- OFDM正交频分复用---基础入门图示
@(162 - 信号处理) 整理转载自:给小白图示讲解OFDM 下面以图示为主讲解OFDM,以"易懂"为第一要义. 注:下面的讨论如果不做说明,均假设为理想信道. *** 一张原理 ...
- CDMA与OFDM之技术比较
频谱利用率.支持高速率多媒体服务.系统容量.抗多径信道干扰等因素是目前大多数固定宽带无线接入设备商在选择CDMA(码分多址)或OFDM(正交 频分复用)作为点到多点(PMP)的关键技术时的主要出发点. ...
- compared woth QPSK, what is the advantages of QAM(16QAM or 64QAM?)
1.QPSK QPSK是英文Quadrature Phase Shift Keying的缩略语简称,意为正交相移键控,是一种数字调制方式.在数字信号的调制方式中QPSK四相移键控是目前最常用的一种卫星 ...
- 电感耦合非接触IC卡系统的EMI问题
射频识别(RFID)技术近年来发展迅速,并获得了广泛应用.但作为一种无线射频技术,其电磁兼容(EMC)性能也越来越受到人们的关注.RFID涉及的频率范围甚广,包括低于135kHz.13.56MHz.4 ...
随机推荐
- [转帖]OpenSSL版本历史
OpenSSL版本历史 新闻日志 这是所有 OpenSSL 公告的简洁日志.它们几乎是发布通知. 日期物品 2021 年 7 月 29 日OpenSSL 3.0 的 Beta 2 现已推出.这是一个候 ...
- [转帖]ioping测试
https://www.cnblogs.com/ishmaelwanglin/p/10839702.html 一个实时显示磁盘io延时的工具,以类似ping 的输出一样展示输出结果 常用参数: -c ...
- 【转帖】再谈TCP/IP三步握手&四步挥手原理及衍生问题—长文解剖IP
https://www.zhoulujun.cn/html/theory/ComputerScienceTechnology/network/2015_0708_65.html 长文是对TCP IP的 ...
- UOS 以及 部分NetworkManager管理linux服务器 设置固定IP地址的办法.
UOS 以及 部分NetworkManager管理linux服务器 设置固定IP地址的办法. 很多操作系统没法右键 网络连接进行处理 但是发现大部分机器都增加了 NetworkManager 的网络管 ...
- 安装Docker填坑
从官网下载适合win10使用的docker,但是下载后,出现了各种坑,记录一下解决方式 1.docker想要正常启动,需要做以下的准备,开启 Windows 虚拟化和 Linux 子系统(WSL2), ...
- LeetCode贪心算法习题讲解
实验室的算法课程,今天轮到我给师弟师妹们讲贪心算法,顺便也复习一下. 贪心算法这个名字听起来唬人,其实通常是比较简单的.虽然通常贪心算法的实现非常容易,但是,一个问题是否能够使用贪心算法,是一定要小心 ...
- python3 ACM模式的输入输出例子教学
Python的输入是字符串,所以要自己转类型 strip去掉左右两端的空白符,返回str slipt把字符串按空白符拆开,返回[str] map把list里面的值映射到指定类型,返回[type] EO ...
- HP T520 改装DoraOS瘦客户机系统评测
HP T520 介绍 HP T520是一款瘦客户机产品.采用AMD GX-212JC 1.2 GHz 双核 SOC APU,带 AMD Radeon HD Graphics.配置4G 内存,8G SS ...
- 由反射引出的Java动态代理与静态代理
写在开头 在<深入剖析Java中的反射,由浅入深,层层剥离!>这篇文章中我们讲反射时,曾提到过Java的动态代理中使用了反射技术,那么好,今天我们要就着反射的索引,来学习一下Java中的代 ...
- Python脚本之将一个文件夹划分多个文件夹和批量创建文件夹
import os import shutil # 要移出的文件路径 path = r"C:\old_dir" # 新创建多个文件夹的路径 new_path = r"C: ...