最新日志

发表于:2007-8-30 11:06:26
标签:无标签

1

主流GPS方案供应商大盘点

点击此处查看原文 >>

系统分类: 通信网络   |    用户分类: 无分类    |    来源: 无分类

评论(0) | 阅读(246)
发表于:2007-8-30 11:02:17
标签:net  

0

IP网络和新兴视频应用中视频转码的实现

数字视频压缩已成为一种几乎在各种类型的视频应用中都非常重要的技术。随着媒体融合的趋势不断发展,压缩和互操作性能将变得越来越重要。

DVD、HDTV、视频电话/电信会议和最近出现的视频监视系统是最著名的几个数字视频应用。不过,这些产品的系统级技术各有不同的历史背景,因此,需要采用不同的压缩算法。

在过去几年,数字视频市场中的标准数目大幅增长,特别是在该市场引入了H.264(MPEG-4 Part 10)AVC(高级视频编码)和WMV9等新型编解码器后。同时,负责视频系统设计的工程师们仍必须与仅支持几种旧标准(如H.261、H.263、MPEG-2或MPEG-4 part 2)的传统设备打交道。但在某些应用中,该设备必须具备与集成了最新算法的新型设备进行互操作的能力。

算法的开发也是一个富于挑战性的难题。当功能更强大的新算法被开发出来并被标准化之后,还必须保证它们与原有算法兼容,这是一个令人生畏的任务,因而,必须开发出一些强大的通用转码(transcoding)方案。

知识产权方面的问题甚至更加复杂。尽管许多视频编码算法(如MPEG-2、MPEG-4、H.263和H.264)是公开的标准,但其它一些算法(如On2和Real Video)却是专有的。专有算法有时也可以成为标准算法。例如,起初为专有算法的WMV9最终因被SMPTE协会采纳而成为公共的VC1标准。

什么是视频转码技术?

视频转码技术将视频信号从一种格式转换成另一种格式。它具有两个面向不同领域的重要功能。首先是在传统设备和新兴设备之间实现通信。例如,许多现有的视频会议系统是基于旧的视频编码标准H.263而建立,而最新的视频会议系统采用了H.264基线规范。因此,实时视频转码技术是实现两者之间通信的必不可少因素。

网络(特别是互联网)限制了视频传输的带宽。例如,目前大多数电影以MPEG-2格式存储在DVD光盘中。视频点播和IP视频流系统的带宽限制要求在传输之前通过实时视频转码将视频数据转换成带宽效率更高的格式。

在视频会议系统中,需要利用视频转码技术对传统和新兴视频流进行格式转换。视频点播应用通常从采用传统视频编码标准(MPEG-2、H.263)的视频流转换到采用最新高级视频编码标准(H.264或VC1)的视频流。使用转码的意义在于可以在不损失任何视频质量的前提下节省高达50%的网络带宽。

视频转码系统的背景

从运作的角度来看,视频转码通常在一个系统局端的视频基础设施中采用。最常见的系统实现要求主处理器处理网络数据流同时由多个DSP来处理转码任务中的视频编码和解码。通常,一个单独的视频多端口控制单元(MCU)有足够的能力来同时处理多个视频转码通道。

例如,图1展示了一个视频会议系统中的基本视频转码要求和数据流。DSP2对输入视频流解码并生成重建的视频帧,通过串行RapidIO接口将该视频帧传送到DSP1。另一个DSP将对重建的视频帧编码使之达到目标格式。最常见的情形是视频会议的一个终端使用基于H.263的设备,而其它终端使用基于H.264的设备。

点击看大图
图1:这一简化的视频转码实例被用于一个视频会议的MCU中。

此时,主处理器通过PCI连接与多个DSP(在本例中为4个)进行通信。实现处理器多向通信的一个关键特性是在4个DSP之间采用sRIO连接。由于在DSP之间传送的数据是未经压缩的视频数据(速度通常为30帧/s),因此对设备之间的带宽要求很高。

以NTSC标准分辨率(720×480)、4:2:0 YUV色彩空间的视频为例,每个帧的大小为720×480×1.5=518,400字节。以30帧/s的速度转码意味着要求每通道速度达到约124Mbps。考虑到对视频带宽的要求以及需支持灵活的交换结构,sRIO连接是理想的选择。而sRIO的特性也成为在该应用中选择DSP的一个关键因素。

