Forum: Digitale Signalverarbeitung / DSP / Machine Learning Grundfrequenz einer Sprachdatei bestimmen


von badman (Gast)


Lesenswert?

Hallo zusammen,

ich hoffe ich bin hier richtig und finde hier antworten.

Ich versuche ein Programm zu schreiben, mit dem ich Sprache aufnehmen 
kann (z.B. das Wort "Maus") und dann davon ein Spektrogramm und ein 
Spektrum zu erstellen und dann, das ist die eignetliche Aufgabe, die 
Grundfreuquenz von der Sprache zu ermitteln.

Ich habe in Matlab nun das Gui erstellt und kann nun auch aufnehmen und 
das Spektrogramm und Spektrum erzeugen. Hoffe bis hierhin ist das 
richtig.
Aber nun komm ich leider nicht weiter. Ich weiß nicht wie ich an die 
Grundfrequenz rangehen soll um diese zu ermitteln.

Kann mir da jmd helfen. Was Matlab anbelangt bin ich noch recht 
unerfahren...!
Unten mal mein Code, den ich bisher habe. Allerdings bin ich mir noch 
nicht mal sicher ob ich die richtige Spektrum Funktion gewählt habe.

Vielen, vielen Dank für Lösungsansätze, Tips und Hinweise.

MFG

Anhang[]


% Speicher und Fensterinhalt löschen
clear all
clc

% Oberfläche
figure (1)

set(gcf,'menubar','none','units','normalized')
uimenu ('label','&Fenster schließen','callback','close')

% Buttons

Button1 = uicontrol (gcf,...
    'Style','Push',...
    'Position', [10 350 70 30],...
    'String', 'Record',...
    'Callback','Record');

Button2 = uicontrol (gcf,...
    'Style','Push',...
    'Position', [10 315 70 30],...
    'String','Play',...
    'Callback','Play');

Button3 = uicontrol(gcf,...
    'Style','Push',...
    'Position', [10 210 110 30],...
    'String', 'Draw spectogram',...
    'Callback', 'Spectrogramm');

Button4 = uicontrol(gcf,...
    'Style','Push',...
     'Position', [10 175 90 30],...
    'String', 'Draw Spectrum',...
    'Callback', 'SpeKctrum');

Button5 = uicontrol(gcf,...
    'Style','Push',...
     'Position', [10 140 135 30],...
    'String', 'Calculate Grundfrequenz',...
    'Callback', 'pksGF');

% Grafik erstellen

set (gca,...
    'Position',[.4 .1 .5 .8])

% Grafikbeschriftung figure (1)

% axis ([1 10 -5 5])
title ('Amplituden-Zeit-Diagramm')
ylabel ('Amplitude')
xlabel ('Zeit [s]')

------------------------------------------------------------------------ 
-

%Deklaration

Fs = 44100;     %Fs = Abtastrate
nbits = 16;     %Bits per sample
nChannels = 1;  %The number of channels: 1 (mono) or 2 (stereo).
length = 3;      %Length of record

%Aufnahme

RecordObj = audiorecorder(Fs, nbits, nChannels);
get(RecordObj);

% Record your voice for 3 seconds.

RecordObj = audiorecorder;
disp('Start speaking...')
recordblocking(RecordObj, length);

%recordblocking = Does not return control until recording completes.

disp('End of Recording!');

% Store data in double-precision (doppelte Genauigkeit) array.
% Scheint wohl der Vektor zu sein
myRecording = getaudiodata(RecordObj);

