本篇文章是博主在通信等领域学习时,用于个人学习、研究或者欣赏使用,并基于博主对通信等领域的一些理解而记录的学习摘录和笔记,若有不当和侵权之处,指出后将会立即改正,还望谅解。文章分类在通信领域笔记:
通信领域笔记(9)---《论文复现---基于随机蕨的快速相位差DOA估计》
论文复现---基于随机蕨的快速相位差DOA估计
论文出处:
- 题目:《FAST PHASE-DIFFERENCE-BASED DOA ESTIMATION USING RANDOM FERNS》
- 作者:Hui Chen, Tarig Ballal and Tareq Y. Al-Naffouri
- 时间:2019年Anaheim
- 来源:IEEE Global Conference on Signal and Information Processing
基于随机蕨的快速相位差DOA估计
摘要
信号的到达方向(DOA)信息在通信、定位、目标跟踪等方面具有重要意义。基于频域的时延估计能够在子样本精度下获得DOA;然而,它受到相位包裹问题的困扰。本文提出了一种基于频率分集的方法来克服相位包裹问题。受机器学习技术的随机蕨启发,提出了一种加快搜索过程的算法。通过仿真和实验测试,基于三种不同的信号模型对算法的性能进行了评估。结果表明,在保持相同精度的情况下,使用随机蕨可以将搜索时间减少到穷尽法搜索时间的1/6。该算法的DOA估计误差较低,优于基于频分集的基准算法。
关键词:到达方向,随机蕨,机器学习,超声波,相位差
1 引言
在无线传感器网络定位[1]、通信[2]、声学事件检测[3]、室内定位[4]、手势识别[5]等许多应用中,了解目标的方向是必不可少的。
DOA估计方法的目的是估计多个空间分离的接收机观测到的信号的到达方向。关键DOA估计器的摘要可以在[6]中找到。基于时延的DOA估计[7]是一种应用广泛的方法。时间延迟可以在频域或时域测量。基于频率的时延估计具有提供子样本时延分辨率[8][9]的优点。但是,如果接收机分离较大,就会出现相位包裹问题。这个问题可以通过利用来自多个传感器的观测数据的基于空间分集的算法[10]或使用宽信号带宽的基于频率分集的算法[8]来解决。
在本文中,考虑了一个单源场景,其目标是使用一对传感器估计1-D角度。通过使用一个或多个非共线接收器,这种设置可以很容易地扩展到二维DOA估计情况。为了估计DOA,提出了一种穷举网格搜索方法。提出的方法旨在找到使观测到的(通常是包裹的)相位差与基于假设的源方向计算的相位差之间的不匹配最小化的源方向。为了降低计算复杂度和加快搜索操作,利用机器学习的工具,将DOA估计视为模式识别问题。提出了一种基于随机蕨[11][12]分类方法的DOA估计算法。所提出的算法旨在通过利用不匹配的结构作为假设源方向的函数,快速找到源方向的估计。
本文的贡献有:
a)一种解决相位展开问题的多频DOA估计网格搜索方法;
b)通过采用随机蕨实现搜索过程的快速算法;
c)使用三种类型的信号进行模拟和实验测试的综合性能评估。
本文的组织结构如下。第二节阐述了使用多频相位差的DOA估计问题,并解释了如何使用随机蕨的思想加快网格搜索方法。第三节描述了信号模型和实验设置,并讨论了仿真和实验结果。在第五节中,得出了整个工作的结论,并对未来的方向提出了建议。
2 基于随机蕨的DOA估计
公式不便编写成博客,完整的翻译论文请在文章末尾获取
3 模拟和实验测试
3.1 信号模型
考虑三种不同的多频信号模型。OFH(正交频率跳变)信号在一组载波频率之间跳,由于其对多径和噪声的鲁棒性而被广泛应用于通信和测距领域。OFS(正交频率和)信号的设计类似于OFDM[14],将不同载波频率的正弦信号组合在一起。ZC (Zadoff-Chu)序列是一个多相复值零自相关序列[15]和信号的设计可以在[16]中找到。
该算法在OFH、OFS和ZC信号上进行了测试。为了在信号之间进行公平的比较,选择参数以确保不同信号具有相同的持续时间后是的静默期)、带宽()和能量。
公式不便编写成博客,完整的翻译论文请在文章末尾获取
3.3. 实验
3.3.1 实验设置
实验测试在典型的室内环境中进行,室内温度为24度。两个接收器之间的距离为1.8cm。发射机和接收机放置在离地面1.5m的地方,相距2m。发射机位于6个不同的DOAs,SNR固定。地面真值由带有无源标记的ART-TRACK5[17]红外光学6-DOF(自由度)系统获得。该系统的定位分辨率为0.1mm,更新速率为300Hz。
3.3.2 实验结果
实验结果受到多径效应、校准误差等不同因素的影响。这些影响可能会导致模拟结果中不存在的异常值和其他现象。因此,为了限制这些效应的影响,一个有意义的性能评估是估算误差低于一定程度的情况所占的百分比。2度误差被选为基准点。
图6给出了本文方法和基准方法在不同DOA选择下的性能。在每个DOA进行500次实验评估,
SNR=0dB。在所有信号类型上,所提出的方法明显优于基准方法[8]。
图6 不同DOAs源的实验结果
4 结论
提出了一种基于相位差观测值的DOA估计算法。该算法采用随机蕨的机器学习方法,与穷举搜索相比,在保持相同精度的情况下,将计算速度提高了6倍。使用三种不同的类型对提出的算法进行了测试。仿真和实验结果证实了所提方法的有效性。未来的工作将重点研究多普勒、多径和多用户干扰的影响。
5 MATLAB实现
主函数main_random_ferns.m
% 基于随机蕨的快速相位差DOA估计
% 最后修订日期:2024-05-10
close all;
clear;
clc;
%% 相位差计算
s1 = [0.8839 0]; % 传感器1在二维平面上的位置
s2 = [-0.8839 0]; % 传感器2在二维平面上的位置
d = norm(s1-s2); % 两个传感器之间的距离
distance = 1000; % 假设远场模型的百分比
v_speed = 343; % 音速
fs = 192000; % 采样频率
nfft = 1024;
F = 0:fs/nfft:(fs-fs/nfft); % FFT后的频率轴
freq = F([102 108 113 118]); % 载波频率
interval = 1;
ang_range = -89:interval:90; % 搜索从-89到90的间隔
phi = zeros(1,length(freq));
phase_all = []; % 在ang_range内所有角度的相位差
for i = 1:length(ang_range)
angle0 = ang_range(i);
td = -sin(angle0/180*pi)*d; % 到达时差
phi = 2*pi*td/100./(v_speed./freq);
phi = wrapping(phi);
phase_all = [phase_all; phi];
end
size(phase_all) % 按频率搜索角度
%% 创建error_table
error_table = [];
error = zeros(size(ang_range));
for num = 1:length(ang_range)
phase = phase_all(num,:);
for x = 1:length(ang_range)
diff_phase = phase_all(x,:);
m = length(diff_phase);
error_temp = wrapping(diff_phase - phase);
error(x) = sum(abs(error_temp));
end
error_table = [error_table; error];
end
figure;plot(ang_range,error_table(35+90,:)); % 35度时的误差表
title('基于搜索的DOA估计 [\theta = 35]')
xlabel('搜索角度');ylabel('误差');
%% 蕨类矩阵创建
fern_num = 5;
fern_point = [47 -29 7 -69 -4] + 90;
rn = combnk(fern_point,2); % 创建所有可能的组合
r1 = rn(:,1);
r2 = rn(:,2);
bin = zeros(1,2^10);
fern_mat = [];
result = zeros(1,length(ang_range));
searching_area = 180;
for i = 1:length(ang_range)
value = sign(error_table(i + (180-searching_area)/2,r1)-error_table(i + (180-searching_area)/2,r2)+0.001);
result(i) = (value+1)/2*fliplr(2.^(0:9))';
bin(1+result(i)) = bin(1+result(i)) + 1;
fern_mat = [fern_mat ;value];
end
% size(fern_mat)
figure;plot(bin);
xlabel('聚类索引');ylabel('聚类元素个数');
max(bin)
sum(bin)/length(nonzeros(bin));
figure;plot(ang_range,error_table(71,:))
hold on;plot(fern_point-90,error_table(71,fern_point),'r*')
% value = sign(error_table(91,r1)-error_table(91,r2)+0.001);
title('基于搜索的DOA估计')
xlabel('水平角度theta');ylabel('误差');
% save fern_raw.mat r1 r2 fern_mat raw_phase
% save fern_vec.mat r1 r2 fern_mat vec_phase
%% 误差表检验
test_num = -33 + 90;
result0 = error_table(test_num,r1)-error_table(test_num,r2);
value0 = sign(result0);
for i = 1:180
value = sign(error_table(i,r1)-error_table(i,r2));
result(i) = value0*value';
end
figure;plot(ang_range,(result));
title('角度的模式识别');
xlabel('候选角度值[度]');ylabel('交叉相关值');
temp = find(result==10)-90;
% error_table(76,(find(result==10)-71+90))
% figure;plot(error_table(76,:))
%% 测试DOA算法
angle_real = -55.5;
td = -sin(angle_real/180*pi)*d;
phi_obs = 2*pi*td/100./(v_speed./freq);
noise = 0.01; % 噪声的标准偏差
phi_obs = phi_obs + randn(size(phi_obs))*noise;
phase_test = wrapping(phi_obs);
angle_est = alg_doa_fern(phase_test,r1,r2,fern_mat, phase_all);
disp(['预估角度为', num2str(angle_est,'%2.2f'), '[deg] | error = ', ...
num2str(abs(angle_real-angle_est),'%2.2f'), '[deg]']);
%% 额外部分:最佳蕨类选择试验
e = [];
r_all = [];
range_max = 140;
fern_points = 5;
error_table_n = error_table(90-floor(range_max/2)+1:90+floor(range_max/2),:);
for sel_i = 1:100
fern_point = randperm(range_max,fern_points);
rn = combnk(fern_point,2);
fern_num = length(rn(:,1));
r1 = rn(:,1);
r2 = rn(:,2);
bin = zeros(1,2^fern_num);
fern_mat = [];
value = [];
for i = 1:range_max
value = sign(error_table_n(i,r1)-error_table_n(i,r2)+0.001);
result(i) = (value+1)/2*fliplr(2.^(0:fern_num-1))';
bin(1+result(i)) = bin(1+result(i)) + 1;
fern_mat = [fern_mat ;value];
end
% size(fern_mat)
% figure;plot(bin);
p = bin/sum(bin);
entropy = - sum(nonzeros(p).*log2(nonzeros(p))) / ceil(log2(length(p)));
e(sel_i) = entropy;
r_all = [r_all; fern_point];
% save fern.mat r1 r2 fern_mat
end
% r_all(37,:)
figure;plot(e);xlabel('仿真时间');ylabel('效率')
%% 可视化选定的蕨类
[a1 a2] = max(e);
a1
fern_point = r_all(a2,:);
rn = combnk(fern_point,2);
r1 = rn(:,1);
r2 = rn(:,2);
bin = zeros(1,2^fern_num);
fern_mat = [];
value = [];
for i = 1:range_max
value = sign(error_table_n(i,r1)-error_table_n(i,r2)+0.001);
result(i) = (value+1)/2*fliplr(2.^(0:fern_num-1))';
bin(1+result(i)) = bin(1+result(i)) + 1;
fern_mat = [fern_mat ;value];
end
% size(fern_mat)
figure;plot(bin);
length(value)
a1;
length(bin)
length(nonzeros(bin))
max(bin)
sum(bin)/length(nonzeros(bin))
其他函数:wrapping.m;alg_doa_fern.m
function output = wrapping(input)
output = mod(input+pi,2*pi)-pi;
end
% Random ferns doa algorithm
function output = alg_doa_fern(phase_test,r1,r2,fern_mat,phase_all)
area = 90;
fern_ind = unique([r1 r2]);
error = zeros(1,180) + 500;
for row = 1:length(fern_ind)
error_temp = wrapping(phase_all(fern_ind(row),:)-phase_test);
error(fern_ind(row)) = sum(abs(error_temp));
end
value = sign(error(r1)-error(r2)+0.001);
v2 = [zeros(1,90-area) value*fern_mat(90-area+1:90+area,:)'];
candidate = find(v2>=length(fern_mat(1,:)));
if(isempty(candidate))
candidate = find(v2>=length(fern_mat(1,:))-2);
if(isempty(candidate))
candidate = 90;
end
end
for row = 1:length(candidate)
current = candidate(row);
error_temp = wrapping(phase_all(current,:) - phase_test);
error(candidate(row)) = sum(abs(error_temp'));
end
[~, a2] = min(error);
if(a2~=1 && a2 ~= length(phase_all))
error_temp = wrapping(phase_all(a2-1:a2+1,:) - repmat(phase_test,3,1));
error(a2-1:a2+1) = sum(abs(error_temp'));
xc = [a2-1 error(a2-1);a2 error(a2);a2+1 error(a2+1)];
xc2 = 0.5*(xc(3,2)-xc(1,2))/(2*xc(2,2)-xc(3,2)-xc(1,2));
output = (a2)-90 + xc2;
end
end
6 部分运行结果
由于论文中公式很多,不便于博客展示,将原文、译文,实现程序放在下面,需要自取:
论文复现-基于随机蕨的快速相位差DOA估计
如果获取上述方式获取不到资源,请在评论区发表自己的邮箱地址(私信不回复),看到后会尽快发送给你。
文章若有不当和不正确之处,还望理解与指出。由于部分文字、图片等来源于互联网,无法核实真实出处,如涉及相关争议,请联系博主删除。如有错误、疑问和侵权,欢迎评论留言联系作者,或者私信联系作者。