sRIO是一种交流耦合接口,可提供1.24、2.5和3.125Gbps三种数据速率。该接口利用串行器/解串器(SERDES)接口从数据流恢复时钟并完成8/10位编码。该串行规范支持单通道(1x)和四通道(4x)端口,其物理层定义了链接方之间的握手机制并执行基于CRC的错误检测。此外,还定义了用于在交换结构中进行路由的数据包优先级。

为充分利用sRIO的带宽性能,DSP必须具有sRIO接口。TI公司的TMS320C6455 DSP内置了sRIO接口,可同时实现四路通道的链接,峰值传输速率可达20Gbps(双向)。

视频转码原型的实现

当通过IP网络发送DVD光盘上的数据时(例如公司培训、视频点播或视频广播等应用),转码技术同样适用。对于这种情况,源视频格式是MPEG-2,而VC1很可能被用作目标格式。以下将介绍如何利用两片TI TMS320C6455 DSP来实现这种系统原型。

从技术上来看,需采用视频转码技术来解决格式转换、位速率减小和时间/空间分辨率缩减等诸多问题。相应地,针对不同情况开发出了不同的智能视频转码方案,其基本原则是尽可能地复用原始输入视频流中所包含的信息以降低复杂性。

例如,运动矢量(MV)映射、DCT(离散余弦变换)域转换和残差重估(residual re-estimation)等日前流行的视频转码技术可大幅降低计算复杂性。

此外,人们也期待出现简单且可以扩展的转码架构。由于不同的视频转码方案要求以不同的方式对算法和架构进行调整,并且不存在单个的标准化视频转码方案,具有可编程能力的DSP(如C6455 DSP)适用于这一领域。

下面我们将提出一个可满足各种转码方案的通用视频转码架构及原型。为适应各种不同的视频转码目标,我们选取了最简单的转码方案将被解码的视频流按照新的约束条件完全重新编码。

这个初始的视频转码方案未复用原始输入视频流中所包含的信息,却能够处理所有复杂的解码和重编码任务。不过,该视频转码架构和软件基础设施是可扩展的,可以支持智能转码方案(如MV映射、DCT域转换等),以提高通道密度并充分挖掘优化质量的潜能。由于采用了灵活的软硬件框架,这个架构可以实现许多传统的和新型的转码方案。

DSP至关重要

由C6455 DSP等器件所提供的高DSP计算性能是实现视频编码和解码的先决条件。视频基础设施应用还有其它一些关键的性能要求,可以把它们归为四个主要方面:

多个强大的I/O选项:系统设计者需要从不同的角度来处理各种问题,这意味着面向视频基础设施应用的DSP应提供可用于板级连接的I/O选项。正如之前提到的,C6455 DSP为实现设备之间的通信内置了一个sRIO端口。sRIO使用的高吞吐量消息传递机制可实现95%的可用数据带宽利用率。其它I/O选项包括一个速度为1Gbps的以太网媒体访问控制器(EMAC)、一个32位双数据速率(DDR2-500)存储控制器和一个66MHz的PCI总线。

高效的片上数据迁移:在视频基础设施应用中,DSP被用做主处理器的从设备,因此,应保证主从设备之间的高吞吐量、低延迟和并发式数据传送。这些要求在架构上表现为通过高效的交换中央资源(SRC)来实现外围设备、内部存储器和DSP内核之间的互连(就像在C6455 DSP中那样)。

数据流的简化也非常重要。使用256位的存储器总线和内部DMA(IDMA)可以提高简化水平。IDMA在两个内部存储器级之间完成后台(background)数据移动以及从/到外围总线的数据移动。

大容量的片上存储器:与片外SDRAM相比,片上SRAM速度更快且尺寸小得多。对于典型的视频应用而言,片上存储器主要有两个用途。首先,它储存可变长度码(VLC)表等需被频繁访问的代码和数据;然后,交换处理前后的输入/输出时态数据。通常,可用的片上存储器越多,应用系统的性能就越好。C6455 DSP中包含高达2MB的片上SRAM,这有助于提升视频应用的性能并使其具有处理多个通道的潜力。

代码兼容性:在转码技术广泛用于视频基础设施应用之前,已经开发出了大量的视频应用代码,因此应保证代码的后向兼容性。与改变指令集相比,DSP内核架构是提高关键信号处理性能的最佳场所。

