理論から実装まで
Morlet、CWT/DWT、COI、phase、cluster permutation、PyWavelets、歩行EMG・運動学を切れ目なく扱います。
+
REVIEW & REDESIGN
元資料は内容の幅が広く、実装に必要な注意点も多く含んでいました。今回は「知識を増やす」より「迷子にならない順番に置く」ことを優先しました。
Morlet、CWT/DWT、COI、phase、cluster permutation、PyWavelets、歩行EMG・運動学を切れ目なく扱います。
数式やコードを先に暗記せず、「何を測りたいか」と「何は言えないか」を各章の先頭に置きました。
実時間とgait-cycle正規化、strideと被験者、powerと生理学的解釈を分けて考えられるようにしました。
LEARNING MAP
各ステップで「一文で説明できる」状態を作ってから、次へ進みます。
CHAPTER 1 · WHY
歩行のように、同じ記録の中で短いイベントと周期的な動きが共存する信号では、周波数だけでなく時間位置が重要です。
| 方法 | 得意な問い | 窓の考え方 | 歩行研究での使いどころ |
|---|---|---|---|
| Fourier | 記録全体に何Hzがある? | 時間全体をまとめて見る | 全試行の主な周波数を把握 |
| STFT | 固定幅の窓で、いつ何Hz? | すべての周波数で窓幅が同じ | 条件をそろえた局所解析 |
| Wavelet / CWT | どの時間スケールの成分がいつ? | 高周波は短く、低周波は長く見る | burst、impact、歩行周期の共存 |
a はscale(伸び縮み)、b はwaveletの中心を置く時間位置、* は複素共役です。
短い窓:「いつ」は細かいが、近い周波数を区別しにくい。
長い窓:周波数は細かいが、イベント時刻がぼやける。
waveletはこの窓幅を周波数に応じて変える設計です。
CHAPTER 2 · MORLET
Morletは、振動する波をGaussianの封筒で包んだ「局所的なテンプレート」です。下のスライダーでscaleと時間位置を動かします。
上段は信号、下段は選択中のwavelet。青い山がGaussian envelope、紫の波が局所振動です。
a ↑ → waveletが広がる → 対応周波数は低くなる。
a ↓ → waveletが縮む → 対応周波数は高くなる。
周期とGaussianの幅が一緒に変わるので、周波数と時間分解能を別々に操作しているわけではありません。
b は「位相」ではなく、waveletの中心を置く時間位置です。
理論上は連続値ですが、デジタル実装では時間点とscale候補を細かく走査して近似します。
CHAPTER 3 · COEFFICIENT
各scaleと各時間位置にwaveletを置き、入力信号との重なりを計算します。形とタイミングが合えば、内積の大きさが大きくなります。
どちらも「元データを、あるパターンへ射影した大きさ」を見ます。違いは、PCAの w がデータから学習されるのに対し、waveletは母waveletを事前に定義することです。
無限長の理想的なsin/cosなら異周波数は直交します。しかし実際のwaveletは有限時間なので、近い周波数にも反応します。
だから、スカログラムの1点を「完全に1つのHz」と読まない。時間・周波数に幅を持つ局所的な測定です。
CHAPTER 4 · COMPLEX COEFFICIENT
複素Morletはcosとsinの両方を使うため、同じ周波数でも周期のどの位置にいるかを表現できます。
局所的な成分の大きさ。スケールや正規化の影響を受けます。
スカログラムの色に使うことが多い量。生理学的な重要度そのものではありません。
時刻b・scale a周辺の波が周期のどこにいるか。powerが弱い領域では不安定です。
CHAPTER 5 · CWT / DWT
どちらが優れているかではなく、欲しい出力が「細かな時間–周波数地図」か「効率的な階層分解」かで選びます。
CHAPTER 6 · SCALOGRAM
横軸=時間、縦軸=周波数、色=power。図本体・図の構成要素・脚注を分け、赤い引き出し線なしで地図を読めるようにします。
図で見つける → 仮説を作る → 独立データまたは事前ROIで検証する、の順を守ります。
「赤いから重要」ではなく、「軸・単位・局所power・COI」を先に確認します。
CHAPTER 7 · WORKFLOW
CWTは信号を時間–周波数表現へ変換する方法です。仮説、特徴量、統計、解釈を分離すると、解析が迷走しにくくなります。
何が、いつ、どの帯域で変わる? EMG power、運動学power、phase、coherence?
sampling、欠損、filter、artifactを確認。見たい帯域を消さない。
母waveletと周波数範囲を決め、W(f,t)を算出。COIも記録。
power、phase、phase difference、coherence、ROI平均など。
絶対powerかrelative powerか。被験者間の振幅差をどう扱うか。
複数strideは平均・頑健集約、または階層モデルへ。
事前ROIなら1変量。全マップならcluster permutation等。
力学・臨床・artifact・再現性と合わせて生理仮説を評価。
CHAPTER 8 · PYTHON
コードを動かす前に、sampling frequency、wavelet、周波数範囲、COI、正規化方針をメモします。PyWaveletsではsampling periodを渡すと周波数をHzで扱えます。
import numpy as np
import matplotlib.pyplot as plt
import pywt
fs = 200
dt = 1 / fs
t = np.arange(0, 10, dt)
rng = np.random.default_rng(42)
# 3 Hzは全時間、12 Hzは5秒付近だけ存在する人工信号
signal = np.sin(2 * np.pi * 3 * t)
envelope = np.exp(-0.5 * ((t - 5.0) / 0.6) ** 2)
signal += 0.8 * envelope * np.sin(2 * np.pi * 12 * t)
signal += 0.15 * rng.standard_normal(len(t))
wavelet = "cmor1.5-1.0"
target_freqs = np.geomspace(1, 30, 80)
scales = pywt.frequency2scale(wavelet, target_freqs / fs)
coef, freqs = pywt.cwt(
signal, scales, wavelet,
sampling_period=dt, method="fft", precision=12,
)
power = np.abs(coef) ** 2
phase = np.angle(coef)
plt.pcolormesh(t, freqs, power, shading="auto")
plt.yscale("log")
plt.xlabel("Time [s]")
plt.ylabel("Frequency [Hz]")
plt.title("Scalogram: wavelet power")
plt.colorbar(label="Power")
plt.show()最初の検証では、人工信号の「3 Hzの帯」と「5秒付近の12 Hzの島」が見えるか確認します。実データへ進む前に、周波数軸・単位・filter・COIをチェックします。
import numpy as np
from mne.stats import permutation_cluster_test, combine_adjacency
# group_A_power: (n_subjects, n_freq, n_time)
# group_B_power: (n_subjects, n_freq, n_time)
n_freq, n_time = group_A_power.shape[1:]
adjacency = combine_adjacency(n_freq, n_time)
F_obs, clusters, cluster_p, H0 = permutation_cluster_test(
[group_A_power, group_B_power],
n_permutations=5000,
threshold=None,
tail=1,
adjacency=adjacency,
out_type="mask",
seed=42,
n_jobs=-1,
)
significant_mask = np.zeros((n_freq, n_time), dtype=bool)
for cluster, p in zip(clusters, cluster_p):
if p < 0.05:
significant_mask |= clusterこのコードは統計設計の完成形ではありません。独立単位、群デザイン、閾値、置換回数、effect size、COI除外を研究計画に合わせて決めます。
CHAPTER 9 · WALKING RESEARCH
初学者が解析の流れを追えるように、3筋のEMGと3つの関節運動学を1歩行周期(約0.83秒)だけ人工的に作り、歩行phase 0–100%で各チャンネルのMorlet型CWTを計算します。図の色は計算した局所powerです。
SITUATION 1 · 今どういうデータを解析するか
SITUATION 2 · 結果の図
各パネルは上段が入力した生波形、下段が周波数×歩行phaseのpower mapです。横軸は0–100%の1周期、計算は各チャンネル内でlog-powerを表示範囲に正規化しています。
6チャンネルのCWTを計算しています…
SITUATION 3 · 図の解釈
35 Hz付近の明るい帯が、設計したburstの歩行周期位置に並びます。まずは「この時間帯の局所powerが高い」と記述し、筋の因果や機能を断定しません。
45 Hz付近の帯がcycleの前半に反復します。大殿筋やTAと同じHzを探すのではなく、各筋のburst時期と帯域を別々に確認します。
TAは主burstと弱いburstが別の周期位置に現れます。raw EMG、電極配置、動作アーチファクトを併せて本物の活動かを確認します。
1周期の角速度の形に加えて、中央付近へ局所化した8 Hz成分を入れています。まずは「どのphase・帯域に局所powerがあるか」を読みます。
1周期の形に2つの局所イベントを入れています。イベントの意味は、角度・角速度・外部イベントのphaseと照合します。
終盤に局所化した帯があり、周期位置としては足部の特定局面に対応します。ただし、微分ノイズやheel-strikeの影響を除外してから解釈します。
今回の横軸:0–100%のgait phase。筋burstや関節イベントの「周期内の位置」を比べます。
実戦:実時間の秒・Hzを保った解析と、複数strideを0–100%へそろえる解析を目的別に使い分けます。
1周期の図は位置を理解する教材です。低周波の安定した推定や群比較には、複数周期と被験者単位の集約が必要です。
各パネルはチャンネル内のlog-powerを見やすく正規化しています。したがって、大殿筋の赤と膝関節の赤を「絶対powerが同じ」と比較しません。
群比較では、被験者単位の特徴量、同じ前処理、ROI、COI除外、多重比較を事前に決めます。
| 今回の表示 | 実戦で増やすもの | 向いている見方 | 注意 |
|---|---|---|---|
| 1周期・0–100% phase | 複数stride | burstやイベントの周期内位置 | 低周波の推定や群比較には不足 |
| 実時間(秒) | 連続記録・複数周期 | 物理Hz、impact、イベント時刻 | 歩行速度やstride時間の違いを別途扱う |
| 両方を保存 | cycle正規化版も作る | 物理Hzとgait phaseを分けて報告 | 変換手順・ROI・COIをMethodsに書く |
「この人工1周期では、大殿筋・外側広筋・TAの高周波powerと、3関節の局所イベントが設計したphase位置に現れた」
「実際の患者で同じ筋活動が起きる」「power増加が歩行改善の原因である」「6チャンネル間のpowerの大きさをそのまま比較できる」
SITUATION 4 · 筋同士の位相差を読む
同じ試行の大殿筋とTAについて、両方に共通する35 Hz帯を選び、歩行phase 65–75%で「波の周期上の位置」がどれだけずれるかを調べます。
今回の人工データには、TA側へ約45°の位相オフセットを入れています。計算がその設計を回収できるかを確認します。
左は1歩行周期内の位相差、右はROI内の角度分布です。位相差はTA − 大殿筋として表示します。
位相差を計算しています…
2筋に共通する帯域だけを比較します。45 Hzの外側広筋をこの位相差へ混ぜません。
phase 65–75%の線が一定の角度付近に集まり、円環上の点も一方向へ集まれば、ROI内の位相関係が安定しています。
「35 Hz・phase 65–75%でTAが大殿筋より約○°先行/遅延」と記述します。これは同期の手がかりです。
位相差だけで筋が筋を駆動したとは言えません。cross-talk、power閾値、フィルタ、イベント同期を確認します。
SITUATION 5 · 論文型ケースレポート:複数strideで集約する
1周期図で「どこに帯があるか」を理解したあと、研究では通常、連続歩行から複数strideを切り出して1 strideごとの指標にします。ここでは2つの人工条件(協調良好様/協調低下様)を各12 stride作り、論文型のEMG指標を3筋で計算します。
筋ごとに仮説帯域とgait-phase ROIを決め、各strideでpowerが閾値を超えたかを判定します。出現頻度(OF)=出現stride数/全stride数 × 100です。
出現したstrideのROI内でpowerを周波数方向に重み付けし、代表周波数を求めます。ここでは説明しやすいpower-weighted mean frequencyを使います。
大殿筋とTAの複素係数からcross-waveletを作り、30–60 Hzのcross-wavelet powerを5–80 Hz全体で割ります。論文でいうPiper帯の考え方です。
2条件 × 12 stride。各strideのphaseを0–100%にそろえます。
EMGの仮説帯域、power閾値、cross-wavelet帯域を先に固定します。
strideは反復測定。研究では被験者内で集約してから群・条件を比較します。
出現頻度(%)と周波数内容(Hz)
normalized cross-wavelet powerの帯域構成
計算結果を読み込んでいます。
計算結果を読み込んでいます。
論文型の複数stride計算を実行しています…
方法の参照:Di Nardo et al.(歩行sEMGのCWT:出現頻度・周波数内容) / Lodha et al.(歩行中のMorlet cross-wavelet:30–60 Hz Piper synchrony)。論文のサンプル数・結果を再現するものではなく、解析手順を追うためのケースです。
CHAPTER 10 · INFERENCE
時間×周波数マップは情報量が多いぶん、多重比較と独立単位の問題が生じます。解析前に「何を1つの観測値とするか」を固定します。
仮説で決めた時間×周波数を平均し、被験者1人1値へ。
探索後のROI選択は循環推論に注意。
隣接する時間・周波数の差をcluster化し、最大cluster統計量で評価。
有意なのはcluster全体への推論。
点単位のp値を補正。max-TはFWERを強く制御しやすい。
目的に応じて保守性と解釈性を選ぶ。
phaseやphase differenceを角度として扱う。
179°と−179°を算術平均しない。
CHECK YOUR UNDERSTANDING
選択肢を選んで採点してください。間違えた問題は、該当章へ戻って一文で言い直します。
Gaussianは中心付近を強く、遠い時刻を滑らかに弱くします。
waveletが時間方向に伸び、対応周波数は低くなります。
bはtranslation parameterです。真の位相はarg(W)から読みます。
どちらも元データとの内積の相手です。ただしPCAのwは学習、waveletは事前定義です。
quadrature成分を持つことで、波の周期上の位置を表せます。
局所的な強さであり、生理学的な意味や因果を単独では示しません。
被験者内相関を考え、集約または階層モデルを使います。
角度は円環上の量なので、複素単位ベクトルなどで円統計を行います。
低周波は1周期が長く、短い窓では周期の一部分しか観察できません。近い低周波を区別する情報が不足するため、長く観察する必要があります。その代わりイベント時刻の精度は下がります。
同じデータを見て領域を選び、その領域を同じデータで検定すると、選択バイアスや循環推論が生じます。事前ROI、独立データ、または全マップのcluster permutationなどを使います。
ONE-PAGE SUMMARY
ここだけをMethods作成前の確認表として使えます。
図とインタラクティブ例の信号は理解用の人工データです。実患者・実験データの結果ではありません。
EVERYDAY ANALOGIES
比喩は記憶の足場です。最後は必ず「どの軸か・何を計算したか・何を言えるか」に戻って確認します。
曲を最後まで聴いて「低音が多い」とまとめるのがFourierです。小さな虫眼鏡で曲の途中をなぞり、「この瞬間に高い音が鳴った」と探すのがwaveletです。
式との対応:Fourierは記録全体の周波数、waveletは W(f,t) の時間局在した一致度。
懐中電灯の中心は明るく、端へ行くほど暗くなります。Gaussian envelopeも中心時刻の近くを強く重みづけ、遠い時刻をなめらかに弱めます。
式との対応:有限の窓があるので、waveletは「いつ」の情報を保ったまま局所的に振動を調べられます。
大きなscaleは広角カメラや長いものさしのように、ゆっくりした大きな変化を見ます。小さなscaleはズームした短い窓で、細かく速い変化を見ます。
注意:scaleはHzそのものではありません。母waveletとサンプリング周波数から対応する周波数へ変換して読みます。
同じ形のスタンプをいろいろな大きさ・場所で押し、紙の模様とどれだけ重なるかを確かめるイメージです。形が合う場所では内積が大きくなります。
対応:aはスタンプの伸び縮み、bは置く位置、Wは重なりの係数です。
powerはスピーカーの音量のような「どれくらい強いか」。phaseは時計の針のような「周期のどの位置か」です。同じ音量でも、針の位置は違うことがあります。
式との対応:|W|²がpower、arg(W)がphase。phase差は角度なので円環データとして扱います。
スカログラムは、横軸が時間、縦軸が周波数、色がpowerの天気図です。赤い場所は「その時刻・帯域でテンプレートとの一致が強い」場所です。
地図の端は観測範囲が足りず、waveletの窓がはみ出します。これがCOI/edge effectで、端の色は慎重に読みます。