← ギャラリーへ

時間と周波数 — 同時に細かくはできない

3つの窓長でスペクトログラムを描いた図。短い窓では音の始まりが鋭いが2音が太い帯に潰れ、長い窓では2音が細く分かれるが始まりが滲む
440Hz が 0.256 秒から、660Hz が 0.512 秒から鳴る音を、3つの窓長で分析した。短い窓では「いつ鳴ったか」が鋭く出るが「何の音か」が太い帯に潰れる。長い窓では逆になる

音を分析するには、窓で切り取るしかない

周転円で描く角で「形を円の足し算に分ける」道具を作った。ところが実際の音は始まったり止まったりするので、いつの音を分けるのかを決めなければならない。そこで一定の長さの窓で切り取ってから分ける(短時間フーリエ変換)。声紋(スペクトログラム)もイコライザもこれである。

ここに原理的な限界がある。窓を短くすると時刻は正確になるが周波数がぼやけ、長くすると逆になる。しかも両方の「ぼやけ」の積には下限がある

Δt · Δf ≥ 1/(4π) = 0.0795775…

ガボール(1946)が通信の文脈で示したもので、ガウス窓だけが等号に乗る。測ったら 0.079578368 で、下限 0.079577472 との相対差は 2.3×10⁻⁵(離散化のぶん)。窓の幅 σ を変えても点数を変えても同じ値だった——Δt と Δf が反比例で打ち消すからである。

★窓の端のなめらかさが、裾の落ち方を決める

6つの窓関数の形と、そのスペクトルの裾を両対数で描いた図。傾きが -1、-2、-3 と分かれる
上=6つの窓の形/下=そのスペクトルの裾(両対数)。端で値が跳ぶ窓は 1/f、端で 0 になる窓は 1/f²、値も傾きも 0 なら 1/f³。ガウスは指数的なので両対数の直線に乗らない(R² 0.82)
端のふるまい裾の傾き(実測)Δt·Δf
矩形端で 1 のまま跳ぶ−0.944発散
ハミング端で 0.08 のまま跳ぶ−0.689発散
三角端で 0・傾きが跳ぶ−1.9521.095 倍
ハン端で 0・傾きも 0−3.0431.026 倍
ブラックマン端で 0・傾きも 0−3.3161.004 倍
ガウス端まで滑らか(直線に乗らない)1.000 倍

これは今日 Hat タイルの輪郭で測ったのとまったく同じ規則である。周転円で描く角では「角があると係数が 1/k²、なめらかだと指数的」だった(発見25)。窓の端が「角」の役をしていて、跳びの階数がそのまま裾の指数になる。形の話と音の話が同じ一行に収まった。

★不等式を語る前に、Δf が定義できるかを確かめないといけない

窓の点数を増やしたときのΔt·Δfの変化。矩形とハミングは√Nで増え続け、他は水平線に張り付く
窓の点数 N を増やしていくと、矩形窓とハミング窓の Δt·Δf は止まらずに増える。N を16倍にすると矩形はちょうど 4.0002 倍=√N。三角・ハン・ブラックマン・ガウスは 1.000 倍で動かない

矩形窓の Δf は、連続の理論では発散する。裾が 1/f なので f²|W(f)|² が定数になり、分散の積分が閉じないからである。離散で計算すると有限の数字が出てくるが、それは点数を増やすと √N で増え続ける——数字が出たからといって「幅」が定義できているわけではない。

★発散する窓と、裾の傾きが浅い窓はぴったり同じ集合だった(矩形とハミング)。「端で値が跳ぶか」→「裾が 1/f か」→「Δf が定義できるか」という三段の連鎖で、最初の一つが残りを決めている。ハミング窓の跳びは 0.08 しかないが、跳びは跳びである。

そして二段階で騙されかけた

①ゼロパディングせずに(DFT の長さ = 窓長で)測ると、矩形窓の Δf がちょうど 0 になる。長さ N の矩形窓を長さ N の DFT にかけると完全な直流になるからで、これでは Δt·Δf = 0 =不等式を完全に破ってしまう。②同じ条件でハミング窓は下限の 0.992 倍——わずかに破っている。もっともらしい数字なので、そのまま表に載せかねない。

パディングを足すと直り(ハミングは 1.431 倍になる)、さらに点数を振ると発散が見える。ガウス窓はパディング量を1〜16倍に振っても 0.079577〜0.079578 で動かなかった——動かない窓だけが「測れている」

