IIR filterimplementation

Från ElektronikWikin
Hoppa till navigering Hoppa till sök

Detta handlar om ett låg- och högpassfilter för en tillämpning vilket resulterade i en enkel implementation som skrevs i C:

/*
 * This is a low pass filter
 *
 */
int applyLowPassFilter(int in, int *workarea, unsigned int cf)
{
	return *workarea=((cf-1)*(*workarea)+in)/cf;
}

/*
 * This is a high pass filter
 *
 */
int applyHighPassFilter(int in, int *workarea, unsigned int cf)
{
	return in-applyLowPassFilter(in,workarea,cf);
}

Därefter bestämmer man sig för en (corner frequency) och deklarerar en int som arbetsyta till filtret, sedan stoppar man in ett sample och få ut ett sample.

Ett problem här, hur bestämmer man cf?

Önskemålet var att enkelt göra profilering av filtret. Upp med Matlab...

Nedan ser vi frekvensrespons och rolloff för lågpass filtret:

Frekvensrespons
Y: 0 .. -160 dB
X: 10^-4 .. 10^0 relativ frekvens
Roll off
Y: -70 .. -115 dB
X: 10^-2 .. 10^-1

Det ser lite skakigt ut på vissa linjer, men detta är bara för att jag inte har haft hög nog upplösning på mina tester, linjerna är mjuka. Sharp X är alltså cf=X X-axeln är relativ sample rate, x-värde på 1 (10^0) är samma som ingående frekvens = sample frekvens/2, frekvenser över denna frekvensen (nyquistfrekvensen) gör att filtret blir rätt slumpartat och kasst. Vilket är rimligt.

Så hur skarpt är filtret? Enligt rolloff bilden är det cirka 45 dB / dekad, alltså runt ett andra ordningens filter.

En annan sak som är intressant att veta är hur cf förhåller sig till brytfrekvensen (-3 dB)

cf = 1/(brytfrekvens*5.6)

Som exempel, om vi vill ha brytfrekvens = 0.1*samplefrekvens då är cf = 1/(0.1*5.6) = 1,8 vilket är typ 2. Så då ska vi ha cf=2.

Högpassfiltret beter sig på detta vis:

Frekvensrespons högpassfiltret
Y: 0 .. -180 dB
X: 10^-4 .. 10^0 relativ frekvens

Precis tvärt om mot lågpassfiltret (LP), vilket är föga förvånande om man läser källkoden. Samma lutning fast ekvationen är för högpassfiltret (HP):

cf = 1/(brytfrekvens*1.67)

Ett trevligt beteende med dessa filter är att gain för HP + LP = 1 för alla frekvenser. Detta är bra i till exempel komplementärfilter.

Det finns säkert något fel här, så ser ni något galet så säg till.

Externa länkar