Esempio n. 1
0
Error_t
BiquadFilterUpdateKernelD(BiquadFilterD *filter,
                          const double  *bCoeff,
                          const double  *aCoeff)
{

    CopyBufferD(filter->b, bCoeff, 3);
    CopyBufferD(filter->a, aCoeff, 2);
    return NOERR;
}
Esempio n. 2
0
TEST(DSPDouble, TestCopyBuffer)
{
    double out[10];
    CopyBufferD(out, onesD, 10);
    for (unsigned i = 0; i < 10; ++i)
    {
        ASSERT_DOUBLE_EQ(onesD[i], out[i]);
    }
}
Esempio n. 3
0
BiquadFilterD*
BiquadFilterInitD(const double  *bCoeff, const double  *aCoeff)
{

    // Allocate Memory
    BiquadFilterD* filter = (BiquadFilterD*)malloc(sizeof(BiquadFilterD));

    if (filter)
    {
        // Initialize Buffers
        CopyBufferD(filter->b, bCoeff, 3);
        CopyBufferD(filter->a, aCoeff, 2);

        ClearBufferD(filter->x, 2);
        ClearBufferD(filter->y, 2);
        ClearBufferD(filter->w, 2);
    }
    return filter;
}
Esempio n. 4
0
Error_t
BiquadFilterProcessD(BiquadFilterD  *filter,
                     double         *outBuffer,
                     const double   *inBuffer,
                     unsigned       n_samples)
{

#ifdef __APPLE__
    // Use accelerate if we have it
    double coeffs[5] = {
        filter->b[0], filter->b[1], filter->b[2],
        filter->a[0], filter->a[1]
    };
    double temp_in[n_samples + 2];
    double temp_out[n_samples + 2];


    // Put filter overlaps into beginning of input and output vectors
    cblas_dcopy(2, filter->x, 1, temp_in, 1);
    cblas_dcopy(2, filter->y, 1, temp_out, 1);
    cblas_dcopy(n_samples, inBuffer, 1, (temp_in + 2), 1);

    // Process
    vDSP_deq22D(temp_in, 1, coeffs, temp_out, 1, n_samples);

    // Write overlaps to filter x and y arrays
    cblas_dcopy(2, (temp_in + n_samples), 1, filter->x, 1);
    cblas_dcopy(2, (temp_out + n_samples), 1, filter->y, 1);

    // Write output
    cblas_dcopy(n_samples, (temp_out + 2), 1, outBuffer, 1);


#else

    double buffer[n_samples];
    for (unsigned buffer_idx = 0; buffer_idx < n_samples; ++buffer_idx)
    {

        // DF-II Implementation
        buffer[buffer_idx] = filter->b[0] * inBuffer[buffer_idx] + filter->w[0];
        filter->w[0] = filter->b[1] * inBuffer[buffer_idx] - filter->a[0] * \
        buffer[buffer_idx] + filter->w[1];
        filter->w[1] = filter->b[2] * inBuffer[buffer_idx] - filter->a[1] * \
        buffer[buffer_idx];

    }

    // Write output
    CopyBufferD(outBuffer, buffer, n_samples);

#endif
    return NOERR;
}