%%%第n个子载波上的信道乘性因子的函数%%%%
function y=H(N)
% N=16;
tau=[0 10 20 30 50 80 110 140 180 230 280 330 400 490 600 730 880 1050]*10^(-9);%18径信道的时延
pdb=[-3.3 -3.6 -3.9 -4.2 0 -0.9 -1.7 -2.6 -1.5 -3 -4.4 -5.9 -5.3 -7.9 -9.4 -13.9 -16.3 -21.2];%各径的功率衰减dB
h_power=10.^(pdb/10);
L=length(pdb);
temp=sum(abs(h_power).^2);
h=h_power/sqrt(temp);%归一化各抽头系数的能量
% h=sqrt(h_power1);%多径信道的各抽头系数
for n=1:N
for l=1:L
h_exp(l)=h(l)*exp(-2*j*pi*(l-1)*n/N);
end
y(n)=sum(h_exp);
end
%%%%自适应调制的性能(贪婪算法)%%%%%%%%%%%%%
clear;
clc;
R=10*10e6;%系统的信息比特速率10Mbit/s
% ts=5*10^(-9);%信道采样时间间隔?
Ts=6.4*10^(-6);%OFDM符号周期
% Rt=R*Ts;%一个OFDM符号包含的比特数
v=10/3.6;%移动台速度10km/时
fc=5*10e9;%载频5G赫兹
ts=1/2*fc;%信道采样时间间隔?
tau=[0 10 20 30 50 80 110 140 180 230 280 330 400 490 600 730 880 1050]*10^(-9);%18径信道的时延
pdb=[-3.3 -3.6 -3.9 -4.2 0 -0.9 -1.7 -2.6 -1.5 -3 -4.4 -5.9 -5.3 -7.9 -9.4 -13.9 -16.3 -21.2];
fd=v/(3.0*10e8*fc);%最大多普勒频移
Ncp=128;%循环前缀数
Rb=2048;%每次分配的比特数,也即每个OFDM符号的比特数
SF=16;%扩频因子
NS=32;%扩频支路
NC=512;%子载波总数
% N0=0.1;%每个子载波上的噪声功率-10dbm
N=2^15;%用户数据个数
E=1;%0dBm 能量归一化
SNR_in_dB=0:1:20;
snr=10.^(SNR_in_dB/10);%信号和噪声功率之比
sgma=sqrt(E./(2*snr) );%噪声方差
SS=hadamard(SF);%长度为SF的沃尔什码
resourse1=randint(1,N);
% resourse1=(resourse1>0.5);%用户的原始数据,长度4096
resourse=reshape(resourse1,NS,N/NS);%串并转换
%%%%计算等效子载波的等效信道传递函数%%%%%%%
h=H(NC);
H1=reshape(h,NS,SF);
for i=1:NS
H_equ_abs(i)=SF/sqrt(sum(1./(abs(H1(i,:)).^2)));
end
%%%%%根据各个等效子载波的信道衰减情况确定自适应的调制参数%%%%%
B_targert=Rb/NS;
C=zeros(1,NS);%各个子载波上分配比特初始化,Cn属于(0,2,4,6)的集合
B_max=6;%每个子载波上所允许的最大比特数
Pe=10^(-5);%目标误码率
delta=log(5*Pe)/1.5;%在目标误码率下的信噪比间隔
B_total=0;
for jj=1:length(SNR_in_dB)
g=(H_equ_abs.^2)./sgma(jj);%当发射功率归一化为1时的信噪比
%比特分配;
while B_total
for n=1:NS
delta_p(n)=((2^(2*C(n))-1)-(2^(2*(C(n)+2))-1))*delta/g(n);
end
[deltap_min,n]=min( delta_p);
if C(n)
C(n)=C(n)+2;
else
C(n)=B_max;
end
B_total=B_total+2;
end
%%%%%%%功率分配%%%%%%%%%%%
p=((2.^(2.*C)-1)*delta)./g;
%%%%对各个等效子载波调制%%%%%%%
for i=1:NS
modu_resourse(i,:)=modulation(resourse(i,:),C(i));
end
N1=length(modu_resourse);%
%%%%%%%乘扩频码,即把各个等效子载波的调制和功率分配复制到同一扩频支路中的各子载波%%%%%%%%
Smodu_resourse=[]';
for i=1:NS
Smo_resourse=[];
for j=1:N1
Smo_resourse=[Smo_resourse modu_resourse(i,j)*SS(1,:)'];
end
Smodu_resourse=[Smodu_resourse;
Smo_resourse];
end
%%%%%ifft变换%%%%%%%%%%%
for i=1:NC
x1(i,:)=ifft(Smodu_resourse(i,:));
end
%%%%%%并串转换%%%%
x=reshape(x1,1,NC*N1);
%---------经过多径衰落信道----------%
chan=rayleighchan(ts,fd,tau,pdb)
xx=filter(chan,x);
%%%%%%%确定解调时各个子载波上的调制级别%%%%%%
% C1=[];
% for i=1:NS
% C1=[C1 C(i)*ones(1,SF)];
% end
%%%%加高斯白噪声%%%%
% for j=1:length(SNR_in_dB)
% y1=awgn(x,SNR_in_dB(j));
% SNR=10^(SNR_in_dB(j)/10);
% sgma=sqrt(E/(2*SNR));
t=randn(1,length(xx));
noise1=sgma(jj)*t;
noise2=sgma(jj)*t;
noise=noise1+noise2*j;
y1=xx+noise;
y=reshape(y1,NC,length(y1)/NC);%%串并转换
for i=1:NC
y_fft(i,:)=fft(y(i,:));
end
%%%%%解扩合并%%%%%%
SS0=[];
for i=1:NS
SS0=[SS0 SS(1,:)];
end
G=(SS0.*conj(h))./abs(h);%等增益合并时的合并系数,64个系数
G1=reshape(G,NS,SF);
for i=1:NS
%%%解扩合并,各个子载波的信号与对应的加权系数相乘后相加%%%%
for n=1:length(y_fft)
y_fft_combin(i,n)=dot(y_fft(((i-1)*SF+1):i*SF,n), G1(i,:));
end
end
%%%%%%解调%%%%%%%
for i=1:NS
y_source1(i,:)=demodulation(y_fft_combin(i,:),C(i));
end
%%%%%%并串转换%%%%%%
N2=length(y_source1);
y_source=reshape(y_source1,1,NS*N2);
%%%%%%%计算误码率%%%%%%%%%%%%%
error=y_source-resourse1;
error_number=length(find(error~=0));
Pe(jj)=error_number/N;
end
semilogy(SNR_in_dB,Pe,'*');
xlabel('比特信噪比');
ylabel('误比特率');
程序中省略了上下变频和加循环前缀,没有加多径信道时仿真得到的误码率在0.5左右,加了多径信道,还是在0.5,左右,以前分析是在解扩合并模块出现了问题,还有那个比特分配算法,为什么在单独运行时会分配不同的比特,而在整个链路的仿真中就完全分配相同的比特数了,还请各位指点一下啊!