我有很多(约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_TYPE
,FILT_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] // ...
答案 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]) + \
...
您也可以将代码放在另一个文件中,然后使用TYPE
和ROLLOFF
。然后只需#define
TYPE
和ROLLOFF
并包含其他文件。我想我更喜欢使用宏。