当前位置: 首页 > news >正文

OFDM系统中关于信号同步的STO估计与CFO估计的MATLAB仿真

本代码旨在通过MATLAB仿真实现OFDM系统中的信道同步技术,理论部分可以参考之前的博客:
博客地址:OFDM符号同步分析
这里简单的提及以下STO与CFO对于接收信号的影响:
在这里插入图片描述
在这里插入图片描述
代码主要实现的功能包含:

1. STO估计技术1.1 基于CP相关性的时域STO估计技术;1.2 基于CP差异性的时域STO估计技术;
2. CFO估计技术2.1 基于CP相关性的时域CFO估计技术;2.2 基于Moose方法的频域CFO估计技术;2.3 基于Classen方法的频域CFO估计技术;

估计STO系统仿真的参数设置如下:

function params = setParameters()params.nSTOs = [-3 -3 2 2]; %对应于符号定时偏移(STO)的采样点数params.CFOs = [0 0.5 0 0.5];params.SNRdB = 40;params.MaxIter = 10;  % 最大迭代次数params.Nfft = 128;    % FFT长度params.Ng = params.Nfft / 4; % CP长params.Nofdm = params.Nfft + params.Ng; %ofdm 符号长度params.Nbps = 2;      % 符号长度,QPSKparams.M = 2 ^ params.Nbps;  % 调制阶数params.Es = 1;                   % 信号能量params.A = sqrt(3/2/(params.M-1) * params.Es);   % QAM归一化因子params.N = params.Nfft;params.com_delay = params.Nofdm / 2;   % OFDM符号前端是前导码,跳过该部分减少运算量params.Nsyms = 50;
end

估计CFO系统仿真的参数设置如下:

%% 功能函数定义块
function params = setParameters()params.CFO = 0.15;params.Nfft = 128;params.Nbps = 2;params.M = 2 ^ params.Nbps; % 每个符号占据比特数params.Es = 1;   % 信号能量params.A = sqrt(3/2/(params.M-1) * params.Es);  % QAM归一化因子params.N = params.Nfft;params.Ng = params.Nfft / 4;params.Nofdm = params.Nfft + params.Ng;params.Nsyms = 3;% 迭代运算参数params.SNRdBs = 0:3:30;params.MaxIter = 100;
end

一、STO估计

代码分析

