協做通訊的核心問題是中繼節點的協做協議。有兩種最基本的中繼協做方式放大轉發(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