众星捧月无线算法 低分答案

20230508截止
众星捧月无线算法

题目

提交说明

  1. 请网上提交算法处理后的时延结果和源代码;
  2. 随源代码提供算法设计文档,以及代码执行说明文档;
  3. 时延结果采用的时间最小单位为TC = 1/(480 * 1000 * 4096) ≈ 0.509ns,
    输出的结果单位为TC,保留小数点后两位,超过小数点后两位的结果无效。
    每包数据对应一个时延结果,请将结果存储在“answer.txt”文件中,文档开头不要空行,
    文档中每个结果数据单独占据1行,第n包数据的结果放在结果文件中的第n行,行之间以英文逗号隔开。
    请务必按照以上格式输出结果,否则可能会因格式不对被系统判为0分。

提交说明

  1. 数据例子:
    附件example_64Tc.mat里,包含一个无噪声单LOS(line-of-sight)径的示例,对应的时延为64TC,进行简单分析,很容易得到时延64TC,输出的结果为64.00,保留小数点后两位。
    不同数据之间的结果以逗号隔开。
  2. 格式或参数释义:
    mat格式文件,包含发射和接收单复数频域数据。
  3. 初始数据提供:
    pilot.mat包含1×816的向量,代表发射的SRS信号频域复数数据。
    ant1_datan.mat和ant4_datan.mat分别为单天线和多天线场景第n份接收的频域数据,共有800份。
    前400份为单天线的频域数据,每份包含1×816的复数向量,
    后400份为多天线的频域数据,每份包含4×816的复数矩阵。

题目具体要达到的结果和规则

  1. 5G基站的载频为fC =2565MHz,带宽B = 100MHz,子载波间隔scs =30kHz,
    利用SRS(Sounding Reference Signal)进行空口时延估计,SRS在时域占一个符号,在频域按comb(梳状)-4放置,即每4个子载波放置1个频域数据。
    在100MHz带宽内,除去保护间隔和comb空置的子载波之后,SRS的有效子载波数为816。
  2. 保护单天线和多天线的情况,
    单天线场景的首径为目标到天线之间的欧式距离;
    多天线场景如下图所示,共有四根天线,排布成两行两列,水平和垂直间距,dx = dy = 5cm。
    多天线场景的首径为目标到天线阵列中心的欧式距离。

我的

算法设计文档

已知
pilot:发射的SRS信号频域复数数据 1×816 的向量
YY:接收频域数据

HH:信道频域数据

单天线场景

  1. 求出 HH
    YY = HH * pilot
  2. 对 HH 进行逆fourier变换得到时域数据 hh
  3. 对 hh 取模得到 hh_abs
  4. 找到 hh_abs 的峰值及其相邻数据
  5. 根据这3个数据及其相应的时刻,使用二次多项式进行拟合
  6. 计算二次多项式的顶点(即真实峰值对应的时刻)

多天线场景(简单粗暴办法)

  1. 对每个天线进行单天线场景的操作
  2. 对4个天线的结果取平均

算法运行说明文档

打开 mainzzz.m 文件

  1. 设置路径:pilot.mat
    发射的SRS信号频域复数数据 1×816 的向量
  2. 设置好路径:800份频域数据的文件夹
  3. 运行 mainzzz.m ,得到 answer.txt

代码

clc
clear
close all


%% 参数初始化
TC = 1/(480 * 1000 * 4096); % 时延结果采用的时间最小单位
B_subcar = 30e3; % 子载波带宽 Hz
subcar_spacing_comb = 4; % comb间隔,每4个子载波放置1个SRS
fspacing_SRS = subcar_spacing_comb * B_subcar; % SRS信号的频率间隔
num_subcar_SRS = 816; % SRS的有效子载波数


%% 计算与 abs(ifft(Yf./pilot)) 对应的时刻
% SRS信号的时间间隔
tspacing_SRS = 1/fspacing_SRS; 
% SRS的每个子载波对应的时刻
tt = (0:num_subcar_SRS-1)*(tspacing_SRS/num_subcar_SRS);
% SRS的每个子载波对应的归一化时刻
t_TC = tt/TC;

%% 发射的SRS信号频域复数数据 1×816 的向量
load('..\pilot.mat');
% load("..\example_64Tc.mat");
% YY = example_64Tc;


%% 获取频域数据的文件夹
folder = '../ant_data';  % 文件夹路径
matFiles = dir(fullfile(folder, '*.mat'));  % 获取所有符合要求的文件信息
time_delay = zeros(800,1);
%% 单天线的频域数据 前400份 每份1×816的向量
for ii = 1:400
    YY = get_data(matFiles,folder,ii);
    TC_final = estimate_T(pilot,YY,t_TC);
%     fprintf("TC final = %.2f\n", TC_final);
    time_delay(ii) = TC_final;
end

%% 多天线的频域数据 后400份 每份4×816的矩阵
for ii = 401:800
%     ii=randi([401 800],1,1);
%     ii=471;
%     ii=555;
%     ii=640;
    YY4 = get_data(matFiles,folder,ii);
    time_delay_ant = zeros(4,1);
    for antj = 1:4
        YY = YY4(antj,:);
        time_delay_ant(antj) = estimate_T(pilot,YY,t_TC);
    end
%     hhhhhhhhhhhhhhh
    time_delay(ii) = time_delay_merge(time_delay_ant);
end

% datan = find(time_delay>190);
% hhhhhhhhhh

%% 把 time_delay 写入 answer.txt
fileID = fopen('../data/answer.txt', 'w');
for value = time_delay
    fprintf(fileID, "%.2f,\r\n", value);
end
fclose(fileID);




function YY = get_data(matFiles,folder,ii)
filename = fullfile(matFiles(ii).folder, matFiles(ii).name); % 获取文件名及路径
data = load(filename); % 加载MAT文件中的数据
variable_names = who('-file', filename); % 获取MAT文件中的变量名
variable_name = variable_names{1}; % MAT文件中只有1个变量
YY = data.(variable_name); % 获取MAT文件中的变量值 
end


function TC_final = time_delay_merge(time_delay_ant)
time_delay_ant = rmoutliers(time_delay_ant,"mean");
TC_final = mean(time_delay_ant);
end



function TC_final = estimate_T(pilot,YY,t_TC)
HH = YY./pilot;
hh_abs = abs(ifft(HH));
% num_subcar_SRS = length(XX); % 信号长度

% hh_abs(locs)=peaks
[peaks, locs] = findpeaks(hh_abs);
% TC_final = t_TC(locs);
% fprintf("TC final = %.2f\n", TC_final);
% 最大峰值
max_peak = max(peaks);
% 筛选峰值:幅度 >= 最大峰值 / K & 位置不在开头
locs_sele = locs(peaks >= max_peak / 3 & locs ~= 1);
locs_sele_first = locs_sele(1);

% 获取峰值及其相邻位置的数据共3个
peak_data = hh_abs(locs_sele_first-1:locs_sele_first+1);
time_data = t_TC(locs_sele_first-1:locs_sele_first+1);
% 使用二次多项式对这3个数据进行拟合
p = polyfit(time_data, peak_data, 2);
% 计算二次多项式的顶点(即真实峰值对应的时刻)
TC_final = - p(2) / (2 * p(1));


% 绘制时域
% figure;
% plot(t_TC, hh_abs);
% grid on;
% xlim([0 256])
% xline(TC_final)
% xlabel('TC')
% ylabel('abs(ifft(Yf./pilot))')
% title(['TC final = ',num2str(TC_final),'TC'])
% hhhhhhhhhhhh
end
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zzz的学习笔记本

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值