2012-01-05 99 views
2

我有一個簡單的單極低通濾波器(對於參數平滑),可以由下式來說明:ARM NEON簡單的低通濾波器矢量

y[n] = (1-a) * y[n-1] + a * x[n] 

如何有效矢量化上ARM氖這種情況下 - 使用內部函數?可能嗎? 問題是每個計算都需要以前的結果。

+0

我下面具體如何重組的問題,允許並行計算,但對於含NEON落實任何細節更具體的答案,人們需要知道你所使用的數字格式等 – 2012-01-06 16:44:23

回答

0

你真的只能矢量化這一點,如果你有一個以上的信號,您希望應用相同的過濾器,例如如果是立體聲音頻信號,則可以並行處理左右聲道。並行的四個或八個通道顯然會更好。

0

一般情況下,你只能向量化完全獨立的套計算。但是在你的IIR低通中,每個輸出都依賴於另一個(第一個除外),所以矢量化是不可能的。如果你的變量「a」足夠大以至於(1-a)^ n迅速衰減到低於你想要的本底噪聲或允許的誤差,你可以用一個短FIR濾波器近似代替你的IIR,然後將該卷積向量化。但這不可能更快。

0

擴大怎麼方程4個步驟和使用矩陣乘法? a是恆定的,所以可以預先計算一個矩陣

2

假設您一次執行矢量操作M元素(我認爲NEON是128位寬,所以這將是32位元素),您可以展開差分方程對於簡單的單極點濾波器來說,非常容易達到M。假定您已經計算了所有輸出,最高爲y[n]。然後,你可以計算出未來四年如下:

y[n+1] = (1-a)*y[n] + a*x[n+1] 
y[n+2] = (1-a)*y[n+1] + a*x[n+2] = (1-a)*((1-a)*y[n] + a*x[n+1]) + a*x[n+2] 
     = (1-a)^2*y[n] + a*(1-a)*x[n+1] + a*x[n+2] 
... 

在一般情況下,你可以寫y[n+k]爲:

y[n+k] = (1-a)^2*y[n] + sum_{i=1}^k a*(1-a)^{k-i}*x[n+i] 

我知道上面是難以閱讀(也許我們可以在遷移此問題到Signal Processing,我可以在LaTeX中重新排版)。但是,給定的初始條件y[n](其被假定爲是對先前 矢量迭代中計算的最後輸出),則可以並行地計算下一M輸出作爲展開的過濾器的其餘部分具有FIR狀結構。

這種方法有一些注意事項:如果M變大,那麼最終會將一串數字相乘,以便獲得展開濾波器的有效FIR係數。根據您的號碼格式和a的值,這可能會產生數字精確含義。此外,您不使用這種方法得到的M倍速度提升:你最終計算y[n+k]有相當於一個k抽頭FIR濾波器。雖然你並行計算輸出M,但你必須做k乘法累加運算而不是簡單的一階遞歸實現,這減少了向量化的一些好處。

+0

是會談的答案帶有9個操作的矢量化版本比使用只有三個操作的簡單標量版本更高效?好吧,但總體上標量將有4 * 3 = 12個操作,所以可能比矢量稍慢,對不對? – 2012-01-06 21:19:37

+1

是的,這就是我在最後一段中得到的結果;在操作計數方面,沒有您想要的那麼大的好處,只有50%而不是1/M。 [這個問題的一個非常相似的版本交叉張貼在信號處理](http://dsp.stackexchange.com/questions/1075/how-can-i-vectorize-the-computations-for-a-first-order - 遞歸濾波器),更關注問題結構和操作數量,而不是任何NEON特定的。那裏有一些額外的細節。 – 2012-01-06 21:23:58