Bootstrap

数字信号处理-6-Python计算频谱

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()

含有两个频率的频谱,可以看到图中有两个波峰
在这里插入图片描述

;