/* ***************************************************************************** DecimatorProcess */ Error_t DecimatorProcess(Decimator *decimator, float *outBuffer, const float *inBuffer, unsigned n_samples) { if (decimator && outBuffer) { unsigned declen = n_samples / decimator->factor; float temp_buf[declen]; ClearBuffer(outBuffer, declen); for (unsigned filt = 0; filt < decimator->factor; ++filt) { CopyBufferStride(temp_buf, 1, inBuffer, decimator->factor, declen); FIRFilterProcess(decimator->polyphase[filt], temp_buf, temp_buf, declen); VectorVectorAdd(outBuffer, (const float*)outBuffer, temp_buf, declen); } return NOERR; } else { return NULL_PTR_ERROR; } }
TEST(DSPSingle, TestStrideCopy) { float out[10]; float in1[5] = {1.,2.,3.,4.,5.}; float in2[10] = {1., 2., 3., 4., 5., 6., 7., 8., 9., 10.}; float ex1[10] = {1., 0., 2., 0., 3., 0., 4., 0., 5., 0.}; float ex2[5] = {1., 3., 5., 7., 9.}; ClearBuffer(out, 10); CopyBufferStride(out, 2, in1, 1, 5); for (unsigned i = 0; i < 10; ++i) { ASSERT_FLOAT_EQ(ex1[i], out[i]); } ClearBuffer(out, 10); CopyBufferStride(out, 1, in2, 2, 5); for (unsigned i = 0; i < 5; ++i) { ASSERT_FLOAT_EQ(ex2[i], out[i]); } }
/* UpsamplerProcess ****************************************************/ Error_t UpsamplerProcess(Upsampler *upsampler, float *outBuffer, const float *inBuffer, unsigned n_samples) { float tempbuf[n_samples]; if (upsampler && outBuffer) { for (unsigned filt = 0; filt < upsampler->factor; ++filt) { FIRFilterProcess(upsampler->polyphase[filt], tempbuf, inBuffer, n_samples); CopyBufferStride(outBuffer+filt, upsampler->factor, tempbuf, 1, n_samples); } VectorScalarMultiply(outBuffer, (const float*)outBuffer, upsampler->factor, n_samples * upsampler->factor); return NOERR; } else { return NULL_PTR_ERROR; } }