![](https://secure.gravatar.com/avatar/4d021a1d1319f36ad861ebef0eb5ba44.jpg?s=120&d=mm&r=g)
vincenzo cacciatore wrote:
Hi all, i would like to design a high pass filter with scipy.signal module.
This is the code i'm using to:
import scipy.signal as signal import scipy
#first of all i design the lowpass fir filter. This is a 10 taps filter with cutoff frequency =1 (as help tell me to do)
lpwindow=signal.firwin(10,1)
#with the following instruction i'm creating a band pass filter from the low pass one bpwindow=signal.lp2bp(lpwindow,1,0.5,0.2)
My problem is that the band-pass filter obtained with lp2bp function is 16 taps one! How is it possible??
The low-pass to band-pass function uses a specific transformation that changes the number of taps from N to 2*N-1 So, for me the number of taps goes from 10 to 19. You have two options: 1) Change the number of taps in your underlying low-pass filter 2) (Preferred). Design the filter in the frequency domain explicitly (i.e. make a vector of ones and zeros that define your filter). Use the inverse FFT to get the ideal set of coefficients and then window them using the hamming window. Something like this: We will use normalized frequencies where 1 corresponds to Nyquist (i.e. pi radians / sample) --- your use of 1 for a cutoff showed that you need to re-think what normalized coordinates are.. Assume the pass-band is f1 and f2 so that Let the number of taps in the filter be N and Let desired = {1 if |f| in [f1,f2] { 0 otherwise from numpy import * from scipy import signal Ndesign = 256 # assume it is even f = dft.fftfreq(Ndesign,d=0.5) af = abs(f) desired = where((af > f1) & (af < f2), 1,0) hideal = ifft(desired).real win = signal.get_window('hamming',N) # Now we need to get the actual tap coefficients by windowing this result. htrunc = dft.fftshift(r_[hideal[:N/2],hideal[-(N-1)/2:]]) hfinal = win * htrunc # The final coefficents contain the taps of your filter (with the largest tap at the center). # We should probably add something like this to the library. Best, -Travis