我是靠谱客的博主 大胆鞋垫,最近开发中收集的这篇文章主要介绍matlab中仿真丢包,使用MATLAB进行误比特率(BER)仿真----转载,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

原作者:James E. Gilley

译者:H. X. Xia

1.

引言

由于Matlab

具有简单的描述语言和优秀的数据图形化能力,MATLAB成为进行数字通信系统仿真的理想工具。在数字通信领域进行的最多的仿真任务是进行调制解调器的误比特率测试。在相同的条件下进行比较的话,接收器的误比特率性能是一个十分重要的指标。用MATLAB进行误比特率测试是非常简单的,但仍然需要一些必备知识。

2.

取样信号的性质

在MATLAB中,我们用数字序列或采样值(一般以向量或序列的方式存放)来表示时域连续信号。执行误比特率仿真之前,我们必须精确的理解这些取样值的含义。我们必须了解这些取样值代表了原始信号的哪些方面。我们也必须知道连续取样值之间的时间间隔是多少。

对于通信仿真而言,取样信号的数值往往代表了时域连续信号在某个时刻的幅度。可以假设这些幅度值是电压的测量值,虽然它可能相对于实际的测量量而言过于简单了一些。

相邻采样点之间的时间间隔通常定义为Ts,它描述了时域连续信号的采样频度。相对应地,我们通常定义采样频率为fs,它是Ts的倒数。

为方便起见,我们通常将采样值1定义为物理上的1伏特,此外,我们也假设电阻的取样值1表示一个欧姆。这样可以免去写电阻的符号的麻烦。在以后的仿真中,我们用一个采样值序列来表示一个时域连续信号,其数值以伏特为单位,对应电阻值则为1欧姆。一般而言,采样频率为8KHz,但也有一些其他的常用采样频率,所以需要首先确定采样频率。

2.1信号的功率

设有一信号x(n),其中n是抽样值的序号,可以定义该信号的瞬时功率为

a4c26d1e5885305701be709a3d33442f.png

也即是说,瞬时功率是取样值的平方。因为取样值的单位是伏特,所以功率的单位是瓦特。

一个更有用的量是平均功率,指的是所有抽样值瞬时功率的平均值,对于信号x(n),如果有N个抽样值,则:

a4c26d1e5885305701be709a3d33442f.png

(1)

注意到这只是所有信号取样值的平方和被采样数N除,用MATLAB计算该值的一个途径为:

pav= sum(x.^2)/length(x).

如果信号是零均值或没有直流分量,我们会发现信号的平均功率可以通过方差求得:

a4c26d1e5885305701be709a3d33442f.png

该式表明:信号的方差是其平方的均值减去其均值的平方。如果信号的均值为0,则方差恰好就是信号的平均功率。因此,如果信号是0均值的,则可以通过找到方差来计算它的平均功率。

但一定要注意前提条件,就是均值一定要是0,否则就只能用(1)式来计算,它适用于任何情形。

2.2信号的能量

按定义,功率是能量对时间的微分,同样地,能量是功率对时间的积分。对于采样信号,积分退化为求和。

既然能量是时间和功率的乘积,总能量应该是信号的平均功率和信号持续时间的乘积。此外,信号的持续时间应该是采样值的长度,被采样频率除,得到每秒采样点的数量。因此:

a4c26d1e5885305701be709a3d33442f.png

(2)

用MATLAB求信号X的总能量,且采样频率为fs,命令为:

et=sum(x.∧2)/fs

3仿真概述

误比特率测试需要一个发送器,一个接收器和一条信道。首先需要产生一个长的随机比特序列作为发送器的输入。发送器将这些比特调制成某种形式的数字信号,以便传到仿真信道。我们在传输信道上加上一定的可控制的噪声。这些噪声信号会变成接收器的输入。接收器解调信号,产生恢复比特序列。最后比较接收到的比特和传送的比特,计算错误。

误比特率性能通常被描述成二维图像。纵坐标是归一化的信噪比,一般写为a4c26d1e5885305701be709a3d33442f.png:每个比特的能量除以噪声的单边功率谱密度,单位为分贝。横坐标是误比特率,没有量纲,通常表示成10的整数次幂。

