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

Signalverarbeitung\-verwertung einer Wave Datei

 

MatLuk
Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 05.12.13
Wohnort: Bielefeld
Version: R2013b
     Beitrag Verfasst am: 05.12.2013, 14:24     Titel: Signalverarbeitung\-verwertung einer Wave Datei
  Antworten mit Zitat      
Hallo,

ich habe mal eine Frage zur Auswertung eines großen Datenvelktors und zwar habe ich für eine Studienarbeit eine Wavedatei aufgenommen, die ich nun Auswerten muss.

Letztendlich habe ich in Matlab einen 1910000x1 Vekor und kann diesen auch vernünftig filtern und weiterverarbeiten. Jedoch stecke ich im Moment in folgender Problematik fest:

--> Und zwar Möchte ich gerne einen Zähler programmieren, der jedesmal wenn der Vektorwert ca. 10 Einheiten über 0,5 (Vektorwerte 0 - 1) liegt, einen Wert hochzählt. Dies soll er nun mit dem Gesamten Vektor machen.

Hat jemand von euch vielleicht ein Tipp wie ich das am besten machen kann? So schwierig sollte es an sich ja nicht sein aber im Moment komme ich einfach auf keine ganzheitliche Lösung.

Danke schonmal im Vorraus Surprised Very Happy
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 05.12.2013, 23:56     Titel: Re: Signalverarbeitung\-verwertung einer Wave Datei
  Antworten mit Zitat      
Hallo MatLuk,

Was hast Du denn bisher probiert und welche konkreten Probleme gab es dabei?

Zitat:
Und zwar Möchte ich gerne einen Zähler programmieren, der jedesmal wenn der Vektorwert ca. 10 Einheiten über 0,5 (Vektorwerte 0 - 1) liegt, einen Wert hochzählt.

Das verstehe ich noch nicht. "Circa" lässt sich nur extrem schwer als Programm implementieren. Kannst Du eine genaue Definition posten, was berechnet werden soll?

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 05.12.13
Wohnort: Bielefeld
Version: R2013b
     Beitrag Verfasst am: 06.12.2013, 12:21     Titel:
  Antworten mit Zitat      
Danke erstmal für die schnelle Antwort!

Ich probiere mich mal deutlicher auszudrücken.

Ich habe einen Vektor A=[1x1910000], die Daten des Vektors liegen zwischen 0 und 1. Nun möchte ich wenn der Vektor für 10 Einheiten den Wert x>0.5 annimmt einen Zähler hochzählen.

Meine Idee wäre nun einen Vergleichsvekor zu bauen --> B=[.5,.5,.5,.5,.5,.5,.5,.5,.5,.5]

und diesen jeweils mit dem A zu vergleichen. Praktisch

if B < A(1:10);
then counter= counter+1;

Die sollte durch den ganzen Vektor gehen und genau da ist mein Problem.
Ich habe im Moment leider noch keine Idee wie ich das für den gesamten Vektor automatisiere.

Danke schonmal für die Mühe
Grüße Lukas
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Nras
Forum-Meister

Forum-Meister


Beiträge: 608
Anmeldedatum: 21.02.12
Wohnort: ---
Version: 7.12.0.635 (R2011a)
     Beitrag Verfasst am: 06.12.2013, 12:45     Titel:
  Antworten mit Zitat      
Hallo,

sowas sollte gehen.

Code:
N = 1910000;
A = rand(1,N);

threshold = 0.5;
anz = 10;
B = ones(1,anz)*threshold;

counter = 0;
for i = 1:N-9
    if all(B <= A(i:i+anz-1))
        counter = counter + 1;
    end
end
 

Es gibt aber sicherlich noch eine Möglichkeit ohne Schleife, die vermutlich mit C = A>threshold anfängt und dann mit diff, cumsum und find auskommt. Aber der Code läuft in wenigen Sekunden durch...

Allerdings, wenn nun zum Beispiel 12 Werte in Folge größer als 0.5 sind, dann wird der counter 3 mal hochgezählt. Ist das beabsichtigt, oder soll das dann nur ein mal gezählt werden?

Viele Grüße,
Nras
Private Nachricht senden Benutzer-Profile anzeigen
 
MatLuk
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 05.12.13
Wohnort: Bielefeld
Version: R2013b
     Beitrag Verfasst am: 06.12.2013, 14:47     Titel:
  Antworten mit Zitat      
Dank dir Exclamation
Das hilft mir schonmal weiter, hedoch möchte ich dann erst wieder auf den nächsten Peak zählen.

Also der Counter soll erst wieder hochzählen, wenn das nächste der Vergleich passt.

Wie stell ich das am esten an?

Danke schonmal für die schnelle Hilfe!!
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Nras
Forum-Meister

Forum-Meister


Beiträge: 608
Anmeldedatum: 21.02.12
Wohnort: ---
Version: 7.12.0.635 (R2011a)
     Beitrag Verfasst am: 06.12.2013, 15:28     Titel:
  Antworten mit Zitat      
Hallo,

na du könntest zum Beispiel eine zusätzliche Variable einführen (imEvent), in der zu jedem Schritt der Zustand gespeichert ist, ob man sich gerade in so einem Event (10 in Folge >= 0.5) befindet, oder nicht. Wenn das der Fall ist, dann wird nicht hochgezählt.

Code:
counter = 0;
imEvent = false;
for i = 1:N-(anz-1)
    if all(B <= A(i:i+anz-1))
        if imEvent
            % sind bereits im Event: nichts zählen
        else
            % sonst: zählen und setze status auf true
            counter = counter + 1;
            imEvent = true;
        end
    else
        % wir sind nicht im Event
        imEvent = false;
    end  
end
 


Geht vielleicht eleganter, sollte aber so funktionieren.
Private Nachricht senden Benutzer-Profile anzeigen
 
MatLuk
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 05.12.13
Wohnort: Bielefeld
Version: R2013b
     Beitrag Verfasst am: 09.12.2013, 11:31     Titel:
  Antworten mit Zitat      
Danke für die Beiden schnellen Antworten!

Mein Problem ist soweit gelöst!
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 09.12.2013, 15:03     Titel:
  Antworten mit Zitat      
Hallo MatLuk,

Dies ist ein RunLength-Problem, welches z.B. sehr effizient durch http://www.mathworks.de/matlabcentr.....eexchange/41813-runlength gelöst werden kann:
Code:
[b, n] = RunLength(data > 0.5);
result = sum(n > 10);

In RunLength_M findest Du die CUMSUM-Methoden in Matlab, während das MEX-File erst compiliert werden muss, dann aber auch deutlich schneller ist.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Nras
Forum-Meister

Forum-Meister


Beiträge: 608
Anmeldedatum: 21.02.12
Wohnort: ---
Version: 7.12.0.635 (R2011a)
     Beitrag Verfasst am: 09.12.2013, 15:51     Titel:
  Antworten mit Zitat      
Hallo,
Nras hat Folgendes geschrieben:
Es gibt aber sicherlich noch eine Möglichkeit ohne Schleife, die vermutlich mit C = A>threshold anfängt und dann mit diff, cumsum und find auskommt.
... da ist sie ja Smile.

Aber Achtung, so sollte man allerdings auch die Serien von Nullen in data>0.5 finden. Die sollen ja nicht gezählt werden. Da dürfte
Code:
n = n(b==1);
sum(n>10)

helfen (ungetestet).

Viele Grüße.
Nras.
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.