2011-10-06 113 views
1

我有一個幅度頻率響應點列表。振幅以分貝爲單位給出。從頻率響應計算FIR係數

任務是將此AFR列表導出爲某些硬件DSP器件的一組係數。我知道這個設備的文件格式。該器件的規格說明它需要12288個係數,DSP有2個FIR濾波器模塊(每個6144個抽頭)。這個想法是,在加載這些係數後,這個設備應該作爲一個均衡器,根據初始的頻率點列表對信號進行變換。

我發現FIR濾波器的係數可以通過對所需頻率響應進行傅立葉逆變換並使用某些窗函數(最好不是矩形)來計算。

問題是我不擅長信號處理,我對FIR不是很瞭解,我用FFT從音頻數據中獲得頻率響應,但我仍然對FFT和相關東西的作品。

點的計算應該用C#或C++(我擅長創建C++/CLI包裝器)完成,這樣我就可以將它集成到已經存在的應用程序中。 導出過程不是時間關鍵的,所以我可以使用簡單和慢速的算法,但無論如何,它在中檔計算機上不應超過一分鐘。

是否有任何免費的庫或代碼從幅頻響應數據獲取FIR係數?

最好的解決方案就像是一個「黑盒子」,所以我可以提供AFR點列表並獲得12288係數,但是如果只有它可以用於多個庫/代碼段,我也會很感激易於放在一起。

附加信息:

  • 採樣頻率將通過本FIR傳遞音頻,是44100赫茲

  • 的信號的總特性可被鬆散地定義爲「音樂」,FIR將用於均衡高質量音頻,因此如果在高端音頻系統上不能聽到受過訓練的耳朵聽到的任何錯誤和信號失真,則可以接受。

  • 相鄰振幅之間的差異在初始AFR點理論上可能在[0 dB ... 80 dB]的範圍內,但在實際測試中,它們通常在範圍[0 dB ... 2 dB]範圍內[0 dB ... 2 dB] 012R它們中,第一點是 20.17246114 20.68984457 和 最後兩個 21632.14039 21754.41533

使用下式計算各點:

 float x; 
     for(int i = 0; i<bandPoints; i++){ 
       x = (((float)i + 1)/((float)(bandPoints + 2))); 
       bandsHz[i] = ((x*x)*(22000-20))+20; // 20...22000 
     } 
+1

不確定這是否可能沒有頻率響應的相位。也許它可以近似,例如通過假設濾波器具有線性相位。 –

+0

給定頻率點有多近,相鄰振幅之間的最大差值是多少,所得到的FIR濾波器響應中允許的誤差是多少,以及採樣率是多少?這些答案與FIR的大致所需長度之間有關係。 – hotpaw2

+0

@ hotpaw2我添加了更多信息 – JustAMartin

回答

5

尋找好的FIR係數的標準方法是使用「Remez交換」算法。我找到了一些代碼的鏈接(並沒有自己嘗試過),您可能會覺得有用:http://www.janovetz.com/jake/remez/remez-19980711.zip。另一個要搜索的關鍵詞是「Parks-McClellan」。

該算法的輸入是描述幅度與頻率以及一組權重因子與頻率的關係,描述了滿足該頻率下幅度要求的相對重要性。該算法然後在迷你最大意義上找到最佳濾波器(最小化最大誤差)。

+0

這裏有一個有用的介紹Parks-McLellan設計[這裏](http://www.bores.com/courses/intro/filters/4_equi.htm)和[wikipedia](http ://en.wikipedia.org/wiki/Parks-McClellan_filter_design_algorithm)頁面也相當不錯! – Speedy

+0

請注意,Parks-McClellen濾波器設計工具最常用於帶(通過和停止)可以表示爲一系列矩形而非連續函數(非矩形)近似時使用。 – hotpaw2