การตอบสนองความถี่สำหรับตัวกรองที่ออกแบบโดยใช้
ฟังก์ชันbutterคือ:
แต่ไม่มีเหตุผลที่จะ จำกัด ตัวกรองให้อยู่ในการออกแบบตัวกรองแบบโมโนโทนิกอย่างต่อเนื่อง หากคุณต้องการลดทอนสัญญาณที่สูงขึ้นในแถบหยุดและแถบช่วงการเปลี่ยนภาพชันตัวเลือกอื่น ๆ ก็มีอยู่ สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการระบุตัวกรองใช้iirdesingเห็นนี้ ดังที่แสดงโดยแผนการตอบสนองความถี่สำหรับการออกแบบเนยความถี่คัตออฟ (-3 เดซิเบล) อยู่ไกลจากเป้าหมาย สิ่งนี้สามารถลดลงได้โดยการสุ่มตัวอย่างก่อนการกรอง (ฟังก์ชั่นการออกแบบจะมีช่วงเวลาที่ยากลำบากด้วยตัวกรองแคบ ๆ เช่น 2% ของแบนด์วิดท์) ให้ดูที่การกรองอัตราตัวอย่างดั้งเดิมด้วย cutoff ที่ระบุ
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')
ดังที่ได้กล่าวไว้เนื่องจากเราพยายามกรองแบนด์วิดท์เล็กน้อยเช่นนี้ตัวกรองจะไม่มีทางลัดที่คมชัด ในกรณีนี้ตัวกรอง lowpass เราสามารถลดแบนด์วิดท์เพื่อให้ได้ตัวกรองที่ดูดีขึ้น สามารถใช้ฟังก์ชัน python / scipy.signal resample เพื่อลดแบนด์วิดท์
หมายเหตุฟังก์ชั่น resample จะทำการกรองเพื่อป้องกันนามแฝง Prefiltering ยังสามารถนำไปใช้งานได้ (เพื่อลด aliasing) และในกรณีนี้เราสามารถลองใหม่อีกครั้งโดย 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 ก็คือคุณจะมีการตอบสนองแบบเฟสเชิงเส้น