Maradjunk egyelőre valósban. (Ami pszeudo negatív frekvenciákkal könnyen megtehető.)
Mi történik, ha egymáshoz nagyon közel akarok tenni két illeszkedési pontot?
Vagyis, amikor nagyon meredek lenne a szűrő...
Valami drasztikus dolog történt. Valahogy nem lehet "sima" függvényekkel "hirtelen" változást elérni, mert máshol megbosszulja. (Ennek elkerülésére megpróbálhatunk egyre több és több illeszkedési pontot megadni. Nem fog menni?)
Biztos okos emberek voltak, akik az ismert ablakfüggvényeket kitalálták. Kíváncsi voltam, hogy "alapműveletekkel" mit lehet kihozni a témából. (Jó, jó. Az összeadás sem alapművelet, mert 1-el növelésre visszavezethető.)
Az ablakfüggvények meghatározzák az ilesztési pontok elrendezését.
Ezzel szemben a hatványmátrix lehetővé teszi ezen illesztési pontok tologatását.
Ez nagyobb szabadságot biztosít a tervezésnél.
Mottó: biztos okos ember volt, aki a kőbaltát feltalálta. Jobbat kitalálni nem is érdemes...
Mostanában sokkal könnyebb szűrést megvalósítani, mert már a kisebb uC-kben is van floating pont egység, így a lebegőpontos műveletek nem elfogadhatatlanul lassúbbak.
Régebben rengeteget kellett tipródnom az integer számolásokkal. Persze nem a kész c aritmetika könyvtárral, mert az úgy lassú lenne, mivel a bit szélesség nem igazodik az éppen szükséges minimumhoz. Hozzá kellett igazítani a feladathoz a számításokat. Mekkora a részeredmények legnagyobb lehetséges bit szélessége, nehogy túlcsorduljon valahol. Mikor és mennyivel lehet osztani, hogy ne okozzon túl nagy pontatlanságot. Lehet-e úgy összerakni, hogy minél több osztás 2 hatványával történjen (mert az shifttel is megy, sokkal gyorsabb). Assembly betéteket kellett betenni a c kódba, azzal is nyerve egy kis időt. Ezt a bit faragó szenvedést rendszerint én csináltam. :-)
Persze így rengeteg hibalehetőség volt. Úgy teszteltük, hogy valaki más PC-re megírta ugyanazt a számolást, amit a uC-n kellett futtatni. Aztán napokig futtattuk mindkettőt ugyanolyan álvéletlen bemeneti adatokkal, hogy ad-e a uC hibás kimenetet. Ha igen, akkor azzal a bemenő adat szakasszal tesztelve meg lehetett találni a hibát. (FIR szűrőnél ez működik)
Azért kérdeztem, mert nekem ez a probléma még nem jött elő, persze az is igaz, hogy nem valami sok digitális szűrőt terveztem. A görbe illesztése pontokra inkább tárgyak tervezésénél szokott nekem felvetődni, mondjuk egy hajlított dobozt akarok CAD-ban készíteni, hogy 3d printerrel kinyomtassam.
Szűrőnél mindig kész tervező programot használtam, csak a követelményeket kellett megadni (ebben és ebben a tartományban milyen csillapítás pl), az meg adott egy listát a szorzókkal. Megnéztem, belefér-e az időbe annyi művelet, ha igen, jó. Ha nem, akkor lehetett tűnődni, hogy engedhetek-e valahol az elvárásból, vagy erősebb vas kell.
Szűrő tervezéshez. De ott valós frekvenciák helyett komplex z=esT számokkal darálunk.
Próbáld ki nyugodtan. Megadod a szűrő töréspontjait: frekvencia és csillapítás.
Egy trükk van benne, valóssá kell tenni. De az egyszerű, ha a megkettőzött hosszúságú késleltető lánc közepétől számolsz, nem pedig a lánc elejétől. Ezzel negatív frekvenciákat tudsz teremteni, és a képzetes rész kiesik.
Persze egy komplex mátrix inverálásához tudni kell osztani komplex számokkal.
De az egyszerű, mert az osztó konjugáltjával bővítjük a törtet.
Arra gyanakszok, hogy ekkora átfogáshoz már nincs elegendő értékes bit.
Vagyis a digitális számábrázolás korlátozni fogja a szűrő fokszámát.
Hasonló probléma fordul elő numerikus integrálásnál. Ha túl kicsire vesszük az összegzendő intervallumokat.
Adogatjuk össze, aztán az összeg felkoppan, mert már olyan nagy, hogy a következő hozzáadandó egy bitet sem változtat rajta. Az élet nem habostorta. :(
Ugye, ha karakterisztikán belüli munkapont beállításon van a cucc, akkor fohadt gyorsan tud működni, főleg a nyagyfrekis rf alkatrészek, de te kapcsolóüzemben kívánod a működést, jelelőállítást megcsinálni. És ez nagy különbség.
Nézegettél már hozzá teljesítmény FET-et, hogy mit ír az adatlapja, mennyi idő bekapcsolni, kikapcsolni, milyen a fel-le futása? Ugye kiszámoltam, hogy szerintem itt olyan 1 nanosec körüli időkön belül kell legyenek ezek a folyamatok, hogy beletedd a 10 MHz-es SSB jeledbe a megfelelő fázisinformációt, amitől még jól érthető lenne a beszédátvitel, nem vartyogás meg donaldkacsás. (lehet, hogy fél hi-fi minőségre tettem, nem tudom pontosan... lehet 5 nanosec se gond.)
Szóval, te hány nanosecundumos időket gondolsz ezekre? És azokat melyik FET tudja leművelni?
Ez a fázisjel mondja meg, hol legyenek a végfokon (ami kapcsolgat) a nullátmenetek. Ez ugye négyszöges lenne így ideálisan, amit egy LP szűrővel kerekítenénk le hullámosra. Csak sajnos szerintem nem is lenne szép négyszöges, mert túl szapora az egész kb. 10 MHz-en.
Az egy tipikus trükk, hogy amit csak lehet, fordítási időben kell számoltatni, nem futás közben.
Viszont akkor nem lehet paraméterezni. Van arany középút. Bizonyos szorzásokat egyszer kell elvégezni, azaz új változó bevezetése. Egyébként az egy tipikus probléma, hogy a feldolgozandó jelek gyorsabban jönnek, mint amit az algoritmus tud követni. És akkor őrjöngenek, hogy pedig ez Real-Time (finite response time).
Mármint mit? Mindent értelemszerűen nem lehet, legfeljebb a korrekciós faktorokat, de az meg magától értetődő. A többit valós időben kell számolni, hiszen előre nem tudhatja, mit beszélek majd a mikrofonba. ;-)