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')
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)
Man kann die Grundfrequenz auch durch Autokorrelation bestimmen. Grüße, Peter
... 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...
http://tait.e-technik.uni-ulm.de/downloads/books/signal_und_systemtheorie_matlab.pdf Seite 9: xcorr() Grüße, Peter
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.