Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

FFT w Matlabie czyli harmoniczne prądu i napięcia.

Wojt-AS 01 Sie 2009 20:17 6259 10
  • #1 01 Sie 2009 20:17
    Wojt-AS
    Poziom 9  

    Witam szanownych forumowiczów.


    Proszę Was o pomoc w sprawie, która mnie przerasta. Mianowicie musze do dokończyć moją pracę inżynierską i potrzebuje przeanalizować przebiegi napięcia i prądu pod względem zawartości wyższych harmonicznych. W grę wchodzi tylko i wyłącznie Matlab, który co prawda miałem na studiach lecz nie w takim stopniu w jakim wymaga to moja praca - przynajmniej tak mi się wydaje :)

    W mojej pracy badam zasilacze komputerowe za pomocą elektronicznego analizera do którego podłącza się maxymalnie 4 sondy, które mierzą napięcie, prąd upływowy i roboczy.
    Dostarczony do tego analizera program pozwala mi wyeksportować wyniki do excela.
    Następnym krokiem jest wyznaczenie zawartości wyższych harmonicznych z tych przebiegów w Matlabie. Niestety zupełnie nie potrafię sobie z tym poradzić. Taki jeden pomiar składa się z maxymalnie 8000 pkt dla jednego kanału.
    Poczytałem troche o FFT w matlabie ale wychodzą mi totalne bzdury... natomiast na dołączonym programie do tego analyzera jest też możliwość zobaczenia zawartości harmonicznych i tam wszystko ładnie widać tzn. że są te piki w 50,150,250 itd Hz a w Matlabie to wychodzi mi jeden wielki miszmasz :(

    Proszę Was o pomoc i jakieś wskazówki co można z tym zrobić ponieważ termin oddania pracy mam niestety we wrześniu i do tego czasu musze się z Tym wszystkim uwinąć.

    W załączniku jest ten plik z exela z 3 kanałami jak by ktoś chciał przeanalizować...

    Pozdrawiam i proszę o pomoc.

    0 10
    Załączniki:
  • Pomocny post
    #2 04 Sie 2009 16:46
    Marvinn8686
    Poziom 20  

    Witam.
    Dobrze byłoby abyś sprecyzował co rozumiesz pod pojęciem "miszmasz" w matlabie. Jakiej użyłeś komendy aby wprowadzić dane do matlaba? W jaki sposób wykreśliłeś widmo? Być może wystarczy dokonać pewnych poprawek w tym co już zrobiłeś. Z tego co widzę wartości pomiarów są zapisane w postaci np. "384," zamiast "384,0" lub "384" to sprawia że standardowa procedura 'xlsread' w matlabie nie działa odpowiednio (uważa takie pole z danymi za pole tekstowe).

    0
  • #3 05 Sie 2009 11:24
    Wojt-AS
    Poziom 9  

    To co udało mi się do tej pory "osiągnąć" zamieszcze w pliki tekstowym tak aby można było wkleić do Matlaba i zobaczyć wynik.

    Miszmasz o którym pisałem to to iż co prawda wychodzą jakieś piki lecz niestety zupełnie nie przypominają wyższych harmonicznych tzn nie są wielokrotnościami 50Hz...

    Nie wykorzystuje czytania z pliku excela tylko kopiuje dane 1kanału w postaci DECIMAL do notatnika i zamieniam je na wektor np x=[98,102,115,167.... itd]; z tego wektora staram się zrobić fft pożniej abs później jeszcze plot... i wychodzi to co widać... Ktoś mi powiedział, że nie mam zdefiniowanego czasu.... ale nie mam pojęcia jak mam to odnieść i co wpisać w matlabie żeby to działało...

    Proszę o pomoc i z góry dziekuję za zainteresowanie się tematem i niepozostawienie go samego sobie.

    Pozdrawiam.

    0
  • Pomocny post
    #4 05 Sie 2009 11:37
    Marvinn8686
    Poziom 20  

    Rozumiem teraz mniej więcej, plik txt pomógł. Kolejne pytanie - kolumna buffer zawiera kolejne próbki z bufora, a 10kHz to częstotliwość próbkowania? To znaczy kolumna ta zawiera kolejne odczyty z urządzenia w chwilach 0,1,2,... itd. Jeśli 10kHz jest częstotliwością próbkowania, to każdy kolejny odczyt następuje co 1/10000 sekundy? Czekam na potwierdzenie (pomoże to faktycznie zdefiniować czas w jakim zachodzą zmiany przebiegów - w każdym razie mam taką nadzieję :)).
    Pozdrawiam.

    0
  • #5 05 Sie 2009 11:52
    Wojt-AS
    Poziom 9  

    W programie, który jest dostarczony do elektronicznego analizatora jest napisane 10Khz 5ms/działkę czyli 100Ksampli 100us... dołączam plik jpg, który może pomoże.

    0
  • Pomocny post
    #6 05 Sie 2009 12:50
    Marvinn8686
    Poziom 20  

    Udało mi się to zrobić fft dla fragmentu jednego z twoich przebiegów (wziąłem 1000 próbek z pierwszej kolumny - czyli A1, wprowadziłem do matlaba za pomocą xlsread oraz zrobiłem fft w wyniku czego otrzymałem nasępujące widmo
    FFT w Matlabie czyli harmoniczne prądu i napięcia.
    daje się zauważyć piki co 50 Hz - być może w innych przebiegach będą wyraźniejsze.
    Potrzebny przebieg (sama kolumna pomiarowa) musisz zapisać w nowym pliku .xls po czym zmodyfikować skrypt który załączam jako przykładowy. Plik .xls i skrypt muszą być w katalogu matlaba (work). W skrypcie są komentarze jak mniej więcej to zrobić i która komenda jak działa.
    W razie czego pytaj.
    Pozdrawiam.

    PS. Jeśli twój matlab nie ma obsługi excela (xlsread) to można wprowadzić dane tak jak to robiłeś, ale to mordęga :)

    0
    Załączniki:
  • #7 05 Sie 2009 13:33
    Wojt-AS
    Poziom 9  

    Nie wiem jak mam Ci podziękować naprawdę :) ale o tym na pw ^^ Co do samego programu to rzeczywiście działa i pokazuje zawartość wyższych harmonicznych w danym przebiegu :) Jeszcze nie sprawdzałem dla całości przebiegu czyli 8000 próbek ale z pewnością będzie to hulało :)

    Ale mam jeszcze jedną sprawę. Mianowicie czy da się zrobić tak aby na osi Y pokazywało mi np. że ten pik przy 50 Hz jest dla wartości maxymalnej 1 a inne harmoniczne są poniżej 1... chodzi o to aby to tak lepiej zobrazować :)

    0
  • Pomocny post
    #8 05 Sie 2009 13:53
    Marvinn8686
    Poziom 20  

    Pamiętaj żeby dla większej ilości próbek zwiększyć ilość punktów transformaty. Co do wyskalowania y to najszybszym rozwiązaniem wydaje mi się być dopisanie kawałka kodu który pokaże jeszcze jeden, kolejny wykres z względną mocą widma

    Code:
    figure(3)
    
    plot(osf(2:40), 0.000047*W(2:40))
    title('Widmo czestotliwosci odniesieniu do 1 harm.');
    xlabel('Czestotliwosc [Hz]');

    Liczbe przed W(2:40) musisz dobrać dla innych przebiegów "na oko". To niezbyt elegancko, ale najszybciej :).

    0
  • #9 05 Sie 2009 14:09
    Wojt-AS
    Poziom 9  

    Udało mi się zrobić analizę dla 8000 próbek :) Wychodzi 12 wyższych harmonicznych. Według twoich wskazówek udało mi się również odpowiednio wyskalować oś Y tak aby szczyt przy 50 Hz był oznaczony na osi Y jako 1 a reszta poniżej dla lepszego zobrazowania :)

    Jeszcze raz wielkie dzięki :)

    Pozdro

    0
  • #10 05 Mar 2012 16:32
    witold.klopot
    Poziom 2  

    Cześć,

    Na początku chciałbym podziękować za rozwiązanie (bardzo czytelne i jasne).

    Odświeżyłem temat, ponieważ zrobiłem pewne modyfikacje w kodzie, które mogą się przydać kolejnym użytkownikom. Najważniejsze z nich:
    1) automatyczne wybranie N
    2) normalizacje widma - co pozwala na oszacowanie amplitud sygnałów (oprócz samej częstotliwości).

    data = y; % wczytanie danych - y dane do analizy
    N= 2^nextpow2(length(data)); % ilosc punktow transformaty musi byc wieksza od liczby punktów - a dokladnie, kolejna potega dwojki np jezeli wezmiesz wszystkie 8000 to N=8192
    Fs=.1; % czestotliwosc probkowania
    df=Fs/N; % rozdzielczość transformaty w Hz
    STF = fft(data, N); % szybka Transformata Fouriera
    W=abs( STF ); % modul widma
    Wn = 2*W ./ length(STF); % normalizacja modulu widma - mozna odczytac wartosci amplitud sygnalow - oczywiscei z pewna dokladnoscia
    osf=[ 0: N-1 ]*df; % os czestotliwosci w Hz
    figure(3)
    ZakrF = 500; % ZakrF ustala zakres czestotliwosci na wykresie (400=400Hz)
    plot(osf(2:ZakrF), Wn(2:ZakrF))
    title('Widmo czestotliwosci');
    xlabel('Czestotliwosc [Hz]');
    figure(4) % ten sam wykres tylko w decybelach (pierwszy wyglada lepiej)
    plot(osf(2:ZakrF), 20*log10(W(2:ZakrF)))
    title('Widmo czestotliwosci w [dB]');
    xlabel('Czestotliwosc [Hz]');

    0
  • #11 18 Cze 2012 23:10
    dawidoff122
    Poziom 2  

    Witam!

    Mam pytanie odnośnie powyższego skryptu.
    W jaki sposób uzyskac kąt przesunięcia fazowego miedzy prądem a napięciem zasilania w matlabie?
    Mam dwa zbiory danych z oscyloskopu: napięcie oraz prąd po 1000 próbek odpowiada to jednemu pełnemu okresowi (20ms). Harmoniczne dzieki dft wychodza prawidlowo. Próbowałem: angle(STF) ale wychodzi 1000 katów a nie dla kazdej harmonicznej z osobna... (potrzebuje przesunięcie dla 50Hz)

    wymyslilem jeszcze: katrad=acos(dot(u,i) ./ (dot(u,u)*dot(i,i))) ale wolalbym aby to bylo przy wykorzystaniu fft czy dft.

    0