/* ***************************************************************************** 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, TestVectorVectorAdd) { float out[10]; VectorVectorAdd(out, zeros, ramp, 10); for (unsigned i = 0; i < 10; ++i) { ASSERT_FLOAT_EQ(ramp[i], out[i]); } }
/******************************************************************************* Set Speed */ Error_t TapeSetSpeed(Tape* tape, TapeSpeed speed) { if (tape) { // Set speed tape->speed = speed; // Update saturation curve PolySaturatorSetN(tape->polysat, calculate_n(tape->saturation, speed)); // Clear old flutter/wow modulation waveform ClearBuffer(tape->flutter_mod, tape->flutter_mod_length); // Yes, clear the old length... // Calculate new modulation waveform length... tape->flutter_mod_length = (unsigned)(tape->sample_rate / \ (0.80 * powf(2.0, (float)speed))); // Generate flutter/wow modulation waveform float temp_buffer[tape->flutter_mod_length]; for (unsigned comp = 0; comp < N_FLUTTER_COMPONENTS; ++comp) { float phase_step = (2.0 * M_PI * comp * powf(2.0, (float)speed)) / tape->sample_rate; ClearBuffer(temp_buffer, tape->flutter_mod_length); for (unsigned i = 0; i < tape->flutter_mod_length; ++i) { temp_buffer[i] = sinf(i * phase_step) / N_FLUTTER_COMPONENTS; } VectorVectorAdd(tape->flutter_mod, tape->flutter_mod, temp_buffer, tape->flutter_mod_length); } return NOERR;; } else { return NULL_PTR_ERROR; } }