[python] 使用python設計濾波器

使用python設計濾波器

文章目錄

  • 使用python設計濾波器
    • 完整濾波器設計代碼(未經完整驗證,博主還在不斷完善中)
    • 關鍵原理與代碼對應說明
      • 1. 濾波器類型選擇
      • 2. 階數估算原理
      • 3. 性能分析技術
      • 4. 設計參數調整指南

習慣了python后,matlab逐漸成為了牛夫人,尤其是漂亮國對龍國制裁后,我作為有骨氣其的碼農,雖然有和諧版的matlab可用,但是終究是放不下碼農的尊嚴,不到萬不得一,已經很少用matlab了。絕大部分仿真工作,都已經移步到python,但最近要進行濾波器設計,為了不使用matlab的fdatool,便嘗試著用python設計濾波器。

閑話少說,代碼說話:


完整濾波器設計代碼(未經完整驗證,博主還在不斷完善中)

import numpy as np
import matplotlib.pyplot as plt
from scipy import signal
from matplotlib.ticker import EngFormatter# 設計參數
fs = 10000       # 采樣率 10kHz
nyq = fs / 2     # 奈奎斯特頻率
passband = 1500  # 通帶截止頻率 (Hz)
stopband = 2000  # 阻帶截止頻率 (Hz)
pass_ripple = 1  # 通帶波動 (dB)
stop_atten = 40  # 阻帶衰減 (dB)# 計算歸一化頻率
wp = passband / nyq
ws = stopband / nyqdef design_iir_filter():"""設計橢圓IIR濾波器"""# 計算最小階數和自然頻率order, wn = signal.ellipord(wp, ws, pass_ripple, stop_atten)# 設計橢圓濾波器b, a = signal.ellip(order, pass_ripple, stop_atten, wn, btype='low', analog=False)return b, a, orderdef design_fir_filter():"""設計FIR濾波器(凱塞窗方法)"""# 計算過渡帶寬度width = abs(stopband - passband) / nyq# 估算凱塞窗參數A = stop_attenbeta = 0.1102*(A - 8.7) if A > 50 else 0.5842*(A - 21)**0.4 + 0.07886*(A - 21)# 計算所需階數numtaps = int((A - 8) / (2.285 * 2 * np.pi * width)) + 1# 設計FIR濾波器taps = signal.firwin(numtaps, wn=passband/nyq, window=('kaiser', beta), pass_zero='lowpass')return taps, numtapsdef analyze_filter(b, a=None):"""分析濾波器性能"""fig, (ax_mag, ax_phase, ax_grp, ax_zp) = plt.subplots(4, 1, figsize=(10, 12))# 幅頻響應w, h = signal.freqz(b, a, worN=8000, fs=fs)ax_mag.plot(w, 20 * np.log10(np.abs(h)), color='blue')ax_mag.set_title('幅頻響應')ax_mag.set_ylabel('幅度 (dB)')ax_mag.grid(True, which='both', linestyle='--')ax_mag.axvline(passband, color='g', linestyle='--', alpha=0.7)ax_mag.axvline(stopband, color='r', linestyle='--', alpha=0.7)ax_mag.set_ylim([-stop_atten-20, 5])# 相頻響應angles = np.unwrap(np.angle(h))ax_phase.plot(w, angles, color='green')ax_phase.set_title('相頻響應')ax_phase.set_ylabel('相位 (弧度)')ax_phase.grid(True)# 群延遲grp_delay = -np.diff(angles) / np.diff(w)ax_grp.plot(w[:-1], grp_delay, color='red')ax_grp.set_title('群延遲')ax_grp.set_ylabel('采樣點數')ax_grp.grid(True)# 零極點圖if a is not None:  # IIR濾波器z, p, k = signal.tf2zpk(b, a)ax_zp.scatter(np.real(z), np.imag(z), marker='o', facecolors='none', edgecolors='b', s=80)else:  # FIR濾波器z = np.roots(b)p = np.zeros(len(z))ax_zp.scatter(np.real(z), np.imag(z), marker='o', facecolors='none', edgecolors='b', s=80)ax_zp.scatter(np.real(p), np.imag(p), marker='x', color='r', s=80)unit_circle = plt.Circle((0,0), radius=1, fill=False, color='gray', linestyle='--')ax_zp.add_patch(unit_circle)ax_zp.set_title('零極點圖')ax_zp.set_xlabel('實部')ax_zp.set_ylabel('虛部')ax_zp.grid(True)ax_zp.axis('equal')ax_zp.axhline(0, color='black', linewidth=0.5)ax_zp.axvline(0, color='black', linewidth=0.5)plt.tight_layout()return fig# 主程序
if __name__ == "__main__":# 設計IIR濾波器b_iir, a_iir, iir_order = design_iir_filter()print(f"IIR濾波器階數: {iir_order}")# 設計FIR濾波器fir_taps, fir_order = design_fir_filter()print(f"FIR濾波器階數: {fir_order}")# 分析IIR濾波器fig_iir = analyze_filter(b_iir, a_iir)fig_iir.suptitle('橢圓IIR濾波器分析', fontsize=16)# 分析FIR濾波器fig_fir = analyze_filter(fir_taps)fig_fir.suptitle('FIR濾波器分析', fontsize=16)# 應用濾波器示例t = np.linspace(0, 1, fs)  # 1秒時長sig = np.sin(2*np.pi*1000*t) + 0.5*np.sin(2*np.pi*3000*t)# IIR濾波filtered_iir = signal.lfilter(b_iir, a_iir, sig)# FIR濾波filtered_fir = signal.lfilter(fir_taps, 1.0, sig)# 繪制結果plt.figure(figsize=(10, 6))plt.plot(t[:500], sig[:500], 'b-', label='原始信號')plt.plot(t[:500], filtered_iir[:500], 'r-', label='IIR濾波后')plt.plot(t[:500], filtered_fir[:500], 'g-', label='FIR濾波后')plt.title('時域濾波效果對比 (前500點)')plt.xlabel('時間 (秒)')plt.ylabel('幅度')plt.legend()plt.grid(True)plt.tight_layout()plt.show()

關鍵原理與代碼對應說明

1. 濾波器類型選擇

  • IIR濾波器:橢圓濾波器(Elliptic)提供最陡峭過渡帶

    order, wn = signal.ellipord(wp, ws, pass_ripple, stop_atten)
    b, a = signal.ellip(order, pass_ripple, stop_atten, wn, btype='low')
    
    • ellipord計算最小階數和自然頻率
    • 橢圓濾波器在通帶/阻帶均有等波紋特性
  • FIR濾波器:凱塞窗(Kaiser)提供參數化控制

    beta = 0.1102*(A - 8.7)  # 窗形參數計算
    taps = signal.firwin(numtaps, cutoff, window=('kaiser', beta))
    
    • 凱塞窗通過beta控制主瓣寬度和旁瓣衰減平衡

2. 階數估算原理

  • IIR階數估算
    N = K ( ω s ) K ( 1 ? ω p 2 ) K ( ω p ) K ( 1 ? ω s 2 ) N = \frac{K(\omega_s)K(\sqrt{1-\omega_p^2})}{K(\omega_p)K(\sqrt{1-\omega_s^2})} N=K(ωp?)K(1?ωs2? ?)K(ωs?)K(1?ωp2? ?)?
    其中K為第一類完全橢圓積分

  • FIR階數估算
    N ≈ A ? 8 2.285 ? Δ ω N \approx \frac{A - 8}{2.285 \cdot \Delta\omega} N2.285?ΔωA?8?
    Δ ω \Delta\omega Δω為過渡帶寬度,A為阻帶衰減(dB)

3. 性能分析技術

  • 幅頻響應signal.freqz計算復數頻率響應

    w, h = signal.freqz(b, a, worN=8000, fs=fs)
    20*np.log10(np.abs(h))  # 轉換為dB
    
  • 相位特性

    angles = np.unwrap(np.angle(h))  # 解卷繞相位
    
  • 群延遲:相位導數計算

    -np.diff(angles)/np.diff(w)  # 群延遲 = -dφ/dω
    
  • 穩定性分析

    • IIR:極點是否在單位圓內
    • FIR:恒穩定(全零點系統)

