第15章 离散信道模型 MATLAB 仿真笔记

本篇文章是《通信系统仿真原理与无线应用》这本书的学习笔记,仅作个人学习使用。

对于有记忆信道,最常用的模型是离散时间的有限状态马尔可夫模型。马尔可夫模型得到广泛应用有几方面的原因。

这类模型易干分析处理,在统计方面的文献中已建立了完备的理论,并且它们已经被成功地应用千解决各种类型的重要通信问题。马尔可夫模型一直被用来建立英文文本之类的离散信源模型,(在一段典型的英文文章中,出现的一列英语字母可以用一个马尔可夫序列来建模)。

15.3.1 两状态模型

在这里插入图片描述

为了准备讨论马尔可夫通道模型,先来考虑一个衰落信道。在这个衰落信道中,有一部分时间内,接收信号的强度在可接受的性能阖值之上,而在深度衰落时会处千阖值之下。如果我们只对“在阖值之上”还是“在阖值之下” 的情况感兴趣,那么我们可以将信道建模为处千如图15-5所示的两个状态之一。在图15-5 中,有一个好状态 g g g, 其系统性能为可接受的状态( P E < 1 0 − 3 P_{E}<10^{-3} PE<103 ),另一个是坏状态 b b b , 其接收信号很弱,以至千差错概率高得不可接受(即 P E > 1 0 − 3 P_{E}>10^{-3} PE>103)。

因此,在如图15-5所示的简单两状态模型中,状态可用如下集合表示

S = { g , b } (5) S=\{g , b\}\tag5 S={g,b}(5)

随着时间的推进,信道可能会从好状态转移到坏状态的, 也可能从坏状态转移到好状态, 转移的速率和在某一个状态的驻留时间都将取决于衰落过程的时间相关性。

S t + 1 S_{t+1} St+1 S t S_t St ,分别表示信道在时刻 t+1 和时刻 t 时的状态。( 注意 t + 1 表示比 t 大一个时间增量的时刻,而不是比 t 大 1s 的时刻,所以 t 可看作离散时间序数。)使用这个记号,我们定义四个转移概率为

a g g ( t ) = Pr ⁡ { S t + 1 = g ∣ S t = g } a g b ( t ) = Pr ⁡ { S t + 1 = b ∣ S t = g } a b g ( t ) = Pr ⁡ { S t + 1 = g ∣ S t = b } a b b ( t ) = Pr ⁡ { S t + 1 = b ∣ S t = b } \begin{array}{c} a_{g g}(t)=\operatorname{Pr}\left\{S_{t+1}=g \mid S_{t}=g\right\} \\ a_{g b}(t)=\operatorname{Pr}\left\{S_{t+1}=b \mid S_{t}=g\right\} \\ a_{b g}(t)=\operatorname{Pr}\left\{S_{t+1}=g \mid S_{t}=b\right\} \\ a_{b b}(t)=\operatorname{Pr}\left\{S_{t+1}=b \mid S_{t}=b\right\} \end{array} agg(t)=Pr{St+1=gSt=g}agb(t)=Pr{St+1=bSt=g}abg(t)=Pr{St+1=gSt=b}abb(t)=Pr{St+1=bSt=b}

这些转移概率可以用如下状态转移矩阵表示

A ( t ) = [ a g g ( t ) a g b ( t ) a b g ( t ) a b b ( t ) ] A(t)=\left[\begin{array}{ll} a_{g g}(t) & a_{g b}(t) \\ a_{b g}(t) & a_{b b}(t) \end{array}\right] A(t)=[agg(t)abg(t)agb(t)abb(t)]

注意,由千我们考虑的是两状态模型,给定状态 S t = g S_{t}=g St=g 必定有 S t + 1 = g S_{t+1}=g St+1=g (信道保持在好状态)或 S t + 1 = b S_{t+1}=b St+1=b(信道转移到坏状态),因此,状态转移矩阵每一行的和都必为1 。两状态模型的状态转移图如图15-6所示。

