音高与频率:声音的物理与数学起源
当两个音符同时响起,有时会产生令人心醉的共鸣,有时却引发刺耳的烦躁。这种差异并非偶然,而是深深植根于声音的物理本质与数学结构之中。从毕达哥拉斯在琴弦上发现的简单比例,到现代声学中对频率的精确测量,音乐与数学的对话贯穿了整个文明史。本章将深入声音的物理起源,建立频率、波长与音高之间的精确数学关系,揭示古老和谐原理背后的科学基础,并展示如何用现代计算工具量化与可视化这些抽象概念,为理解音乐深层的数学结构奠定基石。
声音的物理本质:振动、频率与波长
声音的本质是振动在介质中的传播。当物体振动时,它会推动周围的空气分子,形成疏密相间的波,即声波。人耳感知到的音高(pitch)主要由声波的频率(frequency) 决定,即每秒振动的次数,单位为赫兹(Hz)。例如,标准音高A4(国际标准音)的频率为440 Hz,意味着其声源每秒完成440次完整振动。
频率与波长(wavelength,λ)和波速(v)之间存在基本物理关系: $$v = f \lambda$$ 在空气中,声速约343 m/s(20°C时)。因此,频率越高,波长越短。440 Hz的A4音,其波长约为: $$\lambda = \frac{v}{f} = \frac{343}{440} \approx 0.78 \, \text{米}$$ 这解释了为什么低音(如贝斯)需要更大的扬声器来有效辐射声波——其波长可达数米。
人耳的频率感知范围通常为20 Hz至20,000 Hz,但随年龄、健康状况和环境暴露而异。值得注意的是,人耳对频率的感知并非线性,而是近似对数关系:频率翻倍时,人耳感知的音高升高一个八度(octave)。例如,A4(440 Hz)的八度上方A5为880 Hz,下方A3为220 Hz。这种对数感知是音乐理论中采用对数标度(如音分)量化音高差异的生理学基础。
音高、频率与心理声学
尽管音高主要由基频决定,但人耳感知还受响度(loudness)、音色(timbre) 和时间特性影响。心理声学研究表明,即使基频缺失,人脑仍能根据泛音列结构“脑补”出缺失的音高,这称为残响音高(residue pitch)。例如,对一段仅包含200 Hz、300 Hz、400 Hz等整数倍频率的复杂声波(缺失100 Hz基频),听者仍会感知到100 Hz的音高。这揭示了音高感知的模式识别本质:大脑从谐波关系中提取基频。
毕达哥拉斯的发现:和谐的小数比
公元前6世纪,古希腊哲学家毕达哥拉斯(Pythagoras)在探索琴弦长度与音高关系时,发现了音乐和谐性的数学根源。传说他经过铁匠铺时,听到不同重量的锤子敲击铁砧发出悦耳或不和谐的声音,随后用单弦琴(monochord)实验验证:当琴弦长度成简单整数比时,同时弹拨产生和谐(consonance) 音程;反之则不和谐(dissonance)。
核心和谐比例
毕达哥拉斯 identified 三个核心和谐音程,均基于弦长比的倒数(因弦长越短频率越高):
| 音程 | 弦长比 | 频率比 | 现代音程名称 | 音分值 | |------|--------|--------|--------------|--------| | 八度 | 1:2 | 2:1 | Octave | 1200 | | 五度 | 2:3 | 3:2 | Perfect Fifth | 702 | | 四度 | 3:4 | 4:3 | Perfect Fourth | 498 |
关键洞察:这些比例均为简单整数比。例如,五度(3:2)表示较长弦振动3次时,较短弦振动2次,两振动周期每2:3同步一次,产生规律的拍频(beat)与和谐感。而不和谐音程(如小二度,频率比约16:15)的整数比复杂,振动不同步,产生不规则拍频与粗糙感。
毕达哥拉斯音阶的生成
毕达哥拉斯通过连续纯五度(3:2)相生构建音阶。从任意起点(如C)开始,连续向上叠加五度: C → G (3/2) → D (9/4) → A (27/8) → E (81/16) → B (243/32) 将这些频率归一化到同一八度内(除以2的幂),得到毕达哥拉斯律的各音频率比。例如,E的频率比为81/64 ≈ 1.2656,而现代十二平均律的大三度为$2^{4/12} \approx 1.2599$,存在微小差异,称为毕达哥拉斯 comma(约23.5音分),这种累积误差在西方音乐发展中催生了其他律制。
对数标度:音分(Cents)与音高差异的量化
人耳对音高差异的感知是对数的,因此音乐理论采用对数标度量化音高间隔。最常用单位是音分(cent),定义为一个八度(频率比2:1)的1200等分。两个频率$f_1$和$f_2$之间的音分差为: $$\text{cents} = 1200 \times \log_2\left(\frac{f_2}{f_1}\right)$$ 或使用常用对数: $$\text{cents} = 3986 \times \log_{10}\left(\frac{f_2}{f_1}\right)$$ (因$1200/\log_{10}2 \approx 3986.3$)
音分的意义
- **1音分**:人耳在理想条件下可察觉的最小音高差异(约0.06%频率变化),但实际演奏中通常需5-10音分才易察觉。
- **100音分**:等于一个**半音(semitone)**,如C到C#。
- **纯五度(3:2)**:计算其音分值:
$$\text{cents} = 1200 \times \log_2(1.5) \approx 702 \text{ cents}$$ 十二平均律的五度恰为700 cents(因$2^{7/12} \approx 1.4983$),两者相差约2 cents,称为毕达哥拉斯音差。
- **八度**:1200 cents,完美对应频率比2:1。
实践意义:音分标度使不同律制的音高偏差可直接比较。例如,纯律的大三度(频率比5:4)为: $$1200 \times \log_2(1.25) \approx 386 \text{ cents}$$ 而十二平均律的大三度为400 cents,相差14 cents,这种差异在和弦中产生独特的“色彩”。
泛音列:自然的声音密码
当乐器发声时,实际产生的是复合音(complex tone),包含基频及其整数倍频率的泛音(overtones) 或谐波(harmonics)。这些泛音的振幅和相位决定了音色。泛音列(harmonic series) 是理解音高组织与和谐原理的关键。
泛音列的数学结构
假设基频为$f$,则第$n$个泛音的频率为: $$f_n = n \times f \quad (n=1,2,3,\dots)$$ 其中$f_1 = f$为基频,$f_2$为第一泛音(二倍频),依此类推。
例如,以A2(110 Hz)为例,其泛音列前八项为:
| 泛音序号 | 频率 (Hz) | 音高(近似) | 与基频的音分值 | |----------|-----------|--------------|----------------| | 1 (基频) | 110.0 | A2 | 0 | | 2 | 220.0 | A3 | 1200 (八度) | | 3 | 330.0 | E4 | 1902 (纯五度+八度) | | 4 | 440.0 | A4 | 2400 (两个八度) | | 5 | 550.0 | C#5 | 2786 (大三度+两个八度) | | 6 | 660.0 | E5 | 3102 (纯五度+两个八度) | | 7 | 770.0 | ≈G5 | 3369 (接近小七度) | | 8 | 880.0 | A5 | 3600 (三个八度) |
观察发现:前六泛音恰好构成一个大三和弦(C#-E-A)!这正是为什么大三和弦被认为“自然和谐”的声学基础——其组成音在泛音列中同时出现,物理相关性最强。
泛音列与五度相生律
泛音列中相邻泛音的频率比直接给出和谐音程:
- 2:1 → 八度
- 3:2 → 纯五度
- 4:3 → 纯四度(由2:1与3:2推导)
- 5:4 → 大三度
- 6:5 → 小三度
五度相生律(Pythagorean tuning) 正是基于泛音列中的3:2纯五度连续相生构建。从C开始,向上连续纯五度并归一化到同一八度: C (1/1) → G (3/2) → D (9/8) → A (27/16) → E (81/64) → B (243/128) 这形成C大调各音相对于C的频率比。值得注意的是,D (9/8) 是C到G的五度再相生一次,其频率比为$(3/2)^2 / 2 = 9/8$,对应全音(whole tone)。
交互式频谱图可直观展示泛音结构。想象一个条形图,横轴为频率(Hz),纵轴为振幅。基频处最高峰,其整数倍位置出现逐渐衰减的峰。不同乐器的峰分布不同:弦乐器泛音丰富,长笛则接近正弦波。这种“频谱指纹”正是音色的来源。
纯律与十二平均律:两种律制的数学对比
基于泛音列的自然和谐比例,发展出纯律(just intonation);为满足转调需求,西方音乐主流采用十二平均律(equal temperament)。两者在数学上各有取舍。
纯律:基于简单整数比
纯律直接采用泛音列中的简单整数比构建和弦,使特定调性内和弦极其纯净。常见纯律音程:
| 音程 | 频率比 | 音分值 | 与平均律偏差 | |------|--------|--------|--------------| | 大三度 | 5:4 | 386 | -14 | | 小三度 | 6:5 | 316 | +16 | | 纯五度 | 3:2 | 702 | +2 | | 纯四度 | 4:3 | 498 | -2 |
优势:和弦内音高度和谐,无拍频。 劣势:音阶内各音频率比非2的幂次根,无法完美闭合八度循环,转调受限。例如,从C大调连续纯五度上升12次应返回C(高八度),但实际频率比为$(3/2)^{12} = 129.746$,而$2^7=128$,相差约毕达哥拉斯 comma(约23.5音分),需微调补偿。
十二平均律:等比的妥协
十二平均律将八度(2:1)精确12等分,每半音频率比为: $$r = \sqrt[12]{2} \approx 1.059463$$ 任意音程$n$个半音,频率比为$r^n$。
优势:所有调性等价,键盘乐器可自由转调。 劣势:所有音程(除八度)均为近似值,和弦存在轻微拍频。例如,平均律大三度为$r^4 \approx 1.2599$,比纯律5:4=1.25大约0.8%,产生可闻拍频,但现代耳朵已习惯这种“温暖”的粗糙感。
律制偏差可视化
下表对比C大调各音在三种律制中的频率(以A4=440 Hz为基准,C4=261.63 Hz为十二平均律):
| 音级 | 十二平均律 (Hz) | 纯律 (Hz) | 偏差 (音分) | 毕达哥拉斯律 (Hz) | 偏差 (音分) | |------|-----------------|-----------|-------------|-------------------|-------------| | C | 261.63 | 260.74 | -14 | 261.63 | 0 | | D | 293.66 | 294.33 | +4 | 294.33 | +22 | | E | 329.63 | 327.03 | -14 | 326.03 | -22 | | F | 349.23 | 348.83 | -2 | 348.83 | -2 | | G | 392.00 | 391.11 | -2 | 391.11 | -2 | | A | 440.00 | 440.00 | 0 | 440.00 | 0 | | B | 493.88 | 491.67 | -14 | 490.22 | -27 |
*注:纯律基于C大三和弦(C-E-G = 4:5:6)推导;毕达哥拉斯律基于五度相生。*
实践:用Python生成与可视化音高偏差
理论需实践验证。以下Python代码生成并比较纯律与十二平均律的音高,可视化其偏差。
代码实现
```python import numpy as np import matplotlib.pyplot as plt
设置中文字体(若系统支持)
plt.rcParams['font.sans-serif'] = ['SimHei', 'Arial'] plt.rcParams['axes.unicode_minus'] = False
基准:A4 = 440 Hz
A4_FREQ = 440.0
十二平均律:半音数从A4开始(A4=0,A#4=1,...)
def equal_temperament(semitones_from_A4): """计算十二平均律频率""" return A4_FREQ * (2 ** (semitones_from_A4 / 12))
纯律:基于A4=440,C大调频率比(以C为1)
C:1, D:9/8, E:5/4, F:4/3, G:3/2, A:5/3, B:15/8
just_ratios = { 'C': 1/1, 'D': 9/8, 'E': 5/4, 'F': 4/3, 'G': 3/2, 'A': 5/3, 'B': 15/8 }
计算C大调各音在纯律中的频率(以A4=440为锚点)
A在纯律中为5/3,故C = A / (5/3) * 1 = 440 / (5/3) = 264 Hz
A_in_just = 440.0 # 假设A4在纯律中仍为440 C_freq_just = A_in_just / (5/3) # 264 Hz
just_frequencies = {} for note, ratio in just_ratios.items(): just_frequencies[note] = C_freq_just * ratio
十二平均律C大调(以C4=261.63为基准,但需与A4=440对齐)
实际上A4=440时,C4 = 440 * 2^(-9/12) ≈ 261.63
C4_equal = equal_temperament(-9) # A4下方9个半音为C4 equal_frequencies = {} notes = ['C', 'D', 'E', 'F', 'G', 'A', 'B'] for i, note in enumerate(notes): semitones_from_C4 = i * 2 # C大调全音全音半音... 但简单起见,按C大调音级计算半音数
更准确:C4=0, D4=2, E4=4, F4=5, G4=7, A4=9, B4=11
semitone_map = {'C':0, 'D':2, 'E':4, 'F':5, 'G':7, 'A':9, 'B':11} semitones = semitone_map[note] equal_frequencies[note] = equal_temperament(semitones - 9) # 相对于A4=0
计算偏差(音分)
def cents_diff(f1, f2): return 1200 * np.log2(f2 / f1)
以十二平均律为参考,计算纯律偏差
deviations = {} for note in notes: deviations[note] = cents_diff(equal_frequencies[note], just_frequencies[note])
可视化
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(10, 8), gridspec_kw={'height_ratios': [2, 1]})
1. 频率对比条形图
x = np.arange(len(notes)) width = 0.35 bars1 = ax1.bar(x - width/2, [equal_frequencies[note] for note in notes], width, label='Equal Temperament', color='skyblue') bars2 = ax1.bar(x + width/2, [just_frequencies[note] for note in notes], width, label='Just Intonation', color='salmon') ax1.set_ylabel('Frequency (Hz)') ax1.set_title('C Major Scale: Equal Temperament vs. Just Intonation (A4=440Hz)') ax1.set_xticks(x) ax1.set_xticklabels(notes) ax1.legend() ax1.grid(True, alpha=0.3)
在条形上添加数值
for bars in [bars1, bars2]: for bar in bars: height = bar.get_height() ax1.text(bar.get_x() + bar.get_width()/2., height, f'{height:.1f}', ha='center', va='bottom', fo