FFmpeg
Data Structures | Macros | Functions
iirfilter.c File Reference
#include <math.h>
#include "config.h"
#include "libavutil/attributes.h"
#include "libavutil/common.h"
#include "libavutil/log.h"
#include "libavutil/mem.h"
#include "iirfilter.h"

Go to the source code of this file.

Data Structures

struct  FFIIRFilterCoeffs
 IIR filter global parameters. More...
 
struct  FFIIRFilterState
 IIR filter state. More...
 

Macros

#define MAXORDER   30
 maximum supported filter order More...
 
#define CONV_S16(dest, source)   dest = av_clip_int16(lrintf(source));
 
#define CONV_FLT(dest, source)   dest = source;
 
#define FILTER_BW_O4_1(i0, i1, i2, i3, fmt)
 
#define FILTER_BW_O4(type, fmt)
 
#define FILTER_DIRECT_FORM_II(type, fmt)
 
#define FILTER_O2(type, fmt)
 

Functions

static av_cold int butterworth_init_coeffs (void *avc, struct FFIIRFilterCoeffs *c, enum IIRFilterMode filt_mode, int order, float cutoff_ratio, float stopband)
 
static av_cold int biquad_init_coeffs (void *avc, struct FFIIRFilterCoeffs *c, enum IIRFilterMode filt_mode, int order, float cutoff_ratio, float stopband)
 
av_cold struct FFIIRFilterCoeffsff_iir_filter_init_coeffs (void *avc, enum IIRFilterType filt_type, enum IIRFilterMode filt_mode, int order, float cutoff_ratio, float stopband, float ripple)
 Initialize filter coefficients. More...
 
av_cold struct FFIIRFilterStateff_iir_filter_init_state (int order)
 Create new filter state. More...
 
static void iir_filter_flt (const struct FFIIRFilterCoeffs *c, struct FFIIRFilterState *s, int size, const float *src, ptrdiff_t sstep, float *dst, ptrdiff_t dstep)
 Perform IIR filtering on floating-point input samples. More...
 
av_cold void ff_iir_filter_free_statep (struct FFIIRFilterState **state)
 Free and zero filter state. More...
 
av_cold void ff_iir_filter_free_coeffsp (struct FFIIRFilterCoeffs **coeffsp)
 Free filter coefficients. More...
 
void ff_iir_filter_init (FFIIRFilterContext *f)
 Initialize FFIIRFilterContext. More...
 

Detailed Description

different IIR filters implementation

Definition in file iirfilter.c.

Macro Definition Documentation

◆ MAXORDER

#define MAXORDER   30

maximum supported filter order

Definition at line 56 of file iirfilter.c.

◆ CONV_S16

#define CONV_S16 (   dest,
  source 
)    dest = av_clip_int16(lrintf(source));

Definition at line 211 of file iirfilter.c.

◆ CONV_FLT

#define CONV_FLT (   dest,
  source 
)    dest = source;

Definition at line 213 of file iirfilter.c.

◆ FILTER_BW_O4_1

#define FILTER_BW_O4_1 (   i0,
  i1,
  i2,
  i3,
  fmt 
)
Value:
in = *src0 * c->gain + \
c->cy[0] * s->x[i0] + \
c->cy[1] * s->x[i1] + \
c->cy[2] * s->x[i2] + \
c->cy[3] * s->x[i3]; \
res = (s->x[i0] + in) * 1 + \
(s->x[i1] + s->x[i3]) * 4 + \
s->x[i2] * 6; \
CONV_ ## fmt(*dst0, res) \
s->x[i0] = in; \
src0 += sstep; \
dst0 += dstep;

Definition at line 215 of file iirfilter.c.

◆ FILTER_BW_O4

#define FILTER_BW_O4 (   type,
  fmt 
)
Value:
{ \
int i; \
const type *src0 = src; \
type *dst0 = dst; \
for (i = 0; i < size; i += 4) { \
float in, res; \
FILTER_BW_O4_1(0, 1, 2, 3, fmt); \
FILTER_BW_O4_1(1, 2, 3, 0, fmt); \
FILTER_BW_O4_1(2, 3, 0, 1, fmt); \
FILTER_BW_O4_1(3, 0, 1, 2, fmt); \
} \
}

Definition at line 229 of file iirfilter.c.

◆ FILTER_DIRECT_FORM_II

#define FILTER_DIRECT_FORM_II (   type,
  fmt 
)
Value:
{ \
int i; \
const type *src0 = src; \
type *dst0 = dst; \
for (i = 0; i < size; i++) { \
int j; \
float in, res; \
in = *src0 * c->gain; \
for (j = 0; j < c->order; j++) \
in += c->cy[j] * s->x[j]; \
res = s->x[0] + in + s->x[c->order >> 1] * c->cx[c->order >> 1]; \
for (j = 1; j < c->order >> 1; j++) \
res += (s->x[j] + s->x[c->order - j]) * c->cx[j]; \
for (j = 0; j < c->order - 1; j++) \
s->x[j] = s->x[j + 1]; \
CONV_ ## fmt(*dst0, res) \
s->x[c->order - 1] = in; \
src0 += sstep; \
dst0 += dstep; \
} \
}

