我是靠谱客的博主 落寞睫毛膏,最近开发中收集的这篇文章主要介绍fm调制与解调的simulink仿真_QPSK调制解调及加入高斯白噪声的MATLAB实现,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

cb48a9fa68928af512ef31c2c84219be.png

本文主要介绍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');

仿真结果如下:

143ac95db1e6db89b626e3d13dc7e7c9.png
高斯白噪声信道下QPSK调制的误比特率仿真与理论图

参考文献:

  1. Understanding LTE with MATLAB
  2. https://www.mathworks.com/help/comm/ref/comm.awgnchannel-system-object.html
  3. Compute bit or symbol error rate of input data
  4. AWGN Channel - MATLAB & Simulink

其中代码主要源自Understanding LTE with MATLAB》,本文主要对其进行注释、分析与方便自己仔细理解代码思路,学习写文章的过程,后期将放上自己学习过程中写的其他一些分析与代码!!

欢迎大家评论、私信交流、批评与指正!!

最后

以上就是落寞睫毛膏为你收集整理的fm调制与解调的simulink仿真_QPSK调制解调及加入高斯白噪声的MATLAB实现的全部内容,希望文章能够帮你解决fm调制与解调的simulink仿真_QPSK调制解调及加入高斯白噪声的MATLAB实现所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(45)

评论列表共有 0 条评论

立即
投稿
返回
顶部