协做通讯的核心问题是中继节点的协做协议。有两种最基本的中继协做方式放大转发(AF)与解码重传(DF),其它各类协做协议的研究,几乎均是创建在这两个固定中继协议之上。本文经过MATLAB仿真,来验证协做对通讯的改善,分析不一样信道状况和不一样信噪比下的AF与DF的误码率和分集增益,来研究两者的实际性能与所面临的主要问题。markdown
%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];
2014aide