例如,C6455对架构进行了两项革新,其一是通过引入循环缓冲区改进小规模循环代码的软件流水效率,其二是采用原始32位指令的16位版本,极大地减小了代码规模,从而降低了程序缓存的丢失率(miss rate)。

原型的实现

图2显示了一个分别使用MPEG-2和WMV9作为原始格式和目标格式的视频转码引擎。尽管MPEG-2/WMV9组合有望应用得非常普遍,但DSP的可编程能力使其可以方便地处理源视频/目标视频格式的几乎任何组合。

点击看大图
图2:图中的实时视频转码应用利用了两颗TI公司的TMS320C6455 DSP芯片。首先将一个MPEG-2文件解码,然后将信号编码成WMV9格式,使其可以在Windows Media Player引擎中播放。

该系统的原始数据以MPEG-2格式的视频压缩文件储存在硬盘中,数据流始于图中的左侧并通过Windows Media Player软件止于平板显示器。在这个展示装置中,视频信号采用NTSC标准分辨率并以30帧/s的速度进行转码。

运行在DSP1上的数据流接收器模块负责缓存MPEG-2数据流,并对MPEG-2解码器模块的输入数据进行管理。数据接收操作由TI公司的Network Development Kit(NDK)库(本质上是一种TCP/IP栈)控制。DSP2也有一个基于NDK的HTTP服务器,负责处理由Windows Media Player发出的流处理请求并把ASF数据包传送给WMP。然后,WMP将ASF数据包解码并在屏幕上显示视频信号。

该数据流的一个最有趣和最富挑战性的特性是两个DSP在sRIO接口上的交互。对于每个视频帧的传送,这一过程包括:

一旦DSP1发送完视频帧,便马上发送一个在sRIO协议规范中被称为DOORBELL(门铃)的数据包。DOORBELL数据包在DSP2上产生一个系统中断告知有帧到达,然后开始WMV9编码。在完成对帧的编码后,DSP2将一个DOORBELL数据包发送回DSP1,再次触发一个中断给DSP1中告知可继续发送下一帧。在实际的实现中,使用了一种PING-PONG缓冲方案来并行处理编码/解码和数据传送操作。接下来,该序列以循环方式运行直到演示停止。

GUI模块将控制和监视功能内置到系统中。sRIO链接和两个吉比特MAC(GMAC)链接的活动以实时方式显示出来。对于传送MPEG-2数据流的链接,平均数据速率为8Mbps,这对于标准分辨率下编码速率达30fps的情况十分普遍。对于传送ASF数据包的链接,平均位速率为4Mbps,这表明WMV9能够节省50%的带宽但仍可达到同样的视频质量。对于sRIO链接,平均位速率为124Mbps。

本文小结

由于视频编码标准过多和在IP网络中受到带宽和延迟的限制,视频解码已成为一种必不可少的技术。

尽管最基础的技术在很久以前就已准备就绪,但更高质量的视频以及在IP网络上最终实现HDTV的目标要求提供一种新的视频基础设施架构,该架构应包含sRIO和一些可与该接口的传输方案相互作用并提供补充功能的DSP。为同时处理多个通道,用于视频基础设施应用中的DSP通常需具有大容量的片上存储器。此外,它们必须向设计者提供多种I/O选择(包括GMAC和UTOPIA)以及更好的内部数据流。C6455 DSP和上述演示软件表明,IP视频在现在以及将来所面临的挑战是可以克服的。

点击此处查看原文 >>

系统分类: 通信网络   |    用户分类: 无分类    |    来源: 转贴

评论(0) | 阅读(551)
发表于:2007-8-29 14:52:13
标签:无标签

0

在VC++中用ActiveX控件实现与单片机的串行通信

