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

LTE PSS主同步信号搜索 MATLAB实现

本期带来PSS相关检测说明和MATLAB实现,本期只讲相关方面的,所以MATLAB实现也是相关的部分,频偏估计方面的待下期开讲。

LTE 4G PSS搜索分为TDD搜索和FDD搜索,但是对于 TDD 和 FDD 而言,PSS同步信号的结构是完全一样的,但在帧中的时域位置有所不同.

对于 FDD 而言,PSS 在子帧 0 和 5 的第一个 slot 的最后一个 OFDM 符号上发送.

对于 TDD 而言,PSS 在子帧 1 和 6 的第三个 OFDM 符号上发送,即TDD的PSS都是在特殊子帧上发送的。

搜素PSS可以获得:

1. 小区NID2

2. 帧头信息

3. 5ms帧定时,由于10ms内的两个PSS同步信号的结构一样

4. UE的频偏

回顾一下PSS的生成公式,是由根u生成的ZC序列,u是由小区NID2得来的,如下图:

在频域上占据62个SC,加上左右各5个子载波的保护带共占据72个SC,正好是6个RB,占据中心带宽为72*15e3 = 1.08MHz,这么做的原因是UE初始搜索并不知道基站的带宽,只知道PSS在中间6个RB上,所以初始采样率不用太高,可以采用30.72M倍数的1.92M采样就行。

PSS搜索

由于LTE PSS在时间域上的分布,使得PSS相关最好使用互相关算法来寻找相关峰,它的原理是本地预先生成已知的三种ZC序列,再与接收到的空口信号做相关,获得定时同步,频偏信息。

假设只有频偏(包括整数倍和小数倍频偏,在这里两者统一为delta f),时延和噪声的情况下,接收到的信号可以表示为:

其中N为FFT的点数,如果是1.92M采样的话,N = 1.92e6/15e3=128点。

接收信号与本地的生成的序列x(n)做相关可以表示为:

当检测到定时头的时候上式可以表示为:

这个式子可以看成是x(n)循环移位theta后做傅里叶变化在delta f处的采样值,因此定时误差受到了噪声和频偏的影响,上式可以表示为代价函数和噪声和本地序列相关的和如下:

W为噪声和本地序列相关结果,J(delta f,theta)为代价函数。

在LTE中,PSS采用ZC序列,所以x(n)为横幅信号。

所以代价函数跟传输时延无关,把序列的幅值默认为1,可以表示为:

进一步可以表示为:

这是一个delta f在[0 1]上单调递减的函数,图如下:

当归一化频偏接近1的时候,即接近15k的时候相关值几乎为0

当频偏超过15k的时候,即存在整数倍频偏的时候存在相位翻转,出现负值,会导致相关值正负抵消的情况,加剧了情况的恶劣。

为了缓解这种情况,一般采用分段相关法,可以分成K段,每段长度为L,N=KL,每段单独做相关,最后所有的分段相关功率累加求和,如下:

这样频偏的影响就被降低了K倍,K的取值跟频偏的大小有关,频偏越大越需要分的块就越多,相关累计的抗噪声能力就会下降,会造成相关值的能量泄露,从而带来的就是帧头位置找的不准确,在小频偏的时候,不考虑噪声的影响,假设幅值为A,其没有分段的幅值近似为:

而分段的幅值:

其相关峰的峰值反而降低了K倍。所以分段K的大小根据实际的应用场景和UE本身的情况制定,一般的情况下,K的取值为2或者4最为合适。

MALTAB实现:

clc,clear,close all;

%

% author 生产队的蠢驴

%

%  coding timing 2024.09.03

%

%

%

rxSig = zeros(1,100000); % 这个是实际的1.92M空口数据,这里用0代替

Nrb = 100;

Nsc = 12;

Nsub = 14;

Ntot = 1200;

Ns = 7;

Nfft = 2048;

Ng = [160 144];

Index_TxCyclicPrefix_1 = [Nfft-Ng(1)+1:Nfft 1:Nfft];

Index_TxCyclicPrefix_2 = [Nfft-Ng(2)+1:Nfft 1:Nfft];

