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

📄 pgc.cpp

📁 pgc 解调算法的c 语言实现
💻 CPP
字号:
// PGC.cpp : Defines the entry point for the DLL application.
//

#include "stdafx.h"
#include "PGC.h"
#include <math.h>
#include <malloc.h>

#define PI				(double)	3.14159265358979311
#define BESSEL_LEN		(int)		13			//计算贝塞尔函数时的循环次数
#define ZERO			(double)	1E-20


BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
					 )
{
    switch (ul_reason_for_call)
	{
		case DLL_PROCESS_ATTACH:
		case DLL_THREAD_ATTACH:
		case DLL_THREAD_DETACH:
		case DLL_PROCESS_DETACH:
			break;
    }
    return TRUE;
}

// This is the constructor of a class that has been exported.
// see PGC.h for the class definition
CPGC::CPGC()
{ 
	return; 
}

//==================================================================
//函数名:	Normal
//作者:		ChenguangZhao
//日期:		2008-02-02
//功能:		归一化处理,y[i]等于x[i]减均值mean, 再除以标准差stdDev
//参数:		double *x	原始处数据
//			int len		数据长度
//			double *y	归一化处理后的数据
//返回值:	类型		int
//			值			0		无意义(预留)
//==================================================================
PGC_API int Normal(double *y, double *x, int len)
{
	int i;
	double mean = 0;
	double stdDev = 0;
	
	for (i = 0 ; i < len ; i ++) {
		mean += x[i];
	}
	mean = mean / len;

	for (i = 0 ; i < len ; i ++) {
		stdDev += (x[i]-mean) * (x[i]-mean);
	}

	stdDev = sqrt(stdDev / (len-1));

	for (i = 0 ; i < len ; i ++) {
		y[i] = (x[i]-mean) / stdDev;
	}

	return 0;
}

//==================================================================
//函数名:	Multi
//作者:		ChenguangZhao
//日期:		2008-02-02
//功能:		相乘混频, x1[i] = x1[i]*x2[i]
//参数:		double *x1	原始数据x1
//			double *x2	原始数据x2
//			int len		数据长度
//返回值:	类型		int
//			值			0		无意义(预留)
//==================================================================
PGC_API int Multi(double *x1, double *x2, int len)
{
	int i;
	
	for (i = 0 ; i < len ; i ++) {
		x1[i] = x1[i] * x2[i];
	}
	
	return 0;
}

//==================================================================
//函数名:	FIRCoef
//作者:		ChenguangZhao
//日期:		2008-02-02
//功能:		计算单位脉冲响应hd(n)
//参数:		double *firCoef		存储计算所得的单位脉冲响应
//			double fs			采样率
//			double fl			低端截止频率
//			double taps			滤波器长度(阶数/抽头数)
//			int nType			滤波器类型 0-低通,1-高通,2-带通(暂不支持),3-带阻(暂不支持)
//返回值:	类型				int
//			值					0		无意义(预留)
//==================================================================
PGC_API int FIRCoef(double *firCoef, double fs, double fl, int taps, int nType)
{
	int n;
	
	for (n = 0 ; n <= (taps-1)/2 ; n ++) {
		double tmp = (double)n-((double)taps-1)/2;
		switch(nType) {
		case 0:
		default:
			if (tmp != 0) {
				firCoef[n] = sin(2*PI*(fl/fs)*tmp) / (PI*tmp);
				firCoef[taps-1-n] = firCoef[n];
			}
			else
				firCoef[n] = 2*fl/fs;
			break;
		case 1:
			if (tmp != 0) {
				firCoef[n] = (sin(PI*tmp)-sin(2*PI*(fl/fs)*tmp)) / (PI*tmp);
				firCoef[taps-1-n] = firCoef[n];
			}
			else
				firCoef[n] = 1-2*fl/fs;
			break;
		}		
	}

	return 0;
}



//==================================================================
//函数名:	Bessel
//作者:		ChenguangZhao
//日期:		2008-02-02
//功能:		计算贝塞尔函数
//参数:		double x		输入值x
//			int len			循环次数
//返回值:	类型			double
//			值				计算所得的贝塞尔函数值
//==================================================================
PGC_API double Bessel(double x, int len)
{
	int k, i;
	double kFactorial;
	double dBessel = 0;
	
	for (k = 0 ; k < len ; k ++) {
		kFactorial = 1;
		for (i = 1 ; i <= k ; i ++) {
			kFactorial *= i;
		}
		
		dBessel += pow((1/kFactorial)*pow(x/2, k), 2);
	}

	return dBessel;
}

