Verfasst am: 03.09.2016, 20:28
Titel: GUI's sind problematisch, M Files unproblematisch
Hallo Forum.
Als Rentner betreibe ich die Internetseite www.derbrummton.de und beschäftige mich mit Schallmessungen und Vibrationsmessungen und Analyse.
Matlab ist ein tolles und nützliches Werkzeug zur Analyse von Messdaten.
Bei mir fallen zwei Arten von Messdaten an, einmal Messdaten als WAV Datei, meist mit einer Abtastrate von 48000 und einer Auflösung von 24 Bit.
Und Daten von einem Schallpegelmesser als Textfile mit den entsprechenden Messwerten in dB.
Die WAV Dateien werden mit Matlab berechnet und als Grafik dargestellt.
Die Daten von dem Schallpegelmesser werden nicht berechnet sondern nur in einer Grafik dargestellt.
Bisher habe ich die Berechnungen der WAV Dateien immer mit einem M-File durchgeführt. Das erstellen eines M-Files geht immer rasch und kann schnell an die jeweiligen Bedürfnisse angepasst werden.
Nun habe ich mal versucht die Spektrumanalyse der WAV Dateien zu automatisieren und mit einer GUI zu experimentieren.
Aber nun bin ich etwas enttäuscht, da Matlab bei der Programmierung mit GUI's ziemlich unhandlich und sperrig wirkt.
Ein einfache elegante Nutzung der GUI ist nicht machbar.
Eigentlich schade.
Mein Interesse gilt der Umweltverschmutzung durch Schall und Vibrationen. Das Problem das mich beschäftigt ist als Brummton, oder Taos Hum oder Bristol Brum bekannt.
Als Ursache habe ich die Belastung durch Netzbetriebene elektrische Maschinen erkannt.
Ein Teil der verbrauchten elektrischen Energie wird durch Maschinen in Schall und Vibration umgewandelt und so an die Umwelt abgegeben. Der Luftschall wird oft durch Lüftungsanlagen erzeugt.
Ein Teil der in Maschinen verbrauchten Energie wird als Vibration in den Boden geleitet.
So kann man in der Umwelt bei Schallmessungen und Vibrationsmessungen Frequenzen vorfinden die von der Netzfrequenz abgeleitet werden können.
Bei Schallmessungen gibt es eine Besonderheit, da bei selbstgebauten Mikrofon Vorerstärkern durch mangelhafte Abschirmung oder unprofessionellen Schaltungsaufbau schon mal Einstreuungen der Netzfrequenz vorkommen kann das zu falschen Interpretationen führen.
In diesem Fall kann man bei der Analyse mit Matlab die Berechnungen so abändern das bei der Berechnung die Auflösung der Frequenzen erhöht werden.
Bei diesen Berechnungen kann man nachweisen das die Frequenzen von 50 Hz abweichen und wenige Hertz unterhalb der Netzfrequenz liegen.
Damit ist bewiesen das es keine Netzeinstreuungen durch fehlerhaften Messaufbau sind sondern echte Messwerte.
Die Differenz der gemessenen Frequenz, z.B. 48 Hz, zu 50 Hz sind erklärbar durch den sogenannten Schlupf der an Drehstrommaschinen entsteht.
Bei Messungen mit einem Beschleunigungssensor auf der Wiese an der Terrasse wurde festgestellt, das die Wiese bei etwa 49.Hz vibriert. Eine große vibrierende Bodenfläche muss wie ein Lautsprecher wirken und könnte einen Grundton von geschätzten 20 bis 30 dB erzeugen und abstrahlen.
Darüber hinaus können die Bodenvibrationen Bauwerke zu Eigenschwingungen anregen.
worin bestehen denn die konkreten Probleme bei der GUI-Programmierung bzw. -Nutzung?
Wird GUIDE verwendet oder der programmatische Ansatz über uicontrol?
In der aktuellen Version R2016a gibt es als Alternative zu GUIDE den App Designer.
http://de.mathworks.com/products/matlab/app-designer/
Diesen Ansatz finde ich persönlich deutlich besser als GUIDE. Allerdings ist die Unterstützung für Graphik zumindest derzeit eingeschränkt, Details siehe der Link.
Verfasst am: 04.09.2016, 07:47
Titel: Werde mit uicontrol experimentieren
Hallo Harald.
Ich habe ganz blauäugig angefangen ein GUI Formular mit verschiedenen Bedienelementen zu entwerfen und habe dann für jedes Element in die Callback Functionen einige Anweisungen gegeben. Die Callback Functionen sollten Voreinstellungen zu den Berechnungen abfragen, z.B. Kanal 1 oder 2, Größe der Überdeckung, usw.
Zu den automatisch erstellten Callback Functionen wollte ich sowas wie eine Hauptfunction main erstellen.
Das geht aber nicht.
Hier sind die Möglichkeiten in Matlab begrenzt, möglicherweise erzwingt Matlab eine sehr eingeschränkte ganz bestimmte Vorgehensweise.
Mir sind nicht alle Möglichkeiten bekannt die Matlab bietet.
Deine Frage bezüglich 'uicontrol' hat mich veranlasst mal in die Hilfe reinzuschauen, das könnte die Lösung sein.
Werde mal versuchen mit uicontrol was zu machen.
Danke für den Hinweis.
Hier noch zur allgemeinen Erbauung ein M File zur Berechnung.
Code:
% Hier werden WAV Dateien analysiert % Die Abtastrate muss 48000 sein % Es wird nur 1 Kanal analysiert % Überdeckung der Analyse 87,5 % %
%
clear;
%
% WAV Datei auswählen [dateiname,pfad]=uigetfile('D:\Mdaten\*.wav','Wähle eine WAV Datei');
ifisequal(dateiname,0);
%
else
%
f=strcat(pfad,dateiname);
info = audioinfo(f) if info.SampleRate==48000;
samplmax=info.TotalSamples;
%
start1=1;
start2=48000;
kanal=1;
frequenzen=1000;
yF=audioread(f,[start1 start2]);
yFFTL=fft(yF(:,kanal));
% powerspektrum
i=1;
PyL = yFFTL.*conj(yFFTL)/24000;
alles(i,1:1000)=PyL(1:1000);
start1=start1 + 6000;
start2=start2 + 6000;
% alle folgenden berechnen while start2 < samplmax
%
i=i+1;
yF=audioread(f,[start1 start2]);
yFFTL=fft(yF(:,kanal));
start1=start1+6000;
start2=start2+6000;
% powerspektrum
PyL = yFFTL.*conj(yFFTL)/24000;
alles(i,1:1000)=PyL(1:1000);
end else end end mesh(alles);
Nachdem die Berechnung durchgeführt wurde werden im Editor die Achsen x, y, z eingestellt. Zuletzt wird die Farbgebung editiert. Wichtig ist dabei das in der Colormap in der z Achse ein negativer Zahlenwert eingegeben wird. So kann die Farbe der Nullebene festgelegt werden um kleine Signal kontrastreich hervorzuheben.
bei GUIDE muss man sich in der Tat an die Vorlage halten. Haupteinsprungspunkt ist die GUI an sich, eine weitere Hauptfunktion in dem Sinn nicht vorgesehen.
Es ist allerdings möglich, aus den Callbacks heraus auch andere Funktionen aufzurufen. Dies wird oft gemacht, wenn man eine GUI um bestehende Funktionalität herum basteln möchte.
Wenn du konkreter beschreibst, wie du dir die Interaktion deiner Hauptfunktion mit der GUI vorstellst, kann ich vielleicht noch mehr dazu sagen.
Ich hatte vor für die Berechnungen eine komfortable Auswahl der Grundeinstellung wie z.B. Kanalwahl etc. mittels GUI zu machen.
Zweitens sollten die Daten der ausgewählten WAV Datei angezeigt werden.
Drittens sollten die berechnete und angezeigte Grafik mittels Einstellungen über die GUI verändert werde, z.B. Achsen mit Slider verändern, Auflösung der Colorachse mit Slider veränder usw.
Nun habe ich mal mit uicontrol gespielt und das ist auch eine interessante Methode um eine angezeigte Grafik mit Controlelementen auszustatten. Eigentlich nicht schlecht. Aber auch hier werden wieder zusätzliche M Dateien benötigt.
Mich stört einfach das für eine Programm mehrere M Dateien notwendig sind, mir wäre es lieber man könnte eine M Datei als Hauptprogramm erstellen und dort neben der Hauptfunktion, main, weitere Functionen für GUI usw. haben. So könnte aus dem einen Hauptprogramm heraus eine GUI genutzt werden, mir erscheint diese Vorgehensweise viel flexibler. Das Hauptprogramm soll die Kontrolle haben und nicht die GUI, die soll nur Eingabe sein.
Zum Glück muss ich nicht unbedingt so eine Programmierung mit GUI machen, es war halt nur eine Idee und ein Versuch.
Ich kann auch weiterhin die Berechnungen mehr oder weniger zu Fuß machen das reicht mir vollkommen. Und meinen Dank, für Deine Hilfe.
Hier habe ich mal eine modifizierte M Datei abgebildet, da kann man sehen worauf es mir ankommt. Nach der Berechnung wird die angezeigte Grafik verändert.
Zuerst eine eigene Colormap, dann wird die Cachse der Grafik verändert und die Zachse verkürzt.
Entscheidend ist das kontrastreiche Anzeigen der kleinen Signale. So kann man sehr gut sehen ob dauerhafte Störsignale vorliegen.
Gruß.
Code:
% Hier werden WAV Dateien analysiert % Die Abtastrate muss 48000 sein % Es wird nur 1 Kanal analysiert % Überdeckung der Analyse 87,5 % %
%
clear;
%
% WAV Datei auswählen [dateiname,pfad]=uigetfile('D:\Mdaten\*.wav','Wähle eine WAV Datei');
ifisequal(dateiname,0);
%
else
%
f=strcat(pfad,dateiname);
info = audioinfo(f) if info.SampleRate==48000;
samplmax=info.TotalSamples;
%
start1=1;
start2=48000;
kanal=1;
frequenzen=1000;
yF=audioread(f,[start1 start2]);
yFFTL=fft(yF(:,kanal));
% powerspektrum
i=1;
PyL = yFFTL.*conj(yFFTL)/24000;
alles(i,1:1000)=PyL(1:1000);
start1=start1 + 6000;
start2=start2 + 6000;
% alle folgenden berechnen while start2 < samplmax
%
i=i+1;
yF=audioread(f,[start1 start2]);
yFFTL=fft(yF(:,kanal));
start1=start1+6000;
start2=start2+6000;
% powerspektrum
PyL = yFFTL.*conj(yFFTL)/24000;
alles(i,1:1000)=PyL(1:1000);
end else end
cm2 =[ 000.5625 00.33330.7083 00.66670.8542 01.00001.0000 0.06251.00000.9375 0.12501.00000.8750 0.18751.00000.8125 0.25001.00000.7500 0.31251.00000.6875 0.37501.00000.6250 0.43751.00000.5625 0.50001.00000.5000 0.56251.00000.4375 0.62501.00000.3750 0.68751.00000.3125 0.75001.00000.2500 0.81251.00000.1875 0.87501.00000.1250 0.93751.00000.0625 1.00001.00000 1.00000.95650 1.00000.91300 1.00000.86960 1.00000.82610 1.00000.78260 1.00000.73910 1.00000.69570 1.00000.65220 1.00000.60870 1.00000.56520 1.00000.52170 1.00000.47830 1.00000.43480 1.00000.39130 1.00000.34780 1.00000.30430 1.00000.26090 1.00000.21740 1.00000.17390 1.00000.13040 1.00000.08700 1.00000.04350 1.000000 0.976200 0.952400 0.928600 0.904800 0.881000 0.857100 0.833300 0.809500 0.785700 0.761900 0.738100 0.714300 0.690500 0.666700 0.642900 0.619000 0.595200 0.571400 0.547600 0.523800 0.500000];
colormap(cm2);
mesh(alles);
c1=caxis;
c2=c1(2)*0.1;
c3=c2*0.03*-1;
caxis([c3 c2]);
z=axis;
z(6)=z(6)*0.5;
axis(z);
end
Ich hatte vor für die Berechnungen eine komfortable Auswahl der Grundeinstellung wie z.B. Kanalwahl etc. mittels GUI zu machen.
Zweitens sollten die Daten der ausgewählten WAV Datei angezeigt werden.
Drittens sollten die berechnete und angezeigte Grafik mittels Einstellungen über die GUI verändert werde, z.B. Achsen mit Slider verändern, Auflösung der Colorachse mit Slider veränder usw.
Dann bietet es sich aus meiner Sicht an, die GUI als Hauptdatei zu verwenden (und sie der Einfachheit halber mit GUIDE zu erstellen) und aus den Callbacks dann Funktionen aufzurufen, die Dateien laden und anhand der gemachten Einstellungen die Grafik erstellen. Damit die Grafik auch im Koordinatensystem der GUI landet, muss man das Koordinatensystem meist voranstellen oder als 'parent' angeben, z.B.
damit werde ich mal etwas herumexperimentieren und die GUI und Functionen weiter austesten.
Hier eine modifizierte M Datei, die bei der spektralen Berechnung eine 10fach höhere Samplerate simuliert.
Dadurch erhöht sich die Auflösung der Frequenzen.
Dazu zwei Bilder, einmal normal berechnet und das zweite Bild mit 10facher Samplerate berechnet.
Gruß
Code:
% Hier werden WAV Dateien analysiert % Die Abtastrate muss 48000 sein % Es wird nur 1 Kanal analysiert % Überdeckung der Analyse 87,5 % %
%
clear;
%
% WAV Datei auswählen [dateiname,pfad]=uigetfile('D:\Mdaten\*.wav','Wähle eine WAV Datei');
ifisequal(dateiname,0);
%
else
%
f=strcat(pfad,dateiname);
info = audioinfo(f) if info.SampleRate==48000;
samplmax=info.TotalSamples;
%
start1=1;
start2=480000;
kanal=1;
frequenzen=10000;
yF=audioread(f,[start1 start2]);
yFFTL=fft(yF(:,kanal));
% powerspektrum
i=1;
PyL = yFFTL.*conj(yFFTL)/240000;
alles(i,1:10000)=PyL(1:10000);
start1=start1 + 6000;
start2=start2 + 6000;
% alle folgenden berechnen while start2 < samplmax
%
i=i+1;
yF=audioread(f,[start1 start2]);
yFFTL=fft(yF(:,kanal));
start1=start1+6000;
start2=start2+6000;
% powerspektrum
PyL = yFFTL.*conj(yFFTL)/240000;
alles(i,1:10000)=PyL(1:10000);
end else end
cm2 =[ 000.5625 00.33330.7083 00.66670.8542 01.00001.0000 0.06251.00000.9375 0.12501.00000.8750 0.18751.00000.8125 0.25001.00000.7500 0.31251.00000.6875 0.37501.00000.6250 0.43751.00000.5625 0.50001.00000.5000 0.56251.00000.4375 0.62501.00000.3750 0.68751.00000.3125 0.75001.00000.2500 0.81251.00000.1875 0.87501.00000.1250 0.93751.00000.0625 1.00001.00000 1.00000.95650 1.00000.91300 1.00000.86960 1.00000.82610 1.00000.78260 1.00000.73910 1.00000.69570 1.00000.65220 1.00000.60870 1.00000.56520 1.00000.52170 1.00000.47830 1.00000.43480 1.00000.39130 1.00000.34780 1.00000.30430 1.00000.26090 1.00000.21740 1.00000.17390 1.00000.13040 1.00000.08700 1.00000.04350 1.000000 0.976200 0.952400 0.928600 0.904800 0.881000 0.857100 0.833300 0.809500 0.785700 0.761900 0.738100 0.714300 0.690500 0.666700 0.642900 0.619000 0.595200 0.571400 0.547600 0.523800 0.500000];
colormap(cm2);
mesh(alles);
c1=caxis;
c2=c1(2)*0.1;
c3=c2*0.03*-1;
caxis([c3 c2]);
z=axis;
z(6)=z(6)*0.5;
axis(z);
end
Das folgende Bild zeigt das Ergebnis einer normalen Berechnung.
Das folgende Bild zeigt das Ergenbis einer Berechnung mit 10facher Samplerate.
Gruß
Einstellungen und Berechtigungen
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.