params.cell_search_enable = true;

params.cell_search_buff_len = 11520;

params.cell_search_window_len = 5*1920 + 128+10;

params.pss_combin_num = 2;

params.pss_segNum = 1;

params.pss_chest_left_point = 10;

params.pss_chest_right_point = 118;

params.SubcarrierSpacing = 15e3;

N_subframes = 17;

params.Nfft =  Nfft;

params.Ntot = Ntot;

params.Nrb = Nrb;

params.Nsc = Nsc;

pssThr = 25;

N = 128;

root_set = [25 29 34];

segL = N/params.pss_segNum;

corr_result = zeros(1,3,params.pss_combin_num,params.cell_search_window_len,params.pss_segNum);

%% first corr with local pss signal

for N_ID_2_idx=1:3

    pss_local_ifft128 = pss_gen(root_set(N_ID_2_idx));

    for combin_idx = 1:params.pss_combin_num

        rxSig_temp = rxSig((combin_idx-1)*5*1920+1:combin_idx*6*1920);

        for i_sample = 1:params.cell_search_window_len

            for seg_idx = 1:params.pss_segNum

                rx_temp = rxSig_temp(i_sample+(seg_idx-1)*segL:i_sample-1+seg_idx*segL);

                corr_result(1,N_ID_2_idx,combin_idx,i_sample,seg_idx) = corr_result(1,N_ID_2_idx,combin_idx,i_sample,seg_idx) + rx_temp*pss_local_ifft128((seg_idx-1)*segL+1:seg_idx*segL)';

            end

        end

    end

end

%% cal power

corr_result_abs = zeros(3,3,params.cell_search_window_len);

for N_ID_2_idx=1:3

    for combin_idx = 1:params.pss_combin_num

        for i_sample = 1:params.cell_search_window_len

            corrPower = 0;

            for seg_idx = 1:params.pss_segNum

                corrPower = corrPower + abs(corr_result(1,N_ID_2_idx,combin_idx,i_sample,seg_idx));

            end

            corrPower = corrPower^2;

            corr_result_abs(1,N_ID_2_idx,i_sample) = corr_result_abs(1,N_ID_2_idx,i_sample) + corrPower;

        end

    end

end

代码未完。。。

完整的MATLAB实现请关注微信号订阅号:nb_lte_5g ,老牛nb5g老牛每天带你学通信同步更新

努力只能及格,拼命才能优秀。

想成功,先发疯,不顾一切往前冲。

学通信任道重远,老牛带你走最捷径的路.


http://www.kler.cn/a/294747.html

相关文章:

  • 如何理解DDoS安全防护在企业安全防护中的作用
  • 低功耗WTK6900P语音ic方案助力电子烟技术革新 打造个性化吸烟体验
  • 速盾:cdn和反向代理的关系是什么?
  • Redis五种数据类型剖析
  • Python 实现阿里滑块全攻略
  • Springboot应用的端口配置方法解析与优先级详解
  • 开发台球助教小程序前景分析
  • 高效传输秘籍,揭秘Rsync和SCP的优劣,助你做出明智选择!
  • RedisStack十部曲之二:Redis的核心概念
  • (五)vForm 动态表单文件上传、下载
  • 代码随想录算法训练营Day37|完全背包问题、518.零钱兑换II、377. 组合总和 Ⅳ、70. 爬楼梯(进阶版)
  • 连续信号的matlab表示
  • nginx 新建一个 PC web 站点
  • 前端HTML基础笔记
  • Docker数据卷和Dockerfile
  • 集成电路学习:什么是PWM脉冲宽度调制
  • vue通过url下载文件并重命名
  • Window下编译OpenJDK17
  • 【重学 MySQL】十五、过滤数据
  • 【vue css】background设置背景图片不显示问题
  • 利用人类反馈优化文本摘要质量
  • 力扣刷题--1534. 统计好三元组【简单】
  • 如何用RoBERTa高效提取事件文本结构特征:多层次上下文建模与特征融合
  • 如何快速融入大学课堂
  • 快排Java
  • 多线程篇(ThreadLocal 内存模型 伪共享(伪共享))(持续更新迭代)