FIRGen
滤波系数生成接口主要是通过对无限滤波器系数加窗转化为有限滤波系数,此次支持低通、高通、带通和带阻滤波系数,支持的窗口为Bartlett窗、Blackman窗、Hamming窗和Hann窗。
滤波系数生成是通过对理想的无限滤波器系数hd(n)加窗window(n)转化为有限滤波器系数h(n),并计算出具有截止频率freq(F)的FIR滤波器的len个数的系数h(n)。
主要公式为:。
其中窗口生成可参考HMPP相关窗口模块。
。
低通时域采用公式如下:
高通时域采用公式如下:
;
带通时域采用公式如下:
带阻时域采用公式如下:
低通时域归一化公式如下:
高通时域归一化公式如下:
带通时域归一化公式如下:
带阻时域归一化公式如下:
FIRGen函数调用流程如下:
- 调用Init初始化buffer缓冲区。
- 调用主函数。
- 最后调用Release释放buffer缓冲区。
函数接口声明如下:
- 初始化操作:
HmppResult HMPPS_FIRGenInit_64f(int32_t tapsLen, uint8_t **buffer);
- 主函数操作:
HmppResult HMPPS_FIRGenLowpass_64f(double freq, double *taps, int32_t tapsLen, HmppWinType winType, HmppBool doNormal, uint8_t *buffer);
HmppResult HMPPS_FIRGenHighpass_64f(double freq, double *taps, int32_t tapsLen, HmppWinType winType, HmppBool doNormal, uint8_t *buffer);
HmppResult HMPPS_FIRGenBandpass_64f(double freqLow, double freqHigh, double *taps, int32_t tapsLen, HmppWinType winType, HmppBool doNormal, uint8_t *buffer);
HmppResult HMPPS_FIRGenBandstop_64f(double freqLow, double freqHigh, double *taps, int32_t tapsLen, HmppWinType winType, HmppBool doNormal, uint8_t *buffer);
- 释放内存操作:
HmppResult HMPPS_FIRGenRelease(uint8_t *buffer);
参数
参数名 |
描述 |
取值范围 |
输入/输出 |
---|---|---|---|
tapsLen |
有限滤波系数的长度。 |
[5, INT_MAX] |
输入 |
freq |
截至频率。 |
(0, 0.5) |
输入 |
freqLow |
低截至频率。 |
(0, 0.5)且小于freqHigh |
输入 |
freqHigh |
高截至频率。 |
(0, 0.5)且大于freqLow |
输入 |
taps |
指向存储计算出的tap值向量的指针。 |
非空 |
输出 |
winType |
指定计算中使用的窗口类型。 |
HMPP_WIN_BARTLETT、HMPP_WIN_BLACKMAN、HMPP_WIN_HAMMING或HMPP_WIN_HANN |
输入 |
doNormal |
指定计算过滤系数是否进行归一化。 |
HMPP_TRUE或HMPP_FALSE |
输入 |
buffer(init函数中) |
指向内存存储buffer缓冲区的指针的指针。 |
非空 |
输出 |
buffer(主函数中和release函数中) |
指向buffer缓冲区的指针。 |
非空 |
输入 |
返回值
- 成功:返回HMPP_STS_NO_ERR。
- 失败:返回错误码。
错误码
错误码 |
描述 |
---|---|
HMPP_STS_NO_ERR |
表示没有错误。 |
HMPP_STS_NULL_PTR_ERR |
当任何指定的指针为空时指示错误。 |
HMPP_STS_SIZE_ERR |
指示当tapsLen<5,或者freq<=0、freq>=0.5,或者freqLow、freqHigh<=0、freqLow、freqHigh>=0.5、freqLow>=freqHigh时的错误。 |
HMPP_STS_WIN_TYPE_ERR |
指示窗口类型错误。 |
HMPP_STS_OVERFLOW |
指示计算溢出时错误。 |
HMPP_STS_MALLOC_FAILED |
Init函数中进行算法模型所需内存申请失败。 |
注意
- 调用该接口计算之前,必须调用Init接口初始化buffer缓冲区规范结构。
- buffer缓冲区初始化成功后,如果执行主函数失败,必须使用Release函数释放buffer缓冲区。
示例
#define TPAS_LEN_S 8 void FIRGenBandpassExample(void) { int32_t tapsLen = TPAS_LEN_S; double freqLow = 0.05; double freqHigh = 0.48; HmppWinType winType = HMPP_WIN_BARTLETT; HmppBool doNormal = HMPP_TRUE; double taps[TPAS_LEN_S] = { 0.0 }; uint8_t *buffer = NULL; HmppResult result; result = HMPPS_FIRGenInit_64f(tapsLen, &buffer); printf("HMPPS_FIRGenInit_64f result = %d\n", result); if (result != HMPP_STS_NO_ERR) { return; } result = HMPPS_FIRGenBandpass_64f(freqLow, freqHigh, taps, tapsLen, winType, doNormal, buffer); printf("HMPPS_FIRGenBandpass_64f result = %d\n", result); HMPPS_FIRGenRelease(buffer); buffer = NULL; if (result != HMPP_STS_NO_ERR) { return; } int32_t i; printf("tapsLen = %d\ntaps =", tapsLen); for(i = 0; i < tapsLen; ++i){ printf(" %f", taps[i]); } printf("\n"); }
运行结果:
HMPPS_FIRGenInit_64f result = 0 HMPPS_FIRGenBandpass_64f result = 0 tapsLen = 8 taps = -0.000000 0.010000 -0.196259 0.517494 0.517494 -0.196259 0.010000 -0.000000