我正在尝试用 python 制作一个 DSP,我是一个初学者,比如这个网站https://mbed.org/cookbook/FIR-Filte 1. 我用 python 寻找系数,但是如何使用 FIR 找到系数带通汉明窗,你能给我举个例子吗?2. 如何使用汉明窗口在 FIR 带通中使用 python 实现 DSP 的系数(我想用树莓派(第一个选项)或在 Arduino 上实现 DSP)
我英语不好,希望你能明白我在说什么,谢谢
我正在尝试用 python 制作一个 DSP,我是一个初学者,比如这个网站https://mbed.org/cookbook/FIR-Filte 1. 我用 python 寻找系数,但是如何使用 FIR 找到系数带通汉明窗,你能给我举个例子吗?2. 如何使用汉明窗口在 FIR 带通中使用 python 实现 DSP 的系数(我想用树莓派(第一个选项)或在 Arduino 上实现 DSP)
我英语不好,希望你能明白我在说什么,谢谢
设计 FIR 滤波器有多种技术和方法。但是,如果您只想要一个简单的带通滤波器,其 n_pts 点以 f_c Hz 为中心(采样率为 sr Hz),请尝试:
import numpy as np
import scipy.signal
fir_coeff = np.hanning(n_pts)*np.cos(2.*np.pi*f_c/sr*np.arange(n_pts))
fir_coeff /= np.sum(np.hanning(n_pts))
filtered_signal = scipy.signal.lfilter(fir_coeff, 1.0, signal)
这是一个合理的带通滤波器,Q 约为 n_pts/(sr/f_c)。您可以通过增加滤波器长度 n_pts 来增加 Q(使其成为更窄的带通滤波器)。
请注意,如果您尝试在低功耗硬件上实现滤波器,最好使用 IIR 滤波器而不是 FIR(如果它们适合您的问题)。因此,类似的过滤器可以实现为
# Q = n_pts/(sr/f_c) or defined some other way
w_c = 2*pi*f_c/sr
beta = np.cos(w_c)
BW = w_c / Q
alpha = (1. - np.sin(BW))/np.cos(BW)
G = (1. - alpha)/2.
filtered_signal = scipy.signal.lfilter([G, 0, -G], [1, -beta*(1+alpha), alpha], signal)
对于相当窄的过滤器(n_pts = 33 或其他东西),这应该快一个数量级。
(表达式基于http://www.ee.columbia.edu/~dpwe/e4810/lectures/L06-filters.pdf的幻灯片 14 ,这是您在 DSP 课程中学到的内容)。