1 声音是一种纵波
声音是通过改变对空气的压力,以波的形式传播的,这个压力的变化叫做声压。具体来说就是,声音利用空气的振动,使空气的密度变高变低来传播。这种传播方向与振动方向相同的波叫做纵波,所以声波是一种纵波。
具有纵波性质的波,需要传递密度的变化,因此需要传递媒介,纵波不能在真空中传播。媒介不止有像空气之类的气体,像水这种液体、金属之类的固体都可以作为媒介传递纵波。
纵波因为在传播方向上能使媒介的密度变高变低,因为也叫疏密波,用密度的变化把疏密波图形化,就能得到类似三角函数的波形,波峰表示介质被压缩变密,波谷表示介质密度变得稀疏。
2 振幅与频率
振幅是信号的高低差,波形中相邻的一个波峰和波谷的时间长度叫周期,频率是一秒内振动的次数,在波形中也就是一秒内有多少个周期。如下图,1 秒内有两个周期, 每个周期为 0.5 秒,频率就为 2 Hz,也即频率是周期的倒数。
振幅对应着声音的强度,也就是说,振幅小的话,相应的人说话的音量也很小。
频率对应着声音的音调,增大频率,会提高声音的音调,使声音变成高音。
3 Python 生成声音
# jupyter noteboook 中运行
# 导入需要的包
import numpy as np
import math
try:
from IPython.display import Audio
except:
warnings.warn(
"Can't import Audio from IPython.display"
)
# 常数值 2π
PI2 = math.pi * 2
# 时长,单位秒
duration = 1
# 采样率:每分钟采样次数
framerate = 22050
# 样本数:共采 duration * framerate 个样本,整数
n = round(duration * framerate)
# 每个采样点对应时间
ts = np.arange(n) / framerate
def evaluate(ts, amp, freq):
"""Evaluates the signal at the given times.
ts: float array of times
amp:振幅
freq:频率
returns: audio
"""
ts = np.asarray(ts)
phases = PI2 * freq * ts
ys = amp * np.sin(phases)
# 返回播放器
audio = Audio(data=ys, rate=framerate)
return audio
# 可以尝试更改 振幅和频率
amp = 1
freq = 440
evaluate(ts, amp, freq)