typeconver.c

来自「speech signal process tools」· C语言 代码 · 共 1,620 行 · 第 1/3 页

C
1,620
字号
/*----------------------------------------------------------------------+|									||   This material contains proprietary software of Entropic Speech,	||   Inc.  Any reproduction, distribution, or publication without the	||   prior written permission of Entropic Speech, Inc. is strictly	||   prohibited.  Any public distribution of copies of this work		||   authorized in writing by Entropic Speech, Inc. must bear the	||   notice								||									||    "Copyright (c) 1989 Entropic Speech, Inc. All rights reserved."	|| 									|+-----------------------------------------------------------------------+|									||   Module:	    typeconver.c					||   									||   Written by: Rodney Johnson						||   Checked by: 							||   									||   Function to convert data types of numeric arrays.			||									|+----------------------------------------------------------------------*/#ifndef lint    static char *sccs_id = "@(#)typeconver.c	1.3	10/23/89	ESI";#endif/* * Include files. */#include <stdio.h>#include <esps/esps.h>#include <esps/unix.h>#include <esps/fea.h>static int  numeric();		/* is a given type numeric? */void	    warn_on_clip();static long	    last_i = -1; /* last index for which clip_action called */static double_cplx  clipped_val = { 0.0, 0.0 };	/* value that was clipped *//* What to do if clipping occurs ... */		/* ... on conversion of real type to any type. */#define CLIP \if (clip_action) \{ clipped_val.real = src[i]; (* clip_action)(i, clipped_val); }		/* ... on conversion of complex to real. */#define CLIP_CX \if (clip_action) \{ clipped_val.real = src[i].real; clipped_val.imag = src[i].imag; \  (* clip_action)(i, clipped_val); }		/* ... on conversion of complex to complex.  */		/* Set last_i to remember clipping of real part */		/* so that clipping of imag part won't invoke */		/* clip_action a second time. */#define CLIP_RE \if (clip_action) \{ clipped_val.real = src[i].real; clipped_val.imag = src[i].imag; \  last_i = i; (* clip_action)(i, clipped_val); }#define CLIP_IM \if (clip_action && last_i != i) \{ clipped_val.real = src[i].real; clipped_val.imag = src[i].imag; \  (* clip_action)(i, clipped_val); }		/* ... on conversion of complex_double.  */		/* Like 3 cases for general complex types above, /*		/* but needn't use clipped_val since elements of src array */		/* can be passed directly to clip_action. */#define CLIP_DBL_CX \if (clip_action) \{ (* clip_action)(i, src[i]); }#define CLIP_DBL_RE \if (clip_action) \{ last_i = i; (* clip_action)(i, src[i]); }#define CLIP_DBL_IM \if (clip_action && last_i != i) \{ (* clip_action)(i, src[i]); }/* * Convert an array of data from one numeric type to another. */char *type_convert(num, source, src_type, destination, dest_type, clip_action)    long    num;    char    *source;    int	    src_type;    char    *destination;    int	    dest_type;    void    (*clip_action)();{    long    i;			/* loop index */    spsassert(source, "type_convert: source is NULL.");    spsassert(numeric(src_type), "type_convert: source type not numeric.");    spsassert(numeric(dest_type),	      "type_convert: destination type not numeric.");    if (!destination)    {	destination = malloc((unsigned)(num * typesiz(dest_type)));	spsassert(destination, "type_convert: destination is NULL.");    }    switch (src_type)    {    case BYTE: {	char	*src = (char *) source;	switch (dest_type)	{	case BYTE: {	    char    *dest = (char *) destination;	    for (i = 0; i < num; i++)	    {		dest[i] = src[i];	    }	    break;}	case SHORT: {	    short   *dest = (short *) destination;	    for (i = 0; i < num; i++)	    {		dest[i] = src[i];	    }	    break;}	case LONG: {	    long    *dest = (long *) destination;	    for (i = 0; i < num; i++)	    {		dest[i] = src[i];	    }	    break;}	case FLOAT: {	    float   *dest = (float *) destination;	    for (i = 0; i < num; i++)	    {		dest[i] = src[i];	    }	    break;}	case DOUBLE: {	    double  *dest = (double *) destination;	    for (i = 0; i < num; i++)	    {		dest[i] = src[i];	    }	    break;}	case BYTE_CPLX: {	    byte_cplx	*dest = (byte_cplx *) destination;	    for (i = 0; i < num; i++)	    {		dest[i].real = src[i];		dest[i].imag = 0;	    }	    break;}	case SHORT_CPLX: {	    short_cplx	*dest = (short_cplx *) destination;	    for (i = 0; i < num; i++)	    {		dest[i].real = src[i];		dest[i].imag = 0;	    }	    break;}	case LONG_CPLX: {	    long_cplx	*dest = (long_cplx *) destination;	    for (i = 0; i < num; i++)	    {		dest[i].real = src[i];		dest[i].imag = 0;	    }	    break;}	case FLOAT_CPLX: {	    float_cplx	*dest = (float_cplx *) destination;	    for (i = 0; i < num; i++)	    {		dest[i].real = src[i];		dest[i].imag = 0.0;	    }	    break;}	case DOUBLE_CPLX: {	    double_cplx	*dest = (double_cplx *) destination;	    for (i = 0; i < num; i++)	    {		dest[i].real = src[i];		dest[i].imag = 0.0;	    }	    break;}	}	break;}    case SHORT: {	short	*src = (short *) source;	switch (dest_type)	{	case BYTE: {	    char    *dest = (char *) destination;	    for (i = 0; i < num; i++)	    {		if (src[i] < CHAR_MIN)		{		    dest[i] = CHAR_MIN;		    CLIP;		}		else if (src[i] > CHAR_MAX)		{		    dest[i] = CHAR_MAX;		    CLIP;		}		else dest[i] = src[i];	    }	    break;}	case SHORT: {	    short   *dest = (short *) destination;	    for (i = 0; i < num; i++)	    {		dest[i] = src[i];	    }	    break;}	case LONG: {	    long    *dest = (long *) destination;	    for (i = 0; i < num; i++)	    {		dest[i] = src[i];	    }	    break;}	case FLOAT: {	    float   *dest = (float *) destination;	    for (i = 0; i < num; i++)	    {		dest[i] = src[i];	    }	    break;}	case DOUBLE: {	    double  *dest = (double *) destination;	    for (i = 0; i < num; i++)	    {		dest[i] = src[i];	    }	    break;}	case BYTE_CPLX: {	    byte_cplx	*dest = (byte_cplx *) destination;	    for (i = 0; i < num; i++)	    {		if (src[i] < CHAR_MIN)		{		    dest[i].real = CHAR_MIN;		    CLIP;		}		else if (src[i] > CHAR_MAX)		{		    dest[i].real = CHAR_MAX;		    CLIP;		}		else dest[i].real = src[i];		dest[i].imag = 0;	    }	    break;}	case SHORT_CPLX: {	    short_cplx	*dest = (short_cplx *) destination;	    for (i = 0; i < num; i++)	    {		dest[i].real = src[i];		dest[i].imag = 0;	    }	    break;}	case LONG_CPLX: {	    long_cplx	*dest = (long_cplx *) destination;	    for (i = 0; i < num; i++)	    {		dest[i].real = src[i];		dest[i].imag = 0;	    }	    break;}	case FLOAT_CPLX: {	    float_cplx	*dest = (float_cplx *) destination;	    for (i = 0; i < num; i++)	    {		dest[i].real = src[i];		dest[i].imag = 0.0;	    }	    break;}	case DOUBLE_CPLX: {	    double_cplx	*dest = (double_cplx *) destination;	    for (i = 0; i < num; i++)	    {		dest[i].real = src[i];		dest[i].imag = 0.0;	    }	    break;}	}	break;}    case LONG: {	long	*src = (long *) source;	switch (dest_type)	{	case BYTE: {	    char    *dest = (char *) destination;	    for (i = 0; i < num; i++)	    {		if (src[i] < CHAR_MIN)		{		    dest[i] = CHAR_MIN;		    CLIP;		}		else if (src[i] > CHAR_MAX)		{		    dest[i] = CHAR_MAX;		    CLIP;		}		else dest[i] = src[i];	    }	    break;}	case SHORT: {	    short   *dest = (short *) destination;	    for (i = 0; i < num; i++)	    {		if (src[i] < SHRT_MIN)		{		    dest[i] = SHRT_MIN;		    CLIP;		}		else if (src[i] > SHRT_MAX)		{		    dest[i] = SHRT_MAX;		    CLIP;		}		else dest[i] = src[i];	    }	    break;}	case LONG: {	    long    *dest = (long *) destination;	    for (i = 0; i < num; i++)	    {		dest[i] = src[i];	    }	    break;}	case FLOAT: {	    float   *dest = (float *) destination;	    for (i = 0; i < num; i++)	    {		dest[i] = src[i];	    }	    break;}	case DOUBLE: {	    double  *dest = (double *) destination;	    for (i = 0; i < num; i++)	    {		dest[i] = src[i];	    }	    break;}	case BYTE_CPLX: {	    byte_cplx	*dest = (byte_cplx *) destination;	    for (i = 0; i < num; i++)	    {		if (src[i] < CHAR_MIN)		{		    dest[i].real = CHAR_MIN;		    CLIP;		}		else if (src[i] > CHAR_MAX)		{		    dest[i].real = CHAR_MAX;		    CLIP;		}		else dest[i].real = src[i];		dest[i].imag = 0;	    }	    break;}	case SHORT_CPLX: {	    short_cplx	*dest = (short_cplx *) destination;	    for (i = 0; i < num; i++)	    {		if (src[i] < SHRT_MIN)		{		    dest[i].real = SHRT_MIN;		    CLIP;		}		else if (src[i] > SHRT_MAX)		{		    dest[i].real = SHRT_MAX;		    CLIP;		}		else dest[i].real = src[i];		dest[i].imag = 0;	    }	    break;}	case LONG_CPLX: {	    long_cplx	*dest = (long_cplx *) destination;	    for (i = 0; i < num; i++)	    {		dest[i].real = src[i];		dest[i].imag = 0;	    }	    break;}	case FLOAT_CPLX: {	    float_cplx	*dest = (float_cplx *) destination;	    for (i = 0; i < num; i++)	    {		dest[i].real = src[i];		dest[i].imag = 0.0;	    }	    break;}	case DOUBLE_CPLX: {	    double_cplx	*dest = (double_cplx *) destination;	    for (i = 0; i < num; i++)	    {		dest[i].real = src[i];		dest[i].imag = 0.0;	    }	    break;}	}	break;}    case FLOAT: {	float	*src = (float *) source;	switch (dest_type)	{	case BYTE: {	    char    *dest = (char *) destination;	    for (i = 0; i < num; i++)	    {		if (src[i] < CHAR_MIN)		{		    dest[i] = CHAR_MIN;		    CLIP;		}		else if (src[i] > CHAR_MAX)		{		    dest[i] = CHAR_MAX;		    CLIP;		}		else if (src[i] > 0) dest[i] = src[i] + 0.5;		else dest[i] = - (0.5 - src[i]);	    }	    break;}	case SHORT: {	    short   *dest = (short *) destination;	    for (i = 0; i < num; i++)	    {		if (src[i] < SHRT_MIN)		{		    dest[i] = SHRT_MIN;		    CLIP;		}		else if (src[i] > SHRT_MAX)		{		    dest[i] = SHRT_MAX;		    CLIP;		}		else if (src[i] > 0) dest[i] = src[i] + 0.5;		else dest[i] = - (0.5 - src[i]);	    }	    break;}	case LONG: {	    long    *dest = (long *) destination;	    for (i = 0; i < num; i++)	    {		if (src[i] < LONG_MIN)		{		    dest[i] = LONG_MIN;		    CLIP;		}		else if (src[i] > LONG_MAX)		{		    dest[i] = LONG_MAX;		    CLIP;		}		else if (src[i] > 0) dest[i] = src[i] + 0.5;		else dest[i] = - (0.5 - src[i]);	    }	    break;}	case FLOAT: {	    float   *dest = (float *) destination;	    for (i = 0; i < num; i++)	    {		dest[i] = src[i];	    }	    break;}	case DOUBLE: {	    double  *dest = (double *) destination;	    for (i = 0; i < num; i++)	    {		dest[i] = src[i];	    }	    break;}	case BYTE_CPLX: {	    byte_cplx	*dest = (byte_cplx *) destination;	    for (i = 0; i < num; i++)	    {		if (src[i] < CHAR_MIN)		{		    dest[i].real = CHAR_MIN;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?