Opus从入门到精通(七)Opus编码基础之认识声音

简介: 前面我们分析完Opus的编解码api使用,封装原理等,接下来我们准备分析Opus编码原理.Opus编码是一个复杂的工作,我们需要做一些基本铺垫,包括认识声音,压缩编码基础.认识音频有助于我们了解音频特征,不仅对语音有助于我们理解编码技术,同时在语音识别,TTS等场景提供帮助

image.png


前面我们分析完Opus的编解码api使用,封装原理等,接下来我们准备分析Opus编码原理.Opus编码是一个复杂的工作,我们需要做一些基本铺垫,包括认识声音,压缩编码基础. 认识音频有助于我们了解音频特征,不仅对语音有助于我们理解编码技术,同时在语音识别,TTS等场景提供帮助


音频信号及其心里特征


人类能够感知客观世界的两个重要途径就是听觉和视觉,而听觉所感受到的信息就是声音.声音是一种波,其本质是机械振动或气流扰动引起周围弹性媒介发生波动饿现象.声波可以在空气中传播,也可以在液体和固体中传播.


声压级


为了定量描述声音的强弱,人们采用了多种描述方式,其中声压和声压级就是其中的两种形式.声压用P来表示,它是指在声场中某处由声波引起的压强的变化值,单位是“帕斯卡”(Pa)。当然声压越大,声音也就越大。但是人耳对声音强弱的感觉与声压的大小并非成线性关系,而是大体上与声压有效值的对数成正比。为了适应人类听觉的这一特性,将声压的有效值取对数来表示声音的强弱,这种表示方式称为声压级,用SPL表示,单位是“分贝”(dB).它们的表达式如下: image.png


在上式中,Prms是计量点的声压有效值,Pref是人为定义的零声压级的参考声压值,国际协议规定 Pref=2乘以10的负5次Pa(帕),这个值是一般具有正常听力的年轻人对 1 kHz的单一频率信号(称为简谐音)刚刚能察觉到它的存在时的声压值。 在电声工程中通常用声级计来测量声压级的大小。 应该注意的是,无论是声压还是声压级都属于客观物理量,它们都是对客观事物的真实描述。


人对于声音频率的感觉表现为音调的高低,在音乐中简称音高。 音高与声音频率的关系也大体上呈对数关系。实际上音乐里的音阶就是按频率的对数取等分来确定的。 在音乐中每增高或降低一个八度音,其声音的频率就升高或降低一倍,十二平分律等程音阶正是在一个倍频程的频率范围内按频率的对数分成十二个等份划分音阶的,其中相邻的两个音阶称为一个半音,相隔的一个音称为一个全音。


人类的听觉特征决定了人对同样强度,但不同频率的声音主观感觉的强弱是不同的,即人类听觉的频率响应不是平直的。 对于高于20 kHz和低于20Hz的声音,无论其强度多高,一般人都不会听到。因此可以认为20 Hz~20 kHz是人类的听觉频带,而20Hz~20kHz的信号称为“音频信号”,高于20kHz的声音称为超音,低于20Hz的声音称为次音


此外在音频范围内,人对相同声压级而不同频率声音的敏感程度也不同,人耳对3kHz~5kHz的声音信号比高频和低频声音信号更敏感,也就是说,幅度(声压级)很低的中频信号都能被人耳听到,而低音或高音信号能被人耳听到的幅度要高得多。因此,为了更全面地表示人类的听觉频响特性,人们又定义了响度级这个主观物理量,单位用“方”(Phon)表示,响度级数是以1 kHz信号的声压级数定义的。对应同一响度级上的不同频率信号所对应的声压级也不同,但对人耳来说其声响的程度是相等的,因此将这些具有等响度的不同频率的点连接起来构成的一条条曲线被称为等响度曲线,如图所示。这些曲线是对大量具有正常听力的年青人进行大量测量并取其平均值得到的.


image.png

