버터
기능을 사용하여 설계된 필터의 주파수 응답 은 다음과 같습니다.
그러나 필터를 일정한 단조 필터 설계로 제한 할 이유가 없습니다. 저지 대역과 가파른 전환 대역에서 더 높은 감쇠를 원한다면 다른 옵션이 있습니다. iirdesing을 사용하여 필터를 지정하는 방법에 대한 자세한 내용 은 this를 참조 하십시오 . 버터 설계에 대한 주파수 응답 플롯에서 알 수 있듯이 컷오프 주파수 (-3dB 포인트)는 목표와 거리가 멀다. 필터링 전 다운 샘플링으로이를 완화 할 수 있습니다 (대역폭의 2 % 인 좁은 필터에서는 설계 기능이 어려울 수 있습니다). 컷오프가 지정된 원래 샘플 속도를 필터링하는 방법을 살펴 보겠습니다.
import numpy as np
from scipy import signal
from matplotlib import pyplot as plt
from scipy.signal import fir_filter_design as ffd
from scipy.signal import filter_design as ifd
# setup some of the required parameters
Fs = 1e9 # sample-rate defined in the question, down-sampled
# remez (fir) design arguements
Fpass = 10e6 # passband edge
Fstop = 11.1e6 # stopband edge, transition band 100kHz
Wp = Fpass/(Fs) # pass normalized frequency
Ws = Fstop/(Fs) # stop normalized frequency
# iirdesign agruements
Wip = (Fpass)/(Fs/2)
Wis = (Fstop+1e6)/(Fs/2)
Rp = 1 # passband ripple
As = 42 # stopband attenuation
# Create a FIR filter, the remez function takes a list of
# "bands" and the amplitude for each band.
taps = 4096
br = ffd.remez(taps, [0, Wp, Ws, .5], [1,0], maxiter=10000)
# The iirdesign takes passband, stopband, passband ripple,
# and stop attenuation.
bc, ac = ifd.iirdesign(Wip, Wis, Rp, As, ftype='ellip')
bb, ab = ifd.iirdesign(Wip, Wis, Rp, As, ftype='cheby2')
언급 한 바와 같이, 우리는 대역폭의 작은 백분율을 필터링하려고하기 때문에 필터는 급격한 컷오프를 갖지 않습니다. 이 경우, 저역 통과 필터는 더 나은 필터를 얻기 위해 대역폭을 줄일 수 있습니다. python / scipy.signal resample 기능을 사용하여 대역폭을 줄일 수 있습니다.
재 샘플링 기능은 앨리어싱을 방지하기 위해 필터링을 수행합니다. 사전 필터링을 수행하여 앨리어싱을 줄일 수 있으며이 경우 간단히 100으로 다시 샘플링하고 수행 할 수 있지만 필터 생성에 대한 질문이있었습니다. 이 예제에서는 25 씩 다운 샘플링하고 새 필터를 만듭니다.
R = 25; # how much to down sample by
Fsr = Fs/25. # down-sampled sample rate
xs = signal.resample(x, len(x)/25.)
FIR 필터의 설계 매개 변수를 업데이트하면 새로운 반응이 나타납니다.
# Down sampled version, create new filter and plot spectrum
R = 25. # how much to down sample by
Fsr = Fs/R # down-sampled sample rate
Fstop = 11.1e6 # modified stopband
Wp = Fpass/(Fsr) # pass normalized frequency
Ws = Fstop/(Fsr) # stop normalized frequency
taps = 256
br = ffd.remez(taps, [0, Wp, Ws, .5], [1,0], maxiter=10000)
다운 샘플링 된 데이터에서 작동하는 필터의 응답이 더 좋습니다. FIR 필터 사용의 또 다른 이점은 선형 위상 응답이 있다는 것입니다.