怎么检测声音频率和幅值_声音与听觉系列知识 Part 2—音高&响度与音色

本文介绍了声音的三个基本特征——音高、响度和音色。音高与频率相关,响度是主观的响度感知,与声音强度和频率成分有关,音色则涉及谐波成分和动态特性。文章详细探讨了这些概念,并通过实验和实例阐述了人耳如何感知这些声音特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上一次为大家讲解了人耳的构造与听觉之间的关系,本期将继续沿着知识图谱的脉络,为大家介绍声音的几个基本术语:音高(Pitch)、响度(Loudness)和音色(Timbre)。

f49eb590353b6f98437f299e6f139767.png

1.音高

几乎所有的声音特征都可以用音高、响度和音色来描述。

简单来说:Pitch = 声音的频率。

例如,十二平均律里的中央C的频率为261.6Hz。

实际上,人感知到的音高是人耳对频率的响应。上一期(关注本公众号可以找到上一期的内容)我们讲解过耳蜗对音高的解析,即部位学说(Place theory):耳蜗本身为一整体的共振器,每一个音高在基底膜上具有一定的共振部位,音高的区别取决于基底膜的最大振动部位,低音引起顶部基底膜的较长纤维的振动,高音引起底部基底膜的较短纤维的振动。如下图所示。

4b0c2451d776881b90db6dc9e728ce95.png

部位学说模型可以很好的解释感知到的两个不同音调之间的相对音高,但不能解释绝对音感现象(Perfect Pitch)。

绝对音感是指不需借助标准音高器械(例如乐器)就能准确识别或唱出音符的能力。大多数人都只能分辨出两个音高之间的区别(音程),但是分不出某个独立的音调的音高。

有学者曾经提出,只有不到0.01%的人具有绝对音感,而超过98%的人都能在没有色彩标准的情况下准确识别颜色。这样的数据对比,是不是更让人觉得声品质很玄呢?

尽管一般情况下我们可以简单的认为音高就是频率,但有些时候,即使听到的是一个恒定频率的声音,我们的耳朵也会感觉声音的音高在变化。比如:对于一个强度缓慢增加的高频声音(>2kHz),我们听上去会觉得它的音高在上升;如果它的频率是低于2kHz的,同样是缓慢增加强度,我们却会感觉它的音高在下降。有学者做过实验:1个6kHz的纯音,强度从60上升到90分贝,人耳感知其音高上升30音分左右(在以后的系列知识中我们会介绍分贝、音分等概念);1个200Hz的纯音,强度从60上升到90分贝,人耳感知其音高下降20音分左右。大家可以试听下面两个音频,看是否有这种现象。万一,您就是0.01%里的有超能力的人呢?

2. 响度

关于响度,首先要大家明确的是,响度并不等于声音的强度。响度是一个主观感知相关的概念,描述的是人耳感知到的声音的大小,虽然它与声音的强度强相关,但是不能在二者之间划等号。人耳感知到的响度跟声音里包含的频率成分有关系,如果频率能激起基底膜的共振,感知到的声音就大一些。这就是为什么等响度曲线是曲线而不是直线的原因了。

同时,我们使用分贝这个概念,也是因为人耳的生理结构。人耳对声音强度响应的倍数是10的幂,或者说是对数关系。用分贝来表述声音量级的真正原因你get到了吗?

在C语言中,计算声音响度通常会涉及到两个基本的物理概念:频率(pitch,音高度(amplitude,声压级)。一个简单的响度模型可以基于贝尔实验室的Sone单位,它结合了频率信息。下面是一个简化的示例,假设我们已经有了单声道的频率(Hz)度(例如归一化到0-1范围内的浮点数): ```c #include <stdio.h> #include <math.h> // 响度计算函数,这里采用了一个简单的线性映射公式 float loudness(float frequency, float amplitude) { // 振动次数每秒(Hz)最大声强比(dB) const double max_sone_ratio = pow(10, 5); // 通常认为人耳能感知的最高声压级约为94 dB SPL // 频率部分转换,这里假设频率越高对响度影响越大(实际可能需要考虑人耳听觉特性) float frequency_weighted = log10(frequency); // 度部分转换为分贝(SPL) float amplitude_db = 20 * log10(amplitude); // 对于非对数音频信号,需先转换到对数表示 // 计算总响度 float sone = frequency_weighted + amplitude_db / max_sone_ratio; return sone; } int main() { // 示例频率度 float frequency = 440; // 中音A的频率 float amplitude = 0.8; // 假设的度 float calculated_loudness = loudness(frequency, amplitude); printf("计算出的声音响度(Sone): %.2f\n", calculated_loudness); return 0; } ``` 这个例子提供了一个基础的计算模型,实际情况中,响度计算可能需要更复杂的算法,比如引入A-weighting或其他心理声学模型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值