image.png


  1. 曲线0代表可听阈。低于此线之下不可闻。
  2. 响度级低时,各频率声压级相差很大。可差50dB以上。
  3. 当响度级别较高时,等响曲线近似水平(高保真放声在高声时,高低音都丰厚)。
  4. 在高频段曲线间隔相同,说明声压级变化时,响度级变化几乎相同。在低频段等响曲线间隔小,等响曲线对声压变化很灵敏。如80Hz,声压从60dB~80 dB,响度从30~70方。 响度级只反映不同频率的声音的等响感觉,不能表示一个声音比另一个声音响多少倍的主观感觉。响度级为0方的等响度曲线一下的声音一般为听不见的,因此该曲线可称为闻阈或绝对听阈,它是重要的心理学声学模型之一,也是音频信号压缩的重要依据.当声音响度超过120方时,人耳会感到痛痒,因此120方的等响度曲线可称为痛阈.


响度:是描述声音大小的主观感觉量,响度的单位是"宋"(sone)。


定义:1000Hz纯音,声压级为40 dB时的响度为1宋;2宋的声音是40方声音响度的2倍;4宋为40方声音响度的4倍。多次人平均,响度级每增10方,响度增加一倍。也就是说,声压级增加10dB, 响度增加一倍。如:10把小提琴同时演奏,比一把声强增加10倍,相应声压级增加10 dB,响度级也增加了10方,而主观响度只增加1倍。 人耳对响度的感觉随声压级变化。声压级低时,分辨率差;声压级高,分辨率提高。声压级在50dB以上,人耳的声压、响度变化最小,大约1dB。 小于40 dB时,声压级要1~3dB以上才觉察出来。一个乐队演奏时,假如低、高音都以100 dB的声压级录音,此时等响线曲差不多平直,低高音听起来有差不多的响度。如果重放时声压级较低,假如50dB,这时50Hz的低音刚能听到,而1000Hz的声音却有50dB,高音也同时听上去很弱,结果原有的音色都改变了。这时要想让50Hz的声音听起来与1000Hz的声音有大致相同的响度,必须将其提升20 dB左右。因此声音以低于原始声(录音时)的声压级重放,必须通过均衡器(Equalizer)来提升低音和高音以保持原有音色平衡。


掩蔽效应


实验证明,声场中的一个强音能掩蔽与之同时发生的附近频率的弱音,这种现象称为掩蔽效应.也就是说,一种声音的出现可能是另一种声音难于听清.例如,在声场中有一个1kHz的简谐音,如果此时有一个1.1kHz而幅值比前者低18dB(分贝)的简谐音,则人们只能听到1kHz的声音.


掩蔽效应是另一个重要的心理声学模型,它与绝对听阈相呼应,在音频数据压缩中起到了重要作用.下图描述了频率为1kHz,声压级为60dB的声音信号对其他频率信号的掩蔽效应曲线.图中的虚线为音频信号的绝对听阈曲线.从图中可以可出1kHz附近信号的绝对听阈被这1kHz的强音改变成了尖锋状,也就是说,此时1kHz附近频率的信号的幅值必须高于尖峰状曲线所对应的分贝值时才能被人耳察觉.


image.png

image.png


动态范围是衡量声音强度变化的重要参数,它是指某个声音的最强音与最弱音的强度差,并用分贝(dB)表示.在音乐中,动态范围小则给人以平淡,枯燥的感觉,而动态范围大则给人以生动,细腻,表现力强的感受.


为了记录,分析,处理声音信息,人们采用拾音器设备(麦克风)进行声-电转换,以实现将声音信号转换为电信号的目的.与此相反为了将音频电信号还原和重放,人们又采用了扩音设备(如放大器,扬声器等)进行电-声转换,以实现将电信号转换为声音信号的目的.


声音的周期性


声音可以分为周期信号与非周期信号两大类.根据傅里叶(Fourier)变换原理,周期信号可以用傅氏级数的形式表示,即该种信号可以分解成按傅氏级数规律排列的一系列单一频率信号(称为简谐波)的组合.它所对应的频谱为线状频谱,这种声音信号又称为有调音,如下图所示:


image.png


非周期信号可以用傅氏积分表示,该种信号包含一定频带的所有频率分量.因此它所对应的频谱为连续频率,如下图所示.因此可见,同一音频信号即可以在时间域中描述,也可以在频率与中表述,不同的域有不同的的特点,这有助于对信号的研究与处理.


image.png


image.png

