From 179cd71c54298384891edcf43398d3011beae789 Mon Sep 17 00:00:00 2001 From: f4exb Date: Sun, 5 Nov 2023 10:33:27 +0100 Subject: [PATCH] SSB demod noise reduction. Fixes #1874 --- doc/img/SSBDemod_plugin.png | Bin 61853 -> 62368 bytes doc/img/SSBDemod_plugin.xcf | Bin 205528 -> 217056 bytes doc/img/SSBDemod_plugin_nr.png | Bin 0 -> 9582 bytes doc/img/SSBDemod_plugin_nr.xcf | Bin 0 -> 24760 bytes doc/img/SSBDemod_plugin_vol.png | Bin 7731 -> 7971 bytes doc/img/SSBDemod_plugin_vol.xcf | Bin 36122 -> 30753 bytes plugins/channelrx/demodssb/readme.md | 64 +++- plugins/channelrx/demodssb/ssbdemod.cpp | 24 ++ plugins/channelrx/demodssb/ssbdemodgui.cpp | 66 +++- plugins/channelrx/demodssb/ssbdemodgui.h | 5 + plugins/channelrx/demodssb/ssbdemodgui.ui | 13 + .../channelrx/demodssb/ssbdemodsettings.cpp | 18 + plugins/channelrx/demodssb/ssbdemodsettings.h | 7 + plugins/channelrx/demodssb/ssbdemodsink.cpp | 37 +- plugins/channelrx/demodssb/ssbdemodsink.h | 1 + sdrbase/CMakeLists.txt | 2 + sdrbase/dsp/fftfilt.cpp | 47 ++- sdrbase/dsp/fftfilt.h | 15 + sdrbase/dsp/fftnr.cpp | 148 ++++++++ sdrbase/dsp/fftnr.h | 72 ++++ sdrgui/CMakeLists.txt | 3 + sdrgui/gui/fftnrdialog.cpp | 210 ++++++++++++ sdrgui/gui/fftnrdialog.h | 75 ++++ sdrgui/gui/fftnrdialog.ui | 320 ++++++++++++++++++ 24 files changed, 1114 insertions(+), 13 deletions(-) create mode 100644 doc/img/SSBDemod_plugin_nr.png create mode 100644 doc/img/SSBDemod_plugin_nr.xcf create mode 100644 sdrbase/dsp/fftnr.cpp create mode 100644 sdrbase/dsp/fftnr.h create mode 100644 sdrgui/gui/fftnrdialog.cpp create mode 100644 sdrgui/gui/fftnrdialog.h create mode 100644 sdrgui/gui/fftnrdialog.ui diff --git a/doc/img/SSBDemod_plugin.png b/doc/img/SSBDemod_plugin.png index 2ad34583eca35e1f3aacb61fad9ae3ca0e9d8b9a..9cfa0105e229898fbda2e3adbcaff1ed2476e68b 100644 GIT binary patch delta 44740 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

