2017-06-19 15:26:09 lynn_Kun 阅读数 14540
  • 第04章-计算机常用通信指标和术语

    本课程主要内容如下: 1 bit、Byte、KB、MB、GB、TB概念和换算关系 2 波特率、比特率、误码率的概念和意义 3 信道、基带信号、频带信号 4 频分多路复用、时分多路复用、异步传输、同步传输

    1705 人正在学习 去看看 深博

1、误比特率(BER:Bit Error Ratio):

在一定时间内收到的数字信号中发生差错的比特数与同一时间所收到的数字信号的总比特数之比,就叫做“比特误码率”,也可以叫做“误比特率”。

比特误码率(BER:Bit Error Ratio)是衡量数据在规定时间内数据传输精确性的指标。

2、误码率(SER:symbol error rate):

误码率=传输中的误码/所传输的总码数*100%。

3、一个很清晰的例子。

链接:https://www.zhihu.com/question/28878676/answer/42469932

来源:知乎

假设现在我一秒钟内传输了一个字符串“hello”:
(1)现在假设每个字母用8个二进制数(共2^8=256种)来表示,则根据1中的解释,此串数据的信息量为8bit*5个字母=40bit,比特率为40b/s。
码元即每个二进制数0或1,因此一共有40个码元。所以码元传输速率(波特率)为40baud/s
此时:波特率 和 比特率数值上相等
(2)但是现在我想用2个16进制数(共16^2=256种)来表示。对于同一串信息来说,其信息量是不变的,因此比特率任然是40bit/s。
此时的码元,是每个16进制数。因此一共有10个码元。所以码元传输速率(波特率)为10baud/s
此时:波特率 和 比特率 数值上不相等,但是比特率 = 波特率 * log2n。(公式2.2)此时的n=16,等式即为40 = 10 * log2(16), 显然成立。
(3)公式2.2仔细思考一下,发现:log2n其实就是1.(2)中的公式结果,即对应于一个n进制数来说,其信息量为log2n。因此公式2.2的物理意义可以理解为:对于传输同一串数据,无论你用什么进制来描述它,其本身的信息量是一定的。这也符合我们的常识。
4、解释误码率和误比特率一个很好的例子

链接:https://www.zhihu.com/question/28878676/answer/42469932

来源:知乎


2014-08-31 10:33:04 leegang12 阅读数 15219
  • 第04章-计算机常用通信指标和术语

    本课程主要内容如下: 1 bit、Byte、KB、MB、GB、TB概念和换算关系 2 波特率、比特率、误码率的概念和意义 3 信道、基带信号、频带信号 4 频分多路复用、时分多路复用、异步传输、同步传输

    1705 人正在学习 去看看 深博


1. BPSK,DBPSK,2ASK2FSKQPSK,OQPSKDQPSK16QAM64QAM,九种调制方式,理论误码率公式通过查看书本,用matlab画图,可以知道理论误码率。


2. 信噪比SNR: 0:0.1:20

    信道环境: AWGN

    仿真流程: 调制+ AWGN + 解调 + BER

    通过matlab仿真程序得出:BPSK,DBPSK,2ASK2FSKQPSK,OQPSK,

    DQPSK16QAM64QAM的实际误码率性能。


3. 通过matlab自带函数:berawgn 


4. 通过matlab自带绘图工具:bertool


<详细资料,及相应MATLAB代码,咨询qq:1279682290 >

 
2019-03-03 15:16:19 weixin_36843333 阅读数 3176
  • 第04章-计算机常用通信指标和术语

    本课程主要内容如下: 1 bit、Byte、KB、MB、GB、TB概念和换算关系 2 波特率、比特率、误码率的概念和意义 3 信道、基带信号、频带信号 4 频分多路复用、时分多路复用、异步传输、同步传输

    1705 人正在学习 去看看 深博

    在信道编码和误码课上,需要编一个bpsk的误码率的matlab程序,于是在参考了网上大神的代码之后,有了我现在这个版本。。。

    加了一些注释,会更好理解吧。以下正文。

  • 实验目的

探究在不同信噪比的环境下BPSK(Binary Phase Shift Keying)二进制相移键控系统的误码率的计算,以及与实际误码率之间的对比。

  • 实验过程
  1. 产生10^7个随机码,随机取+1,-1。

