最基本的声音信号数字化方法是取样-量化法,它有采样、量化和编码三个步骤。
(1)采样。采样是把时间连续的模拟信号转换成时间离散、幅度连续的信号。在某些特定的时刻获取声音信号值叫做采样,由这些特定时刻采样得到的信号称为离散时间信号。一般都是每隔相等的一小段时间采样一次,其时间间隔称为取样周期,它的倒数称为采样频率。采样频率越高,可恢复的声音信号分量越丰富,其声音的保真度越好。
(2)量化。量化处理是把在幅度上连续取值(模拟量)的每一个样本转换为离散值(数字量)表示,因此量化过程有时也称为A/D转换(模数转换)。量化后的样本是用二进制数来表示的,二进制数位数的多少反映了度量声音波形幅度的精度,称为量化精度,也称为量化分辨率。
(3)编码。经过采样和量化处理后的声音信号已经是数字形式了,但为了便于计算机的存储、处理和传输,还必须按照一定的要求进行数据压缩和编码,即选择某一种或者几种方法对它进行数据压缩,以减少数据量,再按照某种规定的格式将数据组织成为文件。
声音文件的格式
数字声音在计算机中存储和处理时,其数据必须以文件的形式进行组织,所选用的文件格式必须得到操作系统和应用软件的支持。
.Wave文件(.WAV)。Microsoft公司的音频文件格式,它来源于对声音模拟波形的采样。用不同的采样频率对声音的模拟波形进行采样可以得到一系列离散的采样点,以不同的量化位数(8位或16位)把这些采样点的值转换成二进制数,然后存入磁盘,这就产生了声音的WAV文件,即波形文件。利用该格式记录的声音文件能够和原声基本一致,质量非常高,但文件数据量大。
.Module文件(.MOD)。该格式的文件里存放乐谱和乐曲使用的各种音色样本,具有回放效果明确,音色种类无限等优点。
.MPEG文件(.MP3)。现在最流行的声音文件格式,因其压缩率大,在网络、可视电话、通信方面应用广泛,但与CD唱片相比,音质不能令人非常满意。
.RealAudio文件(.RA)。该格式文件具有强大的压缩量和极小的失真,它也是为了解决网络传输带宽资源而设计的,因此主要目标是压缩比和容错性,其次才是音质。
.MIDI文件(.MID/.RMI)。它是目前较成熟的音乐格式,实际上已经成为一种产业标准。MIDI文件是一种描述性的“音乐语言”,包括音符、控制参数等指令,指示MIDI设备要做什么、怎么做。例如将所要演奏的乐曲信息用数据进行描述,即演奏哪个音符、加什么伴奏、多大音量等。由于MIDI文件不包含波形数据,因此MIDI文件非常小巧。RMI格式文件可以包括图片标记和文本。
.Voice文件(.VOC)。Creative公司波形音频文件格式,也是声霸卡(sound blaster)使用的音频文件格式。每个VOC文件由文件头块(header block)和音频数据块(data block)组成。文件头包含一个标识版本号和一个指向数据块起始的指针。数据块分成各种类型的子块。
.Sound文件(.SND)。NeXT Computer公司推出的数字声音文件格式,支持压缩。
.Audio文件(.AU)。Sun Microsystems公司推出的一种经过压缩的数字声音文件格式,是因特网上常用的声音文件格式。
.AIFF文件(.AIF)。Apple计算机的音频文件格式。Windows的Convert工具可以把AIF格式的文件转换成Microsoft的WAV格式的文件。
.CMF文件(.CMF)。Creative公司的专用音乐格式,与MIDI差不多,音色、效果上有些特色,专用于FM声卡,但其兼容性很差。
基本参数
(1)计划工作量的预算费用(Budgeted Cost for work Scheduled, BCWS):指项目实施过程中某阶段计划要求完成的工作量所需的预算工时(或费用)。计算公式为:
BCWS=计划工作量×预算定额
BCWS主要是反映进度计划应当完成的工作量,而不是反映应消耗的工时或费用。BCWS有时也称为PV(Planned Value)。
(2)已完成工作量的实际费用(Actual Cost for Work Performed, ACWP):项目实施过程中某阶段实际完成的工作量所消耗的工时(或费用)。ACWP主要反映项目执行的实际消耗指标,有时也简称为AC。
(3)已完成工作量的预算成本(Budgeted Cost for Work Performed, BCWP):项目实施过程中某阶段实际完成工作量及按预算定额计算出来的工时(或费用),即挣值(Earned Value, EV)。BCWP的计算公式为:
BCWP=已完成工作量×预算定额
(4)剩余工作的成本(Estimate to Completion, ETC):完成项目剩余工作预计还需要花费的成本。ETC用于预测项目完工所需要花费的成本,其计算公式为:
ETC=BCWS-BCWP=PV-EV或ETC=剩余工作的PV×AC/EV
信号
任务间同步的另一种方式是异步信号。在两个任务之间,可以通过相互发送信号的方式,来协调它们之间的运行步调。
所谓的信号,指的是系统给任务的一个指示,表明某个异步事件已经发生了。该事件可能来自于外部(如其他的任务、硬件或定时器),也可能来自于内部(如执行指令出错)。异步信号管理允许任务定义一个异步信号服务例程ASR(Asynchronous Signal Routine),与中断服务程序不同的是,ASR是与特定的任务相对应的。当一个任务正在运行的时候,如果它收到了一个信号,将暂停执行当前的指令,转而切换到相应的信号服务例程去运行。不过这种切换不是任务之间的切换,因为信号服务例程通常还是在当前任务的上下文环境中运行的。
信号机制与中断处理机制非常相似,但又各有不同。它们的相同点是:
.都具有中断性:在处理中断和异步信号时,都要暂时地中断当前任务的运行;
.都有相应的服务程序;
.都可以屏蔽响应:外部硬件中断可以通过相应的寄存器操作来屏蔽,任务也能够选择不对异步信号进行响应。
信号机制与中断机制的不同点是:
.中断是由硬件或特定的指令产生,而信号是由系统调用产生;
.中断触发后,硬件会根据中断向量找到相应的处理程序去执行;而信号则通过发送信号的系统调用来触发,但系统不一定马上对它进行处理;
.中断处理程序是在系统内核的上下文中运行,是全局的;而信号处理程序是在相关任务的上下文中运行,是任务的一个组成部分。
实时系统中不同的任务经常需要互斥地访问共享资源。当任务试图访问资源时被正使用该资源的其他任务阻塞,可能出现优先级反转的现象,即当高优先级任务企图访问已被某低优先级任务占有的共享资源时,高优先级任务必须等待直到低优先级任务释放它占有的资源。如果该低优先级任务又被一个或多个中等优先级任务阻塞,问题就更加严重。由于低优先级任务得不到执行就不能访问资源、释放资源。于是低优先级任务就以一个不确定的时间阻塞高优先级的任务,导致系统的实时性没有保障。下图为是一个优先级反转的示例。
一个优先级反转的示例
如上图所示,系统存在任务1、任务2、任务3(优先级从高到低排列)和资源R。某时,任务1和任务2都被阻塞,任务3运行且占用资源R。一段时间后,任务1和任务2相继就绪,任务1抢占任务3运行,由于申请资源R失败任务1被挂起。由于任务2的优先级高于任务3,任务2运行。由于任务3不能运行和释放资源R,因此任务1一直被阻塞。极端情况下,任务1永远无法运行,处于饿死状态。
解决优先级反转问题的常用算法有优先级继承和优先级天花板。
优先级继承协议
L. Sha、R. Rajkumar和J. P. Lehoczky针对资源访问控制提出了优先级继承协议(Priority Inheritance Protocol,PIP)。
PIP协议能与任何优先级驱动的抢占式调度算法配合使用,而且不需要有关任务访问资源情况的先验知识。优先级继承协议的执行方式是:当低优先级任务正在使用资源,高优先级任务抢占执行后也要访问该资源时,低优先级任务将提升自身的优先级到高优先级任务的级别,保证低优先级任务继续使用当前资源,以尽快完成访问,尽快释放占用的资源。这样就使高优先级任务得以执行,从而减少高优先级任务被多个低优先级任务阻塞的时间。低优先级任务在运行中,继承了高优先级任务的优先级,所以该协议被称作优先级继承协议。
由于只有高优先级任务访问正被低优先级任务使用的资源时,优先级继承才会发生,在此之前,高优先级任务能够抢占低优先级任务并执行,所以优先级继承协议不能防止死锁,而且阻塞是可以传递的,会形成链式阻塞。另外,优先级继承协议不能将任务所经历的阻塞时间减少到尽可能小的某个范围内。最坏情况下,一个需要μ个资源,并且与v个低优先级任务冲突的任务可能被阻塞min(μ,v)次。
优先级冲顶协议
J. B. Goodenough和L. Sha针对资源访问控制提出了优先级冲顶协议(Priority Ceiling Protocol,PCP)。
PCP协议扩展了PIP协议,能防止死锁和减少高优先级任务经历的阻塞时间。该协议假设所有任务分配的优先级都是固定的,每个任务需要的资源在执行前就已确定。每个资源都具有优先级冲顶值,等于所有访问该资源的任务中具有的最高优先级。任一时刻,当前系统冲顶值(current priority ceiling)等于所有正被使用资源具有的最高冲顶值。如果当前没有资源被访问,则当前系统冲顶值等于一个不存在的最小优先级。当任务试图访问一个资源时,只有其优先级高于当前系统冲顶值,或其未释放资源的冲顶值等于当前系统冲顶值才能获得资源,否则会被阻塞。而造成阻塞的低优先级任务将继承该高优先级任务的优先级。
已经证明,PCP协议的执行规则能防止死锁,但其代价是高优先级任务可能会经历优先级冲顶阻塞(Priority ceiling blocking)。即高优先级任务可能被一个正使用某资源的低优先级任务阻塞,而该资源并不是高优先级任务请求的。这种阻塞又被称作回避阻塞(avoidance blocking),意思是因为回避死锁而引起的阻塞。即使如此,在PCP协议下,每个高优先级任务至多被低优先级任务阻塞一次。使用PCP协议后,能静态分析和确定任务之间的资源竞争,计算出任务可能经历的最大阻塞时间,从而能分析任务集合的可调度性。在PCP协议下,高优先级任务被阻塞时会放弃处理器,因此,访问共享资源的任务可能会产生4次现场切换。