Forum: Digitale Signalverarbeitung / DSP / Machine Learning CMSIS DSP Library richtig anwenden


von DH1AKF W. (wolfgang_kiefer) Benutzerseite


Angehängte Dateien:

Lesenswert?

Autor: DH1AKF K. (wolfgang_kiefer)
Datum: 01.04.2015 11:52
Angehängte Dateien:
fft.c (917 Bytes, 21 Downloads) | Codeansicht


Hallo Experten!
Es steht ein Programm zur Verfügung, das für einen Microchip Controller 
und die zugehörige (Firmware-) Library geschrieben wurde.
Ich möchte es auf einen anderen Prozessor (Cortex- M3) portieren, und
dabei die CMSIS- DSP- Library- Funktionen benutzen.

Frage: Hat einer von Euch schon mal so etwas probiert? Oder gibt es
Beispiele, wie man die DSP- Funktionen der CMSIS anwendet?
Bin für alle Hinweise dankbar.

: Bearbeitet durch User
von W.S. (Gast)


Lesenswert?

Das was du da gepostet hast, besteht praktisch nur aus ein paar Aufrufen 
von Funktionen, die es im MicroChip-Portfolio gibt. Sowas kann man nicht 
portieren. Du müßtest dich stattdessen mit der Doku zu den 
CMSIS-DSP-Routinen vertraut machen und die Aufrufe der dort vorhandenen 
Funktionen dir selber neu schreiben - aber das Aufrufen von fertigen 
Bibliotheksroutinen ist ja nur Kleinkram.

Gehe ich recht in der Annahme, daß du dir nen Bandpaß (300..2700 Hz oder 
so) programmieren willst?

W.S.

von DH1AKF W. (wolfgang_kiefer) Benutzerseite


Lesenswert?

W.S. schrieb:
> Gehe ich recht in der Annahme, daß du dir nen Bandpaß (300..2700 Hz oder
> so) programmieren willst?

Nein, es soll eine kleine FFT- Anwendung für einen Demodulator (PSK31 
und CW) werden. Das Spektrum, auf einem GLCD angezeigt, soll die exakte 
Frequenzeinstellung im o.g. Frequenzbereich ermöglichen.

Ich habe schon ein CMSIS- Beispiel versucht zu übersetzen, aber meine 
IDE - es ist der PSoC Creator 2.2 von Cypress - erzeugt ihrerseits 
"Firmware"- Quellcode, der mit CMSIS kollidiert.

So einfach, wie ich mir das vorgestellt habe, geht es leider nicht: Ich 
muss die ganzen Hardware- Eigenschaften meines Prozessors definieren, 
damit CMSIS
 vernünftig laufen kann.

Ein Bandpass 300..2700 wäre mit der IDE in 5 Minuten fertig ...

Danke für die Antwort, W.S. !

von DH1AKF W. (wolfgang_kiefer) Benutzerseite


Lesenswert?

DH1AKF K. schrieb:
> habe schon ein CMSIS- Beispiel versucht zu übersetzen, aber meine
> IDE - es ist der PSoC Creator 2.2 von Cypress - erzeugt ihrerseits
> "Firmware"- Quellcode, der mit CMSIS kollidiert.

Jetzt habe ich mal den Keil uVision5 installiert --> das 
Beispielprogramm von CMSIS (FFT32) ließ sich fehlerfrei compilieren...

...aber nicht als Target auf meinen PSoC5...

von Dieter Graef (Gast)


Lesenswert?

Es funktioniert mit dem PSoC Creator 3.1 nach dem Schema 
http://www.cypress.com/?app=forum&id=2492&rID=89612
Der Trick ist dabei die Mathebibliotheken nur als m einzubinden .
ich habs händisch bei Linker Custom Flags  -lm  gemacht

von DH1AKF W. (wolfgang_kiefer) Benutzerseite


Lesenswert?

Vielen Dank, Dieter für den guten Hinweis!

Nach etlichen Versuchen hat es nun auch bei mir geklappt mit dem 
fehlerfreien Compilieren. Ich habe erst einmal das mitgelieferte 
Beispiel (FFT 1024 Samples, Float32) ausprobiert.

Aber ein Flash- Verbrauch von ca. 230 kB ist nicht akzeptabel. Da bleibt 
ja kaum Platz für irgend etwas Anderes!

Vielleicht habe ich auch etwas falsch gemacht...

von Dieter Graef (Gast)


Lesenswert?

Respekt ich mußte an den bitreversal Assemblerquellen rumfummeln und 
komme auf Flash used: 248238 of 262144 bytes (94,7%).
Vermutlich  muß man die Datei arm_common_tables.c ausmisten da ist alles 
mit const auf Flash gesetzt.

von Jim M. (turboj)


Lesenswert?

Wie wurde kompiliert? Die DSP Lib ist riesig, für FFT braucht es nur ein 
oder zwei der C Files. Bei GCC muss u.U. -ffunction-sections und bei LD 
-gc-sections als Parameter übergeben werden, damit ungenutzte Funktionen 
auch wirklich rausfliegen.

von Dieter Graef (Gast)


Lesenswert?

Wenn ich alle Tabellen lösche die für die Demo nicht gebraucht werden 
komm ich auf
Flash used: 51030 of 262144 bytes (19,5%).
SRAM used: 14957 of 65536 bytes (22,8%). Stack: 2048 bytes. Heap: 128 
bytes.
--------------- Build Succeeded: 04/02/2015 23:25:41 ---------------
ich hab in der Datei  arm_const_structs.c alles auskommentiert außer
 const arm_cfft_instance_f32 arm_cfft_sR_f32_len1024 = {
  1024, twiddleCoef_1024, armBitRevIndexTable1024, 
ARMBITREVINDEXTABLE1024_TABLE_LENGTH
};
die Common tables aus dem Projekt entfernt
und dann anhand der fehlermeldungen geschaut was fehlt

von DH1AKF W. (wolfgang_kiefer) Benutzerseite


Angehängte Dateien:

Lesenswert?

Nach dem Auskommentieren überflüssiger Tabellen komme ich auf ähnliche 
Werte wie Du, Dieter.

Nun hat mich mal das Zeitverhalten interessiert.

Ergebnis: ca. 55 ms bei 1024 Punkten, Float 32. (Der Chip hat leider 
keine FPU).

Mit den Datenformaten q31 und q15 werde ich weitertesten.

: Bearbeitet durch User
von DH1AKF W. (wolfgang_kiefer) Benutzerseite


Angehängte Dateien:

Lesenswert?

Entschuldigung, so kommen keine Timer- Interrupts! Habe das Progrämmchen 
korrigiert.

Das Messergebnis : 23,5 ms je reine FFT (ohne die Magnitudenberechnung) 
bei 60 MHz Prozessortakt, 1024 komplexe Datenpunkte, 32 Bit Float

Mit PSoC5 (Cypress) getestet.

von DH1AKF W. (wolfgang_kiefer) Benutzerseite


Lesenswert?

Weitere Ergebnisse für die FFT- Berechnung, diesmal mit dem  Festkomma- 
Format q_15:

- Format q_15 ( 16 Bits)

- 1024 Punkte           11 ms
    512                  5 ms
    256                  2 ms
    128                  1 ms
     64                0.4 ms

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.