Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Rappresentare la convoluzione continua con Matlab

Strumenti informatici per la matematica applicata, le simulazioni, il disegno: Mathcad, Matlab, Scilab, Microcap, PSpice, AutoCad ...

Moderatori: Foto Utenteg.schgor, Foto Utentedimaios

0
voti

[21] Re: Rappresentare la convoluzione continua con Matlab

Messaggioda Foto Utentegotthard » 26 ago 2015, 0:04

Ahahahah! (:OO:)

A parte gli scherzi ( :-P ), magari ora aspettiamo il continuo delle "risposte serie", quelle sul tuo vero problema.

:mrgreen:
...\frac{\mathrm{d} p}{\mathrm{d} t}=JCM... :!:
Avatar utente
Foto Utentegotthard
4.611 2 5 9
Expert EY
Expert EY
 
Messaggi: 1357
Iscritto il: 5 lug 2013, 14:01

0
voti

[22] Re: Rappresentare la convoluzione continua con Matlab

Messaggioda Foto Utentesimo85 » 26 ago 2015, 18:02

gotthard ha scritto:quelle sul tuo vero problema.

Ma io non so se il problema è mio che non voglio capire, o di Matlab.

Come scrivevo, la funzione di Heaviside è rappresentata correttamente:

01.png
01.png (4.57 KiB) Osservato 3068 volte


La rappresentazione della convoluzione da problemi per qualsiasi intervallo di tempo usato:

02.png
02.png (8.73 KiB) Osservato 3068 volte


Suppongo per via di come Matlab tratta la funzione di Heaviside..

Codice: Seleziona tutto
fs = 1000;
t = -5:1/fs:5;
x = exp(2*t).*heaviside(-1*t);
h = heaviside(t - 3);
y = 1/fs * conv2(x,h, 'same');
plot(t, h);ylim([-1,2])
plot(t, y);ylim([0,0.7])


Concludo che per me la soluzione (se cosi la possiamo chiamare) al mio problema è quella usata nel messaggio 12.

Se invece la soluzione vera e propria non costa tanto e qualcuno ha voglia di condividerla facendomi notare dove sbaglio con Matlab, con un semplice esempio di codice, lo ringrazio in anticipo.

O_/
Avatar utente
Foto Utentesimo85
30,9k 7 12 13
Disattivato su sua richiesta
 
Messaggi: 9927
Iscritto il: 30 ago 2010, 4:59

0
voti

[23] Re: Rappresentare la convoluzione continua con Matlab

Messaggioda Foto Utentegotthard » 26 ago 2015, 18:34

simo85 ha scritto:Ma io non so se il problema è mio che non voglio capire, o di Matlab.

Secondo me il problema è di Matlab, e occorre trovare un modo per trattare la convoluzione tra segnali a tempo continuo quando almeno uno dei due termini della convoluzione è costituito da un gradino, aggirando il problema di Matlab dovuto al fatto che lo rappresenta (inevitabilmente) con un vettore finito di valori.

Ieri sera ho provato a ragionarci, ma non ti so dare la soluzione, visto che alcune prove che volevo fare le ho viste da te fatte nei post precedenti senza arrivare alla soluzione del problema..

Bisognerebbe ascoltare, quando hanno un po' di tempo, gli esperti Foto UtenteDirtyDeeds e Foto Utentedimaios!
...\frac{\mathrm{d} p}{\mathrm{d} t}=JCM... :!:
Avatar utente
Foto Utentegotthard
4.611 2 5 9
Expert EY
Expert EY
 
Messaggi: 1357
Iscritto il: 5 lug 2013, 14:01

0
voti

[24] Re: Rappresentare la convoluzione continua con Matlab

Messaggioda Foto Utentesimo85 » 26 ago 2015, 19:10

gotthard ha scritto:Secondo me il problema è di Matlab, e occorre trovare un modo per trattare la convoluzione tra segnali a tempo continuo

Io penso sia un MIO problema con Matlab, che non uso la testa e non lo uso bene.

Per esempio, ho preso un esempio dal libro Signals & Systems Using MATLAB by Luis F. Chaparro, giusto per vedere se io sto facendo qualcosa di malsano e di strano.

L'esempio è quello a pagina 274, io ho preso solo le prime righe di codice ed ho solo cambiato il timestep:

Codice: Seleziona tutto
Ts = 1/1000;
t = 0:Ts:2;
x = 10 * cos(20*pi*t + pi*(rand(1, 1) - 0.5));
h = 20 * exp(-10.^t).*cos(40 *pi*t);
y = Ts * conv(x, h, 'same');
plot(t, y);


Come si può osservare, si usa sempre la funzione conv... Allora il problema è nella funzione di heaviside.
Devo usare un array inizializzato a mano.

Ora ci provo.
Avatar utente
Foto Utentesimo85
30,9k 7 12 13
Disattivato su sua richiesta
 
Messaggi: 9927
Iscritto il: 30 ago 2010, 4:59

1
voti

[25] Re: Rappresentare la convoluzione continua con Matlab

