Add example
This commit is contained in:
@@ -0,0 +1,280 @@
|
||||
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;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user