第1回目
サンプリング
量子化
サンプリング周波数
単位デルタ関数
離散ステップ関数
第2回目
エイリアシング
サンプリング定理
ナイキスト周波数
畳み込み
第3回目
y(n)=y(n-1)+x(n)
1クロック遅れz^(-1)
第4回目
第5回目
離散微分伝達関数
(1-z^(-1))
離散積分伝達関数
1/(1-z^(-1))
第6回目
(1+z^(-1))/(1-z^(-1)-((z^(-2)))/8)
離散1次遅れ系伝達関数
1/(1-Tz^(-1))
第7回目
第9回目
zの意味、複素三角関数e^(jωt)
移動平均フィルター
SignC関数
第11回目
FFT
第12回
FIRノッチフィルタ
移動平均フィルター
2進数の表し方
符号絶対値
オフセットバイナリー
2の補数
import numpy as np
import matplotlib.pyplot as plt
def freq_response_first_order_forward_difference(T, omega):
z = np.exp(1j * omega)
Hz = 1 - T/z
return Hz
def freq_response_first_order_lag_integrator(T, omega):
z = np.exp(1j * omega)
Hz = 1 / (1 - T/z)
return Hz
def freq_response_delay(omega):
return np.exp(-1j * omega)
def freq_response_bilinear_transform(T, omega):
z = np.exp(1j * omega)
Hz = (2/T) * (1 - z**(-1)) / (1 + z**(-1))
return Hz
def plot_bode(gain, phase, omega, title):
plt.figure(figsize=(10, 8))
# Gain plot
plt.subplot(2, 1, 1)
plt.semilogx(omega, 20 * np.log10(gain))
plt.title(title)
plt.xlabel('Angular Frequency (omega)')
plt.ylabel('Gain (dB)')
plt.grid(True)
# Phase plot
plt.subplot(2, 1, 2)
plt.semilogx(omega, np.angle(phase) * 180 / np.pi)
plt.xlabel('Angular Frequency (omega)')
plt.ylabel('Phase (degrees)')
plt.grid(True)
plt.tight_layout()
plt.show()
# Parameters setup
T = 0.1 # Time delay
omega = np.logspace(-2, 2, 1000) # Angular frequency range
# Calculate frequency responses
Hz1 = freq_response_first_order_forward_difference(T, omega)
Hz2 = freq_response_first_order_lag_integrator(T, omega)
Hz3 = freq_response_delay(omega)
Hz4 = freq_response_bilinear_transform(T, omega)
# Extract gain and phase
gain1 = np.abs(Hz1)
phase1 = np.angle(Hz1)
gain2 = np.abs(Hz2)
phase2 = np.angle(Hz2)
gain3 = np.abs(Hz3)
phase3 = np.angle(Hz3)
gain4 = np.abs(Hz4)
phase4 = np.angle(Hz4)
# Plot Bode diagrams
plot_bode(gain1, phase1, omega, '1st Order Forward Difference (Differentiator)')
plot_bode(gain2, phase2, omega, '1st Order Lag Integrator (Integrator)')
plot_bode(gain3, phase3, omega, 'Delay')
plot_bode(gain4, phase4, omega, 'Bilinear Transform')
import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import freqz
def H_fir(w, T1):
# FIRフィルターの伝達関数
H = 1 + np.exp(-1j * w)
return H
def H_iir(w, T1, T2):
# IIRフィルターの伝達関数
numerator = T1 + np.exp(-1j * w)
denominator = 1 - T1 * T2 - T2 * np.exp(-1j * w)
H = numerator / denominator
return H
# FIRフィルターとIIRフィルターのパラメータ
T1_fir = 0.5
T1_iir = 0.5
T2_iir = 0.3
# 角周波数の範囲(0からπまで)
w = np.linspace(0, np.pi, 1000)
# FIRフィルターの周波数応答計算
w_fir, h_fir = freqz([1, T1_fir], worN=w)
# IIRフィルターの周波数応答計算
b_iir = [1, T1_iir]
a_iir = [1, -(T1_iir * T2_iir + T2_iir)]
w_iir, h_iir = freqz(b_iir, a_iir, worN=w)
# ゲイン(振幅)と位相を計算
gain_fir = np.abs(h_fir)
phase_fir = np.angle(h_fir, deg=True) # 位相を度数に変換
gain_iir = np.abs(h_iir)
phase_iir = np.angle(h_iir, deg=True) # 位相を度数に変換
# ボード線図のプロット
plt.figure(figsize=(12, 8))
# FIRフィルターのプロット
plt.subplot(2, 2, 1)
plt.plot(w_fir, 20 * np.log10(gain_fir))
plt.title('FIR Filter Gain (dB)')
plt.xlabel('Frequency [radians/sample]')
plt.ylabel('Gain [dB]')
plt.grid(True)
plt.subplot(2, 2, 2)
plt.plot(w_fir, phase_fir)
plt.title('FIR Filter Phase')
plt.xlabel('Frequency [radians/sample]')
plt.ylabel('Phase [degrees]')
plt.grid(True)
# IIRフィルターのプロット
plt.subplot(2, 2, 3)
plt.plot(w_iir, 20 * np.log10(gain_iir))
plt.title('IIR Filter Gain (dB)')
plt.xlabel('Frequency [radians/sample]')
plt.ylabel('Gain [dB]')
plt.grid(True)
plt.subplot(2, 2, 4)
plt.plot(w_iir, phase_iir)
plt.title('IIR Filter Phase')
plt.xlabel('Frequency [radians/sample]')
plt.ylabel('Phase [degrees]')
plt.grid(True)
plt.tight_layout()
plt.show()