Hallo @ all
Ich habe einen AT91SAM9263. Der µC läuft mit ca.240MHz. Ich soll mal
abschätzen wie lange so eine FFT von 1024 Punkten auf so einem µC
benötigt. Ich weiß es gibt dafür DSP Prozessoren.
Ist es möglich eine FFT von 1024 Punkten innerhalb von 1ms zu berechnen?
Der Berechnungsaufwand liegt doch bei N*Log(N). Demnach ist der
Berechnungsaufwand für 1024 Punkte 1024*Log(1024)= 3082
Ein µC mit 240 Millionen Rechenzyklen pro Sekunde hat demnach bei
1000FFTs pro Sekunde 240k Zyklen für eine FFT zeit. Das sollte doch
ausreichen. Oder habe ich hier einen Denkfehler?
Ganz so einfach ist es nicht. Die Komplexität ist N*log(N), aber das
entspricht nicht der Anzahl der Rechenoperationen oder Takte, sondern
ist nur (ungefähr) proportional dazu. Wie viele Takte du brauchst ist
von der Implementierung abhängig, also Int vs. Float, Wortbreite,
Prozessor, Speicheranbindung. Am besten suchst du dir eine
FFT-Bibliothek für ARM und schaust in die Doku oder probierst es einfach
aus. ARM bietet hier eine an, optimiert allerdings nur für ARM11 und
Cortex-A8: http://www.arm.com/products/multimedia/openmax/index.html
Hört sich sehr interessant an. Ich habe mal auf der Seite nachgeschaut.
Dort habe ich die OpenMAX DL v1.0.2 release for ARM11 and ARM Cortex-A8
processors Funktionen gefunden. Dort ist auch eine FFT-Funktion
implementiert.
Jedoch habe ich doch ein ARM9 Kern (AT91SAM9263).
1. Funktioniert das denn überhaupt mit der für ARM11 erstellten
Funktion?
2. Kann man dies kostenlos runterladen und benutzen?
3. Ich verwende den IAR-Compiler. Kann ich die Funktionen einfach
einbinden?
4. Gibt es für die FFT-Funktionen aus Beispiele?
Johann schrieb:
> Jedoch habe ich doch ein ARM9 Kern (AT91SAM9263).>> 1. Funktioniert das denn überhaupt mit der für ARM11 erstellten> Funktion?
Eher nicht, da im ARM11 Prozessor erhebliche Erweiterungen des
Befehlssatzes gegenüber ARM9E zu finden sind. Ohne den Code angesehen zu
haben bin ich mir sicher, dass man diese Erweiterungen ausgenutzt hat.
Insbesondere SIMD Instruktionen.
> 4. Gibt es für die FFT-Funktionen aus Beispiele?
Im ARM System Developer's Guide findest Du Beispiele für diverse DSP
Algorithmen mit ARM7 und ARM9 CPUs.
Gruß
Marcus
http://www.doulos.com/arm/
Johann schrieb:
> Jedoch habe ich doch ein ARM9 Kern (AT91SAM9263).>> 1. Funktioniert das denn überhaupt mit der für ARM11 erstellten> Funktion?
Hab's mir gerade angesehen: Nein, definitiv nicht.
> 3. Ich verwende den IAR-Compiler. Kann ich die Funktionen einfach> einbinden?
Siehe 1. Davon abgesehen sind gerade die Assembler-Routinen sehr auf
RealView Compiler Tools abgestimmt. Wird also etwas Handwarbeit
erfordern.
Gruß
Marcus
http://www.doulos.com/arm/
Mal rechnen:
FFT 1024 Punkte
mal 10 stages der FFT (N*log(N)!)
mal 2 Multiplikationen
mal 4 weils komplexe Multiplikationen sind
mal 1000 weils nach ner Millisekunde fertig sein soll
macht ca 82Mio.
Dein Prozessor läuft mit 240MHz, das heißt Du hast 3 Instruktionen pro
Multiplikation, das dürfte m.E. nicht ausreichen.
Cheers
Detlef
FFT gehört nicht gerade zu meinem täglich Brot, aber im von mir
vorgeschlagenen Buch (S. 314) wird für eine 1024 Punkt Radix-4 FFT auf
einem ARM9E core eine Zyklenzahl von 66.196 angegeben. Rundet man das
Ganze wegen eines möglicherweise sub-optimalen Speicherzugriffs
vielleicht auf 100000 Zyklen/FFT, dann sollte da durchaus noch Luft
sein.
Gruß
Marcus
http://www.doulos.com/arm
ARM wiederum ist nicht mein täglich Brot, aber kann es sein, dass der
von Dir genannte ARM nen Coprozessor hat? Der vom OP genannte hat nicht
mal nen integer-Hardware Multiplizierer, soweit ich da gesehen habe, der
muß die Multiplikation emulieren.
Wie dem auch sei.
Cheers
Detlef
Guten Morgen
Detlef _a schrieb:
> ARM wiederum ist nicht mein täglich Brot, aber kann es sein, dass der> von Dir genannte ARM nen Coprozessor hat? Der vom OP genannte hat nicht> mal nen integer-Hardware Multiplizierer, soweit ich da gesehen habe, der> muß die Multiplikation emulieren.
Keinen Coprozessor in diesem Sinne.
Der ARM9E Kern hat einen Multiplizierer, der bei 16bit Operanden/32bit
Ergebnis einen Taktzyklus benötigt. Sogar der ARM7TDMI hat einen
Multiplizierer (allerdings nich single-cycle). Wie kommst Du darauf,
dass er gar keinen hätte?
Ziel der Entwicklung der ARMv5TE Architektur des ARM9E Kerns war
explizit die Beschleunigung typischer DSP Algorithmen.
Alle Atmel SAM9 enthalten den ARM9EJ-S Kern, soweit ich das sehen kann.
Gruß
Marcus
http://www.doulos.com/arm/
>>Alle Atmel SAM9 enthalten den ARM9EJ-S Kern, soweit ich das sehen kann.
So ist es, ARM9EJ-S ist in dem Atmel verbaut, der hat aber keine
eingebauten Multiplizierer. Falls ich die übersehen haben sollte, bitte
ich um einen link, ich habe mir das Technical Reference Manual
angeschaut.
Cheers
Detlef
Ähm, möchte nochmal nachhaken.
OP betreibt diesen Atmel:
>>Ich habe einen AT91SAM9263.
Dazu auf der Produktpage:
http://www.atmel.com/dyn/products/product_card.asp?part_id=4056
"The AT91SAM9263 microcontroller-based system-on-chip embeds a 200 MIPS
ARM926EJ-S-based processor."
Auf der gleichen Seite stehen zwei links, einer zu einem "ARM926EJ-S
Technical Reference Manual", einer einer zu einem "ARM9E-S Technical
Reference Manual" . In letzterem Dokument ist von Multiplizierern die
Rede, in dem ARM926EJ-S Technical Reference Manual steht aber von
Multiplizierern nichts, das hatte ich mir angeschaut. Was ist denn der
Unterschied zwischen ARM926EJ-S und ARM9E-S ? Dein link zeigte zu
Dokumenten zu einem ARM9EJ-S, anscheinend noch ein weiterer Typ, auch
mit Multiplizierer.
Die ARMs gibts ja wohl in verschiedenen Geschmacksrichtungen. Hat der im
Atmel verbaute einen Multiplizierer?
Cheers
Detlef
Detlef _a schrieb:
> "The AT91SAM9263 microcontroller-based system-on-chip embeds a 200 MIPS> ARM926EJ-S-based processor.">> Auf der gleichen Seite stehen zwei links, einer zu einem "ARM926EJ-S> Technical Reference Manual", einer einer zu einem "ARM9E-S Technical> Reference Manual" . In letzterem Dokument ist von Multiplizierern die> Rede, in dem ARM926EJ-S Technical Reference Manual steht aber von> Multiplizierern nichts, das hatte ich mir angeschaut. Was ist denn der> Unterschied zwischen ARM926EJ-S und ARM9E-S ? Dein link zeigte zu> Dokumenten zu einem ARM9EJ-S, anscheinend noch ein weiterer Typ, auch> mit Multiplizierer.
ARM9E-S, bzw. ARM9EJ-S sind Kerne. Letzterer mit nativer Java
Bytecode Verarbeitung (Jazelle). Ansonsten sind beide identisch. Diese
Kerne beinhalten immer einen Multiplizierer.
ARM926EJ-S ist eine Makrozelle, die einen ARM9EJ-S enthält und ihn
insbesondere um Caches, MMU, TCM erweitert. Daher die vielen
Querverweise auf unterschiedliche Dokumente. Einerseits werden dadurch
Redundanz und Fehler durch Copy&Paste vermieden, andererseits schafft
man damit auch Verwirrung bei denen, die sich nicht täglich damit
beschäftigen. Manchmal wird auch von einem ARM926EJ-S Kern geredet,
was genaugenommen nicht richtig ist, aber meistens egal :-)
> Die ARMs gibts ja wohl in verschiedenen Geschmacksrichtungen. Hat der im> Atmel verbaute einen Multiplizierer?
Ja, in jedem Fall.
Gruß
Marcus
http://www.doulos.com/arm/
Aha, wieder was dabeigelernt, thx. Mit dem Multiplizierer sollte dann
die benötigte Rechenleistung ausreichen, wenn er eine Multiplikation in
1 oder zwei cycles schafft, ist aber auf Kante genäht.
Cheers
Detlef