From d1ec8cbc0938fb759c0c393040ab5e5202386cca Mon Sep 17 00:00:00 2001 From: Paul Brossier Date: Thu, 1 Nov 2007 14:29:08 +0100 Subject: [PATCH] splitted sample.c into fvec.c and cvec.c, kept sample.h for convenience --- src/Makefile.am | 8 +- src/{sample.c => cvec.c} | 46 +------- src/cvec.h | 188 ++++++++++++++++++++++++++++++ src/fvec.c | 63 ++++++++++ src/fvec.h | 120 +++++++++++++++++++ src/sample.h | 246 +-------------------------------------- 6 files changed, 383 insertions(+), 288 deletions(-) rename src/{sample.c => cvec.c} (69%) create mode 100644 src/cvec.h create mode 100644 src/fvec.c create mode 100644 src/fvec.h diff --git a/src/Makefile.am b/src/Makefile.am index 1ca5d68f..c57d72d3 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -5,6 +5,8 @@ pkginclude_HEADERS = aubio.h \ mathutils.h \ fft.h \ sample.h \ + fvec.h \ + cvec.h \ hist.h \ scale.h \ resample.h \ @@ -33,8 +35,10 @@ libaubio_la_SOURCES = aubio.h \ mathutils.h \ fft.c \ fft.h \ - sample.c \ - sample.h \ + fvec.c \ + fvec.h \ + cvec.c \ + cvec.h \ hist.c \ hist.h \ scale.c \ diff --git a/src/sample.c b/src/cvec.c similarity index 69% rename from src/sample.c rename to src/cvec.c index c85694a3..74840dbb 100644 --- a/src/sample.c +++ b/src/cvec.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2003 Paul Brossier + Copyright (C) 2003-2007 Paul Brossier This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -18,48 +18,7 @@ */ #include "aubio_priv.h" -#include "sample.h" - -fvec_t * new_fvec( uint_t length, uint_t channels) { - fvec_t * s = AUBIO_NEW(fvec_t); - uint_t i,j; - s->channels = channels; - s->length = length; - s->data = AUBIO_ARRAY(smpl_t*,s->channels); - for (i=0; i< s->channels; i++) { - s->data[i] = AUBIO_ARRAY(smpl_t, s->length); - for (j=0; j< s->length; j++) { - s->data[i][j]=0.; - } - } - return s; -} - -void del_fvec(fvec_t *s) { - uint_t i; - for (i=0; ichannels; i++) { - AUBIO_FREE(s->data[i]); - } - AUBIO_FREE(s->data); - AUBIO_FREE(s); -} - -void fvec_write_sample(fvec_t *s, smpl_t data, uint_t channel, uint_t position) { - s->data[channel][position] = data; -} -smpl_t fvec_read_sample(fvec_t *s, uint_t channel, uint_t position) { - return s->data[channel][position]; -} -void fvec_put_channel(fvec_t *s, smpl_t * data, uint_t channel) { - s->data[channel] = data; -} -smpl_t * fvec_get_channel(fvec_t *s, uint_t channel) { - return s->data[channel]; -} - -smpl_t ** fvec_get_data(fvec_t *s) { - return s->data; -} +#include "cvec.h" cvec_t * new_cvec( uint_t length, uint_t channels) { cvec_t * s = AUBIO_NEW(cvec_t); @@ -120,3 +79,4 @@ smpl_t ** cvec_get_norm(cvec_t *s) { smpl_t ** cvec_get_phas(cvec_t *s) { return s->phas; } + diff --git a/src/cvec.h b/src/cvec.h new file mode 100644 index 00000000..1029d89f --- /dev/null +++ b/src/cvec.h @@ -0,0 +1,188 @@ +/* + Copyright (C) 2003-2007 Paul Brossier + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#ifndef _CVEC_H +#define _CVEC_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +/** \file + + Real and complex buffers + + This file specifies the cvec_t buffer type, which is used throughout aubio to + store complex data. Complex values are stored in terms of phase and + norm, within size/2+1 long vectors. + +*/ + +/** Spectrum buffer type */ +typedef struct _cvec_t cvec_t; +/** Buffer for complex data */ +struct _cvec_t { + uint_t length; /**< length of buffer = (requested length)/2 + 1 */ + uint_t channels; /**< number of channels */ + smpl_t **norm; /**< norm array of size [length] * [channels] */ + smpl_t **phas; /**< phase array of size [length] * [channels] */ +}; + +/** cvec_t buffer creation function + + This function creates a cvec_t structure holding two arrays of size + [length/2+1] * channels, corresponding to the norm and phase values of the + spectral frame. The length stored in the structure is the actual size of both + arrays, not the length of the complex and symetrical vector, specified as + creation argument. + + \param length the length of the buffer to create + \param channels the number of channels in the buffer + +*/ +cvec_t * new_cvec(uint_t length, uint_t channels); +/** cvec_t buffer deletion function + + \param s buffer to delete as returned by new_cvec() + +*/ +void del_cvec(cvec_t *s); +/** write norm value in a complex buffer + + Note that this function is not used in the aubio library, since the same + result can be obtained by assigning vec->norm[channel][position]. Its purpose + is to access these values from wrappers, as created by swig. + + \param s vector to write to + \param data norm value to write in s->norm[channel][position] + \param channel channel to write to + \param position sample position to write to + +*/ +void cvec_write_norm(cvec_t *s, smpl_t data, uint_t channel, uint_t position); +/** write phase value in a complex buffer + + Note that this function is not used in the aubio library, since the same + result can be obtained by assigning vec->phas[channel][position]. Its purpose + is to access these values from wrappers, as created by swig. + + \param s vector to write to + \param data phase value to write in s->phas[channel][position] + \param channel channel to write to + \param position sample position to write to + +*/ +void cvec_write_phas(cvec_t *s, smpl_t data, uint_t channel, uint_t position); +/** read norm value from a complex buffer + + Note that this function is not used in the aubio library, since the same + result can be obtained with vec->norm[channel][position]. Its purpose is to + access these values from wrappers, as created by swig. + + \param s vector to read from + \param channel channel to read from + \param position sample position to read from + +*/ +smpl_t cvec_read_norm(cvec_t *s, uint_t channel, uint_t position); +/** read phase value from a complex buffer + + Note that this function is not used in the aubio library, since the same + result can be obtained with vec->phas[channel][position]. Its purpose is to + access these values from wrappers, as created by swig. + + \param s vector to read from + \param channel channel to read from + \param position sample position to read from + +*/ +smpl_t cvec_read_phas(cvec_t *s, uint_t channel, uint_t position); +/** write norm channel in a complex buffer + + Note that this function is not used in the aubio library, since the same + result can be obtained by assigning vec->norm[channel]. Its purpose is to + access these values from wrappers, as created by swig. + + \param s vector to write to + \param data norm vector of [length] samples to write in s->norm[channel] + \param channel channel to write to + +*/ +void cvec_put_norm_channel(cvec_t *s, smpl_t * data, uint_t channel); +/** write phase channel in a complex buffer + + Note that this function is not used in the aubio library, since the same + result can be obtained by assigning vec->phas[channel]. Its purpose is to + access these values from wrappers, as created by swig. + + \param s vector to write to + \param data phase vector of [length] samples to write in s->phas[channel] + \param channel channel to write to + +*/ +void cvec_put_phas_channel(cvec_t *s, smpl_t * data, uint_t channel); +/** read norm channel from a complex buffer + + Note that this function is not used in the aubio library, since the same + result can be obtained with vec->norm[channel]. Its purpose is to access + these values from wrappers, as created by swig. + + \param s vector to read from + \param channel channel to read from + +*/ +smpl_t * cvec_get_norm_channel(cvec_t *s, uint_t channel); +/** write phase channel in a complex buffer + + Note that this function is not used in the aubio library, since the same + result can be obtained with vec->phas[channel]. Its purpose is to access + these values from wrappers, as created by swig. + + \param s vector to read from + \param channel channel to read from + +*/ +smpl_t * cvec_get_phas_channel(cvec_t *s, uint_t channel); +/** read norm data from a complex buffer + + Note that this function is not used in the aubio library, since the same + result can be obtained with vec->norm. Its purpose is to access these values + from wrappers, as created by swig. + + \param s vector to read from + +*/ +smpl_t ** cvec_get_norm(cvec_t *s); +/** read phase data from a complex buffer + + Note that this function is not used in the aubio library, since the same + result can be obtained with vec->phas. Its purpose is to access these values + from wrappers, as created by swig. + + \param s vector to read from + +*/ +smpl_t ** cvec_get_phas(cvec_t *s); + +#ifdef __cplusplus +} +#endif + +#endif /* _CVEC_H */ + diff --git a/src/fvec.c b/src/fvec.c new file mode 100644 index 00000000..941830bc --- /dev/null +++ b/src/fvec.c @@ -0,0 +1,63 @@ +/* + Copyright (C) 2003-2007 Paul Brossier + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#include "aubio_priv.h" +#include "sample.h" + +fvec_t * new_fvec( uint_t length, uint_t channels) { + fvec_t * s = AUBIO_NEW(fvec_t); + uint_t i,j; + s->channels = channels; + s->length = length; + s->data = AUBIO_ARRAY(smpl_t*,s->channels); + for (i=0; i< s->channels; i++) { + s->data[i] = AUBIO_ARRAY(smpl_t, s->length); + for (j=0; j< s->length; j++) { + s->data[i][j]=0.; + } + } + return s; +} + +void del_fvec(fvec_t *s) { + uint_t i; + for (i=0; ichannels; i++) { + AUBIO_FREE(s->data[i]); + } + AUBIO_FREE(s->data); + AUBIO_FREE(s); +} + +void fvec_write_sample(fvec_t *s, smpl_t data, uint_t channel, uint_t position) { + s->data[channel][position] = data; +} +smpl_t fvec_read_sample(fvec_t *s, uint_t channel, uint_t position) { + return s->data[channel][position]; +} +void fvec_put_channel(fvec_t *s, smpl_t * data, uint_t channel) { + s->data[channel] = data; +} +smpl_t * fvec_get_channel(fvec_t *s, uint_t channel) { + return s->data[channel]; +} + +smpl_t ** fvec_get_data(fvec_t *s) { + return s->data; +} + diff --git a/src/fvec.h b/src/fvec.h new file mode 100644 index 00000000..1d78852c --- /dev/null +++ b/src/fvec.h @@ -0,0 +1,120 @@ +/* + Copyright (C) 2003-2007 Paul Brossier + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#ifndef _FVEC_H +#define _FVEC_H + +#ifdef __cplusplus +extern "C" { +#endif + +/** \file + + Real buffers + + This file specifies the fvec_t buffer type, which is used throughout aubio to + store real data. + +*/ + +/** Sample buffer type */ +typedef struct _fvec_t fvec_t; +/** Buffer for real values */ +struct _fvec_t { + uint_t length; /**< length of buffer */ + uint_t channels; /**< number of channels */ + smpl_t **data; /**< data array of size [length] * [channels] */ +}; +/** fvec_t buffer creation function + + \param length the length of the buffer to create + \param channels the number of channels in the buffer + +*/ +fvec_t * new_fvec(uint_t length, uint_t channels); +/** fvec_t buffer deletion function + + \param s buffer to delete as returned by new_fvec() + +*/ +void del_fvec(fvec_t *s); +/** read sample value in a buffer + + Note that this function is not used in the aubio library, since the same + result can be obtained using vec->data[channel][position]. Its purpose is to + access these values from wrappers, as created by swig. + + \param s vector to read from + \param channel channel to read from + \param position sample position to read from + +*/ +smpl_t fvec_read_sample(fvec_t *s, uint_t channel, uint_t position); +/** write sample value in a buffer + + Note that this function is not used in the aubio library, since the same + result can be obtained by assigning vec->data[channel][position]. Its purpose + is to access these values from wrappers, as created by swig. + + \param s vector to write to + \param data value to write in s->data[channel][position] + \param channel channel to write to + \param position sample position to write to + +*/ +void fvec_write_sample(fvec_t *s, smpl_t data, uint_t channel, uint_t position); +/** read channel vector from a buffer + + Note that this function is not used in the aubio library, since the same + result can be obtained with vec->data[channel]. Its purpose is to access + these values from wrappers, as created by swig. + + \param s vector to read from + \param channel channel to read from + +*/ +smpl_t * fvec_get_channel(fvec_t *s, uint_t channel); +/** write channel vector into a buffer + + Note that this function is not used in the aubio library, since the same + result can be obtained by assigning vec->data[channel]. Its purpose is to + access these values from wrappers, as created by swig. + + \param s vector to write to + \param data vector of [length] values to write + \param channel channel to write to + +*/ +void fvec_put_channel(fvec_t *s, smpl_t * data, uint_t channel); +/** read data from a buffer + + Note that this function is not used in the aubio library, since the same + result can be obtained with vec->data. Its purpose is to access these values + from wrappers, as created by swig. + + \param s vector to read from + +*/ +smpl_t ** fvec_get_data(fvec_t *s); + +#ifdef __cplusplus +} +#endif + +#endif /* _FVEC_H */ diff --git a/src/sample.h b/src/sample.h index 13ac31d0..c8b03fb2 100644 --- a/src/sample.h +++ b/src/sample.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2003 Paul Brossier + Copyright (C) 2003-2007 Paul Brossier This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -20,247 +20,7 @@ #ifndef _SAMPLE_H #define _SAMPLE_H -#ifdef __cplusplus -extern "C" { -#endif - -/** \file - - Real and complex buffers - - This file specifies fvec_t and cvec_t buffers types, which are used - throughout aubio to store real and complex data. Complex values are stored in - terms of phase and norm. - -*/ - -/** Sample buffer type */ -typedef struct _fvec_t fvec_t; -/** Spectrum buffer type */ -typedef struct _cvec_t cvec_t; -/** Buffer for real values */ -struct _fvec_t { - uint_t length; /**< length of buffer */ - uint_t channels; /**< number of channels */ - smpl_t **data; /**< data array of size [length] * [channels] */ -}; -/** Buffer for complex data */ -struct _cvec_t { - uint_t length; /**< length of buffer = (requested length)/2 + 1 */ - uint_t channels; /**< number of channels */ - smpl_t **norm; /**< norm array of size [length] * [channels] */ - smpl_t **phas; /**< phase array of size [length] * [channels] */ -}; -/** fvec_t buffer creation function - - \param length the length of the buffer to create - \param channels the number of channels in the buffer - -*/ -fvec_t * new_fvec(uint_t length, uint_t channels); -/** fvec_t buffer deletion function - - \param s buffer to delete as returned by new_fvec() - -*/ -void del_fvec(fvec_t *s); -/** read sample value in a buffer - - Note that this function is not used in the aubio library, since the same - result can be obtained using vec->data[channel][position]. Its purpose is to - access these values from wrappers, as created by swig. - - \param s vector to read from - \param channel channel to read from - \param position sample position to read from - -*/ -smpl_t fvec_read_sample(fvec_t *s, uint_t channel, uint_t position); -/** write sample value in a buffer - - Note that this function is not used in the aubio library, since the same - result can be obtained by assigning vec->data[channel][position]. Its purpose - is to access these values from wrappers, as created by swig. - - \param s vector to write to - \param data value to write in s->data[channel][position] - \param channel channel to write to - \param position sample position to write to - -*/ -void fvec_write_sample(fvec_t *s, smpl_t data, uint_t channel, uint_t position); -/** read channel vector from a buffer - - Note that this function is not used in the aubio library, since the same - result can be obtained with vec->data[channel]. Its purpose is to access - these values from wrappers, as created by swig. - - \param s vector to read from - \param channel channel to read from - -*/ -smpl_t * fvec_get_channel(fvec_t *s, uint_t channel); -/** write channel vector into a buffer - - Note that this function is not used in the aubio library, since the same - result can be obtained by assigning vec->data[channel]. Its purpose is to - access these values from wrappers, as created by swig. - - \param s vector to write to - \param data vector of [length] values to write - \param channel channel to write to - -*/ -void fvec_put_channel(fvec_t *s, smpl_t * data, uint_t channel); -/** read data from a buffer - - Note that this function is not used in the aubio library, since the same - result can be obtained with vec->data. Its purpose is to access these values - from wrappers, as created by swig. - - \param s vector to read from - -*/ -smpl_t ** fvec_get_data(fvec_t *s); - -/** cvec_t buffer creation function - - This function creates a cvec_t structure holding two arrays of size - [length/2+1] * channels, corresponding to the norm and phase values of the - spectral frame. The length stored in the structure is the actual size of both - arrays, not the length of the complex and symetrical vector, specified as - creation argument. - - \param length the length of the buffer to create - \param channels the number of channels in the buffer - -*/ -cvec_t * new_cvec(uint_t length, uint_t channels); -/** cvec_t buffer deletion function - - \param s buffer to delete as returned by new_cvec() - -*/ -void del_cvec(cvec_t *s); -/** write norm value in a complex buffer - - Note that this function is not used in the aubio library, since the same - result can be obtained by assigning vec->norm[channel][position]. Its purpose - is to access these values from wrappers, as created by swig. - - \param s vector to write to - \param data norm value to write in s->norm[channel][position] - \param channel channel to write to - \param position sample position to write to - -*/ -void cvec_write_norm(cvec_t *s, smpl_t data, uint_t channel, uint_t position); -/** write phase value in a complex buffer - - Note that this function is not used in the aubio library, since the same - result can be obtained by assigning vec->phas[channel][position]. Its purpose - is to access these values from wrappers, as created by swig. - - \param s vector to write to - \param data phase value to write in s->phas[channel][position] - \param channel channel to write to - \param position sample position to write to - -*/ -void cvec_write_phas(cvec_t *s, smpl_t data, uint_t channel, uint_t position); -/** read norm value from a complex buffer - - Note that this function is not used in the aubio library, since the same - result can be obtained with vec->norm[channel][position]. Its purpose is to - access these values from wrappers, as created by swig. - - \param s vector to read from - \param channel channel to read from - \param position sample position to read from - -*/ -smpl_t cvec_read_norm(cvec_t *s, uint_t channel, uint_t position); -/** read phase value from a complex buffer - - Note that this function is not used in the aubio library, since the same - result can be obtained with vec->phas[channel][position]. Its purpose is to - access these values from wrappers, as created by swig. - - \param s vector to read from - \param channel channel to read from - \param position sample position to read from - -*/ -smpl_t cvec_read_phas(cvec_t *s, uint_t channel, uint_t position); -/** write norm channel in a complex buffer - - Note that this function is not used in the aubio library, since the same - result can be obtained by assigning vec->norm[channel]. Its purpose is to - access these values from wrappers, as created by swig. - - \param s vector to write to - \param data norm vector of [length] samples to write in s->norm[channel] - \param channel channel to write to - -*/ -void cvec_put_norm_channel(cvec_t *s, smpl_t * data, uint_t channel); -/** write phase channel in a complex buffer - - Note that this function is not used in the aubio library, since the same - result can be obtained by assigning vec->phas[channel]. Its purpose is to - access these values from wrappers, as created by swig. - - \param s vector to write to - \param data phase vector of [length] samples to write in s->phas[channel] - \param channel channel to write to - -*/ -void cvec_put_phas_channel(cvec_t *s, smpl_t * data, uint_t channel); -/** read norm channel from a complex buffer - - Note that this function is not used in the aubio library, since the same - result can be obtained with vec->norm[channel]. Its purpose is to access - these values from wrappers, as created by swig. - - \param s vector to read from - \param channel channel to read from - -*/ -smpl_t * cvec_get_norm_channel(cvec_t *s, uint_t channel); -/** write phase channel in a complex buffer - - Note that this function is not used in the aubio library, since the same - result can be obtained with vec->phas[channel]. Its purpose is to access - these values from wrappers, as created by swig. - - \param s vector to read from - \param channel channel to read from - -*/ -smpl_t * cvec_get_phas_channel(cvec_t *s, uint_t channel); -/** read norm data from a complex buffer - - Note that this function is not used in the aubio library, since the same - result can be obtained with vec->norm. Its purpose is to access these values - from wrappers, as created by swig. - - \param s vector to read from - -*/ -smpl_t ** cvec_get_norm(cvec_t *s); -/** read phase data from a complex buffer - - Note that this function is not used in the aubio library, since the same - result can be obtained with vec->phas. Its purpose is to access these values - from wrappers, as created by swig. - - \param s vector to read from - -*/ -smpl_t ** cvec_get_phas(cvec_t *s); - -#ifdef __cplusplus -} -#endif +#include "fvec.h" +#include "cvec.h" #endif /* _SAMPLE_H */ -- 2.26.2