⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hilbert.c

📁 希尔伯特变换Hilbert算法
💻 C
字号:
/* SigLib Hilbert Transform Example */#include <stdio.h>#include <siglib.h>#include "GraphFunctions.h"/* Define constants */#define	SAMPLE_LENGTH				((SLArrayIndex_t)512)#define	HILBERT_TRANSFORM_LENGTH	41L#define DELAY_LENGTH				(HILBERT_TRANSFORM_LENGTH >> 1)SLData_t		*pSrc;SLData_t		*pFilterCoeffs, *pFilterState;SLData_t		*pDelayState;SLData_t		*pHilbertTransformed, *pDelayed;SLArrayIndex_t	FilterIndex, DelayIndex;SLData_t		SinePhase;void	main(void);void main(void){	GraphObject *h2DGraph;							/* Declare graph object */	SLArrayIndex_t	i;	h2DGraph =										/* Initialize graph */		Create2DGraph ("Hilbert Transform",			/* Graph title */					   "Time",						/* X-Axis label */					   "Magnitude",					/* Y-Axis label */					   SV_AUTO_SCALE,				/* Scaling mode */					   SV_SIGNED,					/* Sign mode */					   SV_GRAPH_LINE,				/* Graph type */					   "localhost");				/* Graph server */	if (h2DGraph == NULL)							/* Graph creation failed - e.g is server running ? */	{		printf ("\nGraph creation failure. Please check that the server is running\n");		exit (1);	}	pSrc = SUF_VectorArrayAllocate (SAMPLE_LENGTH);	pFilterCoeffs = SUF_VectorArrayAllocate (HILBERT_TRANSFORM_LENGTH);	pFilterState = SUF_VectorArrayAllocate (HILBERT_TRANSFORM_LENGTH);	pHilbertTransformed = SUF_VectorArrayAllocate (SAMPLE_LENGTH);	pDelayState = SUF_VectorArrayAllocate (DELAY_LENGTH);	pDelayed = SUF_VectorArrayAllocate (SAMPLE_LENGTH);													/* Initialise Hilbert transformer coefficients */	SIF_HilbertTransformer (pFilterCoeffs,			/* Pointer to filter coefficients */							HILBERT_TRANSFORM_LENGTH);	/* Filter length */														/* Initialise FIR filter for Hilbert transformer */	SIF_Fir (pFilterState,							/* Pointer to filter state array */			 &FilterIndex,							/* Pointer to filter index register */			 HILBERT_TRANSFORM_LENGTH);				/* Filter length */													/* Initialise the delay */	SIF_Delay (pDelayState,							/* Pointer to delay state array */			   &DelayIndex,							/* Pointer to delay index */			   DELAY_LENGTH);						/* Delay length */	SinePhase = SIGLIB_ZERO;	SDA_SignalGenerate (pSrc,						/* Pointer to destination array */						SIGLIB_SINE_WAVE,			/* Signal type - Sine wave */						SIGLIB_ONE,					/* Signal peak level */						SIGLIB_FILL,				/* Fill (overwrite) or add to existing array contents */						((SLData_t)0.01),			/* Signal frequency */						SIGLIB_ZERO,				/* D.C. Offset */						SIGLIB_ZERO,				/* Unused */						SIGLIB_ZERO,				/* Signal end value - Unused */						&SinePhase,					/* Signal phase - maintained across array boundaries */						SIGLIB_NULL_DATA_PTR,		/* Unused */						SAMPLE_LENGTH);				/* Output array length */	Display2DGraph (h2DGraph,						/* Graph handle */				    "Source Signal",				/* Title of the dataset */				    pSrc,							/* Array of Double dataset */				    SAMPLE_LENGTH,					/* Number of data points */					SV_GRAPH_LINE,					/* Graph type */				    SV_MAGENTA,						/* Colour */					SV_HIDE_MARKERS,				/* Marker enable / disable */					SV_GRAPH_NEW);					/* New graph */	printf ("\nSource Signal\nPlease hit <Carriage Return> to continue . . ."); getchar ();													/* Apply Hilbert transformerer */	SDA_Fir (pSrc,									/* Input array to be filtered */			 pHilbertTransformed,					/* Filtered output array */			 pFilterState,							/* Pointer to filter state array */			 pFilterCoeffs,							/* Pointer to filter coefficients */			 &FilterIndex,							/* Pointer to filter index register */			 HILBERT_TRANSFORM_LENGTH,				/* Filter length */			 SAMPLE_LENGTH);						/* Array length */	Display2DGraph (h2DGraph,						/* Graph handle */				    "Hilbert Transformed Signal",	/* Title of the dataset */				    pHilbertTransformed,			/* Array of Double dataset */				    SAMPLE_LENGTH,					/* Number of data points */					SV_GRAPH_LINE,					/* Graph type */				    SV_MAGENTA,						/* Colour */					SV_HIDE_MARKERS,				/* Marker enable / disable */					SV_GRAPH_NEW);					/* New graph */	printf ("\nHilbert Transformed Signal\nPlease hit <Carriage Return> to continue . . ."); getchar ();						/* Delay input signal *///	SDA_Delay (pSrc, pDelayed, pDelayState, &DelayIndex, DELAY_LENGTH, SAMPLE_LENGTH);	for (i = 0; i < SAMPLE_LENGTH; i++)	{		*(pDelayed+i) =			SDS_Delay (*(pSrc+i),					/* Input data sample */					   pDelayState,					/* Pointer to delay state array */					   &DelayIndex,					/* Pointer to delay state index */					   DELAY_LENGTH);				/* Delay filter length */	}	Display2DGraph (h2DGraph,						/* Graph handle */				    "Delayed Signal",				/* Title of the dataset */				    pDelayed,						/* Array of Double dataset */				    SAMPLE_LENGTH,					/* Number of data points */					SV_GRAPH_LINE,					/* Graph type */				    SV_MAGENTA,						/* Colour */					SV_HIDE_MARKERS,				/* Marker enable / disable */					SV_GRAPH_NEW);					/* New graph */	printf ("\nDelayed Signal\nPlease hit <Carriage Return> to continue . . ."); getchar ();	SUF_MemoryFree (pSrc);							/* Free memory */	SUF_MemoryFree (pFilterCoeffs);	SUF_MemoryFree (pFilterState);	SUF_MemoryFree (pHilbertTransformed);	SUF_MemoryFree (pDelayState);	SUF_MemoryFree (pDelayed);}

⌨️ 快捷键说明

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