假设发送了10^7个bit的数据,我们把这些数据作为数据样本进行接下来的调制和解调,以及统计误码率等操作。

 

  1. 产生高斯白噪声,利用randn函数产生10^7个伪随机数,服从高斯分布。

randn(random normal distribution)是一种产生标准正态分布随机数矩阵的函数,属于MATLAB函数。返回一个n*n的随机项的矩阵,根据实验的要求我们产生10^7个服从高斯分布的伪随机数。

 

  1. 确定由0db~10db十一种信噪比。

便于对比在不通过的信噪比下的误码率。准备进行调制。

图1 BPSK调制系统原理

 

  1. 对信号进行调制,加入高斯白噪声。

在仿真时,假设R=1,M=2,Eb=1。

同时,针对以上十一种不同信噪比的情况,我们将高斯白噪声加入其中。由于我们需要将BPSK的标准差乘上到标准正态分布中以得到调制后的信号,基于正态分布的性质:

如果 https://gss3.bdstatic.com/7Po3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D91/sign=770b4b4a3d7adab439d017428bd4bc17/b3119313b07eca80ea2ac1859a2397dda14483a1.jpg 且a与b是实数,那么 https://gss0.bdstatic.com/-4o3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D175/sign=3ec38e4466224f4a539977143cf69044/11385343fbf2b2111f2b7d2cc18065380cd78e4f.jpg 。

我们可以推得方差:

于是,进行化简:

再进一步化简,有:

得到标准差后,由性质就可以将高斯白噪声加入调制中。

 

  1. 对收到的信号进行解调,统计误码数和误码率。

图2 BPSK解调系统原理框图

在AWGN信道中,BPSK信号相干的解调的理论误码率为:

其中,r为信噪比:

  1. 作图比较实际误码率和理论误码率的曲线。

 

 

  • 实验结果   

图3 理论误码率与仿真误码率对比

  • 实验程序

clc;

clear all;

% 产生10^7bit个随机的+1,-1

N = 10000000;

for i=1:N

if rand <.5

 s(i)=-1;

else

s(i)=1;

 end

end

% 产生高斯白噪声,randn函数产生10^7个正态分布的伪随机数

b=randn(1,N);

% 信噪比

EbNo=[0:1:10];

% 针对以上的情况的11种信噪比加入白噪声

for j = 1:11

sigma(j) = power(10,(-EbNo(j)/20))/ sqrt (2);

 for i = 1:N

n(i)=sigma(j)*b(i);

y(i)=s(i)+n(i); % Si)是输入的码,n(i)为噪声

 end

 % 解码,demo为解码后的结果

ER(j) = 0;

for i=1:N

 if y(i) > 0

 Demo(i) = 1;

else

Demo(i) = -1;

 end

 % 统计误码数,算出误码率,BER意为bit error ratio,比特出错概率,TBER意为理论比特出错概率,erfc为单调增函数,计算误码率和信噪比的关系

if Demo(i) ~= s(i)

 ER(j) = ER(j) + 1;

 end

end

BER(j) = ER(j) / N;

TBER(j) = erfc(sqrt(power(10,EbNo(j)/10)))/2;

end

 % semilogy函数可以使用y轴的对数刻度绘制数据

figure

semilogy(EbNo,BER,'B-V',EbNo,TBER,'M-X');

grid on;

legend('仿真误码率曲线','理论误码率曲线');

 

 

2019-03-25 23:16:35 weixin_41608328 阅读数 3955
  • 第04章-计算机常用通信指标和术语

    本课程主要内容如下: 1 bit、Byte、KB、MB、GB、TB概念和换算关系 2 波特率、比特率、误码率的概念和意义 3 信道、基带信号、频带信号 4 频分多路复用、时分多路复用、异步传输、同步传输

    1705 人正在学习 去看看 深博

在通信系统中常常会遇到AWGN和Rayleigh信道下QPSK的误码率分析。QPSK是一种比较常用的调制的方式,属于4PSK,也是最简单的QAM调制(4QAM)。以下程序演示了如何分析QPSK的在不同信道下的误码率变化情况,其中的Rayleigh衰落信道也可以换成其他的衰落信道模型。

