M=2; %M进制
N=30000; %定义了随机生成序列的长度
P=1; %P是当只有源节点给目的节点传输数据时的功率
P1=P/2;
P2=P1; %P1是源节点发送给中继节点和目的节点的功率,P2是中继节点发送给目的节点的功率
SNRmin=0;
SNRmax=10;
interval=0.4; %给出了加入的噪声的信噪比范围
time_max=1; %为了使结果的准确性提高,总共运行多次求平均值
for time=1:time_max
BER_SD =0;
BER_AF= 0;
BER_AF1= 0;
BER_AF2= 0;
BER_AF3= 0; %用来记录每次的误码率
SD=normrnd(0,1,1,100)+j*normrnd(0,1,1,100);
[H_SD,I]=max(abs(SD));
H_sd=SD(I); %给出一个信道状态良好的SD信道
SR=normrnd(0,1,1,20)+j*normrnd(0,1,1,20);
[H_SR,I]=max(abs(SR));
H_sr=SR(I); %给出一个信道状态良好的SR信道
RD=normrnd(0,1,1,20)+j*normrnd(0,1,1,20);
[H_RD,I]=max(abs(RD));
H_rd=SR(I); %给出一个信道状态良好的RD信道
%以上的H都是均值为零,标准差为1的复高斯随机变量
mu=0; %均值为零
sigma=1; %标准差为1
line=1;
column=100; %中继节点的个数
A=normrnd(mu,sigma,line,column)+j*normrnd(mu,sigma,line,column);
B=normrnd(mu,sigma,line,column)+j*normrnd(mu,sigma,line,column); %为所有的中继节点生成两个信道参数
disp('A=');disp(A);
disp('B=');disp(B); %输出随机生成的A和B
[H_sr1,H_rd1,I]=RelaySelection1(A,B,column); %中继选择,选择方法一是我设计的中继选择方法
[H_sr2,H_rd2,J]=RelaySelection2(A,B); %中继选择,选择方法二是其他的选择方案
[H_sr3,H_rd3,J1]=RelaySelection3(A,B,column); %中继选择,选择方法三是其他的选择方案
x=randint(1,N,M); %产生一个M进制的N位随机码元序列
x_mod=modulate(modem.pskmod(M),x); %bpsk调制
i=0;
for SNR=SNRmin:interval:SNRmax %此处的信噪比是SNR=P/N0,即加入的高斯白噪声的信噪比
i = i+1;
errornum_SD = 0;
errornum_AF = 0;
errornum_AF1 = 0;
errornum_AF2 = 0;
errornum_AF3 = 0;
%设初始的误比特数都为0,用来统计传输完成后的总的误比特数
i_max=10;
for tries=0:i_max %用同一个中继节点发送十次求误码率的平均值,可使结果更加准确
sig = 10^(SNR/10);
Pn=P1/sig;
y_sd = awgn( sqrt(P)*H_sd * x_mod, SNR, 'measured'); %只有目的节点传输的情况下目的节点接收源节点发送的信息
y_sd1 = awgn( sqrt(P1)*H_sd * x_mod, SNR, 'measured'); %目的节点与中继节点协作的情况下目的节点接收到的来自源节点的信息
y_sr = awgn( sqrt(P1)*H_sr * x_mod, SNR, 'measured');
y_sr1 = awgn( sqrt(P1)*H_sr1 * x_mod, SNR, 'measured');
y_sr2 = awgn( sqrt(P1)*H_sr2 * x_mod, SNR, 'measured');
y_sr3 = awgn( sqrt(P1)*H_sr3 * x_mod, SNR, 'measured'); %中继节点接收源节点发送的信息
%对传输信号加入信噪比为SNR的高斯白噪声
y_SD = demodulate(modem.pskdemod(M),H_sd'*y_sd); %目的节点对没有中继协作情况下的源节点发送的信息进行解调
errornum_SD = errornum_SD + ActualBER(x,y_SD); %没有中继节点协作的误码比特数
[B,x_AF] = AF(H_sr,P1,Pn,y_sr);
[B1,x_AF1] = AF(H_sr1,P1,Pn,y_sr1);
[B2,x_AF2] = AF(H_sr2,P1,Pn,y_sr2);
[B3,x_AF3] = AF(H_sr3,P1,Pn,y_sr3); %中继节点对从源节点接收到的信息进行放大转发
y_rd = awgn( sqrt(P2)*H_rd * x_AF, SNR, 'measured');
y_rd1 = awgn( sqrt(P2)*H_rd1 * x_AF1, SNR, 'measured');
y_rd2 = awgn( sqrt(P2)*H_rd2 * x_AF2, SNR, 'measured');
y_rd3 = awgn( sqrt(P2)*H_rd3 * x_AF3, SNR, 'measured'); %对从中继节点传输到目的节点的信息加入信噪比为SNR的高斯白噪声
y_combine_AF = MRC( H_sd,H_sr,H_rd,B,P1,Pn,P1,Pn,y_sd1,y_rd);
y_combine_AF1 = MRC( H_sd,H_sr1,H_rd1,B1,P1,Pn,P1,Pn,y_sd1,y_rd1);
y_combine_AF2 = MRC( H_sd,H_sr2,H_rd2,B2,P1,Pn,P1,Pn,y_sd1,y_rd2);
y_combine_AF3 = MRC( H_sd,H_sr3,H_rd3,B3,P1,Pn,P1,Pn,y_sd1,y_rd3); %目的节点对接收到的两个信息进行最大比合并
y_AF = demodulate(modem.pskdemod(M),y_combine_AF);
y_AF1 = demodulate(modem.pskdemod(M),y_combine_AF1);
y_AF2 = demodulate(modem.pskdemod(M),y_combine_AF2);
y_AF3 = demodulate(modem.pskdemod(M),y_combine_AF3); %目的节点对接收到的信息进行解调
errornum_AF = errornum_AF + ActualBER(x,y_AF);
errornum_AF1 = errornum_AF1 + ActualBER(x,y_AF1);
errornum_AF2 = errornum_AF2 + ActualBER(x,y_AF2);
errornum_AF3 = errornum_AF3 + ActualBER(x,y_AF3); %使用中继协作传输的误比特数
end
ber_SD(i) = errornum_SD/(N*i_max); %直传路径的误码率
ber_AF(i)= errornum_AF/(N*i_max);
ber_AF1(i)= errornum_AF1/(N*i_max);
ber_AF2(i)= errornum_AF2/(N*i_max);
ber_AF3(i)= errornum_AF3/(N*i_max); %中继节点用DF协议进行数据转发的误码率
SNR_sd=(P1*(abs(H_sd))^2)/Pn;
SNR_rd1=((P1^2)*((abs(H_sr1))^2)*((abs(H_rd1))^2))/((P1*(abs(H_sr1))^2+P1*(abs(H_rd1))^2+Pn)*Pn);
SNR_rd2=((P1^2)*((abs(H_sr2))^2)*((abs(H_rd2))^2))/((P1*(abs(H_sr2))^2+P1*(abs(H_rd2))^2+Pn)*Pn);
SNR_rd3=((P1^2)*((abs(H_sr3))^2)*((abs(H_rd3))^2))/((P1*(abs(H_sr3))^2+P1*(abs(H_rd3))^2+Pn)*Pn);
SNR1=SNR_sd+SNR_rd1;
SNR2=SNR_sd+SNR_rd2;
SNR3=SNR_sd+SNR_rd3;
BER1(i)=1/(2*sqrt(pi*SNR1)*exp(SNR1));
BER2(i)=1/(2*sqrt(pi*SNR2)*exp(SNR2));
BER3(i)=1/(2*sqrt(pi*SNR3)*exp(SNR3)); %计算理论误码率
end
disp('I=');disp(I); %输出我们选择的是第几个中继节点
disp('J=');disp(J);
disp('J1=');disp(J1);
BER_SD=BER_SD+ber_SD;
BER_AF=BER_AF+ber_AF;
BER_AF1=BER_AF1+ber_AF1;
BER_AF2=BER_AF2+ber_AF2;
BER_AF3=BER_AF3+ber_AF3;
end
aveber_SD=BER_SD/time_max;
aveber_AF=BER_AF/time_max;
aveber_AF1=BER_AF1/time_max;
aveber_AF2=BER_AF2/time_max;
aveber_AF3=BER_AF3/time_max; %计算多次误码率的平均值
SNR=SNRmin:interval:SNRmax;
%以下是作图
figure(1)
semilogy(SNR,aveber_SD,'r-o',SNR,aveber_AF,'b-*');
legend('SD','AF');
grid on; %图一是有无中继节点误码率的比较
ylabel('平均误码率');
xlabel('SNR(dB)');
title('直传和AF中继传输的实际传输误码率');
axis([0,12,10^(-5),1]);
figure(2)
semilogy(SNR,aveber_AF1,'b-*',SNR,aveber_AF2,'g-+',SNR,aveber_AF3,'m-x');
legend('AF1','AF2','AF3');
grid on;
ylabel('平均误码率'); %图二是根据我所设定的中继选择原则选出的最优中继节点与其他中继节点参与协作传输的误码率比较
xlabel('SNR(dB)');
title('三种中继选择方案的实际传输误码率');
axis([0,12,10^(-5),1]);
figure(3)
semilogy(SNR,aveber_SD,'r-o',SNR,aveber_AF1,'b-*',SNR,aveber_AF2,'g-+');
legend('SD','AF1','AF2');
grid on;
ylabel('平均误码率'); %图三是无中继节点、最优中继节点、其他中继节点的误码率比较
xlabel('SNR(dB)');
title('直传与AF1和AF2的实际传输误码率');
axis([0,12,10^(-5),1]);
figure(4)
semilogy(SNR,aveber_SD,'r-o',SNR,aveber_AF1,'b-*',SNR,aveber_AF3,'m-x');
legend('SD','AF1','AF3');
grid on;
ylabel('平均误码率'); %图四是无中继节点、最优中继节点、其他中继节点的误码率比较
xlabel('SNR(dB)');
title('直传与AF1和AF3的实际传输误码率');
axis([0,12,10^(-5),1]);
figure(5)
semilogy(SNR,BER1,'b-*',SNR,BER2,'g-+',SNR,BER3,'m-x');
legend('AF1','AF2','AF3');
grid on;
ylabel('平均误码率'); %图四是两种选择方案的理论误码率的比较
xlabel('SNR(dB)');
title('三种选择方案的理论误码率');
axis([0,12,10^(-10),1]);
评论3