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

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

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

音频信号及其心里特征

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

声压级

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

在上式中,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信号的声压级数定义的。对应同一响度级上的不同频率信号所对应的声压级也不同,但对人耳来说其声响的程度是相等的,因此将这些具有等响度的不同频率的点连接起来构成的一条条曲线被称为等响度曲线,如图所示。这些曲线是对大量具有正常听力的年青人进行大量测量并取其平均值得到的.

在这里插入图片描述

在这里插入图片描述

  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附近频率的信号的幅值必须高于尖峰状曲线所对应的分贝值时才能被人耳察觉.

在这里插入图片描述

在这里插入图片描述

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

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

声音的周期性

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

在这里插入图片描述

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

在这里插入图片描述

  • 20
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Opus 是一种开源音频编解码器,适用于音频流传输和储存。以下是 Opus 编码和解码的示例代码: 编码: ```c #include <opus/opus.h> int main() { int error; OpusEncoder *encoder; int32_t sample_rate = 48000; int channels = 2; int application = OPUS_APPLICATION_AUDIO; int max_payload_bytes = 4000; encoder = opus_encoder_create(sample_rate, channels, application, &error); if (error != OPUS_OK) { fprintf(stderr, "failed to create encoder: %s\n", opus_strerror(error)); return -1; } error = opus_encoder_ctl(encoder, OPUS_SET_MAX_PAYLOAD_BYTES(max_payload_bytes)); if (error != OPUS_OK) { fprintf(stderr, "failed to set max payload bytes: %s\n", opus_strerror(error)); return -1; } int16_t pcm_frame[960 * channels]; uint8_t compressed_frame[max_payload_bytes]; int compressed_size; /* read a frame of audio data from somewhere */ while (1) { /* encode the frame */ compressed_size = opus_encode(encoder, pcm_frame, 960, compressed_frame, max_payload_bytes); if (compressed_size < 0) { fprintf(stderr, "opus_encode failed: %s\n", opus_strerror(compressed_size)); return -1; } /* send the compressed data over the network */ send_data_to_network(compressed_frame, compressed_size); } opus_encoder_destroy(encoder); } ``` 解码: ```c #include <opus/opus.h> int main() { int error; OpusDecoder *decoder; int32_t sample_rate = 48000; int channels = 2; int max_payload_bytes = 4000; decoder = opus_decoder_create(sample_rate, channels, &error); if (error != OPUS_OK) { fprintf(stderr, "failed to create decoder: %s\n", opus_strerror(error)); return -1; } error = opus_decoder_ctl(decoder, OPUS_SET_MAX_PAYLOAD_BYTES(max_payload_bytes)); if (error != OPUS_OK) { fprintf(stderr, "failed to set max payload bytes: %s\n", opus_strerror(error)); return -1; } uint8_t compressed_frame[max_payload_bytes]; int compressed_size; int16_t pcm_frame[960 * channels]; int pcm_size; /* receive a compressed frame of audio data from the network */ while (1) { /* decode the frame */ pcm_size = opus_decode(decoder, compressed_frame, compressed_size, pcm_frame, 960, 0); if (pcm_size < 0) { fprintf(stderr, "opus_decode failed: %s\n", opus_strerror(pcm_size)); return -1; } /* play the decoded audio */ play_audio(pcm_frame, pcm_size); } opus_decoder_destroy(decoder); } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

轻口味

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值