Guten Morgen,
ich versuche gerade einen Audio-Dynamic-Compressor auf einen Cortex M4
(STM32F429) zu portieren, den ich mal von Lisp (Chris Dynamic Compressor
als Audacity-Plugin) nach C und dann nach VHDL portiert hatte.
Für den Port nach VHDL hatte ich alles auf Festpunktarithmetik
umgestellt und Funktionen wie die Umrechnung von linear->db, db->linear,
1/x und sqrt(x) so implementiert, dass ich in VHDL keine
Fließkomma-Arithmetik benötige.
Nun hab ich festgestellt, dass die Cortex M4 eine FPU eingebaut haben
und der Compiler float gut nutzen kann ...
Die meisten Verfahren sind iterativ und brauchen deshalb vermutlich mehr
CPU-Zyklen, als wenn die FPU direkt verwendet werden würde (?).
Zum Vergleich:
1 | float Lin2Db::conv(int data) {
|
2 | int j=15;
|
3 | int bm=0x8000;
|
4 |
|
5 | while (!(data & bm) && bm)
|
6 | {
|
7 | j--;
|
8 | bm>>=1;
|
9 | }
|
10 | // zero input = -1000.0f db output
|
11 | if (!bm)
|
12 | return -1000.0f;
|
13 | int e = max(j-7,0);
|
14 | int idx = data >> e;
|
15 |
|
16 | return m_lutman->data[idx]+m_lutexp->data[e]-m_k2;
|
17 | }
|
wäre das Gleiche wie:
1 | float ret=(20.0f*log((float)data/32767.0f)/log(10.0f));
|
Hat jemand eine Idee, wie performant ln(x), 1/x, e(x) und sqrt(x) auf
einem Cortex mit FPU arbeitet verglichen mit Implementierungen, die nur
Festpunkt-Arithmetik benutzen?
Viele Grüße,
Mampf