Advertisement
Guest User

Untitled

a guest
Jan 22nd, 2020
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MatLab 4.27 KB | None | 0 0
  1.  
  2. clear;
  3. t=0:0.01:1;% wektor z wartosciami od 0 do 1 rosnace o 0.01
  4. X=0.5*sin(2*pi*15*t)+2*sin(2*pi*t)+sin(2*pi*7*t);  %tworzymy sobie sygnal wyjsciowy - suma trzech sinusoid
  5.  
  6. windowSize = 10;
  7. Num = (1/windowSize)*ones(1,windowSize);
  8. load FFR;
  9. Pp1=filter(Num,1,X) ;           %filtr dolnoprzepustowy Fc:10 Hz
  10. load FFR;
  11. Pp2=filter(Num,1,X);            %filtrdolnoprzepustowy Fc: 5 Hz
  12.  
  13.  
  14. Lmax=15;                        %poczatkowo przyjmowany maksymalny rzad macierzy P
  15. N=size(t,2);                    %N - liczba wykorzystanych probek sygnalu
  16.  
  17.  
  18. Ptp=returnPtP(N,Lmax,Pp1,Pp2);    %Ta funkcja zwraca macierz, ktora powstaje z pomnozenia P transpon. z P (czyli PtP)
  19.  
  20.  
  21. [e_vec,e]=eig(Ptp);               %tu szukamy wartosci wlasnych macierzy PtP
  22.                                 %(zmienna e) i jej wektorów wlasnych (zmienna e_vec)
  23.                                 %smienne e i e_vec są macierzami
  24.  
  25. eMax = max(max(e));             %szukamy najwiekszej wartosci wlasnej macierzy PtP
  26.                                 %pierwsze max(e) daje nam wektor z
  27.                                 %najwiekszymi wartościami w kolumnach
  28.                                 %macierzy e, drugie max(max(e)) daje nam
  29.                                 %wartość maxymalną z wektora max(e)
  30.                                                                                        
  31.  
  32. %%%%%%%ponizsza petla wyznacza ile jest wartosci wlasnych macierzy PtP,
  33. %%%%%%%ktore sa wieksze lub równe 5% najwiekszej wartosci wlasnej
  34. k=0;
  35. for i=1:size(e)
  36.    
  37.     if e(i,i)>=0.05*eMax
  38.         k=k+1;
  39.     end
  40.  
  41. end
  42.  
  43. odd_or_not = mod(k,2);
  44.  
  45. %%%%%%%%%%%%%%%Okreslamy nowt rzad macierzy
  46.  
  47. if odd_or_not==1
  48. k=k+1;          %jesli petla zliczy nieparzysta liczbe to zaokraglamy w gore
  49. L=0.5*k;
  50. else
  51. L=0.5*k;        %polowa wartosci wlasnych zliczonych przez powyzsza petle to nowy rzad filtru
  52. end
  53.  
  54. %%%%%%%%%%%%%%%Ponownie liczymy macierz PtP juz majac wlasciwy oszacowany rzad (moze on wyjsc duzo nizszy niz rzeczywisty rzad filtrow)
  55.  
  56. Ph=returnPtP(N,L,Pp1,Pp2);
  57.  
  58. [V,E]=eig(Ph);  % zwraca diagonalna macierz wartosci wlasnych E i macierz V gdzie kolumny macierzy V sa odpowiednimi wektorami wlasnymi, macierzy PtP
  59.  
  60. E_dgl = diag(E);                            %otrzymujemy wektor zawierajacy wartosci z przekatnej macierzy diagonalnej E
  61. Emin=min(E_dgl);                            %szukamy najmniejszej wartosci wlasnej macierzy PtP
  62. [Emin_row,Emin_col]=find(E==Emin,1);        %sprawdzamy jej indeks
  63. h=V(:,Emin_col);                            %z wektora V wybieramy odpowiadajacy wektor wlasny
  64.                                             %to bedzie nasz wektor h
  65.                                              
  66. m=size(h);
  67. h1=h(1:(m/2));                              %dzielimy go sobie po polowie na 2 tak ze pol wektora to h1 a drugie pol to h2
  68.                                            
  69. h2=h(((m/2)+1):m);
  70. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%transponujemy Pp1 i Pp2
  71. Pp1_vec=Pp1';
  72. Pp2_vec=Pp2';
  73. Pp=[Pp1_vec;Pp2_vec];
  74.  
  75. %%%%%%%%%%%%%%%%%%%%%%%%%%%tutaj nizej z wektorow h tworzymy macierze toeplitza
  76. %%%%%%%%%%%%%%%%%%%%%%%%%%%oznaczone duzym H (wpiszcie w wikipedie toeplitz matrix to zobaczycie rozmieszczenie elementow)
  77. c1=zeros(N,1);
  78. c2=zeros(N,1);
  79. r1=zeros(1,N+L-1);
  80. r2=zeros(1,N+L-1);
  81.  
  82. for i=1:(m/2)
  83.     c1(i)=h1(i);                     %tu tworzymy pierwsze kolumny H1 i H2
  84.     c2(1)=h2(i);
  85. end
  86.  
  87.  
  88. r1(1)=c1(1);                        %tu tworzymy pierwsze wiersze H1 i H2
  89. r2(1)=c2(1);
  90. H1=toeplitz(c1,r1);                 %tworzenie macierzy H1 i H2
  91. H2=toeplitz(c2,r2);
  92.  
  93. H=[H1;H2];
  94. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%Metoda najmniejszych kwadratow
  95.  
  96. Nom=H'*Pp;                           %tworzymy licznik
  97. Denom=(H'*H);                        %tworzymy mianownik
  98. Pa=mldivide(Nom,Denom);              %dzielimy przez siebie
  99. Pa=Pa(1:N);                          %czasem trzeba uciąć sygnal do interesującej nas długości stąd ten zapis
  100. Pa_s=Pa*(mean(Pp1)/mean(Pa));        %skalowanie otrzymanego sygnału, żeby miał porownywalną wartość średnią do pomierzonych (wzór A6)
  101.  
  102. plot(t/2,Pa_s,'r');
  103.                        
  104.  
  105.  subplot(2,2,1);plot(t,Pp1);title('FIR1');
  106.  subplot(2,2,2);plot(t,Pp2);title('FIR2');
  107.  subplot(2,2,3);plot(t,X); title('original');
  108.  subplot(2,2,4);plot(t,Pa_s,'r');title('reconstructed');
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement