1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
| function [y,Y,E,xbar,Delta,Eder,Etrue,SNRspars,sigmanoise]= mygenerdatatest(M,N,nb_pic,NoiseLevel)
%#codegen
coder.inline('never');
% time samples
Tau = 0:N-1; Tau = Tau(:);
DeltaTau = 0.5;
Tau = min(max(0,Tau+DeltaTau*(rand(N,1)-1/2)),N-1);
%frequences sur la grille
Theta = (0:M-1)/M; Theta = Theta(:);
%position of peaks
if(nb_pic==4)
pos = [100 150 200 400];
elseif(nb_pic==6)
pos = [100 150 200 250 300 400];
else
q = randperm(M);
pos = q((1:nb_pic));
end
%perturbation
Delta = zeros(M,1);
if(nb_pic==4)
Delta(pos) = [0.1 -0.4 -0.3 0.2]/M;
elseif(nb_pic==6)
Delta(pos) = [0.1 -0.4 -0.3 0.2 -0.1 -0.2]/M;
else
Delta(pos) = (0.1/M).*ones(M,1) ;
end
%frequences
Nu = Theta + Delta;
o = Nu(pos);
%modulus of peaks
if(nb_pic==6)
Al = [0.5 0.9 1 0.7 0.8 0.6]';
elseif(nb_pic==4)
Al = [0.5 0.9 1 0.7]';
else
Al = ones(nb_pic,1);
end
%phase of peaks
fi = rand(nb_pic,1).*(2*pi);
%exact sparse signal we want to estimate
xbar = zeros(M,1);
for ind = 1:length(o)
ocur = o(ind);
xbar(Nu == ocur) = Al(ind)*exp(1i*fi(ind));
end
%exact cisoid (before adding noise)
sig = 0;
%xx(k)=zeros(1,nb_pic);
for k =1:nb_pic;
xx(k)= zeros(1,nb_pic);
end
for k = 1:nb_pic
%xx(k)= zeros(1,nb_pic);
xx(k) = Al(k)*exp(1i*fi(k));
sig = sig + xx(k)*exp(1i*2*pi*Tau*o(k));
end
%IFFT linear operator
E = exp(1i*2*pi*Tau*Theta');
%derivative
Eder = ((1i*2*pi*Tau/M)*ones(1,M)) .* exp(1i*2*pi*Tau*Theta');
% exact frequency matrix
Etrue = exp(1i*2*pi*Tau*Nu');
%observation
Y = sig(:);
sigmanoise = std(Y) * 10^(-NoiseLevel/20);
z = randn(2*N,1);
y = Y + (sigmanoise/sqrt(2)) * (z(1:N,1) + 1i * z(N+1:end,1));
SNRspars = 20*log10(min(Al)/sigmanoise);
end |
Partager