如何用Python获得系数带通FIR滤波器设计

时间:2014-06-05 16:12:39

标签: python-2.7 arduino raspberry-pi signal-processing windowing

我正在尝试使用python制作DSP,我是初学者,就像这个网站https://mbed.org/cookbook/FIR-Filte 1.我用python查找系数,但如何使用汉明窗找到系数FIR带通,你能举个例子吗? 2.如何使用Hamming窗口在FIR带通中使用python实现系数到DSP(我想用Rasberry pi(第一选项)或Arduino实现DSP)

我英语不好,希望你明白我在说什么, 谢谢

1 个答案:

答案 0 :(得分:0)

有几种设计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课程中学到的内容。)