Tyda konstiga matematiska scheman

Elektronikrelaterade (på komponentnivå) frågor och funderingar.
Användarvisningsbild
chille
Inlägg: 2469
Blev medlem: 25 juni 2003, 20:54:41
Ort: Stockholm
Kontakt:

Tyda konstiga matematiska scheman

Inlägg av chille »

Som ni kanske vet så håller jag på pilla DSP en del. Men nu börjar det bli dags att lära sig lite mer om själva matematiken/formlerna/algoritmerna osv och inte bara processorn+programmeringen.

Det finns en typ av schema som är väldigt vanligt när det gäller att beskriva matematiska formler grafiskt. Dock hittar jag ingenting om hur man tyder dem, vad de kallas, om det finns någon standard osv.

Här är ett exempel:
Bild

Borde inte det bli?

Kod: Markera allt

hp = in - bp * q - lp
bp = bp + hp * f
lp = lp + bp * f
(Z^-1 är en fördröjning på en sample vilket uppstår av sig själv när man sparar datan i variabler)

Det konstiga är att det _blir_, så någonting gör jag ju fel:

Kod: Markera allt

hp = in + bp * q - lp
bp = bp - hp * f
lp = lp - bp * f
Sen finns det även lite andra varianter som jag inte kollat så noga på än:
Bild
Här såg det annorlunda ut. Kuben med ett T är troligtvis en fördröjning på en sample och triangeln är en koefficient. Men varför blev det annorlunda här helt plötsligt?

Jag skulle kunna tänka mig att allt det här står i "DSP filter cookbook" som jag funderar på att köpa. Kanske ska skippa google och köpa den direkt? Synd bara att man har lite tight med pengar just nu :)
ClasseMan
Inlägg: 176
Blev medlem: 9 juli 2004, 15:21:02
Ort: Karlskrona
Kontakt:

Inlägg av ClasseMan »

Till att börja med tycker jag att du skall sätta in tidsindex i dina ekvationer tex hp(n) = in(n) - bp(n-1)*q - lp(n).

En bok som beskriver ämnet är tex Digital signal processing av Proakis och Manolakis men det är en rätt teoretisk bok och tar väl inte upp hur man implementera det i en DSP direkt
Senast redigerad av ClasseMan 14 november 2005, 16:49:07, redigerad totalt 1 gång.
evert2
Inlägg: 2182
Blev medlem: 18 april 2004, 22:47:56
Ort: Jönköping

Inlägg av evert2 »

chille

hp = in + bp * q - lp
bp = bp - hp * f
lp = lp - bp * f

Skall man inte ha med z^-1 i beräkningarna? Desutom om du kollar på pilarna som kommer till "+" vid "ingången" ....alltså pilarna som kommer ifrån z^-1 och hp är ju märkta med minustecken

hp = in + bp * q - lp
bp = bp*z^-1 - hp * f
lp = lp - bp * f

om jag har fel så får jag skylla på att det vara ett par år sedan jag läste z-transformering :)
gille
Inlägg: 69
Blev medlem: 28 november 2004, 18:06:09
Ort: Stockholm
Kontakt:

Inlägg av gille »

Ditt första filter är ett IIR-filter, de undre är FIR, dvs olika filtertyper.

Kommentaren i din anteckning är inte riktigt rätt.
FIR är icke återkopplat.
IIR är återkopplat men kan realiseras som ett icke återkopplat filter med oändligt många komponenter. Eller så kan man även minsta kvadratskatta FIR från IIR.

Direktformerna är ekvivalenta bara att man placerar fördröjningarna på olika ställen (och då har andra konstanter) men annars är det riktigt "trianglen" är en förstärkare och "lådan" en fördröjning.

Om jag inte minns helt fel, dig sig var ju enda tentan jag inte tog. Du verkar sen ha räknat ordentligt fel eller missförstått återkopplingarna. men z^-1 är "bakåt" ett tidssteg dvs en fördröjning. Det är Z-transformerat, hur man ska tyda dom kan jag inte förklara annat än att du ställer upp ett matematiskt samband.

Vad har du för utbildningsbakgrund? Gymnasie, högskola?
Megge
Inlägg: 33
Blev medlem: 2 oktober 2005, 19:36:27
Ort: Linköping

Inlägg av Megge »

gille skrev: FIR är icke återkopplat.
FIR-filter kan vara både återkopplad eller icke återkopplad medan IIR-filter måste ha återkoppling.

FIR betyder Finite Impulse Response och innebär att om du kopplar in en insignal och sedan kopplar ifrån den så måste utsignalen att bli noll efter att en viss tid har passerat. Hur lång tid det tar beror på hur långt filtret är.

IIR betyder Infinite Ipulse Response och innebär att utsignalen inte _måste_ bli noll efter en viss tid (men kan natruligtivs bli det).

IIR-filter kan vara svåra att designa eftersom återkopplingen kan ge självsvängningar och andra otrevligheter.

Lådorna med T i är samma sak som Z^-1 och innebär som nämnts en tidsfördröjning. Tidsfördröjningens storlekt är lika med tiden det tar från att ett värde kommer in på ingången(till kopplingen) till dess att ett nytt värde kommer in (samplingshastigheten).

Ett enkelt lågpassfilter kan skapas såhär:

Bild

Det detta gör är att beräkna medelvärdet av det inkommna värdet och det förra värdet som kom in. Detta skickas sedan ut.


Koden för detta kan se ut såhär:

Kod: Markera allt

while(true) {
     x_n = input(); 

     next_x_n-1 = x_n;
     y = (x_n + x_n-1)*0.5;
     
     x_n-1 = next_x_n-1;
}

Först tas ett nytt värde in, nya värden på register beräknas (baserat på de gamla), utsignalen beräknas och sist så updateras alla register.
Tidsfördröjningen (T, Z^-1) är tiden för ett varv i loopen.
Användarvisningsbild
chille
Inlägg: 2469
Blev medlem: 25 juni 2003, 20:54:41
Ort: Stockholm
Kontakt:

Inlägg av chille »

ClasseMan: Tidsindex i mina ekvationer? Det där var menar att vara optimerad C-kod utan massa klumpiga arrayer :-)

evert2: Jo att det var minuttecken tog jag väl hänsyn till, eller gjorde jag något fel? Skrev ihop skiten lite fort när jag postade så det skulle ju kunna vara så att tryckfelsnisse stoppade in något slarvfel :)

gille: Nej, det första filtret är ett state variable. Min utbildningsgrund? Jag kan programmera och har läst matte A & B... typ :)

Sen kan det tilläggas att bilderna hittade jag på google. Så om kommentererna inte är rätt skiter jag i. Jag skulle bara ha en bild som visade att folk gjorde olika med bland annat tidsfördröjningar.

Och ja, andra koden jag paste:ade _är_ rätt, släng in den i en loop i ett program så får ni se att tidsfördröjningarna är helt rätt, det är jag säker på tills någon kan bevisa motsatsen. 8)
Användarvisningsbild
exile
EF Sponsor
Inlägg: 496
Blev medlem: 21 oktober 2005, 23:32:07

Inlägg av exile »

Det borde bli
hp = in + bp * q - lp
lp = lp - bp * f
bp = bp - hp * f
(bytt plats på de två nedersta raderna)

Nu jag ingen hördare på digital singal behandling men "FIR-filter kan vara både återkopplad eller icke återkopplad" låter grymt fel i mina öron...

Annars ett filter som är ganska kanska lätt implemtera är ett allpass och med hjälp av det kan man ganska enkelt göra LP eller HP.

Kod: Markera allt

Allpass
a_new       = in - c * a_old
allpass_out = a_old + a_new * c
a_old       = a_new

Lågpass
LP_out = (allpass_out + in) * 0.5

Högpass
HP_out = (allpass_out - in) * 0.5
och man kan lätt räkna ut brytfrekvensen

c = (tan(pi*fc/fs)-1) / (tan(pi*fc/fs)+1)
fc är brytfrekvensen
fs är samplings frekvensen
:)
Användarvisningsbild
chille
Inlägg: 2469
Blev medlem: 25 juni 2003, 20:54:41
Ort: Stockholm
Kontakt:

Inlägg av chille »

Men jag förstår inte hur det blir minus på lp/bp. Ska inte symbolen (+) addera två tal?

På "ingången" borde det ju bli tre adderade tal varav två är inverterade
lp = in + (-lp) + (-q*bp) = in -lp -q*bp
Megge
Inlägg: 33
Blev medlem: 2 oktober 2005, 19:36:27
Ort: Linköping