3.设置属性

  可以在两个地方对控件的属性进行设置:

  (1)对话框资源编辑器中。在对话框模板上,用右键单击MSCOMM控件,然后选择Properties…菜单项,最后便可设置各项属性。此处只对以下几处进行改动,其他接受缺省设置:Rthershold:1,InputLen:1,DTREnable:不选,InputMode:1-Binary。

  (2)对话框类的OnInitDialog()函数中。下面是以上设置的函数实现:

  BOOL CMyCOMMDlg::OnlnitDialog()

  {

  CDialog::OnlnitDialog();

  //此处为应用框架自动生成代码,不予列出

  //TODO:Add extra initialization here

  m_comm.SetCommPort(1);//使用串口1

  m_comm.SetSettings("9600,N,8,1");

  //波特率为9600,无奇偶校验,8位数据位,1位停止位

  m_comm.SetRThreshold(10); //每接收10个字符就触发1次接收事件

  m_comm.SetSThreshold(0); //不触发发送事件

  m_comm.SetInputLen(10); //每次读操作从缓冲区中取10个字符

  m_comm.SetInputMode(1); //二进制数据传输形式

  m_comm.SetPortOpen(TRUE); //打开串口

  return TRUE;//return TRUE unless you set the focus to a control

  }

  4.发送二进制数据

  如果需要发送二进制数据,可将数据作如下处理。具体代码如下:

  CByteArray bytOutArr;

  bytOutArr.Add(0x0); //给数组赋值

  bytOutArr.Add(0x1);

  bytOutArr.Add(0x2);

  bytOutArr.Add(0x3);

  bytOutArr.Add(0x4);

  COleVariant varOut;

  varOut=COleVariant(bytOutArr); //将数据转换为变体数据类型

  m_comm.SetOutput (varOut); //发送数据

  5.接收二进制数据

  当需要接收大量的数据时,最好采用事件驱动方式进行编程。具体步骤如下:

  (1)响应OnComm事件。在对话框资源编程器中,双击对话框模板上的MSCOMM控件,在弹出的对话框中填入您所希望的事件响应函数名,此处将其命名为OnCommMscomm1()。

  (2)在事件响应函数中接收和处理数据。接收来的数据为变体数据,所以需要做一些处理,具体代码如下:

  void CMyCOMMDlg::OnCommMscomm1()

  {

  COleVariant varRcv;

  CByteArray byt;

  int i;

  long num;

  switch (m_comm.GetCommEvent())

  {

  cass 1://数据发送事件

  break;

  case 2://数据接收事件

  varRcv=m_comm.GetInput();

  varRcv.ChangeType (VT_ARRAY |VT_UI1);

  BYTE HUGEP *pbstr;

  HRESULT hr;

  hr=SafeArrayAccessData (varRcv.parray,(void HUGEP*FAR*)&pbstr);//获取安全数组指针

  if (FAILED (hr)){

  AfxMessageBox("获取数组指针失败!");

  break;}

  num=0;

  hr=SafeArrayGetUBound (varRcv.parray,1amp;num);//获取数组上界

  if (FAILED (hr)){

  AfxMessageBox("获取数组上界失败!");

  break;}

  for(i=0;ibyt.Add(pbstr [i]);

  SafeArrayUnaccessData (varRcv.parray);

  //此时数据已保存在二进制数组byt中,可根据需要进行相关处理

  break;

  default:

  break;

  }

  }

  以上代码中的处理部分可以做成一个单独的函数,在此处调用即可。经过以上代码的处理,接收来的数据已存放在二进制数组byt中,可以根据自己的需要对其进行相关处理,如保存和显示等。

  三、硬件接口

  单片机与微机之间的硬件接口可以用1片MAX232或ICL232与几个电容即可实现,有许多文献讨论过,此处不再多述。

  以上方法经过笔者在实践中的应用,感到非常简洁、方便,具有很强的实用意义。

点击此处查看原文 >>

系统分类: 测试测量   |    用户分类: 无分类    |    来源: 无分类

评论(0) | 阅读(493)
发表于:2007-8-29 14:50:41
标签:无标签

0

在VC++中用ActiveX控件实现与单片机的串行通信

单片机应用系统中,经常需要通过RS-232串行口与微机进行通信。目前在各种操作系统中,Microsoft的Windows较为常见,而且大多为Windows95/98等32位平台。以往在Windows平台上的串行通信多使用其提供的API函数来实现,这种方法使用起来需要许多底层设置,因而较为繁琐,并且难以理解。Microsoft推出的ActiveX技术提供了另外一种实现串行通信的方法。这种方法不仅相对较为简单,而且非常实用。尤其是Visual C++这种可视化面向对象的编程环境中,可以真正把串口看作一个对象,编程时只需简单的设置,理解起来也很容易。下面详细讨论Microsoft提供的串行通信ActiveX控件的使用方法。该控件的相应文件是MSCOMM32.OCX,以下简称为MSCOMM控件。

  一、MSCOMM控件

  MSCOMM控件,即Microsoft Communication Control,是Microsoft为简化Windows下串行通信编程而提供的ActiveX控件。它提供了一系列标准通信命令的使用接口,利用它可以建立与串口的连接,并可以通过串口连接到其他通信

设备(如调制解调器),发出命令,交换数据以及监视和响应串行连接中发生的事件和错误。MSCOMM控件可用于创建电话拨号程序、串口通信程序和功能完备的终端程序。

  MSCOMM控件提供了两种处理通信的方式:

  (1)事件驱动方式。当通信事件发生时,MSCOMM控件会触发OnComm事件,调用者可以捕获该事件,通过检查其CommEvent属性便可确认发生的是哪种事件或错误,从而进行相应的处理。这种方法的优点是响应及时、可靠性高。

  (2)查询方式。在程序的每个关键功能之后,可以通过检查CommEvent属性的值来查询事件和错误。如果应用程序较小,这种方法可能更可取。例如,如果写一个简单的电话拨号程序,则没有必要每接收1个字符都产生事件,因为惟一等待接收的字符是调制解调器的"确定"响应。

  在使用MSCOMM控件时,1个MSCOMM控件只能同时对应1个串口。如果应用程序需要访问和控件多个串口,那么必须使用多个MSCOMM控件。

  在VC++中,MSCOMM控件只对应着1个C++类--CMSComm。由于MSCOMM控件本身没有提供方法,所以CMSComm类除了Create()成员函数外,其他的函数都是Get/Set函数对,用来获取或设置控件的属性。MSCOMM控件也只有1个OnComm事件,用来向调用者通知有通信事件发生。

  MSCOMM控件有许多很重要的属性,限于篇幅只给出几个较为重要和常用的属性,如表1所列。

表1 MSCOMM控件的重要属性

点击看大图

  二、编程实现

  从表1可以看到,MSCOMM可以两种不同的形式接收数据,即以文本形式和以二进制形式。用MSCOMM控件进行字符数据传输的文献和资料可以找到很多,在Microsoft的MSDN(Microsoft Developer Network)中就可以找到这样的例子,即VCTERM。可是几乎所有以单片机为核心的测量系统所得到的原始数据都是二进制形式的,所以,以二进制形式传输数据将是最为直接而又简洁的办法。不仅如此,由于MSCOMM控件在文本形式下,其传输的是宽字符格式的字符,要想得到有用信息,还要额外处理。因此本文主要讨论在二进制形式下的使用方法。

  在VC++6.0中,用APPWizard可以生成三种应用程序:单文档(SDI)、多文档(MDI)和基于对话框的应用程序。为了说明问题和省去不必要的细节,下面以基于对话框的应用程序为例。

  1.创建一个基于对话框的应用程序

  打开VC++6.0集成开发环境,选择菜单项File/New,在出现的对话框中选中Projects标签中的MFC AppWizard(exe),然后在Project Name框中填入MyCOMM(可根据需要命名),之后点OK按钮。在接着出现的对话框中选中Dialog Based项,然后点NEXT按钮。以下的各对话框都按照缺省设置,这样即可生成一个基于对话框的应用程序。在资源编程器中会出现其对话框模板。

  2.插入MSCOMM控件

  选择菜单项Project/Add to project/Components and Controls…,在弹出的对话框中选择Registered ActiveX Controls文件夹下的Microsoft Communications Control,version6.0,然后按下Insert按钮,接着会弹出一个对话框,提示生成的类名及文件名,按OK按钮即可实现控件的插入。这时在对话框的控件工具栏 上会多出一个电话机模样的控件图标,Workspace的Classview中也多了一个类CMSComm。  

  此时即可将MSCOMM控件加入到对话框模板,加入方法与其他控件一样。然后还要在对话框类中相应加入一个成员变量,此处我们将其命名为m_comm。加入方法为:首先,在对话框模板中,用鼠标右键点击该控件,选择ClassWizard,在出现的对话框的Member Variables标签的Control Ids项下,选中IDC_MSCOMM1。然后,按Add Variable…按钮,在出现的对话框的Member Variable Name项中输入m_comm。最后,按OK按钮即可。

点击此处查看原文 >>

系统分类: 通信网络   |    用户分类: 无分类    |    来源: 原创

评论(0) | 阅读(547)
总共 , 当前 /