#include "_xfft.h"
Ir al código fuente de este archivo.
Definiciones | |
#define | __cfft_cfft(c, re_invec, im_invec) |
Macro de uso interno. | |
Funciones | |
PUBLIC pCFFT XAPI | cfft_construct (SPL_INT np, SPL_INT fftnp, SPL_BOOL inv, SPL_FLOAT ufactor) |
Inicializaci�n de _CFFT. | |
PUBLIC SPL_VOID XAPI | cfft_destruct (pCFFT c) |
Destructor para una estructura _CFFT. | |
PUBLIC SPL_VOID XAPI | cfft_setnp (pCFFT c, SPL_INT np) |
Fija la longitud de los vectores de entrada. | |
PUBLIC SPL_VOID XAPI | cfft_setinv (pCFFT c, SPL_BOOL inv) |
Fija el c�lculo a FFT directa o inversa. | |
PUBLIC SPL_VOID XAPI | cfft_setufactor (pCFFT c, SPL_FLOAT ufactor) |
Fija el factor de escala. | |
PUBLIC SPL_INT XAPI | cfft_getnp (pCFFT c) |
Devuelve el n�mero de puntos de los vectores de entrada. | |
PUBLIC SPL_INT XAPI | cfft_getfftnp (pCFFT c) |
Devuelve el n�mero de puntos de la FFT. | |
PUBLIC SPL_INT XAPI | cfft_getvecnp (pCFFT c) |
Devuelve el n�mero de puntos de la FFT. | |
PUBLIC SPL_BOOL XAPI | cfft_getinv (pCFFT c) |
Devuelve si se est� calculando una FFT directa o inversa. | |
PUBLIC SPL_FLOAT XAPI | cfft_getufactor (pCFFT c) |
Devuelve el factor de escala aplicado. | |
PUBLIC SPL_pFLOAT XAPI | cfft_getrevec (pCFFT c) |
Acceso a la parte real de la FFT. | |
PUBLIC SPL_pFLOAT XAPI | cfft_getimvec (pCFFT c) |
Acceso a la parte imaginaria de la FFT. | |
PUBLIC SPL_VOID XAPI | cfft_cfft (pCFFT c, SPL_pFLOAT re_invec, SPL_pFLOAT im_invec) |
Calcula la FFT de una secuencia compleja. | |
PUBLIC SPL_VOID XAPI | cfft_mag (pCFFT c) |
Calcula el m�dulo de una FFT ya calculada. | |
PUBLIC SPL_VOID XAPI | cfft_norm (pCFFT c) |
Calcula la norma de una FFT ya calculada. | |
PUBLIC SPL_VOID XAPI | cfft_arg (pCFFT c) |
Calcula la fase de una FFT ya calculada. | |
PUBLIC SPL_VOID XAPI | cfft_magarg (pCFFT c) |
Calcula el m�dulo y la fase de una FFT ya calculada. | |
PUBLIC SPL_VOID XAPI | cfft_normarg (pCFFT c) |
Calcula la norma y la fase de una FFT ya calculada. | |
PUBLIC SPL_VOID XAPI | cfft_trefmove_reim (pCFFT c, SPL_FLOAT nTs) |
Incorpora un retardo temporal a los valores de la FFT. | |
PUBLIC SPL_VOID XAPI | cfft_trefmove_arg (pCFFT c, SPL_FLOAT nTs) |
Incorpora un retardo temporal a los valores de la FFT. | |
PUBLIC SPL_VOID XAPI | cfft_trefmove_argm (pCFFT c, SPL_FLOAT nTs) |
Incorpora un retardo temporal a los valores de la FFT. |
Version dd/mm/aa Autor Proposito de la edicion ------- -------- -------- ----------------------- 1.3.2 10/01/97 Borja algunos comentarios 1.3.1 30/07/95 Borja scope funciones explicito 1.3.0 08/12/94 Borja revision general (tipos,idx,nel,tnel...) 1.2.1 14/03/94 Borja bug: cepfm_getceps() --> cepfm_getcepfm() 1.2.0 28/10/93 Borja Soporte de diferentes tipos de enventanado. 1.1.0 01/02/93 Borja Calculo de cepstrum fft-modulo ('clase' cepfm). 1.0.0 16/03/92 Borja Codificacion inicial.
Las funciones estan organizadas segun los bloques indicados. Estan programadas en C estandar utilizando 'handlers', siguiendo una estructura proxima a la programacion orientada a objetos C++. Para cada 'clase' (cfft , rfft , cepfm) hay una funcion constructora (???_construct()) que crea y devuelve un puntero a una estructura (CFFT, RFFT, CEPFM) de la que no es necesario conocer nada externamente. El resto de las funciones tienen siempre como primer parametro este puntero.
Despues del uso, la estructura debe destruirse mediante la funcion ???_destruct() que libera toda la memoria reservada. El sistema es similar al utilizado por las librerias de ficheros del C (estructura FILE y funciones fopen(), fread(), fclose()). Al crear la estructura (???_construct()) se debe reservar memoria dinamica. Si no es posible el constructor devuelve un puntero a NULL. En otras funciones distintas del constructor que tambien impliquen gestion dinamica de memoria, se {devuelve} un valor booleano (SPL_BOOL) de valor SPL_TRUE si el proceso se realiza correctamente, o SPL_FALSE si no se puede completar.
Estos juegos de funciones son adecuados cuando se quiera efectuar FFT repetidamente. Primero se construye la estructura adecuada con la funcion ???_construct(), se realizan todas las FFT que se quiera y finalmente se destruye la estructura con ???_destruct(). La estructura almacena informacion reutilizable en todas las FFT que queramos efectuar (tablas de senos y cosenos, funcion de enventanado...) acelerando el proceso de calculo al no tener que calcular esta informacion en cada FFT.
Definir NDEBUG para desconectar la validacion de parametros con assert(). No definir este simbolo mientras se depuren aplicaciones, ya que aunque las funciones son algo mas lentas, el chequeo de validacion de parametros resuelve muchos problemas.
Definición en el archivo xfft1.c.
#define __cfft_cfft | ( | c, | |||
re_invec, | |||||
im_invec | ) |
Valor:
{ \ SPL_INT i, n; \ SPL_pINT tinv; \ \ n = ((SPL_INT)1 << c->_nbits); \ tinv = c->_tinv; \ /* inversion de bits */ \ for (i=0; i<c->_np; i++) { \ c->_revec[*tinv] = (*(re_invec++)); \ c->_imvec[*(tinv++)] = (*(im_invec++)); \ } \ /* cero padding */ \ for (i=c->_np; i<n; i++) { \ c->_revec[*tinv] = 0.0; \ c->_imvec[*(tinv++)] = 0.0; \ } \ fft_fft(c->_nbits,c->_inv,c->_revec,c->_imvec,c->_tsin, \ c->_tcos,c->_ufactor); \ }
PUBLIC pCFFT XAPI cfft_construct | ( | SPL_INT | np, | |
SPL_INT | fftnp, | |||
SPL_BOOL | inv, | |||
SPL_FLOAT | ufactor | |||
) |
Inicializa una estructura _CFFT para el c�lculo de FFT de secuencias complejas
np | N�mero de puntos del vector de entrada (del que se quiere calcular la FFT). Ha de ser mayor que cero, pero no forzosamente potencia de dos. En caso de que no sea potencia de dos, se rellena autom�ticamente con ceros (pero ojo, no en PI sino en 2PI!!! tal vez habria que corregir esto....) | |
fftnp | N�mero de puntos de la FFT. Ha de ser mayor o igual a cero Si es cero, se utiliza la menor potencia de dos superior o igual a np .Si no es cero, se utiliza la menor potencia de dos superior o igual a fftnp .Si np es mayor que fftnp , el vector de datos se trunca a fftnp valores. | |
inv | Indica si se desea calcular la transformada directa o inversa.
| |
ufactor | Factor de escalado. Multiplica al resultado en la FFT directa y lo divide en la FFT inversa. Por lo general, se deja a 1 (sin escalado). |
cfft_
???(). Devuelve NULL
si la inicializaci�n falla PUBLIC SPL_VOID XAPI cfft_destruct | ( | pCFFT | c | ) |
Destruye una estructura _CFFT. Es necesario llamar a esta funci�n despu�s de haber llamado a cfft_construct(), una vez se ha terminado de calcular FFT's
c | puntero a la estructura que se quiere destruir |
PUBLIC SPL_VOID XAPI cfft_setnp | ( | pCFFT | c, | |
SPL_INT | np | |||
) |
Permite modificar el n�mero de puntos de los vectores de entrada (aquellos cuya FFT se quiere calcular).
c | Puntero a la estructura _CFFT que se quiere modificar. | |
np | N�mero de puntos de los vectores de entrada. Ha de ser mayor que cero, pero no forzosamente potencia de dos. En caso de que np sea mayor que el n�mero de puntos de la FFT, los vectores de entrada se truncan. En caso de que np sea menor que el n�mero de puntos de la FFT, se rellena con ceros |
PUBLIC SPL_VOID XAPI cfft_setinv | ( | pCFFT | c, | |
SPL_BOOL | inv | |||
) |
Permite indicar si se quiere calcular una FFT directa o inversa
c | Puntero a la estructura _CFFT que se quiere modificar. | |
inv,: | Indica si se desea calcular la transformada directa o inversa.
|
PUBLIC SPL_VOID XAPI cfft_setufactor | ( | pCFFT | c, | |
SPL_FLOAT | ufactor | |||
) |
PUBLIC SPL_INT XAPI cfft_getnp | ( | pCFFT | c | ) |
PUBLIC SPL_INT XAPI cfft_getfftnp | ( | pCFFT | c | ) |
PUBLIC SPL_INT XAPI cfft_getvecnp | ( | pCFFT | c | ) |
Devuelve el n�mero de puntos de los vectores de salida. El valor devuelto coincide con cfft_getfftnp() (siempre potencia de dos).
c | Puntero a la estructura _CFFT. |
PUBLIC SPL_BOOL XAPI cfft_getinv | ( | pCFFT | c | ) |
PUBLIC SPL_FLOAT XAPI cfft_getufactor | ( | pCFFT | c | ) |
PUBLIC SPL_pFLOAT XAPI cfft_getrevec | ( | pCFFT | c | ) |
Permite acceder al vector de la parte real de la FFT calculada. El usuario debe haber calculado una FFT previamente. Este vector es de uso interno y no debe borrarse, aunque se puede modificar.
En caso de que se calcule el m�dulo o la norma (m�dulo al cuadrado) de la FFT, estos valores se almacenan en este mismo vector.
El vector devuelto tiene cfft_getvecnp() puntos (igual al n�mero de puntos dela FFT), y sus valores se corresponden al rango [0, 2*PI] (en herzios [0, fs])
c | Puntero a la estructura _CFFT. |
PUBLIC SPL_pFLOAT XAPI cfft_getimvec | ( | pCFFT | c | ) |
Permite acceder al vector de la parte imaginaria de la FFT calculada. El usuario debe haber calculado una FFT previamente. Este vector es de uso interno y no debe borrarse, aunque se puede modificar.
En caso de que se calcule la fase de la FFT, estos valores se almacenan en este mismo vector.
El vector devuelto tiene cfft_getvecnp() puntos (igual al n�mero de puntos dela FFT), y sus valores se corresponden al rango [0, 2*PI] (en herzios [0, fs])
c | Puntero a la estructura _CFFT. |
PUBLIC SPL_VOID XAPI cfft_cfft | ( | pCFFT | c, | |
SPL_pFLOAT | re_invec, | |||
SPL_pFLOAT | im_invec | |||
) |
Calcula la FFT de una secuencia compleja. La parte real de esta FFT puede recuperarse mediante cfft_getrvec(), y la parte imaginaria mediante cfft_getimvec().
c | Puntero a la estructura _CFFT. | |
re_invec | Vector que contiene la parte real de la secuencia cuya FFT se quiere calcular. Debe tener cfft_getnp() puntos. | |
im_invec | Vector que contiene la parte imaginaria de la secuencia cuya FFT se quiere calcular. Debe tener cfft_getnp() puntos. |
PUBLIC SPL_VOID XAPI cfft_mag | ( | pCFFT | c | ) |
Una vez calculada una FFT, permite extraer el m�dulo de la misma. El resultado se introduce en el vector de la parte real de la FFT, de forma que posteriormente es accesible mediante cfft_getrevec().
c | Puntero a la estructura _CFFT. |
PUBLIC SPL_VOID XAPI cfft_norm | ( | pCFFT | c | ) |
Una vez calculada una FFT, permite extraer la norma (m�dulo al cuadrado) de la misma. El resultado se introduce en el vector de la parte real de la FFT, de forma que posteriormente es accesible mediante cfft_getrevec().
c | Puntero a la estructura _CFFT. |
PUBLIC SPL_VOID XAPI cfft_arg | ( | pCFFT | c | ) |
Una vez calculada una FFT, permite extraer la fase de la misma. El resultado se introduce en el vector de la parte imaginaria de la FFT, de forma que posteriormente es accesible mediante cfft_getimvec().
c | Puntero a la estructura _CFFT. |
PUBLIC SPL_VOID XAPI cfft_magarg | ( | pCFFT | c | ) |
Una vez calculada una FFT, permite extraer el m�dulo y la fase de la misma. El m�dulo se introduce en el vector de la parte real de la FFT, y la fase en el vector de la parte imaginaria, de forma que posteriormente son accesibles mediante cfft_getrevec() y cfft_getimvec() respectivamente.
c | Puntero a la estructura _CFFT. |
PUBLIC SPL_VOID XAPI cfft_normarg | ( | pCFFT | c | ) |
Una vez calculada una FFT, permite extraer la norma (m�dulo al cuadrado) y la fase de la misma. La norma se introduce en el vector de la parte real de la FFT, y la fase en el vector de la parte imaginaria, de forma que posteriormente son accesibles mediante cfft_getrevec() y cfft_getimvec() respectivamente.
c | Puntero a la estructura _CFFT. |
PUBLIC SPL_VOID XAPI cfft_trefmove_reim | ( | pCFFT | c, | |
SPL_FLOAT | nTs | |||
) |
Una vez efectuada una FFT corrige los vectores real e imaginario para incorporar un retardo al origen de fases (p.ej. un retardo de N/2 muestras avanzaria el origen de fases al centro de la venana de analisis de N puntos). No es mas que una fase lineal positiva.
Esta funcion, solo debe utilizarse mientras se mantengan los vectores real e imaginario. Una vez calculado el modulo, norma o fase, en vez de esta hay que usar cfft_trefmove_arg().
c | Puntero a la estructura _CFFT. | |
nTs | N�mero de muestras a retardar. Puede ser un valor fraccionario. |
PUBLIC SPL_VOID XAPI cfft_trefmove_arg | ( | pCFFT | c, | |
SPL_FLOAT | nTs | |||
) |
Una vez efectuada una FFT y calculada la fase, corrige el vector de fase para incorporar un retardo al origen de fases (p.ej. retardar N/2 muestras avanzaria el origen de fases al centro de la ventana de analisis de N puntos). No es mas que una fase lineal positiva.
Esta funcion, solo debe utilizarse una vez calculada la fase. Si se quiere incorporar el retardo antes, sobre los vectores real e imaginario se debe utilizar cfft_trefmove_reim().
La fase resultante ya NO sera el valor principal de fase (entre -PI y PI). Si quieres el valor principal, usa cfft_trefmove_argm(),
c | Puntero a la estructura _CFFT. | |
nTs | N�mero de muestras a retardar. Puede ser un valor fraccionario. |
PUBLIC SPL_VOID XAPI cfft_trefmove_argm | ( | pCFFT | c, | |
SPL_FLOAT | nTs | |||
) |
Una vez efectuada una FFT y calculada la fase, corrige el vector de fase para incorporar un retardo al origen de fases (p.ej. retardar N/2 muestras avanzaria el origen de fases al centro de la ventana de analisis de N puntos). No es mas que una fase lineal positiva.
Esta funcion, solo debe utilizarse una vez calculada la fase. Si se quiere incorporar el retardo antes, sobre los vectores real e imaginario se debe utilizar cfft_trefmove_reim().
La fase resultante sigue siendo el valor principal de fase, y se mantiene entre -PI y PI.
c | Puntero a la estructura _CFFT. | |
nTs | N�mero de muestras a retardar. Puede ser un valor fraccionario. |