X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fiirfilter.c;h=90af43190e1b7cd0dbba8bd774f2b4d7325f5bb2;hb=080ce9071dc1d05fcfd40629eeb6d4a163abd840;hp=07eef64ab924072419ad612ab2a731a944ffaf12;hpb=e187d87d7d1118bf6e592ad09320694c027bd0f8;p=ffmpeg diff --git a/libavcodec/iirfilter.c b/libavcodec/iirfilter.c index 07eef64ab92..90af43190e1 100644 --- a/libavcodec/iirfilter.c +++ b/libavcodec/iirfilter.c @@ -20,7 +20,7 @@ */ /** - * @file libavcodec/iirfilter.c + * @file * different IIR filters implementation */ @@ -47,12 +47,12 @@ typedef struct FFIIRFilterState{ /// maximum supported filter order #define MAXORDER 30 -struct FFIIRFilterCoeffs* ff_iir_filter_init_coeffs(enum IIRFilterType filt_type, +av_cold struct FFIIRFilterCoeffs* ff_iir_filter_init_coeffs(enum IIRFilterType filt_type, enum IIRFilterMode filt_mode, int order, float cutoff_ratio, float stopband, float ripple) { - int i, j, size; + int i, j; FFIIRFilterCoeffs *c; double wa; double p[MAXORDER + 1][2]; @@ -112,7 +112,7 @@ struct FFIIRFilterCoeffs* ff_iir_filter_init_coeffs(enum IIRFilterType filt_type return c; } -struct FFIIRFilterState* ff_iir_filter_init_state(int order) +av_cold struct FFIIRFilterState* ff_iir_filter_init_state(int order) { FFIIRFilterState* s = av_mallocz(sizeof(FFIIRFilterState) + sizeof(s->x[0]) * (order - 1)); return s; @@ -163,12 +163,12 @@ void ff_iir_filter(const struct FFIIRFilterCoeffs *c, struct FFIIRFilterState *s } } -void ff_iir_filter_free_state(struct FFIIRFilterState *state) +av_cold void ff_iir_filter_free_state(struct FFIIRFilterState *state) { av_free(state); } -void ff_iir_filter_free_coeffs(struct FFIIRFilterCoeffs *coeffs) +av_cold void ff_iir_filter_free_coeffs(struct FFIIRFilterCoeffs *coeffs) { if(coeffs){ av_free(coeffs->cx); @@ -177,3 +177,39 @@ void ff_iir_filter_free_coeffs(struct FFIIRFilterCoeffs *coeffs) av_free(coeffs); } +#ifdef TEST +#define FILT_ORDER 4 +#define SIZE 1024 +int main(void) +{ + struct FFIIRFilterCoeffs *fcoeffs = NULL; + struct FFIIRFilterState *fstate = NULL; + float cutoff_coeff = 0.4; + int16_t x[SIZE], y[SIZE]; + int i; + FILE* fd; + + fcoeffs = ff_iir_filter_init_coeffs(FF_FILTER_TYPE_BUTTERWORTH, + FF_FILTER_MODE_LOWPASS, FILT_ORDER, + cutoff_coeff, 0.0, 0.0); + fstate = ff_iir_filter_init_state(FILT_ORDER); + + for (i = 0; i < SIZE; i++) { + x[i] = lrint(0.75 * INT16_MAX * sin(0.5*M_PI*i*i/SIZE)); + } + + ff_iir_filter(fcoeffs, fstate, SIZE, x, 1, y, 1); + + fd = fopen("in.bin", "w"); + fwrite(x, sizeof(x[0]), SIZE, fd); + fclose(fd); + + fd = fopen("out.bin", "w"); + fwrite(y, sizeof(y[0]), SIZE, fd); + fclose(fd); + + ff_iir_filter_free_coeffs(fcoeffs); + ff_iir_filter_free_state(fstate); + return 0; +} +#endif /* TEST */