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;