Goertzelアルゴリズムは、離散フーリエ変換(DFT)の各項を効率的に評価するためのデジタル信号処理(DSP)の手法です。従来のアナログ電話のキーパッドのプッシュボタンによって生成されるデュアルトーン多周波信号(DTMF)トーンの認識など、特定の実用的なアプリケーションで役立ちます。このアルゴリズムは、1958年にGerald Goertzelによって初めて記述されました。 [ 1 ]
DFT と同様に、Goertzel アルゴリズムは離散信号から選択可能な 1 つの周波数成分を分析します。[ 2 ] [ 3 ] [ 4 ] 直接 DFT 計算とは異なり、Goertzel アルゴリズムは、実数値入力シーケンスに対して実数値演算を使用して、各反復で単一の実数値係数を適用します。全スペクトルをカバーする場合 (係数が後続の計算で再利用される連続データストリームを使用する場合を除く。この場合の計算複雑度はスライディング DFTと同等です)、Goertzel アルゴリズムは高速フーリエ変換(FFT) アルゴリズムよりも複雑度の次数が高いですが、少数の選択周波数成分を計算する場合は、数値的に効率的です。Goertzel アルゴリズムのシンプルな構造により、小型プロセッサや組み込みアプリケーションに適しています。
Goertzelアルゴリズムは、正弦波合成関数として「逆向きに」使用することもでき、生成されるサンプルごとに1回の乗算と1回の減算のみが必要です。[ 5 ]
ゲルツェルアルゴリズムの主要な計算はデジタルフィルタの形式をとるため、このアルゴリズムはしばしばゲルツェルフィルタと呼ばれます。フィルタは入力シーケンスに対して動作します。パラメータを持つ2段階のカスケード分析対象となる周波数を、サンプルあたりのラジアンに正規化して示す。
最初の段階では中間シーケンスを計算します。:
第2段階では、次のフィルタを適用します。出力シーケンスを生成する:
最初のフィルタ段は、直接形式構造を持つ2次IIRフィルタであることが観察されます。この特定の構造は、内部状態変数がその段からの過去の出力値と等しいという特性を持っています。入力値のためにすべて0とみなされます。初期フィルタ状態を確立して、サンプルから評価を開始できるようにします。フィルタ状態には初期値が割り当てられますエイリアシングの危険性を避けるため、周波数はしばしば 0 から π の範囲に制限されます (ナイキスト・シャノン標本化定理を参照)。この範囲外の値を使用することは無意味ではなく、この範囲内のエイリアシングされた周波数を使用することと同等です。指数関数は2π の周期で周期的であるためです。。
第2段階のフィルタは、過去の出力を一切使用しない計算を行うため、FIRフィルタであることがわかる。
Z変換法はフィルタカスケードの特性を調べるために適用できる。式(1)で与えられる第1フィルタ段のZ変換は次のようになる。
式(2)で示される第2フィルタ段のZ変換は
2つのフィルタ段のカスケード接続の合成伝達関数は次のようになる。
これは等価な時間領域シーケンスに変換でき、項はインデックスの最初の入力項まで展開されます。:
フィルタのZ変換の極は、そして複素Z変換平面の原点を中心とする単位半径の円上。この特性は、フィルタ処理が不安定であり、低精度の演算と長い入力シーケンスを使用して計算すると数値誤差の蓄積に対して脆弱であることを示している。 [ 6 ]数値的に安定したバージョンはChristian Reinschによって提案された。[ 7 ]
DFT項を計算するという重要なケースにおいては、以下の特別な制約が適用される。
これらの代入を式(6)に代入し、項がすると、式(6)は次の形式になる。
式(9)の右辺は、DFT項の定義式と非常によく似ていることがわかります。インデックス番号のDFT用語だが、全く同じではない。式(9)に示す総和は、入力用語のみ、ただしDFTを評価する際に、入力項が利用可能となる。単純だが洗練されていない方法として、入力シーケンスを拡張する方法がある。もう一つ人工的な値[ 8 ] 式(9)から、最終結果に対する数学的な影響は項を削除するのと同じであることがわかる。合計から得られるため、意図したDFT値が得られます。
しかし、余分なフィルタパスを回避する、より洗練されたアプローチがあります。式(1)から、拡張入力項の場合、最終段階で使用されます。
したがって、アルゴリズムは次のように完成させることができる。
最後の2つの数学演算は、代数的に組み合わせることで簡略化されます。
フィルターの更新を終了時に停止することに注意してくださいまた、式(11)ではなく式(2)をすぐに適用すると、最終的なフィルタ状態の更新が見逃され、位相が誤った結果が生じる。[ 9 ]
Goertzelアルゴリズムに選択された特定のフィルタリング構造が、効率的なDFT計算の鍵となります。出力値は1つだけであることがわかります。DFTの計算に使用されるため、他のすべての出力項の計算は省略されます。FIRフィルタは計算されないため、IIRステージの計算は省略されます。などについては、第1段階の内部状態を更新した直後に破棄できます。
これは一見矛盾しているように思える。アルゴリズムを完了するには、FIRフィルタ段をIIRフィルタ段の最後の2つの出力を使用して一度評価する必要があるが、計算効率のためにIIRフィルタの反復処理ではその出力値が破棄される。ここで直接形式フィルタ構造の特性が適用される。IIRフィルタの2つの内部状態変数は、IIRフィルタ出力の最後の2つの値を提供し、これらはFIRフィルタ段を評価するために必要な項である。
式(6)を調べると、項を計算するための最終的なIIRフィルタパスが示される。補助入力値を使用する前の項に大きさ1の複素乗数を適用する。 その結果、そして等価信号電力を表す。式(11)を適用して項から信号電力を計算することも同様に有効である。または式(2)を適用して項から信号電力を計算するどちらの場合も、DFT項で表される信号電力について以下の式が得られる。:
以下の擬似コードでは、複素数値の入力データが配列xに格納され、変数sprevとにはsprev2IIRフィルタからの出力履歴が一時的に格納されます。Ntermsは配列内のサンプル数であり、はKtermサンプリング周期を乗じた対象周波数に対応します。
ここで定義されるNterms ここで選択されたKterm ω = 2 × π × Kterm / Nterms; 係数 := 2 × cos(ω) sprev := 0 sprev2 := 0 0からNterms-1までの範囲の各インデックスnについて、 s := x[n] + coeff × sprev - sprev2 sprev2 := sprev sprev := s 終わり パワー := sprev 2 + sprev2 2 - (coeff × sprev × sprev2)
[ 10 ]入力サンプルをソフトウェアオブジェクトに1つずつ渡して更新間のフィルタ状態を維持し、他の処理が完了した後に最終的な電力結果にアクセスするように計算を整理することが可能です。
実数値の入力データは、特に物理プロセスの直接測定から入力ストリームが得られる組み込みシステムにおいて頻繁に発生します。入力データが実数値の場合、フィルタ内部の状態変数sprevもsprev2実数値であることが確認できるため、最初のIIRステージでは複雑な演算は不要です。実数値演算の最適化は、通常、変数に適切な実数値データ型を適用するだけで済みます。
入力項を用いた計算後フィルタ反復が終了したら、式(11)を適用してDFT項を評価する必要があります。最終的な計算では複素数値演算を使用しますが、実数部と虚数部を分離することで実数値演算に変換できます。
パワースペクトルアプリケーションと比較すると、唯一の違いは、計算を完了するために使用される方法である。
(信号電力の実装時と同じIIRフィルタの計算) XKreal = sprev * cr - sprev2; XKimag = sprev * ci;
このアプリケーションでは、DFT項の同様の評価が必要です。前述のセクションで説明したように、実数値または複素数値の入力ストリームを使用します。すると、信号位相は次のように評価できます。
逆正接関数を計算する際には、特異点や象限などについて適切な予防措置を講じる。
複素信号は実部と虚部に線形に分解されるため、Goertzelアルゴリズムは実部の各部分について個別に実数演算で計算でき、、そして虚数部の数列にわたって、その後、2つの複素数値の部分結果を再結合することができます。
複雑度オーダー式では、計算された項の数より小さいゴーツェルアルゴリズムの利点は明らかです。しかし、FFTコードは比較的複雑であるため、「単位作業あたりのコスト」要因がFFT の場合、多くの場合、より大きくなり、実用上の利点は、Goertzel アルゴリズムが有利になります。数倍大きい。
基数2のFFTとGoertzelアルゴリズムのどちらが効率的かを判断する目安として、項数を調整してください。データセット内で最も近い正確な 2 乗に上向きにし、これを、そして、Goertzel アルゴリズムは、以下の場合に高速になる可能性が高い。
FFTの実装と処理プラットフォームは、相対的なパフォーマンスに大きな影響を与えます。一部のFFT実装[ 11 ]は、内部で複素数計算を実行して係数をオンザフライで生成するため、「単位作業あたりのコストK」が大幅に増加します。FFTおよびDFTアルゴリズムは、数値効率を向上させるために事前に計算された係数値のテーブルを使用できますが、これには外部メモリにバッファリングされた係数値へのアクセスが増えるため、数値的な利点の一部を打ち消すキャッシュ競合の増加につながる可能性があります。
どちらのアルゴリズムも、入力データに複素数値ではなく実数値を使用すると、効率が約2倍向上します。ただし、この向上はGoertzelアルゴリズムでは当然のことながら、FFTでは実数値データの変換に特化した特定のアルゴリズム変種を使用しない限り実現できません。