Szybka transformata Fouriera
Transkrypt
Szybka transformata Fouriera
7. Szybka transformata Fouriera fft Dane pomiarowe sygnałów napięciowych i prądowych często obarczone są dużym błędem, wynikającym z istnienia tak zwanego szumu. Jedną z metod wspomagających analizę sygnałów jest szybka transformata Fourier'a [1]. Metoda umożliwia wydzielenie z analizowanego sygnału częstotliwości i amplitud sygnałów składowych. Wynika to z założenia, że każdy sygnał można aproksymować złożeniem sygnałów sinusoidalnych o określonych częstotliwościach. W środowiskach obliczeniowych, takich jak Matlab czy Scilab, zostały zaimplementowane funkcje realizujące metodę szybkiej transformaty Fourier'a [3]. W programie Scilab jest to funkcja fft. Analiza sygnału funkcją fft umożliwia uzyskanie informacji o amplitudach i częstotliwościach sygnałów sinusoidalnych budujących analizowany sygnał. W efekcie możliwe jest łatwe odfiltrowanie szumu i uzyskanie "czystego" sygnału do dalszej analizy. 7.1. Funkcje szybkiej transformaty Fouriera w Scilab'ie Podstawową funkcją analizy Fourier'owskiej jest funkcja fft, której podstawową składnię zapisano poniżej [2], [4], x=fft(a) gdzie: x - wektor lub macierz (rzeczywisty lub zespolony) przekształcenia Fouriera, a - wektor lub macierz (rzeczywisty lub zespolony) analizowanego sygnału – okres lub wielokrotność okresu. Podstawowe zastosowanie funkcji szybkiej transformaty Fourier'a pokazany w skrypcie zapisanym poniżej i rysunku 7.1. W przykładzie analizowany jest sygnał z "szumem". W sygnale przetworzonym szybką transformatą Fourier'a zauważyć można symetryczne rozłożenie impulsów odpowiadających poszczególnym harmonicznym sygnału. Wystarczy więc analizować połowę wektora wynikowego funkcji fft [5]. clear;clc;clf; f=50; //częstotliwość podstawowa N=200; //liczba próbek na okres Q=2; //liczba okresów w=2*%pi*f; for k=1:Q*N+1 //generowanie sygnału i kroków czasowych t(k)=(k-1)/(f*N); x(k)=(5*sin(w*t(k)-0.5*%pi) + 2*sin(3*w*t(k)+0.5*%pi))*(1+0.2*rand()); end X = fft(x); //transformata Fourier’a subplot(211); plot2d(t, x); subplot(212); plot2d(X,rect=[0,-1200,Q*N+1,500]); Uzyskane wyniki nie pozwalają bezpośrednio uzyskać informacji o amplitudzie, fazie i częstotliwości analizowanego sygnału. Konieczne jest przekształcenie wektora wynikowego w celu uzyskania informacji o amplitudzie i fazie oraz wygenerowanie zbieżnego z nim wektora częstotliwości w celu określenia częstotliwości analizowanego sygnału. Rys. 7.1. Przebieg analizowanego sygnału i odpowiadającej mu transformaty Zespolony wektor uzyskany po przetworzeniu sygnału przez funkcję szybkiej transformaty Fouriera’a zawiera informacje o amplitudzie, fazie, a znając częstotliwość próbkowania lub czas pomiędzy poszczególnymi pomiarami analizowanego sygnału możliwe jest wyznaczenie wektora częstotliwości i określenie na jego podstawie częstotliwości poszczególnych harmonicznych Amplitudy poszczególnych harmonicznych można określić z modułu macierzy przetworzonego sygnału, liczby próbek zawartych w tym wektorze N oraz liczbie okresów sygnału Q, jak pokazano na rysunku 7.2 plot2d(abs(X)/(Q*N/2)); Rys. 7.2. Przebieg zmodyfikowanego sygnału transformaty Kolejnym etapem jest utworzenie wektora częstotliwości zgodnego z uzyskaną transformatą, jak pokazano na rysunku 7.3. Skalę częstotliwościową wyznacza się z wykorzystanie informacji o częstotliwości próbkowania sygnału oraz liczbie próbek w analizowanym wektorze analizowanego sygnału. f_p=1/(t(2)-t(1)); //częstotliwość próbkowania fw=(f_p/(Q*N+1))*(0:Q*N); //wektor częstotliwości Rys. 7.3. Spektrum częstotliwościowe analizowanego sygnału Ze względu na symetrię rozkładu amplitud, oraz po analizie otrzymanego przebiegu widać że wystarczy przeanalizować dane do częstotliwości około 500Hz, jak pokazano na rysunku 7.4. Rys. 7.4. Ograniczone spektrum częstotliwościowe analizowanego sygnału Zauważyć można dwa piki, pierwszy o amplitudzie 5.54 i częstotliwości 50Hz odpowiada pierwszej harmonicznej analizowanego sygnału, oraz drugi mniejszy o amplitudzie 2.23 i częstotliwości 150Hz odpowiadający trzeciej harmonicznej sygnału. W analogiczny sposób można określić kąty fazowe wyznaczonych sygnałów. Wartość kąta zawarta jest w wartości zespolonej wektora odwróconej transformaty Fourier’a. a=real(X); b=imag(X); phaz=atan(b,a)+%pi/2; phaz_st=phaz*180/%pi; Analizując uzyskane wyniki, określono fazę pierwszej harmonicznej na -89o, a trzecie na 93o. Porównując uzyskane wyniki z wartościami zadanego sygnału można zauważyć pewne rozbieżności które są konsekwencją zadanego szumu. 7.2. Zadanie Przeanalizować sygnał podany przez prowadzącego ćwiczenia. Określić amplitudy, fazy i częstotliwości składowych sygnału. Wykreślić przebieg analizowanego sygnału i sygnału odczytanego z analizy fourierowskiej sygnału. Przedstawić w sposób graficzny amplitudy i fazy poszczególnych harmonicznych sygnału. Określić procentową wartość szumu. Skrypt zadaniowy można zaprogramować zgodnie z wytycznymi pokazanymi na diagramie z rysunku 7.5. Pobranie danych wejściowych z pliku xls Wykreślić przebieg analizowanego sygnału N Przypisanie danych wejściowych do wektorów czasu i sygnału (t, F) Określenie częstotliwości próbkowania Sprawdzenie liczby próbek (liczby danych wejściowych N) Wyznaczenie odwrotnej transformaty Fourier’a analizowanego sygnału F_od=fft(F) Wykreślić przebieg wyznaczonego sygnału Zaprezentować graficzne amplitudy i fazy poszczególnych harmonicznych (wykres słupkowy) Podać wartości liczbowe: Przeprowadzić filtrowanie F_od, wyznaczyć wartości maksymalne Numery harmonicznych Częstotliwości harmonicznych Amplitudy harmonicznych Określić liczbę harmonicznych Wyznaczyć częstotliwości, Fazy harmonicznych amplitudy i kąty fazowe poszczególnych harmonicznych Rys. 7.5. Diagram skryptu realizującego zadanie analizy sygnału wejściowego Zadany sygnał pomiarowy, będący podstawą analizy, zapisany jest w postaci pliku Excel’a. Scilab dostarcza narzędzi umożliwiających pobranie danych z arkusza *.xls. [fd,SST,Sheetnames,Sheetpos] = xls_open('nazwa'); Podpięcie pliku Excel’a do zmiennej plikowej fd. [Value,TextInd] = xls_read(fd,Sheetpos(1)); Przypisanie do zmiennej Value danych z pierwszego arkusza pliku Excel’a. mclose(fd); Zamknięcie dostępu do pliku poprzez skasowanie zmiennej fd. W trakcie pracy nad zadaniem przy analizowaniu wektorów danych przydatne mogą być polecenia: max(A); - wyszukuje maksymalna wartość przechowywaną w macierzy A min(A); - wyszukuje minimalną wartość przechowywaną w macierzy A X=find(A>3); - wyszukuje wartości z macierzy A większe od 3 i przypisuje ich współrzędne (indeksy) w macierzy A do wektora X size(A); - podaje liczbę elementów macierzy A round(X); - zwraca przybliżenie liczby X do wartości całkowitej bar(x,y); - rysuje wykres słupkowy Literatura [1] Brozi A., Scilab w przykładach, Poznań, Nakom, 2010 [2] Strona SCILAB Enterprises S.A.S. [online], [dostęp 23 marca 2013], Dostępny w World Wide Web: http://www.scilab.org [3] Lachowicza C. T., Matlab, Scilab, Maxima. Opis i przykłady zastosowań, wydawnictwo Politechniki Opolskiej, 2005 [4] Bolkowski S., Elektrotechnika, WSiP, 2012 [5] Majchrzak E., Mochnacki B., Metody numeryczne. Podstawy teoretyczne, aspekty praktyczne i algorytmy, Wydawnictwo Politechniki Śląskiej, Wydanie IV, 2004