clc
close all
clear all
SNR=0:1:20;                 %信噪比变化范围
SNR1=0.5*(10.^(SNR/10));    %将信噪比转化成直角坐标
N=1000000;                  %仿真点数
X=4;                        %进制数
x=randi([0,1],1,N);         %产生随机信号
R=raylrnd(0.5,1,N);         %产生瑞丽信号
h=pskmod(x,X);              %调用matlab自带的psk调制函数
hR=h.*R;
for i=1:length(SNR);
    yAn=awgn(h,SNR(i),'measured'); 
    yA=pskdemod(yAn,X);     %QPSK属于4PSK
    [bit_A,l]=biterr(x,yA); 
    QPSK_s_AWGN(i)=bit_A/N;
    
    yRn=awgn(hR,SNR(i),'measured');
    yR=pskdemod(yRn,X);     %调用matlab自带的psk解调函数
    [bit_R,ll]=biterr(x,yR);
    QPSK_s_Ray(i)=bit_R/N; 
end
QPSK_t_AWGN=1/2*erfc(sqrt(10.^(SNR/10)/2));   %AWGN信道下QPSK理论误码率
QPSK_t_Ray= -(1/4)*(1-sqrt(SNR1./(SNR1+1))).^2+(1-sqrt(SNR1./(SNR1+1)));
%Rayleigh信道下QPSK理论误码率

%绘制图形
figure
semilogy(SNR,QPSK_s_AWGN,'r*');hold on;
semilogy(SNR,QPSK_t_AWGN,'yo');hold on;
semilogy(SNR,QPSK_s_Ray,':b*');hold on
semilogy(SNR,QPSK_t_Ray,':go'); grid on;
axis([-1 20 10^-4 1]);
legend('AWGN仿真','AWGN理论','瑞利仿真','瑞利理论');
title('QPSK误码性能分析');
xlabel('信噪比(dB)');ylabel('BER');

2005-12-16 16:03:00 flylonginsky 阅读数 4881
  • 第04章-计算机常用通信指标和术语

    本课程主要内容如下: 1 bit、Byte、KB、MB、GB、TB概念和换算关系 2 波特率、比特率、误码率的概念和意义 3 信道、基带信号、频带信号 4 频分多路复用、时分多路复用、异步传输、同步传输

    1705 人正在学习 去看看 深博

     目前无线通信用得比较多的是串口+数传电台(无线Modem)。因为工况的原因,有些地方有变频机等的干扰,使得误码率大大加大。。。。。

     当然,在短距离的环境下,无线局域网技术目前来说是比较好的选择,传输速率快,冲突检测自动重发。。。。。。

    为了能更好的找到原因,故编了以下的小程序来客观的反映出误码率的多少。。

原理很简单,就是在发送端发送定义好的数据。然后在接收端看收到了多少错误的桢数。。。。。。

简单实用。:)

-----------serial.h

#ifdef __cplusplus
  #define cppargs ...
#else
  #define cppargs
#endif

#include <stdio.h>
#include <stdlib.h>
#include <iostream.h>
#include <conio.h>
#include <dos.h>
#define RXD 0   //接收
#define TXD 0    //发送
#define LSB 0     //波特率调节低8位
#define MSB 1     //波特率调节高8位
#define IER 1    // 中断起用寄存器
#define IIR 2    //中断标识寄存器
#define FCR   0x02   //缓冲区设置??
#define LCR 3    //线路控制寄存器
#define MCR 4   //调制解调器控制寄存器
#define LSR 5   //线路状态寄存器
#define MSR 6   //调制解调器状态寄存器
#define IERV 1
#define OUT2 0x08
#define ERTS 2
#define EDTR 1
#define EMPTY 0X20
#define READY 0X30
#define ICREG 0X20
#define IMASKREG 0X21
#define EOI 0X20

class Serial
{
public:
       Serial();
    Serial(int);
 void SerInit(void);
 void SerOpen(void);
 void SerClose(void);
 void Getportaddr();
 void Tx(unsigned char);
 void SerInit_query();
 void receive_comm();
 
public:
 int portaddr;//端口地址
private:
 int port ;// 端口号-1

