WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

wav Länge für mehrere Funktionen

 

solarisation
Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 26.09.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.09.2010, 17:46     Titel: wav Länge für mehrere Funktionen
  Antworten mit Zitat      
Hallo,

ich versuche mich gerade an einer GUI zur Analyse von .wav Dateien. Als "Vorarbeit" habe ich alle Funktionalitäten bereits als seperate m-files (sozusagen in Schnipselform) ausgearbeitet. Beim einarbeiten in meine GUI, hakt es ein wenig.

Ich habe ein 'Edit Text' worin ich nach der neuen Wortlänge frage. Zum einlesen des .wav verwende ich:
Code:

[x, fs, nbits] = wavread('3612.wav');
handles.bit = nbits;
 

Die zweite Zeile soll den Wert nbits auch für andere Funktionen verfügbar machen. Bevor ich nun in einer zweiten function das .wav im Zeitbereich darstelle, möchte ich wissen ob in das vorhergesehene Feld überhaupt was eingetragen wurde (und wenn nicht, dann das .wav mit der Original Wortbreite - nbits - darstellen). Die Prüfung soll so geschehen (aber eben in einer anderen function):
Code:

n = get(handles.bit);
nbits = str2num(n);
N = str2num(get(handles.bitneu_edittext,'String'));
if (isempty(N))
    N = nbits
end
 

Nun erhalte ich jedoch den Fehler:
Error using get. Invalid handle. Error in ... ist die Zeile mit n = get...

Was mache ich falsch?

Danke Christian.
Private Nachricht senden Benutzer-Profile anzeigen


Sco
Forum-Meister

Forum-Meister


Beiträge: 699
Anmeldedatum: 15.08.10
Wohnort: Dundee
Version: 2008a, 2010a
     Beitrag Verfasst am: 26.09.2010, 23:59     Titel:
  Antworten mit Zitat      
Hallo,

Also ich habe 2 Verdachte woran es liegen könnte.

1. die handles Struktur wird nach dem Zuweisen des Feldes handles.bit nicht aktualisiert. Dies ist aber essentiell um es in anderen Callbacks des Guis sowie functionen verwenden zu können. Dies funktioniert so:

(Im folgenden Fall nehme ich an, dass das Einlesen der Sound Files und Zuweisung des handles.bit in dem edit callback steht UND dass du die 2. function in einem anderem callback aufrufst)
Code:

Callback edit(....)
[x, fs, nbits] = wavread('3612.wav');
handles.bit = nbits;
guidata(hObject, handles); % aktualisiert die handles Struktur
 


2. die Werte bzw. die handles Struktur wird nicht mit in die function übergeben. Da du leider nicht genau angegeben hasst wo du welche function aufruft (= alle in einem callback oder in Verschiedenen), kann ich nur mutmassen bzw. für beide Fälle ein Beispiel geben.

Alle deiner Beispiel-Code-Zeilen in einem Callback (Aktualisieren der handles Struktur fällt weg):
Code:

Callback edit(....)
[x, fs, nbits] = wavread('3612.wav');
handles.bit = nbits;
% Aufruf der 2. function mit dem namen "Prüfung"
Prüfung(handles) % handle muss übergeben werden damit es in der function verwendet werden kann
 

Die function Prüfung sollte dann (im Ausschnitt) so aussehen:
Code:

function Prüfung(handles)
n = get(handles.bit);
nbits = str2num(n);
N = str2num(get(handles.bitneu_edittext,'String'));
if (isempty(N))
    N = nbits
end
 


Wird die 2. function nicht im gleichen callback ausgeführt so muss die handles Struktur aktalisiert werden, der Rest ist wie im obrigen Beispiel, nur eben in einem anderem Callback.

Hoffe das war was du suchtest, ansonsten wäre eine ein wenig genauere Beschreibung wo was ausgeführt wird sehr hilfreich.

MFG

Sco
Private Nachricht senden Benutzer-Profile anzeigen
 
solarisation
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 26.09.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.09.2010, 08:36     Titel:
  Antworten mit Zitat      
Hallo

Zu 1. kann ich sagen das am Ende meiner callback auch die Aktualisierung der handles Struktur erfolgt (nochmal alles mit etwas mehr - das m-file ist übrigens von GUIDE erstellt):
Code:

function einlesen_callback
[x, fs, nbits] = wavread('3612.wav');
handles.bit = nbits;
guidata(hObject, handles);

function quant_callback
n = get(handles.bit);
nbits = str2num(n);
N = str2num(get(handles.bitneu_edittext,'String'));
if (isempty(N))
    N = nbits
end
 

In der function quant_callback wird dann noch was gerechnet und das .wav erneut im Zeitbereich geplottet.

Da es zwei callback sind ist Variante 2 nicht nötig oder sehe ich da was falsch?

Ist es denn überhaupt richtig von mir Werte, welche ich in einer function ...callback erzeuge mit einer handles Struktur anderen function zur Verfügung zu stellen? Also per
Code:

% in function 1
n = handles.bit

% in function 2
handles.bit = n
 

Oder wäre es besser neue Werte, in vorhanden handles, per
Code:

set(handles.bit, 'Value', neuer Wert)
 

zu schreiben??

Hoffe mit meinen Fragen nicht zu verwirren.
Danke.
Private Nachricht senden Benutzer-Profile anzeigen
 
LittleX
Forum-Guru

Forum-Guru


Beiträge: 494
Anmeldedatum: 14.05.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.09.2010, 09:28     Titel:
  Antworten mit Zitat      
Hallo,

wenn Du Daten zwischen Callbacks durch Erweiterung der handles Struktur austauschen willst, musst Du folgendermaßen vorgehen:

handles Struktur erweitern und guidata aktualisieren (genau so wie Du es auch gemacht hast):
Code:

handles.bit = nbits;
guidata(hObject, handles);
 


Wenn Du mit guide arbeitest ist das dritte Übergabeargument an Callbacks immer handles. Um auf die Felder zuzugreifen, schreibst Du folgendes:
Code:

n = handles.bit
 

Also ganze ohne set und get.

Viele Grüße,

LittleX
Private Nachricht senden Benutzer-Profile anzeigen
 
solarisation
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 26.09.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.09.2010, 09:56     Titel:
  Antworten mit Zitat      
Hallo

hab mal einen breakpoint im Quelltext gesetzt und weiß das mein
Code:

n = handles.bit
 

in dieser function callback funktioniert (bei K>> auf der Konsole kann ich den ursprünglich im .wav ausgelesenen Wert sehen). So weit so gut.
Aber leider funktioniert die Übergabe des Werte oder die Prüfung ob N leer ist leider nicht (K>> N liefert mir: [] - also nix). Demnach dürfte ja
Code:

N = str2num(get(handles.bitneu_edittext,'String'));
 
funktionieren, da das Feld zu Beginn ja leer ist, daher denke ich das der Vergleich
Code:

if (isempty(N))
    N = nbits
end
 

schiefläuft!? Kann es sein das isempty nicht für 'leere Felder' geeignet ist??
An einer anderen Stelle verwende ich auch ein Feld welches , bevor geplottet wird, auf Inhalt geprüft wird. Dieses habe ich im GUIDE mit dem String '0' belegt und der Vergleich funktioniert.
Testweise habe ich nun auch da nbit-Feld mit dem String '0' belegt und der Vergleich funktioniert auch hier.
Geht das auch mit einem leeren Feld (also String 'leer')?
Private Nachricht senden Benutzer-Profile anzeigen
 
solarisation
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 26.09.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.09.2010, 11:01     Titel:
  Antworten mit Zitat      
Hallo,

hab vor lauter Bäumen wohl den Wald nicht gesehen. Der Vergleich für leere Felder funktioniert natürlich, jedoch muss man eben bedenken das eben nur '1' und '0' zurückgegeben werden. Das ganze funktioniert dann mit:
Code:

if (isempty(N))==1
     N == n
end
 

Vielleicht hilft das ja nochmal jemanden der es bis dahin nicht wusste (oder mal eben im Wald steht).

Danke auch an die beiden Helfer.
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 29.09.2010, 11:37     Titel:
  Antworten mit Zitat      
Hallo solarisation,

Dies:
Zitat:
Code:
if (isempty(N))==1
     N == n
end

ist vollkommen equivalent zu:
Code:
if isempty(N)
     N == n
end

Der Test mit "==1" ist damit überflüssig und raubt nur Zeit.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
solarisation
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 26.09.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.10.2010, 21:07     Titel:
  Antworten mit Zitat      
Hallo Jan,

danke für die Aufklärung. Habs leider erst jetzt gesehen... Ist schon eingearbeitet.

Danke nochmal
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.