20230508截止
众星捧月无线算法
题目
提交说明
- 请网上提交算法处理后的时延结果和源代码;
- 随源代码提供算法设计文档,以及代码执行说明文档;
- 时延结果采用的时间最小单位为TC = 1/(480 * 1000 * 4096) ≈ 0.509ns,
输出的结果单位为TC,保留小数点后两位,超过小数点后两位的结果无效。
每包数据对应一个时延结果,请将结果存储在“answer.txt”文件中,文档开头不要空行,
文档中每个结果数据单独占据1行,第n包数据的结果放在结果文件中的第n行,行之间以英文逗号隔开。
请务必按照以上格式输出结果,否则可能会因格式不对被系统判为0分。
提交说明
- 数据例子:
附件example_64Tc.mat里,包含一个无噪声单LOS(line-of-sight)径的示例,对应的时延为64TC,进行简单分析,很容易得到时延64TC,输出的结果为64.00,保留小数点后两位。
不同数据之间的结果以逗号隔开。 - 格式或参数释义:
mat格式文件,包含发射和接收单复数频域数据。 - 初始数据提供:
pilot.mat包含1×816的向量,代表发射的SRS信号频域复数数据。
ant1_datan.mat和ant4_datan.mat分别为单天线和多天线场景第n份接收的频域数据,共有800份。
前400份为单天线的频域数据,每份包含1×816的复数向量,
后400份为多天线的频域数据,每份包含4×816的复数矩阵。
题目具体要达到的结果和规则
- 5G基站的载频为fC =2565MHz,带宽B = 100MHz,子载波间隔scs =30kHz,
利用SRS(Sounding Reference Signal)进行空口时延估计,SRS在时域占一个符号,在频域按comb(梳状)-4放置,即每4个子载波放置1个频域数据。
在100MHz带宽内,除去保护间隔和comb空置的子载波之后,SRS的有效子载波数为816。 - 保护单天线和多天线的情况,
单天线场景的首径为目标到天线之间的欧式距离;
多天线场景如下图所示,共有四根天线,排布成两行两列,水平和垂直间距,dx = dy = 5cm。
多天线场景的首径为目标到天线阵列中心的欧式距离。
我的
算法设计文档
已知
pilot:发射的SRS信号频域复数数据 1×816 的向量
YY:接收频域数据
HH:信道频域数据
单天线场景
- 求出 HH
YY = HH * pilot - 对 HH 进行逆fourier变换得到时域数据 hh
- 对 hh 取模得到 hh_abs
- 找到 hh_abs 的峰值及其相邻数据
- 根据这3个数据及其相应的时刻,使用二次多项式进行拟合
- 计算二次多项式的顶点(即真实峰值对应的时刻)
多天线场景(简单粗暴办法)
- 对每个天线进行单天线场景的操作
- 对4个天线的结果取平均
算法运行说明文档
打开 mainzzz.m 文件
- 设置路径:pilot.mat
发射的SRS信号频域复数数据 1×816 的向量 - 设置好路径:800份频域数据的文件夹
- 运行 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