[學習] 多項濾波器在信號插值和抽取中的應用:原理、實現與仿真(完整仿真代碼)

多項濾波器在信號插值和抽取中的應用:原理、實現與仿真

文章目錄

      • 多項濾波器在信號插值和抽取中的應用:原理、實現與仿真
        • 引言
      • 第一部分:原理詳解
        • 1.1 信號插值中的原理
        • 1.2 信號抽取中的原理
        • 1.3 多項濾波器的通用原理
      • 第二部分:實現詳解
        • 2.1 濾波器設計
        • 2.2 實現優化技巧
      • 第三部分:Python仿真完整實驗例子
        • 實驗設計
        • 完整代碼
        • 代碼解釋與結果分析
      • 結論


在數字信號處理(DSP)中,信號采樣率的轉換是常見需求,例如在音頻處理、通信系統和圖像重建中。插值(增加采樣率)和抽取(減少采樣率)是核心操作,但直接操作會引入混疊或鏡像失真。多項濾波器(polyphase filter)通過高效的結構解決了這一問題,顯著降低了計算復雜度。本文將從原理和實現兩個角度,詳細解析多項濾波器在插值和抽取中的應用,并提供完整的Python仿真實驗。所有內容基于DSP標準理論,確保零虛構。

引言

信號采樣率轉換涉及兩個基本操作:

  • 插值(Interpolation):將采樣率從 f s f_s fs? 提升到 L × f s L \times f_s L×fs? L L L 為插值因子),通過在原始樣本間插入零值樣本,再應用低通濾波器去除高頻鏡像。
  • 抽取(Decimation):將采樣率從 f s f_s fs? 降低到 f s / M f_s / M fs?/M M M M 為抽取因子),先應用低通濾波器抗混疊,再下采樣丟棄部分樣本。

直接實現這些操作計算量大,尤其在高采樣率因子時。多項濾波器(一種多相分解技術)通過將濾波器分解為多個并行子濾波器,優化了處理效率。它在FPGA、DSP芯片和軟件實現中廣泛應用,如5G通信和音頻重采樣。接下來,我將從原理到實現逐步展開。


第一部分:原理詳解

多項濾波器的核心在于多相分解(polyphase decomposition),它將一個低通濾波器拆分為多個子濾波器(稱為多相分量),實現并行計算。這大幅減少了乘加操作(MAC),尤其在插值和抽取中。

1.1 信號插值中的原理

插值的目標是增加采樣率而不引入失真。過程分為兩步:

  1. 零值插入:在原始信號 x [ n ] x[n] x[n] 的每個樣本間插入 L ? 1 L-1 L?1 個零值,得到上采樣信號 x up [ k ] x_{\text{up}}[k] xup?[k]
  2. 低通濾波:應用截止頻率為 f s / ( 2 L ) f_s/(2L) fs?/(2L) 的低通濾波器,去除由零插入引起的鏡像分量(mirror images),輸出平滑信號 y [ k ] y[k] y[k]

多項濾波器的應用

  • 傳統方法直接濾波計算量大(復雜度 O ( N L ) O(NL) O(NL),其中 N N N 是濾波器階數)。
  • 多相分解:將濾波器 h [ n ] h[n] h[n] 分解為 L L L 個子濾波器 e i [ n ] e_i[n] ei?[n] i = 0 , 1 , … , L ? 1 i = 0, 1, \dots, L-1 i=0,1,,L?1),每個子濾波器處理輸入信號的特定相位部分。
    • 數學表示: h [ n ] = ∑ i = 0 L ? 1 e i [ m ] δ [ n ? m L ? i ] h[n] = \sum_{i=0}^{L-1} e_i[m] \delta[n - mL - i] h[n]=i=0L?1?ei?[m]δ[n?mL?i],其中 m m m 是子索引。
  • 在插值中,多相結構允許并行處理:每個子濾波器獨立操作上采樣信號的對應相位,然后組合輸出。這降低了復雜度到 O ( N ) O(N) O(N),避免了冗余計算。
  • 優勢:減少延遲,提升實時性;適用于高 L L L 值場景,如音頻從44.1kHz升頻到192kHz。
