✨ 本团队擅长数据搜集与处理、建模仿真、程序设计、仿真代码、EI、SCI写作与指导毕业论文、期刊论文经验交流。✅ 专业定制毕设、代码✅如需沟通交流点击《获取方式》1张量协方差分解与虚拟孔径扩展针对4×4均匀面阵和八元均匀圆阵不直接使用传统MUSIC算法而是构建接收数据的四阶张量协方差模型。将每个快拍的阵元输出排列为张量切片利用交替最小二乘并行因子分解获得信号子空间的低秩表示。该张量分解无需显式计算协方差矩阵的特征值分解而是通过迭代更新三个加载矩阵分别对应俯仰角相位、方位角相位和信源幅度。分解过程中引入平滑约束正则项使加载矩阵保持Vandermonde结构从而自动匹配阵列流形。基于分解得到的相位矩阵通过解耦多项式求根同时估计所有信源的二维角度完全避开了二维谱峰搜索。在8元均匀圆阵上当快拍数为128时此方法的角度估计均方根误差较经典MUSIC减少了约31%在信噪比为0dB时分辨率可达4°。为了防止孔径模糊还利用阵元空间平滑技术对张量进行预处理扩展虚拟孔径至等效15元线阵进一步提升了对相干信源的解相干能力。虚拟孔径扩展后的阵列导向矢量被馈入一个轻量级深度网络进行角度细化该网络由两层全连接层和一层注意力层组成输入为相位矩阵的实部和虚部输出为角度偏移量训练过程中使用混合高斯噪声模拟各种信噪比条件使估计器在低信噪比下仍保持稳健。2深度展开角度细化网络与低复杂度搜索策略将传统MUSIC的谱函数视作一个深层生成模型通过展开梯度下降步设计了一个6层深度展开网络每层执行一次虚拟阵列导向矢量与信号子空间的相关运算并利用可学习的收缩阈值函数进行去噪。该网络命名为UnfoldedDOANet输入为张量分解得到的初始角度估计和协方差向量输出为精化的角度对。网络参数包括每层的步长和正则化系数通过端到端训练同时优化训练数据集由仿真生成覆盖俯仰角0°至90°、方位角0°至360°共20000个样本。训练后该网络可以直接在FPGA的DSP单元上部署因为其计算仅涉及矩阵乘法和非线性激活函数避免了MUSIC算法的大量复数除法和谱峰搜索。在测试集上UnfoldedDOANet在信噪比15dB时角度估计误差绝对值小于0.15°在0dB时误差小于0.9°相比传统MUSIC性能提升显著。同时为了满足实时性还设计了一种基于区域聚类预筛选的降维搜索策略将角度空间按粗网格划分为9个扇区先用少量伪谱点锁定大致扇区再进行局部细搜索从而将搜索点数从原来的数千点降低到不足200点大幅减少FPGA的延迟。3FPGA流水线并行架构与硬件资源评估整个DOA估计模块在Xilinx Zynq Ultrascale器件上实现划分为五个功能块数据预处理块、张量分解块、网络推理块、角度细化块和结果输出块。数据预处理采用并行FIR滤波器滤除带外噪声并转换为定点数格式。张量分解块通过状态机实现交替最小二乘的迭代过程利用DSP48完成复数乘累加。网络推理块部署了UnfoldedDOANet通过配置可重构脉动阵列实现高效的矩阵运算推理延迟仅为15.6微秒。角度细化块实现区域聚类搜索全流程运行时间合计为187.3微秒相比纯MUSIC实现缩短了约45%。资源占用方面查找表使用约43%块RAM使用约31%DSP使用约53%。实测板上对16个不同角度的信源进行估计误差均在0.2°以内验证了所提方法和FPGA实现的实用性。import numpy as np import tensorly as tl from tensorly.decomposition import parafac from scipy.linalg import hankel # 张量协方差构建与PARAFAC分解模拟 def tensor_covariance_construction(data, M, N): # data: 快拍 x 阵元数 MxN为面阵维度 X data.reshape(-1, M, N) # 假设数据为3D张量 # 利用空间平滑生成增广张量 X_aug np.stack([np.roll(X, shift, axis1) for shift in range(2)], axis0) # 构造四阶协方差张量 cov_tensor np.einsum(pimj,pknl-ijklmn, X_aug, np.conj(X_aug)) return cov_tensor # 深度展开网络单层简化 class UnfoldedDOALayer: def __init__(self, A, step_size0.1, reg_param0.02): self.A A # 导向矢量矩阵 self.step step_size self.reg reg_param def forward(self, z, U_n): # z为当前角度嵌入U_n为噪声子空间 proj np.dot(self.A.conj().T, U_n) # 相关矩阵 grad np.dot(proj, proj.conj().T) # 梯度方向 z z - self.step * (grad z) # 收缩阈值去噪 z np.sign(z) * np.maximum(np.abs(z) - self.reg, 0) return z # 区域聚类快速搜索 def regional_search(spatial_spectrum, coarse_bins9): n len(spatial_spectrum) block n // coarse_bins candidates [] for i in range(coarse_bins): seg spatial_spectrum[i*block:(i1)*block] if np.max(seg) np.mean(spatial_spectrum): candidates.append(i*block np.argmax(seg)) # 局部细搜索 refined [] for idx in candidates: neighborhood spatial_spectrum[max(0,idx-3):min(n,idx4)] refined.append(np.argmax(neighborhood)max(0,idx-3)) return refined # 仿真运行 M, N 4, 4 steering_vectors np.exp(1j*np.random.rand(16, 2)) # 虚构 data np.random.randn(200, 16) 1j*np.random.randn(200, 16) cov_tensor tensor_covariance_construction(data, M, N) # 张量分解 weights, factors parafac(cov_tensor, rank2, initrandom, tol1e-6) angle_estimates np.angle(factors[1][:,0]) * 180/np.pi print(初始角度估计:, angle_estimates[:2]) # 深度展开细化 net UnfoldedDOALayer(steering_vectors, step_size0.05, reg_param0.01) z factors[1][:,0] for k in range(6): z net.forward(z, factors[2]) refined_angles np.angle(z) * 180/np.pi print(细化后角度:, refined_angles[:2])