C implementation av IIR lågpass respektive högpass filter

Elektronik- och mekanikrelaterad mjukvara/litteratur. (T.ex schema-CAD, simulering, böcker, manualer mm. OS-problem hör inte hit!)
victor_passe
Inlägg: 2436
Blev medlem: 28 januari 2007, 18:45:40
Ort: Kungsbacka

C implementation av IIR lågpass respektive högpass filter

Inlägg av victor_passe »

Hej, jag vet inte om denna tråden passar bäst i allmänt eller här.
Detta är både som dokumentation för mig själv och för att sprida kunskap till andra.

Så, vad handlar detta om?
Jag behövde ett lågpass och högpass filter till en grej så jag skrev en enkel implementation i C:

Kod: Markera allt

/*
 * 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);
}
Det man gör är att man bestämmer sig för ett cf(corner frequency) och deklarerar en int som arbets yta till filtret, sedan stoppar man in ett sample och få ut ett sample.

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

Jag ville helt enkelt göra profilering av filtret.
Upp med matlab...

Nedan ser vi frekvensrespons och rolloff för lågpass filtret
freq_responce.png
rolloff.png
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 ca 45dB / dekad, alltså runt ett andra ordningens filter

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

cf=1/(brytfrekvens*5.6)

Så för 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ögpass filtret beter sig på detta vis:
freq_responce_hp.png
Precis tvärt om mot LP filtret, föga förvånande om man kolla i koden...
Samma lutning
fast ekvationen är för 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 tex komplementär filter.

Jag har säkert gjort något fel så ser ni något galet så säg till.
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
blueint
Inlägg: 23238
Blev medlem: 4 juli 2006, 19:26:11
Kontakt:

Re: C implementation av IIR lågpass respektive högpass filte

Inlägg av blueint »

Tyckte det vart intressant så har gjort en wikisida av trådens innehåll:
EF-wiki: IIR filterimplementation

Uppföljare med FFT? ;)
Användarvisningsbild
baron3d
EF Sponsor
Inlägg: 1339
Blev medlem: 1 oktober 2005, 23:58:43
Ort: Torestorp

Re: C implementation av IIR lågpass respektive högpass filte

Inlägg av baron3d »

Jätte bra! Mycket användbart. Filter ingår allt som oftast i mina program.
Skriv svar