在这里插入图片描述
在下面的部分,我们将假定信道模型是静态的,因此状态转移矩阵 A ( t ) A(t) A(t) 是固定的,即 A ( t ) = A A(t) =A A(t)=A。然而, 如果仿真运行中初始状态概率分布 Π 0 \Pi_{0} Π0 不同于稳态分布,那就需要一段时间来使概率分布演化到稳态值 Π s s \Pi_{ss} Πss。我们关心的是模型处于给定状态下的概率,定义 Π t \Pi_{t} Πt,为 t t t 时刻的状态概率分布,具体而言,有
Π t = [ π t , g π t , b ] \Pi_{t}=\left[\begin{array}{ll} \pi_{t, g} & \pi_{t, b} \end{array}\right] Πt=[πt,gπt,b]

式中, π t , g \pi_{t, g} πt,g π t , b \pi_{t, b} πt,b 分别表示在 t t t 时刻信道处于好状态或坏状态的概率。通过定义状态转移矩阵,在时刻 t + 1 t+ 1 t+1 的状态分布为
Π t + 1 = Π t A (9) \Pi_{t+1}=\Pi_{t} A\tag9 Πt+1=ΠtA(9)

类似地,在时刻 t + 2 t + 2 t+2 时的状态分布是

Π t + 2 = Π t + 1 A = ( Π t A ) A = Π t A 2 \Pi_{t+2}=\Pi_{t+1} A=\left(\Pi_{t} A\right) A=\Pi_{t} A^{2} Πt+2=Πt+1A=(ΠtA)A=ΠtA2

因此, 一般地有

Π t + k = Π t A k (11) \Pi_{t+k}=\Pi_{t} A^{k}\tag{11} Πt+k=ΠtAk(11)

式中, A k A^k Ak 代表 k k k 步转移矩阵。

大多数情况下(但不是所有情况下),随时间的推进,马尔可夫过程都会演化到一个稳态概率分布。假定对干足够大的时间 t t t 和任意的 k k k, 马尔可夫过程收敛到一个稳态分布 Π t + k = Π t \Pi_{t+k}=\Pi_{t} Πt+k=Πt,则对任意 k k k, 有下式

Π s s = Π s s A k = [ π g π b ] (12) \Pi_{s s}=\Pi_{s s} A^{k}=\left[\begin{array}{ll} \pi_{g} & \pi_{b} \end{array}\right]\tag{12} Πss=ΠssAk=[πgπb](12)

例15-1 作为一个简单的例子,令
A = [ 0.98 0.02 0.05 0.95 ] A=\left[\begin{array}{ll} 0.98 & 0.02 \\ 0.05 & 0.95 \end{array}\right] A=[0.980.050.020.95]
初始状态分布为
Π 0 = [ 0.50 0.50 ] \Pi_{0}=\left[\begin{array}{ll} 0.50 & 0.50 \end{array}\right] Π0=[0.500.50]
下面的MATLAB程序说明了从 Π 0 \Pi_0 Π0 Π s s \Pi_{ss} Πss 的收敛过程:

% File: c15_MMtransient.m
% Software given here is to accompany the textbook: W.H. Tranter, 
% K.S. Shanmugan, T.S. Rappaport, and K.S. Kosbar, Principles of 
% Communication Systems Simulation with Wireless Applications, 
% Prentice Hall PTR, 2004.
%
N = 100;
pie = zeros(N,2);
A = [0.98 0.02; 0.05 0.95];
pie(1,:) = [0.50 0.50];
for k=2:N
   pie(k,:) = pie(k-1,:)*A;
end
kk = 1:N;
plot(kk,pie(:,1),'k-',kk,pie(:,2),'k:')
xlabel('Iteration')
ylabel('Probability')
text1 = ['The steady-state probabilities are ',...
      num2str(pie(N,1)),' and ' ,num2str(pie(N,2)),'.'];
legend('State 1','State 2')
disp(text1)
disp(' ')
disp('The value of A^N is'); A^N
% End of script file.

执行程序得到如下结果

>> c15_MMtransient
The steady-state probabilities are 0.71412 and 0.28588.

The value of A^N is

ans =

0.7145    0.2855
0.7138    0.2862

上述代码较为简单,基本没有什么好解释的,唯一需要注意这里使用了矩阵pie存储马尔可夫模型的状态 [ π t , g π t , b ] \left[\begin{array}{ll} \pi_{t, g} & \pi_{t, b} \end{array}\right] [πt,gπt,b]。最后使用了语句plot(kk,pie(:,1),'k-',kk,pie(:,2),'k:')来绘制逐渐收敛的信道状态。