r{B}=c6I6Brf4HIf1Y&< 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 J%I{e}`wvDjfOG%= delta 44204 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 z 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

Tk%ihO1RCwRaIL5M&!5=BZb;07Lu9M=%Y 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 TR}VgQgP|a+BJ)M+W#In+w<6c3 literal 0 HcmV?d00001 diff --git a/doc/img/SSBDemod_plugin_nr.xcf b/doc/img/SSBDemod_plugin_nr.xcf new file mode 100644 index 0000000000000000000000000000000000000000..4e5c5d466e87cd1d7780d84edbe32036470c255d GIT binary patch literal 24760 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 Oilw5cu23p(9{6A1K9E%a literal 7731 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 diff --git a/doc/img/SSBDemod_plugin_vol.xcf b/doc/img/SSBDemod_plugin_vol.xcf index 3c80b7ea1fea28e1a29e225129f38200c238462a..b03b4093fa09e1019e4124e97e1dccdad08246b7 100644 GIT binary patch literal 30753 zcmeHQ3s_Ufw%$odKt)BX$79tRv^~|EVzp|-Dl#I1T0PqO=;QXZA|TTGh=M$<7PPjt zJ?Grphdq6qwg&rBG=dLA0Ry>7qB zS~IiO%)WE6no$!6#_p0fY1qoLIEESK=2s@Nf_Yi z0>KLc3jBfbDAyH2HH7vtP;@}#f_d|z=f^{w!_3ZO7DY$IM@MNBW8>#&!^cmWf;oPI zXzaX*nCO6*MX^zshSD4R#l93m>V0_ziq$SF_8=AE?A`PCy;Jv%NsUMtAU zc*-^v#x~0y#bp}Nw4t=!Qc644QQCDmrQNZ=;pshz(!S}G_J5hufGkP}KS$}XPbm$W zOX=vvl!niwG*0MH%HwCk2q({V10IJ8`&OkLhB-?7fJXxXN0W!(k9=?{e8PxBz;sl> zS3w@1J`hB{r;Kka2;M9Y%YTINK)8pI=ivd`SH{aN z@qaqeX zi75ebu}h-0g94d=5TzDih)s%~i{=tBKRz~MZfr!HHd!#Axe@bY7K2S|`$W$VSR98X z&5DSN4v30f6df5KyI{U{Zu}xhbTw))*?|KB2R40%fE9x5D~sdeV`nF8=SI(t$MO~= z1|SUUzO?M|!T}Q>(LUI~di_bv04nAI>orPD z@5XoG6jD%gKD-*@B5lVhg?Kwi(?DnoaXD=Rac@W$sSl?T;y#e>1L-35hIku@i&S1` z7p@!M%?v40P;-2Vw;9?2LFAwXX1)Z|kb^du+j902b1~&0?*MYp4l}d|sJ+-Ma6X)k zH=ENj(FYYupjp6yLNR`NbM`Vbhzne?xfnTlQ=oC?6h#9xQQl-|)=CY}U!+|n@M*}m zgaw?%T$0$U*D6STkt9*%SDukb`zAPM%d!)*jBUq}^xFaP&bA z+S$Xli*}(sm46;Nd5f?UVJhHKlnMdodb`O9(TiY~ygX1?CR)+*0F9%Mr^|z%SO6;q zmm~H_UBG65H=!Br*y`IZip32~0f?jnymuK*_dd<&bxLs+#m9%$?V}ZZ2JRZx&Skbu&GPIn{#}VrZhUz zz6MBP)NuUgY9qgf@=9al+BILK88N2jl#t$5;OuLRMnFhHI=@zB~ci(Fe%-|5{G zmg6frKzD$=qxUKJCXz%W*1f!Wq|bv(Vlk@bY@_(|ezb}9Rs2%gNNWZ^@{LOt^UDb3 z)SNw!{}u{Jp&E5t`HIOMI!9RRJJaUcKj!11KR@C_S^Q-dA4B7HepOc{x9=2TwfJEI z^zSS+&&OeD-dw}v{k66Gr(s2|FC{}QO~GDkTY*IL_IL&AAeA66e)Z0{1l-sp>l8rq zy8eaHSVq}bY>Y`dz<1h3^E;I=TF&TIM(vb#UQg)*(;1Csl$HCyn=Jkjqu(%^MQN90 zO1lOzI*C#MOt6jIaqvCIJ!pJb2nr)?kIf2yH9V=nTR<&1%d5B*CP-(w3UFs zd+3hq#@xHmWlo^S_NQ)aKWLJNVr>5buE|F4L_{Jo5|NTf#dP;>J71VBh$KWeo)cM# z@>JgyT-@Z2JERd@Zs7NlIQt>9;EDqTBys#9wVBTcxPp#5kmUD6?SdoEe$aea2|hQB zgO?1PbI3va1nNvta}CAj(xautN+AOp%&6MzC=p7Aw#qzoxA4yS0fxFr@fk1U?SA}w z6vR0>s~>;*lI7^@K2CARfi~D{YR=LzJ-Fi^rk~;yFb=JJj4wjYmvh|swP_Lvzq#yj z->%b6@rhI!&^qt)oHq^cFe;j#);#(Sf8M@6hxfZ2t9Nn61Z7n%C08++4;P z=IL(`2%E14pjyV?+MzcDC0Y}f!zB|>fIVG;@fg=5EH|W;V7Ytf(DP?|26Wj?Sk8aB zkV-#f4n2Ri|G-*{=Z2Cq4>o;c8_xEn(YOYX2C(Q-L(Ye5Tw{cP$b-x08{?X_QY6jD zv51DNPcwcY#?+kkYon2KMjdHJC1+={UL60G4|CW7zeeQY#FR<6(X>5XWaL*8psa^YVu7+QU^wq#T$ADH z&#t-j4`=bIl;Wq{XZHxhV~?=;_sIKH?oX2`eH3pw!Sg8ID?vJ#(J_p&avzOk@iH(u@?kS-k=xN z=Rx12ceo4sw?S|>AqN+va8tgU@;vDoQ3v}MN6OQ1H}vrxdwXD?XcZVzd|yKS7QX{p z1%|t!-<)x3BI7d7Fr#txA#7$FfNB|kYeXolC#?w)u7xIdh2ZI8jbCIvLWF}`2_n3Q z-aTC+vkxR9>SH^Z?n5_ukfhrnrZ)vIPVb)RjiXfb*0lkMg^w_Q=+>Rr` z>vls2m7xDFFnwYVpMP7&e}ZxF-}T|YK@J+Heq=2_19@omi%Q;6J`43}#9sTMHxp|U zu$KQ2d2soaUqJ>+QJ%3P2j#Cy4rtdwzmdOYuBWMRo3GlX|dpDL%~+J zx`?*x>FOe0oMYt-*dZ1ugLP~I4Y)${1`BwY;|3EJpXf#hk{)L_vLF8&&42uJN(Xge z^kGI>d4ob(d>W%sjK(v%lF}#6GFn6FU@u0yF#0g1&47Zw4{^Qu-aiPsPi6;Dzzf4 z6Z`Og<6T=ccJ9X3Wjta2wjB69fwR6f0Y6;+?gaSZlI{`kd!m&9zkBEk9BRPPXO9c; z8_M<{Ay>?U$k4Avg_~W0fDzWH;A&qwpaZy1hqvnZwU7wBCC#`7ul5;*3wwY!fW;iV z)<-Y#wdHK-Mq@fAf(H!PHCT!d$EPd7g@|rM+m~yMYvG3jM)1XfClG!v07cl~F5g;u zO;D(B4Xw|~14{XCT!6R3t0Hb~3$8*aS>`IFKML`Nbo?!Y1}Of1!Fm6$DgJfEO0KBc z>NjWi#T$p0_#&`^uKNT)*N^S6M(De@|3UuPe&RX)6^ujQJ5udffpV&LZ&Z8l#Sj9yIWysif>JVsk;>wDt&M`&YhLoc6rh+YQdGvU`C>u8Nm z-nHE_fTI9IaJu_i-9jRosiznZ7e(0<$Z!}YNv=CDDiBykX%PFpLlDDaK{IJOeo8vP z51)xCK-v6zk_b_51g!G-jL-^%8!?bk!srx6XEMt4M-HL!kyc8B7(Na9Ba8QAG?3C; zU_9S}Tt_3^K8N6$i?2Q4BPc_-0S{%g*o}g&qq|fF^kj-J?CVB<2vDv^!Jn4FLm3{u z3%<`?Dg)o=PJ# zp9?mM89>E6V1svv=}lpchVv4@ks5x)fY3vvh&?dwDHVSlAyQY6()6ky{2ZbLuHHd~ z;HKmAy%^V!ZZ0l03lV6?9Z_h9-~kjVwC6T1J`LB{|1~pzmi7worQ$`tLG|;SLrw}A zZ8*nWVc_={MR0czn+Q17$-8!&45T#0cCBtf5Y5fg1%cVKSWHNg$jQ2Z$%JgAdEp}& zWf(7E^YmX$ZQ3yVL@C@yU9j16U!l^e$N!%ouluq%w(C=Ca6 zgHL!*MjxXTa6-FloF6|x2rb{u5VK(DK+7>hIS`tEAqsSxT#JKp5Vzd5HWhFKcs~eY zJ3XO(&>kqq4CORwt83eD7l(3$ce_h%x)XfoPM1q<;_rh|^q|+MB_Y1^%nHzY{NQ>V z5&G&*+whnN?|{~VA;tG;4)j|*;%FrpP#?$pPTL^ZjJxsjG|gq4VI61&=2N@`a%}D3 z+E0my!#{sBQT+QOtqJ|1X90t!i@g$bWzRU-{Wqx-R8(LbyXO|i7Sp&unjXg%XN*ZY zz>hml^Pm2T(&x8QI_n^%v9D3Oki}skhG*?nNAjKTr|JyGPZ;5pmI*REEshzx(_Af`a_ryYg}hjpOwr)ub`<$J*0LASNih z^9yi?{>~JxPRQSLc*n8*yHS2;cF~;S`d}~8aQ^MliM8XDROR}3%Zr3ew@#dSW1keRhpA}(sk zm9bx#)0chw;a`t{R`&L+tp(%s!!*P;=5PNB5tSC6C*)s?pRF5B$l+zER1u!Ff5+l= zt3E2-fjXI+_D#@ZBW;O}OLK&`QWNXw3v;6?M#o%I65HPY5VXea*m?A;H3i1nPs;#1^vX+VetP8ge5oD`@+N$g z;zz$E(0l&UnZJVw|eote3Hi!!q|W0Ps)hRxf@3wrgFYL}3i)scdp zH*u65RTAq!khIVwozkN z<*Q7JjddWfZgY0HUO&7&Hlru81%`jMOSwUju2^qfw|V!(;d=cjmQ@*~pYZwKt)_MB z)@SBqPb8q!0hM}@YftLOMW^TQ+r2kybvS4Y3l=gSB6Uydhlhnvm>D{5lv3{)7AzQ8 zZ^DmM>G?n}y<>Q=V2WB|4<0cLH!e&5>fTl@XB{r=kie{gMA zz;+ay;Zw|a?M zbJWwSR$4!s6`fHPk#cz&RkIu`IdIBk+G^jWGBxfnnJRx$nH=UUNhwA>)p7D0)l|#s z$k#7VMIE)tvZ-cEW^JaautsCDZ{~Nl6>Es`nreT+@v3@iy(C*xbk<}#^@Hh$t0q&X z(rP=D#c!76XL~(kkK|uaKU2T#@-wXL-)#*IjTcP?bxM;WtMT-aP4*l~KHBSP`!kL6 z)K7!_(n2lamA(FaJ`BxX7@9NNrJ;$^OumtFtiEbbj{n8nRqtu)THc$OlTpwOv;}PE5(IPBwf}pT6|< zyz1AyM6H|b71by6(V46oV#rZP0XVKDr@O=WO=yG&AYwbzj4YJ+8AMRI&)yy3$u z8iPH-v9hgLgNwbQY|Y1I2E&0gL)vMBAwhY=w&8U?QIdDDSCqe6Qg5-;|7`f+n!&Je z*|HxtFSNZa$-CHV$Z{`3ZBlhSNLDRNs`~)mplGwjq%tola$_e@aG&IdO9t(N2kCs zy+dtd0z37TTWp8GAb*`bD6oUfV!1JWb&fHd(_*<$NC*`YsKv?>sKs)j-a329ua7Bp z^^dJ8Z>Y?hsMIygF0)?W^^{svb+uS7RHL&^+@JT7Qg`jkv(fs|pIr^q#ndeyNj|R} z;U#L_WU;7b`DeD&@Sd^`a&e7>M#p&Y8bh^RHE4CGcA1cYaSS-q4&9YQi*X_~$<$_N4Sa9&B zzXmi+lH^@1mJ9XL)eftCLZ=J3JZjjDm*5S)`>XEYXYdBAr$}$$YO$#0NXb#@u55Z& z_s*r*Ay2+hJxBMV_1#e;KRXvFsoi9;f?jE&N>}&FF`X{;*ZOO_o`<1{DzjE@A0rKo ztHsL3ms+eWfm*E0MySQg4N0`vo|4V=l38p|!8Cg{u~?3H4{+!MAuTqkJHmp_L^IDe zH*(Z)Py}GmT>u81i1%~$*|YSJ2DqTRfD3#{qu>ScdDijD05I9)>>jvvwjoy08v;46 z%5r>|PsILxS&`3-CQ9CDAmLB}>gwJ$GELBsR>ME)>nM|7-O(tGxw_8td7WO6$ zsYM6L?)>7NucR*ZndX=y%3rUjJ;da*O{Q%ZPl)mp^7Hd{?LPY27wg{gnd*oU78T&=S&YYaw-M@U2 zn(ykb+vO53xuN5U}haPRovMD>y;yfqH$Q;QUbOM}X5K7=VUz5{w2 z5(tQ+8$}$lX#o2~cL8v?PJ@ut9*8>JOoNc+kh46*-85iXZl?im%-2tzUt};O)*B4G zt+BECheTn^b3YBJeB}lvzrtWx`b&W*?`9gHeC^3~HdX2VOV(7bfg>8nD(F3?E&wQu)N{PgrYiISo+BadI^vjw3=PN`u{WVUYk=ZZQqm zh`OH!EYs~YVDuwrIX6JSq2uMY+)v00bCPJ8C-C@m{2t7J2yJR*NXCPCIZUW7B8z9PRkEd>Kv~Xi}G$J0xkdLufAsTIvqLqnIM0Q zi9i)*23AZKUZAGB#`@(zrr>rWph8vgOx=q8f2@M8 z`?8-Jh&HJyoN>Dg)F2h&K# zhj3`~<-YKl$HO(GazcJ#iTOwooavP8re`xCIeR`KAM7SMs{pc{f4MEGOep;69}8C< z&Ckm_Af`r*3M9qE8$ti->z8y{`+M+c1R~Kor!Jq2J?6|vHWxU1pd#26fXx!043#b ztyuC?e)e|hn58qZe^(f)B-L}n2r+IURsRmcuY)jvlAS;09m|J98R=}L6S2=N4^@%s zpVp3k{$eso-!W!(^;9)GiOB;%V#yFsRN$OqyIt9Eqn!MEY4wGV2npX^b7rah_{Cxp zk5(RY!Vk*^@lYke2|KLo*>TDMa?QEUvXhj@We|fNq6{Kd5mmsU%JAU90+eV3C^3AL zUH}tH{Yat|z{GvixoY4k4jtFHSv-H5icQhA~jFtUaNS6kmpKooSg4X&e8AT@{0=6{R2Nz zoskzBQ~fL{`6ML%>R4E*1=OY5T`65skZv7-@R?T#$y+_i5=zJ~aR3Pra(U%dN;eav zn+ATwin5s*v8TcBko%u%a)y5W&dWt%b|Jxe$DkvzX6_#Q(xt40zk>YMk3k;4eHR=m zJDB6Vi{QLn(2mqxtg0jvb1xp)wrpaYxTu9B4a&1UCK1n1>~cEmpAnWw#o zW#7t4*71b=HXk%#$18dB%{0RgxzaTR=e2^4r26acLgOnZkb}mM)JtR3{)}bPTL;qBg1+P|e*G>y zw)02^X3`r6K?hsk;T0=_YOLwfppF;%=_@CZ5Y+!Dn^@s`1#$W`apZ?<2un+E-w z-aW7n3nnVuEdNcqd|(|OOz;lFr~v2f0~O(6J5>dT!T0b~a^Hw^?i;ZP;_e%AMzNahkXwvv&V?#p~uFi1D@l>RS@FRe^{2VaD9w3c%dn(J5;eb{j+?h0FCyrTS znF0HxKKKvBQT&#`!9B?ESAi>A!J_pOYZFL(%`-~E>!E~%(>3MsQ2y|qgddf{U4!-i z|4*$P$7Mk100Ez8A>dV6eDKe^v8%1pZxn=|c7#Mkz8bS=!Q%N*DAt;8`(k_W@$|MY zdtF)x$Hh+-IoZ!Nyl7hd+mt5YPnqCJ=*#Hil;Wq2w)IR8H$=ThZAA^4xK&-MLW>W6-4 z&eirkAeRcEnHnCt)m literal 36122 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: Volume and AGC +