目录
相关文章
|
存储 编解码 安全
Opus从入门到精通(二):编解码器使用
opus_encoder_get_size()返回编码器状态要求的大小。注意,这段代码的未来版本可能改变大小,所以没有assuptions应该对它做出。编码器状态在内存中总是连续,复制它只要一个浅拷贝就足够了。使用opus_encoder_ctl()接口可以改变一些编码器的参数设置。所有这些参数都已有缺省值,所以只在必要的情况下改变它们。
1332 0
|
1月前
|
编解码 语音技术 内存技术
FFmpeg开发笔记(五十八)把32位采样的MP3转换为16位的PCM音频
《FFmpeg开发实战:从零基础到短视频上线》一书中的“5.1.2 把音频流保存为PCM文件”章节介绍了将媒体文件中的音频流转换为原始PCM音频的方法。示例代码直接保存解码后的PCM数据,保留了原始音频的采样频率、声道数量和采样位数。但在实际应用中,有时需要特定规格的PCM音频。例如,某些语音识别引擎仅接受16位PCM数据,而标准MP3音频通常采用32位采样,因此需将32位MP3音频转换为16位PCM音频。
55 0
FFmpeg开发笔记(五十八)把32位采样的MP3转换为16位的PCM音频
|
5月前
|
编解码 API 开发工具
程序与技术分享:AAC音频格式详解
程序与技术分享:AAC音频格式详解
|
6月前
|
人工智能 算法 物联网
声音的变奏:深入理解ffmpeg音频格式转换的奥秘与应用(二)
声音的变奏:深入理解ffmpeg音频格式转换的奥秘与应用
170 0
|
6月前
|
存储 编解码 算法
声音的变奏:深入理解ffmpeg音频格式转换的奥秘与应用(一)
声音的变奏:深入理解ffmpeg音频格式转换的奥秘与应用
286 0
|
机器学习/深度学习 存储 编解码
Opus从入门到精通(八)Opus编码基础之压缩编码
莫尔斯码就是大家熟悉的电报码,它的发明为人类做出了巨大的贡献.该码采用"."和"-"来表示26个英文字母,这实质上还是二进制码(点为"0",而杠为"1"),但是它没有采用固定字长的编码方式,而是采用了常用字母用短码表示(如E用"."表示,T用"-"表示),不常用字母用长码表示(如Z用"--.."表示,j用"-..-"表示)的变长编码方式.通过对英文单词进行大量统计,找出各字母的概率,最后确定有12个字母出现概率最低,用4bit数字表示,有8个字母出现概率较低,用3bit数字表示;有4个字母出现概率较高,用2bit数字表示;有两个字母出现概率最高,用1bit表示,共26个字母.
588 0
|
编解码 内存技术
Opus从入门到精通(四)Opus解码程序实现
由于我们解码后的数据直接写入文件,无法通过vlc等播放器播放,我们通过lame将解码后的数据再编码成mp3,当然,你要乐意也可以直接价格wav头输出成wav. 通过采样率,声道数等创建lame编码器
665 0
|
存储 编解码 缓存
Opus从入门到精通(三)手撸一个Opus编码程序
PCM数据大小怎么计算呢?根据采样率采样格式,声道数计算.根据前面文章音视频之音频知识入门介绍:PCM文件大小 = 采样率 * 采样格式 * 声道数 * 录制时长采样率即一秒多少采样,采样格式指一个采用占多少字节,通常一个采用使用一个字节或者两个字节,所以采样率*采样格式计算出一秒钟一个声道PCM多少字节,乘以声道数,算出一秒钟PCM大小,再乘以时长就可以计算出PCM文件大小.
558 0
|
存储 缓存 安全
为什么你的Opus编码出来的数据有杂音(解决Android平台架构问题)
Gradle插件分为脚本插件和对象插件,脚本插件就是在普通的gradle中写一系列task,然后在别的gradle构建脚本中通过 apply from: 'xx.gradle' 引用这个脚本插件,下面主要介绍一下对象插件对象插件是指实现了org.gradle.api.Plugin接口的类。并且需要实现void apply(T target)这个方法,该方法中的泛型指的是此Plugin可以应用到的对象,而我们通常是将其应用到Project对象上。 编写对象插件常见创建方式
493 0