オーディオ・音声分析への道 その2 演算処理
さて、前回はXcodeのプロジェクトの作成と、設定、更に簡単なvDSP演算処理について書きました。
今回も演算処理について書いて、今後信号処理を行う上で必要になる関数を勉強したいと思います。
こちらは四則演算の関数一覧です。
- 加算 : vDSP_vadd()
- 減算 : vDSP_vsub()
- 乗算 : vDSP_vmul()
- 除算 : vDSP_vdiv()
データ型に関しては、
- vDSP_vaddi(); = int
- vDSP_vadd(); = float
- vDSP_vaddD(); = double
ちなみに、addの前につく"v"はvectorの意味です。
加算は前回やりましたので、減算からやりましょう。
減算はfloatとdouble型のみ用意されている模様です。
減算
main.c
#include <stdio.h>
#include<Accelerate/Accelerate.h>
int main(int argc, const char * argv[])
{
float input1[8] = {1,2,3,4,5,6,7,8};
float input2[8] = {11,12,13,14,15,16,17,18};
float output[8];
vDSP_vsub(input1,1,input2,1,output,1,8);
// 結果表示
int i;
for(i=0;i<8;i++){
printf("output[%d] = %f\n",i,output[i]);
}
return 0;
}
結果は
result
output[0] = 10.000000
output[1] = 10.000000
output[2] = 10.000000
output[3] = 10.000000
output[4] = 10.000000
output[5] = 10.000000
output[6] = 10.000000
output[7] = 10.000000
Program ended with exit code: 0
でした。
乗算
main.c
vDSP_vmul(input1,1,input2,1,output,1,8);
上の様にして、結果は
result
output[0] = 11.000000
output[1] = 24.000000
output[2] = 39.000000
output[3] = 56.000000
output[4] = 75.000000
output[5] = 96.000000
output[6] = 119.000000
output[7] = 144.000000
Program ended with exit code: 0
こうなります。
除算
main.c
vDSP_vdiv(input1,1,input2,1,output,1,8);
結果
result
output[0] = 11.000000
output[1] = 6.000000
output[2] = 4.333333
output[3] = 3.500000
output[4] = 3.000000
output[5] = 2.666667
output[6] = 2.428571
output[7] = 2.250000
Program ended with exit code: 0
その他
上の例では、四則演算を全て配列で行っていました。
しかし、例えばinput1に格納されている全てのデータに、同じ数を掛け合わせたい、というケースがあるかもしれません。
この場合は、ベクトルスカラー計算んを行います。
つまり、
vDSP_vsmul()
とvectorのvの後にscalarのsをいれます。
main.c
float mul = 10;
vDSP_vsmul(input1,1,&mul,output,1,8);
同じデータ型の変数を用意し、それをポインタで渡します。
この変数のストライドは必要ありません。
main.c
extern void vDSP_vsmul(
const float *__vDSP_A, // input1
vDSP_Stride __vDSP_IA, // input1のストライド (1)
const float *__vDSP_B, //割る数 (ストライド無し)
float *__vDSP_C, // output
vDSP_Stride __vDSP_IC, // outputのストライド(1)
vDSP_Length __vDSP_N) //データの長さ
次は波形を生成したいと思います。