clc;
clear all;
close all;
%******************initialization(赋初值)**********************%
%已知参数
Rb=1.28e5;%比特率200000
fs=6.4e6;%采样率20000000
fsl=64000;%采样率500
delay=0.1e-3;%信道最大多径时延0.0001
per_bits=4;%16QAM调制每符号的比特数 2^4=16
signs=1000;%传输OFDM符号数10000个
fc=8e5;%第一个子信道载波频率fi=f0+i/T
%一维数据率:2*10^5=200kbps
%二维数据率:200*1/8=25kbps
%总数据率:200+25=225kbps
%总带宽:6.27*10^4=62.7kHZ
fd=fs/Rb; %每个码的采样个数
save fd fd;
save signs signs;
%求得OFDM符号相应参数
Tg=4*delay;%保护间隔长度 4*0.0001=0.0004
T=5*Tg;%OFDM符号周期 5*0.0004=0.002
T_fft=T-Tg;%有用信号长度 0.002-0.0004=0.0016(有用信号长度=符号周期-保护间隔)
f_inte=1/T_fft;%子载波间隔=1/有用信号长度=1/0.0016=625
bits_per_sign=Rb/(1/T);%一个OFDM符号需要传送的比特数=比特率/(1/OFDM符号周期)=40000/(1/0.002)=400
N=bits_per_sign/per_bits;%子信道数目=一个OFDM符号需要传送的比特数/16QAM调制每符号的比特数=400/4=100
bits=bits_per_sign*signs;%需要传输比特数=一个OFDM符号需要传送的比特数*传输OFDM符号数=400*10=4000
num_per_sign=bits_per_sign*fd;%一个OFDM符号需要采样数
num_per_use=bits_per_sign*fd*0.8; %有用信号采样数
num_per_cp=bits_per_sign*fd*0.2;%cp采样数
save N N;
save bits bits;
save num_per_sign num_per_sign;
save num_per_use num_per_use;
save num_per_cp num_per_cp;
t=0:1/fs:T-1/fs;%t从0到(0.002-1/400000=0.00199975),采样间隔为0.00000025(一个符号周期),8000点
nt=0:1/fs:T*signs-1/fs;%传输符号总长度时间 ,同上,400000个点
tg=0:1/fs:Tg-1/fs;%保护间隔长度时间 8000*1/5=1600点
t_fft=0:1/fs:T_fft-1/fs;%一个有用信号长度时间 8000-1600=6400点
nt_fft=0:1/fs:T_fft*signs-1/fs;%总有用信号长度 6400*5=32000点
%********************发射端********************%
%********************产生发射端信号********************%
bits_in=randint(1,bits);%传输比特流(随机产生0,1比特流400个)
% bits_in=randi(1,1,bits);%或者用这个
save bits_in bits_in;
load bits_in bits_in;
bits_1=repmat(bits_in,fs/Rb,1);%扩展为采样率/比特率(1*4000000/40000=100行),100*400列的数据
bits_1_ps=reshape(bits_1,1,(fs/Rb)*bits);%并串转换为1*40000的数据
figure(1);
plot(nt,bits_1_ps,'r');%x为传输符号总长度时间的采样(40000次),y为随机产生的数据流。
axis([0 5*T 0 1.2]);%x从0-0.01s,y从0到1.2
title('基带码元信号波形');
xlabel('t');
%********************16QAM星座映射********************%
bits_in_re=reshape(bits_in,per_bits,bits/per_bits);%400个0,1信号转换为4行100列
xx=bi2de(bits_in_re.','left-msb');%2进制转换为0~16的十进制
M=16;
signal_mapping=qammod(xx,M);%星座映射到16个点
figure(2);
scatter(real(signal_mapping),imag(signal_mapping),'*r');%描绘散点图,(x,y,形状及颜色)
title('16QAM星座映射图');
xlabel('real'),ylabel('j*imag');
%********************IFFT********************%
signal_mapping_sp1=reshape(signal_mapping,N,signs);%星座映射后的1*100个点进行串并转换,20(子信道数目)*5(OFDM符号数)
signal_mapping_sp=signal_mapping_sp1;%串并转换
signal_mapping_spp=signal_mapping_sp.';
save signal_mapping_spp signal_mapping_spp;
SNR_dB=5:.1:14;%CCDF的门限值(dB),5-14,91个点
SNR_LI = 10.^(SNR_dB/10);%转换单位
Nn=length(SNR_dB);
c1=64;
CR=[1.2,1.5,1.7];
signal_mapping_spp1=zeros(1,c1);
n1=signs;
ITERATE_NUM =length(CR);%4类CR
for jj=1:n1;
%产生16QAM信号
%ofdm调制
signal_mapping_spp1=signal_mapping_spp(jj,:);
w1=ifft(signal_mapping_spp1,length(t_fft),2);
w11(jj,:)=w1;
Ax=abs(w1);
Signal_Power = abs(w1.^2);
Peak_Power = max(Signal_Power,[],2);
Mean_Power = mean(Signal_Power,2);
PAPR_Orignal(jj) = 10*log10(Peak_Power./Mean_Power);
for nIter=1:ITERATE_NUM
% Clipping
% x_tmp = x(Signal_Power>CR*Mean_Power);
% x_tmp = sqrt(CR*Mean_Power)*x_tmp./abs(x_tmp);
% x(Signal_Power>CR*Mean_Power) = x_tmp;
A=CR(nIter)*sqrt(Mean_Power);
x_tmp = w1(Ax>A);
x_tmp = x_tmp*A./abs(x_tmp);
w1(Ax>A) = x_tmp;
% Filtering
XX = fft(w1,length(t_fft),2);
% XX(K/2+(1:N-K)) = zeros(1,N-K);
w1 = ifft(XX,length(t_fft),2);
%
% PAPR Compute
Signal_Power = abs(w1.^2);
Peak_Power = max(Signal_Power,[],2);
Mean_Power = mean(Signal_Power,2);
PAPR_RCF(nIter,jj) = 10*log10(Peak_Power./Mean_Power);
for mc=1:nIter
if (nIter==1)
w22(jj,:)=w1;
elseif (nIter==2)
w33(jj,:)=w1;
elseif (nIter==3)
w44(jj,:)=w1;
end
end
end
end
[cdf0, PAPR0] = ecdf(PAPR_Orignal);
[cdf1, PAPR1] = ecdf(PAPR_RCF(1,:));
[cdf2, PAPR2] = ecdf(PAPR_RCF(2,:));
[cdf3, PAPR3] = ecdf(PAPR_RCF(3,:));
semilogy(PAPR0,1-cdf0,'--b',PAPR1,1-cdf1,'--r',PAPR2,1-cdf2,'--g',PAPR3,1-cdf3,'--c')
legend('Orignal','CR=1.2','CR=1.5','CR=1.7')
xlabel('PAPR0 [dB]');
ylabel('CCDF (Pr[PAPR>PAPR0])');
xlim([0 12])
grid on
% xlabel('PAPR(dB)'),ylabel('互补累积分布函数CCDF(Pr[PAPR>PAPR0]')
% legend('M=0','M=2','M=4','M=8','M=16')
% signal_after_IFFT=ifft(signal_mapping_sp.',length(t_fft),2);%IFFT变换(过采样)
% signal_after_IFFT=w11;
% signal_after_IFFT=w22;
% signal_after_IFFT=w33;
signal_after_IFFT=w44;
signal_after_IFFT_1=reshape(signal_after_IFFT.',1,length(nt_fft));%并串转换
figure(3);
subplot(2,1,1);
plot(nt_fft,real(signal_after_IFFT_1),'r');%取实部
title('IFFT变换后的信号波形');
xlabel('t');
f=[-fs/2:fs/2-1];%从-2000000~1999999共4000000个采样点
subplot(2,1,2);
signal_after_IFFT_fre=abs(fftshift(fft(signal_after_IFFT_1,fs)));%取模,能量值(fftshift功能将fs/2,fs移到-fs/2,0)
plot(f,signal_after_IFFT_fre,'r');
title('IFFT变换后的信号频谱');
xlabel('f');
%********************调制********************%
base_carrier=exp(i*2*pi*fc*t_fft);%子信道载波
save base_carrier base_carrier;
for i=1:signs
signal_ofdm_p(i,:)=signal_after_IFFT(i,:).*base_carrier;%(射频载波调制)上变频方法:星座映射后的数据进行ifft
end
signal_ofdm=reshape(signal_ofdm_p.',1,length(nt_fft));%
figure(4);
subplot(2,1,1);
plot(nt_fft,real(signal_ofdm),'r');
title('调制后的OFDM信号波形');
xlabel('t');
f=[-fs/2:fs/2-1];%1/4000000
subplot(2,1,2);
signal_ofdm_fre=abs(fftshift(fft(signal_ofdm,fs)));%取能量值
plot(f,signal_ofdm_fre,'r');
title('调制后的OFDM信号频谱');
xlabel('f');
%******************添加循环前缀**********************%
signal_cir_pre=zeros(signs,length(t));%生成5行8000列的0数字串
for i=1:signs
signal_cir_pre(i,1:length(tg))=signal_ofdm_p(i,(length(t_fft)-length(tg)+1):length(t_fft));%前1600为有用信号的后1600位
signal_cir_pre(i,(length(tg)+1):length(t))=signal_ofdm_p(i,1:length(t_fft));%后6400
end
figure(5);
subplot(2,1,1);
plot(t_fft,real(signal_ofdm(1:length(t_fft))),'r');
axis([0,T,-6e-3,6e-3]);
title('未添加循环前缀的第一个OFDM符号波形');
xlabel('t');
subplot(2,1,2);
signal_cir_pre_re=reshape(signal_cir_pre.',1,length(nt));
plot(nt,real(signal_cir_pre_re),'r');
axis([0,T,-6e-3,6e-3]);
title('添加循环前缀后的第一个OFDM符号波形');
xlabel('t');
% %******************信道**********************%
%******************高斯白噪声信道**********************%
% y=awgn(signal_cir_pre_re,2,'measured');
% y=awgn(signal_cir_pre_re,-5,'measured');
y=awgn(signal_cir_pre_re,-5,'measured');
% %******************瑞利信道**********************%
% ts=1/fs; %信号周期
% fd=0; %Doppler多普勒频偏,以Hz为单位
% chan = rayleighchan(ts,fd); %瑞利信道(ts采样时间,fd多普勒频偏(v*载频fc/c),tau输入的信道参数 向量包含各径延时s为单位,pdf输入的信道参数 包含各径功率)
% n=1/4;
% chan.PathDelays=delay/n;%各径时延
% y = filter(chan,signal_cir_pre_re);
%******************接收端**********************%
figure(6);
subplot(2,1,1);
plot(nt,real(signal_cir_pre_re),'r');
title('发射的OFDM符号波形');
xlabel('t');
rece_signal=y;
% rece_signal=signal_cir_pre_re;
subplot(2,1,2);
plot(nt,real(rece_signal),'r');
title('接收到的OFDM信号波形