Advertisement
Guest User

scilab

a guest
May 29th, 2018
336
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scilab 7.13 KB | None | 0 0
  1. //BcIb4
  2. //порядок 4
  3. //фильтр баттерворта - каскадная схема из прямых форм
  4. //фильтр Чебышева II рода, прямая форма II (каноническая)
  5. //_______________________________________________________
  6. //Модельный сигнал
  7. N=1024;
  8. dT=0.01;
  9. x=0:dT:N*dT;
  10. sig=0.7*sin(2*%pi*2*x)+0.35*cos(2*%pi*4*x);
  11. y=sig+grand(1, (N+1), "nor", 0, 0.2);
  12. clf(0);
  13. scf(0);
  14. subplot(211);
  15. plot2d(x,y);
  16. xtitle("График модельного сигнала","Время t, с", "Амплитуда, ед.");
  17. //Спектр модельного сигнала
  18. spectr = abs(fft(y));
  19. dW = 1/(dT*N); //Шаг по частота
  20. W=0:dW:1/dT; //Диапазон частот
  21. _W_ = length(W);
  22. _spectr_=length(spectr);
  23. subplot(212);
  24. plot2d(W(1:_W_/2),spectr(1:_spectr_/2)); //Делим для вывода спектра до частоты Найквиста
  25. xtitle('Спектр сигнала','Частота f, Гц','Амплитуда, ед.');
  26. //Аналоговые фильтры
  27. hsButt=analpf(4, 'butt', [0 0], 0.3*2/dT); //строим вид передаточной функции для фильров
  28. hsCheb2=analpf(4,'cheb2',[0.1 0.1],0.3*2/dT);
  29. ls_Butt=syslin('c', hsButt); //задаём линейную систему
  30. ls_Cheb2=syslin('c', hsCheb2);
  31. scf(1);
  32. clf(1);
  33. bode(ls_Butt); //Диаграмма Боде для полученной линейной системы
  34. xtitle("АЧХ и ФЧХ фильтра Баттерворта");
  35. scf(2);
  36. clf(2);
  37. bode(ls_Cheb2);
  38. xtitle("АЧХ и ФЧХ фильтра Чебышёва II рода");
  39. //Обработка спектра сигнала фильтрами
  40. FButt=repfreq(ls_Butt,W);
  41. FCheb2=repfreq(ls_Cheb2,W);
  42. SpectrButt=fft(y).*FButt;//Обработка спектра
  43. SpectrCheb2=fft(y).*FCheb2;
  44. scf(3);
  45. clf(3);
  46. subplot(311);
  47. plot2d(W(1:_W_/2),spectr(1:_spectr_/2));
  48. xtitle("Спектр сигнала до фильтрации","f", "A")
  49. subplot(312)
  50. plot2d(W(1:_W_/2),abs(SpectrButt(1:_spectr_/2)))
  51. xtitle("Спектр сигнала после фильтра Баттерворта","f", "A")
  52. subplot(313)
  53. plot2d(W(1:_W_/2),abs(SpectrCheb2(1:_W_/2)))
  54. xtitle("Спектр сигнала после фильтра Чебышёва II рода","f", "A")
  55. //Обратноe прeобразованиe обработанного спeктра
  56. reverseButt=real(ifft(SpectrButt)); //Восстановление из спектра
  57. reverseCheb2=real(ifft(SpectrCheb2));
  58. reverseButt=reverseButt/max(reverseButt); //Нормировка по максимальному значению
  59. reverseCheb2=reverseCheb2/max(reverseCheb2);
  60. clf(4);
  61. scf(4);
  62. subplot(311);
  63. plot2d(x, (y/max(abs(y))));
  64. xtitle("Сигнал до фильтрации","t", "А");
  65. subplot(312);
  66. plot2d(x, reverseButt)
  67. xtitle("Сигнал после фильтра Баттерворта","t", "А")
  68. subplot(313)
  69. plot2d(x, reverseCheb2)
  70. xtitle("Сигнал после фильтра Чебышёва II рода","t", "А")
  71. //Переходим к цифровым фильтрам
  72. D_hsButt=iir(4,'lp','butt',[0.3 0], [0 0]);
  73. //                                      2            3            4  
  74. //   0.1671793 + 0.6687171z + 1.0030756z + 0.6687171z + 0.1671793z  
  75. //   --------------------------------------------------------------  
  76. //                                          2            3   4      
  77. //       0.0301189 + 0.1826757z + 0.6799785z + 0.7820952z + z  
  78. D_hsCheb2=iir(4,'lp','cheb2',[0.3 0], [0.1 0.1]);
  79. //                                      2            3            4  
  80. //   0.2727433 + 0.6738200z + 0.8994179z + 0.6738200z + 0.2727433z  
  81. //   --------------------------------------------------------------  
  82. //                                          2            3   4      
  83. //       0.0780474 + 0.2898983z + 0.8045473z + 0.6200515z + z          
  84. [F_Butt,D_butt]=repfreq(D_hsButt,0,0.5);
  85. clf(5);scf(5);
  86. subplot(211);
  87. plot2d(F_Butt*100,abs(D_butt));
  88. xtitle("АЧХ дискретного фильтра Баттерворта","Частота (Гц)", "Амплитуда");
  89. //https://help.scilab.org/doc/5.5.2/en_US/dbphi.html
  90. [db,phi]=dbphi(D_butt);
  91. subplot(212);
  92. plot2d(F_Butt*100, phi);
  93. xtitle("ФЧХ дискретного фильтра Баттерворта","Частота (Гц)", "Фаза (Град)");
  94. [F_Cheb2,D_Cheb2]=repfreq(D_hsCheb2,0,0.5);
  95. clf(6);scf(6);
  96. subplot(211);
  97. plot2d(F_Cheb2*100,abs(D_Cheb2));
  98. xtitle("АЧХ дискретного фильтра Чебышёва II рода","Частота (Гц)", "Амплитуда");
  99. [db,phi]=dbphi(D_Cheb2);
  100. subplot(212);
  101. plot2d(F_Cheb2*100,phi)
  102. xtitle("ФЧХ дискретного фильтра Чебышёва II рода","Частота (Гц)", "Фаза (Град)");
  103.  
  104.  
  105. //каскадная схема из прямых форм для баттерфорда
  106. //вторая строка коэффициентов с обратным знаком
  107. //в соответсвии со схемой - учитываем знаки и берем обратные
  108. c=factors(D_hsButt(3))
  109. c1=coeff(c(1));
  110. c2=coeff(c(2));
  111. dButtsig=y
  112. dButtsig2=y
  113. G1=1
  114. G2=1
  115. for i=3:N
  116.     dButtsig(i)=G1*y(i)+2*G1*y(i-1)+G1*y(i-2)-c1(2)*dButtsig(i-1)-c1(1)*dButtsig(i-2)
  117.     dButtsig2(i)=G2*dButtsig(i)+2*G2*dButtsig(i-1)+G2*dButtsig(i-2)-c2(2)*dButtsig2(i-1)-c2(1)*dButtsig2(i-2)
  118. end
  119.  
  120. //прямая схема (прямая форма II) каноническая для фильтра Чебышева II рода
  121. //определение числителя и знаменателя
  122. a = coeff(D_hsCheb2(3));
  123. b = coeff(D_hsCheb2(2));
  124. //
  125. yc_d = zeros(1,length(y)+5);
  126. v = zeros(1,length(y)+5);
  127. //реализуем схему
  128. for i=6:N
  129.     v(i) = y(i) - (a(4)*v(i-1) + a(3)*v(i-2) + a(2)*v(i-3) + a(1)*v(i-4));
  130.     yc_d(i) = b(5)*v(i-1) + b(4)*v(i-2) + b(3)*v(i-3) +..
  131.               b(2)*v(i-4) + b(1)*v(i-5);
  132. end
  133.  
  134. dButtsig2=dButtsig2/max(dButtsig2);
  135. Yc_d=yc_d/max(yc_d);
  136. //Спектр сигнала
  137.  
  138. //Yc_d = fftshift(abs(fft(yc_d)));
  139. SdButtsig2=fft(dButtsig2)
  140. SYc_d = fft(Yc_d);
  141. clf(7)
  142. scf(7)
  143. subplot(311)
  144. plot2d(W(1:_W_/2),spectr(1:_spectr_/2))
  145. xtitle("Спектр сигнала до фильтрации","f", "А")
  146. subplot(312)
  147. plot2d(W(1:_W_/2),abs(SdButtsig2(1:_W_/2)))
  148. xtitle("Спектр сигнала после фильтра Баттерворта каскадной формы","f", "А");
  149. subplot(313)
  150. plot2d(W(1:_W_/2),abs(SYc_d(1:_W_/2)))
  151. xtitle("Спектр сигнала после фильтра Чебышева II рода","f", "А");
  152.  
  153. //Сигнал после фильтрации
  154. clf(8)
  155. scf(8)
  156. subplot(311)
  157. plot2d(x,(y/max(abs(y))))
  158. xtitle("Исходный сигнал","t", "А")
  159. subplot(312)
  160. plot2d(x(1:length(dButtsig2)),dButtsig2)
  161. xtitle("Сигнал после обработки цифровым фильтром Баттерворта каскадной формы","t", "А")
  162. subplot(313)
  163. //plot2d(x(1:length(Yc_d)),Yc_d)
  164. //plot2d(x,(6:length(SYc_d)),Yc_d)
  165. plot2d(x,(6:length(Yc_d)),Yc_d)
  166. xtitle("Сигнал после обработки цифровым фильтром Чебышева","t", "А")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement