Sida 2 av 2
Re: Implementera IIR coupled form BiQuads
Postat: 19 december 2012, 15:27:20
av superx
Gissar att du menar:
Kod: Markera allt
2
1 + 2z + z
--------------------
2
0.9024 - 1.8997z + z
Re: Implementera IIR coupled form BiQuads
Postat: 19 december 2012, 15:29:26
av Korken
Precis, på formen:
B = b0 b1 b2
A = a0 a1 a2
EDIT:
Det jag vill påpeka är att koefficienterna ser bra ut, utan det är gainet efter filtret som går utanför gränserna för floating point efter ett tag.
Re: Implementera IIR coupled form BiQuads
Postat: 19 december 2012, 17:22:49
av superx
Aha, då tror jag att jag fattar. Jag antar att dessa fyra filter ligger i serie, för att tillsammans bilda att 8-pols-filter. Korrekt?
Du kan ju alltid distribuera förstärkningen över de fyra filtren. Alltså, gångra varje filter med g^(1/4). Då blir det mer rimlig storleksordning på varje filter. Observera dock att det fortfarande kan klippa internt (och på utgången) i filtret även om frekvenssvaret aldrig letar sig över 1.0.
Hur fungerar fixed point-matte på STM32? Stödjer kompilatorn någon fractional-typ, eller gångrar du och skiftar ner manuellt?
Re: Implementera IIR coupled form BiQuads
Postat: 19 december 2012, 20:43:26
av Korken
Aha, då tror jag att jag fattar. Jag antar att dessa fyra filter ligger i serie, för att tillsammans bilda att 8-pols-filter. Korrekt?
Precis så ligger det till!
Du kan ju alltid distribuera förstärkningen över de fyra filtren. Alltså, gångra varje filter med g^(1/4). Då blir det mer rimlig storleksordning på varje filter. Observera dock att det fortfarande kan klippa internt (och på utgången) i filtret även om frekvenssvaret aldrig letar sig över 1.0.
Smart! De har jag inte tänkt på förut.
Dock om det går över 1.0 internt gör inget, då jag kör floating point. Om jag dock går över till fixed point så får man tänka på det.
Hur fungerar fixed point-matte på STM32? Stödjer kompilatorn någon fractional-typ, eller gångrar du och skiftar ner manuellt?
Den stödjer inte fixed point, man får skifta manuellt.
Kör man 1Q15 eller 1Q31 så blir det ju automatiskt om man tar den översta delen av svaret, men annars så blir det att skifta för att få korrekt format.
Det som slog mig nu är att jag behöver hitta filter topologier som kan användas i serie istället för parallell.
Tex istället för bandpass skulle jag behöva ett allpass i parallell med ett bandpass, men då kan det bli fel med grupptiden igen.
Vet något vad ett sådant filter heter? Jag har kollat på shelving filter och peak filter, men peak filtret tycks inte göra det jag vill att det ska göra (har inte ett band som förstärks utan en viss frekvens).
Re: Implementera IIR coupled form BiQuads
Postat: 19 december 2012, 21:26:22
av superx
Ok, så du kör floating-point. Men då orsakar väl inte förstärkningsfaktorn något problem, även om en är superliten? Med flyttal så är ju dynamiken nästan oändligt stor.
Jag fattar inte vad du menar med all-pass-filtren i sammanhanget. Men du kanske kan använda två shelving-filter? Ett som bryter upp där bandet börjar, och ett som bryter ned där det slutar. Och så ändrar du gainen på båda samtidigt.
Re: Implementera IIR coupled form BiQuads
Postat: 20 december 2012, 12:15:45
av Korken
Problemet är att förstärkningsfaktorn börjar närma sig slutet av FPs dynamiska område.
FP har ett dynamiskt område på +/-1e38 och börjar man närma sig det så tapar man precision på de lägsta bitarna.
Dock så kan man simulera detta med Matlab, ska testa det du sa om att dela upp gain faktorn över varje BiQuad som du sa, detta borde fixa problemet.
Det jag sa om bandpass och allpass, om man sätter dessa i parallell så borde man få denna överföringsfunktion:
filter.png
Re: Implementera IIR coupled form BiQuads
Postat: 20 december 2012, 14:27:33
av superx
1e-38 jämfört med gainen på 1.9e-13 är ju fortfarande inget problem iof. Du kommer fortfarande att ha full precision i mantissan. Eller tror du att några interna tillstånd eller beräkningar blir för små?
Jag tror som sagt på två shelving-filter i kaskad för att åstadkomma det du vill.