最简洁的方法来存储C头中的滤波器系数列表

时间:2010-04-21 19:18:13

标签: c include c-preprocessor

我有很多(约100个)滤波器系数借助于一些Matlab和Excel计算出来,我想将其转储到 C 头文件中以供一般使用,但我不确定最好的方法是做什么。我是这样开始的:

#define BUTTER 1
#define BESSEL 2
#define CHEBY 3
#if FILT_TYPE == BUTTER
    #if FILT_ROLLOFF == 0.010
        #define B0 256
        #define B1 512
        #define B2 256
        #define A1 467
        #define A2 -214
    #elif FILT_ROLLOFF == 0.015
        #define B0 256
        #define B1 512
// and so on...

但是,如果我这样做并将它们全部推入标题中,我需要在包含它之前在我的源代码中设置条件(FILT_TYPEFILT_ROLLOFF),这看起来有点讨厌。更重要的是,如果我有2个以上不同的过滤器需要不同的滚降/过滤器类型,它将无法工作。我可以在系数文件中#undef我的5个系数(A1-2,B0-2),但是必须在代码中插入#include似乎是错误的。

修改 这适用于嵌入式8位处理器,代码空间非常小(2-4K)。我似乎无法通过将它们存储到结构数组中来实现这一点,因为它消耗的空间是不可接受的。即使声明它们都是常量,我的编译器也不会“优化它们”,因此我会留下超过1.2K的额外二进制数据。

以下内容不起作用。

typedef struct { 
    int16_t b0, b1, b2, a1, a2;
} filtCoeff;

const filtCoeff butter[41] = {
    {256,512,256,467,-214},
    {256,512,256,444,-196},
    {255,512,255,422,-179},
    // ...
};
const filtCoeff bessel[41]  // ...

2 个答案:

答案 0 :(得分:3)

将滤波器系数放在结构数组中。我不会担心头文件,而是将数组指针的声明放在.h文件中,并在链接的特定.c文件中定义它们。

答案 1 :(得分:2)

您可以使用标记串联将这些作为宏的参数。

#define BUTTER 1
#define BESSEL 2
#define CHEBY 3

#define ROLLOFF_0_010 1
#define ROLLOFF_0_015 2

// BUTTER, ROLLOFF_0_010
#define B0_11 256
#define B1_11 512
#define B2_11 256
#define A1_11 467
#define A2_11 -214

// BUTTER, ROLLOFF_0_015
#define B0_12 256
#define B1_12 512
// ...

#define B0_(type, rolloff) (BO_##type##rolloff)
#define B1_(type, rolloff) (B1_##type##rolloff)
#define B2_(type, rolloff) (B2_##type##rolloff)
#define A1_(type, rolloff) (A1_##type##rolloff)
#define A2_(type, rolloff) (A2_##type##rolloff)

/*
 * This two level define is so that the parameters to these macros
 * get run through the macro process.   That is, B1_(BUTTER, ROLLOFF_0_010) 
 * evaluates as B1_BUTTERROLLOFF_0_010, while B1(BUTTER, ROLLOFF_0_010)
 * evaluates as B1_11 and thus as 256.
 */

#define B0(type, rolloff) B0_(type, rolloff)
#define B1(type, rolloff) B1_(type, rolloff)
#define B2(type, rolloff) B2_(type, rolloff)
#define A1(type, rolloff) A1_(type, rolloff)
#define A2(type, rolloff) A2_(type, rolloff)

B1(BUTTER, ROLLOFF_0_015)现在相当于512。然后你可以构建任何更复杂的东西作为宏。 E.g:

#define CROSSPRODUCT(type, rolloff, values) \
    B0(type, rolloff) * ((values)[0]) + \
    B1(type, rolloff) * ((values)[1]) + \
    ...

您也可以将代码放在另一个文件中,然后使用TYPEROLLOFF。然后只需#define TYPEROLLOFF并包含其他文件。我想我更喜欢使用宏。