2013-11-24 234 views
0

我想實現一個IIR濾波器,我已經在Matlab中設計成了一個C++程序,用於從波形文件中濾除不需要的信號。在Matlab中的FDATool生成此C頭使用(它是一個帶阻濾波器):計算iir濾波器的w係數

#include "tmwtypes.h" 
/* 
* Expected path to tmwtypes.h 
* C:\Program Files (x86)\MATLAB\R2013a Student\extern\include\tmwtypes.h 
*/ 
const int al = 7; 
const real64_T a[7] = { 
    0.9915141178644, -5.910578456199, 14.71918523779, -19.60023964796, 
     14.71918523779, -5.910578456199, 0.9915141178644 
}; 
const int bl = 7; 
const real64_T b[7] = { 
        1, -5.944230431733, 14.76096188047, -19.60009655976, 
     14.67733658492, -5.877069568864, 0.9831002459245 
}; 

後排出的研究小時,我仍然無法找出使用這些值來確定的W值的正確方法然後如何使用這些W值來正確計算我的Y輸出。如果任何人對排序有所瞭解,應該使用這些值來完成所有這些轉換,這將是一個重大幫助。

我已經開發並嘗試過的所有方法都不會生成有效的波形文件,但標題值都可以正確翻譯,但超出的所有內容都無法通過媒體播放器進行評估。

謝謝。

+0

也許這會有所幫助。或者你是否希望在C++中實現這個功能,因此不能使用MATLAB的內置函數?在這種情況下,您將需要找到一個類似於filter()的C++ IIR庫() – Falimond

+0

我必須在C++中爲此項目實現它 – user3027875

+0

http:// stackoverflow。COM /問題/ 6664686/A-C庫換IIR濾波器的 – Falimond

回答

0

IIR濾波器以這種方式工作: 假設樣品A和和CEOF的陣列命名爲 'C' 的陣列的結果陣列乙將是: B [I] =(A [I] * C [0] )+(B [I-1] * C [1])+ ... +(B [n]的* C [n])的

,只有最新的元件由A. 注意到這是更容易在原地進行,只需更新A即可。 這些過濾器係數非常暴力,你確定你有他們的權利? 第一個也是對稱的,這可能表明它是一個FIR濾波器。

0

在我看來,你有一個3極IIR濾波器,其係數爲N階實現(與一系列二階部分相對)。由於這是一個帶阻(或帶通),多項式階數是極數的兩倍。

我不確定W值是什麼意思,除非您試圖評估此濾波器的頻率響應。

要正確計算Y值,請參閱此鏈接瞭解實施IIR濾波器的代碼。特別參見第N階執行代碼。

http://www.iowahills.com/A7ExampleCodePage.html

BTW:我認爲這些都是N階係數和模擬它們。我在0.05Pi時得到了10分貝的缺口。聽起來正確嗎?

其中 B6 = 0.9915141178644 。 。 。 b0 = 0.9915141178644

a6 = 0.9831002459245 。 。 。 A0 = 1

此外,您可能要發佈這樣一個問題上:

https://dsp.stackexchange.com/