✨ 本团队擅长数据搜集与处理、建模仿真、程序设计、仿真代码、EI、SCI写作与指导,毕业论文、期刊论文经验交流。
✅ 专业定制毕设、代码
✅如需沟通交流,查看文章底部二维码
(1)双重筛选分段正交匹配追踪信道估计算法:
针对毫米波MIMO系统在低信噪比下分段正交匹配追踪(StOMP)算法估计精度劣化的问题,提出了改进的双重筛选StOMP算法。在StOMP的每轮迭代中,首先根据匹配准则计算当前残差与测量矩阵各列的内积绝对值,选择所有大于阈值(阈值设为最大内积的0.3倍)的原子形成候选集。关键创新在于对候选集进行二次筛选:利用原子间的互相关特性,剔除那些与已选支撑集高度相关的原子(相关系数大于0.9)。二次筛选后保留的原子再与当前支撑集合并,用最小二乘法更新信道估计值。在信噪比0dB、信道稀疏度为12、天线数64×16的条件下,双重筛选StOMP的归一化均方误差比原StOMP低4.7dB,比正交匹配追踪(需要稀疏度先验)低2.1dB。FPGA实现中,该算法消耗了约2.3万个查找表和64个DSP单元,处理一个信道相干时间(200个符号)平均耗时0.35ms。
(2)QR分解替代奇异值分解的低复杂度混合预编码:
全连接混合预编码中,求解最优预编码矩阵通常涉及高复杂度的奇异值分解(SVD)。提出用QR分解近似替代SVD,并设计三角复数旋转矩阵将Q矩阵对角线元素实数化。具体步骤:对信道矩阵H进行QR分解,得到正交矩阵Q和上三角矩阵R;取Q的前N_s列作为模拟预编码矩阵的初始值,然后通过一个对角矩阵D(其元素为Q对应列第一行的相位旋转因子)对Q进行修正,使得Q*D的每一列第一个元素变为实数,从而简化后续数字预编码的计算。该操作将复数乘法数量减少约40%。在16×64 MIMO、4条数据流的仿真中,改进算法的频谱效率达到12.8bps/Hz,与基于SVD的算法(13.1bps/Hz)非常接近,但计算复杂度仅为后者的1/5。误码率性能在信噪比10dB时均为约1e-3,差异可忽略。
(3)混合预编码的FPGA实现与干扰抑制验证:
将上述混合预编码算法映射到Xilinx Zynq FPGA上。模拟预编码部分采用相移器网络,通过查找表配置相位;数字预编码部分则实现QR分解模块,分解采用脉动阵列结构,支持16×16复数矩阵。产生的数字预编码矩阵与模拟预编码矩阵相乘后,得到最终的混合预编码矩阵。在双用户场景(基站64天线,每个用户16天线)下进行无干扰传输测试:经过预编码后,用户1接收到的信号中用户2的干扰功率比信号功率低23dB,满足空间隔离要求。整个混合预编码模块在200MHz时钟下运行,延迟为2.6微秒,实时处理能力满足5G sub-6GHz帧结构要求。
import numpy as np from scipy.linalg import qr import itertools # 双重筛选StOMP信道估计 def double_screening_stomp(y, A, noise_std, threshold_factor=0.3): # y: 观测向量, A: 测量矩阵, noise_std: 噪声标准差 residual = y.copy() support = [] max_iter = 20 for _ in range(max_iter): # 计算相关性 corr = A.T.conj() @ residual abs_corr = np.abs(corr) t = threshold_factor * np.max(abs_corr) candidate_set = np.where(abs_corr > t)[0].tolist() if not candidate_set: break # 二次筛选:去除与当前支撑集高度相关的原子 new_candidates = [] for idx in candidate_set: max_corr_with_support = 0 for s in support: corr_val = np.abs(A[:, idx].conj().T @ A[:, s]) if corr_val > max_corr_with_support: max_corr_with_support = corr_val if max_corr_with_support < 0.9: new_candidates.append(idx) if not new_candidates: new_candidates = candidate_set # fallback support = list(set(support + new_candidates)) # LS估计 A_s = A[:, support] x_est = np.linalg.pinv(A_s) @ y residual = y - A_s @ x_est if np.linalg.norm(residual) < noise_std: break # 构造完整稀疏向量 h_est = np.zeros(A.shape[1], dtype=complex) h_est[support] = x_est return h_est, support # QR分解替代SVD的混合预编码(简化版) def hybrid_precoding_qr(H, N_s): # H: Nr x Nt 信道矩阵 Nr, Nt = H.shape Q, R = qr(H, mode='economic') # Q: Nr x Min(Nr,Nt), R: Min x Nt # 取前N_s列作为模拟预编码 F_RF = Q[:, :N_s] # 构造对角旋转矩阵使F_RF第一行变为实数 D = np.diag(np.exp(-1j * np.angle(F_RF[0, :]))) F_RF_corrected = F_RF @ D # 数字预编码通过最小二乘或匹配 # 等效基带信道 Heff = H @ F_RF_corrected Heff = H @ F_RF_corrected # 对Heff求伪逆作为数字预编码(迫零) F_BB = np.linalg.pinv(Heff) # N_s x N_s # 归一化功率 total_power = np.linalg.norm(F_RF_corrected @ F_BB, 'fro') F_BB = F_BB / total_power * np.sqrt(N_s) return F_RF_corrected, F_BB # 评估双用户干扰抑制 def interference_suppression_test(): Nt_base = 64; Nr_user = 16; N_s = 4 H1 = (np.random.randn(Nr_user, Nt_base) + 1j*np.random.randn(Nr_user, Nt_base))/np.sqrt(2) H2 = (np.random.randn(Nr_user, Nt_base) + 1j*np.random.randn(Nr_user, Nt_base))/np.sqrt(2) # 联合预编码(块对角化简化) H_stack = np.vstack([H1, H2]) # 2*Nr_user x Nt_base F_RF, F_BB = hybrid_precoding_qr(H_stack, 2*N_s) # 分离两个用户的预编码部分 F_BB1 = F_BB[:N_s, :N_s]; F_BB2 = F_BB[N_s:, N_s:] F1 = F_RF @ F_BB1; F2 = F_RF @ F_BB2 # 计算用户1收到的用户2的干扰功率 interference_power = np.linalg.norm(H1 @ F2, 'fro')**2 signal_power = np.linalg.norm(H1 @ F1, 'fro')**2 print(f'用户1处信号功率: {signal_power:.2f}, 干扰功率: {interference_power:.2f}, 抑制比: {10*np.log10(signal_power/interference_power):.1f} dB') if __name__ == '__main__': # 测试信道估计 A = np.random.randn(64, 128) + 1j*np.random.randn(64,128) x_true = np.zeros(128, dtype=complex) true_support = [10,25,67,102]; x_true[true_support] = np.random.randn(4)+1j*np.random.randn(4) y = A @ x_true + 0.1*(np.random.randn(64)+1j*np.random.randn(64)) h_est, sup = double_screening_stomp(y, A, noise_std=0.1) print(f'真实支撑集: {sorted(true_support)}') print(f'估计支撑集: {sorted(sup)}') interference_suppression_test() ",如有问题,可以直接沟通
👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