Inleiding (signalen en signaalverwerking)
Een signaal is een reeks variërende waarden (meetwaardes) van een of andere grootheid
geregistreerd op opeenvolgende tijdstippen. Op een thermometer bijv kan je op ieder willekeurig
tijdstip een waarde aflezen. Dat continue karakter is typisch voor het z.g. analoge signaal. Dit signaal
levert een grafieklijn op.
Een analoog signaal bevat te veel data om op een computer te kunnen analyseren. Daarom moet je
van het signaal op opeenvolgende momenten samples (meetwaarden) nemen. Meestal kies je tussen
de samples een vast tijdsinterval ‘dt’ (de z.g. sampletijd of periode). De serie waarden die je zo
verkrijgt uit het originele analoge signaal noem je een digitaal signaal. Dit signaal levert losse punten
(meetwaarden) op ipv een continue grafieklijn. Stel dat iedere 0,1 sec een sample wordt genomen
van de grootheid A dan is de periode (dt) gelijk aan 0,1 sec en de samplefrequentie (de inverse van
de periode, dus: 1/dt) gelijk aan 10Hz (1Hz = 1 meting/sec).
Analoog signaal A(t) Digitaal signaal A(t)
Een regel uit de signaalverwerking luidt dat de samplefrequentie altijd ten minste 2x zo groot moet
zijn als de hoogste frequentie die je in het signaal wilt aantonen. Deze regel wordt het theorema van
Shannon genoemd. De halve samplefrequentie (de hoogste dus die je in het signaal kunt aantonen)
staat bekend als de Nyquistfrequentie. Wanneer niet aan deze regel wordt voldaan, levert dit geen
vloeiende grafiek op. Er wordt dan op te weinig momenten in het signaal gemeten om het verloop
ervan goed vast te kunnen stellen. Je kunt dit vergelijken met het kijken van een voetbalwedstrijd.
Als je de score bij wilt houden moet je op zijn minst iedere 10sec kijken en niet om het kwartier want
dan is de kans aanwezig dat je een doelpunt mist en je einduitslag niet klopt. In de voorbeeldcode
hiernaast wordt niet aan de regel voldaan (de samplefrequentie van 128Hz is veel hoger dan de
frequentie van het signaal (20Hz)) wat géén vloeiende sinuskromme oplevert. Om de lijn vloeiender
te laten lopen moet je de sampletijd (dt)
verkleinen (verkleining van dt zorgt er
namelijk voor dat fs hoger wordt. Het is
niet de bedoeling dat je het aantal
punten (N) groter maakt want dan wordt
het aantal pieken ook groter).
Een signaal kun je voorstellen als 2 linten (rijmatrixen) met in
de ene de waarden en in de ander de tijdstippen. Je gebruikt
een index (een getal ≥ 1) om de 2 met elkaar te verbinden. In
het voorbeeld dat hieronder is weergegeven is geregistreerde
waarden(1) gelijk aan 10,0 en bijbehorend tijdstip(1) gelijk
aan 0,0. En voor geregistreerde waarden(4) geldt een waarde
van 5,6 en een bijbehorend tijdstip(4) dat gelijk is aan 0,3.
Signaalverwerking is de toepassing van bewerkingen (zoals het bepalen van het maximum, het
bepalen van het gemiddelde, opvullen van ontbrekende gedeeltes/interpoleren, verwijderen van
verstoringen/filteren, het bepalen van de afgeleide of primitieve en curve fitting) op een signaal.
,Hoofdstuk 1 (interactief werken met MATLAB)
1.1 Variabelen en de Workspace
Variabelen worden bewaard in de Workspace (WS). Als je zelf geen variabele aanmaakt, wordt
automatisch de variabele ‘ans’ aangemaakt. De naam voor een variabele mag je zelf kiezen. Het is
gebruikelijk om beschrijvende namen te gebruiken, zoals snelheid, kniehoek etc. Maak de namen
niet te lang, want dan is er meer kans op typfouten. Je kunt de waarde van een variabele opvragen
door de naam hiervan in het Command Window (CW) te typen en op Enter te drukken. Een variabele
moet met een letter beginnen en mag geen spaties of andere tekens bevatten (op _ na). Je kan een
waarde aan een variabele toekennen door de naam van de variabele links van het ‘=’-teken te
plaatsen en de waarde rechts ervan (nooit andersom). Met ‘Clear’ kan je de WS leegmaken. Door
‘whos’ in het CW te typen wordt de inhoud van de WS getoond.
1.2 Operatoren in Matlab
= → wordt gebruikt om een waarde aan een variabele toe te kennen (het is dus géén ‘is gelijk aan’
teken zoals bij wiskunde). Wanneer je bijv a = 7 hebt, dan ken je de waarde 7 toe aan de variabele ‘a’.
De variabele staat hierbij altijd links van het ‘=’-teken en de waarde altijd rechts.
+ → wordt gebruikt om iets bij elkaar op te tellen.
– → wordt gebruikt om iets van elkaar af te trekken.
* → wordt gebruikt om dingen met elkaar te vermenigvuldigen.
/ → wordt gebruikt om dingen door elkaar te delen.
^ → wordt gebruikt voor machtsverheffen.
( ) → worden gebruikt om onder controle te houden hoe een formule wordt uitgerekend.
. → wordt gebruikt voor kommagetallen (78,23 wordt in Matlab dus geschreven als 78.23).
; → wordt gebruikt aan het einde van een statement om deze niet in het CW te tonen.
‘ → enkel aanhalingsteken wordt gebruikt om een matrix te transponeren (van rij- naar
kolommatrix of van kolom- naar rijmatrix).
: → wordt gebruikt als t/m. Wanneer je bijv t = 1:10 hebt, dan bestaat t uit de waarde
1 t/m 10 (met een stapgrootte van 1).
% → wordt gebruikt om tekst als commentaar aan je programma toe te voegen.
Verder zijn er nog relationele operatoren die betrekking hebben op minstens 2 elementen
en die een waarde oplevert die waar (true) of onwaar (false) is. Tot slot zijn er de logische
operatoren die relaties (gemaakt met relationele operatoren) aan elkaar kunnen plakken.
1.3 Datatype
Een datatype is een verzameling van waarden met een bijbehorende verzameling van manipulaties
die op die waarden mogen worden uitgevoerd. Manipulaties zijn specifiek voor een bepaald object.
Matlab kent verschillende soorten datatypes (classes):
- Het datatype getal; kent bijv de waarden 7, 11.67 en -44 en bijbehorende manipulaties
zouden optellen, aftrekken en vermenigvuldigen kunnen zijn. Binnen dit datatype wordt er
onderscheidt gemaakt tussen integer (gehele getallen) en real (gebroken (komma-) getallen).
- Het datatype string: stukjes tekst (reeksen karakters) worden aangeduid met de term ‘string’.
Stringmanipulaties zijn bijv het aan elkaar plakken van 2 karakterreeksen en het omzetten
van een reeks kleine letters in hoofdletters.
- Het datatype record; een variabele van dit datatype bevat een aantal velden die elk op hun
beurt gevuld kunnen worden met variabelen van een zeker datatype. Een manipulatie is bijv
het selecteren van records die in een bepaald veld een zekere inhoud hebben.
- Het datatype logical (logische waarden); kan alleen de waarde 0 voor onjuist/fals en de
waarde 1 voor juist/true aannemen.
- Het datatype complex getal; een getal dat de imaginaire eenheid ‘i’ bevat.
, - Het datatype matrix; een tabel van gebroken getallen (floating point numbers). De gebroken
getallen vormen de elementen van de matrix. Ook getallen worden binnen Matlab opgevat
als matrices, namelijk als 1x1 matrices.
1.3.1 String
Een string is een reeks karakters (letters, cijfers of leestekens). Strings gebruik je bijv als
inputparameter bij de functions dips, input en title. Als je een string als waarde aan een variabele toe
wilt kennen, dan moet je de karakters tussen enkele aanhalingstekens zetten. Voorbeeld waarbij je
de string Amsterdam als waarde toekent aan de variabele stad: stad = ‘Amsterdam’. Wanneer je een
string aan een variabele toekent maakt Matlab er een rijmatrix van waarbij elk element een karakter
bevat. Hierdoor kun je een specifiek karakter in de string aanspreken. Voorbeeld van het aanspreken
van het 2de karakter van de string ‘Amsterdam’: stad(2); geeft als resultaat ‘m’.
Je kunt ook 2 stukjes string (2 (reeksen)karakters) aan elkaar plakken door ze allebei (als 2
elementen) op te nemen in 1 matrix. voorbeeld met de variabele A en B die een string bevatten: A =
‘th’, B = ‘eo’ → C = [A B]; geeft als resultaat ‘theo’.
Let op! Er is een verschil tussen het getal 7 en het karakter ‘7’ (genoteerd tussen aanhalingstekens).
Op het karakter ‘7’ kan je geen rekenkundige berekeningen uitvoeren. Er is wel een function
waarmee je een string in een getal kunt omzetten: str2num. Voorbeeld waarbij string aStr = ’56.6’
wordt omgezet in het getal aGetal = 56.6: aGetal = str2num(aStr). De omgekeerde function ‘num2str’
bestaat ook. Die is handig wanneer je een zinnetje wilt maken waarin een uitkomst of resultaat
voorkomt dat kan varieren. Voorbeeld waarbij getal = 42 wordt omgezet in string getalStr = ‘42’:
getalStr = num2str(getal). Vervolgens kun je de string Resultaat maken die de zin ‘Het resultaat is 42’
bevat door: Resultaat = ([‘Het resultaat is’, getalStr]). Let op! ‘Het resultaat is’ is een string door het
tussen enkele aanhalingstekens te zetten en getalStr is een variabele waar een string in zit. Wanneer
de waarde van het getal (in dit voorbeeld 42) veranderd, wordt dit ook in de variabele Resultaat
aangepast. Let op dat de verschillende strings als aparte elementen achter elkaar in een rijmatrix
worden geplaatst (door ze binnen blokhaken te zetten en te scheiden dmv een komma (of spatie)).
Het aan elkaar plakken van stukjes string is ook erg handig als in een programma herhaaldelijk
gegevensbestanden moeten worden ingelezen en/of opgeslagen. Deze situatie doet zich bijv voor
wanneer bij verschillende proefpersonen metingen zijn gedaan en de meetgegevens in afzonderlijke
bestanden zijn bewaard. Wanneer je zorgt voor een systematische naamgeving (bijv. sprongPP1.mat,
sprongPP2.mat etc) dan kunnen deze N-aantal bestanden als volgt worden ingelezen:
* De function ‘load’ heeft dus als invoer een string met de bestandsidentificatie (pad, naam en
extensie). De naam is opgebouwd uit de variabele fn1 (sprongPP die bij ieder bestand hetzelfde is),
de variabele fn2 (het nummer van de proefpersoon die varieert van 1 t/m N) en de variabele fn3.
Wanneer je binnen een programma een string door de gebruiker wilt laten invoeren, kun je daarvoor
de function ‘input’ gebruiken waarbij je dan als extra parameter de waarde ‘s’ moet meegeven.
Voorbeeld: uitkomst = input(‘Geef uitkomst: ‘,’s’). Ook wanneer de gebruiker nu een getal invoert
wordt deze als string aan de variabele uitkomst toegekend. Wanneer er via een input function door
de gebruiker een verkeerd karakter wordt ingevoerd is het netjes om een foutmelding te geven.
, ‘NaN’ is een Matlab-notatie voor Not a Number en ‘return’ zorgt voor het direct afbreken van de
function (alleen in noodgevallen te gebruiken).
Er zijn verschillende functions beschikbaar om strings te manipuleren:
- Upper; met de upper function zet je de kleine letters van de string die door de gebruiker
wordt ingevoerd om in hoofdletters. Stel dat je de volgende code in je programma opneemt:
Antwoord = input(‘Ben je ouder dan 20 jaar? (j/n): ‘) en de gebruiker voert als antwoord ‘j’ in
dan kan dit in een ‘J’ worden omgezet met de code: newAntwoord = upper(Antwoord).
- Lower; met de lower function zet je de hoofdletters van de string die door de gebruiker
wordt ingevoerd om in kleine letters. Alle andere karakters blijven ongewijzigd.
- Strcat; met de strcat function kunnen verschillende strings achter elkaar worden geplaatst.
1.3.2 Logicals
Logicals kunnen alleen de waarde 0 voor onjuist/false en de waarde 1 voor juist/true aannemen.
Bepaalde functies en operators geven een logische waarde als uitkomst om aan te geven of er
wel/niet aan een voorwaarde is voldaan. Voorbeeld met: lw = 5 > 6. Dit geeft als resultaat dat aan de
variabele lw de waarde 0 wordt gegeven, want 5 is niet groter dan 6 dus er wordt niet aan de
voorwaarde voldaan. Matlab kent de constante ‘true’ waarbij logical gelijk is aan 1 en de constante
‘false’ waarbij logical gelijk is aan 0. Het statement: lw = false had dus hetzelfde resultaat opgeleverd.
1.3.3 Complexe getallen
Je kunt een complex getal maken met de imaginaire eenheid ‘i’. Voorbeeld van een deling van het
complex getal zcom1 = 5 + 6i door het complex getal zcom2 = 3 – 4i: deling = zcom1/zcom2.
Er zijn ook speciale functions voor complexe getallen. De function ‘abs’ wordt bijv gebruikt om de
modulus te bepalen: modulus = abs(deling). De function ‘angle’ bepaalt het argument: argument =
angle(deling). Let erop dat het antwoord van het argument in radialen wordt gegeven.
1.3.4 De matrix
1.3.4.1 Het maken van een matrix:
Een matrix wordt in rijen beschreven binnen rechte haken. Twee elementen binnen een rij worden
van elkaar gescheiden dmv een spatie (of komma) en de rijen worden van elkaar gescheiden dmv
een puntkomma (of enter). In de WS staat de dimensie van de matrix aangegeven (in het geval van
matrix A uit het voorbeeld hieronder is dit 3x4). Een getal is een 1x1 matrix. Voorbeeld van het
maken van een 3x4 (3 rijen en 4 kolommen) matrix A:
1.3.4.2 Het aanspreken van matrixelementen dmv indices:
Om een individueel element van een matrix te kunnen gebruiken, moet het worden aangesproken
met zijn indices (rij- en kolomnummer). Deze indices worden tussen ronde haken geplaatst en dmv
een komma van elkaar gescheiden: naammatrix(rijnummer,kolomnummer). Zo geeft bijv A(3,7) het
element van matrix A dat zich in rij 3 en kolom 7 bevindt. Indices van matrixelementen kunnen
enkele getallen zijn (zoals in V(2,3) of A(4)) of meerdere opeenvolgende getallen (bijv A(1:5,3:6)). In
het laatste geval spreken we van ranges. In alle gevallen gaat het om gehele getallen die nooit lager
zijn dan 1!! De index 0 komt dus niet voor. Een voorbeeld van het aanspreken van de elementen 3
t/m 5 in de 2de rij van matrix A: A(2,3:5). Hierbij lees je de dubbele punt als t/m. Voorbeeld van het
aanspreken van de elementen van matrix A in rij 1 en 2 van kolom 3: A(1:2,3).