13: Volume AGC Noise Reduction

![SSB volume and AGC controls](../../../doc/img/SSBDemod_plugin_vol.png) @@ -141,15 +141,69 @@ If you are into digging weak signals out of the noise you probably will not turn This AGC is based on the calculated magnitude (square root of power of the filtered signal as I² + Q²) and will try to adjust audio volume as if a -20dB power signal was received. -

13.2A: AGC clamping

+

13.3: AGC clamping

When on this clamps signal at the maximum amplitude. Normally this is not needed for most signals as the AGC amplitude order is quite conservative at 10% of the maximum. You may switch it on if you notice a loud click when a transmission starts. -

13.3: AGC time constant

+

13.4: Noise Reduction

+ +This is a FFT based noise reduction and is engaged only in SSB mode (USB, LSB). + +Usually this will not work great on weak signals and should not be used in this case. This feature is mostly intended at reducing ear fatigue when some background noise is present on a fairly strong signal. You can combine it with the squelch (13.7) to suppress the waterfall noise when there is no signal. + +The spectrum display (15) is that of the filtered signal. The AGC when engaged (13.2) is also working with the filtered signal. + +Use this button to toggle noise reduction on/off. Right click on this button to open a dialog controlling noise reduction filter characteristics: + +![SSB noise reduction controls](../../../doc/img/SSBDemod_plugin_nr.png) + +

13.4.1: Noise reduction scheme

+ +Use this combo box to choose the noise reduction scheme among the follwing: + + - **Average**: calculates the average of magnitudes of the FFT (PSD) and sets the magnitude threshold to this average multiplied by a factor that can be set with the control next (13.4.2). + + - **Avg Std Dev**: calculates the average and standard deviation (sigma) of magnitudes of the FFT and sets the threshold at average plus half sigma multiplied by a factor that can be set with the control next (13.4.2). This is optimal for voice signals (SSB). + + - **Peaks**: selects the bins of the FFT with highest magnitudes. You can select the number of these peaks with the control next (13.4.2). This can be used for CW signals with a small number of peaks or even just one effectively realizing a peak filter. + +

13.4.2: Noise reduction parameter

+ +This parameter depends on the noise reduction scheme + + - With average this is the multiplier of the average + - With average and standard deviation this is the standard deviation (sigma) multiplier. + - With FFT peaks this is the number of peaks. + +

13.4.3: Smoothing filter constant (alpha)

+ +With average based schemes this controls the characteristic of the exponential filter used to smoothen the average or the threshold in case of the average plus standard deviation scheme. + +Smoothing prevents the return of noise during short pauses in the signal like voice signals. For voice signals (SSB) a time constant of 1 or 2 seconds gives good results (as shown in screenshot). + +The exponential filter is governed by this equation: + +$y(k) = \alpha y(k-1) + (1-\alpha)x(k)$ + +where: + + - $x(k)$ is the input at time step k + - $y(k)$ is the filtered output at time step k + - $\alpha$ is a constant between 0 and 1 and is the smoothing factor. The larger the value the more smoothing occurs + +The smoothing filter constant $\alpha$ is entered as minus the value in dB of $(1-\alpha)$ i.e. $-dB(1-\alpha)$. Thus a larger number corresponds to a longer time constant showed in 13.4.4. Using a logarithmic input (dB) allows a finer control of the filter time constant. The actual value of alpha will appear in the tooltip. + +

13.4.4: Smoothing filter time constant

+ +The time constant of an exponential filter $\tau$ with constant time steps $T$ is expressed as $\tau = -T/ln(\alpha)$. Here the time step is the time of one FFT which is the FFT length divided by the sample rate. + +The resulting time constant $\tau$ is displayed here in seconds. + +

13.5: AGC time constant

This is the time window in milliseconds of the moving average used to calculate the signal power average. It can be varied in powers of two from 16 to 2048 ms that is: 16, 32, 64, 128, 256, 512, 1024 and 2048 ms. The most practical values are between 128 and 512 ms. -

13.4: Signal power threshold (squelch)

+

13.6: Signal power threshold (squelch)

Active only in AGC mode. @@ -161,7 +215,7 @@ To turn off the squelch completely move the knob all the way down (left). Then " The signal power is calculated as the moving average over the AGC time constant (11.3) of the power of the filtered signal as I² + Q². -

13.5: Signal power threshold (squelch) gate

+

13.7: Signal power threshold (squelch) gate