Inlägg av Megge »

Jo, jag håller med dig angående tecknen.
exile skrev: Nu jag ingen hördare på digital singal behandling men "FIR-filter kan vara både återkopplad eller icke återkopplad" låter grymt fel i mina öron...
Jag förstår att det kan låta galet, FIR-filter är normalt inte återkopplade och man får lätt uppfattningen att om ett filter är återkopplat så är det ett IIR-filter. Jag är inte säker på att alla FIR-filter kan göras återkopplade, men det finns iaf FIR-filter som har återkoppling.

Se tex. "Example 1" på http://cnx.rice.edu/content/m11918/latest/.
Användarvisningsbild
RDX*
EF Sponsor
Inlägg: 1652
Blev medlem: 28 maj 2003, 22:52:04
Ort: Skåne - Lund

Inlägg av RDX* »

Exempel 1 är ett IIR-filer. Definitionen för ett FIR-filter är att det har ändligt stegsvar. Dvs. inga poler eller poler i origo vilket innebär att utsignalen (y(n)) får inte bero på tidigare utsignaler (y(n-m)).
Sen går det givetviss att approximera ett FIR-filter med ett IIR-filer och tvärt om, vilket dom vill visa i Ex1. Genom att göra om FIR-filtret till ett IIR-filter så sparar dom M-3 adderare.
Användarvisningsbild
RDX*
EF Sponsor
Inlägg: 1652
Blev medlem: 28 maj 2003, 22:52:04
Ort: Skåne - Lund

Inlägg av RDX* »

Det är viktigt att ha med tidsförskjutningarna. tex blir

lp(n)=lp(n-1) + f*bp(n-1) :1

bp(n)=bp(n-1)+f*(-q*bp(n-1) + (-lp(n)) + in(n)) :2
bp(n-1)=bp(n) - f*(-q*bp(n-1) + (-lp(n)) + in(n)) :3

1,3 ger =>

lp(n)=lp(n-1) + f*(bp(n) - f*(-q*bp(n-1) + (-lp(n)) + in(n)))

Jag har ignorerat hp återkopplingen eftersom riktningen inte är utsatt.
Användarvisningsbild
exile
EF Sponsor
Inlägg: 496
Blev medlem: 21 oktober 2005, 23:32:07

Inlägg av exile »

chille skrev:Men jag förstår inte hur det blir minus på lp/bp. Ska inte symbolen (+) addera två tal?

På "ingången" borde det ju bli tre adderade tal varav två är inverterade
lp = in + (-lp) + (-q*bp) = in -lp -q*bp
Helt rätt, teken fel av mej. Utan felet är att du räknar ut ett nytt BP inan du räknar ut LP
så det borde bli:
hp_new = in - bp_old*q - lp_old
bp_new = bp_old + hp_new * f
lp_new = lp_old + bp_old * f

bp_old = bp_new
lp_old = lp_new

om vi nu skriver om dem som du vill ha de så blir det:
hp_new = in - bp_old*q - lp_old
-efter som du använder samma variabel så blir det så här:
bp_new = bp_old + hp_new * f
bp_old = bp_new
-och lika här
lp_new = lp_old + bp_old * f
lp_old = lp_new

Om vi för kortar bort bp_old = bp_new så får vi
hp_new = in - bp_old*q - lp_old
bp_new = bp_old + hp_new * f
lp_new = lp_old + bp_new * f <- fel

vilket är fel, men bytter du plats på de två sista raderna såblir det rätt
delvis

hp = in - bp * q - lp
lp = lp + bp * f
bp = bp + hp * f

Är du med på hur jag tänker? (jag är inte så bra på att förklara...)
Användarvisningsbild
chille
Inlägg: 2469
Blev medlem: 25 juni 2003, 20:54:41
Ort: Stockholm
Kontakt:

Inlägg av chille »

Jo jag förstår. Det jag inte förstår är hur vissa personer får det att bli andra tecken. Det konstiga är att andra koden jag paste:ade är den jag kör med och den funkar utmärkt, även fast den verkar vara fel :-)

Och den koden fick jag dessutom av en annan snubbe som pillar DSP och sa att den skulle vara rätt.
Skriv svar