我有很多(〜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