ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

【现代通信】基于matlab协作通信仿真【含Matlab源码 1006期】

2021-06-18 21:06:06  阅读:162  来源: 互联网

标签:relay signal rx 通信 源码 SNR matlab iSNR channel


一、简介

协作通信的核心问题是中继节点的协作协议。有两种最基本的中继协作方式放大转发(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

标签:relay,signal,rx,通信,源码,SNR,matlab,iSNR,channel
来源: https://www.cnblogs.com/homeofmatlab/p/14901125.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有