//==================================================================
//函数名:	Kaiser
//作者:		ChenguangZhao
//日期:		2008-02-02
//功能:		计算Kaiser窗
//参数:		double *ksCoef		存储计算所得的Kaiser窗
//			double beta			β值
//			int len				窗长度
//返回值:	类型				int
//			值					0
//==================================================================
PGC_API int Kaiser(double *ksCoef, double beta, int len)
{
	int n;
	double dBessel;

	dBessel = Bessel(beta, BESSEL_LEN);

	for (n = 0 ; n <= (len-1)/2 ; n ++) {
		ksCoef[n] = Bessel(beta*sqrt(1-pow(1-2*(double)n/((double)len-1), 2)), BESSEL_LEN) / dBessel;
		ksCoef[len-1-n] = ksCoef[n];
	}

	return 0;
}

//==================================================================
//函数名:	Conv
//作者:		ChenguangZhao
//日期:		2008-02-02
//功能:		卷积
//参数:		double *y		存储卷积结果
//			double *x		原始采样数据
//			int len			原始采样数据长度
//			double *coef	FIR滤波器参数
//			int taps		FIR滤波器长度(阶数/抽头数)
//返回值:	类型			int
//			值				0
//==================================================================
PGC_API int Conv(double *y, double *x, int len, double *coef, int taps)
{
	int i, j, k;

	j = (taps-1)/2;
	for (i = j ; i < len+j ; i ++) {
		y[i-j] = 0;
		for (k = 0 ; k < taps; k ++) {
			double tmp;
			if (k > i || i-k >= len)
				tmp = 0;
			else
				tmp = x[i-k];
			y[i-j] += tmp*coef[k];
		}
	}
	
	return 0;
}

//==================================================================
//函数名:	FIR
//作者:		ChenguangZhao
//日期:		2008-02-02
//功能:		FIR滤波,需要根据滤波器类型,由单位脉冲响应和Kaise窗计算
//          滤波器参数,然后将原始采样数据与滤波器参数进行卷积
//参数:		double *y			存储滤波后的数据
//			double *x 			原始采样数据
//			int len				原始采样数据长度
//			double *firCoef		单位脉冲响应
//			double *ksCoef		Kaiser窗
//			int taps			滤波器长度(阶数/抽头数)
//返回值:	类型				int
//			值					0
//==================================================================
PGC_API int FIR(double *y, double *x, int len, double *firCoef, double *ksCoef, int taps)
{
	int n;

	for (n = 0 ; n <= (taps-1)/2 ; n ++) {
		firCoef[n] = firCoef[n] * ksCoef[n];
		firCoef[taps-1-n] = firCoef[n];
	}
		
	Conv(y, x, len, firCoef, taps);

	return 0;
}

//==================================================================
//函数名:	DSamp
//作者:		ChenguangZhao
//日期:		2008-02-02
//功能:		降采样, 降采样后的数据存到x的最前面
//参数:		double *x		原始数据
//			int len			原始数据长度
//			int nRatio		降采样倍数
//返回值:	类型			int
//			值				0
//==================================================================
PGC_API int DSamp(double *x, int len, int nRatio)
{
	int newLen = len/nRatio;
	int i, j;
	double tmp;

	for (i = 0 ; i < newLen ; i ++) {
		tmp = 0;
		for (j = 0 ; j < nRatio ; j ++) {
			tmp += x[i*nRatio+j];
		}
		x[i] = tmp/(double)nRatio;
	}
	
	return 0;
}

//==================================================================
//函数名:	Diff
//作者:		ChenguangZhao
//日期:		2008-02-02
//功能:		微分, 微分后的结果存回x
//参数:		double *x		原始数据
//			int len			原始数据长度
//返回值:	类型			int
//			值				0
//==================================================================
PGC_API int Diff(double *x, int len)
{
	int i;

	for (i = 0 ; i < len-2 ; i ++) {
		x[i] = (x[i+2]-x[i])/2;
	}

	x[len-2] = x[len-3];
	x[len-1] = x[len-2];
	
	return 0;
}

//==================================================================
//函数名:	Sub
//作者:		ChenguangZhao
//日期:		2008-02-02
//功能:		相减, 结果存到x1
//参数:		double *x1		原始数据1
//			double *x2		原始数据2
//			int len			原始数据长度
//返回值:	类型			int
//			值				0
//==================================================================
PGC_API int Sub(double *x1, double *x2, int len)
{
	int i;

	for (i = 0 ; i < len ; i ++) {
		x1[i] = x1[i]-x2[i];
	}
	
	return 0;
}

//==================================================================
//函数名:	Intg
//作者:		ChenguangZhao
//日期:		2008-02-02
//功能:		积分,微分后的结果存回x
//参数:		double *x		原始数据
//			int len			原始数据长度
//返回值:	类型			int
//			值				0
//==================================================================
PGC_API int Intg(double *x, int len)
{
	int i;

	for (i = 1 ; i < len ; i ++) {
		x[i] += x[i-1];
	}

	return 0;
}

⌨️ 快捷键说明

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