为了创建误比特率-信噪比图像,我们需要一系列的点,这些点是在不同SNR前提下运行仿真所获得的。下面的步骤将介绍如何获得特定SNR下的BER。

4仿真过程

4.1运行发送器

第一步是通过发送器将伪随机序列变成数字化的调制信号。一旦我们产生了这些信号x(n),就需要对他们进行量化。

4.2设定信噪比

信噪比a4c26d1e5885305701be709a3d33442f.png通常是以分贝(dB)为单位,但在进一步的计算之前必须要将分贝单位转换成一般单位。假设SNR为m dB,则a4c26d1e5885305701be709a3d33442f.png

用MATLAB,假SNR单位是分贝,记为’snrdb’则

ebn0=10^(snrdb/10).

注意a4c26d1e5885305701be709a3d33442f.png是无量纲的。

4.3确定Eb

每比特能量是指信号总能量除以信号中包含的比特数。我们也可以将每比特能量表述为信号的平均功率和一个比特持续时间的乘积。所以Eb可表达为:

a4c26d1e5885305701be709a3d33442f.png

这里N是信号采样的总数量,fbit是比特率,单位是比特每秒。

使用MATLAB,计算eb如下:

eb=sum(x.^2)/(length(x)*fb)

因为信号x(n)的单位是伏特,所以Eb的单位是焦耳。

4.4计算N0

如果SNR和Eb已经算出,就可以计算N0(N0本身是单边白噪声功率谱密度,而“双边”的密度总是“单边”的一半)了。我们需要做的就是将Eb除以SNR,假设我们已经将它从分贝转换成了比值。

n0=eb/ebn0

噪声功率谱密度的单位是瓦特每赫兹。

4.5计算a4c26d1e5885305701be709a3d33442f.png

单边功率谱密度告诉我们信号每Hz带宽内噪声功率有多大。为了找到噪声的方差或者是平均功率,必须知道噪声的带宽。

对于一个以fsHz采样的实信号x(n),噪声带宽是采样频率的一半,因此,我们可以将单边噪声功率谱密度和噪声带宽相乘得到噪声的平均功率:

a4c26d1e5885305701be709a3d33442f.png

这里a4c26d1e5885305701be709a3d33442f.png是噪声的方差,单位是w,N0是噪声单边功率谱密度,单位是W/Hz。

使用MATLAB

,若pn表示噪声的平均功率,则

pn=no*fs/2

单位是瓦特。

4.6

产生噪声

尽管MATLAB的通信工具箱里有产生加性高斯白噪声的函数,我们仍然打算用内置的标准函数产生AWGN。因为噪声具有零均值,所以其功率和方差相等。我们要产生一个和信号长度相同的噪声向量,且该向量的方差是a4c26d1e5885305701be709a3d33442f.png瓦。

MATLAB函数'randn'可产生一个正态分布的零均值方差为1的随机序列,必须修正这个值才能使结果具有要求的方差a4c26d1e5885305701be709a3d33442f.png,我们可以用如下方法产生噪声向量’n’:

N=sqrt(pn)*randn(1,length(x))

和信号序列一样,这个噪声序列的单位也是伏特。

4.7加上噪声

通过将噪声序列加在原信号序列上来获得有噪信号。如果进行定点仿真的话,我们必须将结果误差限制在相应的最大绝对值之内,比如将幅度值限制在a4c26d1e5885305701be709a3d33442f.png这个误差范围内。如果进行浮点仿真的话,只需进行下面的计算就可以了:

y=x+n

4.8运行接收器

当产生了有噪信号序列之后,我们可以用接收器来解调这个信号。接收器将生成解调比特序列,这些序列将与传输序列进行比较,来确定解调比特中有多少错误的比特。

4.9确定时间延迟

由于接收器中大都含有滤波器和其他一些有延时操作的单元,接收比特和传输比特之间必然有时间上的偏移,在比较这两个序列之前,必须知道这个偏移量有多大。其中一个方法是对这两个序列进行相关运算,然后寻找最大相关值。

