LoginSignup
13
13

More than 5 years have passed since last update.

[vDSP][信号処理]オーディオ・音声分析への道2 演算処理

Last updated at Posted at 2014-06-13

オーディオ・音声分析への道 その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) //データの長さ

次は波形を生成したいと思います。

13
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
13