58 lines
1.4 KiB
Matlab
58 lines
1.4 KiB
Matlab
function [ x_mf_norm, x_cs_norm ] = yAxn_recovery( A, SNR, Target_index, lambda )
|
|
|
|
% 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;
|
|
|
|
|
|
%% 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)));
|
|
x_mf_norm = x_mf ./ sigma_MF;
|
|
|
|
% 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)));
|
|
x_cs_norm = x_d_cal_f ./ sigma_CS;
|
|
|
|
end
|
|
|