1.2 信號抽取中的原理

抽取的目標是降低采樣率而不丟失信息。過程也分兩步:

  1. 抗混疊濾波:先應用截止頻率為 f s / ( 2 M ) f_s/(2M) fs?/(2M) 的低通濾波器,防止下采樣時高頻分量混疊到基帶。
  2. 下采樣:每 M M M 個樣本保留一個,得到降采樣信號 y [ m ] y[m] y[m]

多項濾波器的應用

  • 傳統方法需全濾波后再下采樣,計算效率低(復雜度 O ( N M ) O(NM) O(NM))。
  • 多相分解:將濾波器 h [ n ] h[n] h[n] 分解為 M M M 個子濾波器 e i [ n ] e_i[n] ei?[n] i = 0 , 1 , … , M ? 1 i = 0, 1, \dots, M-1 i=0,1,,M?1)。
    • 抽取時,輸入信號直接路由到對應子濾波器,每個子濾波器處理下采樣路徑。輸出通過選擇器組合。
    • 數學基礎:利用noble identities,將濾波和下采樣順序交換,實現等效但高效的結構。
  • 優勢:復雜度降至 O ( N ) O(N) O(N),節省資源;在軟件定義無線電(SDR)中廣泛應用,如從高采樣率ADC抽取數據。
1.3 多項濾波器的通用原理
  • 設計基礎:多項濾波器通常基于FIR(有限脈沖響應)濾波器設計,因為其線性相位和穩定性。常用窗函數法(如Kaiser窗)或等波紋法優化。
  • 關鍵參數:截止頻率 f c f_c fc? 必須滿足 Nyquist 定理 f c ≤ min ? ( f s / ( 2 L ) , f s / ( 2 M ) ) f_c \leq \min(f_s/(2L), f_s/(2M)) fc?min(fs?/(2L),fs?/(2M)),濾波器階數 N N N 影響過渡帶和阻帶衰減。
  • 性能權衡:高 N N N 提升濾波精度但增加延遲;多相分解的并行度取決于 L L L M M M,在硬件中可映射到多核處理。
  • 應用場景:除了插值抽取,還用于多速率系統(如濾波器組)、雷達信號處理等。

第二部分:實現詳解

實現多項濾波器涉及濾波器設計和多相結構部署。Python中可用SciPy和NumPy庫高效完成。以下分步說明設計方法和實現技巧。

2.1 濾波器設計
  • 設計步驟
    1. 確定規格:基于采樣率 f s f_s fs?、插值因子 L L L 或抽取因子 M M M,計算所需截止頻率 f c f_c fc?。例如,插值時 f c = f s / ( 2 L ) f_c = f_s / (2L) fc?=fs?/(2L)
    2. 選擇濾波器類型:推薦FIR濾波器,因其無反饋、易實現多相分解。使用窗函數法設計,如Hamming窗平衡旁瓣衰減。
    3. 計算系數:用公式 h [ n ] = sin ? ( 2 π f c n / f s ) π n × w [ n ] h[n] = \frac{\sin(2\pi f_c n / f_s)}{\pi n} \times w[n] h[n]=πnsin(2πfc?n/fs?)?×w[n] w [ n ] w[n] w[n] 是窗函數),或直接調用庫函數。
  • 多相分解實現
    • 將濾波器系數 h [ n ] h[n] h[n] 拆分為 P P P 個子集( P = L P = L P=L M M M):
      e i [ k ] = h [ i + k P ] e_i[k] = h[i + kP] ei?[k]=h[i+kP] for k = 0 , 1 , … , ? N / P ? k = 0, 1, \dots, \lfloor N/P \rfloor k=0,1,,?N/P?
    • 在插值中,每個子濾波器 e i e_i ei? 處理輸入信號的相位 i i i,輸出并行組合。
    • 在抽取中,輸入信號分路到子濾波器,下采樣后合并。
  • Python工具
    • 使用 scipy.signal.firwin 設計FIR濾波器。
    • scipy.signal.resample_poly 實現多相插值和抽取(內部已優化)。
    • 手動分解時,用NumPy數組操作。
