mc-cdma matlab,Matlab MC-CDMA自适应调制仿真程序分析

%%%第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,左右,以前分析是在解扩合并模块出现了问题,还有那个比特分配算法,为什么在单独运行时会分配不同的比特,而在整个链路的仿真中就完全分配相同的比特数了,还请各位指点一下啊!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值