From c1a3409af3acde6c63d5f25c30e7872e0319b253 Mon Sep 17 00:00:00 2001 From: KubaPro010 Date: Tue, 5 Sep 2023 17:50:12 +0200 Subject: [PATCH] add a test file and some stuff to pifmrds --- src/pifmrds/pi_fm_rds.cpp | 40 ++++++++++++++++++++++++++++---------- stereo_44100.wav | Bin 0 -> 1230892 bytes 2 files changed, 30 insertions(+), 10 deletions(-) create mode 100644 stereo_44100.wav diff --git a/src/pifmrds/pi_fm_rds.cpp b/src/pifmrds/pi_fm_rds.cpp index 210291e..76e81a5 100644 --- a/src/pifmrds/pi_fm_rds.cpp +++ b/src/pifmrds/pi_fm_rds.cpp @@ -27,7 +27,7 @@ ngfmdmasync *fmmod; // The deviation specifies how wide the signal is. // Use 75kHz for WFM (broadcast radio) // and about 2.5kHz for NFM (walkie-talkie style radio) -#define DEVIATION 75000 +//#define DEVIATION 75000 //FOR NFM //#define DEVIATION 2500 static volatile uint32_t *pad_reg; @@ -58,7 +58,7 @@ static void terminate(int num) { delete fmmod; - pad_reg[GPIO_PAD_0_27] = 0x5a000018 + 7; //Set origial power, just in case + pad_reg[GPIO_PAD_0_27] = 0x5a000018 + 7; //Set original power, just in case pad_reg[GPIO_PAD_28_45] = 0x5a000018 + 7; fm_mpx_close(); close_control_pipe(); @@ -87,7 +87,7 @@ static volatile void *map_peripheral(uint32_t base, uint32_t len) close(fd); return vaddr; } -int tx(uint32_t carrier_freq, char *audio_file, uint16_t pi, char *ps, char *rt, float ppm, char *control_pipe, int pty, int *af_array, int raw, int drds, double preemp, int power, int rawSampleRate, int rawChannels) { +int tx(uint32_t carrier_freq, char *audio_file, uint16_t pi, char *ps, char *rt, float ppm, char *control_pipe, int pty, int *af_array, int raw, int drds, double preemp, int power, int rawSampleRate, int rawChannels, int deviation) { // Catch all signals possible - it is vital we kill the DMA engine // on process exit! for (int i = 0; i < 64; i++) { @@ -164,7 +164,7 @@ int tx(uint32_t carrier_freq, char *audio_file, uint16_t pi, char *ps, char *rt, float deviation_scale_factor; //if( divider ) // PLL modulation { // note samples are [-10:10] - deviation_scale_factor= 0.1 * (DEVIATION ) ; // todo PPM + deviation_scale_factor= 0.1 * (deviation ) ; // todo PPM } for (;;) @@ -222,18 +222,18 @@ int main(int argc, char **argv) { int rawSampleRate = 44100; int rawChannels = 2; double preemp = 50e-6; + int deviation = 75000; int alternative_freq[100] = {}; float ppm = 0; - + + int custom_deviation = 0; // Parse command-line arguments for(int i=1; i 108e6) - fatal("Incorrect frequency specification. Must be in megahertz, of the form 107.9, between 64 and 108. (for UKF radios, such as the Jowita)\n"); + fatal("Incorrect frequency specification. Must be in megahertz, of the form 107.9, between 64 and 108. (going that low for UKF radios, such as the UNITRA Jowita or other old band FM Radios)\n"); } else if(strcmp("-pi", arg)==0 && param != NULL) { i++; pi = (uint16_t) strtol(param, NULL, 16); @@ -260,6 +260,23 @@ int main(int argc, char **argv) { } else if(strcmp("-ctl", arg)==0 && param != NULL) { i++; control_pipe = param; + } else if(strcmp("-deviation", arg)==0 && param != NULL) { + i++; + custom_deviation = 1; + if(strcmp("ukf", param)==0) { + deviation = 65000; //i don't know the original bandwidht, but when testing on an UNITRA LIZA R-203, the sound doesn't sound out of order, correct this if im wrong + } else if(strcmp("nfm", param)==0) { + deviation = 2500; + } + else { + deviation = atoi(param); + } + } else if(strcmp("-rawchannels", arg)==0 && param != NULL) { + i++; + rawChannels = atoi(param); + } else if(strcmp("-rawsamplerate", arg)==0 && param != NULL) { + i++; + rawSampleRate = atoi(param); } else if(strcmp("-power", arg)==0 && param != NULL) { i++; int tpower = atoi(param); @@ -290,11 +307,14 @@ int main(int argc, char **argv) { else { fatal("Unrecognised argument: %s.\n" "Syntax: pi_fm_rds [-freq freq] [-audio file] [-ppm ppm_error] [-pi pi_code]\n" - " [-ps ps_text] [-rt rt_text] [-ctl control_pipe] [-pty program_type] [-raw play raw audio from stdin] [-disablerds] [-af alt freq] [-preemphasis us]\n", arg); + " [-ps ps_text] [-rt rt_text] [-ctl control_pipe] [-pty program_type] [-raw play raw audio from stdin] [-disablerds] [-af alt freq] [-preemphasis us] [-rawchannels when using the raw option you can change this] [-rawsamplerate same business] [-deviation the deviation, default is 75000, there are 2 predefined other cases: ukf (for old radios such as the UNITRA Jowita), nfm]\n", arg); } + } + if(custom_deviation == 1) { //dont hurt me, ik this may be not important, but im a python dev, not a c or c++, forgive (notice how i said "may") + printf("You've set a custom deviation (like not the default one), the RDS may be broken, just a warning"); } int FifoSize=DATA_SIZE*2; fmmod=new ngfmdmasync(carrier_freq,228000,14,FifoSize); - int errcode = tx(carrier_freq, audio_file, pi, ps, rt, ppm, control_pipe, pty, alternative_freq, raw, drds, preemp, power, rawSampleRate, rawChannels); + int errcode = tx(carrier_freq, audio_file, pi, ps, rt, ppm, control_pipe, pty, alternative_freq, raw, drds, preemp, power, rawSampleRate, rawChannels, deviation); terminate(errcode); } diff --git a/stereo_44100.wav b/stereo_44100.wav new file mode 100644 index 0000000000000000000000000000000000000000..dcd1d5829d92764a2965340b3ea4a4a4814d1280 GIT binary patch literal 1230892 zcmY)1clhR2ndkXmC4wNRU_elcAc#3Q zA9KusUwh2T8#le-=s)<=f3@*ZD=RB&R@SZ@^_i8GN1eHLW&O&dR^IjYfA#j2+U!!@ zBUjdyu8-E1U$ZFNby2>$Dt$z>)5^Bh4J%t$%l7};TCS;V&C1RlukUE3G1f#omfv+T z&bs=oU9{P$TJ4nYzOuTy$I6z~y&G?zj-Oa>>E4y^wJ2L%-B?@n#KwDU^^a?0v}f)1 ztlgt(=b9c-8QP)z`mSon#@(@c*W-Tut?PK|*OXgRt2HYRbp7|PuCCr4-P!S-9shQ9 z-O3&1f72cQqT`=-d~5Z$uWnua?V|0<%7fLdX-xOx8Xnnb>&kDdd~N@4Se#*PSK(aR z&N&|{e|Ka4Cc3Nq1B>I8mD^Ugt=<~_wBuVB=U%sRPgnmyqk6_WHs+(FJsamSoniOL z``D$?cdOj9^bVZwuEx2oYjw>(UW~cA`t!#4W#ir1c=wjyvbfp}r5jf6tB?D-vvc1b z{bu{U-d6gH>V6jesBx}a-LiUBW#6p-*P?IM_Ug*NU)c{kzBTg9?ulm1mCm`fbGt9& zY+LoQiSN7%7uhswBuHi?G;e5A5 zH&u>qiGI-W_0biz|7yqIsQot@<7?43>i4Zk`6bm~P}%v_pIdr%$LH1W!qUs4Z$(#E zes$+@f8Q>z{QUY})bZCU|4#XDS9V4DZ!X5&y84Ckm(=#6$}d`+$MMkS`fctUUx>a@ z{dcRswz8X6AL<=#DRs~5R=!yM7aQX%9lPhRl>cV*o!VX%U0Gk}{Z{R+?A=`-{iuGP z?@wy)o&O?||6%Qa+WEbMUvzA4{iHhc%X>8^Y|+Me>sEf<@dI6(m9n9^ zwR0=$kt-Wk_Gl$Nskyg*b8g@0$tw@FP9I#|uXg)Yen4eUZDu{Sd3iwd^hwdai~P3L z{j1+6+N<%NT>A9NUl_f3k*=;jr}Ae;&#vxy(M#(4($4py(ib-F3m0|kR-Rhf0ny%F z)1IY|t^NtsKe2J1*twq+?cen{-&3l4M*W^&{WEL3fA?@e$A?t+tm>X0y{K_s935Ku zQMEg+aZaxOl;~B_akV+RzDGqz*6x^&Pp!?HJJ0WwzP5g+RCY?~@6;ZhTDwzf|GM&T zs?A#(_nqa@JIcQ;dTaFdj^7>qY5m_@`*)YVqjA*#ZlwQ-(ecr%8|U@W8_U08an5yJ zA6i{KwfjZd9u*y4{^h-!=awE^TlaimTM2x7KglDqelt_VS-shcDm-KZ|ay z-><6wW$Di&Yr{OZK4#slt=zmH{`;HKJ3GET(*CB#_+De8TN>v_9bebEu8i=m??p=< z_KijPtUKd+^xw;WIQm$m?gO>?`||%-U&o)R%{d*P*E!Fx4BxuA{1-d_mplG)Z7!?LrIlY$ z`B{~Jy7JSavpW7<#}~(!zSi2uhuzl|aR7Y(>$Ul2_1~_Y>&K(7jIQZ;>B^sVX-boC!im! zZ)J=uUz>bi6F;LHk?|Yqvo4)yH63Z|g4g10PwseQV_MJ8ik`nn*Q^{=I{bHa^;xxf zZsR_?^cjuy%*gu22cO?Lp4+(3Ew%oiSJ~65-?y?S)MoUI^^0qHT=kEso({JmqEGpM zw+J72T6NDW|D5_BT+NfqKVdsPx#RuHqXQP#wo)EX##>h7`}hq0zoqNkw)*ti;W@5T z9*=rq`Ij!*k^$@ES?d?_0H4}aze9U2FRAYfOJA@U2QM2L@vOx?>a(u<^bFLkCYM%| z5oFia)kEsz8IVDTMn~2L;ejvc{CML5wWFu*9z7!3sXFiLQPHCt*E`#zc8^(*#&}F+`tDpG&(w4Dd>>c+KBeU53rb&7`O6~rd05==72B`#kjf6~eh#Ux zXXe?xvUF499#j6<+HY#Cqf1Y!{59p@RG;6A-dx$6BC_M;=(y^RYMfUr$bFN2YgSH( zj;+o!@cf^)c%Ex}C!XQ@&P#S|t!_)#I`ii_r3cq`W3*3sviJ$L*{5sYe?jtO#LOd_ z1)?335}wCnI?rAaeSfcN9^V*`jmVZqbS*nH9^HQDQabi(>;1ua$DPqH%aaxO|MyGr z1$yBRqnkTcMlR5O?yBuQrT0eGD*5x<)-G9cM{Vwp);B&K+x3!b>;^s^m*rYkH5DEU0(TjqHCk?HSTql z-P}Erk8F-x8-w0Szx-KsKiOVRC%w6`@MiDC`?)c?Cc1ht&PwBLS^ZvpzgO9Hi}BaQ z^VcrUN2YwUGP39T+Wok8c(F0BZ*1exk=ZGZe^iP;lI}aOr@5aFU@EY}dR*!e>vFOLfBztD=kL|oJc{S^E>}x!&*5d2(?4HY`HLd_@VOEB_N0#4 z6dR-c%O6tvXZ0q?3%WjC70=dI`po)0tNXHp8_89X<_U-5hVm3_euAQzus+h;UW z_N&e{dzVj)=)KQq46@R-7#A-lYv!E8=jqn?q_K=U*G{&1N8~Kh2M>2W`1r_X@A4^K z+r|ZrzD+O3>z}qb|Jw5E=>#*!yvswnX6NzD4lRA@;(oWS9@ss2&z?VGcX{5(Gu&@+ z9b<>NF8ck(Xy&Kq##Yd7L+@x^{pkH5=F8($ZISEl1X# zoOxwqD1S!x@U-U8A&u*K>1*wfg=E3D*6>5|jRzx`%DTl$V;is}27h_5b?EQG+QM$= z`S{HDTa(`@y)-&E`h5NAx?ik*bLrUP+g866C-`#og~~2!oC~Tyr}Lc^om>8Ml_|%k zzgXFq8jD?iS!EYTo1@XE+3Q=vK_bLG-zf&xk%(o%6tVoRdv-S?BtC_Xy8Gm)FMgg!8!mtE>NR z*K}ib?6L zm(pQ&tL@I6cZbT>)z-gtmD49-i91C*FY@rb!8O?qbj-)KGDeQjTeq}UVH|^>KB{rx zt!wMMp_Q}Cg0?NLgZv>w@B!;5>8vo}qg`w7xH? z{P~sB2gpY}*!#mP_wIO)+Q3=NU-OtOhX=#J={gTCRt!|d+F_T%dg(Us(%}!+mcKHh zSK&AKA>82X=-m39-7&rPL)FnY;RJZVxvin|JIi^cbX7X!M=SqiXFoGKtM>Zhm27!< zs&$BeeXBBh?^nAjybBh4Ms;`yoD{G9YS(jB$2Tts-npi+R?=T#9xE&Fk3LZTL(ysV z$B)je%sJs7r&aEHKGM19%J35X{@>_tE5q05#s9GV`0p3(*Dm-z-sqa)5HJV$53B(% z!b9l2a0vJa9(+;x3m4Z7n_XS~Zhc`x*Dw05ODBd$;ZfTbdNFMEVGI@@8~X+3j_;6Z ztFBw9_d zR+7{7_N@z@`{th0Pdl$`B=6n()`%a$b7H%FH!@GZ8(q8TOMhR}J-PO|Zn)B~8uQMs zb?%ElXY4$>1fLIGV&~TVE~Ty)55|w_yl|C+x~I{>=%p(Qedwu`;g2tAgqOxI25*49 z-~$^Lx*i@eST(&BCh<@@*_LeN!4Y6B_|MC`L%6JQUb?6sT?q#Lis*>i9pCv*F2#Re zRSIuDt~`4lpTke!)URwj{7L$<+Q3F0#&uQ}b~;^@p0fY$V>4v3oeWdm$I-(o1>p;_Bfz@En*vU3sZL!xZSf z`*po^Q937I!GWEd4th}IJgsr1^!%rkKCkhO3CAI`o?V%-pV2iO()phnZS44Qjln-i z-zD=NACaL$>zb=OR6Ekw{N1T**s0@n<+n6{@XBq?Df5+$2uFqyvTLn{A4cDAj@=ON zyRp@9L*@KLS4G!U2X`=E*`)AA*r$1ZP37!T1kdExxw`bGh`ss!<|lpUiV%*kl+ycP z#oAxjIM>$>?}3}%uqb0IkNu6O!e751-BjL~uxq%cHS&wftYPPHZFC~{;+}q9YTe&f zduzor@LXV&bPBi({|_V+CVyY6`JTqPuRQDphw|*KB{~aVCGN08B#$r9Z{Rg_cO$Kf z{PDfAuki)^=gzMGj;`s>%I~W69ku**=N%o7f6=`RX25^uJ-`p#6W)AN?QiK!KkST6n}yw!a7O>S^zj4ZmmXY#e42W%Z?V@%IXpXpCtY-_ynwMdQm{o3;{UK7#9 zUDu6`Z;oA8YJBqX8f7D;)VE^bI_lkRvwQe3+QQh8h(c#9TczH80{53E_&kP zcyu_jgxr7)&=1Ll=hWXd;lK316QU!dO_d+rc=-K^5kDV{cX%yX0=p%5+&6rdEM3zJ_kK`)#~0z9dmdXB z?-Q10j6$D?23moQE|7Dmg*wz6_*{n_kv z^UFH^ax}Uwf8JoR-)-z`qmfUmtG6^hK8pt-{188(t6$u>o6EyT#421Lf4HR-Prjyl za_rLb>0tD5O}CViGa7&fE5=kxi>E{U|K zE1>U|C--lP@P4wz`=*!EQ}`_q84kDD+P`h3d>LYn(7l~kq>^>Cq5rKVxCB4V6PjQA zRxswBBLB#J_0|fWM~B?EmHOmp(uoBbzG)nGDNGmUVC|3J5?;8mvV%ItYuU;#kE{ju zHl5CTvG!*D!5wFfz+v|*Z;Z#bCU)&w*%#efca2Mo&4H)Dqw%Qyqo*}C`}|@4O&?xe z;IOWPoPl}LX`k7cWX~Mq>%-GuUj1R!!4UYy$dF?i^N9MwHOUV;?<*sE?~4|+H9YyD zbXE1rS8GGx-nzg|;3UJ>$)vUM`L!#D^$a`{wgR6hSwNoP?at-g`Z?F8&Z+FsML9p6 z>w!JcukkKE&8-W6Dw$S>@`hmIdsGjv>B0O~IQ`oCK*|cltGKb9;h{%HxERiivkEHY7(G0q$ zvZXDIkJ6pLUp<|Qu0>zGv2}BOW!CGrtH&qlaAMki70*>wY#eG7z0nlOYz(bYj;WQzgiyV zjYqJJVLEt=n2K*z&-TDK@MC%$KBCOMe6PGZ_lmz?TOT^7`{&=JKhuFn7i4eHQAbaO zsj_{p?7pw<{>6IGvwslL6$gJdHv42Xd>o#=;eX)iU+tI-ac;Jf*uLvK{$_356J48~ z1e>~|)cw=FJrmbHdM=r^esQ1b=)B+VIBq}w;6B{5^WRwBGb3xh zUfx*xu&r+Dx;(RauHtvZt&9yvw!w(JtL6K-q&)r&8^Y7c0`F{d?aTpmQT;BiOpM>x zYxDKmu=&2Q{k~lzyW@u)v*T`#*bVG9z7F!-{AF|88_|Qgy#qzc2;4WHs8g2T|4@dmo~ z%jpflrp_^<0690b3k>${gN)$sx1kNjUt zOlD$Z_H7J0v-iTDAw&0VJn7@Bdwkai_vJ%oGm&+0Hu@m60`5;HvcWf$->KQKTeM5H zVkT(M+nQs1C`g`mz%~_62jiea!VmGn)riebU+0g2->unB50$$+Vvn)ckv?1NrQO!X zxxGBw+L%9W?4MQhlg=|Z2OMMTVom+Dc5He!-UAW+L~O>L^?_SH)EIL=>;-e1t+90x zheLPahZd=U!@Hxq7Ux~tdD!O57_HU#GXKB7!Bedic;Ew-dxAT3-Q)z!f=qct$NuP1 zY}VVmeprMt*s-pc-cPR3K$f^H9EIJ_*1xlK@FOuOWQgY>9(wCSf5UU|-COD-ZteSB zfj9^HIo^Vgv8}(>_>S?g>#Bzp3~!zo-tmL2S==*zhG)U9FDX60<1dsKNB51+%fI%e z2#zsW6`sqM7@PwK<)myHXo|)LzVq=bssJN>CSyxefS;4%diK|>6p%acKyz(%^9Vis{GRt z*?D2@F6&wGRj^(7R}uZ1e-ZvLd>&Tfxrjem*L#5@iRCxn;d)|6*eMe?enTlacYAdY zc3v~yTz;_eyz{%FJ0f!%4l(n6_C$!^+PgW0pN?K^9h*;U>OZ!tIkrdhYyV~(o1e`N zSD-f@THQ+`x)B~C280d?A0B++;aCXm@IaU^eN!J8FWw}sKpsDTN<<%{=fZCHuY9Su zvv29ec4Sh{;vwQzSU`AyKX2N5#tZl!#P^ALWYgfwPp-`Y9X~6gm&2EyT{#;; z?7DXe&tYq@IriJ$2Uf6m*MQtR+z2MJZ|#gLg?oEPVnf&=Z~?NxdxRyCBgd2;Upsm} zxqD)COy%@){SH}>Yh2TKbFBwgM(%i)u4~?zdxCk;)yGC)D;yk=X>@tl|CB|Wm9B54 z@dgjutrYLwv$n7-I>fGBbr(GA}f%NJhRYotOvtC^uR(?ywcSXmC3BywDyAa1g zZ@#!OmpU39?1JiH3g?yITtEDc4-l^$U6B5{F8;DE-Z%W1uIGG%&#vwKYZrPpzDf@l zuMBtndVQQ9UTl8~KjO`c>!NRuZcOjRi)O#h=)u~M4O0A=9Jsjl=XPCik55+qiN^YP z=fF2%5^xLr^V6ME9LGOJAE@phYV)_Hf8FulFUs&~KGz59^I-gYHB5u;G4{vjYRe{} zvx*l->=W_?HUZy&SFnND4{QnKJ;B_`6Z!!kG`URYfJ@Oi;AC{tJ(>sJJxq?geZ=D3 z!@AaWWNq3#uwnZg8=KFXWM|T&@HBQJev8brjg`YC#ZB{zvm4F1M>Y0inpcmE_#@0g z=Y|~)erW!Uzmm?hQ|