Pebble Coding

ソフトウェアエンジニアによるIT技術、数学の備忘録

vDSPのフィルター機能(FIR,IIR)

FIR(Finite Inpluse Response) フィルター

実float FIR

vDSP_desamp(
    const float * A,    // real input vector A のサイズは DF * (N-1) + P 以上
    vDSP_Stride DF,     // Decimation factor
    const float * F,    // real filter vector
    float * C,          // real output vector
    vDSP_Length N,      // length of output vector c
    vDSP_Length P);     // length of filter F

for (int n = 0; n < N; ++n)
{
    float sum = 0;
    for (int p = 0; p < P; ++p) {
        sum += A[n * DF + p] * F[p];
    }
    C[n] = sum;
}

複素float FIR

void vDSP_zrdesamp(
  const DSPSplitComplex *A,
  vDSP_Stride DF,
  const float *F,
  const DSPSplitComplex *C,
  vDSP_Length N,
  vDSP_Length P);

for (int n = 0; n < N; ++n) {
    sum = 0;
    for (p = 0; p < P; ++p)
        sum += A[n*DF+p] * F[p];
    C[n] = sum;
}

IIR(Infinite Inpulse Response)フィルター2次

void vDSP_deq22(
  const float *A,    // real input vector
  vDSP_Stride IA,    // stride for A
  const float *B,    // 5 inputs (filter coefficients), with stride 1
  float *C,          // output vector
  vDSP_Stride IC,    // stride for C
  vDSP_Length N);    // number of new output elements to produce
C[n] = A[n  ] * B[0]
     + A[n-1] * B[1]
     + A[n-2] * B[2]
     - C[n-1] * B[3]  
     - C[n-2] * B[4] 
n = {2, N+1}