5

float または double の 1D ベクトルが与えられた場合、Accelerate Framework の vDSP ライブラリの関数を使用して、そのベクトルの自己相関をどのように計算できますか?

vDSP_acor() および vDSP_acorD() 関数がこの計算を実行すると思われるかもしれませんが、ドキュメント vDSP_Library.pdf (ここから入手可能) は、関数の引数がどのように使用されるかを説明していません。

同様に、vDSP_conv() および vDSP_convD() 関数は、2 つのベクトル間の相関と畳み込みを実行する機能について言及していますが、それらをうまく使用できるようにするための十分な説明やサンプル コードを提供していません。たとえば、フィルター カーネルを使用して 2D マトリックスを畳み込む場合、異なる値の signalStride を使用して vDSP_convD() を 2 回呼び出す必要があると思いますが、これはドキュメントから省略されています。もう 1 つの省略は、フィルター内のデータをパックする方法です。ゼロでパディングされた場合、ゼロが最初か最後か、またはゼロ以外のエントリの両側に均等に分散する必要があるかどうかは重要ですか? フィルターの長さ、結果の長さ、および入力の長さに関する要件はありますか?

有用な例の提案: vDSP_acor() と vDSP_conv() の両方を使用した、ベクトルとそれ自体の自己相関の実装。IFT が正規化されていない回答を返す前に、自己相関関数の計算に使用される vDSP_fft2d_zrip() を使用して前方 FFT された実データとしてパックされた周波数領域の 2 つの配列の 2 項乗算。1D および 2D 配列でのガウス カーネル畳み込みの実装。一般的に、これは素晴らしいライブラリです (FAST と言えますか?!) が、これらの特定の関数を理解するのは少し難しいことがわかりました。前述の例は、信号処理と画像解析で非常に一般的であるため、おそらく広く使用されます。

vDSP_Library 参照ドキュメントの管理者への提案: 「空間ドメイン」と「時間ドメイン」はドキュメント全体で同等であると想定しています。そうでない場合は、その区別をしてください。また、議論されている関数で宣言された引数の名前と一致する適切に定義されたパラメーターが式に含まれていることを確認してください。

脚注: ここで言及する自己相関は、次のように定義されます: A[T] = <(X[t]-m)(X[tT]-m)>/v、ここで、A[T] はラグ T での自己相関です。 t は信号 X のインデックス、m はすべての t での X の平均、v はすべての t での X の分散です。山括弧 <> は、T 離れた X の使用可能なすべてのペアの平均を示します。

4

1 に答える 1

9

のドキュメントはvDSP_acorD、少しまばらですが、かなり明確に見えますが、パラメーターの説明にタイプミスがあるようです。

void vDSP_acorD (double * A,
    double * C, int N, int M);

Aは入力信号、Cは自己相関出力、Nは のサンプル数、 は でA必要Mな出力値の数ですC(つまり、C は から までのラグ値を保持0しますM - 1)。

vDSP_acorDが利用できない場合はvDSP_conv、畳み込みは入力信号の 1 つを逆にした相関と同じ操作であるため、使用できる可能性があります。

あるいは、自己相関がパワー スペクトルの逆 FFT に相当するという事実を使用して、独自の高速自己相関をロールすることもできます。

auto_correlation = IFFT(MAG(FFT(x)))

どこ

FFT = forward FFT
IFFT = inverse FFT
MAG = magnitude of complex spectrum (sqrt(re * re + im * im))

次に、vDSP の FFT ルーチンを使用します。

于 2011-04-05T06:56:55.187 に答える