Akustische Raummodi dargestellt

Die Schwingungsmodi in einem Raum sind sehr wichtig für die Akustik des Raumes. Für quaderförmige Räume sind diese relativ einfach ohne FEM zu rechnen. Dazu kann man gnuplot verwenden.

Ergebnisse als Graphen

Skript Download

#!/usr/bin/gnuplot
#  ein paar wichtige Parameter sind in dieser Datei definiert
# -------------------- CONFIG START ------------------------------
RAUMNAME='W'
# ------------------------------------------  CONFIG END ---------------------
TITEL='Raummoden im '.RAUMNAME
PDF='Raummodi.'.RAUMNAME.'.pdf'
DATA='Raummodi.'.RAUMNAME.'.csv'
CONF='Raummodi.'.RAUMNAME.'.inc'
file_exists(file) = system("[ -f '".CONF."' ] && echo '1' || echo '0'") + 0       # Existiert die Datei?
if ( file_exists("mydatafile")) { load CONF }
else {                                             # Wenn nicht dann erzeugen
    set print CONF
    print "MaxMode=6"
    print "#Abmessungen in Meter, Dezimaltrenner Punkt!"
    print "X=2.3"
    print "Y=4.0"
    print "Z=6.7"
    set print
    print "Datei ".CONF." erzeugt, bitte Einträge anpassen und nochmal starten"
}
set decimalsign ',' # dies wirkt nicht auf sprintf, nur auf gprintf
set terminal pdf enhanced font 'arial,12' size 21cm,29.7cm
#    Nach dieser Formel wird die Frequenz zum jeweiligen Raummodus berechnet
Fres(x,y,z)=343/2.0 * sqrt( (x/X)**2.0 + (y/Y)**2.0 + (z/Z)**2.0)
#   Jetzt werden alle Daten berechnet und in eine CSV Datei geschrieben,
#   diese wird später zum Plotten eingelesen
set print DATA
#  die Axialmodi zuerst: "Modus Frequenz Farbe Modistärke"
M2=0
M3=0
  do for [M1=1:MaxMode] {
	print  M1, "-", M2, "-", M3," ",Fres(M1,M2,M3),"  1 6.5"
}
print ""
print ""
M1=0
M3=0
  do for [M2=1:MaxMode] {
	print  M1, "-", M2, "-", M3," ",Fres(M1,M2,M3),"  2 6.5"
}
print ""
print ""
M1=0
M2=0
  do for [M3=1:MaxMode] {
	print  M1, "-", M2, "-", M3," ",Fres(M1,M2,M3),"  3 6.5"
}
print ""
print ""
# Tangentialmoden
X1=0
do for [X2=1:MaxMode] {
  do for [X3=1:MaxMode] {
	print  X1, "-", X2, "-", X3," ",Fres(X1,X2,X3),"  4 4"
}
}
print ""
print ""
X2=0
do for [X1=1:MaxMode] {
  do for [X3=1:MaxMode] {
	print  X1, "-", X2, "-", X3," ",Fres(X1,X2,X3),"  5 4"
}
}
print ""
print ""
X3=0
do for [X1=1:MaxMode] {
  do for [X2=1:MaxMode] {
	print  X1, "-", X2, "-", X3," ",Fres(X1,X2,X3),"  6 4"
}
}
print ""
print ""
#
# Obliqemoden
do for [X1=1:MaxMode] {
  do for [X2=1:MaxMode] {
    do for [X3=1:MaxMode] {
	print X1,"-",X2,"-",X3," ",Fres(X1,X2,X3),"  7 1"
}
}
}
#  Ende der Datenerzeugung in die DATA Datei
set print

set output PDF
set xtics 10
set ytics 1 textcolor rgb "white"
set mxtics 5
#border in scale 0,0 mirror norotate  offset character 0, 0, 0
set grid xtics mxtics ytics
#   gprintf kann nur jeweils ein Argument, beachtet dafür aber decimalsign. 
#   Deshalb die Schachtelung sprintf(gprintf...))
set title sprintf("Schwingungsmodi %s (%s×%s×%s = %s)m³", TITEL, gprintf("%.2f",X), \
   gprintf("%.2f",Y), gprintf("%.2f",Z), gprintf("%.2f",X*Y*Z)) font ",18"
#unset ytics
# Aufteilung in drei Teildarstellungen, weil sonst die Werte zu oft überlappen
set multiplot layout 3,1 scale 0.95,0.9 offset 0,0.015
#  Das sind die Korrekturwerte für die Position der Labels
du=0.10      # Untergrenze für die Errorbars
k=7          # Anzahl der Serien in DATA
#    Den X-Bereich auf 0…100Hz begrenzen, die Errorbars manuell so setzen,
#    dass senkrechte Linien bis zum Datenpunkt entstehen
set xrange [30:120]
set yrange [0:10]
set size 0.95,0.3
set origin 0.01,0.67
plot for [i=1:k] DATA index i using 2:($4):(sprintf("%s Hz (%s)",\
         gprintf("%.2f",$2),stringcolumn(1))):3 \
         with labels offset char -0.3,4 tc variable rotate by 90 notitle, \
     for [i=1:k] DATA index i using 2:($4):(du):($4):3 with errorbars notitle lc variable
# Den X-Bereich auf 100…200Hz begrenzen und den Titel nicht wiederholen
set xrange [120:210]
unset title
set size 0.95,0.30
set origin 0.01,0.35
plot for [i=1:k] DATA index i using 2:($4):(sprintf("%s Hz (%s)",\
         gprintf("%.2f",$2),stringcolumn(1))):3 \
         with labels offset char -0.3,4  tc variable rotate by 90 notitle , \
     for [i=1:k] DATA index i using 2:($4):(du):($4):3 with errorbars notitle lc variable
# Den x-Bereich auf 200…300Hz begrenzen und die X-Achsenbeschriftung nur hier abringen
set xlabel "Frequenz in Hz"
set xrange [210:300]
set size 0.95,0.30
set origin 0.01,0.03
plot for [i=1:k] DATA index i using 2:($4):(sprintf("%s Hz (%s)",\
         gprintf("%.2f",$2),stringcolumn(1))):3 \
         with labels offset char -0.3,4 tc variable rotate by 90 notitle, \
     for [i=1:k] DATA index i using 2:($4):(du):($4):3 with errorbars notitle lc variable
unset multiplot
#ENV="exiftool -P -overwrite_original -PDF:Title=\"".TITEL."\" -PDF:Subject=\"Raummodi\" ".PDF
#system ENV