デジタルフィルタメモ



第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の補数


```py

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')
```

https://www.aisl.cs.tut.ac.jp/~satake/class/P4/P4_1-lecture.pdf



```py
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()
```