免费智能真题库 > 历年试卷 > 程序员 > 2009年上半年 程序员 上午试卷 综合知识
  第12题      
  知识点:   声音信号   声音信号的数字化   编码   采样   声音   信号
  关键词:   编码   采样   声音   数字化   信号        章/节:   多媒体基础知识       

 
声音信号的数字化过程包括采样、(12)和编码
 
 
  A.  合成
 
  B.  去噪
 
  C.  量化
 
  D.  压缩
 
 
 

  相关试题:音频          更多>  
 
  第12题    2019年下半年  
   31%
(12)是音频文件的扩展名。
  第14题    2016年上半年  
   73%
数字话音的采样频率定义为8kHz,这是因为(14)。
  第12题    2018年下半年  
   46%
以数字表示的声音在时间上是离散的,而模拟声音在时间上是连续的。要把模拟声音转换为数字声音,就需在某些特定的时刻获取模拟声..
   知识点讲解    
   · 声音信号    · 声音信号的数字化    · 编码    · 采样    · 声音    · 信号
 
       声音信号
        声音是通过空气传播的一种连续的波,称为声波。声波在时间和幅度上都是连续的模拟信号,通常称为模拟声音(音频)信号。
        1)声音的3个指标
        声音主要有音量、音调和音色3个指标。
        .音量(也称响度):声音的强弱程度取决于声音波形的幅度,即取决于振幅的大小和强弱。
        .音调:人对声音频率的感觉表现为音调的高低,取决于声波的基频。基频越低,给人的感觉越低沉,频率高则声音尖锐。
        .音色:人们能够分辨具有相同音高的不同乐器发出的声音,就是因为它们具有不同的音色。一个声波上的谐波越丰富,音色越好。
        2)声音信号的带宽
        对声音信号的分析表明,声音信号由许多频率不同的信号组成,通常称为复合信号,而把单一频率的信号称为分量信号。声音信号的一个重要参数就是带宽(bandwidth),它用来描述组成声音信号的频率范围。PC处理的音频信号主要是人耳能听到的音频信号(audio),它的频率范围是20~20kHz。可听声包括如下内容。
        .话音(也称语音):人的说话声,频率范围通常为300~3400Hz。
        .音乐:由乐器演奏形成(规范的符号化声音),其带宽可达到20~20kHz。
        .其他声音:如风声、雨声、鸟叫声、汽车鸣笛声等,它们起着效果声或噪声的作用,其带宽范围也是20Hz~20kHz。
        3)幅度和频率
        声音信号的两个基本参数是幅度和频率。幅度是指声波的振幅,通常用动态范围表示,一般用分贝(dB)为单位来计量。频率是指声波每秒钟变化的次数,用Hz表示。
 
       声音信号的数字化
        声音信号的数字化即用二进制数字的编码形式来表示声音。最基本的声音信号数字化方法是采样一量化法,可以分成以下3个步骤。
        1)采样
        采样是把时间连续的模拟信号转换成时间离散、幅度连续的信号。在某些特定时刻获取的声音信号幅值叫作采样,由这些特定时刻采样得到的信号称为离散时间信号。一般是每隔相等的一小段时间采样一次,其时间间隔称为采样周期,它的倒数称为采样频率。为了不产生失真,采样频率不应低于声音信号最高频率的二分之一。因此,语音信号的采样频率一般为8kHz,音乐信号的采样频率则应在40kHz以上。采样频率越高,可恢复的声音信号分量越丰富,其声音的保真度越好。
        2)量化
        量化处理是把在幅度上连续取值(模拟量)的每一个样本转换为离散值(数字量)表示,因此量化过程有时也称为A/D转换(模数转换)。量化后的样本是用二进制数来表示的,二进制数位数的多少反映了度量声音波形幅度的精度,称为量化精度,也称为量化分辨率。例如,每个声音样本若用16位(2B)表示,则声音样本的取值范围是0~65 536;精度是1/65 536;若只用8位(1B)表示,则样本的取值范围是0~255,精度是1/256。量化精度越高,声音的质量越好,需要的存储空间也越多;量化精度越低,声音的质量越差,而需要的存储空间越少。
        3)编码
        为了便于计算机的存储、处理和传输,按照一定的要求对采样和量化处理后的声音信号进行数据压缩和编码,即选择某一种或者几种方法对它进行数据压缩,以减少数据量,再按照某种规定的格式将数据组织成为文件。
 
       编码
               编码过程
               在给定了软件设计规格说明书后,下一步的工作就是编写代码。一般来说,编码工作可以分为四个步骤:
               (1)确定源程序的标准格式,制订编程规范。
               (2)准备编程环境,包括软硬件平台的选择,包括操作系统、编程语言、集成开发环境等。
               (3)编写代码。
               (4)进行代码审查,以提高编码质量。为提高审查的效率,在代码审查前需要准备一份检查清单,并设定此次审查须找到的bug数量。在审查时,要检查软件规格说明书与编码内容是否一致;代码对硬件和操作系统资源的访问是否正确;中断控制模块是否正确等。
               编码准则
               在嵌入式系统中,由于资源有限,且实时性和可靠性要求较高,因此,在开发嵌入式软件时,要注意对执行时间、存储空间和开发/维护时间这三种资源的使用进行优化。也就是说,代码的执行速度要越快越好,系统占用的存储空间要越小越好,软件开发和维护的时间要越少越好。
               具体来说,在编写代码时,需要做到以下几点:
               .保持函数短小精悍。一个函数应该只实现一个功能,如果函数的代码过于复杂,将多个功能混杂在一起,就很难具备可靠性和可维护性。另外,要限制函数的长度,一般来说,一个函数的长度最好不要超过100行。
               .封装代码。将数据以及对其进行操作的代码封装在一个实体中,其他代码不能直接访问这些数据。例如,全局变量必须在使用该变量的函数或模块内定义。对代码进行封装的结果就是消除了代码之间的依赖性,提高了对象的内聚性,使封装后的代码对其他行为的依赖性较小。
               .消除冗余代码。例如,将一个变量赋给它自己,初始化或设置一个变量后却从不使用它,等等。研究表明,即使是无害的冗余也往往和程序的缺陷高度关联。
               .减少实时代码。实时代码不但容易出错、编写成本较高,而且调试成本可能更高。如果可能,最好将对执行时间要求严格的代码转移到一个单独的任务或者程序段中。
               .编写优雅流畅的代码。
               .遵守代码编写标准并借助检查工具。用自动检验工具寻找缺陷比人工调试便宜,而且能捕捉到通过传统测试检查不到的各种问题。
               编码技术
                      编程规范
                      在嵌入式软件开发过程中,遵守编程规范,养成良好的编程习惯,这是非常重要的,将直接影响到所编写代码的质量。
                      编程规范主要涉及的三方面内容:
                      .命名规则。从编译器的角度,一个合法的变量名由字母、数字和下画线三种字符组成,且第一个字符必须为字母或下画线。但是从程序员的角度,一个好的名字不仅要合法,还要载有足够的信息,做到“见名知意”,并且在语意清晰、不含歧义的前提下,尽可能地简短。
                      .编码格式。在程序布局时,要使用缩进规则,例如变量的定义和可执行语句要缩进一级,当函数的参数过长时,也要缩进。另外,括弧的使用要整齐配对,要善于使用空格和空行来美化代码。例如,在二元运算符与其运算对象之间,要留有空格;在变量定义和代码之间要留有空行;在不同功能的代码段之间也要用空行隔开。
                      .注释的书写。注释的典型内容包括:函数的功能描述;设计过程中的决策,如数据结构和算法的选择;错误的处理方式;复杂代码的设计思想等。在书写注释时要注意,注释的内容应该与相应的代码保持一致,同时要避免不必要的注释,过犹不及。
                      性能优化
                      由于嵌入式系统对实时性的要求较高,因此一般要求对代码的性能进行优化,使代码的执行速度越快越好。以算术运算为例,在编写代码时,需要仔细地选择和使用算术运算符。一般来说,整数的算术运算最快,其次是带有硬件支持的浮点运算,而用软件来实现的浮点运算是非常慢的。因此,在编码时要遵守以下准则:
                      .尽量使用整数(char、short、int和long)的加法和减法。
                      .如果没有硬件支持,尽量避免使用乘法。
                      .尽量避免使用除法。
                      .如果没有硬件支持,尽量避免使用浮点数。
                      下图是一个例子,其中两段代码的功能完全一样,都是对一个结构体数组的各个元素进行初始化,但采用两种不同的方法来实现。下图(a)采用数组下标的方法,在定位第i个数组元素时,需要将i乘以结构体元素的大小,再加上数组的起始地址。下图(b)采用的是指针访问的方法,先把指针fp初始化为数组的起始地址,然后每访问完一个数组元素,就把fp加1,指向下一个元素。在一个奔腾4的PC上,将这两段代码分别重复10 700次,右边这段代码需要1ms,而左边这段代码需要2.13ms。
                      
                      算术运算性能优化的例子
 
       采样
        采样是指每隔一定时间间隔,取模拟信号的当前值作为样本,该样本代表了模拟信号在某一时刻的瞬时值。这样,就变连续的模拟信息为离散信号。采样技术依据奈奎斯特取样定理:如果采样速率大于模拟信号最高频率的2倍,则可以用得到的样本空间恢复原来的模拟信号。
 
       声音
               声音信号的数字化
               声音信号是一种模拟信号,计算机要对它进行处理,必须将它转换成为数字声音信号,即用二进制数字的编码形式来表示声音。最基本的声音信号数字化方法是取样-量化法,它有采样、量化和编码三个步骤。
               (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声卡,但其兼容性很差。
 
       信号
        任务间同步的另一种方式是异步信号。在两个任务之间,可以通过相互发送信号的方式,来协调它们之间的运行步调。
        所谓的信号,指的是系统给任务的一个指示,表明某个异步事件已经发生了。该事件可能来自于外部(如其他的任务、硬件或定时器),也可能来自于内部(如执行指令出错)。异步信号管理允许任务定义一个异步信号服务例程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次现场切换。
   题号导航      2009年上半年 程序员 上午试卷 综合知识   本试卷我的完整做题情况  
1 /
2 /
3 /
4 /
5 /
6 /
7 /
8 /
9 /
10 /
11 /
12 /
13 /
14 /
15 /
 
16 /
17 /
18 /
19 /
20 /
21 /
22 /
23 /
24 /
25 /
26 /
27 /
28 /
29 /
30 /
 
31 /
32 /
33 /
34 /
35 /
36 /
37 /
38 /
39 /
40 /
41 /
42 /
43 /
44 /
45 /
 
46 /
47 /
48 /
49 /
50 /
51 /
52 /
53 /
54 /
55 /
56 /
57 /
58 /
59 /
60 /
 
61 /
62 /
63 /
64 /
65 /
66 /
67 /
68 /
69 /
70 /
71 /
72 /
73 /
74 /
75 /
 
第12题    在手机中做本题