mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-11-26 19:01:44 +02:00
Split out Butterworth filter coeff init to a separate function.
Signed-off-by: Mans Rullgard <mans@mansr.com>
(cherry picked from commit 30112adadf
)
This commit is contained in:
parent
99c2111b12
commit
2293b0b698
@ -47,29 +47,25 @@ typedef struct FFIIRFilterState{
|
||||
/// maximum supported filter order
|
||||
#define MAXORDER 30
|
||||
|
||||
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)
|
||||
static int butterworth_init_coeffs(void *avc, struct FFIIRFilterCoeffs *c,
|
||||
enum IIRFilterMode filt_mode,
|
||||
int order, float cutoff_ratio,
|
||||
float stopband)
|
||||
{
|
||||
int i, j;
|
||||
FFIIRFilterCoeffs *c;
|
||||
double wa;
|
||||
double p[MAXORDER + 1][2];
|
||||
|
||||
if(filt_type != FF_FILTER_TYPE_BUTTERWORTH || filt_mode != FF_FILTER_MODE_LOWPASS)
|
||||
return NULL;
|
||||
if(order <= 1 || (order & 1) || 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_mode != FF_FILTER_MODE_LOWPASS) {
|
||||
av_log(avc, AV_LOG_ERROR, "Butterworth filter currently only supports "
|
||||
"low-pass filter mode\n");
|
||||
return -1;
|
||||
}
|
||||
if (order & 1) {
|
||||
av_log(avc, AV_LOG_ERROR, "Butterworth filter currently only supports "
|
||||
"even filter orders\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
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;
|
||||
|
||||
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;
|
||||
|
||||
init_fail:
|
||||
|
Loading…
Reference in New Issue
Block a user