Perceived pitch of vibrato

Tamara Cook, B. Sc.

2018-01-18

Thema: Worum geht es?

  • Primer zum Themengebiet
  • Musik: Vibrato
  • Akustik

Was ist Vibrato

  • Musikalisches Stilmittel
  • spezifische Charakteristik, mit der ein Klang versehen werden kann
  • Verleiht dem Klang Fülle und Emotionalität

Erzeugung: Praxisbeispiel

Physikalische Beschreibung

  • periodische Frequenzmodulation
  • Schwankung der Klangfrequenz über die Zeit hinweg zwischen unterer (\(f_0\)) und oberer (\(f_1\)) Frequenz
  • Modulationsrate: Frequenz der Modulation, Abgrenzung von Trägerfrequenz
  • Tiefe: \(f_1/f_0\) (mus. Intervall)

Exkurs: Cent-Skala

  • Einheit für mus. Intervalle
  • Verhältnisskaliert, besitzt einen Nullpunkt
  • Auflösung: Ein Halbtonschritt = 100 Cent
  • Eine Oktave umfasst 12 Schritte, also 1200 Cent
  • JND liegt bei ca 5 Cent
  • \(c = \frac{1200}{\log{2}}\cdot\log{\frac{f_1}{f_0}}\)

Vibrato und Wahrnehmung

  • beliebt bei Anfängern, kräftigerer Klang
  • Viele Musiker glauben, man müsse hier weniger genau intonieren
  • Bei ausreichender Rate wird Vibrato mit bestimmter Tonhöhe wahrgenommen (Genauigkeit ca 10 Cent)

Das Experiment

Fragestellung

  • Hängt subjektive Tonhöhe von der Modulationsform ab?
  • subj. Tonhöhe wird bei symmetrischer Modulation durch geometrisches Mittel einer Periode geschätzt
  • \(\overline{f} = \sqrt[n]{\prod_{i=1}^n f_i}\)
  • \(f_0 < \overline{f} < f_1\)
  • Gehen bei Asymmetrie die langsameren Anteile stärker in Wahrnehmung ein?

Hypothesen

  • S.T. weicht von \(\overline{f}\) ab in Richtung stabiler Anteile
  • Abweichung hängt positiv mit Länge des stabilen Anteils zusammen

Design

  • Vibratotöne mit gleichem geometrischen Mittel darbieten
  • UV: stabile Anteile in der Modulationsform (Länge und Ort)
  • Länge: relativer Anteil \(p\) einer Periode
  • Ort: \(f_0\) oder \(f_1\)
  • AV: subjektive Tonhöhe

Stimuli

  • trapezförmige Modulationsformen (\(\overline{f} = 500\mathrm{Hz}\))
  • Tiefe: 150 Cent
  • Jede Periode besteht aus zwei Flanken und einem mittleren Plateau
  • Länge des Plateau bestimmt relativen stabilen Anteil \(p\) (0, 0.25, 0.5 oder 0.75)
  • Plateau entspricht \(f_0\) oder \(f_1\)
  • bei \(p=0\) ist es dreieckig, kein Plateau
  • insgesamt 7 Stimuli

Trapezformen

Apparatur

  • Computer mit Kopfhörer und Tastatur
  • OS X mit Octave
  • Stimuli werden mit PsychPortAudio als frequenzmodulierte Sinustöne generiert
  • Bildschirm nicht notwendig

Aufgabe

  • VP hört Stimulus auf einem Ohr und einen normalen Sinus auf dem anderen
  • Per Tastatur wird die Tonhöhe des Sinus an den Stimulus angepasst
  • kein Zeitdruck, Stimuli nacheinander abarbeiten
  • einstellbare Schritte: 5, 100 und 1 Cent
  • Lautstärke beider Töne ist anpassbar

Ablauf

  • Instruktion: Aufgabe und Tastaturbelegung
  • Darbietung der 7 Stimuli, jeder viermal, Reihenfolge randomisiert
  • Startfrequenz des Sinus randomisiert zwischen \(250\mathrm{Hz}\) und \(1\mathrm{kHz}\)
  • In jedem der 28 Trials nimmt die VP die Herstellung vor und geht mittels Enter zum nächsten Trial über
  • Daten werden schließlich als CSV exportiert

Ergebnis

Diskussion und Kritik

  • Ergebnis konsistent mit Hypothesen, aber Fehlerbalken überlappen
  • Ermüdung: Evtl. sind 28 Trials auf einmal etwas anstrengend (weniger Trials oder auf Termine splitten)
  • Bei der gleichzeitigen Darbietung zweier Töne können Schwebungen auftreten
  • Mediationshypothese: Vpn versuchen bei der Herstellung die Schwebungen zu minimieren

Implementierung: Herausforderungen

Bestimmung der Trapeze

  • Wie findet man \(f_0\) und \(f_1\)?
  • Viele Parameter sind bekannt, aber die passenden Stützpunkte nicht
  • Einzelner Freiheitsgrad durch vorgegebene Tiefe von 150 Cent
  • Ist \(f_0\) bekannt, so ist auch \(f_1\) bekannt und umgekehrt

Analytische Suche

  • Mit Mathematica ließen sich Gleichungen zur Bestimmung von \(f_0\) aus den Vorgaben ermitteln
  • Mathematica arbeitet symbolisch, Matlab oder R hingegen numerisch
  • Nicht für jedes Problem gibt es analytische Lösungen
  • Zwei Seiten Integralrechnung später …

