LoginSignup
0
0

デジタルフィルタメモ

Last updated at Posted at 2024-05-05

第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()
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0