need help for iteration
I have this certain iteration to simulate multiuser detection.And the thing is,i cannot get what i'm supposed to get.
I'm supposed to get a smooth line,but what i have is jagged line.So i'm wondering what is wrong with this codes?
function testme
rand('state',11);
randn('state',11);
L = 5000; % Number of bits
N = 16; % Number of chips per bit
U = 2; % Number of users
S = codematrix(N,U);
b = sign(rand(U,L)-0.5);
snr = 0:20;
sigma = sqrt(1./(10.^(snr/10)));
T = inv(transpose(S)*S)*transpose(S);
mu = 0.1;
for k1 = 1:length(sigma)
y = S*b;
n = impulsenoise(sigma(k1),[N L]);
r = y+n;
r = r(:);
for k2 = 1:L
r0 = r((k2-1)*N+(1:N));
b0 = T*r0;
b02 = b0;
x = r0-S*b0;
[x,e] = minimax(x,sigma(k1)*sigma(k1));
b01 = b0+mu*T*x;
while b01 - b02 > 0.000001
b02 = b0;
x = r0-S*b0;
[x,e] = minimax(x,sigma(k1)*sigma(k1));
b0 = b0+mu*T*x;
b01 = b0 ;
end
%% figure, plot(e), pause
%% b1(:,k2) = T*r0;
b1(:,k2) = b0;
end
ber(k1) = mean(abs(sign(b1(1,:))-b(1,:)))/2;
end
figure, semilogy(snr,ber,'r')
xlim([snr(1) snr(end)]);
xlabel('SNR (dB)'), ylabel('BER')
% FUNCTIONS
function S = codematrix(N,U)
H = hadamard(N);
S = 1/sqrt(N)*H(:,1:U);
function n = impulsenoise(sigma,dim)
e = 0.01;
k = 100;
nu = sigma/sqrt((1-e)+e*k);
u = rand(1,dim(2)) < e;
v = [nu nu*sqrt(k)];
n = bsxfun(@times,v(u+1),randn(dim));
function [x,e] = minimax(x0,sigma2)
gamma = 1.5/sqrt(sigma2);
u = abs(x0) < gamma*sigma2;
x = u.*(x0/sigma2)+(1-u).*(gamma*sign(x0));
e = u.*(x0.*x0/(2*sigma2))+(1-u).*(gamma*abs(x0)-gamma*gamma*sigma2/2);
e = sum(e);
I'm supposed to get a smooth line,but what i have is jagged line.So i'm wondering what is wrong with this codes?
0
Comments
use snr = 0:0.1:20; instead of snr = 0:20;
keep in mind that it'll take much longer to run.