Error_t BiquadFilterUpdateKernelD(BiquadFilterD *filter, const double *bCoeff, const double *aCoeff) { CopyBufferD(filter->b, bCoeff, 3); CopyBufferD(filter->a, aCoeff, 2); return NOERR; }
TEST(DSPDouble, TestCopyBuffer) { double out[10]; CopyBufferD(out, onesD, 10); for (unsigned i = 0; i < 10; ++i) { ASSERT_DOUBLE_EQ(onesD[i], out[i]); } }
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; }
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; }