Python NumPy 中的 Blackman 窗函式


簡介

在訊號處理和頻譜分析中,窗函式在訊號的形成和修改中起著至關重要的作用。Blackman 窗函式是訊號處理中常用的窗函式,它有助於減少頻譜洩漏效應。它可以使用高效的 NumPy 庫在 Python 中實現,該庫提供了高效的陣列運算和科學計算功能。

在本文中,我們將探討使用功能強大的 NumPy 庫在 Python 中實現 Blackman 窗函式的三種不同方法。每種方法都將附帶詳細的計算、逐步說明、Python 語法以及各自輸出的程式碼示例。

Python NumPy 中的 Blackman 窗函式

Blackman 窗函式是訊號處理中常用的窗函式,它有助於減少頻譜洩漏效應。它可以使用高效的 NumPy 庫在 Python 中實現,該庫提供了高效的陣列運算和科學計算功能。

為了使用 NumPy 在 Python 中實現 Blackman 窗函式,您可以使用其向量化運算。透過利用這些運算,您可以高效地計算每個樣本的窗函式值。Blackman 窗函式的公式可以使用 NumPy 的內建函式(例如,用於生成陣列的 arange 函式和用於計算餘弦值的 cos 函式)來實現。生成的窗函式值將儲存在 NumPy 陣列中,可以方便地訪問和操作。

示例 1:使用 NumPy 的向量化運算

第一種方法使用 NumPy 的向量化運算來高效地計算 Blackman 窗函式的值。以下是這種方法的演算法概述。

演算法

  • 步驟 1 − 匯入 NumPy 庫。

  • 步驟 2 − 建立一個包含一個引數 N 的函式 blackman_window(N)。

  • 步驟 3 − 使用公式:0.42 - 0.5 * np.cos((2 * np.pi * t) / (N - 1)) + 0.08 * np.cos((4 * np.pi * t) / (N - 1)) 來計算 Blackman 窗函式的值。(注意:這裡假設 `t` 是一個從 0 到 N-1 的陣列)

  • 步驟 4 − 將計算出的窗函式作為 NumPy 陣列返回。

程式程式碼

import numpy as l
def blackman_window(r):
   t = l.arange(r)
   window = 0.42 - 0.5 * l.cos((2 * l.pi * t) / (r - 1)) + 0.08 * l.cos((4 * l.pi * t) / (r - 1))
   return window
# Example usage
wn_size = 100
blackman = blackman_window(wn_size)
print(blackman)

輸出

