ตัวกรอง IIR (และตัวกรองบัตเตอร์เวิร์ ธ โดยเฉพาะ) เป็นสาเหตุหรือไม่?
ฉันยังใหม่กับการประมวลผลสัญญาณ ตอนนี้ฉันกำลังเรียนรู้เกี่ยวกับการกรองและฉันกำลังพยายามใช้ตัวกรองความถี่สูง (HPF) และตัวกรองแบนด์พาส (BPF) ในภายหลัง ผมใช้ฟิลเตอร์ในPython 3.8
ด้วยและNumPy
SciPy
สำหรับกรณีออฟไลน์ (การกรองเวลาที่บันทึกไว้ล่วงหน้า) ฉันได้ออกแบบตัวกรองความถี่สูงของButterworthและใช้กับสัญญาณที่โดเมนเวลาโดยใช้signal.filtfilt
ฟังก์ชัน อย่างไรก็ตามตามเอกสารแสดงวิธีนี้ใช้ได้ดีสำหรับกรณีออฟไลน์เท่านั้นและไม่ใช่สำหรับแบบเรียลไทม์เนื่องจากตัวกรองจะสแกนสัญญาณไปข้างหน้าแล้วย้อนกลับ ฉันสามารถกู้คืนการตอบสนองความถี่จากตัวกรองโดยใช้signal.freqz
ฟังก์ชัน
ตอนนี้ฉันต้องการให้ตัวกรองนี้ทำงานแบบเรียลไทม์ด้วย (ดังนั้นจึงต้องมีสาเหตุและฉันถามว่าสิ่งนี้เป็นไปได้สำหรับตัวกรองประเภทนี้หรือไม่นี่คือคำถามของฉัน:
- ถ้าฉันเข้าใจถูกต้องบัตเตอร์เวิร์ ธ ฟิลเตอร์คือตัวกรอง IIR (การตอบสนองอิมพัลส์ไม่สิ้นสุด) มันจริงหรอ?
- ตัวกรอง IIR เป็นสาเหตุหรือไม่? อาจเป็นไปได้ว่าตัวกรอง IIR ทั้งหมดไม่ได้เป็นสาเหตุและอาจเป็นไปได้ว่าบางตัวมีและบางตัวไม่ได้ อะไรคือกรณีที่ตัวกรอง IIR เป็นสาเหตุ?
- Butterworth กรองสาเหตุหรือไม่? ถ้าไม่เสมอไปกรณีใดเป็นสาเหตุ?
- ถ้าคำตอบของ 3 เป็นจริงจะใช้ตัวกรองบัตเตอร์เวิร์ ธ เชิงสาเหตุได้อย่างไรทั้งในโดเมนเวลาและโดเมนความถี่ (ฉันสามารถใช้
SciPy
ฟังก์ชั่นเช่นsignal.butter
,signal.freqz
ฯลฯ )
ลิงค์ที่เกี่ยวข้อง:
- ช่วยออกแบบตัวกรองบัตเตอร์เวิร์ ธ
- กรอง: https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.filtfilt.html
ขอขอบคุณ.
คำตอบ
- ใช่ Butterworth คือ IIR การสลายตัวจากแรงกระตุ้นทางเทคนิคคงอยู่ตลอดไป
- ใช่ IIR [ใช้งานได้] ทั้งหมดเป็นสาเหตุ
- ใช่เพราะ # 1 และ # 2
- อย่าใช้signal.filtfilt. ใช้signal.lfilter.
filtfilt
ทำสิ่งเดียวกันกับlfilter
ยกเว้นสองครั้งในทิศทางตรงกันข้ามซึ่งจะเปลี่ยนตัวกรองเชิงสาเหตุเป็นตัวกรองเฟสศูนย์
อย่างไรก็ตามตามเอกสารสำหรับทั้งสองฟังก์ชันเหล่านี้แนะนำสำหรับการใช้งานจริงคุณควรใช้ตัวแปร SOS แทน:
ควรเลือกใช้ฟังก์ชัน
sosfilt
(และการออกแบบตัวกรองโดยใช้output='sos'
) มากกว่าlfilter
สำหรับงานการกรองส่วนใหญ่เนื่องจากส่วนลำดับที่สองมีปัญหาด้านตัวเลขน้อยกว่า
เพื่อสรุปฟังก์ชั่น:
- lfilter: การกรองขั้นตอนเดียวเชิงสาเหตุ (คำสั่งซื้อต่ำเท่านั้น)
- filtfilt: การกรองขั้นตอนเดียวแบบศูนย์เฟส (คำสั่งซื้อต่ำเท่านั้น)
- sosfilt: การกรองส่วนลำดับที่สองเชิงสาเหตุ
- sosfiltfilt: การกรองส่วนลำดับที่สองแบบศูนย์เฟส
เหตุผลเดียวที่จะใช้จริง ๆlfilter
หรือfiltfilt
คือถ้าสัมประสิทธิ์ของคุณอยู่ในb, a
รูปแบบแล้วหากคุณใช้บางอย่างจากตำราเรียน ฯลฯ
หากคุณออกแบบตัวกรองด้วยตัวเองให้ใช้แบบฟอร์ม SOS ซึ่งจะช่วยลดข้อผิดพลาดด้านตัวเลข
โปรดทราบว่าfiltfilt
ฟังก์ชันจะใช้ตัวกรองสองครั้งดังนั้นจึงมีลำดับสองเท่าของตัวกรองเดิม
ตัวกรอง IIR เป็นสาเหตุหรือไม่? อาจเป็นไปได้ว่าตัวกรอง IIR ทั้งหมดไม่ได้เป็นสาเหตุและอาจเป็นไปได้ว่าบางตัวมีและบางตัวไม่ได้ อะไรคือกรณีที่ตัวกรอง IIR เป็นสาเหตุ?
ตัวกรอง IIR จริงทั้งหมดเป็นสาเหตุ ระบบจริงทั้งหมดเป็นเหตุเป็นผลเว้นแต่จักรวาลจะแปลกประหลาดกว่าที่คิดไว้มาก
คุณสามารถกำหนดตัวกรองที่ทำงานกับข้อมูลในอนาคต กล่าวคือคุณสามารถพูดได้ว่า$y_n = 0.9 y_{n+1} + x_n$. นั่นจะ (ด้วยคำพูดมากมายเพื่อเอาชนะความสงสัยของผู้อ่าน) อธิบายตัวกรองที่มีการตอบสนองต่อแรงกระตุ้น$$h_\kappa = \begin{cases} 0 & \kappa > 0 \\ 0.9^{-\kappa} & \kappa \le 0 \end{cases}$$
อย่างไรก็ตามคุณไม่สามารถใช้ตัวกรองดังกล่าวในชีวิตจริงได้