Python Numpy中的Kaiser函数
Kaiser函数是一种窗口函数,常被用于滤波器设计和信号处理中。Numpy提供了一个Kaiser函数,可以用于生成一个库伯窗。
语法
numpy.kaiser(M, beta, sym=True)
参数
- M:窗口长度。
- beta:Kaiser窗口的形状参数。当beta=0时,Kaiser窗口等价于矩形窗口;当beta趋近于正无穷时,Kaiser窗口趋近于哈曼窗口。
- sym:是否返回中心对称的窗口。
返回值
- out:利用Kaiser函数生成的窗口数组。
示例
下面的示例演示如何创建一个Kaiser窗口数组,并使用该窗口在频域中滤波器。
import numpy as np
import matplotlib.pyplot as plt
from scipy import signal
# 生成一个低通滤波器
b, a = signal.butter(5, 0.2)
# 生成一段信号
t = np.linspace(0, 10, 1000)
sig = np.sin(2*np.pi*5*t) + np.sin(2*np.pi*10*t)
# 用低通滤波器对信号进行滤波
filtered = signal.lfilter(b, a, sig)
# 绘制未滤波信号的频率谱
f, Pxx_spec = signal.periodogram(sig)
plt.semilogy(f, Pxx_spec)
# 绘制滤波后信号的频率谱
f_filtered, Pxx_spec_filtered = signal.periodogram(filtered)
plt.semilogy(f_filtered, Pxx_spec_filtered)
# 绘制Kaiser窗口的幅度响应
M = 51 # 窗口长度
beta = 14.0 # 窗口形状参数
win = np.kaiser(M, beta)
plt.figure()
plt.plot(win)
# 在频率域上使用Kaiser窗口进行滤波
filtered_kaiser = signal.lfilter(b*win, a, sig)
f_filtered_kaiser, Pxx_spec_filtered_kaiser = signal.periodogram(filtered_kaiser)
plt.figure()
plt.semilogy(f_filtered_kaiser, Pxx_spec_filtered_kaiser)
这个例子中,我们首先用signal.butter函数生成了一个5阶低通滤波器。然后我们生成了一个包含两个频率分量的信号sig。接下来,我们使用lfilter函数对sig进行滤波并生成滤波后的信号filtered。我们使用signal.periodogram函数计算了sig和filtered的频率谱,并使用semilogy函数将它们绘制出来。接下来,我们生成了一个Kaiser窗口数组win,用来在频率域上对信号进行滤波。然后我们使用lfilter函数和win进行滤波,生成滤波后的信号filtered_kaiser,并使用periodogram函数计算了filtered_kaiser的频率谱,并使用semilogy函数将它绘制出来。
下面的另一个示例演示了如何在时间域上使用Kaiser窗口生成一个信号。
import numpy as np
import matplotlib.pyplot as plt
# 生成一个长度为N的Kaiser窗口数组
N = 51 # 窗口长度
beta = 14.0 # 窗口形状参数
win = np.kaiser(N, beta)
# 生成一个长度为N的信号,并将其乘以窗口数组
sig = np.sin(2*np.pi*5*np.arange(N)/float(N))
sig_win = sig * win
plt.figure()
plt.plot(sig, label='原始信号')
plt.plot(sig_win, label='加窗后信号')
plt.legend()
plt.show()
在这个例子中,我们使用了np.arange函数生成了一个长度为N的时间轴。然后我们用np.sin函数生成了一个正弦信号,并将其乘以Kaiser窗口数组win,生成加窗后的信号sig_win。最后,我们使用plot函数将原始信号sig和加窗后的信号sig_win绘制出来。