RSS

周波数応答

離散時間で表されたインパルス応答から周波数応答を求める方法。

インパルス応答が

$$ h[n] = \left\{ \begin{array}{ll} \frac{1}{5}, & n = 0,1,2,3,4 \\ 0, & \text{otherwise} \end{array} \right. $$

であるようなシステムを考える。

伝達関数は、z変換を適用して

$$ \begin{eqnarray} H(z) & = & \sum_{k=0}^4 \frac{1}{5} z^{-k} \
& = & \frac{1}{5} \frac{1-z^{-5}}{1-z^{-1}} \end{eqnarray} $$

となる。周波数応答は、$z=e^{j \omega}$ を代入して

$$ \begin{eqnarray} H(e^{j \omega}) & = & \frac{1}{5} \frac{1-e^{-j5\omega}}{1-e^{-j\omega}} \end{eqnarray} $$

絶対値をプロットすると以下のようになる。

周波数応答

ソースコード(Python)

import matplotlib.pyplot as plt
import numpy as np

omg = np.linspace(-np.pi, np.pi, 100)

alpha = 0.8
z = np.exp(1j * omg)
#H = 1 / (1 - alpha*(1/z)) 
H = (1/5) * (1 - z**(-5)) / (1- z**(-1))

print(plt.style.available)
plt.style.use('default')  # use default style

fig,ax=plt.subplots()
ax.set_facecolor("white") # background color
ax.grid(color='lightgray')   # grid color

#ax.spines["right"].set_color("blue")   # right color = blue
#ax.spines["right"].set_color("none")  # erase right line
#ax.spines["top"].set_color("none")    # erase up line
#ax.spines["left"].set_color("m")         # left color = magenta
#ax.spines["bottom"].set_color("c")    # bottom color = cyan

plt.plot(omg, np.abs(H))
plt.xlim([-np.pi,np.pi])
plt.ylim([0,1])
plt.xticks([-np.pi,-0.5*np.pi,0,0.5*np.pi,np.pi],[r'$-\pi$',r'$-\frac{\pi}{2}$','0',r'$\frac{\pi}{2}$',r'$\pi$'])
plt.yticks([0.0, 0.2, 0.4, 0.6, 0.8, 1.0],['0.0', '0.2', '0.4', '0.6', '0.8', '1.0'])
plt.xlabel(r'$\omega$')
plt.ylabel(r'$|H(e^{j \omega})|$')
plt.title(r'Frequency Reponse of $H(z)$')

plt.savefig("fig1.png")
plt.savefig("fig1.eps")

plt.figure()
plt.plot(omg, 20*np.log10(np.abs(H)))
plt.grid(True)
#plt.yscale("log")
plt.savefig("fig2.png")

ソースコード(Mathematica)

h[n_] := (1/5)*(DiscreteDelta[n] + DiscreteDelta[n-1] + DiscreteDelta[n-2] + DiscreteDelta[n-3] + DiscreteDelta[n-4])

H[z_] := ZTransform[h[n], n, z]

H[w] := H[z] /. z-> E^(I w)

Plot[Abs[H[w]], {w, -Pi,Pi}, PlotRange->{0,1}]

周波数応答