4. 設計參數調整指南

  1. 過渡帶陡度

    • IIR:增加階數
    • FIR:增加窗長度
  2. 阻帶衰減

    • IIR:增加stop_atten參數
    • FIR:增大凱塞窗的beta
  3. 計算效率

    • IIR:階數低但非線性相位
    • FIR:高階但線性相位

此方案應該能替代MATLAB FDATool的核心功能,提供從設計到分析的完整工作流。可根據具體應用調整濾波器類型(低通/高通/帶通)和設計參數。但是比起FDATool的可視化設計,還是有明顯的不足,需要不斷完善。


研究學習不易,點贊易。
工作生活不易,收藏易,點收藏不迷茫 :)


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/909144.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/909144.shtml
英文地址,請注明出處:http://en.pswp.cn/news/909144.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

mac電腦.sh文件,用來清除git當前分支

#!/bin/bashecho "正在檢查Git倉庫..." if ! git rev-parse --is-inside-work-tree >/dev/null 2>&1; thenecho "錯誤:當前目錄不是Git倉庫!"exit 1 fiecho "警告:這將丟棄所有未提交的更改和本地提交&am…

Bash (Bourne Again SHell)

Unix/Linux 系統中最常用的命令行解釋器之一,它是原始 Bourne shell (sh) 的增強版本。以下是 Bash 的詳細解釋: 1. Bash 基礎 1.1 什么是 Bash 一個命令行解釋器,用于執行用戶輸入的命令支持腳本編程,可以編寫復雜的自動化任務…

uni-app學習筆記三十五--擴展組件的安裝和使用

由于內置組件不能滿足日常開發需要,uniapp官方也提供了眾多的擴展組件供我們使用。由于不是內置組件,需要安裝才能使用。 一、安裝擴展插件 安裝方法: 1.訪問uniapp官方文檔組件部分:組件使用的入門教程 | uni-app官網 點擊左側…

AIStor 的模型上下文協議 (MCP) 服務器: 工作原理

在本系列的前幾篇博文中,我們討論了MinIO AIStor 模型上下文協議 (MCP) 服務器的用戶級和管理員級功能。在第一篇博文中,我們學習了如何查看存儲桶的內容、分析對象并標記它們以便將來處理。在第二篇博文中,我們還學習了如何使用管理員命令以…

Excel 怎么讓透視表以正常Excel表格形式顯示

目錄 1、創建數據透視表 2、設計 》報表布局 》以表格形式顯示 3、設計 》分類匯總 》不顯示分類匯總 1、創建數據透視表 2、設計 》報表布局 》以表格形式顯示 3、設計 》分類匯總 》不顯示分類匯總

匯編語言深度指南:從基礎到字符串操作

基礎知識 CPU簡介 CPU是計算機的核心,負責: 執行機器指令:解碼并執行二進制指令 mov eax, 5 ; 將值5移動到EAX寄存器暫存少量數據:通過內部寄存器快速存取訪問存儲器:讀寫內存數據 mov [0x1000], eax ; 將EAX值…

樹莓派5-ubuntu 24.04 安裝 ros環境

在開始安裝ros環境前,需要確保已經準備好了以下操作 1.樹莓派5開發板,已經燒錄了 ubuntu 24.04,并做好了一些基礎配置,如:遠程訪問配置,語言配置,網絡配置等 2.新手建議在上面安裝一個寶塔面板…

【狂飆AGI】第2課:大模型方向市場分析

目錄 (一)產業規模(二)政策引導(三)人才需求(四)工作年限(五)年薪分析(六)薪資情況分析(七)地域及匹配薪資&am…

word用endnote插入國標參考文獻

1.在endnote中先設置output style為我的GB格式 參考 Endnote使用——參考文獻的插入及引用_endnote怎么引用參考文獻-CSDN博客 已經修改好的GB導出格式:Chinese Std GBT7714 (numeric)-spx.ens Peixuan Shu/Chinese_Std_GBT7714 - 碼云 - 開源中國 把這個style…

