plotten großer vektoren < Matlab < Mathe-Software < Mathe < Vorhilfe
|
Status: |
(Frage) beantwortet | Datum: | 12:08 Di 31.07.2012 | Autor: | trbo |
Aufgabe | aus einer Raumimpulsantwort die Klarheitswerte C50/C80 mittels matlab-programm errechnen |
hallo,
mein problem dreht sich um das thema akustische messungen.
ich habe einen workspace mit abtastfrequenz und Impulsantwort. die impulsantwort besteht aus rund 250k messwerten, weßhalb octave mir den graph nicht plotten will. könnt ihr mir sagen ob das wirklich nicht geht oder ob ich anders rangehen muss?
so sieht die prompt aus (FS=sample freq. , TS=impulsantwort):
load 'IA.mat'
a=1/FS
x=0:a:0.08*FS //x soll bis maximal 80ms gehen
y=TS(1:0.08*FS)
plot(x,y) //semilogx(x,y) hab ich auch schon versucht.
verzeiht mir synthaxfehler, es ist schon länger her dass ich mich mit matlab/octave intensiv beschäftigt hab. damals war ich aber sicher was die synthax angeht und es hat trotzdem nicht geklappt. es geht mir mehr um das prinzip. zu sagen wär noch dass ich das ganze auf der konsole ausführe, ohne graphische oberfläche.
danke für eure hilfe
|
|
|
|
> aus einer Raumimpulsantwort die Klarheitswerte C50/C80
> mittels matlab-programm errechnen
> hallo,
> mein problem dreht sich um das thema akustische messungen.
> ich habe einen workspace mit abtastfrequenz und
> Impulsantwort. die impulsantwort besteht aus rund 250k
> messwerten,
Da sollte kein Problem darstellen. Da schmieren Matlab und Octave nocht nicht ab.
> weßhalb octave mir den graph nicht plotten
> will. könnt ihr mir sagen ob das wirklich nicht geht oder
> ob ich anders rangehen muss?
> so sieht die prompt aus (FS=sample freq. ,
> TS=impulsantwort):
> load 'IA.mat'
> a=1/FS
> x=0:a:0.08*FS //x soll bis maximal 80ms gehen
> y=TS(1:0.08*FS)
Wenn TS eine Funktion ist, dann müsste es funktionieren. "Geht nicht" ist eine sehr schlechte Fehlerbeschreibung.
> plot(x,y) //semilogx(x,y) hab ich auch schon versucht.
>
> verzeiht mir synthaxfehler, es ist schon länger her dass
> ich mich mit matlab/octave intensiv beschäftigt hab.
Falls TS eine Matrix von Messwerten ist, dann funktioniert die Zeile
> y=TS(1:0.08*FS)
nicht, da als Indizies nur Ganzzahlen auftauchen dürfen.
Angenommen du hast die 250k Messwerte (y-Werte) in TS stehen. Dann ist TS eine Matrix vom Format 1x250000 und der Befehl
plot(TS)
sollte genügen.
> damals war ich aber sicher was die synthax angeht und es
> hat trotzdem nicht geklappt. es geht mir mehr um das
> prinzip. zu sagen wär noch dass ich das ganze auf der
> konsole ausführe, ohne graphische oberfläche.
> danke für eure hilfe
Schreib die genaue Fehlermeldung am besten auf. Sonst wird das nur eine Spielrunde "Blinde Kuh" für mögliche Antworten.
gruß
wieschoo
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 14:36 Di 31.07.2012 | Autor: | trbo |
mit der fehlermeldung hast du natürlich recht, sorry.
TS ist eine 1x1 matrix mit den 250k messwerten.
plot(TS) hat nicht funktioniert, fehlermeldung:
octave:17> plot(TS)
error: popen2: process creation failed -- Cannot allocate memory
error: called from:
error: /usr/share/octave/3.2.4/m/plot/__gnuplot_open_stream__.m at line 28, co lumn 44
error: /usr/share/octave/3.2.4/m/plot/gnuplot_drawnow.m at line 85, column 19
ich dachte erst daran dass der rechner grafiktechnisch nicht ausreichend konfiguriert ist um was zu plotten. aber als ich weiter rumprobiert hab, habe ich für kleinere definitionsbereiche einen graphen bekommen.
...
habe gerade nachdem ich den letzten teil geschrieben hab auf einem anderen Rechner (mit graphischer oberfläche) nochmal plot(TS) versucht, jetzt klappts natürlich -.-
ich hätte aber noch eine andere frage, und zwar ist es so, dass es bei einer raumimpulsantwort mehrere peaks gibt, dabei ist der erste peak der direktschall und alle weiteren sind reflexionen. ich brauche jetzt den zeitpunkt des direktschall-peaks. ich seh den zwar im graphen,kann aber nur abschätzen zu welchem zeitpunkt er genau auftritt. gibt es eine funktion bei matlab/octave, mit der ich in einem bestimmten intervall das maximum bestimmen könnte (bzw. den x-wert dazu)?
|
|
|
|
|
Hi!
In Matlab gibts die max/min Funktion, die auch problemlos auf Arrays funktioniert. Da die Octave Syntax ja an Matlab angelehnt ist, vermute ich, dass es dort eine ähnliche Funktion gibt. Für Matlab kannst Du hier schauen:
http://www.mathworks.de/help/techdoc/ref/max.html
Da Du den Zeitpunkt brauchst, vermute ich mal, dass Dir der max-wert nicht reichen wird, sondern Du ein Index o.Ä. brauchst. Dafür kannst Du max mit der find Funktion kombinieren (gibts auch bei Octave, aber bin mir nicht sicher, ob beide Funktionen in Matlab und Octave gleich funktionieren):
index = find(A==(max(A(:,1))) findet den höchsten Wert in der 1. Spalte der gesamten Matrix (alle Zeilen) (ungetestet!!)
Mit dem so gefunden Index kannst Du dann z.B. per A(index,2) zugreifen. Ich weiß jetzt nicht genau, wie Deine Matrizen aufgebaut sind - muss du etwas rumprobieren, bis du die richtigen Spalten /Zeilen gefunden hast.
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 15:27 Di 31.07.2012 | Autor: | trbo |
ah ok danke, ich werd das mal versuchen.
eine frage noch, ist es irgendwie möglich über diese impulsantwort ein integral zu bilden (es ist ja keine kontinuierliche funktion..)? bis jetzt hab ich das sehr umständlich gelöst, indem ich, einfach ausgedrückt, für jeden messwert eine rechteck berechne mit den seitenlängen TS und 1/FS , dann bilde ich aus der differenz zum nächsten messwert eine dreieckfläche und addier die zum rechteck. über eine schleife mache ich das so für jeden messwert. mir gefällt die lösung persönlich nicht so richtig, gibt es da vielleicht eine elegantere methode?
|
|
|
|
|
Hio,
nach ein wenig "googlen" habe ich für Matlab diese beiden Funktionen gefunden:
trapz: http://www.mathworks.de/help/techdoc/ref/trapz.html
cumtrapz: http://www.mathworks.de/help/techdoc/ref/cumtrapz.html
Ich habe bisher nichts mit diesen Funktionen gemacht (sind mir auch neu), aber laut Doku sieht die "trapz" Funktion genau nach dem aus, was Du bereits implementiert hast.
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 16:54 Di 31.07.2012 | Autor: | trbo |
ich hab dazu natürlich auch schon gegoogelt und so, aber bin dabei leider auf keine adäquate Lösung gestoßen. also danke für den tip, ich probier damit schon ein bisschen rum und werd später berichten ob es klappt.
erstmal danke für eure hilfe!
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 17:10 Di 31.07.2012 | Autor: | wieschoo |
Der Max-befehl liefert sowohl das Maximum als auch den Index.
[a,b] = max(...)
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 17:36 Di 31.07.2012 | Autor: | Pille456 |
Ahh wusste ich noch gar nicht, Danke für den Tipp!
Hab das immer mit find gelöst.. :D
|
|
|
|