上传文件至「Code/Matlab」

This commit is contained in:
david1465833828
2026-05-07 11:20:54 +08:00
commit eef503f34d
5 changed files with 145 additions and 0 deletions
+19
View File
@@ -0,0 +1,19 @@
function [w_mvdr] = algo_digital_mvdr(a_target, R_in)
% algo_digital_mvdr:
% :
% a_target:
% R_in:
% :
% w_mvdr:
%
R_inv = inv(R_in);
% MVDR
numerator = R_inv * a_target;
denominator = a_target' * R_inv * a_target;
w_mvdr = numerator / denominator;
%
w_mvdr = w_mvdr / norm(w_mvdr);
end
+18
View File
@@ -0,0 +1,18 @@
function [w_hybrid, F_RF] = algo_hybrid_dft(w_opt, A_dic, N_RF, a_target, R_in)
% algo_hybrid_dft: (DFT) + MVDR 线
% 1. N_RF
projection = A_dic' * w_opt;
[~, sort_idx] = sort(abs(projection), 'descend');
F_RF = A_dic(:, sort_idx(1:N_RF));
% 2. 使 MVDR
a_eff = F_RF' * a_target;
R_eff = F_RF' * R_in * F_RF;
F_BB_mvdr = (inv(R_eff) * a_eff) / (a_eff' * inv(R_eff) * a_eff);
% 3.
w_hybrid = F_RF * F_BB_mvdr;
w_hybrid = w_hybrid / norm(w_hybrid);
end
+29
View File
@@ -0,0 +1,29 @@
function [w_hybrid, F_RF] = algo_hybrid_omp(w_opt, A_dic, N_RF, a_target, R_in)
% algo_hybrid_omp: OMP + MVDR
%
% --- 1OMP F_RF ---
residual = w_opt;
F_RF = [];
for k = 1:N_RF
projection = A_dic' * residual;
[~, max_idx] = max(abs(projection));
F_RF = [F_RF, A_dic(:, max_idx)];
% OMP
F_BB_temp = pinv(F_RF) * w_opt;
residual = w_opt - F_RF * F_BB_temp;
end
% --- 2 MVDR ---
% "等效导向矢量" (4x1)
a_eff = F_RF' * a_target;
% "等效干扰加噪声协方差矩阵" (4x4)
R_eff = F_RF' * R_in * F_RF;
% 4
F_BB_mvdr = (inv(R_eff) * a_eff) / (a_eff' * inv(R_eff) * a_eff);
%
w_hybrid = F_RF * F_BB_mvdr;
w_hybrid = w_hybrid / norm(w_hybrid); %
end
+74
View File
@@ -0,0 +1,74 @@
function [w_hybrid, F_RF] = algo_hybrid_robust_omp(w_opt, A_dic, N_RF, a_target, R)
%
% w_optMVDR结果
% A_dic
% N_RFRF链数
[N, ~] = size(A_dic);
residual = w_opt; %
selected_index = []; %
lambda = 0.01; %
max_iter = N_RF;
for iter = 1:max_iter
% =========================
% Step1
% =========================
corr = abs(A_dic' * residual);
% Top-2Top-1
[~, idx_sorted] = sort(corr, 'descend');
new_idx = idx_sorted(1:2);
%
selected_index = unique([selected_index new_idx']);
% =========================
% Step2
% =========================
A_selected = A_dic(:, selected_index);
% =========================
% Step3
% =========================
x = (A_selected' * A_selected + lambda * eye(length(selected_index))) \ ...
(A_selected' * w_opt);
% =========================
% Step4
% =========================
residual = w_opt - A_selected * x;
% =========================
% Step5
% =========================
if norm(residual) < 1e-3
break;
end
end
% =========================
% RF矩阵
% =========================
F_RF = A_dic(:, selected_index);
%
F_RF = exp(1j * angle(F_RF));
% =========================
%
% =========================
F_BB = pinv(F_RF) * w_opt;
%
w_hybrid = F_RF * F_BB;
%
w_hybrid = w_hybrid / norm(w_hybrid);
end
+5
View File
@@ -0,0 +1,5 @@
function [a] = gen_a(theta, par)
a = exp(-1j*2*pi*par.delta_d*sind(theta)/par.labmda);
end