Messaggioda Foto UtenteDirtyDeeds » 26 ago 2015, 19:45

simo85 ha scritto:Ora ci provo.


No, fermati, e torniamo indietro.

Tu vuoi rappresentare il risultato della convoluzione in un certo intervallo di tempo, diciamo [t_1,t_2]. Per poter calcolare la convoluzione in quell'intervallo di tempo hai bisogno di conoscere le due funzioni x(t) e h(t) in altri due intervalli di tempo, possibilmente infiniti. Poiché in Matlab non puoi memorizzare vettori infiniti, devi decidere dove fermarti: se memorizzi una porzione troppo stretta di x(t) e h(t), il risultato della convoluzione non sarà corretto nell'intervallo [t_1,t_2] e osserverai effetti di "bordo"; questo è il senso del mio messaggio [13].

Puoi anche ragionare in un altro modo: nel programma in [12] hai generato campioni di x(t) e h(t) tra -40 s e +40 s: in quale intervallo di tempo i risultati della convoluzione saranno validi?
It's a sin to write sin instead of \sin (Anonimo).
...'cos you know that cos ain't \cos, right?
You won't get a sexy tan if you write tan in lieu of \tan.
Take a log for a fireplace, but don't take log for \logarithm.
Avatar utente
Foto UtenteDirtyDeeds
55,9k 7 11 13
G.Master EY
G.Master EY
 
Messaggi: 7012
Iscritto il: 13 apr 2010, 16:13
Località: Somewhere in nowhere

0
voti

[26] Re: Rappresentare la convoluzione continua con Matlab

Messaggioda Foto Utentesimo85 » 26 ago 2015, 20:12

DirtyDeeds ha scritto:No, fermati, e torniamo indietro.

Troppo tardi Foto UtenteDirtyDeeds :oops:

Codice: Seleziona tutto
fs = 1000;
t = -5:1/fs:5;
hh = [t];
h = [t];

for i = 1:length(t)
   
   if t(i) < 0
      hh(i) = 1.0;
   else
      hh(i) = 0.0;
   end

   if t(i) > 3
      h(i) = 1.0;
   else
      h(i) = 0.0;
   end
end

x = exp(2*t).*hh;
x1 = exp(2*t).*heaviside(-1*t);

y = 1/fs * conv(x,h, 'same');
y1 = 1/fs * conv(x1,heaviside(t-3), 'same');

subplot(6,1,1);
plot(t,hh);ylim([-1,2]);grid on;xlabel('hh');
subplot(6,1,2);
plot(t,x);ylim([-1,2]);grid on;xlabel('exp(2t) * hh');
subplot(6,1,3);
plot(t,h);ylim([-1,2]);grid on;xlabel('h');
subplot(6,1,4);
plot(t,y);ylim([-1,2]);grid on;xlabel('1/fs * conv(x,h, same)');
subplot(6,1,5);
plot(t,x1);ylim([-1,2]);grid on;xlabel('exp(2t) * heaviside(- t)');
subplot(6,1,6);
plot(t,y1);ylim([-1,2]);grid on;xlabel('1/fs * conv(x1, heaviside(t-3), same)');


Avevo già fatto tutto in questi minuti. :D
Lo posto anche perché (a parte essere utile per la sintassi) poi lo perdo, so già come vanno queste cose. #-o

DirtyDeeds ha scritto:Poiché in Matlab non puoi memorizzare vettori infiniti, devi decidere dove fermarti: se memorizzi una porzione troppo stretta di x(t) e h(t), il risultato della convoluzione non sarà corretto nell'intervallo [t_1,t_2] e osserverai effetti di "bordo"; questo è il senso del mio messaggio [13].


OK. Questo mi è chiaro.

DirtyDeeds ha scritto:Puoi anche ragionare in un altro modo: nel programma in [12] ... in quale intervallo di tempo i risultati della convoluzione saranno validi?


Penso per un intervallo 0 \leq t \leq 3, se non sbaglio. :oops:
Avatar utente
Foto Utentesimo85
30,9k 7 12 13
Disattivato su sua richiesta
 
Messaggi: 9927
Iscritto il: 30 ago 2010, 4:59

0
voti

[27] Re: Rappresentare la convoluzione continua con Matlab

Messaggioda Foto Utentesimo85 » 26 ago 2015, 20:24

Usando il codice del messaggio 12 per timestep differenti e con campioni da -3s a 3s, ottengo valori diversi sull'asse y.

:?

