gnuplot Bessel-Filter < Anwendungsprogramme < Praxis < Informatik < Vorhilfe
|
Aufgabe | In dem Plotter "gnuplot" soll der Besselfilter (HP) und Butterworthfilter (HP) geplottet werden.
|
Ich habe ein Problem beim Plotten des Besselfilters (Hochpass). Er soll in folgendes Diagramm integriert werden, welches ich für den Butterworthfilter geschrieben habe. Das Problem liegt bei der Funktion für den Besselfilter. Ich kriege keine korrekten Ergebnisse beim Plotten. Hier das Script für das bestehende Diagramm:
#Beginn
set samples 2001
set terminal postscript enhanced landscape color lw 2 "Arial" 20
set output "butterworthHP.ps"
# Butterworth amplitude response and decibel calculation. n is the order, which is just 1 in this image.
H(w,n) = 1 / (sqrt(1 + 1/w**(2*n)))
dB(x) = 20 * log10(abs(x))
# Gridlines
set grid
# Set x axis to logarithmic scale
set logscale x 10
# Set range of x and y axes
set xrange [0.001:1000]
set yrange [-100:10]
# Create x-axis tic marks once per decade (every multiple of 10)
set xtics 10
# Use 10 x-axis minor divisions per major division
set mxtics 10
# Axis labels
set xlabel "Kreisfrequenz [rad/s]"
set ylabel "Pegel [dB]"
# No need for a key
set nokey #0.1,-25
# Frequency response's line plotting style
set style line 1 lt 1 lw 2 lc 6
set style line 5 lt 1 lw 2 lc 1
set style line 6 lt 1 lw 2 lc 3
set style line 7 lt 1 lw 2 lc 4
set style line 8 lt 1 lw 2 lc 9
set style line 9 lt 3 lw 2 lc 14
# Draw a separator between passband and stopband and label them
set style line 2 lt 2 lw 2
set style arrow 2 nohead ls 2
set arrow 3 from 1,-100 to 1,10 as 2
# Label coordinates are relative to the graph window, not to the function, centered at the 1/4 and 3/4 width points
set label 1 "Durchlassbereich" at graph 0.25, graph 0.1 c
set label 2 "Sperrbereich" at graph 0.75, graph 0.1 c
# Asymptote lines and slope lines are the same "arrow" style
set style line 3 lt 3 lw 2
set style arrow 3 nohead ls 3
# Draw asymptote lines
set arrow 1 from 1,0 to 0.001,-60 as 3
set arrow 2 from 1,0 to 1000,0 as 3
# -3 dB arrow style and arrow
set style line 4 lt 4 lw 1
set style arrow 4 head filled size screen 0.02,15,45 ls 4
set arrow 4 from 2,3 to 1,0 as 4
# "Cutoff frequency" label uses same coordinates as the function
set label 3 "Grenzfreq." at 2,4 l
# "-3 dB" label
set arrow 5 from 3,-6 to 1,-3 as 4
set label 4 "-3.01 dB" at 3,-7 l
# Draw slope lines and label
set arrow 6 from 0.01,-20 to 0.1,-20 as 3
set arrow 7 from 0.01,-20 to 0.01,-39 as 3
set label 5 "Slope: -20 dB/dec" at 0.01,-17 c
# put legend
set key 1000, -20
# Plot the filter response
plot [mm] \
[/mm]
-3 ls 9 notitle, [mm] \
[/mm]
dB(H(x,1)) ls 1 title "1. [mm] Ordnung",\
[/mm]
dB(H(x,2)) ls 5 title "2. [mm] Ordnung",\
[/mm]
dB(H(x,3)) ls 6 title "3. [mm] Ordnung",\
[/mm]
dB(H(x,4)) ls 7 title "4. [mm] Ordnung",\
[/mm]
dB(H(x,5)) ls 8 title "5. Ordnung"
#End
Ich wäre sehr dankbar, wenn mir hier jemand bei der Funktion für den Besselfilter helfen würde. Ich weiß zwar wie diese eigentlich aussieht, kriege hier aber keine korrekten Ergebnisse.
Viele Grüße und Danke für jede Hilfe
Thilo
Ich habe diese Frage in keinem Forum auf anderen Internetseiten gestellt.
|
|
|
|
Hallo!
Wo ist denn genau dein Problem?
Ich habe grade mal den Besselfilter 1. Ordnung definiert:
bessel(x)=1/(1+1/x)
und wenn ich den auf die gleiche Weise plotte, bekomme ich eine kurve mit ganz ähnlichem Aussehen, eigentlich genau das, was ich auch erwarte.
Was in Gnuplot nun nicht geht, ist das Aufstellen einer Summenformel für die höheren Ordnungen, die mußt du schon alle per Hand hinscheiben.
|
|
|
|
|
Aufgabe | Siehe hirzu Frage im Post. |
Hallo Sebastian!
Danke für Deine Antwort!
Sorry, das ich nicht so konkret in meiner Fragestellung war!
Ich habe die einzelnen Funktionen der Ordnungen definiert und das was ich bei gnuplot erhalteist aber auf keinen Fall die Ordnung des Besselfilters. unten habe ich mal mein Besipiel mit 2 Filtertypen 2. Ord. und dem Besselfilter gepostet. Diesmal ist es ein TP. x=w in diesem Fall. Der Nenner des Besselfilters ergibt sich aus folgendem Polynom: [mm] (1+P+(1/3)P^2). [/mm] Hier das Script:
#Beginn
set samples 2001
set terminal postscript enhanced landscape color lw 2 "Arial" 20
set output "AllTP.ps"
# Magnitude plot of Butterworth filter
G(w,n) = 1 / (sqrt(1 + w**(2*n)))
# Magnitude plot of Bessel filter
E(w) = 1 / (1 + w + (1/3)*w**(2))
# convert to decibel scale
dB(x) = 20 * log10(abs(x))
# Frequency response's line plotting style
set style line 1 lt 1 lw 2 lc 6
set style line 5 lt 1 lw 2 lc 1
set style line 6 lt 1 lw 2 lc 3
set style line 7 lt 1 lw 2 lc 4
set style line 8 lt 1 lw 2 lc 9
set style line 9 lt 3 lw 2 lc 1
set style line 10 lt 3 lw 2 lc 3
set style line 11 lt 1 lw 1 lc 2
set style line 12 lt 1 lw 1 lc 4
# put legend
set key 1, -10 r
# add grid
set grid
set logscale x 10
# Draw a separator between passband and stopband and label them
set style arrow 2 nohead ls 9
set arrow 3 from 1,-60 to 1,10 as 2
# Set range of x and y axes
set xrange [0.01:100]
set yrange [-60:10]
# Create 10 x tick marks per decade
set xtics 10
set ytics 10
set xlabel "Kreisfrequenz ({/Symbol w}) [rad/s]"
set ylabel "Pegel [mm] (A/A_0) [/mm] [dB]"
# Draw LR crossovers
plot [mm] \
[/mm]
-6 title "-6dB" ls [mm] 11,\
[/mm]
-3 title "-3dB" ls [mm] 12,\
[/mm]
dB(G(x,1))*2 title "LK 2.Ord." ls [mm] 5,\
[/mm]
dB(G(x,2)) title "BW 2. Ord." ls 6 [mm] ,\
[/mm]
dB(E(x)) title "BE 2 Ord." ls 8
#End
Ich wäre Dir sehr dankbar, wenn Du da mal rübergucken könntest. Ich bin gerade etwas ratlos. Vielleicht konvertiert er die Y Achse auch nicht richtig???
Gruß Thilo
|
|
|
|
|
Hallo!
Ich habe da tatsächlich einen ziemlich fiesen Fehler entdeckt: In deiner Funktionsdefinition schreibst du 1/3. Dummerweise interpretiert gnuplot das wie die meisten Programmiersprachen auch als Integerzahlen, und dann ist 1/3=0. Der zeichnet also nur die erste Ordnung. Schreibe 1.0/3.0 , und dann gehts.
Bei mir sieht das dann so aus:
[Dateianhang nicht öffentlich]
Ich hab die erste Ordnung auch noch reingesetzt.
Ist es das, oder was anderes, was du meinst?
Nebenbei: Was ist dein Zielformat, oder in was willst du den Plot weiter verwenden? Mittlerweile kann gnuplot auch direkt PDF via pdfcairo. Und für TeX gibt es auch geniale Tricks...
Dateianhänge: Anhang Nr. 1 (Typ: png) [nicht öffentlich]
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 19:37 Fr 13.08.2010 | Autor: | Ausgedacht |
DANKEEE!!!
Das war es! Ich bin echt schon verzweifelt.... Hätte ich auch selber drauf kommen können.
Auf Deine Frage:
Ich binde die Bodediagramme in ein Tex-Dok. ein. Ich weiss .ps ist dabei nicht besonders schlau von wegen skalierbarleit. Kenne mich mit gnuplot aber nicht besonders aus, benutze ich den 2. Tag, aber so gibt gnuplot mir z.B. unten das Omega auch richtig aus usw.. Einige Formatierungen funktionieren auch bei mir nur so. Ich wandle das .ps dann in ein .pdf um es mit Inkscape dann anzupassen.
Gruß Thilo
|
|
|
|
|
Hallo!
nunja, Postscript/PDF ist schonmal nicht schlecht, weil es Vektorgrafiken sind. Viele leute machen von gnuplot nen Screenshot, der dann noch als jpg gespeichert wird. Und das sieht grausam aus.
Aber vielleicht findest du hieran gefallen:
###############
set terminal epslatex size 5in, 3in #frißt leider nur inch
set output "bild.tex"
set xlabel 'Kreisfrequenz $\omega$' #Hier auf die einfachen statt doppelten Anführungszeichen achten!
plot ....
unset output
system('epstopdf bild.eps')
##############
Hierbei passiert folgendes: gnuplot erzeugt ein eps (das in der letzten Zeile zu pdf konvertiert wird), welches nur die Grafiken, nicht jedoch die Beschriftungen enthält. Dazu gibt es eine gleichnamige tex-Datei, die das eps/pdf läd, und die Beschriftungen an die richtigen Stellen setzt.
In tex benötigt man die Pakete (usepackage) color und ifpdf, und kann diese bilder dann mit include "bild.tex" statt includegraphics "bild.pdf" einbinden.
Der Vorteil: Die Beschriftung wird von TeX ausgeführt, demnach hast du die gleiche Schriftart und schriftgröße wie im übrigen Text drumherum, und du kannst auch mathematische Ausdrücke verwenden. Letztendlich sieht das dann aus wie aus einem Guss.
Nachteilig ist jedoch, daß man das Bild nicht mehr skalieren kann - die Größe wird in gnuplot endgültig festgelegt. Und du bekommst eben Bilddateien ohne Beschriftung, mal eben angucken ist nicht.
Ansonsten ist dein Script schon sehr länglich und umfangreich geschrieben, das bekommt man eigentlich schon schneller und kürzer hin. Aber naja, nu paßt es ja erstmal.
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 10:01 Sa 14.08.2010 | Autor: | Ausgedacht |
Danke für den Tipp!
Bezüglich der einheitlichen Beschriftung wirklich gut.
Gruß
Thilo
|
|
|
|