信號處理抽取多項濾波的數學推導與仿真


昨天的《信號處理之插值、抽取與多項濾波》,已經介紹了插值抽取的多項濾率,今天詳細介紹多項濾波的數學推導,并附上實戰仿真代碼。

一、數學變換推導

1. 多相分解的核心思想

將FIR濾波器的系數 h ( n ) h(n) h(n)按相位分組,每組對應輸入信號的不同抽樣相位。通過分相、濾波、重組,實現與原FIR等效的處理。

2. 數學變換推導

FIR濾波器的系統函數可表示為:
H ( z ) = ∑ n = 0 N ? 1 h ( n ) z ? n H(z) = \sum_{n=0}^{N-1} h(n) z^{-n} H(z)=n=0N?1?h(n)z?n
其中, h ( n ) h(n) h(n)為濾波器系數, N N N為階數。

設分解因子為 M M M,則第 k k k個子濾波器系數為:
h k ( m ) = h ( k + m M ) , 0 ≤ k < M h_k(m) = h(k + mM), \quad 0 \leq k < M hk?(m)=h(k+mM),0k<M

將FIR濾波器拆分為 M M M個并行的子濾波器(即多相分量),每個子濾波器處理信號的特定相位分量,再通過延遲和組合實現等效。目標形式為:

H ( z ) = ∑ k = 0 M ? 1 z ? k H k ( z M ) H(z) = \sum_{k=0}^{M-1} z^{-k} H_k(z^M) H(z)=k=0M?1?z?kHk?(zM)
其中, H k ( z M ) H_k(z^M) Hk?(zM)表示第 k k k個子濾波器的系統函數。

H ( z ) H(z) H(z) M M M的整數倍延遲展開:
H ( z ) = ∑ n = 0 N ? 1 h ( n ) z ? n = ∑ k = 0 M ? 1 ∑ m = 0 K ? 1 h ( k + m M ) z ? ( k + m M ) H(z) = \sum_{n=0}^{N-1} h(n) z^{-n} = \sum_{k=0}^{M-1} \sum_{m=0}^{K-1} h(k + mM) z^{-(k + mM)} H(z)=n=0N?1?h(n)z?n=k=0M?1?m=0K?1?h(k+mM)z?(k+mM)
其中, K = ? N M ? K = \lceil \frac{N}{M} \rceil K=?MN??(向上取整)。

將原系數按 M M M個相位分組:

  • k k k個子濾波器的系數為: h k ( m ) = h ( k + m M ) h_k(m) = h(k + mM) hk?(m)=h(k+mM)
  • 其系統函數為:
    H k ( z M ) = ∑ m = 0 K ? 1 h k ( m ) z ? m M H_k(z^M) = \sum_{m=0}^{K-1} h_k(m) z^{-mM} Hk?(zM)=m=0K?1?hk?(m)z?mM
    H ( z ) H(z) H(z)重寫為:
    H ( z ) = ∑ k = 0 M ? 1 z ? k ( ∑ m = 0 K ? 1 h ( k + m M ) z ? m M ) = ∑ k = 0 M ? 1 z ? k H k ( z M ) H(z) = \sum_{k=0}^{M-1} z^{-k} \left( \sum_{m=0}^{K-1} h(k + mM) z^{-mM} \right) = \sum_{k=0}^{M-1} z^{-k} H_k(z^M) H(z)=k=0M?1?z?k(m=0K?1?h(k+mM)z?mM)=k=0M?1?z?kHk?(zM)
3. 時域操作等價性

原FIR輸出:
y ( n ) = ∑ m = 0 N ? 1 h ( m ) x ( n ? m ) y(n) = \sum_{m=0}^{N-1} h(m)x(n-m) y(n)=m=0N?1?h(m)x(n?m)
多相結構輸出:
y ( n ) = ∑ k = 0 M ? 1 ∑ m = 0 K ? 1 h k ( m ) x ( n ? k ? m M ) y(n) = \sum_{k=0}^{M-1} \sum_{m=0}^{K-1} h_k(m) x\left(n - k - mM\right) y(n)=k=0M?1?m=0K?1?hk?(m)x(n?k?mM)

