diff --git a/Phase Transitions in FAR using CS/Expr3.asv b/Phase Transitions in FAR using CS/Expr3.asv deleted file mode 100644 index cc6fbaa..0000000 --- a/Phase Transitions in FAR using CS/Expr3.asv +++ /dev/null @@ -1,72 +0,0 @@ -% Expr2.m to draw Fig 3(a) -clc; -clear; - -M = 4; -N = 128; -rate = 0.02; % \Delta f / f_c = 0.02 -beta = 1; - -max_n = 125; -max_k = 25; -trials_time = 50; - -prob = zeros(max_n, max_k); - -rng(1) - -Phi_far = zeros(N, N * M); -C = randi([1, M], 1, N); -xi = 1 + 0.02 * C; - -% for i = 1:N -% -% Phi_x = zeros(N, M); -% -% for p = 1:M -% -% for q = 1:N -% range = ((p - 1) * C(i)) / M; % p start from 0 or 1? -% doppler = ((q - 1) * (i - 1) * xi(i)) / N; % q start from 0 or 1? -% Phi_x(q, p) = exp(1j * 2 * pi * (range + doppler)) / sqrt(N); -% end -% -% end -% -% % t == ctranspose(Phi_x(:,1)) * Phi_x(:,1) == 1 -% Phi_far(:, (i - 1) * M + 1:i * M) = Phi_x; -% -% end - -for i = 1:n - for j = 1:m - - -n = 60; -k = 5; - -s = beta * k * M; -x = 0; - -for t = 1:trials_time - x = x + Expr3_can_recovery(Phi_far, N, M, n, s, eps); -end -disp(x); - - -for n = 1:max_n - - parfor k = 1:max_k - s = beta * k * M; - x = 0; - - for t = 1:trials_time - x = x + Expr3_can_recovery(Phi_far, N, M, n, s, eps); - end - - prob(n, k) = x / trials_time; - end - -end - -save("Expr3.mat", "prob"); diff --git a/Phase Transitions in FAR using CS/Expr3.m b/Phase Transitions in FAR using CS/Expr3.m index 31d44a5..83f6371 100644 --- a/Phase Transitions in FAR using CS/Expr3.m +++ b/Phase Transitions in FAR using CS/Expr3.m @@ -4,12 +4,12 @@ clear; M = 4; N = 128; -rate = 0.02; % \Delta f / f_c = 0.02 +epi = 0.02; % \Delta f / f_c = 0.02 beta = 1; max_n = 125; max_k = 25; -trials_time = 10; +trials_time = 5; eps = 1e-5; prob = zeros(max_n, max_k); @@ -18,33 +18,19 @@ rng(1) Phi_far = zeros(N, N * M); -C = randi([0, M-1], 1, N); -vecn = 0:N-1; -xi = 1 + rate .* C; +for n = 0:N - 1 + Cn = floor(rand() * M); + + for q = 0:N - 1 + + for p = 0:M - 1 + Phi_far(n + 1, q * M + p + 1) = exp(1i * 2 * pi * p / M * Cn + 1i * 2 * pi * q / N * n * (1 + Cn * epi)); + end -for i = 1:N - for j = 1:M - t = (i-1)*M+j; - temp = 1/sqrt(N) .* exp(1j * 2 * pi + (j-1) / M .* C + 1j * 2 * pi * (i-1)/N .* vecn .* xi); - Phi_far(:, t) = temp; end - disp(ctranspose(Phi_far(:,1)) * Phi_far(:,1)) + end - -% n = 60; 0 -n = 70; -k = 7; - -s = beta * k * M; -x = 0; - -for t = 1:trials_time - x = x + Expr3_can_recovery(Phi_far, N, M, n, s, eps); -end -disp(x); - - for n = 1:max_n parfor k = 1:max_k diff --git a/Phase Transitions in FAR using CS/Expr3_can_recovery.asv b/Phase Transitions in FAR using CS/Expr3_can_recovery.asv deleted file mode 100644 index 0e8265e..0000000 --- a/Phase Transitions in FAR using CS/Expr3_can_recovery.asv +++ /dev/null @@ -1,43 +0,0 @@ -function flg = Expr3_can_recovery(Phi_far, N, M, n, s, eps) - Phi = zeros(n, N * M); - indices = randperm(N, n); - - for i = 1:n - Phi(i, :) = Phi_far(indices(i), :); - end - d = M*N; - x = zeros(d, 1); - random_indices = randperm(d, s); - x(random_indices) = randn(s, 1); - x = sign(x); - - for i = 1:M * N - - if x(i) ~= 0 - t = rand(1) * 2 * pi; - x(i) = cos(t) + 1j * sin(t); - end - - end - - y = Phi * x; - - cvx_begin quiet - variable s1(d) complex - minimize(norm(s1, 1)) - subject to - norm(y - Phi * s1) <= eps - cvx_end - - x = sign(real(x)); - s1 = real(s1); - p = norm(x - s1, 2); - disp(p); - - if p < eps - flg = 1; - else - flg = 0; - end - -end diff --git a/Phase Transitions in FAR using CS/Expr3_can_recovery.m b/Phase Transitions in FAR using CS/Expr3_can_recovery.m index b67b7e7..53ee087 100644 --- a/Phase Transitions in FAR using CS/Expr3_can_recovery.m +++ b/Phase Transitions in FAR using CS/Expr3_can_recovery.m @@ -1,39 +1,25 @@ function flg = Expr3_can_recovery(Phi_far, N, M, n, s, eps) - Phi = zeros(n, N * M); - indices = randperm(N, n); - for i = 1:n - Phi(i, :) = Phi_far(indices(i), :); - end - d = M*N; - x = zeros(d, 1); - random_indices = randperm(d, s); - x(random_indices) = randn(s, 1); - x = sign(x); + % select random n cols + col_choose = randperm(N, n); + Phi = Phi_far(col_choose, :); - for i = 1:M * N + % generate sparse signal + sparse_signal = zeros(M, N); + block = randperm(N, s); + sparse_signal(:, block) = exp(1i * 2 * pi * rand(M, s)); - if x(i) ~= 0 - t = rand(1) * 2 * pi; - x(i) = cos(t) + 1j * sin(t); - end - - end - - y = Phi * x; + % generate y + y = Phi * sparse_signal(:); cvx_begin quiet - variable s1(d) complex - minimize(norm(s1, 1)) - subject to - norm(y - Phi * s1) <= eps + variable x(M * N) complex + minimize(norm(x, 1)) + subject to + Phi * x == y cvx_end - x = sign(real(x)); - s1 = real(s1); - - p = norm(x - s1, 2); - disp(p); + p = norm(x - sparse_signal(:), 2); if p < eps flg = 1;