Advertisement
Guest User

scilab

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