Definition at line 242 of file iirfilter.c.

◆ FILTER_O2

#define FILTER_O2 (   type,
  fmt 
)
Value:
{ \
int i; \
const type *src0 = src; \
type *dst0 = dst; \
for (i = 0; i < size; i++) { \
float in = *src0 * c->gain + \
s->x[0] * c->cy[0] + \
s->x[1] * c->cy[1]; \
CONV_ ## fmt(*dst0, s->x[0] + in + s->x[1] * c->cx[1]) \
s->x[0] = s->x[1]; \
s->x[1] = in; \
src0 += sstep; \
dst0 += dstep; \
} \
}

Definition at line 264 of file iirfilter.c.

Function Documentation

◆ butterworth_init_coeffs()

static av_cold int butterworth_init_coeffs ( void *  avc,
struct FFIIRFilterCoeffs c,
enum IIRFilterMode  filt_mode,
int  order,
float  cutoff_ratio,
float  stopband 
)
static

Definition at line 58 of file iirfilter.c.

Referenced by ff_iir_filter_init_coeffs().

◆ biquad_init_coeffs()

static av_cold int biquad_init_coeffs ( void *  avc,
struct FFIIRFilterCoeffs c,
enum IIRFilterMode  filt_mode,
int  order,
float  cutoff_ratio,
float  stopband 
)
static

Definition at line 123 of file iirfilter.c.

Referenced by ff_iir_filter_init_coeffs().

◆ ff_iir_filter_init_coeffs()

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 
)

Initialize filter coefficients.

Parameters
avca pointer to an arbitrary struct of which the first field is a pointer to an AVClass struct
filt_typefilter type (e.g. Butterworth)
filt_modefilter mode (e.g. lowpass)
orderfilter order
cutoff_ratiocutoff to input frequency ratio
stopbandstopband to input frequency ratio (used by bandpass and bandstop filter modes)
rippleripple factor (used only in Chebyshev filters)
Returns
pointer to filter coefficients structure or NULL if filter cannot be created

Definition at line 166 of file iirfilter.c.

Referenced by ff_psy_preprocess_init(), and main().

◆ ff_iir_filter_init_state()

av_cold struct FFIIRFilterState* ff_iir_filter_init_state ( int  order)

Create new filter state.

Parameters
orderfilter order
Returns
pointer to new filter state or NULL if state creation fails

Definition at line 205 of file iirfilter.c.

Referenced by ff_psy_preprocess_init(), and main().

◆ iir_filter_flt()

static void iir_filter_flt ( const struct FFIIRFilterCoeffs c,
struct FFIIRFilterState s,
int  size,
const float src,
ptrdiff_t  sstep,
float dst,
ptrdiff_t  dstep 
)
static

Perform IIR filtering on floating-point input samples.

Parameters
coeffspointer to filter coefficients
statepointer to filter state
sizeinput length
srcsource samples
sstepsource stride
dstfiltered samples (destination may be the same as input)
dstepdestination stride

Definition at line 291 of file iirfilter.c.

Referenced by ff_iir_filter_init().

◆ ff_iir_filter_free_statep()

av_cold void ff_iir_filter_free_statep ( struct FFIIRFilterState **  state)

Free and zero filter state.

Parameters
statepointer to pointer allocated with ff_iir_filter_init_state()

Definition at line 305 of file iirfilter.c.

Referenced by ff_psy_preprocess_end(), and main().

◆ ff_iir_filter_free_coeffsp()

av_cold void ff_iir_filter_free_coeffsp ( struct FFIIRFilterCoeffs **  coeffs)

Free filter coefficients.

Parameters
coeffspointer allocated with ff_iir_filter_init_coeffs()

Definition at line 310 of file iirfilter.c.

Referenced by ff_iir_filter_init_coeffs(), ff_psy_preprocess_end(), and main().

◆ ff_iir_filter_init()

void ff_iir_filter_init ( FFIIRFilterContext f)

Initialize FFIIRFilterContext.

Definition at line 320 of file iirfilter.c.

Referenced by ff_psy_preprocess_init().

type
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf type
Definition: writing_filters.txt:86
s
#define s(width, name)
Definition: cbs_vp9.c:198
c
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
Definition: undefined.txt:32
dst
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
Definition: dsp.h:83
for
for(k=2;k<=8;++k)
Definition: h264pred_template.c:425
size
int size
Definition: twinvq_data.h:10344
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:256
src0
const pixel *const src0
Definition: h264pred_template.c:420
src
#define src
Definition: vp8dsp.c:248