|
..Sven.. |
Gast
|
 |
Beiträge: ---
|
 |
|
 |
Anmeldedatum: ---
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 29.08.2013, 10:07
Titel: Schleife beschleunigen
|
 |
|
 |
|
Hallo zusammen,
derzeit schreibe ich an einem Skript Funktion mit der folgenden Funktion:
Ein Frequenzbereichs-Signal wird bei mehreren Durchläufen jeweils einmal Bandpassgefiltert. Der Bandpass wird bei jedem Durchlauf zu einer höheren Frequenz verschoben. Das Verschieben des Bandpasses macht eine for Schleife.
Das Ausgangssignal wird in den Zeitbereich überführt (ifft) und anschließend wird der Maximalwert des Zeitsignals an der i-ten Stelle eines Ausgabevektors gespeichert (i wächst mit der Schleife).
Der Code (funktionsfähig aber langsam) sieht so aus:
Die For-Schleife läuft ca 9000 Mal durch, das zu filternde Signal hat ca 3-4 Millionen Werte. Die Rechenzeit liegt bei ca 20-30 Minuten.
Zunächst habe ich mein Glück darin gesucht, die Schleife auf eine parfor Schleife umzustellen. Dadurch wurde die Funktion leider langsamer
Nächster Versuch: Die ifft auf der Grafikkarte rechnen.
Das bringt ca Faktor 4 schnellere Rechenzeit, leider habe ich nur selten Zugriff auf einen Rechner mit einer entsprechenden Graffikkarte.
Als nächsten Versuch wollte ich die Schleife durch Vektorielle Schreibweise ersetzen. Das sah dann am Ende vereinfacht dargestellt etwa so aus:
Leider kann ich die Schleife nicht ausführen da der Speicher nicht ausreicht. Auf meinem Aktuellen PC (ca 4GB) kann ich statt der benötigten 9000 durchläufe maximal 10 (!) ausführen, unsere Worksation mit 64 GB dürfte also ebenfalls nicht ausreichen.
Hat jemand von euch eine Idee? Würde mich über Hilfe sehr freuen
|
|
|
|
|
HauNei |

Forum-Fortgeschrittener
|
 |
Beiträge: 55
|
 |
|
 |
Anmeldedatum: 18.04.13
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 29.08.2013, 10:50
Titel:
|
 |
Hallo;
Als erstes würde ich den Ausgabevektor mit sovielen Nullen vorbelegen,
wie deine For-Schleife an durchgängen hat.
also
Das ganze vor der for-Schleife. Dies könnte schon weiterhelfen.
Ansonsten müsste ich mal weiter überlegen.
Grüße
|
|
|
Harald |

Forum-Meister
|
 |
Beiträge: 24.501
|
 |
|
 |
Anmeldedatum: 26.03.09
|
 |
|
 |
Wohnort: Nähe München
|
 |
|
 |
Version: ab 2017b
|
 |
|
|
 |
|
Verfasst am: 29.08.2013, 11:02
Titel:
|
 |
Hallo,
zum Ausprobieren bitte auch typische Werte für B, Bandabtastung und Ende zur Verfügung stellen - letzten Endes ein lauffähiges Beispiel der ersten Variante.
Man könnte parallele for-Schleifen (parfor) verwenden, um mehrere Rechenkerne zu nutzen.
Grüße,
Harald
|
|
|
Jan S |

Moderator
|
 |
Beiträge: 11.057
|
 |
|
 |
Anmeldedatum: 08.07.10
|
 |
|
 |
Wohnort: Heidelberg
|
 |
|
 |
Version: 2009a, 2016b
|
 |
|
|
 |
|
Verfasst am: 29.08.2013, 11:30
Titel: Re: Schleife beschleunigen
|
 |
Hallo ..Sven..,
Ich gehe davon aus, das die meiste Zeit in IFFT verbracht wird. Deswegen vermute ich, dass diese anderen Versuche nicht viel helfen:
Die meiste Arbeit passiert hier in IFFT, wobei fast der gesamte Input aus Nullen besteht, oder?Wäre es dann nicht sinnvoller, immer nur den von Null verschiedenen Teil zu betrachten?
Gruß, Jan
|
|
|
Gast |
|
 |
Beiträge: ---
|
 |
|
 |
Anmeldedatum: ---
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 30.08.2013, 14:28
Titel:
|
 |
Hallo zusammen,
Danke für die Antworten!
Der Ausgabevektor wird nur ca 8000 Zeichen lang, auch ohne Vor-Allokierung braucht man hier wenig Rechenleistung.
Zu den Zahlenwerten: 9000 Durchläufe, Eingangsvektor mit 3,5 Millionen Werten... das Filtern vom Signal benötigt kaum Zeit, ich bräuchte eher eine Variante die FFT irgendwie zu beschleunigen.
Nur den von 0 verschiedenen Teil zu betrachten habe ich auch schon überlegt... aber wenn ich den Teil mit Nullen betrachte ... kommt da das gleiche aus der ifft raus? Immerhin verwandelt sich die Rechteck-Filterung in ein Si-Funktion welche den Zeitbereich deutlich beeinflusst?
Gruß und Dank,
Sven
|
|
|
Jan S |

Moderator
|
 |
Beiträge: 11.057
|
 |
|
 |
Anmeldedatum: 08.07.10
|
 |
|
 |
Wohnort: Heidelberg
|
 |
|
 |
Version: 2009a, 2016b
|
 |
|
|
 |
|
Verfasst am: 30.08.2013, 16:04
Titel:
|
 |
Hallo,
Zitat: |
Der Ausgabevektor wird nur ca 8000 Zeichen lang, auch ohne Vor-Allokierung braucht man hier wenig Rechenleistung. |
Wenn Du einen Vektor mit 8000 Elementen des Typs DOUBLE iterative vergrößerst, müssen insgesamt 128'032 kB alloziert und kopiert werden. Das bracuht auf modernen Rechnern kaum Zeit, aber wenn dann eigenlich doch nur 64 kB benötigt werden, ist die Verschwendung doch vermeidbar.
Zitat: |
Zu den Zahlenwerten: 9000 Durchläufe, ... |
Wieso bekommst Du für 9000 Durchläufe 8000 Werte? Was ist genau ein "Durchlauf"?
Wie groß ist eigentlich "Bandabtastung" und "B" in Deinem Code?
Die Werte der IFFT sollten schon davon abhängen, wie viele Nullen vor und nach dem Signal-Stück erscheinen. Aber Wenn von den 3.5 Millionen Elementen nur B Stück von Null verschieden sind, sollte je nach Größe von B auch eine in Matlab handprogrammierte IFFT schneller sein als der optimierte IFFT Befehl.
Gruß, Jan
|
|
|
|
|
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
|
|
Impressum
| Nutzungsbedingungen
| Datenschutz
| FAQ
| RSS
Hosted by:
Copyright © 2007 - 2025
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.
|
|