Verfasst am: 17.01.2018, 17:19
Titel: Komfortable Signalanalyse in 3D und in SCILAB
Code:
// 3d-Analyse 6
// WAV Dateien mit Abtastfrequenzen von 22005 und 96000 Hz können genutzt werden
// Vermutlich können auch Dateien mit anderen Abtastfrequenzen genutzt werden.
// Abtastfrequenzen von 22000 bis 96000sind möglich. Ich bevorzuge 48000.
// Es werden FFT Frequenzen von 1 bis 250 Hz berechnet
// Es werden Zeitabschnitte von 60 Sekunden berechnet
// Das Signal kann von 1 bis 10 verstärkt werden
// Es kann zwischen Kanal 1 und Kanal 2 gewechselt werden
// Es wird im Textfeld Position Sek. die Laufzeit der WAV Datei angezeigt
// Die Start-Position des zu berechnenden Abschnittes wird mit dem Zähler ausgewählt
// Es kann zwischen FFT Darstellung und Power Darstellung gewählt werden
// Es kann die Grafik Anzeige auf der Frequenz Achse gezoomt werden
// Die Zoomfrequenz kann mit dem Zähler eingestellt werden
// Mit der Taste Zoom Grafik wird die eingestellte Zoom Frequenz aktiviert
// Mit der Taste Save Grafik wird die angezeigte Grafik in einer gif Datei gespeichert
// Mit der Taste Start werden alle oben eingestellten Voreinstellungen aktiviert und neu berechnet
// mit der Playposition wird ein Startpunkt ausgewählt und eine Sequenz
// von 10 Sekunden Länge wird von diesem Startpunkt an abgespielt
// Mit der Taste Neu wird eine neue WAV Datei ausgewählt
// Nit der Taste Exit wird die Sitzung beendet
/////////////////////////////////////////////////////////////////////////////
mclose('all');
clear;
xdel();
z=struct('pfad','','datei','','pfaddatei','','info','','laufzeit',0,'samplerate',0,'ueberdeckung',0,'gleich',0,'posi',1,'start1',0,'start2',0,'wa',0,'ff',0,'power',0,'aaff',0,'aapp',0,'fo1',0,'fo2',500,'zeit',0,'a1',0,'a2',0,'a3',0,'b1',0,'b2',0,'b3',0,'h1',0,'graph1',0,'f',0,'cm',0,'kanal',1,'verstaerkung',1,'wa',0,'darst',1,'spiel',0,'spiel1',0);
/////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
function[z]=neu(z)
//////////////////////////////////////////////////////////////////////////////
// WAV Datei auswählen
[z.datei,z.pfad]=uigetfile('*.wav','D:\Mdaten'); //WAV Datei wählen
ifisequal(z.datei,''); //Ist eine Date gewählt?
else
z.pfaddatei=z.pfad+'\'+z.datei; //Vollständigen Pfad erstellen
z.info = wavread(z.pfaddatei,'info'); //WAV Info`s laden
disp('//////////////////////////////////////////////////////////') disp('WAV-Datei: '+z.pfaddatei); //Ausgabe vollständiger Pfad
disp('Kanäle: '+string(z.info(2))); //Ausgabe Anzahl der Kanäle
disp('Samplerate: '+string(z.info(3))); //Ausgabe Samplerate
disp('Dateilänge : '+string(z.info(8))); //Ausgabe Dateilänge
disp('Laufzeit : '+string(z.info(8)/z.info(3))+' Sekunden'); //Laufzeit in Sek.
disp('//////////////////////////////////////////////////////////')
z.pfaddat=strsplit(z.pfaddatei,'.')
z.laufzeit=floor(z.info(8)/z.info(3)); // lauzeit in sekunden
if z.laufzeit<60 then;
warning('Die WAV Datei muss mindestens 60 Sekunden Laufzeit haben') else set(u43,'max',z.laufzeit-60); // laufzeitwert max in formular spinner
set(u42,'string','max '+string(z.laufzeit)); // laufzeitwert max in formular spinner
set(u62,'max',z.laufzeit-10); // laufzeitwert max in formular play spinner
set(u34,'max',z.info(2)); // kanalzahl max in formular spinner
z.samplerate=z.info(3); //Samplerate der Audiodatei
set(u71,'string',' WAV-Datei > '+z.pfaddatei); // dateiname ins formular
//überdeckung ermitteln
z.ueberdeckung=floor(z.samplerate/8);
z.gleich=0;
[z]=rechenwerk(z) [z]=malen0(z) end end
endfunction
/////////////////////////////////////////////////////////////////////////////
function[z]=rechenwerk(z)// rechenwerk
//// FFT brechnen
z.start1=(z.posi-1)*z.samplerate;
z.start1=z.start1+1;
z.spiel1=z.start1;
z.start2=(z.posi*z.samplerate);
if z.start2<z.info(8)then
//
winId=waitbar('Berechne 473 FFTs, Leistungsspektren');
z.w=window('hn',z.samplerate);
for i=1:1:473; // überdeckung je sek =8 für 1Min= 60-1*8+1 sek = 473 waitbar(i/473,winId);
z.wa=wavread(z.pfaddatei,[z.start1 z.start2]);
z.wa=z.wa(z.kanal,:);
z.wa=z.wa*z.verstaerkung;// verstärkung
//
z.ff=fft(z.wa,-1,'nonsymmetric'); //Die FFT wird berechnen
z.ff=z.ff/z.samplerate;
z.gleich=z.ff(1);
z.ff=abs(z.ff(2:z.samplerate));
// powerspektrum
z.power=abs(z.ff.*conj(z.ff)); //Powerspektrum der FFT berechnen
z.power=z.power(1:1000);
z.ff=z.ff(1:1000);
// normieren
z.ff=z.ff*2000;// normieren
z.power=z.power*4000;// normieren
z.aaff(i,1:500)=z.ff(1:500); // fft daten
z.aapp(i,1:500)=z.power(1:500); // leistungsdaten
z.start1=z.start1+z.ueberdeckung;
z.start2=z.start2+z.ueberdeckung;
end close(winId);
set(u72,'string',' Gleichspannungsanteil > '+msprintf('%1.6f',z.gleich)); // dateiname ins formular
w=size(z.aaff); //Größe des Array ermitteln
fx=1:1:w(1); //X-Achse zum ploten aufbauen
fy=1:1:w(2); //Y-Achse zum ploten aufbauen
//
[z.a1,z.a2,z.a3]=genfac3d(fx,fy,z.aaff(fx,fy)); //Plotfft [z.b1,z.b2,z.b3]=genfac3d(fx,fy,z.aapp(fx,fy)); //Plot leistung
end
///
endfunction
////////////////////////////////////////////////////////////////////////////
function[z]=malen0(z)
//
select z.darst case1 [z]=malen1(z) case2 [z]=malen2(z) end
endfunction
/////////////////////////////////////////////////////////////////////////////
function[z]=malen1(z)
// graph 1 if z.graph1 ==0 then elsedelete(z.graph1);z.graph1=0; end;
z.h1.visible = "on";
sca(z.h1);
plot3d1(z.a1,z.a2,list(z.a3,z.a3),theta=-20,alpha=16,flag=[-1,2,3])
z.graph1=gce();
z.h1.axes_visible = ["on","on","on"];
////////////////////////////////////////////////////////////////////////////
endfunction
/////////////////////////////////////////////////////////////////////////
function[z]=malen2(z)
// graph 1 if z.graph1 ==0 then elsedelete(z.graph1);z.graph1=0; end;
z.h1.visible = "on";
sca(z.h1);
plot3d1(z.b1,z.b2,list(z.b3,z.b3),theta=-20,alpha=16,flag=[-1,2,3])
z.graph1=gce();
z.h1.axes_visible = ["on","on","on"];
////////////////////////////////////////////////////////////////////////////
endfunction
//////////////////////////////
function[z]=kanal(z) if u1.value==z.kanalzahl then
else
z.kanal=u1.value;
end
endfunction
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
function[z]=savgif1(z)
//
if z.pfaddatei=='' then
else
zd=getdate();
zs=z.pfaddat(1)+'_'+string(zd(1))+'-'+string(zd(2))+'-'+string(zd(6))+'_'+string(zd(7))+'-'+string(zd(8))+'-'+string(zd(9))+'.gif';
xs2gif(gcf(),zs);
end
endfunction
/////////////////////////////////////////////////////////////////////
function[z]=starten1(z)
//
if z.pfaddatei=='' then
else
z.h1.zoom_box=[0,0,480,u52.value];
if z.graph1 ==0 then elsedelete(z.graph1);z.graph1=0; end;
[z]=rechenwerk(z) [z]=malen0(z) end
endfunction
///////////////////////////////////////////////////////////////////////
function[z]=position1(z)
//
a=z.laufzeit-61;
if z.posi<a then
//
z.posi2=z.posi;
end
endfunction
///////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
///////// S T A R T //////////////////////////////////////
//////////////////////////////////////////////////////////////////// start
// Formular erstellen
z.f=figure('position',[10,10,1400,900]);
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.