我有很多(〜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种不同的过滤器需要不同的滚降/过滤器类型,它将无法工作。我可以在这个系数文件中使用我的5个系数(A1-2,B0-2),但是它仍然看起来是错误的,不得不在代码中插入一个#include
。
编辑: 这是一个非常小的(2-4K)代码空间的嵌入式8位处理器。我似乎无法通过将它们存储到结构数组中来实现这一点,因为它消耗的空间是不可接受的。即使声明它们都是不变的,我的编译器不会'优化它们',所以我留下了超过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] // ...
虽然这排除了一些可能的优化,但它绝对是一个更干净的解决方案。 – xtofl 2010-04-21 19:26:50
忘了提及这是针对小型8位嵌入式目标,所以40个滚降* 3个类型* 5个coeffs * 2个字节= 1200个字节的数据消耗掉了我大部分的Flash。 – 2010-04-21 19:57:50