SDR algoritmus: keverés
A szoftverrádiónál a digitalizált jelet az analóghoz hasonlóan gyakran keverjük a digitális térben. Szorzókeverés alatt értjük ez esetben azt a műveletet, amelynek célja, hogy a frekvenciatartományban eltoljuk a jelet.
Gyors keverés processzorral
A sin() és cos() függvények lassan számolhatóak, főleg ha nincs ezt gyorsító hardveres számoló a processzorban. Ezért próbáljuk meg kihagyni az állandó számítását. Nézzük az alábbi összefüggéseket:
<source lang=C> // origp: eredeti fázisszög // diffp: fáziseltérés
x_uj = amplitudo * cos ( origp + diffp ) = amplitudo * (cos origp * cos diffp - sin origp * sin diffp ); y_uj = amplitudo * sin ( origp + diffp ) = amplitudo * (sin origp * cos diffp + cos origp * sin diffp ); </source>
A fenti összefüggést tovább gondolva a 0 fokos i és a 90 fokos q jellel a keverés:
<source lang=C> out.i = in.i * osc.i - in.q * osc.q; out.q = in.q * osc.i + in.i * osc.q; </source>
Az oszcillátor minden minta esetén más fázisszöget mutat, hiszen f_osc frekvenciával forog a komplex fazorja. Ezt se sin(ujfazis) és sin(ujfazis) módszerrel Taylor-sorral számoljuk, hanem ugyanúgy szorzóforgatással.
<source lang=C> osc_uj.i = osc_orig.i * osc_faziselteres.i - osc_orig.q * osc_faziselteres.q; osc_uj.q = osc_orig.q * osc_faziselteres.i + osc_orig.i * osc_faziselteres.q; </source>
ahol a faziselteres.i csak a frekvenciaváltásnál változik, így csak ekkor számolandó újra mint cos(2*pi*frekvencia/mintavételitempó), a faziselteres.q pedig a fázis szinuszaként.
Megjegyzés: az oszcillátornál az akkumulálódó hibák elkerülése miatt double pontosságú változó javasolt.
Gyors keverés FPGA-val
FPGA esetén egy másik megoldással, a Cordic algoritmussal lehet nagyon hatékony keverést elérni. A Cordic algoritmus shiftelésen és összeadáson alapuló közelítő módszer, amely meglepően hatékony. További előnye, hogy az FPGA-ban elkerüli a sokkal költségesebben megvalósító szorzást.
Bővebben az algoritmusról:
Fontos megjegyezni, hogy a Cordic keverésnél használt bemenetei:
- I jel
- Q jel
- fázisszög, amely minden új mintára tovább lesz léptetve 2*pi*frekvencia/mintavételitempó lépéssel.