簡體   English   中英

頻率響應Scipy.signal

[英]Frequency Response Scipy.signal

我正在學習數字信號處理以實現過濾器,並使用python輕松實現測試思路。 所以我剛開始使用scipy.signal庫來查找不同濾波器的脈沖響應和頻率響應。

目前我正在閱讀“保羅·林恩(1992)的數字信號,處理器和噪聲”一書(並且發現它是學習這些東西的一個驚人的資源)。 在本書中,他們有一個過濾器,其傳遞函數如下所示:

我將分子和分母除以 為了得到以下等式:

然后我使用Scipy實現了這個:

NumeratorZcoefs = [1, -1, 1, -1]
DenominatorZcoefs = [1, 0.54048, -0.62519, -0.66354, 0.60317, 0.69341]

FreqResponse = scipy.signal.freqz(NumeratorZcoefs, DenominatorZcoefs)
fig = plt.figure(figsize = [8, 6])
ax = fig.add_subplot(111)
ax.plot(FreqResponse[0], abs(np.array(FreqResponse[1])))
ax.set_xlim(0, 2*np.pi)
ax.set_xlabel("$\Omega$")

並生成如下圖:

繪圖顯示由Scipy.sigal.freqz計算的頻率響應

然而,在本書中,頻率響應顯示如下:

繪圖顯示上面引用的書中的頻率響應

它們具有相同的形狀,但是對於2個圖,峰值在~2.3和0.5處的比例非常不同,有人可能會說明為什么會這樣嗎?

編輯:

為了補充一點,我剛剛實現了一個函數來手動計算頻率響應(通過計算函數的極點和零點的距離),並得到與scipy.signal生成的圖形相似的比率,但是數字不一樣,有誰知道為什么會這樣?

實施如下:

def H(omega):
    z1 = np.array([0,0]) # zero at 0, 0
    z2 = np.array([0,0]) # Another zero at 0, 0
    z3 = np.array([0, 1]) # zero at i
    z4 = np.array([0, -1]) # zero at -i
    z5 = np.array([1, 0]) # zero at 1

    z = np.array([z1, z2, z3, z4, z5])

    p1 = np.array([-0.8, 0])
    p = cmath.rect(0.98, np.pi/4)
    p2 = np.array([p.real, p.imag])
    p = cmath.rect(0.98, -np.pi/4)
    p3 = np.array([p.real, p.imag])
    p = cmath.rect(0.95, 5*np.pi/6)
    p4 = np.array([p.real, p.imag])
    p = cmath.rect(0.95, -5*np.pi/6)
    p5 = np.array([p.real, p.imag])

    p = np.array([p1, p2, p3, p4, p5])

    a = cmath.rect(1,omega)
    a_2dvector = np.array([a.real, a.imag])

    dz = z-a_2dvector
    dp = p-a_2dvector

    dzmag = []
    for dis in dz:
           dzmag.append(np.sqrt(dis.dot(dis)))

    dpmag = []
    for dis in dp:
           dpmag.append(np.sqrt(dis.dot(dis)))        

    return(np.product(dzmag)/np.product(dpmag))

然后我像這樣繪制頻率響應:

omegalist = np.linspace(0,2*np.pi,5000)
Hlist = []

for omega in omegalist:
    Hlist.append(H(omega))

fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(omegalist, Hlist)
ax.set_xlabel("$\Omega$")
ax.set_ylabel("$|H(\Omega)|$")

得到以下情節:

通過手動計算頻率響應得出的圖。

SciPy生成的頻率響應是正確的。 無論如何,我不相信這本書似乎是手工繪制的。

如果你想“手動”找到頻率響應,可以通過定義一個返回原始Z變換並在單位圓上進行評估的函數來完成,如下所示

def H(z):
    num = z**5 - z**4 + z**3 - z**2
    denom = z**5 + 0.54048*z**4 - 0.62519*z**3 - 0.66354*z**2 + 0.60317*z + 0.69341
    return num/denom

import numpy as np
import matplotlib.pyplot as plt

w_range = np.linspace(0, 2*np.pi, 1000)
plt.plot(w_range, np.abs(H(np.exp(1j*w_range))))

結果與SciPy完全相同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM