// Spektralanalyse FFT, Power zweidimensional 10Sekunden // Name: WAV-2D-Analyse-10Sek.sce // Datum: 1.10.2021 /////////////////////////////////////////////////////////////////////////////// //////// VARIABLEN //////////// /////////////////////////////////////////////////////////////////////////////// mclose('all'); clear; close(); z=struct('datei','','pfad','','pfaddatei','','info',0,'samplerate',0,'laufzeit',0,'fober',2000,'position',0,'start1',0,'start2',0,'graf1',0,'graf2',0,'graf3',0,'graf4',0,'W1',0,'W2',0,'W3',0,'F0',0,'F1',0,'F2',0,'F3',0,'P1',0,'S1',0,'S2',0,'filter1',1,'filter2',2000,'terzfilter1',0,'terzfilter2',0,'gramax',0,'gramin',0); // z.terzfilter1=['22-27';'28-35';'36-44';'45-55';'56-70';'71-88';'89-110';'111-142';'143-177';'178-222';'223-280';'281-355';'356-444';'445-560';'561-712';'713-890';'891-1111';'1114-1424';'1425-1781']; z.terzfilter2=[22,27,25;28,35,31.5;36,44,40;45,55,50;56,70,63;71,88,80;89,110,100;111,142,125;143,177,160;178,222,200;223,280,250;281,355,315;356,444,400;445,560,500;561,712,630;713,890,800;891,1111,1000;1114,1424,1250;1425,1781,1600]; // z.F0=zeros(1,480000); z.F1=z.F0 z.F3=z.F0 z.W1=z.F0 z.W2=z.F0 /////////////////////////////////////////////////////////////////////////////// //////////// SUBROUTINEN //////////// /////////////////////////////////////////////////////////////////////////////// // NEU function [z]=neu(z) ////////////////////////////////////////////////////////////////////////////// // WAV Datei auswählen D:\Mdaten\Testsignale/100Hz-03A_g.wav [z.datei,z.pfad]=uigetfile('*.wav','D:\Mdaten'); //WAV Datei wählen if isequal(z.datei,'') then return end //Ist eine Date gewählt? z.pfaddatei=z.pfad+'\'+z.datei; //Vollständigen Pfad erstellen z.info = wavread(z.pfaddatei,'info'); //WAV Info`s laden z.laufzeit=floor(z.info(8)/48000); // lauzeit in ganzen sekunden z.samplerate=z.info(3); //Samplerate der Audiodatei if z.info(3)<>48000 then z.datei='';z.pfad='';z.pfaddatei='';disp('////////// Die Abtastfrequenz ist nicht 48000 //////////');return end if z.laufzeit<10 then disp('////////// Die Laufzeit ist kürzer als 10 Sekunden //////////');return end 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))+' Abtastungen/Sekunde'); //Ausgabe Samplerate disp('Dateilänge : '+string(z.info(8))+' Byte'); //Ausgabe Dateilänge disp('Laufzeit : '+string(z.info(8)/z.info(3))+' Sekunden'); //Laufzeit in Sek. disp('//////////////////////////////////////////////////////////') // WERTE INS FORMULAR SCHREIBEN // PFAD + DATEINAME set(u0a,'string',string(' ')+z.pfaddatei); // KANAL SETZEN set(se_4,'value',1); if z.info(2)==2 then set(se_4_a,'visible',1)else set(se_4_a,'visible',0)end // POSITION set(se_5_a,'string',string(z.laufzeit)+' Sek.'); set(se_5,'max',z.laufzeit-10); set(se_5,'value',1); // VERSSTÄRKUNG set(se_6,'value',1); // F-MAX set(se_7,'value',2000); // F-MIN set(se_8,'value',1); // z.F0=zeros(1,480000); // endfunction ///////////////////////////////////////////////////////////////////////////// // rechenwerk1 function [z]=rechenwerk1(z) //die fft und power des eingangssignals berechnen //////////////////////////////////////////////////////////////////////////// // WAV DATEN EINLESEN z.start1=48000*(se_5.value-1)+1;//einlesen von dieser position an z.start2=z.start1+480000-1;// 10 sekunden bis zu dieser position einlesen z.W1=wavread(z.pfaddatei,[z.start1 z.start2]); //wav daten einlesen // KANAL WAHL z.W1=z.W1(se_4_a.value+1,:);// den zu berechnenden kanal einstellen // VERSTÄRKUNG z.W1=z.W1*se_6.value;// die verstärkung des eingangssignals //fft z.F1=fft(z.W1,-1,'nonsymmetric'); z.F1=z.F1/480000; z.F2=abs(z.F1(1:20001)); z.F2=z.F2*2000; z.F2(1)=z.F2(1)*0.5 // POWERSPEKTRUM z.P1=z.F1.* conj(z.F1); z.P1=abs(z.P1); z.P1=z.P1(1:20001); z.P1=z.P1*4000; z.P1(1)=z.P1(1)*0.25 // endfunction /////////////////////////////////////////////////////////////////////////// function [z]=rechenwerk2(z) /////////////////////////////////////////////////////////////////////////// // WAV Ausgang berechnen mit Filter Min und Max // WAV Ausgang um 100 Hz transponieren z.F3=z.F0; z.filter1=se_8.value*10; z.filter2=se_7.value*10; z.filter1=z.filter1+1; z.filter2=z.filter2+1; z.F3(z.filter1:z.filter2)=z.F1(z.filter1:z.filter2); z.W2=fft(z.F3,1,'nonsymmetric'); z.W2=real(z.W2); z.W2=z.W2*480000*2; //prozent z.S1=sum(abs(z.W1(2:480000))); z.S2=sum(abs(z.W2(2:480000))); z.p2=floor(z.S2*100/z.S1); set(se_1_b,'string',string(z.p2)+' %'); //transponieren mit 100 Hz y(1:1000)=0; y(1001:480000)=z.F3(1:479000) z.W3=fft(y,1,'nonsymmetric'); z.W3=real(z.W3); z.W3=z.W3*480000*2; endfunction //////////////////////////////////////////////////////////////////////////// //malen1 function [z]=malen1(z) /////////////////////////////////////////////////////////////////////////// //malen graph 1 in fenster 1 sca(z.fen1); if z.graf1==0 then else delete(z.graf1) end; plot2d(z.W1); z.graf1=gce() z.graf1.children.thickness=1; z.graf1.children.foreground=color('blue'); [z]=sub_se_1(z); // sichtbarkeit // endfunction //malen graph 2 in fenster 1 function [z]=malen2(z) /////////////////////////////////////////////////////////////////////////// // malen grap 2 in fenster 1 sca(z.fen1); if z.graf2==0 then else delete(z.graf2) end; plot2d(z.W2); z.graf2=gce(); z.graf2.children.thickness=1; z.graf2.children.foreground=color('red'); [z]=sub_se_2(z);// sichtbarkeit // endfunction /////////////////////////////////////////////////////////////////////////// function [z]=malen3(z) /////////////////////////////////////////////////////////////////////////// // malen grap 3 sca(z.fen2); if z.graf3==0 then else delete(z.graf3) end; plot2d2(0:20000,z.F2); z.graf3=gce(); z.graf3.children.thickness=3; z.graf3.children.foreground=color('scilabcyan4'); [z]=sicht3(z); // sichtbarkeit // endfunction /////////////////////////////////////////////////////////////////////////// function [z]=malen4(z) ////////////////////////////////////////////////////////////////////////// // malen graph 4 in fenster 2 sca(z.fen2); if z.graf4==0 then else delete(z.graf4) end; plot2d2(0:20000,z.P1); z.graf4=gce(); z.graf4.children.thickness=3; z.graf4.children.foreground=color('scilabmagenta2'); [z]=sicht4(z); // sichtbarkeit // endfunction // function [z]=malenmax(z) //filtergrenze max setzen sca(z.fen2); if z.gramax==0 then else delete(z.gramax) end; plot2d([se_7.value*10 se_7.value*10],[0 1000]); z.gramax=gce(); z.gramax.children.thickness=2; z.gramax.children.foreground=color('orange'); [z]=rechenwerk2(z); [z]=malen2(z) // endfunction // function [z]=malenmin(z) //filtergrenze min setzen sca(z.fen2); if z.gramin==0 then else delete(z.gramin) end; plot2d([se_8.value*10 se_8.value*10],[0 1000]); z.gramin=gce(); z.gramin.children.thickness=2; z.gramin.children.foreground=color('greenyellow'); [z]=rechenwerk2(z); [z]=malen2(z) // endfunction /////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// function [z]=sicht3(z) /////////////////////////////////////////////////////////////////////////// // graph3 ein/aus if se_fft.value==1 then z.graf3.visible='on' else z.graf3.visible='off' end endfunction ////////////////////////////////////////////////////////////////////////////// function [z]=sicht4(z) ////////////////////////////////////////////////////////////////////////////// // graph 4 ein/aus if se_pow.value==1 then z.graf4.visible='on' else z.graf4.visible='off' end endfunction /////////////////////////////////////////////////////////////////////////// //fenster 2 amplitudensteuerung function [z]=fensta100(z) ///////////////////////////////////////fenster 2 , amplitude 100 z.fen2.y_ticks=tlist(['locations','labels'],[0,100,200,300,400,500,600,700,800,900,1000],["0","0.1","0.2","0.3","0.4","0.5","0.6","0.7","0.8","0.9","1"]); zh=z.fen2.data_bounds; zh(1,2)=0; zh(2,2)=1000; z.fen2.data_bounds =zh; endfunction // function [z]=fensta50(z) /////////////////////////////////////////// fenster 2 , amplitude 50 z.fen2.y_ticks=tlist(['locations','labels'],[0,50,100,150,200,250,300,350,400,450,500],["0","0.05","0.10","0.15","0.20","0.25","0.30","0.35","0.40","0.45","0.50"]); zh=z.fen2.data_bounds; zh(1,2)=0; zh(2,2)=500; z.fen2.data_bounds =zh; endfunction // function [z]=fensta25(z) /////////////////////////////////////////// fenster 2 , amplitude 25 z.fen2.y_ticks=tlist(['locations','labels'],[0,25,50,75,100,125,150,175,200,225,250],["0","0.025","0.050","0.075","0.100","0.125","0.150","0.175","0.200","0.225","0.250"]); zh=z.fen2.data_bounds; zh(1,2)=0; zh(2,2)=250; z.fen2.data_bounds =zh; endfunction // function [z]=fensta15(z) /////////////////////////////////////////fenster 2 , amplitude 15 z.fen2.y_ticks=tlist(['locations','labels'],[0,15,30,45,60,75,90,105,120,135,150],["0","0,015","0,030","0,045","0,060","0.075","0.090","0.105","0.120","0.135","0.150"]); zh=z.fen2.data_bounds; zh(1,2)=0; zh(2,2)=150; z.fen2.data_bounds =zh; endfunction // function [z]=fensta10(z) /////////////////////////////////////////fenster 2 , amplitude 10 z.fen2.y_ticks=tlist(['locations','labels'],[0,10,20,30,40,50,60,70,80,90,100],["0","0.01","0.02","0.03","0.04","0.05","0.06","0.07","0.08","0.09","0.1"]); zh=z.fen2.data_bounds; zh(1,2)=0; zh(2,2)=100; z.fen2.data_bounds =zh; endfunction // function [z]=fensta5(z) /////////////////////////////////////////fenster 2 , amplitude 5 z.fen2.y_ticks=tlist(['locations','labels'],[0,5,10,15,20,25,30,35,40,45,50],["0","0.005","0.010","0.015","0.020","0.025","0.030","0.035","0.040","0.045","0.050"]); zh=z.fen2.data_bounds; zh(1,2)=0; zh(2,2)=50; z.fen2.data_bounds =zh; endfunction // function [z]=fensta1(z) //////////////////////////////////////////// fenster 2 , amplitude 1 z.fen2.y_ticks=tlist(['locations','labels'],[0,1,2,3,4,5,6,7,8,9,10],["0","0.001","0.002","0.003","0.004","0.005","0.006","0.007","0.008","0.009","0.01"]); zh=z.fen2.data_bounds; zh(1,2)=0; zh(2,2)=10; z.fen2.data_bounds =zh; endfunction /////////////////////////////////////////////////////////////////////////// //fenster 2 frequenzsteuerung function [z]=fenstf20000(z) /////////////////////////////////// fenster 2 , frequenzachse 2000 z.fen2.x_ticks=tlist(['locations','labels'],[0,1000,2000,3000,4000,5000,6000,7000,8000,9000,10000,11000,12000,13000,14000,15000,16000,17000,18000,19000,20000],["0","100","200","300","400","500","600","700","800","900","1000","1100","1200","1300","1400","1500","1600","1700","1800","1900","2000"]); z.fen2.sub_tics=[9,9,9]; zh=z.fen2.data_bounds; zh(1,1)=0; zh(2,1)=20000; z.fen2.data_bounds =zh; endfunction // function [z]=fenstf10000(z) ///////////////////////////////////// fenster 2 , frequenzachse 1000 z.fen2.x_ticks=tlist(['locations','labels'],[0,500,1000,1500,2000,2500,3000,3500,4000,4500,5000,5500,6000,6500,7000,7500,8000,8500,9000,9500,10000],['0','50','100','150','200','250','300','350','400','450','500','550','600','650','700','750','800','850','900','950','1000']); z.fen2.sub_tics=[4,9,9]; zh=z.fen2.data_bounds; zh(1,1)=0; zh(2,1)=10000; z.fen2.data_bounds =zh; endfunction // function [z]=fenstf5000(z) ///////////////////////////////////// fenster 2 , frequenzachse 500 z.fen2.x_ticks=tlist(['locations','labels'],[0,250,500,750,1000,1250,1500,1750,2000,2250,2500,2750,3000,3250,3500,3750,4000,4250,4500,4750,5000],['0','25','50','75','100','125','150','175','200','225','250','275','300','325','350','375','400','425','450','475','500']); z.fen2.sub_tics=[4,9,9]; zh=z.fen2.data_bounds; zh(1,1)=0; zh(2,1)=5000; z.fen2.data_bounds =zh; endfunction // function [z]=fenstf2400(z) ///////////////////////////////////// fenster 2 , frequenzachse 250 z.fen2.x_ticks=tlist(['locations','labels'],[0,100,200,300,400,500,600,700,800,900,1000,1100,1200,1300,1400,1500,1600,1700,1800,1900,2000,2100,2200,2300,2400],['0','10','20','30','40','50','60','70','80','90','100','110','120','130','140','150','160','170','180','190','200','210','220','230','240']); z.fen2.sub_tics=[9,9,9]; zh=z.fen2.data_bounds; zh(1,1)=0; zh(2,1)=2400; z.fen2.data_bounds =zh; endfunction // function [z]=fenstf1200(z) ///////////////////////////////////// fenster 2 , frequenzachse 120 z.fen2.x_ticks=tlist(['locations','labels'],[0,50,100,150,200,250,300,350,400,450,500,550,600,650,700,750,800,850,900,950,1000,1050,1100,1150,1200],['0','5','10','15','20','25','30','35','40','45','50','55','60','65','70','75','80','85','90','95','100','105','110','115','120']); z.fen2.sub_tics=[4,9,9]; zh=z.fen2.data_bounds; zh(1,1)=0; zh(2,1)=1200; z.fen2.data_bounds =zh; endfunction // function [z]=fenstf600(z) ///////////////////////////////////// fenster 2 , frequenzachse 60 z.fen2.x_ticks=tlist(['locations','labels'],[0,20,40,60,80,100,120,140,160,180,200,220,240,260,280,300,320,340,360,380,400,420,440,460,480,500,520,540,560,580,600],['0','2','4','6','8','10','12','14','16','18','20','22','24','26','28','30','32','34','36','38','40','42','44','46','48','50','52','54','56','58','60']); z.fen2.sub_tics=[1,9,9]; zh=z.fen2.data_bounds; zh(1,1)=0; zh(2,1)=600; z.fen2.data_bounds =zh; endfunction // function [z]=fenstf300(z) ////////////////////////////////////// fenster 2 , frequenzachse 30 z.fen2.x_ticks=tlist(['locations','labels'],[0,10,20,30,40,50,60,70,80,90,100,110,120,130,140,150,160,170,180,190,200,210,220,230,240,250,260,270,280,290,300],['0','1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18','19','20','21','22','23','24','25','26','27','28','29','30']); z.fen2.sub_tics=[1,9,9]; zh=z.fen2.data_bounds; zh(1,1)=0; zh(2,1)=300; z.fen2.data_bounds =zh; endfunction //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // function [z]=sub_se_1(z) /////////////////////////////////////eingang // graph1 ein/aus if se_1.value==1 then z.graf1.visible='on' else z.graf1.visible='off' end endfunction // function [z]=sub_se_2(z) /////////////////////////////////////ausgang // graph2 ein/aus if se_2.value==1 then z.graf2.visible='on' else z.graf2.visible='off' end endfunction // function [z]=sub_se_4(z) //////////////////////////////////////kanalumschaltung // if isequal(z.datei,'') then // keine datei else // eine datei if z.info(2)==1 then set(se_4,'value',1) end [z]=rechenwerk1(z); [z]=malen1(z) [z]=malen3(z) [z]=malen4(z) [z]=rechenwerk2(z); [z]=malen2(z) end endfunction // function [z]=sub_se_5(z) //////////////////////////////////////position [z]=rechenwerk1(z); [z]=malen1(z) [z]=malen3(z) [z]=malen4(z) [z]=rechenwerk2(z); [z]=malen2(z) endfunction // function [z]=sub_se_6(z) /////////////////////////////////////verstärkung [z]=rechenwerk1(z); [z]=malen1(z) [z]=malen3(z) [z]=malen4(z) [z]=rechenwerk2(z); [z]=malen2(z) endfunction // function [z]=sub_se_7(z) /////////////////////////////////////fmax if se_7.value