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

Generowanie sygnału prostokatnego w matlabie

Hunter-Killer 12 Lis 2011 17:39 20128 23
REKLAMA
  • #1 10130644
    Hunter-Killer
    Poziom 9  
    Posty: 43
    Ocena: 2
    Od pewnego czasu mam problem z wygenerowaniem w matlabie sygnału prostokątnego - ale w taki sposób by łatwo było można zmieniać jego okres trwania, amplitudę i ilość wyświetlanych okresów.
    Np. dla sinusa nie było problemu :

    y=A*sin(2*w*m);

    Pomorze ktoś ? :)
  • REKLAMA
  • #3 10130772
    Hunter-Killer
    Poziom 9  
    Posty: 43
    Ocena: 2
    Sinusa z kilkoma harmonicznymi ? - a jak coś takiego przenieść do matlaba ? Tą funkcje co podałeś średnio mogę przenieść - przynajmniej na znane mi sposoby typu (zeros, ones).
  • REKLAMA
  • #4 10130785
    kuuczoo
    Poziom 26  
    Posty: 657
    Pomógł: 96
    Ocena: 86
    Ja radziłem sobie korzystając właśnie z funkcji sinus. Nie pamiętam dokładnie składni ale coś na zasadzie if (sin(2*w*m))>=0 then y=1 else y=-1.
  • #5 10130830
    Hunter-Killer
    Poziom 9  
    Posty: 43
    Ocena: 2
    W tym moim przykładzie z sinusem oznaczenia :

    A - amplituda
    m=T:0.0001:TE;
    T - czas początkowy
    TE - czas końcowy
    w=liczba_okresow*pi/TE;

    więc chyba tak jak podałeś to nie zrobię :/

    Chciałem zrobić tak :

    t=-5:0.0001:5;
    pulse = A*rectpuls(t,3);
    plot(t,pulse)

    ale w tym wypadku nie mogę sobie podać ile będzie okresów - zawsze jest jeden i to pośrodku osi :/
  • #6 10130924
    kuuczoo
    Poziom 26  
    Posty: 657
    Pomógł: 96
    Ocena: 86
    Dlaczego nie? Wszystkie parametry przebiegu ustawiłeś już w sygnale sinus. Warunek if zmienia tylko kształt. Jedynym minusem rozwiązania jest fakt że "1" jest dłuższa od "-1" o 2 próbki.
  • #7 10130964
    Hunter-Killer
    Poziom 9  
    Posty: 43
    Ocena: 2
    A możesz to jakoś całe zapisać - bo chyba nie robiłem nigdy tak i dlatego nie wiem jak "to ugryźć" ? :)
  • #8 10131010
    kuuczoo
    Poziom 26  
    Posty: 657
    Pomógł: 96
    Ocena: 86
    Żeby nie wprowadzić Cię w błąd to nie. Z matlabem miałem do czynienia jakieś 5 lat temu i składni nie pamiętam. Zbuduj tablicę z czasem i wartościami funkcji sinus od tego czasu przy określonej w, a następnie nadpisz ją za pomocą warunku do tej samej tablicy.
    Zakładając że masz już y=sin... mniej więcej tak :
    for k=1:length(y),
    if (y(k) >=0) y(k)=A,
    else y(k)=-1*A,
    end
    end

    Spróbuj a potem na bieżąco poprawiaj co nie działa

    -------------------

    Sprawdziłem na Octave. Działa
  • #9 10131117
    Hunter-Killer
    Poziom 9  
    Posty: 43
    Ocena: 2
    To będzie jakoś inaczej jak już - Matlab to nie C++ :)
  • #10 10131121
    kuuczoo
    Poziom 26  
    Posty: 657
    Pomógł: 96
    Ocena: 86
    Sprawdziłem powyższy kod na Octave - poszło i wygenerowało ładny prostokąt.
  • REKLAMA
  • #11 10131137
    Hunter-Killer
    Poziom 9  
    Posty: 43
    Ocena: 2
    Nie możliwe - u mnie wywala błędy w elsie :/

    Wklej cały kod jaki użyłeś :)
  • #12 10131153
    kuuczoo
    Poziom 26  
    Posty: 657
    Pomógł: 96
    Ocena: 86
    przykładowo:
    t=0:0.01:6;
    w=5 * pi / 6.0;
    y=sin (2 * w * t);
    for k=1:length(y),
    if (y(k) >=0) y(k)=1,
    else y(k)=-1,
    end
    end

    plot(y)
    hold on

    I działa :)
  • #13 10131205
    Hunter-Killer
    Poziom 9  
    Posty: 43
    Ocena: 2
    Faktycznie działa - w elsie dałem ; zamiast ,...:)
    Ale jak tu określić długość okresu ?

    Właściwie to cos ze skalą jest bo jestt wszystko razy 100 :/
  • #14 10131237
    kuuczoo
    Poziom 26  
    Posty: 657
    Pomógł: 96
    Ocena: 86
    Co masz na myśli mówiąc długość okresu?
    Ustalasz na początku zakres czasu a potem podczas liczenia "w" podajesz ilość okresów, więc długość okresu masz TE/n.
  • #15 10131253
    Hunter-Killer
    Poziom 9  
    Posty: 43
    Ocena: 2
    Tak zgadza się - ale mi chodzi o skalę - nie wiem czemu tam są takie duże wartości skoro :

    t=0:0.01:6;

    to max powinno być moim zdaniem 6 - a tu 600 jest ...
  • #16 10131273
    kuuczoo
    Poziom 26  
    Posty: 657
    Pomógł: 96
    Ocena: 86
    A wyświetlasz to tak jak napisałem? (plot (y)) Jeśli tak to tak ma być bo za oś x program przyjmuje numer próbki w tablicy, a że jest ich 601 to takie są wartości skali x. Spróbuj plot(t,y)...
  • #17 10131364
    Hunter-Killer
    Poziom 9  
    Posty: 43
    Ocena: 2
    Tak zgadza się - nie wiem czemu sam tego nie spr. w każdym razie dzięki - teraz jest wszystko jak chciałem :). Sygnał piłozębny sam sobie wygenerowałem więc juz mam co chciałem - dzięki :).
  • #18 10131882
    Elektronik9
    Poziom 30  
    Posty: 1803
    Pomógł: 21
    Ocena: 195
    Hunter-Killer napisał:
    Sinusa z kilkoma harmonicznymi ? - a jak coś takiego przenieść do matlaba ? Tą funkcje co podałeś średnio mogę przenieść - przynajmniej na znane mi sposoby typu (zeros, ones).

    W Matlabie za skok jednostkowy odpowiada funkcja o nazwie heaviside, odpowiednio składając sygnał z tych funkcji i "zapętlając" go żeby był okresowy otrzymasz przebieg prostokątny.
  • #19 10132288
    piotrunio11
    Poziom 11  
    Posty: 9
    Ocena: 3
    Czasem Panowie warto posłużyć się nakładką ''symulink'' A jeśli coś nie wychodzi albo wychodzi słabo dać sobie spokój z elektroniką i elektrotechniką w mat. Są przecież programy intuicyjne typu Tcad.
  • #20 10133583
    Hunter-Killer
    Poziom 9  
    Posty: 43
    Ocena: 2
    Akurat to co robię dobrze idzie w matlabie - miałem problem z tym prostokątem tylko i z jeszcze jedną rzeczą w sumie mam problem...

    Czy da się zrobić w matlabie skle taka jak np. na poniższym rysunku :

    Generowanie sygnału prostokatnego w matlabie

    Po prostu mam kilka wykresów na jednym by zrobić porównanie ale najwięcej się dzieje koło np. wartości 8 na skali Y i chciałbym by tam było "gęściej" z wartościami typu zmiany co 0,1 a w dalszej części większe zmiany - da się to jakoś zrobić i to tak by sam matlab to ustawiał (automatycznie)a nie bym co wykres to musiał ustawiać sobie.
    Myślałem, ze to skala logarytmiczna w matlabie i po sprawie ale wywołanie semilogy nie załatwia sprawy.... jakieś pomysły (w sumie nie ten temat do końca ale powiązane :)).
  • #21 10133657
    Elektronik9
    Poziom 30  
    Posty: 1803
    Pomógł: 21
    Ocena: 195
    Może po prostu wystarczy powiększenie (zoom) okna wykresu?
  • #22 10133666
    Hunter-Killer
    Poziom 9  
    Posty: 43
    Ocena: 2
    Jeśli zrobię zoom to nie będę widział całego wykresu ...

    Może coś z axis min i max pokombinować i hold on pokazywać kilka wykresów to sam matlab ustali skalę ?
  • #23 10136369
    mungo
    Poziom 19  
    Posty: 315
    Pomógł: 24
    Ocena: 24
    Nie jestem za dobry z matlaba ale czasem nie było czegoś takiego jak "square" do generowania przebiegu prostokątnego??
  • REKLAMA
  • #24 10137637
    Hunter-Killer
    Poziom 9  
    Posty: 43
    Ocena: 2
    Tak jest do generowania ale wtedy jest problem z określaniem okresu sygnału - w każdym razie "kuuczoo" zaproponował najbardziej mi odpowiadające rozwiązanie więc myślę temat już zamknięty - dziękuje wszystkim pomagającym.

Podsumowanie tematu

✨ Użytkownik miał problem z generowaniem sygnału prostokątnego w MATLABie, chcąc móc łatwo zmieniać jego okres trwania, amplitudę i ilość wyświetlanych okresów. W odpowiedziach zaproponowano różne metody, w tym wykorzystanie funkcji sinusoidalnej oraz warunków if do przekształcenia sygnału sinusoidalnego w prostokątny. Użytkownik z powodzeniem zastosował kod, który generował sygnał prostokątny, a także uzyskał pomoc w kwestii wyświetlania wykresów z różnymi skalami. Wspomniano również o funkcji Heaviside oraz o możliwości użycia Simulinka do bardziej intuicyjnego modelowania.
Wygenerowane przez model językowy.
REKLAMA