📄 ptssubcarriers.m
字号:
clear; close all;
K=8; % 用户数
M=[8 16 32 64]; % 每个用户bit数
L=8; % 扩频增益
V=4;
KK=1e3;
PAPR_PTS=zeros(4,KK);
for kk=1:1:KK
for m=1:1:4
userdata=round(rand(K,M(m))); % 生成数据
lp=find(userdata<1);
userdata(lp)=-1;
% 生成walsh码
walsh=hadamard(L);
% 扩频
afterspreading=zeros(K,M(m)*L);
for k=1:1:K
afterspreading(k,:)=kron(userdata(k,:),walsh(k,:));
end
% 复合
X=zeros(1,M(m)*L);
X=sum(afterspreading);
% PTS
N=length(X);
A=zeros(V,N);
for v=1:1:V
A(v,v:V:N)=X(v:V:N);
end
a=zeros(V,N);
a=ifft(A,[],2);
% 系数最优化
b=ones(1,V);
symbol=zeros(V,N);
clear v;
for v=1:1:V
symbol(v,:)=a(v,:)*b(v);
end
x=sum(symbol);
power=(abs(x)).^2;
peak=max(power);
average=mean(power);
PAPR0(kk)=10*log10(peak/average);
index=1;
while index<V+1
b(index)=-1;
clear v;
for v=1:1:V
symbol(v,:)=a(v,:)*b(v);
end
x=sum(symbol);
power=(abs(x)).^2;
peak=max(power);
average=mean(power);
PAPR(kk)=10*log10(peak/average);
if PAPR(kk)>PAPR0(kk)
b(index)=1;
else
PAPR0(kk)=PAPR(kk);
end
index=index+1;
end
% 计算PTS方法的PAPR
clear v;
for v=1:1:V
symbol(v,:)=a(v,:)*b(v);
end
x=sum(symbol);
power=(abs(x)).^2;
peak=max(power);
average=mean(power);
PAPR_PTS(m,kk)=10*log10(peak/average);
end
end
% CCDF
[cdf1,PAPR1]=ecdf(PAPR_PTS(1,:));
[cdf2,PAPR2]=ecdf(PAPR_PTS(2,:));
[cdf3,PAPR3]=ecdf(PAPR_PTS(3,:));
[cdf4,PAPR4]=ecdf(PAPR_PTS(4,:));
semilogy(PAPR1,1-cdf1,PAPR2,1-cdf2,PAPR3,1-cdf3,PAPR4,1-cdf4);
gtext('N=64');
gtext('N=128');
gtext('N=256');
gtext('N=512');
xlabel('PAPR0[dB]');
ylabel('CCDF(pr[PAPR>PAPR0])');
grid on
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -