„SDR algoritmus: keverés” változatai közötti eltérés

Innen: HamWiki
Ugrás a navigációhoz Ugrás a kereséshez
a (bevezető javítása)
 
20. sor: 20. sor:
 
</source>
 
</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.
+
Az oszcillátor minden minta esetén más fázisszöget mutat, hiszen f_osc frekvenciával forog a komplex fazorja. Ehhez sem érdemes a szögfüggvények Taylor sorához nyúlni, helyette inkább szorzóforgatást érdemes processzor esetén alkalmazni.
  
 
<source lang=C>
 
<source lang=C>

A lap jelenlegi, 2016. április 10., 09:19-kori változata

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. Ehhez sem érdemes a szögfüggvények Taylor sorához nyúlni, helyette inkább szorzóforgatást érdemes processzor esetén alkalmazni.

<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.