複素指数関数和近似:ESPRIT法
概要
本稿では、信号処理分野における周波数推定の効率的なアルゴリズムのひとつであるESPRIT法[1][2]を紹介する。類似の手法として、Prony法[3]やMatrix Pencil法[4]などがあり、これらの手法に関しては文献[2:1][5]を参考にされたい。またここでは実際の信号への応用よりも、関数を指数関数和で近似することを主眼とする。アルゴリズムを簡単に紹介した後、具体例を示す。
アルゴリズムの導入
問題設定
与えられた関数
ここで
ここで記号
がすべての
指数の評価:Hankel行列とその特異値分解
ESPRIT法は、Hankel行列
の特異値分解
を用いる。先に挙げた他手法もHankel行列のランク削減に基づいている。ここで、
すると、ノード
の固有値として求ることができる。ここで、
である。
ここで、logは対数の主値である。
係数の評価:過剰決定最小二乗Vandermonde系
係数
のように表現される。ここで、
である。
ソースコード
筆者によって実装されたJuliaコードを で見つけることができる。その他Prony法、Matrix Pencil法等も実装済みである。[6]
ExpFit.jlを使ってみる。例としてベッセル関数の和を考える。カットオフ時間は
using LinearAlgebra
using ExpFit
using SpecialFunctions
tmin = 0.0
tmax = 50.0
N = 100
t = range(tmin, tmax, length=N*2)
eps = 1e-3
# 近似する関数(ベッセル関数の和)
f = t -> besselj(0,t) + besselj(2,t) - 1.0im*(besselj(1,t) + besselj(3,t))
# ESPRITの実行
ef = expfit(f, tmin, tmax, N, eps; alg=ESPRIT())
print("Approximation order = ", length(ef.coeff), "\n")
# 結果
fv = f.(t)
efv = ef.(t)
err = efv .- fv
println("Maximum error = ", maximum(abs.(err)))
出力は
Approximation order = 7
Maximum error = 0.0006106060799602027
となった。与えた精度に対して、次数は

誤差が許容範囲内に収まっており、よく近似できていることが確認できる。
-
R. Roy and T. Kailath, IEEE Trans. Acoust., Speech, Signal Process. 37, 984–995 (1989). ↩︎
-
D. Potts and M. Tasche, Linear Algebra Appl. 439, 1024–1039 (2013). ↩︎ ↩︎
-
G. Beylkin and L. Monzón, Appl. Comput. Harmonic Anal. 19, 17–48 (2005). ↩︎
-
T. Sarkar and O. Pereira, IEEE Antennas Propag. Mag. 37, 48–55 (1995). ↩︎
-
H. Takahashi, S. Rudge, C. Kaspar, M. Thoss, and R. Borrelli, J. Chem. Phys. 160, 204105 (2024). ↩︎
-
このソフトウェアは開発中であり、動作の安定性は保証されません。 ↩︎
Discussion