Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * IIR filter
  3.  * Copyright (c) 2008 Konstantin Shishkov
  4.  *
  5.  * This file is part of FFmpeg.
  6.  *
  7.  * FFmpeg is free software; you can redistribute it and/or
  8.  * modify it under the terms of the GNU Lesser General Public
  9.  * License as published by the Free Software Foundation; either
  10.  * version 2.1 of the License, or (at your option) any later version.
  11.  *
  12.  * FFmpeg is distributed in the hope that it will be useful,
  13.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  15.  * Lesser General Public License for more details.
  16.  *
  17.  * You should have received a copy of the GNU Lesser General Public
  18.  * License along with FFmpeg; if not, write to the Free Software
  19.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  20.  */
  21.  
  22. /**
  23.  * @file
  24.  * IIR filter interface
  25.  */
  26.  
  27. #ifndef AVCODEC_IIRFILTER_H
  28. #define AVCODEC_IIRFILTER_H
  29.  
  30. #include "avcodec.h"
  31.  
  32. struct FFIIRFilterCoeffs;
  33. struct FFIIRFilterState;
  34.  
  35. enum IIRFilterType{
  36.     FF_FILTER_TYPE_BESSEL,
  37.     FF_FILTER_TYPE_BIQUAD,
  38.     FF_FILTER_TYPE_BUTTERWORTH,
  39.     FF_FILTER_TYPE_CHEBYSHEV,
  40.     FF_FILTER_TYPE_ELLIPTIC,
  41. };
  42.  
  43. enum IIRFilterMode{
  44.     FF_FILTER_MODE_LOWPASS,
  45.     FF_FILTER_MODE_HIGHPASS,
  46.     FF_FILTER_MODE_BANDPASS,
  47.     FF_FILTER_MODE_BANDSTOP,
  48. };
  49.  
  50. typedef struct FFIIRFilterContext {
  51.     /**
  52.     * Perform IIR filtering on floating-point input samples.
  53.     *
  54.     * @param coeffs pointer to filter coefficients
  55.     * @param state  pointer to filter state
  56.     * @param size   input length
  57.     * @param src    source samples
  58.     * @param sstep  source stride
  59.     * @param dst    filtered samples (destination may be the same as input)
  60.     * @param dstep  destination stride
  61.     */
  62.     void (*filter_flt)(const struct FFIIRFilterCoeffs *coeffs,
  63.                         struct FFIIRFilterState *state, int size,
  64.                         const float *src, int sstep, float *dst, int dstep);
  65. } FFIIRFilterContext;
  66.  
  67. /**
  68.  * Initialize FFIIRFilterContext
  69.  */
  70. void ff_iir_filter_init(FFIIRFilterContext *f);
  71. void ff_iir_filter_init_mips(FFIIRFilterContext *f);
  72.  
  73. /**
  74.  * Initialize filter coefficients.
  75.  *
  76.  * @param avc          a pointer to an arbitrary struct of which the first
  77.  *                     field is a pointer to an AVClass struct
  78.  * @param filt_type    filter type (e.g. Butterworth)
  79.  * @param filt_mode    filter mode (e.g. lowpass)
  80.  * @param order        filter order
  81.  * @param cutoff_ratio cutoff to input frequency ratio
  82.  * @param stopband     stopband to input frequency ratio (used by bandpass and bandstop filter modes)
  83.  * @param ripple       ripple factor (used only in Chebyshev filters)
  84.  *
  85.  * @return pointer to filter coefficients structure or NULL if filter cannot be created
  86.  */
  87. struct FFIIRFilterCoeffs* ff_iir_filter_init_coeffs(void *avc,
  88.                                                 enum IIRFilterType filt_type,
  89.                                                 enum IIRFilterMode filt_mode,
  90.                                                 int order, float cutoff_ratio,
  91.                                                 float stopband, float ripple);
  92.  
  93. /**
  94.  * Create new filter state.
  95.  *
  96.  * @param order filter order
  97.  *
  98.  * @return pointer to new filter state or NULL if state creation fails
  99.  */
  100. struct FFIIRFilterState* ff_iir_filter_init_state(int order);
  101.  
  102. /**
  103.  * Free filter coefficients.
  104.  *
  105.  * @param coeffs pointer allocated with ff_iir_filter_init_coeffs()
  106.  */
  107. void ff_iir_filter_free_coeffs(struct FFIIRFilterCoeffs *coeffs);
  108.  
  109. /**
  110.  * Free filter state.
  111.  *
  112.  * @param state pointer allocated with ff_iir_filter_init_state()
  113.  */
  114. void ff_iir_filter_free_state(struct FFIIRFilterState *state);
  115.  
  116. /**
  117.  * Perform IIR filtering on signed 16-bit input samples.
  118.  *
  119.  * @param coeffs pointer to filter coefficients
  120.  * @param state  pointer to filter state
  121.  * @param size   input length
  122.  * @param src    source samples
  123.  * @param sstep  source stride
  124.  * @param dst    filtered samples (destination may be the same as input)
  125.  * @param dstep  destination stride
  126.  */
  127. void ff_iir_filter(const struct FFIIRFilterCoeffs *coeffs, struct FFIIRFilterState *state,
  128.                    int size, const int16_t *src, int sstep, int16_t *dst, int dstep);
  129.  
  130. /**
  131.  * Perform IIR filtering on floating-point input samples.
  132.  *
  133.  * @param coeffs pointer to filter coefficients
  134.  * @param state  pointer to filter state
  135.  * @param size   input length
  136.  * @param src    source samples
  137.  * @param sstep  source stride
  138.  * @param dst    filtered samples (destination may be the same as input)
  139.  * @param dstep  destination stride
  140.  */
  141. void ff_iir_filter_flt(const struct FFIIRFilterCoeffs *coeffs,
  142.                        struct FFIIRFilterState *state, int size,
  143.                        const float *src, int sstep, float *dst, int dstep);
  144.  
  145. #endif /* AVCODEC_IIRFILTER_H */
  146.