2.2 實現優化技巧
  • 計算效率:多相結構減少乘法次數50%以上。在Python中,利用向量化(NumPy)避免循環。
  • 延遲管理:插值引入 N / 2 N/2 N/2 樣本延遲,抽取引入類似延遲。設計時選擇奇數 N N N 以減少相位失真。
  • 魯棒性:添加抗溢出處理,如飽和運算;測試不同 L / M L/M L/M 值(建議 L , M ≤ 8 L, M \leq 8 L,M8 以避免過度失真)。
  • 擴展應用:結合CIC(級聯積分梳狀)濾波器用于高因子轉換,或多級結構逐步處理。

第三部分:Python仿真完整實驗例子

以下是一個完整的Python仿真實驗,展示多項濾波器在信號插值和抽取中的應用。實驗使用SciPy和Matplotlib,代碼可直接運行(需安裝庫:pip install numpy scipy matplotlib)。

實驗設計
  • 目標:生成一個測試信號,應用插值( L = 2 L=2 L=2) 和抽取( M = 2 M=2 M=2),使用多相濾波器處理,并可視化比較。
  • 信號:合成一個10Hz正弦波 + 噪聲,采樣率 f s = 100 f_s = 100 fs?=100 Hz,時長1秒。
  • 濾波器:設計FIR低通濾波器,截止頻率 f c = 25 f_c = 25 fc?=25 Hz(滿足 f s / ( 2 L ) = 25 f_s/(2L) = 25 fs?/(2L)=25 Hz),階數 N = 31 N=31 N=31(奇數以確保線性相位)。
  • 多相實現:直接使用 scipy.signal.resample_poly,它內部采用多相分解。
  • 指標:比較原始信號、插值后信號(采樣率200 Hz)、抽取后信號(采樣率50 Hz),并分析頻譜避免混疊。
