巴特沃斯濾波器c語言_第1頁
巴特沃斯濾波器c語言_第2頁
巴特沃斯濾波器c語言_第3頁
巴特沃斯濾波器c語言_第4頁
巴特沃斯濾波器c語言_第5頁
已閱讀5頁,還剩8頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、模擬濾波器的設計1.1 巴特沃斯濾波器的次數(shù)根據(jù)給定的參數(shù)設計模擬濾波器,然后進行變數(shù)變換,求取數(shù)字濾波器的方法,稱為濾波器的間接設計。做為數(shù)字濾波器的設計基礎的模擬濾波器,稱之為原型濾波器。這里,我們首先介紹的是最簡單最基礎的原型濾波器,巴特沃斯低通濾波器。由于 IIR 濾波器不具有線性相位特性,因此不必考慮相位特性,直接考慮其振幅特性。在這里, N 是濾波器的次數(shù),c是截止頻率。從上式的振幅特性可以看出,這個是單調遞減的函數(shù),其振幅特性是不存在紋波的。設計的時候,一般需要先計算跟所需要設計參數(shù)相符合的次數(shù)N。首先,就需要先由阻帶頻率,計算出阻帶衰減將巴特沃斯低通濾波器的振幅特性,直接帶入上

2、式,則有最后,可以解得次數(shù)N 為當然,這里的N 只能為正數(shù),因此,若結果為小數(shù),則舍棄小數(shù),向上取整。1.2 巴特沃斯濾波器的傳遞函數(shù)巴特沃斯低通濾波器的傳遞函數(shù),可由其振幅特性的分母多項式求得。其分母多項式1/13根據(jù) S 解開,可以得到極點。這里,為了方便處理,我們分為兩種情況去解這個方程。當N 為偶數(shù)的時候,這里,使用了歐拉公式。同樣的,當N 為奇數(shù)的時候,同樣的,這里也使用了歐拉公式。歸納以上,極點的解為上式所求得的極點,是在s 平面內,在半徑為c的圓上等間距的點,其數(shù)量為2N 個。為了使得其IIR 濾波器穩(wěn)定,那么,只能選取極點在S 平面左半平面的點。選定了穩(wěn)定的極點之后,其模擬濾波

3、器的傳遞函數(shù)就可由下式求得。2/131.3 巴特沃斯濾波器的實現(xiàn)(C 語言)首先,是次數(shù)的計算。次數(shù)的計算,我們可以由下式求得。其對應的C 語言程序為cppview plaincopyN = Ceil(0.5*( log10 ( pow (10, Stopband_attenuation/10) - 1) /log10 (Stopband/Cotoff) );然后是極點的選擇,這里由于涉及到復數(shù)的操作,我們就聲明一個復數(shù)結構體就可以了。最重要的是,極點的計算含有自然指數(shù)函數(shù),這點對于計算機來講,不是太方便,所以,我們將其替換為三角函數(shù),這樣的話,實部與虛部就還可以分開來計算。其代碼實現(xiàn)為cpp

4、view plaincopy1.typedefstructdouble Real_part;double Imag_Part; COMPLEX;6.7.COMPLEX polesN;for (k = 0;k = (2*N)-1) ; k+)if (Cotoff*cos(k+dk)*(pi/N) 0)polescount.Real_part = -Cotoff*cos(k+dk)*(pi/N);15.polescount.Imag_Part= -Cotoff*sin(k+dk)*(pi/N);count+;17.if(count = N)break ;3/13計算出穩(wěn)定的極點之后,就可以進行傳遞

5、函數(shù)的計算了。傳遞的函數(shù)的計算,就像下式一樣這里,為了得到模擬濾波器的系數(shù),需要將分母乘開。很顯然,這里的極點不一定是整數(shù),或者來說,這里的乘開需要做復數(shù)運算。其復數(shù)的乘法代碼如下,cppview plaincopyint Complex_Multiple(COMPLEX a,COMPLEX b,2.double*Res_Real,double*Res_Imag)3.*(Res_Real) = (a.Real_part)*(b.Real_part) - (a.Imag_Part)*(b.Imag_Part);*(Res_Imag)= (a.Imag_Part)*(b.Real_part) +

