📄 pgc.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 + -