Analytische Lösung

function extremes_Hz = getExtremes(self)
  a = self.ratio();
  alpha = (a^(1/(1-1/a))) / exp(1);
  p = self.stable_rel;
  extremes_Hz = [ 0, 0 ];
  switch self.peak
  case "low"
    extremes_Hz(1) = self.pitch_Hz * a^(-p) * alpha^(p-1);
  case "high"
    extremes_Hz(1) = self.pitch_Hz * alpha^(p-1);
  end% switch
  extremes_Hz(2) = a*extremes_Hz(1);
end

Fit

  • Steht kein Mathematica zur Verfügung oder existiert keine analytische Lösung, kann man die Lösung auch fitten
  • z.B. in Matlab der Simplex-Algorithmus via fminsearch
  • versucht Prüfkriterium durch anpassen der Freiheitsgrade zu minimieren
  • Prüfkriterium: eigene Funktion mit Freiheitsgraden als Eingabe und Prüfkriterium als Ausgabe
  • wichtig: mit sinnvollen Startwerten anfangen

Vibrato-Fit

function err = errorfun(a, v)
  extremes_Hz = [ a, v.ratio() * a ];
  v = v.recalc(extremes_Hz);
  m = mean(v.modCycle_Hz, "g");
  err = (v.pitch_Hz - m)^2;
end
addpath ../experiment;
v = Vibrato();
fprintf("Analytic f_0: %d\n", v.extremes_Hz(1));
[ a, err ] = fminsearch(@(a) errorfun(a, v), 300);
fprintf("Estimated f_0: %d\nerror: %d\n", a, err);
#> Analytic f_0: 489.133
#> Estimated f_0: 489.13
#> error: 1.20039e-05

Beispiel: nichtlineare Regression

\[y = a\sqrt{x} + b\]

function err = errorfun(params, data)
  a = params(1); b = params(2);
  y_hat = a*sqrt(data.x) + b;
  err = sum((data.y-y_hat).^2);
end
data.x = 1:50;
data.y = 5*sqrt(data.x) + 1;
[ params, err ] = fminsearch(@(params) errorfun(params, data), [ 1, 0 ]);
fprintf("a: %d\nb: %d\nError: %d", params(1), params(2), err);
#> a: 4.99997
#> b: 1.00012
#> Error: 1.61518e-07

Phasensprünge

  • Beim Aneinanderhängen von Sinustönen können hörbare Phasensprünge entstehen
  • \(a(f, t) = \sin{2πft}\)
  • Sinus transformiert die Phasen (Radianten) zu Amplituden (Werte pendeln zwischen -1 und 1)
  • Alle \(2\pi\) rad (Vollwinkel) ist der Sinus einmal vollständig gependelt
  • die hörbaren Artefakte sind Unregelmäßigkeiten der Membran beim Pendeln

Wiederholung eines Tons

  • Der Folgeton muss mit der richtigen Phase beginnen, die an den vorigen Ton anschließt
  • Soll ein Ton (endlos) repeatet werden, müssen Anfang und Ende zusammenpassen
  • Man hört bereits, wenn die Startphase doppelt vorkommt (Anfang und Ende)

Beispiel mit Fehler

fs_Hz = 48000;
freq_Hz = 440;
duration_s = 1;
repeat_times = 10;
t_s = linspace(0, duration_s, duration_s*fs_Hz+1);
phase_rad = 2*pi*freq_Hz*t_s;
a = repmat(sin(phase_rad), 1, repeat_times);
audiowrite("soundsamples/sound1.wav", a, fs_Hz);

gleiches Beispiel korrekt

fs_Hz = 48000;
freq_Hz = 440;
duration_s = 1;
repeat_times = 10;
t_s = linspace(0, duration_s, duration_s*fs_Hz+1);
phase_rad = t_s(1:end-1)*2*pi*freq_Hz;
a = repmat(sin(phase_rad), 1, repeat_times);
audiowrite("soundsamples/sound2.wav", a, fs_Hz);

Herstellungsmethode: dynamische Töne

  • Werden Folgetöne dynamisch generiert, müssen die Startphasen mit „durchgeschleift“ werden
  • Bei der Berechnung eines Tons wird gleichzeitig auch die nächste Startphase bestimmt, die dem nächsten Ton hinzugefügt wird
  • möglicher Ansatz: Das letzte Element im Zeitvektor (Tondauer) führt zur neuen Startphase
  • Nur der Modulo der Startphase von \(2\pi\) ist entscheidend, so bleibt der Wert auch nach oben hin begrenzt

Beispiel

duration_s = 0.5; fs_Hz = 48000;
t_s = linspace(0, duration_s, duration_s*fs_Hz+1);
s = []; nextStartPhase = 0;
for f = [ 400, 600, 800 ]
  phase_rad = nextStartPhase + 2*pi*f*t_s;
  a = sin(phase_rad(1:end-1));
  nextStartPhase = mod(phase_rad(end), 2*pi);
  s = [ s, a ];
end
audiowrite("soundsamples/sound3.wav", s, fs_Hz);

Quellen

Literatur

Mesz, B. A., & Eguia, M. C. (2009). The pitch of vibrato tones: A model based on instantaneous frequency decomposition. Annals of the New York Academy of Sciences, 1169(1, III), 126—130. https://doi.org/10.1111/j.1749-6632.2009.04767.x