Verfasst am: 01.05.2014, 20:35
Titel: Vokalanalyse mithilfe des Frequenzspektrums
Mit einem Kommolitonen möchte ich ein Vokalanalyseprogramm entwerfen, welches im Frequenzspektrum anhand der Resonanzfrequenzen (Formanten) einzelne Vokale zuverlässig bestimmt. (a,e,i,u,o,ö,ä,ü - Keine Wörter)
Bisher haben wird das Zeitsignal mittels einer FFT in den Frequenzbereich transformiert, dort gefenstert, gefiltert, den Betrag gebildet und dann mittels der max-Funktion die jeweils größten Frequenzen in den einzelnen "Formantregionen" rausgeben lassen. Bei den verschiedenen Vokalen klappt dies mal mehr, mal weniger gut.
Mein Problem ist nun:
Ich möchte den Frequenzgang gerne glätten, damit unsere Suche nach den maximalen Frequenzen besser gelingt.
Es gibt das SP-Tool von Matlab, welches mittels der "Burg-Methode" einen Frequenzgang glättet und das "Burg Power Spectral Density Estimate" darstellt. Also wohl eine Schätzung, in welchen Frequenzbereichen die meiste Energie liegt.(?)
Das Ganze gefällt mir schon sehr gut, aber ich bekomme es einfach nicht hin, diesen "burg-Befehl" selbst ohne die Toolbox anzuwenden und in meine Funktion richtig zu integrieren.
Hat jemand zufällig mehr Erfahrung, wie ich mein Problem am Besten lösen könnte?
Ich freue mich über jegliche Hilfe !
Mein code:
Code:
% Vokalanalyse - Eingabe von daten und sampling-frequenz
% - Darstellung des Betragsspektrums -
N = length(x);
H = fft(x,N);
H1 = abs(H);
f = 0:fs/2;
f = 0:fs/N:fs/2;
f = linspace(0,fs/2,N/2+1);
figure(1); clf;
stem(f, abs(H1(1:N/2+1))) xlabel('f\rightarrow') title('Betragsspektrum')
%Filterung und Fensterung
x1 = x.*hamming(length(x)); %1. Fensterung der Sprache mit Hamming!
preemph = [10.63]; %2. Filterung mit Highpass
x1 = filter(1,preemph,x1);
Ich denke, dass ich es nun hinbekommen habe, die "burg"-Funktion richtig zu benutzen. Das geglättete Frequenzspektrum ist das Gleiche wie bei den Einstellungen mit der Matlab-Toolbox.
Mein Problem nun ist aber, dass ich nicht die korrekten Maximalwerte aus dem Plot des Frequenzganges bekomme.
Mit dem Befehl "max" unterscheiden sich die Werte immer von den ablesbaren Werten im Plot.
Weiß jemand zufällig, was ich hier falsch mache?
Code:
%Darstellung mit der burg-Funktion
figure(2) [Pxx,freq] = pburg(x1,60,length(x1),fs);
plot(freq,10*log10(Pxx)); axis tight;
xlabel('Frequency');
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.