ppt

Werbung
Analyse von Spektra 2
Jonathan Harrington
1. Wiederholung: Spektra in R einlesen
2. Einige grundlegende Funktionen
3. Zugriff auf Spektralwerte
4. Spektrale-Abbildungen
5. Spektrale Unterschiede in Plosiven
Zuerst zur Erinnerung…
Bei einer Fourier-Analyse werden N aufeinanderfolge
digitale Werte eines Zeitsignals in N spektrale Werte
umgewandelt.
Dauer in ms eines N-Punkt-Fensters: N/fskHz, wo
fskHz die Abtastrate in kHz ist. zB 256 Punkte bei 10
kHz = 25.6 ms.
Das Algorithmus um die Fourier-Analyse anzuwenden
ist ein FFT und dafür muss N einer Potenz 2 sein.
Von den N-spektralen Werten behalten wir diejenigen
bis zur und inkl. der Faltung-Frequenz.
Das sind (N/2) + 1 spektrale Komponente zwischen 0
und fs/2 Hz mit einem Frequenzabstand von fs/N
1a. Utterance-List der kielread06 Datenbank laden
to tkassp
b. FFT Anwendung
N = 512 bedeutet eine
Frequenzauflösung von
16000/512 = 31.25 Hz (bei
einer Abtastrate von 16
kHz).
den Pfad eintragen, wo die
spektralen Daten
gespeichert werden sollen
Die Extension, mit der die
spektralen Daten
gespeichert werden sollen
c. Template-Datei ändern
d. Äußerungen auswählen
k67*00*
add to list
K67MR010
add to list
e. Segmentliste speichern
zB fric.txt
f.gespeicherte Segmentliste in R einlesen…
g. Spektral-Objekte in R einlesen
fric = read.emusegs("H:/fric.txt")
Segmentliste
sp = emu.track(fric, "dft")
fric.l = label(fric)
Label-Vektor
Spektral-Trackdatei
sp5 = dcut(sp, .5, prop=T)
Spektral-Matrix der Daten
zum 50% Zeitpunkt
Spektral-Objekte
2. Drei grundlegende Funktionen
sp
sp5
Spektral-Trackdatei
fric
Spektral-Matrix zum zeitlichen Mittelpunkt
is.spectral()
fric.l
Segmentliste
Label-Vektor
ist dies ein Spektral-Objekt?
dim()
Wieviele Dimensionen?
trackfreq()
Welche Frequenzen sind vorhanden?
sp
Spektral-Trackdatei
sp5
Spektral-Matrix zum zeitlichen Mittelpunkt
Label-Vektor
fric.l
Segmentliste
fric
is.spectral(sp) [1] TRUE
dim(sp)
is.spectral(sp5)
[1]
9 Segmente
fric.l
[1] "x" "C" "C" "x"
"x" "C" "C" "C" "C"
dim(sp5)
9 257
257 Spalten
weil wir einen 512
Punkt FFT
angewendet haben
sp
Spektral-Trackdatei
sp5
Spektral-Matrix zum zeitlichen Mittelpunkt
fric.l
fric
Label-Vektor
Segmentliste
Was ist der Frequenzabstand in diesem Fall
zwischen den Spektralkomponenten?
16000/512 = 31.25 Hz
Mit trackfreq() bekommt man die tatsächlichen
Frequenzen:
trackfreq(sp5)
0.00
31.25
62.50
93.75 125.00 156.25
187.50 218.75 250.00 …7937.50 7968.75 8000.00
3. Zugriff auf die Spektralwerte
Spektrale Trackdatei/Matrizen können genau wie
Trackdateien/Matrizen behandelt werden, abgesehen
davon, dass sich die Werte nach dem Komma auf die
Frequenzen beziehen.
sp
Spektral-Trackdatei
sp5
Spektral-Matrix zum zeitlichen Mittelpunkt
fric.l
fric
Label-Vektor
Segmentliste
zB
Spektrale Werte (zum zeitlichen Mittelpunkt) des
4en Segmentes (also alle Frequenzen)
das gleiche zwischen 1000-2000 Hz
sp5[4,1000:2000]
Spektrale Werte, Segmente 4, 5, 7 Frequenzen
2000-2500 Hz
sp5[c(4,5,7), 2000:2500]
Spektrale Werte aller Segmente 0-500 Hz:
sp5[,0:500]
Frequenzen 480 Hz und 2000 Hz Segmente 1 und 3?
sp5[c(1,3), c(480, 2000)]
Man kann auch einzelne Spektralwerte bekommen: man
bekommt (wie in allen Fällen) die Werte der nächst
liegenden Frequenz, zB:
sp
Spektral-Trackdatei
sp5
Spektral-Matrix zum zeitlichen Mittelpunkt
fric.l
fric
Label-Vektor
Segmentliste
Spektrale Werte aller Segmente zu 490 Hz
w = sp5[,490]
w
1527.5
1727.5
2217.5
19.39060 18.88820 4.13902
887.5
1677.5
36.24630 27.15270
747.5
1122.5
1107.5
1927.5
27.91090 22.86600 16.02600 24.91330
attr(,"class")
[1] "numeric" "spectral"
attr(,"fs")
[1] 500
500 is die nächst liegende Frequenz an 490
trackfreq(sp5)[15:20]
[1] 437.50 468.75 500.00 531.25 562.50 593.75
sp
Spektral-Trackdatei
sp5
Spektral-Matrix zum zeitlichen Mittelpunkt
fric.l
fric
Label-Vektor
Segmentliste
w
1527.5
1727.5
2217.5
19.39060 18.88820 4.13902
887.5
1677.5
36.24630 27.15270
747.5
1122.5
1107.5
1927.5
27.91090 22.86600 16.02600 24.91330
attr(,"class")
[1] "numeric" "spectral"
attr(,"fs")
[1] 500
w enthält 9 dB Werte = die Amplituden zu dieser Frequenz 490
Hz. Warum 9?
Das sind die Amplituden zu 490 Hz dieser Segmente:
fric.l
[1] "x" "C" "C" "x" "x" "C" "C" "C" "C"
sp
Spektral-Trackdatei
sp5
Spektral-Matrix zum zeitlichen Mittelpunkt
fric.l
fric
Label-Vektor
Segmentliste
w
1527.5
1727.5
2217.5
19.39060 18.88820 4.13902
887.5
1677.5
36.24630 27.15270
747.5
1122.5
1107.5
1927.5
27.91090 22.86600 16.02600 24.91330
attr(,"class")
[1] "numeric" "spectral"
attr(,"fs")
[1] 500
Das sind die Zeiten zu denen, die Spektral-Werte
vorkommen. (zum zeitlichen Mittelpunkt des jeweiligen
Segmentes)
sp
Spektral-Trackdatei
sp5
Spektral-Matrix zum zeitlichen Mittelpunkt
fric.l
fric
Label-Vektor
Segmentliste
w
1527.5
1727.5
2217.5
19.39060 18.88820 4.13902
887.5
1677.5
36.24630 27.15270
747.5
1122.5
1107.5
1927.5
27.91090 22.86600 16.02600 24.91330
attr(,"class")
[1] "numeric" "spectral"
attr(,"fs")
[1] 500
fric
segment list from database:
kielread06
query was: Phonetic = C | x
labels
start
end
utts
1
x 1493.940 1567.440 K67MR001
2
C 1710.690 1745.130 K67MR001
3
C 2144.190 2283.130 K67MR001
4
x 825.313 947.812 K67MR003
5
x 1656.810 1694.750 K67MR003
6
C 718.000 776.375 K67MR004
7
C 1078.440 1164.940 K67MR004
8
C 1079.810 1136.440 K67MR006
9
C 1875.000 1985.690 K67MR008
zeitlicher Mittelpunkt
des 5en Segmentes
4. Abbildung der Spektra
plot()
eigentlich plot.spectral() – d.h. plot() erkennt,
dass es sich um spektrale Objekte handelt, und setzt dann
plot.spectral() ein (ein Beispiel von Object Oriented
Programming)
daher um Hilfe/Beispiele bei der Anwendung der
Abbildungen von Spektra zu bekommen,
help(plot.spectral), jedoch ganz einfach plot()
bei der Erzeugung von Spektral-Abbildungen
verwenden.
sp
Spektral-Trackdatei
sp5
Spektral-Matrix zum zeitlichen Mittelpunkt
fric.l
fric
Label-Vektor
Segmentliste
Spektra aller Segmente
Nach Etikettierung kodiert
plot(sp5)
plot(sp5, fric.l)
Spektra im Bereich 1000-3000 Hz, + Etikettierung
plot(sp5[,1000:3000], fric.l)
Spektra der Segmente 3 und 5 Frequenzbereich
höher als 3500 Hz nach Farbe kodiert
plot(sp5[c(3,5), 4000:8000], fric.l[c(3,5)])
4b. Durchschnittsspektra
(ensemble-averaged spectra)
zuerst etwas zu Decibel…
Decibel-Werte
Die Amplituden-Werte, die man durch tkassp bekommt sind
in Decibel.
Decibel sind aber Logarithmen, und um den
Durchschnitt von Logarithmen zu bekommen, müssen
sie zuerst in Anti- Logarithmen (eine Potenz hoch 10)
umgerechnet werden.
Diese Umrechnung in Anti-Logarithmen konvertiert
die logarithmische Decibel oder Bel Skala in eine
lineare Kraft Skala
Die Berechnung (Durchschnitt usw.) erfolgt dann in der
Kraft-Skala.
Dann werden diese Berechnungen wieder in dB
konveriert.
Logarithmische dB-Werte
lineare Kraft-Werte
Berechnungen
durchführen
Logarithmische dB-Werte
60 dB
10^6
70 dB
10^7
(10^6 + 10^7)/2
= 5500000
10 * log(5500000, base=10)
[1] 67.40363
Glücklicherweise muss man nicht selbst diese
Umrechnungen Decibel  Kraft  Decibel
durchführen: dies erfolgt bei Funktionen wie plot()
oder fapply() automatisch durch die Setzung des
Argumentes power = T
35
plot(sp5[,1000:1500],
fric.l, fun="mean", power=T)
25
30
15
0 10
Decibel
plot(sp5[,1000:1500], fric.l)
1000
1200
1400
1000
1200
1400
Frequenz
Dieser Wert ist der Durchschnitt aller
'roten' Werten zur selben Frequenz
5. Analyse von Plosiven
plos.l
plos.w
plos.lv
plos.asp
plos.sam
plos.dft
Etikettierungen ("b", "d")
Die entsprechenden Wortetikettierungen
Die Etikettierungen der danach kommenden Vokale
Vektor der Zeiten, zu denen der Burst vorkommt
Zeitsignale von "b" "d"
Spektrale Trackdatei
Wie kann man plos.dft benutzten um (a) die Abtastrate
(b) die Fensterlänge, mit der die spektralen Daten
berechnet worden sind, zu bekommen?
freqint = trackfreq(plos.dft)
fs = 2 * max(freqint)
N = fs/freqint[2]
Die [b, d] Burst-Spektra sollen sich dadurch
unterscheiden, dass zwischen 500-4000 Hz [d]Spektra steigen (die Amplitude nimmt mit
zunehmender Frequenz zu) während [b]-Spektra
fallen. Kann dieser Unterschied in diesen Daten
festgestellt werden?
Hier ist das Zeitsignal fuer den zweiten Segment
plot(plos.sam[2,], type="l")
Der Zeitpunkt, zu dem der Burst vorkommt…
abline(v=plos.asp[2], col=2)
Das Spektrum ist über 256 Punkte berechnet
worden. Wieviele ms bei fs = 16000 Hz?
16 ms
Hier ist das Intervall, worauf der 256-Punkt FFT
analysiert worden ist…
abline(v=plos.asp[2]-8, col=3)
abline(v=plos.asp[2]+8, col=3)
5000
data[, k]
0
-5000
420
440
460
480
times
500
520
plos.l
plos.w
plos.lv
plos.asp
plos.sam
plos.dft
Etikettierungen ("b", "d")
Die entsprechenden Wortetikettierungen
Die Etikettierungen der danach kommenden Vokale
Vektor der Zeiten, zu denen der Burst vorkommt
Zeitsignale von "b" "d"
Spektrale Trackdatei
Wir benötigen die spektralen Werte zum
Zeitpunkt vom Burst.
p5 = dcut(plos.dft, plos.asp)
Beweise, dass [b] Spektra steigen, [d] fallen
(zwischen 500 Hz und 4000 Hz?)
par(mfrow=c(1,2))
plot(p5[,500:4000], plos.l, ylab="Intensitaet
(dB)", xlab="Frequenz (Hz)")
40
b
d
0
30
20
40
b
d
20
-20
Intensitaet (dB)
60
plot(p5[,500:4000], plos.l, fun="mean",
power=T, xlab="Frequenz (Hz)")
500
2000
3500
Frequenz (Hz)
500
2000
3500
Frequenz (Hz)
Herunterladen