6、(a.Real_part)*(b.Imag_Part);return ( int )1;有了乘法代碼之后,我們現(xiàn)在簡單的情況下,看看其如何計算其濾波器系數(shù)。我們做如下假設這個時候,其傳遞函數(shù)為將其乘開,其大致的關系就像下圖所示一樣。計算的關系一目了然,這樣的話,實現(xiàn)就簡單多了。高階的情況下也一樣,重復這種計算就可以了。其代碼為cppview plaincopyRes0.Real_part = poles0.Real_part;Res0.Imag_Part= poles0.Imag_Part;Res1.Real_part = 1;4/13Res1.Imag_Part= 0;for (count_

7、1 = 0;count_1 N-1;count_1+)for (count = 0;count = count_1 + 2;count+)if (0 = count)Complex_Multiple(Rescount, polescount_1+1,13.&(Res_Savecount.Real_part),14.&(Res_Savecount.Imag_Part);16.elseif (count_1 + 2) = count)Res_Savecount.Real_part += Rescount - 1.Real_part;Res_Savecount.Imag_Part += Rescou

8、nt - 1.Imag_Part;elseComplex_Multiple(Rescount, polescount_1+1,24.&(Res_Savecount.Real_part),25.&(Res_Savecount.Imag_Part);26.1Res_Savecount.Real_part += Rescount - 1.Real_part;Res_Savecount.Imag_Part += Rescount - 1.Imag_Part;*(b+N) = *(a+N);到此,我們就可以得到一個模擬濾波器巴特沃斯低通濾波器了。2.雙 1 次 z 變換2.1 雙 1 次 z 變換的原理

9、我們?yōu)榱藢⒛M濾波器轉換為數(shù)字濾波器的,可以用的方法很多。這里著重說說雙1 次 z 變換。我們希望通過雙1 次 z 變換,建立一個s 平面到 z 平面的映射關系,將模擬濾波器轉換為數(shù)字濾波器。和之前的例子一樣,我們假設有如下模擬濾波器的傳遞函數(shù)。將其做拉普拉斯逆變換,可得到其時間域內的連續(xù)微分方程式,其中, x(t) 表示輸入, y(t) 表示輸出。然后我們需要將其離散化,假設其采樣周期是T ,用差分方程去近似的替代微分方程,可以得到下面結果然后使用z 變換,再將其化簡。可得到如下結果5/13從而,我們可以得到了s 平面到 z 平面的映射關系,即由于所有的高階系統(tǒng)都可以視為一階系統(tǒng)的并聯(lián),所以

10、,這個映射關系在高階系統(tǒng)中,也是成立的。然后,將關系式帶入上式,可得到這里,我們可以就可以得到 與 的對應關系了。這里的 與 的對應關系很重要。我們最終的目的設計的是數(shù)字濾波器,所以,設計時候給的參數(shù)必定是數(shù)字濾波器的指標。而我們通過間接設計設計IIR 濾波器時候,首先是要設計模擬濾波器,再通過變換,得到數(shù)字濾波器。那么,我們首先需要做的,就是將數(shù)字濾波器的指標,轉換為模擬濾波器的指標,基于這個指標去設計模擬濾波器。另外,這里的采樣時間T 的取值很隨意,為了方便計算,一般取1s 就可以。2.2 雙 1 次 z 變換的實現(xiàn)( C 語言)我們設計好的巴特沃斯低通濾波器的傳遞函數(shù)如下所示。我們將其進

