högre ordning digitala lågpassfilter...

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

högre ordning digitala lågpassfilter...

Inlägg av jesse »

Jag skapade ju en gång denna tråden om ett digitalt RC-filter: Lågpassfilter i mjukvara!

Men det blir väl bara ett första ordningens filter, oavsett antal "filter shifts"?
Nu funderar jag på hur man modifierar koden så att man på enklast möjliga sätt kan efterlikna (ungefär) effekten av ett andra, tredje eller fjärde ordningens lp-filter....

Koden till lågpassfiltret i länken ovan ser ut så här: (örbättrad av bearing):

Kod: Markera allt

//FILTER_SHIFTS = log2(RC_constant * calls_per_second)
#define FILTER_SHIFTS 10
uint16_t low_pass_filter(uint16_t input)
{
  static uint16_t output;
  static uint32_t intermediate;

  intermediate -= output;
  intermediate += input;

  output = intermediate >> FILTER_SHIFTS;

  return output;
}
Brytfrekvensen kan beräknas så här:
//FILTER_SHIFTS = ln(RC_constant * calls_per_second) / ln(2)
// f=1/(2*pi*RC)
kodar-holger
EF Sponsor
Inlägg: 966
Blev medlem: 26 maj 2014, 12:54:35
Ort: Karlskoga

Re: högre ordning digitala lågpassfilter...

Inlägg av kodar-holger »

Jag har använt den här ett par gånger eftersom den här matemtiken är för länge sen jag förstod.

http://www-users.cs.york.ac.uk/~fisher/ ... /trad.html

Genererar även källkod.
SvenW
Inlägg: 1156
Blev medlem: 24 april 2007, 16:23:10
Ort: Göteborg

Re: högre ordning digitala lågpassfilter...

Inlägg av SvenW »

Så finns , om man vill ladda ner program för IIR filter, t.ex.
http://wiki.octave.org/Signal_package
Men jesse är kanske ute efter enkelt formulrerad c-kod i stil med hans fina exempel ovan ??
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: högre ordning digitala lågpassfilter...

Inlägg av jesse »

Jag kanske var otydlig, men frågan var alltså hur man skapar filtret med C-kod. jag ska filtrera mätdata i en AVR.
SvenW
Inlägg: 1156
Blev medlem: 24 april 2007, 16:23:10
Ort: Göteborg

Re: högre ordning digitala lågpassfilter...

Inlägg av SvenW »

Man kan nog lägga till accumulatorvariabler och termer av typen:

k2 * intermediate >> FILTER_SHIFTS;

och sedan leta fram k2, k3 ... mha programmmen ovan.
Sedan gäller det att bedöma hur mycket man kan approximera och hur mycke processorkraft och minne man har tillgång till.
Det blir t.ex. snart overflow i en 16-bitars variabel. En signalprocessor med flyttal gör det hela lite lättare.
Nerre
Inlägg: 27182
Blev medlem: 19 maj 2008, 07:51:04
Ort: Upplands väsby

Re: högre ordning digitala lågpassfilter...

Inlägg av Nerre »

http://www-users.cs.york.ac.uk/~fisher/mkfilter ger ju C-kod och du kan välja ordning själv?
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: högre ordning digitala lågpassfilter...

Inlägg av jesse »

Javisst. Det gör den ju! Jag förväxlade den med en sida där man bara får fram grafer, men inte själva koden.
Precis vad jag ville ha! :P

Tack Holger , SvenW och Nerre!

Jag återkommer med resultatet om jag lyckas förenkla koden (t.ex. förenkla den genererade koden och ev. använda heltal och kanske även kunna undvika division om man kan göra om konstanterna till bråktal och approximera nämnaren till jämn tvåpotens.
kodar-holger
EF Sponsor
Inlägg: 966
Blev medlem: 26 maj 2014, 12:54:35
Ort: Karlskoga

Re: högre ordning digitala lågpassfilter...

Inlägg av kodar-holger »

Bläddrade vidare i mina projekt och hittade ett där jag använt den här

http://t-filter.appspot.com/fir/index.html

Den kan också generera källkod.

Men här kan man ange sina filterdämpningar på ett annat sätt och man kan välja att få ut konstanterna direkt i heltal med valfritt antal bitar om man inte orkar räkna själv.
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: högre ordning digitala lågpassfilter...

Inlägg av jesse »

grymt bra :bravo:
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: högre ordning digitala lågpassfilter...

Inlägg av jesse »

Kodar-Holger, jag vet inte vad som är fel här, men jag försöker göra ett Butterworthfilter, 2:a graden, 400 Hz sampel, och 5 Hz gränsfrekvens.

Jag får denna kod på din (?) sida:

Kod: Markera allt

/* Digital filter designed by mkfilter/mkshape/gencode   A.J. Fisher
   Command line: /www/usr/fisher/helpers/mkfilter -Bu -Lp -o 2 -a 1.2500000000e-02 0.0000000000e+00 -l */

#define NZEROS 2
#define NPOLES 2
#define GAIN   6.847831502e+02

static float xv[NZEROS+1], yv[NPOLES+1];

static void filterloop()
  { for (;;)
      { xv[0] = xv[1]; xv[1] = xv[2]; 
        xv[2] = next_input_value / GAIN;
        yv[0] = yv[1]; yv[1] = yv[2]; 
        yv[2] =   (xv[0] + xv[2]) + 2 * xv[1]
                     + ( -0.8948743446 * yv[0]) + (  1.8890330794 * yv[1]);
        next_output_value = yv[2];
      }
  }
Men jag får en DC dämpning på ca 4,1 dB... jag måste multiplicera utdata med 1,59888 för att få DC gain = 1,000
Kan det vara nåt fel i siffrorna eller har jag tolkat fel hur jag ska göra? (orange linje nedan visar BW-filtret. når aldrig 0 dB.
bwfilter5.gif
Nu är ju just GAIN väldigt enkelt att justera - bara att multiplicera utdata med en konstant. men frågan är ju varför det blir fel från början? Frågan uppstår ju om de andra parametrarna stämmer. En annan fundering jag har om detta filter , eftersom jag har noll koll på hur det fungerar egentligen, är om det är så noga egentligen med vilka parametrar man sätter. Om man nöjer sig med en UNGEFÄRLIG gränsfrekvens och en UNGEFÄRLIG dämpning per dekad, går det att höfta till ett par värden eller riskerar man nån slags "obalans" nånstans så att filtret fuckar ur...

Jag antar att det inte finns något enkelt sätt att beräkna fasförskjutningen vid en viss frekvens (f = 0,00833 Hz t.ex)? En så låg frekvens går ju inte att se på grafen.
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: högre ordning digitala lågpassfilter...

Inlägg av jesse »

Hittade felet... ett feaktigt tecken hade smugit sig in i koden när jag skrev av den. :oops:
Nu är DC-gain 1.0000 som det bör vara och filtret fungerar riktigt.

Fast då kom nästa motgång. Skulle testa med annan gränsfrekvens, 1 Hz, men det filtret tokoscillerar om man ger det en konstant DC-signal in! Parametrarna på den är 1.63917823e+04 1.00000000e+00 2.00000000e+00 1.00000000e+00 -9.78030508e-01 1.97778648e+00 -1.00000000e+00

:evil:
kodar-holger
EF Sponsor
Inlägg: 966
Blev medlem: 26 maj 2014, 12:54:35
Ort: Karlskoga

Re: högre ordning digitala lågpassfilter...

Inlägg av kodar-holger »

Det är inte min sida, och jag har mycket dålig koll på digitala filter. När z-transformerna dök upp i reglertekniken i 4an på gymnasiet hängde inte min lilla geleklump med längre. Det har dessutom gått 26 år sen dess...

Jag har dock noterat att den ibland inte ger 1.0 i gain trots att man önskar det. Vill minnas att jag skruvade på inparametrarna tills det funkade.

Ett LP FIR-filter borde inte kunna oscillera. Det finns ju ingen återkoppling, så det låter märkligt. Det är något med att man skall kunna summera filterkonstanterna och få något men jag minns inte. 1 antagligen för ett LP-filter. 0 antagligen för ett HP. (men det där borde jag nog inte skrivit för det är antagligen fel.)

Vad jag däremot vet är att ju högre ordning det är på filtret desto större problem får man med numerisk instabilitet. Flyttalsfilter fungerar säkert till ganska hög grad, men heltalsfilter får säkert konstig karakteristik. Har sett program som klarar att räkna ut vad man verkligen får givet numerisk upplösning, men kanske inte online.
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: högre ordning digitala lågpassfilter...

Inlägg av jesse »

Verkar som att just 1Hz går åt skogen. med f=2Hz fungerar filtret fint igen. Så man får nog vara ganska försiktig och kolla noga hur filtret reagerar innan man bara skriver in parametrarna och kör.

Nu har jag kört filtret i Open Office Calc. Jag ska försöka överföra det till 32-bitars heltal och se hur det går.
kodar-holger
EF Sponsor
Inlägg: 966
Blev medlem: 26 maj 2014, 12:54:35
Ort: Karlskoga

Re: högre ordning digitala lågpassfilter...

Inlägg av kodar-holger »

Du har långt mellan samplingsfrekvens och brytfrekvens. Vill minnas att det också kan ge problem. Vad händer om du väljer 100 eller 200 istället för 400 samples/sek?
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: högre ordning digitala lågpassfilter...

Inlägg av jesse »

Jag trodde det var tvärt om, alltså att det får inte vara för nära mellan samplingsfrekvens och brytfrekvens. Jag hade först 100 sps, men ökade till 400 sps för att kunna filtrera effektivt. Min tanke var att det blev för lite data om samplingsfrekvensen var för låg, men jag kanske tänker helt fel?

EDIT: Nåja... nu ska jag ändå inte ha 1 Hz brytfrekvens (den som strulade/oscillerade), det blir för stor fasförskjutning i låga frekvenser (måste vara under 0.5 grader vid 0,01 Hz). Så jag tror 2 Hz blir perfekt, och det filtret fungerar ju perfekt. Ska testa detta även med 100 sps, så kanske jag slipper sampla så ofta.
Skriv svar