📄 ber_awgn_ran_old.m
字号:
%% Initialization
function BER=BER_AWGN_ran(Q,L,N_bit,N_user,SNRto)
flag=0;
% clear all;
N_sym=N_bit/log2(Q);
% for N_user=1:3;
% BER=zeros(N_user,SNRto);
BER=zeros(1,SNRto+1);
t_begin=1;
for SNRindB=0:SNRto
EbNo=10.^(SNRindB./10);
EsNo=log2(Q).*EbNo;
sigma=sqrt(L./(2*EsNo));
% nI=randn(N_user,N_sym*L);
% nQ=randn(N_user,N_sym*L);
clear A;
% % optimum address
%
% A(1,:) = [0 0 0 0 0 0 0];
% A(2,:) = [1 2 4 3 6 7 5];
% A(3,:) = [2 4 3 6 7 5 1];
% A(4,:) = [3 6 7 5 1 2 4];
% A(5,:) = [4 3 6 7 5 1 2];
% A(6,:) = [5 1 2 4 3 6 7];
% A(7,:) = [6 7 5 1 2 4 3];
% A(8,:) = [7 5 1 2 4 3 6];
% A = A(1:N_user,1:L);
%% Address Matrix Generating
X_rec=[];
% Random address & Bits Generation
for m=1:N_user
A(m,:) = round(rand(1,L)*(Q-1));
B(m,:) = BitStreamGen(N_bit);
X(m,:) = BitStreamToSymbol(B(m,:),Q); % Mapping
end
%%
BER_TEMP=[];
for threshold=t_begin:-0.02:0
for n=1:N_sym
% Address Assigning Y=X+A
Y=FFH(X(:,n),Q,A);
% M=zeros(Q,L);
M=[];
for i=1:N_user
M(:,:,i)=zeros(Q,L);
end
% Generate R Matrix
for i=1:L
for j=1:N_user
M(Y(j,i)+1,i,j)=1;
end
end
Chip=sum(M,3);
% R=M1+M2+M3+M4+M5+M6+M7+M8;
%% Signal Pass Though AWGN Channel
r=[];
for i=1:Q
for j=1:L
nI=randn(1);
nQ=randn(1);
if Chip(i,j)==0
r(i,j)=(nI*sigma).^2+(nQ*sigma).^2;
else
phi=2*pi*rand(1,Chip(i,j));
r(i,j)=(sum(cos(phi))+nI*sigma).^2+(sum(sin(phi))+nQ*sigma).^2;
end
end
end
R=r;
% R((n-1)*L+1:n*L,snr)=r;
% end
%% Detection
for i=1:N_user
Z(:,:,i)=zeros(Q,L);
end
for j=1:L
F=find(R(:,j)>threshold)-1;
c=[];
if length(F)>0
for i=1:N_user
c(i,:)=deFFH(F,A(i,j),Q)+1;
end
else
c=[];
end
for i=1:N_user
if length(c)>0
Z(c(i,:),j,i)=1;
else
Z(:,j,i)=zeros(1,Q);
end
end
end
sumz=[];
for i=1:N_user
sumz(i,:)=sum(Z(:,:,i),2);
end
D=[];
for i=1:N_user
% D(i,:)=find(sumz(i,:)==max(sumz(i,:)));
D_temp=find(sumz(i,:)==max(sumz(i,:)));
D_temp_length=length(D_temp);
if D_temp_length<Q
ZERO=zeros(1,Q-D_temp_length);
D_temp=[D_temp ZERO];
end
D(i,:)=D_temp;
end
D_length=[];
for i=1:N_user
D_length(i)=length(find(D(i,:)>0));
end
for i=1:N_user
X_rec(i,n)=D(i,ceil(rand(1)*D_length(i)))-1;
end
end
%% Received BitStream
B_rec=SymbolToBitStream(X_rec,Q);
%% BER Calculation
if SNRindB==0
BER(1)=sum(sum(B_rec~=B))/N_user/N_bit;
t_begin=threshold-0.02;
break;
end
BER_TEMP=[BER_TEMP sum(sum(B_rec~=B))/N_user/N_bit];
if length(BER_TEMP)~=1
if BER_TEMP(length(BER_TEMP))>=BER_TEMP(length(BER_TEMP)-1)
BER(SNRindB+1)=BER_TEMP(length(BER_TEMP)-1);
t_begin=threshold;
flag=flag+1
break;
end
end
if threshold<=0.02
BER(SNRindB+1)=BER_TEMP(length(BER_TEMP));
flag=flag+1
end
end
BER(SNRindB+1)
threshold
end
% figure(1);
%
% semilogy(0:SNRto,BER,'o');
% hold on;
% end
% figure(1);
% clf;
% semilogy(1:N_user,BER,'o');
% % semilogy(1:length(threshold),BER,'o');
% % hold on;
% % end
% % hold off;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -