概述
本文主要介绍matlab中的Communication System Toolbox来实现QPSK调制、解调及加入高斯白噪声信道等函数的使用过程,并设置不同的信噪进行仿真与理论值进行比较。
首先设置相关仿真常数如下:
FRM=2048; % 一帧的比特数
MaxNumErrs=200; % 仿真最大误比特数,仿真循环停止条件
MaxNumBits=1e7; % 仿真最大比特数,仿真循环停止条件
EbNo_vector=0:10; % 仿真变量为比特能量与噪声能量谱密度的比值
BER_vector = zeros(size(EbNo_vector)); % 误比特率向量
在此需要说明的是,使用比特信噪比EbNo作为仿真变量是由于EbN可以更直观的反应系统的性能,更适合数字通信中衡量系统性能的指标,而SNR是信号功率与噪声功率之比,更适合于模拟通信系统。简单来说,对于数字通信系统,当EbNo一定值时,误比特率需要低于多少说明系统设计满足要求,且容易与理论值进行比较。
调用Communication System Toolbox中的QPSK调制、解调、高斯白噪声信道模块及统计误码率模块:
Modulator = comm.QPSKModulator('BitInput',true); % QPSK调制模块
AWGN = comm.AWGNChannel; % 高斯白噪声模块
DeModulator = comm.QPSKDemodulator('BitOutput',true); % QPSK解调模块
BitError = comm.ErrorRate; %误码率统计模块
仿真主循环:
for EbNo=EbNo_vector
snr = EbNo+10*log10(2); %将调制前的EbNo转换为调制后的EbNo
AWGN.EbNo=snr; % 设置高斯白噪声模块的EbNo值
numErrs=0; numBits=0; results=zeros(3,1); % 相关统计参数初始化
while ((numErrs<MaxNumErrs) && (numBits<MaxNumBits)) %循环退出条件
u = randi([0 1], FRM, 1); % 随机产生一帧原始信号比特流
mod_sig = Modulator(u); % qpsk调制
rx_sig = AWGN(mod_sig); % 经过高斯白噪声信道
y = DeModulator(rx_sig); % qpsk解调
results = BitError(u, y );% 统计误比特率
numErrs = results(2); % 总误比特数
numBits = results(3); % 总比特数
end
ber=results(1); % 误比特率
bits=results(3); % 总比特数
reset(BitError); % 重置BitError模块
BER_vector(EbNo+1)=ber;
end
在此需要特别注意的是将原始比特流转换为qpsk码时,是将2bit二进制数转换为一个qpsk码,即k=2,此时转换后的EbNo与转换前存在以下关系:
该公式也比较好理解,就是将2个bit的数据转化为一个qpsk符号时,EbNo之间的关系转化。
若不使用上述写法,也可以讲comm.AWGN中的'BitPerSymbol'设置为k,这种写法更为简单,经过测试,得到的结果相同:
AWGN = comm.AWGNChannel('BitsPerSymbol',2);
for EbNo=EbNo_vector
AWGN.EbNo=EbNo;
AWGN.EbNo=snr; % 设置高斯白噪声模块的EbNo值
numErrs=0; numBits=0; results=zeros(3,1); % 相关统计参数初始化
while ((numErrs<MaxNumErrs) && (numBits<MaxNumBits)) %循环退出条件
u = randi([0 1], FRM, 1); % 随机产生一帧原始信号比特流
mod_sig = Modulator(u); % qpsk调制
rx_sig = AWGN(mod_sig); % 经过高斯白噪声信道
y = DeModulator(rx_sig); % qpsk解调
results = BitError(u, y );% 统计误比特率
numErrs = results(2); % 总误比特数
numBits = results(3); % 总比特数
end
ber=results(1); % 误比特率
bits=results(3); % 总比特数
reset(BitError); % 重置BitError模块
BER_vector(EbNo+1)=ber;
end
在通过调制后EbNo一定要注意与原始EbNo之间的转化,不然得到的误比特率曲线和理论值不同。
comm.BitError的返回值为一个向量,其中第一维为误比特率,第二维为误无比特数,第三维为传输总比特数。
QPSK的理论误比特率值如下:
其中erfc为误差函数,其定义如下:
最后绘制图像即可:
EbNoLin = 10.^(EbNo_vector/10); %db --> 值
theoretical_results = 0.5*erfc(sqrt(EbNoLin)); %qpsk误码率理论值
semilogy(EbNo_vector, BER_vector)
grid;title('BER vs. EbNo - QPSK modulation');
xlabel('Eb/No (dB)');ylabel('BER');hold;
semilogy(EbNo_vector,theoretical_results,'dr');hold;
legend('Simulation','Theoretical');
完整代码如下:
FRM=2048; % 一帧的比特数
MaxNumErrs=200; % 仿真最大误比特数,仿真循环停止条件
MaxNumBits=1e7; % 仿真最大比特数,仿真循环停止条件
EbNo_vector=0:10; % 仿真变量为比特能量与噪声能量谱密度的比值
BER_vector = zeros(size(EbNo_vector)); % 误比特率向量
Modulator = comm.QPSKModulator('BitInput',true); % QPSK调制模块
AWGN = comm.AWGNChannel; % 高斯白噪声模块
DeModulator = comm.QPSKDemodulator('BitOutput',true); % QPSK解调模块
BitError = comm.ErrorRate; %误码率统计模块
for EbNo=EbNo_vector
snr = EbNo+10*log10(2); %将调制前的EbNo转换为调制后的EbNo
AWGN.EbNo=snr; % 设置高斯白噪声模块的EbNo值
numErrs=0; numBits=0; results=zeros(3,1); % 相关统计参数初始化
while ((numErrs<MaxNumErrs) && (numBits<MaxNumBits)) %循环退出条件
u = randi([0 1], FRM, 1); % 随机产生一帧原始信号比特流
mod_sig = Modulator(u); % qpsk调制
rx_sig = AWGN(mod_sig); % 经过高斯白噪声信道
y = DeModulator(rx_sig); % qpsk解调
results = BitError(u, y );% 统计误比特率
numErrs = results(2); % 总误比特数
numBits = results(3); % 总比特数
end
ber=results(1); % 误比特率
bits=results(3); % 总比特数
reset(BitError); % 重置BitError模块
BER_vector(EbNo+1)=ber;
end
EbNoLin = 10.^(EbNo_vector/10); %db --> 值
theoretical_results = 0.5*erfc(sqrt(EbNoLin)); %qpsk误码率理论值
semilogy(EbNo_vector, BER_vector)
grid;title('BER vs. EbNo - QPSK modulation');
xlabel('Eb/No (dB)');ylabel('BER');hold;
semilogy(EbNo_vector,theoretical_results,'dr');hold;
legend('Simulation','Theoretical');
仿真结果如下:
参考文献:
- Understanding LTE with MATLAB
- https://www.mathworks.com/help/comm/ref/comm.awgnchannel-system-object.html
- Compute bit or symbol error rate of input data
- AWGN Channel - MATLAB & Simulink
其中代码主要源自《Understanding LTE with MATLAB》,本文主要对其进行注释、分析与方便自己仔细理解代码思路,学习写文章的过程,后期将放上自己学习过程中写的其他一些分析与代码!!
欢迎大家评论、私信交流、批评与指正!!
最后
以上就是落寞睫毛膏为你收集整理的fm调制与解调的simulink仿真_QPSK调制解调及加入高斯白噪声的MATLAB实现的全部内容,希望文章能够帮你解决fm调制与解调的simulink仿真_QPSK调制解调及加入高斯白噪声的MATLAB实现所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复