11、行雙1 次 z 變換,我們可以得到如下式子6/13可以看出,我們還是需要將式子乘開,進行合并同類項,這個跟之前說的算法相差不大。其代碼為。cppview plaincopyfor (Count = 0;Count=N;Count+)3.for (Count_Z = 0;Count_Z = N;Count_Z+)5.ResCount_Z = 0;6.Res_SaveCount_Z = 0;8.Res_Save 0 = 1;9.for (Count_1 = 0; Count_1 N-Count;Count_1+)11.for(Count_2 = 0; Count_2 = Count_1+1;Cou

12、nt_2+)12.13.if (Count_2 = 0)ResCount_2 += Res_SaveCount_2;14.elseif(Count_2 = (Count_1+1)&(Count_1 != 0)15.ResCount_2 += -Res_SaveCount_2 - 1;16.elseResCount_2 += Res_SaveCount_2 - Res_SaveCount_2 - 1;17.for(Count_Z = 0;Count_Z= N;Count_Z+)18.19.Res_SaveCount_Z = ResCount_Z ;20.ResCount_Z= 0;21.23.f

13、or (Count_1 = (N-Count); Count_1 N;Count_1+)25.for (Count_2 = 0; Count_2 = Count_1+1;Count_2+)26.27.if(Count_2 = 0)ResCount_2 += Res_SaveCount_2;28.elseif(Count_2 = (Count_1+1)&(Count_1 != 0)29.ResCount_2 += Res_SaveCount_2 - 1;30.else31.ResCount_2 += Res_SaveCount_2 + Res_SaveCount_2 - 1;32.33.for(

14、Count_Z = 0;Count_Z= N;Count_Z+)34.35.Res_SaveCount_Z = ResCount_Z ;36.ResCount_Z = 0;37.39.for (Count_Z = 0;Count_Z= N;Count_Z+)40.41.*(az+Count_Z) +=pow(2,N-Count) * (*(as+Count) *42.Res_SaveCount_Z;43.*(bz+Count_Z) += (*(bs+Count) * Res_SaveCount_Z;到此,我們就已經(jīng)實現(xiàn)了一個數(shù)字濾波器。7/133.IIR 濾波器的間接設計代碼(C 語言)cpp

15、view plaincopy#include #include #include #include 7.#definepi(double)3.1415926)8.9.struct DESIGN_SPECIFICATIONdouble Cotoff;double Stopband;double Stopband_attenuation;16.17.typedefstructdouble Real_part;double Imag_Part; COMPLEX;22.23.24.int Ceil( double input)27.if (input != (int )input)return(int

16、)input) +1;else return ( int )input);30.31.32.intComplex_Multiple(COMPLEX a,COMPLEX b33.,double *Res_Real, double *Res_Imag)34.*(Res_Real) = (a.Real_part)*(b.Real_part) - (a.Imag_Part)*(b.Imag_Part);*(Res_Imag)= (a.Imag_Part)*(b.Real_part) + (a.Real_part)*(b.Imag_Part);return ( int )1;40.41.42.int B

17、uttord(double Cotoff,43.doubleStopband,44.doubleStopband_attenuation)int N;48.printf(Wc =%lfrad/sec n,Cotoff);49.printf(Ws =%lfrad/sec n,Stopband);50.printf(As =%lfdB n,Stopband_attenuation);51.printf(-n);8/1352.N = Ceil(0.5*( log10 ( pow (10, Stopband_attenuation/10) - 1) /54.log10 (Stopband/Cotoff

18、) );55.56.return ( int )N;59.60.61.int Butter(int N, double Cotoff,62.double*a,63.double*b)64.65.doubledk = 0;66.intk = 0;67.intcount = 0,count_1 = 0;COMPLEX polesN;COMPLEX ResN+1,Res_SaveN+1;if (N%2) = 0) dk = 0.5;else dk = 0;73.for (k = 0;k = (2*N)-1) ; k+)76.if (Cotoff*cos(k+dk)*(pi/N) 0)78.poles

19、count.Real_part = -Cotoff*cos(k+dk)*(pi/N);polescount.Imag_Part= -Cotoff*sin(k+dk)*(pi/N);count+;81.if(count = N)break ;85.printf(Pk =n);for (count = 0;count N ;count+)88.printf(%lf) + (%lf i) n,-polescount.Real_part89.,-polescount.Imag_Part);91.printf(-n);92.Res0.Real_part = poles0.Real_part;Res0.I

