From 1f8454095512cb6c7b361378c5a62734078721ac Mon Sep 17 00:00:00 2001 From: KubaPro010 Date: Sat, 21 Oct 2023 11:56:07 +0200 Subject: [PATCH] changes --- src/Makefile | 2 +- src/pifmrds/fm_mpx.c | 4 ++-- src/pifmrds/fm_mpx.h | 2 +- src/pifmrds/pi_fm_rds.cpp | 8 +++++++- src/pifmrds/rds_wav | Bin 48820 -> 48384 bytes 5 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/Makefile b/src/Makefile index a7cc023..51ad9bc 100644 --- a/src/Makefile +++ b/src/Makefile @@ -60,7 +60,7 @@ LDFLAGS_Pissb = $(LDFLAGS) -lsndfile -lliquid $(CC) $(CFLAGS) -c -o pifmrds/rds.o pifmrds/rds.c $(CC) $(CFLAGS) -c -o pifmrds/control_pipe.o pifmrds/control_pipe.c $(CC) $(CFLAGS) -c -o pifmrds/waveforms.o pifmrds/waveforms.c - $(CC) $(CFLAGS) -c -o pifmrds/rds_wav.o pifmrds/rds_wav.c +# $(CC) $(CFLAGS) -c -o pifmrds/rds_wav.o pifmrds/rds_wav.c $(CC) $(CFLAGS) -c -o pifmrds/fm_mpx.o pifmrds/fm_mpx.c $(CC) -o pifmrds/rds_wav pifmrds/rds_wav.o pifmrds/rds.o pifmrds/waveforms.o pifmrds/fm_mpx.o -lm -lsndfile $(CXX) $(CXXFLAGS) -Wno-write-strings -o ../pifmrds pifmrds/rds.o pifmrds/waveforms.o pifmrds/pi_fm_rds.cpp pifmrds/fm_mpx.o pifmrds/control_pipe.o -lm -lsndfile -lrt -lpthread -L/opt/vc/lib -lrpitx diff --git a/src/pifmrds/fm_mpx.c b/src/pifmrds/fm_mpx.c index 2435b93..9c4cc2f 100644 --- a/src/pifmrds/fm_mpx.c +++ b/src/pifmrds/fm_mpx.c @@ -137,13 +137,13 @@ int fm_mpx_open(char *filename, size_t len, int raw, double preemphasis, int raw // IIR pre-emphasis filter // Reference material: http://jontio.zapto.org/hda1/preempiir.pdf double tau=preemphasis; - double delta=1.96e-6; + double delta=1/(2*PI*20000);//double delta=1.96e-6; double taup, deltap, bp, ap, a0, a1, b1; taup=1.0/(2.0*(in_samplerate*FIR_PHASES))/tan( 1.0/(2*tau*(in_samplerate*FIR_PHASES) )); deltap=1.0/(2.0*(in_samplerate*FIR_PHASES))/tan( 1.0/(2*delta*(in_samplerate*FIR_PHASES) )); bp=sqrt( -taup*taup + sqrt(taup*taup*taup*taup + 8.0*taup*taup*deltap*deltap) ) / 2.0 ; ap=sqrt( 2*bp*bp + taup*taup ); - a0=( 2.0*ap + 1/(in_samplerate*FIR_PHASES) )/(2.0*bp + 1/(in_samplerate*FIR_PHASES) ); + a0=( 2.0*ap + 1.0/(in_samplerate*FIR_PHASES) )/(2.0*bp + 1.0/(in_samplerate*FIR_PHASES) ); // a1=(-2.0*ap + 1/(in_samplerate*FIR_PHASES) )/(2.0*bp + 1/(in_samplerate*FIR_PHASES) ); //ORI // b1=( 2.0*bp + 1/(in_samplerate*FIR_PHASES) )/(2.0*bp + 1/(in_samplerate*FIR_PHASES) ); //ORI a1=(-2.0*ap + 1.0/(in_samplerate*FIR_PHASES) )/(2.0*bp + 1.0/(in_samplerate*FIR_PHASES) ); diff --git a/src/pifmrds/fm_mpx.h b/src/pifmrds/fm_mpx.h index be43d2e..cfc7775 100644 --- a/src/pifmrds/fm_mpx.h +++ b/src/pifmrds/fm_mpx.h @@ -23,4 +23,4 @@ extern int fm_mpx_open(char *filename, size_t len, int raw, double preemphasis, int rawSampleRate, int rawChannels); extern int fm_mpx_get_samples(float *mpx_buffer, int drds); -extern int fm_mpx_close(); \ No newline at end of file +extern int fm_mpx_close(); diff --git a/src/pifmrds/pi_fm_rds.cpp b/src/pifmrds/pi_fm_rds.cpp index ad58ea1..c4fd665 100644 --- a/src/pifmrds/pi_fm_rds.cpp +++ b/src/pifmrds/pi_fm_rds.cpp @@ -228,6 +228,7 @@ int main(int argc, char **argv) { int deviation = 75000; int alternative_freq[100] = {}; float ppm = 0; + int bypassfreqrange = 0; int custom_deviation = 0; // Parse command-line arguments for(int i=1; i 108e6) + if((carrier_freq < 64e6 || carrier_freq > 108e6) && bypassfreqrange == 0) 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++; @@ -268,6 +269,9 @@ int main(int argc, char **argv) { } else if(strcmp("-ta", arg)==0) { i++; ta = 1; + } else if(strcmp("-bfr", arg)==0) { + i++; + bypassfreqrange = 1; } else if(strcmp("-tp", arg)==0) { i++; tp = 1; @@ -311,6 +315,8 @@ int main(int argc, char **argv) { i++; if(strcmp("us", param)==0) { preemp = 75e-6; //usa + } else if(strcmp("22", param)==0) { + preemp = 22e-6; //22 } } else if(strcmp("-af", arg)==0 && param != NULL) { i++; diff --git a/src/pifmrds/rds_wav b/src/pifmrds/rds_wav index 3e36a89e5a8582d7778ec35624d66c1416754790..920b01d2183c6ff7c54ebeabd84dee958d73dcae 100755 GIT binary patch delta 11169 zcmcIqdvsLQx!-$c&Sb(QFnN;%GLuX&0RjXQE^jg@j{pG^k{|-D;H9o8ps|e#31w2n zHZ8;kHq;={i7mBMQPG475-_c{qNOfuZLiix!y~sr$rxH_X^ZCme&@_d4(aOs=dQcg z`sRCo``eGR_dfef+vm3Wf7qIak2y3%ib5g8l$Y`25L%(|iD;24Mu}`8g{W@w3en`1 zfE~Bo<=h8upLfSIY4XC3UmQ<-boHMe{$yyu)*~ywH?3+<|66H}B2{7c#Ql1Z{$2H;<88G- z`rTJXDBc;y58nh#f+d z0tb^dAu1?H5@I>AONdp(=%Urc9wF8eM+;F!JVc1~#K}Uq0^=@zD#WL*`V-xb&T(Ci z&QRCT&hK`*dQWz>v6;X8?z#B4wx4Ue*4|~(hb;7gYwf{)#XgH-mxbPLp|@J-%@(@G zLa(>bYc2FD3tiDq2e+Rq>1Vc|n`5D8Sm;6vooAu5E%XQrooJzBEVRQyU;i6=#TDtI zE9xh%59BiSSoD9&GIcTf)te8GkYdgujM51yT59dWhACBb)hUib-aXYORsnAWWRH}> z1?U{1{xIa`A?@i>)Vrium9CQA8JcU96xC{~+pk@K&jq!{U0_hHd)zNexw*A0cD_y4 zx9%BMC!;rGT(7}wSL?{Qv2t$7=Y5~_&K`Hsvu#{Y>DEw}2$Y@+oLPL%DH^()J^QLK5>Fe=<_S8v6S38J-sXt#&Da$$0yXlv)6o(c85mfv!A>n$y3J=3DX zu5DAoukQ`@yit2C{8sIiu;(9_!*A3bUGlSap~cR+oF#8O`|=Wo`_r$EhGX2h;h4G^ zVd4IEIBMIs!>l$?cQ}019qJM8JVU;>AzTRgkvhoMH3Y*^b)&=4+eU{M90#t;2}dJH zwA&X(@UYVz6%M$M=#}meVqr(!i{U8u^nTfQBeDbQLOsRq!@5t@-pR0u?zd@**r*Re zJyFvqhxd*R^}KcO%i+^s4RvL%E^j&ST-VqWv$8QfchTXnHoYKhTND+ZTQ@bVt(+R( ziIy)wmuk}=4Qq?GhHcXud$fOkEBrXJcPwh`iK@FPEb1D2e1UoAwjB@kuqU>uHHj&+ zzX6LV_xSK*I`;MBX!gkmhr^FTE(2T7&Hr>3BJA%O>dry`)rUX2-uLMi=z{84;%)Mb zicU&jvn�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 delta 12265 zcmcIqdsvlKx?gMG*j&^N0&)@dhAoMPxJjM7plr+(!3!vwCNo~r!qU7%j*7LVoTAjk zSypB`P~&O3SW(y`j#@qwP1blCJ2{h6odzV%Q0YF@WI1Jr^ZR`l_~bd~dFK3a*7Lmk zy{>n?>+-Gje(T#?zqcL!(N>o<{F5jtMhhV>G~>r1oTG(LM2c*YC58wo#M(fn5P?hy z*gbifD<52b=I-ZHWasX;j>QLGFSu#Jp&y?w828eh_x|La@X>_v>(m}OMi#1fBDF&wIvp)P=s>U9Y7nF1q$PTs6J}}KRp!EkP z15ExSwbb#RbN$klcdbyl&fnc)Ll>k#4}}L>A0U3^%6{x;t`QOS@fLkoxoWB>xd3VYkf!m)?KacuGc&2vM~g|-*rCj z-5uxaE+6kO=~|r*X^O2D#YPLg)$A&3cUtIHlOBv=IcGAU&sgYFYLok8`7<>y@)o&J9gTeBx>Bzc zQx0L~PDs(P*)F(9D=)dk0?0eZ*~FD}DUv|90GOGTQHColcb(JxZsVRz@F@a%)pYziBqPt!d?eY8kl|b9@Xj5+P1^lV4@kott|z|Mq#Z)ZY| zXJ^6)F|R$iy)pcv`e|Hh=6kU8IqEwco`$yZKX!ka9X!y{wy6Fh`MTnWu-l>b#SITN z;nDoWUf+=olY<4@TK{uj{lzx}4Q<;dH?(=i!)*K5@aY%oFTTC`a`>Ii--JEie-(ba zx_Q<+cht{xRS%u@_LE0u(cRzv&>W75&JM>^=Z8h~!{LbS4~N-ou(~mPGP?evh|baF zFVu!dLw=$fvO8)+;fU(t;i&Dy!^OvdtA~c8;3O*A7l!k&D>@<^jDAgPbgvM_C#zox zM?_EPkv(R}4&70Iu_(Gxs}phTde}tw*gQ^~7hVao-spoebtG~!m+JTXbC~au_ z+n3E@Jm_E4Wpn7j+{X&hx#0&i?CZfc4j}^Dre?+uiv07H?k_{I*s4~?&z5J^iTKo| zHyJe+^}!#)mNkFZ-TlShJgg+4I^Kj#1RC0XzMbbio`&`p$&1opPx+ zY!>RA%lOx}O7IV;aS2|zUM)=UhlYT^ANpeG9ipMl9jxsLo`J9JCoXi=oal6;9d|6& zoUfsc?LDmdZ*9K_d(vDC%RxVA(6@p<8>sJa!d@aC5l|hcMSaI@(04(15A9xP46gt! zL_;B*qWmekP{X3DVBZrgpBGeIJ7Pubx-*k>xi6^W)&d>({GL=}6KCWu@JX>2uorN) z7|%Gi=q@~h9`K!j7Gm%L;8t(btBLz;@_scld8j<3?oNJr#KIpiY9|}ommsR+h;|1!39rIV$v?EG5p41vZr z5m+)=in(oTgxF^jv2E)hA2@PNTkL=}Z8l%9)$3b-{yyJ*IBpu+ZC~voZmStE7em|7 zT2pX?Pa3oYUDJPVNLNgPqQ7n=LD%#%Doljjpe5*<7(<>9xj{?NHPMEA0^|lQLDxhX z^6`)xv;UOVBkDhWvWS4O)V(aT)TTKyJ_ybdA%HkAd8v zCFmN5As-Dn=@5oRf~m0^icwG)v;GR>hypHiPOeTWh~~>>sxl76-L?koSBtM+ikM-O`B|JLNbHr zrL6rQ-Q7`ktgE}byT5b=PjvoL*jw$M!dCjRLGH#HSo(eUmo_98sv>oWEKxP7qg-7c zEKN_-Z&UwlcOL5O4#}pcynl$vJr#}p6Cknvn79$g8<>e0QYTR!Aq7$;u_RsPj?9hS z=8yszme^xMt_NJKR*&@Fa0V3eCV?DDATJZ!TvDS~0W()b&Lsu{kRply>h4|>19>;F z9Xz&$HSam4ddi#k%RtPEC1~&e9hz1LK8wuY37=y_2u49>i3DLcg2euTaz?Emf4wsp zC&j9!m&W^@a+~_Mf}hDol^1+7tu|7MuQ4t2F&gQz)Umtn(dFr~%=U93(ppq(VQNAZ zhBO+^Aa&ZATtIV96&A+lwW8r6(D*t*1VE%+29XcqUEQ10&cuc8s-W~mss{=u%1YHz zm=S74yGvnNfVR=D?QXca0NI_I8xWg8EY_7yJM$comV-!s0r6H-%(MsIWnQ|RBd3eB zpkeT|X~3MwG_bixi?j-}GeJO zKqXAelvC8$X+HceoHo?vi&ghc^UDVH%(Qv3PF$^~j#$<(aNF;W!a?AOd!;jJSFf^rCM zMKuUzKqTg?S4-B)Gs-{XQ~zF!i+FVaS6Kw!AsjLq%PnRF-Zw%Z^yM~Wri;t%+BtLO zlPWZ4sQg_0W==+^2}W{c#4D)gv^U`Fh|WPw?O zoTH$3+E3$jOuRyy(T3yZu10q$H zI_*3MQ@JQpu_%l1R`*vt4DxL)2FDHzZ?^ zVzj3~#9+Gor&IK3PojbrF;99kVw*chq+Bp8G%a%gQ!A(V(b_q*b_JD(+=}?69LV+< z)*k>OYix>g&iBpO2p`F4ZVdXV`C)D$QfdvcCSt0Al6(-tA+QyLnJCF}ZLDTs!)nG# zlKZRFy7`rIm-=YFU)HGqnm<9Nsqr@rm9ML1H;oE?i&o_hPZny}3Vz`JZM%+e{!!v3BC7`~LEOp4rf<;qbvPdU6x1CU)q*-bDh19+F_ zK{OnqiDEbS?UXH}ESF~QfPIUijY2-Ih4CY}OO$MaB%U@42MRG;l`Tk|_y(vG0N)vI zMVP{UaU9aWK=c8{Zj85gHOBhMSjv-dM0o)IJvih7>fnM2&cmSc)n^Mboxudkq8BbK zsluc;fWz8Fec7D!>lh(&e*x)yRGtIyQ898iBq4D308*Ysg(A#^HsNT?-+)<|t6pB1 z8fXT!1gciJ(Poe7D(two`#TNgV4Sg+=zRrpuYR^4&4KV&A;kS2FRx(ObV%MtN?ApFZg>;loE zHB}~qc>e6Ww}w*XTx?zbjZkwver!g&j&?aF$?ilco`W(u-XQ#=L2#c~X?khJ;bT5q zJOY#R4O3k5tmZ~k?4HftV?Qe76+X!oT%0)`^D+#pv?PW)aUCa`+b!k=mfV@NS$+)j z`AfhkPVi_xO+~6@(W`^UdEkaHW-6wi;EJ=yjM)ImhNg!qs@&1zaz#OMe)66D?fsj6 zSUy|I#-@^612!CpTPiE1tZ3?3dC4jFHGRBhrj)^^Ve6*Lo0DA98GEZUCC`~H1{$6IoZc6t*q>WBQ3A@GOn$o=uC!ok1c< z$>jcyM=(W#*-!-_38&c<2qyP;Z?iojr}X#OcJ#+4mSgBERP5%FIE@Q8Pl)x!;R0VeFz4%8STrIk zZL?E_)x|i+cT`u{a8P_vyUvU*ay z^VLs5M9gx5&1!DSb%FJ_5{fOFvXrPRq|x)}Xp81(9?=esEG5$2&og~sQKBqIt=n`j zL>o2oX4cfrZ#K@3 zvDOq~>s2+$TWgZnYu5Cs8TFw*-`Xa5YfbWc&G%JWA=ljut#hL`<6$CMtFhOSCAqg( z%ayrD8#2w95cyc_Bi_0paZ z%iI_~{edLq0pNio%GbzpqCEiJhSXk7QA%`NBg=_C0q8cQF6#=S7B%tFiTP$TW%Z;6 z0-VCm+b)u(|FU{g&-N-wwm9%uC#ZtQBGuVP)2}xj&9OS-%ZSy{oE}F~%+Z{vVULxC zSl1=Atf;59Tl8d1(B=amDMb!drX1vIEpNoLXq=z~jS5HDmk6GdZUPI<`bw z^N*d3wEnR07fQ+Z&IQW1H^bEk%3)U-dws5aXtrpix@~X#V%p3FAl_mOObOCC*3u=$ zP#px2{hfG5nC*qCVQ2HbIL+ua9)G4*4SEIjl>JHZ)GJZ`f#os!96> zIhVt-R?T`MV3PM?EAPx!TELXDmxpPXd%V9Kl> zOqn^#*1El;O)496vmbylF&t%eQ3d9 z)8xI=0wc2>46axLi{$|9zeKkIqQrWk?UJta9#dhfgr-V2H0x_vP2AOAMI4ALSc|NT z2_928W@uVwhV0BN)K>xa0~!HlVPcDHP>tM`(6stMwhXbAjQ~z?Ex_FFn3|b|8TVnp zaX<^;6yP*~!-@MmeVS3%EdPxCDbzcM@9Ns9{WBFgK}nVdD?oG9w*s~SS^#i(mA@hc zRSGBvQ~)^ss{m^O>^R=!^`@Coj>SpJBb$i}Pvgd(rHp3~dJhg=W}AaylMToL1OUu5 z|F?RlV1F9GL!2pyS!mD0ztX8Sgj;Z*@-+lQykBRr zTQN#y505u>6#j38#jd@?VGuJ_=2NreMz!v#zZUYfLofZrbP%R7#!};B@a}2Vo6dz8 zpy@ZN-A{W%Nfs-71QsT5!v_j_9c|Ii0B`n@7o+6OE(mntAb7Jl#8=(aR~Tbp+T%Xo zFzGKY;J(1L$ADfeBUy8iO#Xvd`sB4oay1s zZdF+Hw6C=AxJD6`D&t`47{;@Oo03)%HP8IEqnCc#ab)tQ=N6TBuppLSflRA)AWx~9 zgR?`t4lt$k9gk}OlV=pX7BG40gSa#|dFm@HJoS49T&-`g@YH*78K9SbjD4BlU4ki~ zL5_uI0|5(9eWit`p0^Hq(I?|s3r~HcihX8Lh!k%gtd@fJ2Iww>UPorQl7751oCo_PZwHrD;d8{!3sUi5D9CQL8- zqf&&6FjLRq9D{m!28U}iU5$r^dfw6NMfcaxhv(hCUK06`sR7SsgbrD3)TTP6nud?vpp*}mvB@%~OiqOs{Jt$m+i=eThZyLmg%xd_6PuP8>NKjSl!kqPWvy&j3Q7=w}j0{jY$#V8DMeuy_!_ z0q|XT+<2YG9z55_!8?8UbKv<9nfC4A`9BT{*r6`)+E=qk@`)kAKX{n;gKQuMd?OkR z8Vv@)pS`&^ph4h!156a@;Q1a2q%|<7PlxtgxA8l6EdBy0BqB18lQ>&{ zQ2+yLgC*c+pa)xx1}eat7o2o>8~D>$v&TSM58owW6wcwt;7`MTD`*b!m*DwWatbmL&_BTM@2Q_C z?3OhV@?cRg2{H>Edi(Gb!1GHY{Adl#?4w@_p5G?}nm$pivgmz~Rf9LrvshcAsO{B< z&|@JUgW!;*fqmeaH|Pxx5YK@RScZ^yVP;|d_rdcX#SHM{KKhH`xzYKsj5tN#g6E%# z9848CWG-Z4+^Lqp8K;2%JT(g&$m+wNgd^)38P!K0i3ZF>iT-Ycp5M@!&|%e!Ii@{R zRW@*oDKPjd@YV*lfVa-+!{B?LfHGlk)QA{fAH;F~QY^agky2mDN}MRbY| zEYIx+;LXnnbnqc~esMO3xD|Yh#o-0;m*KDryE#YnJMd;<2V;@jngMeSq=83X5fW33 z2(N{}Jd8L;%-oq+Y=uJx!0g&AJ`l^mn;)gAUjzQ6C7?|fdj{}OAKrri%Oi}_F3uJ$ z4#I#ZY$>`(hew+3d1-^~y2be3aM#LFxobqOPA$Icj+JXE4J@u&aaWbNt8(S7Rbuh- z4Xc+gUUlcj+%@X!#*qGJ>ZV&?DV77QUoKX!S*~7w_3nPAY!&?|f72!RVxu87=cHWrum1Qk>9q`-T5@EEY*iPJcq93Gu?K_Lr4pLGk$kz>h8`5FiQxEZ@gCOV zB(*9+=j7vS-oay8{#VYkmvph! zTH?D?V}hE0G~LDh68|FFd^FR==d?0iJq=R-zq@)DBu`!olhPqDRo1Q&WJ#Z}3c@iIumZ}$z`JEXngxIY9bj&aJ ztA89D>O8mw|HDvO$NkP@wL%kse+QEfP$Ibur#_Ex;a_%Y%5PpY