ナイキスト定理から理解する動画解析の物理的限界
「30fpsのスマホ動画から、ギター弦の振動を可視化できないか?」—— 結論から言うと、これは物理的に不可能です。 このページでは、実際にこの失敗を経験した事例を起点に、 動画から周波数を検出するときに誰もがぶつかる「ナイキスト制約」を、 数式最小限・図とコードで解説します。
このページの結論
動画から検出できる最大周波数は フレームレート(fps)÷ 2(ナイキスト周波数)。 これはカメラの性能でも画像処理の工夫でも超えられない、サンプリングという行為そのものの限界です。
1 失敗事例: 30fpsでギター弦を撮る
EVM(Eulerian Video Magnification)で「振動の可視化」を試していたときの実話です。 ギターの弦を弾いた様子を30fpsで撮影し、EVM処理で弦の振動を増幅しようとしました。 ところが、増幅率やフィルタの周波数帯をどう調整しても、弦の振動らしき動きは一向に現れません。
原因は処理パラメータではなく、そもそも入力動画に弦の振動が記録されていなかったことでした。 ギターの最も低い弦(6弦・E2音)の基本振動数は約82Hzです。 一方、30fpsの動画が記録できる周波数の上限は、後述するナイキスト定理により15Hzしかありません。
82Hzの振動を捉えるには、その2倍を超える165fps以上——実用上の余裕を見ると180fps以上での撮影が必要です。 どんなに高度な後処理をしても、撮影の時点で失われた情報は取り戻せません。 「何fpsで撮ったか」を確認せずに動画解析を始めると、この種の失敗は簡単に再現できてしまいます。
2 サンプリング定理の直感的な理解
動画は「連続的な現実を、1秒あたりfps回だけパラパラ漫画として切り取ったもの」です。 この「切り取り」をサンプリングと呼びます。 サンプリング定理(ナイキスト=シャノンの定理)が教えてくれるのは、次の一点です。
⇔ 検出可能な最大周波数(ナイキスト周波数) = サンプリング周波数(fps) ÷ 2
直感的には「1回の振動につき、山と谷の最低2点を押さえる必要がある」と考えると分かりやすいです。 1秒に7回振動するものを1秒に6回しか見なければ、山と谷を取り違え、 実際とは別の「ゆっくりした振動」に見えてしまいます。
この「別のゆっくりした振動に化ける」現象をエイリアシング(折り返し)と呼びます。 映画で車のホイールが逆回転して見える「ワゴンホイール効果」や、 テレビでヘリコプターのローターが止まって見える映像は、日常で観察できるエイリアシングの実例です。
図1: 7Hzの振動(青)を6fpsでサンプリング(赤丸)すると、データ上は1Hzの振動(赤破線)と区別がつかない
3 fpsと検出可能周波数の早見表
実務ではナイキスト周波数ぎりぎりを狙わず、ナイキスト周波数の90%以下を 実用上限とするのが安全です(フィルタの切れ味やfpsの揺らぎに対する余裕)。
| フレームレート | ナイキスト周波数 | 実用上限(×0.9) | 撮れる対象の例 |
|---|---|---|---|
| 30 fps | 15 Hz | 13.5 Hz | 心拍(1〜2Hz)、呼吸(0.2〜0.5Hz)、建物の揺れ(数Hz) |
| 60 fps | 30 Hz | 27 Hz | 上記 + 低速な機械振動 |
| 120 fps | 60 Hz | 54 Hz | 上記 + モーター・ポンプ等の機械振動の一部 |
| 240 fps | 120 Hz | 108 Hz | 上記 + ギター弦の低音域(82Hz〜) |
対象別の「撮れる/撮れない」マトリクス
| 対象(代表的な周波数) | 30fps | 60fps | 120fps | 240fps |
|---|---|---|---|---|
| 呼吸(0.2〜0.5 Hz) | ○ | ○ | ○ | ○ |
| 心拍による皮膚の色変化(1〜2 Hz) | ○ | ○ | ○ | ○ |
| 構造物の固有振動(0.5〜10 Hz) | ○ | ○ | ○ | ○ |
| 機械振動(20〜50 Hz) | × | ×〜△ | ○ | ○ |
| ギター6弦 E2(約82 Hz) | × | × | × | ○ |
| 電源系の振動(100/120 Hz) | × | × | × | △(108Hz以下のみ) |
4 エイリアシングをPythonで再現する
まず、解析したい動画のfpsを確認する習慣をつけましょう。OpenCVなら3行で確認できます。
次に、冒頭の失敗事例——「82Hzのギター弦を30fpsで撮るとどう見えるか」をNumPyで再現します。 82Hzの正弦波を1/30秒間隔でサンプリングし、FFTでスペクトルのピークを調べます。
実行すると、82Hzの信号がデータ上は8Hzとして現れます。 これは 82Hz が 30fps の整数倍から折り返された結果です(|82 − 30×3| = 8)。 「8Hz付近に何かある」というもっともらしい偽の信号が出てしまう—— 信号が消えるのではなく化けることが、エイリアシングの厄介な点です。
5 「撮れる/撮れない」判定フローチャート
動画から周波数的な変化(振動・脈動・明滅)を捉えたいときは、撮影・解析の前に次の手順で判定します。
図2: 撮影・解析前の判定フロー。「対象の周波数が先、撮影設定が後」
まとめ
- 動画から検出できる最大周波数は fps ÷ 2(ナイキスト周波数)。後処理では超えられない
- 上限を超えた信号は消えるのではなく、偽の低周波に化ける(エイリアシング)
- 実務ではナイキスト周波数の 90%以下 を実用上限とする
- 解析の前に「対象の周波数の見積もり → fpsの確認 → 判定」の順で確認する