声卡对于我们来说,十分的熟悉了,正是声卡技术的发展,将PC音频带入了一个全新的境界,使得在PC上聆听水晶般的声音成为可能。那么好的声音是如何发出来的,本文将从声卡的底层技术出发,带领大家一探究竟。
优秀的硬件设计,奠定了声卡良好工作的基础,但同时需要出色的软件支持,才会将声卡的性能释放。优秀的声卡配套软件,应该性能强大,使用简单。我们以目前Audigy声卡为例,配套软件中所包含的内容很多,这里我们只说最关键的一个:EAX。
EAX全名为Environmental Audio Extension,即环境音效指令集,是创新公司推出的API(Application Program Interface,即应用程序接口。,技术厂商将自己的特有音频技术开发为3D音频API,而对于软件开发商(如游戏开发商)来说,利用只要使用该API,即可实现不同的3D音效。
EAX主要是针对一些特定环境,如音乐厅、走廊、房间、洞窟等,作成声音效果器,当电脑需要特殊音效时,可以透过DirectX和驱动程序让声卡处理,可以展现出不同声音在不同环境下的反应,并且通过多件式音箱的方式,达到立体的声音效果。
EAX在刚推出时为1.0版,目前是4.0版,还有即将发布的5.0版本。我们以目前的EAX4.0来分析,利用EAX是如何实现游戏中的3D音频处理。EAX4.0有:多环境,环境过渡,环节过滤,环境位移,环境反射等先进特效。下面我们就来简单分析这些特效的实现。
●环境过渡(Environment Morphing):
在游戏中,当角色从一个环境,到另外一个环境。声音效果应该是逐渐过渡的,EAX4.0实现了从一种环境向另一种环境的无缝转换。而这在以前会非常生硬地切换到另一个环境效果,很不真实。我们来看环境过渡是如何实现的。

在图中,从门口,经过走廊,到达大厅,我们取了三个位置:门口、走廊中间、走廊和大厅交界处。在角色从门口进入大厅的过程中,要进行的位置转换,混响(reverb)参数会根据角色在两个环境位置的绝对不同参数而逐渐地改变。随着角色的位置,在走廊里移动,更加接近大厅的。就调用更多的大厅的回响参数,这样大厅的效果就更突出。位置1到2位置,和位置2到位置3就是参数渐变的过程。
当角色,从门口进入走廊,和从走廊进入到大厅的位置1和位置3处。属于位置极限变化,参数会自动的改变。
环境渐变是与回响相关的最重要函数。以前的游戏没有逐渐过渡,只能通过设置一个渐变函数值。使用这些函数值形成一定的平均环境,得到不同声场的变化的平均效果,不是很真实。使用了EAX的环境渐变后,游戏效果不能通过使用不同的参数进行逐渐地改变,因为在EAX中,是通过调用预先设定的值来完成的(这一点非常重要,在下面的问题处理中,我们要用到)。比如EAX把从门口经过走廊到大厅的过程中,预先设置预几十个变量,把走廊做为中间参数,逐步调用就可以了。虽然实现起来非常简单,但是需要强大的DSP处理能力做保证。从前面的分析我们知道EMU10KX的处理能力足可以胜任这个工作。
●环境过滤(Environment Filtering):
通过环境过滤,EAX可以准确模拟声音同时在开放和封闭的环境中传播的效果。

如图在声音1的音源被定位在障碍物后。直接通路被遮挡住了,这就是障碍效果。这样就采用EAX的环境过滤来进行处理,依据障碍物的几何参数(厚度)和墙壁的制造材料来调用EAX函数的过滤度数。由于音源和角色之间没有直接的接触,音源的回波也根据同样的原则被压抑了。音源3定位在关闭的门的后面,这就是封闭效果。一般处理方式,可以通过调低音量来实现,但更加实际的实现办法是使用低通(low-pass)的过滤来改变声音的效果。这样处理以后,可以得到低沉压抑的声音。我们认为EAX这里使用HRTF(头部相关传输函数)技术,通过过滤或转换来进行模拟。?此外,还有排斥处理。比如音源和游戏角色在门敞开的不同的房间,这样直接的声音通过门可以传给角色。如何表现这类声音呢?EAX就依据墙壁材料的厚度,形状和属性对反射的声音进行失真处理,来表现声音这样细微的差别。
●环境移位(Environment Panning):
现实中,当游戏角色和一个环境的相对位置或距离不断变化的时候,声音效果也是变化的。EAX是如何处理这样的变化的,我们来看下图。

如图,我们将从音源(一条从屋顶流到水池的泉水)到游戏角色的距离分为6个区域,距离越远,声音越小。这样,可以采用降低音量级的方式来进行处理。从音源到角色,没经过一个区域,声音强度降低几个dB。这样声音越来越小,在这6个区域之外,EAX引擎就可以关闭,这样还可以释放处DSP的运算资源。
同时音量级是有对数相关性的。不同的音源的音量级是不同的,比如对应较大的声音和较安静的声音,音源也可以被区分为最小和最大的距离。例如流水在几个区域,声音就听不见了。而怪兽,则在几个区域之后,声音还很大
●环境反射(Environment Reflections):
反射是一种在真实世界中声音从物体表面反射回到听者耳中的现象。环境反射不仅可以模拟出这种效果而且还能给声音反射加上三维空间定位。如图9的音源1的处理上,EAX在使用障碍效果处理的同时,还会使用环境反射处理。为了把音效完全融合到游戏里面,必须要计算出声环境和它与音源的交互作用,声音往往会经过几次反射到达角色。

音源到游戏角色,有直接途径,有的则经过了一次或者多次反射,EAX是如何表现这样的效果呢,我们来分析:EAX引擎首先分析3D的空间的几何特征,然后再决定声波在该3D空间内的传播模式。然后根据反射物的几何形状来决定反射的途径和方式,根据反射物的材料属性,来决定反射的强度等相关特性。
然后调用相关函数数据库,将游戏中的图形多变形,转换为声频多边形,利用EMU10KX强大的处理性能,达到实时的效果处理。这样处理过的3D声音,经过声学设计的房间和环境,声音信号能够在游戏玩家的耳朵里精确再现。比如在该游戏场景中,水池下的压抑模糊以及从屋顶留下来的泉水撞击水面的声响,都表现的非常逼真。这和EMU10KX的64个3D硬件加速音频流强大的实时处理功能是分不开的。
我们是在分析EAX时,是分开解释的,在实际的处理过程中,多种音效是同时进行处理的,这一点要特别注意。同时我们也只是列举了EAX有代表性的四个处理效果来进行分析的,实际EAX包含相当多的特效处理。
此外,从我们对EAX的分析中,我们还可以看到Aureal A3D和Sensaura S3D的影子,目前这两个技术同属于创新公司,我们有理由相信,在以后的新的EAX中,将会更好的使用这两个游戏引擎的出众的处理效果。
关于开启EAC后的轻微噪音问题
在混音器里的所有输入设备均为静音,只打开WAVE,将音量调高。主音量设置到最大,启动EAX控制台,然后在复选框里选择“启用音频特效”,随便选择一个环境效果,而且效果量不为0%,则会出现轻微的噪音。对应这个问题,已经为创新所确认,但目前没有给出解释。

这里,我们从EAX的角度来进行分析。上面说的使用情况,只是一个极限的使用情况。音量最大,无音频信号输出,而只开EAX环境效果。为什么出现这样的噪音情况呢,结合我们对EAX的分析,很好理解:EAX特效是添加到音乐欣赏或者是游戏声效去的。通常游戏会自动调用该效果函数结合当时的图像情况,因为上面我们分析过,有一个将图形函数,转变为声效函数的过程。这样,在游戏中是会自动调用的。但是音乐欣赏,我们自己添加环境音效,而不进行音源的输出。这样强制打开EAX环境音效,只能是让EAX工作,但是没有处理的对象,所表现出来的就是轻微的噪音。
这在有音源输出时,EAX便会对其进行处理了,丝毫不会出现这个轻微噪音的问题,这点我们可以确信。不排除在以后的EAX版本中,添加一个EAX检测机制,当无音源输出时,EAX强制关闭。这样就很简单的解决了这个问题。
题外话:驱动,绽放声卡的活力与激情
优秀的驱动的算法,可以最大限度的发挥声卡的性能。EMU10KX处理信号时,对信号进行8点插值采样,采用Smith-Gossett2算法。可以让波形图和原始数据最大程度的相重合,减小失真。同时有多条DMA通道,数据的传输可以不通过系统总线直接进行,CPU占用率非常的低。同时基与DSP强大的处理能力,可以很容易的添加各种特效。
对驱动和算法,我们不做过多的研究,这里我们主要谈一下国内目前轰轰烈烈的驱动修改问题。
所谓驱动的修改,就是将创新的为高规格声卡的驱动连同软件,给低规格的声卡用。我们知道,EMU10KX系列是可编程式DSP结构芯片,编程自由度比较高,可以很轻松的添加各种音频特效。在不升级的硬件的情况下,可以通过升级驱动包来实现性能提升。某些情况下,驱动会被故意界定,以便分出硬件的级别。这些,就是所谓的修改驱动的理论所在了。严格来说,现在的修改驱动,只是不同驱动包中,应用软件的“嫁接”。
那么驱动是如何修改的呢,我们继续来进行分析。
我们知道每一个pci设备都由一个总线号、一个设备号和一个功能号确定。PCI设备可以访问三类地址空间:PCI的I/O空间、PCI的存储空间和PCI的配置空间。前两者可由PCI总线上的所有设备共享。PCI的配置空间由256个字节构成,其布局是标准化的。每个PCI设备都有一个Vendor ID(制造商标识)和一个Device ID(设备标识)和一个Subsystem ID。均为4位16进制数。其中Vendor ID是PCI SIG分配给制造商的。Subsystem ID是制造商用来区分不同的产品的。Creative的Vector ID是1102,是固定的。Device ID,microsoft为保证硬件支持pnp(从windows95开始支持plug&play),对制造商提供的驱动文件进行测试认证。微软硬件质量实验室会(WHQL)给通过测试的驱动加一个含有微软“驱动程序签署”的.cat文件(catalog,目录)。驱动经过数字签名后,都有一个Device ID,保存在ROM芯片中。PnP bios先识别Device ID,然后在windows中和驱动对照,同时核对数字签名。
我们所要改的就是改EEPROM芯片(上面我们提到过,可重复擦写)中的Device ID和Subsystem ID,或是改驱动中的Device ID和Subsystem ID,使他们和想采用的驱动的版本相对应就可以了。这是现在很多修改驱动的程序中,最关键和最根本的一步。
这里我们需要指出的是,之所以以前修改驱动可以通过刷新EEPROM而得到绝大多数功能。那是因为硬件电路设计部分比较接近,所以具体到驱动修改来说,就比较简单了。但是,随着以后声卡结构的重大的改动,再通过这样简单的方法来修改驱动,将会越来越困难,同时效果也很难尽如人意。比如由于结构发生了改变,将Audigy4驱动修改为Audigy2系列的驱动,效果非常不理想。这里我们探讨的这些,只是从技术层面进行的一个分析。这里的软件,其版权都属于创新公司的,请勿非法使用。
这里的很多观点,只代表个人看法。资料的严重不足,也限制了进一步的深入探讨的可能,如果有纰漏和错误的地方,请各位读者朋友指正。 |