num_taps ist dabei die Anzahl der benötigten Speicherplatze (Taps) und gleichzeitig auch die Anzahl der Filterkoeffizienten im b[]-Array. Diese Daten werden von einem externen Programm vorgegeben.
Kannst Du denn nicht die nächst höhere 2er-Potenz für Deinen Ringpuffer verwenden (evtl. per switch ... case
aus einer größeren Auswahl), und dann einfach mit inbuf[++ix & x07F]
z.B. einen 128 großen Zähler zurücksetzen? Genau so ein UND macht nämlich der C-Compiler bei Modulo auf 2er-Potenzen meines Wissens nach.
Die hohe Anzahl der Schleifendurchläufe ist in diesem Fall durch das Messverfahren bedingt und weil ich die Anzahl der Messungen pro Frequenz absichtlich hochgedreht habe. Ich hatte Angst, das der Unterschied sonst zu gering ausfällt.
Der Unterscheid ist überhaupt nur bei kleinen Schleifen richtig spürbar wie z.B.:
1 2 | for (i = 127; i >= 0; --i &= 0x128) data[i] = fill; |
Das so aus dem Stegreif, hab's nicht getestet. Das Rückwärtszählen gegen 0 ist schneller, da ein Vergleich gegen 0 schneller ist, als gegen einen konkreten Wert.