(57)MATLAB使用迫零均衡器和MMSE均衡器的BPSK调制系统仿真

文章目录


前言

本文给出仿真模型与MATLAB代码,分别使用具有ISI的三个不同传输特性的信道,仿真测试了使用迫零均衡器和MMSE均衡器的基带BPSK传输系统的性能,绘制出Eb/N0-SER性能曲线。


一、仿真测试模型

在设计和测试了迫零均衡器和MMSE线性均衡器之后,接下来在通信链路上测试它们的性能。线性均衡器的性能完全取决于通信发生的信道的特性。本文基于上一篇文章介绍的三个不同信道进行均衡器性能测试。

仿真测试模型如下:

在该仿真模型中,一串随机信源数据经过BPSK调制后,分别通过所设计的ISI离散信道,同时,传输的数据还叠加了加性白高斯噪声(由给定的Eb/N0值决定)。在接收端,接收到的数据分别通过延迟优化的迫零均衡器和MMSE均衡器,在两条不同的路径上独立处理。均衡器的输出通过阈值检测器,给出传输符号的估计。为了对比,还增加了一条没有均衡器的解调路径。最终,检测到的符号与原始数据序列进行对比,计算误码率。仿真在不同Eb/N0值下进行,并将结果绘制成性能曲线。

下面给出MATLAB代码。

二、仿真代码

代码如下:

c 复制代码
%---------Input Fields------------------------
N = 1e7;                     % 仿真发送的符号数
EbN0_dB = 0:2:30;
% EbN0_dB = 0:2:12;
M = 2;                       % 调制阶数

h_c = [0.04 -0.05 0.07 -0.21 -0.5 0.72 0.36 0.21 0.03 0.07];      % 信道A
% h_c = [0.407 0.815 0.407];                                        % 信道B
% h_c = [0.227 0.460 0.688 0.460 0.227];                            % 信道C
% h_c = [0.0102 0.0227 0.0460 0.688 0.0460 0.0227 0.0102];          % 信道D,弱ISI

nTaps = 31;                                       % 均衡滤波器的抽头数
snr = EbN0_dB - 10*log10(0.5);                    % 0.5是因为实信号
[~,Imax] = max(h_c);                              % 取信道响应的最大值作为判决值

SER_zf = zeros(length(EbN0_dB),1);
SER_mmse = zeros(length(EbN0_dB),1);
SER_noeq = zeros(length(EbN0_dB),1);

%-----------------Transmitter---------------------
d = randi([0,1],1,N);                             % 生成均匀分布的随机信源符号
ref = cos(((M:-1:1)-1)/M*2*pi);                   % BPSK星座,[-1, 1]
s = ref(d+1);                                     % BPSK调制

%----------------Channel---------------------
x = conv(s,h_c);                                  % ISI信道作用于调制符号

%%

for i=1:length(EbN0_dB)
    %----------------Channel---------------------
    r = awgn(x,snr(i),'measured');

    %---------------Receiver--------------------
    %(1)不使用信道均衡
    y_noeq = r(Imax:Imax+length(d)-1);
    dcap_noeq = (y_noeq >= 0);                                    % 判决,判决结果是d帽
    SER_noeq(i) = sum((d~=dcap_noeq))/N;                          % 计算误符号率

    %(2)延迟优化MMSE均衡器
    [h_mmse,MSE,optDelay] = mmse_equalizer(h_c,EbN0_dB(i),nTaps); % 设计MMSE均衡器
    y_mmse = conv(h_mmse,r);                                      % 对接收信号进行MMSE均衡
    y_mmse = y_mmse(optDelay+1:optDelay+N);                       % 考虑均衡延时
    dcap_mmse = (y_mmse >= 0);                                    % 判决
    SER_mmse(i) = sum((d~=dcap_mmse))/N;                          % 计算误符号率

    %(3)延迟优化迫零均衡器
    [h_zf,error,optDelay] = zf_equalizer(h_c,nTaps);              % 设计迫零均衡器
    y_zf = conv(h_zf,r);                                          % 对接收信号进行迫零均衡
    y_zf = y_zf(optDelay+1:optDelay+N);                           % 考虑均衡延时
    dcap_zf = (y_zf >= 0);                                        % 判决
    SER_zf(i) = sum((d~=dcap_zf))/N;                              % 计算误符号率
end

%(4)BPSK的误符号率理论值
EbN0 = 10.^(EbN0_dB/10);
SER_theoretical = 0.5*erfc(sqrt(EbN0));

三、仿真结果

仿真结果如下:

信道A:

信道B:

信道C:

可见,两种均衡器的性能在信道A中最佳,信道A具有典型的理想电话信道的响应(信道响应在整个频带内逐渐变化,没有频谱零点)。对于频谱特性最差的信道C,MMSE均衡器的性能优于ZF均衡器。信道B的MMSE均衡器性能次佳。信道B仍然存在频谱零点,但不像信道C那样严重。迫零均衡器在信道B和信道C上的性能最差。这是因为迫零均衡器在计算抽头权重时,只考虑消除码间串扰,而忽略了信道噪声。

四、迫零均衡器和MMSE均衡器的实现

1.均衡器的MATLAB实现

迫零均衡器和MMSE均衡器的实现见:
(49)MATLAB实现迫零均衡器原理与代码

(53)MATLAB实现MMSE均衡器原理与代码

2.均衡器的性能测试

迫零均衡器和MMSE均衡器的性能仿真见:
(51)MATLAB迫零均衡器系统建模与性能仿真

(55)MMSE均衡器系统MATLAB建模与性能仿真


总结

线性均衡器在表现良好的信道上能提供良好的性能,这些信道不表现出频谱零点。另一方面,对于表现出频谱零点的信道,它们不足以完全消除码间串扰,这往往是实际情况。决策反馈均衡器为这个问题提供了一个有效的解决方案,这将在后续文章中给出介绍和仿真。



相关推荐
小蜗牛慢慢爬行3 分钟前
有关异步场景的 10 大 Spring Boot 面试问题
java·开发语言·网络·spring boot·后端·spring·面试
Algorithm157613 分钟前
云原生相关的 Go 语言工程师技术路线(含博客网址导航)
开发语言·云原生·golang
shinelord明22 分钟前
【再谈设计模式】享元模式~对象共享的优化妙手
开发语言·数据结构·算法·设计模式·软件工程
Monly2129 分钟前
Java(若依):修改Tomcat的版本
java·开发语言·tomcat
boligongzhu30 分钟前
DALSA工业相机SDK二次开发(图像采集及保存)C#版
开发语言·c#·dalsa
Eric.Lee202130 分钟前
moviepy将图片序列制作成视频并加载字幕 - python 实现
开发语言·python·音视频·moviepy·字幕视频合成·图像制作为视频
7yewh32 分钟前
嵌入式Linux QT+OpenCV基于人脸识别的考勤系统 项目
linux·开发语言·arm开发·驱动开发·qt·opencv·嵌入式linux
waicsdn_haha44 分钟前
Java/JDK下载、安装及环境配置超详细教程【Windows10、macOS和Linux图文详解】
java·运维·服务器·开发语言·windows·后端·jdk
_WndProc1 小时前
C++ 日志输出
开发语言·c++·算法
qq_433554541 小时前
C++ 面向对象编程:+号运算符重载,左移运算符重载
开发语言·c++