在这里插入图片描述

15.3.4 平稳性

因为在建模倌道模拟部分时一般会假定平稳性,因此在离散信道的马尔可夫模型中常常也假定平稳性。平稳性意味着信道模型的参数,即概率 Π t , i \Pi_{t,i} Πt,i a i j ( t ) a_{ij}(t) aij(t) b i ( e k ) b_i(e_k) bi(ek) 跟时间无关。在这种情况下,我们有

Pr ⁡ [ S t + 1 = i ] = Π i = ∑ k = 1 N Pr ⁡ [ S t = k ] Pr ⁡ [ S t + 1 = i ∣ S t = k ] = ∑ k = 1 N π k a k i , i = 1 , ⋯   , N \operatorname{Pr}\left[S_{t+1}=i\right]=\Pi_{i}=\sum_{k=1}^{N} \operatorname{Pr}\left[S_{t}=k\right] \operatorname{Pr}\left[S_{t+1}=i \mid S_{t}=k\right]=\sum_{k=1}^{N} \pi_{k} a_{k i}, \quad i=1, \cdots, N Pr[St+1=i]=Πi=k=1NPr[St=k]Pr[St+1=iSt=k]=k=1Nπkaki,i=1,,N
式中 a k i a_{ki} aki 是状态转移矩阵第 i i i 列的元素

A = [ a 11 a 12 ⋯ a 1 i ⋯ a 1 N a 21 a 22 ⋯ a 2 i ⋯ a 2 N ⋮ ⋮ ⋱ ⋮ ⋱ ⋮ a N 1 a N 2 ⋯ a N i ⋯ a N N ] A=\left[\begin{array}{cccccc} a_{11} & a_{12} & \cdots & a_{1 i} & \cdots & a_{1 N} \\ a_{21} & a_{22} & \cdots & a_{2 i} & \cdots & a_{2 N} \\ \vdots & \vdots & \ddots & \vdots & \ddots & \vdots \\ a_{N 1} & a_{N 2} & \cdots & a_{N i} & \cdots & a_{N N} \end{array}\right] A= a11a21aN1a12a22aN2a1ia2iaNia1Na2NaNN

Π k \Pi_{k} Πk 是状态概率分布向量的元素
Π = [ π 1 π 2 ⋯ π N ] \Pi=\left[\begin{array}{llll} \pi_{1} & \pi_{2} & \cdots & \pi_{N} \end{array}\right] Π=[π1π2πN]

跟两状态模型的情况一样, n 步转移矩阵由 A n A^n An 给出。正如例15-1 对两状态模型所作的阐述,式 (15-34) 及其约束

∑ i = 1 N π i = 1 \sum_{i=1}^{N} \pi_{i}=1 i=1Nπi=1

意味状态概率 π i \pi_{i} πi 可由转移概率 a i j a_{ij} aij 唯一确定。因此马尔可夫模型完全由状态转移概率矩阵 A A A B B B 确定,其中矩阵 B B B 是前面所讨论的输人-输出符号转移(即差错)概率:

B = [ b 11 ⋯ b 1 N ⋮ ⋱ ⋮ b M 1 ⋯ b M N ] \boldsymbol{B}=\left[\begin{array}{ccc} b_{11} & \cdots & b_{1 N} \\ \vdots & \ddots & \vdots \\ b_{M 1} & \cdots & b_{M N} \end{array}\right] B= b11bM1b1NbMN

15.3.5 马尔可夫模型仿真

一旦推导出了离散马尔可夫模型,对模型进行仿真就相对容易。

给定模型处在状态 k k k, 转移概率由状态转移矩阵 A A A 的第 k k k 行定义,矩阵 A A A 的第 k k k 行可用向量 A k A_k Ak
出,其中

A k = [ a k 1 a k 2 ⋯ a k i a k , i + 1 ⋯ a k N ] A_{k}=\left[\begin{array}{lllllll} a_{k 1} & a_{k 2} & \cdots & a_{k i} & a_{k, i+1} & \cdots & a_{k N} \end{array}\right] Ak=[ak1ak2akiak,i+1akN]

