Split filtering/coefficient handling files
Splits the code for handling coefficient objects and handling filter objects into separate files. This is just to aid documentation and comprehension.
This commit is contained in:
parent
1cf13be442
commit
a08f846437
|
@ -15,6 +15,8 @@
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/*! \defgroup libiir C library */
|
||||||
|
|
||||||
/* options for text editors
|
/* options for text editors
|
||||||
vim: expandtab:ts=4:sw=4:syntax=c.doxygen
|
vim: expandtab:ts=4:sw=4:syntax=c.doxygen
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -0,0 +1,113 @@
|
||||||
|
/* libiir/src/libiir/100_coeff.c
|
||||||
|
*
|
||||||
|
* Copyright: ©2010–2014, Laurence Withers.
|
||||||
|
* Author: Laurence Withers <l@lwithers.me.uk>
|
||||||
|
* License: GPLv3
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* struct iir_coeff_t
|
||||||
|
* Holds a general IIR filter (i.e. the set of coefficients that define it).
|
||||||
|
* nc >= 1 and nd >= 1.
|
||||||
|
*/
|
||||||
|
struct iir_coeff_t {
|
||||||
|
int nc, nd;
|
||||||
|
double* c, * d;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* iir_coeff_new()
|
||||||
|
* Allocates a new set of coefficient objects.
|
||||||
|
*/
|
||||||
|
struct iir_coeff_t*
|
||||||
|
iir_coeff_new(int nc, const double* c, int nd, const double* d)
|
||||||
|
{
|
||||||
|
struct iir_coeff_t* coeff;
|
||||||
|
|
||||||
|
if(nc < 1 || nd < 1) {
|
||||||
|
errno = EINVAL;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
coeff = malloc(sizeof(struct iir_coeff_t));
|
||||||
|
coeff->nc = nc;
|
||||||
|
coeff->nd = nd;
|
||||||
|
coeff->c = malloc(sizeof(double) * nc);
|
||||||
|
coeff->d = malloc(sizeof(double) * nd);
|
||||||
|
memcpy(coeff->c, c, sizeof(double) * nc);
|
||||||
|
memcpy(coeff->d, d, sizeof(double) * nd);
|
||||||
|
|
||||||
|
return coeff;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* iir_coeff_copy()
|
||||||
|
* Deep copy of coefficient object.
|
||||||
|
*/
|
||||||
|
struct iir_coeff_t*
|
||||||
|
iir_coeff_copy(const struct iir_coeff_t* other)
|
||||||
|
{
|
||||||
|
struct iir_coeff_t* coeff;
|
||||||
|
|
||||||
|
coeff = malloc(sizeof(struct iir_coeff_t));
|
||||||
|
coeff->nc = other->nc;
|
||||||
|
coeff->nd = other->nd;
|
||||||
|
coeff->c = malloc(sizeof(double) * coeff->nc);
|
||||||
|
coeff->d = malloc(sizeof(double) * coeff->nd);
|
||||||
|
memcpy(coeff->c, other->c, sizeof(double) * coeff->nc);
|
||||||
|
memcpy(coeff->d, other->d, sizeof(double) * coeff->nd);
|
||||||
|
|
||||||
|
return coeff;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* iir_coeff_free()
|
||||||
|
* Frees memory associated with ‘coeff’.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
iir_coeff_free(struct iir_coeff_t* coeff)
|
||||||
|
{
|
||||||
|
if(!coeff) return;
|
||||||
|
free(coeff->c);
|
||||||
|
free(coeff->d);
|
||||||
|
free(coeff);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* iir_coeff_get_*()
|
||||||
|
* Functions for querying the coefficients that make up an IIR filter.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
iir_coeff_get_nc(const struct iir_coeff_t* coeff)
|
||||||
|
{
|
||||||
|
return coeff->nc;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
iir_coeff_get_nd(const struct iir_coeff_t* coeff)
|
||||||
|
{
|
||||||
|
return coeff->nd;
|
||||||
|
}
|
||||||
|
|
||||||
|
double
|
||||||
|
iir_coeff_get_c(const struct iir_coeff_t* coeff, int idx)
|
||||||
|
{
|
||||||
|
return coeff->c[idx];
|
||||||
|
}
|
||||||
|
|
||||||
|
double
|
||||||
|
iir_coeff_get_d(const struct iir_coeff_t* coeff, int idx)
|
||||||
|
{
|
||||||
|
return coeff->d[idx];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* options for text editors
|
||||||
|
vim: expandtab:ts=4:sw=4
|
||||||
|
*/
|
|
@ -0,0 +1,126 @@
|
||||||
|
/* libiir/src/libiir/100_coeff.h
|
||||||
|
*
|
||||||
|
* Copyright: ©2010–2014, Laurence Withers.
|
||||||
|
* Author: Laurence Withers <l@lwithers.me.uk>
|
||||||
|
* License: GPLv3
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*! \defgroup libiir_coeff Coefficient handling
|
||||||
|
|
||||||
|
\ingroup libiir
|
||||||
|
|
||||||
|
The functions in this module present an interface for managing the set of
|
||||||
|
coefficients of a single IIR filter instance. See \ref iir_structure for
|
||||||
|
the definition of a coefficient set. The coefficient sets form the
|
||||||
|
basic building block of an IIR filter instance (see \ref libiir_filter),
|
||||||
|
which may chain several IIR filters in sequence.
|
||||||
|
|
||||||
|
*/
|
||||||
|
/*!@{*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* opaque structure */
|
||||||
|
struct iir_coeff_t;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*! \brief Create IIR coefficient set
|
||||||
|
|
||||||
|
\param nc Number of \a c coefficients.
|
||||||
|
\param c Array of \a c coefficients.
|
||||||
|
\param nd Number of \a d coefficients.
|
||||||
|
\param d Array of \a d coefficients.
|
||||||
|
\returns Pointer to new general IIR filter object.
|
||||||
|
|
||||||
|
This function creates a new set of IIR filter coefficients which may be used to
|
||||||
|
create filter instances through \ref iir_filter_new() or chained on to existing
|
||||||
|
instances through \ref iir_filter().
|
||||||
|
|
||||||
|
See \ref iir_structure for a full explanation of the parameters.
|
||||||
|
|
||||||
|
*/
|
||||||
|
struct iir_coeff_t* iir_coeff_new(int nc, const double* c, int nd,
|
||||||
|
const double* d)
|
||||||
|
#ifndef DOXYGEN
|
||||||
|
__attribute__((malloc,nonnull))
|
||||||
|
#endif
|
||||||
|
;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*! \brief Create copy of a set of IIR coefficients
|
||||||
|
|
||||||
|
\param other Set of IIR filter coefficients to copy.
|
||||||
|
\returns Pointer to new general IIR filter object.
|
||||||
|
|
||||||
|
Performs a deep copy of the set of IIR coefficients contained within \a other.
|
||||||
|
|
||||||
|
*/
|
||||||
|
struct iir_coeff_t* iir_coeff_copy(const struct iir_coeff_t* other);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*! \brief Free IIR coefficient set
|
||||||
|
|
||||||
|
\param coeff Pointer to IIR coefficient object. May be 0.
|
||||||
|
|
||||||
|
Frees a set of IIR filter coefficients previously allocated through
|
||||||
|
\ref iir_coeff_new(). Can be called on a null pointer without consequences.
|
||||||
|
Note that \ref iir_filter_new() and \ref iir_filter_chain() actually store a
|
||||||
|
copy of the coefficients, so it is possible to free \a coeff even if existing
|
||||||
|
filters are still using its coefficient values.
|
||||||
|
|
||||||
|
*/
|
||||||
|
void iir_coeff_free(struct iir_coeff_t* coeff);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*! \brief Query number of C coefficients.
|
||||||
|
|
||||||
|
\param coeff Pointer to IIR coefficient object.
|
||||||
|
\returns Number of C coefficients (≥1).
|
||||||
|
|
||||||
|
*/
|
||||||
|
int iir_coeff_get_nc(const struct iir_coeff_t* coeff);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*! \brief Query number of D coefficients.
|
||||||
|
|
||||||
|
\param coeff Pointer to IIR coefficient object.
|
||||||
|
\returns Number of D coefficients (≥1).
|
||||||
|
|
||||||
|
*/
|
||||||
|
int iir_coeff_get_nd(const struct iir_coeff_t* coeff);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*! \brief Get value of C coefficient.
|
||||||
|
|
||||||
|
\param coeff Pointer to IIR coefficient object.
|
||||||
|
\param idx Index of coefficient (≥0, < \ref iir_coeff_get_nc()).
|
||||||
|
\returns C coefficient value.
|
||||||
|
|
||||||
|
*/
|
||||||
|
double iir_coeff_get_c(const struct iir_coeff_t* coeff, int idx);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*! \brief Get value of D coefficient.
|
||||||
|
|
||||||
|
\param coeff Pointer to IIR coefficient object.
|
||||||
|
\param idx Index of coefficient (≥0, < \ref iir_coeff_get_nd()).
|
||||||
|
\returns D coefficient value.
|
||||||
|
|
||||||
|
*/
|
||||||
|
double iir_coeff_get_d(const struct iir_coeff_t* coeff, int idx);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*!@}*/
|
||||||
|
/* options for text editors
|
||||||
|
vim: expandtab:ts=4:sw=4:syntax=c.doxygen
|
||||||
|
*/
|
|
@ -1,4 +1,4 @@
|
||||||
/* libiir/src/libiir/200_iir.c
|
/* libiir/src/libiir/200_filter.c
|
||||||
*
|
*
|
||||||
* Copyright: ©2010–2014, Laurence Withers.
|
* Copyright: ©2010–2014, Laurence Withers.
|
||||||
* Author: Laurence Withers <l@lwithers.me.uk>
|
* Author: Laurence Withers <l@lwithers.me.uk>
|
||||||
|
@ -7,107 +7,6 @@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* struct iir_coeff_t
|
|
||||||
* Holds a general IIR filter (i.e. the set of coefficients that define it).
|
|
||||||
* nc >= 1 and nd >= 1.
|
|
||||||
*/
|
|
||||||
struct iir_coeff_t {
|
|
||||||
int nc, nd;
|
|
||||||
double* c, * d;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* iir_coeff_new()
|
|
||||||
* Allocates a new set of coefficient objects.
|
|
||||||
*/
|
|
||||||
struct iir_coeff_t*
|
|
||||||
iir_coeff_new(int nc, const double* c, int nd, const double* d)
|
|
||||||
{
|
|
||||||
struct iir_coeff_t* coeff;
|
|
||||||
|
|
||||||
if(nc < 1 || nd < 1) {
|
|
||||||
errno = EINVAL;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
coeff = malloc(sizeof(struct iir_coeff_t));
|
|
||||||
coeff->nc = nc;
|
|
||||||
coeff->nd = nd;
|
|
||||||
coeff->c = malloc(sizeof(double) * nc);
|
|
||||||
coeff->d = malloc(sizeof(double) * nd);
|
|
||||||
memcpy(coeff->c, c, sizeof(double) * nc);
|
|
||||||
memcpy(coeff->d, d, sizeof(double) * nd);
|
|
||||||
|
|
||||||
return coeff;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* iir_coeff_copy()
|
|
||||||
* Deep copy of coefficient object.
|
|
||||||
*/
|
|
||||||
struct iir_coeff_t*
|
|
||||||
iir_coeff_copy(const struct iir_coeff_t* other)
|
|
||||||
{
|
|
||||||
struct iir_coeff_t* coeff;
|
|
||||||
|
|
||||||
coeff = malloc(sizeof(struct iir_coeff_t));
|
|
||||||
coeff->nc = other->nc;
|
|
||||||
coeff->nd = other->nd;
|
|
||||||
coeff->c = malloc(sizeof(double) * coeff->nc);
|
|
||||||
coeff->d = malloc(sizeof(double) * coeff->nd);
|
|
||||||
memcpy(coeff->c, other->c, sizeof(double) * coeff->nc);
|
|
||||||
memcpy(coeff->d, other->d, sizeof(double) * coeff->nd);
|
|
||||||
|
|
||||||
return coeff;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* iir_coeff_free()
|
|
||||||
* Frees memory associated with ‘coeff’.
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
iir_coeff_free(struct iir_coeff_t* coeff)
|
|
||||||
{
|
|
||||||
if(!coeff) return;
|
|
||||||
free(coeff->c);
|
|
||||||
free(coeff->d);
|
|
||||||
free(coeff);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* iir_coeff_get_*()
|
|
||||||
* Functions for querying the coefficients that make up an IIR filter.
|
|
||||||
*/
|
|
||||||
int
|
|
||||||
iir_coeff_get_nc(const struct iir_coeff_t* coeff)
|
|
||||||
{
|
|
||||||
return coeff->nc;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
iir_coeff_get_nd(const struct iir_coeff_t* coeff)
|
|
||||||
{
|
|
||||||
return coeff->nd;
|
|
||||||
}
|
|
||||||
|
|
||||||
double
|
|
||||||
iir_coeff_get_c(const struct iir_coeff_t* coeff, int idx)
|
|
||||||
{
|
|
||||||
return coeff->c[idx];
|
|
||||||
}
|
|
||||||
|
|
||||||
double
|
|
||||||
iir_coeff_get_d(const struct iir_coeff_t* coeff, int idx)
|
|
||||||
{
|
|
||||||
return coeff->d[idx];
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* struct iir_filter_t
|
/* struct iir_filter_t
|
||||||
* An instantiated IIR filter. This is actually a linked list node, so that we
|
* An instantiated IIR filter. This is actually a linked list node, so that we
|
||||||
* can create chains of filters. It also has a copy of the coefficients so that
|
* can create chains of filters. It also has a copy of the coefficients so that
|
|
@ -1,4 +1,4 @@
|
||||||
/* libiir/src/libiir/200_iir.h
|
/* libiir/src/libiir/200_filter.h
|
||||||
*
|
*
|
||||||
* Copyright: ©2010–2014, Laurence Withers.
|
* Copyright: ©2010–2014, Laurence Withers.
|
||||||
* Author: Laurence Withers <l@lwithers.me.uk>
|
* Author: Laurence Withers <l@lwithers.me.uk>
|
||||||
|
@ -7,11 +7,7 @@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*! \defgroup libiir C library */
|
/*! \defgroup libiir_filter Basic IIR filtering
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*! \defgroup libiir_iir Basic IIR filtering
|
|
||||||
|
|
||||||
\ingroup libiir
|
\ingroup libiir
|
||||||
|
|
||||||
|
@ -32,104 +28,6 @@ through \ref iir_filter().
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* opaque structure */
|
|
||||||
struct iir_coeff_t;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*! \brief Create general IIR filter
|
|
||||||
|
|
||||||
\param nc Number of \a c coefficients.
|
|
||||||
\param c Array of \a c coefficients.
|
|
||||||
\param nd Number of \a d coefficients.
|
|
||||||
\param d Array of \a d coefficients.
|
|
||||||
\returns Pointer to new general IIR filter object.
|
|
||||||
|
|
||||||
This function creates a new general IIR filter object which may be used to
|
|
||||||
create filter instances through \ref iir_filter_new() or chained on to existing
|
|
||||||
instances through \ref iir_filter().
|
|
||||||
|
|
||||||
See \ref iir_structure for a full explanation of the parameters.
|
|
||||||
|
|
||||||
*/
|
|
||||||
struct iir_coeff_t* iir_coeff_new(int nc, const double* c, int nd,
|
|
||||||
const double* d)
|
|
||||||
#ifndef DOXYGEN
|
|
||||||
__attribute__((malloc,nonnull))
|
|
||||||
#endif
|
|
||||||
;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*! \brief Create copy of general IIR filter
|
|
||||||
|
|
||||||
\param other Set of IIR filter coefficients to copy.
|
|
||||||
\returns Pointer to new general IIR filter object.
|
|
||||||
|
|
||||||
Performs a deep copy of the set of IIR coefficients contained within \a other.
|
|
||||||
|
|
||||||
*/
|
|
||||||
struct iir_coeff_t* iir_coeff_copy(const struct iir_coeff_t* other);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*! \brief Free general IIR filter
|
|
||||||
|
|
||||||
\param coeff Pointer to IIR filter object. May be 0.
|
|
||||||
|
|
||||||
Frees a set of IIR filter coefficients previously allocated through
|
|
||||||
\ref iir_coeff_new(). Can be called on a null pointer without consequences.
|
|
||||||
Note that \ref iir_filter_new() and \ref iir_filter_chain() actually store a
|
|
||||||
copy of the coefficients, so it is possible to free \a coeff even if existing
|
|
||||||
filters are still using its coefficient values.
|
|
||||||
|
|
||||||
*/
|
|
||||||
void iir_coeff_free(struct iir_coeff_t* coeff);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*! \brief Query number of C coefficients.
|
|
||||||
|
|
||||||
\param coeff Pointer to IIR filter object.
|
|
||||||
\returns Number of C coefficients (≥1).
|
|
||||||
|
|
||||||
*/
|
|
||||||
int iir_coeff_get_nc(const struct iir_coeff_t* coeff);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*! \brief Query number of D coefficients.
|
|
||||||
|
|
||||||
\param coeff Pointer to IIR filter object.
|
|
||||||
\returns Number of D coefficients (≥1).
|
|
||||||
|
|
||||||
*/
|
|
||||||
int iir_coeff_get_nd(const struct iir_coeff_t* coeff);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*! \brief Get value of C coefficient.
|
|
||||||
|
|
||||||
\param coeff Pointer to IIR filter object.
|
|
||||||
\param idx Index of coefficient (≥0, < \ref iir_coeff_get_nc()).
|
|
||||||
\returns C coefficient value.
|
|
||||||
|
|
||||||
*/
|
|
||||||
double iir_coeff_get_c(const struct iir_coeff_t* coeff, int idx);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*! \brief Get value of D coefficient.
|
|
||||||
|
|
||||||
\param coeff Pointer to IIR filter object.
|
|
||||||
\param idx Index of coefficient (≥0, < \ref iir_coeff_get_nd()).
|
|
||||||
\returns D coefficient value.
|
|
||||||
|
|
||||||
*/
|
|
||||||
double iir_coeff_get_d(const struct iir_coeff_t* coeff, int idx);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* opaque structure */
|
/* opaque structure */
|
||||||
struct iir_filter_t;
|
struct iir_filter_t;
|
||||||
|
|
Loading…
Reference in New Issue