PDA

View Full Version : Impulsu saskaitīšana Matlabā



insdeck
13-05-2008, 08:04
Kā saskaitīt signāla impulsus Matlab programmā?
Source csv, xls vai txt failu dabūju. Bet kā apstrādāt nezinu.
http://www.screenhunter.net/files/19/untitled.PNG

karloslv
13-05-2008, 09:32
1) Ko tu definē kā "impulss" - no tā ir daudz kas atkarīgs. Intuitīvi pateikt ir viens, bet matemātiski definēt pavisam kas cits.
2) Ok, pieņemsim, ka gribi saskaitīt, cik reizes signāls pārlec pāri noteiktam slieksnim (piemēram, 150). Tad es darītu tā: ieviestu divus savstarpēji par vienu vienību nobīdītus vektorus x1 = x[2:], x2 = x[:len(x)-1], kur x ir oriģinālais signāla vektors, un tad sareizinātu (x1>150) * (x2 =< 150), iegūsi vektoru ar vērtībām 1 un 0, kur 1 būs tieši tajā pozīcijā, kur katrs "impulss" sākas. Var x1 un x2 iegūt ne tikai apgraizot x, bet arī papildinot ar 0: x1 = [x 0], x2 = [0 x].
3) var to visu vienkārši klasiski ciklā darīt: iet pa x vērtībām un skaitīt reizes, kur x[i] > 150 un x[i-1] <= 150.

Par MatLAB sintakses pareizību savos piemēros negalvoju, kādu laiku neesmu darbinājis. Bet ideju, ceru, saprati.

insdeck
13-05-2008, 10:56
1) Ko tu definē kā "impulss" - no tā ir daudz kas atkarīgs. Intuitīvi pateikt ir viens, bet matemātiski definēt pavisam kas cits.
2) Ok, pieņemsim, ka gribi saskaitīt, cik reizes signāls pārlec pāri noteiktam slieksnim (piemēram, 150). Tad es darītu tā: ieviestu divus savstarpēji par vienu vienību nobīdītus vektorus x1 = x[2:], x2 = x[:len(x)-1], kur x ir oriģinālais signāla vektors, un tad sareizinātu (x1>150) * (x2 =< 150), iegūsi vektoru ar vērtībām 1 un 0, kur 1 būs tieši tajā pozīcijā, kur katrs "impulss" sākas. Var x1 un x2 iegūt ne tikai apgraizot x, bet arī papildinot ar 0: x1 = [x 0], x2 = [0 x].
3) var to visu vienkārši klasiski ciklā darīt: iet pa x vērtībām un skaitīt reizes, kur x[i] > 150 un x[i-1] <= 150.

Par MatLAB sintakses pareizību savos piemēros negalvoju, kādu laiku neesmu darbinājis. Bet ideju, ceru, saprati.

Par 1)Tātad impulss šajā gadījumā ir signāls, kurš pārsniedz noteiktu vērtību kaut kādā laika posmā. Nepieciešams ir šos impulsus saskaitīt. Un tad vēl attiecīgi parādīt impulsu skaita atkarību pēc laika.
Par 2)Ideja man ir skaidra, bet tās realizācija Matlabā nav skaidra. Neprotu to realizēt Matlabā.
Par 3) Manuprāt, šādi nevarēs, jo vērtības kas ir lielākas par 150 ir daudz vairāk nekā impulsu.

Iegūtais signāls Matlabā ir šāds:
http://www.screenhunter.net/files/19/impulsi.PNG

Flukes attēlā kas redzams ievadā signāls ir izstiepts laikā.

karloslv
13-05-2008, 12:46
Par 3) tu nesaprati - es domāju pieskaitīt tikai tās reizes, kad reizē x[i - 1] < 150 un x[i] >= 150, respektīvi pirms tam bija zem 150, laikā t+1 jau virs 150, jeb tieši impulsu frontes.
Ja tev vēl vajag impulsu skaitu laikā, tad tas stipri jau ož pēc parastākās programmēšanas un cikla. C/C++ negribi uzrakstīt?

insdeck
16-05-2008, 14:51
Tā kā ar Matlabu man negāja labi, tika apstrādāti dati excelī un tad pārnesti uz Matlab vidi, lai veidotu grafiku.
t_im=[laika masīvs];
im=[impulsu (skaita atkarībā no laika) masīvs];
plot(t_im, im)
Rezultāts:
http://www.screenhunter.net/files/19/acceleration_.png

Apstrādājot datus matlabā esmu pārliecināts, ka varētu iegūt vēl labāku grafiku, bet tas būs jāatliek vēlākam laikam.

Paldies karloslv par palīdzēšanu. Un polšs no manis. :)