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

Jak poprawnie użyć IFFT w Matlabie do odtworzenia sygnału z DFT?

Dzedorak 28 Kwi 2012 17:47 4501 20
REKLAMA
  • #1 10841283
    Dzedorak
    Poziom 13  
    Witam,

    mam problem w pewnym zadaniem, otóż mam znaleźć sygnał którego DFT jest następujące:
    [0, 0, 0, 0, 0, 8, 0, 8*j, 0, -8*j, 0, 8, 0, 0, 0, 0]

    9-ta próbka odpowiada składowej stałej

    zrobiłem więc w matlabie ifft tego wektora, niestety wynik jaki otrzymałem nie przypomina mi żadnego znanego sygnału

    jest to tylko część rzeczywista - urojona jest zerowa

    Jak poprawnie użyć IFFT w Matlabie do odtworzenia sygnału z DFT?

    proszę o pomoc

    pozdrawiam,
  • REKLAMA
  • #2 10841370
    greatadrian
    Poziom 15  
    Składową stałą nie jest 9 próbka, lecz 1 - warto poznać podstawy DFT.
    Sygnał, który otrzymałeś jest prawidłowy, wystarczy użyć polecenia ifft(D) i gotowe.
    Nie możesz otrzymać w dziedzinie czasu sygnału zespolonego ponieważ widmo amplitudowe jest parzyste a fazowe nieparzyste.
  • REKLAMA
  • #3 10841394
    Dzedorak
    Poziom 13  
    ja mam zrobić ifft sygnału który podałem w wektorze, a obrazek to wynik jaki otrzymałem

    to, że 9-ta próbka jest składową stałą narzuca zadanie a nie ja

    w dalszej części mam wygenerować wiele więcej próbek odtworzonego sygnału - jak mógłbym to zrobić tutaj, jeżeli nie mam pojęcia czym jest ten uzyskany sygnał?
  • #4 10841417
    greatadrian
    Poziom 15  
    Kolego,
    przypatrz się uważnie swojemu wektorowi. i zwróć uwagę, że jest on symetryczny względem tego zera, jednak po lewej stronie jest o jedną próbkę więcej niż po prawej. Stąd to właśnie pierwsze zero jest amplitudą składowej stałej. Jeśli nadal nie rozumiesz to ten obrazek powinien to uprościć:
    Jak poprawnie użyć IFFT w Matlabie do odtworzenia sygnału z DFT?
    A na cóż Ci wiedzieć czym jest ten sygnał? Musisz znać jedynie częstotliwość próbkowania. Przyjmij, że jest on okresowy i zapętl go.
    Jak już go rozszerzysz kilkunastokrotnie i zrobisz porządną analizę widmową to zobaczysz, że są to dwa tony sinusoidalne. Częstotliwości wyznaczysz odpowiednio ze znanej częstotliwości próbkowania.
  • #5 10841453
    Dzedorak
    Poziom 13  
    rozumiem, a nie może być tak, że to 9-te zero jest w miejscu x = 0?
    czy w takim razie to błąd w zadaniu?

    no i mam określić jakiego sygnału jest to widmo, więc pokazuje te otrzymane wyżej próbki ?

    dzieki za pomoc,
  • #6 10841468
    greatadrian
    Poziom 15  
    Jak widzisz na powyższym rysunku (czerwone widmo) pierwsza próbka to składowa stała, reszta jest symetryczna względem 4. Tak właśnie zdefiniowana jest DFT. Jeśli chcesz mieć składową stałą w środku i otrzymać coś na kształt transformaty Fouriera w dziedzinie ciągłej to musisz skorzystać z funkcji fftshift (z tego co pamiętam wymaga ona jednak toolboxu do analizy falkowej). Twój sygnał to właśnie te kilka próbek uzyskane za pomoca ifft(). Na pierwszy rzut oka ciężko cokolwiek wywnioskować z przebiegu czasowego, jednak łatwo odczytać to z dwóch prążków w widmie amplitudowym (dwie sinusoidy). Jeśli chciałbyś zobaczyć jak wygląda ona w dziedzinie analogowej to musiałbyś poskładać go z funkcji sinc ---> wtedy łatwiej coś zobaczyć. Jednak cóż jest ciekawego w dwóch przesuniętych względem siebie sinusach o różnej częstotliwości? ;)
    Zakładam, że znasz częstotliwość próbkowania?
  • #7 10841476
    Dzedorak
    Poziom 13  
    Tak, częstotliwość próbkowania znam

    Więc jest to widmo sygnału złożonego z 2 sinusoid i czegoś jeszcze - co daje te składowe urojone?

    i teraz, żeby wygenerować 128 próbek tego sygnału, mam po prostu wkleić po sobie 8 tych otrzymanych wektorów?
    kiedy będę potrzebować częstotliwość próbkowania?
  • Pomocny post
    #8 10841494
    greatadrian
    Poziom 15  
    Kolego,
    pytasz o podstawy z przetwarzania sygnałów.
    Pozwól, że przypomnę Ci transformaty sinusa i cosinusa:
    http://mathworld.wolfram.com/FourierTransformSine.html
    http://mathworld.wolfram.com/FourierTransformCosine.html
    Myślę, że po przeczytaniu zrozumiesz skąd biorą się zespolone wartości DFT.
    Aby usłyszeć w miarę dokładnie potrzebujesz n=fs próbek, wtedy sygnał trwa 1 sekundę.
    Częstotliwość próbkowania naturalnie potrzebna jest podczas odtwarzania w matlabie.
  • #9 10841536
    Dzedorak
    Poziom 13  
    Ok, tego nie wiedziałem:P
    w takim razie wystarczy przesunięcie sinusa o 90 stopni by widmo z zespolonego zrobiło się rzeczywiste?;o

    Częstotliwość próbkowania mam 32kHz, a wygenerować mam 128 próbek, nie muszę mieć sekundy sygnału

    mam więc powielić ten wektor i wykreślić próbki w dziedzinie czasu?

    sygnału analogowego mimo wszystko nie odtworze?
  • Pomocny post
    #10 10841564
    greatadrian
    Poziom 15  
    Powiem więcej (prawdą jest, że nie powinno Cię to dziwić jeśli chodziłeś na wykłady :P ), że jeśli sygnał jest parzysty w dziedzinie czasu to widmo jest czysto rzeczywiste, jeśli natomiast nieparzysty, to widmo jest czysto urojone.
    Dokładnie, musisz wykreślić próbki w dziedzinie czasu i voila, co prawda nie wiem co chce Twój ćwiczeniowiec.
    Co do obserwacji sygnału analogowego, to aby go mniej więcej zobaczyć to musiałbyś go zsyntezować za pomocą funkcji sinus-cardinalis.
    Mały help z wykładu mojego profesora:
    http://wavelet.elektro.agh.edu.pl/wyklad/pdf/Probkowanie.pdf
  • REKLAMA
  • #11 10841633
    Dzedorak
    Poziom 13  
    nie wychodzi mi ta interpolacja więc zostawię same próbki:P

    dzięki za pomoc

    // chciałbym się spytać o jeszcze jedną rzecz
    mam w zadaniu wygenerować te 128 próbek i policzyć DFT żeby sprawdzić czy się zgadza
    dla 128-DFT otrzymuje jednak amplitudy widma równe 64, jest to dość logiczne ale co mam z tym zrobić? czy mam po prostu podzielić przez 8 czy jak to jest?
  • #12 10841946
    greatadrian
    Poziom 15  
    Co do samej interpolacji to proszę:
    Jak poprawnie użyć IFFT w Matlabie do odtworzenia sygnału z DFT?
    Myślę, że wiesz dlaczego nie wyszło idealnie :)
    Energia w dziedzinie częstotliwości dla każdego prążka musi zostać znormalizowana, wynika to z dyskretnej postaci twierdzenia Parsevala- wystarczy wiedzieć czego szukać, już wiesz ;)
  • REKLAMA
  • #13 10842186
    Dzedorak
    Poziom 13  
    ooj dzięki wielkie:)
    a mógłbyś wrzucić też kod?
    może bym się czegoś nauczył:P

    no tak, rozumiem, ale widmo które dostałem w zadaniu też nie był znormalizowane, tak?
  • #14 10842648
    greatadrian
    Poziom 15  
    Owszem, nie były. Jeśli wracasz z powrotem do dziedziny czasu, to nie bierzesz normalizowanych wartości. Interesują Cię one raczej tylko przy reprezentacji sygnału. Pamiętaj jeszcze, że zazwyczaj interesuje nas tylko jedna połówka widma, a energia dzieli się na dwie.
    Kodu nie ma co wysyłać, bo napisany jest byle jak i sam widzisz, że wynik jest tylko poglądowy. Jak się człowiek bardziej namęczy to otrzyma upragniony przebieg:
    Jak poprawnie użyć IFFT w Matlabie do odtworzenia sygnału z DFT?
    Zresztą- jest wzór to nie rozumiem w czym problem? :D Nawet jak nie znasz matlaba to wystarczy minuta i znajdziesz kody w internecie. Właściwie jak się człowiek uprze to dwie linijki to zajmuje.
  • #15 10842924
    Dzedorak
    Poziom 13  
    no niby nie ma problemu, znam wzór, ale nie wiem co jest w argumencie funkcji sinc,
    we wzorze t - nT, ale czym jest t a czym T?;/

    a co takiego zrobiłeś, że wyszło lepiej za drugim razem?:d
  • Pomocny post
    #16 10843439
    greatadrian
    Poziom 15  
    Ten przypadek nie wymagał skalowania w dziedzinie czasu- po piwie mi się nasunęło.
    Idea jest prosta. Liczysz funkcję sinc dla czasu "analogowego" (w rzeczywistości o wiele większe dt) przesuniętą do kolejnych chwil czasowych w których masz próbkowany sygnał. Potem przemnażasz ten wynik przez amplitudę próbki i lecisz do kolejnego sinca.
    Wszystko potem dodajesz do siebie i otrzymujesz przebieg analogowy.
    Na którym Ty jesteś roku? Mieliście już w ogóle coś z DSP?
  • #17 10843554
    Dzedorak
    Poziom 13  
    na drugim, niestety nie mieliśmy za wiele ;/

    idee rozumiem, jednak nie wiem jak to przełożyć do matlaba,
    ma być to coś tego typu:

    W = zeros(size(Tanalogowy));

    for k = 1:length(Tprobek)
    A = Sygnal(k) * sinc(Tanalogowy - Tprobek(k));
    W = W + A;
    end

    i W to mój wynik, ale co z Tanalogowy? to ma być wektor czasów, w zakresie czasu próbkowania ale dużo gęstszy?
  • Pomocny post
    #18 10843564
    greatadrian
    Poziom 15  
    Widzę, że już łapiesz- dokładnie, zagęszczony wektor czasu ;) Pod sinus cardinalis brakuje Ci jeszcze jednego argumentu- myślę, że dojdziesz jakiego.
    Jeśli mogę zasugerować jedną rzecz jeszcze:
    W=W+sygnal(k)...itd
  • #19 10843615
    Dzedorak
    Poziom 13  
    udało się:)
    otrzymałem to samo co Ty, jakbyś tylko mógł rzucić okiem czy powinno być tak, czy liczyć od 0:15? wychodzi to samo ale zawsze mam dylemat czy próbki wykreślać zaczynając od 1 czy 0.
    stem domyślnie robi od 1 :P


    //aha, brakuje argumentu:D, ale czy to nie chodziło o częstotliwość próbkowania?
    bo ja nie dzieliłem wektora Tprobek przez nią, a powinienem?;D
    Tprobek = [1:16];
    Tanalogowy = [1:0.001:16];
    W = zeros(size(Tanalogowy));

    for k = 1:length(Tprobek)
    W = W + B(k) * sinc(Tanalogowy - Tprobek(k));
    end
  • #20 10843636
    greatadrian
    Poziom 15  
    Dokładnie tak,
    w teorii należy jeszcze dzielić [ Tanalogowy - Tprobek(k) ] przez dt. Jednak w tym wypadku jest to w obu wektorach zawarte.
    Przebiegi czasowe zawsze zaczynaj od zera, tak jest najbezpieczniej.
    Gratuluję- lvl up!
  • #21 10843650
    Dzedorak
    Poziom 13  
    ok, już rozumiem, dzięki wielkie za pomoc:)

    pozdrawiam;)
REKLAMA