Hi Tobias,
> - Gibt es eine Alternative zur Divison bei einer Normierung?
Ja, shiften :-)
(Bin überrascht, dass das noch keiner genannt hat)
> - Hat jemand schon mal erfolgreich eine Divison (nicht nur Simulation
> sondern komplette Implementierung) realisiert?
Ja, das geht auch ohne fertigen Core nach Schema "Schriftlich dividieren
im Binärsystem". Aber da es zuviele Zyklen braucht, würde ich es in
diesem Fall nicht einsetzen.
> - Hatte jemand schon mal ähnliche Probleme oder einen passenden Ansatz ?
>
Ich hatte insbesondere bei IIR-Filtern bzw. FFTs das Problem, dass ein
Overflow stattfindet, aber die Genauigkeit in den unteren Bits nicht
verschütt gehen darf. Floating point will man aber u.U. (oder
insbesondere auf dem FPGA) während der Rechenprozedur vermeiden. Jetzt
kann man natürlich die ALU von vornherein auf die maximale Bitbreite
aufbohren, oder die Norm für jeden "bin" separat mitführen. D.h. wenn
Overflow stattfindet, hat man faktisch, in Pseudocode:
init: q[0..N] = [1, 1, 1, .., 1]
p[i] >>= 1 // Akkumulatorwert /= 2
q[i] <<= 1 // Norm * 2
D.h. du evaluierst immer in der Rechnung das Tupel (p[i],q[i]) (siehe
dazu: der gute alte Bresenham-Algo fürs Linienzeichnen). Lässt sich für
fast alle Berechnungen nutzen, wo Division nur stört. Und man hat immer
den binären Fehler im Griff - im Gegensatz zu float-Rechnungen.
Wie das im Detail für deine Berechnung anwendbar ist, musst Du halt
selber herauskriegen. Schwierig wird's dann, wenn Du innerhalb der
Berechnung Werte mit unterschiedlicher Norm verwursten musst, da wirds
dann mit den Rundungsalgorithmen recht "akademisch", besonders bei
IIR-Algos mit schlechter Stabilität (Quantisieriungseffekte bei Polen
nahe am Einheitskreis).
Viel Erfolg & Gruss,
- Strubi