Files
FAR_CS/0 - example/wzk - PSK_ROC/yAxn_MC.m
T
2024-11-11 16:32:53 +08:00

107 lines
3.3 KiB
Matlab

function [ res_MF, res_CS, P_fa, H1_MF_cnt, H0_MF_cnt, H1_CS_cnt, H0_CS_cnt ] = yAxn_MC( A, SNR, Target_index, lambda, rep_time )
% matrix parameters
[M, N] = size(A);
mul = A(:,1)'*A(:,1);
% H0 sample
L = round(Target_index + N * 0.1);
R = round(N * 0.9);
Lambda_C = L: R;
% parameters
sigma_n = 0.1;
Target_amplitude = sqrt(10^(SNR/10) * sigma_n^2 / mul);
%% CS setting
% CS-parameters
% lambda = 0.0005;
alpha = 1/4;
delta = 1e-8*alpha;
% CS-normalization
J1 = A*A';
lambda_J=eig(J1);
A_norm = A / sqrt(lambda_J(end));
Hp = A_norm'*A_norm;
[~, D] = eig(Hp);
d = diag(D);
sigma_n_norm = sigma_n / sqrt(lambda_J(end));
%% generate x
x = zeros(N, 1);
x(Target_index) = Target_amplitude;
%% MC parameters
P_fa = [1e-6, 1e-5, 1e-4, 5e-4, 1e-3, 5e-3, 1e-2, 5e-2, 1e-1, 5e-1, 1];
len_P_fa = length(P_fa);
P_fa_MF_cnt = zeros(len_P_fa, rep_time);
P_d_MF_cnt = zeros(len_P_fa, rep_time);
P_fa_CS_cnt = zeros(len_P_fa, rep_time);
P_d_CS_cnt = zeros(len_P_fa, rep_time);
H1_index = zeros(N, 1);
H1_index(Target_index) = 1;
H0_index = ones(size(x));
H0_index(Target_index) = 0;
H1_MF_cnt = zeros(1, rep_time);
H0_MF_cnt = zeros(N - 1, rep_time);
H1_CS_cnt = zeros(1, rep_time);
H0_CS_cnt = zeros(N - 1, rep_time);
%% MC
parfor rep = 1: rep_time
% for rep = 1: rep_time
%% generate 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;
%% recover
% MF
x_mf = A' * y ./ mul;
% sigma_MF = sqrt(var(x_mf(Lambda_C)));
sigma_MF = sigma_n / sqrt(mul);
x_mf_norm = x_mf ./ sigma_MF;
stat_MF = abs(x_mf ./ sigma_MF).^2;
% CS
y_norm = y / sqrt(lambda_J(end));
x_FISTA = FISTA_v1(y_norm, A_norm, lambda, delta, Hp);
[x_d_cal_f, hat_Q1_cal_f, sigma_d_cal_f] = cal_debiased_LASSO_v1(x_FISTA, A_norm, y_norm, lambda, sigma_n_norm, d);
% sigma_CS = sqrt(var(x_d_cal_f(Lambda_C)));
sigma_CS = sigma_d_cal_f;
x_cs_norm = x_d_cal_f ./ sigma_CS;
stat_CS = abs(x_d_cal_f ./ sigma_CS).^2;
%% detect
H1_MF_cnt(rep) = x_mf(Target_index);
H0_MF_cnt(:,rep) = [x_mf(1:Target_index-1);x_mf(Target_index+1:end)];
H1_CS_cnt(rep) = x_d_cal_f(Target_index);
H0_CS_cnt(:,rep) = [x_d_cal_f(1:Target_index-1);x_d_cal_f(Target_index+1:end)];
kd = chi2inv(1 - P_fa, 2) / 2;
for cnt_h_th = 1: len_P_fa
P_fa_MF_cnt(cnt_h_th, rep) = sum(stat_MF(H0_index > 0) > kd(cnt_h_th)) / sum(H0_index);
P_d_MF_cnt(cnt_h_th, rep) = sum(stat_MF(H1_index > 0) > kd(cnt_h_th)) / sum(H1_index);
P_fa_CS_cnt(cnt_h_th, rep) = sum(stat_CS(H0_index > 0) > kd(cnt_h_th)) / sum(H0_index);
P_d_CS_cnt(cnt_h_th, rep) = sum(stat_CS(H1_index > 0) > kd(cnt_h_th)) / sum(H1_index);
end
fprintf('%d\n', rep);
end
P_fa_MF = mean(P_fa_MF_cnt, 2);
P_d_MF = mean(P_d_MF_cnt, 2);
P_fa_CS = mean(P_fa_CS_cnt, 2);
P_d_CS = mean(P_d_CS_cnt, 2);
res_MF = [P_fa_MF, P_d_MF];
res_CS = [P_fa_CS, P_d_CS];
end