Na flouty je potřeba transponovaná verze biquadu, aby se sčítaly vždy čísla o přibližně stejné velikosti a ztrácelo se co nejméně přesnosti. jak to dělá CMSIS nevím, nebyl zatím čas to zkoumat, zoptimalizovat si to umím sám (materiálů ke studiu je na internetu dostatek) a loop unrolling se učí v algoritmizacích první semestr na průměrné vysoké škole. (nás to sice neučili, ale zrovna na tohle přijde snad každý normální běloch )
Ostatní triky s pointery a SIMD instrukcemi jako šly použít třeba na FIR filtr bohužel u FPU a biquadu moc nehrozí. Problém toho CMSISu je to, že je příliš obecný a univerzální. Vhodným jednoúčelovým přepsáním a vyházením zbytečností (třeba podpory libovolné délky žebříčku) se to dá ještě dál zrychlovat. Ne o moc, ale i těch pár % se někdy hodí. Až se k tomu znovu dostanu, zkusím klidně porovnat výkonnost.
No nedalo mi to a podíval sem se, jak to tam dělají. Proběhl jsem to jen velmi rychle, ale nepůsobí to dojmem přílišné optimalizace, ne pro biquad, kde numStages%4 != 0 Přesně jak říkám, vyházením zbytečností se to dá zrychlit. Není mi jasný důvod, proč bys tam nechával cykly s podmínkou, když délka filtru (numStages=2) je jasně daná v době kompilace. Ale proti gustu...
Každopádně tohle není téma patřící do tohoto vlákna. Chceš-li to řešit, založ na to specializované vlákno. Ostatním se omlouvám, již to zde nebudu dále rozebírat. (naštěstí to ani momentálně nemám čas řešit, musel sem to sklidit do šuplíku a dělat jiné povinnosti).
EDIT: Při psaní vlastního FIRu jsem tenkrát vycházel z této aplikačky: http://www.arm.com/files/pdf/DSPConcept … tation.pdf
Upozorňuji, že skoro na každém slajdu je v kódu nějaká chyba. (matení nepřítele?) Vyluštit to, zbavit se chyb a dát to dohromady bylo asi týden práce.