STM32F4 - konstrukce banky filtrů

Pokud jde jen o úpravu kmitočtové charakteristiky, máš několik možností k úvaze:

FFT, FIR, případně vhodně řešené filtry IIR.

FFT: Zjistit si jeho potřebnou složitost. Tzn, jaké potřebuješ kmitočtové rozlišení. Spolu se vzorkovacím kmitočtem ti z toho vyjde potřebná délka. Nezapomínat i na to, že je třeba následně provést inverzní FFT nebo počítat výkon jednotlivých složek zvlášť. Nezapomenout i na potřebný překryv oken asi 25% délky FFT, jinak budeš mít v signálu mezery. (podle mě toto není vhodná metoda, bude velmi výpočetně náročná a výsledek nejistý).

FIR: Bude potřeba poměrně dlouhý. Čím vyšší vzorkovací kmitočet a větší potřebné rozlišení, tím bude delší a horší přesnost výpočtu.
Při užití 16bitových dat a koeficientů s 32bitovým akumulátorem je však výpočet s DSP instrukcemi velmi rychlý, pod 2 cykly na 1 odbočku FIRu (reálně asi 1.8 clocku na odbočku). Problém je, že na audio (v měřícím přístroji) se s 16b FIRem chodit nedá. Takže toto bych také vynechal, neboť FIRy s vyšším rozlišením koeficientů (32b) a akumulátoru (64b) budou dost pomalé. (jelikož cortex M4 na to nemá vhodné SIMD instrukce) FIR se používá tehdy, je-li zapotřebí lineární fáze. (digitální zpracování v komunikacích, SDR rádio). FIR filtr se dá udělat s konstantní fází, nebo lineárním sklonem fáze.

Soustava vhodných IIR filtrů je podle mě (jediný?) směr, kam se vydat. Vzhledem k tomu, že hlukoměru je docela buřt nějaká fázová nelinearita (zpoždění signálu nemá vliv na měřený akustický výkon), tak je to skvělý způsob řešení. Potřebnou přenosovou charakteristiku si namodeluj v komplexní s rovině (laplaceova transformace) a výsledné koeficienty použij do IIR filtru. Osobně doporučuji využít filtrů typu biquad, jelikož jsou jednoduché výpočetně a jsou přímým ekvivalentem filtrů analogových s operačními zesilovači. (a jsou stabilnější než dlouhý IIR) jsi-li tedy schopný si namodelovat vhodnou přenosovou charku užitím několika analogových filtrů jako lowpass, highpaass, peak, notch, shelf,… každý z těchto typů filtru lze realizovat filtrem typu biquad. Dejme tomu, že budeš nakonec potřebovat nějakých 10 biquadů typu peak/notch (10pásmový ekvalizér). To je ve výsledku akorát 10 * 5 MAC instrukcí a 10*4 přesuny dat, pokud dobře počítám. Ten procesor se u toho na 168MHz bude vyloženě nudit.

Avšak i u biquad filtrů je háček. Jelikož jsou to IIR filtry, zpětnovazební, nastávají problémy se stabilitou v případě, že se číselné velikosti pólů blíží jednotkové kružnici (klesá přesnost výpočtu, roste nestabilita). To se děje právě při nízkých kmitočtech, pak je třeba užít jiného typu filtru, např state variable filter. Opět poměrně jednoduchá záležitost a přímý ekvivalent analogového protějšku. Výhodou je to, že potřebuje ke své činnosti pouze 2 koeficienty F a Q, které lze velmi snadno vypočítat za běhu programu. (to jde i pro biquad filtry). Ve výpočtech koeficientů se nepoužívá nic hnusnějšího, než jeden sinus nebo tangens. Obě dvě tyhle věci jsou na ARMu s FPU rychlé i při použití knihovních funkcí z math.h (tabulky a aproximace).

Pro IIR (biquad) filtry a audio samozřejmě 32 bitů výpočty, float velkou výhodou (nebudou problémy s přetejkáním). O biquad filtrech se toho dá najít spousta na webu. Zkus se na to podívat.

Pro začátek by se ti mohlo hodit tady tohle: earlevel.com/

Omlouvám se za dlouhý příspěvek, snad ti k něčemu bude.

PS: Nejsem odborník na DSP, jen se o to trochu zajímám, zatím jen začátečnicky…

PPS: Jen mě děsí, že nahoře píšeš “použil jsem 10 IIR filtrů a ono to nestíhá”. Cos tam proboha vyrobil? Jaký řád IIR? jakým způsobem počítaný? 168MHz CPU, 48kHz vzorkování… to máš 3500 dostupných klokanů na vzorek. Tzn při 10 filtrech to znamená 350 cyklů na filtr na vzorek. I kdybych to napsal jako prase, tak to 10 biquadů stihne :open_mouth:

Škoda, že už se asi nedozvíme, jak to dotyčný vyřešil. Nechť aspoň mají inspiraci ostatní zájemci o filtry.