昨日足した作法(解像度を2倍3倍に振って答えが動かないことを確かめる)が、そのまま効いた。ただし今回は「測り方が悪い」のではなく測ろうとしている量が存在しないケースだった。動くときは、測り方を疑うだけでなく、その量が定義できるかも疑う。

うなりを「2つの音」として分けるには、1秒かかる

分離できる最小の周波数差を二分探索で測ると、窓長との積が一定だった(2.157 / 2.140 / 2.132 / 2.127)=Δf ∝ 1/N。実用の数字に直すと(サンプリング 2000Hz):

分けたいもの周波数差必要な窓長
純正5度(440 と 660Hz)220 Hz32 点 = 16 ms
半音(440 と 466Hz)26 Hz256 点 = 128 ms
うなり(440 と 444Hz)4 Hz2048 点 = 1024 ms

和音のモアレで、平均律5度のうなりの周期を 0.671 秒と計算した。そして今回、4Hz のうなりを「2つの別の音」として周波数で分けるには 1 秒以上かかると出た。同じオーダーである。

これは偶然ではない。「うなりとして時間で聞く」ことと「2つの音として周波数で分ける」ことは、同じ限界の裏表だからである。差が小さいほどうなりは遅くなり、同時に分離に必要な窓は長くなる。どちらも 1/Δf の話をしている。ゆっくりしたうなりが「音楽的」に感じられるのは、脳がまだ2音に分けきれていない領域だから——とまで言うのは踏み込みすぎだが、数としてはその境目にいる。

★同じ一行が3つの舞台に出る——そして3つめで様子が変わる

輪郭の角・窓の端・2次元の形状因子の3つで係数の落ち方を並べた両対数の図
「なめらかさが係数の落ち方を決める」を3つの舞台で測った。左=輪郭の角(角があると k⁻²)/中=窓の端(値が跳ぶと 1/f・傾きが跳ぶと 1/f²・曲率まで連続で 1/f³)/右=2次元の形(形状因子)——ここで指数が向きの関数になる

この規則は周転円で描く角でも出ていた。多角形の輪郭のフーリエ係数は k⁻² で落ちる(角で1階微分が跳ぶ)。上の節の窓の裾も同じ話である。測った値は式とすべて 0.1 以内で合った(輪郭 −2.08・rect −0.92・tri −1.93・hann −3.06)。

では3つめの舞台はどうか。2次元の領域そのもののフーリエ変換(形状因子)を、厳密式で測った——正方形は sinc の積、円板は 2πR·J₁(qR)/q。

①円板(なめらかな境界)は1つの指数を持つ。|F|² ∝ q−3.03(R²=0.9987)で、どの向きでも同じ。

②★正方形(角のある境界)は指数が向きで変わる。辺の法線方向で 2.02、斜め30°で 3.93。つまり角は「なめらかでない」だけでなく「向きを選ぶ」。1次元にはこの自由度がなかった。

③★全方位を平均すると 3.01 になり、なめらかな円板の 3.03 と区別がつかなくなる。平均が、区別していた情報そのものを捨てている。三角格子を軸座標で丸めると偽の4回対称が立つのと同じ家系——点や数に落とすとき、捨てたものが答えを変える。

だから「なめらかさが落ち方を決める」は、1次元では1つの数を決める一行で、2次元では向きの関数を決める一行だった。同じ規則の顔が舞台で変わる。

→ 周転円で描く角(輪郭の角の側・発見25)

→ 結晶のかたち(γ のとがりが「平らな面」を出す側)

この節で確かめたのは測った指数だけである。「2次元の落ち方が向きで決まる」理由は次の節で導いた(発見48)。
⚠️ 円板の J₁ は x ≥ 25 で漸近展開に切り替えてある。べき級数だけだと x ≳ 40 で桁落ちして発散していた(2026-08-23 の精査で見つけた実害。太鼓の節線と共有しているコードで、出荷している図の範囲 x ≤ 20.4 は正しかったが、範囲を広げた瞬間に壊れる型だった)。
⚠️ なめらかな輪郭(楕円)は指数則ではなく指数関数的に落ちるので、傾きの数字は「直線に乗らない」ことの目印であって指数ではない(R²=0.906)。

★なぜ向きで決まるか——稜線は辺の法線に立ち、平均は周長しか知らない

辺の法線に稜線が立つ角度別の図・全方位平均が2×周長に乗る図・稜線の幅が1/qで縮む図
発見39 の理由を導いて、数で突き合わせた。左=q の向きごとの q⁴|F|²(正方形は法線 2 本、Hat は 6 本に稜線が立つ)/中=全方位平均 q³⟨|F|²⟩ ÷ 2×周長(6 つの形が全部 1 に来る)/右=稜線の半値半幅(1/q の直線に乗る)

上の節で「導いていない」と書いた理由を、Hat の回折像で作った多角形のフーリエ変換の辺の和の式から導いた。辺の和の各項 (q×d)/(q²(q·d))·[e−iq·a − e−iq·b] は辺の両端に分かれるので、頂点で集め直すと

F(q) = (1/q²) Σv [tan∠(q, tout) − tan∠(q, tin)] e−iq·v

という角の式になる(辺の和と 10⁻¹⁴ で一致)。係数は q の向きだけで決まり、大きさによらない。ここから 3 つが出る。

①一般の向きでは q⁻⁴。係数が定数なので |F|² ∝ q⁻⁴。帯で平均すると位相が混ざって q⁴|F|² → Σv cv²——正方形 30° で測 21.4/式 21.3、Hat 73° で 175/177(2% 以内)。

②★辺の法線では tan が発散する=稜線。その向きは辺の式に戻ると g(0)=1 で F = Σ辺⊥q ±L e−iq·a/q。高さは q²|F|² → ΣL²(正方形 1.99/式 2・Hat の 6 本は 6/2/6/6/6/2 と 2.5% 以内)。断面は sinc²(qL sinθ/2) なので幅は 1/q で縮む(θ½·q·L = 2.85 → 2.80 → 2.78、式 2·1.3916 = 2.78)。「どの向きを選ぶか」の答えは辺の法線、高さは辺の長さの二乗和。

③★全方位の平均は 2×周長/q³。稜線 1 本の角積分は (L²/q²)(2π/qL) = 2πL/q³、辺ごとに ±n の 2 本、角の寄与 q⁻⁴ は 1 桁下。だから ⟨|F|²⟩ = 2P/q³。円板は 4πR/q³ = 2·(2πR)/q³ で同じ式。正方形・長方形・三角形・六角形・Hat・円板の 6 つが q=100〜400 で全部 1 の 7% 以内(平行な辺のない三角形は 1.000)。

だから「平均すると円板と区別がつかない」は偶然でない。向きの情報は稜線=辺の法線にだけ乗り、平均はそれを周長という 1 本の長さに潰す。指数 3 は形によらない——平均は周長しか知らない。1 次元では「導関数が何階まで連続か」が指数を 1 つ決めたが、2 次元では境界の各点が「どの向きに平らか」を持ち、その向きごとに 1 次元の規則(値が跳ぶ→振幅 1/q)が働く。多角形はその向きが有限個しかない形、円はすべての向きを持つ形で、平均はその違いを消す。

→ Hat の回折像(辺の和の式の出どころ・形状因子)

⚠️ 2P/q³ は小角散乱で Porod 則と呼ばれる法則の 2 次元版だと思うが、名前は伝聞(文献未確認)。確かめたのは上の数だけ。
⚠️ 道具で 2 つ踏んだ。帯で平均するとき q³ を外に出すと q⁻³ の帯平均が膨らむ(±25% の帯で 1.14 倍・円板の実測 1.175=円板まで一緒に外れて気づいた)= q のべきは内側で掛ける。角度の刻みが稜線の幅 2π/(qL) より粗いと平均が 2 倍以上外れる(q=400 で 180 刻みは 2.35 倍・720〜4096 刻みは 1.015 で動かない=刻みを振った)。
⚠️ 有限の帯・刻みで測った値で、q→∞ の極限は取っていない。平行な辺の干渉 cos(q·w) が帯に残るので正方形・長方形・Hat は 1 のまわりで数% 揺れる。

★自分で動かす

下の絵はこの場で計算している(あらかじめ描いた絵の切り替えではない)。上の図を作っているのと同じ 1 本のコード gallery/assets/gabor-live.js を、記事の中で呼んでいる。矩形窓を選んで点数 N を増やしてみてほしい——Δt·Δf が下限に落ち着かず、増え続ける。

Δt
Δf
Δt·Δf
下限 1/(4π) との比
裾の傾き
N を4倍にすると

選んだ窓の形(上)と、そのスペクトルの裾(下・両対数)

「N を4倍にすると」の欄が要。端で値が跳ぶ窓(矩形・ハミング)は 2 倍に近づく=√N で発散し、Δt·Δf という量そのものが定義できない。端で 0 になる窓(三角・ハン・ブラックマン)は 1.00 倍で落ち着く。ガウスだけが下限 1/(4π) にぴたりと乗る。⚠️パディングのチェックを外すと、矩形の Δf が 0 になり、ハミングが下限を割って見える——二段階で騙されかけた場所。

どう作ったか

FFT(radix-2)を依存ゼロで書き、周転円で描く角の素朴DFTと突き合わせた(最大差 4×10⁻¹²=独立2経路)。Δt は |w(t)|² の分散、Δf は |W(f)|² の分散で、どちらも重心を引いてから計算している。

機械検査は45件: ①自前FFTと素朴DFTの一致・FFTの往復 ②★ガウス窓が下限に相対 2.3e-5 で乗る・他の窓は必ず下限より大きい ③★矩形窓が √N で発散(16倍で 4.0002 倍)・ハミングも発散・端で0になる4つの窓は 1.000 倍で収束 ④★裾の傾きが −1 / −2 / −3 に分かれる・ガウスは直線に乗らない・★発散する窓と傾きの浅い窓が同一集合 ⑤⚠️パディングなしで矩形の Δf が 0・ハミングが下限を割る・ガウスはパディング量に不感 ⑥★分離できる幅 × 窓長が一定・うなりに 1024ms ⑦パーセバル ⑧記事のドラッグ版を偽DOMの上で実際に走らせる13項目(★窓を選んで N を動かすと、矩形はちょうど 2 倍=√N で発散し、端で 0 になる4つの窓は 1.000 倍で落ち着く/★発散する窓の集合と裾の傾きが浅い窓の集合が一致することを毎回確かめる/⚠️パディングのチェックを外すと矩形の Δf が 0 になりハミングが下限を割って見える=二段階で騙されかけた状態をその場で再現できる)⑨出荷SVGとドラッグ版が同じ1本のコードを共有していること ⑩出荷SVG4枚 ⑪発見48(12件)=角の式が辺の和と 10⁻¹⁴ で一致・稜線の高さ ΣL²(正方形・三角形・Hat の 6 本)・法線の向き・稜線の幅 θ½·q·L → 2.78 に単調収束・一般の向きで q⁴|F|² → Σc²・★q³⟨|F|²⟩ ÷ 2P が 6 形状で 1 の 7% 以内・三角形 0.5% 以内・円板 4πR・⚠️q³ を帯の外に出す膨らみ・⚠️角度の刻み 180 で 2.35 倍(720〜4096 は動かない)・出荷SVG。ドラッグ版の検査の実体は tools/gabor-live-test.js、発見48 の実体は tools/check.js の [aniso] 節。

→ 周転円で描く角(同じ「なめらかさが落ち方を決める」規則)

→ 和音のモアレ(うなりの周期 0.671 秒)

→ 和音のかたち(音を図形にする道)

→ 太鼓の節線(空間の側のスペクトル)

出典

数理
不確定性関係 Δt·Δf ≥ 1/(4π)(分散で定義した場合)。D. Gabor, "Theory of communication" (1946) が通信の文脈で導入し、ガウス窓で等号が成り立つことを示した。窓関数(矩形・三角・ハン・ハミング・ブラックマン)は信号処理の標準的なもの。FFT は Cooley–Tukey (1965)
こちらの主張
「端で値が跳ぶ窓では Δt·Δf が点数の √N で増える(=Δf が定義できない)」「発散する窓の集合と、裾の傾きが浅い窓の集合が一致する」はこの作品でパディング量と点数を振って確かめたもので、文献での扱いは確かめていない
注意
分離できたかの判定は「スペクトルに2つの峰が立ち、その間の谷が峰の 10% 以上下がる」という自前の基準である。基準を変えれば数字は動く(レイリー基準などの標準的な定義とは一致しない)
生成
generators/gabor.js(自前FFT・6種の窓関数・Δt/Δf の測定・裾の傾き・分離の二分探索・STFT・図3枚。依存ゼロ・乱数ゼロ)ガボールの数理は gallery/assets/gabor-live.js に置き、出荷SVGの生成器と記事のドラッグ版が同じ1本を共有している