2014-09-03 135 views
0

我想(在256個樣本10赫茲/秒),以實現簡單的IIR(直接I型)過濾器C.如何在C中實現IIR濾波器?

對於高通我這樣做:

int Diff = Sample - Previous_Sample; 

HP_Output = ((HP_Output + Diff) * 4)/5; 

對於低(10赫茲@ 32採樣/秒)我這樣做:

int Diff = Sample - LP_Output ; 

LP_Output = ((LP_Output + Diff) * 2)/3; 

現在我想知道:這兩種實現數學正確嗎?

如果我想改變輸入採樣率(或濾波頻率),我該如何計算新的因子?

+0

你的代碼完全缺少的是* time *。採樣率很重要。實用的過濾器使用許多樣品,而不僅僅是一個。使用Google查找答案,最佳查詢是「iir係數計算器」。 – 2014-09-03 09:24:40

+0

@HansPassant我爲每個樣本調用函數(每秒256個樣本) – Muis 2014-09-03 09:32:42

+1

不是我的意思,您必須存儲舊樣本。記錄在T-1,T-2,T-3等等。你需要一個數組。一旦你閱讀谷歌點擊,這將是非常明顯的,你將不得不花費時間。 – 2014-09-03 09:41:19

回答

0

高通輸出對於一階濾波器實現是正確的。 從high-pass filter realization on wikipedia,和給定的採樣率fs和濾波器的截止頻率fcalpha可以從關係來獲得所需的因子:
enter image description here

其中產量:
enter image description here

在片段提供,這個結果爲alpha ~ 4/5

對於一階低通濾波器,您的代碼本質上只輸出縮放後的輸入樣本(自LP_Output + Diff == LP_Output + Sample - LP_Output == Sample起)。相反,我會期望:

LP_Output = LP_Output + Diff * 2/3; 

現在,因子alpha同樣可以基於low-pass filter realization on wikipedia是推導得出:
enter image description here

再次,在提供的片段,這導致alpha ~ 2/3

最後,正如漢斯在評論中指出的,對於更高階的濾波器實現,您應該看看IIR濾波器設計工具來推導係數。

+0

我真的不明白你的建議改變'LP_Output =((LP_Output + Diff)* 2)/ 3'爲'LP_Output = LP_Output + Diff * 2/3',因爲它似乎沒有任何影響的結果?兩行代碼輸出相同的值? – Muis 2014-09-10 10:55:52

+0

'LP_Output + Diff * 2/3'相當於'LP_Output +(Diff * 2/3)'。例如,如果當前的'LP_Output'是42,並且新的輸入'Sample'是6,那麼你的代碼會給出'Diff == 6-42 == -36',然後更新'LP_Output ==((42 + -36 )* 2)/ 3 ==((6)* 2)/ 3 == 4'。我的版本將'LP_Output'更新爲'LP_Output == 42 + -36 * 2/3 == 42 +(-24)== 18。 – SleuthEye 2014-09-10 12:19:03