function [p]=APSK_modulation(snr_in_dB)
N=10240;
snr=10^(snr_in_dB/10); %信噪比
sgma=sqrt(42/(16*snr)); %噪声标准方差
M=16;
K=4;
v=sqrt(-1);
alpha=2.75; %16APSK性能最优时内外半径比,r1为内半径
P=12; % 信号功率设定
%sgma=sqrt(P/2/snr);
%在0到M间产生N个整数
x=randint(1,N,M)+1; %产生一组随机数
%%%%%%%%%%%%%%%%%%%%%%%%%% 16APSK信源产生模块 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%由相对半径和功率限制计算内、外圆半径
r1=sqrt(P/(4+12*alpha*alpha));
r2=r1*alpha;
%星座
s_apsk=[r1*exp(v*(2*pi*1/4-pi/4));
r1*exp(v*(2*pi*2/4-pi/4));
r1*exp(v*(2*pi*3/4-pi/4));
r1*exp(v*(2*pi*4/4-pi/4));
r2*exp(v*(2*pi*1/12-pi/12));
r2*exp(v*(2*pi*2/12-pi/12));
r2*exp(v*(2*pi*3/12-pi/12));
r2*exp(v*(2*pi*4/12-pi/12));
r2*exp(v*(2*pi*5/12-pi/12));
r2*exp(v*(2*pi*6/12-pi/12));
r2*exp(v*(2*pi*7/12-pi/12));
r2*exp(v*(2*pi*8/12-pi/12));
r2*exp(v*(2*pi*9/12-pi/12));
r2*exp(v*(2*pi*10/12-pi/12));
r2*exp(v*(2*pi*11/12-pi/12));
r2*exp(v*(2*pi*12/12-pi/12))].';
%完成数据映射
for n=1:N
x_apsk(n)=s_apsk(x(n));
end
%%%%%%%%%%%%%% IFFT处理模块 %%%%%%%%%%%%%%%%%%%%%
%reshape重新排列矩阵
% y_apsk=reshape(x_apsk,K,N/K);
% for n=1:N/K
% yy_apsk(:,n)=ifft(y_apsk(:,n),K);
% end
% z_apsk=reshape(yy_apsk,1,N);
%%%%%%%%%%%%%%%%%% 送放大器 %%%%%%%%%%%%%%%%%%%%%%
% for n=1:N
% HPA_apsk(n)=saleh(z_apsk(n));
% end
%接收信号
for i=1:N,
[n(1) n(2)]=gngauss(sgma);
Dey_apsk(i)=x_apsk(i)+n(1);
end;
%%%%%%%%%%%%%%%%%% 解调模块 %%%%%%%%%%%%%%%%%%%%%%%
% Dez_apsk=reshape(Dey_apsk,K,N/K);
%
% for n=1:N/K
% Deyy_apsk(:,n)=fft(Dez_apsk(:,n),K);
% end
%
% Dew_apsk=reshape(Deyy_apsk,1,N);
%取幅度和相位
r_apk=abs(Dey_apsk);
q_apk=angle(Dey_apsk);
% 4+12APSK
%判别
for n=1:N
if r_apk(n)<(r1+r2)/2
if q_apk(n)<=pi/2&q_apk(n)>0
x_deapk(n)=s_apsk(1);
elseif q_apk(n)<=pi&q_apk(n)>pi/2
x_deapk(n)=s_apsk(2);
elseif q_apk(n)<=-pi/2&q_apk(n)>-pi
x_deapk(n)=s_apsk(3);
else x_deapk(n)=s_apsk(4);
end
else if q_apk(n)<=pi/6&q_apk(n)>0
x_deapk(n)=s_apsk(5);
elseif q_apk(n)<=pi/3&q_apk(n)>pi/6
x_deapk(n)=s_apsk(6);
elseif q_apk(n)<=pi/2&q_apk(n)>pi/3
x_deapk(n)=s_apsk(7);
elseif q_apk(n)<=2*pi/3&q_apk(n)>pi/2
x_deapk(n)=s_apsk(8);
elseif q_apk(n)<=5*pi/6&q_apk(n)>2*pi/3
x_deapk(n)=s_apsk(9);
elseif q_apk(n)<=6*pi/6&q_apk(n)>5*pi/6
x_deapk(n)=s_apsk(10);
elseif q_apk(n)<=-5*pi/6&q_apk(n)>-pi
x_deapk(n)=s_apsk(11);
elseif q_apk(n)<=-2*pi/3&q_apk(n)>-5*pi/6
x_deapk(n)=s_apsk(12);
elseif q_apk(n)<=-pi/2&q_apk(n)>-2*pi/3
x_deapk(n)=s_apsk(13);
elseif q_apk(n)<=-pi/3&q_apk(n)>-pi/2
x_deapk(n)=s_apsk(14);
elseif q_apk(n)<=-pi/6&q_apk(n)>-pi/3
x_deapk(n)=s_apsk(15);
else x_deapk(n)=s_apsk(16);
end
end
end
%The symerr function compares binary representations of elements in x with those in y. The output number is a scalar or vector that indicates the number of elements that differ.
%误码率统计
[num,rt]=symerr(x_apsk,x_deapk);
p=num/N;