一、简介
协作通信的核心问题是中继节点的协作协议。有两种最基本的中继协作方式放大转发(AF)与解码重传(DF),其它各种协作协议的研究,几乎均是建立在这两个固定中继协议之上。本文通过MATLAB仿真,来验证协作对通信的改善,分析不同信道情况和不同信噪比下的AF与DF的误码率和分集增益,来研究二者的实际性能与所面临的主要问题。
二、源代码
%multi-hop ,主程序
tic
% --------------
% Set Parameters
nr_of_iterations = 1000;
SNR = [-10:1:10];
use_direct_link = 1;
use_relay = 1;
global statistic;
statistic = generate_statistic_structure;
global signal;
signal = generate_signal_structure;
signal(1).nr_of_bits = 2^10;
signal.modulation_type = 'BPSK';% ’BPSK’, ’QPSK’
calculate_signal_parameter;
channel = generate_channel_structure;
channel(1).attenuation(1).pattern = 'Rayleigh';% ’no’,’Rayleigh’
channel(1).attenuation(1).block_length = 1;
channel(2) = channel(1);
channel(3) = channel(1);
channel(4) = channel(1);
channel(5) = channel(1);
channel(6) = channel(1);
channel(7) = channel(1);
channel(8) = channel(1);
channel(9) = channel(1);
channel(10) = channel(1);
channel(11) = channel(1);
channel(12) = channel(1);
rx = generate_rx_structure;
rx(1).combining_type = 'ERC'; %’ERC’,’FRC’,’SNRC’,’ESNRC’,’MRC’
rx(1).sd_weight = 3; % used for 'FRC'
global relay;
relay = generate_relay_structure;
relay(1).mode = 'DAF'; %’AAF’, ’DAF’
relay.magic_genie = 0;
relay(1).rx(1) = rx(1); % same beahaviour
channel(1).attenuation.distance = 1;
channel(2).attenuation.distance = 0.5;
channel(3).attenuation.distance = 0.5;
% ----------------
% Start Simulation
BER = zeros(size(SNR));
for iSNR = 1:size(SNR,2)% returns the size of the dimension of SNR specified by scalar 2
disp(['progress: ',int2str(iSNR),'/',int2str(size(SNR,2))]) % Convert integer to string
%%%%%%%%%%%%%%%%%%%%%%
channel(1).noise(1).SNR = SNR(iSNR); % iSNR ??????
channel(2).noise(1).SNR = SNR(iSNR);
channel(3).noise(1).SNR = SNR(iSNR);
for it = 1:nr_of_iterations;
% --------------
% Reset receiver
rx = rx_reset(rx);
relay.rx = rx_reset(relay.rx);
% -----------
% Direct link
if (use_direct_link == 1)
[channel(1), rx] = add_channel_effect(channel(1), rx,...
signal.symbol_sequence);
rx = rx_correct_phaseshift(rx, channel(1).attenuation.phi);
end
% ------------中继传输 ---------------
if (use_relay == 1) % 采用中继协作
% ----------只有1个中继 ---------
% Sender to relay
[channel(2), relay.rx] = add_channel_effect(channel(2),relay.rx, signal.symbol_sequence);
relay = prepare_relay2send(relay,channel(2));
% Relay to destination
[channel(3), rx] = add_channel_effect(channel(3), rx,relay.signal2send);
% [received_symbol,signal.received_bit_sequence]=rx_combine(rx,channel,use_relay);
switch relay.mode
% Correct phaseshift
case 'AAF'
rx = rx_correct_phaseshift(rx,...
channel(3).attenuation.phi + channel(2).attenuation.phi);
case 'DAF'
rx = rx_correct_phaseshift(rx,channel(3).attenuation.phi);
end
end
% Receiver
[received_symbol, signal.received_bit_sequence] = rx_combine(rx, channel(1),channel(3), use_relay);
BER(iSNR) = BER(iSNR) + sum(not(signal.received_bit_sequence == signal.bit_sequence));
if (BER(iSNR) > 10000)
% Stop iterate
break;
end
end % Iteration
if (BER(iSNR)<100)
warning(['Result might not be precise when SNR equal ',num2str(SNR(iSNR))])
end
BER(iSNR) = BER(iSNR) ./ it ./ signal.nr_of_bits;
end
% ---------------Present the result of the simulation---------------------
txt_distance = [' - distance: ',...
num2str(channel(1).attenuation.distance), ':',...
num2str(channel(2).attenuation.distance), ':',...
num2str(channel(3).attenuation.distance)];
%txt_distance='';
if (use_relay == 1)
if (relay.magic_genie == 1)
txt_genie = ' - Magic Genie';
else
txt_genie = '';
end
txt_combining = [' - combining: ', rx(1).combining_type];
switch rx(1).combining_type
case 'FRC'
txt_combining = [txt_combining, ' ',...
num2str(rx(1).sd_weight),':1'];% Convert number to string
end
add2statistic(SNR,BER,[signal.modulation_type, '-',relay.mode, txt_combining,',','two-hop'])
else
switch channel(1).attenuation.pattern
case 'no'
txt_fading = ' - no fading';
otherwise
txt_fading = ' - Rayleigh fading';
end
add2statistic(SNR,BER,[signal.modulation_type, '-',relay.mode, txt_combining,',','two-hop'])
end
%---------------多跳仿真-----------%
channel(1).attenuation.distance = 1;
channel(2).attenuation.distance = 1/3;
channel(3).attenuation.distance = 1/3;
channel(4).attenuation.distance = 1/3;
% ----------------
% Start Simulation
BER = zeros(size(SNR));
for iSNR = 1:size(SNR,2)% returns the size of the dimension of SNR specified by scalar 2
disp(['progress: ',int2str(iSNR),'/',int2str(size(SNR,2))]) % Convert integer to string
%%%%%%%%%%%%%%%%%%%%%%
channel(1).noise(1).SNR = SNR(iSNR); % iSNR ??????
channel(2).noise(1).SNR = SNR(iSNR);
channel(3).noise(1).SNR = SNR(iSNR);
channel(4).noise(1).SNR = SNR(iSNR);
for it = 1:nr_of_iterations;
% --------------
% Reset receiver
rx = rx_reset(rx);
relay.rx = rx_reset(relay.rx);
% -----------
% Direct link
if (use_direct_link == 1)
[channel(1), rx] = add_channel_effect(channel(1), rx,...
signal.symbol_sequence);
rx = rx_correct_phaseshift(rx, channel(1).attenuation.phi);
end
% ----中继传输-----%
if (use_relay == 1)
% Sender to relay
[channel(2), relay.rx] = add_channel_effect(channel(2),relay.rx, signal.symbol_sequence);
relay = prepare_relay2send(relay,channel(2));% ??this function
%relay1 to Relay2
[channel(3), relay.rx]=add_channel_effect(channel(3),relay.rx, relay.signal2send);
relay=prepare_relay2send(relay,channel(3));
%relay2 to destination
[channel(4),rx]=add_channel_effect(channel(4),rx,relay.signal2send);
switch relay.mode
% Correct phaseshift
case 'AAF'
rx = rx_correct_phaseshift(rx,...
channel(2).attenuation.phi + channel(3).attenuation.phi+ channel(4).attenuation.phi);
case 'DAF'
rx = rx_correct_phaseshift(rx,channel(4).attenuation.phi);
end
end
% Receiver
[received_symbol, signal.received_bit_sequence] = rx_combine(rx, channel(1),channel(4), use_relay);
BER(iSNR) = BER(iSNR) + sum(not(signal.received_bit_sequence == signal.bit_sequence));
if (BER(iSNR) > 10000)
% Stop iterate
break;
end
end % Iteration
if (BER(iSNR)<100)
warning(['Result might not be precise when SNR equal ',...
num2str(SNR(iSNR))])
end
BER(iSNR) = BER(iSNR) ./ it ./ signal.nr_of_bits;
end
% ---------------Present the result of the simulation---------------------
txt_distance = [' - distance: ',...
num2str(channel(2).attenuation.distance), ':',...
num2str(channel(3).attenuation.distance), ':',...
num2str(channel(4).attenuation.distance)];
%txt_distance='';
if (use_relay == 1)
if (relay.magic_genie == 1)
txt_genie = ' - Magic Genie';
else
txt_genie = '';
end
txt_combining = [' - combining: ', rx(1).combining_type];
三、运行结果
四、备注
2014a
完整代码或代写加1564658423