完整代碼
import numpy as np
import matplotlib.pyplot as plt
from scipy import signal# 參數設置
fs = 100  # 原始采樣率 (Hz)
T = 1     # 信號時長 (秒)
t = np.linspace(0, T, int(fs * T), endpoint=False)  # 時間向量
f_signal = 10  # 信號頻率 (Hz)
L = 2     # 插值因子
M = 2     # 抽取因子
fc = fs / (2 * max(L, M))  # 截止頻率 = 25 Hz (滿足 Nyquist)
N = 31    # 濾波器階數 (奇數以減少延遲)# 生成測試信號: 10Hz正弦波 + 高斯噪聲
np.random.seed(42)  # 可重復性
x = np.sin(2 * np.pi * f_signal * t) + 0.1 * np.random.randn(len(t))# 設計FIR低通濾波器 (使用Kaiser窗優化)
taps = signal.firwin(N, fc, fs=fs, window='hamming', pass_zero='lowpass')# 應用多項濾波器進行插值
# resample_poly 內部使用多相分解: up=L, down=1
x_interp = signal.resample_poly(x, L, 1, window=taps)  # 插值到 200 Hz
t_interp = np.linspace(0, T, len(x_interp), endpoint=False)# 應用多項濾波器進行抽取
# resample_poly: up=1, down=M
x_decim = signal.resample_poly(x, 1, M, window=taps)  # 抽取到 50 Hz
t_decim = np.linspace(0, T, len(x_decim), endpoint=False)# 可視化
plt.figure(figsize=(14, 10))# 時域圖: 原始、插值、抽取信號
plt.subplot(3, 1, 1)
plt.plot(t, x, 'b-', label=f'原始信號 (fs={fs} Hz)')
plt.xlabel('時間 (秒)')
plt.ylabel('幅度')
plt.title('時域比較')
plt.legend()
plt.grid(True)plt.subplot(3, 1, 2)
plt.plot(t_interp, x_interp, 'r-', label=f'插值后 (L={L}, fs={fs*L} Hz)')
plt.xlabel('時間 (秒)')
plt.ylabel('幅度')
plt.legend()
plt.grid(True)plt.subplot(3, 1, 3)
plt.plot(t_decim, x_decim, 'g-', label=f'抽取后 (M={M}, fs={fs//M} Hz)')
plt.xlabel('時間 (秒)')
plt.ylabel('幅度')
plt.legend()
plt.grid(True)plt.tight_layout()# 頻譜分析 (FFT 驗證無混疊/鏡像)
plt.figure(figsize=(14, 8))def plot_spectrum(signal, fs, title):n = len(signal)freq = np.fft.rfftfreq(n, 1/fs)mag = np.abs(np.fft.rfft(signal)) / nplt.plot(freq, 20 * np.log10(mag + 1e-10), label=title)  # dB 尺度plt.subplot(2, 1, 1)
plot_spectrum(x, fs, '原始信號頻譜')
plot_spectrum(x_interp, fs*L, '插值后頻譜')
plt.xlim(0, 100)
plt.xlabel('頻率 (Hz)')
plt.ylabel('幅度 (dB)')
plt.title('頻譜比較: 插值效果')
plt.legend()
plt.grid(True)plt.subplot(2, 1, 2)
plot_spectrum(x, fs, '原始信號頻譜')
plot_spectrum(x_decim, fs//M, '抽取后頻譜')
plt.xlim(0, 50)
plt.xlabel('頻率 (Hz)')
plt.ylabel('幅度 (dB)')
plt.title('頻譜比較: 抽取效果 (無混疊)')
plt.legend()
plt.grid(True)plt.tight_layout()
plt.show()# 輸出關鍵指標
print("實驗總結:")
print(f"- 濾波器系數: {taps[:5]}... (長度 {len(taps)})")
print(f"- 插值后采樣點數: {len(x_interp)} (預期: {len(x)*L})")
print(f"- 抽取后采樣點數: {len(x_decim)} (預期: {len(x)//M})")
print("驗證: 頻譜圖中,插值后無鏡像 (高頻衰減),抽取后無混疊 (能量集中在基帶)。")
代碼解釋與結果分析
  • 代碼步驟

    1. 生成10Hz正弦波加噪聲(模擬真實信號)。
    2. firwin 設計FIR低通濾波器(Hamming窗,確保平滑過渡)。
    3. 使用 resample_poly 實現插值(up=L, down=1)和抽取(up=1, down=M),該函數內部自動應用多相分解。
    4. 繪制時域波形和頻譜圖,比較處理前后信號。
  • 預期結果

    • 時域圖:插值后信號更密集(采樣率200 Hz),抽取后更稀疏(采樣率50 Hz),但波形保持正弦特征。
      在這里插入圖片描述

    • 頻譜圖:插值后無高頻鏡像(能量集中在0-25 Hz),抽取后無混疊(基帶10Hz分量保留,無虛假頻率)。
      在這里插入圖片描述

  • 優勢展示:多相濾波器高效性—代碼運行快速(復雜度低),適合實時系統。嘗試修改 L L L M M M(如 L = 4 L=4 L=4),觀察計算時間變化。


結論

多項濾波器通過多相分解,在信號插值和抽取中實現了計算效率的革命性提升。原理上,它利用并行子濾波器減少冗余操作;實現上,Python的SciPy庫提供了簡潔接口。本實驗驗證了其在抑制混疊和鏡像中的有效性。實際應用中,結合多級設計可處理更高采樣率轉換(如音頻重采樣芯片)。未來,隨著AI加速硬件的發展,多項濾波器將在5G和IoT中發揮更大作用。讀者可擴展本實驗:添加多信號源或測試不同濾波器類型(如IIR),以深化理解。


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


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

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

相關文章

Linux中source和bash的區別

在Linux中,source和bash(或sh)都是用于執行Shell腳本的命令,但它們在執行方式和作用域上有顯著區別: 1. 執行方式 bash script.sh(或sh script.sh) 啟動一個新的子Shell進程來執行腳本。腳本中的…

解決文明6 內存相關內容報錯EXCEPTION_ACCESS_VIOLATION

我裝了很多Mod,大約五六十個,經常出現內存讀寫異常的報錯。為了這個問題,我非常痛苦,已經在全球各大論壇查詢了好幾周,終于在下方的steam評論區發現了靠譜的解答討論區。 https://steamcommunity.com/app/289070/dis…

IIS 實現 HTTPS:OpenSSL證書生成與配置完整指南

參考 IIS7使用自簽名證書搭建https站點(內網外網都可用) windows利用OpenSSL生成證書,并加入IIS 親測有效 !!! IIS 配置自簽名證書 參考:IIS7使用自簽名證書搭建https站點(內網外網都可用) 親測可行性,不成功。 IIS 配置OpenSSL 證書 √ OpenSSL 下載 https://slp…

Spark DAG、Stage 劃分與 Task 調度底層原理深度剖析

Spark DAG、Stage 劃分與 Task 調度底層原理深度剖析 核心知識點詳解 1. DAG (Directed Acyclic Graph) 的構建過程回顧 Spark 應用程序的執行始于 RDD 的創建和一系列的轉換操作 (Transformations)。這些轉換操作(如 map(), filter(), reduceByKey() 等&#xff…

關于阿里云-云消息隊列MQTT的連接和使用,以及SpringBoot的集成使用

一、目的 本文主要記錄物聯網設備接入MQTT以及對接服務端SpringBoot整個的交互流程和使用。 二、概念 2.1什么是MQTT? MQTT是基于TCP/IP協議棧構建的異步通信消息協議,是一種輕量級的發布、訂閱信息傳輸協議。可以在不可靠的網絡環境中進行擴展,適用…

車載功能框架 --- 整車安全策略

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 簡單,單純,喜歡獨處,獨來獨往,不易合同頻過著接地氣的生活,除了生存溫飽問題之外,沒有什么過多的欲望,表面看起來很高冷,內心熱情,如果你身…

HarmonyOS5 讓 React Native 應用支持 HarmonyOS 分布式能力:跨設備組件開發指南

以下是 HarmonyOS 5 與 React Native 融合實現跨設備組件的完整開發指南,綜合關鍵技術與實操步驟: 一、分布式能力核心架構 React Native JS 層 → Native 橋接層 → HarmonyOS 分布式能力層(JavaScript) (ArkTS封裝) (設備發現/數據同步/硬件…

Unity打包到微信小程序的問題

GUI Error: Invalid GUILayout state in FlowchartWindow view. Verify that all layout Begin/End calls match UnityEngine.GUIUtility:ProcessEvent (int,intptr,bool&) 第一個問題可以不用管,這個不影響,這個錯誤,但是可以正常運行&a…

Hugging face 和 魔搭

都是知名的模型平臺,二者在定位、功能、生態等方面存在區別,具體如下: 一、定位與背景 Hugging Face: 定位是以自然語言處理(NLP)為核心發展起來的開源模型平臺,后續逐步拓展到文本、音頻、圖…

React 第六十一節 Router 中 createMemoryRouter的使用詳解及案例注意事項

前言 createMemoryRouter 是 React Router 提供的一種特殊路由器,它將路由狀態存儲在內存中而不是瀏覽器的 URL 地址欄中。 這種路由方式特別適用于測試、非瀏覽器環境(如 React Native)以及需要完全控制路由歷史的場景。 一、createMemoryRouter 的主要用途 測試環境:在…

透視黃金窗口:中國有機雜糧的高質量躍遷路徑

一、行業概覽:藍海市場背后的結構性紅利 伴隨全民健康意識提升和中產階層的擴大,中國有機雜糧市場正迎來新一輪結構性紅利期。根據《健康中國3.0時代:粗糧食品消費新趨勢與市場增長極》數據顯示,2020 年中國有機雜糧市場規模約 3…

實現p2p的webrtc-srs版本

1. 基本知識 1.1 webrtc 一、WebRTC的本質:實時通信的“網絡協議棧”類比 將WebRTC類比為Linux網絡協議棧極具洞察力,二者在架構設計和功能定位上高度相似: 分層協議棧架構 Linux網絡協議棧:從底層物理層到應用層(如…

OpenCV CUDA模塊圖像變形------對圖像進行上采樣操作函數pyrUp()

操作系統:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 編程語言:C11 算法描述 函數用于對圖像進行 上采樣操作(升采樣),是 GPU 加速版本的 高斯金字塔向上采樣(Gaussian Pyrami…

勒貝格測度、勒貝格積分

又要接觸測度論了。隨著隨機規劃的不斷深入,如果涉及到證明部分,測度論的知識幾乎不可或缺。 測度論的相關書籍,基本都非常艱澀難讀,對于非數學專業出身的人入門非常不易。從十幾年前開始,我很難把測度論教材看到超過…

UE5 學習系列(一)創建一個游戲工程

這個系類筆記用來記錄學習 UE 過程中遇到的一些問題與解決方案。整個博客的動機是在使用 AirSim 中遇到了不少性能瓶頸,因此想要系統性地去學一下 UE ,這個系列博客主要是跟著 B 站大佬 歐醬~ 和 GenJi是真想教會你 的系列視頻 《500 分鐘學會…

Nginx 負載均衡、高可用及動靜分離

Nginx 負載均衡、高可用及動靜分離深度實踐與原理剖析 在互聯網應用架構不斷演進的今天,如何高效地處理大量用戶請求、保障服務的穩定性與性能,成為開發者和運維人員面臨的關鍵挑戰。Nginx 作為一款高性能的 Web 服務器和反向代理服務器,憑借…

stm32溫濕度-超聲波-LCD1602結合項目(Proteus仿真程序)

資料下載地址:stm32溫濕度-超聲波-LCD1602結合項目(Proteus仿真程序) 程序實現功能: 程序基于stm32芯片實現了控制LED燈亮滅、按鍵控制、串口通信、電機控制、溫濕度數據采集、超聲波測距、LCD顯示屏顯示內容這幾個功能,并用proteus8進行仿…

新一代python管理工具--uv

uv 工具全方位介紹 起源與背景 uv 是由 Astral(pipx 作者)團隊用 Rust 語言開發的新一代 Python 包和環境管理工具。其目標是解決傳統 pip/venv/conda 在依賴解析慢、環境隔離繁瑣、命令復雜等方面的痛點,為現代 Python 項目提供極速、自動…

路由交換技術-思科拓撲搭建

配置流程 1.搭建網絡拓撲圖。 2.規劃配置IP地址,內網配置為192.168.1.0和192.168.2.0網段。 3.劃分vlan10,vlan20,vlan30。 4.配置靜態、動態路由。配置路由器Router7,使內外網互通。 5.配置鏈路聚合。通過鏈路聚合技術&#xff…

清華大學視覺空間智能新突破!Spatial-MLLM:提升多模態大語言模型的視覺空間智能能力

作者:Diankun Wu, Fangfu Liu, Yi?Hsin Hung, Yueqi Duan 單位:清華大學 論文標題:Spatial-MLLM: Boosting MLLM Capabilities in Visual-based Spatial Intelligence 論文鏈接:https://arxiv.org/pdf/2505.23747 項目主頁&a…