[-1.38777878e-17  3.63046791e-04  1.45848970e-03  3.30508601e-03
  5.93359947e-03  9.38606173e-03  1.37147565e-02  1.89809442e-02
  2.52533489e-02  3.26064346e-02  4.11185013e-02  5.08696327e-02
  6.19395342e-02  7.44052977e-02  8.83391330e-02  1.03806108e-01
  1.20861937e-01  1.39550858e-01  1.59903635e-01  1.81935733e-01
  2.05645686e-01  2.31013696e-01  2.58000502e-01  2.86546517e-01
  3.16571288e-01  3.47973259e-01  3.80629867e-01  4.14397981e-01
  4.49114657e-01  4.84598234e-01  5.20649734e-01  5.57054572e-01
  5.93584531e-01  6.30000000e-01  6.66052422e-01  7.01486938e-01
  7.36045180e-01  7.69468167e-01  8.01499281e-01  8.31887262e-01
  8.60389188e-01  8.86773393e-01  9.10822277e-01  9.32334982e-01
  9.51129866e-01  9.67046769e-01  9.79949017e-01  9.89725134e-01
  9.96290257e-01  9.99587205e-01  9.99587205e-01  9.96290257e-01
  9.89725134e-01  9.79949017e-01  9.67046769e-01  9.51129866e-01
  9.32334982e-01  9.10822277e-01  8.86773393e-01  8.60389188e-01
  8.31887262e-01  8.01499281e-01  7.69468167e-01  7.36045180e-01
  7.01486938e-01  6.66052422e-01  6.30000000e-01  5.93584531e-01
  5.57054572e-01  5.20649734e-01  4.84598234e-01  4.49114657e-01
  4.14397981e-01  3.80629867e-01  3.47973259e-01  3.16571288e-01

示例 2:列表推導式

第二種方法使用列表推導式來建立 Blackman 窗函式的值。以下是這種方法的演算法概述。

演算法

  • 步驟 1 − 匯入指定的庫。

  • 步驟 2 − 建立一個名為 blackman_window(N) 的函式。

  • 步驟 3 − 在列表推導式中使用公式計算 Blackman 窗函式的值。

  • 步驟 4 − 將生成的列表轉換為 NumPy 陣列。

  • 步驟 5 − 返回計算出的窗函式。

程式程式碼

import numpy as r

def blackman_window(t):
   window = [0.42 - 0.5 * r.cos((2 * r.pi * n) / (t - 1)) + 0.08 * r.cos((4 * r.pi * n) / (t - 1)) for n in range(t)]
   return r.array(window)

# Example usage
window_size = 100
blackman = blackman_window(window_size)
print(blackman)

輸出

[-1.38777878e-17  3.63046791e-04  1.45848970e-03  3.30508601e-03
  5.93359947e-03  9.38606173e-03  1.37147565e-02  1.89809442e-02
  2.52533489e-02  3.26064346e-02  4.11185013e-02  5.08696327e-02
  6.19395342e-02  7.44052977e-02  8.83391330e-02  1.03806108e-01
  1.20861937e-01  1.39550858e-01  1.59903635e-01  1.81935733e-01
  2.05645686e-01  2.31013696e-01  2.58000502e-01  2.86546517e-01
  3.16571288e-01  3.47973259e-01  3.80629867e-01  4.14397981e-01
  4.49114657e-01  4.84598234e-01  5.20649734e-01  5.57054572e-01
  5.93584531e-01  6.30000000e-01  6.66052422e-01  7.01486938e-01
  7.36045180e-01  7.69468167e-01  8.01499281e-01  8.31887262e-01
  8.60389188e-01  8.86773393e-01  9.10822277e-01  9.32334982e-01
  9.51129866e-01  9.67046769e-01  9.79949017e-01  9.89725134e-01
  9.96290257e-01  9.99587205e-01  9.99587205e-01  9.96290257e-01
  9.89725134e-01  9.79949017e-01  9.67046769e-01  9.51129866e-01
  9.32334982e-01  9.10822277e-01  8.86773393e-01  8.60389188e-01
  8.31887262e-01  8.01499281e-01  7.69468167e-01  7.36045180e-01
  7.01486938e-01  6.66052422e-01  6.30000000e-01  5.93584531e-01
  5.57054572e-01  5.20649734e-01  4.84598234e-01  4.49114657e-01
  4.14397981e-01  3.80629867e-01  3.47973259e-01  3.16571288e-01

示例 3:使用 NumPy 的 fromfunction 方法

第三種方法使用 NumPy 的 fromfunction 方法,該方法允許我們透過對每個座標執行函式來建立陣列。以下是這種方法的演算法概述。

演算法

  • 步驟 1 − 匯入所需的模組。

  • 步驟 2 − 建立一個函式 blackman_window(N),該函式將窗函式大小 N 作為引數。

  • 步驟 3 − 定義一個內部函式 blackman_func(n),該函式根據給定的索引 n 計算 Blackman 窗函式的值。

  • 步驟 4 − 使用 np.fromfunction 透過將 blackman_func 函式應用於每個座標來建立窗函式陣列。

  • 步驟 5 − 返回計算出的窗函式。

程式程式碼

import numpy as np

def blackman_window(N):
   def blackman_func(n):
      return 0.42 - 0.5 * np.cos((2 * np.pi * n) / (N - 1)) + 0.08 * np.cos((4 * np.pi * n) / (N - 1))
    
   window = np.fromfunction(blackman_func, (N,))
   return window

# Example usage
window_size = 100
blackman = blackman_window(window_size)
print(blackman)

輸出

[-1.38777878e-17  3.63046791e-04  1.45848970e-03  3.30508601e-03
  5.93359947e-03  9.38606173e-03  1.37147565e-02  1.89809442e-02
  2.52533489e-02  3.26064346e-02  4.11185013e-02  5.08696327e-02
  6.19395342e-02  7.44052977e-02  8.83391330e-02  1.03806108e-01
  1.20861937e-01  1.39550858e-01  1.59903635e-01  1.81935733e-01
  2.05645686e-01  2.31013696e-01  2.58000502e-01  2.86546517e-01
  3.16571288e-01  3.47973259e-01  3.80629867e-01  4.14397981e-01
  4.49114657e-01  4.84598234e-01  5.20649734e-01  5.57054572e-01
  5.93584531e-01  6.30000000e-01  6.66052422e-01  7.01486938e-01
  7.36045180e-01  7.69468167e-01  8.01499281e-01  8.31887262e-01
  8.60389188e-01  8.86773393e-01  9.10822277e-01  9.32334982e-01
  9.51129866e-01  9.67046769e-01  9.79949017e-01  9.89725134e-01
  9.96290257e-01  9.99587205e-01  9.99587205e-01  9.96290257e-01
  9.89725134e-01  9.79949017e-01  9.67046769e-01  9.51129866e-01
  9.32334982e-01  9.10822277e-01  8.86773393e-01  8.60389188e-01
  8.31887262e-01  8.01499281e-01  7.69468167e-01  7.36045180e-01
  7.01486938e-01  6.66052422e-01  6.30000000e-01  5.93584531e-01
  5.57054572e-01  5.20649734e-01  4.84598234e-01  4.49114657e-01
  4.14397981e-01  3.80629867e-01  3.47973259e-01  3.16571288e-01

結論

在本文中,我們研究了使用 NumPy 庫在 Python 中實現 Blackman 窗函式的三種不同方法。我們介紹了每種方法的計算、逐步說明、Python 語法以及各自的程式碼示例和輸出。第一種方法使用了 NumPy 的向量化運算,第二種方法使用了列表推導式,第三種方法使用了 NumPy 的 fromfunction 方法。

更新於:2023年8月25日

瀏覽量:211

啟動你的職業生涯

透過完成課程獲得認證

開始學習
廣告
© . All rights reserved.