diff options
Diffstat (limited to 'src/engine/filters/enginefilteriir.h')
-rw-r--r-- | src/engine/filters/enginefilteriir.h | 208 |
1 files changed, 118 insertions, 90 deletions
diff --git a/src/engine/filters/enginefilteriir.h b/src/engine/filters/enginefilteriir.h index 48464e37c8..b00996b9ba 100644 --- a/src/engine/filters/enginefilteriir.h +++ b/src/engine/filters/enginefilteriir.h @@ -1,7 +1,9 @@ #pragma once -#define MIXXX #include <cstdio> +#include <cstring> + +#define MIXXX #include <fidlib.h> #include "engine/engineobject.h" @@ -89,110 +91,136 @@ class EngineFilterIIR : public EngineFilterIIRBase { m_doRamping = true; } - void setCoefs(const char* spec, double sampleRate, - double freq0, double freq1 = 0, int adj = 0) { - + void setCoefs(const char* spec, + size_t bufsize, + double sampleRate, + double freq0, + double freq1 = 0, + int adj = 0) { char spec_d[FIDSPEC_LENGTH]; - if (strlen(spec) < sizeof(spec_d)) { - // Copy to dynamic-ish memory to prevent fidlib API breakage. - strcpy(spec_d, spec); + VERIFY_OR_DEBUG_ASSERT(bufsize <= sizeof(spec_d)) { + return; + } + // Copy to dynamic-ish memory to prevent fidlib API breakage. + std::strncpy(spec_d, spec, bufsize); - // Copy the old coefficients into m_oldCoef - memcpy(m_oldCoef, m_coef, sizeof(m_coef)); + // Copy the old coefficients into m_oldCoef + memcpy(m_oldCoef, m_coef, sizeof(m_coef)); - m_coef[0] = fid_design_coef(m_coef + 1, SIZE, - spec_d, sampleRate, freq0, freq1, adj); + m_coef[0] = fid_design_coef(m_coef + 1, SIZE, spec_d, sampleRate, freq0, freq1, adj); - initBuffers(); + initBuffers(); #if(IIR_ANALYSIS) - char* desc; - FidFilter* filt = fid_design(spec_d, sampleRate, freq0, freq1, adj, &desc); - int delay = fid_calc_delay(filt); - qDebug() << QString().fromLatin1(desc) << "delay:" << delay; - double resp0, phase0; - resp0 = fid_response_pha(filt, freq0 / sampleRate, &phase0); - qDebug() << "freq0:" << freq0 << resp0 << phase0; - if (freq1) { - double resp1, phase1; - resp1 = fid_response_pha(filt, freq1 / sampleRate, &phase1); - qDebug() << "freq1:" << freq1 << resp1 << phase1; - } - double resp2, phase2; - resp2 = fid_response_pha(filt, freq0 / sampleRate / 2, &phase2); - qDebug() << "freq2:" << freq0 / 2 << resp2 << phase0; - double resp3, phase3; - resp3 = fid_response_pha(filt, freq0 / sampleRate * 2, &phase3); - qDebug() << "freq3:" << freq0 * 2 << resp3 << phase0; - double resp4, phase4; - resp4 = fid_response_pha(filt, freq0 / sampleRate / 2.2, &phase4); - qDebug() << "freq4:" << freq0 / 2.2 << resp2 << phase0; - double resp5, phase5; - resp5 = fid_response_pha(filt, freq0 / sampleRate * 2.2, &phase5); - qDebug() << "freq5:" << freq0 * 2.2 << resp3 << phase0; - free(filt); -#endif + char* desc; + FidFilter* filt = fid_design(spec_d, sampleRate, freq0, freq1, adj, &desc); + int delay = fid_calc_delay(filt); + qDebug() << QString().fromLatin1(desc) << "delay:" << delay; + double resp0, phase0; + resp0 = fid_response_pha(filt, freq0 / sampleRate, &phase0); + qDebug() << "freq0:" << freq0 << resp0 << phase0; + if (freq1) { + double resp1, phase1; + resp1 = fid_response_pha(filt, freq1 / sampleRate, &phase1); + qDebug() << "freq1:" << freq1 << resp1 << phase1; } + double resp2, phase2; + resp2 = fid_response_pha(filt, freq0 / sampleRate / 2, &phase2); + qDebug() << "freq2:" << freq0 / 2 << resp2 << phase0; + double resp3, phase3; + resp3 = fid_response_pha(filt, freq0 / sampleRate * 2, &phase3); + qDebug() << "freq3:" << freq0 * 2 << resp3 << phase0; + double resp4, phase4; + resp4 = fid_response_pha(filt, freq0 / sampleRate / 2.2, &phase4); + qDebug() << "freq4:" << freq0 / 2.2 << resp2 << phase0; + double resp5, phase5; + resp5 = fid_response_pha(filt, freq0 / sampleRate * 2.2, &phase5); + qDebug() << "freq5:" << freq0 * 2.2 << resp3 << phase0; + free(filt); +#endif } - void setCoefs2(double sampleRate, int n_coef1, - const char* spec1, double freq01, double freq11, int adj1, - const char* spec2, double freq02, double freq12, int adj2) { + void setCoefs2(double sampleRate, + int n_coef1, + const char* spec1, + size_t spec1size, + double freq01, + double freq11, + int adj1, + const char* spec2, + size_t spec2size, + double freq02, + double freq12, + int adj2) { char spec1_d[FIDSPEC_LENGTH]; char spec2_d[FIDSPEC_LENGTH]; - if (strlen(spec1) < sizeof(spec1_d) && - strlen(spec2) < sizeof(spec2_d)) { - // Copy to dynamic-ish memory to prevent fidlib API breakage. - strcpy(spec1_d, spec1); - strcpy(spec2_d, spec2); - - // Copy the old coefficients into m_oldCoef - memcpy(m_oldCoef, m_coef, sizeof(m_coef)); - m_coef[0] = fid_design_coef(m_coef + 1, n_coef1, - spec1, sampleRate, freq01, freq11, adj1) * - fid_design_coef(m_coef + 1 + n_coef1, SIZE - n_coef1, - spec2, sampleRate, freq02, freq12, adj2); + VERIFY_OR_DEBUG_ASSERT(spec1size <= sizeof(spec1_d) && spec2size <= sizeof(spec2_d)) { + return; + } - initBuffers(); + // Copy to dynamic-ish memory to prevent fidlib API breakage. + std::strncpy(spec1_d, spec1, spec1size); + std::strncpy(spec2_d, spec2, spec2size); + spec1_d[FIDSPEC_LENGTH - 1] = '\0'; + spec2_d[FIDSPEC_LENGTH - 1] = '\0'; + + // Copy the old coefficients into m_oldCoef + memcpy(m_oldCoef, m_coef, sizeof(m_coef)); + m_coef[0] = fid_design_coef(m_coef + 1, + n_coef1, + spec1, + sampleRate, + freq01, + freq11, + adj1) * + fid_design_coef(m_coef + 1 + n_coef1, + SIZE - n_coef1, + spec2, + sampleRate, + freq02, + freq12, + adj2); + + initBuffers(); #if(IIR_ANALYSIS) - char* desc1; - char* desc2; - FidFilter* filt1 = fid_design(spec1, sampleRate, freq01, freq11, adj1, &desc1); - FidFilter* filt2 = fid_design(spec2, sampleRate, freq02, freq12, adj2, &desc2); - FidFilter* filt = fid_cat(1, filt1, filt2, NULL); - int delay = fid_calc_delay(filt); - qDebug() << QString().fromLatin1(desc1) << "X" << QString().fromLatin1(desc2) << "delay:" << delay; - double resp0, phase0; - resp0 = fid_response_pha(filt, freq01 / sampleRate, &phase0); - qDebug() << "freq01:" << freq01 << resp0 << phase0; - resp0 = fid_response_pha(filt, freq01 / sampleRate, &phase0); - qDebug() << "freq02:" << freq02 << resp0 << phase0; - if (freq11) { - double resp1, phase1; - resp1 = fid_response_pha(filt, freq11 / sampleRate, &phase1); - qDebug() << "freq1:" << freq11 << resp1 << phase1; - } - if (freq12) { - double resp1, phase1; - resp1 = fid_response_pha(filt, freq12 / sampleRate, &phase1); - qDebug() << "freq1:" << freq12 << resp1 << phase1; - } - double resp2, phase2; - resp2 = fid_response_pha(filt, freq01 / sampleRate / 2, &phase2); - qDebug() << "freq2:" << freq01 / 2 << resp2 << phase0; - double resp3, phase3; - resp3 = fid_response_pha(filt, freq01 / sampleRate * 2, &phase3); - qDebug() << "freq3:" << freq01 * 2 << resp3 << phase0; - double resp4, phase4; - resp4 = fid_response_pha(filt, freq01 / sampleRate / 2.2, &phase4); - qDebug() << "freq4:" << freq01 / 2.2 << resp2 << phase0; - double resp5, phase5; - resp5 = fid_response_pha(filt, freq01 / sampleRate * 2.2, &phase5); - qDebug() << "freq5:" << freq01 * 2.2 << resp3 << phase0; - free(filt); -#endif + char* desc1; + char* desc2; + FidFilter* filt1 = fid_design(spec1, sampleRate, freq01, freq11, adj1, &desc1); + FidFilter* filt2 = fid_design(spec2, sampleRate, freq02, freq12, adj2, &desc2); + FidFilter* filt = fid_cat(1, filt1, filt2, NULL); + int delay = fid_calc_delay(filt); + qDebug() << QString().fromLatin1(desc1) << "X" + << QString().fromLatin1(desc2) << "delay:" << delay; + double resp0, phase0; + resp0 = fid_response_pha(filt, freq01 / sampleRate, &phase0); + qDebug() << "freq01:" << freq01 << resp0 << phase0; + resp0 = fid_response_pha(filt, freq01 / sampleRate, &phase0); + qDebug() << "freq02:" << freq02 << resp0 << phase0; + if (freq11) { + double resp1, phase1; + resp1 = fid_response_pha(filt, freq11 / sampleRate, &phase1); + qDebug() << "freq1:" << freq11 << resp1 << phase1; + } + if (freq12) { + double resp1, phase1; + resp1 = fid_response_pha(filt, freq12 / sampleRate, &phase1); + qDebug() << "freq1:" << freq12 << resp1 << phase1; } + double resp2, phase2; + resp2 = fid_response_pha(filt, freq01 / sampleRate / 2, &phase2); + qDebug() << "freq2:" << freq01 / 2 << resp2 << phase0; + double resp3, phase3; + resp3 = fid_response_pha(filt, freq01 / sampleRate * 2, &phase3); + qDebug() << "freq3:" << freq01 * 2 << resp3 << phase0; + double resp4, phase4; + resp4 = fid_response_pha(filt, freq01 / sampleRate / 2.2, &phase4); + qDebug() << "freq4:" << freq01 / 2.2 << resp2 << phase0; + double resp5, phase5; + resp5 = fid_response_pha(filt, freq01 / sampleRate * 2.2, &phase5); + qDebug() << "freq5:" << freq01 * 2.2 << resp3 << phase0; + free(filt); +#endif } virtual void assumeSettled() { |