Pasmo przenoszenia dla filtra zaprojektowanego przy użyciu
funkcji masła wynosi:
Ale nie ma powodu, aby ograniczać filtr do stałej konstrukcji filtra monotonicznego. Jeśli potrzebujesz wyższego tłumienia w paśmie zatrzymania i bardziej stromym paśmie przejścia, istnieją inne opcje. Aby uzyskać więcej informacji na temat określania filtra za pomocą iirdesing, zobacz to . Jak pokazują wykresy odpowiedzi częstotliwości dla projektu masła, częstotliwość graniczna (punkt -3 dB) jest daleka od celu. Można to złagodzić poprzez próbkowanie w dół przed filtrowaniem (funkcje projektowe będą miały trudny czas przy tak wąskim filtrze, 2% szerokości pasma). Przyjrzyjmy się filtrowaniu oryginalnej częstotliwości próbkowania z określonym punktem odcięcia.
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')
Jak wspomniano, ponieważ próbujemy przefiltrować tak mały procent szerokości pasma, filtr nie będzie miał ostrego odcięcia. W tym przypadku filtr dolnoprzepustowy możemy zmniejszyć przepustowość, aby uzyskać lepiej wyglądający filtr. Funkcja ponownego próbkowania python / scipy.signal może być wykorzystana do zmniejszenia przepustowości.
Uwaga: funkcja ponownego próbkowania wykona filtrowanie, aby zapobiec aliasingowi. Filtrowanie wstępne może być również wykonane (w celu zmniejszenia aliasingu), w tym przypadku możemy po prostu przeskalować ponownie o 100 i wykonać , ale zadaje się pytanie o tworzenie filtrów. W tym przykładzie zmniejszymy próbkę o 25 i utworzymy nowy filtr
R = 25; # how much to down sample by
Fsr = Fs/25. # down-sampled sample rate
xs = signal.resample(x, len(x)/25.)
Jeśli zaktualizujemy parametry projektu dla filtra FIR, nowa odpowiedź to.
# 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)
Filtr działający na danych o zmniejszonej próbce ma lepszą odpowiedź. Kolejną zaletą stosowania filtra FIR jest to, że będziesz miał liniową odpowiedź fazową.