4、物理意義驗證
  1. 時域解釋
    原FIR的輸出 y ( n ) = ∑ m = 0 N ? 1 h ( m ) x ( n ? m ) y(n) = \sum_{m=0}^{N-1} h(m)x(n-m) y(n)=m=0N?1?h(m)x(n?m),等效于:

    • 將輸入 x ( n ) x(n) x(n)分為 M M M個相位分量( x ( n ? k ) x(n-k) x(n?k) k = 0 , 1 , … , M ? 1 k=0,1,\dots,M-1 k=0,1,,M?1
    • 每個子濾波器 H k H_k Hk?處理對應的相位分量
    • 結果相加得到輸出 y ( n ) y(n) y(n)
  2. 頻域驗證
    通過替換 z = e j ω z = e^{j\omega} z=e,可驗證原頻率響應與多相分解后的響應一致。


5、應用場景
  1. 多速率信號處理
    在抽取(Decimation)和插值(Interpolation)中,多相分解可降低計算復雜度。
  2. 并行化實現
    各子濾波器 H k ( z M ) H_k(z^M) Hk?(zM)可并行計算,提升硬件效率。
  3. 濾波器組設計
    用于均勻DFT濾波器組、小波變換等。

二、Python實現與驗證

該實戰,通過兩種同的方法進行抽取濾波,將信號采樣率降低到原來的1/4,并對結果進行對比和誤差分析。

1. 生成測試信號
import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import firwin, lfilter# 生成測試信號:10Hz正弦波 + 100Hz高頻噪聲
fs = 1000  # 采樣率
t = np.arange(0, 1, 1/fs)
x = np.sin(2*np.pi*10*t) + 0.5*np.random.randn(len(t))  # 原始信號
2. 設計FIR濾波器
# 設計低通FIR濾波器(截止頻率50Hz,階數N=31)
N = 31
fc = 50
h = firwin(N, fc, fs=fs, window='hamming')  # 獲取系數
3. 標準FIR濾波
y_fir = lfilter(h, 1, x)  # FIR濾波結果
4. 多相分解(M=4)
M = 4  # 分解因子
poly_h = [h[k::M] for k in range(M)]  # 分解為M個子濾波器# 補零對齊長度(確保所有子濾波器長度一致)
max_len = max(len(p) for p in poly_h)
poly_h = [np.pad(p, (0, max_len - len(p))) for p in poly_h]
5. 多相濾波實現
# 初始化輸出
y_poly = np.zeros_like(x)# 處理每個子濾波器分支
for k in range(M):# 抽取輸入信號的相位分量x_k = x[k::M]# 子濾波器濾波y_k = lfilter(poly_h[k], 1, x_k)# 上采樣并添加延遲y_up = np.zeros(len(x))y_up[k::M] = y_k  # 上采樣(插入零)y_up = np.roll(y_up, -k)  # 延遲補償y_poly += y_up  # 合并分支結果# 截斷初始延遲
y_poly = y_poly[:len(x)-N]
y_fir = y_fir[:len(x)-N]
x_trim = x[:len(x)-N]
y_fir = np.roll(y_fir, -3)
6. 可視化對比
plt.figure(figsize=(12, 8))# 原始信號與濾波結果
plt.subplot(3,1,1)
plt.plot(x_trim, label='原始信號', alpha=0.5)
plt.plot(y_fir, label='FIR濾波結果', linewidth=2)
plt.legend()
plt.title('FIR濾波效果')y_fir = y_fir[0::M] #抽取
y_poly = y_poly[0::M] #抽取# 多相濾波結果對比
plt.subplot(3,1,2)
plt.plot(y_poly, label='多相濾波結果', linestyle='--')
plt.plot(y_fir, label='FIR濾波結果', alpha=0.7)
plt.legend()
plt.title('多相濾波與FIR結果對比')# 誤差分析
plt.subplot(3,1,3)
error = y_fir - y_poly[:len(y_fir)]
plt.plot(error, label='誤差', color='red')
plt.legend()
plt.title('誤差曲線 (最大誤差: {:.2e})'.format(np.max(np.abs(error))))plt.tight_layout()
plt.show()

在這里插入圖片描述

三、代碼輸出驗證

  1. 圖形對比

    • 第一張圖展示原始信號與FIR濾波結果。
    • 第二張圖疊加顯示FIR與多相濾波結果,兩者應完全重合。
    • 第三張圖顯示誤差曲線。
  2. 數值驗證
    誤差曲線最大值接近機器精度,證明兩種結構數學等價。


四、關鍵點說明

  1. 多相分解的物理意義

    • 每個子濾波器處理信號的特定相位分量,通過并行化降低計算復雜度。
  2. 延遲補償的重要性

    • 分支信號需通過np.roll對齊時間軸,確保相位同步。
  3. 應用場景優勢

    • 在多速率系統中(如抽取/插值),多相分解可減少計算量達 M M M倍。

通過上述實現,可直觀驗證FIR濾波器與其多相分解形式的等效性,為信號處理系統優化提供可靠依據。

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

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

相關文章

【大模型基礎_毛玉仁】2.3 基于 Encoder-only 架構的大語言模型

更多內容&#xff1a;XiaoJ的知識星球 目錄 2.3 基于Encoder-only 架構的大語言模型2.3.1 Encoder-only 架構2.3.2 BERT 語言模型1&#xff09;BERT 模型結構2&#xff09;BERT 預訓練方式3&#xff09;BERT 下游任務 2.3.3 BERT 衍生語言模型1&#xff09;RoBERTa 語言模型2&a…

AIP-165 按條件刪除

編號165原文鏈接https://google.aip.dev/165狀態批準創建日期2019-12-18更新日期2019-12-18 有時API需要提供一種機制&#xff0c;按照一些過濾參數刪除大量資源&#xff0c;而非提供待刪除的各資源名字。 這是一個稀有的場景&#xff0c;用于用戶一次性刪除數千或更多資源的…

【Maven教程與實戰案例】

文章目錄 前言一、Maven是什么&#xff1f;二、Maven的安裝與配置1. 安裝前置條件2. 下載與配置 Maven3. 驗證安裝 三、Maven的核心概念1. POM.xml 文件2. 構建生命周期與插件機制 四、實戰項目示例1. 項目目錄結構2. 編寫代碼App.javaAppTest.java 3. 構建項目4. 運行項目 前言…

20250310:OpenCV mat對象與base64互轉

代碼: https://github.com/ReneNyffenegger/cpp-base64 指南:https://renenyffenegger.ch/notes/development/Base64/Encoding-and-decoding-base-64-with-cpp/ 實操:

概率論的基本知識

逆概率還不懂&#xff0c;改天再想想。 聯合概率 聯合概率&#xff08;Joint Probability&#xff09; 是概率論中的一個重要概念&#xff0c;用于描述多個隨機變量同時取某些值的概率。聯合概率可以幫助我們理解多個變量之間的關系。

pytest數據庫測試文章推薦

參考鏈接&#xff1a; 第一部分&#xff1a;http://alextechrants.blogspot.fi/2013/08/unit-testing-sqlalchemy-apps.html第二部分&#xff1a;http://alextechrants.blogspot.fi/2014/01/unit-testing-sqlalchemy-apps-part-2.html

如何自己做奶茶,從此告別奶茶店

自制大白兔奶茶&#xff0c;奶香與茶香激情碰撞&#xff0c;每一口都是香濃與甜蜜的雙重誘惑&#xff0c;好喝到跺腳&#xff01;絲滑口感在舌尖舞動&#xff0c;仿佛味蕾在開派對。 簡單幾步就能復刻&#xff0c;成本超低&#xff0c;輕松在家享受奶茶自由。 材料:大白兔奶糖&…

SOA(面向服務架構)與微服務架構的區別與聯系

SOA&#xff08;面向服務架構&#xff09;與微服務架構的區別與聯系 1. 引言 在現代軟件架構中&#xff0c;SOA&#xff08;Service-Oriented Architecture&#xff0c;面向服務架構&#xff09;和微服務架構&#xff08;Microservices Architecture&#xff09;是兩種常見的…

LLM的準確率評估采用什么方式:準確率評估使用的是 `sklearn.metrics` 模塊中的 `accuracy_score` 函數

LLM的準確率評估采用什么方式:準確率評估使用的是 sklearn.metrics 模塊中的 accuracy_score 函數 評估方式 代碼里的準確率評估是基于每個樣本最后一個預測的 token 與真實的 token 進行對比。具體來說,它會遍歷測試數據集中的每個樣本,使用模型預測出最后一個 token 的 …

文件和異常

從文件中讀取數據 讀取整個文件 讀取整個文件 要讀取文件&#xff0c;需要一個包含幾行文本的文件。下面首先創建一個文件&#xff0c;它包含精確 到小數點后30位的圓周率值&#xff0c;且在小數點后每10位處換行&#xff1a; pi_digits.txt 3.14159265358979323846264338…

2025最新版Windows通過GoLand遠程連接Linux構建Go項目保姆級教學

以Ubuntu24.04和GoLand2024.1.6為例子&#xff0c;演示如何在Windows上通過GoLand遠程連接Linux進行Go編程。 通過go version指令可以發現當前Ubuntu系統沒有安裝go。 go version 通過指令安裝go&#xff0c;其他系統可以通過wget安裝&#xff0c;要指定安裝的具體go版本&…

Spring Boot 集成 Lua 腳本:實現高效業務邏輯處理

1. 前言 1.1 什么是Lua Lua是一種輕量級、高性能的腳本語言,常用于游戲開發、嵌入式系統、配置文件解析等領域。Lua語法簡潔,易于學習和使用,且具有強大的擴展性。 1.2 Spring Boot與Lua集成的意義 將Lua集成到Spring Boot應用中,可以實現動態配置業務邏輯、簡化復雜業…

Linux筆記---文件系統硬件部分

1. 文件系統 文件系統是操作系統用于明確存儲設備&#xff08;常見的是磁盤&#xff0c;也有基于NAND Flash的固態硬盤&#xff09;或分區上的文件的方法和數據結構&#xff0c;即在存儲設備上組織文件的方法。 1.1 基本組成 索引節點&#xff08;inode&#xff09;&#xff…

12.31[net]review

復用&#xff08;Multiplexing&#xff09;的概念 定義&#xff1a;在傳輸層&#xff0c;復用是指多個應用進程可以使用同一個傳輸層協議&#xff08;如 TCP 或 UDP&#xff09;來發送數據。從應用層的角度看&#xff0c;不同的應用進程&#xff08;如網頁瀏覽器、郵件客戶端等…

網絡安全防護架構有哪些 網絡安全防護措施包括

網絡安全預防措施 網安措施 計算機網絡安全措施主要包括保護網絡安全、保護應用服務安全和保護系統安全三個方面&#xff0c;各個方面都要結合考慮安全防護的物理安全、防火墻、信息安全、Web安全、媒體安全等等。 (一)保護網絡安全。 網絡安全是為保護商務各方網絡端系統之…

物理筆記 | 拓撲相變的物理圖像

1. 一般相變 對于一般的相變是朗道理論預言的由對稱性自發破缺導致的。 比如在一維橫場Ising模型中的量子相變 H ? J ∑ j σ j z σ j 1 z ? h ∑ j σ j x H -J \sum_{j} \sigma_j^z \sigma_{j1}^z - h \sum_{j} \sigma_j^x H?Jj∑?σjz?σj1z??hj∑?σjx? 其相…

紅黑樹介紹

1 問題引入 為什么有AVL樹&#xff0c;還要引入紅黑樹&#xff1f; 在進行多次的插入和刪除時&#xff1a; 1&#xff09;AVL樹會存在大量的旋轉操作&#xff0c;追求的是嚴格平衡&#xff1b; 2&#xff09;紅黑樹通過為節點增加顏色來換取增刪節點時旋轉次數…

Java基礎:枚舉類enum入門案例

1.基礎枚舉定義與使用&#xff1a; package com.zxy;public class Main {public static void main(String[] args) { // 獲取枚舉值cars car cars.BMW;switch (car){case BMW :System.out.println("BMW");break;case BENZ :System.out.println("BENZ&…

torch numpy sort排序出現索引順序不正常

問題 torch 調用numpy ,numpy 的sort排序值的順序沒發現問題&#xff0c;但是排序的索引argsort()是有明顯問題。 方案 多一次取索引 arr.argsort().argsort()參考&#xff1a; https://blog.csdn.net/qq_50571974/article/details/123173118

大模型架構記錄5-向量數據庫

一 倒排索引、KNN、PQ 1.1 基礎版本 query -> requery 對問題做處理&#xff0c;處理上下文 對query 做 refined query 1.2 向量數據庫 二 搜索邏輯 2.1 knn 2.2 近似KNN 先和N個空間的均值比較再和空間內部的所有點比較&#xff0c;計算最近值。 優化一&#xff1a; …