Pythonで遅れ時間後に0から始まるクロック信号を生成する方法
はじめに
クロック信号はデジタル回路や制御システムで重要な役割を果たします。本記事では、Pythonを用いて 遅れ時間(delay)後に0から始まり、特定の周波数で0と1を繰り返すクロック信号 を生成する方法について解説します。
コードの概要
以下のPythonコードでは、遅れ時間の後に0からスタートするクロック信号を作成し、Matplotlibを使って可視化します。
import numpy as np
import matplotlib.pyplot as plt
def delayed_clock_signal_start_zero(t, delay, f_H):
"""
指定した遅れ時間後に0から始まるクロック信号を生成
パラメータ:
t : np.array -> 時間軸
delay : float -> 遅れ時間(秒)
f_H : float -> クロック信号の周波数(Hz)
出力:
np.array -> 0と1を交互に繰り返すクロック信号(遅れ時間後に0からスタート)
"""
clock = np.zeros_like(t) # 初期値はすべて0
# 遅れ時間を超えた部分のマスクを作成
mask = t >= delay
time_after_delay = t[mask] - delay # 遅れ時間後の時間軸を0から始める
# 0から始まる矩形波を生成
clock[mask] = (np.floor(2 * f_H * time_after_delay) % 2) # 0 → 1 → 0 → 1 ...
return clock
# パラメータ設定
T_end = 0.1 # シミュレーション時間(100ms)
dt = 0.0001 # 時間刻み(100µs)
delay = 0.01 # 遅れ時間(0.01秒)
f_H = 50 # クロック信号の周波数(50Hz)
# クロック信号の周期を計算
T_cycle = 1 / f_H
# 時間軸の生成
t = np.arange(0, T_end, dt)
# クロック信号の生成
clock_signal = delayed_clock_signal_start_zero(t, delay, f_H)
# 遅れ時間と1周期を表示
print(f"遅れ時間: {delay} 秒")
print(f"クロック周期: {T_cycle} 秒")
# プロット
plt.figure(figsize=(8, 4))
plt.plot(t, clock_signal, label="Clock Signal (Delayed Start from 0)", drawstyle="steps-post")
plt.axvline(x=delay, color='r', linestyle='--', label="Delay Time")
plt.xlabel("Time (s)")
plt.ylabel("Clock Signal (0 or 1)")
plt.title(f"Delayed Clock Signal (Starts from 0, {f_H}Hz)")
plt.legend()
plt.grid()
plt.show()
コードの解説
1. 時間軸の作成
T_end = 0.1 # シミュレーション時間(100ms)
dt = 0.0001 # 時間刻み(100µs)
t = np.arange(0, T_end, dt)
- シミュレーションの時間範囲を
T_end
として100ms(0.1秒)に設定 - 時間刻み
dt
を0.0001秒(100µs)に設定し、高解像度で信号を生成 -
np.arange(0, T_end, dt)
で時間軸を作成
2. 遅れ時間後のクロック信号の生成
clock = np.zeros_like(t) # 初期値はすべて0
mask = t >= delay # 遅れ時間後のインデックスを取得
time_after_delay = t[mask] - delay # 遅れ時間後の時間軸を0から始める
clock[mask] = (np.floor(2 * f_H * time_after_delay) % 2) # 0 → 1 → 0 → 1 ...
-
clock
配列をすべて0で初期化 -
mask = t >= delay
によって遅れ時間delay
を超えた部分を取得 -
time_after_delay = t[mask] - delay
によって、遅れ時間以降の時間を0から開始 -
np.floor(2 * f_H * time_after_delay) % 2
で、0から始まるクロック信号を生成
3. 遅れ時間と1周期を表示
print(f"遅れ時間: {delay} 秒")
print(f"クロック周期: {T_cycle} 秒")
-
delay
と1/f_H
(クロック周期)を表示し、動作を確認
4. クロック信号のプロット
plt.figure(figsize=(8, 4))
plt.plot(t, clock_signal, label="Clock Signal (Delayed Start from 0)", drawstyle="steps-post")
plt.axvline(x=delay, color='r', linestyle='--', label="Delay Time")
plt.xlabel("Time (s)")
plt.ylabel("Clock Signal (0 or 1)")
plt.title(f"Delayed Clock Signal (Starts from 0, {f_H}Hz)")
plt.legend()
plt.grid()
plt.show()
-
drawstyle="steps-post"
を使い、クロック信号をステップ状に描画 - 遅れ時間
delay
に赤い破線axvline(x=delay, color='r', linestyle='--')
を追加 - 軸ラベルやタイトルを設定し、見やすく可視化
実行結果
- 遅れ時間後に 0から始まる クロック信号が生成される
- 50Hz(周期0.02秒)の信号が、0.01秒の遅れの後に交互に切り替わる
- プロットで信号の正確な動作を確認できる
まとめ
本記事では、Pythonを用いて 遅れ時間後に0から始まるクロック信号 を作成する方法を解説しました。この手法は、デジタル回路設計やシミュレーションに役立ちます。