[vDSP,メモ] vDSP関数の使い方4

vDSP関数の使い方について忘れないようにメモってみます。

この記事は、vDSP関数の使い方3の続きです。

今回はvDSP関数を一気に確認してゆきます。
使い方は関数にリファレンスへのリンクを張っているのでそちらで確認してください。
サンプルと実行結果を確認できます。

vDSP_vclip
float inVector1[8] = {1, 2, 3, 4, 5, 6, 7, 8};
float outVectorVclip[8];
float low = 3;
float high = 6;
vDSP_vclip(inVector1, 1, &low, &high, outVectorVclip, 1, 8);
vdsp4-vclip.png

vDSP_vthres
float inVector1[8] = {1, 2, 3, 4, 5, 6, 7, 8};
float outVectorVthres[8];
float lower_threshold = 4;
vDSP_vthres(inVector1, 1, &lower_threshold, outVectorVthres, 1, 8);
vdsp4-vthres.png

vDSP_vrvrs
この様に入力値を上書きするタイプの関数をin placeと言います。
反対にout of placeと記述があるものは出力を別に書き出します。
in placeとout of placeは重要なので覚えておきましょう。
float inVector1[8] = {1, 2, 3, 4, 5, 6, 7, 8};
vDSP_vrvrs(inVector1, 1, 8);
vdsp4-vrvrs.png

vDSP_vsort
float inVector1[8] = {1, 21, 13, 41, 15, 86, 7, 48};
vDSP_vsort(inVector1, 8, 1);  // ascending
vDSP_vsort(inVector1, 8, -1); // descending
ascending
vdsp4-vsort-asc.png
descending
vdsp4-vsort-desc.png

vDSP_vsma
第一引数のベクトルに第三引数の値を掛けたベクトルと第四引数を足す
一度に複数の計算を行うタイプの関数です。
似たような関数名が多いので注意しましょう。
float inVector1[8] = {1, 2, 3, 4, 5, 6, 7, 8};
float inVector2[8] = {1, 2, 3, 4, 5, 6, 7, 8};
float outVectorVsma[8];
float mul = 10;
vDSP_vsma(inVector1, 1, &mul, inVector2, 1, outVectorVsma, 1, 8);
vdsp4-vsma.png

vDSP_vdist
float inVector1[8] = {1, 2, 3, 4, 5, 6, 7, 8};
float inVector2[8] = {1, 2, 3, 4, 5, 6, 7, 8};
float outVectorVdist[8];
vDSP_vdist(inVector1, 1, inVector2, 1, outVectorVdist, 1, 8);
vdsp4-vdist.png

vDSP_maxv
float inVector1[8] = {1, 21, 13, 5, 12, 3, 7, 18};
float outMaxv;
vDSP_maxv(inVector1, 1, &outMaxv, 8);
vdsp4-maxv.png

vDSP_minv
float inVector1[8] = {10, 21, 13, 5, 12, 3, 7, 18};
float outMinv;
vDSP_minv(inVector1, 1, &outMinv, 8);
vdsp4-minv.png

vDSP_vindex
float inVector1[8] = {1, 2, 3, 4, 5, 6, 7, 8};
float inVector2[8] = {7, 6, 5, 4, 2, 2, 1, 0};
float outVectorVindex[8];
vDSP_vindex(inVector1, inVector2, 1, outVectorVindex, 1, 8);
vsdp4-vindex.png

vDSP_vfill
float fill = 10;
float outVectorVfill[8];
vDSP_vfill(&fill, outVectorVfill, 1, 8);
vdsp4-vfill.png

vDSP_vclr
float outVectorVclr[8];
vDSP_vclr(outVectorVclr, 1, 8);
vdsp4-vclr.png

vDSP_vdbcon
vDSP_vsaddの関数は入力と出力同じものを使えます。
これを覚えておくとわざわざ出力用のベクトルを用意する手間が省けます。
float inVector1[8] = {0, 1, 0.9, 0.5, 0.2, 0.1, 0.04, 0.01};
float outVectorVdbcon[8];
float mAdjust0DB;
mAdjust0DB = 1.5849e-13,
vDSP_vsadd(inVector1, 1, &mAdjust0DB, inVector1, 1, 8);
float one = 1;
vDSP_vdbcon(inVector1, 1, &one, outVectorVdbcon, 1, 8, 0);
vsdp4-vdbcon.png

参考サイト
Forever For Now - Vectorizing with vDSP and vecLib
dBとリニア値を変換する - Objective-Audio