EN
注册
我要评分
文档获取效率
文档正确性
内容完整性
文档易理解
在线提单
论坛求助

FIRGen

滤波系数生成接口主要是通过对无限滤波器系数加窗转化为有限滤波系数,此次支持低通、高通、带通和带阻滤波系数,支持的窗口为Bartlett窗、Blackman窗、Hamming窗和Hann窗。

滤波系数生成是通过对理想的无限滤波器系数hd(n)加窗window(n)转化为有限滤波器系数h(n),并计算出具有截止频率freq(F)的FIR滤波器的len个数的系数h(n)。

主要公式为:

其中窗口生成可参考HMPP相关窗口模块。

低通时域采用公式如下:

高通时域采用公式如下:

带通时域采用公式如下:

带阻时域采用公式如下:

低通时域归一化公式如下:

高通时域归一化公式如下:

带通时域归一化公式如下:

带阻时域归一化公式如下:

FIRGen函数调用流程如下:

  1. 调用Init初始化buffer缓冲区。
  2. 调用主函数。
  3. 最后调用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