Files
FAR_CS/0 - example/nsq - 恒虚警代码/test_Pd_Pfa_vamp_cal_stat.m
T
2024-05-09 16:54:58 +08:00

281 lines
6.9 KiB
Matlab

clc;
clear;
close all;
%% parameter setting
% SNR = 5: 1: 6;
% SNR = 0: 2: 10;
% SNR = 0: 5: 25;
SNR = [0,5,8,10,12,15,20,25];
len_SNR = length(SNR);
SNR_t2 = 25;
rep_time = 2000;
% P_fa = 1e-1;
P_fa = [1e-4, 5e-4, 1e-3, 5e-3, 1e-2, 5e-2, 1e-1, 5e-1, 1];
len_P_fa = length(P_fa);
target_scattering = [0.8,1,0.9];
win_size = length(target_scattering);
alpha_prop = 0.8;
% alpha_prop = [0.6, 0.4, 0.2];
lambda = 0.1;
% Sparsity
sigma_0 = 0.1;
% noise sigma
sigma_n = sigma_0;
%% vamp set
delta_VAMP = 1e-6;
iter_max = 500;
lambda_val = 0.1;
gamma = 0.5;
%% 参数设置
B=5e5; %信号带宽10MHz
Tp=100e-6; %脉宽100us
fs=2*B; %采样频率
Ts= 1 / fs; %采样周期
K = B / Tp; %线性调频率
fc = 1e8; %载波频率
Tr = 1e-3;
t = 0:1/fs:Tr-1/fs;
t2 = 0:1/fs/2:Tr-1/fs/2;
c = 3e8; % 光速
distance_max = (Tr-Tp) * c / 2;
n = Tr * fs;
m = round(n * gamma);
%% experiment
P_fa_CROD_cnt = zeros(len_SNR, len_P_fa, rep_time);
P_d_CROD_cnt = zeros(len_SNR, len_P_fa, rep_time);
% h_thd = -log(P_fa);
h_thd = chi2inv(1 - P_fa, 6) / 2;
%%
parfor rep = 1: rep_time
% for rep = 1: rep_time
for cnt_SNR = 1: len_SNR
% 设置目标位置
% target_index = randi([2,n - length(target_scattering)]);
target_index = 300;
target2_index = round(n * 0.4);
% 根据 SNR 设置散射点强度
alpha = alpha_prop * sqrt(10^(SNR(cnt_SNR)/10) * sigma_n^2);
alpha2 = alpha_prop * sqrt(10^(SNR_t2/10) * sigma_n^2);
% 设置 x
x = zeros(n ,1);
x(target_index:target_index+2,1) = target_scattering * alpha;
x(target2_index:target2_index+2,1) = target_scattering * alpha2;
% plot(x)
%% 生成矩阵 A
A_idx = randperm(n);
A_idx = A_idx(1: m);
A_idx = sort(A_idx);
A = dftmtx(n);
A = A(A_idx, :);
A = A / sqrt(n);
% % 匹配滤波放大倍数
% multiple = A(:,1)' * A(:,1);
%% 生成 y
noise = random('Normal', 0, sigma_n/sqrt(2), m, 1) + 1j * random('Normal', 0, sigma_n/sqrt(2), m, 1);
y = A * x + noise;
%% cVAMPro 求解
lambda = zeros(n,1) + lambda_val;
[x_LASSO, x_hat_d_ro] = cVAMPro(y, A, lambda, delta_VAMP, iter_max);
%%
% CROD
rho_active = sum(abs(x_LASSO) > 1e-3)/n;
Q_hat = (gamma - rho_active)/(1 - rho_active);
Rho = sum((abs(x_LASSO) > 1e-3).* (2 - lambda./(Q_hat*abs(x_LASSO) + lambda))) / 2 / n;
diff = 1;
while(diff > 1e-4)
Rho_pre = Rho;
Rho = sum((abs(x_LASSO) > 1e-3).* (2 - lambda./((gamma-Rho)/(1-Rho)*abs(x_LASSO) + lambda))) / 2 / n;
diff = abs(Rho - Rho_pre);
end
Q_hat = (gamma-Rho)/(1-Rho);
x_d_CROD = x_LASSO + A'*(y - A*x_LASSO)/Q_hat;
% plot(abs(x_d_CROD))
%%
RSS = sum(abs(y - A * x_LASSO).^2)/m;
chi = Rho*(1 - Rho)/(gamma - Rho);
if chi ~= 0
chi_temp = sqrt((chi+1)*(chi+1)-4*gamma*chi);
z = -(1 - chi + chi_temp) / (2*chi);
z_prime = -(1 - 2*gamma*chi + chi + chi_temp) / (2*chi*chi*chi_temp);
G_prime = (z + 1/chi);
G_wprime = (z_prime + 1/chi/chi);
chi_hat = gamma/2*G_wprime*RSS/(G_prime - chi*G_wprime)...
+ (G_prime*G_prime/2 - gamma/2*G_wprime)*sigma_n*sigma_n/(G_prime - chi*G_wprime);
else
G_prime = gamma;
G_wprime = gamma*(1-gamma);
chi_hat = gamma/2*G_wprime*RSS/(G_prime - chi*G_wprime)...
+ (G_prime*G_prime/2 - gamma/2*G_wprime)*sigma_n*sigma_n/(G_prime - chi*G_wprime);
end
sigma_CROD = sqrt(2*chi_hat) / Q_hat;
stat_CROD = abs(x_d_CROD / sigma_CROD).^2;
% window
stat_extend = stat_window(stat_CROD, win_size);
figure(100)
plot(stat_CROD);hold on;
plot(stat_extend);hold off;
n_index = ones(size(stat_extend));
t_index = zeros(size(stat_extend));
% distance_node = [target_index, target_index + 1, target_index + 2];
distance_node = target_index;
distance_area = target_index-2: 1: target_index+2;
distance_area2 = target2_index-2: 1: target2_index+2;
n_index(distance_area) = 0;
n_index(distance_area2) = 0;
t_index(distance_node) = 1;
for cnt_h_th = 1: len_P_fa
figure(12);
plot(stat_extend)
hold on;
kdline = zeros(size(stat_extend)) + h_thd(cnt_h_th);
plot(kdline)
hold off;
P_fa_CROD_cnt(cnt_SNR, cnt_h_th, rep) = sum(stat_extend(n_index>0) > h_thd(cnt_h_th)) / sum(n_index);
P_d_CROD_cnt(cnt_SNR, cnt_h_th, rep) = sum(stat_extend(t_index>0) > h_thd(cnt_h_th)) / sum(t_index);
end
end
fprintf('%d\n', rep);
end
P_fa_CROD = mean(P_fa_CROD_cnt, 3);
P_d_CROD = mean(P_d_CROD_cnt, 3);
display(['设定虚警率',num2str(P_fa(1))])
display(['实验虚警率',num2str(P_fa_CROD(1,1))])
display(['实验检测率',num2str(P_d_CROD(1,1))])
%% plot
figure(1);
loglog(P_fa,P_fa_CROD(1,:), 'linewidth', 2);
hold on;
grid on;
loglog(P_fa,P_fa_CROD(2,:), 'linewidth', 2);
loglog(P_fa,P_fa_CROD(3,:), 'linewidth', 2);
loglog(P_fa,P_fa_CROD(4,:), 'linewidth', 2);
loglog(P_fa,P_fa_CROD(5,:), 'linewidth', 2);
loglog(P_fa,P_fa_CROD(6,:), 'linewidth', 2);
legend('SNR = 0','SNR = 2','SNR = 4','SNR = 6','SNR = 8','SNR = 10');
xlabel('P_fa');
ylabel('P_fa_CROD');
% figure(2);
% loglog(P_fa_CROD_thry(1,:), P_d_CROD_thry(1,:), 'linewidth', 2);
% hold on;
% grid on;
% loglog(P_fa_CROD_thry(2,:), P_d_CROD_thry(2,:), 'linewidth', 2);
% loglog(P_fa_CROD_thry(3,:), P_d_CROD_thry(3,:), 'linewidth', 2);
% legend('SNR = 0', 'SNR = 10', 'SNR = 20');
% xlabel('P_{fa}');
% ylabel('P_{d}');
%
% % figure(4);
% % loglog(P_fa_CROD_thry(1,:), P_d_CROD_thry2(1,:), 'linewidth', 2);
% % hold on;
% % grid on;
% % loglog(P_fa_CROD_thry(2,:), P_d_CROD_thry2(2,:), 'linewidth', 2);
% % loglog(P_fa_CROD_thry(3,:), P_d_CROD_thry2(3,:), 'linewidth', 2);
% % legend('SNR = 0', 'SNR = 10', 'SNR = 20');
% % xlabel('P_{fa}');
% % ylabel('P_{d}');
%
%
% figure(3);
% loglog(P_fa_CROD(1,:), P_d_CROD(1,:), 'linewidth', 2);
% hold on;
% grid on;
% loglog(P_fa_CROD(2,:), P_d_CROD(2,:), 'linewidth', 2);
% loglog(P_fa_CROD(3,:), P_d_CROD(3,:), 'linewidth', 2);
% loglog(P_fa_CROD_thry(1,:), P_d_CROD_thry(1,:), 'linewidth', 2);
% loglog(P_fa_CROD_thry(2,:), P_d_CROD_thry(2,:), 'linewidth', 2);
% loglog(P_fa_CROD_thry(3,:), P_d_CROD_thry(3,:), 'linewidth', 2);
% legend('rSNR = 0', 'rSNR = 10', 'rSNR = 20', ...
% 'tSNR = 0', 'tSNR = 10', 'tSNR = 20');
% xlabel('P_{fa}');
% ylabel('P_{d}');
save test_Pd_Pfa_vamp_cal_stat.mat ...
SNR...
P_fa...
P_fa_CROD...
P_d_CROD...
lambda...
m...
n...
h_thd...
sigma_n...
target_scattering;