% Plot the waveform. Linien = -/--/:/-.
%                    Punkte = ./+/*/o/x
%                    Farbe  = r/b/y/g

set (gca,'Position',[.4 .1 .5 .8])

plot(myRecording,'r');

% axis ([1 10 -5 5])

% Grafikbeschriftung

    title ('Amplituden-Zeit-Diagramm')
    ylabel ('Amplitude')
    xlabel ('Zeit [s]')

------------------------------------------------------------------------ 
--
% Play back the recording.
play(RecordObj);

% "playblocking" = Play, and do not return control until playback
% completes.
------------------------------------------------------------------------ 
--
%Deklaration
x = myRecording;

% Spectrogram

figure(2)

spectrogram (x,128,120,128,1E3);
title ('Spectrogram')
view(270,90);
------------------------------------------------------------------------ 
-
%Deklaration
x = myRecording;

%Spectrum --> spectrum.periodogram

figure(3)

Hs = spectrum.periodogram;
psd(Hs,x,'Fs',Fs)
title ('Spectrum.periodogram')

von Christian B. (casandro)


Lesenswert?

Mit einem Spektrogramm wirst Du da nicht weit kommen. Typischerweise 
macht man das mit linearer Vorhersage.

http://de.wikipedia.org/wiki/Lineare_Vorhersage

Grob gesagt funktioniert das wie folgt:
Du nimmst ein Prädiktionsfilter, das ist ein Filter, welches basierend 
auf den vorhergegangenen Werten, den nächsten Wert versucht zu 
bestimmen. (typ. Wiener-Filter) Der Unterschied zwischen dem realen und 
dem geschätzten Wert bezeichnet man als "Fehler".

Wenn Du da Sprache rein schickst, bekommst Du immer dann, wenn die 
Stimmbänder sich öffnen einen Peak beim Fehler. Die Koeffizienten Deines 
Filters geben Dir Informationen zu den Oberwellen.

Mehr Info gibts hier:
http://en.wikipedia.org/wiki/Linear_predictive_coding

Linear Predictive Coding ist eine andere Anwendung dieses Verfahrens bei 
dem man versucht Sprache mit möglichst wenig Bits nachzugeben. Bei GSM 
hat man ein modifiziertes Verfahren davon. (CELP)

von Peter D. (pdiener) Benutzerseite


Lesenswert?

Man kann die Grundfrequenz auch durch Autokorrelation bestimmen.

Grüße,

Peter

von badman (Gast)


Lesenswert?

... und wie kann ich das in Matlab am Besten bewerkstelligen, Peter?

Ich muss wirklich sagen, dass ich generell mit Matlab meine 
Scwhierigkeiten habe, aber wie ich die Grundfrequenz bestimmen soll bzw. 
wie der Programmcode dazu aussieht, das fällt mir wikrlich schwer. 
Versuche mich un schon seit mehr als 1 Woche in die Thematik 
einzuarbeiten aber bekomms irgendwie nicht hin...

von Peter D. (pdiener) Benutzerseite


Lesenswert?


von Max G. (l0wside) Benutzerseite


Lesenswert?

Google mal nach Cepstrum.

Analyse von Sprachsignalen ist nicht ganz trivial, weil man nicht nur 
einen unbekannten Kanal, sondern auch eine letztendlich unbekannte 
Quelle (genauer zwei: eine für stimmhafte Laute, eine für stimmlose 
Laute) modellieren muss.
Je nach Vorhaben musst Du dann auch noch den Mund-Rachen-Nasenraum mit 
berücksichtigen. Das alles hilft Dir aber bei Plosivlauten (p, t, k) nur 
wenig, die sind nochmal anders zu modellieren. Zur Abrundung ist das 
alles natürlich beliebig instationär.

Man muss die Standardwerkzeuge der Nachrichtentechnik da gelegentlich 
ein bisschen kreativ nutzen. Das Cepstrum mit seinem logarithmierten 
Spektrum ist da ein schönes Beispiel.

Was hast Du denn genau vor?

Max

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

Im Zusammenhang mit der Sprach(grundfrequenz)erkennung habe ich auch 
schon von Cepstrum gelesen. Hier ein alter Grundlagenartikel, auch mit 
einem Kapitel Sprachanalyse (ab Seite 25):
http://www.bksv.com/doc/technicalreview1981-3.pdf

weitere Firmenschriften dazu mit der Suchfunktion:
http://www.bksv.com/Search.aspx?searchText=cepstrum&page=1&category=&itemsPerPage=50

von Max G. (l0wside) Benutzerseite


Lesenswert?

Christoph Kessler (db1uq) schrieb:
> Im Zusammenhang mit der Sprach(grundfrequenz)erkennung habe ich auch
> schon von Cepstrum gelesen. Hier ein alter Grundlagenartikel, auch mit
> einem Kapitel Sprachanalyse (ab Seite 25):
> http://www.bksv.com/doc/technicalreview1981-3.pdf

Ui, das ist ja schick. Die von mir verwendete Literatur war mindestens 
zehn Jahre jünger. Und es ist schon über ein Jahrzehnt her, dass ich 
mich damit beschäftigt habe. Tempus fugit...

Gruß,

Max

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.