From 37d44038f42728e3f5dcdbd8e9f763e5dcedc380 Mon Sep 17 00:00:00 2001 From: f4exb Date: Mon, 25 Sep 2017 19:11:13 +0200 Subject: [PATCH] PlutoSDR output: implemented transverter feature --- doc/img/PlutoSDROutput_plugin.png | Bin 26847 -> 27936 bytes .../plutosdroutput/plutosdroutput.cpp | 16 ++++++++-- .../plutosdroutput/plutosdroutputgui.cpp | 30 +++++++++++++++++- .../plutosdroutput/plutosdroutputgui.h | 2 ++ .../plutosdroutput/plutosdroutputgui.ui | 21 ++++++++++++ .../plutosdroutput/plutosdroutputsettings.cpp | 6 ++++ .../plutosdroutput/plutosdroutputsettings.h | 2 ++ plugins/samplesink/plutosdroutput/readme.md | 30 ++++++++++++++++++ plugins/samplesource/plutosdrinput/readme.md | 2 +- 9 files changed, 105 insertions(+), 4 deletions(-) diff --git a/doc/img/PlutoSDROutput_plugin.png b/doc/img/PlutoSDROutput_plugin.png index 9bfebf06cc7e60af376433c5877c49b7c337de78..d728b849f4e78371b6f4928995d0d169de7db61a 100644 GIT binary patch literal 27936 zcmc$`bySp5*Y}S|2~rZ$2q@A>H%JHq64KJrF?6?pbV^Bw2uSzPUDBOHcX#J|@V=kl zdfv5u|G%s?YnYj9t~h6(y}$dj_ccNCvJ&X1M5u6ZaOjdB#T4M+o=ky$z&*1M$w9X4WJ+uD!#SRV*4d?Ok1THa|0KAE8FDdf@dFdG;_S2W&Cy~?P z;9kK=iU}(@&+MkSxZ{4fepq0OmSl~-ffs2_utuXtLKH^ClUI5j%=G6^I)n34*!4}Y zPc0eBAGALtMSnDlD7VWre|^*Rd9hFb9)7j)z<~AQAi_H`^3y=~>uCOi$$Xt|`wK-m zWd~)Cyu7-6yl;5ISO~&cB*6-0?;rmW(?xuI13~3~y}7Z%ms|}=E zZugl_J{BpdjEIPj!FQAbd16~zGD?1Tgb0C&mrhPy-%Z~&H$8a7tQsJCd*_qjPg1D* z{ZLXn%TmpcA?S~jy1_#wm}QIK-?Narw-AUL@av1BYeTtUu@QX9i>x~-Cz?ATA;xDl zV2rB|Rm-n9yHK!`P;%oRlVVVzU)YlpGk!P8L;4x}$?486W;1zC8F#Ga=8(NofO?ie zYl$pevMjB^MK?phjkN)9^5-JW?toYD^kYvN8quPuwfscBW~Dc?d^KY~oYGfi(eL~c z(5alIkfD&9$Ito47)zUsj>#ZSUS1C#@zQkM9_@^B2sU9?9r;B>A$;DFfG!sAo$5}` zl4;3-zV5{t^ktDkZiU8GEGlBglhp4>N&@{Uky-kKTlHqdW?3Wf@%d+?hwMrR zZF4e`VtmY$GcMEURGe9XRL}g*Pks@RFSY#asIVhuOo5r?haE5nuyr%M<7OyUT0>CD zkmtPFSqimXQx^oQFGE(1L6?(H@KaX==Wc|-!0)YhU(&=G+|jvw9L5#;;d)px-+TnYnTq>Kr8XV&6$4f7ZalijHt3*{1$s^zkybukP8{Z-pwi@9*wxfA}`v{q`17i zEb+K;6ptX2k&=>{zE{=pz;kkPns?bCHI4kBt1*uPrSoQt5c%rHTCF35cy~?9?LO5L zgcBL1*P&~j+RV9*0(GYvca|#*{&zx;Qx*>IwuW13fndIn4ZebnZGHG^ch3An@lWgm za8y>G!cX@0>^N^_SGRJ~veWUIVL~T;Y@vi~*}GL$Ra^@m7o_A~x25b8lqHOI2{*6>wL@g5s%hy(f{l**1`=bc2$b^KT2)X_R1+8jp3bdC@ z2(MUKquxlzmAIT3nf?Kn64$K4uXl4d49qBOMTg7ZVEy=_?^GY`OO8DTiA7-Di zlLgET547oXb0>&CXo#19S*#eqE(i!fUg?V1m~&bvd|d=LD0ss_NJxm+Ud=C+6?HN1 z79rqvUSc`NYx?_xu9h2u#;Cwl(|wuk>7ViaKxG6K_rQpWrA*GvGuKp?b;8GEAD^5| zS6S)!txQi(|NiNQC!907q`hxWB`0*po|>B4m&7GUWP&{vtaibrJr(>UjH*NxRZsF+ zG9PkouFCmtX;hq1p0-jf+(98i-9@&F2JNeq0Qw{^A_-DCbhb40Jv^UX{9>la^nf8KV@uLMiG1w{ zu9_g=#yOfJx3N2&*i?c?N*Wdsfl04g!~nZ!!xTE~c&YQzKe%~jitK5595++_7eyjD z-Tw8wmp9BzmTK`b!y%2-l#w@9o9_=WJTFaV|1z;3P9{K99z4C<3!=n#3c1z;-{;Dg zY;Kuvjkmn~_HY;5y36r)d#z0()5yA5w`hA+!r%|)QVWqgyVK&DJ6!tNE2^Zl<_|gFoi==U zG|6AqzybrLi)Xlb`#MeF^3D0l8YZ@M>{6p!D;YPCPCR&2SPA zL0WIdrDjx_J#Jj$;f2CzoiFpSZ|kt@ALqTs`QIB`U;|jX{jISvJS@U+YVSLTledF- zjV%Yc4+^AweGIezEmKQNR!qz{@s;X`A~!b}SrjS;lS6Pb9Uf}-JlT`?D&DCto4CbF z=g+Oh)U|0}vP!ERpTbp;(NSX@v?80!)`m6<0{2qSKYMxVmE&v(8SG{KBKP%r2ZG`B zVE2~VZjIJo>uuSTBfIZlYM{to_UaD}Ub{_AZQqd}aXA|XdKuE;x+x%z4hIY!+iZPc ziRfx6=os3#&yENY$LV^wcOuEezP)W;X!@FzmbRDi$6+TtV>sDCis;($JX5p;|J#A% zn>Y@#pMlbhdK)${u8&q*lSpz-vC=WoJ8noeifLFF9UG;4CjO$W48uwJxRcV!lC;a4 zh%mPh58ms_ZShXRwY;oLAZ1{XYBSA~AnA{P%~)A+-OrTyr>9dfp0UyV!7V&zprBab zHAHaJx=1g3a7ybdI!@MlTTVDpg}!eoRTPA>7@;`b?~1UqRkZ9^R|k|u!b1}q-hjnl zfvK5DRY*Pe@slit&ue$5GuMA;i^56v_+|pwdSdCX9|JP)Pmb-C9%rKZ{TfD?kXR8{GJu0S z+Ul6f&LmzG&1hceO~Devd`^wF<&w1-h99u5tgnS>97C^qN)gzM%82ELZs8n>^exoA zVNU!N)x+_IXRB|ea_Xce0w?QOQt4#C4^_x&{sNN{@8mF*T9$%vWEJ0C?d8#7i7b#U za10Bnx|5CPq<#bZZmI^;R?*Wv8FnrOQ>pTtcypSF6NGC$cpfN}B_i}M)X2jMxp8CS zL0GQN#jWQlda3GkWZa)>&^Yb*By(CSwE4wXEtb{e%nZ<&I{C(=af*9#E`J?u$!0rj|!%vXCeRV z&}i*?rMkJx9>1h94L4X`y_(tT>3I$47_4i}nr=a}pNak5LC)wdUy9aV zT_494H*Q)NbHE5sT%??MY9r(|$L%(BmW!K&E7m8s%3)1JoaIJ#gPn#n%t7E$FAhKI z#ftX@D(11jtgjGYJh?TzKzT~}`6P=x_2Z>d$;XrCf#tQr?XdLCKue|2w^{vqs z)V{pPkh)nO2@ZrQwR=}<3OZLXgCliQ)lO;6rUOl=*c*%XPZO%VF3Cb-1GYRn7o%3F zvOF5>eAU}_y0zImK}ARq%K78ay1Zd7i!DAet69)Z^|d-CUJ_=u&2I2b^x9zM#L(0@ zCn=Agt1T+?f*Z_>Ga&3nQSIFs5t1Y3YM4#KmDd7^P4(rS3vW_NS2=;JG75IaJdob6 z7^^C#|CebNe$+*i3cWNNzcicc3GYhor&!-z%aw5AGMrZW@>TK#XX;NNoaHW#NYH%W zuP|f!tKv%-3)NKK$3D8Hox%;5`~7{*1-8IIN9|-8Mq6j?I|u5d3{^k4AzCqMGdy#0 zuF7WKOwF2KK$JmU&^qq7FF4l9f{JKLB&T`75&&mZ0Yj-cI{EX8vR_6QhB!4ZJmLE1 z^60_x4`(PJa>d5Llf5U-MxUQc3~cbQlLicGX_J-8NeF>e%FADjD$V5et9w*yoWU6P zKT|z){8#YHyaU0Rv-KsN3SdOojE_)OmE(jvd_AOM zl?CsJNm1KqmBne2x((NA`m1ZdohMU{uTwgREqdjRR)0>I)mAf| z9uUc&dl{iGO-^>9H~2m&Q7dex#$&JBSt_ty%M(N(Y(Zse?F=K{8qSnxkT4GzT#Je{ zy>Z^VOybQrlUL>@8y-l?@PNS`?qsmryDIuhe42DbGw4EY>*eH%{UuD5O_}ney+E%{ z!}fg5$^rjpV$bgI;|eQs(h`?#B|x_mYx#*)mC;9Fv;9;+adAM=N~^ zYys8P)n#_nGKuYX7Yh+-Y2-FGHji&-N<_d9)z}$pyX|pYpKkfe=ID=R%eWtRzcoDQ zbl4sXN?E;hoYaT6&tcei`ya4 z%Ne5S>V*_63;>-|!P{y}U1ik7KpRAZo8 z1zq0bfL_HtxcVNGM}RB)Ewk8#L09SXaIL>o91;QZCKS!E6m!a_H9NKM_{X6ES}K-8 z5{}-D1A^HRdwwAGTZqWEqohddgBQRLi7f#u=f05C*L6m`_(K*o{w)`DTKhjPe)t97 z<)F|5e`#syuYw}V646YEh8+bBO`u|qY^ljGWpHqCJgXt<$;RMDQQdy4StYB%Uo0}W zU6xemwEz7(%USMJ_hU&^RMdDOFTn_*d+v~z%teYs zc^cNbupdfsmdAR>7IT|~`@OfhcpFO&NNiRNLSiEwsr3zq=Ertdn&yQoDmvtNdn6S@ z-|^fl%=YWSA}mHPAB}9isADQI5iOYOpw2t_S}8&-B)8wxa=$#0aFuntFp12Qrae_q z{1{;KuS`&Z6?et6=m&;|8qC!?)SnFS;e|ik-yAr*x&6GGuQY!-C~%Q1%6Caw(*J$k zIpPdlI0=vKRZ8cF5PTNLT{RzH-|oJ?*9;7yQ&Vc;MwV${QLSxlUn)$nc~inU%qI?kZLvb8-c1y0bZI%wb<9+n z^VqFFhtu)AdIRh+UqRRHV!wa3#?Iwp&S|>A&8bklK}54KdD>N z2CUd!x>!-Z#W~qY3Fi?a(N}A7Jl$WEGf79X3L~cT^MOzKQ9UN&NY=Z!(GUdem&xW| zwCa#hWQ>bXNa$Yf2&q|%)7VY5d$_xZj)_sqWn27%(FpL2`Ssb3grz0Z^fXl2-t%UU zYrpP55G=E{tg~8%P{uUUB^5Vsd zp)IDSUIJob4eDlWZ0y_9Q8~PDKY#yU<7Tw9HSSg{bacU9_a|xf_t!gk**|wiOzs_c zLz-lb$LZy^N74^?5?UMvi>;K%*Jx=u#%FXK1YfX)NcJ%p?d_wX(+Q1VU9xe8fMFxj z6i*sGvj!3vkzD3YiAI$r;^K^X@rTS|C71AFlXl&AN;3!lxi0z{s6}snabpjdkzQBV znwpy3*_!C$rh6hk5n)+b43Maut|37N$@Z&PFdX-05StS@%zN%9%_?zUs_x$5=k2b_VP`$&7$j~ThkQAc@W!NwL9-gm zPoxEWb_oVR^3x}K6J#BL4}L5z>Iy#G+C7dS@OnMxLYIrap#&_yAc<=e8dhs3gF?o; zQ>8I6F(uYZB4C&v4*R(l7B@D!ZVs9T$8r_F)H}1hdGp5E#YOpWWp7W$)wR~*)S=@@ z`a-HF!nq5q4`7sg!TII%E{gT|l!EON=2)$ri@=S(<>bT%`kwkzd^1@3oeMya+w-Qh z@m>}_bCJm*LqI|*13qPal&WE~i%gf7~Lm5xW$bP=W+?;Q4o5tw@UfUk*r?qr!Yz(!b zi;&G|sL9KVS}s-7qHS0y1S1ghh(a*2*xG8QA_%0r*u=!Wz>tp4&$F!-8XdM54`yo= z+m#WZo|jiwj}8yaO~>(CuMJ>_b8`*5#1Rq^WNZG!mg)Lk;WV*Q;^8DgAhF#TNTFh6 z3@a#L*l&9995dta_V%82gjpC~u*;_MOWNA9DrSFb86Az@+%)m=@wo(J^F*!5Qvl@t z%v!bfj}8{hTbbotE$UHkZ|_Rb+tkHyzJ1;0_8{f#r4gK{uo|AWe~@N3vqryCoh7Ls z96Z4B&@fo7q&Jd6G%zsm6(yxl0J1K4;R_NEVvKOa*NcrRV9eM5!7B37=y@f$sx2%yBPslRWsdKz;~eZfrJS zJsMZl32H{IG;Z@phfI~U?AwHNwE7^Tsg>vo$96@K3k|G92w6_v-(H=7i|F1z%98$B zX1_H;7ZFCpk+=KM*Z1jHW@bKV3nza6lJ5?nFzim`GA*m!(Fv?;$2|fd&=_?DUHnJ>$n>@Y_bZL)~6)S!d>nBOkUv9MMA{?hvDo3C$`sE<+|MdjLdn_+iZ_? zxaFlco_c*Vrx9~4fL>~z?E#n84j?%$7=r&ntM_PU^Z(K75KImlVvgI+b1K31fc%@s ztPP*n$D&V4+Y@)_e}7L;qC~maKTnAc<=7@CEbXnuE&rn@o@hItt^`TNu3&<4J_v6s zQ$NHF$)lM(Ln>$9F{praXg*_0o@NmU%x6buf0R?lCju05)7{+2d8>|E7o@`ilA-_{ z1#Ws3LYkw9O3M+SwD-@EJ?8QSLp=ykot*c-D4*u@J8pHH%y7J-13(k~;-|$zPy(>V;NUK zh{V#X9)VmFs*YsO>@!Tu$YzrXd*Zf6i6)|WQl&Cg6x@vZSs*xY`}1o;3Q!RkBmT0h z^PhqO%(=b&x!15FsrzZ-sg@t8 zrWBjna`!MuOGoTXVgu@<^$um{nK`7vX-a&ag4Lo1!`miWjEaLR}=(Z>#A%T)vA2Irf}6(4gdydE8si zdpeYYX^3#=R1Pk z)Rq1H@T4SSvr2W=PbP7HFU&PEn;jc4EZv`9KM(k3P4h9}gr#I(fSY-=USu>RzpjoC zgj$ozbGHr<8`?WMVpEt=M8+>K4%0{XJinh#{(5F3nr2RY@QF4@btBSAeSu+Rw-!yN zz6R4W71e_B{oWH{Qi^RdXFFz1JGlm5tp-;Puqum=)pT`V0VlKyyggXs_qyYG%Cok; zj0(qosG8SfUnYyRZ0zi)sHocZ*Vos@!Asx^j|tf_w1JR1YC$GH1iqxiZbKHIQC&<- z?EBmax%;88o}L~Zq`~b1%I8{H<*+s4=dd$@jgPMaWd=_3(XoB^_g693Aopk76#L0{ zcVu}GE>$Q76PLN65S(RiqRJ4h7tq}(LU!?us|dQMn77#IM7l2v;IRFc zg1d)@%Wi2G0gvr#z&Te7tLF6pK2_-TLxnegM{sz0`ugo#rVeQj>tyG)^iHmTqpnpjj<8C1)-$xeryz=ej4 z<%9ON5@+~60pykx(tS%1^g)7hxSe0D$C?257>)!51^FLtPayO4H40CsGenV93e;La z{#3K%PdsE+d3)G~S)koO^bJHY5cnj4ZcE{F63>u-2aq@zVz{Yl8>-$oMtzX_R9L{` z0Jr~P)p+IqsJ%}2=aQZxV;lm#^jSecfwqwhRe;X!S*~9hQFb|)!aquRWk`9PfF1zJ z-?RHYE(ipW%wg_RUUDAW?^F`uF?ZTP41=iqhMRk8|EZKpe&vkuQ?p(WoC$gDY4kfo zTVOEa=XJV}+e{DR37tF4(XbXU;kOU7=31*@`R#+j4`Ly-WaC=MZE_tt3aLfY~9d8b+B z@n5Ql#e;)K)xzy@ZJ!XR?KJ1`DTOySKAzzEe6JUTrJ9@lI$8z>gvCdR1ysERFcRA} zsmD*<4jLpt7KDb+usH8_UalnOiHf()Y_jT8q>BnvPK#ei1%3dHR0;W@1VB z=H@0kHdfix3(T)kIU(?Gb5TpJJV+RG3v$!zW#Ref{2hAy79sIy!nz$ogF- ziSxBe z3$TtlYF>#4SYeO?EgMGRSO3gX6Bv}Sxbd0}XtYXtdt^*917PO$;*b7pEKhV=zSZ(P8@BM2_S1;ndBChx*TeOOAvU8Vo6Tml z{mjCms62VtNs&Vc_9X4X6oO%k+PgU3*^Wk!8v-s%k~EM?`|_E)u-d$Us5Mx7GnEYC-GO($W$H1}$9jrOD^x>g%U2eBY=$giD1RE2X@F4N*~v zoAtFoT;AT=nofV0=lX{g>;fdZrJi@!bXJ7QFcpHZv;8S8kF)XT#GIiLWG>(T{{3jw z7vBO-gbaC{?fp}Of6KNP#m&>Fe0&T3Fx*%{Dhu1VV z&$AO!Gr{NM;R_*jcabPO>uHKMDOI~%3Lt;5NF+!l2K?G?p(yCKyba(jzGh`Mcmm*QSlr*7m9v zEGw`fIiDME_iCWJe!xF{c5Xbro6OHfz~SL6k#dWjaVZxo(n^xxN5=Gk$46thK_jeXd+eG{65pgR@c;gR#N(2TwFW{L)NXU z(os_jOiD`ngo$>h_cxLPgi=uw&XhI*r46Fm8jDU#vSaB7+J5>aSxx2YA21^uF zkRyNmXaRWQYCXwnai-hh#Z-6n+vupMM;_RF&Zt)MZLRkw8^C1e`*SAN;4d~ZxW;|scc0Qj8Bb^|2vc+x<~etR{OCF zM}u$sn8IHFhu_okQDR(ws>mck&}k!LXd_QY%fwXVh@Dcqd~hHKGV6So`Shy@T{n#K ze;{=_g9h?#FS8A7T^RbS@wRqXx!s9Z%DiO6vVnbDP#{IDLSz#0i@hnYzwc>r$X0f0(_zxKBI%>H}FQ!y& zSRj1xFga;!p~6sIV$zq@gLEi9LobeY&05OM6WDp*8RTo(IGhWNOfZ%VERH$O?3ur< zlmucp!fEhsNcvb9VZs|8rcF=(_LC$R6pVy^=H!mX2VT%Lu=L^OzZNp$l&_!P-524~J{!lv z*%9qCCGSRgY#^JeeYQI`Y^v}g?<)%^mWiN?IWWJ@lgKa-BfV020@GJFn)%oK)PfBU z%arHcIeWzjSc7EAzEyn*-c!1Rkf1Z82U9EBqvmh>AH>dRqW-l_Iw#-?c$o@C6gfNH)6}pFU@T#%X%b8Y0vSGu|3`)|JtI2ZfsLwQ+Ni zXvw0G^(o{eFlQQ)4gB37B|6||5-mKhZ*E4jq+bFQLdzKcid|nbOD4A{rBn?^qodMx zx_F*U?HRKmg4Yg)y4>NJkG9q#`NdRt81XRwvMD>!unGI>+8W2sZC`J%Xy$PBY)tg4 zYWRc3n|~t1ZLbpVoE{ey3Yl&N89M#+b0YRY;EPT`H%YBQl7beWJ`3OaiPM6IZk-h@ z{=!lttNGrABsCRXU?1^9c+rmPxii8230igTqOWPcmFw>sE1y^F7*-8u_yD{D6kZQO zpWi+_J6p?)5L|BcLj!oA-w+nl2{9(CC*5z96fX&DZI)OnKUlJdCyIgEH1 zjeH3VnwsD_5&#h_1kVf9D^asXJV$p{R@%T`L&4ey;Fts-*<-i<&9EQ>ek1&WI|cj> zZbj-4*9$?<;d8gO&TBs$0)oFlFLqfq-F5EI)m;HRN+9Iv9=joUHm1mbvs;c%)PRJH zTn?H?9;*z59jGE`)Ibh`>-`A;+Tq$yof!eE{n;Aem){xo;6_D7ZO>-AgCJ@MKc^s3 z`r!F=IeN*rIPrqR=_)6%IN2>i+DG*sk-V@##~B2hX1&r!@*I_xCMPC_0K`G;fE$o7 zE}IzvaDeO>gFSPgLX`PIe?&5mUG^80WY7e{&a^XG{1y=JT*Vw#iy3x&1~vJmOAt4k zzdd<+3G$7{B1sA?CNdJMsPWni)D#GSkOer^!qdX>DJ&uPqP71iqza+G-`% zPw_w}Vn?Y|?+3y8_Zs$hmDZ6gX+Z0Y0abfWE=ZC;9^7r92Lu6tp+52P@lvfC8seb@ z!Vm}pF(*V9e89+bQ0w0^yRo#FWzA4@)it>$QSwt|1Le^BNrMF@SHmHeTEXG*TL;X8 z!=*O9oi32<-WEQR4>9U&wPlE7&Q^hRFM zLcFAE&XE{kWSjs@a-*Z=4nR|*Qc~tjOl^$#GUc09%NNI7;_oWWHFxmYeEJ!`Gu|xD zZ$TF@=e3)xjrtQi0F3UTir{a3EJpxykpSH;RWS~{T7C~Z>L!oKHk_0X_;SmbTeT`n zQZVGP=Q%k!s$Vt{g{{f(L;QYfyFRN_4+Cjh{`fC>8o?KkZtsTgHytcB5m3+btgI||AVxr^k#~|+W5OP+ z>SS1g902eg(j0oL!+?MQHv3I^kc)m6jwii))dD0B4HFX+T2pm(ykT!#x2UYo&~tA0 z%Xc8zG@3q;6TJEkf~spJtxA3@s3qBgPE=c4+Y(7=Vm$4YkmhiAXa_co6441U0=5a z@Gy>9NBh7UAY!fscQ#cm2R!r1BE!9z%1~mi@PQP*QD6w-asg~JgmN!6TgD9!TIL-a zEb@a3_??eduKjLqPX@~!c2ovZ1wzydjYfV;u5N5Z$4`}HHS}D}04J!h)RGNaM;~>b z(LnMvP3B)vCi*B%jnW?}O;rn)KT;*FFEXZhuF~;lW`v4b*d8b>JlcADXD6qtI#FFp z=>to_+A5Pwt-nZ;^T^nU~+dIK&Kyj z&eA;22?0KyZf~euEQ7!4`V3n)c~suNK7^P#?7!6EHX{51yk8u6sHme0V{Lbs7dNP^ z-IMY;mgsk3biV@G)+h`zaDJcFxhW}LV(R?>^ITS5c7xFsP>ee4;oaP=mg`L2`c zgo_{2@y0c&>`(P8?zG)q2yP3Ulu zAko%mGNiO0Ym+-tuCL+KnORo0*2JCV$e;7F-EjT>%A(_$)6X?4W|W)|iK3j~Aqp|? zjfGm&xnfVWCGEZ@y?(()WX09$dYvxce1B%Ti7FF@zmfgXO0lzs30j!pt1hgINwS!| z!xt6fc?BrR5*jMaaKh0@?J!#_vQ};aI&9?K&)(ugDE0D-J~4Zx*lDhIC{)uFR+;%y zpw=}yCOcEixD(d9uA1@fOk!|fD*SJAF$ za%tpBQ-}Cy|Cl!sh$RSBiBgc}vCYHE8bLQicbUV2UB?yvdO?p*e;Rz+p;g#!0FC@% zxOkW=B6Y?wnRVz$gmiwv%$Flmf^6Yqv0!!cRi76rGi$;|g$|DfH(07`P7Ga4SF7-| zHNC1?`2g`>Uaz&6b}`j8w8bUm@Yks4=%s}o?({Qp`06~Bna!3nL~H{xKjyPT?dBj^ zOeu1#)`Gd7|2>UXJ$kU=!Rvv9+(kUM7~{>qtEl*QyVH8S}{K;-SLY5Y9^f zZ3PcganAp=9c2euV}h9DsF~unt3W>JW-(P_csm@yd>Ey5_q0N(|NhOBr;7#4)pdG& zQX8V-Z9!kJOzqIk1MUB1Qgdh_OxVIHJXpssO1{}1SxS0{Vf~h)DDc6h>UynLswOF*(VjT{_U|VK(=l!?W!EIS0f$P9J%=stP1(?f%%@L0 z_uEsLmq&}`>@LOjj%z8P=s_0?t~V!_mng2{GutE6Cm;ImcM*bU&v&9!GWB*zNvloe ziFv=9u@EpO^D8!wDBC0p=%{5bSP2n}sPV~Utx%EA`WKC9>fdr%&i)03Svd%#AR583 zu6G{4V9eAMo5SkYujL82#{xOfGSfA7Zvm$?o-Q+dPM~}9aS8M&2L=UEP*eMZC{kwB zPXxfyIZ;j}lLgoO!VkW*?amCH(JwqZ1f2?O5rcbjACZftHndH_wbw#aXT&ve{>I4t zvbIw#`#SuE)7>+!@4H_8?JP0JfK2RscCek6#g2j{^ASL}HlU8r*Wg;D-Hs>W*fZ7#e{hkC=vlP{*HbHtnAZZM2a z)@L*EIDLoJ^UDk|$;rt9b~agP^zgfTgoRf1NB*ZMh6oziu?ii42YvxX1?Kugc+h1H zl$ai;&i-0fb~dX~9|4HJKqAtEpu#B;PD1hKP1cMlW0pb-V}$)udl3UCa~SgC?GN|+ zg$v&rQ}?%?*EAFR>~f+IV%`S!_38cBB!e3vFEL^nyUr&c6zG!=HvelNXQhl0>V-w6 zv+$2l6zGxcFXJ`RXWesiDW5aNkIrFMcBh-4K`l1FPE(of6FsMJ1|u_-*cZ{y~J zFQHI24mo44VDXMQY^e5hcV&);ENKwUN~=iv;ihoCHYV|N&t=Yidiq~A$APo}TQwFh ztc%cXdHrNO)Q^(PhFy&X^mUAY`%l*04IP+o&@2KiL|x}7NE=LEF7=07;gqW9MiMNtisXU)%381o_} z=)Kp4dKhpb^7+cZ6PllDkb?DK1gH*}l;0|o=LyECUqPM15C$p~EojX3@(-=HXC}^e zGuO8C>Uis5Xg*FSC>MHrJTh}kPpd2e)0Lae@80pB z;`|Ny;CS9Rl~7W)c}L@^B@n|Ag3NYw00K-N^iZBrJ&ZVK1CT#tv3FQ-u-<&VOJ6*T?_8bJ`!Q65{gK<82tmsOF@lOqc> z#l|OGPTXbK_r;j}`%l<17Y~sVC>^=oRGJ45-pf+jH(*dR`45pnw|wPxJd3*_ENrGD zugN@4KWEFO$*QRlJc824%sw|4nwvZ{B>z}cDp6yo2UiOSCoF}!mR%{m405c?l#l zAm@lHGrU_LNa^)Mdzn`#-8c`u9f?(s=cVu|b^3nPTF{2O1G!pT$)YY!->$a=>!BxZ zp~L+4c#N!IA+a+`d4phx`I|(i<1aDe^#Js4hr~qB?ctBdXrTqLD3!fa*5-REmt-DQ zF~_3Ra|@2pI=O+FvqaiP@@O{uF9f%5GejvZ$ zb7y%rKlOCZs=z4{buxx%ZL@d9pS$j}th(ns5@RNd~YFy@=8YzpO|A{Ed4h&V=+S+2`;y^L1FVNh-|S$ zV#Yr}4;etup~EJ>)6>&u%$1eFis$@A&yh*b_)}+MX3as%f>;5{)bO?T;yq`tSIKx5 z@D*Dl!o40~YVIC(C$s2XUe!`f-Z6etUEq`Q%*eRreeQnTv4y&E>q3*nyrJE@aDcio zhxnF$TBW1fW@W0@!TgO4qVxH*arfW9G&gsv(Q+!=kb2OtvpZcL;IKpVE*5sN{M5S1 z!}W`15)Y$(@Z}3h35Zt%Jn0Kf6%~A;`%5a&FPLv%0ARe!$@*jVUet7dZAOe3(jg+5 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 literal 26847 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þ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 TGk5r}h%n?HDm}=PHhT46%6mOr diff --git a/plugins/samplesink/plutosdroutput/plutosdroutput.cpp b/plugins/samplesink/plutosdroutput/plutosdroutput.cpp index 39459fff3..e979fe627 100644 --- a/plugins/samplesink/plutosdroutput/plutosdroutput.cpp +++ b/plugins/samplesink/plutosdroutput/plutosdroutput.cpp @@ -343,11 +343,23 @@ bool PlutoSDROutput::applySettings(const PlutoSDROutputSettings& settings, bool std::vector params; bool paramsToSet = false; - if ((m_settings.m_centerFrequency != settings.m_centerFrequency) || force) + if (force || (m_settings.m_centerFrequency != settings.m_centerFrequency) + || (m_settings.m_transverterMode != settings.m_transverterMode) + || (m_settings.m_transverterDeltaFrequency != settings.m_transverterDeltaFrequency)) + { - params.push_back(QString(tr("out_altvoltage1_TX_LO_frequency=%1").arg(settings.m_centerFrequency)).toStdString()); + qint64 deviceCenterFrequency = settings.m_centerFrequency; + deviceCenterFrequency -= settings.m_transverterMode ? settings.m_transverterDeltaFrequency : 0; + deviceCenterFrequency = deviceCenterFrequency < 0 ? 0 : deviceCenterFrequency; + + + params.push_back(QString(tr("out_altvoltage1_TX_LO_frequency=%1").arg(deviceCenterFrequency)).toStdString()); paramsToSet = true; forwardChangeOwnDSP = true; + + qDebug() << "PlutoSDROutput::applySettings: center freq: " << settings.m_centerFrequency << " Hz" + << " device center freq: " << deviceCenterFrequency << " Hz"; + } if ((m_settings.m_lpfBW != settings.m_lpfBW) || force) diff --git a/plugins/samplesink/plutosdroutput/plutosdroutputgui.cpp b/plugins/samplesink/plutosdroutput/plutosdroutputgui.cpp index 8d4a48521..893c2055e 100644 --- a/plugins/samplesink/plutosdroutput/plutosdroutputgui.cpp +++ b/plugins/samplesink/plutosdroutput/plutosdroutputgui.cpp @@ -44,7 +44,7 @@ PlutoSDROutputGUI::PlutoSDROutputGUI(DeviceSinkAPI *deviceAPI, QWidget* parent) ui->setupUi(this); ui->centerFrequency->setColorMapper(ColorMapper(ColorMapper::GrayGold)); - ui->centerFrequency->setValueRange(7, DevicePlutoSDR::loLowLimitFreq/1000, DevicePlutoSDR::loHighLimitFreq/1000); + updateFrequencyLimits(); ui->sampleRate->setColorMapper(ColorMapper(ColorMapper::GrayGreenYellow)); ui->sampleRate->setValueRange(8, DevicePlutoSDR::srLowLimitFreq, DevicePlutoSDR::srHighLimitFreq); @@ -238,8 +238,21 @@ void PlutoSDROutputGUI::on_antenna_currentIndexChanged(int index) sendSettings(); } +void PlutoSDROutputGUI::on_transverter_clicked() +{ + m_settings.m_transverterMode = ui->transverter->getDeltaFrequencyAcive(); + m_settings.m_transverterDeltaFrequency = ui->transverter->getDeltaFrequency(); + qDebug("PlutoSDROutputGUI::on_transverter_clicked: %lld Hz %s", m_settings.m_transverterDeltaFrequency, m_settings.m_transverterMode ? "on" : "off"); + updateFrequencyLimits(); + m_settings.m_centerFrequency = ui->centerFrequency->getValueNew()*1000; + sendSettings(); +} + void PlutoSDROutputGUI::displaySettings() { + ui->transverter->setDeltaFrequency(m_settings.m_transverterDeltaFrequency); + ui->transverter->setDeltaFrequencyActive(m_settings.m_transverterMode); + updateFrequencyLimits(); ui->centerFrequency->setValue(m_settings.m_centerFrequency / 1000); ui->sampleRate->setValue(m_settings.m_devSampleRate); @@ -362,6 +375,21 @@ void PlutoSDROutputGUI::setSampleRateLimits() ui->sampleRate->setValue(m_settings.m_devSampleRate); } +void PlutoSDROutputGUI::updateFrequencyLimits() +{ + // values in kHz + qint64 deltaFrequency = m_settings.m_transverterMode ? m_settings.m_transverterDeltaFrequency/1000 : 0; + qint64 minLimit = DevicePlutoSDR::loLowLimitFreq/1000 + deltaFrequency; + qint64 maxLimit = DevicePlutoSDR::loHighLimitFreq/1000 + deltaFrequency; + + minLimit = minLimit < 0 ? 0 : minLimit > 9999999 ? 9999999 : minLimit; + maxLimit = maxLimit < 0 ? 0 : maxLimit > 9999999 ? 9999999 : maxLimit; + + qDebug("PlutoSDRInputGui::updateFrequencyLimits: delta: %lld min: %lld max: %lld", deltaFrequency, minLimit, maxLimit); + + ui->centerFrequency->setValueRange(7, minLimit, maxLimit); +} + void PlutoSDROutputGUI::handleInputMessages() { Message* message; diff --git a/plugins/samplesink/plutosdroutput/plutosdroutputgui.h b/plugins/samplesink/plutosdroutput/plutosdroutputgui.h index 570a9e93e..235624f04 100644 --- a/plugins/samplesink/plutosdroutput/plutosdroutputgui.h +++ b/plugins/samplesink/plutosdroutput/plutosdroutputgui.h @@ -72,6 +72,7 @@ private: void updateSampleRateAndFrequency(); void setFIRBWLimits(); void setSampleRateLimits(); + void updateFrequencyLimits(); private slots: void on_startStop_toggled(bool checked); @@ -86,6 +87,7 @@ private slots: void on_lpFIRGain_currentIndexChanged(int index); void on_att_valueChanged(int value); void on_antenna_currentIndexChanged(int index); + void on_transverter_clicked(); void updateHardware(); void updateStatus(); void handleInputMessages(); diff --git a/plugins/samplesink/plutosdroutput/plutosdroutputgui.ui b/plugins/samplesink/plutosdroutput/plutosdroutputgui.ui index a8c7e7183..ea61bf9c4 100644 --- a/plugins/samplesink/plutosdroutput/plutosdroutputgui.ui +++ b/plugins/samplesink/plutosdroutput/plutosdroutputgui.ui @@ -240,6 +240,22 @@ + + + + + 24 + 24 + + + + Transverter frequency translation dialog + + + X + + + @@ -766,6 +782,11 @@ QToolButton
gui/buttonswitch.h
+ + TransverterButton + QPushButton +
gui/transverterbutton.h
+
diff --git a/plugins/samplesink/plutosdroutput/plutosdroutputsettings.cpp b/plugins/samplesink/plutosdroutput/plutosdroutputsettings.cpp index 631da14d6..21ef340c4 100644 --- a/plugins/samplesink/plutosdroutput/plutosdroutputsettings.cpp +++ b/plugins/samplesink/plutosdroutput/plutosdroutputsettings.cpp @@ -36,6 +36,8 @@ void PlutoSDROutputSettings::resetToDefaults() m_lpfFIRlog2Interp = 0; m_att = -50; m_antennaPath = RFPATH_A; + m_transverterMode = false; + m_transverterDeltaFrequency = 0; } QByteArray PlutoSDROutputSettings::serialize() const @@ -52,6 +54,8 @@ QByteArray PlutoSDROutputSettings::serialize() const s.writeU64(12, m_devSampleRate); s.writeS32(13, m_att); s.writeS32(14, (int) m_antennaPath); + s.writeBool(15, m_transverterMode); + s.writeS64(16, m_transverterDeltaFrequency); return s.final(); } @@ -91,6 +95,8 @@ bool PlutoSDROutputSettings::deserialize(const QByteArray& data) } else { m_antennaPath = RFPATH_A; } + d.readBool(15, &m_transverterMode, false); + d.readS64(16, &m_transverterDeltaFrequency, 0); return true; } diff --git a/plugins/samplesink/plutosdroutput/plutosdroutputsettings.h b/plugins/samplesink/plutosdroutput/plutosdroutputsettings.h index a3ad223b3..672dbd4fd 100644 --- a/plugins/samplesink/plutosdroutput/plutosdroutputsettings.h +++ b/plugins/samplesink/plutosdroutput/plutosdroutputsettings.h @@ -42,6 +42,8 @@ struct PlutoSDROutputSettings { quint32 m_lpfBW; //!< analog lowpass filter bandwidth (Hz) qint32 m_att; //!< "hardware" attenuation in dB fourths RFPath m_antennaPath; + bool m_transverterMode; + qint64 m_transverterDeltaFrequency; PlutoSDROutputSettings(); diff --git a/plugins/samplesink/plutosdroutput/readme.md b/plugins/samplesink/plutosdroutput/readme.md index 5ed3f9ef1..b8724eb6a 100644 --- a/plugins/samplesink/plutosdroutput/readme.md +++ b/plugins/samplesink/plutosdroutput/readme.md @@ -59,6 +59,36 @@ Baseband I/Q sample rate in kS/s. This is the host to device sample rate (5) div Use this slider to adjust LO correction in ppm. It can be varied from -20.0 to 20.0 in 0.1 steps and is applied in hardware. This applies to the oscillator that controls both the Tx and Rx frequency therefore it is also changed on the Rx plugin if it is active. +

2a: Transverter mode open dialog

+ +This button opens a dialog to set the transverter mode frequency translation options: + +![SDR Daemon source input stream trasverter dialog](../../../doc/img/RTLSDR_plugin_xvrt.png) + +Note that if you mouse over the button a tooltip appears that displays the translating frequency and if translation is enabled or disabled. When the frequency translation is enabled the button is lit. + +

2a.1: Translating frequency

+ +You can set the translating frequency in Hz with this dial. Use the wheels to adjust the sample rate. Left click on a digit sets the cursor position at this digit. Right click on a digit sets all digits on the right to zero. This effectively floors value at the digit position. Wheels are moved with the mousewheel while pointing at the wheel or by selecting the wheel with the left mouse click and using the keyboard arroews. Pressing shift simultanoeusly moves digit by 5 and pressing control moves it by 2. + +The frequency set in the device is the frequency on the main dial (1) minus this frequency. Thus it is positive for up converters and negative for down converters. + +For example with a mixer at 120 MHz for HF operation you would set the value to -120,000,000 Hz so that if the main dial frequency is set to 7,130 kHz the PuotSDR will be set to 127.130 MHz. + +If you use an up converter to transmit at the 6 cm band narrowband center frequency of 5670 MHz aith the PlutoSDR set at 432 MHz you would set the translating frequency to 5760 - 432 = 5328 MHz thus dial +5,328,000,000 Hz. + +For bands even higher in the frequency spectrum the GHz digits are not really significant so you can have them set at 1 GHz. Thus to transmit at the 10368 MHz frequency with 432 MHz for the PlutoSDR you would set the translating frequency to 1368 - 432 = 936 MHz. Note that in this case the frequency of the LO used in the mixer of the transverter is set at 9936 MHz. + +The Hz precision allows a fine tuning of the transverter LO offset + +

2a.2: Translating frequency enable/disable

+ +Use this toggle button to activate or deactivate the frequency translation + +

2a.3: Confirmation buttons

+ +Use these buttons to confirm ("OK") or dismiss ("Cancel") your changes. +

3: Software interpolation factor

The I/Q stream to the PlutoSDR is upsampled by a power of two by software inside the plugin from the signal coming from the passband. Possible values are increasing powers of two: 1 (no interpolation), 2, 4, 8, 16, 32. diff --git a/plugins/samplesource/plutosdrinput/readme.md b/plugins/samplesource/plutosdrinput/readme.md index 291f41874..351e7bceb 100644 --- a/plugins/samplesource/plutosdrinput/readme.md +++ b/plugins/samplesource/plutosdrinput/readme.md @@ -86,7 +86,7 @@ You can set the translating frequency in Hz with this dial. Use the wheels to ad The frequency set in the device is the frequency on the main dial (1) minus this frequency. Thus it is positive for down converters and negative for up converters. -For example with the DX Patrol that has a mixer at 120 MHz for HF operation you would set the value to -120,000,000 Hz so that if the main dial frequency is set at 7,130 kHz the RTLSDR of the DX Patrol will be set to 127.130 MHz. +For example a mixer at 120 MHz for HF operation you would set the value to -120,000,000 Hz so that if the main dial frequency is set at 7,130 kHz the PlutoSDR will be set to 127.130 MHz. If you use a down converter to receive the 6 cm band narrowband center frequency of 5670 MHz at 432 MHz you would set the translating frequency to 5760 - 432 = 5328 MHz thus dial +5,328,000,000 Hz.