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);
}
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 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: 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.