実際にvDSPを使って信号処理をしてみます。まずは、扱いが簡単な加減乗除の方から見ていきます。英語が読める方、詳しく把握したい方はこちらの記事がとてもよくできているので、是非見てみてください。
vDSPを使うための準備
Accelerate.frameworkのフレームワークの追加
vDSP(vecLib)はAccelerate.framework内に含まれています。このフレームワークはOS X / iOSそれぞれ用意されているので、Xcodeでプロジェクトを開いたら現在のプラットフォーム用のAccelerate.frameworkをプロジェクトに追加します。
名前的に一番上に出てくるので見つけやすいです。
<Acclerate/Accelerate.h>をインポートする
vDSPのメソッドを使うためには他のフレームワークを使うときと同様、<Accelerate/Accelerate.h>をソースコード内でインポートします。
信号の加減乗除を行うために必要な準備はこれだけです。
加算をしてみる
vDSPには用途に応じてさまざまな加減乗除用の関数が用意されています。まずは、一番わかりやすい配列同士の加算をやってみます。
floatの配列で構成される信号1と信号2の加算は、下記のメソッドで実行できます。
vDSP_vadd(信号1, ストライド1, 信号2, ストライド2, 出力先, ストライド3, 要素の数);
ストライドについては、後ほど説明するのでとりあえずここでは全て1を指定して、実際に計算してみましょう。
void vaddtest() { float signal1[8] = {1, 2, 3, 4, 5, 6, 7, 8}; float signal2[8] = {1, 2, 3, 4, 5, 6, 7, 8}; float result[8] = {0, 0, 0, 0, 0, 0, 0, 0}; vDSP_vadd(signal1, 1, signal2, 1, result, 1, 8); for (int i=0;i <8; i++) { NSLog(@"%d %f", i, result[i]); } }
これを実行するとresultに{2,4,6,8,10,12,14,16}という数字がはいり、signal1とsignal2が加算された結果がresultに代入されたことが確認できます。
ストライドの使い方
ストライドは配列を何個飛ばしで読んでいくか/書いていくかを決定するものです。どういう時に使うかというと、モノラル以外のチャンネルの信号(ステレオなどマルチチャンネルのもの)を扱うときに使います。
例えば、ステレオインターリーブドの信号では{左チャンネルの1サンプル目, 右チャンネルの1サンプル目, 左チャンネルの2サンプル目, 右チャンネルの2サンプル目…}という感じでサンプルが並んでいるので、ストライドを2とすれば左チャンネルあるいは右チャンネルだけを取得することができます。あるいは、書き込みのストライドに2を指定することで左チャンネルだけ、右チャンネルだけを書き換える事もできます。
加算以外の処理
減算はvDSP_vsub、乗算はvDSP_vmul、除算にはvDSP_vdivがそれぞれ用意されています。基本的に使い方は同じですが、除算の場合は0で割ってしまわないように注意しましょう。
次は高速フーリエ変換を使っていってみます。
「vDSPを使う(加減乗除編)」への2件のフィードバック