1 波形合成
三角函数如下,我们可以使用三角函数合成各种复杂的函数
y
=
A
c
o
s
(
2
π
f
t
+
φ
0
)
y = Acos(2πft + φ_0)
y=Acos(2πft+φ0)
其中 A 是幅度,f 是频率,t 是时间,φ0是相位偏移
另一种视角,ω 为角频率,为频率的 2π 倍,角频率单位为弧度/秒(rad/s),参见数字信号处理-2-三角函数与谱。ωt 则表示旋转角度,等价于 2πft。
ω
=
2
π
f
ω=2πf
ω=2πf
对应到代码就是:
# jupyter notebook 中运行
# 导入需要的包
import numpy as np
from matplotlib import pyplot as plt
import math
# 常数值 2π
# jupyter notebook 中运行
# 导入需要的包
import numpy as np
from matplotlib import pyplot as plt
import math
# 常数值 2π
PI2 = math.pi * 2
#采样率
framerate = 11025
# 采样时长:秒
duration = 0.01
# 样本数
n = round(duration * framerate)
# 采样时间点
ts = np.arange(n) / framerate
# 频率
f = 440
# 振幅
A = 1
# 相位偏移
offset = 0
ys1 = A * np.cos(PI2*f*ts + offset)
ys2 = A * np.cos(PI2*1000*ts + offset)
ys = ys1 + ys2
plt.plot(ts,ys,'r',label='1r,3w')
plt.show()
2 计算频谱
from numpy.fft import rfft, rfftfreq
def make_spectrum(ys, framerate):
# 波形采样数
n = len(ys)
# 样本采样频率倒数,也即样本间时间差
d = 1/framerate
# 返回各个频率元素的倍数振幅和相位差 复数形式,可以理解为振幅和角度的向量
hs = rfft(ys)
# 返回包含对应hs各元素的频率数组,采样率的一半 11025/2
fs = rfftfreq(n, d)
return hs,fs
hs,fs = make_spectrum(ys, framerate)
hs =np.absolute(hs)
plt.plot(fs, hs,'r',label='1r,3w')
plt.xlabel('Hz')
plt.show()
含有两个频率的频谱,可以看到图中有两个波峰