📄 ofdmber.m
字号:
modu_type='16QAM';
total_sub=512;
num_sym=64;
snr=0:1:20;
num_snr=length(snr);
num_run=10^4;
%error_count=0;
error=zeros(1,num_snr);
sc_error=zeros(1,num_snr);
%data_set=[1+j -1+j -1-j 1-j];
for n=1:num_snr
% SNR=10^(snr(n)/10);
error_count=0;
sc_error_count=0;
for m=1:num_run
if modu_type=='Q-PSK',
tmp=round(rand(2,num_sym));
tmp=2*tmp-1;
data=(tmp(1,:)-j*tmp(2,:))/sqrt(2);%Es=1
elseif modu_type=='16QAM',
data_set=[-3+j*3 -1+j*3 1+j*3 3+j*3 ...
-3+j -1+j 1+j 3+j ...
-3-j -1-j 1-j 3-j ...
-3-j*3 -1-j*3 1-j*3 3-j*3];
data_set=data_set./sqrt(mean(abs(data_set).^2));
num=ceil(rand(1,num_sym).*16);
data=zeros(1,num_sym);
for L=1:num_sym
if num(L)==0
num(L)=1;
end
data(L)=data_set(num(L));
end
% data=data./sqrt(mean(abs(data_set)^2));
end
ifft_in=zeros(1,total_sub);
ifft_in(1:num_sym)=data;
ifft_out=sqrt(total_sub)*ifft(ifft_in);
dft_out=fft(data)/sqrt(num_sym);
sc_ifft_in=zeros(1,total_sub);
sc_ifft_in(1:num_sym)=dft_out;
sc_ifft_out=sqrt(total_sub)*ifft(sc_ifft_in);
noise_power=10^(-snr(n)/10);
tmp = randn(2, total_sub);
complex_noise=(tmp(1,:)+j*tmp(2,:))/sqrt(2);
rx_samples=ifft_out+complex_noise*sqrt(noise_power);
sc_rx_samples=sc_ifft_out+complex_noise*sqrt(noise_power);
data_re_fft=fft(rx_samples);
data_received=data_re_fft(1:num_sym);
if modu_type=='Q-PSK',
data_received=sign(real(data_received))+j*sign(imag(data_received));
data_received=data_received/sqrt(2);
right_num=find((data_received-data)==0);
error_count=error_count+(num_sym-length(right_num));
elseif modu_type=='16QAM'
% location=1:16;
for L=1:num_sym
length=abs(data_received(L)-data_set);
data_detection=(length==min(length));
num_position=find(data_detection);
data_received(L)=data_set(num_position);
if data_received(L)~=data(L)
error_count=error_count+1;
end
end
end
% right_num=find((data_received-data)==0);
% error_count=error_count+(num_sym-length(right_num));
sc_re_fft=fft(sc_rx_samples);
sc_re_ifft=sc_re_fft(1:num_sym);
sc_received=ifft(sc_re_ifft);
if modu_type=='Q-PSK',
sc_received=sign(real(sc_received))+j*sign(imag(sc_received));
sc_received=sc_received/sqrt(2);
sc_right_num=find((sc_received-data)==0);
sc_error_count=sc_error_count+(num_sym-length(sc_right_num));
elseif modu_type=='16QAM'
% location=1:16;
for L=1:num_sym
length=abs(sc_received(L)-data_set);
sc_detection=(length==min(length));
num_position=find(sc_detection);
sc_received(L)=data_set(num_position);
if sc_received(L)~=data(L)
sc_error_count=sc_error_count+1;
end
end
end
% sc_right_num=find((sc_received-data)==0);
% sc_error_count=sc_error_count+(num_sym-length(sc_right_num));
% for k=1:num_sym
% re_detection=abs(data_received(k)-data_set);
% min_len=min(rx_detection);
% if min_len==re_detection(1)
% data_received(k)=1+j;
% elseif min_len==re_detection(2)
% data_received(k)=-1+j;
% elseif min_len==re_detection(3)
% data_received(k)=-1-j;
% else
% data_received(k)=1-j;
% end
% if data_received(k)~=data(k)
% error_count=error_count+1;
% end
% end
end
error(n)=error_count/(num_run*num_sym);
sc_error(n)=sc_error_count/(num_run*num_sym);
end
semilogy(snr,error,'o-',snr,sc_error,'>-');
%axis([0 20 0 1]);
legend('OFDM','SC-FDMA');
%semilogy(snr,sc_error);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -