← W3 | 觀念

錄出來的 CSV 長什麼樣

怎麼錄檔

加上 --csv 參數就能一邊看波形、一邊錄檔:

$ python3 python/ecg_plot.py --csv my_ecg.csv

關掉視窗或按 Ctrl-C 結束,程式會告訴你錄了幾筆。

檔案內容

sample,adc,filtered,lead_off
0,8213,0.000,0
1,8215,0.012,0
2,8210,-0.035,0
3,8198,-0.142,0
4,8247,0.381,0
5,8402,1.823,0
6,8510,2.941,0
7,8389,1.607,0
8,8244,0.338,0
9,8212,-0.008,0
...

四個欄位

  • sample

    流水號,從 0 開始。要算時間就除以取樣率。

  • adc

    Arduino 原始 ADC 值。14-bit 解析度,範圍 0~16383。這是未經處理的原始訊號。

  • filtered

    Python 端濾波後的值(已去基線漂移、60Hz 市電、高頻肌電雜訊)。畫面上看到的波形就是這個值。

  • lead_off

    電極脫落狀態。0 = 三片都貼好,1 = 至少一片脫落。

關鍵數字

500

Hz 取樣率

每秒 500 筆,由 Arduino 韌體決定

時間還原

# 第 N 筆是第幾秒
time_sec = sample / 500

檔案大小估算

  • 錄 1 分鐘 → 30,000 筆 → ~1 MB
  • 錄 5 分鐘 → 150,000 筆 → ~4 MB
  • 錄 10 分鐘 → 300,000 筆 → ~8 MB

為什麼保留原始 ADC 值?

adc 欄位是 Arduino 直接讀到的未處理值。濾波演算法可以改、可以重跑,但原始訊號丟了就沒了。

所以永遠保留原始值,分析都在事後做。想換不同的濾波參數?用 ecg_replay.py 重播 CSV,就能用新的設定重新跑一次:

# 用不同的陷波頻率重播
$ python3 python/ecg_replay.py my_ecg.csv
# 另一個終端機
$ python3 python/ecg_plot.py -p /dev/ttys012 --notch 50

用 Python 讀你的資料

import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_csv("my_ecg.csv")

# 還原時間軸
df["time"] = df["sample"] / 500

# 畫原始訊號
plt.figure(figsize=(12, 4))
plt.plot(df["time"], df["adc"], lw=0.5)
plt.xlabel("Time (s)")
plt.ylabel("ADC")
plt.title("Raw ECG")
plt.show()

# 只看貼好的部分
good = df[df["lead_off"] == 0]
print(f"有效資料: {len(good)} 筆 / {len(good)/500:.1f} 秒")