A k A_k Ak 的累积概率记作 β k \beta_k βk, 由下式给出

β k = ∑ j = 1 k a k j \beta_{k}=\sum_{j=1}^{k} a_{k j} βk=j=1kakj

注意, MATLAB 的库函数cumsum将向量 A k A_k Ak 映射到具有元素 β k \beta_k βk 的向量。定义从状态 k k k 转移到状
i i i 的概率为 a k i a_{k i} aki ,其值由下式给出:

a k i = β i − β i − 1 a_{k i}=\beta_{i}-\beta_{i-1} aki=βiβi1

这个概率如图15-8(a) 中的阴影面积所示。

在这里插入图片描述
在确定了新的状态之后,下一步是决定在新状态是否有差错发生。为了完成这项工作,我们将第二个随机变量 U 2 U_2 U2 与阈值 γ \gamma γ 比较,如图15-8(b) 所示。正确判决的概率是 P r { U 2 < γ } Pr\{ U_2<\gamma\} Pr{U2<γ} ,而错误判决的概率是 P r { U 2 > γ } Pr\{ U_2>\gamma\} Pr{U2>γ},如图15-8(b) 的阴影区域所示。由于当前状态是 i i i, γ \gamma γ 的值由状态观察矩阵 B B B 第 1 行第 i i i 列的元素 b 1 , i b_{1,i} b1,i 给出。

实现仿真过程的MATLAB代码如下:

%A是状态转移矩阵
u1=rand(1);
cum_sum=[0 cumsum(A(state,:))];
for i=i:total_states
    if u1>cum_sum(i)&u1<cum_sum(i+1);
        state=i;
    end
end

state_seq(t)=state;
%B是符号差错概率矩阵
u2=rand(1);
if u2>B(1,state)
    out(t)=1;
end

例15-3 在这个例子中, 产生长为 N = 20000 N=20 000 N=20000 的二进制序列来表示信道上的误码,用一个三状态马尔可夫模型来产生这个差错序列。如果序列中给定元素是二进制 ”1" ,则在给定元素对应的位置记录一个信道误码,二进制 “0” 则表示对应的位置没有发生差错。

我们假定三个状态中的任意一个都可能发生差错。我们具体地作以下假定:

Pr ⁡ { E ∣ S 1 } = 0.0010 Pr ⁡ { E ∣ S 2 } = 0.0500 Pr ⁡ { E ∣ S 3 } = 0.0100 \begin{array}{l} \operatorname{Pr}\left\{E \mid S_{1}\right\}=0.0010 \\ \operatorname{Pr}\left\{E \mid S_{2}\right\}=0.0500\\ \operatorname{Pr}\left\{E \mid S_{3}\right\}=0.0100 \end{array} Pr{ES1}=0.0010Pr{ES2}=0.0500Pr{ES3}=0.0100

它对应了差错概率矩阵,其中 B B B 的第 1 列即为状态 1

B = [ 0.9990 0.9500 0.9900 0.0010 0.0500 0.0100 ] B=\left[\begin{array}{lll} 0.9990 & 0.9500 & 0.9900 \\ 0.0010 & 0.0500 & 0.0100 \end{array}\right] B=[0.99900.00100.95000.05000.99000.0100]

假设马尔可夫模型的状态转移矩阵为
A = [ 0.80 0.10 0.10 0.20 0.60 0.20 0.02 0.08 0.90 ] A=\left[\begin{array}{lll} 0.80 & 0.10 & 0.10 \\ 0.20 & 0.60 & 0.20 \\ 0.02 & 0.08 & 0.90 \end{array}\right] A= 0.800.200.020.100.600.080.100.200.90

我们假设模型最初处千状态 1 。

% File: c15_errvector.m
% Software given here is to accompany the textbook: W.H. Tranter, 
% K.S. Shanmugan, T.S. Rappaport, and K.S. Kosbar, Principles of 
% Communication Systems Simulation with Wireless Applications, 
% Prentice Hall PTR, 2004.
%
disp(' ')
disp('Default values are:')
N = 20000											% default N			
A = [0.8 0.1 0.1; 0.2 0.6 0.2; 0.02 0.08 0.90]		% default A
B = [0.999 0.95 0.99; 0.001 0.05 0.01]				% default B
disp(' ')
disp('Accept default values?')
dtype = input('Enter y for yes or n for no  > ','s');
if dtype == 'n'
   N = input('   Enter N, the number of points to be generated > ');
   A = input('   Enter A, the state transition matrix > ');
   B = input('   Enter B, the error distribution matrx > ');
end
state = 1;							            % initial state
total_states = size(A,1);
out = zeros(1,N);					            % initialize error vector
state_seq = zeros(1,N);			                % initialize state sequence
h = waitbar(0,'Calculating Error Vector');
%

u2 = rand(1);	 					            % get random number
if u2>B(1,state)					            % test for error
   out(1) = 1;						            % record error
end
state_seq(1) = state;			                % record state
for t=2:N
   u1 = rand(1);					            % get random number
   cum_sum = [0 cumsum(A(state,:))];
   for i=1:total_states			                % loop to determine new state
      if u1>=cum_sum(i) & u1<cum_sum(i+1);
         state = i;				                % assign new state
      end
   end	
   state_seq(t) = state;		                % new record state
   u2 = rand(1);					            % get random number
   if u2>B(1,state)
      out(t) = 1;					            % record error
   end
   waitbar(t/N)
end
close(h)
% End of script file.

h = waitbar(0,'Calculating Error Vector');

生成一个进度条窗口,0 表示刚开始时候,进度条上显示英文 Calculating Error Vector

这行代码创建了一个进度条(progress bar),用于显示代码运行的进度。它的第一个参数是当前进度,这里是0,第二个参数是进度条显示的文本。在这里,文本是“Calculating Error Vector”。在代码中的循环中,通过调用 waitbar 函数并将当前进度作为参数传递给它来更新进度条的进度。当循环结束时,通过调用 close 函数关闭进度条。这样可以方便地显示代码的运行进度,并且用户可以随时中止程序的运行。

waitbar 函数中,第一个参数是一个标量,表示当前的进度百分比,取值范围是 0 到 1。在这里,初始值是 0,因为代码还没有开始运行。随着代码的执行,循环中的语句逐步执行,waitbar 函数也会被调用多次,每次更新进度条的进度。waitbar(t/N)在每次调用 waitbar 函数时,第一个参数都会更新为当前的进度百分比。最终,当代码执行完成后,进度条的进度会更新为 100%,close(h)。因此,0 的用法是为了初始化进度条,表示代码还没有开始执行,进度为 0。

附录 A 给出了用来产生差错序列的 MATLAB 程序c15_errvector.m 。程序产生两个输出,一个是差错向量 out,它给出了 N 个传输序列中的差错位置,另一个是状态序列向量 state_seq, 它给出了状态转移的细节。模型处千给定状态下的概率可以由状态序列向量计算出来,仿真差错概率可以从差错向量计算出来。


% File: c15_hmmtest.m
% Software given here is to accompany the textbook: W.H. Tranter, 
% K.S. Shanmugan, T.S. Rappaport, and K.S. Kosbar, Principles of 
% Communication Systems Simulation with Wireless Applications, 
% Prentice Hall PTR, 2004.
%
pe = sum(out)/N;%pe表示误码率
state_sum = zeros(1,total_states);
for k=1:N
   if state_seq(k)==1
      state_sum(1)=state_sum(1)+1;
   end   
   if state_seq(k)==2
      state_sum(2)=state_sum(2)+1;
   end
   if state_seq(k)==3
      state_sum(3)=state_sum(3)+1;
   end
end   
a = ['The probability of State 1 is ',num2str(state_sum(1)/N),'.'];
b = ['The probability of State 2 is ',num2str(state_sum(2)/N),'.'];
c = ['The probability of State 3 is ',num2str(state_sum(3)/N),'.'];
d = ['The error probability is ',num2str(pe),'.'];
disp('Simulation results:')
disp(a)			% display probability of state 1
disp(b)			% display probability of state 2
disp(c)			% display probability of state 3
disp(d)			% display error probability
% End script file.   

总结一下,c15_errvector.m 实现了对差错向量和状态序列向量的仿真,c15_hmmtest t.m 实现了对差错概率以及每种状态概率的计算,如图。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

No_one-_-2022

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值