function [STO_est,Mag] = STO_by_correlation(y,Nfft,Ng,com_delay)% 时域估计技术中:利用循环前缀CP的相关性估计STO% @y 接收到的OFDM信号,包含CP% @Ng 保护间隔长度% @com_delay 共同延迟,用于控制滑动窗口的起始位置,通过设置com_delay,...%            可以跳过信号的前一部分,只在可能包含 OFDM 符号起始点的区域进行搜索。% STO_est STO估计% Mag 随时间变化的相关函数轨迹Nofdm = Nfft + Ng;    % 一个OFDM的符号数if nargin < 4com_delay = Nofdm / 2;endnn = 0 : Ng - 1;   % 生成0到Ng-1的索引(CP长度的计数yy = y(nn + com_delay) * y(nn + com_delay + Nfft)';   % 计算相关值,在这里'表示共轭转置maximum = abs(yy);for n = 1 : Nofdm  % 滑动Nofdm次(覆盖一个OFDM符号的所有可能位置)n1 = n - 1;            % n1本质是 “当前滑动的偏移量”。yy1 = y(n1 + com_delay) * y(n1 + com_delay + Nfft)';             % 步骤1:减去“离开窗口的旧样本对”yy2 = y(n1 + com_delay + Ng) * y(n1 + com_delay + Nfft + Ng)';   % 步骤2:加上“进入窗口的新样本对”(往右移动一步)yy = yy - yy1 + yy2;                     % 更新相关性:旧窗口的相关性 - 离开的样本对 + 进入的新样本对Mag(n) = abs(yy);if Mag(n) > maximummaximum = Mag(n);% STO_est = Nofdm - com_delay - n1;STO_est = com_delay + n1;endend
end

代码思路大致上是基于双滑动窗口的思想实现,示意图如下:
在这里插入图片描述
对于STO时域估计,都是基于这个思想,通过对比两个窗口的相关性/差异性估计STO值;
同理,基于CP差异性估计STO的代码如下:

function [STO_est,Mag] = STO_by_difference(y,Nfft,Ng,com_delay)% 时域估计技术中:利用循环前缀CP的差异性估计STO% @y 接收到的OFDM信号,包含CP% @Ng 保护间隔长度% @com_delay 共同延迟% STO_est STO估计% Mag 随时间变化的相关函数轨迹Nofdm = Nfft + Ng;minimum = 0;STO_est = 0;if nargin < 4com_delay = Nofdm / 2;endfor n = 1 : Nofdmnn = n + com_delay + (0 : Ng-1);tmp0 = abs(y(nn)) - abs(y(nn + Nfft));Mag(n) = tmp0 * tmp0';if Mag(n) < minimumminimum = Mag(n);%STO_est = Nofdm - com_delay - (n-1);STO_est = com_delay + (n-1); end end
end

结果展示

在这里插入图片描述

二、CFO估计

代码分析

2.1 基于CP相关性的时域CFO估计技术

function CFO_est = CFO_CP(y,Nfft,Ng)% 基于循环前缀(CP)的时域载波频率偏移(CFO)估计nn = 1 : Ng;CFO_est = angle(y(nn + Nfft) * y(nn)') / (2*pi);
end

在这里插入图片描述
总结一句话就是:根据CP的性质,相隔N个符号的两个CP窗口相关性结果的相位差就是CFO的数值;

2.2 基于Moose方法的频域CFO估计技术

Moose 方法是另一种经典的基于训练序列的频域载波频率偏移 (CFO) 估计算法,特别适用于 OFDM 系统。Moose 方法使用专门设计的训练序列(通常是具有共轭对称特性的序列)来实现更精确的 CFO 估计。

算法处理流程
Step1:训练序列设计
构造一个共轭对称的频域序列 X(k)X(k)X(k),满足 X(k)=X∗(NFFT−k)X(k) = X^*(N_{FFT}-k)X(k)=X(NFFTk)这样的序列经过 IFFT 变换到时域后,会形成一个前后对称的序列;
Step2:信号发送
将训练序列调制到 OFDM 子载波上,添加循环前缀后发送;
Step3:信号接收与预处理
接收信号并去除循环前缀,对时域信号进行 FFT 变换,转换到频域;
Step4:CFO 估计
利用频域信号的共轭对称性计算 CFO;

关键公式Moose 方法估计 CFO 的核心公式为:
ϵ^=NFFT2π⋅∠(∑k=1NFFT/2−1Y(k)⋅Y∗(NFFT−k))NFFT/2\hat{\epsilon} = \frac{N_{FFT}}{2\pi} \cdot \frac{\angle \left( \sum_{k=1}^{N_{FFT}/2-1} Y(k) \cdot Y^*(N_{FFT}-k) \right)}{N_{FFT}/2}ϵ^=2πNFFTNFFT/2(k=1NFFT/21Y(k)Y(NFFTk))
上述是传统Moose方法的计算公式;在本代码中应用的是Moose方法的变体,由于在通信系统仿真中,每个OFDM符号的导频都是相同的,并且在构建OFDM符号流时,前两个OFDM符号是相同的,故无需构建共轭序列,以下是实现Moose方法的代码(您的通信系统需要根据符号流的情况自行设计):

function CFO_est = CFO_Moose(y,Nfft)% 基于两个连续相同前导码(OFDM符号)的Moose方法频域载波频率偏移(CFO)估计% Moose 方法是另一种经典的基于训练序列的频域载波频率偏移 (CFO) 估计算法,特别适用于 OFDM 系统。% 与 Classen 方法不同,Moose 方法使用专门设计的训练序列(通常是具有共轭对称特性的序列)来实现更精确的 CFO 估计。%% 实现过程 % 1. 训练序列设计: 构造一个共轭对称的频域序列 \(X(k)\),满足 \(X(k) = X^*(N_{FFT}-k)\)这样的序列经过 IFFT 变换到时域后,会形成一个前后对称的序列% 2. 信号发送: 将训练序列调制到 OFDM 子载波上;添加循环前缀后发送% 3. 信号接收与预处理: 接收信号并去除循环前缀;对时域信号进行 FFT 变换,转换到频域% 4. CFO 估计: 利用频域信号的共轭对称性计算 CFO% 下列方法是Moose方法的变体,不需要专门设计共轭对称的训练序列for i = 0 : 1Y(i+1,:) = fft(y(Nfft * i + 1 : Nfft * (i+1)), Nfft);endCFO_est = angle(Y(2,:) * Y(1,:)') / (2*pi);
end

2.3 基于Classen方法的频域CFO估计技术

Classen 方法是一种基于导频的频域载波频率偏移 (CFO) 估计算法,它利用 OFDM 系统中连续两个符号间导频的相位变化来估计频偏。其核心思想是:CFO 会导致接收信号产生随时间线性变化的相位偏移,通过比较两个连续 OFDM 符号中相同导频位置的相位差,可以计算出 CFO 值。

算法处理流程:
Step1:信号接收与预处理
接收包含循环前缀 (CP) 的 OFDM 符号;去除 CP,恢复原始 OFDM 符号时域信号;
Step2:频域转换
对时域信号进行 FFT 变换,转换到频域;提取导频位置的频域信号值;
Step3:相位差计算
计算两个连续 OFDM 符号在相同导频位置的相位差;对所有导频位置的相位差求平均,得到平均相位差;
Step4:CFO 计算
将平均相位差转换为频偏值;考虑 FFT 点数和 OFDM 符号长度进行归一化;
关键公式Classen 方法估计 CFO 的核心公式为:
ϵ^=NFFT2π⋅Ts⋅∠(∑k∈PY2(k)⋅Y1∗(k)⋅∣Xp(k)∣2∑k∈P∣Y1(k)⋅Xp(k)∣2)\hat{\epsilon} = \frac{N_{FFT}}{2\pi \cdot T_{s}} \cdot \angle \left( \frac{\sum_{k \in \mathcal{P}} Y_2(k) \cdot Y_1^*(k) \cdot |X_p(k)|^2}{\sum_{k \in \mathcal{P}} |Y_1(k) \cdot X_p(k)|^2} \right)ϵ^=2πTsNFFT(kPY1(k)Xp(k)2kPY2(k)Y1(k)Xp(k)2)
其中:
ϵ^\hat{\epsilon}ϵ^ 是估计的归一化 CFO
NFFTN_{FFT}NFFT 是 FFT 点数
TsT_sTs 是 OFDM 符号周期 (含 CP)
Y1(k)Y_1(k)Y1(k)Y2(k)Y_2(k)Y2(k) 是两个连续 OFDM 符号在导频位置 k 的频域值
Xp(k)X_p(k)Xp(k) 是导频信号值
P\mathcal{P}P 表示所有导频位置的集合
∠\angle 表示取复数的相位角

function CFO_est = CFO_Classen(yp,Nfft,Ng,Nps)% 基于两个连续OFDM符号中导频的Classen方法频域载波频率偏移(CFO)估计% Classen 方法是一种基于导频的频域载波频率偏移 (CFO) 估计算法,% 它利用 OFDM 系统中连续两个符号间导频的相位变化来估计频偏。% 其核心思想是:CFO 会导致接收信号产生随时间线性变化的相位偏移,% 通过比较两个连续 OFDM 符号中相同导频位置的相位差,可以计算出 CFO 值。%% 实现过程% 1. 信号接收与预处理 接收包含循环前缀 (CP) 的 OFDM 符号;去除 CP,恢复原始 OFDM 符号时域信号% 2. 频域转换 对时域信号进行 FFT 变换,转换到频域提取导频位置的频域信号值% 3.相位差计算 计算两个连续 OFDM 符号在相同导频位置的相位差; 对所有导频位置的相位差求平均,得到平均相位差% 4. CFO 计算将平均相位差转换为频偏值; 考虑 FFT 点数和 OFDM 符号长度进行归一化if length(Nps) == 1Xp = add_pilot(zeros(1,Nfft),Nfft,Nps);   % 导频信号elseXp = Nps;   % 若Nps是一个数组,则它必须是导频序列XpendNofdm = Nfft + Ng;kk = find(Xp ~= 0);Xp = Xp(kk);  % 提取出导频音for i = 1 : 2yp_without_CP = remove_CP(yp(1 + Nofdm * (i-1) : Nofdm * i),Ng);Yp(i,:) = fft(yp_without_CP,Nfft);end% 原始代码不具有适配性,没有归一化因子,对于高阶调制就会出现问题% CFO_est = angle(Yp(2,kk) .* Xp * (Yp(1,kk) .* Xp)') / (2*pi);% CFO_est = CFO_est * Nfft / Nofdm;% 以下是调整的适配高阶调制的代码% 提取两个符号的导频位置频域值Yp_pilots = Yp(:,kk);% 计算分子:带导频能量加权的相位差numerator = sum(Yp_pilots(2,:) .* conj(Yp_pilots(1,:)) .* abs(Xp).^2);% 计算分母:第一个符号导频能量和(用于归一化)denominator = sum(abs(Yp_pilots(1,:) .* Xp).^2);% 完整的Classen公式,对导频能量进行归一化CFO_est = angle(numerator/denominator) * Nfft / (2*pi*Nofdm);
end

结果分析

在这里插入图片描述
通信系统仿真中,CFO设置的参数值为0.15;上图展示的是三种不同的CFO估计方式在不同信噪比情况下的表现情况。

http://www.lryc.cn/news/588522.html

相关文章:

  • 基于Android的景点旅游信息系统App
  • DNS重绑定
  • 操作系统-第一章操作系统和第二章进程(知识点学习/期末复习/笔试/面试/考研)
  • 机载激光雷达目标识别:从点云到凝视成像的算法全景
  • 延迟双删懂不
  • 大数据领域开山鼻祖组件Hadoop核心架构设计
  • 逻辑代数中的基本规则,代入规则和反演规则,对偶规则
  • 九、官方人格提示词汇总(中-3)
  • 【C语言进阶】指针面试题详解(2)
  • LeetCode|Day11|557. 反转字符串中的单词 III|Python刷题笔记
  • 【Bluedroid】蓝牙协议栈enable流程深度解析
  • LogUtil日志工具类你真的封装对了么?
  • 19.数据增强技术
  • LeetCode 692题解 | 前K个高频单词
  • JAVA进阶--JVM
  • C#——数据与变量
  • Brooks 低温泵On-Board Cryopump 安装和维护手法Installation and Maintenance Manual
  • 文献查找任务及其方法
  • 信息学奥赛一本通 1549:最大数 | 洛谷 P1198 [JSOI2008] 最大数
  • 7.14练习案例总结
  • YOLOv11开发流程
  • 数字化红头文件生成工具:提升群聊与团队管理效率的创新方案
  • H264的帧内编码和帧间编码
  • 每日mysql
  • RAG索引流程中的文档解析:工业级实践方案与最佳实践
  • 【Linux网络】:HTTP(应用层协议)
  • 学习软件测试的第十五天
  • 【DOCKER】-6 docker的资源限制与监控
  • Linux操作系统之信号:信号的产生
  • 深入学习前端 Proxy 和 Reflect:现代 JavaScript 元编程核心