È evidente che ho qualche concetto sballato nella mia testolina di rapa. :(
Avatar utente
Foto Utentesimo85
30,9k 7 12 13
Disattivato su sua richiesta
 
Messaggi: 9927
Iscritto il: 30 ago 2010, 4:59

1
voti

[28] Re: Rappresentare la convoluzione continua con Matlab

Messaggioda Foto UtenteDirtyDeeds » 26 ago 2015, 20:27

simo85 ha scritto:Usando il codice del messaggio 12 per timestep differenti e con campioni da -3s a 3s, ottengo valori diversi sull'asse y.


Ricordati che stai campionando un segnale, c'è anche il problema dell'aliasing.
It's a sin to write sin instead of \sin (Anonimo).
...'cos you know that cos ain't \cos, right?
You won't get a sexy tan if you write tan in lieu of \tan.
Take a log for a fireplace, but don't take log for \logarithm.
Avatar utente
Foto UtenteDirtyDeeds
55,9k 7 11 13
G.Master EY
G.Master EY
 
Messaggi: 7012
Iscritto il: 13 apr 2010, 16:13
Località: Somewhere in nowhere

0
voti

[29] Re: Rappresentare la convoluzione continua con Matlab

Messaggioda Foto Utentesimo85 » 26 ago 2015, 20:35

Mmm. Facciamo una cosa. Ci tornerò sopra più avanti e procedo per gradi, altrimenti finisce che non vado avanti con con il ripasso, e nemmeno con quello di Fisica. #-o

Se continuo cosi rimango indietro, oltre a far si che il mio corpo cominci a formar parte della sedia e della scrivania.
Meglio andare a fare un po' di jogging sul lungo mare, magari mi si illumina la lampadina.

Poi sono anche riuscito a piantare il computer con Matlab e dover fare il reboot con REISUB. :mrgreen:
Avatar utente
Foto Utentesimo85
30,9k 7 12 13
Disattivato su sua richiesta
 
Messaggi: 9927
Iscritto il: 30 ago 2010, 4:59

2
voti

[30] Re: Rappresentare la convoluzione continua con Matlab

Messaggioda Foto Utentesimo85 » 26 ago 2015, 23:46

Dunque, chissà che una passeggiata mi abbia schiarito le idee ?

Correndo ed osservando il mare, mi sono venute in mente varie cose..

Una è che stessi facendo confusione tra dominio continuo e discreto e che Matlab avesse qualche problema del rappresentare il risultato di una convoluzione come funzione a pezzi.
Era una ipotesi.. L'ho tenuta in tasca e quando sono arrivato a casa ho scritto questo script di prova:

Codice: Seleziona tutto
fs = 500;
t = 0:1/fs:2;
x = square(pi*t);
h = 3*square(4*pi*t);
y = 1/fs * conv(x,h,'same');
plot(t,y);


Ed il risultato è questo:

xxx.png
xxx.png (11.98 KiB) Osservato 3020 volte


È evidente che Matlab non ha questi problemi. I problemi ce li ho io... :lol: :lol: :lol:
Cosi, mi sono soffermato sul post 25 del grande Foto UtenteDirtyDeeds (sottolineo in grassetto):

DirtyDeeds ha scritto:devi decidere dove fermarti: se memorizzi una porzione troppo stretta di x(t) e h(t), il risultato della convoluzione non sarà corretto nell'intervallo [t_1,t_2] e osserverai effetti di "bordo"; questo è il senso del mio messaggio [13].


Poi mi sono anche ricordato delle simulazioni sulla convoluzione discreta che ho fatto l'altro giorno a partire da questo thread: viewtopic.php?f=7&t=59863#p596740 e che in funzione della dimensione degli array (quindi del segnale, e nel caso continuo il concetto è lo stesso), cambia anche il risultato di uscita della convoluzione.

Di conseguenza, stavo trascurando completamente di simulare il tempo di \hat h(t) (di lunghezza infinita) per un lunghezza finita abbastanza lunga da poter rappresentare il risultato della convoluzione \hat y(t) con la lunghezza di \hat x(t):

Cosi ho scritto questo codice per applicare questo concetto:

Codice: Seleziona tutto
fs = 100;
t = -3:1/fs:6;
th = -12:1/fs:12;
x = exp(2*t).*heaviside(-1*t);
h = heaviside(th - 3) - heaviside(th - 12);
y = 1/(fs) * conv2(x, h, 'same');
plot(t,x);
plot(th,h);
plot(t,y);grid on; ylim([-0.5,1]);


Ed ecco il risultato:

yyy.png
yyy.png (4.82 KiB) Osservato 3020 volte


Ma anche quello che segue va bene, nel codice precedente si ha:

\hat h(t) = u(t -3) - u(t -12)

Codice: Seleziona tutto
fs = 100;
t = -3:1/fs:6;
th = -12:1/fs:12;
x = exp(2*t).*heaviside(-1*t);
h = heaviside(th - 3);
y = 1/(fs) * conv2(x, h, 'same');
plot(t,x);
plot(th,h);
plot(t,y);grid on; ylim([-0.5,1]);


Per il momento mi sento in dovere di ringraziare Foto UtenteDirtyDeeds e Foto Utentedimaios, ed anche Foto Utentegotthard per i preziosi suggerimenti e correzioni.

:-)
Avatar utente
Foto Utentesimo85
30,9k 7 12 13
Disattivato su sua richiesta
 
Messaggi: 9927
Iscritto il: 30 ago 2010, 4:59

PrecedenteProssimo

Torna a Programmi applicativi: simulatori, CAD ed altro

Chi c’è in linea

Visitano il forum: Nessuno e 8 ospiti