Peiiieee的Linux筆記(1)

基本指令 1. ls指令 語法:ls [選項][目錄或文件] 功能:對于目錄,該命令列出該目錄下的所有子目錄與文件。對于文件,將列出文件名以及其它信息。 -a:列出目錄下的所有文件,包括以.開頭的隱含文件。 -l&am…

Docker快速構建并啟動Springboot程序,快速發布和上線/

Docker部署SpringBoot 1.工作木目錄:/mnts/jar_work/vx_kefu/ruoyi_ruoyiwechatinfo 里面的目錄是lib文件夾,logs文件夾,Dockerfile文件,SpringBoot的jar包,start.sh的命令,stop.sh的命令,tpid文件進程。 …

RT-Thread Studio 配置使用詳細教程

文章目錄 一、新建工程1.1 創建基于芯片的工程1.1.1 選擇創建的rtt版本1.1.2 配置工程基本屬性1.1.3 初創工程目錄結構1.1.4 修改時鐘配置1.1.5 配置調試下載器 1.2 創建基于開發板的工程 二、配置內核三、配置組件四、配置軟件包五、適配配置六、其它問題 一、新建工程 1.1 創…

React 中的 useCallback 入門指南:是真需要,還是假怪?

在學習 React 時,很多人初步接觸 useCallback 都有一個同樣的疑問: “useCallback 到底是干啥的?不是簡單地就是‘緩存一個函數’嗎?我一直不明白它真正有什么用。” 這篇文章就來給你一個全方位、實操、有例實的 useCallback 入門…

14.計算機網絡End

計算機網絡end 一、概念 網絡協議三要素:語法、語義、同步TCP/IP中為運輸層提供服務的層級:網際層計算機網絡性能指標(答5個即可): 帶寬時延吞吐量往返時間(RTT)利用率 交換式以太網用戶帶寬&…

Next.js + Supabase = 快速開發 = 高速公路

Next.js Supabase介紹一下這2個好的,直說重點: ? Next.js:React 的“終極形態” 一句話概括: Next.js 是基于 React 的 Web 框架,幫你快速構建全棧應用,支持 SSR(服務端渲染)、AP…

機器學習用于算法交易(Matlab實現)

機器學習用于算法交易(Matlab實現) 摘要 隨著金融市場的復雜性和交易量的不斷增長,傳統交易方式逐漸暴露出局限性,算法交易因其高效性和精準性已成為主流趨勢。在此背景下,將機器學習融入算法交易具有重要的研究意義…

day64—回溯—組合數(LeetCode-77)

題目描述 給定兩個整數 n 和 k,返回范圍 [1, n] 中所有可能的 k 個數的組合。 你可以按 任何順序 返回答案。 示例 1: 輸入:n 4, k 2 輸出: [[2,4],[3,4],[2,3],[1,2],[1,3],[1,4], ] 示例 2: 輸入&#xff1a…

機器學習與深度學習21-信息論

目錄 前文回顧1.信息上的概念2.相對熵是什么3.互信息是什么4.條件熵和條件互信息5.最大熵模型6.信息增益與基尼不純度 前文回顧 上一篇文章鏈接:地址 1.信息上的概念 信息熵(Entropy)是信息理論中用于度量隨機變量不確定性的概念。它表示了…

chrome138版本及以上el-input的textarea輸入問題

描述 項目基于vue2 element UI 問題簡述&#xff1a;Chrome138及以上版本&#xff0c;把組件中的el-input的textarea的disabled屬性從true設為false&#xff0c;無法輸入 封裝了一套表單輸入組件&#xff0c;其中的textarea如下&#xff1a; <div v-if"item.type te…

TCP/IP 網絡編程 | 服務端 客戶端的封裝

設計模式 文章目錄 設計模式一、socket.h 接口&#xff08;interface&#xff09;二、socket.cpp 實現&#xff08;implementation&#xff09;三、server.cpp 使用封裝&#xff08;main 函數&#xff09;四、client.cpp 使用封裝&#xff08;main 函數&#xff09;五、退出方法…