20、mag_Part= poles0.Imag_Part;Res1.Real_part = 1;Res1.Imag_Part= 0;for (count_1 = 0;count_1 N-1;count_1+)100.101.for (count = 0;count = count_1 + 2;count+)102.103.if (0 = count)104.105.Complex_Multiple(Rescount, polescount_1+1,106.&(Res_Savecount.Real_part),107.&(Res_Savecount.Imag_Part);9/13108./print

21、f( Res_Save : (%lf) + (%lf i) n ,Res_Save0.Real_part,Res_Save0.Imag_Part);109.110.111.elseif (count_1 + 2) = count)112.113.Res_Savecount.Real_part += Rescount - 1.Real_part;114.Res_Savecount.Imag_Part += Rescount - 1.Imag_Part;115.116.else117.118.Complex_Multiple(Rescount, polescount_1+1,119.&(Res_S

22、avecount.Real_part),120.&(Res_Savecount.Imag_Part);121.122./printf( Res: (%lf) + (%lf i) n ,Rescount -1.Real_part,Rescount - 1.Imag_Part);123./printf( Res_Save : (%lf) + (%lf i) n ,Res_Savecount.Real_part,Res_Savecount.Imag_Part);124.125.Res_Savecount.Real_part += Rescount - 1.Real_part;126.Res_Save

23、count.Imag_Part += Rescount - 1.Imag_Part;127.128./printf( Res_Save : (%lf) + (%lf i) n ,Res_Savecount.Real_part,Res_Savecount.Imag_Part);129.130.131./printf(There n );132.133.134.for(count = 0;count = N;count+)135.136.Rescount.Real_part = Res_Savecount.Real_part;137.Rescount.Imag_Part= Res_Savecoun

24、t.Imag_Part;138.139.*(a + N - count) = Rescount.Real_part;140.141.142./printf(There! n );46.*(b+N) = *(a+N);147.148./-display-/149.printf(bs = );150.for (count = 0;count = N ;count+)151.152.printf(%lf , *(b+count);153.154.printf( n);155.156.printf(as = );157.for (count = 0;count = N ;co

25、unt+)158.159.printf(%lf , *(a+count);160.10/13161.printf( n);162.163.printf(-n);164.165.return( int) 1;169.int Bilinear(int N,170.double*as,double*bs,171.double*az,double*bz)173.int Count = 0,Count_1 = 0,Count_2 = 0,Count_Z = 0;174.doubleResN+1;175.doubleRes_SaveN+1;176.177.for(Count_Z = 0;Count_Z =

26、 N;Count_Z+)178.179.*(az+Count_Z) = 0;180.*(bz+Count_Z) = 0;84.for (Count = 0;Count=N;Count+)185.186.for(Count_Z = 0;Count_Z = N;Count_Z+)187.188.ResCount_Z = 0;189.Res_SaveCount_Z = 0;190.191.Res_Save 0 = 1;192.193.for(Count_1 = 0; Count_1 N-Count;Count_1+)194.195.for (Count_2 = 0; Cou

27、nt_2 = Count_1+1;Count_2+)196.197.if(Count_2 = 0)198.199.ResCount_2 += Res_SaveCount_2;200./printf( Res%d %lf n , Count_2 ,ResCount_2);201.202.203.elseif (Count_2 = (Count_1+1)&(Count_1 != 0)204.205.ResCount_2 += -Res_SaveCount_2 - 1;206./printf( Res%d %lf n , Count_2 ,ResCount_2);207.208.209.else21

28、0.211.ResCount_2 += Res_SaveCount_2 - Res_SaveCount_2 - 1;212./printf( Res%d %lf n , Count_2 ,ResCount_2);16./printf( Res : );217.for (Count_Z = 0;Count_Z= N;Count_Z+)11/13218.219.Res_SaveCount_Z = ResCount_Z ;220.ResCount_Z = 0;221./printf( %d %lf ,Count_Z, Res_SaveCount_Z);222.223./pr

29、intf( n );27.for (Count_1 = (N-Count); Count_1 N;Count_1+)228.229.for(Count_2 = 0; Count_2 = Count_1+1;Count_2+)230.231.if(Count_2 = 0)232.233.ResCount_2 += Res_SaveCount_2;234./printf( Res%d %lf n , Count_2 ,ResCount_2);235.236.237.elseif(Count_2 = (Count_1+1)&(Count_1 != 0)238.239.ResCount_2 += Res_SaveCount_2 - 1;240./printf( Res%d %lf n , Count_2 ,ResCount_2);241.242.243.else244.245.ResCount_2 += Res_SaveCount_2 + Res

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論