Jetzt stehe ich vor einem weiteren Problem. Wenn ich das Recording starten möchte, muss ich ja auch die Funktion starten, welche die Sprachinformationen aufnimmt. Jedoch muss ich bei wavrecord die Anzahl der Samples und die Abtastrate angeben, also sprich die Zeit für die Aufnahme. Jedoch die Zeit habe ich frühstens im Fall case 'up', welche ich mit tic und toc ermittel, also bei loslassen des Buttons. Der Funktionsaufruf beginnt aber bereits bei Drücken des Buttons.
Jetzt habe ich mir überlegt, dass ich generell die Zeitspanne von 5 Sekunden aufnehme, also für mein wavrecord(5*8000, 8000). Und später dann das Signal auf 'toc' Sekunden schneiden. Jedoch wenn ich früher als 5 Sekunden den Button loslasse, wird die Funktion wavrecord ja trotzdem die 5 Sekunden ausgeführt, sodass das Push to talk Verfahren damit sinnlos ist.
Über einen Tipp wäre ich sehr dankbar. Vielleicht kann man die Operation frühzeitig beenden oder parallel die Rechnung durchführen?
Viele Grüße
voice
Code:
set(ButtonH, 'Value', 0);
a = 'stop'
% STOP THE RECORDING...
t = toc case 'down'
set(ButtonH, 'Value', 1);
% START THE RECORDING...
a = 'start'
tic
rec = wavrecord(5*8000,8000)% 5 Sek rec bei 8000 Hz
schon mal vielen herzlichen Dank für die viele Arbeit und Mühe. Auf dem einen Rechner mit der Matlabversion R2009a funktioniert der Code. Bei der Matlabversion R2007 hingegen nicht so richtig. Die Funktion wird so lange ausgeführt, wie ich Sekunden bei record eingebe. Bei Dir waren es 100. Dies ist doch die maximal mögliche Aufnahmedauer, oder? Sobald ich aber den Button loslasse, passiert nichts. Auch der Plot sieht bei der älteren Version nach den 100 Sekunden nicht so richtig aus. Bei der neuen habe ich dies noch nicht überprüft, da das Headset bis dato nur mit dem Rechner der älteren Version verknüpft ist.
Kann das an den unterschiedlichen Versionen liegen?
Bei Dir waren es 100. Dies ist doch die maximal mögliche Aufnahmedauer, oder?
Nein das ist nicht die maximal mögliche Aufnahmedauer, sondern die von mir als Beispiel benutzte. Du kannst dort auch 1000 reinschreiben. Ich habe mir nur gedacht, dass ein User bestimmt nicht 100 sec auf den Button drückt und somit kann ich die Aufnahme belibig stoppen...
Zitat:
Kann das an den unterschiedlichen Versionen liegen?
Ja das kann sein. Da ich mit R2007 noch nie gearbeitet habe, kann ich das nun auf die Schnelle nicht zu 100% "beja-en". Bei meiner Version 2010a mit der ichs getestet habe, funktionierte es. Nur habe ich kein Headset angeschlossen um nun auch noch zu kontrollieren wie das Signal dann aussieht. Ich gehe mal davon aus, dass die Funktion audiorecorder das Ausführt was man aus der Hilfe entnehmen kann...
Musste einfach mal ausprobieren...
super. Es funktioniert. Ich habe einfach die Zeit, sprich die 100 Sekunden raus genommen. Dann kam auch die ältere Version damit klar. Es kann sein, dass noch mit der Zeit diesbezüglich ein paar programmiertechnische Fragen meinerseits kommen. Ich beschäftige mich noch nicht all zu lange mit Matlab und es tauchen immer wieder viele Fragen auf.
ich habe noch ein paar Fragen zum dem letzten Audiorecorder.
Ich kommentiere mal alles, so wie ich es denke.
Code:
function TestButton
% Erstellt ein Figure mit der Eigenschaft, dass beim Drücken der linken Maustaste die Funktion startreording und beim Loslassen die Funktion stoprecording aufgerufen wird.
FigH = figure('WindowButtonUpFcn', @stoprecording, ...
'WindowButtonDownFcn', @startrecording,'Units','Pixel');
% Erstellt ein inaktiven Togglebutton im Figure FigH
ButtonH = uicontrol(FigH, 'Style', 'ToggleButton', 'Enable', 'inactive');
% ??????? setappdata(FigH, 'ButtonH', ButtonH);
% Speichert den Audiorecorder in Variable recObj
recObj = audiorecorder;
% Bei Ausführung des audiorecorders --> Ausgabe Start Recording
recObj.StartFcn = 'disp(''Start speaking.'')';
% Bei Stop des audiorecorders --> Ausgabe End of Recording
recObj.StopFcn = 'disp(''End of recording.'')';
% ???????? setappdata(FigH, 'recObj', recObj);
% --------------- 8< ------------------------------- % definition startrecording function startrecording(ObjH, EventData) % ?????????
FigH = ancestor(ObjH, 'figure');
% ????????? werden irgendwelche Daten abgerufen?
ButtonH = getappdata(FigH, 'ButtonH');
% ????????? if ~isempty(overobj('uicontrol')) % setzt den Wert von ButtonH auf 1 ???? set(ButtonH, 'Value', 1);
% START THE RECORDING... % was bekommt record übergeben?
record(getappdata(FigH,'recObj'), 100); % z.B. 100 sec end
Wenn die Unklarheiten meinerseits geklärt sind, kann ich den unteren Teil ebenfalls verstehen. Deshalb habe ich diesen jetzt nicht kommentiert.
function stoprecording(ObjH, EventData)
FigH = ancestor(ObjH, 'figure');
ButtonH = getappdata(FigH, 'ButtonH');
if ~isempty(overobj('uicontrol')) set(ButtonH, 'Value', 0);
% STOP THE RECORDING...
recObj = getappdata(FigH,'recObj');
if isrecording(recObj)
stop(recObj);
DeineAudioDaten = getaudiodata(recObj);
plot(DeineAudioDaten);
end end
Würde mich freuen, wenn mir jmd. weiterhelfen könnte. Ich weiß also nicht so ganz, was setappdata(), getappdata(), ancestor und die if Funktionen genau machen. Die Matlabhilfe ist zu diesen Funktionen sehr kurz gehalten.
ANCESTOR ist eigentlich umfangreich in der Hilfe beschrieben:
http://www.mathworks.de/help/techdoc/ref/ancestor.html
Jedes "Handle-Grafics"-Objekt hat einen "Parent". Also z.B. sind die Linien, die mit LINE erzeugt werden, die "Child" eines AXES-Objektes, das AXES Objekt ist wieder ein "Child" eines FIGURE-Objektes, und die FIGUREs sind Children des Root-Objekts. Es gibt also eine hierarchische Gleiderung aller grafischen Objekte.
Ancester sucht nun den Vorgänger, der einen bestimmten Typ hat. Dabei geht es dann die notwendige Anzahl von Hierarchien höher.
Über die IF Funktion kann ich nun wirklich nicht mehr schreiben, als in der Dokumentation steht. Wenn "help if" nicht genug hilft, versuche "doc if" und vor allem: Lies die "Getting Started"-Abschnitte aus der Dokumentation.
besteht. Dies bedeutet nur, wenn der Mauscursor über einem Objekt der Klasse uicontrol ist wird dieses ausgeführt. Ist dies nicht der Fall gibt overobj eine leere Variable zurück.
Da ButtonH ein Togglebutton ist kann man ähnlich wie bei einer Checkbox oder einem Radiobutton das Value auf 1 oder 0 setzen. Dabei ändert sich der Look des Buttons.
Um alles verstehen zu können würde ich mal empfehlen die Callbacks zu debuggen um zu schauen wie das eine zum andern kommt... Zur Not auch mal während des Debuggens Teile des Codes ins Commandwindow kopieren und ausführen lassen...
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.