mirror of https://git.ffmpeg.org/ffmpeg.git
Split out Butterworth filter coeff init to a separate function.
Signed-off-by: Mans Rullgard <mans@mansr.com>
This commit is contained in:
parent
75b98610a7
commit
30112adadf
|
@ -47,29 +47,25 @@ typedef struct FFIIRFilterState{
|
||||||
/// maximum supported filter order
|
/// maximum supported filter order
|
||||||
#define MAXORDER 30
|
#define MAXORDER 30
|
||||||
|
|
||||||
av_cold struct FFIIRFilterCoeffs* ff_iir_filter_init_coeffs(void *avc,
|
static int butterworth_init_coeffs(void *avc, struct FFIIRFilterCoeffs *c,
|
||||||
enum IIRFilterType filt_type,
|
enum IIRFilterMode filt_mode,
|
||||||
enum IIRFilterMode filt_mode,
|
int order, float cutoff_ratio,
|
||||||
int order, float cutoff_ratio,
|
float stopband)
|
||||||
float stopband, float ripple)
|
|
||||||
{
|
{
|
||||||
int i, j;
|
int i, j;
|
||||||
FFIIRFilterCoeffs *c;
|
|
||||||
double wa;
|
double wa;
|
||||||
double p[MAXORDER + 1][2];
|
double p[MAXORDER + 1][2];
|
||||||
|
|
||||||
if(filt_type != FF_FILTER_TYPE_BUTTERWORTH || filt_mode != FF_FILTER_MODE_LOWPASS)
|
if (filt_mode != FF_FILTER_MODE_LOWPASS) {
|
||||||
return NULL;
|
av_log(avc, AV_LOG_ERROR, "Butterworth filter currently only supports "
|
||||||
if(order <= 1 || (order & 1) || order > MAXORDER || cutoff_ratio >= 1.0)
|
"low-pass filter mode\n");
|
||||||
return NULL;
|
return -1;
|
||||||
|
}
|
||||||
FF_ALLOCZ_OR_GOTO(avc, c, sizeof(FFIIRFilterCoeffs),
|
if (order & 1) {
|
||||||
init_fail);
|
av_log(avc, AV_LOG_ERROR, "Butterworth filter currently only supports "
|
||||||
FF_ALLOC_OR_GOTO (avc, c->cx, sizeof(c->cx[0]) * ((order >> 1) + 1),
|
"even filter orders\n");
|
||||||
init_fail);
|
return -1;
|
||||||
FF_ALLOC_OR_GOTO (avc, c->cy, sizeof(c->cy[0]) * order,
|
}
|
||||||
init_fail);
|
|
||||||
c->order = order;
|
|
||||||
|
|
||||||
wa = 2 * tan(M_PI * 0.5 * cutoff_ratio);
|
wa = 2 * tan(M_PI * 0.5 * cutoff_ratio);
|
||||||
|
|
||||||
|
@ -113,6 +109,38 @@ av_cold struct FFIIRFilterCoeffs* ff_iir_filter_init_coeffs(void *avc,
|
||||||
}
|
}
|
||||||
c->gain /= 1 << order;
|
c->gain /= 1 << order;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
av_cold struct FFIIRFilterCoeffs* ff_iir_filter_init_coeffs(void *avc,
|
||||||
|
enum IIRFilterType filt_type,
|
||||||
|
enum IIRFilterMode filt_mode,
|
||||||
|
int order, float cutoff_ratio,
|
||||||
|
float stopband, float ripple)
|
||||||
|
{
|
||||||
|
FFIIRFilterCoeffs *c;
|
||||||
|
|
||||||
|
if (order <= 0 || order > MAXORDER || cutoff_ratio >= 1.0)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
FF_ALLOCZ_OR_GOTO(avc, c, sizeof(FFIIRFilterCoeffs),
|
||||||
|
init_fail);
|
||||||
|
FF_ALLOC_OR_GOTO (avc, c->cx, sizeof(c->cx[0]) * ((order >> 1) + 1),
|
||||||
|
init_fail);
|
||||||
|
FF_ALLOC_OR_GOTO (avc, c->cy, sizeof(c->cy[0]) * order,
|
||||||
|
init_fail);
|
||||||
|
c->order = order;
|
||||||
|
|
||||||
|
if (filt_type == FF_FILTER_TYPE_BUTTERWORTH) {
|
||||||
|
if (butterworth_init_coeffs(avc, c, filt_mode, order, cutoff_ratio,
|
||||||
|
stopband)) {
|
||||||
|
goto init_fail;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
av_log(avc, AV_LOG_ERROR, "filter type is not currently implemented\n");
|
||||||
|
goto init_fail;
|
||||||
|
}
|
||||||
|
|
||||||
return c;
|
return c;
|
||||||
|
|
||||||
init_fail:
|
init_fail:
|
||||||
|
|
Loading…
Reference in New Issue