 int portf; //
};

-------------sercial.cpp

#include "Serial.h"

extern unsigned char RxBuffer[16];
extern int errordatasum;
extern int transdatasum;

extern Serial Com1;
const int rxLength=16;
static int rxcnt=0;  //接收数据计数
float errorpercent=0;

Serial::Serial()//无参构造函数
{
}
Serial::Serial(int comn)
{
 port=comn-1;
 portaddr=0x3f8;//默认为 COM1地址
 portf=0;
}


void Serial::SerInit(void)
{
 disable();
 outport(portaddr+LCR,0x80);
 outport(portaddr+LSB,0x0C);//9600
 outport(portaddr+MSB,0x00);
 outport(portaddr+LCR,0x18|0x04|0x03);//偶校验,2个停止位,8个数据位(总0X1f)
    enable();
}

void Serial::SerInit_query()
{
 disable();
 outportb(portaddr+FCR,0xc9);        /* 1100 1001 0xc9 */   //14个接收FIFO缓冲区,2个发送FIFO缓冲区
 outport(portaddr+LCR,0x80);
 outport(portaddr+LSB,0x0c);//9600
 outport(portaddr+MSB,0x00);
 outport(portaddr+LCR,0x18|0x04|0x03);//偶校验,2个停止位,8个数据位(总0X1f)
 enable();
 
}
 
void Serial::SerOpen(void)
{
// old_Laser=getvect(portf+8);        //0x0B为IRQ4中断即串口1中断(PC104)
 disable();
 inportb(portaddr+RXD);
 inportb(portaddr+MSR);
 inportb(portaddr+LSR);
 inportb(portaddr+IIR);
 outportb(portaddr+IER,IERV);
 outportb(portaddr+MCR,OUT2|ERTS|EDTR);
 outportb(IMASKREG,inportb(IMASKREG&(~1<<portf)));
// setvect(portf+8,Laser_Server);//设串口中断响应函数
 enable();
 printf("COM%d Setup OK",port+1);
}

void Serial::Getportaddr()
{
 
 portaddr=peek(0X40,port*2);
 if(portaddr==0)
 {
  printf("have no avaible COM/n");
  exit(1);
 }
 else
 {
  printf("The used port is COM%d/n",port+1);
 }
 portf=(port==0)?4:3;
}
//*************************************************************************
//**函 数 名:SerClose
//**输    入:无
//**输    出:无
//**功能描述: 关闭端口,恢复COM1的原始中断向量
//**全局变量:old_Laser
//**调用模块:
//**作    者:张志龙
//**日    期:2005年04月04日
//**修 改 人:
//**日    期:
//**版    本:V1.0
//*************************************************************************
void Serial::SerClose()
{
 disable();
 outportb(portaddr+IER,0);
 outportb(portaddr+MCR,0);
 outportb(IMASKREG,inportb(IMASKREG)|(1<<portf));
 enable();
// setvect(portf+8,old_Laser);
}

/*发送部分*/

void Serial::Tx(unsigned char ch)
{
 outportb(portaddr+TXD,ch);
}
/*接收部分*/
void Serial::receive_comm()
{
 int i,j;
 unsigned char checkflag=0;    //用于是否进行校验标志
 unsigned char frameendflag=0;  //一帧传送结束标识 1-一帧传送结束,0--一帧传送还未结束
 unsigned char chksum=0;
 unsigned char rx_temp;
 while(inportb(portaddr+LSR)&0x01 )
 {
  outportb(portaddr+LCR,(inportb(portaddr+LCR) & 0x7f));
  rx_temp=inportb(portaddr+RXD);
  //printf("ddd=%x",ddd);
  if( rx_temp==0xff&&rxcnt!=(rxLength-1))
  {
   rxcnt=0;
   RxBuffer[rxcnt++]=rx_temp;
  }
  else
  {
   if(rxcnt<rxLength)    RxBuffer[rxcnt++]=rx_temp;
   if(rxcnt==rxLength)    //一帧传送结束
   {
    frameendflag=1;    
 //   gotoxy(rxcnt*3+8,20);
 //   printf("%2x",rx_temp);
    break;
   }
  }
  if(rxcnt>0)
  {
   gotoxy(rxcnt*3+8,20);
   printf("%2x",rx_temp);
  }
 }
 if(frameendflag)
 {
  chksum=0;
  for(j=0;j<rxLength-1;j++)   
  {
   gotoxy(3*j+8,21);
   printf("%2x",RxBuffer[j]);
   chksum+=RxBuffer[j];
  }
  chksum%=256;
  if(chksum!=RxBuffer[rxLength-1])
  {
   checkflag=0;
   errordatasum+=1;
   transdatasum+=1;
   printf("chk error!chksum=%2x",chksum);
  }
  else
  {
   checkflag=1;
   transdatasum+=1;
  }
  if(transdatasum!=0)
  {
   errorpercent=errordatasum/transdatasum;
   printf("errorpercent=%4.2f",errorpercent);
  }
  
 }

}

