




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、1. 模擬濾波器的設計 1.1巴特沃斯濾波器的次數 根據給定的參數設計模擬濾波器,然后進行變數變換,求取數字濾波器的方法,稱為濾波器的間接設計。做為數字濾波器的設計基礎的模擬濾波器,稱之為原型濾波器。這里,我們首先介紹的是最簡單最基礎的原型濾波器,巴特沃斯低通濾波器。由于IIR濾波器不具有線性相位特性,因此不必考慮相位特性,直接考慮其振幅特性。 在這里,N是濾波器的次數,c是截止頻率。從上式的振幅特性可以看出,這個是單調遞減的函數,其振幅特性是不存在
2、紋波的。設計的時候,一般需要先計算跟所需要設計參數相符合的次數N。首先,就需要先由阻帶頻率,計算出阻帶衰減將巴特沃斯低通濾波器的振幅特性,直接帶入上式,則有最后,可以解得次數N為當然,這里的N只能為正數,因此,若結果為小數,則舍棄小數,向上取整。 1.2巴特沃斯濾波器的傳遞函數 巴特沃斯低通濾波器的傳遞函數,可由其振幅特性的分母多項式求得。其分母多項式根據S解開,可以得到極點。這里,為了方便處理,我們分為兩種情況去解這個方程。當N為偶數的時候,這里,使用了歐拉公式。同樣的,當N為奇數的時候
3、,同樣的,這里也使用了歐拉公式。歸納以上,極點的解為上式所求得的極點,是在s平面內,在半徑為c的圓上等間距的點,其數量為2N個。為了使得其IIR濾波器穩定,那么,只能選取極點在S平面左半平面的點。選定了穩定的極點之后,其模擬濾波器的傳遞函數就可由下式求得。 1.3巴特沃斯濾波器的實現(C語言) 首先,是次數的計算。次數的計算,我們可以由下式求得。 其對應的C語言程序為cpp view plaincop
4、y1. N = Ceil(0.5*( log10 ( pow (10, Stopband_attenuation/10) - 1) / 2. log10 (Stopband/Cotoff) ); 然后是極點的選擇
5、,這里由于涉及到復數的操作,我們就聲明一個復數結構體就可以了。最重要的是,極點的計算含有自然指數函數,這點對于計算機來講,不是太方便,所以,我們將其替換為三角函數,這樣的話,實部與虛部就還可以分開來計算。其代碼實現為cpp view plaincopy1. typedef struct 2. 3. double Real_part; 4. double Imag_Part;
6、0; 5. COMPLEX; 6. 7. 8. COMPLEX polesN; 9. 10. for(k = 0;k <= (2*N)-1) k+) 11. 12. if(Cotoff*cos(k+dk)*(pi/N) < 0) 13.
7、160; 14. polescount.Real_part = -Cotoff*cos(k+dk)*(pi/N); 15. polescount.Imag_Part= -Cotoff*sin(k+dk)*(pi/N); 16.
8、 count+; 17. if (count = N) break; 18. 19. 計算出穩定的極點之后,就可以進行傳遞函數的計算了。傳遞的函數的計算,就像下式一樣這里,為了得到模擬濾波
9、器的系數,需要將分母乘開。很顯然,這里的極點不一定是整數,或者來說,這里的乘開需要做復數運算。其復數的乘法代碼如下,cpp view plaincopy1. int Complex_Multiple(COMPLEX a,COMPLEX b, 2. double *Res_Real,double *Res_Imag
10、) 3. 4. 5. *(Res_Real) = (a.Real_part)*(b.Real_part) - (a.Imag_Part)*(b.Imag_Part); 6. *(Res_Imag)= (a.Imag_P
11、art)*(b.Real_part) + (a.Real_part)*(b.Imag_Part); 7. return (int)1; 8. 有了乘法代碼之后,我們現在簡單的情況下,看看其如何計算其濾波器系數。我們做如下假設這個時候,其傳遞函數為將其乘開,其大致的關系就像下圖所示一樣。計算的關系一目了然,這樣的話,實現就簡單多了。高階的情況下也一樣,重復這種計算就可以了。其代碼為
12、cpp view plaincopy1. Res0.Real_part = poles0.Real_part; 2. Res0.Imag_Part= poles0.Imag_Part; 3. Res1.Real_part = 1; 4. Res1.Imag_Part= 0; 5. 6. for(count_1 = 0;cou
13、nt_1 < N-1;count_1+) 7. 8. for(count = 0;count <= count_1 + 2;count+) 9. 10. if(0 = count) 11. 12.
14、0; Complex_Multiple(Rescount, polescount_1+1, 13. &(Res_Savecount.Real_part), 14.
15、160; &(Res_Savecount.Imag_Part); 15. 16. else if(count_1 + 2) = count
16、) 17. 18. Res_Savecount.Real_part += Rescount - 1.Real_part; 19. Res_Savecount.Imag_Part += Rescount
17、0;- 1.Imag_Part; 20. 21. else 22. 23. Complex_Multiple(Re
18、scount, polescount_1+1, 24. &(Res_Savecount.Real_part), 25.
19、; &(Res_Savecount.Imag_Part); 26. 1 Res_Savecount.Real_part += Rescount - 1.Real_part; 27. Res_Savecount.I
20、mag_Part += Rescount - 1.Imag_Part; 28. 29. 30. *(b+N) = *(a+N); 到此,我們就可以得到一個模擬濾波器巴特沃斯低通濾波器了。2.雙1次z變換 2.1雙1次z變換的原理 我們為了將模擬濾波器轉換為數字濾波器的,可以用的方法很多。這里著重說說雙1次
21、z變換。我們希望通過雙1次z變換,建立一個s平面到z平面的映射關系,將模擬濾波器轉換為數字濾波器。 和之前的例子一樣,我們假設有如下模擬濾波器的傳遞函數。將其做拉普拉斯逆變換,可得到其時間域內的連續微分方程式,其中,x(t)表示輸入,y(t)表示輸出。然后我們需要將其離散化,假設其采樣周期是T,用差分方程去近似的替代微分方程,可以得到下面結果然后使用z變換,再將其化簡。可得到如下結果從而,我們可以得到了s平面到z平面的映射關系,即由于所有的高階系統都可以視為一階系統的并聯,所以,這個映射關系在高階系統中,也是成立的。然后,將關系式帶入上式,
22、可得到這里,我們可以就可以得到與的對應關系了。 這里的與的對應關系很重要。我們最終的目的設計的是數字濾波器,所以,設計時候給的參數必定是數字濾波器的指標。而我們通過間接設計設計IIR濾波器時候,首先是要設計模擬濾波器,再通過變換,得到數字濾波器。那么,我們首先需要做的,就是將數字濾波器的指標,轉換為模擬濾波器的指標,基于這個指標去設計模擬濾波器。另外,這里的采樣時間T的取值很隨意,為了方便計算,一般取1s就可以。 2.2雙1次z變換的實現(C語言) &
23、#160; 我們設計好的巴特沃斯低通濾波器的傳遞函數如下所示。 我們將其進行雙1次z變換,我們可以得到如下式子可以看出,我們還是需要將式子乘開,進行合并同類項,這個跟之前說的算法相差不大。其代碼為。cpp view plaincopy1. for(Count = 0;Count<=N;Count+) 2. 3.
24、0; for(Count_Z = 0;Count_Z <= N;Count_Z+) 4. 5.
25、60; ResCount_Z = 0; 6. Res_SaveCount_Z = 0; 7. 8.
26、; Res_Save 0 = 1; 9. for(Count_1 = 0; Count_1 < N-Count;Count_1+) 10.
27、0; 11. for(Count_2 = 0; Count_2 <= Count_1+1;Count_2+) 12.
28、; 13. if(Count_2 = 0) ResCount_2 += Res_SaveCount_2; 14.
29、0; else if(Count_2 = (Count_1+1)&&(Count_1 != 0) 15. ResCount_2
30、160;+= -Res_SaveCount_2 - 1; 16. else ResCount_2 += Res_SaveCount_2 - Res_SaveCount_2 - 1; 17. for(Cou
31、nt_Z = 0;Count_Z<= N;Count_Z+) 18. 19. Res_SaveCo
32、unt_Z = ResCount_Z 20. ResCount_Z = 0; 21.
33、; 22. 23. for(Count_1 = (N-Count); Count_1 < N;Count_1+) &
34、#160;24. 25. for(Count_2 = 0; Count_2 <= Cou
35、nt_1+1;Count_2+) 26. 27. if(Count_2 = 0)
36、;ResCount_2 += Res_SaveCount_2; 28. else if(Count_2 = (Count_1+1)&&(Count_1 != 0) 29.
37、; ResCount_2 += Res_SaveCount_2 - 1; 30. else
38、60; 31. ResCount_2 += Res_SaveCount_2 + Res_SaveCount_2 - 1; 32.
39、60; 33. for(Count_Z = 0;Count_Z<= N;Count_Z+) 34.
40、 35. Res_SaveCount_Z = ResCount_Z 36.
41、160; ResCount_Z = 0; 37. 38.
42、; 39. for(Count_Z = 0;Count_Z<= N;Count_Z+) 40. 41.
43、0; *(az+Count_Z) += pow(2,N-Count) * (*(as+Count) * 42. Res_SaveCount_Z; 43.
44、60; *(bz+Count_Z) += (*(bs+Count) * Res_SaveCount_Z; 44. 45.
45、; 到此,我們就已經實現了一個數字濾波器。3.IIR濾波器的間接設計代碼(C語言)cpp view plaincopy1. #include <stdio.h> 2. #include <math.h> 3. #include <malloc.h> 4. #include <string.h> 5. 6. 7. #de
46、fine pi (double)3.1415926) 8. 9. 10. struct DESIGN_SPECIFICATION 11. 12. double Cotoff; 13. doubl
47、e Stopband; 14. double Stopband_attenuation; 15. ; 16. 17. typedef struct 18. 19. double Real_part; 20. double Imag_Pa
48、rt; 21. COMPLEX; 22. 23. 24. 25. int Ceil(double input) 26. 27. if(input != (int)input) return (int)input) +1; 28.
49、0; else return (int)input); 29. 30. 31. 32. int Complex_Multiple(COMPLEX a,COMPLEX b 33.
50、60; ,double *Res_Real,double *Res_Imag) 34. 35. 36. *(Res_Real) = (a.Rea
51、l_part)*(b.Real_part) - (a.Imag_Part)*(b.Imag_Part); 37. *(Res_Imag)= (a.Imag_Part)*(b.Real_part) + (a.Real_part)*(b.Imag_Part); 38. return (int)1
52、; 39. 40. 41. 42. int Buttord(double Cotoff, 43. double Stopband, 44.
53、160; double Stopband_attenuation) 45. 46. int N; 47. 48. printf("Wc = %lf rad/sec n" ,Cotoff);
54、160;49. printf("Ws = %lf rad/sec n" ,Stopband); 50. printf("As = %lf dB n" ,Stopband_attenuation); 51. printf("-n"
55、 ); 52. 53. N = Ceil(0.5*( log10 ( pow (10, Stopband_attenuation/10) - 1) / 54.
56、; log10 (Stopband/Cotoff) ); 55. 56. 57. return (int)N; 58. 59. 60. 61. int Butter(int N, dou
57、ble Cotoff, 62. double *a, 63. double *b) 64. 65.
58、0; double dk = 0; 66. int k = 0; 67. int count = 0,count_1 = 0; 68. COMPLEX polesN; 69. C
59、OMPLEX ResN+1,Res_SaveN+1; 70. 71. if(N%2) = 0) dk = 0.5; 72. else dk = 0; 73. 74. for(k = 0;k <= (2*N)
60、-1) k+) 75. 76. if(Cotoff*cos(k+dk)*(pi/N) < 0) 77. 78.
61、 polescount.Real_part = -Cotoff*cos(k+dk)*(pi/N); 79. polescount.Imag_Part= -Cotoff*sin(k+dk)*(pi/N); 80.
62、160; count+; 81. if (count = N) break; 82. 83.
63、160; 84. 85. printf("Pk = n" ); 86. for(count = 0;count < N count+) 87.
64、0; 88. printf("(%lf) + (%lf i) n" ,-polescount.Real_part 89.
65、160; ,-polescount.Imag_Part); 90. 91. printf("-n" ); 92.
66、60; 93. Res0.Real_part = poles0.Real_part; 94. Res0.Imag_Part= poles0.Imag_Part; 95. 96. Res1.Real_part = 1; 97
67、. Res1.Imag_Part= 0; 98. 99. for(count_1 = 0;count_1 < N-1;count_1+) 100. 101. for(count
68、= 0;count <= count_1 + 2;count+) 102. 103. if(0 = count) 104.
69、0; 105. Complex_Multiple(Rescount, polescount_1+1, 106. &
70、#160; &(Res_Savecount.Real_part), 107. &
71、#160; &(Res_Savecount.Imag_Part); 108. /printf( "Res_Save : (%lf) +
72、160;(%lf i) n" ,Res_Save0.Real_part,Res_Save0.Imag_Part); 109. 110. 111. else
73、 if(count_1 + 2) = count) 112. 113. Res_Sa
74、vecount.Real_part += Rescount - 1.Real_part; 114. Res_Savecount.Imag_Part += Rescount - 1.Imag_Part; 115.
75、 116. else 117.
76、0; 118. Complex_Multiple(Rescount, polescount_1+1, 119. &
77、#160; &(Res_Savecount.Real_part), 120. &
78、#160; &(Res_Savecount.Imag_Part); 121. 122. /printf( "Res
79、60; : (%lf) + (%lf i) n" ,Rescount - 1.Real_part,Rescount - 1.Imag_Part); 123. /print
80、f( "Res_Save : (%lf) + (%lf i) n" ,Res_Savecount.Real_part,Res_Savecount.Imag_Part); 124. 125.
81、 Res_Savecount.Real_part += Rescount - 1.Real_part; 126. Res_Savecount.Imag_Part += Rescount
82、- 1.Imag_Part; 127. 128. /printf( "Res_Save : (%lf) + (%lf i) n&
83、quot; ,Res_Savecount.Real_part,Res_Savecount.Imag_Part); 129. 130. 131.
84、160; /printf("There n" ); 132. 133. 134. for(count = 0;count <= N;c
85、ount+) 135. 136. Rescount.Real_part = Res_Savecount.Real_part; 137.
86、160; Rescount.Imag_Part= Res_Savecount.Imag_Part; 138. 139.
87、60; *(a + N - count) = Rescount.Real_part; 140. 141. 142.
88、0;/printf("There! n" ); 143. 144. 145. 146. *(b+N) = *(a+N); 147. 14
89、8. /-display-/ 149. printf("bs = " ); 150. for(count = 0;count <= N count+) 151. &
90、#160; 152. printf("%lf ", *(b+count); 153. 154. printf(" n" ); 155.
91、60;156. printf("as = " ); 157. for(count = 0;count <= N count+) 158. 159. &
92、#160; printf("%lf ", *(a+count); 160. 161. printf(" n" ); 162. 163. printf("-n
93、" ); 164. 165. return (int) 1; 166. 167. 168. 169. int Bilinear(int N, 170.
94、; double *as,double *bs, 171. double *az,double *bz) 172. 173. int Count =&
95、#160;0,Count_1 = 0,Count_2 = 0,Count_Z = 0; 174. double ResN+1; 175. double Res_SaveN+1; 176. 177. fo
96、r(Count_Z = 0;Count_Z <= N;Count_Z+) 178. 179. *(az+Count_Z) = 0; 180.
97、 *(bz+Count_Z) = 0; 181. 182. 183. 184. for(Count = 0;Count<=N;Count+) 185.
98、 186. for(Count_Z = 0;Count_Z <= N;Count_Z+) 187. 188.
99、160; ResCount_Z = 0; 189. Res_SaveCount_Z = 0; 190.
100、60; 191. Res_Save 0 = 1; 192. 193. for(Count_1 =
101、 0; Count_1 < N-Count;Count_1+) 194. 195. for(Count_2 = 0; Count_2 <= Count_1+1;Co
102、unt_2+) 196. 197. if(Count_2 = 0)
103、 198. 199. ResCount_2 += Re
104、s_SaveCount_2; 200. /printf( "Res%d %lf n" , Count_2 ,ResCount_2); 201.
105、0; 202. 203. else if(Count_2 = (Count_1+1)&&(Count_1 != 0)
106、 204. 205. ResCount_2 +=
107、160;-Res_SaveCount_2 - 1; 206. /printf( "Res%d %lf n&qu
108、ot; , Count_2 ,ResCount_2); 207. 208. 209.
109、60;else 210. 211. ResCoun
110、t_2 += Res_SaveCount_2 - Res_SaveCount_2 - 1; 212. /printf( "Res%d %lf n" , Count_2 ,ResCount
111、_2); 213. 214.
112、0; 215. 216. /printf( "Res : "); 217.
113、;for(Count_Z = 0;Count_Z<= N;Count_Z+) 218. 219.
114、Res_SaveCount_Z = ResCount_Z 220. ResCount_Z = 0; 221.
115、; /printf( "%d %lf " ,Count_Z, Res_SaveCount_Z); 222. 223.
116、0; /printf(" n" ); 224. 225. 226. 22
117、7. for(Count_1 = (N-Count); Count_1 < N;Count_1+) 228. 229.
118、60; for(Count_2 = 0; Count_2 <= Count_1+1;Count_2+) 230. 231.
119、160; if(Count_2 = 0) 232. 233.
120、60; ResCount_2 += Res_SaveCount_2; 234. /printf( "Res%
121、d %lf n" , Count_2 ,ResCount_2); 235. 236. 237. &
122、#160; else if(Count_2 = (Count_1+1)&&(Count_1 != 0) 238. 239.
123、60; ResCount_2 += Res_SaveCount_2 - 1; 240.
124、0; /printf( "Res%d %lf n" , Count_2 ,ResCount_2); 241. 242.
125、0;243. else 244. 245.
126、60; ResCount_2 += Res_SaveCount_2 + Res_SaveCount_2 - 1; 246.
127、 /printf( "Res%d %lf n" , Count_2 ,ResCount_2); 247.
128、; 248. 249. 250. / printf( "
129、Res : "); 251. for(Count_Z = 0;Count_Z<= N;Count_Z+) 252. 253.
130、160; Res_SaveCount_Z = ResCount_Z 254. &
131、#160; ResCount_Z = 0; 255. /printf( "%d %lf " ,Count_Z, Res_SaveCount_Z); 256.
132、; 257. /printf(" n" ); 258.
133、160; 259. 260. 261. /printf( "Res : "); 262. for(Count_Z = 0;Count_Z<= N;Count_
134、Z+) 263. 264. *(az+Count_Z) += pow(2,N-Count) * (*(as+Count) *
135、0;Res_SaveCount_Z; 265. *(bz+Count_Z) += (*(bs+Count) * Res_SaveCount_Z; 266.
136、 /printf( " %lf " ,*(bz+Count_Z); 267. 268.
137、 /printf(" n" ); 269. 270. 271. 272. 273. 274. for(Count_Z =&
138、#160;N;Count_Z >= 0;Count_Z-) 275. 276. *(bz+Count_Z) = (*(bz+Count_Z)/(*(az+0); 277. *(az+Count_Z) = (*(az+Count_Z)/(*(az+0); 278. 279.
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 八年級物理下冊 7.2力的描述教學實錄 (新版)教科版
- 形容詞的使用(教學設計)-2023-2024學年譯林版(三起)英語六年級下冊
- 川教版(2019)小學信息技三年級上冊第二單元第4節《多樣的輸入方式》教學設計及反思
- 企業人才激勵與培訓機制
- 健康心理建設緩解生活壓力
- 2024-2025學年高中英語 Module 1 My First Day at Senior High Listening and vocabulary教學實錄 外研版必修1
- 兒童服裝店營銷活動策劃指南
- 人口結構變化對經濟發展的影響試題及答案
- 消防設施使用注意事項總結試題及答案
- 獸醫行業監管挑戰試題及答案
- 食品行業安全監管與溯源方案
- 書籍設計出版合同范本
- 2025年法律文書考試試題及答案
- 2025年安慶醫藥高等專科學校單招職業適應性考試題庫完美版
- 2024年東營市技師學院招聘工作人員考試真題
- 智能科學與技術專業建設思路
- 2023年全國高考體育單招考試英語卷試題真題(含答案詳解)
- 血液透析專科考試題+參考答案
- 2024 ESC慢性冠脈綜合征指南解讀(全)
- 2024年湖北省中考地理生物試卷(含答案)
- 第一次月考測試卷(試題)-2023-2024學年人教版六年級數學下冊
評論
0/150
提交評論