logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Matlab, widmo, angle, abs...

Genario 11 Sty 2005 12:05 16418 8
REKLAMA
  • #1 1128501
    Genario
    Poziom 11  
    Cześć
    Czy ktoś mógłby mi pomóc, próbuje wyznaczyć widmo sygnału w matlabie przy pomocy funkcji fft, ale chyba coś źle robie bo kolejne prążki nie odpowiadają częstotliwością składowych sygnału.

    t=[0:1/1024:2-1/1024];
    x1=cos(2*pi*30*t);
    x2=sin(2*pi*30*t);
    z=complex(x1,x2);
    zf=fft(z);
    x1f=fft(x1);
    x2f=fft(x2);
    zfa=abs(zf);
    x1fa=abs(x1f);
    x2fa=abs(x2f);
    figure(1)
    subplot(3,1,1)
    plot(zfa)
    subplot(3,1,2)
    plot(x1fa)
    subplot(3,1,3)
    plot(x2fa)

    Zrobiłem to dla sygnału zespolonego i osobno dla rzeczywistych, które są składowymi zespolonego. No i nie działa tak jak powinno.
    Poza tym jeśli ktoś wie jak wyciągnąć z sygnału faze? Słyszałem o funkcji angle, ale jak ją wykorzystać przy tych sygnałach?
    Dziękuję za pomoc.
  • REKLAMA
  • Pomocny post
    #2 1128847
    jarek_krakow
    Poziom 17  
    111111)

    clc
    clear all
    close all

    tp=1/1024;
    t=[0:tp:2-tp];
    x1=cos(2*pi*30*t)+3*cos(2*pi*60*t+.4);
    N=length(x1);
    x1f_abs=abs(fft(x1));
    freq=0:1:N-1;
    freq=freq/tp/N;
    figure
    stem(freq,x1f_abs/N*2)
    kat_fazowy=atan(imag(fft(x1))./real(fft(x1)));
    figure
    stem(freq,kat_fazowy)

    powinieneś już umieć skalować
    w następnym przykładzie daruję sobie skalowanie

    22222222) sygnał z=x1+j*x2
    taki sygnał tworzy się po to by jednym fft -chodzi tu o fft(z) zrobić analizę dwóch sygnałów . zamiast fft(x1) i fft(x2)

    clc
    clear all
    close all


    t=[0:1/1024:2-1/1024];
    x1=cos(2*pi*30*t+.1);
    x2=3*sin(2*pi*60*t+.2);
    z=complex(x1,x2);
    zf=fft(z);
    rez=real(zf); %liczenie abs(fft(z)) NIC nie daje
    imz=imag(zf);
    figure
    stem(rez)
    figure
    stem(imz)
    figure
    stem(real(fft(x1)))
    figure
    stem(imag(fft(x1)))
    figure
    stem(real(fft(x2)))
    figure
    stem(imag(fft(x2)))

    z pierwszych dwóch rysunków da się narysować cztery pozostałe . regułki są w książkach na pewno
  • REKLAMA
  • #3 1131885
    Genario
    Poziom 11  
    Dziękuję za odpowiedź !! Bardzo mi pomogła.
    Jeszcze tylko jedno pytanie - dlaczego nie ma sensu liczenie abs(fft(z))?
  • Pomocny post
    #4 1134432
    jarek_krakow
    Poziom 17  
    obliczanie jednym fft sygnału z=x+j*y zastępuje liczenie dwóch transformat - fft(x) oraz fft(y) .tak jest szybciej bo tylko raz jest liczone fft
    tylko żeby z transformaty fft(z) otrzymać obydwie transformaty sygnału x i y to trzeba mieć osobno częć rzeczywistą i urojoną fft(z)
    pewnie ,że można liczyć abs(fft(z)) i jescze to narysować , tylko co to będzie?

    choćby
    x1=A*sin(t)
    x2=B*sin(3*t)

    to nijak nie dowiesz się niczego o fft(x1) i o fft(x2)
    nie jesteś w stanie przypisać któregokolwiek z prążków konkretnemu sygnałowi - to jest oodpowiedź
  • #5 1139436
    Genario
    Poziom 11  
    W jaki sposób z sygnału można wyciągnąć częstotliwość próbkowania?

    czyli...
    jeśli do funkcji (w matlabie) wejściem jest sygnał to jak odczytać na jego podstawie częstotliwość próbkowania? - potrzebne to jest do skalowania.
    Poza tym nigdzie nie mogę znaleźć jak wyznaczyć te wykresy:
    stem(real(fft(x1)))
    stem(imag(fft(x1)))
    stem(real(fft(x2)))
    stem(imag(fft(x2)))
    na podstawie wejściowego sygnału zespolonego. Nie wiem jak wyznaczyć składowe (x1,x2) tego sygnału :(
    Jeśli mógłbyś mi pomóc byłbym naprawde wdzięczny.
    Z góry bardzo dziękuję.
  • REKLAMA
  • Pomocny post
    #6 1142046
    shg
    Poziom 35  
    mając sam sygnał nie wyciągniesz z niego częstotliwości próbkowania, chyba, że znasz jedną z częstotliwości jaka wchodzi w skład sygnału, musisz ją wtedy odszukać w widmie i pomnożyć numer prążka widma przez ilość próbek wziętych do jego obliczenia, ale to nie jest aż takie dokładne

    a jeżeli potrzebujesz tego do skalowania częstotliwości, to przedstaw częstotliwość w postaci znormalizowanej do częstotliwości próbkowania (fS), czyli 1.0 odpowiada fS, 0.4 to 0.4*fS itd., a to zrobisz dzieląc "numer" prążka widma, przez ilość próbek wziętych do liczenia FFT.
  • #7 1149969
    Genario
    Poziom 11  
    jarek_krakow napisał:

    z pierwszych dwóch rysunków da się narysować cztery pozostałe . regułki są w książkach na pewno

    Nie mogę nigdzie tego znaleźć. Jak mogę wyciągnąć wewnątrz funkcji sygnały składowe zespolonego sygnału, jeśli wejściem jest tylko i wyłącznie sygnał zespolony (nie ma fs, czasu itd.).

    shg napisał:
    a jeżeli potrzebujesz tego do skalowania częstotliwości, to przedstaw częstotliwość w postaci znormalizowanej do częstotliwości próbkowania (fS), czyli 1.0 odpowiada fS, 0.4 to 0.4*fS itd., a to zrobisz dzieląc "numer" prążka widma, przez ilość próbek wziętych do liczenia FFT.

    Czy mógłbyś to wyjaśnić prościej np. na przykładzie z matlaba. Dopiero zaczynam zabawe z analizą i nie rozumiem do końca jak to wyskalować.
  • Pomocny post
    #8 1150930
    shg
    Poziom 35  
    Genario, jeżeli chodzi o matlaba, to nie za wiele pomogę, bo nie używam. :(

    A z tym skalowaniem to chodzi o coś takiego, że nie znasz częstotliwości próbkowania, ale mimo wszystko możesz przedstawić na skali częstotliwości poszczególnych prążków, właśnie w postaci znormalizowanej.

    mając widmo sygnału (rzeczywistego) o N próbkach składające się z N/2+1 składowych, możesz narysować wykres tak, żeby po lewej był prążek widma odpowiadający składowej stałej, a po prawej prążek odpowiadający częstotliwości fS/2 (fS- częstotliwość próbkowania). Na skali częstotliwości będą one oznaczone odpowiednio: 0.0 i 0.5, czyli 0.0*częstotliwość próbkowania = składowa stała i 0.5*częstotliwość próbkowania = częstotliwość Nyquista i nie ważne, jaka była fS, wykres zawsze będzie od 0 do fS/2.
    No i wreszcie, jak to się robi:
    wektor (o długości n=N/2+1) liczb zespolonych v, w którym przecowywane jest widmo.
    I wykres: współrzędna X od 0 (włącznie) do 0.5 (włącznie) z krokiem 1/N, czyli dla każdego kolejnego X będziesz miał kolejne prążki widma. To samo jako "funkcja" zwracająca wysokość prążka: f(x) = |v(x*N)|
    |x| - moduł liczby zespolonej
    v(n) - n-ty element wektora v
    I przykład dla FFT z 4 próbek:
    N=4
    krok x:
    xinc = 1/N = 1/4

    i teraz każdemu x'owi co 1/4 przypisujemy 1 element z wektora v:
    x=0 <- v(0)
    x=0.25 <- v(1)
    x=0.5 <- v(2)

    Ważne - pierwszy element wektora ma indeks = 0

    z tym krokiem, to w matlabie może jakoś tak będzie:
    i := 0,1/N..0.5
    tak się w MathCADzie definiuje jakiś zakres liczb z danym krokiem, a potem wstawia to do wykresu
    oś X - i, oś Y - |v(i*N)|

    A jeżeli chcesz pokazać na wykresie sygnały zespolone, to nie da się tego zrobić w postaci częstotliwość - wartość (a właściwie to się da, albo w 3D, albo "rozbijając" sygnał zespolony i rysując osobno składową rzeczywistą i urojoną), a normalnie rusuje się powiedzmy n punktów na płaszczyźnie XY (dla liczby w postaci a+bj, a to współrzędna X, a b to Y)

    A dla zespolonego sygnału wejściowego masz generalnie to samo, ale składowych widma jest N, a nie N/2+1 i wykres jest od -0.5(ale z pominięciem -0.5) do 0.5 (włącznie), z krokem 1/N.
    Może być jeszcze taki trick, że matlab nie zrobi Ci wektora z ujemnymi częstotliwościami, tylko przeniesie je ponad częstotliwość Nyquista. czyli aby otrzymać częstotliwości ujemne, trzeba będzie przesunąć je z zakresu (fS/2, fS> do (-fS/2, 0>
    w praktyce, można to zrobić tak:
    x := -0.5+1/N, 1/N .. 0.5
    na osi x, będzie (niespodzianka) x
    na osi y:
    jeżeli x<0, to |v(N-x*N)|
    w przeciwnym wypadku |v(x*N)|

    Chyba wsio :D
  • REKLAMA
  • #9 4382988
    pawe3b
    Poziom 1  
    Witam
    zna sie ktoś na funkcji fft w matlabie?
    znalazlem programik
    t = 0:0.001:0.6;
    x = exp(-100.*t);
    y = x ;
    plot(y(1:50))
    Y = fft(y,512);
    Pyy = Y.* conj(Y) / 512;
    f = 1000*(0:256)/512;
    plot(f,Pyy(1:257))
    jednak nie do końca go rozumiem
    ja chciałbym przeprowadzić analize na zbiorze danych dyskretnych (1000)
    ale nie umiem dopasować częstotliwości tak żeby było coś widac (zajmuje sie analizą danych giełdowych)
REKLAMA