假设传输比特存放于向量’tx’,我们的接收比特存放于向量’rx’,接收向量显然包含比传输向量更多的比特,因为接收器会在填充期和消退期产生一些毫无意义的输出值。设发送比特向量的长度为l­tx,且接收比特向量的长度为lrx,那么可能的偏移量范围会是[0,lrx-ltx-1]。我们可以对这两个向量进行局部互相关运算来找到这个偏移值。

使用MATLAB,可以如下的循环实现部分互相关运算,

for lag=1:length(rx)-length(tx)-1,

cor(lag)=tx*rx(lag:length(tx)-1+lag)’;

end.

‘cor’向量的结果是发送向量和接收向量的偏互相关,可能的范围是从0:lrx-ltx-1。

我们必须找到cor中的最大值,也就是两个向量之间的时间偏移。因为MATLAB中用1:N-1来表示常见的序列0:N-1,所以需要从最大互相关系数的序号中减去1:

off=find(cor==max(cor))-1.

4.10产生误差向量

求得发送比特向量和接收比特向量的时间偏移之后,就可以计算错误比特了。在出现错误的时刻,他们的差值将是±1,如果没有错误,则这个差值应该为0.

使用MATLAB来计算误差向量’err’,

err=tx-rx(off+1:length(tx)+off);

4.11

统计错误比特

误差向量’err’中每个非零元素对应着一个错误比特。统计所有非零元素的个数就能得到仿真中出现错误比特的数量。

使用MATLAB,

te=sum(abs(err)).

4.12计算误比特率

每运行一次误比特率仿真,就需要传输和接收固定数量的比特,然后确定有接收到的比特中有多少是错误的,接下来就用错误比特数除以总传输比特数得到误比特率。使用MATLAB,计算bit-error-rate(ber)如下:

ber=te/length(tx),

这里’te’是总的错误比特数量,’tx’是发送的比特向量。

5

仿真结果

执行一次误比特率仿真会是一个漫长的过程。我们需要在每个有意义的SNR处运行一次仿真,并且要确保所有的结果在统计上是有意义的。

5.1

统计有效性

当误比特率很高,意味着很多比特发生了错误,最坏的情形是误比特率达到50%,那么这个调制解调系统基本上没有任何实际意义了。常用的通信系统误比特率比这个值要低好几个数量级,甚至是1%的误比特率都已经相当高了。

我们通常要画出ber-SNR曲线,其中包含了足够多的点,跨越了一个较大的误比特率范围。在信噪比(SNR)较高的时候,仿真可能变得比较困难,因为误比特率会变得非常小,比如,10-6的误比特率,意味着每百万个比特中仅仅一个发生错误。如果测试仅仅包含了1000个比特,可能我们绝大多数情况下都看不到任何错误。

为了使仿真结果具有统计意义,每次仿真必须产生一定数量的错误比特。如果仿真没有产生错误,这并不意味着误比特率为0;它只能表明发送信号中的比特数量不是足够多。作为一条经验法则,在每次仿真中,我们需要100个以上的错误比特,这样才能说明仿真得到的误比特率在统计上是有效的。在较高的SNR处,可能需要测试的信号含有几百万甚至几十亿个比特。

5.2画图

当我们在所有感兴趣的SNR上执行了足够多的仿真并获得了有效的结果,就可以将结果画出来。坐标轴X轴将包含SNR的值,Y轴包含了误比特率的值,Y轴必须以对数为刻度,X轴应该是线性刻度。

假设SNR的值用向量’xx’表示,相对应的误比特率用向量’yy’表示,用MATLAB画图如下:

semilogy(xx,yy,’0’).

图一所示为某一次误比特率仿真的结果。

a4c26d1e5885305701be709a3d33442f.png

进一步的学习,可以参考《通信系统仿真原理与无线应用》(肖明波等译,机械工业出版社)。

最后

以上就是大胆鞋垫为你收集整理的matlab中仿真丢包,使用MATLAB进行误比特率(BER)仿真----转载的全部内容,希望文章能够帮你解决matlab中仿真丢包,使用MATLAB进行误比特率(BER)仿真----转载所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(61)

评论列表共有 0 条评论

立即
投稿
返回
顶部