Verfasst am: 29.09.2010, 15:55
Titel: Große Sounddaten Abspielen, Speichern, Visualisieren
Hallo liebe Matlab Freunde, ich habe ein riesiges Problem im wahrsten Sinne des Wortes. Ich habe ein Annotationstool für Audiodaten programmiert. Das heißt, ein Tool, wo man Sounddaten laden kann und diese dann kategorisiert. D.h. man kann den Sound Abspielen, Speichern und er wird Visualisiert. Bis jetzt hatte ich aber nur 2kHz Daten und konnte die einfach komplett in den RAM laden. Jetzt möchte ich in Zukunft aber auch 41kHz einspielen können und da wird es etwas schwieriger.
Ich hatte mir überlegt 4 Funktionen zu programmieren:
1. Funktion die große Dateien RAM speichernd abspielt
2. Funktion die beliebig große Soundschnipsel abspeichern kann
3. Funktion zur Visualisierung von großen Sounddaten
(4. Funktion um den Speicherbedarf an den jeweiligen Computer anzupassen) --> relativ einfach
Im Grunde genommen basieren alle 3 wichtigen Funktionen darauf, dass Signal in Teile zu zerlegen und nur diese zu verarbeiten. Es geht mir jetzt ersteinmal um die erste Funktion. Ich habe das mal mit dem audioplayer probiert, dass funktioniert soweit ist aber nicht sonderlich schön und es gibt zwichen den clips immer eine kurze Unterbrechung. Es ist halt wichtig, dass zwischendurch noch Zeit ist für die Stopp Funktion. Hier mal der Code für die 1.Funktion. Wie gesagt, dass funktioniert soweit ist aber etwas unschön und es gibt kurze Unterbrechungen. Mit sound() und wavplay() habe ich es auch schon versucht. Geht zwar auch beides aber bei der jetzigen Version kann ich halt zwischendurch sehr schnell eine Stopp Funktion einbauen, was ich bei den anderen Sachen nicht kann.
Hier der Gesamtcode, ist leider nicht ausführbar, weil ich einige eigene Funktionen nutze. Dafür habe ich versucht es ausführlich auszukommentieren.
Code:
function result = playwav(Audiopath,from,to) % plays an Audiofile in smaller clips to save ram memory % playwav(Audiopath,from,to) % Audio
% global variable to stop the sound out of the function global stopaudio;
stopaudio=false;
% first stop will pause second stop will stop global pausetime;
% time for 1 clip of the signal in seconds % saves ram but has a timelag between the clips % five minutes for several 100 MB of Ram but less timelags
chunktime=60.*5;
% own function for getting the sampling rate and size of both .wav or .aif % files [r,fsize_h,fsize]=sizewavaif(Audiopath);
% Number of samples for the clip
Nsamplesclip=(to-from)*60*r;
% max Number of samples per chunk that is loaded into the ram at once
chunksize=chunktime.*r;
% Number of loops
Nloops=ceil(Nsamplesclip./chunksize);
%% if pausetime is not defined use from; else use pausetime % (two times stop button hit = stop)
sample1=1./(r*60);
if pausetime==0;
to1=from;
% if from value is to low, make it 1 sample. if to1<sample1
to1=sample1;
end else % (one time stop button hit = pause)
to1=pausetime;
end
% own function for reading in .wav or .aif files and convert
d = readwavaif(Audiopath,from1,to1,r);
% everytime except for the first time if k~=0 % wait for last clip to be finished before starting the next one. whilestrcmp(get(aud1,'Running'),'on') % pause needed for the stop button to come through % better method ??? pause(0.01) if stopaudio
'Stop'
stop(aud1);
pausetime=to1;
return end end
1. Kann man diesen Code verbessern indem man zum Beispiel den pause Teil ersetzt?
2. Hat jemand grundsätzliche Ideen (Ansätze, Fileexchange Programme, Toolboxen Befehle) wie ich dieses Problem bzw. die oben beschriebenen Probleme effektiv lösen kann?
3. Kommt man womöglich bei sowas an objektorientierten Programmieren nicht mehr vorbei?
Irgendjemand? Ich hatte gelesen, die Biosig Toolbox könnte das Problem teilweise lösen, aber da kriege ich nur MEX Fehler. Es gibt auch eine Wavappend Funktion im Fileexchange aber die ist unglaublich langsam.
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.