-------------main.cpp

#include <stdio.h>
#include <iostream.h>
#include <conio.h>
#include "serial.h"
unsigned char TxBuffer[16];
unsigned char RxBuffer[16];      //接收数组
int sum=0;
int errordatasum=0;
int transdatasum=0;
//Serial Com1(1);    //com1 for laser int
Serial Com2(2);    //com2 for wireless communication

void Send_comm();
void Begin_Serial();

int main(void) 
{
 Begin_Serial();
 do
 {
 //    Com2.receive_comm();          //接收
  Send_comm();                            //发送
  cout<<hex<<Com2.portaddr<<'/t';

 } while(!kbhit());
 return 0;
}
//*********************************************************************************************
//*函数介绍:串口的初始化。
//*                       : 调用Serial类对象Com1
//*输入参数: 
//*输出参数:无
//*返回值  :无
//*********************************************************************************************
void Begin_Serial()
{
/*Com1 init*/
// Com1.Getportaddr();
// Com1.SerInit();
// Com1.SerOpen();
/*Com2 init*/
 Com2.Getportaddr();
 Com2.SerInit_query();

}

/*串口发送内容*/
void Send_comm()
{
 int TxLength=16;
    sum=0;

 int i;
 /*******  first frame********************/
 TxBuffer[0]=0xFF;
 TxBuffer[1]=0x00;
 TxBuffer[2]=0x11;
 TxBuffer[3]=0x30;
 TxBuffer[4]=0x40;
 TxBuffer[5]=0x50;
 TxBuffer[6]=0x60;
 TxBuffer[7]=0x70;
 TxBuffer[8]=0x80;
 TxBuffer[9]=0x90;
 TxBuffer[10]=0x10;
 TxBuffer[11]=0x11;
 TxBuffer[12]=0x12;
 TxBuffer[13]=0x13;
 TxBuffer[14]=0x14;
 for(i=0;i<15;i++)
 {
  sum+=TxBuffer[i];
 }
 sum%=256;
 TxBuffer[15]=sum;
 for(i=0;i<16;i++)
 {
  Com2.Tx(TxBuffer[i]);
  printf("%2x",TxBuffer[i]);
 // delay(5);
 }
 /**********second frame ***********************/
 
 /*
 TxBuffer[0]=0xFF;
 TxBuffer[1]=0x00;
 TxBuffer[2]=0x12;
 TxBuffer[3]=0x31;
 TxBuffer[4]=0x41;
 TxBuffer[5]=0x51;
 TxBuffer[6]=0x61;
 TxBuffer[7]=0x71;
 TxBuffer[8]=0x81;
 TxBuffer[9]=0x91;
 TxBuffer[10]=0x20;
 TxBuffer[11]=0x21;
 TxBuffer[12]=0x22;
 TxBuffer[13]=0x23;
 TxBuffer[14]=0x24;
 for(i=0;i<15;i++)
 {
  sum+=TxBuffer[i];
 }
 sum%=256;
 TxBuffer[15]=sum;
 for(i=0;i<16;i++)
 {
  Com2.Tx(TxBuffer[i]);
  printf("%2x",TxBuffer[i]);
  delay(50);
 }
 */
 printf(" sended./n");

 
}

接收时选用接收子函数

发送时选用发送子函数。

希望能有一点点的帮助

没有更多推荐了,返回首页