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

GUI's sind problematisch, M Files unproblematisch

 

brummfritz
Forum-Anfänger

Forum-Anfänger


Beiträge: 21
Anmeldedatum: 01.09.16
Wohnort: Düsseldorf
Version: Matlab R2015b
     Beitrag Verfasst am: 03.09.2016, 20:28     Titel: GUI's sind problematisch, M Files unproblematisch
  Antworten mit Zitat      
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.

test1.jpg
 Beschreibung:

Download
 Dateiname:  test1.jpg
 Dateigröße:  67.2 KB
 Heruntergeladen:  506 mal
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 03.09.2016, 21:03     Titel:
  Antworten mit Zitat      
Hallo,

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.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
brummfritz
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 21
Anmeldedatum: 01.09.16
Wohnort: Düsseldorf
Version: Matlab R2015b
     Beitrag Verfasst am: 04.09.2016, 07:47     Titel: Werde mit uicontrol experimentieren
  Antworten mit Zitat      
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');
if isequal(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.

Gruß
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 04.09.2016, 13:28     Titel:
  Antworten mit Zitat      
Hallo,

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.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
brummfritz
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 21
Anmeldedatum: 01.09.16
Wohnort: Düsseldorf
Version: Matlab R2015b
     Beitrag Verfasst am: 10.09.2016, 10:12     Titel:
  Antworten mit Zitat      
Hallo Forum, Harald.

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ß. Very Happy


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');
if isequal(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 =[
         0         0    0.5625
         0    0.3333    0.7083
         0    0.6667    0.8542
         0    1.0000    1.0000
    0.0625    1.0000    0.9375
    0.1250    1.0000    0.8750
    0.1875    1.0000    0.8125
    0.2500    1.0000    0.7500
    0.3125    1.0000    0.6875
    0.3750    1.0000    0.6250
    0.4375    1.0000    0.5625
    0.5000    1.0000    0.5000
    0.5625    1.0000    0.4375
    0.6250    1.0000    0.3750
    0.6875    1.0000    0.3125
    0.7500    1.0000    0.2500
    0.8125    1.0000    0.1875
    0.8750    1.0000    0.1250
    0.9375    1.0000    0.0625
    1.0000    1.0000         0
    1.0000    0.9565         0
    1.0000    0.9130         0
    1.0000    0.8696         0
    1.0000    0.8261         0
    1.0000    0.7826         0
    1.0000    0.7391         0
    1.0000    0.6957         0
    1.0000    0.6522         0
    1.0000    0.6087         0
    1.0000    0.5652         0
    1.0000    0.5217         0
    1.0000    0.4783         0
    1.0000    0.4348         0
    1.0000    0.3913         0
    1.0000    0.3478         0
    1.0000    0.3043         0
    1.0000    0.2609         0
    1.0000    0.2174         0
    1.0000    0.1739         0
    1.0000    0.1304         0
    1.0000    0.0870         0
    1.0000    0.0435         0
    1.0000         0         0
    0.9762         0         0
    0.9524         0         0
    0.9286         0         0
    0.9048         0         0
    0.8810         0         0
    0.8571         0         0
    0.8333         0         0
    0.8095         0         0
    0.7857         0         0
    0.7619         0         0
    0.7381         0         0
    0.7143         0         0
    0.6905         0         0
    0.6667         0         0
    0.6429         0         0
    0.6190         0         0
    0.5952         0         0
    0.5714         0         0
    0.5476         0         0
    0.5238         0         0
    0.5000         0         0];
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
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 10.09.2016, 11:00     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
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.
Code:
plot(handles.axes1, x, y)
mesh(..., 'parent', handles.axes1)


Zitat:
Aber auch hier werden wieder zusätzliche M Dateien benötigt.

Es besteht immer die Möglichkeit, weitere Funktionen als lokale Funktionen unter die Hauptdatei zu setzen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
brummfritz
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 21
Anmeldedatum: 01.09.16
Wohnort: Düsseldorf
Version: Matlab R2015b
     Beitrag Verfasst am: 10.09.2016, 13:21     Titel:
  Antworten mit Zitat      
Hallo,

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');
if isequal(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 =[
         0         0    0.5625
         0    0.3333    0.7083
         0    0.6667    0.8542
         0    1.0000    1.0000
    0.0625    1.0000    0.9375
    0.1250    1.0000    0.8750
    0.1875    1.0000    0.8125
    0.2500    1.0000    0.7500
    0.3125    1.0000    0.6875
    0.3750    1.0000    0.6250
    0.4375    1.0000    0.5625
    0.5000    1.0000    0.5000
    0.5625    1.0000    0.4375
    0.6250    1.0000    0.3750
    0.6875    1.0000    0.3125
    0.7500    1.0000    0.2500
    0.8125    1.0000    0.1875
    0.8750    1.0000    0.1250
    0.9375    1.0000    0.0625
    1.0000    1.0000         0
    1.0000    0.9565         0
    1.0000    0.9130         0
    1.0000    0.8696         0
    1.0000    0.8261         0
    1.0000    0.7826         0
    1.0000    0.7391         0
    1.0000    0.6957         0
    1.0000    0.6522         0
    1.0000    0.6087         0
    1.0000    0.5652         0
    1.0000    0.5217         0
    1.0000    0.4783         0
    1.0000    0.4348         0
    1.0000    0.3913         0
    1.0000    0.3478         0
    1.0000    0.3043         0
    1.0000    0.2609         0
    1.0000    0.2174         0
    1.0000    0.1739         0
    1.0000    0.1304         0
    1.0000    0.0870         0
    1.0000    0.0435         0
    1.0000         0         0
    0.9762         0         0
    0.9524         0         0
    0.9286         0         0
    0.9048         0         0
    0.8810         0         0
    0.8571         0         0
    0.8333         0         0
    0.8095         0         0
    0.7857         0         0
    0.7619         0         0
    0.7381         0         0
    0.7143         0         0
    0.6905         0         0
    0.6667         0         0
    0.6429         0         0
    0.6190         0         0
    0.5952         0         0
    0.5714         0         0
    0.5476         0         0
    0.5238         0         0
    0.5000         0         0];
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ß
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 - 2024 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.