Active only in AGC mode with squelch enabled. diff --git a/plugins/channelrx/demodssb/ssbdemod.cpp b/plugins/channelrx/demodssb/ssbdemod.cpp index 780ef37e8..4b0f4adbb 100644 --- a/plugins/channelrx/demodssb/ssbdemod.cpp +++ b/plugins/channelrx/demodssb/ssbdemod.cpp @@ -262,6 +262,12 @@ void SSBDemod::applySettings(const SSBDemodSettings& settings, bool force) << " m_agcTimeLog2: " << settings.m_agcTimeLog2 << " agcPowerThreshold: " << settings.m_agcPowerThreshold << " agcThresholdGate: " << settings.m_agcThresholdGate + << " m_dnr: " << settings.m_dnr + << " m_dnrScheme: " << settings.m_dnrScheme + << " m_dnrAboveAvgFactor: " << settings.m_dnrAboveAvgFactor + << " m_dnrSigmaFactor: " << settings.m_dnrSigmaFactor + << " m_dnrNbPeaks: " << settings.m_dnrNbPeaks + << " m_dnrAlpha: " << settings.m_dnrAlpha << " m_audioDeviceName: " << settings.m_audioDeviceName << " m_streamIndex: " << settings.m_streamIndex << " m_useReverseAPI: " << settings.m_useReverseAPI @@ -324,6 +330,24 @@ void SSBDemod::applySettings(const SSBDemodSettings& settings, bool force) if ((m_settings.m_agc != settings.m_agc) || force) { reverseAPIKeys.append("agc"); } + if ((m_settings.m_dnr != settings.m_dnr) || force) { + reverseAPIKeys.append("dnr"); + } + if ((m_settings.m_dnrScheme != settings.m_dnrScheme) || force) { + reverseAPIKeys.append("dnrScheme"); + } + if ((m_settings.m_dnrAboveAvgFactor != settings.m_dnrAboveAvgFactor) || force) { + reverseAPIKeys.append("dnrAboveAvgFactor"); + } + if ((m_settings.m_dnrSigmaFactor != settings.m_dnrSigmaFactor) || force) { + reverseAPIKeys.append("dnrSigmaFactor"); + } + if ((m_settings.m_dnrNbPeaks != settings.m_dnrNbPeaks) || force) { + reverseAPIKeys.append("dnrNbPeaks"); + } + if ((m_settings.m_dnrAlpha != settings.m_dnrAlpha) || force) { + reverseAPIKeys.append("dnrAlpha"); + } if (m_settings.m_streamIndex != settings.m_streamIndex) { diff --git a/plugins/channelrx/demodssb/ssbdemodgui.cpp b/plugins/channelrx/demodssb/ssbdemodgui.cpp index 74d92fb01..3990ae2ad 100644 --- a/plugins/channelrx/demodssb/ssbdemodgui.cpp +++ b/plugins/channelrx/demodssb/ssbdemodgui.cpp @@ -193,6 +193,12 @@ void SSBDemodGUI::on_agcClamping_toggled(bool checked) applySettings(); } +void SSBDemodGUI::on_dnr_toggled(bool checked) +{ + m_settings.m_dnr = checked; + applySettings(); +} + void SSBDemodGUI::on_agcTimeLog2_valueChanged(int value) { QString s = QString::number((1<audioMute); connect(audioMuteRightClickEnabler, SIGNAL(rightClick(const QPoint &)), this, SLOT(audioSelect(const QPoint &))); + CRightClickEnabler *dnrRightClickEnabler = new CRightClickEnabler(ui->dnr); + connect(dnrRightClickEnabler, SIGNAL(rightClick(const QPoint &)), this, SLOT(dnrSetupDialog(const QPoint &))); + ui->deltaFrequencyLabel->setText(QString("%1f").arg(QChar(0x94, 0x03))); ui->deltaFrequency->setColorMapper(ColorMapper(ColorMapper::GrayGold)); ui->deltaFrequency->setValueRange(false, 7, -9999999, 9999999); @@ -602,6 +612,7 @@ void SSBDemodGUI::displaySettings() ui->agc->setChecked(m_settings.m_agc); ui->agcClamping->setChecked(m_settings.m_agcClamping); + ui->dnr->setChecked(m_settings.m_dnr); ui->audioBinaural->setChecked(m_settings.m_audioBinaural); ui->audioFlipChannels->setChecked(m_settings.m_audioFlipChannels); ui->audioMute->setChecked(m_settings.m_audioMute); @@ -698,7 +709,6 @@ void SSBDemodGUI::enterEvent(EnterEventType* event) void SSBDemodGUI::audioSelect(const QPoint& p) { - qDebug("SSBDemodGUI::audioSelect"); AudioSelectDialog audioSelect(DSPEngine::instance()->getAudioDeviceManager(), m_settings.m_audioDeviceName); audioSelect.move(p); audioSelect.exec(); @@ -710,6 +720,57 @@ void SSBDemodGUI::audioSelect(const QPoint& p) } } +void SSBDemodGUI::dnrSetupDialog(const QPoint& p) +{ + m_fftNRDialog = new FFTNRDialog(); + m_fftNRDialog->move(p); + QObject::connect(m_fftNRDialog, &FFTNRDialog::valueChanged, this, &SSBDemodGUI::dnrSetup); + m_fftNRDialog->setScheme((FFTNoiseReduction::Scheme) m_settings.m_dnrScheme); + m_fftNRDialog->setAboveAvgFactor(m_settings.m_dnrAboveAvgFactor); + m_fftNRDialog->setSigmaFactor(m_settings.m_dnrSigmaFactor); + m_fftNRDialog->setNbPeaks(m_settings.m_dnrNbPeaks); + m_fftNRDialog->setAlpha(m_settings.m_dnrAlpha, 2048, m_audioSampleRate); + m_fftNRDialog->exec(); + QObject::disconnect(m_fftNRDialog, &FFTNRDialog::valueChanged, this, &SSBDemodGUI::dnrSetup); + m_fftNRDialog->deleteLater(); + m_fftNRDialog = nullptr; +} + +void SSBDemodGUI::dnrSetup(int32_t iValueChanged) +{ + if (!m_fftNRDialog) { + return; + } + + FFTNRDialog::ValueChanged valueChanged = (FFTNRDialog::ValueChanged) iValueChanged; + + switch (valueChanged) + { + case FFTNRDialog::ValueChanged::ChangedScheme: + m_settings.m_dnrScheme = m_fftNRDialog->getScheme(); + applySettings(); + break; + case FFTNRDialog::ValueChanged::ChangedAboveAvgFactor: + m_settings.m_dnrAboveAvgFactor = m_fftNRDialog->getAboveAvgFactor(); + applySettings(); + break; + case FFTNRDialog::ValueChanged::ChangedSigmaFactor: + m_settings.m_dnrSigmaFactor = m_fftNRDialog->getSigmaFactor(); + applySettings(); + break; + case FFTNRDialog::ValueChanged::ChangedNbPeaks: + m_settings.m_dnrNbPeaks = m_fftNRDialog->getNbPeaks(); + applySettings(); + break; + case FFTNRDialog::ValueChanged::ChangedAlpha: + m_settings.m_dnrAlpha = m_fftNRDialog->getAlpha(); + applySettings(); + break; + default: + break; + } +} + void SSBDemodGUI::tick() { double magsqAvg, magsqPeak; @@ -758,6 +819,7 @@ void SSBDemodGUI::makeUIConnections() QObject::connect(ui->volume, &QDial::valueChanged, this, &SSBDemodGUI::on_volume_valueChanged); QObject::connect(ui->agc, &ButtonSwitch::toggled, this, &SSBDemodGUI::on_agc_toggled); QObject::connect(ui->agcClamping, &ButtonSwitch::toggled, this, &SSBDemodGUI::on_agcClamping_toggled); + QObject::connect(ui->dnr, &ButtonSwitch::toggled, this, &SSBDemodGUI::on_dnr_toggled); QObject::connect(ui->agcTimeLog2, &QDial::valueChanged, this, &SSBDemodGUI::on_agcTimeLog2_valueChanged); QObject::connect(ui->agcPowerThreshold, &QDial::valueChanged, this, &SSBDemodGUI::on_agcPowerThreshold_valueChanged); QObject::connect(ui->agcThresholdGate, &QDial::valueChanged, this, &SSBDemodGUI::on_agcThresholdGate_valueChanged); diff --git a/plugins/channelrx/demodssb/ssbdemodgui.h b/plugins/channelrx/demodssb/ssbdemodgui.h index 38415ee36..b1792e02d 100644 --- a/plugins/channelrx/demodssb/ssbdemodgui.h +++ b/plugins/channelrx/demodssb/ssbdemodgui.h @@ -6,6 +6,7 @@ #include "channel/channelgui.h" #include "dsp/channelmarker.h" #include "dsp/movingaverage.h" +#include "gui/fftnrdialog.h" #include "util/messagequeue.h" #include "settings/rollupstate.h" #include "ssbdemodsettings.h" @@ -70,6 +71,7 @@ private: SSBDemod* m_ssbDemod; SpectrumVis* m_spectrumVis; MessageQueue m_inputMessageQueue; + FFTNRDialog* m_fftNRDialog; QIcon m_iconDSBUSB; QIcon m_iconDSBLSB; @@ -101,6 +103,7 @@ private slots: void on_volume_valueChanged(int value); void on_agc_toggled(bool checked); void on_agcClamping_toggled(bool checked); + void on_dnr_toggled(bool checked); void on_agcTimeLog2_valueChanged(int value); void on_agcPowerThreshold_valueChanged(int value); void on_agcThresholdGate_valueChanged(int value); @@ -113,6 +116,8 @@ private slots: void onMenuDialogCalled(const QPoint& p); void handleInputMessages(); void audioSelect(const QPoint& p); + void dnrSetupDialog(const QPoint& p); + void dnrSetup(int valueChanged); void tick(); }; diff --git a/plugins/channelrx/demodssb/ssbdemodgui.ui b/plugins/channelrx/demodssb/ssbdemodgui.ui index c14f736e7..75b58f549 100644 --- a/plugins/channelrx/demodssb/ssbdemodgui.ui +++ b/plugins/channelrx/demodssb/ssbdemodgui.ui @@ -868,6 +868,19 @@ + + + + Toggle Digital Noise Reduction + + + NR + + + true + + + diff --git a/plugins/channelrx/demodssb/ssbdemodsettings.cpp b/plugins/channelrx/demodssb/ssbdemodsettings.cpp index c6837a864..0244b8801 100644 --- a/plugins/channelrx/demodssb/ssbdemodsettings.cpp +++ b/plugins/channelrx/demodssb/ssbdemodsettings.cpp @@ -52,6 +52,12 @@ void SSBDemodSettings::resetToDefaults() m_agcTimeLog2 = 7; m_volume = 1.0; m_inputFrequencyOffset = 0; + m_dnr = false; + m_dnrScheme = 0; + m_dnrAboveAvgFactor = 40.0f; + m_dnrSigmaFactor = 4.0f; + m_dnrNbPeaks = 20; + m_dnrAlpha = 1.0; m_rgbColor = QColor(0, 255, 0).rgb(); m_title = "SSB Demodulator"; m_audioDeviceName = AudioDeviceManager::m_defaultDeviceName; @@ -102,6 +108,12 @@ QByteArray SSBDemodSettings::serialize() const s.writeBlob(26, m_geometryBytes); s.writeBool(27, m_hidden); s.writeU32(29, m_filterIndex); + s.writeBool(30, m_dnr); + s.writeS32(31, m_dnrScheme); + s.writeFloat(32, m_dnrAboveAvgFactor); + s.writeFloat(33, m_dnrSigmaFactor); + s.writeS32(34, m_dnrNbPeaks); + s.writeFloat(35, m_dnrAlpha); for (unsigned int i = 0; i < 10; i++) { @@ -179,6 +191,12 @@ bool SSBDemodSettings::deserialize(const QByteArray& data) d.readBool(27, &m_hidden, false); d.readU32(29, &utmp, 0); m_filterIndex = utmp < 10 ? utmp : 0; + d.readBool(30, &m_dnr, false); + d.readS32(31, &m_dnrScheme, 0); + d.readFloat(32, &m_dnrAboveAvgFactor, 40.0f); + d.readFloat(33, &m_dnrSigmaFactor, 4.0f); + d.readS32(34, &m_dnrNbPeaks, 20); + d.readFloat(35, &m_dnrAlpha, 1.0); for (unsigned int i = 0; (i < 10); i++) { diff --git a/plugins/channelrx/demodssb/ssbdemodsettings.h b/plugins/channelrx/demodssb/ssbdemodsettings.h index 5ca298dbd..bcfff838e 100644 --- a/plugins/channelrx/demodssb/ssbdemodsettings.h +++ b/plugins/channelrx/demodssb/ssbdemodsettings.h @@ -19,6 +19,7 @@ #define PLUGINS_CHANNELRX_DEMODSSB_SSBDEMODSETTINGS_H_ #include +#include #include "dsp/fftwindow.h" @@ -55,6 +56,12 @@ struct SSBDemodSettings int m_agcTimeLog2; int m_agcPowerThreshold; int m_agcThresholdGate; + bool m_dnr; + int m_dnrScheme; + float m_dnrAboveAvgFactor; + float m_dnrSigmaFactor; + int m_dnrNbPeaks; + float m_dnrAlpha; quint32 m_rgbColor; QString m_title; QString m_audioDeviceName; diff --git a/plugins/channelrx/demodssb/ssbdemodsink.cpp b/plugins/channelrx/demodssb/ssbdemodsink.cpp index 781797dda..83bd44ec3 100644 --- a/plugins/channelrx/demodssb/ssbdemodsink.cpp +++ b/plugins/channelrx/demodssb/ssbdemodsink.cpp @@ -33,7 +33,7 @@ #include "ssbdemodsink.h" -const int SSBDemodSink::m_ssbFftLen = 1024; +const int SSBDemodSink::m_ssbFftLen = 2048; const int SSBDemodSink::m_agcTarget = 3276; // 32768/10 -10 dB amplitude => -20 dB power: center of normal signal SSBDemodSink::SSBDemodSink() : @@ -258,6 +258,11 @@ void SSBDemodSink::processOneSample(Complex &ci) } } +void SSBDemodSink::setDNR(bool dnr) +{ + SSBFilter->setDNR(dnr); +} + void SSBDemodSink::applyChannelSettings(int channelSampleRate, int channelFrequencyOffset, bool force) { qDebug() << "SSBDemodSink::applyChannelSettings:" @@ -352,6 +357,12 @@ void SSBDemodSink::applySettings(const SSBDemodSettings& settings, bool force) << " m_agcTimeLog2: " << settings.m_agcTimeLog2 << " agcPowerThreshold: " << settings.m_agcPowerThreshold << " agcThresholdGate: " << settings.m_agcThresholdGate + << " m_dnr: " << settings.m_dnr + << " m_dnrScheme: " << settings.m_dnrScheme + << " m_dnrAboveAvgFactor: " << settings.m_dnrAboveAvgFactor + << " m_dnrSigmaFactor: " << settings.m_dnrSigmaFactor + << " m_dnrNbPeaks: " << settings.m_dnrNbPeaks + << " m_dnrAlpha: " << settings.m_dnrAlpha << " m_audioDeviceName: " << settings.m_audioDeviceName << " m_streamIndex: " << settings.m_streamIndex << " m_useReverseAPI: " << settings.m_useReverseAPI @@ -444,6 +455,30 @@ void SSBDemodSink::applySettings(const SSBDemodSettings& settings, bool force) << " agcClamping: " << agcClamping; } + if ((m_settings.m_dnr != settings.m_dnr) || force) { + setDNR(settings.m_dnr); + } + + if ((m_settings.m_dnrScheme != settings.m_dnrScheme) || force) { + SSBFilter->setDNRScheme((FFTNoiseReduction::Scheme) settings.m_dnrScheme); + } + + if ((m_settings.m_dnrAboveAvgFactor != settings.m_dnrAboveAvgFactor) || force) { + SSBFilter->setDNRAboveAvgFactor(settings.m_dnrAboveAvgFactor); + } + + if ((m_settings.m_dnrSigmaFactor != settings.m_dnrSigmaFactor) || force) { + SSBFilter->setDNRSigmaFactor(settings.m_dnrSigmaFactor); + } + + if ((m_settings.m_dnrNbPeaks != settings.m_dnrNbPeaks) || force) { + SSBFilter->setDNRNbPeaks(settings.m_dnrNbPeaks); + } + + if ((m_settings.m_dnrAlpha != settings.m_dnrAlpha) || force) { + SSBFilter->setDNRAlpha(settings.m_dnrAlpha); + } + m_spanLog2 = settings.m_filterBank[settings.m_filterIndex].m_spanLog2; m_audioBinaual = settings.m_audioBinaural; m_audioFlipChannels = settings.m_audioFlipChannels; diff --git a/plugins/channelrx/demodssb/ssbdemodsink.h b/plugins/channelrx/demodssb/ssbdemodsink.h index 67d3ba47b..efe1b7e48 100644 --- a/plugins/channelrx/demodssb/ssbdemodsink.h +++ b/plugins/channelrx/demodssb/ssbdemodsink.h @@ -50,6 +50,7 @@ public: bool getAudioActive() const { return m_audioActive; } void setChannel(ChannelAPI *channel) { m_channel = channel; } void setAudioFifoLabel(const QString& label) { m_audioFifo.setLabel(label); } + void setDNR(bool dnr); void getMagSqLevels(double& avg, double& peak, int& nbSamples) { diff --git a/sdrbase/CMakeLists.txt b/sdrbase/CMakeLists.txt index 2f6de1557..348dd6e99 100644 --- a/sdrbase/CMakeLists.txt +++ b/sdrbase/CMakeLists.txt @@ -145,6 +145,7 @@ set(sdrbase_SOURCES dsp/fftengine.cpp dsp/fftfactory.cpp dsp/fftfilt.cpp + dsp/fftnr.cpp dsp/fftwindow.cpp dsp/filterrc.cpp dsp/filtermbe.cpp @@ -351,6 +352,7 @@ set(sdrbase_HEADERS dsp/fftengine.h dsp/fftfactory.h dsp/fftfilt.h + dsp/fftnr.h dsp/fftwengine.h dsp/fftwindow.h dsp/filterrc.h diff --git a/sdrbase/dsp/fftfilt.cpp b/sdrbase/dsp/fftfilt.cpp index cfc0141d0..a1f07c51d 100644 --- a/sdrbase/dsp/fftfilt.cpp +++ b/sdrbase/dsp/fftfilt.cpp @@ -78,28 +78,34 @@ void fftfilt::init_filter() // f1 == 0 ==> low pass filter // f2 == 0 ==> high pass filter //------------------------------------------------------------------------------ -fftfilt::fftfilt(int len) +fftfilt::fftfilt(int len) : + m_noiseReduction(len) { flen = len; pass = 0; window = 0; + m_dnr = false; init_filter(); } -fftfilt::fftfilt(float f1, float f2, int len) +fftfilt::fftfilt(float f1, float f2, int len) : + m_noiseReduction(len) { flen = len; pass = 0; window = 0; + m_dnr = false; init_filter(); create_filter(f1, f2); } -fftfilt::fftfilt(float f2, int len) +fftfilt::fftfilt(float f2, int len) : + m_noiseReduction(len) { flen = len; pass = 0; window = 0; + m_dnr = false; init_filter(); create_dsb_filter(f2); } @@ -468,23 +474,54 @@ int fftfilt::runSSB(const cmplx & in, cmplx **out, bool usb, bool getDC) // get or reject DC component data[0] = getDC ? data[0]*filter[0] : 0; + m_noiseReduction.setScheme(m_dnrScheme); + m_noiseReduction.init(); // Discard frequencies for ssb if (usb) { - for (int i = 1; i < flen2; i++) { + for (int i = 1; i < flen2; i++) + { data[i] *= filter[i]; data[flen2 + i] = 0; + + if (m_dnr) + { + m_noiseReduction.push(data[i], i); + m_noiseReduction.push(data[flen2 + i], flen2 + i); + } } } else { - for (int i = 1; i < flen2; i++) { + for (int i = 1; i < flen2; i++) + { data[i] = 0; data[flen2 + i] *= filter[flen2 + i]; + + if (m_dnr) + { + m_noiseReduction.push(data[i], i); + m_noiseReduction.push(data[flen2 + i], flen2 + i); + } } } + if (m_dnr) + { + m_noiseReduction.m_aboveAvgFactor = m_dnrAboveAvgFactor; + m_noiseReduction.m_sigmaFactor = m_dnrSigmaFactor; + m_noiseReduction.m_nbPeaks = m_dnrNbPeaks; + m_noiseReduction.calc(); + + for (int i = 0; i < flen; i++) + { + if (m_noiseReduction.cut(i)) { + data[i] = 0; + } + } + } + // in-place FFT: freqdata overwritten with filtered timedata fft->InverseComplexFFT(data); diff --git a/sdrbase/dsp/fftfilt.h b/sdrbase/dsp/fftfilt.h index 57b745eda..9b9fb85b1 100644 --- a/sdrbase/dsp/fftfilt.h +++ b/sdrbase/dsp/fftfilt.h @@ -10,6 +10,7 @@ #include "gfft.h" #include "fftwindow.h" +#include "fftnr.h" #include "export.h" //---------------------------------------------------------------------- @@ -39,7 +40,15 @@ public: int runDSB(const cmplx& in, cmplx **out, bool getDC = true); int runAsym(const cmplx & in, cmplx **out, bool usb); //!< Asymmetrical fitering can be used for vestigial sideband + void setDNR(bool dnr) { m_dnr = dnr; } + void setDNRScheme(FFTNoiseReduction::Scheme scheme) { m_dnrScheme = scheme; } + void setDNRAboveAvgFactor(float aboveAvgFactor) { m_dnrAboveAvgFactor = aboveAvgFactor; } + void setDNRSigmaFactor(float sigmaFactor) { m_dnrSigmaFactor = sigmaFactor; } + void setDNRNbPeaks(int nbPeaks) { m_dnrNbPeaks = nbPeaks; } + void setDNRAlpha(float alpha) { m_noiseReduction.setAlpha(alpha); } + protected: + // helper class for FFT based noise reduction int flen; int flen2; g_fft *fft; @@ -51,6 +60,12 @@ protected: int inptr; int pass; int window; + bool m_dnr; + FFTNoiseReduction::Scheme m_dnrScheme; + float m_dnrAboveAvgFactor; //!< above average factor + float m_dnrSigmaFactor; //!< sigma multiplicator for average + std deviation + int m_dnrNbPeaks; //!< number of peaks (peaks scheme) + FFTNoiseReduction m_noiseReduction; inline float fsinc(float fc, int i, int len) { diff --git a/sdrbase/dsp/fftnr.cpp b/sdrbase/dsp/fftnr.cpp new file mode 100644 index 000000000..090ca5b01 --- /dev/null +++ b/sdrbase/dsp/fftnr.cpp @@ -0,0 +1,148 @@ +/////////////////////////////////////////////////////////////////////////////////// +// Copyright (C) 2023 Edouard Griffiths, F4EXB // +// // +// Helper class for noise reduction // +// // +// This program is free software; you can redistribute it and/or modify // +// it under the terms of the GNU General Public License as published by // +// the Free Software Foundation as version 3 of the License, or // +// (at your option) any later version. // +// // +// This program is distributed in the hope that it will be useful, // +// but WITHOUT ANY WARRANTY; without even the implied warranty of // +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // +// GNU General Public License V3 for more details. // +// // +// You should have received a copy of the GNU General Public License // +// along with this program. If not, see . // +/////////////////////////////////////////////////////////////////////////////////// + +#include +#include + +#include + +#include "fftnr.h" + +FFTNoiseReduction::FFTNoiseReduction(int len) : + m_flen(len) +{ + m_scheme = SchemeAverage; + m_mags = new float[m_flen]; + m_tmp = new float[m_flen]; + m_aboveAvgFactor = 1.0; + m_sigmaFactor = 1.0; + m_nbPeaks = m_flen; +} + +FFTNoiseReduction::~FFTNoiseReduction() +{ + delete[] m_mags; + delete[] m_tmp; +} + +void FFTNoiseReduction::init() +{ + std::fill(m_mags, m_mags + m_flen, 0); + std::fill(m_tmp, m_tmp + m_flen, 0); + m_magAvg = 0; +} + +void FFTNoiseReduction::push(cmplx data, int index) +{ + m_mags[index] = std::abs(data); + + if ((m_scheme == SchemeAverage) || (m_scheme == SchemeAvgStdDev)) { + m_magAvg += m_mags[index]; + } +} + +void FFTNoiseReduction::calc() +{ + if (m_scheme == SchemeAverage) + { + m_magAvg /= m_flen; + m_magAvg = m_expFilter.push(m_magAvg); + } + if (m_scheme == SchemeAvgStdDev) + { + m_magAvg /= m_flen; + + auto variance_func = [this](float accumulator, const float& val) { + return accumulator + ((val - m_magAvg)*(val - m_magAvg) / (m_flen - 1)); + }; + + float var = std::accumulate(m_mags, m_mags + m_flen, 0.0, variance_func); + m_magThr = (m_sigmaFactor/2.0)*std::sqrt(var) + m_magAvg; + m_magThr = m_expFilter.push(m_magThr); + } + else if (m_scheme == SchemePeaks) + { + std::copy(m_mags, m_mags + m_flen, m_tmp); + std::sort(m_tmp, m_tmp + m_flen); + m_magThr = m_tmp[m_flen - m_nbPeaks]; + } +} + +bool FFTNoiseReduction::cut(int index) +{ + if (m_scheme == SchemeAverage) + { + return m_mags[index] < m_aboveAvgFactor * m_magAvg; + } + else if ((m_scheme == SchemePeaks) || (m_scheme == SchemeAvgStdDev)) + { + return m_mags[index] < m_magThr; + } + + return false; +} + +void FFTNoiseReduction::setScheme(Scheme scheme) +{ + if (m_scheme != scheme) { + m_expFilter.reset(); + } + + m_scheme = scheme; +} + +FFTNoiseReduction::ExponentialFilter::ExponentialFilter() +{ + m_alpha = 1.0; + m_init = true; +} + +float FFTNoiseReduction::ExponentialFilter::push(float newValue) +{ + if (m_init) + { + m_prev = newValue; + m_init = false; + } + + if (m_alpha == 1.0) + { + m_prev = newValue; + return newValue; + } + else + { + float result = m_alpha*m_prev + (1.0 - m_alpha)*newValue; + m_prev = result; + return result; + } +} + +void FFTNoiseReduction::ExponentialFilter::reset() +{ + m_init = true; +} + +void FFTNoiseReduction::ExponentialFilter::setAlpha(float alpha) +{ + m_alpha = alpha < 0.0f ? 0.0f : alpha > 1.0f ? 1.0f : alpha; + qDebug("FFTNoiseReduction::ExponentialFilter::setAlpha: %f", m_alpha); + m_init = true; +} + diff --git a/sdrbase/dsp/fftnr.h b/sdrbase/dsp/fftnr.h new file mode 100644 index 000000000..c9933a62f --- /dev/null +++ b/sdrbase/dsp/fftnr.h @@ -0,0 +1,72 @@ +/////////////////////////////////////////////////////////////////////////////////// +// Copyright (C) 2023 Edouard Griffiths, F4EXB // +// // +// Helper class for noise reduction // +// // +// This program is free software; you can redistribute it and/or modify // +// it under the terms of the GNU General Public License as published by // +// the Free Software Foundation as version 3 of the License, or // +// (at your option) any later version. // +// // +// This program is distributed in the hope that it will be useful, // +// but WITHOUT ANY WARRANTY; without even the implied warranty of // +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // +// GNU General Public License V3 for more details. // +// // +// You should have received a copy of the GNU General Public License // +// along with this program. If not, see . // +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef _FFTNR_H +#define _FFTNR_H + +#include + +#include "export.h" + +class SDRBASE_API FFTNoiseReduction { +public: + typedef std::complex cmplx; + enum Scheme { + SchemeAverage, + SchemeAvgStdDev, + SchemePeaks + }; + + FFTNoiseReduction(int len); + ~FFTNoiseReduction(); + + void init(); //!< call befor start of initial FFT scan + void push(cmplx data, int index); //!< Push FFT bin during initial FFT scan + void calc(); //!< calculate after initial FFT scan + bool cut(int index); //!< true if bin is to be zeroed else false (during second FFT scan) + void setAlpha(float alpha) { m_expFilter.setAlpha(alpha); } + void setScheme(Scheme scheme); + + float m_aboveAvgFactor; //!< above average factor + float m_sigmaFactor; //!< sigma multiplicator for average + std deviation + int m_nbPeaks; //!< number of peaks (peaks scheme) + +private: + class ExponentialFilter { + public: + ExponentialFilter(); + float push(float newValue); + void reset(); + void setAlpha(float alpha); + private: + bool m_init; + float m_alpha; + float m_prev; + }; + + Scheme m_scheme; + int m_flen; //!< FFT length + float *m_mags; //!< magnitudes (PSD) + float *m_tmp; //!< temporary buffer + float m_magAvg; //!< average of magnitudes + float m_magThr; //!< magnitude threshold (peaks scheme) + ExponentialFilter m_expFilter; //!< exponential filter for parameter smoothing +}; + +#endif diff --git a/sdrgui/CMakeLists.txt b/sdrgui/CMakeLists.txt index fd3c5caa0..884fd3fc4 100644 --- a/sdrgui/CMakeLists.txt +++ b/sdrgui/CMakeLists.txt @@ -43,6 +43,7 @@ set(sdrgui_SOURCES gui/featurelayout.cpp gui/featurepresetsdialog.cpp gui/fftdialog.cpp + gui/fftnrdialog.cpp gui/fftwisdomdialog.cpp gui/flowlayout.cpp gui/framelesswindowresizer.cpp @@ -164,6 +165,7 @@ set(sdrgui_HEADERS gui/featurelayout.h gui/featurepresetsdialog.h gui/fftdialog.h + gui/fftnrdialog.h gui/fftwisdomdialog.h gui/flowlayout.h gui/framelesswindowresizer.h @@ -266,6 +268,7 @@ set(sdrgui_FORMS gui/featureadddialog.ui gui/featurepresetsdialog.ui gui/fftdialog.ui + gui/fftnrdialog.ui gui/fftwisdomdialog.ui gui/glscopegui.ui gui/glspectrumgui.ui diff --git a/sdrgui/gui/fftnrdialog.cpp b/sdrgui/gui/fftnrdialog.cpp new file mode 100644 index 000000000..088e4ac1a --- /dev/null +++ b/sdrgui/gui/fftnrdialog.cpp @@ -0,0 +1,210 @@ +/////////////////////////////////////////////////////////////////////////////////// +// Copyright (C) 2023 Edouard Griffiths, F4EXB // +// // +// This program is free software; you can redistribute it and/or modify // +// it under the terms of the GNU General Public License as published by // +// the Free Software Foundation as version 3 of the License, or // +// (at your option) any later version. // +// // +// This program is distributed in the hope that it will be useful, // +// but WITHOUT ANY WARRANTY; without even the implied warranty of // +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // +// GNU General Public License V3 for more details. // +// // +// You should have received a copy of the GNU General Public License // +// along with this program. If not, see . // +/////////////////////////////////////////////////////////////////////////////////// + +#include "util/db.h" +#include "fftnrdialog.h" +#include "ui_fftnrdialog.h" + +FFTNRDialog::FFTNRDialog(QWidget* parent) : + QDialog(parent), + ui(new Ui::FFTNRDialog) +{ + ui->setupUi(this); +} + +FFTNRDialog::~FFTNRDialog() +{ + delete ui; +} + +void FFTNRDialog::setScheme(FFTNoiseReduction::Scheme scheme) +{ + ui->scheme->blockSignals(true); + ui->genParam->blockSignals(true); + + switch (scheme) + { + case FFTNoiseReduction::Scheme::SchemeAverage: + ui->scheme->setCurrentIndex(0); + ui->genParam->setMinimum(200); + ui->genParam->setMaximum(990); + ui->genParam->setValue(m_aboveAvgFactor*10); + ui->genParam->setToolTip("Above average multiplier"); + ui->genParamLabel->setText("Above avg mult"); + ui->genParamValue->setText(tr("%1").arg(m_aboveAvgFactor, 0, 'f', 1)); + break; + case FFTNoiseReduction::Scheme::SchemeAvgStdDev: + ui->scheme->setCurrentIndex(1); + ui->genParam->setMinimum(20); + ui->genParam->setMaximum(160); + ui->genParam->setValue(m_sigmaFactor*10); + ui->genParam->setToolTip("Standard deviation multiplier"); + ui->genParamLabel->setText("Sigma multiplier"); + ui->genParamValue->setText(tr("%1").arg(m_sigmaFactor, 0, 'f', 1)); + break; + case FFTNoiseReduction::Scheme::SchemePeaks: + ui->scheme->setCurrentIndex(2); + ui->genParam->setMinimum(1); + ui->genParam->setMaximum(40); + ui->genParam->setValue(m_nbPeaks); + ui->genParam->setToolTip("Number of max peaks selected"); + ui->genParamLabel->setText("Nb of peaks"); + ui->genParamValue->setText(tr("%1").arg(m_nbPeaks)); + break; + default: + break; + } + + ui->scheme->blockSignals(false); + ui->genParam->blockSignals(false); + + m_scheme = scheme; +} + +void FFTNRDialog::setAboveAvgFactor(float aboveAvgFactor) +{ + if (aboveAvgFactor < 20.0f) + { + m_aboveAvgFactor = 20.0f; + emit valueChanged(ChangedAboveAvgFactor); + } + else if (aboveAvgFactor > 99.0f) + { + m_aboveAvgFactor = 99.0f; + emit valueChanged(ChangedAboveAvgFactor); + } + else{ + m_aboveAvgFactor = aboveAvgFactor; + } + + if (m_scheme == FFTNoiseReduction::Scheme::SchemeAverage) + { + ui->genParam->blockSignals(true); + ui->genParam->setValue(m_aboveAvgFactor*10); + ui->genParamValue->setText(tr("%1").arg(m_aboveAvgFactor, 0, 'f', 1)); + ui->genParam->blockSignals(false); + } +} + +void FFTNRDialog::setSigmaFactor(float sigmaFactor) +{ + if (sigmaFactor < 2.0f) + { + m_sigmaFactor = 2.0f; + emit valueChanged(ChangedSigmaFactor); + } + else if (sigmaFactor > 16.0f) + { + m_sigmaFactor = 16.0f; + emit valueChanged(ChangedSigmaFactor); + } + else{ + m_sigmaFactor = sigmaFactor; + } + + if (m_scheme == FFTNoiseReduction::Scheme::SchemeAvgStdDev) + { + ui->genParam->blockSignals(true); + ui->genParam->setValue(m_sigmaFactor*10); + ui->genParamValue->setText(tr("%1").arg(m_sigmaFactor, 0, 'f', 1)); + ui->genParam->blockSignals(false); + } +} + +void FFTNRDialog::setNbPeaks(int nbPeaks) +{ + if (nbPeaks < 1) + { + m_nbPeaks = 1; + emit valueChanged(ChangedNbPeaks); + } + else if (nbPeaks > 40) + { + m_nbPeaks = 40; + emit valueChanged(ChangedNbPeaks); + } + else{ + m_nbPeaks = nbPeaks; + } + + if (m_scheme == FFTNoiseReduction::Scheme::SchemePeaks) + { + ui->genParam->blockSignals(true); + ui->genParam->setValue(m_nbPeaks); + ui->genParamValue->setText(tr("%1").arg(m_nbPeaks)); + ui->genParam->blockSignals(false); + } +} + +void FFTNRDialog::setAlpha(float alpha, int fftLength, int sampleRate) +{ + m_alpha = alpha < 0.0f ? 0.0f : alpha > 0.99999 ? 0.99999f : alpha; + m_flen = fftLength; + m_sampleRate = sampleRate; + int alphaDisplay = -round(CalcDb::dbPower(1.0f - m_alpha)); + ui->alpha->blockSignals(true); + ui->alpha->setValue(alphaDisplay); + ui->alpha->blockSignals(false); + ui->alphaValue->setText(tr("%1").arg(alphaDisplay)); + ui->alphaValue->setToolTip(tr("dB(1 - alpha) alpha=%1").arg(m_alpha, 0, 'f', 5)); + float t = m_flen; + t /= m_sampleRate; + float tau = -(t / log(m_alpha)); + ui->tauText->setText(tr("%1").arg(tau, 0, 'f', 3)); +} + +void FFTNRDialog::on_scheme_currentIndexChanged(int index) +{ + setScheme((FFTNoiseReduction::Scheme) index); + emit valueChanged(ChangedScheme); +} + +void FFTNRDialog::on_genParam_valueChanged(int value) +{ + switch (m_scheme) + { + case FFTNoiseReduction::Scheme::SchemeAverage: + m_aboveAvgFactor = value / 10.0f; + ui->genParamValue->setText(tr("%1").arg(m_aboveAvgFactor, 0, 'f', 1)); + emit valueChanged(ChangedAboveAvgFactor); + break; + case FFTNoiseReduction::Scheme::SchemeAvgStdDev: + m_sigmaFactor = value / 10.0f; + ui->genParamValue->setText(tr("%1").arg(m_sigmaFactor, 0, 'f', 1)); + emit valueChanged(ChangedSigmaFactor); + break; + case FFTNoiseReduction::Scheme::SchemePeaks: + m_nbPeaks = value; + ui->genParamValue->setText(tr("%1").arg(m_nbPeaks)); + emit valueChanged(ChangedNbPeaks); + break; + default: + break; + } +} + +void FFTNRDialog::on_alpha_valueChanged(int value) +{ + m_alpha = 1.0 - CalcDb::powerFromdB(-value); + ui->alphaValue->setText(tr("%1").arg(value)); + ui->alphaValue->setToolTip(tr("dB(1 - alpha) alpha=%1").arg(m_alpha, 0, 'f', 5)); + float t = m_flen; + t /= m_sampleRate; + float tau = -(t / log(m_alpha)); + ui->tauText->setText(tr("%1").arg(tau, 0, 'f', 3)); + emit valueChanged(ChangedAlpha); +} diff --git a/sdrgui/gui/fftnrdialog.h b/sdrgui/gui/fftnrdialog.h new file mode 100644 index 000000000..f9814cf46 --- /dev/null +++ b/sdrgui/gui/fftnrdialog.h @@ -0,0 +1,75 @@ +/////////////////////////////////////////////////////////////////////////////////// +// Copyright (C) 2023 Edouard Griffiths, F4EXB // +// // +// This program is free software; you can redistribute it and/or modify // +// it under the terms of the GNU General Public License as published by // +// the Free Software Foundation as version 3 of the License, or // +// (at your option) any later version. // +// // +// This program is distributed in the hope that it will be useful, // +// but WITHOUT ANY WARRANTY; without even the implied warranty of // +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // +// GNU General Public License V3 for more details. // +// // +// You should have received a copy of the GNU General Public License // +// along with this program. If not, see . // +/////////////////////////////////////////////////////////////////////////////////// +#ifndef SDRGUI_GUI_FFTNRDIALOG_H_ +#define SDRGUI_GUI_FFTNRDIALOG_H_ + +#include + +#include "dsp/fftnr.h" +#include "export.h" + +namespace Ui { + class FFTNRDialog; +} + +class SDRGUI_API FFTNRDialog : public QDialog { + Q_OBJECT +public: + enum ValueChanged { + ChangedScheme, + ChangedAboveAvgFactor, + ChangedSigmaFactor, + ChangedNbPeaks, + ChangedAlpha + }; + + explicit FFTNRDialog(QWidget* parent = nullptr); + ~FFTNRDialog(); + + void setScheme(FFTNoiseReduction::Scheme scheme); + void setAboveAvgFactor(float aboveAvgFactor); + void setSigmaFactor(float sigmaFactor); + void setNbPeaks(int nbPeaks); + void setAlpha(float alpha, int fftLength, int sampleRate); + + FFTNoiseReduction::Scheme getScheme() const { return m_scheme; } + float getAboveAvgFactor() const { return m_aboveAvgFactor; } + float getSigmaFactor() const { return m_sigmaFactor; } + int getNbPeaks() const { return m_nbPeaks; } + float getAlpha() const { return m_alpha; } + +signals: + void valueChanged(int valueChanged); + +private: + Ui::FFTNRDialog *ui; + FFTNoiseReduction::Scheme m_scheme; + float m_aboveAvgFactor; //!< above average factor + float m_sigmaFactor; //!< sigma multiplicator for average + std deviation + int m_nbPeaks; //!< number of peaks (peaks scheme) + float m_alpha; //!< parameter EMA alpha factor + int m_flen; //!< FFT filter FFT length used to display time constant + int m_sampleRate; //!< Sample rate used to display time constant + void updateScheme(); + +private slots: + void on_scheme_currentIndexChanged(int index); + void on_genParam_valueChanged(int value); + void on_alpha_valueChanged(int value); +}; + +#endif diff --git a/sdrgui/gui/fftnrdialog.ui b/sdrgui/gui/fftnrdialog.ui new file mode 100644 index 000000000..f7cadafda --- /dev/null +++ b/sdrgui/gui/fftnrdialog.ui @@ -0,0 +1,320 @@ + + + FFTNRDialog + + + + 0 + 0 + 365 + 112 + + + + + Liberation Sans + 9 + + + + FFT Noise reduction + + + true + + + + + + + + + 0 + 0 + + + + Path to fftwf-wisdom executable + + + Scheme + + + + + + + Select noise reduction scheme + + + + Average + + + + + Avg Std Dev + + + + + Peaks + + + + + + + + + 0 + 0 + + + + + 120 + 0 + + + + Path to fftwf-wisdom executable + + + ... + + + + + + + + 24 + 24 + + + + + + + 1 + + + 26 + + + 1 + + + 13 + + + + + + + + 0 + 0 + + + + + 28 + 0 + + + + Path to fftwf-wisdom executable + + + 20.0 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + 0 + 0 + + + + + + + Alpha + + + + + + + + 24 + 24 + + + + -db(1 - alpha) alpha is the smoothing constant of the exponential filter + + + 1 + + + 40 + + + 1 + + + 13 + + + + + + + + 0 + 0 + + + + -dB(1 - alpha) alpha=... + + + 00 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 0 + 0 + + + + Path to fftwf-wisdom executable + + + Tau + + + + + + + + 0 + 0 + + + + + 40 + 0 + + + + Time constant of the smoothing filter in seconds + + + 0.000 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Close + + + + + + + + + + + buttonBox + accepted() + FFTNRDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + FFTNRDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + +