Đáp ứng tần số cho bộ lọc được thiết kế bằng
chức năng bơ là:
Nhưng không có lý do gì để giới hạn bộ lọc thành một thiết kế bộ lọc đơn điệu không đổi. Nếu bạn mong muốn mức suy giảm cao hơn trong dải chuyển tiếp và dải chuyển tiếp dốc hơn, các tùy chọn khác tồn tại. Để biết thêm thông tin về việc chỉ định bộ lọc bằng cách sử dụng iirdesing, hãy xem phần này . Như thể hiện trong các ô đáp ứng tần số cho thiết kế bơ , tần số cắt (điểm -3dB) nằm xa mục tiêu. Điều này có thể được giảm bớt bằng cách lấy mẫu xuống trước khi lọc (các chức năng thiết kế sẽ có một thời gian khó khăn với bộ lọc hẹp như vậy, 2% băng thông). Hãy xem xét việc lọc tỷ lệ mẫu ban đầu với mức cắt được chỉ định.
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')
Như đã đề cập, bởi vì chúng tôi đang cố gắng lọc một phần trăm nhỏ băng thông như vậy, bộ lọc sẽ không bị cắt mạnh. Trong trường hợp này, bộ lọc thông thấp, chúng ta có thể giảm băng thông để có bộ lọc tìm kiếm tốt hơn. Hàm lấy mẫu python / scipy.signal có thể được sử dụng để giảm băng thông.
Lưu ý chức năng lấy mẫu lại sẽ thực hiện lọc để ngăn răng cưa. Việc lọc sơ bộ cũng có thể được thực hiện (để giảm răng cưa) và trong trường hợp này chúng ta chỉ cần lấy mẫu lại bằng 100 và được thực hiện , nhưng câu hỏi được hỏi về việc tạo bộ lọc. Trong ví dụ này, chúng tôi sẽ giảm mẫu xuống 25 và tạo bộ lọc mới
R = 25; # how much to down sample by
Fsr = Fs/25. # down-sampled sample rate
xs = signal.resample(x, len(x)/25.)
Nếu chúng tôi cập nhật các tham số thiết kế cho bộ lọc FIR, phản hồi mới là.
# 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)
Bộ lọc hoạt động trên dữ liệu được ghép xuống có phản hồi tốt hơn. Một lợi ích khác của việc sử dụng bộ lọc FIR là bạn sẽ có phản ứng pha tuyến tính.