From 2cb97da6e2f31f97c6868aef3fc4e91d8ed5727d Mon Sep 17 00:00:00 2001 From: Stephane Ragot Date: Tue, 26 May 2026 14:06:56 +0200 Subject: [PATCH 01/10] addition of SHQ/HP50 filters and EID AMR tool, used in 3GPP SA4 --- CMakeLists.txt | 1 + src/eid-amr/CMakeLists.txt | 5 + src/eid-amr/README.md | 29 + src/eid-amr/eid-amr.c | 95 ++++ src/eid-amr/test_data/bf03.g192 | 1 + src/eid-amr/test_data/bf06.g192 | 1 + src/eid-amr/test_data/bst122.amr | Bin 0 -> 152000 bytes src/eid-amr/test_data/bst122_bf06.amr | Bin 0 -> 152000 bytes src/eid-amr/test_data/bst475.amr | Bin 0 -> 152000 bytes src/eid-amr/test_data/bst475_bf03.amr | Bin 0 -> 152000 bytes src/fir/filter.c | 63 ++- src/fir/fir-flat.c | 666 +++++++++++++++++++++++ src/fir/fir-wb.c | 736 ++++++++++++++++++++++++++ 13 files changed, 1584 insertions(+), 13 deletions(-) create mode 100644 src/eid-amr/CMakeLists.txt create mode 100644 src/eid-amr/README.md create mode 100644 src/eid-amr/eid-amr.c create mode 100644 src/eid-amr/test_data/bf03.g192 create mode 100644 src/eid-amr/test_data/bf06.g192 create mode 100644 src/eid-amr/test_data/bst122.amr create mode 100644 src/eid-amr/test_data/bst122_bf06.amr create mode 100644 src/eid-amr/test_data/bst475.amr create mode 100644 src/eid-amr/test_data/bst475_bf03.amr diff --git a/CMakeLists.txt b/CMakeLists.txt index cbd02f45..bb454130 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -21,6 +21,7 @@ add_subdirectory(src/basop/test_framework) add_subdirectory(src/basop/flc) add_subdirectory(src/bs1770demo) add_subdirectory(src/eid) +add_subdirectory(src/eid-amr) add_subdirectory(src/esdru) add_subdirectory(src/fir) add_subdirectory(src/freqresp) diff --git a/src/eid-amr/CMakeLists.txt b/src/eid-amr/CMakeLists.txt new file mode 100644 index 00000000..9fcbcb5d --- /dev/null +++ b/src/eid-amr/CMakeLists.txt @@ -0,0 +1,5 @@ +add_executable(eid-amr eid-amr.c) +target_link_libraries(eid-amr ${M_LIBRARY}) + +add_test(eid-amr ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/eid-amr test_data/bin_bst.src test_data/bf06.g192 bin_bst06.proc) + diff --git a/src/eid-amr/README.md b/src/eid-amr/README.md new file mode 100644 index 00000000..9a3ca3ab --- /dev/null +++ b/src/eid-amr/README.md @@ -0,0 +1,29 @@ + ============================================================= + COPYRIGHT NOTE: This source code, and all of its derivations, + is subject to the "ITU-T General Public License". Please have + it read in the distribution disk, or in the ITU-T + Recommendation G.191 on "SOFTWARE TOOLS FOR SPEECH AND AUDIO + CODING STANDARDS". + ============================================================= + + +The ITU-T/amr-eid module contains the following files: + +# C code +``` + eid-amr.c: ....... demonstration program +``` + +# Description + +This module provides an Error Insertion Device (EID) tool for AMR operating with G.192 error patterns to simulate packet erasures. +The bitstream of the 3GPP AMR codec follows a specific ETSI/3GPP format detailed in Clause 6.3 of 3GPP TS 26.073, which is not compliant with ITU-T G.192. +The eid-xor tool from ITU-T STL is not directly applicable to AMR bitstreams. +This modules fixes this issue with a tool derived from the EID-3G tool (see http://www.3gpp.org/ftp/tsg_sa/WG4_CODEC/AMR-NB_3G-Characterization/EID_Error_Patterns/eid-3g.zip) +The EID-AMR tool operates in a way similar to the EID-3G tool with the following functional differences: +- No position parameter is provided (this restriction is to operate consistently with the eid-xor tool). +- Bit errors are not taken into account. +- Statistics are reported as in the eid-xor tool. +- All data bits in an erased frame are forced to zero. + +This module has been originally submitted to 3GPP in Tdoc S4-120998 (Aug. 2012) \ No newline at end of file diff --git a/src/eid-amr/eid-amr.c b/src/eid-amr/eid-amr.c new file mode 100644 index 00000000..55fec991 --- /dev/null +++ b/src/eid-amr/eid-amr.c @@ -0,0 +1,95 @@ +/* + eid-amr.c + + EID for AMR using G.192 error pattern of frame erasures + This tool is based on the eid-3g tool written by Nobuhiko Naka, NTT DOCOMO (see: http://www.3gpp.org/ftp/tsg_sa/WG4_CODEC/AMR-NB_3G-Characterization/EID_Error_Patterns/) + Modifications: - using G.192 error pattern for frame erasures + - only frame erasures (no bit errors) + - no position parameter to skip frames (usage similar to ITU-T STL eid-xor tool) + - all data bits in a lost frame are forced to a value of 0 (behavior similar to ITU-T STL eid-xor tool) + - statistics reported to stderr at the end of processing + + NOTES: + a lost frame in DTX on/off is signalled with a frame type code 0x03, independently from the TX or RX frame type + + Contact: + Balazs Kovesi, Stephane Ragot + ORANGE SA + firstname.lastname@orange.com +*/ + + +#include +#include + +#define MAX_SERIAL 244 +#define SERIAL_FRAMESIZE (1+MAX_SERIAL+5) + +int main(int argc, char *argv[]) +{ + + short spch[SERIAL_FRAMESIZE]; + short epat; + + FILE *fsp, *fep, *fwe; + + int frame, fercnt, wrapcnt, i; + + if(argc!=4) { + fprintf(stderr, "Usage: eid-amr [AMR bitstream (i)] [G.192 FER errpat (i)] [AMR bitstream speech with errors (o)] \n"); + exit(1); + } + + if((fsp=fopen(argv[1], "rb"))==NULL) { perror(argv[1]); exit(1);} + if((fep=fopen(argv[2], "rb"))==NULL) { perror(argv[2]); exit(1);} + if((fwe=fopen(argv[3], "wb"))==NULL) { perror(argv[3]); exit(1);} + + frame = 0; + fercnt = 0; + wrapcnt = 0; + + while(fread(spch, sizeof(short), SERIAL_FRAMESIZE, fsp)==SERIAL_FRAMESIZE){ + if(fread(&epat, sizeof(short), 1, fep)!=1){ + fseek(fep, 0L, SEEK_SET); + fprintf(stderr, "Warning: Error pattern file shorter than speech file \n--> wrap error pattern file\n"); + wrapcnt++; + if(fread(&epat, sizeof(short), 1, fep)!=1){ + fprintf(stderr, "Error: Error pattern file read failure\n"); + exit(1); + } + } + + if(epat == 0x6b20) + { + spch[0] = 0x03; + fercnt++; + for (i=0; ihIECbc`1H94Kv3P42o7jCke>{*%VU;p~ozy8N> zKY9Mg=aiL?T_#LLwHG!&r_RZy`uDA-iK6cKcctH?AZ3uH7LE`i7Qe9B0btjEAuIg@55hgK1F+ITtAwGOQc-*U;edkpKEk8Rm z)ww;@_U@EsI2H7vi?)g|R_8?TMCK>lS4QTlFj-DJu$vyAYC1m=pj>aCb%J-Y(G2SR z)H{9V>AgMmES6Kyp6Y9-+3t6)OZ8BKaVmKOXHJ)!GoLdLK2_)xwRQFEL>7MQ2ErVA z6bDw+&D^P8+2wO?ozqt26z$}6Bh#r4(p$>Q-p}oAt)4C_qteP#_UAhXjav}?2I-yk zYTcY5RbXE=m|}L`iFkK!Xa*daR-xUVVB*$Py5G3^;3Utg_?}4Zx*odhjJazOU{sZn z+Go$1_j9U&H?dXF&v)*WJ?pyQU@~W$*&Om=cij{!(^Cyk`L`E+9E;opb!b|hPPLPD z^3X;B9NhLv;#wqLI@)Jfql%)N3`NpZJ*Q$hqXP0i7t5)P=Q}SJ7qaMB{&v#U*;D3u z+Q(HrGSY*u3M_aZiI0Ze^3(%UBniN~>aZyJ`l4KRv-PBosMf27i!438(fZJ%bK6ER%X{zexFZQs?oT+H9w{)nZi%o3ng6V(orlvxr(QoPWK%b27?dCl!-Z#YF6y zs!?`3o6@t&Xm?%JH;lRNT^{~T1f)%?efzV$YG&CzQ-98rJiDU0Z$7#w$5c@; zXK}DwgGOO>`jE zAxo>R)zKv=KBDd%=NuH6YOUIH7KQDS*xsoKmb-UV0glY%iz9((5O7p7Bl@nov_`dSRXE{cUbC!!om2;Pr&B}S z)9IX^`po3v0-~(->{+aPGd+LLVHFv_=I}&!tD;DVLb{-;D60s$VyW9T1IpDD;jV`c zO@adY+YK@gyZ+A#MfA&9KU73iNsKN!qT(v=d6VU5>WA}oR1U(vuBmpi2u^*>Nt#aO+hN!F+>5zc#pSeVOi+L4?9CG->`Zv7Rvjmxzgtn0uX6VLqn-}U z0W$NPc5MZlnaU!WwOiENJ4Z8^JUH&@)M4TZT7`5~K<(_<)9LA1Hm>R|v!3uX+a8=U zQBooOJTjhHIxmJ3e$HEM0?z2~`DBr)3gBhctqNk(DVp=v%b@>!=k!s^c^~!ZZ%!xf zc#GI1MdU=~E}p%!_N$vyp6c~%uR1COlc|W0#8-V!iVI2wc4y_#p$6}|4Ds~HQO=o5 zMRlI&Oi0#!)js2|-G9TG?9KpBHX3@GkRA2jtVxP1vPw7>tqv~bZVg8!THfGR zDsS=8brJ@jcEENm9yeFqmaoRiz4_E;ICq#R>(kw&_$)S>PGRfv_InN!U2*NnXAcSt z`mA=>_g$|lBxJ23ta~*T?A6fORJw{}POjUls;A1yeJZOXt~>50gQ_J;jxRu2wo9^ap zhe_vK>zZEA;iAdODcUEpJ~Fz4gw?LKI_@f2pBch>zVoWeQk{t!o#u3YR>KUaEUUU` zst=|-YdXQ2K@2@Itm-mR@5)Jp+)W~)och`;|4fxRkIH6Em!4|(u98SgGASXSMqJk_(*kR6KUr zUALRF={(8p%{mcJr~Po$?a5A*K$QP!e7sdDro8vxa~NIGcEzn4_dV86tlrg3XEnB3 z1^VTCuXDFDOO-RB+blgXb1f2*D95@NY3r3ynMZa%5%PRr|9cvw>y*6dZJgJbup&dT^)DSq5?{N zIl4J7QoKsmDzLjQ4+e^-?rQanva3q+N&OG|FgRfHg&tB5ykwdjL9Q$HbqIOL}Q=*tj9w(h{_XGLD+`s3Y zagujy-hNGpcN19K;kGybyb04VPIR?AeISFQR^4576sa<6O=bO#-z@d74s2_+++nMc zoKDD5Hg^zdABI?5oLMnlr=IKg_V4rNiRO2D)c_^Z#LQ(gEvKmR#O_|+>0+{GDGIty3=kWN?K` z1v_{-by}R~vQ%cm?L=9g<^=tPkXOOf|$XUz8KncaCCH-~J}L zIl78BCwN!7da#q_`Oe8;LVZvDRUna0i^HKxBHc5=jZRki%$J0A9uC%pcbv}8>%xBy}k3QR`Gi+6f^h4ebA>% zZs+F?PNx&82HmZqQ7mV@M1yx`wM;WJOO?kg&!@7t>_8>_mT4)uE{8?|EnDMyIKR=%cDG@I@EdH1eOb z)4Pglh9S$TwU{EF8N{el4OG-R=gxxW@l-y_);M?FOlZ5xX#HjJn-@KmQ9E&|(B@Q( zeW&tL|Cx7QrS&+^&5rtVm~jXD?a9m}54zb=s*kfeh?41~OgnO6)U!yn);Cj`A zJvv>%R+}kva3Gdps%7nb-BeObE<4CNc*@kXF4Qtkgw;BicQVDm$(qjD^;-}Fg0Ab% zIE$)Ub@WK5-SA{}^6Uf!Yv1{e1Ho!K9jb6AQF)Vy)&Z4NPCmz%?999FDQ9`OZrur- zB1Cs8^5yNW8{9fWf`)KxA+bdcqF>JAQ!YEDz{J6|n%^kC?O zPFMSj3XdmU5zFa0Uiz6$ExGKX&^vqhI8hOXvr}#P`r0#{diK#p@6@IO-^q4wEj+|_ z*DHHDo%bYy^rCy)^Ca(n=c=%y(i_4e>z%lDolHUUuup}$c&b-B=`ELv`S$g7UlzVQ zX{IPKL2Y@sfKY>-$=!2y_M@IocTVa$wY#{SnY%mv48ByE1y`+Ru?OmY=j#9;9a+rj zsV@S|x|h`(7X`8^)_ynE+3`Sy480Kwi#QpZ;+(7#9#usT?rPVq*xn&M5h$v=N@|;? zjGXM&HJ$bNg8bg?^i(2EGm-6n=c=n(4Ry1Vj1^>cRS-puj=htKGP>yOTz&Sc+gHe6@3E|POogh|C|>o=@QILQhen}ObQg1&0ypsJ&6)izbmd0;p}aq(hy0v9IpRY?alr=HO* zFB2aX&YH?}<)>e+XXoNU***VnEa`fW8{d8v?7gwzlftuAcTQ2vgI=fd*uC3UB!*oc zwYPyMQubSy44bLwoJ{!SG7;T8vQTEeD$Lh$k!NO5_Qb8T=k7hN)A@T&D(1aenD-Bz z?ca!`T2CrEp0mT_B>q&Fqnow6{p{({x7s_&5SKkqzY)-OtXk*9Q+*Zcd}5f(boM3l z+jjCcFId;zMd|&fqQi~dcaG+n&7S;B^Vyx5-MZVqxggWMwU+Bl9J`$6+ALz_;siqN zVsheHoagH9DQA>SqJlLDDzU364qhsLtmQaSPab#_>A^^+*i-HF*mtg~cvRG3R~MD` zbSzr7`%@JyncUF~D)(09Z*SG#IqKI<4;8bQ+pc$Ep2|+qo=^wz) zU^4epju@P`lFQC|zH?PzS*;STJK3p;*@Gfq^+503Stp*>1ym=TaOesnGk;Xij;m`s zqD=)Chq6TBq0`B!rWz+-v>Mc|ICO<8hdeT~pOaQkx4?sv}poZ^{Ep1TO}bV2pp6aMBQ zwF>U5bf3Y{J+r8V7gcdOhVR+EnoL`l&x9I>x}(_DlRJ31xZ=?@T|DgRQWX(k)v+5z(s7!8r`aKzeGBQ;NU zyKtN_fw`+0<*StbeJ;;wG0b#7y{T}hPt`UX$~cQawY~eD!>|6CwrVfIfPvip_rO;l-p%o|ww2j>_Mwox0%d zxx-F%zw;&q>;2u+ZN{9`>KQEk&b_G$PQ<r|$$rpex^diGQmow=%$?wZ=4?QOSN^kN6^8RdQFr-tb4c~sT?tWkZg<*CAsVpqGQvU0B{ zoz|SXI^PaSNz#PY?o8yT%TGGamTfEEgR7Ig1i zo$N)OYRq-Y^C!J(MMItE3EcVr zW@7bWR=Y}g)X5VbI@#@xdTUPRP1UFFdpFMQ6cwiWXAaSwf)ynXt*+pAeWvr3Znu}CwBCxwdX?x+1#T|~~P*Xe%e z#fX%Hs%zbt%fqizRA4dFJD76ItCFk}Sr&8Zp4C?oJv8VQ@njWu>t>Rt>|0qicBXZd zR}DMa`Eh-A!pfsw5P6EE2EiFjbBMU#dHSHLwAon>sHmeR%J6npCHT$lY5Ss^11(%+)CC+0o1pkbprxW}*2~#<4h~N+ zI909PVC$$u@tlh1Bu;L+c~IjdbJL1R4>Tv4_MLuUgS@qzvoG6;J(=uu&xHF;I5%Tw ztLtsM_Z}!@;wQ}2wJLk3uy9NN`E&j^9LV<-2h~wBm9y%frzpa-Pse=Dm{OTy8QuWD zR5I+qLRTGU?y7X}Nv7Dk>jc(xR>k9buBZn4refFZ;!>}Ub@8aRpHm+Du%Gq!zvpV} zi;{ZP4$c|p)}Y$ulr9h2rn1Vc8g%Ob8pNWC;H2t0trq=tk^!nI^m1<9+i+67yC)d( z)Ah#_NUE&&$6KfDGC9PY3UG-s9}5wEMcC&lHE8+s(<^ zEbg%ID+WHb2zqFNua~u|pr}r*a>%55vFnNs>L*gRPEK(v4_#JfyY5uQ^M8{;7ri2K z>YaOPpIg9F#TD3<*i5f`)4~E>j4uEeKO(PwO*XQN5Rnv{Z>xv$Z2acb;oVLr86t4 zBa5DBsMSiB?4EN%gPlIUr@~H7 zSM)l+lQ|KmlfHF3JGz{^mFZS>Z^Ids*v{9Jb9DWbMF*buV!!`vC&%fqJT#lu1h;As zPi%7Va5C5Wi4oD6-0D{A^h>|m_qnX+1eO^(S4|)HAk+ihPWsggZgpGH)nQqjQ7p4ZtmPU6+gII=>ocyH68u%P*Ei@Ol5Z3IX!ZuTSgr?;qe9d zZ9C^@B^JHR_|&(j{r7oQO;kTmOgdM2J@s>!TYWnwgdIE&Cu_Sm3;mm`3w`y@?&^CM zX{PKu!;KEu%=eKY3kE9koK@S7`;Es1?YQAtw0I}G2i1(8_nj}o{3!oUr`2MrQ+ef-g^GG0+KWc8{LpvGtV(Er^(-^kJZdqolKR^( zmaYn6y?@XbC(DF#_MMYyo$Lg?kCiH&!S1R;?}8Qxr|P(y);r)QQ}t8B3~13y*=gf*&{QEoq$o;mM&Xc=-)G9yI zi&F<@^O*yFv{YE0{Y9(5}dQU zSH1E{SDp#+PL0)2Y5Nl8evQoNp%e-o&%} zi9q+eRrTz>72ljXPOQOs7g==>zZ22yV9~RaDt#VzdsWXw96OzK`ROW4O=_y*RTRB@ zuy495s`d8HPhM2NOQuHFiK{pBwTEqq+t>uK-f8GJFDP7KqmdCbG!9upAT zMMbnu`mmQPe?4)QiMEWB4^jk}_QX1OvRQCpvhQ5XscE-Lo8OFbf<}K)^u(Br9bMP5 zQL)Z$M`d?rB2>M*bpQdIZad31?<$c2?yhye5uny5Se|9UW5)bknaf+%o!D2WGt_dY z^PQ)2t2SZv{5HCGcH&i27aTr8iY8mDp7dA*=T5BA?OK(btafg0a-!(UE-M}|Ia#sW zE2@2aRZ7PyxH>t3vwo`*E+2JJdt;+fkNeMdbrxZs^vv+)Xb*SLGEU#^Hs$isSf%a2 zsRJhw>$Tba&U%McaJrtbi^|Nr=@x7EoEO8KS{`bw^kk>7Jdx-8{yooB zd^OGl%*7S;UqoJ#Dc7Pb8~{>`kcz|L@b(A=J9(t(ID+*56<;- z{8TFH*&2-Brq#|-l$pI~-N1)kG^l;&a;qg?mXrF|&0hC2t?tZK%Dx{R>BAu@YVyuR z&e*|MRjuvNQ$>b4AnPSAbFg)yr}nAanSGSL(@+0=7T@!xNO$!*dupM-@BGv(168tc zb`^sb&YVqt_EZv2zNRGoI;rDCy=RR|@FwVP*W9WWv8PkX%<6h)HJ|-xffBoW&ir_) zQk|RdO<#rXtI;k=aAytf`Oab7>)yhw>?*2XBqwW9HQUX0f?m;glGfEfwLs8|PMAh;vR>eM!i-+ypD)k$;-KL{=YHm*?-d6k0gXY5tj2X+$@%n$y)Wk9W_^8+C8j-ujYMg&=hD+{DX=VHy;1dY_0?UzB}nz1UGD z2RQroZk3&jv4`3+emsGnRUCU)5o)&f6f8fh@>Brx_Ir+Y*sxMp(bM*F-j52)$7Q%HNazyTM!WP?F4H8N9#$E$RI^@g(aq{gi5Rntsmspu_s!Y%OgtU`IKeqz-uf)3fZ$?A%029U*wz#WA%$*HQ7 zI^;v8S+=V(8Cos6{HM1JHN~cHitPK&_2QmZDpBvuEcRN%QNg`RMatb&!MD#OTv_Ox z2xe7Tj0$HC`R%qt0v+A$s)t8bCeE9s{h~abDtJ3np_o-#tezrMpAQ{z;qE&RPq*r# zpq2{G%P4zi`pZi#M@=#0X6l()d*P^c`ltqinaHT@oLYXW%!|$$o$^GT9aU90YgJbp zq-!Uh&{wBBr>yPOwe0Pk{$lo>r>9<+y4!Vk2A&mlJ8(@YLcLR26sl!bD~MD(Q)_4R zz%IIdW*?!i_tNK_sCM6Jz0oMoRB+GgeCINE@45MP zi$}k8x}tFFEvU)u48Gro*sXP1o}MIQQV!j9(8YX3*nzEwp5(dNqHt)1256Z$k++HJ zzde+|-V9wxCPwyIi#3TT_F(s&lho|N;L#m~D)j;lQT7c z=Hd49Mfr3*yMwwF(p9CiDmw4XlapsY^jJ6RlX?4qNaCj|Ik`=FU`3y9`ehd(zYga; zimR3g^>9ZuDCZ|vR2`qc=S>e9B^ax_4x39%c79O273k_wB>diinz@SZDsNp~Io`ls z2R*zA3DecH3U=P|R!_xM@{BHus@+cZn^Z)7b$iDazbEy`_x8@wS9|ZlIcldP_v!RL z>AAd*$mgF;&|pN8VRg2XeiE3`GvN`|3kNOd zJ2`u%pqrJSGC0u(t%4q9nD0b)&Pkr=I^zBGc&Y9)Wxm{UIKcEke8lLQ(s;3e&y7W%; zi7%@TL5Si^HoG^ceJA_Q;|^a3^OV<#Co@>1v5cOdv#|EF8918(6k6UHJ#Sv5K2?wr zm1TK8Gk`&_=O#ccT=_RPwJ6SFLEgPLEJ!A0-$}WVSTmm4#Gul5uJ&pcTdk^dU+*TC z`LFfo{RaBZ|JNtv{l?FK5_%8buxt8zF7DUq=lcf!&;K#guXpY@@lW6T&j07)+@9?ziy& zSFi8fzn{nd`OfJ&^M9QaX`lbDOZDsddB1_@-_Miv*E|1t-`IaYS%1&{`}v=H=l-T= zf1dyQxqd19b>G0RcmCIXw?C`$uXp~lzL~!+*MH@mC(ZsF|JR@Gf8G1}E0lk|^S|O- z{kb)Nz4M>@{rnZ_`p$p-{rs=^et$;IKlAtV{_k#{e*OFWXMC4`HdBAkzyJHWZ#p~w zz4q&!|Jm>NXT<%Pckch{!rnK}{~mMyQ}8q1@>iz)27bNs{WktH&i|Eno^OUf!-`n5$mVM`c z{P%PJ8;*Ypc-z0;`QPvDKmUHtf0uXV4Rf>S8-8~Fe&4}=TH^kmfB*OM{(kdM0{;~J z`aS=<{> z>3P3JH~8zF|LpJa|0UnAcmDtKZT&N_edoXa ze*VvRqknvhUw=RUYLAn( zxDVlhTOCyJa)qV-iH?Jl(`CC&#tGJw3#Y!-5X;OeyB(GL?{jkpBg(Tp`c7pO@8sse zx2uXfeXDA~N_`@>zq6t^Ev{MnZLG5M)#F~Mys@fpW>u)EdNvhWRkTl@s)|!#8Ovb~ z&%WGSEt#J0+@$RFNo}P|Y7;pX<8EKvW<#@xt$Svk8jbs28DQ zNasva@gv@OyKj@Q^60A?-D*(leWRCEMRdDXgA)_DD%%rF`t?KK)m_}lqe7E4csM_P z=iJ!erm37Z%uM)JjCg!hmJ7xV!!|YS5segG*GAx z$?&<6I|Ct(iHiE0YSYT7c1|#|i{;;*IZ+~&I5}nBd=!{33!T-M87xTD zsm@hZIo3Mtu3CEgV*qdb<>d5=dN5O>~QT`sh**(A0M8aO2mZXz?VizpCc&Cc)P?s6OkUu6#I~NyY5^ zMCsIM<)r(b$Z)GyFWBerIbA)d;Gm5j=UdCJY_X`M%g0)Nap~}=v6_p^*;-YxYGf~_ z)8^=0tXii&xXyBt%c-4CaCH8T?=%VW;F3OPd7s8hS3eV|sLrXB?(_Hj^s1r>oL8Gv zcoyZH&Z%>vxJ?jwL{fESUKc0wWNz(wxj9#b%1&|i*F~1-%;>p-PQ|APCa(H0k4hi8 z*_kZ*&G8MXqFgZey}k3r=iDDpCKP!lSqA6Mab<Z@%q}^fX-{rZCLp~iccyrpNd3+k>CqBFZzpCh?)%^KCe;a+mFn)BJQ#jJuU~b& z*J4GwbC>FQx9z-n$cs*%rmSnViuiy(_-86+&;0E(BhQ_n8Jsjp6zqCpy4tHwU!F>O zoEqGu`hWKKyxzK@r0dz;bmr01*&9PmI3VodB#TPi>7fHVeBD*C%eUjy{p{+g%UM(1 zdVKq?xSkkhckju7tAZIwdgmp}xyHdqx9|RJFIJy0^+JV-IaU0g2||_X(UI@GI_q|# z%wyNO8dU+KYb)L1I#1UhH1@Wq4|7t=hb?nwsN%}{j$IGYsGkb$d4uLTGn3-`KikoT z^R98{HTgSwZvdj&%+Bwn>U%>u^;+(BSB*a3jTrRNM%50uPB<}@tt)%FW$AYA>#?l6 zk5(1Mf-Aad?QP=oOa&w8x8L*h`&fC0>WNxJdG*K~j10aZtM0|6R}NJb$$(06vbT?R z9Wu+KqDpwFb#~Q2zo}4Cs~&sOhrKRvQPj;`&fb*kekumLGcwTY1kT$#huk9&FOv+ab+U|fQ7aB))KS=76cd=vx3?1z}6){e4 zCme#xqf*c3`~&*JZJuTBJJ*f5T4r-F^Li^$m@@MVEkb9L(HbocUll7W|w z?y^&JJ||(fpVL0F+5<1cDsytEM~5!#^{tOxeXFQWn6SPyOa7qdMlWW18K?tTtMt0_)ivvgo(V>E`PvTD9ISop#gr;~B^L-kRpu`#bIG zR!isSJwW5tyX`x#pNVvqt9tu6=>6u-A_Qln!n9e`M-|);}T2&F0b>=F#Gi!w& zIPhvz1vhILRUicla!saU(Kn7syLy?+9VJ)wtTz)mJIP6X&Z+mEJ1@shcAt8Z(WLhA z4Z0J1?TE%pY;&D%@L_{-Ex#Vi)rX$`R^7#^n+azzAWYi%lOaz{Io2xaU@edSsT)i? zRK=T7MI6bvJUaI~hb`xJ+J1d-N&@w(;_S{#U)*ZtTwgWmxSniWU8_k)HMlbUzD&)& zZX(^)SLeiT1>#hGt5A00y;bV&Dahr}Z`WEy5^opw{mxbJX61hjKmV+GC$Q+CzZ03v zPt^9%y5GL87`e#+ofhvt&+uI}no??kD0a-Ocb7ayIdcCxdbf)FcSCdiM>Z;L$l zqPfA=p2^W0qH@3Upqc1Gy-pv<@3%tN-lCasqcd00(X9e5b+#5`dNt{TSA|(7_BpSr zy10w9E0U>RR``^OI^1IPM7vW?a>TQPm8q}Y)UtbG%4`wm9n>KE^PQtxbyc&&QIGo5 z{-oKyNOseR&_kC+t0xAIT|F~Ztq8hI%18bC3_Ho0$CFO0r{j&qsnc^_CA3kj+vZSd zwKkFG#Xa5XP{-$g!|{EYgG#OXx37109PW-+XUw}iP0mm6CAvS)v2ED^Y=X6RZ-Wznqb;RyUZsq z*gQ_2Snv1D2~&^G)$lt2hl5@^I$*V7(FwWZ{AY} zJe;m@?p$K;bUMfqw>8PkXT~7}tC+2;L7t}4>+ax!$Fg(gS%17-GdIWLzlfiI zf=^}f>B_WMwbjyH&7$RtRM0L~SkPJXRI3#y zSCF?yyJ`fVbAOoV+o}j>>>!wa#J;rbr-#0HCw8r22jwF|$Ml&N#c8|p?LE~@#H6?~ zbFx}KS>N7y(QvJ;OuT*6x^e;m&ko-}lAL;~I@zpnL{tw<>ztks-J*hMZ}D{~TIBBJ zfeF$MsNR*6E6!l`qUS^;(_(bboF9>PP^By8Oe6CBo$Ck+9T}Z9t%&YD>HF-MGCEA} zPP#no^|oIoSQIh^>zqAnC)IfRibCnu-Wo;lDymmDCo?(!#5t1cyE*H&_*Fz#_2S8c z8|TcP?_4eQyEAE;s?c*af!^8ev8#y!)A}w(jh&*Wn-wbJ=~nqfnYr?r&XsdnX*= z*!MdnqdM#9WW8kd+f`3AdvTn=yP8Mr)1iFylaI&RN)2zlIA_g(PH!uMy)Gu&y~=<5 z&cRk)?xt2-SJCM=r{4sbS?#SFYH-kpfO6-B;lhpz@Z`0eBBRJ2`m!T;!;KmBhd zH0Zi|8*d>-S5k=L+kyMmJ5`ITin{$aneDf7Vyco8l_y!|l8I)O+yCBI4IQ|jj#aFd z-vEropPf!};>VSlEBnd5-?`H&kd2$2Yu&0GK7CFwdMj)8B2O3kW>AwFeetdEAc=YG z$z_qMyl-v*DYuQP)+C>}YTi5xmsg{|N(r*n;*B?#Lm5GYg$y+2i=AiA^GvC{t z((617Yfq|yI#=$M-u=#-q?+`oUENPNtDSnzj<4Us>cVWU%+gz|b-QR%x0_RwtS=Kg z(O%ryXPQ+M=c34S`W9QS&5a)#Fi(|EPF;EHP99aZT9odYlj(ftI}d`|RZi2Wh1#=dh@VD0U~%VSS3Yp1Pq^10EVibYp+_wrC{9fl5_*;xgULGy7Yt8*vW ztCSNzI-W|-&>|;&e~sHQdY&24q$aZwNmBLt6WvfQ?K|B^;$ro)3YG6 z>|7^jtzorqot?xzfuidS|E=^rd#Kb`$Mo}{1DDR*|1Gr%#LKY8fl4&Jdf*p~C)ubi ze)Sg(x2p;__eO}LUvy4&e`ghQ-o=d7tdblUL73p4q~=pSvE_;BB%Lz!Nsp(D!O}lm6mCtK$B|@5H2wYHEF8LDxK7(4mD!dprrLBqu|7UHWX_{AyPEFRrV|!F@>Q}f z^ZlJyfh57J*pu1x2PIafQ+7G3wJRIMy_#t8Ik#TrbJ9erWY3ccyJxXXiW4nf=7;{# zaq`~DR5cK;x6`7^YOe5f7pn$!Ss;s&`}{q>HStra3OcFOno}K7utw?ZRb$=tY%iz& z$f9GPgy@rm4(O~rD2Z+tPHGV6L`B)C)xF>8tosLCcl> z{hhBymFjuU+vh|Elbn8K(l@ajYIXFsR%=-@Gjkr7a_?@Z>d-m)_Q2Fdwe1JXQ&+WN zW_ow3DMrMZ{!99JxAs(3!CHkXGD-dR&c(Y&j~^A-x3?J4$(4Rqu~zBu>GW-uUR5|( zO$9VI1HPv=I{LovAG<5e zIdaS{oQpRDHB;Q-e*eyOW*1$qo;r}5>YkYfb`|S^J~+|hM3v2n z+hoe=T+5b+F6*tSR(J1kcB<7A{#7RtYuKwGmfpGQ*lc*9O!s6sN!Rm_9Z>oH&vsqR zfLbcD*sr6$O~45bxMJ>f=sK^ueSJ_fg$}B_%M#}f9+bIu4~`7%XO5=p2}Wu>)UHZr zs+mT{S%cEQPU_&GkDB_a1v*ntD8B#uT#Vl3F)@vatus}(vz{{ZgEq>y>M}f^$gP6N z$6bfrnROML9W7UsTAdtu_50923x3q35$&#*(`qx3%e;D>wkKC@bAavIlZ^Lwo~chy zs;6^$i+4gz1-7fYVxq)UJO~_I)4Or0^K@UWvs*5T@Y+><^@_0zzI{B*=#&&e<=N>o zt8;edCPYWRTwTQ4@17IM@b5&$=b!CQ)lc|Oe)&zpOpkIwT8n3w^X#T0(=*zxovRZ3 z^FtS{MRG2uI2}ZktEa3W))5B$Wx=a%b>!g?71{hiCvVcEUm z<_fZ@)TiSr-lXJqN~JShkyd)RGe`GUE5}LwJq3dn=slZ6kE%EU?Oeass%2NdQ%?BH z6_=Upn-T2JJnO)`8R1jIe7r5uQ|HPF1}!m|Is%ekaakSf5$yB<}55SSN;3D4YdiCL z#py=hN(}YtsGc5YuxHf?ebu)rrg^}n<|z*s`&3_`uYY#z{qgU)yrxn8bl$GX$}#ns ziSCmrudF?R?`p!T+1b6{&J&kTp0}NzD=71Im%TSv4c%0$Vpk34enUk&(Yp*zr*|s* znm_0U~$}9HIl&-rHWiIu-98|UA9v<=0!PS zKP$cUG$(9VP$xz;XC_6#yST%BsylbrBlYv03*cX z)Kme7hbYy+sALyS8Ft0m&%O^hJ7=zUMSZ;|b$zOlQ>S=z3O`*lu)}EYMp(-SpKc!Y zQKf#qbCQ*@Zk$oIuZ|8*?OTICD_qE9I`;ajQ+-b2nTxLrPH5{O2NWFD-h7KUg-rLm zuV$Dg5JLwhv!20|W!EMUp>h=#pY!QMhpw6K-}7pMMq3>fiXu0f&E>p!bwJ*F;KZQm z8tgeYJN;dqJn?o!kkBeSXIzWU>4~+o{4=lB>eZq8;^?Rs{XAvwsS{HN$rGGBdrq=v zzVE!cpsMt&)x(4No>8}tk{m1i$S4ww$gQdlPY3#{IE!8xIJP4PmX#Sm-`&*a>F!B~ zHx2d7RHa3e<@k486su8B7)Sor6AI%aRA%+*VBKqRzwwb+qHIl67_!INup| zx~Wc&)pb%O(%G+f5#|uXr1PF&pBnppIFXV4nVY=KV4NDTotxi1Sn*|_ClL4F&!4{a zFlBTW2f_|JUOAtSt|qLKNDx+?!-(2y)Xfu2omFF6%+`w~tvKAyd1vNuH=%g5pP6;& zR6NR5ocFHs_C~9mel>em{WJc&xBH#r;tI3X@_SR}n+1P)rV+<|?pu{lx}fQuwb{v5 zEm68G4lS`Fs=f*9+U{!6)$Li8 zB)0(7vl)W&DPPA-OmQ+$f>Cra=c&GUt>(Lin$oJm;p} zu1fBioo8~xVV3#6b7wN~p{o{q5uQ}foZBtZGw9xa(XyPzx4iSrOk|l)R63}vm;CG^ zIbcGK>uhsO7+G=FddvX5JJ727-tFYQPmRd)$ zgsZFR>;x~mT6EwnLUwm_)>W0|alTplX76J%JLrKik$7e@?&@UfhK7}ywtMs5u))C9 z71W*ZME&^pTpu;mU$1p5KBrdU^TB;H^em%$S@v#z5I&;qz%d28I^9utuG~QOYW1vh z_sn$SOl`NSDz`)a6ZxibdXW5du~($3>Ab!3`UKf*Jr$9Y6=yr=&V8Ci4(wKVSfj!E zi8BA}*cB@ir&gZMo1o?l4bnAZrXW0_(O$jnJrQC~-B#<357~m~%u{Ec*s}&B%YFMf z=Xt(!(6>jh^we(W&PJ_*dfme$-FY%IQ+?jLW_kBG`CF~4eRs61vYWtD+1!P``OaIL zP|V3_<$OK#RoU6rWH~*V2fdG&OnH9%&cQTcPnoE~j<$?*Y8v<;&-LV~e7d0G46XY3 zEud6APxY$;`cBZYVpmO$eq_;;X&7art$UHHv}fJxsD~Z*lO+#y*Pu-U({$gzbJ-xN z&_Tgl;HiFh=Q^oZcCpV{J9U<6icF%xQye$_YR|M-vo(PyRnS-^?xClcN!*A(B)Pkoe8GzCmO(K`_$^?tr{C%WxTO{fFf zBFud{GG$i2-MG=k??$v1rAzAGrm59C=cwxerW{g`Y0q|aI(esq6w zJ6bQ^6neDQJ39|IaK-)YovS4)dvs-Xw}0+bCtiNJbn4-xY<=%ekla&^lgs?+Xri~h z9`bOngGryAGpFvs@svT&w2R~%e9=_aq+SK*Aei(XDs`&wzH@u3zvWQD9c@}D-o-MnWfccXje6-xag&~so-tpSwHzj>d?HX!dwS5>{vC+p3rY6YGznv z`poE)gVl~bHJWf8^epSdTd9qAS@7tp3&);}D5xUB8T;EiC$-Ar(L&9Y9v6%6aT2+*5=gGDs6D9F>o98^8 zx#ZHN+JthM>^nCnJDfL_Ra2k6>#c!K9dhd9^kji?cJ5`T-^y(2_q!`DJ*tyQe=|H2 zt{zi$t7`723+$bn_dSnY8E0)eGpT-}>)`2r=jy-{wO%>X=ag#aRAqj^2M09$lUwCZ z%f~78nLN|l z`a~xoI%F+QrhQO2lyRQKsJdwM#21;<`Ty1#wn(+In-yIvC%Vbhv0gA1=egQX)n(yT z$ISF`cKWNFu1R#2tAo07%D|_qClN5ao*DE5ZC(VFWIP26sC)23g&Z>cQW<^~+7@dl@kC#q$4vy#Uf&Ci3pq%f1x;4Y8{hedI zZp~G~gWRj6hboKPGv5)+U4wah=k@la6T4ZNs_tw#%+e{=N}Ri@M!BXFvw66~`=9N%tM`RZhOXO% z=_+p%RXeAxsKuU{Tj4884Rvs2mBZ|woNn?-^foIWU2=GXPV2T>o`X9%spyKSvS<p=RP>2!-t<>L=Y6QeH(yWA-gj`g z=yZD2p(v1gyjP@D3l$kwC~`m6cFJ#ZPGHdLDr!CGJ>PlyJhJGxKD&Dl&URFauYAwd zaT3hp%pVo{MLH`Uz4kqsVYNBSK)pR``Q@Qh9BE9~Y|9Y6)9Pmmzr8(?VNs$%F;OGC z=Uast_ZwkWa#v@W)w0`;itK1Ht-9UC+_&Pnn1i*ts5SNm$ic>dWgqsnyTr*d}gy+_lic5<4bb2)VC z23E%H7<6Y&>$Y>w%);@MejYnHd9EV!d+i)fbxd`4P=;3@bwQUaF8w^ZfGFQn@%o6A zAC3JzR~5V{^v+ok>!v==O$b*7?{}wy)$Vuxn+Gj@aa5-}^LvU@U7VMPItb6zT0ER; zsUi2?xr3{`?50v-_r;R~w0*0(b;1mXedk4ZAK3K4Zz}SLJ=r(>n5jrE^E|uvI|u1~*OT5Vkr0gMG8eCE*|JPTde%jOQwy|SR@AGI z&Z0W29+)R;-Epv!9VJia#7Z|&>x3V=_qnwvZb7x)_H|N^`ka!Yz0~LLc@ZZcN2gZx zWKvFY@?&D^;;cKjlf9pI&%V4M`^dB7EIVgAsL|aC3gN5VX-;+6YP;!e~f4GPtfQw1EV#KgI~K4+d{SC=!2BH)v$TFt2L`#bNQs^CfGt(&^J zJl(m_4g-Ysxz`2cI&g+>3iiboRjwRaxZu3&s?oP&wNBj7+pu>YMp>fLD-!hCk(aJ& z^xA2CYkercEq6bRedj8WF%_JypVp^)s-f(9qC}#eiXTvN^xlm3th%DnPCr=IJ?XTb zIp+~y?%CfY;LG%Ma#2JD2Jb{e0)=+^o8(m3(GQ zPZqlsXt~*aM68PEV8pt&7bcZ6JD>J%OY0zTqDOrqRI4YaQ+-tyx#xN`Nlx_Xt($2? z;2};&>iWRaOO9Q%?8>#<{rS#=U7qPw))5qF8SsMS=_v?%D%^@&gO*eMXgG8K5|1|*n7eW_RL%dLM^WgzngUJS)nx}6{(2Ona(A`hnBNK=0XK-otTQTufq9f`}!2gX?4{s#>DEHWm(R$=d-)#DtjvK?x=^B3dxiQXJ$QH zqgvdD@>xWj3aXn%ytNMYcW=IQ)jzwsfuIVaADNwr&7Ox0dnR2wsJ*}QQ$eOX8fJ(N z=jKc2?3t*O59D(vX6AtjTMa8~R7A4hJ@v>ZGrQ+9qCj^~%;lex<>KV3`Z}pC3(Ycc z$DvqIcGW$(XgD+DsZpQ!=V$+HC)244%Csg>M}{c-;<6WG7u1up&iAy+i{dO+{nUK$ z-)cLYVfBV;+LvuV$nEuP|9z*6r&{T)&sXu=CctBU3IM3Nh=io5CXYjyggiq@%EUT@HzSUc{f%)C8L-pUEO zR-&n0G<*V3THJBo;z~Q}|cGArQ z6P{IfT|kS??&M@Tv5V3d_{$5e^iV;y$hyd5rYB5MR`OSqG-P32w2baK`8?mb3Sgcq z?B)V*&5pk*(7^xBYAX5UlF@1VO{6n3a_ORXdFTA;P+hr;p{JVI>~A;1t5bMtoVst{ zn5xy$nF*fg;nIF*tJ3cC_goi}h^(&K_1iRM_q0mAEjn0G}>RmUl4GRoA~e6pzP z1g_aV-8v^9XB^FD3LWc&ruB1vdNol!@nf=G&w86k4|y`1A(Q<*_ZC5z05%@X^(*>0 zeN#|T9(k+TxomF2x>Nn=Rfp6}$&Gq(ojHL60$(QeQ1!&fD|&I8>GYImmz>~bRSC}% zi=#Rs&RvYRP@nqkotq;F9y)JI<}m{tyX@p~Wmj=4++3?s%u~aBKXS_KWR_*WuIW_G z6Zb=@9FgcdRl!|tc%Wp8ITOJ+dnTyLDuI2@P8O*1ofjdS&UdS~+#A3|T|IGjxAq(1 zdpn(OT`*;!LtS53di5qcl%>9kcitkS0$&w%TZ2Ihcl3LwX4;;*F!50fg|p}E-qk_d zstV|zf3~BneiZpRwaHyCJ8K1t-b!lKJoavH^@0=AlU*iMOtacW6Qxeq+3x*&F2_`;ie|d5YI4(7CV|OREwR*re!4yYTW@c2Zr>khY)mffXcNO1jr*%cOH&|Cw-7K}= z-Z@xQ$Qg7M;67_Hd&}i}4l`$dOhVnY{q)|kD#-$AzIupjC#ODE`lu6xobB1CM|I-T z%i}G~M6as$btZ`wxR20h0qwe4Cz32^$yWLNv%MO4lGxR~v&DO62UE|clpS0iCfPlE z>Xc6BaztczdMllMrefg11!sqp`Yt{_u$!U?=G4V?u7fkx%CLj`y0n8zXXJ&c*Y~~q z_uMS#n*#hf#cc_&Jlou8X@}62WXQC_n1J z)WdFeKActwZEuj>)M}Lpw(KHh>C~EzF6OA;pLyp+n`Kp38{gphkqPERsv%OAsO)*r z;M>^zo~xr0EcJH(2>z}}1%J7EI;po4I#s)~fGf%j>xjA@nTX0xC1!WdHScev^IOvd>~O0jn)~hDnRFG&eV%Hj*3bOb=loP_wYn-~x(Jo%kq2zg#n_{hRlT=K zdd`a^)pAV)mL#I&qom4qWt|B0(aNMJozZ%K=P+1F@;r;FUQT@KW;*YqTI-ywJ>!HLRVd@Fj?Aeyr}r{`TQPCZnpdgd>_oc!vwq&k+9$1 zdGIp3gLk#B4|TNFchY@Noa+Q@>mY7M=T6zv2kUN<=KMgu(v=O%)L=xaXtw6DqfRC# z3xxgdoaCq4PWpVR)|0bkWt#r|fN^C`_5AO4G^!x(WPzfmC(iBpeTa2}wpH`mQBNND zXICb?tm*iXZQY$*s|uHXa6BsN+`d{W!CCyNz+`)9%5c}Iy5%^lH?zeyduR5{kou2) z&(Xxm1m&lbiU$-fH>TZHl#!kv&uUV;c3QkhJMLnsMWxHno}6+U@1&C5_RCH0oNwh> zOnjos-flW}IomNk(+}}$5f8I?98MlnocEoJTHT!MCbI~g@HtnQsLI@`=u=P6azvsC zy3W=oUX^o7<&5v3YZQ3edwO#RvcT9?1^3mo_r?`>JLBdWh12cknKym3bhX-d&J1kN zdZdGMJG!H0Rj+C-qB@>B)nWY?g@;)(>6BBMZ|;l7t1D`!3Vte4;ZXE5jT+ud-nmm1 z(h_w!bk4xpUA1yl0*k}F!c<39ncaJ;ny#5u z!TH(27u-9#4rZbw8W&MbsSDy>(mO=F!hNZs&i))y*vWh_()rZ^TXz)n?w_J(CY2EBV>gJXO&6KtD@RJ~(fs zV_C&}V$W(GbnF+WzB^7b+0#22>Vl@yK~8Fz?x5+Pt2j04Cx;!}o~s@1AOD`CY{t_E zcW&dPIXO9HcM4kmVw%;H9QB^)PQ0(T+=)Ff+-Q6D^{bXD+0Sz@-i*_y@%1LTB^}Rd zR7W12?{lHBD4e_Mq2sL#_x+tO)@$eHXN#plw+U)dpj;DRoFA^USs(~!7sPyV> zUp{r#6D5O*^J3EBLBDvF>EAcVbXAIu+F6}7EZsn=W)}^*Ir9{o+UdUY)hbr+GN%p)QS>^6MV4d7lvcy`WLZ-VX%cP_L>v=JpRa~bh T+VpyYc8!wC>YxF>@BIG)EW6UI literal 0 HcmV?d00001 diff --git a/src/eid-amr/test_data/bst122_bf06.amr b/src/eid-amr/test_data/bst122_bf06.amr new file mode 100644 index 0000000000000000000000000000000000000000..11097c7fdc51cda47f04822ac219f4817a1883f1 GIT binary patch literal 152000 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 J{e7M(@IUC{g5CfC literal 0 HcmV?d00001 diff --git a/src/eid-amr/test_data/bst475_bf03.amr b/src/eid-amr/test_data/bst475_bf03.amr new file mode 100644 index 0000000000000000000000000000000000000000..4c6e4c70b877661d886e677b5d16cce61716db4f GIT binary patch literal 152000 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 P1_xN*BK>`yDe!**kBNao literal 0 HcmV?d00001 diff --git a/src/fir/filter.c b/src/fir/filter.c index 6708d091..dbce4bdd 100644 --- a/src/fir/filter.c +++ b/src/fir/filter.c @@ -33,10 +33,10 @@ Options: -mod .......... uses the modified IRS characteristic instead of the "regular" one. - -down ......... filtering is downsample (for HQ2, HQ3, FLAT, IFLAT, and PCM) - -up ........... filtering is upsample (for HQ2, HQ3, FLAT, IFLAT, and PCM) - -async ........ asynchronization operation (disables -down) \n")) - -delay d ...... number of samples to delay the input signal for + -down ......... filtering is downsample (for HQ2, HQ3, SHQ2, SHQ3, FLAT, IFLAT, and PCM) + -up ........... filtering is upsample (for HQ2, HQ3, SHQ2, SHQ3, FLAT, IFLAT, and PCM) + -async ........ asynchronization operation (disables -down) \n")) + -delay d ...... number of samples to delay the input signal for asynchronous tandeming simulation. For d>0, null samples are inserted in the begining of the file, d<0 causes samples to be dropped. Default is d=0. @@ -53,6 +53,8 @@ PSO Psophometric wheighting filter, 1:1 HQ2 FIR (High quality) low-pass with factor 1:2 (up) or 2:1 (down) HQ3 FIR (High quality) low-pass with factor 1:3 (up) or 3:1 (down) + SHQ2 FIR (Super High quality) low-pass with factor 1:2 (up) or 2:1 (down) (729 coefs) + SHQ3 FIR (Super High quality) low-pass with factor 1:3 (up) or 3:1 (down) (729 coefs) FLAT Linear-phase pass-band with factor 1:2 (up) or 2:1 (down) FLAT1 Linear-phase pass-band with factor 1:1 (no rate change) PCM Standard IIR PCM quality factor 1:2 (up) or 2:1 (down) @@ -152,6 +154,7 @@ 02.Feb.2010 v3.5 - Modified maximum string length for filenames to avoid buffer overruns (y.hiwasaki) + 05.April.2012 v3.6 - Added filters: HP50_32KHZ, HP50_48KHZ, SHQ2 and SHQ3 (b.kovesi France Telecom) =========================================================================== */ @@ -195,6 +198,7 @@ int valid_filter (char *F_type, char modified_IRS) { || strncmp (F_type, "dsm", 3) == 0 || strncmp (F_type, "DSM", 3) == 0 || strncmp (F_type, "pso", 3) == 0 || strncmp (F_type, "PSO", 3) == 0 || strncmp (F_type, "hq", 2) == 0 || strncmp (F_type, "HQ", 2) == 0 + || strncmp (F_type, "shq", 3) == 0 || strncmp (F_type, "SHQ", 3) == 0 || strncmp (F_type, "flat", 4) == 0 || strncmp (F_type, "FLAT", 4) == 0 || strncmp (F_type, "gsm1", 4) == 0 || strncmp (F_type, "GSM1", 4) == 0 || strncmp (F_type, "msin", 4) == 0 || strncmp (F_type, "MSIN", 4) == 0 @@ -204,7 +208,7 @@ int valid_filter (char *F_type, char modified_IRS) { // FILTER_12k48k_HW || strncmp (F_type, "LP12", 4) == 0 || strncmp (F_type, "lp12", 4) == 0 // FILTER_12k48k_HW - || strncmp (F_type, "LP14", 4) == 0 || strncmp (F_type, "lp14", 4) == 0 || strncmp (F_type, "LP20", 4) == 0 || strncmp (F_type, "lp20", 4) == 0) + || strncmp (F_type, "LP14", 4) == 0 || strncmp (F_type, "lp14", 4) == 0 || strncmp (F_type, "LP20", 4) == 0 || strncmp (F_type, "lp20", 4) == 0 || strncmp (F_type, "hp50_32khz", 10) == 0 || strncmp (F_type, "HP50_32KHZ", 10) == 0 || strncmp (F_type, "hp50_48khz", 10) == 0 || strncmp (F_type, "HP50_48KHZ", 10) == 0) valid = 1; /* No MOD-IRS filter at 8 kHz */ @@ -289,6 +293,10 @@ void display_usage () { printf (" LP12 12kHz low-pass filter for fs=48kHz, w/ factor 1:1\n"); printf (" LP14 14kHz low-pass filter for fs=48kHz, w/ factor 1:1\n"); printf (" LP20 20kHz low-pass filter for fs=48kHz, w/ factor 1:1\n\n"); + printf ((" HP50_32KHZ 50 Hz highpass FIR filter w/ factor 1:1 at sf=32kHz, 1119 coefs\n")); + printf ((" HP50_48KHZ 50 Hz highpass FIR filter w/ factor 1:1 at sf=48kHz, 1679 coefs\n")); + printf ((" SHQ2 FIR (Super High quality : 729 coefs, -80dB) low-pass for factor 1:2 (up) or 2:1(down)\n")); + printf ((" SHQ3 FIR (Super High quality : 729 coefs, -80dB) low-pass for factor 1:3 (up) or 3:1(down)\n")); /* Quit program */ exit (-128); @@ -570,6 +578,20 @@ int main (int argc, char *argv[]) { : hq_down_3_to_1_init (); } +#if 1 // not yet implemented +/* + * Filter type: SHQ2 - Super High quality 2:1 or 1:2 factor: + * SHQ3 - Super High quality 3:1 or 3:1 factor + */ + else if (strncmp (F_type, "shq", 3) == 0 || strncmp (F_type, "SHQ", 3) == 0) { + if (upsample) /* It is up-sampling! */ + fir_state = F_type[3] == '2' ? shq_up_1_to_2_init () + : shq_up_1_to_3_init (); + else /* It is down-sampling! */ + fir_state = F_type[3] == '2' ? shq_down_2_to_1_init () + : shq_down_3_to_1_init (); + } +#endif /* * Filter type: P.341 send mask: factor 1:1 */ @@ -652,14 +674,29 @@ int main (int argc, char *argv[]) { fir_state = LP20_48kHz_init (); } -/* - * Filter type: PCM - Standard PCM quality 2:1 or 1:2 factor: - * . fs == 8000 -> upsample: 1:2 - * . fs == 16000 -> downsample: 2:1 - * PCM1 - Standard PCM quality with 1:1 factor - * . fs == 8000 -> unimplemented - * . fs == 16000 -> OK, 1:1 at 16 kHz - */ + + /* + * Filter type: 50 Hz highpass filter (fs=32kHz): factor 1:1 + */ + else if (strncmp (F_type, "hp50_32khz", 10) == 0 || strncmp (F_type, "HP50_32KHZ", 10) == 0) { + fir_state = hp50_32khz_init (); + } + + /* + * Filter type: 50 Hz highpass filter (fs=48kHz): factor 1:1 + */ + else if (strncmp (F_type, "hp50_48khz", 10) == 0 || strncmp (F_type, "HP50_48KHZ", 10) == 0) { + fir_state = hp50_48khz_init (); + } + + /* + * Filter type: PCM - Standard PCM quality 2:1 or 1:2 factor: + * . fs == 8000 -> upsample: 1:2 + * . fs == 16000 -> downsample: 2:1 + * PCM1 - Standard PCM quality with 1:1 factor + * . fs == 8000 -> unimplemented + * . fs == 16000 -> OK, 1:1 at 16 kHz + */ else if (strncmp (F_type, "pcm", 3) == 0 || strncmp (F_type, "PCM", 3) == 0) { if (strncmp (F_type, "pcm1", 4) == 0 || strncmp (F_type, "PCM1", 4) == 0) { parallel_iir_state = stdpcm_16khz_init (); diff --git a/src/fir/fir-flat.c b/src/fir/fir-flat.c index 8dfdea82..b279c342 100644 --- a/src/fir/fir-flat.c +++ b/src/fir/fir-flat.c @@ -39,6 +39,10 @@ ORIGINAL BY: = hq_down_3_to_1_init() : initialize down-sampling filter 3:1 = hq_up_1_to_2_init() : initialize up-sampling filter 1:2 = hq_up_1_to_3_init() : initialize up-sampling filter 1:3 + = shq_down_2_to_1_init() : initialize down-sampling filter 2:1 + = shq_down_3_to_1_init() : initialize down-sampling filter 3:1 + = shq_up_1_to_2_init() : initialize up-sampling filter 1:2 + = shq_up_1_to_3_init() : initialize up-sampling filter 1:3 = linear_phase_pb_2_to_1_init() = linear_phase_pb_1_to_2_init() = linear_phase_pb_1_to_1_init() @@ -62,6 +66,7 @@ ORIGINAL BY: ** THIS FILE WAS SPLIT FROM THE ORIGINAL .C FILE ** 16.May.97 v2.2 Added function for HQ flat bandpass keeping the sampling rate (1:1 factor) + 05.April.2012 v2.3 - Added filters: SHQ2 and SHQ3 (France Telecom) ============================================================================= */ @@ -83,6 +88,8 @@ ORIGINAL BY: void fill_lp_2_to_1 ARGS ((float *h0[], long *lenh0)); void fill_lp_3_to_1 ARGS ((float **h0, long *lenh0)); +void fill_slp_2_to_1 ARGS ((float *h0[], long *lenh0)); +void fill_slp_3_to_1 ARGS ((float **h0, long *lenh0)); void fill_flat_band_pass ARGS ((float **h0, long *lenh0)); @@ -715,4 +722,663 @@ SCD_FIR *linear_phase_pb_1_to_1_init () { /* ................ End of linear_phase_pb_1_to_1_init() ................ */ +/*****************************************************************************/ +/*****************************************************************************/ + +/* + ============================================================================ + + SCD_FIR *shq_down_2_to_1_init (void); + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + Description: + ~~~~~~~~~~~~ + + Initialization routine for super high quality FIR downsampling filter + by factor of 2. + + Parameters: none. + ~~~~~~~~~~~ + + Return value: + ~~~~~~~~~~~~~ + Returns a pointer to struct SCD_FIR; + + Author: + ~~~~~~~ + + History: + ~~~~~~~~ + 05.April.2012 v1.0 - Added filters: SHQ2 and SHQ3 (France Telecom) + + ============================================================================ +*/ +SCD_FIR *shq_down_2_to_1_init () { + float *h0; /* pointer to array with FIR coeff. */ + long lenh0; /* number of FIR coefficients */ + + + /* allocate array for FIR coeff. and fill with coefficients */ + fill_slp_2_to_1 (&h0, &lenh0); + + return fir_initialization ( /* Returns: pointer to SCD_FIR-struct */ + lenh0, /* In: number of FIR-coefficients */ + h0, /* In: pointer to array with FIR-cof. */ + 1.0, /* In: gain factor for FIR-coeffic. */ + 2l, /* In: Down-sampling factor */ + 'D' /* In: switch to down-sampling kernel */ + ); +} + +/* ..................... End of shq_down_2_to_1_init() ..................... */ + + + +/* + ============================================================================ + + SCD_FIR *shq_up_1_to_2_init (void); + ~~~~~~~~~~~~~~~~~~~~~~~~~~ + + Description: + ~~~~~~~~~~~~ + + Initialization routine for super high quality upsampling FIR filter + by factor of 2. + + Parameters: none. + ~~~~~~~~~~~ + + Return value: + ~~~~~~~~~~~~~ + Returns a pointer to struct SCD_FIR; + + Author: + ~~~~~~~ + + History: + ~~~~~~~~ + 05.April.2012 v1.0 - Added filters: SHQ2 and SHQ3 (France Telecom) + + ============================================================================ +*/ +SCD_FIR *shq_up_1_to_2_init () { + float *h0; /* pointer to array with FIR coeff. */ + long lenh0; /* number of FIR coefficients */ + + + /* allocate array for FIR coeff. and fill with coefficients */ + fill_slp_2_to_1 (&h0, &lenh0); + + return fir_initialization ( /* Returns: pointer to SCD_FIR-struct */ + lenh0, /* In: number of FIR-coefficients */ + h0, /* In: pointer to array with FIR-cof. */ + 2.0, /* In: gain factor for FIR-coeffic. */ + 2l, /* In: Up-sampling factor */ + 'U' /* In: Switch to upsampling procedure */ + ); +} + +/* ..................... End of shq_up_1_to_2_init() ..................... */ + + + +/* + ============================================================================ + + SCD_FIR *shq_down_3_to_1_init (void); + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + Description: + ~~~~~~~~~~~~ + + Initialization routine for super high quality FIR downsampling filter + by factor of 3. + + Parameters: none. + ~~~~~~~~~~~ + + Return value: + ~~~~~~~~~~~~~ + Returns a pointer to struct SCD_FIR; + + Author: + ~~~~~~~ + + History: + ~~~~~~~~ + 05.April.2012 v1.0 - Added filters: SHQ2 and SHQ3 (France Telecom) + + ============================================================================ +*/ +SCD_FIR *shq_down_3_to_1_init () { + float *h0; /* pointer to array with FIR coeff. */ + long lenh0; /* number of FIR coefficients */ + + + /* allocate array for FIR coeff. and fill with coefficients */ + fill_slp_3_to_1 (&h0, &lenh0); + + return fir_initialization ( /* Returns: pointer to SCD_FIR-struct */ + lenh0, /* In: number of FIR-coefficients */ + h0, /* In: pointer to array with FIR-cof. */ + 1.0, /* In: gain factor for FIR-coeffic. */ + 3l, /* In: Down-sampling factor */ + 'D' /* In: switch to down-sampling proc. */ + ); +} + +/* .................... End of shq_down_3_to_1_init() ..................... */ + + + +/* + ============================================================================ + + SCD_FIR *shq_up_1_to_3_init (void); + ~~~~~~~~~~~~~~~~~~~~~~~~~~ + + Description: + ~~~~~~~~~~~~ + + Initialization routine for super high quality FIR upsampling filter + by factor of 3. + + Parameters: none. + ~~~~~~~~~~~ + + Return value: + ~~~~~~~~~~~~~ + Returns a pointer to struct SCD_FIR; + + Author: + ~~~~~~~ + + History: + ~~~~~~~~ + 05.April.2012 v1.0 - Added filters: SHQ2 and SHQ3 (France Telecom) + + ============================================================================ +*/ +SCD_FIR *shq_up_1_to_3_init () { + float *h0; /* pointer to array with FIR coeff. */ + long lenh0; /* number of FIR coefficients */ + + + /* allocate array for FIR coeff. and fill with coefficients */ + fill_slp_3_to_1 (&h0, &lenh0); + + return fir_initialization ( /* Returns: pointer to SCD_FIR-struct */ + lenh0, /* In: number of FIR-coefficients */ + h0, /* In: pointer to array with FIR-cof. */ + 3.0, /* In: gain factor for FIR-coeffic. */ + 3l, /* In: Up-sampling factor */ + 'U' /* In: switch to upsampling procedure */ + ); +} + +/* ...................... End of shq_up_1_to_3_init() ...................... */ + + +/* + ============================================================================ + + void fill_slp_2_to_1 (float **h0, long *lenh0); + ~~~~~~~~~~~~~~~~~~~ + + Description: + ~~~~~~~~~~~~ + + Initialize pointer to array with of FIR coefficients of a low + pass filter for up/down sampling filter with factor 2:1 or 1:2 + and float representation. + v1.0 filtdemo firpm 16000,3935,4000,0.3, 80, 728 + v1.1 filtdemo firpm 16000,3935,4000,0.3, 100, 872 + h2 = filtdemo('getfilt') + for i = 1:length(h2) fprintf('(float)%20.12e, ', h2(i)); + if rem(i,5) == 0 fprintf('\n'); end end + + Parameters: + ~~~~~~~~~~~ + h0: (Out) pointer to array with FIR coefficients + lenh0: (Out) pointer to number of coefficients + + + Return value: + ~~~~~~~~~~~~~ + None. + + Author: + ~~~~~~~ + + History: + ~~~~~~~~ + 08.DEC.2011 v1.0 Release of 1st version + 15.FEB.2012 v1.1 Release of 2nd version with more stopband attenuation + + ============================================================================ +*/ +#define lensh02 873 + +void fill_slp_2_to_1 (h0, lenh0) + float *h0[]; + long *lenh0; +{ + static float sh02[lensh02] = { + (float) 3.796696928466e-006, (float) - 1.916895913880e-004, (float) - 9.559790653313e-004, (float) - 2.309090436241e-003, (float) - 3.355260288418e-003, + (float) - 2.821616068751e-003, (float) - 6.494578851510e-004, (float) 1.368071261832e-003, (float) 1.370278722621e-003, (float) - 2.336521287917e-004, + (float) - 1.185316896754e-003, (float) - 3.557893702940e-004, (float) 8.234667012568e-004, (float) 6.081914903075e-004, (float) - 4.869084931865e-004, + (float) - 6.784989588347e-004, (float) 2.211378711751e-004, (float) 6.567967063227e-004, (float) - 2.508428842065e-005, (float) - 5.918859501058e-004, + (float) - 1.133457948942e-004, (float) 5.103528659400e-004, (float) 2.077730139398e-004, (float) - 4.257030079639e-004, (float) - 2.693320767774e-004, + (float) 3.450469073084e-004, (float) 3.071631118731e-004, (float) - 2.713518058883e-004, (float) - 3.278882894771e-004, (float) 2.057925864008e-004, + (float) 3.366006455231e-004, (float) - 1.482361183421e-004, (float) - 3.367394950886e-004, (float) 9.845446547453e-005, (float) 3.312977192436e-004, + (float) - 5.533287789728e-005, (float) - 3.217977487285e-004, (float) 1.843967368528e-005, (float) 3.099640470313e-004, (float) 1.328843895284e-005, + (float) - 2.965903264243e-004, (float) - 4.040411770010e-005, (float) 2.826060999738e-004, (float) 6.386636089117e-005, (float) - 2.682059180462e-004, + (float) - 8.400473971490e-005, (float) 2.539623487208e-004, (float) 1.015795101283e-004, (float) - 2.398340044811e-004, (float) - 1.167662237676e-004, + (float) 2.262277295494e-004, (float) 1.302389953023e-004, (float) - 2.128963846610e-004, (float) - 1.420059883336e-004, (float) 2.001325818624e-004, + (float) 1.525152442899e-004, (float) - 1.878370907468e-004, (float) - 1.619282978772e-004, (float) 1.760669168660e-004, (float) 1.705747652949e-004, + (float) - 1.645342831667e-004, (float) - 1.782437567680e-004, (float) 1.536329356026e-004, (float) 1.854489350961e-004, (float) - 1.431090602159e-004, + (float) - 1.923098357663e-004, (float) 1.327632434198e-004, (float) 1.988019142637e-004, (float) - 1.224823030873e-004, (float) - 2.047505646951e-004, + (float) 1.125436526441e-004, (float) 2.105136263884e-004, (float) - 1.026783876418e-004, (float) - 2.159988725649e-004, (float) 9.291206030779e-005, + (float) 2.212630220095e-004, (float) - 8.322092258564e-005, (float) - 2.263811595801e-004, (float) 7.350850871907e-005, (float) 2.313695981464e-004, + (float) - 6.362969041322e-005, (float) - 2.360269018314e-004, (float) 5.380295174011e-005, (float) 2.405543319009e-004, (float) - 4.394022835345e-005, + (float) - 2.450580921435e-004, (float) 3.380378919976e-005, (float) 2.493326534241e-004, (float) - 2.346096839263e-005, (float) - 2.533379001119e-004, + (float) 1.298908745154e-005, (float) 2.571630808553e-004, (float) - 2.297001211178e-006, (float) - 2.607451266109e-004, (float) - 8.605011575155e-006, + (float) 2.640373512578e-004, (float) 1.959506007225e-005, (float) - 2.672713250910e-004, (float) - 3.098103063675e-005, (float) 2.701901534524e-004, + (float) 4.267470287693e-005, (float) - 2.727139254030e-004, (float) - 5.452878257789e-005, (float) 2.749705769146e-004, (float) 6.658908505887e-005, + (float) - 2.770661665078e-004, (float) - 7.913713870114e-005, (float) 2.786327455942e-004, (float) 9.185585608604e-005, (float) - 2.798865730517e-004, + (float) - 1.049053516406e-004, (float) 2.807049278836e-004, (float) 1.182425329275e-004, (float) - 2.810498626639e-004, (float) - 1.318263284371e-004, + (float) 2.808967923003e-004, (float) 1.455506215115e-004, (float) - 2.804597862803e-004, (float) - 1.597707317081e-004, (float) 2.793085842202e-004, + (float) 1.741553960777e-004, (float) - 2.775743726755e-004, (float) - 1.887189126391e-004, (float) 2.752088365441e-004, (float) 2.033292028967e-004, + (float) - 2.723750410219e-004, (float) - 2.181185345008e-004, (float) 2.690195363322e-004, (float) 2.331377491223e-004, (float) - 2.650434716994e-004, + (float) - 2.483814212302e-004, (float) 2.602688344952e-004, (float) 2.635383838792e-004, (float) - 2.550401641814e-004, (float) - 2.789293863887e-004, + (float) 2.491244096402e-004, (float) 2.945239709175e-004, (float) - 2.422677063636e-004, (float) - 3.097933373634e-004, (float) 2.353216838587e-004, + (float) 3.261618119620e-004, (float) - 2.259436476779e-004, (float) - 3.401042900591e-004, (float) 2.190501787592e-004, (float) 3.582196439592e-004, + (float) - 2.060273208877e-004, (float) - 3.696711810736e-004, (float) 1.999494168871e-004, (float) 3.895781288432e-004, (float) - 1.842093035737e-004, + (float) - 4.009205689012e-004, (float) 1.747765776478e-004, (float) 4.170995964833e-004, (float) - 1.621552954359e-004, (float) - 4.335350916263e-004, + (float) 1.456088038973e-004, (float) 4.447247309663e-004, (float) - 1.338587279643e-004, (float) - 4.603990618508e-004, (float) 1.185710423385e-004, + (float) 4.756987576397e-004, (float) - 1.000048491894e-004, (float) - 4.866041612047e-004, (float) 8.476411455038e-005, (float) 4.998780903868e-004, + (float) - 6.827228464703e-005, (float) - 5.146667747733e-004, (float) 4.753115459198e-005, (float) 5.255987039514e-004, (float) - 2.779134779343e-005, + (float) - 5.355054669473e-004, (float) 9.674319498129e-006, (float) 5.478734582255e-004, (float) 1.129727308307e-005, (float) - 5.595560306151e-004, + (float) - 3.493017868056e-005, (float) 5.677956913097e-004, (float) 5.713859403233e-005, (float) - 5.757813638276e-004, (float) - 7.867758251969e-005, + (float) 5.852799390936e-004, (float) 1.025052366029e-004, (float) - 5.941431998669e-004, (float) - 1.287437605610e-004, (float) 6.000426995209e-004, + (float) 1.543883746225e-004, (float) - 6.047947232235e-004, (float) - 1.791348851279e-004, (float) 6.103250533849e-004, (float) 2.050193734239e-004, + (float) - 6.160453602904e-004, (float) - 2.334612077119e-004, (float) 6.194421365491e-004, (float) 2.625902273169e-004, (float) - 6.205808968069e-004, + (float) - 2.909797933304e-004, (float) 6.209921559119e-004, (float) 3.189781263679e-004, (float) - 6.218075972611e-004, (float) - 3.484125142872e-004, + (float) 6.217754987501e-004, (float) 3.794107287795e-004, (float) - 6.197373802874e-004, (float) - 4.110126983210e-004, (float) 6.154740944566e-004, + (float) 4.419629007982e-004, (float) - 6.102659557898e-004, (float) - 4.726777081461e-004, (float) 6.046314459814e-004, (float) 5.039254713546e-004, + (float) - 5.984097187292e-004, (float) - 5.364779620831e-004, (float) 5.904522258905e-004, (float) 5.697973331218e-004, (float) - 5.802595330793e-004, + (float) - 6.029679388270e-004, (float) 5.681353065596e-004, (float) 6.352880253925e-004, (float) - 5.552572270111e-004, (float) - 6.675564463085e-004, + (float) 5.416686835400e-004, (float) 7.004526959840e-004, (float) - 5.267382801903e-004, (float) - 7.340039635307e-004, (float) 5.098171451209e-004, + (float) 7.676007675934e-004, (float) - 4.909399565337e-004, (float) - 8.009185568264e-004, (float) 4.701439201458e-004, (float) 8.334617833183e-004, + (float) - 4.480343741175e-004, (float) - 8.653751202061e-004, (float) 4.250690490151e-004, (float) 8.973420149762e-004, (float) - 4.009277182108e-004, + (float) - 9.297436930304e-004, (float) 3.747939959452e-004, (float) 9.620204713426e-004, (float) - 3.465711833398e-004, (float) - 9.937591861314e-004, + (float) 3.163873335071e-004, (float) 1.024733751383e-003, (float) - 2.843503685027e-004, (float) - 1.054638636894e-003, (float) 2.509109323082e-004, + (float) 1.083612570606e-003, (float) - 2.163900938188e-004, (float) - 1.112203502198e-003, (float) 1.803999502271e-004, (float) 1.140444841288e-003, + (float) - 1.425881460745e-004, (float) - 1.168069638194e-003, (float) 1.029125055130e-004, (float) 1.195016515742e-003, (float) - 6.105502150698e-005, + (float) - 1.220730499698e-003, (float) 1.722309885781e-005, (float) 1.244802222599e-003, (float) 2.793170702027e-005, (float) - 1.267597215030e-003, + (float) - 7.433354174569e-005, (float) 1.289443015758e-003, (float) 1.223071384268e-004, (float) - 1.310173684327e-003, (float) - 1.717961954652e-004, + (float) 1.329974954064e-003, (float) 2.232129919651e-004, (float) - 1.348538305787e-003, (float) - 2.767754823491e-004, (float) 1.365216750693e-003, + (float) 3.319638947909e-004, (float) - 1.380095678916e-003, (float) - 3.886579246534e-004, (float) 1.393229786168e-003, (float) 4.469245863820e-004, + (float) - 1.404378077863e-003, (float) - 5.064357635350e-004, (float) 1.413756425541e-003, (float) 5.672145160932e-004, (float) - 1.421549050340e-003, + (float) - 6.296742832444e-004, (float) 1.427153322508e-003, (float) 6.930389693885e-004, (float) - 1.431723738610e-003, (float) - 7.590842956586e-004, + (float) 1.433006680474e-003, (float) 8.254983244591e-004, (float) - 1.433298843968e-003, (float) - 8.949540559698e-004, (float) 1.429349304332e-003, + (float) 9.640000205246e-004, (float) - 1.424329953401e-003, (float) - 1.035464848937e-003, (float) 1.415601499601e-003, (float) 1.106948972842e-003, + (float) - 1.405087088396e-003, (float) - 1.179673831986e-003, (float) 1.392478926372e-003, (float) 1.254375291373e-003, (float) - 1.376198638858e-003, + (float) - 1.329115340603e-003, (float) 1.358185632312e-003, (float) 1.405674275449e-003, (float) - 1.337154931483e-003, (float) - 1.483771621272e-003, + (float) 1.312269387543e-003, (float) 1.561900282048e-003, (float) - 1.285301279727e-003, (float) - 1.642079777660e-003, (float) 1.254114183544e-003, + (float) 1.722681043912e-003, (float) - 1.219211242008e-003, (float) - 1.803063205736e-003, (float) 1.181949655991e-003, (float) 1.884828365040e-003, + (float) - 1.140994785147e-003, (float) - 1.967442657059e-003, (float) 1.095925463900e-003, (float) 2.049903843463e-003, (float) - 1.047877974227e-003, + (float) - 2.133252204410e-003, (float) 9.962070742267e-004, (float) 2.217664374578e-003, (float) - 9.399028586473e-004, (float) - 2.301879563126e-003, + (float) 8.799533412324e-004, (float) 2.386557312794e-003, (float) - 8.160716710263e-004, (float) - 2.472094691981e-003, (float) 7.471803656806e-004, + (float) 2.557416285858e-003, (float) - 6.736494366209e-004, (float) - 2.642112224434e-003, (float) 5.963947377435e-004, (float) 2.727379304929e-003, + (float) - 5.143438896094e-004, (float) - 2.812899297523e-003, (float) 4.268830572252e-004, (float) 2.897715073078e-003, (float) - 3.346488919796e-004, + (float) - 2.981956373303e-003, (float) 2.380521797797e-004, (float) 3.066623414599e-003, (float) - 1.359382829811e-004, (float) - 3.151255446637e-003, + (float) 2.782985135369e-005, (float) 3.235110828048e-003, (float) 8.584892395569e-005, (float) - 3.318355500563e-003, (float) - 2.049786891772e-004, + (float) 3.401760376538e-003, (float) 3.307328425452e-004, (float) - 3.484791457407e-003, (float) - 4.636621183957e-004, (float) 3.566606134171e-003, + (float) 6.034051597652e-004, (float) - 3.647201821596e-003, (float) - 7.497497805930e-004, (float) 3.727291920777e-003, (float) 9.036595637004e-004, + (float) - 3.806649107069e-003, (float) - 1.065867612984e-003, (float) 3.884567294966e-003, (float) 1.236277315086e-003, (float) - 3.961005564525e-003, + (float) - 1.414791150723e-003, (float) 4.036756667297e-003, (float) 1.602515835838e-003, (float) - 4.111869542510e-003, (float) - 1.800743383460e-003, + (float) 4.185540927469e-003, (float) 2.009872291898e-003, (float) - 4.257408085939e-003, (float) - 2.230058942337e-003, (float) 4.327941872004e-003, + (float) 2.462366047089e-003, (float) - 4.397272684020e-003, (float) - 2.708200770755e-003, (float) 4.464960149734e-003, (float) 2.968539548004e-003, + (float) - 4.530883832943e-003, (float) - 3.244542924923e-003, (float) 4.595095710114e-003, (float) 3.537784469302e-003, (float) - 4.657460095921e-003, + (float) - 3.849899735547e-003, (float) 4.718000809430e-003, (float) 4.182843960043e-003, (float) - 4.776999990045e-003, (float) - 4.539528511166e-003, + (float) 4.833943437272e-003, (float) 4.922646164542e-003, (float) - 4.888454593861e-003, (float) - 5.334885946192e-003, (float) 4.941143760176e-003, + (float) 5.780469043985e-003, (float) - 4.992461365274e-003, (float) - 6.265199509171e-003, (float) 5.041554413526e-003, (float) 6.794738285542e-003, + (float) - 5.088173036641e-003, (float) - 7.376044395058e-003, (float) 5.132524592209e-003, (float) 8.018375971792e-003, (float) - 5.174387044018e-003, + (float) - 8.733007006427e-003, (float) 5.213750365616e-003, (float) 9.534285432471e-003, (float) - 5.251195927114e-003, (float) - 1.044195072235e-002, + (float) 5.286143606555e-003, (float) 1.148100562390e-002, (float) - 5.318182436083e-003, (float) - 1.268466390300e-002, (float) 5.347878808814e-003, + (float) 1.410004942171e-002, (float) - 5.375128932984e-003, (float) - 1.579376157069e-002, (float) 5.399698942850e-003, (float) 1.786325203520e-002, + (float) - 5.422169472156e-003, (float) - 2.045920855579e-002, (float) 5.442242611442e-003, (float) 2.382438645728e-002, (float) - 5.459104973796e-003, + (float) - 2.837649392789e-002, (float) 5.474214913211e-003, (float) 3.490845950781e-002, (float) - 5.486081437467e-003, (float) - 4.511486713033e-002, + (float) 5.495807726126e-003, (float) 6.340609543466e-002, (float) - 5.502587343827e-003, (float) - 1.059496325621e-001, (float) 5.506719537453e-003, + (float) 3.182586432339e-001, (float) 4.944918979528e-001, (float) 3.182586432339e-001, (float) 5.506719537453e-003, (float) - 1.059496325621e-001, + (float) - 5.502587343827e-003, (float) 6.340609543466e-002, (float) 5.495807726126e-003, (float) - 4.511486713033e-002, (float) - 5.486081437467e-003, + (float) 3.490845950781e-002, (float) 5.474214913211e-003, (float) - 2.837649392789e-002, (float) - 5.459104973796e-003, (float) 2.382438645728e-002, + (float) 5.442242611442e-003, (float) - 2.045920855579e-002, (float) - 5.422169472156e-003, (float) 1.786325203520e-002, (float) 5.399698942850e-003, + (float) - 1.579376157069e-002, (float) - 5.375128932984e-003, (float) 1.410004942171e-002, (float) 5.347878808814e-003, (float) - 1.268466390300e-002, + (float) - 5.318182436083e-003, (float) 1.148100562390e-002, (float) 5.286143606555e-003, (float) - 1.044195072235e-002, (float) - 5.251195927114e-003, + (float) 9.534285432471e-003, (float) 5.213750365616e-003, (float) - 8.733007006427e-003, (float) - 5.174387044018e-003, (float) 8.018375971792e-003, + (float) 5.132524592209e-003, (float) - 7.376044395058e-003, (float) - 5.088173036641e-003, (float) 6.794738285542e-003, (float) 5.041554413526e-003, + (float) - 6.265199509171e-003, (float) - 4.992461365274e-003, (float) 5.780469043985e-003, (float) 4.941143760176e-003, (float) - 5.334885946192e-003, + (float) - 4.888454593861e-003, (float) 4.922646164542e-003, (float) 4.833943437272e-003, (float) - 4.539528511166e-003, (float) - 4.776999990045e-003, + (float) 4.182843960043e-003, (float) 4.718000809430e-003, (float) - 3.849899735547e-003, (float) - 4.657460095921e-003, (float) 3.537784469302e-003, + (float) 4.595095710114e-003, (float) - 3.244542924923e-003, (float) - 4.530883832943e-003, (float) 2.968539548004e-003, (float) 4.464960149734e-003, + (float) - 2.708200770755e-003, (float) - 4.397272684020e-003, (float) 2.462366047089e-003, (float) 4.327941872004e-003, (float) - 2.230058942337e-003, + (float) - 4.257408085939e-003, (float) 2.009872291898e-003, (float) 4.185540927469e-003, (float) - 1.800743383460e-003, (float) - 4.111869542510e-003, + (float) 1.602515835838e-003, (float) 4.036756667297e-003, (float) - 1.414791150723e-003, (float) - 3.961005564525e-003, (float) 1.236277315086e-003, + (float) 3.884567294966e-003, (float) - 1.065867612984e-003, (float) - 3.806649107069e-003, (float) 9.036595637004e-004, (float) 3.727291920777e-003, + (float) - 7.497497805930e-004, (float) - 3.647201821596e-003, (float) 6.034051597652e-004, (float) 3.566606134171e-003, (float) - 4.636621183957e-004, + (float) - 3.484791457407e-003, (float) 3.307328425452e-004, (float) 3.401760376538e-003, (float) - 2.049786891772e-004, (float) - 3.318355500563e-003, + (float) 8.584892395569e-005, (float) 3.235110828048e-003, (float) 2.782985135369e-005, (float) - 3.151255446637e-003, (float) - 1.359382829811e-004, + (float) 3.066623414599e-003, (float) 2.380521797797e-004, (float) - 2.981956373303e-003, (float) - 3.346488919796e-004, (float) 2.897715073078e-003, + (float) 4.268830572252e-004, (float) - 2.812899297523e-003, (float) - 5.143438896094e-004, (float) 2.727379304929e-003, (float) 5.963947377435e-004, + (float) - 2.642112224434e-003, (float) - 6.736494366209e-004, (float) 2.557416285858e-003, (float) 7.471803656806e-004, (float) - 2.472094691981e-003, + (float) - 8.160716710263e-004, (float) 2.386557312794e-003, (float) 8.799533412324e-004, (float) - 2.301879563126e-003, (float) - 9.399028586473e-004, + (float) 2.217664374578e-003, (float) 9.962070742267e-004, (float) - 2.133252204410e-003, (float) - 1.047877974227e-003, (float) 2.049903843463e-003, + (float) 1.095925463900e-003, (float) - 1.967442657059e-003, (float) - 1.140994785147e-003, (float) 1.884828365040e-003, (float) 1.181949655991e-003, + (float) - 1.803063205736e-003, (float) - 1.219211242008e-003, (float) 1.722681043912e-003, (float) 1.254114183544e-003, (float) - 1.642079777660e-003, + (float) - 1.285301279727e-003, (float) 1.561900282048e-003, (float) 1.312269387543e-003, (float) - 1.483771621272e-003, (float) - 1.337154931483e-003, + (float) 1.405674275449e-003, (float) 1.358185632312e-003, (float) - 1.329115340603e-003, (float) - 1.376198638858e-003, (float) 1.254375291373e-003, + (float) 1.392478926372e-003, (float) - 1.179673831986e-003, (float) - 1.405087088396e-003, (float) 1.106948972842e-003, (float) 1.415601499601e-003, + (float) - 1.035464848937e-003, (float) - 1.424329953401e-003, (float) 9.640000205246e-004, (float) 1.429349304332e-003, (float) - 8.949540559698e-004, + (float) - 1.433298843968e-003, (float) 8.254983244591e-004, (float) 1.433006680474e-003, (float) - 7.590842956586e-004, (float) - 1.431723738610e-003, + (float) 6.930389693885e-004, (float) 1.427153322508e-003, (float) - 6.296742832444e-004, (float) - 1.421549050340e-003, (float) 5.672145160932e-004, + (float) 1.413756425541e-003, (float) - 5.064357635350e-004, (float) - 1.404378077863e-003, (float) 4.469245863820e-004, (float) 1.393229786168e-003, + (float) - 3.886579246534e-004, (float) - 1.380095678916e-003, (float) 3.319638947909e-004, (float) 1.365216750693e-003, (float) - 2.767754823491e-004, + (float) - 1.348538305787e-003, (float) 2.232129919651e-004, (float) 1.329974954064e-003, (float) - 1.717961954652e-004, (float) - 1.310173684327e-003, + (float) 1.223071384268e-004, (float) 1.289443015758e-003, (float) - 7.433354174569e-005, (float) - 1.267597215030e-003, (float) 2.793170702027e-005, + (float) 1.244802222599e-003, (float) 1.722309885781e-005, (float) - 1.220730499698e-003, (float) - 6.105502150698e-005, (float) 1.195016515742e-003, + (float) 1.029125055130e-004, (float) - 1.168069638194e-003, (float) - 1.425881460745e-004, (float) 1.140444841288e-003, (float) 1.803999502271e-004, + (float) - 1.112203502198e-003, (float) - 2.163900938188e-004, (float) 1.083612570606e-003, (float) 2.509109323082e-004, (float) - 1.054638636894e-003, + (float) - 2.843503685027e-004, (float) 1.024733751383e-003, (float) 3.163873335071e-004, (float) - 9.937591861314e-004, (float) - 3.465711833398e-004, + (float) 9.620204713426e-004, (float) 3.747939959452e-004, (float) - 9.297436930304e-004, (float) - 4.009277182108e-004, (float) 8.973420149762e-004, + (float) 4.250690490151e-004, (float) - 8.653751202061e-004, (float) - 4.480343741175e-004, (float) 8.334617833183e-004, (float) 4.701439201458e-004, + (float) - 8.009185568264e-004, (float) - 4.909399565337e-004, (float) 7.676007675934e-004, (float) 5.098171451209e-004, (float) - 7.340039635307e-004, + (float) - 5.267382801903e-004, (float) 7.004526959840e-004, (float) 5.416686835400e-004, (float) - 6.675564463085e-004, (float) - 5.552572270111e-004, + (float) 6.352880253925e-004, (float) 5.681353065596e-004, (float) - 6.029679388270e-004, (float) - 5.802595330793e-004, (float) 5.697973331218e-004, + (float) 5.904522258905e-004, (float) - 5.364779620831e-004, (float) - 5.984097187292e-004, (float) 5.039254713546e-004, (float) 6.046314459814e-004, + (float) - 4.726777081461e-004, (float) - 6.102659557898e-004, (float) 4.419629007982e-004, (float) 6.154740944566e-004, (float) - 4.110126983210e-004, + (float) - 6.197373802874e-004, (float) 3.794107287795e-004, (float) 6.217754987501e-004, (float) - 3.484125142872e-004, (float) - 6.218075972611e-004, + (float) 3.189781263679e-004, (float) 6.209921559119e-004, (float) - 2.909797933304e-004, (float) - 6.205808968069e-004, (float) 2.625902273169e-004, + (float) 6.194421365491e-004, (float) - 2.334612077119e-004, (float) - 6.160453602904e-004, (float) 2.050193734239e-004, (float) 6.103250533849e-004, + (float) - 1.791348851279e-004, (float) - 6.047947232235e-004, (float) 1.543883746225e-004, (float) 6.000426995209e-004, (float) - 1.287437605610e-004, + (float) - 5.941431998669e-004, (float) 1.025052366029e-004, (float) 5.852799390936e-004, (float) - 7.867758251969e-005, (float) - 5.757813638276e-004, + (float) 5.713859403233e-005, (float) 5.677956913097e-004, (float) - 3.493017868056e-005, (float) - 5.595560306151e-004, (float) 1.129727308307e-005, + (float) 5.478734582255e-004, (float) 9.674319498129e-006, (float) - 5.355054669473e-004, (float) - 2.779134779343e-005, (float) 5.255987039514e-004, + (float) 4.753115459198e-005, (float) - 5.146667747733e-004, (float) - 6.827228464703e-005, (float) 4.998780903868e-004, (float) 8.476411455038e-005, + (float) - 4.866041612047e-004, (float) - 1.000048491894e-004, (float) 4.756987576397e-004, (float) 1.185710423385e-004, (float) - 4.603990618508e-004, + (float) - 1.338587279643e-004, (float) 4.447247309663e-004, (float) 1.456088038973e-004, (float) - 4.335350916263e-004, (float) - 1.621552954359e-004, + (float) 4.170995964833e-004, (float) 1.747765776478e-004, (float) - 4.009205689012e-004, (float) - 1.842093035737e-004, (float) 3.895781288432e-004, + (float) 1.999494168871e-004, (float) - 3.696711810736e-004, (float) - 2.060273208877e-004, (float) 3.582196439592e-004, (float) 2.190501787592e-004, + (float) - 3.401042900591e-004, (float) - 2.259436476779e-004, (float) 3.261618119620e-004, (float) 2.353216838587e-004, (float) - 3.097933373634e-004, + (float) - 2.422677063636e-004, (float) 2.945239709175e-004, (float) 2.491244096402e-004, (float) - 2.789293863887e-004, (float) - 2.550401641814e-004, + (float) 2.635383838792e-004, (float) 2.602688344952e-004, (float) - 2.483814212302e-004, (float) - 2.650434716994e-004, (float) 2.331377491223e-004, + (float) 2.690195363322e-004, (float) - 2.181185345008e-004, (float) - 2.723750410219e-004, (float) 2.033292028967e-004, (float) 2.752088365441e-004, + (float) - 1.887189126391e-004, (float) - 2.775743726755e-004, (float) 1.741553960777e-004, (float) 2.793085842202e-004, (float) - 1.597707317081e-004, + (float) - 2.804597862803e-004, (float) 1.455506215115e-004, (float) 2.808967923003e-004, (float) - 1.318263284371e-004, (float) - 2.810498626639e-004, + (float) 1.182425329275e-004, (float) 2.807049278836e-004, (float) - 1.049053516406e-004, (float) - 2.798865730517e-004, (float) 9.185585608604e-005, + (float) 2.786327455942e-004, (float) - 7.913713870114e-005, (float) - 2.770661665078e-004, (float) 6.658908505887e-005, (float) 2.749705769146e-004, + (float) - 5.452878257789e-005, (float) - 2.727139254030e-004, (float) 4.267470287693e-005, (float) 2.701901534524e-004, (float) - 3.098103063675e-005, + (float) - 2.672713250910e-004, (float) 1.959506007225e-005, (float) 2.640373512578e-004, (float) - 8.605011575155e-006, (float) - 2.607451266109e-004, + (float) - 2.297001211178e-006, (float) 2.571630808553e-004, (float) 1.298908745154e-005, (float) - 2.533379001119e-004, (float) - 2.346096839263e-005, + (float) 2.493326534241e-004, (float) 3.380378919976e-005, (float) - 2.450580921435e-004, (float) - 4.394022835345e-005, (float) 2.405543319009e-004, + (float) 5.380295174011e-005, (float) - 2.360269018314e-004, (float) - 6.362969041322e-005, (float) 2.313695981464e-004, (float) 7.350850871907e-005, + (float) - 2.263811595801e-004, (float) - 8.322092258564e-005, (float) 2.212630220095e-004, (float) 9.291206030779e-005, (float) - 2.159988725649e-004, + (float) - 1.026783876418e-004, (float) 2.105136263884e-004, (float) 1.125436526441e-004, (float) - 2.047505646951e-004, (float) - 1.224823030873e-004, + (float) 1.988019142637e-004, (float) 1.327632434198e-004, (float) - 1.923098357663e-004, (float) - 1.431090602159e-004, (float) 1.854489350961e-004, + (float) 1.536329356026e-004, (float) - 1.782437567680e-004, (float) - 1.645342831667e-004, (float) 1.705747652949e-004, (float) 1.760669168660e-004, + (float) - 1.619282978772e-004, (float) - 1.878370907468e-004, (float) 1.525152442899e-004, (float) 2.001325818624e-004, (float) - 1.420059883336e-004, + (float) - 2.128963846610e-004, (float) 1.302389953023e-004, (float) 2.262277295494e-004, (float) - 1.167662237676e-004, (float) - 2.398340044811e-004, + (float) 1.015795101283e-004, (float) 2.539623487208e-004, (float) - 8.400473971490e-005, (float) - 2.682059180462e-004, (float) 6.386636089117e-005, + (float) 2.826060999738e-004, (float) - 4.040411770010e-005, (float) - 2.965903264243e-004, (float) 1.328843895284e-005, (float) 3.099640470313e-004, + (float) 1.843967368528e-005, (float) - 3.217977487285e-004, (float) - 5.533287789728e-005, (float) 3.312977192436e-004, (float) 9.845446547453e-005, + (float) - 3.367394950886e-004, (float) - 1.482361183421e-004, (float) 3.366006455231e-004, (float) 2.057925864008e-004, (float) - 3.278882894771e-004, + (float) - 2.713518058883e-004, (float) 3.071631118731e-004, (float) 3.450469073084e-004, (float) - 2.693320767774e-004, (float) - 4.257030079639e-004, + (float) 2.077730139398e-004, (float) 5.103528659400e-004, (float) - 1.133457948942e-004, (float) - 5.918859501058e-004, (float) - 2.508428842065e-005, + (float) 6.567967063227e-004, (float) 2.211378711751e-004, (float) - 6.784989588347e-004, (float) - 4.869084931865e-004, (float) 6.081914903075e-004, + (float) 8.234667012568e-004, (float) - 3.557893702940e-004, (float) - 1.185316896754e-003, (float) - 2.336521287917e-004, (float) 1.370278722621e-003, + (float) 1.368071261832e-003, (float) - 6.494578851510e-004, (float) - 2.821616068751e-003, (float) - 3.355260288418e-003, (float) - 2.309090436241e-003, + (float) - 9.559790653313e-004, (float) - 1.916895913880e-004, (float) 3.796696928466e-006 + }; + + *lenh0 = lensh02; /* store 'number of coefficients' */ + *h0 = sh02; /* store pointer to h02[]-array */ +} + +#undef lensh02 +/* ....................... End of fill_slp_2_to_1() ....................... */ + + + +/* + ============================================================================ + + void fill_slp_3_to_1 (float **h0, long *lenh0); + ~~~~~~~~~~~~~~~~~~~ + + Description: + ~~~~~~~~~~~~ + + Initialize pointer to array with FIR coefficients for up/down + sampling low-pass filter with factor 3:1 or 1:3 and 24 bit + representation. + v1.0 filtdemo firpm 16000,2602,2667,0.3, 80, 728 + v1.1 filtdemo firpm 16000,2602,2667,0.3, 100, 872 + h3 = filtdemo('getfilt') + for i = 1:length(h3) fprintf('(float)%20.12e, ', h3(i)); + if rem(i,5) == 0 fprintf('\n'); end end + + Parameters: + ~~~~~~~~~~~ + h0: (Out) pointer to array with FIR coefficients + lenh0: (Out) pointer to number of coefficients + + + Return value: + ~~~~~~~~~~~~~ + None. + + Author: + ~~~~~~~ + + History: + ~~~~~~~~ + 05.April.2012 v1.0 - Added filters: SHQ2 and SHQ3 (France Telecom) + + ============================================================================ +*/ +#define lensh03 873 + +void fill_slp_3_to_1 (h0, lenh0) + float **h0; + long *lenh0; +{ + static float sh03[lensh03] = { + (float) - 5.702667454304e-005, (float) - 2.290248756652e-004, (float) - 5.695388694927e-004, (float) - 1.047262848994e-003, (float) - 1.506278259322e-003, + (float) - 1.697084386485e-003, (float) - 1.398843870300e-003, (float) - 5.776254455710e-004, (float) 5.267279465880e-004, (float) 1.474227829087e-003, + (float) 1.850941005949e-003, (float) 1.521886181517e-003, (float) 7.374635156026e-004, (float) - 2.831586756965e-006, (float) - 2.610758773407e-004, + (float) 5.790488592536e-005, (float) 6.558699193392e-004, (float) 1.065027553853e-003, (float) 9.887411557505e-004, (float) 5.083645939775e-004, + (float) 2.342940220659e-006, (float) - 1.567062494057e-004, (float) 1.110403908595e-004, (float) 5.457214173255e-004, (float) 7.717764862227e-004, + (float) 6.055726812478e-004, (float) 1.949515317766e-004, (float) - 1.184196188439e-004, (float) - 9.160203082544e-005, (float) 2.209374944482e-004, + (float) 5.265018221270e-004, (float) 5.531560214976e-004, (float) 2.815751711742e-004, (float) - 4.853153913830e-005, (float) - 1.563367357580e-004, + (float) 3.366074541317e-005, (float) 3.328093694602e-004, (float) 4.636714131641e-004, (float) 3.086568259652e-004, (float) 9.521084805123e-006, + (float) - 1.672524549008e-004, (float) - 7.321835254365e-005, (float) 1.915905388598e-004, (float) 3.756857462901e-004, (float) 3.081437126124e-004, + (float) 5.226907920748e-005, (float) - 1.575946050063e-004, (float) - 1.344789464591e-004, (float) 9.034674803378e-005, (float) 3.003518594011e-004, + (float) 2.971198893452e-004, (float) 8.384203623239e-005, (float) - 1.407963804041e-004, (float) - 1.703890216943e-004, (float) 1.652684652722e-005, + (float) 2.386510548738e-004, (float) 2.839782736591e-004, (float) 1.090673723768e-004, (float) - 1.216308514221e-004, (float) - 1.923295141096e-004, + (float) - 3.985072213105e-005, (float) 1.875991204246e-004, (float) 2.717660216481e-004, (float) 1.314707046626e-004, (float) - 1.008243557814e-004, + (float) - 2.054434756406e-004, (float) - 8.467292384865e-005, (float) 1.442573681930e-004, (float) 2.610066066766e-004, (float) 1.524510476976e-004, + (float) - 7.902847673495e-005, (float) - 2.130526218114e-004, (float) - 1.219890713673e-004, (float) 1.063399253112e-004, (float) 2.519859951800e-004, + (float) 1.734491436341e-004, (float) - 5.587231315091e-005, (float) - 2.169349988011e-004, (float) - 1.549061289756e-004, (float) 7.120763788262e-005, + (float) 2.437177281471e-004, (float) 1.948555676425e-004, (float) - 3.086033846812e-005, (float) - 2.175745882557e-004, (float) - 1.849236252476e-004, + (float) 3.722566423543e-005, (float) 2.353340603942e-004, (float) 2.167081052392e-004, (float) - 3.703170533307e-006, (float) - 2.152202989036e-004, + (float) - 2.130638454690e-004, (float) 3.078805881752e-006, (float) 2.259877675272e-004, (float) 2.390210432952e-004, (float) 2.617581267358e-005, + (float) - 2.094639911149e-004, (float) - 2.396408397869e-004, (float) - 3.220609123686e-005, (float) 2.146367670825e-004, (float) 2.613020076192e-004, + (float) 5.899602321765e-005, (float) - 1.997806524280e-004, (float) - 2.644528721997e-004, (float) - 6.908347167316e-005, (float) 2.003994342832e-004, + (float) 2.828118853525e-004, (float) 9.456005724760e-005, (float) - 1.859305896169e-004, (float) - 2.873053305036e-004, (float) - 1.078135783906e-004, + (float) 1.825933898221e-004, (float) 3.028816854225e-004, (float) 1.326435299606e-004, (float) - 1.676779512332e-004, (float) - 3.079331791370e-004, + (float) - 1.485750250569e-004, (float) 1.605453339105e-004, (float) 3.207874253071e-004, (float) 1.729981027969e-004, (float) - 1.446923844597e-004, + (float) - 3.258518962902e-004, (float) - 1.912839973272e-004, (float) 1.337849210997e-004, (float) 3.359204137548e-004, (float) 2.154852410306e-004, + (float) - 1.164355791130e-004, (float) - 3.402946219591e-004, (float) - 2.356749110871e-004, (float) 1.017519030470e-004, (float) 3.473219066124e-004, + (float) 2.595861094810e-004, (float) - 8.247985162440e-005, (float) - 3.501778624332e-004, (float) - 2.808530765872e-004, (float) 6.448731739501e-005, + (float) 3.542546122559e-004, (float) 3.044839629528e-004, (float) - 4.306342775237e-005, (float) - 3.551282513302e-004, (float) - 3.263921987448e-004, + (float) 2.192426783394e-005, (float) 3.561971331453e-004, (float) 3.497859191992e-004, (float) 2.055980934252e-006, (float) - 3.544148970394e-004, + (float) - 3.717977628683e-004, (float) - 2.629987685449e-005, (float) 3.520514596533e-004, (float) 3.944857642507e-004, (float) 5.277571215679e-005, + (float) - 3.471915002737e-004, (float) - 4.160648347652e-004, (float) - 7.993813455368e-005, (float) 3.411114019359e-004, (float) 4.376339448427e-004, + (float) 1.088493550823e-004, (float) - 3.327174320834e-004, (float) - 4.581277303213e-004, (float) - 1.385955596429e-004, (float) 3.227066885945e-004, + (float) 4.780809063323e-004, (float) 1.696775520342e-004, (float) - 3.105144597273e-004, (float) - 4.968659484029e-004, (float) - 2.014702976084e-004, + (float) 2.967304590010e-004, (float) 5.150937489368e-004, (float) 2.347087797104e-004, (float) - 2.804528555952e-004, (float) - 5.317678587328e-004, + (float) - 2.684301130237e-004, (float) 2.625408226728e-004, (float) 5.476982715351e-004, (float) 3.035278106007e-004, (float) - 2.419332992486e-004, + (float) - 5.617064251919e-004, (float) - 3.388485533212e-004, (float) 2.196467033878e-004, (float) 5.746786785084e-004, (float) 3.752457273392e-004, + (float) - 1.947946881500e-004, (float) - 5.857581310721e-004, (float) - 4.120508580248e-004, (float) 1.677356672876e-004, (float) 5.950203471973e-004, + (float) 4.492196431000e-004, (float) - 1.384637472272e-004, (float) - 6.023600081843e-004, (float) - 4.866311063082e-004, (float) 1.070101277961e-004, + (float) 6.077115455789e-004, (float) 5.242229671950e-004, (float) - 7.332517897366e-005, (float) - 6.108956903682e-004, (float) - 5.617572406918e-004, + (float) 3.765710388723e-005, (float) 6.122535665132e-004, (float) 5.998690210736e-004, (float) 1.103337252265e-006, (float) - 6.101918060802e-004, + (float) - 6.366652752751e-004, (float) - 4.101866700778e-005, (float) 6.065187804431e-004, (float) 6.737711020146e-004, (float) 8.349599417419e-005, + (float) - 6.001874205543e-004, (float) - 7.107611600986e-004, (float) - 1.289670732718e-004, (float) 5.898895822538e-004, (float) 7.457161842468e-004, + (float) 1.753449481877e-004, (float) - 5.774443295022e-004, (float) - 7.798678193657e-004, (float) - 2.230334725061e-004, (float) 5.635271134980e-004, + (float) 8.152306244447e-004, (float) 2.755046534225e-004, (float) - 5.434273506344e-004, (float) - 8.464802274973e-004, (float) - 3.277092661666e-004, + (float) 5.210307991128e-004, (float) 8.756596447340e-004, (float) 3.794273420016e-004, (float) - 4.990318212014e-004, (float) - 9.079503131393e-004, + (float) - 4.380386208554e-004, (float) 4.685715007029e-004, (float) 9.341398358924e-004, (float) 4.952457363886e-004, (float) - 4.360095410718e-004, + (float) - 9.581583004572e-004, (float) - 5.526178358650e-004, (float) 4.017025817632e-004, (float) 9.817267986707e-004, (float) 6.126724675261e-004, + (float) - 3.629093431450e-004, (float) - 1.002439646862e-003, (float) - 6.737587650718e-004, (float) 3.204253623397e-004, (float) 1.020517658997e-003, + (float) 7.360180736312e-004, (float) - 2.737981347557e-004, (float) - 1.035166912472e-003, (float) - 7.986608366722e-004, (float) 2.233015838909e-004, + (float) 1.045721090576e-003, (float) 8.598542706791e-004, (float) - 1.720078687206e-004, (float) - 1.056474335818e-003, (float) - 9.249608577418e-004, + (float) 1.139016227189e-004, (float) 1.061470672775e-003, (float) 9.889032323226e-004, (float) - 5.260312145850e-005, (float) - 1.062802973797e-003, + (float) - 1.052661166844e-003, (float) - 1.234469409022e-005, (float) 1.060136819634e-003, (float) 1.115982607845e-003, (float) 8.099003769379e-005, + (float) - 1.052868934904e-003, (float) - 1.177547710041e-003, (float) - 1.512053491539e-004, (float) 1.044016157338e-003, (float) 1.241286624384e-003, + (float) 2.276412600050e-004, (float) - 1.028714494774e-003, (float) - 1.302806041666e-003, (float) - 3.068949503392e-004, (float) 1.009322937005e-003, + (float) 1.363843344369e-003, (float) 3.906609064444e-004, (float) - 9.838656513075e-004, (float) - 1.422262246448e-003, (float) - 4.770635768666e-004, + (float) 9.535551337159e-004, (float) 1.478448816939e-003, (float) 5.657155736003e-004, (float) - 9.194440566142e-004, (float) - 1.534039735215e-003, + (float) - 6.587006775073e-004, (float) 8.793107473467e-004, (float) 1.587111750398e-003, (float) 7.547147875959e-004, (float) - 8.338828124821e-004, + (float) - 1.638222602213e-003, (float) - 8.546083977396e-004, (float) 7.818895385424e-004, (float) 1.686035622285e-003, (float) 9.575865466165e-004, + (float) - 7.231383262379e-004, (float) - 1.729347857177e-003, (float) - 1.061753152135e-003, (float) 6.598691919979e-004, (float) 1.770597985361e-003, + (float) 1.169781516343e-003, (float) - 5.891500710358e-004, (float) - 1.806699639550e-003, (float) - 1.278568313904e-003, (float) 5.141179931545e-004, + (float) 1.841027853974e-003, (float) 1.391905141504e-003, (float) - 4.306947853300e-004, (float) - 1.869713791607e-003, (float) - 1.506708961470e-003, + (float) 3.409327833389e-004, (float) 1.894038136926e-003, (float) 1.624014474020e-003, (float) - 2.437048054541e-004, (float) - 1.912908177017e-003, + (float) - 1.743223810231e-003, (float) 1.387216181787e-004, (float) 1.925117887436e-003, (float) 1.862486593022e-003, (float) - 2.821070804092e-005, + (float) - 1.933229951667e-003, (float) - 1.984800448536e-003, (float) - 9.123378372710e-005, (float) 1.933710705029e-003, (float) 2.106846839834e-003, + (float) 2.165780283200e-004, (float) - 1.929629718754e-003, (float) - 2.232160937187e-003, (float) - 3.519049528335e-004, (float) 1.916818837101e-003, + (float) 2.357203940722e-003, (float) 4.947204738569e-004, (float) - 1.896926099071e-003, (float) - 2.483378267598e-003, (float) - 6.466372123975e-004, + (float) 1.868195138012e-003, (float) 2.609246811353e-003, (float) 8.069238284096e-004, (float) - 1.830682441595e-003, (float) - 2.734527768949e-003, + (float) - 9.751897771009e-004, (float) 1.785017781192e-003, (float) 2.860388753350e-003, (float) 1.153172877730e-003, (float) - 1.729312203396e-003, + (float) - 2.985339528727e-003, (float) - 1.339916394519e-003, (float) 1.664473634983e-003, (float) 3.110932565488e-003, (float) 1.537838751758e-003, + (float) - 1.587754627653e-003, (float) - 3.234954638367e-003, (float) - 1.745673580609e-003, (float) 1.499886644666e-003, (float) 3.358421754204e-003, + (float) 1.965130821805e-003, (float) - 1.398872765578e-003, (float) - 3.479845703961e-003, (float) - 2.195572687404e-003, (float) 1.285003495634e-003, + (float) 3.600016865417e-003, (float) 2.438562967617e-003, (float) - 1.156618036116e-003, (float) - 3.718180542243e-003, (float) - 2.694534774140e-003, + (float) 1.012925180360e-003, (float) 3.834373750933e-003, (float) 2.964679101911e-003, (float) - 8.525485951972e-004, (float) - 3.948403524289e-003, + (float) - 3.250343132486e-003, (float) 6.737384489508e-004, (float) 4.059688224041e-003, (float) 3.552470544664e-003, (float) - 4.754275550708e-004, + (float) - 4.168928142770e-003, (float) - 3.873956808281e-003, (float) 2.542076569209e-004, (float) 4.274495623229e-003, (float) 4.215541860516e-003, + (float) - 8.876791492217e-006, (float) - 4.377372661019e-003, (float) - 4.581049335760e-003, (float) - 2.649760888835e-004, (float) 4.475649547624e-003, + (float) 4.971772999526e-003, (float) 5.691152906036e-004, (float) - 4.570711772495e-003, (float) - 5.392866001693e-003, (float) - 9.088730314323e-004, + (float) 4.661637388475e-003, (float) 5.848570522367e-003, (float) 1.289087294300e-003, (float) - 4.748854210334e-003, (float) - 6.345622677870e-003, + (float) - 1.717082156368e-003, (float) 4.831896281817e-003, (float) 6.891804999608e-003, (float) 2.201630775936e-003, (float) - 4.910578903278e-003, + (float) - 7.497415910832e-003, (float) - 2.754230074063e-003, (float) 4.984610468332e-003, (float) 8.175812718542e-003, (float) 3.389552293110e-003, + (float) - 5.054700764131e-003, (float) - 8.946696508829e-003, (float) - 4.129951171808e-003, (float) 5.118515051062e-003, (float) 9.833011394039e-003, + (float) 5.001471509665e-003, (float) - 5.178437003297e-003, (float) - 1.087335325218e-002, (float) - 6.047856746429e-003, (float) 5.230953032476e-003, + (float) 1.211655268747e-002, (float) 7.325438345332e-003, (float) - 5.280041797037e-003, (float) - 1.364671806495e-002, (float) - 8.931122228028e-003, + (float) 5.322573977944e-003, (float) 1.558985548986e-002, (float) 1.101542440923e-002, (float) - 5.359868891871e-003, (float) - 1.816627590250e-002, + (float) - 1.384581531568e-002, (float) 5.391484192615e-003, (float) 2.178322539469e-002, (float) 1.793508230734e-002, (float) - 5.418411065727e-003, + (float) - 2.729479625998e-002, (float) - 2.441474613854e-002, (float) 5.438809365830e-003, (float) 3.683129238215e-002, (float) 3.635025705283e-002, + (float) - 5.453919890093e-003, (float) - 5.764317282647e-002, (float) - 6.601087176309e-002, (float) 5.463088425909e-003, (float) 1.404772330964e-001, + (float) 2.728880604165e-001, (float) 3.278675322959e-001, (float) 2.728880604165e-001, (float) 1.404772330964e-001, (float) 5.463088425909e-003, + (float) - 6.601087176309e-002, (float) - 5.764317282647e-002, (float) - 5.453919890093e-003, (float) 3.635025705283e-002, (float) 3.683129238215e-002, + (float) 5.438809365830e-003, (float) - 2.441474613854e-002, (float) - 2.729479625998e-002, (float) - 5.418411065727e-003, (float) 1.793508230734e-002, + (float) 2.178322539469e-002, (float) 5.391484192615e-003, (float) - 1.384581531568e-002, (float) - 1.816627590250e-002, (float) - 5.359868891871e-003, + (float) 1.101542440923e-002, (float) 1.558985548986e-002, (float) 5.322573977944e-003, (float) - 8.931122228028e-003, (float) - 1.364671806495e-002, + (float) - 5.280041797037e-003, (float) 7.325438345332e-003, (float) 1.211655268747e-002, (float) 5.230953032476e-003, (float) - 6.047856746429e-003, + (float) - 1.087335325218e-002, (float) - 5.178437003297e-003, (float) 5.001471509665e-003, (float) 9.833011394039e-003, (float) 5.118515051062e-003, + (float) - 4.129951171808e-003, (float) - 8.946696508829e-003, (float) - 5.054700764131e-003, (float) 3.389552293110e-003, (float) 8.175812718542e-003, + (float) 4.984610468332e-003, (float) - 2.754230074063e-003, (float) - 7.497415910832e-003, (float) - 4.910578903278e-003, (float) 2.201630775936e-003, + (float) 6.891804999608e-003, (float) 4.831896281817e-003, (float) - 1.717082156368e-003, (float) - 6.345622677870e-003, (float) - 4.748854210334e-003, + (float) 1.289087294300e-003, (float) 5.848570522367e-003, (float) 4.661637388475e-003, (float) - 9.088730314323e-004, (float) - 5.392866001693e-003, + (float) - 4.570711772495e-003, (float) 5.691152906036e-004, (float) 4.971772999526e-003, (float) 4.475649547624e-003, (float) - 2.649760888835e-004, + (float) - 4.581049335760e-003, (float) - 4.377372661019e-003, (float) - 8.876791492217e-006, (float) 4.215541860516e-003, (float) 4.274495623229e-003, + (float) 2.542076569209e-004, (float) - 3.873956808281e-003, (float) - 4.168928142770e-003, (float) - 4.754275550708e-004, (float) 3.552470544664e-003, + (float) 4.059688224041e-003, (float) 6.737384489508e-004, (float) - 3.250343132486e-003, (float) - 3.948403524289e-003, (float) - 8.525485951972e-004, + (float) 2.964679101911e-003, (float) 3.834373750933e-003, (float) 1.012925180360e-003, (float) - 2.694534774140e-003, (float) - 3.718180542243e-003, + (float) - 1.156618036116e-003, (float) 2.438562967617e-003, (float) 3.600016865417e-003, (float) 1.285003495634e-003, (float) - 2.195572687404e-003, + (float) - 3.479845703961e-003, (float) - 1.398872765578e-003, (float) 1.965130821805e-003, (float) 3.358421754204e-003, (float) 1.499886644666e-003, + (float) - 1.745673580609e-003, (float) - 3.234954638367e-003, (float) - 1.587754627653e-003, (float) 1.537838751758e-003, (float) 3.110932565488e-003, + (float) 1.664473634983e-003, (float) - 1.339916394519e-003, (float) - 2.985339528727e-003, (float) - 1.729312203396e-003, (float) 1.153172877730e-003, + (float) 2.860388753350e-003, (float) 1.785017781192e-003, (float) - 9.751897771009e-004, (float) - 2.734527768949e-003, (float) - 1.830682441595e-003, + (float) 8.069238284096e-004, (float) 2.609246811353e-003, (float) 1.868195138012e-003, (float) - 6.466372123975e-004, (float) - 2.483378267598e-003, + (float) - 1.896926099071e-003, (float) 4.947204738569e-004, (float) 2.357203940722e-003, (float) 1.916818837101e-003, (float) - 3.519049528335e-004, + (float) - 2.232160937187e-003, (float) - 1.929629718754e-003, (float) 2.165780283200e-004, (float) 2.106846839834e-003, (float) 1.933710705029e-003, + (float) - 9.123378372710e-005, (float) - 1.984800448536e-003, (float) - 1.933229951667e-003, (float) - 2.821070804092e-005, (float) 1.862486593022e-003, + (float) 1.925117887436e-003, (float) 1.387216181787e-004, (float) - 1.743223810231e-003, (float) - 1.912908177017e-003, (float) - 2.437048054541e-004, + (float) 1.624014474020e-003, (float) 1.894038136926e-003, (float) 3.409327833389e-004, (float) - 1.506708961470e-003, (float) - 1.869713791607e-003, + (float) - 4.306947853300e-004, (float) 1.391905141504e-003, (float) 1.841027853974e-003, (float) 5.141179931545e-004, (float) - 1.278568313904e-003, + (float) - 1.806699639550e-003, (float) - 5.891500710358e-004, (float) 1.169781516343e-003, (float) 1.770597985361e-003, (float) 6.598691919979e-004, + (float) - 1.061753152135e-003, (float) - 1.729347857177e-003, (float) - 7.231383262379e-004, (float) 9.575865466165e-004, (float) 1.686035622285e-003, + (float) 7.818895385424e-004, (float) - 8.546083977396e-004, (float) - 1.638222602213e-003, (float) - 8.338828124821e-004, (float) 7.547147875959e-004, + (float) 1.587111750398e-003, (float) 8.793107473467e-004, (float) - 6.587006775073e-004, (float) - 1.534039735215e-003, (float) - 9.194440566142e-004, + (float) 5.657155736003e-004, (float) 1.478448816939e-003, (float) 9.535551337159e-004, (float) - 4.770635768666e-004, (float) - 1.422262246448e-003, + (float) - 9.838656513075e-004, (float) 3.906609064444e-004, (float) 1.363843344369e-003, (float) 1.009322937005e-003, (float) - 3.068949503392e-004, + (float) - 1.302806041666e-003, (float) - 1.028714494774e-003, (float) 2.276412600050e-004, (float) 1.241286624384e-003, (float) 1.044016157338e-003, + (float) - 1.512053491539e-004, (float) - 1.177547710041e-003, (float) - 1.052868934904e-003, (float) 8.099003769379e-005, (float) 1.115982607845e-003, + (float) 1.060136819634e-003, (float) - 1.234469409022e-005, (float) - 1.052661166844e-003, (float) - 1.062802973797e-003, (float) - 5.260312145850e-005, + (float) 9.889032323226e-004, (float) 1.061470672775e-003, (float) 1.139016227189e-004, (float) - 9.249608577418e-004, (float) - 1.056474335818e-003, + (float) - 1.720078687206e-004, (float) 8.598542706791e-004, (float) 1.045721090576e-003, (float) 2.233015838909e-004, (float) - 7.986608366722e-004, + (float) - 1.035166912472e-003, (float) - 2.737981347557e-004, (float) 7.360180736312e-004, (float) 1.020517658997e-003, (float) 3.204253623397e-004, + (float) - 6.737587650718e-004, (float) - 1.002439646862e-003, (float) - 3.629093431450e-004, (float) 6.126724675261e-004, (float) 9.817267986707e-004, + (float) 4.017025817632e-004, (float) - 5.526178358650e-004, (float) - 9.581583004572e-004, (float) - 4.360095410718e-004, (float) 4.952457363886e-004, + (float) 9.341398358924e-004, (float) 4.685715007029e-004, (float) - 4.380386208554e-004, (float) - 9.079503131393e-004, (float) - 4.990318212014e-004, + (float) 3.794273420016e-004, (float) 8.756596447340e-004, (float) 5.210307991128e-004, (float) - 3.277092661666e-004, (float) - 8.464802274973e-004, + (float) - 5.434273506344e-004, (float) 2.755046534225e-004, (float) 8.152306244447e-004, (float) 5.635271134980e-004, (float) - 2.230334725061e-004, + (float) - 7.798678193657e-004, (float) - 5.774443295022e-004, (float) 1.753449481877e-004, (float) 7.457161842468e-004, (float) 5.898895822538e-004, + (float) - 1.289670732718e-004, (float) - 7.107611600986e-004, (float) - 6.001874205543e-004, (float) 8.349599417419e-005, (float) 6.737711020146e-004, + (float) 6.065187804431e-004, (float) - 4.101866700778e-005, (float) - 6.366652752751e-004, (float) - 6.101918060802e-004, (float) 1.103337252265e-006, + (float) 5.998690210736e-004, (float) 6.122535665132e-004, (float) 3.765710388723e-005, (float) - 5.617572406918e-004, (float) - 6.108956903682e-004, + (float) - 7.332517897366e-005, (float) 5.242229671950e-004, (float) 6.077115455789e-004, (float) 1.070101277961e-004, (float) - 4.866311063082e-004, + (float) - 6.023600081843e-004, (float) - 1.384637472272e-004, (float) 4.492196431000e-004, (float) 5.950203471973e-004, (float) 1.677356672876e-004, + (float) - 4.120508580248e-004, (float) - 5.857581310721e-004, (float) - 1.947946881500e-004, (float) 3.752457273392e-004, (float) 5.746786785084e-004, + (float) 2.196467033878e-004, (float) - 3.388485533212e-004, (float) - 5.617064251919e-004, (float) - 2.419332992486e-004, (float) 3.035278106007e-004, + (float) 5.476982715351e-004, (float) 2.625408226728e-004, (float) - 2.684301130237e-004, (float) - 5.317678587328e-004, (float) - 2.804528555952e-004, + (float) 2.347087797104e-004, (float) 5.150937489368e-004, (float) 2.967304590010e-004, (float) - 2.014702976084e-004, (float) - 4.968659484029e-004, + (float) - 3.105144597273e-004, (float) 1.696775520342e-004, (float) 4.780809063323e-004, (float) 3.227066885945e-004, (float) - 1.385955596429e-004, + (float) - 4.581277303213e-004, (float) - 3.327174320834e-004, (float) 1.088493550823e-004, (float) 4.376339448427e-004, (float) 3.411114019359e-004, + (float) - 7.993813455368e-005, (float) - 4.160648347652e-004, (float) - 3.471915002737e-004, (float) 5.277571215679e-005, (float) 3.944857642507e-004, + (float) 3.520514596533e-004, (float) - 2.629987685449e-005, (float) - 3.717977628683e-004, (float) - 3.544148970394e-004, (float) 2.055980934252e-006, + (float) 3.497859191992e-004, (float) 3.561971331453e-004, (float) 2.192426783394e-005, (float) - 3.263921987448e-004, (float) - 3.551282513302e-004, + (float) - 4.306342775237e-005, (float) 3.044839629528e-004, (float) 3.542546122559e-004, (float) 6.448731739501e-005, (float) - 2.808530765872e-004, + (float) - 3.501778624332e-004, (float) - 8.247985162440e-005, (float) 2.595861094810e-004, (float) 3.473219066124e-004, (float) 1.017519030470e-004, + (float) - 2.356749110871e-004, (float) - 3.402946219591e-004, (float) - 1.164355791130e-004, (float) 2.154852410306e-004, (float) 3.359204137548e-004, + (float) 1.337849210997e-004, (float) - 1.912839973272e-004, (float) - 3.258518962902e-004, (float) - 1.446923844597e-004, (float) 1.729981027969e-004, + (float) 3.207874253071e-004, (float) 1.605453339105e-004, (float) - 1.485750250569e-004, (float) - 3.079331791370e-004, (float) - 1.676779512332e-004, + (float) 1.326435299606e-004, (float) 3.028816854225e-004, (float) 1.825933898221e-004, (float) - 1.078135783906e-004, (float) - 2.873053305036e-004, + (float) - 1.859305896169e-004, (float) 9.456005724760e-005, (float) 2.828118853525e-004, (float) 2.003994342832e-004, (float) - 6.908347167316e-005, + (float) - 2.644528721997e-004, (float) - 1.997806524280e-004, (float) 5.899602321765e-005, (float) 2.613020076192e-004, (float) 2.146367670825e-004, + (float) - 3.220609123686e-005, (float) - 2.396408397869e-004, (float) - 2.094639911149e-004, (float) 2.617581267358e-005, (float) 2.390210432952e-004, + (float) 2.259877675272e-004, (float) 3.078805881752e-006, (float) - 2.130638454690e-004, (float) - 2.152202989036e-004, (float) - 3.703170533307e-006, + (float) 2.167081052392e-004, (float) 2.353340603942e-004, (float) 3.722566423543e-005, (float) - 1.849236252476e-004, (float) - 2.175745882557e-004, + (float) - 3.086033846812e-005, (float) 1.948555676425e-004, (float) 2.437177281471e-004, (float) 7.120763788262e-005, (float) - 1.549061289756e-004, + (float) - 2.169349988011e-004, (float) - 5.587231315091e-005, (float) 1.734491436341e-004, (float) 2.519859951800e-004, (float) 1.063399253112e-004, + (float) - 1.219890713673e-004, (float) - 2.130526218114e-004, (float) - 7.902847673495e-005, (float) 1.524510476976e-004, (float) 2.610066066766e-004, + (float) 1.442573681930e-004, (float) - 8.467292384865e-005, (float) - 2.054434756406e-004, (float) - 1.008243557814e-004, (float) 1.314707046626e-004, + (float) 2.717660216481e-004, (float) 1.875991204246e-004, (float) - 3.985072213105e-005, (float) - 1.923295141096e-004, (float) - 1.216308514221e-004, + (float) 1.090673723768e-004, (float) 2.839782736591e-004, (float) 2.386510548738e-004, (float) 1.652684652722e-005, (float) - 1.703890216943e-004, + (float) - 1.407963804041e-004, (float) 8.384203623239e-005, (float) 2.971198893452e-004, (float) 3.003518594011e-004, (float) 9.034674803378e-005, + (float) - 1.344789464591e-004, (float) - 1.575946050063e-004, (float) 5.226907920748e-005, (float) 3.081437126124e-004, (float) 3.756857462901e-004, + (float) 1.915905388598e-004, (float) - 7.321835254365e-005, (float) - 1.672524549008e-004, (float) 9.521084805123e-006, (float) 3.086568259652e-004, + (float) 4.636714131641e-004, (float) 3.328093694602e-004, (float) 3.366074541317e-005, (float) - 1.563367357580e-004, (float) - 4.853153913830e-005, + (float) 2.815751711742e-004, (float) 5.531560214976e-004, (float) 5.265018221270e-004, (float) 2.209374944482e-004, (float) - 9.160203082544e-005, + (float) - 1.184196188439e-004, (float) 1.949515317766e-004, (float) 6.055726812478e-004, (float) 7.717764862227e-004, (float) 5.457214173255e-004, + (float) 1.110403908595e-004, (float) - 1.567062494057e-004, (float) 2.342940220659e-006, (float) 5.083645939775e-004, (float) 9.887411557505e-004, + (float) 1.065027553853e-003, (float) 6.558699193392e-004, (float) 5.790488592536e-005, (float) - 2.610758773407e-004, (float) - 2.831586756965e-006, + (float) 7.374635156026e-004, (float) 1.521886181517e-003, (float) 1.850941005949e-003, (float) 1.474227829087e-003, (float) 5.267279465880e-004, + (float) - 5.776254455710e-004, (float) - 1.398843870300e-003, (float) - 1.697084386485e-003, (float) - 1.506278259322e-003, (float) - 1.047262848994e-003, + (float) - 5.695388694927e-004, (float) - 2.290248756652e-004, (float) - 5.702667454304e-005 + }; + + *lenh0 = lensh03; /* store 'number of coefficients' */ + *h0 = sh03; /* store pointer to h02[]-array */ +} + +#undef lensh03 +/* ........................ End of fill_lp_3_to_1() ........................ */ + + + /* ************************* END OF FIR-FLAT.C ************************** */ diff --git a/src/fir/fir-wb.c b/src/fir/fir-wb.c index 15bf4727..5b633b3b 100644 --- a/src/fir/fir-wb.c +++ b/src/fir/fir-wb.c @@ -77,6 +77,8 @@ ORIGINAL BY: Cyril Guillaume & Stephane Ragot 11.May.2007 v2.3 Added 20-20000 Hz bandpass filter Ingemar Johansson & Jonas Svedberg, Ericsson + 05.April.2012 v2.3 - Added filters: HP50_32KHZ, HP50_48KHZ (France Telecom) + ============================================================================= */ @@ -1828,3 +1830,737 @@ SCD_FIR *bp20k_48khz_init () { /* .................... End of bp20k_48khz_init() .................... */ /* ************************** END OF FIR-WB.C *************************** */ + + + +/* + ============================================================================ + + void fill_hp50_32khz (float **h0, long *lenh0); + ~~~~~~~~~~~~~~~~~~~~~ + + Description: + ~~~~~~~~~~~~ + Fill filter coefficients for 50 Hz (3dB point) highpass filtering for samples at 32 kHz. + firpm(1118,[0 3/16000 66/16000 1],[0 0 1 1 ],[40 1]) + Same lengt, HP response and passband oscillation (+-0.15dB) as the 14KBP filter + + Parameters: + ~~~~~~~~~~~ + h0: (Out) pointer to array with FIR coefficients + lenh0: (Out) pointer to number of coefficients + + Return value: + ~~~~~~~~~~~~~ + None. + + History: + ~~~~~~~~ + 05.April.2012 v1.0 - Added filters: HP50_32KHZ, HP50_48KHZ (France Telecom) + + ============================================================================ +*/ +#undef HP50_32K_LEN +#define HP50_32K_LEN 1119 +void fill_hp50_32khz (float **h0, long *lenh0) { + static float hp50_32khz_coeff[HP50_32K_LEN] = { + (F) 9.2342753e-003, (F) 1.5551665e-004, (F) 1.5663328e-004, (F) 1.5798547e-004, (F) 1.5903747e-004, + (F) 1.6033147e-004, (F) 1.6129533e-004, (F) 1.6253497e-004, (F) 1.6343643e-004, (F) 1.6461419e-004, + (F) 1.6544194e-004, (F) 1.6657230e-004, (F) 1.6734333e-004, (F) 1.6843147e-004, (F) 1.6914017e-004, + (F) 1.7020317e-004, (F) 1.7087787e-004, (F) 1.7195115e-004, (F) 1.7260586e-004, (F) 1.7371570e-004, + (F) 1.7438288e-004, (F) 1.7560111e-004, (F) 1.7633494e-004, (F) 1.7773870e-004, (F) 1.7859148e-004, + (F) 1.8031784e-004, (F) 1.8138467e-004, (F) 1.8364291e-004, (F) 1.8500691e-004, (F) 1.8826921e-004, + (F) 1.9002553e-004, (F) 1.9648117e-004, (F) 1.7591939e-004, (F) 1.8640971e-004, (F) 1.8950640e-004, + (F) 1.8933708e-004, (F) 1.9094255e-004, (F) 1.9111524e-004, (F) 1.9238679e-004, (F) 1.9267245e-004, + (F) 1.9374881e-004, (F) 1.9407034e-004, (F) 1.9502938e-004, (F) 1.9535326e-004, (F) 1.9621245e-004, + (F) 1.9652536e-004, (F) 1.9732846e-004, (F) 1.9764305e-004, (F) 1.9840997e-004, (F) 1.9872274e-004, + (F) 1.9948456e-004, (F) 1.9982454e-004, (F) 2.0062041e-004, (F) 2.0098888e-004, (F) 2.0182655e-004, + (F) 2.0221283e-004, (F) 2.0309827e-004, (F) 2.0343574e-004, (F) 2.0429009e-004, (F) 2.0439317e-004, + (F) 2.0505697e-004, (F) 2.0443830e-004, (F) 2.0447446e-004, (F) 2.0117747e-004, (F) 2.0668075e-004, + (F) 2.0606828e-004, (F) 2.0522994e-004, (F) 2.0580818e-004, (F) 2.0551705e-004, (F) 2.0583582e-004, + (F) 2.0559447e-004, (F) 2.0575204e-004, (F) 2.0551182e-004, (F) 2.0556260e-004, (F) 2.0528478e-004, + (F) 2.0524898e-004, (F) 2.0494755e-004, (F) 2.0486118e-004, (F) 2.0453189e-004, (F) 2.0439794e-004, + (F) 2.0404606e-004, (F) 2.0389248e-004, (F) 2.0352446e-004, (F) 2.0334171e-004, (F) 2.0292316e-004, + (F) 2.0268931e-004, (F) 2.0218689e-004, (F) 2.0186213e-004, (F) 2.0119510e-004, (F) 2.0072227e-004, + (F) 1.9983291e-004, (F) 1.9922601e-004, (F) 1.9811086e-004, (F) 1.9764812e-004, (F) 1.9670052e-004, + (F) 1.9821206e-004, (F) 1.9574339e-004, (F) 1.9460314e-004, (F) 1.9434052e-004, (F) 1.9312581e-004, + (F) 1.9244888e-004, (F) 1.9126723e-004, (F) 1.9044159e-004, (F) 1.8925727e-004, (F) 1.8831959e-004, + (F) 1.8709650e-004, (F) 1.8608695e-004, (F) 1.8483886e-004, (F) 1.8376430e-004, (F) 1.8246886e-004, + (F) 1.8133430e-004, (F) 1.8000008e-004, (F) 1.7881024e-004, (F) 1.7740887e-004, (F) 1.7613174e-004, + (F) 1.7463511e-004, (F) 1.7326225e-004, (F) 1.7165185e-004, (F) 1.7016635e-004, (F) 1.6842980e-004, + (F) 1.6686975e-004, (F) 1.6506208e-004, (F) 1.6351953e-004, (F) 1.6172121e-004, (F) 1.6035465e-004, + (F) 1.5856474e-004, (F) 1.5725670e-004, (F) 1.5400320e-004, (F) 1.5251907e-004, (F) 1.5099189e-004, + (F) 1.4860587e-004, (F) 1.4676216e-004, (F) 1.4449103e-004, (F) 1.4250292e-004, (F) 1.4021375e-004, + (F) 1.3809993e-004, (F) 1.3577053e-004, (F) 1.3357737e-004, (F) 1.3119183e-004, (F) 1.2890182e-004, + (F) 1.2644454e-004, (F) 1.2407353e-004, (F) 1.2154154e-004, (F) 1.1906901e-004, (F) 1.1642978e-004, + (F) 1.1384795e-004, (F) 1.1110845e-004, (F) 1.0843159e-004, (F) 1.0559403e-004, (F) 1.0283674e-004, + (F) 9.9931180e-005, (F) 9.7143301e-005, (F) 9.4193407e-005, (F) 9.1380999e-005, (F) 8.8349417e-005, + (F) 8.5454155e-005, (F) 8.2145791e-005, (F) 7.8972973e-005, (F) 7.5176800e-005, (F) 7.2644410e-005, + (F) 6.9400379e-005, (F) 6.5655639e-005, (F) 6.2520637e-005, (F) 5.8926380e-005, (F) 5.5592602e-005, + (F) 5.1960346e-005, (F) 4.8492626e-005, (F) 4.4819152e-005, (F) 4.1246975e-005, (F) 3.7486700e-005, + (F) 3.3802916e-005, (F) 2.9964364e-005, (F) 2.6183621e-005, (F) 2.2246019e-005, (F) 1.8349478e-005, + (F) 1.4312671e-005, (F) 1.0327219e-005, (F) 6.2116278e-006, (F) 2.1468476e-006, (F) - 2.0462664e-006, + (F) - 6.1754788e-006, (F) - 1.0433728e-005, (F) - 1.4631174e-005, (F) - 1.8994868e-005, (F) - 2.3307139e-005, + (F) - 2.7830625e-005, (F) - 3.2298035e-005, (F) - 3.7020060e-005, (F) - 4.1543856e-005, (F) - 4.6245143e-005, + (F) - 5.0403230e-005, (F) - 5.5414477e-005, (F) - 6.0403894e-005, (F) - 6.4897114e-005, (F) - 6.9912852e-005, + (F) - 7.4678495e-005, (F) - 7.9718290e-005, (F) - 8.4612320e-005, (F) - 8.9698178e-005, (F) - 9.4721351e-005, + (F) - 9.9898650e-005, (F) - 1.0502188e-004, (F) - 1.1027447e-004, (F) - 1.1550253e-004, (F) - 1.2085379e-004, + (F) - 1.2617687e-004, (F) - 1.3159904e-004, (F) - 1.3699375e-004, (F) - 1.4249159e-004, (F) - 1.4796949e-004, + (F) - 1.5355011e-004, (F) - 1.5911076e-004, (F) - 1.6479026e-004, (F) - 1.7046432e-004, (F) - 1.7627586e-004, + (F) - 1.8206851e-004, (F) - 1.8799894e-004, (F) - 1.9387145e-004, (F) - 1.9986051e-004, (F) - 2.0570182e-004, + (F) - 2.1170656e-004, (F) - 2.1762031e-004, (F) - 2.2408600e-004, (F) - 2.3020843e-004, (F) - 2.3612941e-004, + (F) - 2.4259571e-004, (F) - 2.4875579e-004, (F) - 2.5518652e-004, (F) - 2.6147595e-004, (F) - 2.6796135e-004, + (F) - 2.7438622e-004, (F) - 2.8093774e-004, (F) - 2.8744468e-004, (F) - 2.9407149e-004, (F) - 3.0067960e-004, + (F) - 3.0738263e-004, (F) - 3.1405879e-004, (F) - 3.2082305e-004, (F) - 3.2758021e-004, (F) - 3.3443304e-004, + (F) - 3.4128144e-004, (F) - 3.4822305e-004, (F) - 3.5516575e-004, (F) - 3.6221220e-004, (F) - 3.6925666e-004, + (F) - 3.7639420e-004, (F) - 3.8350434e-004, (F) - 3.9070041e-004, (F) - 3.9784824e-004, (F) - 4.0508935e-004, + (F) - 4.1228858e-004, (F) - 4.1967673e-004, (F) - 4.2705956e-004, (F) - 4.3464576e-004, (F) - 4.4189166e-004, + (F) - 4.4925726e-004, (F) - 4.5702829e-004, (F) - 4.6443246e-004, (F) - 4.7212529e-004, (F) - 4.7968369e-004, + (F) - 4.8742511e-004, (F) - 4.9509526e-004, (F) - 5.0286502e-004, (F) - 5.1061081e-004, (F) - 5.1845390e-004, + (F) - 5.2627883e-004, (F) - 5.3417018e-004, (F) - 5.4205412e-004, (F) - 5.5001749e-004, (F) - 5.5799069e-004, + (F) - 5.6603542e-004, (F) - 5.7408320e-004, (F) - 5.8219998e-004, (F) - 5.9032342e-004, (F) - 5.9851277e-004, + (F) - 6.0669333e-004, (F) - 6.1492812e-004, (F) - 6.2314811e-004, (F) - 6.3143448e-004, (F) - 6.3971196e-004, + (F) - 6.4808079e-004, (F) - 6.5645951e-004, (F) - 6.6495597e-004, (F) - 6.7340132e-004, (F) - 6.8188705e-004, + (F) - 6.9023175e-004, (F) - 6.9882694e-004, (F) - 7.0758003e-004, (F) - 7.1597837e-004, (F) - 7.2471488e-004, + (F) - 7.3329577e-004, (F) - 7.4204112e-004, (F) - 7.5069691e-004, (F) - 7.5944753e-004, (F) - 7.6818552e-004, + (F) - 7.7699171e-004, (F) - 7.8577593e-004, (F) - 7.9461592e-004, (F) - 8.0346439e-004, (F) - 8.1237496e-004, + (F) - 8.2128725e-004, (F) - 8.3024166e-004, (F) - 8.3919545e-004, (F) - 8.4819452e-004, (F) - 8.5719302e-004, + (F) - 8.6622788e-004, (F) - 8.7525413e-004, (F) - 8.8432225e-004, (F) - 8.9339327e-004, (F) - 9.0252009e-004, + (F) - 9.1165217e-004, (F) - 9.2084585e-004, (F) - 9.3003378e-004, (F) - 9.3925877e-004, (F) - 9.4842600e-004, + (F) - 9.5763434e-004, (F) - 9.6685278e-004, (F) - 9.7624213e-004, (F) - 9.8558142e-004, (F) - 9.9469419e-004, + (F) - 1.0041623e-003, (F) - 1.0134207e-003, (F) - 1.0228270e-003, (F) - 1.0321370e-003, (F) - 1.0415421e-003, + (F) - 1.0509287e-003, (F) - 1.0603454e-003, (F) - 1.0697472e-003, (F) - 1.0791931e-003, (F) - 1.0886461e-003, + (F) - 1.0981218e-003, (F) - 1.1075850e-003, (F) - 1.1170647e-003, (F) - 1.1265441e-003, (F) - 1.1360444e-003, + (F) - 1.1455390e-003, (F) - 1.1550493e-003, (F) - 1.1645586e-003, (F) - 1.1740960e-003, (F) - 1.1836376e-003, + (F) - 1.1932042e-003, (F) - 1.2027641e-003, (F) - 1.2123405e-003, (F) - 1.2218939e-003, (F) - 1.2314513e-003, + (F) - 1.2409915e-003, (F) - 1.2505846e-003, (F) - 1.2602023e-003, (F) - 1.2698414e-003, (F) - 1.2793765e-003, + (F) - 1.2888500e-003, (F) - 1.2986084e-003, (F) - 1.3080936e-003, (F) - 1.3177360e-003, (F) - 1.3272775e-003, + (F) - 1.3369056e-003, (F) - 1.3464878e-003, (F) - 1.3560717e-003, (F) - 1.3656533e-003, (F) - 1.3752525e-003, + (F) - 1.3848374e-003, (F) - 1.3944071e-003, (F) - 1.4039627e-003, (F) - 1.4135209e-003, (F) - 1.4230765e-003, + (F) - 1.4326278e-003, (F) - 1.4421680e-003, (F) - 1.4517067e-003, (F) - 1.4612428e-003, (F) - 1.4707800e-003, + (F) - 1.4803050e-003, (F) - 1.4898201e-003, (F) - 1.4993153e-003, (F) - 1.5087988e-003, (F) - 1.5182618e-003, + (F) - 1.5277224e-003, (F) - 1.5371854e-003, (F) - 1.5466604e-003, (F) - 1.5561103e-003, (F) - 1.5655040e-003, + (F) - 1.5748552e-003, (F) - 1.5842315e-003, (F) - 1.5937465e-003, (F) - 1.6029720e-003, (F) - 1.6123861e-003, + (F) - 1.6216776e-003, (F) - 1.6310319e-003, (F) - 1.6403094e-003, (F) - 1.6495786e-003, (F) - 1.6588508e-003, + (F) - 1.6680951e-003, (F) - 1.6773067e-003, (F) - 1.6864862e-003, (F) - 1.6956610e-003, (F) - 1.7048193e-003, + (F) - 1.7139612e-003, (F) - 1.7230717e-003, (F) - 1.7321649e-003, (F) - 1.7412365e-003, (F) - 1.7502915e-003, + (F) - 1.7593161e-003, (F) - 1.7683126e-003, (F) - 1.7772766e-003, (F) - 1.7862164e-003, (F) - 1.7951289e-003, + (F) - 1.8040225e-003, (F) - 1.8128956e-003, (F) - 1.8217521e-003, (F) - 1.8305658e-003, (F) - 1.8393318e-003, + (F) - 1.8480455e-003, (F) - 1.8567739e-003, (F) - 1.8654993e-003, (F) - 1.8742251e-003, (F) - 1.8827205e-003, + (F) - 1.8914187e-003, (F) - 1.8999453e-003, (F) - 1.9085111e-003, (F) - 1.9169830e-003, (F) - 1.9254474e-003, + (F) - 1.9339013e-003, (F) - 1.9422783e-003, (F) - 1.9506295e-003, (F) - 1.9589431e-003, (F) - 1.9672506e-003, + (F) - 1.9755049e-003, (F) - 1.9837264e-003, (F) - 1.9918954e-003, (F) - 2.0000433e-003, (F) - 2.0081449e-003, + (F) - 2.0162141e-003, (F) - 2.0242280e-003, (F) - 2.0322084e-003, (F) - 2.0401417e-003, (F) - 2.0480469e-003, + (F) - 2.0559056e-003, (F) - 2.0637353e-003, (F) - 2.0715137e-003, (F) - 2.0792531e-003, (F) - 2.0869231e-003, + (F) - 2.0945604e-003, (F) - 2.1021565e-003, (F) - 2.1097586e-003, (F) - 2.1172812e-003, (F) - 2.1247500e-003, + (F) - 2.1320815e-003, (F) - 2.1395760e-003, (F) - 2.1468415e-003, (F) - 2.1541473e-003, (F) - 2.1613533e-003, + (F) - 2.1685494e-003, (F) - 2.1757036e-003, (F) - 2.1827534e-003, (F) - 2.1898035e-003, (F) - 2.1967961e-003, + (F) - 2.2037585e-003, (F) - 2.2106328e-003, (F) - 2.2174712e-003, (F) - 2.2242476e-003, (F) - 2.2309941e-003, + (F) - 2.2376696e-003, (F) - 2.2443002e-003, (F) - 2.2508627e-003, (F) - 2.2573883e-003, (F) - 2.2638523e-003, + (F) - 2.2702762e-003, (F) - 2.2766333e-003, (F) - 2.2829462e-003, (F) - 2.2891862e-003, (F) - 2.2953787e-003, + (F) - 2.3015001e-003, (F) - 2.3075962e-003, (F) - 2.3136302e-003, (F) - 2.3196255e-003, (F) - 2.3255025e-003, + (F) - 2.3313432e-003, (F) - 2.3371056e-003, (F) - 2.3429385e-003, (F) - 2.3485211e-003, (F) - 2.3541678e-003, + (F) - 2.3597041e-003, (F) - 2.3652138e-003, (F) - 2.3706526e-003, (F) - 2.3759854e-003, (F) - 2.3813401e-003, + (F) - 2.3865859e-003, (F) - 2.3917824e-003, (F) - 2.3968782e-003, (F) - 2.4019512e-003, (F) - 2.4069457e-003, + (F) - 2.4118957e-003, (F) - 2.4167526e-003, (F) - 2.4215631e-003, (F) - 2.4262966e-003, (F) - 2.4309880e-003, + (F) - 2.4355990e-003, (F) - 2.4401590e-003, (F) - 2.4446355e-003, (F) - 2.4490606e-003, (F) - 2.4534014e-003, + (F) - 2.4576959e-003, (F) - 2.4619128e-003, (F) - 2.4660912e-003, (F) - 2.4701730e-003, (F) - 2.4741950e-003, + (F) - 2.4781081e-003, (F) - 2.4820112e-003, (F) - 2.4858283e-003, (F) - 2.4896281e-003, (F) - 2.4932110e-003, + (F) - 2.4968799e-003, (F) - 2.5004058e-003, (F) - 2.5038901e-003, (F) - 2.5072888e-003, (F) - 2.5105972e-003, + (F) - 2.5139194e-003, (F) - 2.5170758e-003, (F) - 2.5201976e-003, (F) - 2.5232275e-003, (F) - 2.5262357e-003, + (F) - 2.5291376e-003, (F) - 2.5319814e-003, (F) - 2.5347278e-003, (F) - 2.5374318e-003, (F) - 2.5400513e-003, + (F) - 2.5426174e-003, (F) - 2.5450901e-003, (F) - 2.5475049e-003, (F) - 2.5498302e-003, (F) - 2.5521002e-003, + (F) - 2.5542824e-003, (F) - 2.5564137e-003, (F) - 2.5584559e-003, (F) - 2.5604403e-003, (F) - 2.5623171e-003, + (F) - 2.5641411e-003, (F) - 2.5658766e-003, (F) - 2.5675914e-003, (F) - 2.5691867e-003, (F) - 2.5707272e-003, + (F) - 2.5721182e-003, (F) - 2.5735785e-003, (F) - 2.5748584e-003, (F) - 2.5760978e-003, (F) - 2.5772547e-003, + (F) - 2.5783297e-003, (F) - 2.5793907e-003, (F) - 2.5802554e-003, (F) - 2.5811389e-003, (F) - 2.5819204e-003, + (F) - 2.5826616e-003, (F) - 2.5832717e-003, (F) - 2.5838350e-003, (F) - 2.5843078e-003, (F) - 2.5847406e-003, + (F) - 2.5850741e-003, (F) - 2.5853470e-003, (F) - 2.5855214e-003, (F) - 2.5856405e-003, (F) 9.9741433e-001, + (F) - 2.5856405e-003, (F) - 2.5855214e-003, (F) - 2.5853470e-003, (F) - 2.5850741e-003, (F) - 2.5847406e-003, + (F) - 2.5843078e-003, (F) - 2.5838350e-003, (F) - 2.5832717e-003, (F) - 2.5826616e-003, (F) - 2.5819204e-003, + (F) - 2.5811389e-003, (F) - 2.5802554e-003, (F) - 2.5793907e-003, (F) - 2.5783297e-003, (F) - 2.5772547e-003, + (F) - 2.5760978e-003, (F) - 2.5748584e-003, (F) - 2.5735785e-003, (F) - 2.5721182e-003, (F) - 2.5707272e-003, + (F) - 2.5691867e-003, (F) - 2.5675914e-003, (F) - 2.5658766e-003, (F) - 2.5641411e-003, (F) - 2.5623171e-003, + (F) - 2.5604403e-003, (F) - 2.5584559e-003, (F) - 2.5564137e-003, (F) - 2.5542824e-003, (F) - 2.5521002e-003, + (F) - 2.5498302e-003, (F) - 2.5475049e-003, (F) - 2.5450901e-003, (F) - 2.5426174e-003, (F) - 2.5400513e-003, + (F) - 2.5374318e-003, (F) - 2.5347278e-003, (F) - 2.5319814e-003, (F) - 2.5291376e-003, (F) - 2.5262357e-003, + (F) - 2.5232275e-003, (F) - 2.5201976e-003, (F) - 2.5170758e-003, (F) - 2.5139194e-003, (F) - 2.5105972e-003, + (F) - 2.5072888e-003, (F) - 2.5038901e-003, (F) - 2.5004058e-003, (F) - 2.4968799e-003, (F) - 2.4932110e-003, + (F) - 2.4896281e-003, (F) - 2.4858283e-003, (F) - 2.4820112e-003, (F) - 2.4781081e-003, (F) - 2.4741950e-003, + (F) - 2.4701730e-003, (F) - 2.4660912e-003, (F) - 2.4619128e-003, (F) - 2.4576959e-003, (F) - 2.4534014e-003, + (F) - 2.4490606e-003, (F) - 2.4446355e-003, (F) - 2.4401590e-003, (F) - 2.4355990e-003, (F) - 2.4309880e-003, + (F) - 2.4262966e-003, (F) - 2.4215631e-003, (F) - 2.4167526e-003, (F) - 2.4118957e-003, (F) - 2.4069457e-003, + (F) - 2.4019512e-003, (F) - 2.3968782e-003, (F) - 2.3917824e-003, (F) - 2.3865859e-003, (F) - 2.3813401e-003, + (F) - 2.3759854e-003, (F) - 2.3706526e-003, (F) - 2.3652138e-003, (F) - 2.3597041e-003, (F) - 2.3541678e-003, + (F) - 2.3485211e-003, (F) - 2.3429385e-003, (F) - 2.3371056e-003, (F) - 2.3313432e-003, (F) - 2.3255025e-003, + (F) - 2.3196255e-003, (F) - 2.3136302e-003, (F) - 2.3075962e-003, (F) - 2.3015001e-003, (F) - 2.2953787e-003, + (F) - 2.2891862e-003, (F) - 2.2829462e-003, (F) - 2.2766333e-003, (F) - 2.2702762e-003, (F) - 2.2638523e-003, + (F) - 2.2573883e-003, (F) - 2.2508627e-003, (F) - 2.2443002e-003, (F) - 2.2376696e-003, (F) - 2.2309941e-003, + (F) - 2.2242476e-003, (F) - 2.2174712e-003, (F) - 2.2106328e-003, (F) - 2.2037585e-003, (F) - 2.1967961e-003, + (F) - 2.1898035e-003, (F) - 2.1827534e-003, (F) - 2.1757036e-003, (F) - 2.1685494e-003, (F) - 2.1613533e-003, + (F) - 2.1541473e-003, (F) - 2.1468415e-003, (F) - 2.1395760e-003, (F) - 2.1320815e-003, (F) - 2.1247500e-003, + (F) - 2.1172812e-003, (F) - 2.1097586e-003, (F) - 2.1021565e-003, (F) - 2.0945604e-003, (F) - 2.0869231e-003, + (F) - 2.0792531e-003, (F) - 2.0715137e-003, (F) - 2.0637353e-003, (F) - 2.0559056e-003, (F) - 2.0480469e-003, + (F) - 2.0401417e-003, (F) - 2.0322084e-003, (F) - 2.0242280e-003, (F) - 2.0162141e-003, (F) - 2.0081449e-003, + (F) - 2.0000433e-003, (F) - 1.9918954e-003, (F) - 1.9837264e-003, (F) - 1.9755049e-003, (F) - 1.9672506e-003, + (F) - 1.9589431e-003, (F) - 1.9506295e-003, (F) - 1.9422783e-003, (F) - 1.9339013e-003, (F) - 1.9254474e-003, + (F) - 1.9169830e-003, (F) - 1.9085111e-003, (F) - 1.8999453e-003, (F) - 1.8914187e-003, (F) - 1.8827205e-003, + (F) - 1.8742251e-003, (F) - 1.8654993e-003, (F) - 1.8567739e-003, (F) - 1.8480455e-003, (F) - 1.8393318e-003, + (F) - 1.8305658e-003, (F) - 1.8217521e-003, (F) - 1.8128956e-003, (F) - 1.8040225e-003, (F) - 1.7951289e-003, + (F) - 1.7862164e-003, (F) - 1.7772766e-003, (F) - 1.7683126e-003, (F) - 1.7593161e-003, (F) - 1.7502915e-003, + (F) - 1.7412365e-003, (F) - 1.7321649e-003, (F) - 1.7230717e-003, (F) - 1.7139612e-003, (F) - 1.7048193e-003, + (F) - 1.6956610e-003, (F) - 1.6864862e-003, (F) - 1.6773067e-003, (F) - 1.6680951e-003, (F) - 1.6588508e-003, + (F) - 1.6495786e-003, (F) - 1.6403094e-003, (F) - 1.6310319e-003, (F) - 1.6216776e-003, (F) - 1.6123861e-003, + (F) - 1.6029720e-003, (F) - 1.5937465e-003, (F) - 1.5842315e-003, (F) - 1.5748552e-003, (F) - 1.5655040e-003, + (F) - 1.5561103e-003, (F) - 1.5466604e-003, (F) - 1.5371854e-003, (F) - 1.5277224e-003, (F) - 1.5182618e-003, + (F) - 1.5087988e-003, (F) - 1.4993153e-003, (F) - 1.4898201e-003, (F) - 1.4803050e-003, (F) - 1.4707800e-003, + (F) - 1.4612428e-003, (F) - 1.4517067e-003, (F) - 1.4421680e-003, (F) - 1.4326278e-003, (F) - 1.4230765e-003, + (F) - 1.4135209e-003, (F) - 1.4039627e-003, (F) - 1.3944071e-003, (F) - 1.3848374e-003, (F) - 1.3752525e-003, + (F) - 1.3656533e-003, (F) - 1.3560717e-003, (F) - 1.3464878e-003, (F) - 1.3369056e-003, (F) - 1.3272775e-003, + (F) - 1.3177360e-003, (F) - 1.3080936e-003, (F) - 1.2986084e-003, (F) - 1.2888500e-003, (F) - 1.2793765e-003, + (F) - 1.2698414e-003, (F) - 1.2602023e-003, (F) - 1.2505846e-003, (F) - 1.2409915e-003, (F) - 1.2314513e-003, + (F) - 1.2218939e-003, (F) - 1.2123405e-003, (F) - 1.2027641e-003, (F) - 1.1932042e-003, (F) - 1.1836376e-003, + (F) - 1.1740960e-003, (F) - 1.1645586e-003, (F) - 1.1550493e-003, (F) - 1.1455390e-003, (F) - 1.1360444e-003, + (F) - 1.1265441e-003, (F) - 1.1170647e-003, (F) - 1.1075850e-003, (F) - 1.0981218e-003, (F) - 1.0886461e-003, + (F) - 1.0791931e-003, (F) - 1.0697472e-003, (F) - 1.0603454e-003, (F) - 1.0509287e-003, (F) - 1.0415421e-003, + (F) - 1.0321370e-003, (F) - 1.0228270e-003, (F) - 1.0134207e-003, (F) - 1.0041623e-003, (F) - 9.9469419e-004, + (F) - 9.8558142e-004, (F) - 9.7624213e-004, (F) - 9.6685278e-004, (F) - 9.5763434e-004, (F) - 9.4842600e-004, + (F) - 9.3925877e-004, (F) - 9.3003378e-004, (F) - 9.2084585e-004, (F) - 9.1165217e-004, (F) - 9.0252009e-004, + (F) - 8.9339327e-004, (F) - 8.8432225e-004, (F) - 8.7525413e-004, (F) - 8.6622788e-004, (F) - 8.5719302e-004, + (F) - 8.4819452e-004, (F) - 8.3919545e-004, (F) - 8.3024166e-004, (F) - 8.2128725e-004, (F) - 8.1237496e-004, + (F) - 8.0346439e-004, (F) - 7.9461592e-004, (F) - 7.8577593e-004, (F) - 7.7699171e-004, (F) - 7.6818552e-004, + (F) - 7.5944753e-004, (F) - 7.5069691e-004, (F) - 7.4204112e-004, (F) - 7.3329577e-004, (F) - 7.2471488e-004, + (F) - 7.1597837e-004, (F) - 7.0758003e-004, (F) - 6.9882694e-004, (F) - 6.9023175e-004, (F) - 6.8188705e-004, + (F) - 6.7340132e-004, (F) - 6.6495597e-004, (F) - 6.5645951e-004, (F) - 6.4808079e-004, (F) - 6.3971196e-004, + (F) - 6.3143448e-004, (F) - 6.2314811e-004, (F) - 6.1492812e-004, (F) - 6.0669333e-004, (F) - 5.9851277e-004, + (F) - 5.9032342e-004, (F) - 5.8219998e-004, (F) - 5.7408320e-004, (F) - 5.6603542e-004, (F) - 5.5799069e-004, + (F) - 5.5001749e-004, (F) - 5.4205412e-004, (F) - 5.3417018e-004, (F) - 5.2627883e-004, (F) - 5.1845390e-004, + (F) - 5.1061081e-004, (F) - 5.0286502e-004, (F) - 4.9509526e-004, (F) - 4.8742511e-004, (F) - 4.7968369e-004, + (F) - 4.7212529e-004, (F) - 4.6443246e-004, (F) - 4.5702829e-004, (F) - 4.4925726e-004, (F) - 4.4189166e-004, + (F) - 4.3464576e-004, (F) - 4.2705956e-004, (F) - 4.1967673e-004, (F) - 4.1228858e-004, (F) - 4.0508935e-004, + (F) - 3.9784824e-004, (F) - 3.9070041e-004, (F) - 3.8350434e-004, (F) - 3.7639420e-004, (F) - 3.6925666e-004, + (F) - 3.6221220e-004, (F) - 3.5516575e-004, (F) - 3.4822305e-004, (F) - 3.4128144e-004, (F) - 3.3443304e-004, + (F) - 3.2758021e-004, (F) - 3.2082305e-004, (F) - 3.1405879e-004, (F) - 3.0738263e-004, (F) - 3.0067960e-004, + (F) - 2.9407149e-004, (F) - 2.8744468e-004, (F) - 2.8093774e-004, (F) - 2.7438622e-004, (F) - 2.6796135e-004, + (F) - 2.6147595e-004, (F) - 2.5518652e-004, (F) - 2.4875579e-004, (F) - 2.4259571e-004, (F) - 2.3612941e-004, + (F) - 2.3020843e-004, (F) - 2.2408600e-004, (F) - 2.1762031e-004, (F) - 2.1170656e-004, (F) - 2.0570182e-004, + (F) - 1.9986051e-004, (F) - 1.9387145e-004, (F) - 1.8799894e-004, (F) - 1.8206851e-004, (F) - 1.7627586e-004, + (F) - 1.7046432e-004, (F) - 1.6479026e-004, (F) - 1.5911076e-004, (F) - 1.5355011e-004, (F) - 1.4796949e-004, + (F) - 1.4249159e-004, (F) - 1.3699375e-004, (F) - 1.3159904e-004, (F) - 1.2617687e-004, (F) - 1.2085379e-004, + (F) - 1.1550253e-004, (F) - 1.1027447e-004, (F) - 1.0502188e-004, (F) - 9.9898650e-005, (F) - 9.4721351e-005, + (F) - 8.9698178e-005, (F) - 8.4612320e-005, (F) - 7.9718290e-005, (F) - 7.4678495e-005, (F) - 6.9912852e-005, + (F) - 6.4897114e-005, (F) - 6.0403894e-005, (F) - 5.5414477e-005, (F) - 5.0403230e-005, (F) - 4.6245143e-005, + (F) - 4.1543856e-005, (F) - 3.7020060e-005, (F) - 3.2298035e-005, (F) - 2.7830625e-005, (F) - 2.3307139e-005, + (F) - 1.8994868e-005, (F) - 1.4631174e-005, (F) - 1.0433728e-005, (F) - 6.1754788e-006, (F) - 2.0462664e-006, + (F) 2.1468476e-006, (F) 6.2116278e-006, (F) 1.0327219e-005, (F) 1.4312671e-005, (F) 1.8349478e-005, + (F) 2.2246019e-005, (F) 2.6183621e-005, (F) 2.9964364e-005, (F) 3.3802916e-005, (F) 3.7486700e-005, + (F) 4.1246975e-005, (F) 4.4819152e-005, (F) 4.8492626e-005, (F) 5.1960346e-005, (F) 5.5592602e-005, + (F) 5.8926380e-005, (F) 6.2520637e-005, (F) 6.5655639e-005, (F) 6.9400379e-005, (F) 7.2644410e-005, + (F) 7.5176800e-005, (F) 7.8972973e-005, (F) 8.2145791e-005, (F) 8.5454155e-005, (F) 8.8349417e-005, + (F) 9.1380999e-005, (F) 9.4193407e-005, (F) 9.7143301e-005, (F) 9.9931180e-005, (F) 1.0283674e-004, + (F) 1.0559403e-004, (F) 1.0843159e-004, (F) 1.1110845e-004, (F) 1.1384795e-004, (F) 1.1642978e-004, + (F) 1.1906901e-004, (F) 1.2154154e-004, (F) 1.2407353e-004, (F) 1.2644454e-004, (F) 1.2890182e-004, + (F) 1.3119183e-004, (F) 1.3357737e-004, (F) 1.3577053e-004, (F) 1.3809993e-004, (F) 1.4021375e-004, + (F) 1.4250292e-004, (F) 1.4449103e-004, (F) 1.4676216e-004, (F) 1.4860587e-004, (F) 1.5099189e-004, + (F) 1.5251907e-004, (F) 1.5400320e-004, (F) 1.5725670e-004, (F) 1.5856474e-004, (F) 1.6035465e-004, + (F) 1.6172121e-004, (F) 1.6351953e-004, (F) 1.6506208e-004, (F) 1.6686975e-004, (F) 1.6842980e-004, + (F) 1.7016635e-004, (F) 1.7165185e-004, (F) 1.7326225e-004, (F) 1.7463511e-004, (F) 1.7613174e-004, + (F) 1.7740887e-004, (F) 1.7881024e-004, (F) 1.8000008e-004, (F) 1.8133430e-004, (F) 1.8246886e-004, + (F) 1.8376430e-004, (F) 1.8483886e-004, (F) 1.8608695e-004, (F) 1.8709650e-004, (F) 1.8831959e-004, + (F) 1.8925727e-004, (F) 1.9044159e-004, (F) 1.9126723e-004, (F) 1.9244888e-004, (F) 1.9312581e-004, + (F) 1.9434052e-004, (F) 1.9460314e-004, (F) 1.9574339e-004, (F) 1.9821206e-004, (F) 1.9670052e-004, + (F) 1.9764812e-004, (F) 1.9811086e-004, (F) 1.9922601e-004, (F) 1.9983291e-004, (F) 2.0072227e-004, + (F) 2.0119510e-004, (F) 2.0186213e-004, (F) 2.0218689e-004, (F) 2.0268931e-004, (F) 2.0292316e-004, + (F) 2.0334171e-004, (F) 2.0352446e-004, (F) 2.0389248e-004, (F) 2.0404606e-004, (F) 2.0439794e-004, + (F) 2.0453189e-004, (F) 2.0486118e-004, (F) 2.0494755e-004, (F) 2.0524898e-004, (F) 2.0528478e-004, + (F) 2.0556260e-004, (F) 2.0551182e-004, (F) 2.0575204e-004, (F) 2.0559447e-004, (F) 2.0583582e-004, + (F) 2.0551705e-004, (F) 2.0580818e-004, (F) 2.0522994e-004, (F) 2.0606828e-004, (F) 2.0668075e-004, + (F) 2.0117747e-004, (F) 2.0447446e-004, (F) 2.0443830e-004, (F) 2.0505697e-004, (F) 2.0439317e-004, + (F) 2.0429009e-004, (F) 2.0343574e-004, (F) 2.0309827e-004, (F) 2.0221283e-004, (F) 2.0182655e-004, + (F) 2.0098888e-004, (F) 2.0062041e-004, (F) 1.9982454e-004, (F) 1.9948456e-004, (F) 1.9872274e-004, + (F) 1.9840997e-004, (F) 1.9764305e-004, (F) 1.9732846e-004, (F) 1.9652536e-004, (F) 1.9621245e-004, + (F) 1.9535326e-004, (F) 1.9502938e-004, (F) 1.9407034e-004, (F) 1.9374881e-004, (F) 1.9267245e-004, + (F) 1.9238679e-004, (F) 1.9111524e-004, (F) 1.9094255e-004, (F) 1.8933708e-004, (F) 1.8950640e-004, + (F) 1.8640971e-004, (F) 1.7591939e-004, (F) 1.9648117e-004, (F) 1.9002553e-004, (F) 1.8826921e-004, + (F) 1.8500691e-004, (F) 1.8364291e-004, (F) 1.8138467e-004, (F) 1.8031784e-004, (F) 1.7859148e-004, + (F) 1.7773870e-004, (F) 1.7633494e-004, (F) 1.7560111e-004, (F) 1.7438288e-004, (F) 1.7371570e-004, + (F) 1.7260586e-004, (F) 1.7195115e-004, (F) 1.7087787e-004, (F) 1.7020317e-004, (F) 1.6914017e-004, + (F) 1.6843147e-004, (F) 1.6734333e-004, (F) 1.6657230e-004, (F) 1.6544194e-004, (F) 1.6461419e-004, + (F) 1.6343643e-004, (F) 1.6253497e-004, (F) 1.6129533e-004, (F) 1.6033147e-004, (F) 1.5903747e-004, + (F) 1.5798547e-004, (F) 1.5663328e-004, (F) 1.5551665e-004, (F) 9.2342753e-003 + }; + *lenh0 = HP50_32K_LEN; /* store 'number of coefficients' */ + *h0 = hp50_32khz_coeff; /* store pointer to []-array */ +} + +#undef HP50_32K_LEN +/* ...................... End of fill_bp14k_32khz() ..................... */ + + +/* + ============================================================================ + + SCD_FIR hp50_32khz_init (void); + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + Description: + ~~~~~~~~~~~~ + + Initialization routine for a band-pass filter which limits the + bandwidth of the input signal from 50 Hz to 14000 Hz (3 dB points). + No rate change is implemented. + + Parameters: none. + ~~~~~~~~~~~ + + Return value: + ~~~~~~~~~~~~~ + Returns a pointer to struct SCD_FIR; + + History: + ~~~~~~~~ + 05.April.2012 v1.0 - Added filters: HP50_32KHZ, HP50_48KHZ (France Telecom) + + ============================================================================ +*/ +SCD_FIR *hp50_32khz_init () { + float *h0; /* pointer to array with FIR coeff. */ + long lenh0; /* number of FIR coefficients */ + + + /* allocate array for FIR coeff. and fill with coefficients */ + fill_hp50_32khz (&h0, &lenh0); + + return fir_initialization ( /* Returns: pointer to SCD_FIR-struct */ + lenh0, /* In: number of FIR-coefficients */ + h0, /* In: pointer to array with FIR-cof. */ + 1.0, /* In: gain factor for FIR-coeffic. */ + 1l, /* In: Down-sampling factor */ + 'D' /* In: switch to down-sampling proc. */ + ); /* (works here as simple FIR-fil. */ +} + +/* .................... End of hp50_32khz_init() .................... */ + + + +/* + ============================================================================ + + void fill_hp50_48khz (float **h0, long *lenh0); + ~~~~~~~~~~~~~~~~~~~~~ + + Description: + ~~~~~~~~~~~~ + Fill filter coefficients for 50 Hz (3dB point) highpass filtering for samples at 48 kHz. + firpm(1678,[0 2.5/24000 66/24000 1],[0.000 0.00 1 1 ],[60 1]); + Same lengt, HP response and passband oscillation (+-0.15dB) as the 14KBP filter or HP50@32kHz + + Parameters: + ~~~~~~~~~~~ + h0: (Out) pointer to array with FIR coefficients + lenh0: (Out) pointer to number of coefficients + + Return value: + ~~~~~~~~~~~~~ + None. + + History: + ~~~~~~~~ + 05.April.2012 v1.0 - Added filters: HP50_32KHZ, HP50_48KHZ (France Telecom) + + ============================================================================ +*/ +#undef HP50_48K_LEN +#define HP50_48K_LEN 1679 +void fill_hp50_48khz (float **h0, long *lenh0) { + static float hp50_48khz_coeff[HP50_48K_LEN] = { + (F) 9.2170161e-003, (F) 1.0282141e-004, (F) 1.0323477e-004, (F) 1.0392614e-004, (F) 1.0431790e-004, + (F) 1.0499377e-004, (F) 1.0536773e-004, (F) 1.0603588e-004, (F) 1.0638882e-004, (F) 1.0705021e-004, + (F) 1.0739106e-004, (F) 1.0805611e-004, (F) 1.0837965e-004, (F) 1.0905795e-004, (F) 1.0938090e-004, + (F) 1.1007974e-004, (F) 1.1040957e-004, (F) 1.1115190e-004, (F) 1.1149459e-004, (F) 1.1229782e-004, + (F) 1.1266869e-004, (F) 1.1356565e-004, (F) 1.1396913e-004, (F) 1.1501372e-004, (F) 1.1546739e-004, + (F) 1.1671837e-004, (F) 1.1723162e-004, (F) 1.1881924e-004, (F) 1.1938009e-004, (F) 1.2160186e-004, + (F) 1.2211069e-004, (F) 1.2681189e-004, (F) 1.0603987e-004, (F) 1.1739216e-004, (F) 1.2019571e-004, + (F) 1.1960227e-004, (F) 1.2084617e-004, (F) 1.2064739e-004, (F) 1.2156945e-004, (F) 1.2152965e-004, + (F) 1.2231705e-004, (F) 1.2236911e-004, (F) 1.2308341e-004, (F) 1.2319054e-004, (F) 1.2387359e-004, + (F) 1.2402521e-004, (F) 1.2468629e-004, (F) 1.2487613e-004, (F) 1.2553014e-004, (F) 1.2574208e-004, + (F) 1.2639667e-004, (F) 1.2662486e-004, (F) 1.2727834e-004, (F) 1.2749849e-004, (F) 1.2815380e-004, + (F) 1.2832364e-004, (F) 1.2895095e-004, (F) 1.2901611e-004, (F) 1.2957883e-004, (F) 1.2941200e-004, + (F) 1.2984364e-004, (F) 1.2918213e-004, (F) 1.2939196e-004, (F) 1.2692712e-004, (F) 1.3285917e-004, + (F) 1.3188746e-004, (F) 1.3108290e-004, (F) 1.3185337e-004, (F) 1.3174954e-004, (F) 1.3230559e-004, + (F) 1.3234605e-004, (F) 1.3281968e-004, (F) 1.3292077e-004, (F) 1.3334594e-004, (F) 1.3347954e-004, + (F) 1.3388084e-004, (F) 1.3402423e-004, (F) 1.3439884e-004, (F) 1.3454719e-004, (F) 1.3489334e-004, + (F) 1.3502831e-004, (F) 1.3534817e-004, (F) 1.3545658e-004, (F) 1.3573672e-004, (F) 1.3580183e-004, + (F) 1.3604220e-004, (F) 1.3603623e-004, (F) 1.3623973e-004, (F) 1.3616781e-004, (F) 1.3635135e-004, + (F) 1.3622245e-004, (F) 1.3647364e-004, (F) 1.3635685e-004, (F) 1.3690649e-004, (F) 1.3696791e-004, + (F) 1.3896829e-004, (F) 1.3697478e-004, (F) 1.3692105e-004, (F) 1.3768980e-004, (F) 1.3743527e-004, + (F) 1.3778116e-004, (F) 1.3765261e-004, (F) 1.3789559e-004, (F) 1.3780411e-004, (F) 1.3798877e-004, + (F) 1.3791032e-004, (F) 1.3805069e-004, (F) 1.3795926e-004, (F) 1.3806087e-004, (F) 1.3795585e-004, + (F) 1.3801376e-004, (F) 1.3788717e-004, (F) 1.3790990e-004, (F) 1.3775349e-004, (F) 1.3774242e-004, + (F) 1.3756412e-004, (F) 1.3753506e-004, (F) 1.3733693e-004, (F) 1.3732519e-004, (F) 1.3713014e-004, + (F) 1.3715429e-004, (F) 1.3698332e-004, (F) 1.3708216e-004, (F) 1.3691530e-004, (F) 1.3707353e-004, + (F) 1.3676131e-004, (F) 1.3683967e-004, (F) 1.3537370e-004, (F) 1.3597876e-004, (F) 1.3620588e-004, + (F) 1.3557968e-004, (F) 1.3560751e-004, (F) 1.3522156e-004, (F) 1.3513030e-004, (F) 1.3477709e-004, + (F) 1.3462320e-004, (F) 1.3427186e-004, (F) 1.3406692e-004, (F) 1.3370193e-004, (F) 1.3346421e-004, + (F) 1.3308486e-004, (F) 1.3281213e-004, (F) 1.3242329e-004, (F) 1.3212756e-004, (F) 1.3172649e-004, + (F) 1.3142101e-004, (F) 1.3102020e-004, (F) 1.3071229e-004, (F) 1.3031017e-004, (F) 1.3001517e-004, + (F) 1.2959499e-004, (F) 1.2929298e-004, (F) 1.2883966e-004, (F) 1.2850208e-004, (F) 1.2795178e-004, + (F) 1.2754364e-004, (F) 1.2684799e-004, (F) 1.2641365e-004, (F) 1.2561428e-004, (F) 1.2595624e-004, + (F) 1.2528676e-004, (F) 1.2434765e-004, (F) 1.2412368e-004, (F) 1.2341104e-004, (F) 1.2298547e-004, + (F) 1.2231406e-004, (F) 1.2182429e-004, (F) 1.2115661e-004, (F) 1.2062332e-004, (F) 1.1995423e-004, + (F) 1.1939587e-004, (F) 1.1871658e-004, (F) 1.1813439e-004, (F) 1.1745353e-004, (F) 1.1685124e-004, + (F) 1.1616264e-004, (F) 1.1554840e-004, (F) 1.1484676e-004, (F) 1.1420856e-004, (F) 1.1348183e-004, + (F) 1.1281518e-004, (F) 1.1203418e-004, (F) 1.1133137e-004, (F) 1.1049916e-004, (F) 1.0975257e-004, + (F) 1.0887415e-004, (F) 1.0813498e-004, (F) 1.0726099e-004, (F) 1.0661111e-004, (F) 1.0578194e-004, + (F) 1.0529542e-004, (F) 1.0396291e-004, (F) 1.0299308e-004, (F) 1.0247409e-004, (F) 1.0137922e-004, + (F) 1.0060085e-004, (F) 9.9604074e-005, (F) 9.8760420e-005, (F) 9.7773259e-005, (F) 9.6892188e-005, + (F) 9.5905360e-005, (F) 9.4993975e-005, (F) 9.3992439e-005, (F) 9.3056320e-005, (F) 9.2042727e-005, + (F) 9.1073535e-005, (F) 9.0039349e-005, (F) 8.9038684e-005, (F) 8.7969516e-005, (F) 8.6929477e-005, + (F) 8.5825876e-005, (F) 8.4750138e-005, (F) 8.3606584e-005, (F) 8.2519454e-005, (F) 8.1353458e-005, + (F) 8.0258949e-005, (F) 7.9094451e-005, (F) 7.8017131e-005, (F) 7.6835554e-005, (F) 7.5741110e-005, + (F) 7.4464448e-005, (F) 7.3269051e-005, (F) 7.1728435e-005, (F) 7.0709936e-005, (F) 6.9687722e-005, + (F) 6.8148646e-005, (F) 6.7027725e-005, (F) 6.5663462e-005, (F) 6.4441171e-005, (F) 6.3085250e-005, + (F) 6.1818800e-005, (F) 6.0452242e-005, (F) 5.9143854e-005, (F) 5.7756282e-005, (F) 5.6415612e-005, + (F) 5.5001511e-005, (F) 5.3618819e-005, (F) 5.2178565e-005, (F) 5.0758389e-005, (F) 4.9285680e-005, + (F) 4.7838012e-005, (F) 4.6344615e-005, (F) 4.4875639e-005, (F) 4.3364404e-005, (F) 4.1892374e-005, + (F) 4.0354202e-005, (F) 3.8864361e-005, (F) 3.7301364e-005, (F) 3.5770376e-005, (F) 3.4140016e-005, + (F) 3.2553422e-005, (F) 3.0858734e-005, (F) 2.9262279e-005, (F) 2.7585354e-005, (F) 2.6196851e-005, + (F) 2.4508556e-005, (F) 2.2595147e-005, (F) 2.1125524e-005, (F) 1.9336697e-005, (F) 1.7687295e-005, + (F) 1.5919286e-005, (F) 1.4217836e-005, (F) 1.2432060e-005, (F) 1.0686745e-005, (F) 8.8806737e-006, + (F) 7.1001852e-006, (F) 5.2646709e-006, (F) 3.4494433e-006, (F) 1.5949437e-006, (F) - 2.5040016e-007, + (F) - 2.1249647e-006, (F) - 3.9880938e-006, (F) - 5.8828077e-006, (F) - 7.7707834e-006, (F) - 9.6904874e-006, + (F) - 1.1604256e-005, (F) - 1.3572472e-005, (F) - 1.5517481e-005, (F) - 1.7525599e-005, (F) - 1.9516113e-005, + (F) - 2.1556262e-005, (F) - 2.3549789e-005, (F) - 2.5587191e-005, (F) - 2.7557313e-005, (F) - 2.9593067e-005, + (F) - 3.1583770e-005, (F) - 3.3828247e-005, (F) - 3.6003270e-005, (F) - 3.7882528e-005, (F) - 4.0157616e-005, + (F) - 4.2238257e-005, (F) - 4.4435158e-005, (F) - 4.6576406e-005, (F) - 4.8788370e-005, (F) - 5.0966866e-005, + (F) - 5.3195433e-005, (F) - 5.5407648e-005, (F) - 5.7659653e-005, (F) - 5.9896191e-005, (F) - 6.2164814e-005, + (F) - 6.4430870e-005, (F) - 6.6719855e-005, (F) - 6.9012344e-005, (F) - 7.1334393e-005, (F) - 7.3660509e-005, + (F) - 7.6014789e-005, (F) - 7.8374135e-005, (F) - 8.0767477e-005, (F) - 8.3140519e-005, (F) - 8.5558944e-005, + (F) - 8.7951462e-005, (F) - 9.0371180e-005, (F) - 9.2768583e-005, (F) - 9.5215819e-005, (F) - 9.7654715e-005, + (F) - 1.0017071e-004, (F) - 1.0268888e-004, (F) - 1.0528563e-004, (F) - 1.0773097e-004, (F) - 1.1012977e-004, + (F) - 1.1287369e-004, (F) - 1.1534129e-004, (F) - 1.1795237e-004, (F) - 1.2051726e-004, (F) - 1.2313545e-004, + (F) - 1.2573245e-004, (F) - 1.2836778e-004, (F) - 1.3099695e-004, (F) - 1.3365159e-004, (F) - 1.3630467e-004, + (F) - 1.3898420e-004, (F) - 1.4167133e-004, (F) - 1.4437565e-004, (F) - 1.4709544e-004, (F) - 1.4983227e-004, + (F) - 1.5257694e-004, (F) - 1.5533702e-004, (F) - 1.5810382e-004, (F) - 1.6088469e-004, (F) - 1.6365806e-004, + (F) - 1.6646857e-004, (F) - 1.6926417e-004, (F) - 1.7209519e-004, (F) - 1.7493698e-004, (F) - 1.7782269e-004, + (F) - 1.8070933e-004, (F) - 1.8362809e-004, (F) - 1.8652433e-004, (F) - 1.8942093e-004, (F) - 1.9226519e-004, + (F) - 1.9520475e-004, (F) - 1.9831231e-004, (F) - 2.0112323e-004, (F) - 2.0414964e-004, (F) - 2.0711506e-004, + (F) - 2.1012138e-004, (F) - 2.1311883e-004, (F) - 2.1614560e-004, (F) - 2.1917324e-004, (F) - 2.2221937e-004, + (F) - 2.2527550e-004, (F) - 2.2835091e-004, (F) - 2.3143610e-004, (F) - 2.3453175e-004, (F) - 2.3764368e-004, + (F) - 2.4076019e-004, (F) - 2.4388735e-004, (F) - 2.4702508e-004, (F) - 2.5017411e-004, (F) - 2.5333543e-004, + (F) - 2.5650720e-004, (F) - 2.5971239e-004, (F) - 2.6291070e-004, (F) - 2.6614678e-004, (F) - 2.6938916e-004, + (F) - 2.7264437e-004, (F) - 2.7588913e-004, (F) - 2.7914295e-004, (F) - 2.8238998e-004, (F) - 2.8565591e-004, + (F) - 2.8895192e-004, (F) - 2.9231668e-004, (F) - 2.9568523e-004, (F) - 2.9885971e-004, (F) - 3.0230245e-004, + (F) - 3.0562944e-004, (F) - 3.0899705e-004, (F) - 3.1236984e-004, (F) - 3.1575932e-004, (F) - 3.1915720e-004, + (F) - 3.2256619e-004, (F) - 3.2599148e-004, (F) - 3.2942304e-004, (F) - 3.3286616e-004, (F) - 3.3631386e-004, + (F) - 3.3977978e-004, (F) - 3.4324533e-004, (F) - 3.4673121e-004, (F) - 3.5022620e-004, (F) - 3.5373782e-004, + (F) - 3.5726001e-004, (F) - 3.6079784e-004, (F) - 3.6435228e-004, (F) - 3.6789813e-004, (F) - 3.7147125e-004, + (F) - 3.7503555e-004, (F) - 3.7860142e-004, (F) - 3.8217419e-004, (F) - 3.8576582e-004, (F) - 3.8937618e-004, + (F) - 3.9300877e-004, (F) - 3.9666663e-004, (F) - 4.0031807e-004, (F) - 4.0393867e-004, (F) - 4.0751295e-004, + (F) - 4.1131485e-004, (F) - 4.1493297e-004, (F) - 4.1862574e-004, (F) - 4.2232986e-004, (F) - 4.2603467e-004, + (F) - 4.2975534e-004, (F) - 4.3347834e-004, (F) - 4.3721957e-004, (F) - 4.4095707e-004, (F) - 4.4471248e-004, + (F) - 4.4847023e-004, (F) - 4.5224882e-004, (F) - 4.5602551e-004, (F) - 4.5982681e-004, (F) - 4.6362882e-004, + (F) - 4.6744464e-004, (F) - 4.7126296e-004, (F) - 4.7509149e-004, (F) - 4.7892223e-004, (F) - 4.8274958e-004, + (F) - 4.8660067e-004, (F) - 4.9044254e-004, (F) - 4.9429973e-004, (F) - 4.9818084e-004, (F) - 5.0207382e-004, + (F) - 5.0597844e-004, (F) - 5.0988090e-004, (F) - 5.1378900e-004, (F) - 5.1767455e-004, (F) - 5.2157784e-004, + (F) - 5.2550534e-004, (F) - 5.2954292e-004, (F) - 5.3338602e-004, (F) - 5.3736583e-004, (F) - 5.4133594e-004, + (F) - 5.4529167e-004, (F) - 5.4927299e-004, (F) - 5.5324706e-004, (F) - 5.5724157e-004, (F) - 5.6122794e-004, + (F) - 5.6523832e-004, (F) - 5.6924539e-004, (F) - 5.7327066e-004, (F) - 5.7728920e-004, (F) - 5.8132765e-004, + (F) - 5.8535649e-004, (F) - 5.8939695e-004, (F) - 5.9343652e-004, (F) - 5.9748510e-004, (F) - 6.0153590e-004, + (F) - 6.0559430e-004, (F) - 6.0967412e-004, (F) - 6.1374540e-004, (F) - 6.1783904e-004, (F) - 6.2194403e-004, + (F) - 6.2603808e-004, (F) - 6.3013543e-004, (F) - 6.3422627e-004, (F) - 6.3833154e-004, (F) - 6.4243332e-004, + (F) - 6.4657635e-004, (F) - 6.5072148e-004, (F) - 6.5488235e-004, (F) - 6.5892065e-004, (F) - 6.6313078e-004, + (F) - 6.6727626e-004, (F) - 6.7140842e-004, (F) - 6.7557927e-004, (F) - 6.7972979e-004, (F) - 6.8390501e-004, + (F) - 6.8806653e-004, (F) - 6.9225262e-004, (F) - 6.9642391e-004, (F) - 7.0061078e-004, (F) - 7.0478617e-004, + (F) - 7.0897873e-004, (F) - 7.1315848e-004, (F) - 7.1735508e-004, (F) - 7.2155033e-004, (F) - 7.2575613e-004, + (F) - 7.2996431e-004, (F) - 7.3418147e-004, (F) - 7.3840652e-004, (F) - 7.4261917e-004, (F) - 7.4684907e-004, + (F) - 7.5107177e-004, (F) - 7.5527988e-004, (F) - 7.5950621e-004, (F) - 7.6373284e-004, (F) - 7.6797990e-004, + (F) - 7.7222020e-004, (F) - 7.7648381e-004, (F) - 7.8071490e-004, (F) - 7.8494955e-004, (F) - 7.8914860e-004, + (F) - 7.9348415e-004, (F) - 7.9769844e-004, (F) - 8.0193496e-004, (F) - 8.0621272e-004, (F) - 8.1045333e-004, + (F) - 8.1472245e-004, (F) - 8.1897072e-004, (F) - 8.2323951e-004, (F) - 8.2748711e-004, (F) - 8.3175195e-004, + (F) - 8.3600580e-004, (F) - 8.4027518e-004, (F) - 8.4453368e-004, (F) - 8.4880893e-004, (F) - 8.5307776e-004, + (F) - 8.5735118e-004, (F) - 8.6162249e-004, (F) - 8.6589382e-004, (F) - 8.7016289e-004, (F) - 8.7442056e-004, + (F) - 8.7869469e-004, (F) - 8.8295395e-004, (F) - 8.8721488e-004, (F) - 8.9150003e-004, (F) - 8.9577366e-004, + (F) - 9.0005378e-004, (F) - 9.0431520e-004, (F) - 9.0858594e-004, (F) - 9.1282776e-004, (F) - 9.1709567e-004, + (F) - 9.2135966e-004, (F) - 9.2568012e-004, (F) - 9.2987591e-004, (F) - 9.3414524e-004, (F) - 9.3843171e-004, + (F) - 9.4266414e-004, (F) - 9.4693507e-004, (F) - 9.5117535e-004, (F) - 9.5543687e-004, (F) - 9.5967515e-004, + (F) - 9.6393468e-004, (F) - 9.6817845e-004, (F) - 9.7243400e-004, (F) - 9.7667465e-004, (F) - 9.8092565e-004, + (F) - 9.8516064e-004, (F) - 9.8939684e-004, (F) - 9.9362682e-004, (F) - 9.9785357e-004, (F) - 1.0020771e-003, + (F) - 1.0062964e-003, (F) - 1.0105278e-003, (F) - 1.0147410e-003, (F) - 1.0189627e-003, (F) - 1.0231919e-003, + (F) - 1.0273888e-003, (F) - 1.0315914e-003, (F) - 1.0357772e-003, (F) - 1.0399770e-003, (F) - 1.0441581e-003, + (F) - 1.0483674e-003, (F) - 1.0525531e-003, (F) - 1.0567446e-003, (F) - 1.0608604e-003, (F) - 1.0650738e-003, + (F) - 1.0692510e-003, (F) - 1.0733797e-003, (F) - 1.0775588e-003, (F) - 1.0816965e-003, (F) - 1.0858563e-003, + (F) - 1.0899914e-003, (F) - 1.0941426e-003, (F) - 1.0982701e-003, (F) - 1.1024024e-003, (F) - 1.1065175e-003, + (F) - 1.1106354e-003, (F) - 1.1147366e-003, (F) - 1.1188392e-003, (F) - 1.1229363e-003, (F) - 1.1270269e-003, + (F) - 1.1311162e-003, (F) - 1.1351978e-003, (F) - 1.1392810e-003, (F) - 1.1433394e-003, (F) - 1.1474060e-003, + (F) - 1.1514586e-003, (F) - 1.1554824e-003, (F) - 1.1595257e-003, (F) - 1.1635549e-003, (F) - 1.1675920e-003, + (F) - 1.1716069e-003, (F) - 1.1756321e-003, (F) - 1.1796207e-003, (F) - 1.1836123e-003, (F) - 1.1875792e-003, + (F) - 1.1916120e-003, (F) - 1.1955664e-003, (F) - 1.1995059e-003, (F) - 1.2034982e-003, (F) - 1.2074293e-003, + (F) - 1.2113866e-003, (F) - 1.2153109e-003, (F) - 1.2192453e-003, (F) - 1.2231497e-003, (F) - 1.2270598e-003, + (F) - 1.2309518e-003, (F) - 1.2348445e-003, (F) - 1.2387214e-003, (F) - 1.2425990e-003, (F) - 1.2464649e-003, + (F) - 1.2503198e-003, (F) - 1.2541682e-003, (F) - 1.2580017e-003, (F) - 1.2618275e-003, (F) - 1.2656312e-003, + (F) - 1.2694420e-003, (F) - 1.2732312e-003, (F) - 1.2770072e-003, (F) - 1.2808060e-003, (F) - 1.2845712e-003, + (F) - 1.2883348e-003, (F) - 1.2920713e-003, (F) - 1.2958126e-003, (F) - 1.2995222e-003, (F) - 1.3032464e-003, + (F) - 1.3069539e-003, (F) - 1.3106774e-003, (F) - 1.3143214e-003, (F) - 1.3179943e-003, (F) - 1.3216911e-003, + (F) - 1.3253120e-003, (F) - 1.3289667e-003, (F) - 1.3325813e-003, (F) - 1.3362028e-003, (F) - 1.3397971e-003, + (F) - 1.3433966e-003, (F) - 1.3469767e-003, (F) - 1.3505509e-003, (F) - 1.3541091e-003, (F) - 1.3576589e-003, + (F) - 1.3611918e-003, (F) - 1.3647088e-003, (F) - 1.3682185e-003, (F) - 1.3717083e-003, (F) - 1.3751927e-003, + (F) - 1.3786586e-003, (F) - 1.3821294e-003, (F) - 1.3855717e-003, (F) - 1.3890107e-003, (F) - 1.3924517e-003, + (F) - 1.3958431e-003, (F) - 1.3992389e-003, (F) - 1.4026138e-003, (F) - 1.4059908e-003, (F) - 1.4093413e-003, + (F) - 1.4126989e-003, (F) - 1.4160271e-003, (F) - 1.4193442e-003, (F) - 1.4226165e-003, (F) - 1.4259289e-003, + (F) - 1.4292197e-003, (F) - 1.4324405e-003, (F) - 1.4357099e-003, (F) - 1.4389270e-003, (F) - 1.4421539e-003, + (F) - 1.4453523e-003, (F) - 1.4485514e-003, (F) - 1.4517231e-003, (F) - 1.4548847e-003, (F) - 1.4580274e-003, + (F) - 1.4611567e-003, (F) - 1.4642681e-003, (F) - 1.4673659e-003, (F) - 1.4704549e-003, (F) - 1.4735233e-003, + (F) - 1.4765858e-003, (F) - 1.4796281e-003, (F) - 1.4826638e-003, (F) - 1.4856674e-003, (F) - 1.4886671e-003, + (F) - 1.4916506e-003, (F) - 1.4945890e-003, (F) - 1.4975504e-003, (F) - 1.5004827e-003, (F) - 1.5034084e-003, + (F) - 1.5063028e-003, (F) - 1.5091954e-003, (F) - 1.5120520e-003, (F) - 1.5149014e-003, (F) - 1.5177300e-003, + (F) - 1.5205758e-003, (F) - 1.5233678e-003, (F) - 1.5261251e-003, (F) - 1.5289303e-003, (F) - 1.5316663e-003, + (F) - 1.5344141e-003, (F) - 1.5371295e-003, (F) - 1.5398364e-003, (F) - 1.5425153e-003, (F) - 1.5451826e-003, + (F) - 1.5478334e-003, (F) - 1.5504665e-003, (F) - 1.5530859e-003, (F) - 1.5556881e-003, (F) - 1.5582783e-003, + (F) - 1.5608417e-003, (F) - 1.5633971e-003, (F) - 1.5659237e-003, (F) - 1.5684387e-003, (F) - 1.5709227e-003, + (F) - 1.5734049e-003, (F) - 1.5758605e-003, (F) - 1.5782894e-003, (F) - 1.5807395e-003, (F) - 1.5831377e-003, + (F) - 1.5855244e-003, (F) - 1.5878847e-003, (F) - 1.5902389e-003, (F) - 1.5925621e-003, (F) - 1.5948806e-003, + (F) - 1.5971795e-003, (F) - 1.5994648e-003, (F) - 1.6017023e-003, (F) - 1.6039374e-003, (F) - 1.6061948e-003, + (F) - 1.6083671e-003, (F) - 1.6105632e-003, (F) - 1.6127188e-003, (F) - 1.6148653e-003, (F) - 1.6169867e-003, + (F) - 1.6190977e-003, (F) - 1.6211891e-003, (F) - 1.6232595e-003, (F) - 1.6253137e-003, (F) - 1.6273450e-003, + (F) - 1.6293578e-003, (F) - 1.6313431e-003, (F) - 1.6333175e-003, (F) - 1.6352621e-003, (F) - 1.6371955e-003, + (F) - 1.6391040e-003, (F) - 1.6410056e-003, (F) - 1.6428767e-003, (F) - 1.6447288e-003, (F) - 1.6465844e-003, + (F) - 1.6483719e-003, (F) - 1.6501672e-003, (F) - 1.6519389e-003, (F) - 1.6536996e-003, (F) - 1.6554282e-003, + (F) - 1.6571491e-003, (F) - 1.6588414e-003, (F) - 1.6605117e-003, (F) - 1.6621541e-003, (F) - 1.6638005e-003, + (F) - 1.6654288e-003, (F) - 1.6669834e-003, (F) - 1.6685753e-003, (F) - 1.6701176e-003, (F) - 1.6716515e-003, + (F) - 1.6731631e-003, (F) - 1.6746564e-003, (F) - 1.6761265e-003, (F) - 1.6775701e-003, (F) - 1.6789983e-003, + (F) - 1.6803975e-003, (F) - 1.6817812e-003, (F) - 1.6831383e-003, (F) - 1.6844858e-003, (F) - 1.6858018e-003, + (F) - 1.6871089e-003, (F) - 1.6883875e-003, (F) - 1.6896522e-003, (F) - 1.6908826e-003, (F) - 1.6920984e-003, + (F) - 1.6932997e-003, (F) - 1.6944435e-003, (F) - 1.6956151e-003, (F) - 1.6967487e-003, (F) - 1.6978597e-003, + (F) - 1.6989426e-003, (F) - 1.7000133e-003, (F) - 1.7010552e-003, (F) - 1.7020763e-003, (F) - 1.7030812e-003, + (F) - 1.7040712e-003, (F) - 1.7050255e-003, (F) - 1.7059364e-003, (F) - 1.7068863e-003, (F) - 1.7077671e-003, + (F) - 1.7086455e-003, (F) - 1.7094964e-003, (F) - 1.7103232e-003, (F) - 1.7111262e-003, (F) - 1.7119057e-003, + (F) - 1.7126703e-003, (F) - 1.7134064e-003, (F) - 1.7141292e-003, (F) - 1.7148261e-003, (F) - 1.7155080e-003, + (F) - 1.7161579e-003, (F) - 1.7167949e-003, (F) - 1.7174006e-003, (F) - 1.7179873e-003, (F) - 1.7185461e-003, + (F) - 1.7190909e-003, (F) - 1.7196156e-003, (F) - 1.7200987e-003, (F) - 1.7206103e-003, (F) - 1.7210535e-003, + (F) - 1.7214820e-003, (F) - 1.7218914e-003, (F) - 1.7222858e-003, (F) - 1.7226498e-003, (F) - 1.7229951e-003, + (F) - 1.7233213e-003, (F) - 1.7236201e-003, (F) - 1.7238898e-003, (F) - 1.7241422e-003, (F) - 1.7244071e-003, + (F) - 1.7245924e-003, (F) - 1.7247871e-003, (F) - 1.7249510e-003, (F) - 1.7250894e-003, (F) - 1.7252121e-003, + (F) - 1.7253110e-003, (F) - 1.7253955e-003, (F) - 1.7254479e-003, (F) - 1.7254883e-003, (F) 9.9827450e-001, + (F) - 1.7254883e-003, (F) - 1.7254479e-003, (F) - 1.7253955e-003, (F) - 1.7253110e-003, (F) - 1.7252121e-003, + (F) - 1.7250894e-003, (F) - 1.7249510e-003, (F) - 1.7247871e-003, (F) - 1.7245924e-003, (F) - 1.7244071e-003, + (F) - 1.7241422e-003, (F) - 1.7238898e-003, (F) - 1.7236201e-003, (F) - 1.7233213e-003, (F) - 1.7229951e-003, + (F) - 1.7226498e-003, (F) - 1.7222858e-003, (F) - 1.7218914e-003, (F) - 1.7214820e-003, (F) - 1.7210535e-003, + (F) - 1.7206103e-003, (F) - 1.7200987e-003, (F) - 1.7196156e-003, (F) - 1.7190909e-003, (F) - 1.7185461e-003, + (F) - 1.7179873e-003, (F) - 1.7174006e-003, (F) - 1.7167949e-003, (F) - 1.7161579e-003, (F) - 1.7155080e-003, + (F) - 1.7148261e-003, (F) - 1.7141292e-003, (F) - 1.7134064e-003, (F) - 1.7126703e-003, (F) - 1.7119057e-003, + (F) - 1.7111262e-003, (F) - 1.7103232e-003, (F) - 1.7094964e-003, (F) - 1.7086455e-003, (F) - 1.7077671e-003, + (F) - 1.7068863e-003, (F) - 1.7059364e-003, (F) - 1.7050255e-003, (F) - 1.7040712e-003, (F) - 1.7030812e-003, + (F) - 1.7020763e-003, (F) - 1.7010552e-003, (F) - 1.7000133e-003, (F) - 1.6989426e-003, (F) - 1.6978597e-003, + (F) - 1.6967487e-003, (F) - 1.6956151e-003, (F) - 1.6944435e-003, (F) - 1.6932997e-003, (F) - 1.6920984e-003, + (F) - 1.6908826e-003, (F) - 1.6896522e-003, (F) - 1.6883875e-003, (F) - 1.6871089e-003, (F) - 1.6858018e-003, + (F) - 1.6844858e-003, (F) - 1.6831383e-003, (F) - 1.6817812e-003, (F) - 1.6803975e-003, (F) - 1.6789983e-003, + (F) - 1.6775701e-003, (F) - 1.6761265e-003, (F) - 1.6746564e-003, (F) - 1.6731631e-003, (F) - 1.6716515e-003, + (F) - 1.6701176e-003, (F) - 1.6685753e-003, (F) - 1.6669834e-003, (F) - 1.6654288e-003, (F) - 1.6638005e-003, + (F) - 1.6621541e-003, (F) - 1.6605117e-003, (F) - 1.6588414e-003, (F) - 1.6571491e-003, (F) - 1.6554282e-003, + (F) - 1.6536996e-003, (F) - 1.6519389e-003, (F) - 1.6501672e-003, (F) - 1.6483719e-003, (F) - 1.6465844e-003, + (F) - 1.6447288e-003, (F) - 1.6428767e-003, (F) - 1.6410056e-003, (F) - 1.6391040e-003, (F) - 1.6371955e-003, + (F) - 1.6352621e-003, (F) - 1.6333175e-003, (F) - 1.6313431e-003, (F) - 1.6293578e-003, (F) - 1.6273450e-003, + (F) - 1.6253137e-003, (F) - 1.6232595e-003, (F) - 1.6211891e-003, (F) - 1.6190977e-003, (F) - 1.6169867e-003, + (F) - 1.6148653e-003, (F) - 1.6127188e-003, (F) - 1.6105632e-003, (F) - 1.6083671e-003, (F) - 1.6061948e-003, + (F) - 1.6039374e-003, (F) - 1.6017023e-003, (F) - 1.5994648e-003, (F) - 1.5971795e-003, (F) - 1.5948806e-003, + (F) - 1.5925621e-003, (F) - 1.5902389e-003, (F) - 1.5878847e-003, (F) - 1.5855244e-003, (F) - 1.5831377e-003, + (F) - 1.5807395e-003, (F) - 1.5782894e-003, (F) - 1.5758605e-003, (F) - 1.5734049e-003, (F) - 1.5709227e-003, + (F) - 1.5684387e-003, (F) - 1.5659237e-003, (F) - 1.5633971e-003, (F) - 1.5608417e-003, (F) - 1.5582783e-003, + (F) - 1.5556881e-003, (F) - 1.5530859e-003, (F) - 1.5504665e-003, (F) - 1.5478334e-003, (F) - 1.5451826e-003, + (F) - 1.5425153e-003, (F) - 1.5398364e-003, (F) - 1.5371295e-003, (F) - 1.5344141e-003, (F) - 1.5316663e-003, + (F) - 1.5289303e-003, (F) - 1.5261251e-003, (F) - 1.5233678e-003, (F) - 1.5205758e-003, (F) - 1.5177300e-003, + (F) - 1.5149014e-003, (F) - 1.5120520e-003, (F) - 1.5091954e-003, (F) - 1.5063028e-003, (F) - 1.5034084e-003, + (F) - 1.5004827e-003, (F) - 1.4975504e-003, (F) - 1.4945890e-003, (F) - 1.4916506e-003, (F) - 1.4886671e-003, + (F) - 1.4856674e-003, (F) - 1.4826638e-003, (F) - 1.4796281e-003, (F) - 1.4765858e-003, (F) - 1.4735233e-003, + (F) - 1.4704549e-003, (F) - 1.4673659e-003, (F) - 1.4642681e-003, (F) - 1.4611567e-003, (F) - 1.4580274e-003, + (F) - 1.4548847e-003, (F) - 1.4517231e-003, (F) - 1.4485514e-003, (F) - 1.4453523e-003, (F) - 1.4421539e-003, + (F) - 1.4389270e-003, (F) - 1.4357099e-003, (F) - 1.4324405e-003, (F) - 1.4292197e-003, (F) - 1.4259289e-003, + (F) - 1.4226165e-003, (F) - 1.4193442e-003, (F) - 1.4160271e-003, (F) - 1.4126989e-003, (F) - 1.4093413e-003, + (F) - 1.4059908e-003, (F) - 1.4026138e-003, (F) - 1.3992389e-003, (F) - 1.3958431e-003, (F) - 1.3924517e-003, + (F) - 1.3890107e-003, (F) - 1.3855717e-003, (F) - 1.3821294e-003, (F) - 1.3786586e-003, (F) - 1.3751927e-003, + (F) - 1.3717083e-003, (F) - 1.3682185e-003, (F) - 1.3647088e-003, (F) - 1.3611918e-003, (F) - 1.3576589e-003, + (F) - 1.3541091e-003, (F) - 1.3505509e-003, (F) - 1.3469767e-003, (F) - 1.3433966e-003, (F) - 1.3397971e-003, + (F) - 1.3362028e-003, (F) - 1.3325813e-003, (F) - 1.3289667e-003, (F) - 1.3253120e-003, (F) - 1.3216911e-003, + (F) - 1.3179943e-003, (F) - 1.3143214e-003, (F) - 1.3106774e-003, (F) - 1.3069539e-003, (F) - 1.3032464e-003, + (F) - 1.2995222e-003, (F) - 1.2958126e-003, (F) - 1.2920713e-003, (F) - 1.2883348e-003, (F) - 1.2845712e-003, + (F) - 1.2808060e-003, (F) - 1.2770072e-003, (F) - 1.2732312e-003, (F) - 1.2694420e-003, (F) - 1.2656312e-003, + (F) - 1.2618275e-003, (F) - 1.2580017e-003, (F) - 1.2541682e-003, (F) - 1.2503198e-003, (F) - 1.2464649e-003, + (F) - 1.2425990e-003, (F) - 1.2387214e-003, (F) - 1.2348445e-003, (F) - 1.2309518e-003, (F) - 1.2270598e-003, + (F) - 1.2231497e-003, (F) - 1.2192453e-003, (F) - 1.2153109e-003, (F) - 1.2113866e-003, (F) - 1.2074293e-003, + (F) - 1.2034982e-003, (F) - 1.1995059e-003, (F) - 1.1955664e-003, (F) - 1.1916120e-003, (F) - 1.1875792e-003, + (F) - 1.1836123e-003, (F) - 1.1796207e-003, (F) - 1.1756321e-003, (F) - 1.1716069e-003, (F) - 1.1675920e-003, + (F) - 1.1635549e-003, (F) - 1.1595257e-003, (F) - 1.1554824e-003, (F) - 1.1514586e-003, (F) - 1.1474060e-003, + (F) - 1.1433394e-003, (F) - 1.1392810e-003, (F) - 1.1351978e-003, (F) - 1.1311162e-003, (F) - 1.1270269e-003, + (F) - 1.1229363e-003, (F) - 1.1188392e-003, (F) - 1.1147366e-003, (F) - 1.1106354e-003, (F) - 1.1065175e-003, + (F) - 1.1024024e-003, (F) - 1.0982701e-003, (F) - 1.0941426e-003, (F) - 1.0899914e-003, (F) - 1.0858563e-003, + (F) - 1.0816965e-003, (F) - 1.0775588e-003, (F) - 1.0733797e-003, (F) - 1.0692510e-003, (F) - 1.0650738e-003, + (F) - 1.0608604e-003, (F) - 1.0567446e-003, (F) - 1.0525531e-003, (F) - 1.0483674e-003, (F) - 1.0441581e-003, + (F) - 1.0399770e-003, (F) - 1.0357772e-003, (F) - 1.0315914e-003, (F) - 1.0273888e-003, (F) - 1.0231919e-003, + (F) - 1.0189627e-003, (F) - 1.0147410e-003, (F) - 1.0105278e-003, (F) - 1.0062964e-003, (F) - 1.0020771e-003, + (F) - 9.9785357e-004, (F) - 9.9362682e-004, (F) - 9.8939684e-004, (F) - 9.8516064e-004, (F) - 9.8092565e-004, + (F) - 9.7667465e-004, (F) - 9.7243400e-004, (F) - 9.6817845e-004, (F) - 9.6393468e-004, (F) - 9.5967515e-004, + (F) - 9.5543687e-004, (F) - 9.5117535e-004, (F) - 9.4693507e-004, (F) - 9.4266414e-004, (F) - 9.3843171e-004, + (F) - 9.3414524e-004, (F) - 9.2987591e-004, (F) - 9.2568012e-004, (F) - 9.2135966e-004, (F) - 9.1709567e-004, + (F) - 9.1282776e-004, (F) - 9.0858594e-004, (F) - 9.0431520e-004, (F) - 9.0005378e-004, (F) - 8.9577366e-004, + (F) - 8.9150003e-004, (F) - 8.8721488e-004, (F) - 8.8295395e-004, (F) - 8.7869469e-004, (F) - 8.7442056e-004, + (F) - 8.7016289e-004, (F) - 8.6589382e-004, (F) - 8.6162249e-004, (F) - 8.5735118e-004, (F) - 8.5307776e-004, + (F) - 8.4880893e-004, (F) - 8.4453368e-004, (F) - 8.4027518e-004, (F) - 8.3600580e-004, (F) - 8.3175195e-004, + (F) - 8.2748711e-004, (F) - 8.2323951e-004, (F) - 8.1897072e-004, (F) - 8.1472245e-004, (F) - 8.1045333e-004, + (F) - 8.0621272e-004, (F) - 8.0193496e-004, (F) - 7.9769844e-004, (F) - 7.9348415e-004, (F) - 7.8914860e-004, + (F) - 7.8494955e-004, (F) - 7.8071490e-004, (F) - 7.7648381e-004, (F) - 7.7222020e-004, (F) - 7.6797990e-004, + (F) - 7.6373284e-004, (F) - 7.5950621e-004, (F) - 7.5527988e-004, (F) - 7.5107177e-004, (F) - 7.4684907e-004, + (F) - 7.4261917e-004, (F) - 7.3840652e-004, (F) - 7.3418147e-004, (F) - 7.2996431e-004, (F) - 7.2575613e-004, + (F) - 7.2155033e-004, (F) - 7.1735508e-004, (F) - 7.1315848e-004, (F) - 7.0897873e-004, (F) - 7.0478617e-004, + (F) - 7.0061078e-004, (F) - 6.9642391e-004, (F) - 6.9225262e-004, (F) - 6.8806653e-004, (F) - 6.8390501e-004, + (F) - 6.7972979e-004, (F) - 6.7557927e-004, (F) - 6.7140842e-004, (F) - 6.6727626e-004, (F) - 6.6313078e-004, + (F) - 6.5892065e-004, (F) - 6.5488235e-004, (F) - 6.5072148e-004, (F) - 6.4657635e-004, (F) - 6.4243332e-004, + (F) - 6.3833154e-004, (F) - 6.3422627e-004, (F) - 6.3013543e-004, (F) - 6.2603808e-004, (F) - 6.2194403e-004, + (F) - 6.1783904e-004, (F) - 6.1374540e-004, (F) - 6.0967412e-004, (F) - 6.0559430e-004, (F) - 6.0153590e-004, + (F) - 5.9748510e-004, (F) - 5.9343652e-004, (F) - 5.8939695e-004, (F) - 5.8535649e-004, (F) - 5.8132765e-004, + (F) - 5.7728920e-004, (F) - 5.7327066e-004, (F) - 5.6924539e-004, (F) - 5.6523832e-004, (F) - 5.6122794e-004, + (F) - 5.5724157e-004, (F) - 5.5324706e-004, (F) - 5.4927299e-004, (F) - 5.4529167e-004, (F) - 5.4133594e-004, + (F) - 5.3736583e-004, (F) - 5.3338602e-004, (F) - 5.2954292e-004, (F) - 5.2550534e-004, (F) - 5.2157784e-004, + (F) - 5.1767455e-004, (F) - 5.1378900e-004, (F) - 5.0988090e-004, (F) - 5.0597844e-004, (F) - 5.0207382e-004, + (F) - 4.9818084e-004, (F) - 4.9429973e-004, (F) - 4.9044254e-004, (F) - 4.8660067e-004, (F) - 4.8274958e-004, + (F) - 4.7892223e-004, (F) - 4.7509149e-004, (F) - 4.7126296e-004, (F) - 4.6744464e-004, (F) - 4.6362882e-004, + (F) - 4.5982681e-004, (F) - 4.5602551e-004, (F) - 4.5224882e-004, (F) - 4.4847023e-004, (F) - 4.4471248e-004, + (F) - 4.4095707e-004, (F) - 4.3721957e-004, (F) - 4.3347834e-004, (F) - 4.2975534e-004, (F) - 4.2603467e-004, + (F) - 4.2232986e-004, (F) - 4.1862574e-004, (F) - 4.1493297e-004, (F) - 4.1131485e-004, (F) - 4.0751295e-004, + (F) - 4.0393867e-004, (F) - 4.0031807e-004, (F) - 3.9666663e-004, (F) - 3.9300877e-004, (F) - 3.8937618e-004, + (F) - 3.8576582e-004, (F) - 3.8217419e-004, (F) - 3.7860142e-004, (F) - 3.7503555e-004, (F) - 3.7147125e-004, + (F) - 3.6789813e-004, (F) - 3.6435228e-004, (F) - 3.6079784e-004, (F) - 3.5726001e-004, (F) - 3.5373782e-004, + (F) - 3.5022620e-004, (F) - 3.4673121e-004, (F) - 3.4324533e-004, (F) - 3.3977978e-004, (F) - 3.3631386e-004, + (F) - 3.3286616e-004, (F) - 3.2942304e-004, (F) - 3.2599148e-004, (F) - 3.2256619e-004, (F) - 3.1915720e-004, + (F) - 3.1575932e-004, (F) - 3.1236984e-004, (F) - 3.0899705e-004, (F) - 3.0562944e-004, (F) - 3.0230245e-004, + (F) - 2.9885971e-004, (F) - 2.9568523e-004, (F) - 2.9231668e-004, (F) - 2.8895192e-004, (F) - 2.8565591e-004, + (F) - 2.8238998e-004, (F) - 2.7914295e-004, (F) - 2.7588913e-004, (F) - 2.7264437e-004, (F) - 2.6938916e-004, + (F) - 2.6614678e-004, (F) - 2.6291070e-004, (F) - 2.5971239e-004, (F) - 2.5650720e-004, (F) - 2.5333543e-004, + (F) - 2.5017411e-004, (F) - 2.4702508e-004, (F) - 2.4388735e-004, (F) - 2.4076019e-004, (F) - 2.3764368e-004, + (F) - 2.3453175e-004, (F) - 2.3143610e-004, (F) - 2.2835091e-004, (F) - 2.2527550e-004, (F) - 2.2221937e-004, + (F) - 2.1917324e-004, (F) - 2.1614560e-004, (F) - 2.1311883e-004, (F) - 2.1012138e-004, (F) - 2.0711506e-004, + (F) - 2.0414964e-004, (F) - 2.0112323e-004, (F) - 1.9831231e-004, (F) - 1.9520475e-004, (F) - 1.9226519e-004, + (F) - 1.8942093e-004, (F) - 1.8652433e-004, (F) - 1.8362809e-004, (F) - 1.8070933e-004, (F) - 1.7782269e-004, + (F) - 1.7493698e-004, (F) - 1.7209519e-004, (F) - 1.6926417e-004, (F) - 1.6646857e-004, (F) - 1.6365806e-004, + (F) - 1.6088469e-004, (F) - 1.5810382e-004, (F) - 1.5533702e-004, (F) - 1.5257694e-004, (F) - 1.4983227e-004, + (F) - 1.4709544e-004, (F) - 1.4437565e-004, (F) - 1.4167133e-004, (F) - 1.3898420e-004, (F) - 1.3630467e-004, + (F) - 1.3365159e-004, (F) - 1.3099695e-004, (F) - 1.2836778e-004, (F) - 1.2573245e-004, (F) - 1.2313545e-004, + (F) - 1.2051726e-004, (F) - 1.1795237e-004, (F) - 1.1534129e-004, (F) - 1.1287369e-004, (F) - 1.1012977e-004, + (F) - 1.0773097e-004, (F) - 1.0528563e-004, (F) - 1.0268888e-004, (F) - 1.0017071e-004, (F) - 9.7654715e-005, + (F) - 9.5215819e-005, (F) - 9.2768583e-005, (F) - 9.0371180e-005, (F) - 8.7951462e-005, (F) - 8.5558944e-005, + (F) - 8.3140519e-005, (F) - 8.0767477e-005, (F) - 7.8374135e-005, (F) - 7.6014789e-005, (F) - 7.3660509e-005, + (F) - 7.1334393e-005, (F) - 6.9012344e-005, (F) - 6.6719855e-005, (F) - 6.4430870e-005, (F) - 6.2164814e-005, + (F) - 5.9896191e-005, (F) - 5.7659653e-005, (F) - 5.5407648e-005, (F) - 5.3195433e-005, (F) - 5.0966866e-005, + (F) - 4.8788370e-005, (F) - 4.6576406e-005, (F) - 4.4435158e-005, (F) - 4.2238257e-005, (F) - 4.0157616e-005, + (F) - 3.7882528e-005, (F) - 3.6003270e-005, (F) - 3.3828247e-005, (F) - 3.1583770e-005, (F) - 2.9593067e-005, + (F) - 2.7557313e-005, (F) - 2.5587191e-005, (F) - 2.3549789e-005, (F) - 2.1556262e-005, (F) - 1.9516113e-005, + (F) - 1.7525599e-005, (F) - 1.5517481e-005, (F) - 1.3572472e-005, (F) - 1.1604256e-005, (F) - 9.6904874e-006, + (F) - 7.7707834e-006, (F) - 5.8828077e-006, (F) - 3.9880938e-006, (F) - 2.1249647e-006, (F) - 2.5040016e-007, + (F) 1.5949437e-006, (F) 3.4494433e-006, (F) 5.2646709e-006, (F) 7.1001852e-006, (F) 8.8806737e-006, + (F) 1.0686745e-005, (F) 1.2432060e-005, (F) 1.4217836e-005, (F) 1.5919286e-005, (F) 1.7687295e-005, + (F) 1.9336697e-005, (F) 2.1125524e-005, (F) 2.2595147e-005, (F) 2.4508556e-005, (F) 2.6196851e-005, + (F) 2.7585354e-005, (F) 2.9262279e-005, (F) 3.0858734e-005, (F) 3.2553422e-005, (F) 3.4140016e-005, + (F) 3.5770376e-005, (F) 3.7301364e-005, (F) 3.8864361e-005, (F) 4.0354202e-005, (F) 4.1892374e-005, + (F) 4.3364404e-005, (F) 4.4875639e-005, (F) 4.6344615e-005, (F) 4.7838012e-005, (F) 4.9285680e-005, + (F) 5.0758389e-005, (F) 5.2178565e-005, (F) 5.3618819e-005, (F) 5.5001511e-005, (F) 5.6415612e-005, + (F) 5.7756282e-005, (F) 5.9143854e-005, (F) 6.0452242e-005, (F) 6.1818800e-005, (F) 6.3085250e-005, + (F) 6.4441171e-005, (F) 6.5663462e-005, (F) 6.7027725e-005, (F) 6.8148646e-005, (F) 6.9687722e-005, + (F) 7.0709936e-005, (F) 7.1728435e-005, (F) 7.3269051e-005, (F) 7.4464448e-005, (F) 7.5741110e-005, + (F) 7.6835554e-005, (F) 7.8017131e-005, (F) 7.9094451e-005, (F) 8.0258949e-005, (F) 8.1353458e-005, + (F) 8.2519454e-005, (F) 8.3606584e-005, (F) 8.4750138e-005, (F) 8.5825876e-005, (F) 8.6929477e-005, + (F) 8.7969516e-005, (F) 8.9038684e-005, (F) 9.0039349e-005, (F) 9.1073535e-005, (F) 9.2042727e-005, + (F) 9.3056320e-005, (F) 9.3992439e-005, (F) 9.4993975e-005, (F) 9.5905360e-005, (F) 9.6892188e-005, + (F) 9.7773259e-005, (F) 9.8760420e-005, (F) 9.9604074e-005, (F) 1.0060085e-004, (F) 1.0137922e-004, + (F) 1.0247409e-004, (F) 1.0299308e-004, (F) 1.0396291e-004, (F) 1.0529542e-004, (F) 1.0578194e-004, + (F) 1.0661111e-004, (F) 1.0726099e-004, (F) 1.0813498e-004, (F) 1.0887415e-004, (F) 1.0975257e-004, + (F) 1.1049916e-004, (F) 1.1133137e-004, (F) 1.1203418e-004, (F) 1.1281518e-004, (F) 1.1348183e-004, + (F) 1.1420856e-004, (F) 1.1484676e-004, (F) 1.1554840e-004, (F) 1.1616264e-004, (F) 1.1685124e-004, + (F) 1.1745353e-004, (F) 1.1813439e-004, (F) 1.1871658e-004, (F) 1.1939587e-004, (F) 1.1995423e-004, + (F) 1.2062332e-004, (F) 1.2115661e-004, (F) 1.2182429e-004, (F) 1.2231406e-004, (F) 1.2298547e-004, + (F) 1.2341104e-004, (F) 1.2412368e-004, (F) 1.2434765e-004, (F) 1.2528676e-004, (F) 1.2595624e-004, + (F) 1.2561428e-004, (F) 1.2641365e-004, (F) 1.2684799e-004, (F) 1.2754364e-004, (F) 1.2795178e-004, + (F) 1.2850208e-004, (F) 1.2883966e-004, (F) 1.2929298e-004, (F) 1.2959499e-004, (F) 1.3001517e-004, + (F) 1.3031017e-004, (F) 1.3071229e-004, (F) 1.3102020e-004, (F) 1.3142101e-004, (F) 1.3172649e-004, + (F) 1.3212756e-004, (F) 1.3242329e-004, (F) 1.3281213e-004, (F) 1.3308486e-004, (F) 1.3346421e-004, + (F) 1.3370193e-004, (F) 1.3406692e-004, (F) 1.3427186e-004, (F) 1.3462320e-004, (F) 1.3477709e-004, + (F) 1.3513030e-004, (F) 1.3522156e-004, (F) 1.3560751e-004, (F) 1.3557968e-004, (F) 1.3620588e-004, + (F) 1.3597876e-004, (F) 1.3537370e-004, (F) 1.3683967e-004, (F) 1.3676131e-004, (F) 1.3707353e-004, + (F) 1.3691530e-004, (F) 1.3708216e-004, (F) 1.3698332e-004, (F) 1.3715429e-004, (F) 1.3713014e-004, + (F) 1.3732519e-004, (F) 1.3733693e-004, (F) 1.3753506e-004, (F) 1.3756412e-004, (F) 1.3774242e-004, + (F) 1.3775349e-004, (F) 1.3790990e-004, (F) 1.3788717e-004, (F) 1.3801376e-004, (F) 1.3795585e-004, + (F) 1.3806087e-004, (F) 1.3795926e-004, (F) 1.3805069e-004, (F) 1.3791032e-004, (F) 1.3798877e-004, + (F) 1.3780411e-004, (F) 1.3789559e-004, (F) 1.3765261e-004, (F) 1.3778116e-004, (F) 1.3743527e-004, + (F) 1.3768980e-004, (F) 1.3692105e-004, (F) 1.3697478e-004, (F) 1.3896829e-004, (F) 1.3696791e-004, + (F) 1.3690649e-004, (F) 1.3635685e-004, (F) 1.3647364e-004, (F) 1.3622245e-004, (F) 1.3635135e-004, + (F) 1.3616781e-004, (F) 1.3623973e-004, (F) 1.3603623e-004, (F) 1.3604220e-004, (F) 1.3580183e-004, + (F) 1.3573672e-004, (F) 1.3545658e-004, (F) 1.3534817e-004, (F) 1.3502831e-004, (F) 1.3489334e-004, + (F) 1.3454719e-004, (F) 1.3439884e-004, (F) 1.3402423e-004, (F) 1.3388084e-004, (F) 1.3347954e-004, + (F) 1.3334594e-004, (F) 1.3292077e-004, (F) 1.3281968e-004, (F) 1.3234605e-004, (F) 1.3230559e-004, + (F) 1.3174954e-004, (F) 1.3185337e-004, (F) 1.3108290e-004, (F) 1.3188746e-004, (F) 1.3285917e-004, + (F) 1.2692712e-004, (F) 1.2939196e-004, (F) 1.2918213e-004, (F) 1.2984364e-004, (F) 1.2941200e-004, + (F) 1.2957883e-004, (F) 1.2901611e-004, (F) 1.2895095e-004, (F) 1.2832364e-004, (F) 1.2815380e-004, + (F) 1.2749849e-004, (F) 1.2727834e-004, (F) 1.2662486e-004, (F) 1.2639667e-004, (F) 1.2574208e-004, + (F) 1.2553014e-004, (F) 1.2487613e-004, (F) 1.2468629e-004, (F) 1.2402521e-004, (F) 1.2387359e-004, + (F) 1.2319054e-004, (F) 1.2308341e-004, (F) 1.2236911e-004, (F) 1.2231705e-004, (F) 1.2152965e-004, + (F) 1.2156945e-004, (F) 1.2064739e-004, (F) 1.2084617e-004, (F) 1.1960227e-004, (F) 1.2019571e-004, + (F) 1.1739216e-004, (F) 1.0603987e-004, (F) 1.2681189e-004, (F) 1.2211069e-004, (F) 1.2160186e-004, + (F) 1.1938009e-004, (F) 1.1881924e-004, (F) 1.1723162e-004, (F) 1.1671837e-004, (F) 1.1546739e-004, + (F) 1.1501372e-004, (F) 1.1396913e-004, (F) 1.1356565e-004, (F) 1.1266869e-004, (F) 1.1229782e-004, + (F) 1.1149459e-004, (F) 1.1115190e-004, (F) 1.1040957e-004, (F) 1.1007974e-004, (F) 1.0938090e-004, + (F) 1.0905795e-004, (F) 1.0837965e-004, (F) 1.0805611e-004, (F) 1.0739106e-004, (F) 1.0705021e-004, + (F) 1.0638882e-004, (F) 1.0603588e-004, (F) 1.0536773e-004, (F) 1.0499377e-004, (F) 1.0431790e-004, + (F) 1.0392614e-004, (F) 1.0323477e-004, (F) 1.0282141e-004, (F) 9.2170161e-003 + }; + *lenh0 = HP50_48K_LEN; /* store 'number of coefficients' */ + *h0 = hp50_48khz_coeff; /* store pointer to []-array */ +} + +#undef HP50_48K_LEN +/* ...................... End of fill_bp14k_32khz() ..................... */ + + +/* + ============================================================================ + + SCD_FIR hp50_32khz_init (void); + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + Description: + ~~~~~~~~~~~~ + + Initialization routine for a band-pass filter which limits the + bandwidth of the input signal from 50 Hz to 14000 Hz (3 dB points). + No rate change is implemented. + + Parameters: none. + ~~~~~~~~~~~ + + Return value: + ~~~~~~~~~~~~~ + Returns a pointer to struct SCD_FIR; + + History: + ~~~~~~~~ + 05.April.2012 v1.0 - Added filters: HP50_32KHZ, HP50_48KHZ (France Telecom) + + ============================================================================ +*/ +SCD_FIR *hp50_48khz_init () { + float *h0; /* pointer to array with FIR coeff. */ + long lenh0; /* number of FIR coefficients */ + + + /* allocate array for FIR coeff. and fill with coefficients */ + fill_hp50_48khz (&h0, &lenh0); + + return fir_initialization ( /* Returns: pointer to SCD_FIR-struct */ + lenh0, /* In: number of FIR-coefficients */ + h0, /* In: pointer to array with FIR-cof. */ + 1.0, /* In: gain factor for FIR-coeffic. */ + 1l, /* In: Down-sampling factor */ + 'D' /* In: switch to down-sampling proc. */ + ); /* (works here as simple FIR-fil. */ +} + +/* .................... End of hp50_32khz_init() .................... */ From 77b2e1c255b1cb5ac3540e2fea8c9234130e7071 Mon Sep 17 00:00:00 2001 From: Stephane Ragot Date: Sun, 31 May 2026 00:19:59 +0200 Subject: [PATCH 02/10] minor correction of filter main + addition of cmake testing --- src/eid-amr/CMakeLists.txt | 6 +- src/fir/CMakeLists.txt | 12 +++ src/fir/filter.c | 142 +++++++++++++------------- src/fir/test_data/test-hp50-32khz.ref | Bin 0 -> 15360 bytes src/fir/test_data/test-hp50-48khz.ref | Bin 0 -> 15360 bytes src/fir/test_data/tst-shq2.ref | Bin 0 -> 30720 bytes src/fir/test_data/tst-shq3.ref | Bin 0 -> 5120 bytes 7 files changed, 89 insertions(+), 71 deletions(-) create mode 100644 src/fir/test_data/test-hp50-32khz.ref create mode 100644 src/fir/test_data/test-hp50-48khz.ref create mode 100644 src/fir/test_data/tst-shq2.ref create mode 100644 src/fir/test_data/tst-shq3.ref diff --git a/src/eid-amr/CMakeLists.txt b/src/eid-amr/CMakeLists.txt index 9fcbcb5d..20cdeb0c 100644 --- a/src/eid-amr/CMakeLists.txt +++ b/src/eid-amr/CMakeLists.txt @@ -1,5 +1,9 @@ add_executable(eid-amr eid-amr.c) target_link_libraries(eid-amr ${M_LIBRARY}) -add_test(eid-amr ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/eid-amr test_data/bin_bst.src test_data/bf06.g192 bin_bst06.proc) +add_test(eid-amr1 ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/eid-amr test_data/bst475.amr test_data/bf03.g192 test_data/bst475_bf03.tst) +add_test(eid-amr2 ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/eid-amr test_data/bst122.amr test_data/bf06.g192 test_data/bst122_bf06.tst) + +add_test(eid-amr-verify1 ${CMAKE_COMMAND} -E compare_files test_data/bst475_bf03.amr test_data/bst475_bf03.tst) +add_test(eid-amr-verify2 ${CMAKE_COMMAND} -E compare_files test_data/bst122_bf06.amr test_data/bst122_bf06.tst) diff --git a/src/fir/CMakeLists.txt b/src/fir/CMakeLists.txt index b064f32e..dac0f398 100644 --- a/src/fir/CMakeLists.txt +++ b/src/fir/CMakeLists.txt @@ -165,3 +165,15 @@ add_test(filter26-verify ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/signal-diff -q test_d add_test(filter27 ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/filter -q 5kbp test_data/test.src test_data/test5kbp.flt) add_test(filter27-verify ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/signal-diff -q test_data/test5kbp.flt test_data/test5kbp.ref) + +add_test(filter28 ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/filter -q SHQ2 test_data/test.src test_data/test-shq2.flt) +add_test(filter28-verify ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/signal-diff -q test_data/tst-shq2.flt test_data/tst-shq2.ref) + +add_test(filter29 ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/filter -q SHQ3 test_data/test.src test_data/test-shq3.flt) +add_test(filter29-verify ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/signal-diff -q test_data/test-shq3.flt test_data/tst-shq3.ref) + +add_test(filter30 ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/filter -q HP50_32KHZ test_data/test.src test_data/test-hp50-32khz.flt) +add_test(filter30-verify ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/signal-diff -q test_data/test-hp50-32khz.flt test_data/test-hp50-32khz.ref) + +add_test(filter31 ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/filter -q HP50_48KHZ test_data/test.src test_data/test-hp50-48khz.flt) +add_test(filter31-verify ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/signal-diff -q test_data/test-hp50-48khz.flt test_data/test-hp50-48khz.ref) diff --git a/src/fir/filter.c b/src/fir/filter.c index dbce4bdd..c22d6a25 100644 --- a/src/fir/filter.c +++ b/src/fir/filter.c @@ -44,41 +44,43 @@ Valid filter specifications: Flt_type Description - IRS8 (regular) IRS weighting with factor 1:1 at 8kHz - IRS16 (regular or modified) IRS weighting with factor 1:1 at 16kHz - IRS48 (modified) IRS weighting with factor 1:1 at 48kHz - HIRS16 Half-tilt IRS weighting for data sampled at 16kHz, factor 1:1 - TIRS IRS weighting with TIA coefficients, sf=8kHz, factor 1:1 - DSM Delta-SM filtering characteristic, 1:1 - PSO Psophometric wheighting filter, 1:1 - HQ2 FIR (High quality) low-pass with factor 1:2 (up) or 2:1 (down) - HQ3 FIR (High quality) low-pass with factor 1:3 (up) or 3:1 (down) - SHQ2 FIR (Super High quality) low-pass with factor 1:2 (up) or 2:1 (down) (729 coefs) - SHQ3 FIR (Super High quality) low-pass with factor 1:3 (up) or 3:1 (down) (729 coefs) - FLAT Linear-phase pass-band with factor 1:2 (up) or 2:1 (down) - FLAT1 Linear-phase pass-band with factor 1:1 (no rate change) - PCM Standard IIR PCM quality factor 1:2 (up) or 2:1 (down) - PCM1 Standard PCM quality with factor 1:1 at 16 kHz - GSM1 GSM Mobile station input response w/ factor 1:1 at 16 kHz - P341 Send-part weighting of ITU-T Rec.P.341 (Wideband telephones) - DC Direct-form DC-removal IIR filter (factor 1:1) - IFLAT Flat IIR low-pass with factor 1:3 (up) or 3:1 (down) using a - cascade structure - 5KBP 50-5000 Hz Flat bandpass FIR filter for fs=16kHz, 1:1 - 100_5KBP 100-5000 Hz Flat bandpass FIR filter for fs=16kHz, 1:1 - 14KBP 50-14000 Hz Flat bandpass FIR filter for fs=32kHz, 1:1 - 20KBP 20-20000 Hz Flat bandpass FIR filter for fs=48kHz, 1:1 (non-linear phase in HP-design) - LP1p5 low-pass filter with cut-off frequency 1.5kHz for fs=48kHz, 1:1 - LP35 low-pass filter with cut-off frequency 3.5kHz for fs=48kHz, 1:1 - LP7 low-pass filter with cut-off frequency 7kHz for fs=48kHz, 1:1 - LP10 low-pass filter with cut-off frequency 10kHz for fs=48kHz, 1:1 - // FILTER_12k48k_HW - LP12 low-pass filter with cut-off frequency 12kHz for fs=48kHz, 1:1 - // FILTER_12k48k_HW - LP14 low-pass filter with cut-off frequency 14kHz for fs=48kHz, 1:1 - LP20 low-pass filter with cut-off frequency 20kHz for fs=48kHz, 1:1 - RXIRS8 Receive-side Modified IRS weighting with factor 1:1 at 8kHz - RXIRS16 Receive-side Modified IRS weighting with factor 1:1 at 16kHz + IRS8 (regular) IRS weighting with factor 1:1 at 8kHz + IRS16 (regular or modified) IRS weighting with factor 1:1 at 16kHz + IRS48 (modified) IRS weighting with factor 1:1 at 48kHz + HIRS16 Half-tilt IRS weighting for data sampled at 16kHz, factor 1:1 + TIRS IRS weighting with TIA coefficients, sf=8kHz, factor 1:1 + DSM Delta-SM filtering characteristic, 1:1 + PSO Psophometric wheighting filter, 1:1 + HQ2 FIR (High quality) low-pass with factor 1:2 (up) or 2:1 (down) + HQ3 FIR (High quality) low-pass with factor 1:3 (up) or 3:1 (down) + SHQ2 FIR (Super High quality) low-pass with factor 1:2 (up) or 2:1 (down) (729 coefs) + SHQ3 FIR (Super High quality) low-pass with factor 1:3 (up) or 3:1 (down) (729 coefs) + FLAT Linear-phase pass-band with factor 1:2 (up) or 2:1 (down) + FLAT1 Linear-phase pass-band with factor 1:1 (no rate change) + PCM Standard IIR PCM quality factor 1:2 (up) or 2:1 (down) + PCM1 Standard PCM quality with factor 1:1 at 16 kHz + GSM1 GSM Mobile station input response w/ factor 1:1 at 16 kHz + P341 Send-part weighting of ITU-T Rec.P.341 (Wideband telephones) + DC Direct-form DC-removal IIR filter (factor 1:1) + IFLAT Flat IIR low-pass with factor 1:3 (up) or 3:1 (down) using a + cascade structure + 5KBP 50-5000 Hz Flat bandpass FIR filter for fs=16kHz, 1:1 + 100_5KBP 100-5000 Hz Flat bandpass FIR filter for fs=16kHz, 1:1 + 14KBP 50-14000 Hz Flat bandpass FIR filter for fs=32kHz, 1:1 + 20KBP 20-20000 Hz Flat bandpass FIR filter for fs=48kHz, 1:1 (non-linear phase in HP-design) + LP1p5 low-pass filter with cut-off frequency 1.5kHz for fs=48kHz, 1:1 + LP35 low-pass filter with cut-off frequency 3.5kHz for fs=48kHz, 1:1 + LP7 low-pass filter with cut-off frequency 7kHz for fs=48kHz, 1:1 + LP10 low-pass filter with cut-off frequency 10kHz for fs=48kHz, 1:1 + LP12 low-pass filter with cut-off frequency 12kHz for fs=48kHz, 1:1 + LP14 low-pass filter with cut-off frequency 14kHz for fs=48kHz, 1:1 + LP20 low-pass filter with cut-off frequency 20kHz for fs=48kHz, 1:1 + RXIRS8 Receive-side Modified IRS weighting with factor 1:1 at 8kHz + RXIRS16 Receive-side Modified IRS weighting with factor 1:1 at 16kHz + HP50_32KHZ 50 Hz highpass FIR filter w/ factor 1:1 at sf=32kHz, 1119 coefs\n"); + HP50_48KHZ 50 Hz highpass FIR filter w/ factor 1:1 at sf=48kHz, 1679 coefs\n"); + SHQ2 FIR (Super High quality : 729 coefs, -80dB) low-pass for factor 1:2 (up) or 2:1(down)\n"); + SHQ3 FIR (Super High quality : 729 coefs, -80dB) low-pass for factor 1:3 (up) or 3:1(down)\n"); Testing: @@ -262,41 +264,41 @@ void display_usage () { printf ("\n"); printf (" Valid filter specifications:\n"); printf (" Flt_type Description\n"); - printf (" IRS8 (regular) IRS weighting with factor 1:1 at 8kHz\n"); - printf (" IRS16 (regular or modified) IRS weighting with factor 1:1 at 16kHz\n"); - printf (" IRS48 (modified) IRS weighting with factor 1:1 at 48kHz\n"); - printf (" RXIRS8 Receive-side Modified IRS weighting with factor 1:1 at 8kHz\n"); - printf (" RXIRS16 Receive-side Modified IRS weighting with factor 1:1 at 16kHz\n"); - printf (" HIRS16 Half-tilt IRS weighting, sf=16kHz, factor 1:1.\n"); - printf (" TIRS IRS weighting w/ TIA coefficients, sf=8kHz, factor 1:1.\n"); - printf (" DSM Delta-SM filtering characteristic, 1:1\n"); - printf (" PSO Psophometric wheighting filter, 1:1\n"); - printf (" HQ2 FIR (High quality) low-pass for factor 1:2 (up) or 2:1(down)\n"); - printf (" HQ3 FIR (High quality) low-pass for factor 1:3 (up) or 3:1(down)\n"); - printf (" FLAT Linear-phase passband w/ factor 1:2 (up) or 2:1 (down)\n"); - printf (" FLAT1 Linear-phase pass-band FIR w/ factor 1:1 (no rate change)\n"); - printf (" PCM Standard IIR PCM quality factor 1:2 (up) or 2:1 (down)\n"); - printf (" PCM1 Standard PCM quality with factor 1:1 at 16 kHz\n"); - printf (" GSM1 GSM Mobile station input FIR w/ factor 1:1 at 16 kHz\n"); - printf (" MSIN Same as GSM1\n"); - printf (" P341 P.341 send-mask FIR with factor 1:1 at 16 kHz\n"); - printf (" DC Direct-form DC-removal IIR filter (factor 1:1)\n"); - printf (" IFLAT Cascade-form IIR flat low-pass with factor 1:3 (up) or 3:1 (down)\n"); - printf (" 5KBP 50-5k Hz Flat bandpass FIR filter w/ factor 1:1 at sf=16kHz\n"); - printf (" 100_5KBP 100-5k Hz Flat bandpass FIR filter w/ factor 1:1 at sf=16kHz\n"); - printf (" 14KBP 50-14k Hz Flat bandpass FIR filter w/ factor 1:1 at sf=32kHz\n"); - printf (" 20KBP 20-20k Hz Flat bandpass FIR filter w/ factor 1:1 at sf=48kHz\n"); - printf (" LP1p5 1.5kHz low-pass filter for fs=48kHz, w/ factor 1:1\n"); - printf (" LP35 3.5kHz low-pass filter for fs=48kHz, w/ factor 1:1\n"); - printf (" LP7 7kHz low-pass filter for fs=48kHz, w/ factor 1:1\n"); - printf (" LP10 10kHz low-pass filter for fs=48kHz, w/ factor 1:1\n"); - printf (" LP12 12kHz low-pass filter for fs=48kHz, w/ factor 1:1\n"); - printf (" LP14 14kHz low-pass filter for fs=48kHz, w/ factor 1:1\n"); - printf (" LP20 20kHz low-pass filter for fs=48kHz, w/ factor 1:1\n\n"); - printf ((" HP50_32KHZ 50 Hz highpass FIR filter w/ factor 1:1 at sf=32kHz, 1119 coefs\n")); - printf ((" HP50_48KHZ 50 Hz highpass FIR filter w/ factor 1:1 at sf=48kHz, 1679 coefs\n")); - printf ((" SHQ2 FIR (Super High quality : 729 coefs, -80dB) low-pass for factor 1:2 (up) or 2:1(down)\n")); - printf ((" SHQ3 FIR (Super High quality : 729 coefs, -80dB) low-pass for factor 1:3 (up) or 3:1(down)\n")); + printf (" IRS8 (regular) IRS weighting with factor 1:1 at 8kHz\n"); + printf (" IRS16 (regular or modified) IRS weighting with factor 1:1 at 16kHz\n"); + printf (" IRS48 (modified) IRS weighting with factor 1:1 at 48kHz\n"); + printf (" RXIRS8 Receive-side Modified IRS weighting with factor 1:1 at 8kHz\n"); + printf (" RXIRS16 Receive-side Modified IRS weighting with factor 1:1 at 16kHz\n"); + printf (" HIRS16 Half-tilt IRS weighting, sf=16kHz, factor 1:1.\n"); + printf (" TIRS IRS weighting w/ TIA coefficients, sf=8kHz, factor 1:1.\n"); + printf (" DSM Delta-SM filtering characteristic, 1:1\n"); + printf (" PSO Psophometric wheighting filter, 1:1\n"); + printf (" HQ2 FIR (High quality) low-pass for factor 1:2 (up) or 2:1(down)\n"); + printf (" HQ3 FIR (High quality) low-pass for factor 1:3 (up) or 3:1(down)\n"); + printf (" FLAT Linear-phase passband w/ factor 1:2 (up) or 2:1 (down)\n"); + printf (" FLAT1 Linear-phase pass-band FIR w/ factor 1:1 (no rate change)\n"); + printf (" PCM Standard IIR PCM quality factor 1:2 (up) or 2:1 (down)\n"); + printf (" PCM1 Standard PCM quality with factor 1:1 at 16 kHz\n"); + printf (" GSM1 GSM Mobile station input FIR w/ factor 1:1 at 16 kHz\n"); + printf (" MSIN Same as GSM1\n"); + printf (" P341 P.341 send-mask FIR with factor 1:1 at 16 kHz\n"); + printf (" DC Direct-form DC-removal IIR filter (factor 1:1)\n"); + printf (" IFLAT Cascade-form IIR flat low-pass with factor 1:3 (up) or 3:1 (down)\n"); + printf (" 5KBP 50-5k Hz Flat bandpass FIR filter w/ factor 1:1 at sf=16kHz\n"); + printf (" 100_5KBP 100-5k Hz Flat bandpass FIR filter w/ factor 1:1 at sf=16kHz\n"); + printf (" 14KBP 50-14k Hz Flat bandpass FIR filter w/ factor 1:1 at sf=32kHz\n"); + printf (" 20KBP 20-20k Hz Flat bandpass FIR filter w/ factor 1:1 at sf=48kHz\n"); + printf (" LP1p5 1.5kHz low-pass filter for fs=48kHz, w/ factor 1:1\n"); + printf (" LP35 3.5kHz low-pass filter for fs=48kHz, w/ factor 1:1\n"); + printf (" LP7 7kHz low-pass filter for fs=48kHz, w/ factor 1:1\n"); + printf (" LP10 10kHz low-pass filter for fs=48kHz, w/ factor 1:1\n"); + printf (" LP12 12kHz low-pass filter for fs=48kHz, w/ factor 1:1\n"); + printf (" LP14 14kHz low-pass filter for fs=48kHz, w/ factor 1:1\n"); + printf (" LP20 20kHz low-pass filter for fs=48kHz, w/ factor 1:1\n"); + printf (" HP50_32KHZ 50 Hz highpass FIR filter w/ factor 1:1 at sf=32kHz, 1119 coefs\n"); + printf (" HP50_48KHZ 50 Hz highpass FIR filter w/ factor 1:1 at sf=48kHz, 1679 coefs\n"); + printf (" SHQ2 FIR (Super High quality : 729 coefs, -80dB) low-pass for factor 1:2 (up) or 2:1(down)\n"); + printf (" SHQ3 FIR (Super High quality : 729 coefs, -80dB) low-pass for factor 1:3 (up) or 3:1(down)\n\n"); /* Quit program */ exit (-128); diff --git a/src/fir/test_data/test-hp50-32khz.ref b/src/fir/test_data/test-hp50-32khz.ref new file mode 100644 index 0000000000000000000000000000000000000000..7332c52312161b826a3b00f6b2090221355d80e4 GIT binary patch literal 15360 zcmW+-1#}Zz*PXb#w`r5q-HjFsE$;5}kcU5<4|j)$ySv+?xD;tAg%;{=Ng8)|n?LJc zS;?ANbI(5e?6dD(YvxV@pa3WWxBw2Q0t)~X@B-WgTm++mt6)5^3)Fx-;0`ze5Q9`; zHxL25236oD;3^;jBLPlu^fX`{7z;!KF7PLK9jFJhfC<27@DA7qmC#|I;NKpnUh7!UjghXB<81CW3?pd8#BygCd> z3XZ-AI>1+8WiWyO2*D`e3n&D41A~D70hJ&czyKh)54a9Of|ZO6qHhIk;0s_5zyh#A zZgYS>z@1=}2Yd<60w6#y*bGhw9t63j0mVQbun5QuGN=RTKmyY9()99K}3*e2yh&H9^_UTtPcb5 zgJ(c+)OT=uFiTRft_Q&in89pGfCu~o_JWPUxFJE!;(;dcJ(vw-1vPdDGlAemAPSfS zw1YQ6d+>7)bc3(K&tNg21xEu5z_sA^V007sFBlQz`3AfSo&cpmPD{Ye!QMpxM}jph z0|4L>=ml2>nY{!bg7_e!F?dxBt_41TKft3wOfl#L4Z+weAOZLnd=k`h4R8>Y2Rrs5 zsK^*V3GN2tg8F>|7Y8xO!EUb#=7x0GEI#!Ck>Bjs`2=8Ptje@PZw$1%o4wz{g-N@L%u<4}=C+ zg1*2LU<}X(rV|T7FXG5>m})uuB;~Hm1Hx|)U$LcVsQNeUZ+@Bh-_{Gv(J@Ei_X8@zTM?lS z6kY|#c=thTX+Jjl1()_G-SuAz&H~leB;j@pIY&}*7M*u zbRLcXUJy-%h4vac&p6f4O2ZfY_xin}@wR476@4q}IeB!`F*uykM>DezGxa;;J#I-4 zBIY)JmSP689*ENW9Cu6`y;mdLF)@s*CX8Gd>f@LwuK*!(4{YinDdlp^EOTh*n*bru z*}WKYQFdMRQIPK&7*kqKtDaon?b%`vX~VNm+2(7!qMWX4paW<4J)jvCmc|{@HLmSO zK@kxxEyEWyJfV~uZfjZ?7T#t|EWZbOZop9UUA9DN*bY1hU5pyc8_+#pCN+#ek5;_(p4WUcZBPuu z-jl?@zj{j>7ejr*A+dG6Q{9xPwcMGIweZ?xWykOYfL5Py*LTS=r}y2TNwCJKqO2vh zbsY-)M(@i6D-jW{75{5pFT40{AAUjDXVWF@cdH$|;ohJ6KZDHwQ8JDCfOZ#vVl~nn z_1IstFkr}k**h4mO0jDuf~!ZOf4sO(Eo4{xI>7v&VuE!KX$EyMr=7k=Z?G{7nw&ML zr_#g^MA0+kZ(cL(M*U9APG~W2KL0y=a?6W`MZ}QKISDbGR@yz&KVHbdxpE}1&_GSH za?au2+W&TaD_BwIz_0MU$3GM_GU5^QC9kXq{p)(S#qJX6Jz96l*R-i56k##yHkgry zM-R&rP{1g2_brwv%;%b8Im-VZ`)5j9Xr*uw=d<;_`UYekb)PO$e-Je_ek5)K;;tvj zOhFz{ee$(9aH3nmRre)^-?rAiD}V!5CBV{(A(QMUv8GNA1d9S)^oaL0=XxIF9*7@c z=ZW9EdCy#KKVr&D+faojqzLxghSjN|K7%e@zeZku)(^otedH95x4V7_sGQJ zzzH$}Rjv4&vXDk$()I74U*3;V z5-%QyS(5ll62<*hDKVU*Z6}JcQ@pS2ZvY&PO8BfMQ9r}SBp$8FLDT3z69-e5U~Xxc zUxzAA(Dw`s?VaIs#JX?vgAaA1@J5QkF5e=-9MnrO|)n>dPSkyLxwDb1-d=1LwI{myOuY z=)lzmMoROnUFx6OiS%!&!@`mypN5@J$BYF=dRx``}mO^eXX_cxf zP)D3CktZeB;s$czj7y}+3<&k4_G!v-OMiK+Ps^*Ku91g58+2KzD<)C z5(k4nItMZTcyl69&5o{Sd5tv;aYJyD{5ov79u~%+P9j5*3N0k;2`qzn3b`3vEd+JL z<0$_7TAV9mzyMvMHIfo8YG_^L^jRjE1~x-hw8QMCJQ}QXPfUj(O}Wyy-vs-wO?L>^ zQP_!|GbzX5z>l+4g{DAODO&5_C|0NwjWywIxER(izd2VC*iN~S86EX+CLVhlJZF3w zOC~&uTghT03MWmf+a#KZNetU%>Vn>gD^>qhUJj3q!YB8E>%NdR4e}4zjfPhBF;j#S z<2fKHk@0ay75&|I;%{IDjlfuEc4H>1^_Uy&P2Q>6pCN^oQz3V~8^8YWg^~9%2jKj9uS$hCj~zi$m$M)J2=Sp*M^(6^A_$uN1%sdtJN-Mo_6`LC*eDl!|l_uzK3d| z(~$=&C&kB6KU+F5m(llld64-bLwr>Ce_92W0d|PC1^i5wcxScNF+*YT^|7B;Z3p;@ zsmL!TKH{7un%fHruvW)&QBYiE+`DEHl0@h$^F~hPt?<*xgC(ra{ZL<6oB084TQN_w zNF%iEH;2%s1&nM8UkLvU^g&MsU3#^cuRo1VlFZD%{ham^L&P0C*B&4m-&+SFFMxoWE0S$~%4!&}xI`8{kkdfTgxg%n# zH7~g%964|hl|T*?R-pH*_Gu1>a089f!Cy=exNgY%C#Xv_hzpT7jI%GI+dpdJ#QG(n z1DYD;*YQVt29xa_tA3a*U4$YjJ$X{`bjVKpfasbZ%hbCVFHl~KN`6WGuL<-nw^!M! z_|t2Sr9P%#VHmK5(&3)b-U6S=+{GDW02Bl=Jvzj*iM^>`f6TnEhl%N(o&42;EACmW z7e8b=ilW&=cfB=D@cj+@1w7<$RkbUg2nV;C2&?L9{Y#NgZP#=7DwMx0%N$B}tv7Xa z7FzOac5sVmy^Z?f$6%yqm#~vLO46og#iF|<&IzE`^&4A} zi1BtHlOUL`k0G&P!;Id)H{xc+E{K84+Vq!sornhH0Yx`S<~iRsDAodmL7ZLN(?5uW zF{;QTosPg5-ZyBq^ag5#jz*02oc`58o1l-C&8*8Z{1xybZJKj!lL80$+mJE%Puyu8 zeSMM0uaIwo3d}(E4C}Il=&ZNU>E8A6Zz5Et4am!)3xxdGBe1_d!8FqeJm($KKQvct zGWbG(oq?pWA!+`Hb>TVZE?r(X+=XyH5h zKmBH2u32Q>odbieL!JFlXfA|Z?>E{u&wm#*=ytoq5eM7y&`|rhz&+gf zs1q;a9Wt&UCaWj3`C&i|&vmE@CPl;B2!u5<)OFmKT&FGntnuc20`VAP2U68q4uoYz#JoX*#`p|Ys3WOVE(9wjmykRCy%7C`iPATe#gXO-!JLO<=?x8ojXP}(ooxaWHw}SK!MLZ1V zN@|X_9V-HJ4O^s5-g?el?8%<(pAFRIz!qqHCLFa1+|v6;rcww6Ze%?>1bz<{$ShTl zPn}yZ4DaQ2|9)=S|FN`lXCgwC5vN#w%g++jw!gFf!=6w#B5LfLbJ`ow3eS{Y1g)T4 zXdO$frzgoL^|)~T6DLD5a|Rf;A%W&KEkbi-(_!8djWXS!HWJIxX)(hk?-Aw&d!ifIy-kWJAIqTE5g%ZJ~{ZMC0A zp6sc7^IRr}vi{gH>$-EAriOfn&!)b{A8h5y3k)NaL*z{VFY`- zI8~qP#9q~h$n!29JWqTJ4gYVJVS7jt|7f3-s6L+l)ThR3eMxDw!A-wnS&$f(au10N zTVm+beAYcVVT8R8sRg~(u)lh|a#`Vw)(Bp?9j>|2F|ho-qszZKesY%X_lafCSwIU!q@QILT$veo*DcP^SSok1#M` z(>*a7Srjd6^QXLm4_23{d%Yc4U3{PZ%KRSY zCECll?dW#ONAI5IA(m{4u~*YnT*-($UcC+JA+%Nfk z{%`$BBqt1%EW;!+mH;DZk2p!a33V5lOOZ|L3|baEoW7sM`g&h8+4IXdz|Nz5(QrK1 z0=sT)!i0+R5oB+PnYnzr^$PT5Y4vcNt#{c zi{?lEOOeL{G$R<#<@ZU4;y>}qUD;$IngPE~5IWX?37&Fed32upg?18g1b48a5JgP- zgx)J%tY2aqHQ^R#pKua-Kj{x^A^QaIFF&8O&^6C`(cavh9vIg@hGnjP)LIq!&{!9G z#$LsJEGZ;!qW#YkWexGo#3zYaZC?UYoPJuC`4Rg(tP@*e-6PL&+UQ{(jAl~TP-k`M zk;tvcZGe`(vNeCp!1QOM&U6 zUCuKIHrX8cls_$LlgESO1&a|Sy38J|cm!r^zw@4SWe<(U z@1wsUWVI$n%u@V9zKGr&-V;;qJQsJAGYZ$Y>6f({sQJP0cX6HKvA{~n5XnpFaNaXc zOa1B&w|_N;ubszwhj}QAB*fBB4}P}_Xi!Oyx&sl5G4Nj>bbXz5y>%@EK$7)vXmkBN z){SZiZGOfdi>YTkItTHl&kn+2ZAo;dbP^W9`!0R|D@VQ!m`STJKNjrO9&aIs@OsXA zwz+T}I;w~;sM?8HcU2TlM89!`kh9=stW?AtUSyvH-$O}uqgp)R2h&pAZb$vsCed;H zTv|zo4-+2WOyjx;^nH<26G!PT!TyS2cS&^-+NBvLk`sK%|DZs^G}3!WVQLt0t8<)Z zL@N?LO0+E`v1{tA^M7g(Vg8RS9&o+okm(UO(c+{fTF%IpLmxpO<^P}*heZ;+ z(iV+8BA|Q=2z8I0X30~(86YUn1(>R9pAV6HLu%#X@N?n`nG4_<+OIHJ?3mK0!hH$} z=E5ju4&t=1$S*OiL*9om$^WA3@TVijMlH5pq<$Nas}U*Y z#*VQX1S7)-hEUP{q+ys5X_hYs`mo#|Nw0gyDw1I{D%h=ML+X@$cvE5vTPK7?G%Bp8 zeNOdR$B&*3&WGJv!dG(@o5{aqoDW^wb?|GWa-?!T{B8RJU#gmJSQCj!O*ZyL{w>*L z*cE@gW@?hv(^MEn9W^l5SrN|H8q8kkF32nWWm7Wp8m||;Zk?|0WE^a#_&ECKE`nRa zyB-}?hC`jy6lDE)65Vx6Om$0!XFKK@$Nfx|AtdSeCqzFoG8|7xV#jwR>jVxrkwqHm zOlUhPj70T7(^IaxIH+Io=;))U3y6(612$QoD`2?xM@N$mP-aS2*)PTa#q0`s7|MfQ zf~q=h^z0Ap29piTEn??0W;?#pyAHm}_92cN-M1w_(#}6s^+tmA%vI4cuDCvT%=`5$ zWL&~sc>(d4YY?~yKVJ=V?hMb5$dO;{nwEE$FsTl&5>!T7%3L={RyNgtEcAx3E2N0A zm^m5Fswe^u;Jp#`iKFPBP%kxA`~e{VZn^(F1Did!_#%7|=`}p2-((mXxd$B$iE_4h zhwIT$o&Sl%L7flz-FuI#NB?zvDZb5PWb%pq90~Sm5!h}=VVJ2a@A<=3u*C#|EazY1ThIVPSEUmtmg<_DfDV z9vUv6n!7S(0OmWN5P97~k-?o4jmPantS?Z1IU6*qoLi8IEkfx?cT5)h=LeG04w!FP zT=CO9he45QkL?(JsfID}qjop1Pq(pqJ@iC-qikj(IUVMScMR|T2>%$;*#MZdbsF%e z`vTzxRFHQB_tP^uG)LkOzZQ4X$=11v;fO1wo%P-MdT@PwQa@Nr4#wbM+nWT9(x)HOGf@nX7y~Wxb&?!ja0kop2)jL!0ucFXu z3|B=2&{tyGOr!ntWTY`}S(_&yt*Y~CncKCT zKDmM8T;BGs^QTWZV5;j*_(@M##PP;J2GYn8`imW@6Y^&IkC)@15oEQmS79qK&JRX3d`RQnfLZd>=(HpNVB zr&>aLNKOciE~;%ULCj5DX?SkPX3ZiA%dLS!9ZZwf@Po6>oymS`J<)Nup_TpVO+O(D zQ>ee)P$Hg+kWvd-0OYat_^H7~8A+ zhC6Ee;(7?b&VDbO!v6I;Pd9^hNI4(purM?@&K+8dtELbN@Fpe+VWIGc+*9fVYPA4hv z#q7}hY=hxLygtee%pF7qVhz=v@`g84edre{9!iLa>{YId&c>EGH%{aw4zm0!@v?Vo z@yTOzmo)us{_g1)snuSh#`9wl4S}nqLE;2`6?BcSFIXRf#->0&Gbb@R@&7A$38I9< zm3{F5?aM&1U@V#&83LQs)MmT@SxJv@tYSShJ(Fj;LhzI}OEMJL-nJe`kID6}3s3MCY+Rrqy;D7Gr_WR_$p+htk6o%}%cA@yQlE%h{h0_)4Yq*7(!!@7G^GPb(QuZ^? zXrDomO{lkQr6>j%| z>c@GnH|w30w=OWpbN|)< zu`-w^ARZ`6W`to)yR9b-WAG~NAr`C4n!&DVLL#WAt)saa5%t>l+!9_GV-2Ps)&}W^ zMDy1;S(M6}9sCEl9sZmoMQIjhp59KhH2$Z(0nT+63wEV?6#Fygs}Hl9i6zm`!gtZ) z&?U8IMcMyC-Z` z&GX*>601Chc>-<7IEwz$J)1qq8lHocOkw?kRkCZl=Qq5w^>P%>n-nQr8M{P0Cvle+ zDvjefL}HMyc@FLl`I?|gKhX36KZ%HPF<>$L9M%FtiPuIx3%o%+sB>Xw^=u7$>zHH9 zdj+jI=CNw8z^vu7IV1RqU`ph^F1>V&fbH`3EvdH>wngrSd9?o-4y#MS?Cuzrt?X^m zOzTF(C=o)~9qmGD9Y>*Ta|ae2IK2OO>UsK3)SB+4*=d?fVlCQ>!G;E0Sw^GnnR!P`Nm|?0Lj&PaEzS=!CE{Ki&2ZN1LL4{!aGZ?s(%0q77f2 zMwB@R%82NRnwf+b+KC_)@qw{P;G<5_DQou=D|#o|mEm`wX%+(y!I+}I$Uf_3#NT&xm1FaU6Iv0Z%zoQfd$(cFUp}3uS37kCn-l z!zico$S6VID9%0lH){&wBF(0 z#I1!~!`6gkQKh2!Dv5DAMS)CBSZx81Xo*=w!$ zEwQGlF83w-3yJq?iYx;Hi=2FKY+DsClXOjR2>ucIpksD;uKjXPbx)hk({={CFX5!C zi&B!O@ZI-zMN))f5o|{xf!F>@n!XP7Ui%Ad@`{vZ4L9O%eiAoszqezEDll z6%o{!Dclxy&9D-ZOC|OQ^mAgqxmp2{@T05<{7n|wPlsm77wBIkZB`<)Vu=xy@$_rn z$FT9FYqq^YmgHnlRP#s1CM3sUZ3v)y8lGzcu%Kakqa3e(2O52pvGO+_82$+VvpR-( zIW{w5w+$OdwZ9m0ptiE7#{EWzMjqux0tx(Mu}^8y$>-peb~WZa3&_P6BE$5k;i;K* zkF!pKkED?;u@DxA#xpQs9;NmpCQWw+vzoqy6$=x)<~2QHj^QoCXZ5*_yY+Dl@vPiQ zPBM-Avp-}jVTo^jSD`jtyZrax@D*+GS+F8{|Gf~osTNJJrYv~XE#O>)G&#_11NhXY zt4cM)Mu^mYE*~H~H26ZvCTbmGOJ08TYj6Lw=~_t7iu&Q2@7&bitFyOvY#2bt{lm*} zeg{hHM?k)Txr8dzGwvbZD%Wj=T{=B*+whICFy=luDY#oj>m7la@2e&382m5&EhPj} zH~b4PQ~e0VDf>@9omlCwf_n0b!j9_Uq?-JfxT?;wg!5b|v_GrW*s5&%^91t1KAktK z=aHF(o5t*4{)@jcu*Xz_n#J6W(V@l?Ul^BTFL+P-@1S0ht;F}J6zvSheO!!blIF9a zIdIoNMh)>?Y3hOdOmY)ay(a)w*fhx>H;V>);+hsufNRuxA>y_x%Cf-xk%%XG1~R29 zD?xo*OullY>Wun5daQ7;X)Ws|a#nO9Cta@ZK7h+b$UXl;Pgz(%!4uh-&K17mi zRS{dE)j83^60XExmnR2YV{NiYs$J0eE!xgX)fjhdp_o;n2xvaS$A_jOAGK#vb?C5q z%djiHLA*Jw6ExA@G2M3p_sk=8yFSN_EAwoINjwKJ3g0~<#uw*UPhJ@9i~8B~JuoIJ z(YM>*g>a|cc3t=FB45=<*k9xmvDn^7B({B- zmnT#8Hjv^N)aHA=2UuUI%UUqdJ3zkROlwGJj%}B7pamK}TKhqXq7W>l>cWC;vC2OV zdmQZF5gg%E%n9Uu(GyC7c4somQQUaXTj5)rctEq@!(DnjVM9x9=%3od$S2I0#$;!{ zsKtNVa~T|s;G?H?{KsgEJgwc$I$ChhJP;CT9AdfgpNqW?7hMy}Kj>i5v7UD1E!=c} zZ|F5+t9O>}hqJ1$2}z-+I$Wsalx|Z8!QVKlr>lw@$rA2ALhBTF|{WIC#_=w7r`(uQja0E_AH_aGzZ&C5e|^3 z=}i2Bp2zqPg+LRqdwDzZduWf~0m!lD8gD^-o^i6{9^|ZhlIxyZ+|yOm>D%jg*Iwc| z-4QG7E5Pc$bi^3cpXkx|1@B^x8?4dIq04&@ra(gqNjni>Z9hevdl|JDe;jjELx2rKewV4C27&KR%;wBn9eOS$ed3x?^vMjxaD`N#XB| z^W zcC)mXL^FTZ06Y1LLC=!z6X!AK`F(9k{wn_Px`6NN?-{H-bBf1}>;fCb! zz3*K=!~L419K_a^o8(Q%w#J`^V(3{rJ93=!ma~BKyEy>=sr{@y-kgn=ARV!6MUC~n z`K@9O`f5yTNDFo-wd!jng@L$OIC}VGfh#b)zL*={5seW6h5cWS8((Qc>rhJw_0i{2 zbkz0uNU^tR{L8So;SJ$7wmr(#sG*rhXs6PnfoFe?IN~X4M1kE$7 zVli}EdZlnsaEG8N!QOgEt5wX5JfJ&_b#_M5MY^Y*=Q)=O%82(u7o?-`I};Z5{4)J) zdxt^l4oK_!ZTVyf&>=ku%O;*olJS2cFJgb%M)o_RXh$COl~q{4MBWViKi!6}39PZ^ zKN45%ChbhMeICd3vNlJA39=@q>cgO)d1DNV8!sh=z ziM~@610i7!fLjw5)OAbunH$Vqx~Uvm$znk>&J|$881di;siWu6ge87m}VEsGv z6t2SZ*Y7i`alkHXFHk`M%`E3kg*dp|`FGP@Ls6$pRu=P*=a9?-|3pp!FWVQvq@H=G zB!o*T#8~j0x_^Fxjt4)?mCfwe4rt_rMubC3rj$2H+k0q8wt1Y$WzK{*@UQo7R;w22hxq5S9V5!)UpeH9C4Vl4$$n1U!;|_ z{Uty`5ki|)7F!}W``Xb^v;b$HxYkjtZ}$&|Zmxqteq^fID6Sm0ul@fT^vr3)TtYyH)`em=ED`qW>{|+O2ot;7XFZ|?RxCesy4Lu zNtW|DUF$O7#&YH=V5DV(o69=o_z?b&X}$F;X(A|26~Z6;-WYaZ$FU0m>hEyqJ>VbB znYJImB|??^bm9?%67i#Jh}0z+C-@#XBaC%ksL}*dAq)Mx8Sv;)nDQnBbVJyaUKPhI zvgV}xj^%vD&m6h{2U1RH1MW+}@UA@sxcOY@t2())+@a5K1_7;fQ5rD!L6 zwJp@!Ah>`(+-`+m^Y_z?55B#ei$6_%@C0E${@wXe3U5l85Y<051 zR+_cQu?KxGbewrMH6D>bnAI|gGz)$}h_z5*yJ>J%I%$Z%-uevKhd%-7Cffsx%SJl` z;o-jLbiX6oJYc9DOAfC?#}mQ`jLvfyR8(j06csZTZx#}6=66#U^G3fOPx|mhYmcoS z8JaCqyHt$tQT5-%8aiG@xd_su_d_NdE9(bhM=`cFM|G{DPm{?h*CMptN1TUK;HX8? zzJ6QUc^k2X7_!YfOzmyCkbrT%!HO;mt~6)$;G}AG-{xYsI~q3z(I%mGRPc zBK5Yz+_e+3DZHllMEMj}5{X978EH!j#O#a9LqOR-1S1-gSwF}y`)GAn-#PA~Rd?D# zw2s*LhKY2IJ1-~W(Osc14&-#Ft{3WCW~VyB{%Uxu-$yyn`W$jYN$MU5hrC!A`bPex z@-jIp)W9iexh!fV|1!-Zw%K-%#@IRIo!+f54%x2=C97W?SYrRokv(TYX{Ht|*6fue#R|SeJJ*xeP z7A;)*zwhl71~X4LU9+#~tNK;H2h3xo1G8DibMEiF`Ga4y9fZE)zZB_B+rWkTOLc$j zFKw4Yq%v89mbOTcJ|eHbHsTPktn+Ea*-WYb?^u(C1N#HoK4oF=g&hVu01qO8m?#TX z+(Vy8kMvMGK-WFX*w_l!I{SdGh1F!vNz#1KA_p^vDg`acQ6(b*Nq z7g}_mQ~2|k{G@nllM^W%mxW}s01VMBO-{&m+sKr4$@-+**p8>{B?bSF z@o|b~Sg%z3Z*+^v>T?@!3147lll~)+R3L`x?yq0fh_;1sF!rsc8Q)h@+aPN!9K^8D za|!oEvBbL}*X>MlZFZ)2wm^Z2Qe)tkal?e|_K8)SJl`ERpoc#en;Gy`UB`0^Icemr zT?-I_UKjuF-KXe@s)MFN-#cEL_hQ-#-6rU;)FukuiBzwOln}q^PvJ|fBT<85(%FwY zSLzNr@9=XX|HOX=+InBOm&O+UF%g$XN1^Yvu0bljcMXdfoi(wDPv%x*Ubgo!=X)E4 zMa_jrrN8YNjAnJ*LVaTtsBSjyjsD!5;s}kfI@$?Qo{1_g{z}RYzDrmDyPgmZmKm8m zg{#Ux)L&#;BRgz7?l=|FpgU*5q@?=Ygl^YG!z~C;I<^54>xzjcwl<8b9Lv5@TGhWk z^PX-ty`y^qufxGXW0A9Sp21I&R(D=R5Pwba66j@uI?f(ZzPFOJLiQ{FiezWPbISzu zCiv1SM)xM^V{RmTBRkwFub%IF{GnNvJ$$qz88i0FDTyjVVci!NxU#hsqr%@urhpK;u>1em%$FMltE5_ugWXrGQ zCx(Q!GhYY8N5Jlo?zao=x2@xJ!ppj<+Pcd6SWuf-fllKum#`IqB584+^1@|V;p4qI=Z!2RNDjL2;~i@e6_Q^&_{l;1L;y!@0XrSsM z`X{_QWfm*OAChoUy;sO}{9CCdFGo!Egp$V4OZ`g!O;)JlF1_Bj_SXS?sby(TCh` zT^cc5z9iI;Fr52Q&sOEyoDRR;;l5vYBCkjiV?Qe+HUA3CgPo(~n1;0`!U2b?a->}H(4zcqLVrpUpV-owQT9eWm>S*uMMut)CYr7q;S&cWrTcL-oUh_pk zaaVhJKICc4Kuvl=OUgU>Mf@z761w!qM!GY5Pj3Zf*7std`veo{7ikuHTKW-=xoiowBBrM8fj?lo zMvOJEQI8Cl1N6=}DcfvR#K^?Pq*Q3|>6310xgA!5xtK~56?w#LhMnDhng1)wDf>HS zyK%9N00Y&lI=9$*tqW`jkJoq8fwVMGWz>GOnQ*b4fujW0q6>JRa8Klx&=Zu`)wh&? z;a~R5CO_3aOFP6KX7^ZF}Mpp;(mYYU}Lu*H6?^(t$w zaj0^>k}S#TE1?atotl4${Tb1~uCMFz{${UXl!bhb%?!_|4+-pR{uKTNeV-8$7Ks6A z*;w(nP1a1)0z{2cZT1VS#r08>e{Qf!qOr2SdK#f8ArukUyE;0JJ0ogdUKbyPk-U>ID0=~Rd;)0SY+jZ!r{)Xw zWkVOSEP@V@=*LY4OcNL$c7Y#Dg2X?WGOaS70oAFMbHO17qd<|%3H$Sf3d5aTe{Ga|M`=V zO)y#)g(n2SGKIgA5@BAMrxLvK+V+DMs1JV z>DDUKnb#FjDk9k(lB2o;vBa$KZ3XZy_R#d-Ls1W_r?UidGx<VZaQ$(3oNv%f4In$aq{c9y>7(s#zy&?&*SWVBGR#62^JNzye*D0M_l# z-AlSwd{wFItRcMMS za&ouo;%rqUm`Nv`XH1WK9=#PuabNU&7EVcwlJ+WRKrZQ*5UTO#DJ?PLG|)Fq^e}v; zSCuRgZx3HnGa-N=zlngeOQUy(R9NzD9N1^_G)rW6YV4wHw3P7ikYcOS>1#6QwU!e3 z-5{kBiU_Z9_9g$Y?TbtA6=D~@#{fC`S2*q2faqR*^IU!e&7I7SZOx@&>dfEgf;(MyWwGyY; z|HQHle;0R#7osa|F`8kXp^*ysPDg9X0#QfXP|4|}zUDEZU!*Uxs#UG1&!nSG5@3bi zI^=KfgUkr_QvGHmHn0mQi1@4K<^U&gOM7{QBS)<}O25t~x!)29=03QBrj1>tth=5W O_y~5YG`{n6$NvFW5k^4( literal 0 HcmV?d00001 diff --git a/src/fir/test_data/test-hp50-48khz.ref b/src/fir/test_data/test-hp50-48khz.ref new file mode 100644 index 0000000000000000000000000000000000000000..e9f78d91ad29c1e4b83b10a7cace8b9ec29b49dc GIT binary patch literal 15360 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

*CC{tt*cB9zuZyCY1_=$-o7Df)2hLzXQ!IFeAO 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 Date: Sun, 31 May 2026 13:57:34 +0200 Subject: [PATCH 03/10] additional updates to documentation --- doc/manual/eid.tex | 12 +++++ doc/manual/graphics/hp50_32khz.pdf | Bin 0 -> 18207 bytes doc/manual/graphics/hp50_48khz.pdf | Bin 0 -> 20041 bytes doc/manual/graphics/shq2_down.pdf | Bin 0 -> 15678 bytes doc/manual/graphics/shq2_up.pdf | Bin 0 -> 25370 bytes doc/manual/graphics/shq3_down.pdf | Bin 0 -> 14494 bytes doc/manual/graphics/shq3_up.pdf | Bin 0 -> 26123 bytes doc/manual/rate.tex | 71 +++++++++++++++++++++++++++-- 8 files changed, 80 insertions(+), 3 deletions(-) create mode 100644 doc/manual/graphics/hp50_32khz.pdf create mode 100644 doc/manual/graphics/hp50_48khz.pdf create mode 100644 doc/manual/graphics/shq2_down.pdf create mode 100644 doc/manual/graphics/shq2_up.pdf create mode 100644 doc/manual/graphics/shq3_down.pdf create mode 100644 doc/manual/graphics/shq3_up.pdf diff --git a/doc/manual/eid.tex b/doc/manual/eid.tex index 8769dbe8..a8d22176 100644 --- a/doc/manual/eid.tex +++ b/doc/manual/eid.tex @@ -7,6 +7,7 @@ % Apr.96 - Peter Kroon % Feb.2000 - Convergence towards STL2000 % Oct.2009 - EID-EV Jonas Svedberg, Yusuke Hiwasaki +% May.2026 - EID-AMR Balazs K๖vesi, St้phane Ragot %============================================================================= %============================================================================= @@ -1341,3 +1342,14 @@ \subsubsection{EID-EV G.192 Output frame examples } \label{fig:G192outputFrameLayer034ErrorIndividual} \end{center} \end{figure} + +%-------------------------------------- +\section {Adaptation for 3GPP AMR codec (EID-AMR)} \label{EID-AMR} +%-------------------------------------- + +An extra tool called EID-AMR provides an Error Insertion Device (EID) capability for the 3GPP AMR codec operating with G.192 error patterns to simulate packet erasures. +The eid-xor tool from ITU-T STL is not directly applicable to AMR bitstreams, because +the bitstream of the 3GPP AMR codec follows a specific ETSI/3GPP format detailed in Clause 6.3 of 3GPP TS 26.073, which is not compliant with ITU-T G.192. +The EID-AMR tool loops over the input error pattern, and replaces bad (lost) frames with a frame type indicating NO\_DATA (of value 0x03) and all data bits forced to zero. +Note that this tool does not handle bit errors. +Statistics are reported as in the eid-xor tool. diff --git a/doc/manual/graphics/hp50_32khz.pdf b/doc/manual/graphics/hp50_32khz.pdf new file mode 100644 index 0000000000000000000000000000000000000000..258616582345f01fc7336488c0811ffb87563477 GIT binary patch literal 18207 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 literal 0 HcmV?d00001 diff --git a/doc/manual/graphics/shq2_up.pdf b/doc/manual/graphics/shq2_up.pdf new file mode 100644 index 0000000000000000000000000000000000000000..9edb29cae87bcc8e44e44e45c89f7d19e24f5134 GIT binary patch literal 25370 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 literal 0 HcmV?d00001 diff --git a/doc/manual/graphics/shq3_down.pdf b/doc/manual/graphics/shq3_down.pdf new file mode 100644 index 0000000000000000000000000000000000000000..afa9310432d7b6b2f9a8119760c4087f57a75a38 GIT binary patch literal 14494 zcmb_@2RN2p+<0a@M)syBlHIdc*?X@fJL|EsDLXSEA;}CSD`b zxf7u<1uJhWXE%E&OxMbu=mkXr1N5QN(h#DnEjSSW(*$KVS8ph4djQNx$J&W#;|;~_ z{8aMwRypQvH3ha+R0cpH z`g%iQYAyf>^51KP@3k7#{3mb_e09PnX*%=^!BGJapmI#9E?K9Dc=X>h$GPort<&k`szf7_n%e`go zO9|q(Fxqr|aaz{FF#dzf@%xGv7qYH*>e*Q`55_$1TKqhl6)-n+bN1}Y%-pxFx#Fka z);~R%Jb9<7xvs^3t>a?clB;)M!0VNlq1`%rd9(KeKRU?baX41#<+_aE=O61D$G0|Q z+-|$M!p^F6-Eb%8n4AnAm&HCgwXpKq>fw<>h*5k?v-H;F z$1UHLql^2;C-?0=osa-59>%UuP@Y}+G%)-@TYPDAY~jHOd-up=LB3bg-hP2&$s3Xq z)Gui2o0}f4JYHD1NG~bf7EbS_t9+m~oUAi*!FTQL`upOM3j^<ZZkNT! zFHcVDbe{;W`#N{xHtbMb@cRa8iqr+jR@2%3*%`+D@iw}oS%yqH?XAnk?5MCHca}PzshD7Msl6m; z2Ug?DveIPVN85+UY;wLHySUdc&_aeL)VC%6q+A;vL$)vF$Bt~08T0y+t#<8Iss+5J?BI2q=HI&!ar2EN^& zeE`kAPw}}5wY*MpBRM?BKa%(0>pXMYlTx#@Rq^rAca1WiN4obe$((HYy0W%Wwl)3n z^TxL?1^Z~LYL05a*%|8-8g5G}ggz(3y_H?^_xnWi7IE!dl1N0ONq@79ikKY#DdAZ; zr90hI3!xzktV`bjlKQT22ECt|TiV)Ok~#ZndMWtho4%7R-&W2~KK^#(&c_g0Hn~oU zi3WelkedDbmrDyyZcUUkJ!`#0!rEb`(<&aEk-&&U)qjz4-KROQC!X&J7x}BT)%SWF z(bU4CF>l9&EN5Eu#3e!vnaqvGGP1(+q};2^1G@(vbXTA$?oGd`+)}O(C%qZK^K{A! zUb0|0?j!Z>y~jMVb@t|`-WILVRMwKQd((UK?O$)i37nz@)~4Zk5_($1SUJiceSN>< z(yOr-4}=!tnXJ|E1m8zJIo-{hUpIm`-(|?0-Q1X*YiZg%KZ^-k-= zmQ#gUhJ7t2l;(n`U#-FXu|eQhkICN-&WUiMMOaj~b?q|~?A zFO$fPS9A=kKf(${@ZW=sLT=t*3LRbFK zF9&mtJYH$2h8Uf-z9>58%YZa;n=!fI(8W{5cRJ0q^kZ!MTX6vFra&w30?7aXKojF1v>*vM64 zZes9_8BY6Fa^xDd!Zi$CsY3mdp{2;vnp_qg<1=Ju^84&8)SBk$0}(knj}F4rLM*Rc zJrzSy&Jv~fT!|!_xshMB&{f{6mM*u}I(5sTYb?)go>pD3lKFmw(R+S)t9*3r{EQ1%XXn7Z=93zN&DpLC_`LloB-%_~r)n(NZ6 z=6OEz#(2F3x#%ZdRE1)gm)A=kv_bY?@Tk2{CW_EG1XH<6^dqsZ>dmjRt8L__2vdVD z_;bY&#`j{X=KAHX44#fv*i*c*DIQSkiDGGxkH0qCE>x*{gx2g!C~A{SM0WhO9Al&8 z_514mQG5{}KD}6@E(p;-NM7$o8at%*IGRD*TsS!xks)wp2seIjT}|&nf5N+3PB=kF z=Ft^;92q4}F#csab>M0P$MYB&-h;O=_xRu3zY@iHjiZlI?5y*-!F6)h&c2XK(Q{i~ zXIh>~vyHHa8eR?SYtINB>9;iKI$DOe&3waDe%E>W3d5AMA*UtYm2&>zN!Ci9@<&)Q zCl`V|t88oyCme~lV-^cF(0(72Zo23iOO

N83HU{DpRFglVDC;0rHhN;XEb2kMJX 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 literal 0 HcmV?d00001 diff --git a/doc/manual/graphics/shq3_up.pdf b/doc/manual/graphics/shq3_up.pdf new file mode 100644 index 0000000000000000000000000000000000000000..0f91b7400a9dc93e9fa51a8520b12ffa5f4aef4b GIT binary patch literal 26123 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

)+YaxAc$6vrsf}XBD&V>-%_{Q1`Cz@AvH^ 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 literal 0 HcmV?d00001 diff --git a/doc/manual/rate.tex b/doc/manual/rate.tex index e3fcf05c..cb35c0a1 100644 --- a/doc/manual/rate.tex +++ b/doc/manual/rate.tex @@ -488,15 +488,17 @@ \section{Implementation} %-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.- \subsection{FIR module} -The frequency responses of the implemented high-quality low-pass +The frequency responses of the implemented high-quality (HQ) low-pass filters are shown in figures \ref{hq-frq-1-2} and \ref{hq-frq-1-3} -(for rate-change factors 2 and 3, respectively), while the telephone +(denoted HQ2 and HQ3 in the command line, for rate-change factors 2 and 3, respectively), while the telephone bandwidth bandpass filter is given in figure \ref{hq-bandpass} (only a rate-change factor of 2 is available). The impulse responses of these filters are given in figures \ref{ir-hq-up}, \ref{ir-hq-down}, and \ref{ir-bandpass}, respectively for the up-sampling filters (factors 2 and 3), for the down-sampling filters (factors 2 and 3), -and for the bandpass filter. +and for the bandpass filter. + +Additional filters (SHQ2 and SHQ3 for super-high-quality for rate-change factors 2 and 3, respectively) with more taps and smaller transition band are also provided; their frequency responses are given in figures \ref{shq-frq-1-2} and \ref{shq-frq-1-3}. The transmit-side IRS filter has been implemented for the ``regular'' and modified flavors. The regular transmit-side P.48 IRS filter @@ -546,6 +548,8 @@ \subsection{FIR module} the same routines are called, while for IRS, band-limiting or MUSHRA anchors, there is no rate-change routine from 16 to 32 kHz. +High-pass filters with 50 Hz cutoff frequency for the 32 and 48 kHz sampling rates (HP50\_32K and HP50\_48K) are also provided. Their frequency response is given in figures \ref{hp50-32k} and \ref{hp50-48k}. + Since the digital filters have memory, state variables are needed. In this version of the STL, a type {\tt SCD\_FIR} is defined, containing the past sample memory, as well as filter coefficients and other control @@ -610,6 +614,47 @@ \subsection{FIR module} \end{figure} %------------- End of FIR filters response: frq for factor 3 ---------------- +%----------- Begin of FIR filters response : frq for factor 2 --------------- +\begin{figure}[hbtp] + \begin{center} + %Both boxes' dimension: 15.24cm x 8.89cm + \includegraphics[scale=0.8]{shq2_up.pdf} + \\ + (a) Super-high-quality filter for up-sampling. + + \includegraphics[scale=0.8]{shq2_down.pdf} + \\ + (b) Super-high-quality filter for down-sampling. + + \end{center} + \caption{\SF Super-high-quality filter responses for a + factor of 2 and sampling rates of 8000 and + 16000 Hz.\label{shq2}} + +\end{figure} +%------------- End of FIR filters response: frq for factor 2 ---------------- + +%----------- Begin of FIR filters response: frq for factor 3 --------------- +\begin{figure}[hbtp] + \begin{center} + %Both boxes' dimension: 15.24cm x 8.89cm + \includegraphics[scale=0.8]{shq3_up.pdf} + \\ + (a) High-quality filter for up-sampling. + + \includegraphics[scale=0.8]{shq3_down.pdf} + \\ + (b) High-quality filter for down-sampling. + + \end{center} + \caption{\SF High-quality filter responses for a + factor of 3 and sampling rates of 8000 and + 24000 Hz.\label{shq3}} + +\end{figure} +%------------- End of FIR filters response: frq for factor 3 ---------------- + + %----------- Begin of FIR filters response: frq for bandpass filter -------- \begin{figure}[hbtp] @@ -1142,6 +1187,26 @@ \subsection{FIR module} } \end{figure} %----- End of FIR filters response: impulse response for LP20 ----- + + +%----------- Begin of FIR filters response : frq for factor 2 --------------- +\begin{figure}[hbtp] + \begin{center} + %Both boxes' dimension: 15.24cm x 8.89cm + \includegraphics{hp50_32khz} + \\ + (a) 50Hz high-pass filter operating at 32 kHz. + + \includegraphics{hp50_48khz} + \\ + (b) 50Hz high-pass filter operating at 32 kHz.. + + \end{center} + \caption{\SF 50Hz high-pass filter responses (32000 and 48000 Hz).\label{hp50}} + +\end{figure} +%------------- End of FIR filters response: frq for factor 2 ---------------- + \flushfloats From c00ff7a75c563816b0baa5f4ca2d46ec21e4676c Mon Sep 17 00:00:00 2001 From: Ludovic Malfait Date: Tue, 2 Jun 2026 17:23:34 +0100 Subject: [PATCH 04/10] Integrate eid-amr into src/eid/ with softbit (from PR #188) EID for 3GPP AMR codec using G.192 frame erasure patterns. Originally by Balazs Kovesi & Stephane Ragot (Orange SA), from 3GPP S4-120998. Changes vs original PR: - Moved from src/eid-amr/ into src/eid/ (groups all EID tools) - Links softbit.c and uses read_g192() instead of raw fread - Uses ugstdemo.h RB/WB macros for portable binary file open - Uses G192_FER/G192_SYNC constants instead of magic numbers - Added ITU-T GPL license header - Fixed printf format: %ld for long counters - Division-by-zero guard on empty input - Better error message on invalid pattern value - No change to root CMakeLists.txt (already has src/eid) --- src/eid/CMakeLists.txt | 14 ++++ src/eid/eid-amr.c | 107 ++++++++++++++++++++++++++++++ src/eid/test_data/bf03.g192 | 1 + src/eid/test_data/bf06.g192 | 1 + src/eid/test_data/bst122.amr | Bin 0 -> 152000 bytes src/eid/test_data/bst122_bf06.amr | Bin 0 -> 152000 bytes src/eid/test_data/bst475.amr | Bin 0 -> 152000 bytes src/eid/test_data/bst475_bf03.amr | Bin 0 -> 152000 bytes 8 files changed, 123 insertions(+) create mode 100644 src/eid/eid-amr.c create mode 100644 src/eid/test_data/bf03.g192 create mode 100644 src/eid/test_data/bf06.g192 create mode 100644 src/eid/test_data/bst122.amr create mode 100644 src/eid/test_data/bst122_bf06.amr create mode 100644 src/eid/test_data/bst475.amr create mode 100644 src/eid/test_data/bst475_bf03.amr diff --git a/src/eid/CMakeLists.txt b/src/eid/CMakeLists.txt index a83eb223..7cbdd19f 100644 --- a/src/eid/CMakeLists.txt +++ b/src/eid/CMakeLists.txt @@ -103,3 +103,17 @@ add_test(eid-xor ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/eid-xor -fer -bs bit -ep g192 add_test(eid-xor ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/eid-xor -fer -bs bit -ep byte test_data/zero.src test_data/epf05g10.byt test_data/z_f05g10.bby) add_test(eid-xor ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/eid-xor -fer -bs bit -ep bit test_data/zero.src test_data/epf05g10.bit test_data/z_f05g10.bbi) + +#--- eid-amr: EID for 3GPP AMR codec (from 3GPP S4-120998) +add_executable(eid-amr eid-amr.c softbit.c) +target_link_libraries(eid-amr ${M_LIBRARY}) + +add_test(eid-amr1 ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/eid-amr + test_data/bst475.amr test_data/bf03.g192 test_data/bst475_bf03.tst) +add_test(eid-amr1-verify ${CMAKE_COMMAND} -E compare_files + test_data/bst475_bf03.amr test_data/bst475_bf03.tst) + +add_test(eid-amr2 ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/eid-amr + test_data/bst122.amr test_data/bf06.g192 test_data/bst122_bf06.tst) +add_test(eid-amr2-verify ${CMAKE_COMMAND} -E compare_files + test_data/bst122_bf06.amr test_data/bst122_bf06.tst) diff --git a/src/eid/eid-amr.c b/src/eid/eid-amr.c new file mode 100644 index 00000000..6b9d3094 --- /dev/null +++ b/src/eid/eid-amr.c @@ -0,0 +1,107 @@ +/* + eid-amr.c + + EID for AMR using G.192 error pattern of frame erasures. + This tool is based on the eid-3g tool written by Nobuhiko Naka, NTT DOCOMO + (see: http://www.3gpp.org/ftp/tsg_sa/WG4_CODEC/AMR-NB_3G-Characterization/EID_Error_Patterns/) + + Modifications: + - using G.192 error pattern for frame erasures + - only frame erasures (no bit errors) + - no position parameter to skip frames (usage similar to ITU-T STL eid-xor tool) + - all data bits in a lost frame are forced to a value of 0 + - statistics reported to stderr at the end of processing + - uses softbit.c read_g192() for error pattern reading + + NOTES: + A lost frame in DTX on/off is signalled with a frame type code 0x03, + independently from the TX or RX frame type. + + Contact: + Balazs Kovesi, Stephane Ragot + ORANGE SA + firstname.lastname@orange.com + + =============================================================== + COPYRIGHT NOTE: This source code, and all of its derivations, + is subject to the "ITU-T General Public License". Please have + it read in the distribution disk, or in the ITU-T Recommendation + G.191 on "SOFTWARE TOOLS FOR SPEECH AND AUDIO CODING STANDARDS". + See LICENSE.md in the top-level directory for terms. + =============================================================== +*/ + +#include +#include +#include +#include "ugstdemo.h" +#include "softbit.h" + +#define MAX_SERIAL 244 +#define SERIAL_FRAMESIZE (1 + MAX_SERIAL + 5) + +int main(int argc, char *argv[]) { + short spch[SERIAL_FRAMESIZE]; + short epat; + + FILE *fsp, *fep, *fwe; + + long frame, fercnt, wrapcnt; + int i; + + if (argc != 4) { + fprintf(stderr, "eid-amr: EID for 3GPP AMR codec using G.192 frame erasure patterns\n\n"); + fprintf(stderr, "Usage: eid-amr \n"); + exit(1); + } + + if ((fsp = fopen(argv[1], RB)) == NULL) { perror(argv[1]); exit(1); } + if ((fep = fopen(argv[2], RB)) == NULL) { perror(argv[2]); exit(1); } + if ((fwe = fopen(argv[3], WB)) == NULL) { perror(argv[3]); exit(1); } + + frame = 0; + fercnt = 0; + wrapcnt = 0; + + while (fread(spch, sizeof(short), SERIAL_FRAMESIZE, fsp) == SERIAL_FRAMESIZE) { + /* Read one erasure flag from G.192 error pattern */ + if (read_g192(&epat, 1, fep) != 1) { + fseek(fep, 0L, SEEK_SET); + fprintf(stderr, "Warning: Error pattern file shorter than speech file\n--> wrap error pattern file\n"); + wrapcnt++; + if (read_g192(&epat, 1, fep) != 1) { + fprintf(stderr, "Error: Error pattern file read failure\n"); + exit(1); + } + } + + if (epat == G192_FER) { + spch[0] = 0x03; /* NO_DATA frame type */ + fercnt++; + for (i = 0; i < MAX_SERIAL; i++) { + spch[i + 1] = 0; /* erase bits in bad frame (force value of 0) */ + } + } else if (epat != G192_SYNC) { + fprintf(stderr, "Error: invalid pattern value 0x%04X at frame %ld\n", (unsigned short)epat, frame); + exit(1); + } + + fwrite(spch, sizeof(short), SERIAL_FRAMESIZE, fwe); + frame++; + } + + fclose(fsp); + fclose(fep); + fclose(fwe); + + fprintf(stderr, "_Input bit stream file ..................: %s\n", argv[1]); + fprintf(stderr, "_Error pattern file .....................: %s\n", argv[2]); + fprintf(stderr, "_Output bit stream file .................: %s\n", argv[3]); + fprintf(stderr, "# Error pattern files wrapped ...........: %ld times\n", wrapcnt); + fprintf(stderr, "# Processed frames ..................... : %ld\n", frame); + fprintf(stderr, "# Distorted frames ..................... : %ld\n", fercnt); + if (frame > 0) + fprintf(stderr, "# Frame erasure rate ....................: %f %%\n", (100.0 * fercnt) / frame); + + return 0; +} diff --git a/src/eid/test_data/bf03.g192 b/src/eid/test_data/bf03.g192 new file mode 100644 index 00000000..d2449ec4 --- /dev/null +++ b/src/eid/test_data/bf03.g192 @@ -0,0 +1 @@ +!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k \ No newline at end of file diff --git a/src/eid/test_data/bf06.g192 b/src/eid/test_data/bf06.g192 new file mode 100644 index 00000000..999e8ecf --- /dev/null +++ b/src/eid/test_data/bf06.g192 @@ -0,0 +1 @@ +!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k k!k!k!k!k!k!k!k!k k!k!k!k!k k k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k \ No newline at end of file diff --git a/src/eid/test_data/bst122.amr b/src/eid/test_data/bst122.amr new file mode 100644 index 0000000000000000000000000000000000000000..43eb16457ed9a22233123e51d9f1f05e6d5bff6a GIT binary patch literal 152000 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 T+VpyYc8!wC>YxF>@BIG)EW6UI literal 0 HcmV?d00001 diff --git a/src/eid/test_data/bst122_bf06.amr b/src/eid/test_data/bst122_bf06.amr new file mode 100644 index 0000000000000000000000000000000000000000..11097c7fdc51cda47f04822ac219f4817a1883f1 GIT binary patch literal 152000 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 J{e7M(@IUC{g5CfC literal 0 HcmV?d00001 diff --git a/src/eid/test_data/bst475_bf03.amr b/src/eid/test_data/bst475_bf03.amr new file mode 100644 index 0000000000000000000000000000000000000000..4c6e4c70b877661d886e677b5d16cce61716db4f GIT binary patch literal 152000 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 P1_xN*BK>`yDe!**kBNao literal 0 HcmV?d00001 From cda4d73b1e1eb85c57a578c5704901270bdd5fda Mon Sep 17 00:00:00 2001 From: Ludovic Malfait Date: Tue, 2 Jun 2026 17:29:43 +0100 Subject: [PATCH 05/10] Add SHQ2/SHQ3 and HP50 filters to FIR module (from PR #188) - SHQ2/SHQ3: super-high-quality low-pass filters for rate-change factors 2 and 3 - HP50_32KHZ/HP50_48KHZ: 50 Hz high-pass filters at 32 and 48 kHz - Updated filter.c main to support new filter names - Added filter coefficients in fir-flat.c and fir-wb.c - Added CTest cases (filter28-31) with reference outputs - Updated doc/manual/rate.tex with frequency response figures - Added PDF graphics for new filter responses From PR #188 by Stephane Ragot (Orange SA), used in 3GPP SA4 EVS/IVAS. --- doc/manual/graphics/hp50_32khz.pdf | Bin 0 -> 18207 bytes doc/manual/graphics/hp50_48khz.pdf | Bin 0 -> 20041 bytes doc/manual/graphics/shq2_down.pdf | Bin 0 -> 15678 bytes doc/manual/graphics/shq2_up.pdf | Bin 0 -> 25370 bytes doc/manual/graphics/shq3_down.pdf | Bin 0 -> 14494 bytes doc/manual/graphics/shq3_up.pdf | Bin 0 -> 26123 bytes doc/manual/rate.tex | 71 ++- src/fir/CMakeLists.txt | 12 + src/fir/filter.c | 193 ++++--- src/fir/fir-flat.c | 666 +++++++++++++++++++++++ src/fir/fir-wb.c | 736 ++++++++++++++++++++++++++ src/fir/test_data/test-hp50-32khz.ref | Bin 0 -> 15360 bytes src/fir/test_data/test-hp50-48khz.ref | Bin 0 -> 15360 bytes src/fir/test_data/tst-shq2.ref | Bin 0 -> 30720 bytes src/fir/test_data/tst-shq3.ref | Bin 0 -> 5120 bytes 15 files changed, 1598 insertions(+), 80 deletions(-) create mode 100644 doc/manual/graphics/hp50_32khz.pdf create mode 100644 doc/manual/graphics/hp50_48khz.pdf create mode 100644 doc/manual/graphics/shq2_down.pdf create mode 100644 doc/manual/graphics/shq2_up.pdf create mode 100644 doc/manual/graphics/shq3_down.pdf create mode 100644 doc/manual/graphics/shq3_up.pdf create mode 100644 src/fir/test_data/test-hp50-32khz.ref create mode 100644 src/fir/test_data/test-hp50-48khz.ref create mode 100644 src/fir/test_data/tst-shq2.ref create mode 100644 src/fir/test_data/tst-shq3.ref diff --git a/doc/manual/graphics/hp50_32khz.pdf b/doc/manual/graphics/hp50_32khz.pdf new file mode 100644 index 0000000000000000000000000000000000000000..258616582345f01fc7336488c0811ffb87563477 GIT binary patch literal 18207 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 literal 0 HcmV?d00001 diff --git a/doc/manual/graphics/shq2_up.pdf b/doc/manual/graphics/shq2_up.pdf new file mode 100644 index 0000000000000000000000000000000000000000..9edb29cae87bcc8e44e44e45c89f7d19e24f5134 GIT binary patch literal 25370 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 literal 0 HcmV?d00001 diff --git a/doc/manual/graphics/shq3_down.pdf b/doc/manual/graphics/shq3_down.pdf new file mode 100644 index 0000000000000000000000000000000000000000..afa9310432d7b6b2f9a8119760c4087f57a75a38 GIT binary patch literal 14494 zcmb_@2RN2p+<0a@M)syBlHIdc*?X@fJL|EsDLXSEA;}CSD`b zxf7u<1uJhWXE%E&OxMbu=mkXr1N5QN(h#DnEjSSW(*$KVS8ph4djQNx$J&W#;|;~_ z{8aMwRypQvH3ha+R0cpH z`g%iQYAyf>^51KP@3k7#{3mb_e09PnX*%=^!BGJapmI#9E?K9Dc=X>h$GPort<&k`szf7_n%e`go zO9|q(Fxqr|aaz{FF#dzf@%xGv7qYH*>e*Q`55_$1TKqhl6)-n+bN1}Y%-pxFx#Fka z);~R%Jb9<7xvs^3t>a?clB;)M!0VNlq1`%rd9(KeKRU?baX41#<+_aE=O61D$G0|Q z+-|$M!p^F6-Eb%8n4AnAm&HCgwXpKq>fw<>h*5k?v-H;F z$1UHLql^2;C-?0=osa-59>%UuP@Y}+G%)-@TYPDAY~jHOd-up=LB3bg-hP2&$s3Xq z)Gui2o0}f4JYHD1NG~bf7EbS_t9+m~oUAi*!FTQL`upOM3j^<ZZkNT! zFHcVDbe{;W`#N{xHtbMb@cRa8iqr+jR@2%3*%`+D@iw}oS%yqH?XAnk?5MCHca}PzshD7Msl6m; z2Ug?DveIPVN85+UY;wLHySUdc&_aeL)VC%6q+A;vL$)vF$Bt~08T0y+t#<8Iss+5J?BI2q=HI&!ar2EN^& zeE`kAPw}}5wY*MpBRM?BKa%(0>pXMYlTx#@Rq^rAca1WiN4obe$((HYy0W%Wwl)3n z^TxL?1^Z~LYL05a*%|8-8g5G}ggz(3y_H?^_xnWi7IE!dl1N0ONq@79ikKY#DdAZ; zr90hI3!xzktV`bjlKQT22ECt|TiV)Ok~#ZndMWtho4%7R-&W2~KK^#(&c_g0Hn~oU zi3WelkedDbmrDyyZcUUkJ!`#0!rEb`(<&aEk-&&U)qjz4-KROQC!X&J7x}BT)%SWF z(bU4CF>l9&EN5Eu#3e!vnaqvGGP1(+q};2^1G@(vbXTA$?oGd`+)}O(C%qZK^K{A! zUb0|0?j!Z>y~jMVb@t|`-WILVRMwKQd((UK?O$)i37nz@)~4Zk5_($1SUJiceSN>< z(yOr-4}=!tnXJ|E1m8zJIo-{hUpIm`-(|?0-Q1X*YiZg%KZ^-k-= zmQ#gUhJ7t2l;(n`U#-FXu|eQhkICN-&WUiMMOaj~b?q|~?A zFO$fPS9A=kKf(${@ZW=sLT=t*3LRbFK zF9&mtJYH$2h8Uf-z9>58%YZa;n=!fI(8W{5cRJ0q^kZ!MTX6vFra&w30?7aXKojF1v>*vM64 zZes9_8BY6Fa^xDd!Zi$CsY3mdp{2;vnp_qg<1=Ju^84&8)SBk$0}(knj}F4rLM*Rc zJrzSy&Jv~fT!|!_xshMB&{f{6mM*u}I(5sTYb?)go>pD3lKFmw(R+S)t9*3r{EQ1%XXn7Z=93zN&DpLC_`LloB-%_~r)n(NZ6 z=6OEz#(2F3x#%ZdRE1)gm)A=kv_bY?@Tk2{CW_EG1XH<6^dqsZ>dmjRt8L__2vdVD z_;bY&#`j{X=KAHX44#fv*i*c*DIQSkiDGGxkH0qCE>x*{gx2g!C~A{SM0WhO9Al&8 z_514mQG5{}KD}6@E(p;-NM7$o8at%*IGRD*TsS!xks)wp2seIjT}|&nf5N+3PB=kF z=Ft^;92q4}F#csab>M0P$MYB&-h;O=_xRu3zY@iHjiZlI?5y*-!F6)h&c2XK(Q{i~ zXIh>~vyHHa8eR?SYtINB>9;iKI$DOe&3waDe%E>W3d5AMA*UtYm2&>zN!Ci9@<&)Q zCl`V|t88oyCme~lV-^cF(0(72Zo23iOO

N83HU{DpRFglVDC;0rHhN;XEb2kMJX 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 literal 0 HcmV?d00001 diff --git a/doc/manual/graphics/shq3_up.pdf b/doc/manual/graphics/shq3_up.pdf new file mode 100644 index 0000000000000000000000000000000000000000..0f91b7400a9dc93e9fa51a8520b12ffa5f4aef4b GIT binary patch literal 26123 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

)+YaxAc$6vrsf}XBD&V>-%_{Q1`Cz@AvH^ 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 literal 0 HcmV?d00001 diff --git a/doc/manual/rate.tex b/doc/manual/rate.tex index e3fcf05c..cb35c0a1 100644 --- a/doc/manual/rate.tex +++ b/doc/manual/rate.tex @@ -488,15 +488,17 @@ \section{Implementation} %-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.- \subsection{FIR module} -The frequency responses of the implemented high-quality low-pass +The frequency responses of the implemented high-quality (HQ) low-pass filters are shown in figures \ref{hq-frq-1-2} and \ref{hq-frq-1-3} -(for rate-change factors 2 and 3, respectively), while the telephone +(denoted HQ2 and HQ3 in the command line, for rate-change factors 2 and 3, respectively), while the telephone bandwidth bandpass filter is given in figure \ref{hq-bandpass} (only a rate-change factor of 2 is available). The impulse responses of these filters are given in figures \ref{ir-hq-up}, \ref{ir-hq-down}, and \ref{ir-bandpass}, respectively for the up-sampling filters (factors 2 and 3), for the down-sampling filters (factors 2 and 3), -and for the bandpass filter. +and for the bandpass filter. + +Additional filters (SHQ2 and SHQ3 for super-high-quality for rate-change factors 2 and 3, respectively) with more taps and smaller transition band are also provided; their frequency responses are given in figures \ref{shq-frq-1-2} and \ref{shq-frq-1-3}. The transmit-side IRS filter has been implemented for the ``regular'' and modified flavors. The regular transmit-side P.48 IRS filter @@ -546,6 +548,8 @@ \subsection{FIR module} the same routines are called, while for IRS, band-limiting or MUSHRA anchors, there is no rate-change routine from 16 to 32 kHz. +High-pass filters with 50 Hz cutoff frequency for the 32 and 48 kHz sampling rates (HP50\_32K and HP50\_48K) are also provided. Their frequency response is given in figures \ref{hp50-32k} and \ref{hp50-48k}. + Since the digital filters have memory, state variables are needed. In this version of the STL, a type {\tt SCD\_FIR} is defined, containing the past sample memory, as well as filter coefficients and other control @@ -610,6 +614,47 @@ \subsection{FIR module} \end{figure} %------------- End of FIR filters response: frq for factor 3 ---------------- +%----------- Begin of FIR filters response : frq for factor 2 --------------- +\begin{figure}[hbtp] + \begin{center} + %Both boxes' dimension: 15.24cm x 8.89cm + \includegraphics[scale=0.8]{shq2_up.pdf} + \\ + (a) Super-high-quality filter for up-sampling. + + \includegraphics[scale=0.8]{shq2_down.pdf} + \\ + (b) Super-high-quality filter for down-sampling. + + \end{center} + \caption{\SF Super-high-quality filter responses for a + factor of 2 and sampling rates of 8000 and + 16000 Hz.\label{shq2}} + +\end{figure} +%------------- End of FIR filters response: frq for factor 2 ---------------- + +%----------- Begin of FIR filters response: frq for factor 3 --------------- +\begin{figure}[hbtp] + \begin{center} + %Both boxes' dimension: 15.24cm x 8.89cm + \includegraphics[scale=0.8]{shq3_up.pdf} + \\ + (a) High-quality filter for up-sampling. + + \includegraphics[scale=0.8]{shq3_down.pdf} + \\ + (b) High-quality filter for down-sampling. + + \end{center} + \caption{\SF High-quality filter responses for a + factor of 3 and sampling rates of 8000 and + 24000 Hz.\label{shq3}} + +\end{figure} +%------------- End of FIR filters response: frq for factor 3 ---------------- + + %----------- Begin of FIR filters response: frq for bandpass filter -------- \begin{figure}[hbtp] @@ -1142,6 +1187,26 @@ \subsection{FIR module} } \end{figure} %----- End of FIR filters response: impulse response for LP20 ----- + + +%----------- Begin of FIR filters response : frq for factor 2 --------------- +\begin{figure}[hbtp] + \begin{center} + %Both boxes' dimension: 15.24cm x 8.89cm + \includegraphics{hp50_32khz} + \\ + (a) 50Hz high-pass filter operating at 32 kHz. + + \includegraphics{hp50_48khz} + \\ + (b) 50Hz high-pass filter operating at 32 kHz.. + + \end{center} + \caption{\SF 50Hz high-pass filter responses (32000 and 48000 Hz).\label{hp50}} + +\end{figure} +%------------- End of FIR filters response: frq for factor 2 ---------------- + \flushfloats diff --git a/src/fir/CMakeLists.txt b/src/fir/CMakeLists.txt index b064f32e..dac0f398 100644 --- a/src/fir/CMakeLists.txt +++ b/src/fir/CMakeLists.txt @@ -165,3 +165,15 @@ add_test(filter26-verify ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/signal-diff -q test_d add_test(filter27 ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/filter -q 5kbp test_data/test.src test_data/test5kbp.flt) add_test(filter27-verify ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/signal-diff -q test_data/test5kbp.flt test_data/test5kbp.ref) + +add_test(filter28 ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/filter -q SHQ2 test_data/test.src test_data/test-shq2.flt) +add_test(filter28-verify ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/signal-diff -q test_data/tst-shq2.flt test_data/tst-shq2.ref) + +add_test(filter29 ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/filter -q SHQ3 test_data/test.src test_data/test-shq3.flt) +add_test(filter29-verify ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/signal-diff -q test_data/test-shq3.flt test_data/tst-shq3.ref) + +add_test(filter30 ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/filter -q HP50_32KHZ test_data/test.src test_data/test-hp50-32khz.flt) +add_test(filter30-verify ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/signal-diff -q test_data/test-hp50-32khz.flt test_data/test-hp50-32khz.ref) + +add_test(filter31 ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/filter -q HP50_48KHZ test_data/test.src test_data/test-hp50-48khz.flt) +add_test(filter31-verify ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/signal-diff -q test_data/test-hp50-48khz.flt test_data/test-hp50-48khz.ref) diff --git a/src/fir/filter.c b/src/fir/filter.c index 6708d091..c22d6a25 100644 --- a/src/fir/filter.c +++ b/src/fir/filter.c @@ -33,10 +33,10 @@ Options: -mod .......... uses the modified IRS characteristic instead of the "regular" one. - -down ......... filtering is downsample (for HQ2, HQ3, FLAT, IFLAT, and PCM) - -up ........... filtering is upsample (for HQ2, HQ3, FLAT, IFLAT, and PCM) - -async ........ asynchronization operation (disables -down) \n")) - -delay d ...... number of samples to delay the input signal for + -down ......... filtering is downsample (for HQ2, HQ3, SHQ2, SHQ3, FLAT, IFLAT, and PCM) + -up ........... filtering is upsample (for HQ2, HQ3, SHQ2, SHQ3, FLAT, IFLAT, and PCM) + -async ........ asynchronization operation (disables -down) \n")) + -delay d ...... number of samples to delay the input signal for asynchronous tandeming simulation. For d>0, null samples are inserted in the begining of the file, d<0 causes samples to be dropped. Default is d=0. @@ -44,39 +44,43 @@ Valid filter specifications: Flt_type Description - IRS8 (regular) IRS weighting with factor 1:1 at 8kHz - IRS16 (regular or modified) IRS weighting with factor 1:1 at 16kHz - IRS48 (modified) IRS weighting with factor 1:1 at 48kHz - HIRS16 Half-tilt IRS weighting for data sampled at 16kHz, factor 1:1 - TIRS IRS weighting with TIA coefficients, sf=8kHz, factor 1:1 - DSM Delta-SM filtering characteristic, 1:1 - PSO Psophometric wheighting filter, 1:1 - HQ2 FIR (High quality) low-pass with factor 1:2 (up) or 2:1 (down) - HQ3 FIR (High quality) low-pass with factor 1:3 (up) or 3:1 (down) - FLAT Linear-phase pass-band with factor 1:2 (up) or 2:1 (down) - FLAT1 Linear-phase pass-band with factor 1:1 (no rate change) - PCM Standard IIR PCM quality factor 1:2 (up) or 2:1 (down) - PCM1 Standard PCM quality with factor 1:1 at 16 kHz - GSM1 GSM Mobile station input response w/ factor 1:1 at 16 kHz - P341 Send-part weighting of ITU-T Rec.P.341 (Wideband telephones) - DC Direct-form DC-removal IIR filter (factor 1:1) - IFLAT Flat IIR low-pass with factor 1:3 (up) or 3:1 (down) using a - cascade structure - 5KBP 50-5000 Hz Flat bandpass FIR filter for fs=16kHz, 1:1 - 100_5KBP 100-5000 Hz Flat bandpass FIR filter for fs=16kHz, 1:1 - 14KBP 50-14000 Hz Flat bandpass FIR filter for fs=32kHz, 1:1 - 20KBP 20-20000 Hz Flat bandpass FIR filter for fs=48kHz, 1:1 (non-linear phase in HP-design) - LP1p5 low-pass filter with cut-off frequency 1.5kHz for fs=48kHz, 1:1 - LP35 low-pass filter with cut-off frequency 3.5kHz for fs=48kHz, 1:1 - LP7 low-pass filter with cut-off frequency 7kHz for fs=48kHz, 1:1 - LP10 low-pass filter with cut-off frequency 10kHz for fs=48kHz, 1:1 - // FILTER_12k48k_HW - LP12 low-pass filter with cut-off frequency 12kHz for fs=48kHz, 1:1 - // FILTER_12k48k_HW - LP14 low-pass filter with cut-off frequency 14kHz for fs=48kHz, 1:1 - LP20 low-pass filter with cut-off frequency 20kHz for fs=48kHz, 1:1 - RXIRS8 Receive-side Modified IRS weighting with factor 1:1 at 8kHz - RXIRS16 Receive-side Modified IRS weighting with factor 1:1 at 16kHz + IRS8 (regular) IRS weighting with factor 1:1 at 8kHz + IRS16 (regular or modified) IRS weighting with factor 1:1 at 16kHz + IRS48 (modified) IRS weighting with factor 1:1 at 48kHz + HIRS16 Half-tilt IRS weighting for data sampled at 16kHz, factor 1:1 + TIRS IRS weighting with TIA coefficients, sf=8kHz, factor 1:1 + DSM Delta-SM filtering characteristic, 1:1 + PSO Psophometric wheighting filter, 1:1 + HQ2 FIR (High quality) low-pass with factor 1:2 (up) or 2:1 (down) + HQ3 FIR (High quality) low-pass with factor 1:3 (up) or 3:1 (down) + SHQ2 FIR (Super High quality) low-pass with factor 1:2 (up) or 2:1 (down) (729 coefs) + SHQ3 FIR (Super High quality) low-pass with factor 1:3 (up) or 3:1 (down) (729 coefs) + FLAT Linear-phase pass-band with factor 1:2 (up) or 2:1 (down) + FLAT1 Linear-phase pass-band with factor 1:1 (no rate change) + PCM Standard IIR PCM quality factor 1:2 (up) or 2:1 (down) + PCM1 Standard PCM quality with factor 1:1 at 16 kHz + GSM1 GSM Mobile station input response w/ factor 1:1 at 16 kHz + P341 Send-part weighting of ITU-T Rec.P.341 (Wideband telephones) + DC Direct-form DC-removal IIR filter (factor 1:1) + IFLAT Flat IIR low-pass with factor 1:3 (up) or 3:1 (down) using a + cascade structure + 5KBP 50-5000 Hz Flat bandpass FIR filter for fs=16kHz, 1:1 + 100_5KBP 100-5000 Hz Flat bandpass FIR filter for fs=16kHz, 1:1 + 14KBP 50-14000 Hz Flat bandpass FIR filter for fs=32kHz, 1:1 + 20KBP 20-20000 Hz Flat bandpass FIR filter for fs=48kHz, 1:1 (non-linear phase in HP-design) + LP1p5 low-pass filter with cut-off frequency 1.5kHz for fs=48kHz, 1:1 + LP35 low-pass filter with cut-off frequency 3.5kHz for fs=48kHz, 1:1 + LP7 low-pass filter with cut-off frequency 7kHz for fs=48kHz, 1:1 + LP10 low-pass filter with cut-off frequency 10kHz for fs=48kHz, 1:1 + LP12 low-pass filter with cut-off frequency 12kHz for fs=48kHz, 1:1 + LP14 low-pass filter with cut-off frequency 14kHz for fs=48kHz, 1:1 + LP20 low-pass filter with cut-off frequency 20kHz for fs=48kHz, 1:1 + RXIRS8 Receive-side Modified IRS weighting with factor 1:1 at 8kHz + RXIRS16 Receive-side Modified IRS weighting with factor 1:1 at 16kHz + HP50_32KHZ 50 Hz highpass FIR filter w/ factor 1:1 at sf=32kHz, 1119 coefs\n"); + HP50_48KHZ 50 Hz highpass FIR filter w/ factor 1:1 at sf=48kHz, 1679 coefs\n"); + SHQ2 FIR (Super High quality : 729 coefs, -80dB) low-pass for factor 1:2 (up) or 2:1(down)\n"); + SHQ3 FIR (Super High quality : 729 coefs, -80dB) low-pass for factor 1:3 (up) or 3:1(down)\n"); Testing: @@ -152,6 +156,7 @@ 02.Feb.2010 v3.5 - Modified maximum string length for filenames to avoid buffer overruns (y.hiwasaki) + 05.April.2012 v3.6 - Added filters: HP50_32KHZ, HP50_48KHZ, SHQ2 and SHQ3 (b.kovesi France Telecom) =========================================================================== */ @@ -195,6 +200,7 @@ int valid_filter (char *F_type, char modified_IRS) { || strncmp (F_type, "dsm", 3) == 0 || strncmp (F_type, "DSM", 3) == 0 || strncmp (F_type, "pso", 3) == 0 || strncmp (F_type, "PSO", 3) == 0 || strncmp (F_type, "hq", 2) == 0 || strncmp (F_type, "HQ", 2) == 0 + || strncmp (F_type, "shq", 3) == 0 || strncmp (F_type, "SHQ", 3) == 0 || strncmp (F_type, "flat", 4) == 0 || strncmp (F_type, "FLAT", 4) == 0 || strncmp (F_type, "gsm1", 4) == 0 || strncmp (F_type, "GSM1", 4) == 0 || strncmp (F_type, "msin", 4) == 0 || strncmp (F_type, "MSIN", 4) == 0 @@ -204,7 +210,7 @@ int valid_filter (char *F_type, char modified_IRS) { // FILTER_12k48k_HW || strncmp (F_type, "LP12", 4) == 0 || strncmp (F_type, "lp12", 4) == 0 // FILTER_12k48k_HW - || strncmp (F_type, "LP14", 4) == 0 || strncmp (F_type, "lp14", 4) == 0 || strncmp (F_type, "LP20", 4) == 0 || strncmp (F_type, "lp20", 4) == 0) + || strncmp (F_type, "LP14", 4) == 0 || strncmp (F_type, "lp14", 4) == 0 || strncmp (F_type, "LP20", 4) == 0 || strncmp (F_type, "lp20", 4) == 0 || strncmp (F_type, "hp50_32khz", 10) == 0 || strncmp (F_type, "HP50_32KHZ", 10) == 0 || strncmp (F_type, "hp50_48khz", 10) == 0 || strncmp (F_type, "HP50_48KHZ", 10) == 0) valid = 1; /* No MOD-IRS filter at 8 kHz */ @@ -258,37 +264,41 @@ void display_usage () { printf ("\n"); printf (" Valid filter specifications:\n"); printf (" Flt_type Description\n"); - printf (" IRS8 (regular) IRS weighting with factor 1:1 at 8kHz\n"); - printf (" IRS16 (regular or modified) IRS weighting with factor 1:1 at 16kHz\n"); - printf (" IRS48 (modified) IRS weighting with factor 1:1 at 48kHz\n"); - printf (" RXIRS8 Receive-side Modified IRS weighting with factor 1:1 at 8kHz\n"); - printf (" RXIRS16 Receive-side Modified IRS weighting with factor 1:1 at 16kHz\n"); - printf (" HIRS16 Half-tilt IRS weighting, sf=16kHz, factor 1:1.\n"); - printf (" TIRS IRS weighting w/ TIA coefficients, sf=8kHz, factor 1:1.\n"); - printf (" DSM Delta-SM filtering characteristic, 1:1\n"); - printf (" PSO Psophometric wheighting filter, 1:1\n"); - printf (" HQ2 FIR (High quality) low-pass for factor 1:2 (up) or 2:1(down)\n"); - printf (" HQ3 FIR (High quality) low-pass for factor 1:3 (up) or 3:1(down)\n"); - printf (" FLAT Linear-phase passband w/ factor 1:2 (up) or 2:1 (down)\n"); - printf (" FLAT1 Linear-phase pass-band FIR w/ factor 1:1 (no rate change)\n"); - printf (" PCM Standard IIR PCM quality factor 1:2 (up) or 2:1 (down)\n"); - printf (" PCM1 Standard PCM quality with factor 1:1 at 16 kHz\n"); - printf (" GSM1 GSM Mobile station input FIR w/ factor 1:1 at 16 kHz\n"); - printf (" MSIN Same as GSM1\n"); - printf (" P341 P.341 send-mask FIR with factor 1:1 at 16 kHz\n"); - printf (" DC Direct-form DC-removal IIR filter (factor 1:1)\n"); - printf (" IFLAT Cascade-form IIR flat low-pass with factor 1:3 (up) or 3:1 (down)\n"); - printf (" 5KBP 50-5k Hz Flat bandpass FIR filter w/ factor 1:1 at sf=16kHz\n"); - printf (" 100_5KBP 100-5k Hz Flat bandpass FIR filter w/ factor 1:1 at sf=16kHz\n"); - printf (" 14KBP 50-14k Hz Flat bandpass FIR filter w/ factor 1:1 at sf=32kHz\n"); - printf (" 20KBP 20-20k Hz Flat bandpass FIR filter w/ factor 1:1 at sf=48kHz\n"); - printf (" LP1p5 1.5kHz low-pass filter for fs=48kHz, w/ factor 1:1\n"); - printf (" LP35 3.5kHz low-pass filter for fs=48kHz, w/ factor 1:1\n"); - printf (" LP7 7kHz low-pass filter for fs=48kHz, w/ factor 1:1\n"); - printf (" LP10 10kHz low-pass filter for fs=48kHz, w/ factor 1:1\n"); - printf (" LP12 12kHz low-pass filter for fs=48kHz, w/ factor 1:1\n"); - printf (" LP14 14kHz low-pass filter for fs=48kHz, w/ factor 1:1\n"); - printf (" LP20 20kHz low-pass filter for fs=48kHz, w/ factor 1:1\n\n"); + printf (" IRS8 (regular) IRS weighting with factor 1:1 at 8kHz\n"); + printf (" IRS16 (regular or modified) IRS weighting with factor 1:1 at 16kHz\n"); + printf (" IRS48 (modified) IRS weighting with factor 1:1 at 48kHz\n"); + printf (" RXIRS8 Receive-side Modified IRS weighting with factor 1:1 at 8kHz\n"); + printf (" RXIRS16 Receive-side Modified IRS weighting with factor 1:1 at 16kHz\n"); + printf (" HIRS16 Half-tilt IRS weighting, sf=16kHz, factor 1:1.\n"); + printf (" TIRS IRS weighting w/ TIA coefficients, sf=8kHz, factor 1:1.\n"); + printf (" DSM Delta-SM filtering characteristic, 1:1\n"); + printf (" PSO Psophometric wheighting filter, 1:1\n"); + printf (" HQ2 FIR (High quality) low-pass for factor 1:2 (up) or 2:1(down)\n"); + printf (" HQ3 FIR (High quality) low-pass for factor 1:3 (up) or 3:1(down)\n"); + printf (" FLAT Linear-phase passband w/ factor 1:2 (up) or 2:1 (down)\n"); + printf (" FLAT1 Linear-phase pass-band FIR w/ factor 1:1 (no rate change)\n"); + printf (" PCM Standard IIR PCM quality factor 1:2 (up) or 2:1 (down)\n"); + printf (" PCM1 Standard PCM quality with factor 1:1 at 16 kHz\n"); + printf (" GSM1 GSM Mobile station input FIR w/ factor 1:1 at 16 kHz\n"); + printf (" MSIN Same as GSM1\n"); + printf (" P341 P.341 send-mask FIR with factor 1:1 at 16 kHz\n"); + printf (" DC Direct-form DC-removal IIR filter (factor 1:1)\n"); + printf (" IFLAT Cascade-form IIR flat low-pass with factor 1:3 (up) or 3:1 (down)\n"); + printf (" 5KBP 50-5k Hz Flat bandpass FIR filter w/ factor 1:1 at sf=16kHz\n"); + printf (" 100_5KBP 100-5k Hz Flat bandpass FIR filter w/ factor 1:1 at sf=16kHz\n"); + printf (" 14KBP 50-14k Hz Flat bandpass FIR filter w/ factor 1:1 at sf=32kHz\n"); + printf (" 20KBP 20-20k Hz Flat bandpass FIR filter w/ factor 1:1 at sf=48kHz\n"); + printf (" LP1p5 1.5kHz low-pass filter for fs=48kHz, w/ factor 1:1\n"); + printf (" LP35 3.5kHz low-pass filter for fs=48kHz, w/ factor 1:1\n"); + printf (" LP7 7kHz low-pass filter for fs=48kHz, w/ factor 1:1\n"); + printf (" LP10 10kHz low-pass filter for fs=48kHz, w/ factor 1:1\n"); + printf (" LP12 12kHz low-pass filter for fs=48kHz, w/ factor 1:1\n"); + printf (" LP14 14kHz low-pass filter for fs=48kHz, w/ factor 1:1\n"); + printf (" LP20 20kHz low-pass filter for fs=48kHz, w/ factor 1:1\n"); + printf (" HP50_32KHZ 50 Hz highpass FIR filter w/ factor 1:1 at sf=32kHz, 1119 coefs\n"); + printf (" HP50_48KHZ 50 Hz highpass FIR filter w/ factor 1:1 at sf=48kHz, 1679 coefs\n"); + printf (" SHQ2 FIR (Super High quality : 729 coefs, -80dB) low-pass for factor 1:2 (up) or 2:1(down)\n"); + printf (" SHQ3 FIR (Super High quality : 729 coefs, -80dB) low-pass for factor 1:3 (up) or 3:1(down)\n\n"); /* Quit program */ exit (-128); @@ -570,6 +580,20 @@ int main (int argc, char *argv[]) { : hq_down_3_to_1_init (); } +#if 1 // not yet implemented +/* + * Filter type: SHQ2 - Super High quality 2:1 or 1:2 factor: + * SHQ3 - Super High quality 3:1 or 3:1 factor + */ + else if (strncmp (F_type, "shq", 3) == 0 || strncmp (F_type, "SHQ", 3) == 0) { + if (upsample) /* It is up-sampling! */ + fir_state = F_type[3] == '2' ? shq_up_1_to_2_init () + : shq_up_1_to_3_init (); + else /* It is down-sampling! */ + fir_state = F_type[3] == '2' ? shq_down_2_to_1_init () + : shq_down_3_to_1_init (); + } +#endif /* * Filter type: P.341 send mask: factor 1:1 */ @@ -652,14 +676,29 @@ int main (int argc, char *argv[]) { fir_state = LP20_48kHz_init (); } -/* - * Filter type: PCM - Standard PCM quality 2:1 or 1:2 factor: - * . fs == 8000 -> upsample: 1:2 - * . fs == 16000 -> downsample: 2:1 - * PCM1 - Standard PCM quality with 1:1 factor - * . fs == 8000 -> unimplemented - * . fs == 16000 -> OK, 1:1 at 16 kHz - */ + + /* + * Filter type: 50 Hz highpass filter (fs=32kHz): factor 1:1 + */ + else if (strncmp (F_type, "hp50_32khz", 10) == 0 || strncmp (F_type, "HP50_32KHZ", 10) == 0) { + fir_state = hp50_32khz_init (); + } + + /* + * Filter type: 50 Hz highpass filter (fs=48kHz): factor 1:1 + */ + else if (strncmp (F_type, "hp50_48khz", 10) == 0 || strncmp (F_type, "HP50_48KHZ", 10) == 0) { + fir_state = hp50_48khz_init (); + } + + /* + * Filter type: PCM - Standard PCM quality 2:1 or 1:2 factor: + * . fs == 8000 -> upsample: 1:2 + * . fs == 16000 -> downsample: 2:1 + * PCM1 - Standard PCM quality with 1:1 factor + * . fs == 8000 -> unimplemented + * . fs == 16000 -> OK, 1:1 at 16 kHz + */ else if (strncmp (F_type, "pcm", 3) == 0 || strncmp (F_type, "PCM", 3) == 0) { if (strncmp (F_type, "pcm1", 4) == 0 || strncmp (F_type, "PCM1", 4) == 0) { parallel_iir_state = stdpcm_16khz_init (); diff --git a/src/fir/fir-flat.c b/src/fir/fir-flat.c index 8dfdea82..b279c342 100644 --- a/src/fir/fir-flat.c +++ b/src/fir/fir-flat.c @@ -39,6 +39,10 @@ ORIGINAL BY: = hq_down_3_to_1_init() : initialize down-sampling filter 3:1 = hq_up_1_to_2_init() : initialize up-sampling filter 1:2 = hq_up_1_to_3_init() : initialize up-sampling filter 1:3 + = shq_down_2_to_1_init() : initialize down-sampling filter 2:1 + = shq_down_3_to_1_init() : initialize down-sampling filter 3:1 + = shq_up_1_to_2_init() : initialize up-sampling filter 1:2 + = shq_up_1_to_3_init() : initialize up-sampling filter 1:3 = linear_phase_pb_2_to_1_init() = linear_phase_pb_1_to_2_init() = linear_phase_pb_1_to_1_init() @@ -62,6 +66,7 @@ ORIGINAL BY: ** THIS FILE WAS SPLIT FROM THE ORIGINAL .C FILE ** 16.May.97 v2.2 Added function for HQ flat bandpass keeping the sampling rate (1:1 factor) + 05.April.2012 v2.3 - Added filters: SHQ2 and SHQ3 (France Telecom) ============================================================================= */ @@ -83,6 +88,8 @@ ORIGINAL BY: void fill_lp_2_to_1 ARGS ((float *h0[], long *lenh0)); void fill_lp_3_to_1 ARGS ((float **h0, long *lenh0)); +void fill_slp_2_to_1 ARGS ((float *h0[], long *lenh0)); +void fill_slp_3_to_1 ARGS ((float **h0, long *lenh0)); void fill_flat_band_pass ARGS ((float **h0, long *lenh0)); @@ -715,4 +722,663 @@ SCD_FIR *linear_phase_pb_1_to_1_init () { /* ................ End of linear_phase_pb_1_to_1_init() ................ */ +/*****************************************************************************/ +/*****************************************************************************/ + +/* + ============================================================================ + + SCD_FIR *shq_down_2_to_1_init (void); + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + Description: + ~~~~~~~~~~~~ + + Initialization routine for super high quality FIR downsampling filter + by factor of 2. + + Parameters: none. + ~~~~~~~~~~~ + + Return value: + ~~~~~~~~~~~~~ + Returns a pointer to struct SCD_FIR; + + Author: + ~~~~~~~ + + History: + ~~~~~~~~ + 05.April.2012 v1.0 - Added filters: SHQ2 and SHQ3 (France Telecom) + + ============================================================================ +*/ +SCD_FIR *shq_down_2_to_1_init () { + float *h0; /* pointer to array with FIR coeff. */ + long lenh0; /* number of FIR coefficients */ + + + /* allocate array for FIR coeff. and fill with coefficients */ + fill_slp_2_to_1 (&h0, &lenh0); + + return fir_initialization ( /* Returns: pointer to SCD_FIR-struct */ + lenh0, /* In: number of FIR-coefficients */ + h0, /* In: pointer to array with FIR-cof. */ + 1.0, /* In: gain factor for FIR-coeffic. */ + 2l, /* In: Down-sampling factor */ + 'D' /* In: switch to down-sampling kernel */ + ); +} + +/* ..................... End of shq_down_2_to_1_init() ..................... */ + + + +/* + ============================================================================ + + SCD_FIR *shq_up_1_to_2_init (void); + ~~~~~~~~~~~~~~~~~~~~~~~~~~ + + Description: + ~~~~~~~~~~~~ + + Initialization routine for super high quality upsampling FIR filter + by factor of 2. + + Parameters: none. + ~~~~~~~~~~~ + + Return value: + ~~~~~~~~~~~~~ + Returns a pointer to struct SCD_FIR; + + Author: + ~~~~~~~ + + History: + ~~~~~~~~ + 05.April.2012 v1.0 - Added filters: SHQ2 and SHQ3 (France Telecom) + + ============================================================================ +*/ +SCD_FIR *shq_up_1_to_2_init () { + float *h0; /* pointer to array with FIR coeff. */ + long lenh0; /* number of FIR coefficients */ + + + /* allocate array for FIR coeff. and fill with coefficients */ + fill_slp_2_to_1 (&h0, &lenh0); + + return fir_initialization ( /* Returns: pointer to SCD_FIR-struct */ + lenh0, /* In: number of FIR-coefficients */ + h0, /* In: pointer to array with FIR-cof. */ + 2.0, /* In: gain factor for FIR-coeffic. */ + 2l, /* In: Up-sampling factor */ + 'U' /* In: Switch to upsampling procedure */ + ); +} + +/* ..................... End of shq_up_1_to_2_init() ..................... */ + + + +/* + ============================================================================ + + SCD_FIR *shq_down_3_to_1_init (void); + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + Description: + ~~~~~~~~~~~~ + + Initialization routine for super high quality FIR downsampling filter + by factor of 3. + + Parameters: none. + ~~~~~~~~~~~ + + Return value: + ~~~~~~~~~~~~~ + Returns a pointer to struct SCD_FIR; + + Author: + ~~~~~~~ + + History: + ~~~~~~~~ + 05.April.2012 v1.0 - Added filters: SHQ2 and SHQ3 (France Telecom) + + ============================================================================ +*/ +SCD_FIR *shq_down_3_to_1_init () { + float *h0; /* pointer to array with FIR coeff. */ + long lenh0; /* number of FIR coefficients */ + + + /* allocate array for FIR coeff. and fill with coefficients */ + fill_slp_3_to_1 (&h0, &lenh0); + + return fir_initialization ( /* Returns: pointer to SCD_FIR-struct */ + lenh0, /* In: number of FIR-coefficients */ + h0, /* In: pointer to array with FIR-cof. */ + 1.0, /* In: gain factor for FIR-coeffic. */ + 3l, /* In: Down-sampling factor */ + 'D' /* In: switch to down-sampling proc. */ + ); +} + +/* .................... End of shq_down_3_to_1_init() ..................... */ + + + +/* + ============================================================================ + + SCD_FIR *shq_up_1_to_3_init (void); + ~~~~~~~~~~~~~~~~~~~~~~~~~~ + + Description: + ~~~~~~~~~~~~ + + Initialization routine for super high quality FIR upsampling filter + by factor of 3. + + Parameters: none. + ~~~~~~~~~~~ + + Return value: + ~~~~~~~~~~~~~ + Returns a pointer to struct SCD_FIR; + + Author: + ~~~~~~~ + + History: + ~~~~~~~~ + 05.April.2012 v1.0 - Added filters: SHQ2 and SHQ3 (France Telecom) + + ============================================================================ +*/ +SCD_FIR *shq_up_1_to_3_init () { + float *h0; /* pointer to array with FIR coeff. */ + long lenh0; /* number of FIR coefficients */ + + + /* allocate array for FIR coeff. and fill with coefficients */ + fill_slp_3_to_1 (&h0, &lenh0); + + return fir_initialization ( /* Returns: pointer to SCD_FIR-struct */ + lenh0, /* In: number of FIR-coefficients */ + h0, /* In: pointer to array with FIR-cof. */ + 3.0, /* In: gain factor for FIR-coeffic. */ + 3l, /* In: Up-sampling factor */ + 'U' /* In: switch to upsampling procedure */ + ); +} + +/* ...................... End of shq_up_1_to_3_init() ...................... */ + + +/* + ============================================================================ + + void fill_slp_2_to_1 (float **h0, long *lenh0); + ~~~~~~~~~~~~~~~~~~~ + + Description: + ~~~~~~~~~~~~ + + Initialize pointer to array with of FIR coefficients of a low + pass filter for up/down sampling filter with factor 2:1 or 1:2 + and float representation. + v1.0 filtdemo firpm 16000,3935,4000,0.3, 80, 728 + v1.1 filtdemo firpm 16000,3935,4000,0.3, 100, 872 + h2 = filtdemo('getfilt') + for i = 1:length(h2) fprintf('(float)%20.12e, ', h2(i)); + if rem(i,5) == 0 fprintf('\n'); end end + + Parameters: + ~~~~~~~~~~~ + h0: (Out) pointer to array with FIR coefficients + lenh0: (Out) pointer to number of coefficients + + + Return value: + ~~~~~~~~~~~~~ + None. + + Author: + ~~~~~~~ + + History: + ~~~~~~~~ + 08.DEC.2011 v1.0 Release of 1st version + 15.FEB.2012 v1.1 Release of 2nd version with more stopband attenuation + + ============================================================================ +*/ +#define lensh02 873 + +void fill_slp_2_to_1 (h0, lenh0) + float *h0[]; + long *lenh0; +{ + static float sh02[lensh02] = { + (float) 3.796696928466e-006, (float) - 1.916895913880e-004, (float) - 9.559790653313e-004, (float) - 2.309090436241e-003, (float) - 3.355260288418e-003, + (float) - 2.821616068751e-003, (float) - 6.494578851510e-004, (float) 1.368071261832e-003, (float) 1.370278722621e-003, (float) - 2.336521287917e-004, + (float) - 1.185316896754e-003, (float) - 3.557893702940e-004, (float) 8.234667012568e-004, (float) 6.081914903075e-004, (float) - 4.869084931865e-004, + (float) - 6.784989588347e-004, (float) 2.211378711751e-004, (float) 6.567967063227e-004, (float) - 2.508428842065e-005, (float) - 5.918859501058e-004, + (float) - 1.133457948942e-004, (float) 5.103528659400e-004, (float) 2.077730139398e-004, (float) - 4.257030079639e-004, (float) - 2.693320767774e-004, + (float) 3.450469073084e-004, (float) 3.071631118731e-004, (float) - 2.713518058883e-004, (float) - 3.278882894771e-004, (float) 2.057925864008e-004, + (float) 3.366006455231e-004, (float) - 1.482361183421e-004, (float) - 3.367394950886e-004, (float) 9.845446547453e-005, (float) 3.312977192436e-004, + (float) - 5.533287789728e-005, (float) - 3.217977487285e-004, (float) 1.843967368528e-005, (float) 3.099640470313e-004, (float) 1.328843895284e-005, + (float) - 2.965903264243e-004, (float) - 4.040411770010e-005, (float) 2.826060999738e-004, (float) 6.386636089117e-005, (float) - 2.682059180462e-004, + (float) - 8.400473971490e-005, (float) 2.539623487208e-004, (float) 1.015795101283e-004, (float) - 2.398340044811e-004, (float) - 1.167662237676e-004, + (float) 2.262277295494e-004, (float) 1.302389953023e-004, (float) - 2.128963846610e-004, (float) - 1.420059883336e-004, (float) 2.001325818624e-004, + (float) 1.525152442899e-004, (float) - 1.878370907468e-004, (float) - 1.619282978772e-004, (float) 1.760669168660e-004, (float) 1.705747652949e-004, + (float) - 1.645342831667e-004, (float) - 1.782437567680e-004, (float) 1.536329356026e-004, (float) 1.854489350961e-004, (float) - 1.431090602159e-004, + (float) - 1.923098357663e-004, (float) 1.327632434198e-004, (float) 1.988019142637e-004, (float) - 1.224823030873e-004, (float) - 2.047505646951e-004, + (float) 1.125436526441e-004, (float) 2.105136263884e-004, (float) - 1.026783876418e-004, (float) - 2.159988725649e-004, (float) 9.291206030779e-005, + (float) 2.212630220095e-004, (float) - 8.322092258564e-005, (float) - 2.263811595801e-004, (float) 7.350850871907e-005, (float) 2.313695981464e-004, + (float) - 6.362969041322e-005, (float) - 2.360269018314e-004, (float) 5.380295174011e-005, (float) 2.405543319009e-004, (float) - 4.394022835345e-005, + (float) - 2.450580921435e-004, (float) 3.380378919976e-005, (float) 2.493326534241e-004, (float) - 2.346096839263e-005, (float) - 2.533379001119e-004, + (float) 1.298908745154e-005, (float) 2.571630808553e-004, (float) - 2.297001211178e-006, (float) - 2.607451266109e-004, (float) - 8.605011575155e-006, + (float) 2.640373512578e-004, (float) 1.959506007225e-005, (float) - 2.672713250910e-004, (float) - 3.098103063675e-005, (float) 2.701901534524e-004, + (float) 4.267470287693e-005, (float) - 2.727139254030e-004, (float) - 5.452878257789e-005, (float) 2.749705769146e-004, (float) 6.658908505887e-005, + (float) - 2.770661665078e-004, (float) - 7.913713870114e-005, (float) 2.786327455942e-004, (float) 9.185585608604e-005, (float) - 2.798865730517e-004, + (float) - 1.049053516406e-004, (float) 2.807049278836e-004, (float) 1.182425329275e-004, (float) - 2.810498626639e-004, (float) - 1.318263284371e-004, + (float) 2.808967923003e-004, (float) 1.455506215115e-004, (float) - 2.804597862803e-004, (float) - 1.597707317081e-004, (float) 2.793085842202e-004, + (float) 1.741553960777e-004, (float) - 2.775743726755e-004, (float) - 1.887189126391e-004, (float) 2.752088365441e-004, (float) 2.033292028967e-004, + (float) - 2.723750410219e-004, (float) - 2.181185345008e-004, (float) 2.690195363322e-004, (float) 2.331377491223e-004, (float) - 2.650434716994e-004, + (float) - 2.483814212302e-004, (float) 2.602688344952e-004, (float) 2.635383838792e-004, (float) - 2.550401641814e-004, (float) - 2.789293863887e-004, + (float) 2.491244096402e-004, (float) 2.945239709175e-004, (float) - 2.422677063636e-004, (float) - 3.097933373634e-004, (float) 2.353216838587e-004, + (float) 3.261618119620e-004, (float) - 2.259436476779e-004, (float) - 3.401042900591e-004, (float) 2.190501787592e-004, (float) 3.582196439592e-004, + (float) - 2.060273208877e-004, (float) - 3.696711810736e-004, (float) 1.999494168871e-004, (float) 3.895781288432e-004, (float) - 1.842093035737e-004, + (float) - 4.009205689012e-004, (float) 1.747765776478e-004, (float) 4.170995964833e-004, (float) - 1.621552954359e-004, (float) - 4.335350916263e-004, + (float) 1.456088038973e-004, (float) 4.447247309663e-004, (float) - 1.338587279643e-004, (float) - 4.603990618508e-004, (float) 1.185710423385e-004, + (float) 4.756987576397e-004, (float) - 1.000048491894e-004, (float) - 4.866041612047e-004, (float) 8.476411455038e-005, (float) 4.998780903868e-004, + (float) - 6.827228464703e-005, (float) - 5.146667747733e-004, (float) 4.753115459198e-005, (float) 5.255987039514e-004, (float) - 2.779134779343e-005, + (float) - 5.355054669473e-004, (float) 9.674319498129e-006, (float) 5.478734582255e-004, (float) 1.129727308307e-005, (float) - 5.595560306151e-004, + (float) - 3.493017868056e-005, (float) 5.677956913097e-004, (float) 5.713859403233e-005, (float) - 5.757813638276e-004, (float) - 7.867758251969e-005, + (float) 5.852799390936e-004, (float) 1.025052366029e-004, (float) - 5.941431998669e-004, (float) - 1.287437605610e-004, (float) 6.000426995209e-004, + (float) 1.543883746225e-004, (float) - 6.047947232235e-004, (float) - 1.791348851279e-004, (float) 6.103250533849e-004, (float) 2.050193734239e-004, + (float) - 6.160453602904e-004, (float) - 2.334612077119e-004, (float) 6.194421365491e-004, (float) 2.625902273169e-004, (float) - 6.205808968069e-004, + (float) - 2.909797933304e-004, (float) 6.209921559119e-004, (float) 3.189781263679e-004, (float) - 6.218075972611e-004, (float) - 3.484125142872e-004, + (float) 6.217754987501e-004, (float) 3.794107287795e-004, (float) - 6.197373802874e-004, (float) - 4.110126983210e-004, (float) 6.154740944566e-004, + (float) 4.419629007982e-004, (float) - 6.102659557898e-004, (float) - 4.726777081461e-004, (float) 6.046314459814e-004, (float) 5.039254713546e-004, + (float) - 5.984097187292e-004, (float) - 5.364779620831e-004, (float) 5.904522258905e-004, (float) 5.697973331218e-004, (float) - 5.802595330793e-004, + (float) - 6.029679388270e-004, (float) 5.681353065596e-004, (float) 6.352880253925e-004, (float) - 5.552572270111e-004, (float) - 6.675564463085e-004, + (float) 5.416686835400e-004, (float) 7.004526959840e-004, (float) - 5.267382801903e-004, (float) - 7.340039635307e-004, (float) 5.098171451209e-004, + (float) 7.676007675934e-004, (float) - 4.909399565337e-004, (float) - 8.009185568264e-004, (float) 4.701439201458e-004, (float) 8.334617833183e-004, + (float) - 4.480343741175e-004, (float) - 8.653751202061e-004, (float) 4.250690490151e-004, (float) 8.973420149762e-004, (float) - 4.009277182108e-004, + (float) - 9.297436930304e-004, (float) 3.747939959452e-004, (float) 9.620204713426e-004, (float) - 3.465711833398e-004, (float) - 9.937591861314e-004, + (float) 3.163873335071e-004, (float) 1.024733751383e-003, (float) - 2.843503685027e-004, (float) - 1.054638636894e-003, (float) 2.509109323082e-004, + (float) 1.083612570606e-003, (float) - 2.163900938188e-004, (float) - 1.112203502198e-003, (float) 1.803999502271e-004, (float) 1.140444841288e-003, + (float) - 1.425881460745e-004, (float) - 1.168069638194e-003, (float) 1.029125055130e-004, (float) 1.195016515742e-003, (float) - 6.105502150698e-005, + (float) - 1.220730499698e-003, (float) 1.722309885781e-005, (float) 1.244802222599e-003, (float) 2.793170702027e-005, (float) - 1.267597215030e-003, + (float) - 7.433354174569e-005, (float) 1.289443015758e-003, (float) 1.223071384268e-004, (float) - 1.310173684327e-003, (float) - 1.717961954652e-004, + (float) 1.329974954064e-003, (float) 2.232129919651e-004, (float) - 1.348538305787e-003, (float) - 2.767754823491e-004, (float) 1.365216750693e-003, + (float) 3.319638947909e-004, (float) - 1.380095678916e-003, (float) - 3.886579246534e-004, (float) 1.393229786168e-003, (float) 4.469245863820e-004, + (float) - 1.404378077863e-003, (float) - 5.064357635350e-004, (float) 1.413756425541e-003, (float) 5.672145160932e-004, (float) - 1.421549050340e-003, + (float) - 6.296742832444e-004, (float) 1.427153322508e-003, (float) 6.930389693885e-004, (float) - 1.431723738610e-003, (float) - 7.590842956586e-004, + (float) 1.433006680474e-003, (float) 8.254983244591e-004, (float) - 1.433298843968e-003, (float) - 8.949540559698e-004, (float) 1.429349304332e-003, + (float) 9.640000205246e-004, (float) - 1.424329953401e-003, (float) - 1.035464848937e-003, (float) 1.415601499601e-003, (float) 1.106948972842e-003, + (float) - 1.405087088396e-003, (float) - 1.179673831986e-003, (float) 1.392478926372e-003, (float) 1.254375291373e-003, (float) - 1.376198638858e-003, + (float) - 1.329115340603e-003, (float) 1.358185632312e-003, (float) 1.405674275449e-003, (float) - 1.337154931483e-003, (float) - 1.483771621272e-003, + (float) 1.312269387543e-003, (float) 1.561900282048e-003, (float) - 1.285301279727e-003, (float) - 1.642079777660e-003, (float) 1.254114183544e-003, + (float) 1.722681043912e-003, (float) - 1.219211242008e-003, (float) - 1.803063205736e-003, (float) 1.181949655991e-003, (float) 1.884828365040e-003, + (float) - 1.140994785147e-003, (float) - 1.967442657059e-003, (float) 1.095925463900e-003, (float) 2.049903843463e-003, (float) - 1.047877974227e-003, + (float) - 2.133252204410e-003, (float) 9.962070742267e-004, (float) 2.217664374578e-003, (float) - 9.399028586473e-004, (float) - 2.301879563126e-003, + (float) 8.799533412324e-004, (float) 2.386557312794e-003, (float) - 8.160716710263e-004, (float) - 2.472094691981e-003, (float) 7.471803656806e-004, + (float) 2.557416285858e-003, (float) - 6.736494366209e-004, (float) - 2.642112224434e-003, (float) 5.963947377435e-004, (float) 2.727379304929e-003, + (float) - 5.143438896094e-004, (float) - 2.812899297523e-003, (float) 4.268830572252e-004, (float) 2.897715073078e-003, (float) - 3.346488919796e-004, + (float) - 2.981956373303e-003, (float) 2.380521797797e-004, (float) 3.066623414599e-003, (float) - 1.359382829811e-004, (float) - 3.151255446637e-003, + (float) 2.782985135369e-005, (float) 3.235110828048e-003, (float) 8.584892395569e-005, (float) - 3.318355500563e-003, (float) - 2.049786891772e-004, + (float) 3.401760376538e-003, (float) 3.307328425452e-004, (float) - 3.484791457407e-003, (float) - 4.636621183957e-004, (float) 3.566606134171e-003, + (float) 6.034051597652e-004, (float) - 3.647201821596e-003, (float) - 7.497497805930e-004, (float) 3.727291920777e-003, (float) 9.036595637004e-004, + (float) - 3.806649107069e-003, (float) - 1.065867612984e-003, (float) 3.884567294966e-003, (float) 1.236277315086e-003, (float) - 3.961005564525e-003, + (float) - 1.414791150723e-003, (float) 4.036756667297e-003, (float) 1.602515835838e-003, (float) - 4.111869542510e-003, (float) - 1.800743383460e-003, + (float) 4.185540927469e-003, (float) 2.009872291898e-003, (float) - 4.257408085939e-003, (float) - 2.230058942337e-003, (float) 4.327941872004e-003, + (float) 2.462366047089e-003, (float) - 4.397272684020e-003, (float) - 2.708200770755e-003, (float) 4.464960149734e-003, (float) 2.968539548004e-003, + (float) - 4.530883832943e-003, (float) - 3.244542924923e-003, (float) 4.595095710114e-003, (float) 3.537784469302e-003, (float) - 4.657460095921e-003, + (float) - 3.849899735547e-003, (float) 4.718000809430e-003, (float) 4.182843960043e-003, (float) - 4.776999990045e-003, (float) - 4.539528511166e-003, + (float) 4.833943437272e-003, (float) 4.922646164542e-003, (float) - 4.888454593861e-003, (float) - 5.334885946192e-003, (float) 4.941143760176e-003, + (float) 5.780469043985e-003, (float) - 4.992461365274e-003, (float) - 6.265199509171e-003, (float) 5.041554413526e-003, (float) 6.794738285542e-003, + (float) - 5.088173036641e-003, (float) - 7.376044395058e-003, (float) 5.132524592209e-003, (float) 8.018375971792e-003, (float) - 5.174387044018e-003, + (float) - 8.733007006427e-003, (float) 5.213750365616e-003, (float) 9.534285432471e-003, (float) - 5.251195927114e-003, (float) - 1.044195072235e-002, + (float) 5.286143606555e-003, (float) 1.148100562390e-002, (float) - 5.318182436083e-003, (float) - 1.268466390300e-002, (float) 5.347878808814e-003, + (float) 1.410004942171e-002, (float) - 5.375128932984e-003, (float) - 1.579376157069e-002, (float) 5.399698942850e-003, (float) 1.786325203520e-002, + (float) - 5.422169472156e-003, (float) - 2.045920855579e-002, (float) 5.442242611442e-003, (float) 2.382438645728e-002, (float) - 5.459104973796e-003, + (float) - 2.837649392789e-002, (float) 5.474214913211e-003, (float) 3.490845950781e-002, (float) - 5.486081437467e-003, (float) - 4.511486713033e-002, + (float) 5.495807726126e-003, (float) 6.340609543466e-002, (float) - 5.502587343827e-003, (float) - 1.059496325621e-001, (float) 5.506719537453e-003, + (float) 3.182586432339e-001, (float) 4.944918979528e-001, (float) 3.182586432339e-001, (float) 5.506719537453e-003, (float) - 1.059496325621e-001, + (float) - 5.502587343827e-003, (float) 6.340609543466e-002, (float) 5.495807726126e-003, (float) - 4.511486713033e-002, (float) - 5.486081437467e-003, + (float) 3.490845950781e-002, (float) 5.474214913211e-003, (float) - 2.837649392789e-002, (float) - 5.459104973796e-003, (float) 2.382438645728e-002, + (float) 5.442242611442e-003, (float) - 2.045920855579e-002, (float) - 5.422169472156e-003, (float) 1.786325203520e-002, (float) 5.399698942850e-003, + (float) - 1.579376157069e-002, (float) - 5.375128932984e-003, (float) 1.410004942171e-002, (float) 5.347878808814e-003, (float) - 1.268466390300e-002, + (float) - 5.318182436083e-003, (float) 1.148100562390e-002, (float) 5.286143606555e-003, (float) - 1.044195072235e-002, (float) - 5.251195927114e-003, + (float) 9.534285432471e-003, (float) 5.213750365616e-003, (float) - 8.733007006427e-003, (float) - 5.174387044018e-003, (float) 8.018375971792e-003, + (float) 5.132524592209e-003, (float) - 7.376044395058e-003, (float) - 5.088173036641e-003, (float) 6.794738285542e-003, (float) 5.041554413526e-003, + (float) - 6.265199509171e-003, (float) - 4.992461365274e-003, (float) 5.780469043985e-003, (float) 4.941143760176e-003, (float) - 5.334885946192e-003, + (float) - 4.888454593861e-003, (float) 4.922646164542e-003, (float) 4.833943437272e-003, (float) - 4.539528511166e-003, (float) - 4.776999990045e-003, + (float) 4.182843960043e-003, (float) 4.718000809430e-003, (float) - 3.849899735547e-003, (float) - 4.657460095921e-003, (float) 3.537784469302e-003, + (float) 4.595095710114e-003, (float) - 3.244542924923e-003, (float) - 4.530883832943e-003, (float) 2.968539548004e-003, (float) 4.464960149734e-003, + (float) - 2.708200770755e-003, (float) - 4.397272684020e-003, (float) 2.462366047089e-003, (float) 4.327941872004e-003, (float) - 2.230058942337e-003, + (float) - 4.257408085939e-003, (float) 2.009872291898e-003, (float) 4.185540927469e-003, (float) - 1.800743383460e-003, (float) - 4.111869542510e-003, + (float) 1.602515835838e-003, (float) 4.036756667297e-003, (float) - 1.414791150723e-003, (float) - 3.961005564525e-003, (float) 1.236277315086e-003, + (float) 3.884567294966e-003, (float) - 1.065867612984e-003, (float) - 3.806649107069e-003, (float) 9.036595637004e-004, (float) 3.727291920777e-003, + (float) - 7.497497805930e-004, (float) - 3.647201821596e-003, (float) 6.034051597652e-004, (float) 3.566606134171e-003, (float) - 4.636621183957e-004, + (float) - 3.484791457407e-003, (float) 3.307328425452e-004, (float) 3.401760376538e-003, (float) - 2.049786891772e-004, (float) - 3.318355500563e-003, + (float) 8.584892395569e-005, (float) 3.235110828048e-003, (float) 2.782985135369e-005, (float) - 3.151255446637e-003, (float) - 1.359382829811e-004, + (float) 3.066623414599e-003, (float) 2.380521797797e-004, (float) - 2.981956373303e-003, (float) - 3.346488919796e-004, (float) 2.897715073078e-003, + (float) 4.268830572252e-004, (float) - 2.812899297523e-003, (float) - 5.143438896094e-004, (float) 2.727379304929e-003, (float) 5.963947377435e-004, + (float) - 2.642112224434e-003, (float) - 6.736494366209e-004, (float) 2.557416285858e-003, (float) 7.471803656806e-004, (float) - 2.472094691981e-003, + (float) - 8.160716710263e-004, (float) 2.386557312794e-003, (float) 8.799533412324e-004, (float) - 2.301879563126e-003, (float) - 9.399028586473e-004, + (float) 2.217664374578e-003, (float) 9.962070742267e-004, (float) - 2.133252204410e-003, (float) - 1.047877974227e-003, (float) 2.049903843463e-003, + (float) 1.095925463900e-003, (float) - 1.967442657059e-003, (float) - 1.140994785147e-003, (float) 1.884828365040e-003, (float) 1.181949655991e-003, + (float) - 1.803063205736e-003, (float) - 1.219211242008e-003, (float) 1.722681043912e-003, (float) 1.254114183544e-003, (float) - 1.642079777660e-003, + (float) - 1.285301279727e-003, (float) 1.561900282048e-003, (float) 1.312269387543e-003, (float) - 1.483771621272e-003, (float) - 1.337154931483e-003, + (float) 1.405674275449e-003, (float) 1.358185632312e-003, (float) - 1.329115340603e-003, (float) - 1.376198638858e-003, (float) 1.254375291373e-003, + (float) 1.392478926372e-003, (float) - 1.179673831986e-003, (float) - 1.405087088396e-003, (float) 1.106948972842e-003, (float) 1.415601499601e-003, + (float) - 1.035464848937e-003, (float) - 1.424329953401e-003, (float) 9.640000205246e-004, (float) 1.429349304332e-003, (float) - 8.949540559698e-004, + (float) - 1.433298843968e-003, (float) 8.254983244591e-004, (float) 1.433006680474e-003, (float) - 7.590842956586e-004, (float) - 1.431723738610e-003, + (float) 6.930389693885e-004, (float) 1.427153322508e-003, (float) - 6.296742832444e-004, (float) - 1.421549050340e-003, (float) 5.672145160932e-004, + (float) 1.413756425541e-003, (float) - 5.064357635350e-004, (float) - 1.404378077863e-003, (float) 4.469245863820e-004, (float) 1.393229786168e-003, + (float) - 3.886579246534e-004, (float) - 1.380095678916e-003, (float) 3.319638947909e-004, (float) 1.365216750693e-003, (float) - 2.767754823491e-004, + (float) - 1.348538305787e-003, (float) 2.232129919651e-004, (float) 1.329974954064e-003, (float) - 1.717961954652e-004, (float) - 1.310173684327e-003, + (float) 1.223071384268e-004, (float) 1.289443015758e-003, (float) - 7.433354174569e-005, (float) - 1.267597215030e-003, (float) 2.793170702027e-005, + (float) 1.244802222599e-003, (float) 1.722309885781e-005, (float) - 1.220730499698e-003, (float) - 6.105502150698e-005, (float) 1.195016515742e-003, + (float) 1.029125055130e-004, (float) - 1.168069638194e-003, (float) - 1.425881460745e-004, (float) 1.140444841288e-003, (float) 1.803999502271e-004, + (float) - 1.112203502198e-003, (float) - 2.163900938188e-004, (float) 1.083612570606e-003, (float) 2.509109323082e-004, (float) - 1.054638636894e-003, + (float) - 2.843503685027e-004, (float) 1.024733751383e-003, (float) 3.163873335071e-004, (float) - 9.937591861314e-004, (float) - 3.465711833398e-004, + (float) 9.620204713426e-004, (float) 3.747939959452e-004, (float) - 9.297436930304e-004, (float) - 4.009277182108e-004, (float) 8.973420149762e-004, + (float) 4.250690490151e-004, (float) - 8.653751202061e-004, (float) - 4.480343741175e-004, (float) 8.334617833183e-004, (float) 4.701439201458e-004, + (float) - 8.009185568264e-004, (float) - 4.909399565337e-004, (float) 7.676007675934e-004, (float) 5.098171451209e-004, (float) - 7.340039635307e-004, + (float) - 5.267382801903e-004, (float) 7.004526959840e-004, (float) 5.416686835400e-004, (float) - 6.675564463085e-004, (float) - 5.552572270111e-004, + (float) 6.352880253925e-004, (float) 5.681353065596e-004, (float) - 6.029679388270e-004, (float) - 5.802595330793e-004, (float) 5.697973331218e-004, + (float) 5.904522258905e-004, (float) - 5.364779620831e-004, (float) - 5.984097187292e-004, (float) 5.039254713546e-004, (float) 6.046314459814e-004, + (float) - 4.726777081461e-004, (float) - 6.102659557898e-004, (float) 4.419629007982e-004, (float) 6.154740944566e-004, (float) - 4.110126983210e-004, + (float) - 6.197373802874e-004, (float) 3.794107287795e-004, (float) 6.217754987501e-004, (float) - 3.484125142872e-004, (float) - 6.218075972611e-004, + (float) 3.189781263679e-004, (float) 6.209921559119e-004, (float) - 2.909797933304e-004, (float) - 6.205808968069e-004, (float) 2.625902273169e-004, + (float) 6.194421365491e-004, (float) - 2.334612077119e-004, (float) - 6.160453602904e-004, (float) 2.050193734239e-004, (float) 6.103250533849e-004, + (float) - 1.791348851279e-004, (float) - 6.047947232235e-004, (float) 1.543883746225e-004, (float) 6.000426995209e-004, (float) - 1.287437605610e-004, + (float) - 5.941431998669e-004, (float) 1.025052366029e-004, (float) 5.852799390936e-004, (float) - 7.867758251969e-005, (float) - 5.757813638276e-004, + (float) 5.713859403233e-005, (float) 5.677956913097e-004, (float) - 3.493017868056e-005, (float) - 5.595560306151e-004, (float) 1.129727308307e-005, + (float) 5.478734582255e-004, (float) 9.674319498129e-006, (float) - 5.355054669473e-004, (float) - 2.779134779343e-005, (float) 5.255987039514e-004, + (float) 4.753115459198e-005, (float) - 5.146667747733e-004, (float) - 6.827228464703e-005, (float) 4.998780903868e-004, (float) 8.476411455038e-005, + (float) - 4.866041612047e-004, (float) - 1.000048491894e-004, (float) 4.756987576397e-004, (float) 1.185710423385e-004, (float) - 4.603990618508e-004, + (float) - 1.338587279643e-004, (float) 4.447247309663e-004, (float) 1.456088038973e-004, (float) - 4.335350916263e-004, (float) - 1.621552954359e-004, + (float) 4.170995964833e-004, (float) 1.747765776478e-004, (float) - 4.009205689012e-004, (float) - 1.842093035737e-004, (float) 3.895781288432e-004, + (float) 1.999494168871e-004, (float) - 3.696711810736e-004, (float) - 2.060273208877e-004, (float) 3.582196439592e-004, (float) 2.190501787592e-004, + (float) - 3.401042900591e-004, (float) - 2.259436476779e-004, (float) 3.261618119620e-004, (float) 2.353216838587e-004, (float) - 3.097933373634e-004, + (float) - 2.422677063636e-004, (float) 2.945239709175e-004, (float) 2.491244096402e-004, (float) - 2.789293863887e-004, (float) - 2.550401641814e-004, + (float) 2.635383838792e-004, (float) 2.602688344952e-004, (float) - 2.483814212302e-004, (float) - 2.650434716994e-004, (float) 2.331377491223e-004, + (float) 2.690195363322e-004, (float) - 2.181185345008e-004, (float) - 2.723750410219e-004, (float) 2.033292028967e-004, (float) 2.752088365441e-004, + (float) - 1.887189126391e-004, (float) - 2.775743726755e-004, (float) 1.741553960777e-004, (float) 2.793085842202e-004, (float) - 1.597707317081e-004, + (float) - 2.804597862803e-004, (float) 1.455506215115e-004, (float) 2.808967923003e-004, (float) - 1.318263284371e-004, (float) - 2.810498626639e-004, + (float) 1.182425329275e-004, (float) 2.807049278836e-004, (float) - 1.049053516406e-004, (float) - 2.798865730517e-004, (float) 9.185585608604e-005, + (float) 2.786327455942e-004, (float) - 7.913713870114e-005, (float) - 2.770661665078e-004, (float) 6.658908505887e-005, (float) 2.749705769146e-004, + (float) - 5.452878257789e-005, (float) - 2.727139254030e-004, (float) 4.267470287693e-005, (float) 2.701901534524e-004, (float) - 3.098103063675e-005, + (float) - 2.672713250910e-004, (float) 1.959506007225e-005, (float) 2.640373512578e-004, (float) - 8.605011575155e-006, (float) - 2.607451266109e-004, + (float) - 2.297001211178e-006, (float) 2.571630808553e-004, (float) 1.298908745154e-005, (float) - 2.533379001119e-004, (float) - 2.346096839263e-005, + (float) 2.493326534241e-004, (float) 3.380378919976e-005, (float) - 2.450580921435e-004, (float) - 4.394022835345e-005, (float) 2.405543319009e-004, + (float) 5.380295174011e-005, (float) - 2.360269018314e-004, (float) - 6.362969041322e-005, (float) 2.313695981464e-004, (float) 7.350850871907e-005, + (float) - 2.263811595801e-004, (float) - 8.322092258564e-005, (float) 2.212630220095e-004, (float) 9.291206030779e-005, (float) - 2.159988725649e-004, + (float) - 1.026783876418e-004, (float) 2.105136263884e-004, (float) 1.125436526441e-004, (float) - 2.047505646951e-004, (float) - 1.224823030873e-004, + (float) 1.988019142637e-004, (float) 1.327632434198e-004, (float) - 1.923098357663e-004, (float) - 1.431090602159e-004, (float) 1.854489350961e-004, + (float) 1.536329356026e-004, (float) - 1.782437567680e-004, (float) - 1.645342831667e-004, (float) 1.705747652949e-004, (float) 1.760669168660e-004, + (float) - 1.619282978772e-004, (float) - 1.878370907468e-004, (float) 1.525152442899e-004, (float) 2.001325818624e-004, (float) - 1.420059883336e-004, + (float) - 2.128963846610e-004, (float) 1.302389953023e-004, (float) 2.262277295494e-004, (float) - 1.167662237676e-004, (float) - 2.398340044811e-004, + (float) 1.015795101283e-004, (float) 2.539623487208e-004, (float) - 8.400473971490e-005, (float) - 2.682059180462e-004, (float) 6.386636089117e-005, + (float) 2.826060999738e-004, (float) - 4.040411770010e-005, (float) - 2.965903264243e-004, (float) 1.328843895284e-005, (float) 3.099640470313e-004, + (float) 1.843967368528e-005, (float) - 3.217977487285e-004, (float) - 5.533287789728e-005, (float) 3.312977192436e-004, (float) 9.845446547453e-005, + (float) - 3.367394950886e-004, (float) - 1.482361183421e-004, (float) 3.366006455231e-004, (float) 2.057925864008e-004, (float) - 3.278882894771e-004, + (float) - 2.713518058883e-004, (float) 3.071631118731e-004, (float) 3.450469073084e-004, (float) - 2.693320767774e-004, (float) - 4.257030079639e-004, + (float) 2.077730139398e-004, (float) 5.103528659400e-004, (float) - 1.133457948942e-004, (float) - 5.918859501058e-004, (float) - 2.508428842065e-005, + (float) 6.567967063227e-004, (float) 2.211378711751e-004, (float) - 6.784989588347e-004, (float) - 4.869084931865e-004, (float) 6.081914903075e-004, + (float) 8.234667012568e-004, (float) - 3.557893702940e-004, (float) - 1.185316896754e-003, (float) - 2.336521287917e-004, (float) 1.370278722621e-003, + (float) 1.368071261832e-003, (float) - 6.494578851510e-004, (float) - 2.821616068751e-003, (float) - 3.355260288418e-003, (float) - 2.309090436241e-003, + (float) - 9.559790653313e-004, (float) - 1.916895913880e-004, (float) 3.796696928466e-006 + }; + + *lenh0 = lensh02; /* store 'number of coefficients' */ + *h0 = sh02; /* store pointer to h02[]-array */ +} + +#undef lensh02 +/* ....................... End of fill_slp_2_to_1() ....................... */ + + + +/* + ============================================================================ + + void fill_slp_3_to_1 (float **h0, long *lenh0); + ~~~~~~~~~~~~~~~~~~~ + + Description: + ~~~~~~~~~~~~ + + Initialize pointer to array with FIR coefficients for up/down + sampling low-pass filter with factor 3:1 or 1:3 and 24 bit + representation. + v1.0 filtdemo firpm 16000,2602,2667,0.3, 80, 728 + v1.1 filtdemo firpm 16000,2602,2667,0.3, 100, 872 + h3 = filtdemo('getfilt') + for i = 1:length(h3) fprintf('(float)%20.12e, ', h3(i)); + if rem(i,5) == 0 fprintf('\n'); end end + + Parameters: + ~~~~~~~~~~~ + h0: (Out) pointer to array with FIR coefficients + lenh0: (Out) pointer to number of coefficients + + + Return value: + ~~~~~~~~~~~~~ + None. + + Author: + ~~~~~~~ + + History: + ~~~~~~~~ + 05.April.2012 v1.0 - Added filters: SHQ2 and SHQ3 (France Telecom) + + ============================================================================ +*/ +#define lensh03 873 + +void fill_slp_3_to_1 (h0, lenh0) + float **h0; + long *lenh0; +{ + static float sh03[lensh03] = { + (float) - 5.702667454304e-005, (float) - 2.290248756652e-004, (float) - 5.695388694927e-004, (float) - 1.047262848994e-003, (float) - 1.506278259322e-003, + (float) - 1.697084386485e-003, (float) - 1.398843870300e-003, (float) - 5.776254455710e-004, (float) 5.267279465880e-004, (float) 1.474227829087e-003, + (float) 1.850941005949e-003, (float) 1.521886181517e-003, (float) 7.374635156026e-004, (float) - 2.831586756965e-006, (float) - 2.610758773407e-004, + (float) 5.790488592536e-005, (float) 6.558699193392e-004, (float) 1.065027553853e-003, (float) 9.887411557505e-004, (float) 5.083645939775e-004, + (float) 2.342940220659e-006, (float) - 1.567062494057e-004, (float) 1.110403908595e-004, (float) 5.457214173255e-004, (float) 7.717764862227e-004, + (float) 6.055726812478e-004, (float) 1.949515317766e-004, (float) - 1.184196188439e-004, (float) - 9.160203082544e-005, (float) 2.209374944482e-004, + (float) 5.265018221270e-004, (float) 5.531560214976e-004, (float) 2.815751711742e-004, (float) - 4.853153913830e-005, (float) - 1.563367357580e-004, + (float) 3.366074541317e-005, (float) 3.328093694602e-004, (float) 4.636714131641e-004, (float) 3.086568259652e-004, (float) 9.521084805123e-006, + (float) - 1.672524549008e-004, (float) - 7.321835254365e-005, (float) 1.915905388598e-004, (float) 3.756857462901e-004, (float) 3.081437126124e-004, + (float) 5.226907920748e-005, (float) - 1.575946050063e-004, (float) - 1.344789464591e-004, (float) 9.034674803378e-005, (float) 3.003518594011e-004, + (float) 2.971198893452e-004, (float) 8.384203623239e-005, (float) - 1.407963804041e-004, (float) - 1.703890216943e-004, (float) 1.652684652722e-005, + (float) 2.386510548738e-004, (float) 2.839782736591e-004, (float) 1.090673723768e-004, (float) - 1.216308514221e-004, (float) - 1.923295141096e-004, + (float) - 3.985072213105e-005, (float) 1.875991204246e-004, (float) 2.717660216481e-004, (float) 1.314707046626e-004, (float) - 1.008243557814e-004, + (float) - 2.054434756406e-004, (float) - 8.467292384865e-005, (float) 1.442573681930e-004, (float) 2.610066066766e-004, (float) 1.524510476976e-004, + (float) - 7.902847673495e-005, (float) - 2.130526218114e-004, (float) - 1.219890713673e-004, (float) 1.063399253112e-004, (float) 2.519859951800e-004, + (float) 1.734491436341e-004, (float) - 5.587231315091e-005, (float) - 2.169349988011e-004, (float) - 1.549061289756e-004, (float) 7.120763788262e-005, + (float) 2.437177281471e-004, (float) 1.948555676425e-004, (float) - 3.086033846812e-005, (float) - 2.175745882557e-004, (float) - 1.849236252476e-004, + (float) 3.722566423543e-005, (float) 2.353340603942e-004, (float) 2.167081052392e-004, (float) - 3.703170533307e-006, (float) - 2.152202989036e-004, + (float) - 2.130638454690e-004, (float) 3.078805881752e-006, (float) 2.259877675272e-004, (float) 2.390210432952e-004, (float) 2.617581267358e-005, + (float) - 2.094639911149e-004, (float) - 2.396408397869e-004, (float) - 3.220609123686e-005, (float) 2.146367670825e-004, (float) 2.613020076192e-004, + (float) 5.899602321765e-005, (float) - 1.997806524280e-004, (float) - 2.644528721997e-004, (float) - 6.908347167316e-005, (float) 2.003994342832e-004, + (float) 2.828118853525e-004, (float) 9.456005724760e-005, (float) - 1.859305896169e-004, (float) - 2.873053305036e-004, (float) - 1.078135783906e-004, + (float) 1.825933898221e-004, (float) 3.028816854225e-004, (float) 1.326435299606e-004, (float) - 1.676779512332e-004, (float) - 3.079331791370e-004, + (float) - 1.485750250569e-004, (float) 1.605453339105e-004, (float) 3.207874253071e-004, (float) 1.729981027969e-004, (float) - 1.446923844597e-004, + (float) - 3.258518962902e-004, (float) - 1.912839973272e-004, (float) 1.337849210997e-004, (float) 3.359204137548e-004, (float) 2.154852410306e-004, + (float) - 1.164355791130e-004, (float) - 3.402946219591e-004, (float) - 2.356749110871e-004, (float) 1.017519030470e-004, (float) 3.473219066124e-004, + (float) 2.595861094810e-004, (float) - 8.247985162440e-005, (float) - 3.501778624332e-004, (float) - 2.808530765872e-004, (float) 6.448731739501e-005, + (float) 3.542546122559e-004, (float) 3.044839629528e-004, (float) - 4.306342775237e-005, (float) - 3.551282513302e-004, (float) - 3.263921987448e-004, + (float) 2.192426783394e-005, (float) 3.561971331453e-004, (float) 3.497859191992e-004, (float) 2.055980934252e-006, (float) - 3.544148970394e-004, + (float) - 3.717977628683e-004, (float) - 2.629987685449e-005, (float) 3.520514596533e-004, (float) 3.944857642507e-004, (float) 5.277571215679e-005, + (float) - 3.471915002737e-004, (float) - 4.160648347652e-004, (float) - 7.993813455368e-005, (float) 3.411114019359e-004, (float) 4.376339448427e-004, + (float) 1.088493550823e-004, (float) - 3.327174320834e-004, (float) - 4.581277303213e-004, (float) - 1.385955596429e-004, (float) 3.227066885945e-004, + (float) 4.780809063323e-004, (float) 1.696775520342e-004, (float) - 3.105144597273e-004, (float) - 4.968659484029e-004, (float) - 2.014702976084e-004, + (float) 2.967304590010e-004, (float) 5.150937489368e-004, (float) 2.347087797104e-004, (float) - 2.804528555952e-004, (float) - 5.317678587328e-004, + (float) - 2.684301130237e-004, (float) 2.625408226728e-004, (float) 5.476982715351e-004, (float) 3.035278106007e-004, (float) - 2.419332992486e-004, + (float) - 5.617064251919e-004, (float) - 3.388485533212e-004, (float) 2.196467033878e-004, (float) 5.746786785084e-004, (float) 3.752457273392e-004, + (float) - 1.947946881500e-004, (float) - 5.857581310721e-004, (float) - 4.120508580248e-004, (float) 1.677356672876e-004, (float) 5.950203471973e-004, + (float) 4.492196431000e-004, (float) - 1.384637472272e-004, (float) - 6.023600081843e-004, (float) - 4.866311063082e-004, (float) 1.070101277961e-004, + (float) 6.077115455789e-004, (float) 5.242229671950e-004, (float) - 7.332517897366e-005, (float) - 6.108956903682e-004, (float) - 5.617572406918e-004, + (float) 3.765710388723e-005, (float) 6.122535665132e-004, (float) 5.998690210736e-004, (float) 1.103337252265e-006, (float) - 6.101918060802e-004, + (float) - 6.366652752751e-004, (float) - 4.101866700778e-005, (float) 6.065187804431e-004, (float) 6.737711020146e-004, (float) 8.349599417419e-005, + (float) - 6.001874205543e-004, (float) - 7.107611600986e-004, (float) - 1.289670732718e-004, (float) 5.898895822538e-004, (float) 7.457161842468e-004, + (float) 1.753449481877e-004, (float) - 5.774443295022e-004, (float) - 7.798678193657e-004, (float) - 2.230334725061e-004, (float) 5.635271134980e-004, + (float) 8.152306244447e-004, (float) 2.755046534225e-004, (float) - 5.434273506344e-004, (float) - 8.464802274973e-004, (float) - 3.277092661666e-004, + (float) 5.210307991128e-004, (float) 8.756596447340e-004, (float) 3.794273420016e-004, (float) - 4.990318212014e-004, (float) - 9.079503131393e-004, + (float) - 4.380386208554e-004, (float) 4.685715007029e-004, (float) 9.341398358924e-004, (float) 4.952457363886e-004, (float) - 4.360095410718e-004, + (float) - 9.581583004572e-004, (float) - 5.526178358650e-004, (float) 4.017025817632e-004, (float) 9.817267986707e-004, (float) 6.126724675261e-004, + (float) - 3.629093431450e-004, (float) - 1.002439646862e-003, (float) - 6.737587650718e-004, (float) 3.204253623397e-004, (float) 1.020517658997e-003, + (float) 7.360180736312e-004, (float) - 2.737981347557e-004, (float) - 1.035166912472e-003, (float) - 7.986608366722e-004, (float) 2.233015838909e-004, + (float) 1.045721090576e-003, (float) 8.598542706791e-004, (float) - 1.720078687206e-004, (float) - 1.056474335818e-003, (float) - 9.249608577418e-004, + (float) 1.139016227189e-004, (float) 1.061470672775e-003, (float) 9.889032323226e-004, (float) - 5.260312145850e-005, (float) - 1.062802973797e-003, + (float) - 1.052661166844e-003, (float) - 1.234469409022e-005, (float) 1.060136819634e-003, (float) 1.115982607845e-003, (float) 8.099003769379e-005, + (float) - 1.052868934904e-003, (float) - 1.177547710041e-003, (float) - 1.512053491539e-004, (float) 1.044016157338e-003, (float) 1.241286624384e-003, + (float) 2.276412600050e-004, (float) - 1.028714494774e-003, (float) - 1.302806041666e-003, (float) - 3.068949503392e-004, (float) 1.009322937005e-003, + (float) 1.363843344369e-003, (float) 3.906609064444e-004, (float) - 9.838656513075e-004, (float) - 1.422262246448e-003, (float) - 4.770635768666e-004, + (float) 9.535551337159e-004, (float) 1.478448816939e-003, (float) 5.657155736003e-004, (float) - 9.194440566142e-004, (float) - 1.534039735215e-003, + (float) - 6.587006775073e-004, (float) 8.793107473467e-004, (float) 1.587111750398e-003, (float) 7.547147875959e-004, (float) - 8.338828124821e-004, + (float) - 1.638222602213e-003, (float) - 8.546083977396e-004, (float) 7.818895385424e-004, (float) 1.686035622285e-003, (float) 9.575865466165e-004, + (float) - 7.231383262379e-004, (float) - 1.729347857177e-003, (float) - 1.061753152135e-003, (float) 6.598691919979e-004, (float) 1.770597985361e-003, + (float) 1.169781516343e-003, (float) - 5.891500710358e-004, (float) - 1.806699639550e-003, (float) - 1.278568313904e-003, (float) 5.141179931545e-004, + (float) 1.841027853974e-003, (float) 1.391905141504e-003, (float) - 4.306947853300e-004, (float) - 1.869713791607e-003, (float) - 1.506708961470e-003, + (float) 3.409327833389e-004, (float) 1.894038136926e-003, (float) 1.624014474020e-003, (float) - 2.437048054541e-004, (float) - 1.912908177017e-003, + (float) - 1.743223810231e-003, (float) 1.387216181787e-004, (float) 1.925117887436e-003, (float) 1.862486593022e-003, (float) - 2.821070804092e-005, + (float) - 1.933229951667e-003, (float) - 1.984800448536e-003, (float) - 9.123378372710e-005, (float) 1.933710705029e-003, (float) 2.106846839834e-003, + (float) 2.165780283200e-004, (float) - 1.929629718754e-003, (float) - 2.232160937187e-003, (float) - 3.519049528335e-004, (float) 1.916818837101e-003, + (float) 2.357203940722e-003, (float) 4.947204738569e-004, (float) - 1.896926099071e-003, (float) - 2.483378267598e-003, (float) - 6.466372123975e-004, + (float) 1.868195138012e-003, (float) 2.609246811353e-003, (float) 8.069238284096e-004, (float) - 1.830682441595e-003, (float) - 2.734527768949e-003, + (float) - 9.751897771009e-004, (float) 1.785017781192e-003, (float) 2.860388753350e-003, (float) 1.153172877730e-003, (float) - 1.729312203396e-003, + (float) - 2.985339528727e-003, (float) - 1.339916394519e-003, (float) 1.664473634983e-003, (float) 3.110932565488e-003, (float) 1.537838751758e-003, + (float) - 1.587754627653e-003, (float) - 3.234954638367e-003, (float) - 1.745673580609e-003, (float) 1.499886644666e-003, (float) 3.358421754204e-003, + (float) 1.965130821805e-003, (float) - 1.398872765578e-003, (float) - 3.479845703961e-003, (float) - 2.195572687404e-003, (float) 1.285003495634e-003, + (float) 3.600016865417e-003, (float) 2.438562967617e-003, (float) - 1.156618036116e-003, (float) - 3.718180542243e-003, (float) - 2.694534774140e-003, + (float) 1.012925180360e-003, (float) 3.834373750933e-003, (float) 2.964679101911e-003, (float) - 8.525485951972e-004, (float) - 3.948403524289e-003, + (float) - 3.250343132486e-003, (float) 6.737384489508e-004, (float) 4.059688224041e-003, (float) 3.552470544664e-003, (float) - 4.754275550708e-004, + (float) - 4.168928142770e-003, (float) - 3.873956808281e-003, (float) 2.542076569209e-004, (float) 4.274495623229e-003, (float) 4.215541860516e-003, + (float) - 8.876791492217e-006, (float) - 4.377372661019e-003, (float) - 4.581049335760e-003, (float) - 2.649760888835e-004, (float) 4.475649547624e-003, + (float) 4.971772999526e-003, (float) 5.691152906036e-004, (float) - 4.570711772495e-003, (float) - 5.392866001693e-003, (float) - 9.088730314323e-004, + (float) 4.661637388475e-003, (float) 5.848570522367e-003, (float) 1.289087294300e-003, (float) - 4.748854210334e-003, (float) - 6.345622677870e-003, + (float) - 1.717082156368e-003, (float) 4.831896281817e-003, (float) 6.891804999608e-003, (float) 2.201630775936e-003, (float) - 4.910578903278e-003, + (float) - 7.497415910832e-003, (float) - 2.754230074063e-003, (float) 4.984610468332e-003, (float) 8.175812718542e-003, (float) 3.389552293110e-003, + (float) - 5.054700764131e-003, (float) - 8.946696508829e-003, (float) - 4.129951171808e-003, (float) 5.118515051062e-003, (float) 9.833011394039e-003, + (float) 5.001471509665e-003, (float) - 5.178437003297e-003, (float) - 1.087335325218e-002, (float) - 6.047856746429e-003, (float) 5.230953032476e-003, + (float) 1.211655268747e-002, (float) 7.325438345332e-003, (float) - 5.280041797037e-003, (float) - 1.364671806495e-002, (float) - 8.931122228028e-003, + (float) 5.322573977944e-003, (float) 1.558985548986e-002, (float) 1.101542440923e-002, (float) - 5.359868891871e-003, (float) - 1.816627590250e-002, + (float) - 1.384581531568e-002, (float) 5.391484192615e-003, (float) 2.178322539469e-002, (float) 1.793508230734e-002, (float) - 5.418411065727e-003, + (float) - 2.729479625998e-002, (float) - 2.441474613854e-002, (float) 5.438809365830e-003, (float) 3.683129238215e-002, (float) 3.635025705283e-002, + (float) - 5.453919890093e-003, (float) - 5.764317282647e-002, (float) - 6.601087176309e-002, (float) 5.463088425909e-003, (float) 1.404772330964e-001, + (float) 2.728880604165e-001, (float) 3.278675322959e-001, (float) 2.728880604165e-001, (float) 1.404772330964e-001, (float) 5.463088425909e-003, + (float) - 6.601087176309e-002, (float) - 5.764317282647e-002, (float) - 5.453919890093e-003, (float) 3.635025705283e-002, (float) 3.683129238215e-002, + (float) 5.438809365830e-003, (float) - 2.441474613854e-002, (float) - 2.729479625998e-002, (float) - 5.418411065727e-003, (float) 1.793508230734e-002, + (float) 2.178322539469e-002, (float) 5.391484192615e-003, (float) - 1.384581531568e-002, (float) - 1.816627590250e-002, (float) - 5.359868891871e-003, + (float) 1.101542440923e-002, (float) 1.558985548986e-002, (float) 5.322573977944e-003, (float) - 8.931122228028e-003, (float) - 1.364671806495e-002, + (float) - 5.280041797037e-003, (float) 7.325438345332e-003, (float) 1.211655268747e-002, (float) 5.230953032476e-003, (float) - 6.047856746429e-003, + (float) - 1.087335325218e-002, (float) - 5.178437003297e-003, (float) 5.001471509665e-003, (float) 9.833011394039e-003, (float) 5.118515051062e-003, + (float) - 4.129951171808e-003, (float) - 8.946696508829e-003, (float) - 5.054700764131e-003, (float) 3.389552293110e-003, (float) 8.175812718542e-003, + (float) 4.984610468332e-003, (float) - 2.754230074063e-003, (float) - 7.497415910832e-003, (float) - 4.910578903278e-003, (float) 2.201630775936e-003, + (float) 6.891804999608e-003, (float) 4.831896281817e-003, (float) - 1.717082156368e-003, (float) - 6.345622677870e-003, (float) - 4.748854210334e-003, + (float) 1.289087294300e-003, (float) 5.848570522367e-003, (float) 4.661637388475e-003, (float) - 9.088730314323e-004, (float) - 5.392866001693e-003, + (float) - 4.570711772495e-003, (float) 5.691152906036e-004, (float) 4.971772999526e-003, (float) 4.475649547624e-003, (float) - 2.649760888835e-004, + (float) - 4.581049335760e-003, (float) - 4.377372661019e-003, (float) - 8.876791492217e-006, (float) 4.215541860516e-003, (float) 4.274495623229e-003, + (float) 2.542076569209e-004, (float) - 3.873956808281e-003, (float) - 4.168928142770e-003, (float) - 4.754275550708e-004, (float) 3.552470544664e-003, + (float) 4.059688224041e-003, (float) 6.737384489508e-004, (float) - 3.250343132486e-003, (float) - 3.948403524289e-003, (float) - 8.525485951972e-004, + (float) 2.964679101911e-003, (float) 3.834373750933e-003, (float) 1.012925180360e-003, (float) - 2.694534774140e-003, (float) - 3.718180542243e-003, + (float) - 1.156618036116e-003, (float) 2.438562967617e-003, (float) 3.600016865417e-003, (float) 1.285003495634e-003, (float) - 2.195572687404e-003, + (float) - 3.479845703961e-003, (float) - 1.398872765578e-003, (float) 1.965130821805e-003, (float) 3.358421754204e-003, (float) 1.499886644666e-003, + (float) - 1.745673580609e-003, (float) - 3.234954638367e-003, (float) - 1.587754627653e-003, (float) 1.537838751758e-003, (float) 3.110932565488e-003, + (float) 1.664473634983e-003, (float) - 1.339916394519e-003, (float) - 2.985339528727e-003, (float) - 1.729312203396e-003, (float) 1.153172877730e-003, + (float) 2.860388753350e-003, (float) 1.785017781192e-003, (float) - 9.751897771009e-004, (float) - 2.734527768949e-003, (float) - 1.830682441595e-003, + (float) 8.069238284096e-004, (float) 2.609246811353e-003, (float) 1.868195138012e-003, (float) - 6.466372123975e-004, (float) - 2.483378267598e-003, + (float) - 1.896926099071e-003, (float) 4.947204738569e-004, (float) 2.357203940722e-003, (float) 1.916818837101e-003, (float) - 3.519049528335e-004, + (float) - 2.232160937187e-003, (float) - 1.929629718754e-003, (float) 2.165780283200e-004, (float) 2.106846839834e-003, (float) 1.933710705029e-003, + (float) - 9.123378372710e-005, (float) - 1.984800448536e-003, (float) - 1.933229951667e-003, (float) - 2.821070804092e-005, (float) 1.862486593022e-003, + (float) 1.925117887436e-003, (float) 1.387216181787e-004, (float) - 1.743223810231e-003, (float) - 1.912908177017e-003, (float) - 2.437048054541e-004, + (float) 1.624014474020e-003, (float) 1.894038136926e-003, (float) 3.409327833389e-004, (float) - 1.506708961470e-003, (float) - 1.869713791607e-003, + (float) - 4.306947853300e-004, (float) 1.391905141504e-003, (float) 1.841027853974e-003, (float) 5.141179931545e-004, (float) - 1.278568313904e-003, + (float) - 1.806699639550e-003, (float) - 5.891500710358e-004, (float) 1.169781516343e-003, (float) 1.770597985361e-003, (float) 6.598691919979e-004, + (float) - 1.061753152135e-003, (float) - 1.729347857177e-003, (float) - 7.231383262379e-004, (float) 9.575865466165e-004, (float) 1.686035622285e-003, + (float) 7.818895385424e-004, (float) - 8.546083977396e-004, (float) - 1.638222602213e-003, (float) - 8.338828124821e-004, (float) 7.547147875959e-004, + (float) 1.587111750398e-003, (float) 8.793107473467e-004, (float) - 6.587006775073e-004, (float) - 1.534039735215e-003, (float) - 9.194440566142e-004, + (float) 5.657155736003e-004, (float) 1.478448816939e-003, (float) 9.535551337159e-004, (float) - 4.770635768666e-004, (float) - 1.422262246448e-003, + (float) - 9.838656513075e-004, (float) 3.906609064444e-004, (float) 1.363843344369e-003, (float) 1.009322937005e-003, (float) - 3.068949503392e-004, + (float) - 1.302806041666e-003, (float) - 1.028714494774e-003, (float) 2.276412600050e-004, (float) 1.241286624384e-003, (float) 1.044016157338e-003, + (float) - 1.512053491539e-004, (float) - 1.177547710041e-003, (float) - 1.052868934904e-003, (float) 8.099003769379e-005, (float) 1.115982607845e-003, + (float) 1.060136819634e-003, (float) - 1.234469409022e-005, (float) - 1.052661166844e-003, (float) - 1.062802973797e-003, (float) - 5.260312145850e-005, + (float) 9.889032323226e-004, (float) 1.061470672775e-003, (float) 1.139016227189e-004, (float) - 9.249608577418e-004, (float) - 1.056474335818e-003, + (float) - 1.720078687206e-004, (float) 8.598542706791e-004, (float) 1.045721090576e-003, (float) 2.233015838909e-004, (float) - 7.986608366722e-004, + (float) - 1.035166912472e-003, (float) - 2.737981347557e-004, (float) 7.360180736312e-004, (float) 1.020517658997e-003, (float) 3.204253623397e-004, + (float) - 6.737587650718e-004, (float) - 1.002439646862e-003, (float) - 3.629093431450e-004, (float) 6.126724675261e-004, (float) 9.817267986707e-004, + (float) 4.017025817632e-004, (float) - 5.526178358650e-004, (float) - 9.581583004572e-004, (float) - 4.360095410718e-004, (float) 4.952457363886e-004, + (float) 9.341398358924e-004, (float) 4.685715007029e-004, (float) - 4.380386208554e-004, (float) - 9.079503131393e-004, (float) - 4.990318212014e-004, + (float) 3.794273420016e-004, (float) 8.756596447340e-004, (float) 5.210307991128e-004, (float) - 3.277092661666e-004, (float) - 8.464802274973e-004, + (float) - 5.434273506344e-004, (float) 2.755046534225e-004, (float) 8.152306244447e-004, (float) 5.635271134980e-004, (float) - 2.230334725061e-004, + (float) - 7.798678193657e-004, (float) - 5.774443295022e-004, (float) 1.753449481877e-004, (float) 7.457161842468e-004, (float) 5.898895822538e-004, + (float) - 1.289670732718e-004, (float) - 7.107611600986e-004, (float) - 6.001874205543e-004, (float) 8.349599417419e-005, (float) 6.737711020146e-004, + (float) 6.065187804431e-004, (float) - 4.101866700778e-005, (float) - 6.366652752751e-004, (float) - 6.101918060802e-004, (float) 1.103337252265e-006, + (float) 5.998690210736e-004, (float) 6.122535665132e-004, (float) 3.765710388723e-005, (float) - 5.617572406918e-004, (float) - 6.108956903682e-004, + (float) - 7.332517897366e-005, (float) 5.242229671950e-004, (float) 6.077115455789e-004, (float) 1.070101277961e-004, (float) - 4.866311063082e-004, + (float) - 6.023600081843e-004, (float) - 1.384637472272e-004, (float) 4.492196431000e-004, (float) 5.950203471973e-004, (float) 1.677356672876e-004, + (float) - 4.120508580248e-004, (float) - 5.857581310721e-004, (float) - 1.947946881500e-004, (float) 3.752457273392e-004, (float) 5.746786785084e-004, + (float) 2.196467033878e-004, (float) - 3.388485533212e-004, (float) - 5.617064251919e-004, (float) - 2.419332992486e-004, (float) 3.035278106007e-004, + (float) 5.476982715351e-004, (float) 2.625408226728e-004, (float) - 2.684301130237e-004, (float) - 5.317678587328e-004, (float) - 2.804528555952e-004, + (float) 2.347087797104e-004, (float) 5.150937489368e-004, (float) 2.967304590010e-004, (float) - 2.014702976084e-004, (float) - 4.968659484029e-004, + (float) - 3.105144597273e-004, (float) 1.696775520342e-004, (float) 4.780809063323e-004, (float) 3.227066885945e-004, (float) - 1.385955596429e-004, + (float) - 4.581277303213e-004, (float) - 3.327174320834e-004, (float) 1.088493550823e-004, (float) 4.376339448427e-004, (float) 3.411114019359e-004, + (float) - 7.993813455368e-005, (float) - 4.160648347652e-004, (float) - 3.471915002737e-004, (float) 5.277571215679e-005, (float) 3.944857642507e-004, + (float) 3.520514596533e-004, (float) - 2.629987685449e-005, (float) - 3.717977628683e-004, (float) - 3.544148970394e-004, (float) 2.055980934252e-006, + (float) 3.497859191992e-004, (float) 3.561971331453e-004, (float) 2.192426783394e-005, (float) - 3.263921987448e-004, (float) - 3.551282513302e-004, + (float) - 4.306342775237e-005, (float) 3.044839629528e-004, (float) 3.542546122559e-004, (float) 6.448731739501e-005, (float) - 2.808530765872e-004, + (float) - 3.501778624332e-004, (float) - 8.247985162440e-005, (float) 2.595861094810e-004, (float) 3.473219066124e-004, (float) 1.017519030470e-004, + (float) - 2.356749110871e-004, (float) - 3.402946219591e-004, (float) - 1.164355791130e-004, (float) 2.154852410306e-004, (float) 3.359204137548e-004, + (float) 1.337849210997e-004, (float) - 1.912839973272e-004, (float) - 3.258518962902e-004, (float) - 1.446923844597e-004, (float) 1.729981027969e-004, + (float) 3.207874253071e-004, (float) 1.605453339105e-004, (float) - 1.485750250569e-004, (float) - 3.079331791370e-004, (float) - 1.676779512332e-004, + (float) 1.326435299606e-004, (float) 3.028816854225e-004, (float) 1.825933898221e-004, (float) - 1.078135783906e-004, (float) - 2.873053305036e-004, + (float) - 1.859305896169e-004, (float) 9.456005724760e-005, (float) 2.828118853525e-004, (float) 2.003994342832e-004, (float) - 6.908347167316e-005, + (float) - 2.644528721997e-004, (float) - 1.997806524280e-004, (float) 5.899602321765e-005, (float) 2.613020076192e-004, (float) 2.146367670825e-004, + (float) - 3.220609123686e-005, (float) - 2.396408397869e-004, (float) - 2.094639911149e-004, (float) 2.617581267358e-005, (float) 2.390210432952e-004, + (float) 2.259877675272e-004, (float) 3.078805881752e-006, (float) - 2.130638454690e-004, (float) - 2.152202989036e-004, (float) - 3.703170533307e-006, + (float) 2.167081052392e-004, (float) 2.353340603942e-004, (float) 3.722566423543e-005, (float) - 1.849236252476e-004, (float) - 2.175745882557e-004, + (float) - 3.086033846812e-005, (float) 1.948555676425e-004, (float) 2.437177281471e-004, (float) 7.120763788262e-005, (float) - 1.549061289756e-004, + (float) - 2.169349988011e-004, (float) - 5.587231315091e-005, (float) 1.734491436341e-004, (float) 2.519859951800e-004, (float) 1.063399253112e-004, + (float) - 1.219890713673e-004, (float) - 2.130526218114e-004, (float) - 7.902847673495e-005, (float) 1.524510476976e-004, (float) 2.610066066766e-004, + (float) 1.442573681930e-004, (float) - 8.467292384865e-005, (float) - 2.054434756406e-004, (float) - 1.008243557814e-004, (float) 1.314707046626e-004, + (float) 2.717660216481e-004, (float) 1.875991204246e-004, (float) - 3.985072213105e-005, (float) - 1.923295141096e-004, (float) - 1.216308514221e-004, + (float) 1.090673723768e-004, (float) 2.839782736591e-004, (float) 2.386510548738e-004, (float) 1.652684652722e-005, (float) - 1.703890216943e-004, + (float) - 1.407963804041e-004, (float) 8.384203623239e-005, (float) 2.971198893452e-004, (float) 3.003518594011e-004, (float) 9.034674803378e-005, + (float) - 1.344789464591e-004, (float) - 1.575946050063e-004, (float) 5.226907920748e-005, (float) 3.081437126124e-004, (float) 3.756857462901e-004, + (float) 1.915905388598e-004, (float) - 7.321835254365e-005, (float) - 1.672524549008e-004, (float) 9.521084805123e-006, (float) 3.086568259652e-004, + (float) 4.636714131641e-004, (float) 3.328093694602e-004, (float) 3.366074541317e-005, (float) - 1.563367357580e-004, (float) - 4.853153913830e-005, + (float) 2.815751711742e-004, (float) 5.531560214976e-004, (float) 5.265018221270e-004, (float) 2.209374944482e-004, (float) - 9.160203082544e-005, + (float) - 1.184196188439e-004, (float) 1.949515317766e-004, (float) 6.055726812478e-004, (float) 7.717764862227e-004, (float) 5.457214173255e-004, + (float) 1.110403908595e-004, (float) - 1.567062494057e-004, (float) 2.342940220659e-006, (float) 5.083645939775e-004, (float) 9.887411557505e-004, + (float) 1.065027553853e-003, (float) 6.558699193392e-004, (float) 5.790488592536e-005, (float) - 2.610758773407e-004, (float) - 2.831586756965e-006, + (float) 7.374635156026e-004, (float) 1.521886181517e-003, (float) 1.850941005949e-003, (float) 1.474227829087e-003, (float) 5.267279465880e-004, + (float) - 5.776254455710e-004, (float) - 1.398843870300e-003, (float) - 1.697084386485e-003, (float) - 1.506278259322e-003, (float) - 1.047262848994e-003, + (float) - 5.695388694927e-004, (float) - 2.290248756652e-004, (float) - 5.702667454304e-005 + }; + + *lenh0 = lensh03; /* store 'number of coefficients' */ + *h0 = sh03; /* store pointer to h02[]-array */ +} + +#undef lensh03 +/* ........................ End of fill_lp_3_to_1() ........................ */ + + + /* ************************* END OF FIR-FLAT.C ************************** */ diff --git a/src/fir/fir-wb.c b/src/fir/fir-wb.c index 15bf4727..5b633b3b 100644 --- a/src/fir/fir-wb.c +++ b/src/fir/fir-wb.c @@ -77,6 +77,8 @@ ORIGINAL BY: Cyril Guillaume & Stephane Ragot 11.May.2007 v2.3 Added 20-20000 Hz bandpass filter Ingemar Johansson & Jonas Svedberg, Ericsson + 05.April.2012 v2.3 - Added filters: HP50_32KHZ, HP50_48KHZ (France Telecom) + ============================================================================= */ @@ -1828,3 +1830,737 @@ SCD_FIR *bp20k_48khz_init () { /* .................... End of bp20k_48khz_init() .................... */ /* ************************** END OF FIR-WB.C *************************** */ + + + +/* + ============================================================================ + + void fill_hp50_32khz (float **h0, long *lenh0); + ~~~~~~~~~~~~~~~~~~~~~ + + Description: + ~~~~~~~~~~~~ + Fill filter coefficients for 50 Hz (3dB point) highpass filtering for samples at 32 kHz. + firpm(1118,[0 3/16000 66/16000 1],[0 0 1 1 ],[40 1]) + Same lengt, HP response and passband oscillation (+-0.15dB) as the 14KBP filter + + Parameters: + ~~~~~~~~~~~ + h0: (Out) pointer to array with FIR coefficients + lenh0: (Out) pointer to number of coefficients + + Return value: + ~~~~~~~~~~~~~ + None. + + History: + ~~~~~~~~ + 05.April.2012 v1.0 - Added filters: HP50_32KHZ, HP50_48KHZ (France Telecom) + + ============================================================================ +*/ +#undef HP50_32K_LEN +#define HP50_32K_LEN 1119 +void fill_hp50_32khz (float **h0, long *lenh0) { + static float hp50_32khz_coeff[HP50_32K_LEN] = { + (F) 9.2342753e-003, (F) 1.5551665e-004, (F) 1.5663328e-004, (F) 1.5798547e-004, (F) 1.5903747e-004, + (F) 1.6033147e-004, (F) 1.6129533e-004, (F) 1.6253497e-004, (F) 1.6343643e-004, (F) 1.6461419e-004, + (F) 1.6544194e-004, (F) 1.6657230e-004, (F) 1.6734333e-004, (F) 1.6843147e-004, (F) 1.6914017e-004, + (F) 1.7020317e-004, (F) 1.7087787e-004, (F) 1.7195115e-004, (F) 1.7260586e-004, (F) 1.7371570e-004, + (F) 1.7438288e-004, (F) 1.7560111e-004, (F) 1.7633494e-004, (F) 1.7773870e-004, (F) 1.7859148e-004, + (F) 1.8031784e-004, (F) 1.8138467e-004, (F) 1.8364291e-004, (F) 1.8500691e-004, (F) 1.8826921e-004, + (F) 1.9002553e-004, (F) 1.9648117e-004, (F) 1.7591939e-004, (F) 1.8640971e-004, (F) 1.8950640e-004, + (F) 1.8933708e-004, (F) 1.9094255e-004, (F) 1.9111524e-004, (F) 1.9238679e-004, (F) 1.9267245e-004, + (F) 1.9374881e-004, (F) 1.9407034e-004, (F) 1.9502938e-004, (F) 1.9535326e-004, (F) 1.9621245e-004, + (F) 1.9652536e-004, (F) 1.9732846e-004, (F) 1.9764305e-004, (F) 1.9840997e-004, (F) 1.9872274e-004, + (F) 1.9948456e-004, (F) 1.9982454e-004, (F) 2.0062041e-004, (F) 2.0098888e-004, (F) 2.0182655e-004, + (F) 2.0221283e-004, (F) 2.0309827e-004, (F) 2.0343574e-004, (F) 2.0429009e-004, (F) 2.0439317e-004, + (F) 2.0505697e-004, (F) 2.0443830e-004, (F) 2.0447446e-004, (F) 2.0117747e-004, (F) 2.0668075e-004, + (F) 2.0606828e-004, (F) 2.0522994e-004, (F) 2.0580818e-004, (F) 2.0551705e-004, (F) 2.0583582e-004, + (F) 2.0559447e-004, (F) 2.0575204e-004, (F) 2.0551182e-004, (F) 2.0556260e-004, (F) 2.0528478e-004, + (F) 2.0524898e-004, (F) 2.0494755e-004, (F) 2.0486118e-004, (F) 2.0453189e-004, (F) 2.0439794e-004, + (F) 2.0404606e-004, (F) 2.0389248e-004, (F) 2.0352446e-004, (F) 2.0334171e-004, (F) 2.0292316e-004, + (F) 2.0268931e-004, (F) 2.0218689e-004, (F) 2.0186213e-004, (F) 2.0119510e-004, (F) 2.0072227e-004, + (F) 1.9983291e-004, (F) 1.9922601e-004, (F) 1.9811086e-004, (F) 1.9764812e-004, (F) 1.9670052e-004, + (F) 1.9821206e-004, (F) 1.9574339e-004, (F) 1.9460314e-004, (F) 1.9434052e-004, (F) 1.9312581e-004, + (F) 1.9244888e-004, (F) 1.9126723e-004, (F) 1.9044159e-004, (F) 1.8925727e-004, (F) 1.8831959e-004, + (F) 1.8709650e-004, (F) 1.8608695e-004, (F) 1.8483886e-004, (F) 1.8376430e-004, (F) 1.8246886e-004, + (F) 1.8133430e-004, (F) 1.8000008e-004, (F) 1.7881024e-004, (F) 1.7740887e-004, (F) 1.7613174e-004, + (F) 1.7463511e-004, (F) 1.7326225e-004, (F) 1.7165185e-004, (F) 1.7016635e-004, (F) 1.6842980e-004, + (F) 1.6686975e-004, (F) 1.6506208e-004, (F) 1.6351953e-004, (F) 1.6172121e-004, (F) 1.6035465e-004, + (F) 1.5856474e-004, (F) 1.5725670e-004, (F) 1.5400320e-004, (F) 1.5251907e-004, (F) 1.5099189e-004, + (F) 1.4860587e-004, (F) 1.4676216e-004, (F) 1.4449103e-004, (F) 1.4250292e-004, (F) 1.4021375e-004, + (F) 1.3809993e-004, (F) 1.3577053e-004, (F) 1.3357737e-004, (F) 1.3119183e-004, (F) 1.2890182e-004, + (F) 1.2644454e-004, (F) 1.2407353e-004, (F) 1.2154154e-004, (F) 1.1906901e-004, (F) 1.1642978e-004, + (F) 1.1384795e-004, (F) 1.1110845e-004, (F) 1.0843159e-004, (F) 1.0559403e-004, (F) 1.0283674e-004, + (F) 9.9931180e-005, (F) 9.7143301e-005, (F) 9.4193407e-005, (F) 9.1380999e-005, (F) 8.8349417e-005, + (F) 8.5454155e-005, (F) 8.2145791e-005, (F) 7.8972973e-005, (F) 7.5176800e-005, (F) 7.2644410e-005, + (F) 6.9400379e-005, (F) 6.5655639e-005, (F) 6.2520637e-005, (F) 5.8926380e-005, (F) 5.5592602e-005, + (F) 5.1960346e-005, (F) 4.8492626e-005, (F) 4.4819152e-005, (F) 4.1246975e-005, (F) 3.7486700e-005, + (F) 3.3802916e-005, (F) 2.9964364e-005, (F) 2.6183621e-005, (F) 2.2246019e-005, (F) 1.8349478e-005, + (F) 1.4312671e-005, (F) 1.0327219e-005, (F) 6.2116278e-006, (F) 2.1468476e-006, (F) - 2.0462664e-006, + (F) - 6.1754788e-006, (F) - 1.0433728e-005, (F) - 1.4631174e-005, (F) - 1.8994868e-005, (F) - 2.3307139e-005, + (F) - 2.7830625e-005, (F) - 3.2298035e-005, (F) - 3.7020060e-005, (F) - 4.1543856e-005, (F) - 4.6245143e-005, + (F) - 5.0403230e-005, (F) - 5.5414477e-005, (F) - 6.0403894e-005, (F) - 6.4897114e-005, (F) - 6.9912852e-005, + (F) - 7.4678495e-005, (F) - 7.9718290e-005, (F) - 8.4612320e-005, (F) - 8.9698178e-005, (F) - 9.4721351e-005, + (F) - 9.9898650e-005, (F) - 1.0502188e-004, (F) - 1.1027447e-004, (F) - 1.1550253e-004, (F) - 1.2085379e-004, + (F) - 1.2617687e-004, (F) - 1.3159904e-004, (F) - 1.3699375e-004, (F) - 1.4249159e-004, (F) - 1.4796949e-004, + (F) - 1.5355011e-004, (F) - 1.5911076e-004, (F) - 1.6479026e-004, (F) - 1.7046432e-004, (F) - 1.7627586e-004, + (F) - 1.8206851e-004, (F) - 1.8799894e-004, (F) - 1.9387145e-004, (F) - 1.9986051e-004, (F) - 2.0570182e-004, + (F) - 2.1170656e-004, (F) - 2.1762031e-004, (F) - 2.2408600e-004, (F) - 2.3020843e-004, (F) - 2.3612941e-004, + (F) - 2.4259571e-004, (F) - 2.4875579e-004, (F) - 2.5518652e-004, (F) - 2.6147595e-004, (F) - 2.6796135e-004, + (F) - 2.7438622e-004, (F) - 2.8093774e-004, (F) - 2.8744468e-004, (F) - 2.9407149e-004, (F) - 3.0067960e-004, + (F) - 3.0738263e-004, (F) - 3.1405879e-004, (F) - 3.2082305e-004, (F) - 3.2758021e-004, (F) - 3.3443304e-004, + (F) - 3.4128144e-004, (F) - 3.4822305e-004, (F) - 3.5516575e-004, (F) - 3.6221220e-004, (F) - 3.6925666e-004, + (F) - 3.7639420e-004, (F) - 3.8350434e-004, (F) - 3.9070041e-004, (F) - 3.9784824e-004, (F) - 4.0508935e-004, + (F) - 4.1228858e-004, (F) - 4.1967673e-004, (F) - 4.2705956e-004, (F) - 4.3464576e-004, (F) - 4.4189166e-004, + (F) - 4.4925726e-004, (F) - 4.5702829e-004, (F) - 4.6443246e-004, (F) - 4.7212529e-004, (F) - 4.7968369e-004, + (F) - 4.8742511e-004, (F) - 4.9509526e-004, (F) - 5.0286502e-004, (F) - 5.1061081e-004, (F) - 5.1845390e-004, + (F) - 5.2627883e-004, (F) - 5.3417018e-004, (F) - 5.4205412e-004, (F) - 5.5001749e-004, (F) - 5.5799069e-004, + (F) - 5.6603542e-004, (F) - 5.7408320e-004, (F) - 5.8219998e-004, (F) - 5.9032342e-004, (F) - 5.9851277e-004, + (F) - 6.0669333e-004, (F) - 6.1492812e-004, (F) - 6.2314811e-004, (F) - 6.3143448e-004, (F) - 6.3971196e-004, + (F) - 6.4808079e-004, (F) - 6.5645951e-004, (F) - 6.6495597e-004, (F) - 6.7340132e-004, (F) - 6.8188705e-004, + (F) - 6.9023175e-004, (F) - 6.9882694e-004, (F) - 7.0758003e-004, (F) - 7.1597837e-004, (F) - 7.2471488e-004, + (F) - 7.3329577e-004, (F) - 7.4204112e-004, (F) - 7.5069691e-004, (F) - 7.5944753e-004, (F) - 7.6818552e-004, + (F) - 7.7699171e-004, (F) - 7.8577593e-004, (F) - 7.9461592e-004, (F) - 8.0346439e-004, (F) - 8.1237496e-004, + (F) - 8.2128725e-004, (F) - 8.3024166e-004, (F) - 8.3919545e-004, (F) - 8.4819452e-004, (F) - 8.5719302e-004, + (F) - 8.6622788e-004, (F) - 8.7525413e-004, (F) - 8.8432225e-004, (F) - 8.9339327e-004, (F) - 9.0252009e-004, + (F) - 9.1165217e-004, (F) - 9.2084585e-004, (F) - 9.3003378e-004, (F) - 9.3925877e-004, (F) - 9.4842600e-004, + (F) - 9.5763434e-004, (F) - 9.6685278e-004, (F) - 9.7624213e-004, (F) - 9.8558142e-004, (F) - 9.9469419e-004, + (F) - 1.0041623e-003, (F) - 1.0134207e-003, (F) - 1.0228270e-003, (F) - 1.0321370e-003, (F) - 1.0415421e-003, + (F) - 1.0509287e-003, (F) - 1.0603454e-003, (F) - 1.0697472e-003, (F) - 1.0791931e-003, (F) - 1.0886461e-003, + (F) - 1.0981218e-003, (F) - 1.1075850e-003, (F) - 1.1170647e-003, (F) - 1.1265441e-003, (F) - 1.1360444e-003, + (F) - 1.1455390e-003, (F) - 1.1550493e-003, (F) - 1.1645586e-003, (F) - 1.1740960e-003, (F) - 1.1836376e-003, + (F) - 1.1932042e-003, (F) - 1.2027641e-003, (F) - 1.2123405e-003, (F) - 1.2218939e-003, (F) - 1.2314513e-003, + (F) - 1.2409915e-003, (F) - 1.2505846e-003, (F) - 1.2602023e-003, (F) - 1.2698414e-003, (F) - 1.2793765e-003, + (F) - 1.2888500e-003, (F) - 1.2986084e-003, (F) - 1.3080936e-003, (F) - 1.3177360e-003, (F) - 1.3272775e-003, + (F) - 1.3369056e-003, (F) - 1.3464878e-003, (F) - 1.3560717e-003, (F) - 1.3656533e-003, (F) - 1.3752525e-003, + (F) - 1.3848374e-003, (F) - 1.3944071e-003, (F) - 1.4039627e-003, (F) - 1.4135209e-003, (F) - 1.4230765e-003, + (F) - 1.4326278e-003, (F) - 1.4421680e-003, (F) - 1.4517067e-003, (F) - 1.4612428e-003, (F) - 1.4707800e-003, + (F) - 1.4803050e-003, (F) - 1.4898201e-003, (F) - 1.4993153e-003, (F) - 1.5087988e-003, (F) - 1.5182618e-003, + (F) - 1.5277224e-003, (F) - 1.5371854e-003, (F) - 1.5466604e-003, (F) - 1.5561103e-003, (F) - 1.5655040e-003, + (F) - 1.5748552e-003, (F) - 1.5842315e-003, (F) - 1.5937465e-003, (F) - 1.6029720e-003, (F) - 1.6123861e-003, + (F) - 1.6216776e-003, (F) - 1.6310319e-003, (F) - 1.6403094e-003, (F) - 1.6495786e-003, (F) - 1.6588508e-003, + (F) - 1.6680951e-003, (F) - 1.6773067e-003, (F) - 1.6864862e-003, (F) - 1.6956610e-003, (F) - 1.7048193e-003, + (F) - 1.7139612e-003, (F) - 1.7230717e-003, (F) - 1.7321649e-003, (F) - 1.7412365e-003, (F) - 1.7502915e-003, + (F) - 1.7593161e-003, (F) - 1.7683126e-003, (F) - 1.7772766e-003, (F) - 1.7862164e-003, (F) - 1.7951289e-003, + (F) - 1.8040225e-003, (F) - 1.8128956e-003, (F) - 1.8217521e-003, (F) - 1.8305658e-003, (F) - 1.8393318e-003, + (F) - 1.8480455e-003, (F) - 1.8567739e-003, (F) - 1.8654993e-003, (F) - 1.8742251e-003, (F) - 1.8827205e-003, + (F) - 1.8914187e-003, (F) - 1.8999453e-003, (F) - 1.9085111e-003, (F) - 1.9169830e-003, (F) - 1.9254474e-003, + (F) - 1.9339013e-003, (F) - 1.9422783e-003, (F) - 1.9506295e-003, (F) - 1.9589431e-003, (F) - 1.9672506e-003, + (F) - 1.9755049e-003, (F) - 1.9837264e-003, (F) - 1.9918954e-003, (F) - 2.0000433e-003, (F) - 2.0081449e-003, + (F) - 2.0162141e-003, (F) - 2.0242280e-003, (F) - 2.0322084e-003, (F) - 2.0401417e-003, (F) - 2.0480469e-003, + (F) - 2.0559056e-003, (F) - 2.0637353e-003, (F) - 2.0715137e-003, (F) - 2.0792531e-003, (F) - 2.0869231e-003, + (F) - 2.0945604e-003, (F) - 2.1021565e-003, (F) - 2.1097586e-003, (F) - 2.1172812e-003, (F) - 2.1247500e-003, + (F) - 2.1320815e-003, (F) - 2.1395760e-003, (F) - 2.1468415e-003, (F) - 2.1541473e-003, (F) - 2.1613533e-003, + (F) - 2.1685494e-003, (F) - 2.1757036e-003, (F) - 2.1827534e-003, (F) - 2.1898035e-003, (F) - 2.1967961e-003, + (F) - 2.2037585e-003, (F) - 2.2106328e-003, (F) - 2.2174712e-003, (F) - 2.2242476e-003, (F) - 2.2309941e-003, + (F) - 2.2376696e-003, (F) - 2.2443002e-003, (F) - 2.2508627e-003, (F) - 2.2573883e-003, (F) - 2.2638523e-003, + (F) - 2.2702762e-003, (F) - 2.2766333e-003, (F) - 2.2829462e-003, (F) - 2.2891862e-003, (F) - 2.2953787e-003, + (F) - 2.3015001e-003, (F) - 2.3075962e-003, (F) - 2.3136302e-003, (F) - 2.3196255e-003, (F) - 2.3255025e-003, + (F) - 2.3313432e-003, (F) - 2.3371056e-003, (F) - 2.3429385e-003, (F) - 2.3485211e-003, (F) - 2.3541678e-003, + (F) - 2.3597041e-003, (F) - 2.3652138e-003, (F) - 2.3706526e-003, (F) - 2.3759854e-003, (F) - 2.3813401e-003, + (F) - 2.3865859e-003, (F) - 2.3917824e-003, (F) - 2.3968782e-003, (F) - 2.4019512e-003, (F) - 2.4069457e-003, + (F) - 2.4118957e-003, (F) - 2.4167526e-003, (F) - 2.4215631e-003, (F) - 2.4262966e-003, (F) - 2.4309880e-003, + (F) - 2.4355990e-003, (F) - 2.4401590e-003, (F) - 2.4446355e-003, (F) - 2.4490606e-003, (F) - 2.4534014e-003, + (F) - 2.4576959e-003, (F) - 2.4619128e-003, (F) - 2.4660912e-003, (F) - 2.4701730e-003, (F) - 2.4741950e-003, + (F) - 2.4781081e-003, (F) - 2.4820112e-003, (F) - 2.4858283e-003, (F) - 2.4896281e-003, (F) - 2.4932110e-003, + (F) - 2.4968799e-003, (F) - 2.5004058e-003, (F) - 2.5038901e-003, (F) - 2.5072888e-003, (F) - 2.5105972e-003, + (F) - 2.5139194e-003, (F) - 2.5170758e-003, (F) - 2.5201976e-003, (F) - 2.5232275e-003, (F) - 2.5262357e-003, + (F) - 2.5291376e-003, (F) - 2.5319814e-003, (F) - 2.5347278e-003, (F) - 2.5374318e-003, (F) - 2.5400513e-003, + (F) - 2.5426174e-003, (F) - 2.5450901e-003, (F) - 2.5475049e-003, (F) - 2.5498302e-003, (F) - 2.5521002e-003, + (F) - 2.5542824e-003, (F) - 2.5564137e-003, (F) - 2.5584559e-003, (F) - 2.5604403e-003, (F) - 2.5623171e-003, + (F) - 2.5641411e-003, (F) - 2.5658766e-003, (F) - 2.5675914e-003, (F) - 2.5691867e-003, (F) - 2.5707272e-003, + (F) - 2.5721182e-003, (F) - 2.5735785e-003, (F) - 2.5748584e-003, (F) - 2.5760978e-003, (F) - 2.5772547e-003, + (F) - 2.5783297e-003, (F) - 2.5793907e-003, (F) - 2.5802554e-003, (F) - 2.5811389e-003, (F) - 2.5819204e-003, + (F) - 2.5826616e-003, (F) - 2.5832717e-003, (F) - 2.5838350e-003, (F) - 2.5843078e-003, (F) - 2.5847406e-003, + (F) - 2.5850741e-003, (F) - 2.5853470e-003, (F) - 2.5855214e-003, (F) - 2.5856405e-003, (F) 9.9741433e-001, + (F) - 2.5856405e-003, (F) - 2.5855214e-003, (F) - 2.5853470e-003, (F) - 2.5850741e-003, (F) - 2.5847406e-003, + (F) - 2.5843078e-003, (F) - 2.5838350e-003, (F) - 2.5832717e-003, (F) - 2.5826616e-003, (F) - 2.5819204e-003, + (F) - 2.5811389e-003, (F) - 2.5802554e-003, (F) - 2.5793907e-003, (F) - 2.5783297e-003, (F) - 2.5772547e-003, + (F) - 2.5760978e-003, (F) - 2.5748584e-003, (F) - 2.5735785e-003, (F) - 2.5721182e-003, (F) - 2.5707272e-003, + (F) - 2.5691867e-003, (F) - 2.5675914e-003, (F) - 2.5658766e-003, (F) - 2.5641411e-003, (F) - 2.5623171e-003, + (F) - 2.5604403e-003, (F) - 2.5584559e-003, (F) - 2.5564137e-003, (F) - 2.5542824e-003, (F) - 2.5521002e-003, + (F) - 2.5498302e-003, (F) - 2.5475049e-003, (F) - 2.5450901e-003, (F) - 2.5426174e-003, (F) - 2.5400513e-003, + (F) - 2.5374318e-003, (F) - 2.5347278e-003, (F) - 2.5319814e-003, (F) - 2.5291376e-003, (F) - 2.5262357e-003, + (F) - 2.5232275e-003, (F) - 2.5201976e-003, (F) - 2.5170758e-003, (F) - 2.5139194e-003, (F) - 2.5105972e-003, + (F) - 2.5072888e-003, (F) - 2.5038901e-003, (F) - 2.5004058e-003, (F) - 2.4968799e-003, (F) - 2.4932110e-003, + (F) - 2.4896281e-003, (F) - 2.4858283e-003, (F) - 2.4820112e-003, (F) - 2.4781081e-003, (F) - 2.4741950e-003, + (F) - 2.4701730e-003, (F) - 2.4660912e-003, (F) - 2.4619128e-003, (F) - 2.4576959e-003, (F) - 2.4534014e-003, + (F) - 2.4490606e-003, (F) - 2.4446355e-003, (F) - 2.4401590e-003, (F) - 2.4355990e-003, (F) - 2.4309880e-003, + (F) - 2.4262966e-003, (F) - 2.4215631e-003, (F) - 2.4167526e-003, (F) - 2.4118957e-003, (F) - 2.4069457e-003, + (F) - 2.4019512e-003, (F) - 2.3968782e-003, (F) - 2.3917824e-003, (F) - 2.3865859e-003, (F) - 2.3813401e-003, + (F) - 2.3759854e-003, (F) - 2.3706526e-003, (F) - 2.3652138e-003, (F) - 2.3597041e-003, (F) - 2.3541678e-003, + (F) - 2.3485211e-003, (F) - 2.3429385e-003, (F) - 2.3371056e-003, (F) - 2.3313432e-003, (F) - 2.3255025e-003, + (F) - 2.3196255e-003, (F) - 2.3136302e-003, (F) - 2.3075962e-003, (F) - 2.3015001e-003, (F) - 2.2953787e-003, + (F) - 2.2891862e-003, (F) - 2.2829462e-003, (F) - 2.2766333e-003, (F) - 2.2702762e-003, (F) - 2.2638523e-003, + (F) - 2.2573883e-003, (F) - 2.2508627e-003, (F) - 2.2443002e-003, (F) - 2.2376696e-003, (F) - 2.2309941e-003, + (F) - 2.2242476e-003, (F) - 2.2174712e-003, (F) - 2.2106328e-003, (F) - 2.2037585e-003, (F) - 2.1967961e-003, + (F) - 2.1898035e-003, (F) - 2.1827534e-003, (F) - 2.1757036e-003, (F) - 2.1685494e-003, (F) - 2.1613533e-003, + (F) - 2.1541473e-003, (F) - 2.1468415e-003, (F) - 2.1395760e-003, (F) - 2.1320815e-003, (F) - 2.1247500e-003, + (F) - 2.1172812e-003, (F) - 2.1097586e-003, (F) - 2.1021565e-003, (F) - 2.0945604e-003, (F) - 2.0869231e-003, + (F) - 2.0792531e-003, (F) - 2.0715137e-003, (F) - 2.0637353e-003, (F) - 2.0559056e-003, (F) - 2.0480469e-003, + (F) - 2.0401417e-003, (F) - 2.0322084e-003, (F) - 2.0242280e-003, (F) - 2.0162141e-003, (F) - 2.0081449e-003, + (F) - 2.0000433e-003, (F) - 1.9918954e-003, (F) - 1.9837264e-003, (F) - 1.9755049e-003, (F) - 1.9672506e-003, + (F) - 1.9589431e-003, (F) - 1.9506295e-003, (F) - 1.9422783e-003, (F) - 1.9339013e-003, (F) - 1.9254474e-003, + (F) - 1.9169830e-003, (F) - 1.9085111e-003, (F) - 1.8999453e-003, (F) - 1.8914187e-003, (F) - 1.8827205e-003, + (F) - 1.8742251e-003, (F) - 1.8654993e-003, (F) - 1.8567739e-003, (F) - 1.8480455e-003, (F) - 1.8393318e-003, + (F) - 1.8305658e-003, (F) - 1.8217521e-003, (F) - 1.8128956e-003, (F) - 1.8040225e-003, (F) - 1.7951289e-003, + (F) - 1.7862164e-003, (F) - 1.7772766e-003, (F) - 1.7683126e-003, (F) - 1.7593161e-003, (F) - 1.7502915e-003, + (F) - 1.7412365e-003, (F) - 1.7321649e-003, (F) - 1.7230717e-003, (F) - 1.7139612e-003, (F) - 1.7048193e-003, + (F) - 1.6956610e-003, (F) - 1.6864862e-003, (F) - 1.6773067e-003, (F) - 1.6680951e-003, (F) - 1.6588508e-003, + (F) - 1.6495786e-003, (F) - 1.6403094e-003, (F) - 1.6310319e-003, (F) - 1.6216776e-003, (F) - 1.6123861e-003, + (F) - 1.6029720e-003, (F) - 1.5937465e-003, (F) - 1.5842315e-003, (F) - 1.5748552e-003, (F) - 1.5655040e-003, + (F) - 1.5561103e-003, (F) - 1.5466604e-003, (F) - 1.5371854e-003, (F) - 1.5277224e-003, (F) - 1.5182618e-003, + (F) - 1.5087988e-003, (F) - 1.4993153e-003, (F) - 1.4898201e-003, (F) - 1.4803050e-003, (F) - 1.4707800e-003, + (F) - 1.4612428e-003, (F) - 1.4517067e-003, (F) - 1.4421680e-003, (F) - 1.4326278e-003, (F) - 1.4230765e-003, + (F) - 1.4135209e-003, (F) - 1.4039627e-003, (F) - 1.3944071e-003, (F) - 1.3848374e-003, (F) - 1.3752525e-003, + (F) - 1.3656533e-003, (F) - 1.3560717e-003, (F) - 1.3464878e-003, (F) - 1.3369056e-003, (F) - 1.3272775e-003, + (F) - 1.3177360e-003, (F) - 1.3080936e-003, (F) - 1.2986084e-003, (F) - 1.2888500e-003, (F) - 1.2793765e-003, + (F) - 1.2698414e-003, (F) - 1.2602023e-003, (F) - 1.2505846e-003, (F) - 1.2409915e-003, (F) - 1.2314513e-003, + (F) - 1.2218939e-003, (F) - 1.2123405e-003, (F) - 1.2027641e-003, (F) - 1.1932042e-003, (F) - 1.1836376e-003, + (F) - 1.1740960e-003, (F) - 1.1645586e-003, (F) - 1.1550493e-003, (F) - 1.1455390e-003, (F) - 1.1360444e-003, + (F) - 1.1265441e-003, (F) - 1.1170647e-003, (F) - 1.1075850e-003, (F) - 1.0981218e-003, (F) - 1.0886461e-003, + (F) - 1.0791931e-003, (F) - 1.0697472e-003, (F) - 1.0603454e-003, (F) - 1.0509287e-003, (F) - 1.0415421e-003, + (F) - 1.0321370e-003, (F) - 1.0228270e-003, (F) - 1.0134207e-003, (F) - 1.0041623e-003, (F) - 9.9469419e-004, + (F) - 9.8558142e-004, (F) - 9.7624213e-004, (F) - 9.6685278e-004, (F) - 9.5763434e-004, (F) - 9.4842600e-004, + (F) - 9.3925877e-004, (F) - 9.3003378e-004, (F) - 9.2084585e-004, (F) - 9.1165217e-004, (F) - 9.0252009e-004, + (F) - 8.9339327e-004, (F) - 8.8432225e-004, (F) - 8.7525413e-004, (F) - 8.6622788e-004, (F) - 8.5719302e-004, + (F) - 8.4819452e-004, (F) - 8.3919545e-004, (F) - 8.3024166e-004, (F) - 8.2128725e-004, (F) - 8.1237496e-004, + (F) - 8.0346439e-004, (F) - 7.9461592e-004, (F) - 7.8577593e-004, (F) - 7.7699171e-004, (F) - 7.6818552e-004, + (F) - 7.5944753e-004, (F) - 7.5069691e-004, (F) - 7.4204112e-004, (F) - 7.3329577e-004, (F) - 7.2471488e-004, + (F) - 7.1597837e-004, (F) - 7.0758003e-004, (F) - 6.9882694e-004, (F) - 6.9023175e-004, (F) - 6.8188705e-004, + (F) - 6.7340132e-004, (F) - 6.6495597e-004, (F) - 6.5645951e-004, (F) - 6.4808079e-004, (F) - 6.3971196e-004, + (F) - 6.3143448e-004, (F) - 6.2314811e-004, (F) - 6.1492812e-004, (F) - 6.0669333e-004, (F) - 5.9851277e-004, + (F) - 5.9032342e-004, (F) - 5.8219998e-004, (F) - 5.7408320e-004, (F) - 5.6603542e-004, (F) - 5.5799069e-004, + (F) - 5.5001749e-004, (F) - 5.4205412e-004, (F) - 5.3417018e-004, (F) - 5.2627883e-004, (F) - 5.1845390e-004, + (F) - 5.1061081e-004, (F) - 5.0286502e-004, (F) - 4.9509526e-004, (F) - 4.8742511e-004, (F) - 4.7968369e-004, + (F) - 4.7212529e-004, (F) - 4.6443246e-004, (F) - 4.5702829e-004, (F) - 4.4925726e-004, (F) - 4.4189166e-004, + (F) - 4.3464576e-004, (F) - 4.2705956e-004, (F) - 4.1967673e-004, (F) - 4.1228858e-004, (F) - 4.0508935e-004, + (F) - 3.9784824e-004, (F) - 3.9070041e-004, (F) - 3.8350434e-004, (F) - 3.7639420e-004, (F) - 3.6925666e-004, + (F) - 3.6221220e-004, (F) - 3.5516575e-004, (F) - 3.4822305e-004, (F) - 3.4128144e-004, (F) - 3.3443304e-004, + (F) - 3.2758021e-004, (F) - 3.2082305e-004, (F) - 3.1405879e-004, (F) - 3.0738263e-004, (F) - 3.0067960e-004, + (F) - 2.9407149e-004, (F) - 2.8744468e-004, (F) - 2.8093774e-004, (F) - 2.7438622e-004, (F) - 2.6796135e-004, + (F) - 2.6147595e-004, (F) - 2.5518652e-004, (F) - 2.4875579e-004, (F) - 2.4259571e-004, (F) - 2.3612941e-004, + (F) - 2.3020843e-004, (F) - 2.2408600e-004, (F) - 2.1762031e-004, (F) - 2.1170656e-004, (F) - 2.0570182e-004, + (F) - 1.9986051e-004, (F) - 1.9387145e-004, (F) - 1.8799894e-004, (F) - 1.8206851e-004, (F) - 1.7627586e-004, + (F) - 1.7046432e-004, (F) - 1.6479026e-004, (F) - 1.5911076e-004, (F) - 1.5355011e-004, (F) - 1.4796949e-004, + (F) - 1.4249159e-004, (F) - 1.3699375e-004, (F) - 1.3159904e-004, (F) - 1.2617687e-004, (F) - 1.2085379e-004, + (F) - 1.1550253e-004, (F) - 1.1027447e-004, (F) - 1.0502188e-004, (F) - 9.9898650e-005, (F) - 9.4721351e-005, + (F) - 8.9698178e-005, (F) - 8.4612320e-005, (F) - 7.9718290e-005, (F) - 7.4678495e-005, (F) - 6.9912852e-005, + (F) - 6.4897114e-005, (F) - 6.0403894e-005, (F) - 5.5414477e-005, (F) - 5.0403230e-005, (F) - 4.6245143e-005, + (F) - 4.1543856e-005, (F) - 3.7020060e-005, (F) - 3.2298035e-005, (F) - 2.7830625e-005, (F) - 2.3307139e-005, + (F) - 1.8994868e-005, (F) - 1.4631174e-005, (F) - 1.0433728e-005, (F) - 6.1754788e-006, (F) - 2.0462664e-006, + (F) 2.1468476e-006, (F) 6.2116278e-006, (F) 1.0327219e-005, (F) 1.4312671e-005, (F) 1.8349478e-005, + (F) 2.2246019e-005, (F) 2.6183621e-005, (F) 2.9964364e-005, (F) 3.3802916e-005, (F) 3.7486700e-005, + (F) 4.1246975e-005, (F) 4.4819152e-005, (F) 4.8492626e-005, (F) 5.1960346e-005, (F) 5.5592602e-005, + (F) 5.8926380e-005, (F) 6.2520637e-005, (F) 6.5655639e-005, (F) 6.9400379e-005, (F) 7.2644410e-005, + (F) 7.5176800e-005, (F) 7.8972973e-005, (F) 8.2145791e-005, (F) 8.5454155e-005, (F) 8.8349417e-005, + (F) 9.1380999e-005, (F) 9.4193407e-005, (F) 9.7143301e-005, (F) 9.9931180e-005, (F) 1.0283674e-004, + (F) 1.0559403e-004, (F) 1.0843159e-004, (F) 1.1110845e-004, (F) 1.1384795e-004, (F) 1.1642978e-004, + (F) 1.1906901e-004, (F) 1.2154154e-004, (F) 1.2407353e-004, (F) 1.2644454e-004, (F) 1.2890182e-004, + (F) 1.3119183e-004, (F) 1.3357737e-004, (F) 1.3577053e-004, (F) 1.3809993e-004, (F) 1.4021375e-004, + (F) 1.4250292e-004, (F) 1.4449103e-004, (F) 1.4676216e-004, (F) 1.4860587e-004, (F) 1.5099189e-004, + (F) 1.5251907e-004, (F) 1.5400320e-004, (F) 1.5725670e-004, (F) 1.5856474e-004, (F) 1.6035465e-004, + (F) 1.6172121e-004, (F) 1.6351953e-004, (F) 1.6506208e-004, (F) 1.6686975e-004, (F) 1.6842980e-004, + (F) 1.7016635e-004, (F) 1.7165185e-004, (F) 1.7326225e-004, (F) 1.7463511e-004, (F) 1.7613174e-004, + (F) 1.7740887e-004, (F) 1.7881024e-004, (F) 1.8000008e-004, (F) 1.8133430e-004, (F) 1.8246886e-004, + (F) 1.8376430e-004, (F) 1.8483886e-004, (F) 1.8608695e-004, (F) 1.8709650e-004, (F) 1.8831959e-004, + (F) 1.8925727e-004, (F) 1.9044159e-004, (F) 1.9126723e-004, (F) 1.9244888e-004, (F) 1.9312581e-004, + (F) 1.9434052e-004, (F) 1.9460314e-004, (F) 1.9574339e-004, (F) 1.9821206e-004, (F) 1.9670052e-004, + (F) 1.9764812e-004, (F) 1.9811086e-004, (F) 1.9922601e-004, (F) 1.9983291e-004, (F) 2.0072227e-004, + (F) 2.0119510e-004, (F) 2.0186213e-004, (F) 2.0218689e-004, (F) 2.0268931e-004, (F) 2.0292316e-004, + (F) 2.0334171e-004, (F) 2.0352446e-004, (F) 2.0389248e-004, (F) 2.0404606e-004, (F) 2.0439794e-004, + (F) 2.0453189e-004, (F) 2.0486118e-004, (F) 2.0494755e-004, (F) 2.0524898e-004, (F) 2.0528478e-004, + (F) 2.0556260e-004, (F) 2.0551182e-004, (F) 2.0575204e-004, (F) 2.0559447e-004, (F) 2.0583582e-004, + (F) 2.0551705e-004, (F) 2.0580818e-004, (F) 2.0522994e-004, (F) 2.0606828e-004, (F) 2.0668075e-004, + (F) 2.0117747e-004, (F) 2.0447446e-004, (F) 2.0443830e-004, (F) 2.0505697e-004, (F) 2.0439317e-004, + (F) 2.0429009e-004, (F) 2.0343574e-004, (F) 2.0309827e-004, (F) 2.0221283e-004, (F) 2.0182655e-004, + (F) 2.0098888e-004, (F) 2.0062041e-004, (F) 1.9982454e-004, (F) 1.9948456e-004, (F) 1.9872274e-004, + (F) 1.9840997e-004, (F) 1.9764305e-004, (F) 1.9732846e-004, (F) 1.9652536e-004, (F) 1.9621245e-004, + (F) 1.9535326e-004, (F) 1.9502938e-004, (F) 1.9407034e-004, (F) 1.9374881e-004, (F) 1.9267245e-004, + (F) 1.9238679e-004, (F) 1.9111524e-004, (F) 1.9094255e-004, (F) 1.8933708e-004, (F) 1.8950640e-004, + (F) 1.8640971e-004, (F) 1.7591939e-004, (F) 1.9648117e-004, (F) 1.9002553e-004, (F) 1.8826921e-004, + (F) 1.8500691e-004, (F) 1.8364291e-004, (F) 1.8138467e-004, (F) 1.8031784e-004, (F) 1.7859148e-004, + (F) 1.7773870e-004, (F) 1.7633494e-004, (F) 1.7560111e-004, (F) 1.7438288e-004, (F) 1.7371570e-004, + (F) 1.7260586e-004, (F) 1.7195115e-004, (F) 1.7087787e-004, (F) 1.7020317e-004, (F) 1.6914017e-004, + (F) 1.6843147e-004, (F) 1.6734333e-004, (F) 1.6657230e-004, (F) 1.6544194e-004, (F) 1.6461419e-004, + (F) 1.6343643e-004, (F) 1.6253497e-004, (F) 1.6129533e-004, (F) 1.6033147e-004, (F) 1.5903747e-004, + (F) 1.5798547e-004, (F) 1.5663328e-004, (F) 1.5551665e-004, (F) 9.2342753e-003 + }; + *lenh0 = HP50_32K_LEN; /* store 'number of coefficients' */ + *h0 = hp50_32khz_coeff; /* store pointer to []-array */ +} + +#undef HP50_32K_LEN +/* ...................... End of fill_bp14k_32khz() ..................... */ + + +/* + ============================================================================ + + SCD_FIR hp50_32khz_init (void); + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + Description: + ~~~~~~~~~~~~ + + Initialization routine for a band-pass filter which limits the + bandwidth of the input signal from 50 Hz to 14000 Hz (3 dB points). + No rate change is implemented. + + Parameters: none. + ~~~~~~~~~~~ + + Return value: + ~~~~~~~~~~~~~ + Returns a pointer to struct SCD_FIR; + + History: + ~~~~~~~~ + 05.April.2012 v1.0 - Added filters: HP50_32KHZ, HP50_48KHZ (France Telecom) + + ============================================================================ +*/ +SCD_FIR *hp50_32khz_init () { + float *h0; /* pointer to array with FIR coeff. */ + long lenh0; /* number of FIR coefficients */ + + + /* allocate array for FIR coeff. and fill with coefficients */ + fill_hp50_32khz (&h0, &lenh0); + + return fir_initialization ( /* Returns: pointer to SCD_FIR-struct */ + lenh0, /* In: number of FIR-coefficients */ + h0, /* In: pointer to array with FIR-cof. */ + 1.0, /* In: gain factor for FIR-coeffic. */ + 1l, /* In: Down-sampling factor */ + 'D' /* In: switch to down-sampling proc. */ + ); /* (works here as simple FIR-fil. */ +} + +/* .................... End of hp50_32khz_init() .................... */ + + + +/* + ============================================================================ + + void fill_hp50_48khz (float **h0, long *lenh0); + ~~~~~~~~~~~~~~~~~~~~~ + + Description: + ~~~~~~~~~~~~ + Fill filter coefficients for 50 Hz (3dB point) highpass filtering for samples at 48 kHz. + firpm(1678,[0 2.5/24000 66/24000 1],[0.000 0.00 1 1 ],[60 1]); + Same lengt, HP response and passband oscillation (+-0.15dB) as the 14KBP filter or HP50@32kHz + + Parameters: + ~~~~~~~~~~~ + h0: (Out) pointer to array with FIR coefficients + lenh0: (Out) pointer to number of coefficients + + Return value: + ~~~~~~~~~~~~~ + None. + + History: + ~~~~~~~~ + 05.April.2012 v1.0 - Added filters: HP50_32KHZ, HP50_48KHZ (France Telecom) + + ============================================================================ +*/ +#undef HP50_48K_LEN +#define HP50_48K_LEN 1679 +void fill_hp50_48khz (float **h0, long *lenh0) { + static float hp50_48khz_coeff[HP50_48K_LEN] = { + (F) 9.2170161e-003, (F) 1.0282141e-004, (F) 1.0323477e-004, (F) 1.0392614e-004, (F) 1.0431790e-004, + (F) 1.0499377e-004, (F) 1.0536773e-004, (F) 1.0603588e-004, (F) 1.0638882e-004, (F) 1.0705021e-004, + (F) 1.0739106e-004, (F) 1.0805611e-004, (F) 1.0837965e-004, (F) 1.0905795e-004, (F) 1.0938090e-004, + (F) 1.1007974e-004, (F) 1.1040957e-004, (F) 1.1115190e-004, (F) 1.1149459e-004, (F) 1.1229782e-004, + (F) 1.1266869e-004, (F) 1.1356565e-004, (F) 1.1396913e-004, (F) 1.1501372e-004, (F) 1.1546739e-004, + (F) 1.1671837e-004, (F) 1.1723162e-004, (F) 1.1881924e-004, (F) 1.1938009e-004, (F) 1.2160186e-004, + (F) 1.2211069e-004, (F) 1.2681189e-004, (F) 1.0603987e-004, (F) 1.1739216e-004, (F) 1.2019571e-004, + (F) 1.1960227e-004, (F) 1.2084617e-004, (F) 1.2064739e-004, (F) 1.2156945e-004, (F) 1.2152965e-004, + (F) 1.2231705e-004, (F) 1.2236911e-004, (F) 1.2308341e-004, (F) 1.2319054e-004, (F) 1.2387359e-004, + (F) 1.2402521e-004, (F) 1.2468629e-004, (F) 1.2487613e-004, (F) 1.2553014e-004, (F) 1.2574208e-004, + (F) 1.2639667e-004, (F) 1.2662486e-004, (F) 1.2727834e-004, (F) 1.2749849e-004, (F) 1.2815380e-004, + (F) 1.2832364e-004, (F) 1.2895095e-004, (F) 1.2901611e-004, (F) 1.2957883e-004, (F) 1.2941200e-004, + (F) 1.2984364e-004, (F) 1.2918213e-004, (F) 1.2939196e-004, (F) 1.2692712e-004, (F) 1.3285917e-004, + (F) 1.3188746e-004, (F) 1.3108290e-004, (F) 1.3185337e-004, (F) 1.3174954e-004, (F) 1.3230559e-004, + (F) 1.3234605e-004, (F) 1.3281968e-004, (F) 1.3292077e-004, (F) 1.3334594e-004, (F) 1.3347954e-004, + (F) 1.3388084e-004, (F) 1.3402423e-004, (F) 1.3439884e-004, (F) 1.3454719e-004, (F) 1.3489334e-004, + (F) 1.3502831e-004, (F) 1.3534817e-004, (F) 1.3545658e-004, (F) 1.3573672e-004, (F) 1.3580183e-004, + (F) 1.3604220e-004, (F) 1.3603623e-004, (F) 1.3623973e-004, (F) 1.3616781e-004, (F) 1.3635135e-004, + (F) 1.3622245e-004, (F) 1.3647364e-004, (F) 1.3635685e-004, (F) 1.3690649e-004, (F) 1.3696791e-004, + (F) 1.3896829e-004, (F) 1.3697478e-004, (F) 1.3692105e-004, (F) 1.3768980e-004, (F) 1.3743527e-004, + (F) 1.3778116e-004, (F) 1.3765261e-004, (F) 1.3789559e-004, (F) 1.3780411e-004, (F) 1.3798877e-004, + (F) 1.3791032e-004, (F) 1.3805069e-004, (F) 1.3795926e-004, (F) 1.3806087e-004, (F) 1.3795585e-004, + (F) 1.3801376e-004, (F) 1.3788717e-004, (F) 1.3790990e-004, (F) 1.3775349e-004, (F) 1.3774242e-004, + (F) 1.3756412e-004, (F) 1.3753506e-004, (F) 1.3733693e-004, (F) 1.3732519e-004, (F) 1.3713014e-004, + (F) 1.3715429e-004, (F) 1.3698332e-004, (F) 1.3708216e-004, (F) 1.3691530e-004, (F) 1.3707353e-004, + (F) 1.3676131e-004, (F) 1.3683967e-004, (F) 1.3537370e-004, (F) 1.3597876e-004, (F) 1.3620588e-004, + (F) 1.3557968e-004, (F) 1.3560751e-004, (F) 1.3522156e-004, (F) 1.3513030e-004, (F) 1.3477709e-004, + (F) 1.3462320e-004, (F) 1.3427186e-004, (F) 1.3406692e-004, (F) 1.3370193e-004, (F) 1.3346421e-004, + (F) 1.3308486e-004, (F) 1.3281213e-004, (F) 1.3242329e-004, (F) 1.3212756e-004, (F) 1.3172649e-004, + (F) 1.3142101e-004, (F) 1.3102020e-004, (F) 1.3071229e-004, (F) 1.3031017e-004, (F) 1.3001517e-004, + (F) 1.2959499e-004, (F) 1.2929298e-004, (F) 1.2883966e-004, (F) 1.2850208e-004, (F) 1.2795178e-004, + (F) 1.2754364e-004, (F) 1.2684799e-004, (F) 1.2641365e-004, (F) 1.2561428e-004, (F) 1.2595624e-004, + (F) 1.2528676e-004, (F) 1.2434765e-004, (F) 1.2412368e-004, (F) 1.2341104e-004, (F) 1.2298547e-004, + (F) 1.2231406e-004, (F) 1.2182429e-004, (F) 1.2115661e-004, (F) 1.2062332e-004, (F) 1.1995423e-004, + (F) 1.1939587e-004, (F) 1.1871658e-004, (F) 1.1813439e-004, (F) 1.1745353e-004, (F) 1.1685124e-004, + (F) 1.1616264e-004, (F) 1.1554840e-004, (F) 1.1484676e-004, (F) 1.1420856e-004, (F) 1.1348183e-004, + (F) 1.1281518e-004, (F) 1.1203418e-004, (F) 1.1133137e-004, (F) 1.1049916e-004, (F) 1.0975257e-004, + (F) 1.0887415e-004, (F) 1.0813498e-004, (F) 1.0726099e-004, (F) 1.0661111e-004, (F) 1.0578194e-004, + (F) 1.0529542e-004, (F) 1.0396291e-004, (F) 1.0299308e-004, (F) 1.0247409e-004, (F) 1.0137922e-004, + (F) 1.0060085e-004, (F) 9.9604074e-005, (F) 9.8760420e-005, (F) 9.7773259e-005, (F) 9.6892188e-005, + (F) 9.5905360e-005, (F) 9.4993975e-005, (F) 9.3992439e-005, (F) 9.3056320e-005, (F) 9.2042727e-005, + (F) 9.1073535e-005, (F) 9.0039349e-005, (F) 8.9038684e-005, (F) 8.7969516e-005, (F) 8.6929477e-005, + (F) 8.5825876e-005, (F) 8.4750138e-005, (F) 8.3606584e-005, (F) 8.2519454e-005, (F) 8.1353458e-005, + (F) 8.0258949e-005, (F) 7.9094451e-005, (F) 7.8017131e-005, (F) 7.6835554e-005, (F) 7.5741110e-005, + (F) 7.4464448e-005, (F) 7.3269051e-005, (F) 7.1728435e-005, (F) 7.0709936e-005, (F) 6.9687722e-005, + (F) 6.8148646e-005, (F) 6.7027725e-005, (F) 6.5663462e-005, (F) 6.4441171e-005, (F) 6.3085250e-005, + (F) 6.1818800e-005, (F) 6.0452242e-005, (F) 5.9143854e-005, (F) 5.7756282e-005, (F) 5.6415612e-005, + (F) 5.5001511e-005, (F) 5.3618819e-005, (F) 5.2178565e-005, (F) 5.0758389e-005, (F) 4.9285680e-005, + (F) 4.7838012e-005, (F) 4.6344615e-005, (F) 4.4875639e-005, (F) 4.3364404e-005, (F) 4.1892374e-005, + (F) 4.0354202e-005, (F) 3.8864361e-005, (F) 3.7301364e-005, (F) 3.5770376e-005, (F) 3.4140016e-005, + (F) 3.2553422e-005, (F) 3.0858734e-005, (F) 2.9262279e-005, (F) 2.7585354e-005, (F) 2.6196851e-005, + (F) 2.4508556e-005, (F) 2.2595147e-005, (F) 2.1125524e-005, (F) 1.9336697e-005, (F) 1.7687295e-005, + (F) 1.5919286e-005, (F) 1.4217836e-005, (F) 1.2432060e-005, (F) 1.0686745e-005, (F) 8.8806737e-006, + (F) 7.1001852e-006, (F) 5.2646709e-006, (F) 3.4494433e-006, (F) 1.5949437e-006, (F) - 2.5040016e-007, + (F) - 2.1249647e-006, (F) - 3.9880938e-006, (F) - 5.8828077e-006, (F) - 7.7707834e-006, (F) - 9.6904874e-006, + (F) - 1.1604256e-005, (F) - 1.3572472e-005, (F) - 1.5517481e-005, (F) - 1.7525599e-005, (F) - 1.9516113e-005, + (F) - 2.1556262e-005, (F) - 2.3549789e-005, (F) - 2.5587191e-005, (F) - 2.7557313e-005, (F) - 2.9593067e-005, + (F) - 3.1583770e-005, (F) - 3.3828247e-005, (F) - 3.6003270e-005, (F) - 3.7882528e-005, (F) - 4.0157616e-005, + (F) - 4.2238257e-005, (F) - 4.4435158e-005, (F) - 4.6576406e-005, (F) - 4.8788370e-005, (F) - 5.0966866e-005, + (F) - 5.3195433e-005, (F) - 5.5407648e-005, (F) - 5.7659653e-005, (F) - 5.9896191e-005, (F) - 6.2164814e-005, + (F) - 6.4430870e-005, (F) - 6.6719855e-005, (F) - 6.9012344e-005, (F) - 7.1334393e-005, (F) - 7.3660509e-005, + (F) - 7.6014789e-005, (F) - 7.8374135e-005, (F) - 8.0767477e-005, (F) - 8.3140519e-005, (F) - 8.5558944e-005, + (F) - 8.7951462e-005, (F) - 9.0371180e-005, (F) - 9.2768583e-005, (F) - 9.5215819e-005, (F) - 9.7654715e-005, + (F) - 1.0017071e-004, (F) - 1.0268888e-004, (F) - 1.0528563e-004, (F) - 1.0773097e-004, (F) - 1.1012977e-004, + (F) - 1.1287369e-004, (F) - 1.1534129e-004, (F) - 1.1795237e-004, (F) - 1.2051726e-004, (F) - 1.2313545e-004, + (F) - 1.2573245e-004, (F) - 1.2836778e-004, (F) - 1.3099695e-004, (F) - 1.3365159e-004, (F) - 1.3630467e-004, + (F) - 1.3898420e-004, (F) - 1.4167133e-004, (F) - 1.4437565e-004, (F) - 1.4709544e-004, (F) - 1.4983227e-004, + (F) - 1.5257694e-004, (F) - 1.5533702e-004, (F) - 1.5810382e-004, (F) - 1.6088469e-004, (F) - 1.6365806e-004, + (F) - 1.6646857e-004, (F) - 1.6926417e-004, (F) - 1.7209519e-004, (F) - 1.7493698e-004, (F) - 1.7782269e-004, + (F) - 1.8070933e-004, (F) - 1.8362809e-004, (F) - 1.8652433e-004, (F) - 1.8942093e-004, (F) - 1.9226519e-004, + (F) - 1.9520475e-004, (F) - 1.9831231e-004, (F) - 2.0112323e-004, (F) - 2.0414964e-004, (F) - 2.0711506e-004, + (F) - 2.1012138e-004, (F) - 2.1311883e-004, (F) - 2.1614560e-004, (F) - 2.1917324e-004, (F) - 2.2221937e-004, + (F) - 2.2527550e-004, (F) - 2.2835091e-004, (F) - 2.3143610e-004, (F) - 2.3453175e-004, (F) - 2.3764368e-004, + (F) - 2.4076019e-004, (F) - 2.4388735e-004, (F) - 2.4702508e-004, (F) - 2.5017411e-004, (F) - 2.5333543e-004, + (F) - 2.5650720e-004, (F) - 2.5971239e-004, (F) - 2.6291070e-004, (F) - 2.6614678e-004, (F) - 2.6938916e-004, + (F) - 2.7264437e-004, (F) - 2.7588913e-004, (F) - 2.7914295e-004, (F) - 2.8238998e-004, (F) - 2.8565591e-004, + (F) - 2.8895192e-004, (F) - 2.9231668e-004, (F) - 2.9568523e-004, (F) - 2.9885971e-004, (F) - 3.0230245e-004, + (F) - 3.0562944e-004, (F) - 3.0899705e-004, (F) - 3.1236984e-004, (F) - 3.1575932e-004, (F) - 3.1915720e-004, + (F) - 3.2256619e-004, (F) - 3.2599148e-004, (F) - 3.2942304e-004, (F) - 3.3286616e-004, (F) - 3.3631386e-004, + (F) - 3.3977978e-004, (F) - 3.4324533e-004, (F) - 3.4673121e-004, (F) - 3.5022620e-004, (F) - 3.5373782e-004, + (F) - 3.5726001e-004, (F) - 3.6079784e-004, (F) - 3.6435228e-004, (F) - 3.6789813e-004, (F) - 3.7147125e-004, + (F) - 3.7503555e-004, (F) - 3.7860142e-004, (F) - 3.8217419e-004, (F) - 3.8576582e-004, (F) - 3.8937618e-004, + (F) - 3.9300877e-004, (F) - 3.9666663e-004, (F) - 4.0031807e-004, (F) - 4.0393867e-004, (F) - 4.0751295e-004, + (F) - 4.1131485e-004, (F) - 4.1493297e-004, (F) - 4.1862574e-004, (F) - 4.2232986e-004, (F) - 4.2603467e-004, + (F) - 4.2975534e-004, (F) - 4.3347834e-004, (F) - 4.3721957e-004, (F) - 4.4095707e-004, (F) - 4.4471248e-004, + (F) - 4.4847023e-004, (F) - 4.5224882e-004, (F) - 4.5602551e-004, (F) - 4.5982681e-004, (F) - 4.6362882e-004, + (F) - 4.6744464e-004, (F) - 4.7126296e-004, (F) - 4.7509149e-004, (F) - 4.7892223e-004, (F) - 4.8274958e-004, + (F) - 4.8660067e-004, (F) - 4.9044254e-004, (F) - 4.9429973e-004, (F) - 4.9818084e-004, (F) - 5.0207382e-004, + (F) - 5.0597844e-004, (F) - 5.0988090e-004, (F) - 5.1378900e-004, (F) - 5.1767455e-004, (F) - 5.2157784e-004, + (F) - 5.2550534e-004, (F) - 5.2954292e-004, (F) - 5.3338602e-004, (F) - 5.3736583e-004, (F) - 5.4133594e-004, + (F) - 5.4529167e-004, (F) - 5.4927299e-004, (F) - 5.5324706e-004, (F) - 5.5724157e-004, (F) - 5.6122794e-004, + (F) - 5.6523832e-004, (F) - 5.6924539e-004, (F) - 5.7327066e-004, (F) - 5.7728920e-004, (F) - 5.8132765e-004, + (F) - 5.8535649e-004, (F) - 5.8939695e-004, (F) - 5.9343652e-004, (F) - 5.9748510e-004, (F) - 6.0153590e-004, + (F) - 6.0559430e-004, (F) - 6.0967412e-004, (F) - 6.1374540e-004, (F) - 6.1783904e-004, (F) - 6.2194403e-004, + (F) - 6.2603808e-004, (F) - 6.3013543e-004, (F) - 6.3422627e-004, (F) - 6.3833154e-004, (F) - 6.4243332e-004, + (F) - 6.4657635e-004, (F) - 6.5072148e-004, (F) - 6.5488235e-004, (F) - 6.5892065e-004, (F) - 6.6313078e-004, + (F) - 6.6727626e-004, (F) - 6.7140842e-004, (F) - 6.7557927e-004, (F) - 6.7972979e-004, (F) - 6.8390501e-004, + (F) - 6.8806653e-004, (F) - 6.9225262e-004, (F) - 6.9642391e-004, (F) - 7.0061078e-004, (F) - 7.0478617e-004, + (F) - 7.0897873e-004, (F) - 7.1315848e-004, (F) - 7.1735508e-004, (F) - 7.2155033e-004, (F) - 7.2575613e-004, + (F) - 7.2996431e-004, (F) - 7.3418147e-004, (F) - 7.3840652e-004, (F) - 7.4261917e-004, (F) - 7.4684907e-004, + (F) - 7.5107177e-004, (F) - 7.5527988e-004, (F) - 7.5950621e-004, (F) - 7.6373284e-004, (F) - 7.6797990e-004, + (F) - 7.7222020e-004, (F) - 7.7648381e-004, (F) - 7.8071490e-004, (F) - 7.8494955e-004, (F) - 7.8914860e-004, + (F) - 7.9348415e-004, (F) - 7.9769844e-004, (F) - 8.0193496e-004, (F) - 8.0621272e-004, (F) - 8.1045333e-004, + (F) - 8.1472245e-004, (F) - 8.1897072e-004, (F) - 8.2323951e-004, (F) - 8.2748711e-004, (F) - 8.3175195e-004, + (F) - 8.3600580e-004, (F) - 8.4027518e-004, (F) - 8.4453368e-004, (F) - 8.4880893e-004, (F) - 8.5307776e-004, + (F) - 8.5735118e-004, (F) - 8.6162249e-004, (F) - 8.6589382e-004, (F) - 8.7016289e-004, (F) - 8.7442056e-004, + (F) - 8.7869469e-004, (F) - 8.8295395e-004, (F) - 8.8721488e-004, (F) - 8.9150003e-004, (F) - 8.9577366e-004, + (F) - 9.0005378e-004, (F) - 9.0431520e-004, (F) - 9.0858594e-004, (F) - 9.1282776e-004, (F) - 9.1709567e-004, + (F) - 9.2135966e-004, (F) - 9.2568012e-004, (F) - 9.2987591e-004, (F) - 9.3414524e-004, (F) - 9.3843171e-004, + (F) - 9.4266414e-004, (F) - 9.4693507e-004, (F) - 9.5117535e-004, (F) - 9.5543687e-004, (F) - 9.5967515e-004, + (F) - 9.6393468e-004, (F) - 9.6817845e-004, (F) - 9.7243400e-004, (F) - 9.7667465e-004, (F) - 9.8092565e-004, + (F) - 9.8516064e-004, (F) - 9.8939684e-004, (F) - 9.9362682e-004, (F) - 9.9785357e-004, (F) - 1.0020771e-003, + (F) - 1.0062964e-003, (F) - 1.0105278e-003, (F) - 1.0147410e-003, (F) - 1.0189627e-003, (F) - 1.0231919e-003, + (F) - 1.0273888e-003, (F) - 1.0315914e-003, (F) - 1.0357772e-003, (F) - 1.0399770e-003, (F) - 1.0441581e-003, + (F) - 1.0483674e-003, (F) - 1.0525531e-003, (F) - 1.0567446e-003, (F) - 1.0608604e-003, (F) - 1.0650738e-003, + (F) - 1.0692510e-003, (F) - 1.0733797e-003, (F) - 1.0775588e-003, (F) - 1.0816965e-003, (F) - 1.0858563e-003, + (F) - 1.0899914e-003, (F) - 1.0941426e-003, (F) - 1.0982701e-003, (F) - 1.1024024e-003, (F) - 1.1065175e-003, + (F) - 1.1106354e-003, (F) - 1.1147366e-003, (F) - 1.1188392e-003, (F) - 1.1229363e-003, (F) - 1.1270269e-003, + (F) - 1.1311162e-003, (F) - 1.1351978e-003, (F) - 1.1392810e-003, (F) - 1.1433394e-003, (F) - 1.1474060e-003, + (F) - 1.1514586e-003, (F) - 1.1554824e-003, (F) - 1.1595257e-003, (F) - 1.1635549e-003, (F) - 1.1675920e-003, + (F) - 1.1716069e-003, (F) - 1.1756321e-003, (F) - 1.1796207e-003, (F) - 1.1836123e-003, (F) - 1.1875792e-003, + (F) - 1.1916120e-003, (F) - 1.1955664e-003, (F) - 1.1995059e-003, (F) - 1.2034982e-003, (F) - 1.2074293e-003, + (F) - 1.2113866e-003, (F) - 1.2153109e-003, (F) - 1.2192453e-003, (F) - 1.2231497e-003, (F) - 1.2270598e-003, + (F) - 1.2309518e-003, (F) - 1.2348445e-003, (F) - 1.2387214e-003, (F) - 1.2425990e-003, (F) - 1.2464649e-003, + (F) - 1.2503198e-003, (F) - 1.2541682e-003, (F) - 1.2580017e-003, (F) - 1.2618275e-003, (F) - 1.2656312e-003, + (F) - 1.2694420e-003, (F) - 1.2732312e-003, (F) - 1.2770072e-003, (F) - 1.2808060e-003, (F) - 1.2845712e-003, + (F) - 1.2883348e-003, (F) - 1.2920713e-003, (F) - 1.2958126e-003, (F) - 1.2995222e-003, (F) - 1.3032464e-003, + (F) - 1.3069539e-003, (F) - 1.3106774e-003, (F) - 1.3143214e-003, (F) - 1.3179943e-003, (F) - 1.3216911e-003, + (F) - 1.3253120e-003, (F) - 1.3289667e-003, (F) - 1.3325813e-003, (F) - 1.3362028e-003, (F) - 1.3397971e-003, + (F) - 1.3433966e-003, (F) - 1.3469767e-003, (F) - 1.3505509e-003, (F) - 1.3541091e-003, (F) - 1.3576589e-003, + (F) - 1.3611918e-003, (F) - 1.3647088e-003, (F) - 1.3682185e-003, (F) - 1.3717083e-003, (F) - 1.3751927e-003, + (F) - 1.3786586e-003, (F) - 1.3821294e-003, (F) - 1.3855717e-003, (F) - 1.3890107e-003, (F) - 1.3924517e-003, + (F) - 1.3958431e-003, (F) - 1.3992389e-003, (F) - 1.4026138e-003, (F) - 1.4059908e-003, (F) - 1.4093413e-003, + (F) - 1.4126989e-003, (F) - 1.4160271e-003, (F) - 1.4193442e-003, (F) - 1.4226165e-003, (F) - 1.4259289e-003, + (F) - 1.4292197e-003, (F) - 1.4324405e-003, (F) - 1.4357099e-003, (F) - 1.4389270e-003, (F) - 1.4421539e-003, + (F) - 1.4453523e-003, (F) - 1.4485514e-003, (F) - 1.4517231e-003, (F) - 1.4548847e-003, (F) - 1.4580274e-003, + (F) - 1.4611567e-003, (F) - 1.4642681e-003, (F) - 1.4673659e-003, (F) - 1.4704549e-003, (F) - 1.4735233e-003, + (F) - 1.4765858e-003, (F) - 1.4796281e-003, (F) - 1.4826638e-003, (F) - 1.4856674e-003, (F) - 1.4886671e-003, + (F) - 1.4916506e-003, (F) - 1.4945890e-003, (F) - 1.4975504e-003, (F) - 1.5004827e-003, (F) - 1.5034084e-003, + (F) - 1.5063028e-003, (F) - 1.5091954e-003, (F) - 1.5120520e-003, (F) - 1.5149014e-003, (F) - 1.5177300e-003, + (F) - 1.5205758e-003, (F) - 1.5233678e-003, (F) - 1.5261251e-003, (F) - 1.5289303e-003, (F) - 1.5316663e-003, + (F) - 1.5344141e-003, (F) - 1.5371295e-003, (F) - 1.5398364e-003, (F) - 1.5425153e-003, (F) - 1.5451826e-003, + (F) - 1.5478334e-003, (F) - 1.5504665e-003, (F) - 1.5530859e-003, (F) - 1.5556881e-003, (F) - 1.5582783e-003, + (F) - 1.5608417e-003, (F) - 1.5633971e-003, (F) - 1.5659237e-003, (F) - 1.5684387e-003, (F) - 1.5709227e-003, + (F) - 1.5734049e-003, (F) - 1.5758605e-003, (F) - 1.5782894e-003, (F) - 1.5807395e-003, (F) - 1.5831377e-003, + (F) - 1.5855244e-003, (F) - 1.5878847e-003, (F) - 1.5902389e-003, (F) - 1.5925621e-003, (F) - 1.5948806e-003, + (F) - 1.5971795e-003, (F) - 1.5994648e-003, (F) - 1.6017023e-003, (F) - 1.6039374e-003, (F) - 1.6061948e-003, + (F) - 1.6083671e-003, (F) - 1.6105632e-003, (F) - 1.6127188e-003, (F) - 1.6148653e-003, (F) - 1.6169867e-003, + (F) - 1.6190977e-003, (F) - 1.6211891e-003, (F) - 1.6232595e-003, (F) - 1.6253137e-003, (F) - 1.6273450e-003, + (F) - 1.6293578e-003, (F) - 1.6313431e-003, (F) - 1.6333175e-003, (F) - 1.6352621e-003, (F) - 1.6371955e-003, + (F) - 1.6391040e-003, (F) - 1.6410056e-003, (F) - 1.6428767e-003, (F) - 1.6447288e-003, (F) - 1.6465844e-003, + (F) - 1.6483719e-003, (F) - 1.6501672e-003, (F) - 1.6519389e-003, (F) - 1.6536996e-003, (F) - 1.6554282e-003, + (F) - 1.6571491e-003, (F) - 1.6588414e-003, (F) - 1.6605117e-003, (F) - 1.6621541e-003, (F) - 1.6638005e-003, + (F) - 1.6654288e-003, (F) - 1.6669834e-003, (F) - 1.6685753e-003, (F) - 1.6701176e-003, (F) - 1.6716515e-003, + (F) - 1.6731631e-003, (F) - 1.6746564e-003, (F) - 1.6761265e-003, (F) - 1.6775701e-003, (F) - 1.6789983e-003, + (F) - 1.6803975e-003, (F) - 1.6817812e-003, (F) - 1.6831383e-003, (F) - 1.6844858e-003, (F) - 1.6858018e-003, + (F) - 1.6871089e-003, (F) - 1.6883875e-003, (F) - 1.6896522e-003, (F) - 1.6908826e-003, (F) - 1.6920984e-003, + (F) - 1.6932997e-003, (F) - 1.6944435e-003, (F) - 1.6956151e-003, (F) - 1.6967487e-003, (F) - 1.6978597e-003, + (F) - 1.6989426e-003, (F) - 1.7000133e-003, (F) - 1.7010552e-003, (F) - 1.7020763e-003, (F) - 1.7030812e-003, + (F) - 1.7040712e-003, (F) - 1.7050255e-003, (F) - 1.7059364e-003, (F) - 1.7068863e-003, (F) - 1.7077671e-003, + (F) - 1.7086455e-003, (F) - 1.7094964e-003, (F) - 1.7103232e-003, (F) - 1.7111262e-003, (F) - 1.7119057e-003, + (F) - 1.7126703e-003, (F) - 1.7134064e-003, (F) - 1.7141292e-003, (F) - 1.7148261e-003, (F) - 1.7155080e-003, + (F) - 1.7161579e-003, (F) - 1.7167949e-003, (F) - 1.7174006e-003, (F) - 1.7179873e-003, (F) - 1.7185461e-003, + (F) - 1.7190909e-003, (F) - 1.7196156e-003, (F) - 1.7200987e-003, (F) - 1.7206103e-003, (F) - 1.7210535e-003, + (F) - 1.7214820e-003, (F) - 1.7218914e-003, (F) - 1.7222858e-003, (F) - 1.7226498e-003, (F) - 1.7229951e-003, + (F) - 1.7233213e-003, (F) - 1.7236201e-003, (F) - 1.7238898e-003, (F) - 1.7241422e-003, (F) - 1.7244071e-003, + (F) - 1.7245924e-003, (F) - 1.7247871e-003, (F) - 1.7249510e-003, (F) - 1.7250894e-003, (F) - 1.7252121e-003, + (F) - 1.7253110e-003, (F) - 1.7253955e-003, (F) - 1.7254479e-003, (F) - 1.7254883e-003, (F) 9.9827450e-001, + (F) - 1.7254883e-003, (F) - 1.7254479e-003, (F) - 1.7253955e-003, (F) - 1.7253110e-003, (F) - 1.7252121e-003, + (F) - 1.7250894e-003, (F) - 1.7249510e-003, (F) - 1.7247871e-003, (F) - 1.7245924e-003, (F) - 1.7244071e-003, + (F) - 1.7241422e-003, (F) - 1.7238898e-003, (F) - 1.7236201e-003, (F) - 1.7233213e-003, (F) - 1.7229951e-003, + (F) - 1.7226498e-003, (F) - 1.7222858e-003, (F) - 1.7218914e-003, (F) - 1.7214820e-003, (F) - 1.7210535e-003, + (F) - 1.7206103e-003, (F) - 1.7200987e-003, (F) - 1.7196156e-003, (F) - 1.7190909e-003, (F) - 1.7185461e-003, + (F) - 1.7179873e-003, (F) - 1.7174006e-003, (F) - 1.7167949e-003, (F) - 1.7161579e-003, (F) - 1.7155080e-003, + (F) - 1.7148261e-003, (F) - 1.7141292e-003, (F) - 1.7134064e-003, (F) - 1.7126703e-003, (F) - 1.7119057e-003, + (F) - 1.7111262e-003, (F) - 1.7103232e-003, (F) - 1.7094964e-003, (F) - 1.7086455e-003, (F) - 1.7077671e-003, + (F) - 1.7068863e-003, (F) - 1.7059364e-003, (F) - 1.7050255e-003, (F) - 1.7040712e-003, (F) - 1.7030812e-003, + (F) - 1.7020763e-003, (F) - 1.7010552e-003, (F) - 1.7000133e-003, (F) - 1.6989426e-003, (F) - 1.6978597e-003, + (F) - 1.6967487e-003, (F) - 1.6956151e-003, (F) - 1.6944435e-003, (F) - 1.6932997e-003, (F) - 1.6920984e-003, + (F) - 1.6908826e-003, (F) - 1.6896522e-003, (F) - 1.6883875e-003, (F) - 1.6871089e-003, (F) - 1.6858018e-003, + (F) - 1.6844858e-003, (F) - 1.6831383e-003, (F) - 1.6817812e-003, (F) - 1.6803975e-003, (F) - 1.6789983e-003, + (F) - 1.6775701e-003, (F) - 1.6761265e-003, (F) - 1.6746564e-003, (F) - 1.6731631e-003, (F) - 1.6716515e-003, + (F) - 1.6701176e-003, (F) - 1.6685753e-003, (F) - 1.6669834e-003, (F) - 1.6654288e-003, (F) - 1.6638005e-003, + (F) - 1.6621541e-003, (F) - 1.6605117e-003, (F) - 1.6588414e-003, (F) - 1.6571491e-003, (F) - 1.6554282e-003, + (F) - 1.6536996e-003, (F) - 1.6519389e-003, (F) - 1.6501672e-003, (F) - 1.6483719e-003, (F) - 1.6465844e-003, + (F) - 1.6447288e-003, (F) - 1.6428767e-003, (F) - 1.6410056e-003, (F) - 1.6391040e-003, (F) - 1.6371955e-003, + (F) - 1.6352621e-003, (F) - 1.6333175e-003, (F) - 1.6313431e-003, (F) - 1.6293578e-003, (F) - 1.6273450e-003, + (F) - 1.6253137e-003, (F) - 1.6232595e-003, (F) - 1.6211891e-003, (F) - 1.6190977e-003, (F) - 1.6169867e-003, + (F) - 1.6148653e-003, (F) - 1.6127188e-003, (F) - 1.6105632e-003, (F) - 1.6083671e-003, (F) - 1.6061948e-003, + (F) - 1.6039374e-003, (F) - 1.6017023e-003, (F) - 1.5994648e-003, (F) - 1.5971795e-003, (F) - 1.5948806e-003, + (F) - 1.5925621e-003, (F) - 1.5902389e-003, (F) - 1.5878847e-003, (F) - 1.5855244e-003, (F) - 1.5831377e-003, + (F) - 1.5807395e-003, (F) - 1.5782894e-003, (F) - 1.5758605e-003, (F) - 1.5734049e-003, (F) - 1.5709227e-003, + (F) - 1.5684387e-003, (F) - 1.5659237e-003, (F) - 1.5633971e-003, (F) - 1.5608417e-003, (F) - 1.5582783e-003, + (F) - 1.5556881e-003, (F) - 1.5530859e-003, (F) - 1.5504665e-003, (F) - 1.5478334e-003, (F) - 1.5451826e-003, + (F) - 1.5425153e-003, (F) - 1.5398364e-003, (F) - 1.5371295e-003, (F) - 1.5344141e-003, (F) - 1.5316663e-003, + (F) - 1.5289303e-003, (F) - 1.5261251e-003, (F) - 1.5233678e-003, (F) - 1.5205758e-003, (F) - 1.5177300e-003, + (F) - 1.5149014e-003, (F) - 1.5120520e-003, (F) - 1.5091954e-003, (F) - 1.5063028e-003, (F) - 1.5034084e-003, + (F) - 1.5004827e-003, (F) - 1.4975504e-003, (F) - 1.4945890e-003, (F) - 1.4916506e-003, (F) - 1.4886671e-003, + (F) - 1.4856674e-003, (F) - 1.4826638e-003, (F) - 1.4796281e-003, (F) - 1.4765858e-003, (F) - 1.4735233e-003, + (F) - 1.4704549e-003, (F) - 1.4673659e-003, (F) - 1.4642681e-003, (F) - 1.4611567e-003, (F) - 1.4580274e-003, + (F) - 1.4548847e-003, (F) - 1.4517231e-003, (F) - 1.4485514e-003, (F) - 1.4453523e-003, (F) - 1.4421539e-003, + (F) - 1.4389270e-003, (F) - 1.4357099e-003, (F) - 1.4324405e-003, (F) - 1.4292197e-003, (F) - 1.4259289e-003, + (F) - 1.4226165e-003, (F) - 1.4193442e-003, (F) - 1.4160271e-003, (F) - 1.4126989e-003, (F) - 1.4093413e-003, + (F) - 1.4059908e-003, (F) - 1.4026138e-003, (F) - 1.3992389e-003, (F) - 1.3958431e-003, (F) - 1.3924517e-003, + (F) - 1.3890107e-003, (F) - 1.3855717e-003, (F) - 1.3821294e-003, (F) - 1.3786586e-003, (F) - 1.3751927e-003, + (F) - 1.3717083e-003, (F) - 1.3682185e-003, (F) - 1.3647088e-003, (F) - 1.3611918e-003, (F) - 1.3576589e-003, + (F) - 1.3541091e-003, (F) - 1.3505509e-003, (F) - 1.3469767e-003, (F) - 1.3433966e-003, (F) - 1.3397971e-003, + (F) - 1.3362028e-003, (F) - 1.3325813e-003, (F) - 1.3289667e-003, (F) - 1.3253120e-003, (F) - 1.3216911e-003, + (F) - 1.3179943e-003, (F) - 1.3143214e-003, (F) - 1.3106774e-003, (F) - 1.3069539e-003, (F) - 1.3032464e-003, + (F) - 1.2995222e-003, (F) - 1.2958126e-003, (F) - 1.2920713e-003, (F) - 1.2883348e-003, (F) - 1.2845712e-003, + (F) - 1.2808060e-003, (F) - 1.2770072e-003, (F) - 1.2732312e-003, (F) - 1.2694420e-003, (F) - 1.2656312e-003, + (F) - 1.2618275e-003, (F) - 1.2580017e-003, (F) - 1.2541682e-003, (F) - 1.2503198e-003, (F) - 1.2464649e-003, + (F) - 1.2425990e-003, (F) - 1.2387214e-003, (F) - 1.2348445e-003, (F) - 1.2309518e-003, (F) - 1.2270598e-003, + (F) - 1.2231497e-003, (F) - 1.2192453e-003, (F) - 1.2153109e-003, (F) - 1.2113866e-003, (F) - 1.2074293e-003, + (F) - 1.2034982e-003, (F) - 1.1995059e-003, (F) - 1.1955664e-003, (F) - 1.1916120e-003, (F) - 1.1875792e-003, + (F) - 1.1836123e-003, (F) - 1.1796207e-003, (F) - 1.1756321e-003, (F) - 1.1716069e-003, (F) - 1.1675920e-003, + (F) - 1.1635549e-003, (F) - 1.1595257e-003, (F) - 1.1554824e-003, (F) - 1.1514586e-003, (F) - 1.1474060e-003, + (F) - 1.1433394e-003, (F) - 1.1392810e-003, (F) - 1.1351978e-003, (F) - 1.1311162e-003, (F) - 1.1270269e-003, + (F) - 1.1229363e-003, (F) - 1.1188392e-003, (F) - 1.1147366e-003, (F) - 1.1106354e-003, (F) - 1.1065175e-003, + (F) - 1.1024024e-003, (F) - 1.0982701e-003, (F) - 1.0941426e-003, (F) - 1.0899914e-003, (F) - 1.0858563e-003, + (F) - 1.0816965e-003, (F) - 1.0775588e-003, (F) - 1.0733797e-003, (F) - 1.0692510e-003, (F) - 1.0650738e-003, + (F) - 1.0608604e-003, (F) - 1.0567446e-003, (F) - 1.0525531e-003, (F) - 1.0483674e-003, (F) - 1.0441581e-003, + (F) - 1.0399770e-003, (F) - 1.0357772e-003, (F) - 1.0315914e-003, (F) - 1.0273888e-003, (F) - 1.0231919e-003, + (F) - 1.0189627e-003, (F) - 1.0147410e-003, (F) - 1.0105278e-003, (F) - 1.0062964e-003, (F) - 1.0020771e-003, + (F) - 9.9785357e-004, (F) - 9.9362682e-004, (F) - 9.8939684e-004, (F) - 9.8516064e-004, (F) - 9.8092565e-004, + (F) - 9.7667465e-004, (F) - 9.7243400e-004, (F) - 9.6817845e-004, (F) - 9.6393468e-004, (F) - 9.5967515e-004, + (F) - 9.5543687e-004, (F) - 9.5117535e-004, (F) - 9.4693507e-004, (F) - 9.4266414e-004, (F) - 9.3843171e-004, + (F) - 9.3414524e-004, (F) - 9.2987591e-004, (F) - 9.2568012e-004, (F) - 9.2135966e-004, (F) - 9.1709567e-004, + (F) - 9.1282776e-004, (F) - 9.0858594e-004, (F) - 9.0431520e-004, (F) - 9.0005378e-004, (F) - 8.9577366e-004, + (F) - 8.9150003e-004, (F) - 8.8721488e-004, (F) - 8.8295395e-004, (F) - 8.7869469e-004, (F) - 8.7442056e-004, + (F) - 8.7016289e-004, (F) - 8.6589382e-004, (F) - 8.6162249e-004, (F) - 8.5735118e-004, (F) - 8.5307776e-004, + (F) - 8.4880893e-004, (F) - 8.4453368e-004, (F) - 8.4027518e-004, (F) - 8.3600580e-004, (F) - 8.3175195e-004, + (F) - 8.2748711e-004, (F) - 8.2323951e-004, (F) - 8.1897072e-004, (F) - 8.1472245e-004, (F) - 8.1045333e-004, + (F) - 8.0621272e-004, (F) - 8.0193496e-004, (F) - 7.9769844e-004, (F) - 7.9348415e-004, (F) - 7.8914860e-004, + (F) - 7.8494955e-004, (F) - 7.8071490e-004, (F) - 7.7648381e-004, (F) - 7.7222020e-004, (F) - 7.6797990e-004, + (F) - 7.6373284e-004, (F) - 7.5950621e-004, (F) - 7.5527988e-004, (F) - 7.5107177e-004, (F) - 7.4684907e-004, + (F) - 7.4261917e-004, (F) - 7.3840652e-004, (F) - 7.3418147e-004, (F) - 7.2996431e-004, (F) - 7.2575613e-004, + (F) - 7.2155033e-004, (F) - 7.1735508e-004, (F) - 7.1315848e-004, (F) - 7.0897873e-004, (F) - 7.0478617e-004, + (F) - 7.0061078e-004, (F) - 6.9642391e-004, (F) - 6.9225262e-004, (F) - 6.8806653e-004, (F) - 6.8390501e-004, + (F) - 6.7972979e-004, (F) - 6.7557927e-004, (F) - 6.7140842e-004, (F) - 6.6727626e-004, (F) - 6.6313078e-004, + (F) - 6.5892065e-004, (F) - 6.5488235e-004, (F) - 6.5072148e-004, (F) - 6.4657635e-004, (F) - 6.4243332e-004, + (F) - 6.3833154e-004, (F) - 6.3422627e-004, (F) - 6.3013543e-004, (F) - 6.2603808e-004, (F) - 6.2194403e-004, + (F) - 6.1783904e-004, (F) - 6.1374540e-004, (F) - 6.0967412e-004, (F) - 6.0559430e-004, (F) - 6.0153590e-004, + (F) - 5.9748510e-004, (F) - 5.9343652e-004, (F) - 5.8939695e-004, (F) - 5.8535649e-004, (F) - 5.8132765e-004, + (F) - 5.7728920e-004, (F) - 5.7327066e-004, (F) - 5.6924539e-004, (F) - 5.6523832e-004, (F) - 5.6122794e-004, + (F) - 5.5724157e-004, (F) - 5.5324706e-004, (F) - 5.4927299e-004, (F) - 5.4529167e-004, (F) - 5.4133594e-004, + (F) - 5.3736583e-004, (F) - 5.3338602e-004, (F) - 5.2954292e-004, (F) - 5.2550534e-004, (F) - 5.2157784e-004, + (F) - 5.1767455e-004, (F) - 5.1378900e-004, (F) - 5.0988090e-004, (F) - 5.0597844e-004, (F) - 5.0207382e-004, + (F) - 4.9818084e-004, (F) - 4.9429973e-004, (F) - 4.9044254e-004, (F) - 4.8660067e-004, (F) - 4.8274958e-004, + (F) - 4.7892223e-004, (F) - 4.7509149e-004, (F) - 4.7126296e-004, (F) - 4.6744464e-004, (F) - 4.6362882e-004, + (F) - 4.5982681e-004, (F) - 4.5602551e-004, (F) - 4.5224882e-004, (F) - 4.4847023e-004, (F) - 4.4471248e-004, + (F) - 4.4095707e-004, (F) - 4.3721957e-004, (F) - 4.3347834e-004, (F) - 4.2975534e-004, (F) - 4.2603467e-004, + (F) - 4.2232986e-004, (F) - 4.1862574e-004, (F) - 4.1493297e-004, (F) - 4.1131485e-004, (F) - 4.0751295e-004, + (F) - 4.0393867e-004, (F) - 4.0031807e-004, (F) - 3.9666663e-004, (F) - 3.9300877e-004, (F) - 3.8937618e-004, + (F) - 3.8576582e-004, (F) - 3.8217419e-004, (F) - 3.7860142e-004, (F) - 3.7503555e-004, (F) - 3.7147125e-004, + (F) - 3.6789813e-004, (F) - 3.6435228e-004, (F) - 3.6079784e-004, (F) - 3.5726001e-004, (F) - 3.5373782e-004, + (F) - 3.5022620e-004, (F) - 3.4673121e-004, (F) - 3.4324533e-004, (F) - 3.3977978e-004, (F) - 3.3631386e-004, + (F) - 3.3286616e-004, (F) - 3.2942304e-004, (F) - 3.2599148e-004, (F) - 3.2256619e-004, (F) - 3.1915720e-004, + (F) - 3.1575932e-004, (F) - 3.1236984e-004, (F) - 3.0899705e-004, (F) - 3.0562944e-004, (F) - 3.0230245e-004, + (F) - 2.9885971e-004, (F) - 2.9568523e-004, (F) - 2.9231668e-004, (F) - 2.8895192e-004, (F) - 2.8565591e-004, + (F) - 2.8238998e-004, (F) - 2.7914295e-004, (F) - 2.7588913e-004, (F) - 2.7264437e-004, (F) - 2.6938916e-004, + (F) - 2.6614678e-004, (F) - 2.6291070e-004, (F) - 2.5971239e-004, (F) - 2.5650720e-004, (F) - 2.5333543e-004, + (F) - 2.5017411e-004, (F) - 2.4702508e-004, (F) - 2.4388735e-004, (F) - 2.4076019e-004, (F) - 2.3764368e-004, + (F) - 2.3453175e-004, (F) - 2.3143610e-004, (F) - 2.2835091e-004, (F) - 2.2527550e-004, (F) - 2.2221937e-004, + (F) - 2.1917324e-004, (F) - 2.1614560e-004, (F) - 2.1311883e-004, (F) - 2.1012138e-004, (F) - 2.0711506e-004, + (F) - 2.0414964e-004, (F) - 2.0112323e-004, (F) - 1.9831231e-004, (F) - 1.9520475e-004, (F) - 1.9226519e-004, + (F) - 1.8942093e-004, (F) - 1.8652433e-004, (F) - 1.8362809e-004, (F) - 1.8070933e-004, (F) - 1.7782269e-004, + (F) - 1.7493698e-004, (F) - 1.7209519e-004, (F) - 1.6926417e-004, (F) - 1.6646857e-004, (F) - 1.6365806e-004, + (F) - 1.6088469e-004, (F) - 1.5810382e-004, (F) - 1.5533702e-004, (F) - 1.5257694e-004, (F) - 1.4983227e-004, + (F) - 1.4709544e-004, (F) - 1.4437565e-004, (F) - 1.4167133e-004, (F) - 1.3898420e-004, (F) - 1.3630467e-004, + (F) - 1.3365159e-004, (F) - 1.3099695e-004, (F) - 1.2836778e-004, (F) - 1.2573245e-004, (F) - 1.2313545e-004, + (F) - 1.2051726e-004, (F) - 1.1795237e-004, (F) - 1.1534129e-004, (F) - 1.1287369e-004, (F) - 1.1012977e-004, + (F) - 1.0773097e-004, (F) - 1.0528563e-004, (F) - 1.0268888e-004, (F) - 1.0017071e-004, (F) - 9.7654715e-005, + (F) - 9.5215819e-005, (F) - 9.2768583e-005, (F) - 9.0371180e-005, (F) - 8.7951462e-005, (F) - 8.5558944e-005, + (F) - 8.3140519e-005, (F) - 8.0767477e-005, (F) - 7.8374135e-005, (F) - 7.6014789e-005, (F) - 7.3660509e-005, + (F) - 7.1334393e-005, (F) - 6.9012344e-005, (F) - 6.6719855e-005, (F) - 6.4430870e-005, (F) - 6.2164814e-005, + (F) - 5.9896191e-005, (F) - 5.7659653e-005, (F) - 5.5407648e-005, (F) - 5.3195433e-005, (F) - 5.0966866e-005, + (F) - 4.8788370e-005, (F) - 4.6576406e-005, (F) - 4.4435158e-005, (F) - 4.2238257e-005, (F) - 4.0157616e-005, + (F) - 3.7882528e-005, (F) - 3.6003270e-005, (F) - 3.3828247e-005, (F) - 3.1583770e-005, (F) - 2.9593067e-005, + (F) - 2.7557313e-005, (F) - 2.5587191e-005, (F) - 2.3549789e-005, (F) - 2.1556262e-005, (F) - 1.9516113e-005, + (F) - 1.7525599e-005, (F) - 1.5517481e-005, (F) - 1.3572472e-005, (F) - 1.1604256e-005, (F) - 9.6904874e-006, + (F) - 7.7707834e-006, (F) - 5.8828077e-006, (F) - 3.9880938e-006, (F) - 2.1249647e-006, (F) - 2.5040016e-007, + (F) 1.5949437e-006, (F) 3.4494433e-006, (F) 5.2646709e-006, (F) 7.1001852e-006, (F) 8.8806737e-006, + (F) 1.0686745e-005, (F) 1.2432060e-005, (F) 1.4217836e-005, (F) 1.5919286e-005, (F) 1.7687295e-005, + (F) 1.9336697e-005, (F) 2.1125524e-005, (F) 2.2595147e-005, (F) 2.4508556e-005, (F) 2.6196851e-005, + (F) 2.7585354e-005, (F) 2.9262279e-005, (F) 3.0858734e-005, (F) 3.2553422e-005, (F) 3.4140016e-005, + (F) 3.5770376e-005, (F) 3.7301364e-005, (F) 3.8864361e-005, (F) 4.0354202e-005, (F) 4.1892374e-005, + (F) 4.3364404e-005, (F) 4.4875639e-005, (F) 4.6344615e-005, (F) 4.7838012e-005, (F) 4.9285680e-005, + (F) 5.0758389e-005, (F) 5.2178565e-005, (F) 5.3618819e-005, (F) 5.5001511e-005, (F) 5.6415612e-005, + (F) 5.7756282e-005, (F) 5.9143854e-005, (F) 6.0452242e-005, (F) 6.1818800e-005, (F) 6.3085250e-005, + (F) 6.4441171e-005, (F) 6.5663462e-005, (F) 6.7027725e-005, (F) 6.8148646e-005, (F) 6.9687722e-005, + (F) 7.0709936e-005, (F) 7.1728435e-005, (F) 7.3269051e-005, (F) 7.4464448e-005, (F) 7.5741110e-005, + (F) 7.6835554e-005, (F) 7.8017131e-005, (F) 7.9094451e-005, (F) 8.0258949e-005, (F) 8.1353458e-005, + (F) 8.2519454e-005, (F) 8.3606584e-005, (F) 8.4750138e-005, (F) 8.5825876e-005, (F) 8.6929477e-005, + (F) 8.7969516e-005, (F) 8.9038684e-005, (F) 9.0039349e-005, (F) 9.1073535e-005, (F) 9.2042727e-005, + (F) 9.3056320e-005, (F) 9.3992439e-005, (F) 9.4993975e-005, (F) 9.5905360e-005, (F) 9.6892188e-005, + (F) 9.7773259e-005, (F) 9.8760420e-005, (F) 9.9604074e-005, (F) 1.0060085e-004, (F) 1.0137922e-004, + (F) 1.0247409e-004, (F) 1.0299308e-004, (F) 1.0396291e-004, (F) 1.0529542e-004, (F) 1.0578194e-004, + (F) 1.0661111e-004, (F) 1.0726099e-004, (F) 1.0813498e-004, (F) 1.0887415e-004, (F) 1.0975257e-004, + (F) 1.1049916e-004, (F) 1.1133137e-004, (F) 1.1203418e-004, (F) 1.1281518e-004, (F) 1.1348183e-004, + (F) 1.1420856e-004, (F) 1.1484676e-004, (F) 1.1554840e-004, (F) 1.1616264e-004, (F) 1.1685124e-004, + (F) 1.1745353e-004, (F) 1.1813439e-004, (F) 1.1871658e-004, (F) 1.1939587e-004, (F) 1.1995423e-004, + (F) 1.2062332e-004, (F) 1.2115661e-004, (F) 1.2182429e-004, (F) 1.2231406e-004, (F) 1.2298547e-004, + (F) 1.2341104e-004, (F) 1.2412368e-004, (F) 1.2434765e-004, (F) 1.2528676e-004, (F) 1.2595624e-004, + (F) 1.2561428e-004, (F) 1.2641365e-004, (F) 1.2684799e-004, (F) 1.2754364e-004, (F) 1.2795178e-004, + (F) 1.2850208e-004, (F) 1.2883966e-004, (F) 1.2929298e-004, (F) 1.2959499e-004, (F) 1.3001517e-004, + (F) 1.3031017e-004, (F) 1.3071229e-004, (F) 1.3102020e-004, (F) 1.3142101e-004, (F) 1.3172649e-004, + (F) 1.3212756e-004, (F) 1.3242329e-004, (F) 1.3281213e-004, (F) 1.3308486e-004, (F) 1.3346421e-004, + (F) 1.3370193e-004, (F) 1.3406692e-004, (F) 1.3427186e-004, (F) 1.3462320e-004, (F) 1.3477709e-004, + (F) 1.3513030e-004, (F) 1.3522156e-004, (F) 1.3560751e-004, (F) 1.3557968e-004, (F) 1.3620588e-004, + (F) 1.3597876e-004, (F) 1.3537370e-004, (F) 1.3683967e-004, (F) 1.3676131e-004, (F) 1.3707353e-004, + (F) 1.3691530e-004, (F) 1.3708216e-004, (F) 1.3698332e-004, (F) 1.3715429e-004, (F) 1.3713014e-004, + (F) 1.3732519e-004, (F) 1.3733693e-004, (F) 1.3753506e-004, (F) 1.3756412e-004, (F) 1.3774242e-004, + (F) 1.3775349e-004, (F) 1.3790990e-004, (F) 1.3788717e-004, (F) 1.3801376e-004, (F) 1.3795585e-004, + (F) 1.3806087e-004, (F) 1.3795926e-004, (F) 1.3805069e-004, (F) 1.3791032e-004, (F) 1.3798877e-004, + (F) 1.3780411e-004, (F) 1.3789559e-004, (F) 1.3765261e-004, (F) 1.3778116e-004, (F) 1.3743527e-004, + (F) 1.3768980e-004, (F) 1.3692105e-004, (F) 1.3697478e-004, (F) 1.3896829e-004, (F) 1.3696791e-004, + (F) 1.3690649e-004, (F) 1.3635685e-004, (F) 1.3647364e-004, (F) 1.3622245e-004, (F) 1.3635135e-004, + (F) 1.3616781e-004, (F) 1.3623973e-004, (F) 1.3603623e-004, (F) 1.3604220e-004, (F) 1.3580183e-004, + (F) 1.3573672e-004, (F) 1.3545658e-004, (F) 1.3534817e-004, (F) 1.3502831e-004, (F) 1.3489334e-004, + (F) 1.3454719e-004, (F) 1.3439884e-004, (F) 1.3402423e-004, (F) 1.3388084e-004, (F) 1.3347954e-004, + (F) 1.3334594e-004, (F) 1.3292077e-004, (F) 1.3281968e-004, (F) 1.3234605e-004, (F) 1.3230559e-004, + (F) 1.3174954e-004, (F) 1.3185337e-004, (F) 1.3108290e-004, (F) 1.3188746e-004, (F) 1.3285917e-004, + (F) 1.2692712e-004, (F) 1.2939196e-004, (F) 1.2918213e-004, (F) 1.2984364e-004, (F) 1.2941200e-004, + (F) 1.2957883e-004, (F) 1.2901611e-004, (F) 1.2895095e-004, (F) 1.2832364e-004, (F) 1.2815380e-004, + (F) 1.2749849e-004, (F) 1.2727834e-004, (F) 1.2662486e-004, (F) 1.2639667e-004, (F) 1.2574208e-004, + (F) 1.2553014e-004, (F) 1.2487613e-004, (F) 1.2468629e-004, (F) 1.2402521e-004, (F) 1.2387359e-004, + (F) 1.2319054e-004, (F) 1.2308341e-004, (F) 1.2236911e-004, (F) 1.2231705e-004, (F) 1.2152965e-004, + (F) 1.2156945e-004, (F) 1.2064739e-004, (F) 1.2084617e-004, (F) 1.1960227e-004, (F) 1.2019571e-004, + (F) 1.1739216e-004, (F) 1.0603987e-004, (F) 1.2681189e-004, (F) 1.2211069e-004, (F) 1.2160186e-004, + (F) 1.1938009e-004, (F) 1.1881924e-004, (F) 1.1723162e-004, (F) 1.1671837e-004, (F) 1.1546739e-004, + (F) 1.1501372e-004, (F) 1.1396913e-004, (F) 1.1356565e-004, (F) 1.1266869e-004, (F) 1.1229782e-004, + (F) 1.1149459e-004, (F) 1.1115190e-004, (F) 1.1040957e-004, (F) 1.1007974e-004, (F) 1.0938090e-004, + (F) 1.0905795e-004, (F) 1.0837965e-004, (F) 1.0805611e-004, (F) 1.0739106e-004, (F) 1.0705021e-004, + (F) 1.0638882e-004, (F) 1.0603588e-004, (F) 1.0536773e-004, (F) 1.0499377e-004, (F) 1.0431790e-004, + (F) 1.0392614e-004, (F) 1.0323477e-004, (F) 1.0282141e-004, (F) 9.2170161e-003 + }; + *lenh0 = HP50_48K_LEN; /* store 'number of coefficients' */ + *h0 = hp50_48khz_coeff; /* store pointer to []-array */ +} + +#undef HP50_48K_LEN +/* ...................... End of fill_bp14k_32khz() ..................... */ + + +/* + ============================================================================ + + SCD_FIR hp50_32khz_init (void); + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + Description: + ~~~~~~~~~~~~ + + Initialization routine for a band-pass filter which limits the + bandwidth of the input signal from 50 Hz to 14000 Hz (3 dB points). + No rate change is implemented. + + Parameters: none. + ~~~~~~~~~~~ + + Return value: + ~~~~~~~~~~~~~ + Returns a pointer to struct SCD_FIR; + + History: + ~~~~~~~~ + 05.April.2012 v1.0 - Added filters: HP50_32KHZ, HP50_48KHZ (France Telecom) + + ============================================================================ +*/ +SCD_FIR *hp50_48khz_init () { + float *h0; /* pointer to array with FIR coeff. */ + long lenh0; /* number of FIR coefficients */ + + + /* allocate array for FIR coeff. and fill with coefficients */ + fill_hp50_48khz (&h0, &lenh0); + + return fir_initialization ( /* Returns: pointer to SCD_FIR-struct */ + lenh0, /* In: number of FIR-coefficients */ + h0, /* In: pointer to array with FIR-cof. */ + 1.0, /* In: gain factor for FIR-coeffic. */ + 1l, /* In: Down-sampling factor */ + 'D' /* In: switch to down-sampling proc. */ + ); /* (works here as simple FIR-fil. */ +} + +/* .................... End of hp50_32khz_init() .................... */ diff --git a/src/fir/test_data/test-hp50-32khz.ref b/src/fir/test_data/test-hp50-32khz.ref new file mode 100644 index 0000000000000000000000000000000000000000..7332c52312161b826a3b00f6b2090221355d80e4 GIT binary patch literal 15360 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 O_y~5YG`{n6$NvFW5k^4( literal 0 HcmV?d00001 diff --git a/src/fir/test_data/test-hp50-48khz.ref b/src/fir/test_data/test-hp50-48khz.ref new file mode 100644 index 0000000000000000000000000000000000000000..e9f78d91ad29c1e4b83b10a7cace8b9ec29b49dc GIT binary patch literal 15360 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

*CC{tt*cB9zuZyCY1_=$-o7Df)2hLzXQ!IFeAO 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 Date: Tue, 2 Jun 2026 17:37:20 +0100 Subject: [PATCH 06/10] Add EID-AMR section to STL manual (doc/manual/eid.tex) Adds section describing the EID-AMR tool's purpose, its relationship to eid-xor, and the AMR-specific frame erasure mechanism (NO_DATA=0x03). --- doc/manual/eid.tex | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/doc/manual/eid.tex b/doc/manual/eid.tex index 8769dbe8..a8d22176 100644 --- a/doc/manual/eid.tex +++ b/doc/manual/eid.tex @@ -7,6 +7,7 @@ % Apr.96 - Peter Kroon % Feb.2000 - Convergence towards STL2000 % Oct.2009 - EID-EV Jonas Svedberg, Yusuke Hiwasaki +% May.2026 - EID-AMR Balazs K๖vesi, St้phane Ragot %============================================================================= %============================================================================= @@ -1341,3 +1342,14 @@ \subsubsection{EID-EV G.192 Output frame examples } \label{fig:G192outputFrameLayer034ErrorIndividual} \end{center} \end{figure} + +%-------------------------------------- +\section {Adaptation for 3GPP AMR codec (EID-AMR)} \label{EID-AMR} +%-------------------------------------- + +An extra tool called EID-AMR provides an Error Insertion Device (EID) capability for the 3GPP AMR codec operating with G.192 error patterns to simulate packet erasures. +The eid-xor tool from ITU-T STL is not directly applicable to AMR bitstreams, because +the bitstream of the 3GPP AMR codec follows a specific ETSI/3GPP format detailed in Clause 6.3 of 3GPP TS 26.073, which is not compliant with ITU-T G.192. +The EID-AMR tool loops over the input error pattern, and replaces bad (lost) frames with a frame type indicating NO\_DATA (of value 0x03) and all data bits forced to zero. +Note that this tool does not handle bit errors. +Statistics are reported as in the eid-xor tool. From 588aa3f35148dcd9e44e8b22882df8b50a6e4267 Mon Sep 17 00:00:00 2001 From: Ludovic Malfait Date: Tue, 2 Jun 2026 17:42:02 +0100 Subject: [PATCH 07/10] Add EID-AMR section to STL manual (doc/manual/eid.tex) Comprehensive documentation including: - Description of AMR serial frame format (250 words, ETSI/3GPP TS 26.073) - Algorithm: how G.192 erasure flags map to NO_DATA frame type - Command-line usage syntax - Worked example with gen-patt pipeline - Provenance (3GPP S4-120998, authors) --- doc/manual/eid.tex | 81 ++++++++++++++++++++++++++++++++++++++++++---- src/eid/README.md | 24 ++++++++++++++ 2 files changed, 99 insertions(+), 6 deletions(-) diff --git a/doc/manual/eid.tex b/doc/manual/eid.tex index a8d22176..3fdb77be 100644 --- a/doc/manual/eid.tex +++ b/doc/manual/eid.tex @@ -1343,13 +1343,82 @@ \subsubsection{EID-EV G.192 Output frame examples } \end{center} \end{figure} + %-------------------------------------- \section {Adaptation for 3GPP AMR codec (EID-AMR)} \label{EID-AMR} %-------------------------------------- -An extra tool called EID-AMR provides an Error Insertion Device (EID) capability for the 3GPP AMR codec operating with G.192 error patterns to simulate packet erasures. -The eid-xor tool from ITU-T STL is not directly applicable to AMR bitstreams, because -the bitstream of the 3GPP AMR codec follows a specific ETSI/3GPP format detailed in Clause 6.3 of 3GPP TS 26.073, which is not compliant with ITU-T G.192. -The EID-AMR tool loops over the input error pattern, and replaces bad (lost) frames with a frame type indicating NO\_DATA (of value 0x03) and all data bits forced to zero. -Note that this tool does not handle bit errors. -Statistics are reported as in the eid-xor tool. +\subsection{Description} + +The {\tt eid-xor} tool operates on bitstreams conforming to the ITU-T G.192 +serial bitstream format. However, the 3GPP AMR narrowband codec uses a +different serial bitstream format, defined in Clause~6.3 of 3GPP TS~26.073. +In this format, each frame is a fixed-size block of 250 16-bit words +({\tt SERIAL\_FRAMESIZE} = 1 + 244 + 5), where: +\begin{itemize} +\item Word 0: frame type indicator (e.g.\ 0x00--0x07 for AMR modes, 0x03 = NO\_DATA) +\item Words 1--244: serial speech bits ({\tt MAX\_SERIAL} = 244) +\item Words 245--249: auxiliary/padding +\end{itemize} + +Since this format is not compliant with ITU-T G.192, a dedicated tool +called {\tt eid-amr} is provided to apply frame erasure patterns to AMR +bitstreams. + +\subsection{Algorithm} + +The {\tt eid-amr} tool reads an AMR bitstream and a G.192 frame erasure +pattern file. For each AMR frame, one erasure flag is consumed from the +error pattern: +\begin{itemize} +\item If the flag is {\tt G192\_SYNC} (0x6B21, good frame): the AMR frame + is written to the output unchanged. +\item If the flag is {\tt G192\_FER} (0x6B20, erased frame): the frame type + is set to NO\_DATA (0x03), all 244 serial data bits are forced to zero, + and the modified frame is written to the output. +\end{itemize} + +If the error pattern file is shorter than the AMR bitstream, the error +pattern is rewound and reused from the beginning (same behavior as +{\tt eid-xor}). + +Note that {\tt eid-amr} handles only frame erasures; bit errors are not +supported. + +\subsection{Usage} + +{\tt\small +\begin{verbatim} +eid-amr +\end{verbatim} +} + +Where: +\begin{itemize} +\item {\tt AMR\_bitstream\_in}: input AMR serial bitstream (ETSI/3GPP format) +\item {\tt G.192\_FER\_pattern}: G.192 word-oriented frame erasure pattern + (as generated by {\tt gen-patt} with {\tt -g192 -fer}) +\item {\tt AMR\_bitstream\_out}: output AMR bitstream with erasures applied +\end{itemize} + +Statistics are reported to {\tt stderr} upon completion: number of processed +frames, distorted frames, frame erasure rate, and number of error pattern +wraps. + +\subsection{Example} + +Generate a 3\% burst frame erasure pattern and apply it to an AMR bitstream +encoded at 4.75~kbit/s: + +{\tt\small +\begin{verbatim} +gen-patt -g192 ep.g192 f 500 1 state.ser 0.03 +eid-amr input_475.amr ep.g192 output_475_fer.amr +\end{verbatim} +} + +\subsection{Origin} + +This tool is derived from the EID-3G tool (Nobuhiko Naka, NTT DOCOMO) and +was originally submitted to 3GPP in Tdoc S4-120998 (TSGS4\#70, Chicago, +13--17 Aug 2012). Authors: Balazs K\"ovesi, St\'ephane Ragot (Orange SA). diff --git a/src/eid/README.md b/src/eid/README.md index 6918115c..4e9c9df1 100644 --- a/src/eid/README.md +++ b/src/eid/README.md @@ -20,6 +20,8 @@ The "Error Insertion Device" (EID) module is built of the following files: eid-int.c: .... Interpolates error patterns from a master EP eid-xor.c: .... Disturbs bits or erases frames based on error patterns + eid-amr.c: .... EID for 3GPP AMR codec (frame erasures via G.192 patterns) + dlyerr_2_errpat.c: Delay/error profile to frame-erasure pattern converter ep-stats.c: ... Assesses and prints statistics about an error pattern file gen-patt.c: ... Generates error pattern files softbit.c: .... Library with softbit file I/O and format check @@ -263,5 +265,27 @@ little-endian computers (PC/VAX/Alpha) are: Has not been implemented yet. +## EID-AMR: Error Insertion Device for 3GPP AMR codec + +The `eid-amr` tool provides frame erasure simulation for 3GPP AMR bitstreams +using G.192 error patterns. The `eid-xor` tool is not directly applicable to +AMR because the AMR bitstream follows the ETSI/3GPP format (TS 26.073 ยง6.3), +which is not compliant with ITU-T G.192. + +Derived from the EID-3G tool (Nobuhiko Naka, NTT DOCOMO). Differences: +- No position parameter (consistent with `eid-xor` usage). +- Only frame erasures (no bit errors). +- All data bits in an erased frame are forced to zero. +- Lost frames signalled with frame type NO\_DATA (0x03). +- Statistics reported to stderr. + +Usage: + + eid-amr + +Originally submitted to 3GPP in Tdoc S4-120998 (Aug. 2012). +Authors: Balazs Kovesi, Stephane Ragot (Orange SA). + + Good luck! -- From af16c0fe00ac8d9d64efd7291982768cbe505e19 Mon Sep 17 00:00:00 2001 From: Ludovic Malfait Date: Tue, 2 Jun 2026 21:06:41 +0100 Subject: [PATCH 08/10] Fix documentation and build issues in FIR filter additions doc/manual/rate.tex: - Fix SHQ3 caption: 'High-quality' -> 'Super-high-quality' - Fix HP50 figure (b): '32 kHz..' -> '48 kHz.' - Fix broken LaTeX cross-references (shq-frq-1-2 -> shq2, etc.) - Add filter specs (729 coefs, -80dB for SHQ; 1119/1679 coefs for HP50) src/fir/filter.c: - Remove duplicate SHQ/HP50 entries with stray printf artifacts in comment src/fir/firflt.h: - Add missing function prototypes for shq_*_init and hp50_*_init (fixes -Wimplicit-function-declaration errors on C99+) src/fir/CMakeLists.txt: - Fix filter28: add -up flag (reference was generated with upsampling) - Fix filter28-verify: output filename test-shq2.flt (was tst-shq2.flt) - Add -equiv 1 tolerance to filter28/29 verify (matches convention) src/fir/README.md: - Add fir-wb.c entry listing SHQ and HP50 filters --- doc/manual/rate.tex | 12 ++++++------ src/fir/CMakeLists.txt | 6 +++--- src/fir/README.md | 3 +++ src/fir/filter.c | 6 ++---- src/fir/firflt.h | 6 ++++++ 5 files changed, 20 insertions(+), 13 deletions(-) diff --git a/doc/manual/rate.tex b/doc/manual/rate.tex index cb35c0a1..8f06d7fb 100644 --- a/doc/manual/rate.tex +++ b/doc/manual/rate.tex @@ -498,7 +498,7 @@ \subsection{FIR module} (factors 2 and 3), for the down-sampling filters (factors 2 and 3), and for the bandpass filter. -Additional filters (SHQ2 and SHQ3 for super-high-quality for rate-change factors 2 and 3, respectively) with more taps and smaller transition band are also provided; their frequency responses are given in figures \ref{shq-frq-1-2} and \ref{shq-frq-1-3}. +Additional filters (SHQ2 and SHQ3 for super-high-quality for rate-change factors 2 and 3, respectively) with more taps (729 coefficients) and smaller transition band (stopband attenuation $-80$\,dB) are also provided; their frequency responses are given in figures \ref{shq2} and \ref{shq3}. These filters are intended for applications requiring higher spectral selectivity than the standard HQ filters, such as wideband and super-wideband codec characterization in 3GPP. The transmit-side IRS filter has been implemented for the ``regular'' and modified flavors. The regular transmit-side P.48 IRS filter @@ -548,7 +548,7 @@ \subsection{FIR module} the same routines are called, while for IRS, band-limiting or MUSHRA anchors, there is no rate-change routine from 16 to 32 kHz. -High-pass filters with 50 Hz cutoff frequency for the 32 and 48 kHz sampling rates (HP50\_32K and HP50\_48K) are also provided. Their frequency response is given in figures \ref{hp50-32k} and \ref{hp50-48k}. +High-pass filters with 50 Hz cutoff frequency (3\,dB point) for the 32 and 48 kHz sampling rates (HP50\_32K with 1119 coefficients and HP50\_48K with 1679 coefficients) are also provided. Their frequency response is given in figure \ref{hp50}. Since the digital filters have memory, state variables are needed. In this version of the STL, a type {\tt SCD\_FIR} is defined, containing the past @@ -587,7 +587,7 @@ \subsection{FIR module} (b) High-quality filter for down-sampling. \end{center} - \caption{\SF High-quality filter responses for a + \caption{\SF Super-high-quality filter responses for a factor of 2 and sampling rates of 8000 and 16000 Hz.\label{hq-frq-1-2}} @@ -607,7 +607,7 @@ \subsection{FIR module} (b) High-quality filter for down-sampling. \end{center} - \caption{\SF High-quality filter responses for a + \caption{\SF Super-high-quality filter responses for a factor of 3 and sampling rates of 8000 and 24000 Hz.\label{hq-frq-1-3}} @@ -647,7 +647,7 @@ \subsection{FIR module} (b) High-quality filter for down-sampling. \end{center} - \caption{\SF High-quality filter responses for a + \caption{\SF Super-high-quality filter responses for a factor of 3 and sampling rates of 8000 and 24000 Hz.\label{shq3}} @@ -1199,7 +1199,7 @@ \subsection{FIR module} \includegraphics{hp50_48khz} \\ - (b) 50Hz high-pass filter operating at 32 kHz.. + (b) 50Hz high-pass filter operating at 48 kHz. \end{center} \caption{\SF 50Hz high-pass filter responses (32000 and 48000 Hz).\label{hp50}} diff --git a/src/fir/CMakeLists.txt b/src/fir/CMakeLists.txt index dac0f398..ba4002c3 100644 --- a/src/fir/CMakeLists.txt +++ b/src/fir/CMakeLists.txt @@ -166,11 +166,11 @@ add_test(filter26-verify ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/signal-diff -q test_d add_test(filter27 ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/filter -q 5kbp test_data/test.src test_data/test5kbp.flt) add_test(filter27-verify ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/signal-diff -q test_data/test5kbp.flt test_data/test5kbp.ref) -add_test(filter28 ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/filter -q SHQ2 test_data/test.src test_data/test-shq2.flt) -add_test(filter28-verify ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/signal-diff -q test_data/tst-shq2.flt test_data/tst-shq2.ref) +add_test(filter28 ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/filter -q -up SHQ2 test_data/test.src test_data/test-shq2.flt) +add_test(filter28-verify ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/signal-diff -q -equiv 1 test_data/test-shq2.flt test_data/tst-shq2.ref) add_test(filter29 ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/filter -q SHQ3 test_data/test.src test_data/test-shq3.flt) -add_test(filter29-verify ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/signal-diff -q test_data/test-shq3.flt test_data/tst-shq3.ref) +add_test(filter29-verify ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/signal-diff -q -equiv 1 test_data/test-shq3.flt test_data/tst-shq3.ref) add_test(filter30 ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/filter -q HP50_32KHZ test_data/test.src test_data/test-hp50-32khz.flt) add_test(filter30-verify ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/signal-diff -q test_data/test-hp50-32khz.flt test_data/test-hp50-32khz.ref) diff --git a/src/fir/README.md b/src/fir/README.md index ee57a574..f4089018 100644 --- a/src/fir/README.md +++ b/src/fir/README.md @@ -28,6 +28,9 @@ The ITU-T/UGST FIR Standard HQ and IRS Up/Downsampling and Filtering Module fir-pso.c: ..... sub-unit of the FIR module with the psophometric weighting init.functions fir-LP.c: ...... sub-unit of the FIR module with lowpass filters (anchors) + fir-wb.c: ...... sub-unit with wideband filters: SHQ2/SHQ3 (super-high-quality + low-pass, 729 coefs, -80dB) and HP50_32KHZ/HP50_48KHZ + (50 Hz high-pass for 32/48 kHz sampling rates) firflt.c: ...... dummy program that calls all the sub-units. Equivalent to the old HQFLT.C file. diff --git a/src/fir/filter.c b/src/fir/filter.c index c22d6a25..dfdf5c70 100644 --- a/src/fir/filter.c +++ b/src/fir/filter.c @@ -77,10 +77,8 @@ LP20 low-pass filter with cut-off frequency 20kHz for fs=48kHz, 1:1 RXIRS8 Receive-side Modified IRS weighting with factor 1:1 at 8kHz RXIRS16 Receive-side Modified IRS weighting with factor 1:1 at 16kHz - HP50_32KHZ 50 Hz highpass FIR filter w/ factor 1:1 at sf=32kHz, 1119 coefs\n"); - HP50_48KHZ 50 Hz highpass FIR filter w/ factor 1:1 at sf=48kHz, 1679 coefs\n"); - SHQ2 FIR (Super High quality : 729 coefs, -80dB) low-pass for factor 1:2 (up) or 2:1(down)\n"); - SHQ3 FIR (Super High quality : 729 coefs, -80dB) low-pass for factor 1:3 (up) or 3:1(down)\n"); + HP50_32KHZ 50 Hz highpass FIR filter w/ factor 1:1 at sf=32kHz, 1119 coefs + HP50_48KHZ 50 Hz highpass FIR filter w/ factor 1:1 at sf=48kHz, 1679 coefs Testing: diff --git a/src/fir/firflt.h b/src/fir/firflt.h index 93752bfb..8d017417 100644 --- a/src/fir/firflt.h +++ b/src/fir/firflt.h @@ -87,6 +87,12 @@ SCD_FIR *LP20_48kHz_init ARGS ((void)); // FILTER_12k48k_HW SCD_FIR *LP12_48kHz_init ARGS ((void)); // FILTER_12k48k_HW +SCD_FIR *shq_up_1_to_2_init ARGS ((void)); +SCD_FIR *shq_up_1_to_3_init ARGS ((void)); +SCD_FIR *shq_down_2_to_1_init ARGS ((void)); +SCD_FIR *shq_down_3_to_1_init ARGS ((void)); +SCD_FIR *hp50_32khz_init ARGS ((void)); +SCD_FIR *hp50_48khz_init ARGS ((void)); void hq_free ARGS ((SCD_FIR * fir_ptr)); void hq_reset ARGS ((SCD_FIR * fir_ptr)); From e82db9d1be9686e1acf4d591b74d65b189fa2e53 Mon Sep 17 00:00:00 2001 From: ragotsa <138860563+ragotsa@users.noreply.github.com> Date: Thu, 4 Jun 2026 00:18:55 +0200 Subject: [PATCH 09/10] Revert "Proposed improvements to eid-amr" --- doc/manual/eid.tex | 2 +- src/eid/CMakeLists.txt | 14 ---- src/eid/README.md | 24 ------- src/eid/eid-amr.c | 107 ------------------------------ src/eid/test_data/bf03.g192 | 1 - src/eid/test_data/bf06.g192 | 1 - src/eid/test_data/bst122.amr | Bin 152000 -> 0 bytes src/eid/test_data/bst122_bf06.amr | Bin 152000 -> 0 bytes src/eid/test_data/bst475.amr | Bin 152000 -> 0 bytes src/eid/test_data/bst475_bf03.amr | Bin 152000 -> 0 bytes 10 files changed, 1 insertion(+), 148 deletions(-) delete mode 100644 src/eid/eid-amr.c delete mode 100644 src/eid/test_data/bf03.g192 delete mode 100644 src/eid/test_data/bf06.g192 delete mode 100644 src/eid/test_data/bst122.amr delete mode 100644 src/eid/test_data/bst122_bf06.amr delete mode 100644 src/eid/test_data/bst475.amr delete mode 100644 src/eid/test_data/bst475_bf03.amr diff --git a/doc/manual/eid.tex b/doc/manual/eid.tex index 50f8feaa..a8d22176 100644 --- a/doc/manual/eid.tex +++ b/doc/manual/eid.tex @@ -7,7 +7,7 @@ % Apr.96 - Peter Kroon % Feb.2000 - Convergence towards STL2000 % Oct.2009 - EID-EV Jonas Svedberg, Yusuke Hiwasaki -% May.2026 - EID-AMR Balazs Kรถvesi, Stรฉphane Ragot +% May.2026 - EID-AMR Balazs K๖vesi, St้phane Ragot %============================================================================= %============================================================================= diff --git a/src/eid/CMakeLists.txt b/src/eid/CMakeLists.txt index 7cbdd19f..a83eb223 100644 --- a/src/eid/CMakeLists.txt +++ b/src/eid/CMakeLists.txt @@ -103,17 +103,3 @@ add_test(eid-xor ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/eid-xor -fer -bs bit -ep g192 add_test(eid-xor ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/eid-xor -fer -bs bit -ep byte test_data/zero.src test_data/epf05g10.byt test_data/z_f05g10.bby) add_test(eid-xor ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/eid-xor -fer -bs bit -ep bit test_data/zero.src test_data/epf05g10.bit test_data/z_f05g10.bbi) - -#--- eid-amr: EID for 3GPP AMR codec (from 3GPP S4-120998) -add_executable(eid-amr eid-amr.c softbit.c) -target_link_libraries(eid-amr ${M_LIBRARY}) - -add_test(eid-amr1 ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/eid-amr - test_data/bst475.amr test_data/bf03.g192 test_data/bst475_bf03.tst) -add_test(eid-amr1-verify ${CMAKE_COMMAND} -E compare_files - test_data/bst475_bf03.amr test_data/bst475_bf03.tst) - -add_test(eid-amr2 ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/eid-amr - test_data/bst122.amr test_data/bf06.g192 test_data/bst122_bf06.tst) -add_test(eid-amr2-verify ${CMAKE_COMMAND} -E compare_files - test_data/bst122_bf06.amr test_data/bst122_bf06.tst) diff --git a/src/eid/README.md b/src/eid/README.md index 4e9c9df1..6918115c 100644 --- a/src/eid/README.md +++ b/src/eid/README.md @@ -20,8 +20,6 @@ The "Error Insertion Device" (EID) module is built of the following files: eid-int.c: .... Interpolates error patterns from a master EP eid-xor.c: .... Disturbs bits or erases frames based on error patterns - eid-amr.c: .... EID for 3GPP AMR codec (frame erasures via G.192 patterns) - dlyerr_2_errpat.c: Delay/error profile to frame-erasure pattern converter ep-stats.c: ... Assesses and prints statistics about an error pattern file gen-patt.c: ... Generates error pattern files softbit.c: .... Library with softbit file I/O and format check @@ -265,27 +263,5 @@ little-endian computers (PC/VAX/Alpha) are: Has not been implemented yet. -## EID-AMR: Error Insertion Device for 3GPP AMR codec - -The `eid-amr` tool provides frame erasure simulation for 3GPP AMR bitstreams -using G.192 error patterns. The `eid-xor` tool is not directly applicable to -AMR because the AMR bitstream follows the ETSI/3GPP format (TS 26.073 ยง6.3), -which is not compliant with ITU-T G.192. - -Derived from the EID-3G tool (Nobuhiko Naka, NTT DOCOMO). Differences: -- No position parameter (consistent with `eid-xor` usage). -- Only frame erasures (no bit errors). -- All data bits in an erased frame are forced to zero. -- Lost frames signalled with frame type NO\_DATA (0x03). -- Statistics reported to stderr. - -Usage: - - eid-amr - -Originally submitted to 3GPP in Tdoc S4-120998 (Aug. 2012). -Authors: Balazs Kovesi, Stephane Ragot (Orange SA). - - Good luck! -- diff --git a/src/eid/eid-amr.c b/src/eid/eid-amr.c deleted file mode 100644 index 6b9d3094..00000000 --- a/src/eid/eid-amr.c +++ /dev/null @@ -1,107 +0,0 @@ -/* - eid-amr.c - - EID for AMR using G.192 error pattern of frame erasures. - This tool is based on the eid-3g tool written by Nobuhiko Naka, NTT DOCOMO - (see: http://www.3gpp.org/ftp/tsg_sa/WG4_CODEC/AMR-NB_3G-Characterization/EID_Error_Patterns/) - - Modifications: - - using G.192 error pattern for frame erasures - - only frame erasures (no bit errors) - - no position parameter to skip frames (usage similar to ITU-T STL eid-xor tool) - - all data bits in a lost frame are forced to a value of 0 - - statistics reported to stderr at the end of processing - - uses softbit.c read_g192() for error pattern reading - - NOTES: - A lost frame in DTX on/off is signalled with a frame type code 0x03, - independently from the TX or RX frame type. - - Contact: - Balazs Kovesi, Stephane Ragot - ORANGE SA - firstname.lastname@orange.com - - =============================================================== - COPYRIGHT NOTE: This source code, and all of its derivations, - is subject to the "ITU-T General Public License". Please have - it read in the distribution disk, or in the ITU-T Recommendation - G.191 on "SOFTWARE TOOLS FOR SPEECH AND AUDIO CODING STANDARDS". - See LICENSE.md in the top-level directory for terms. - =============================================================== -*/ - -#include -#include -#include -#include "ugstdemo.h" -#include "softbit.h" - -#define MAX_SERIAL 244 -#define SERIAL_FRAMESIZE (1 + MAX_SERIAL + 5) - -int main(int argc, char *argv[]) { - short spch[SERIAL_FRAMESIZE]; - short epat; - - FILE *fsp, *fep, *fwe; - - long frame, fercnt, wrapcnt; - int i; - - if (argc != 4) { - fprintf(stderr, "eid-amr: EID for 3GPP AMR codec using G.192 frame erasure patterns\n\n"); - fprintf(stderr, "Usage: eid-amr \n"); - exit(1); - } - - if ((fsp = fopen(argv[1], RB)) == NULL) { perror(argv[1]); exit(1); } - if ((fep = fopen(argv[2], RB)) == NULL) { perror(argv[2]); exit(1); } - if ((fwe = fopen(argv[3], WB)) == NULL) { perror(argv[3]); exit(1); } - - frame = 0; - fercnt = 0; - wrapcnt = 0; - - while (fread(spch, sizeof(short), SERIAL_FRAMESIZE, fsp) == SERIAL_FRAMESIZE) { - /* Read one erasure flag from G.192 error pattern */ - if (read_g192(&epat, 1, fep) != 1) { - fseek(fep, 0L, SEEK_SET); - fprintf(stderr, "Warning: Error pattern file shorter than speech file\n--> wrap error pattern file\n"); - wrapcnt++; - if (read_g192(&epat, 1, fep) != 1) { - fprintf(stderr, "Error: Error pattern file read failure\n"); - exit(1); - } - } - - if (epat == G192_FER) { - spch[0] = 0x03; /* NO_DATA frame type */ - fercnt++; - for (i = 0; i < MAX_SERIAL; i++) { - spch[i + 1] = 0; /* erase bits in bad frame (force value of 0) */ - } - } else if (epat != G192_SYNC) { - fprintf(stderr, "Error: invalid pattern value 0x%04X at frame %ld\n", (unsigned short)epat, frame); - exit(1); - } - - fwrite(spch, sizeof(short), SERIAL_FRAMESIZE, fwe); - frame++; - } - - fclose(fsp); - fclose(fep); - fclose(fwe); - - fprintf(stderr, "_Input bit stream file ..................: %s\n", argv[1]); - fprintf(stderr, "_Error pattern file .....................: %s\n", argv[2]); - fprintf(stderr, "_Output bit stream file .................: %s\n", argv[3]); - fprintf(stderr, "# Error pattern files wrapped ...........: %ld times\n", wrapcnt); - fprintf(stderr, "# Processed frames ..................... : %ld\n", frame); - fprintf(stderr, "# Distorted frames ..................... : %ld\n", fercnt); - if (frame > 0) - fprintf(stderr, "# Frame erasure rate ....................: %f %%\n", (100.0 * fercnt) / frame); - - return 0; -} diff --git a/src/eid/test_data/bf03.g192 b/src/eid/test_data/bf03.g192 deleted file mode 100644 index d2449ec4..00000000 --- a/src/eid/test_data/bf03.g192 +++ /dev/null @@ -1 +0,0 @@ -!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k \ No newline at end of file diff --git a/src/eid/test_data/bf06.g192 b/src/eid/test_data/bf06.g192 deleted file mode 100644 index 999e8ecf..00000000 --- a/src/eid/test_data/bf06.g192 +++ /dev/null @@ -1 +0,0 @@ -!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k k!k!k!k!k!k!k!k!k k!k!k!k!k k k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k \ No newline at end of file diff --git a/src/eid/test_data/bst122.amr b/src/eid/test_data/bst122.amr deleted file mode 100644 index 43eb16457ed9a22233123e51d9f1f05e6d5bff6a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 152000 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 T+VpyYc8!wC>YxF>@BIG)EW6UI diff --git a/src/eid/test_data/bst122_bf06.amr b/src/eid/test_data/bst122_bf06.amr deleted file mode 100644 index 11097c7fdc51cda47f04822ac219f4817a1883f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 152000 zcmeIb*>>$l+FV=qxj66t#I|BhPDNw_lxkG-TMfZMTXgICNV=Xt>A+YA3k4r+;=(q&Z`Joeol6( z^YnB(yHlFsRM3Yh+A6|WofEwqnV)c98QH7CW;va}ZhCyG>Hb83@_zfQ6TFj+W>Du> zy)$Q@+1pjmVyS|*s;`q~yWhDk)k6u!spJ#5bGzKse4TmlsY17?t*f;gS@^9R2y^IB z99U5|bGLfsluzA0)pq0*?dEhN)2R;9r<9koU$?itdb+5LN;|8Z&vy}P+}8yMleyc>=8zA&_f4TPGu7~ve|s^3#8tUo z>+#%Yn@dd)oqU$RY@hEOj43=jB>}qXJ+m;W>-J5%JQArW=Ip=2n`v1x>zt|`9A?4h zat}%@n|kcLNcm3E=kk-COt;X^}zmO=fYY3YgrPyM60PT^zl-Z-2H|%`AIn>-Sm7b1JIm=3{ztOce!l z76-dMXcSgQu4i!W(a`5asFV|2_f#s0td0yPBAq`qnTT_bGE+U7-C5*kuF9wQx)tvh z#&^Hx{ftzpE*?4-xpUR~#Ko(4Ct;3{yPoBr&*+n#JUVt}*t5F0a#xw{I>J3wGuvz3 zV{Yi8xMm(q6`ea_0TN@S8VSB0c^l>7V9*^G9IThDO6=qM3?w1wSY`lNUuYTv$ zZ`vn=e5SlTJ5RM=`oI0z4oftCD2HX0`PntC9QWozv$)^uMTSp}a%yv&CyL#Ir-y|W zdUEM@21*@qs;jD^`t6%gj*8j5UEs)2ow8+h@}0*yS8;uxzvrgQ83$No%%$2q4?D2 z`NTJmPV#oM_1il~v(KrzT4*!9?_gB$iO&9f3etF2kJF@nhTXc)Sx++GGqtP26J*{? z6+O`MUhY=iQoW@jjVy5|^4yZCd79RlDnXi8A9wb9;`4mx%u!O&Pljn#&I~Zm93Y%+ zdbCd;_nh5zj#7Frs`GAF9Tm(dVpUM>CKX*!Dy-(Jfkp$o_hqo(i5fxcw;5Wqtpkkm ztL=ufZt36tdCr_CxHGIjdN*2M=k}aTN$I9KxZ#WwJCWa=n^NA1)kAGibY^O*aF_pv zgN2UjC{%}B)hb7S`JO85S(W;|BmBsoD?@7Z3+0^!I zs?#3LY`Q)9?AWq#;)%06r}oWNSKX@WF0AJ}&ol_})StnxGj{6qv$TTkeKVU-4|MBs zDr^qa%15F7GF4@34n1$Tr}8q)u(Q3^zq=YEx_gXxwUALn>IyJcmo9&j*<{HtTKn>Nr`fd7Pn8B*sl@fpxc?KIqgN?5%$H&9a)*cY<}77d^gPG3h)y>H1|h z=WaW%8f+2H?O}LV52sGmfK_hr>AX`FmHGM3L8`Bx)1GY7tA-Cr-W{Fpsg5UV`d43$ zZa#65AWXptUyd`pRsn=_p9ut0xF_PqiDa&36FNalRHy3gKALymT-`Zq!cNSk*8TT( z<{zWatxWW{SEH#kqoLp9(Z@=e3vd>)?C(J~M4GL@~T+FJFsqDp~>`p(>?5Zsm zG(IBrt2SCJ3 zwUezDCn)n3b60)BsPlC?sMjr%_RX9bI;+7n6Dv=c-Z`_oJ?%x>n$N0&~e zrc$As#Z&WCAXQZ%y&HG!I|0>u{r30#=YKQ7XZ_c|KmQKrPsIL2`8hD#Zfm#vv@V~Y z#QUc%2xeAzpG+_!)d0D>MTkPz4Y|^lO; zS<|g6sC$xr|7`#HJ?9hp>)+pg&-oei+24MW{VDU5!B5w78janF$AfL}nW`aEhB{|o z9hmj1s!Axs@Q!L-SKTD%>~yH>CP@vBs?OCsRl%PcKC$N;rVN$w<(aw5+uw6|q-#wk z{K|3)dY?s4u;x4ysP48{CplHJ?(WVg!c=97teO)tfRtyB?bYT9+&G0%t<}RxXE8AM zuB)0bM69EVy6U#`lZPw&D!u)l<7yVMo;Z15k231QOfDJZM8jIHy(ftCt~#9Eg|!}E z&F9c94fQguIn^P>GCoqjrd~}{*)QtJE=GP%`S+6-O+~gl+09ZJRXX|4cV2cdI5dwF zQabOn>8+kfy|Za{r#W#|0hcC$2X4{TJNb6%rDs;<<#tL{r}QGJ>0~%7=HA%rAMIS~ zRzVFR4>a7oy>qoZ(U%dWd-4hJ$zT%EXMgg*FhdpPOq_-yO#z`Bb@+RHK`){bo-W4d<=OOVxR6XH_8=_|_-Cx_UB6XNB_HJ1+-))4;7p z`_7gNPc|5GRu_%8US3_`X3jJ028ANTh;9#SbEvjhW=?cMCDZEJ$xz>O_cx1ORqG>C z)x}r`&80`qT(|B{_rJ-&F2i0OH=J&(uP+nPxRryN8B}Rs6_vr1r=m#v^;P%OAVu)~ zRu>hu&b>RZRjE3760HVKFmlf&R<;T3LD3c642yFL4(6tO`UUy?Jzq^Z%v5e_CO&KD zW^p2-shoJSsb3w{>JHUv$&HqY%4g!8Ij$pTDXZ!%vW=3oBkJMW|Vvvi*RwDYr)j&JY&G;#K)%xW1ZFJn=g z#CcAgtifg4iSA6`bZ>?a<=0zvWw~0uDr(>hvaV4O*;Ji6D;p2*a&^XSI~-B`J+H;$ z9Ho8d>aQL(c=Buw1LdaPgiaTU!a2dG=w~HDw|yQR#gyI26Q2aR7EQ-y_d4W!eyO1v zh>!R$=;!H-bZ@Lx{1W)p_r%A`)FuM~&zYX*JKqFbgZ8e2sp#Kb&7)d-Q#H}*p7?4z z-;-QUOvCebiVwXEKNGWXvNfr^lPN}*-Kvhlji|2K)?J-w=usV~WYR~zQyrqvFHr2> ze$R`P4?ZHNxV$EA^O*`T`%HuDhoPK4zd>be~ao zTzz5`t6K%}b?Af&pR>Mo)elO%9x}o7o&WqDE}zif;re;!e}}hxK4afGbN^J}Pl5YS zGXK=*+&?vB%Ll=qKf&-N4^%kvot#MbAgflUh~`Cc8RgZbvs7NDWX9ZtH)FB5d*?*+ z)aZt}n76qzpNHOQ6E~}gf^o_W4fppu7yY6A%B0f|1yqYuH7;qeREbO`bFV^s zb7XR&QLq2HcGsznYNub#?oS^RgDqQUCOX=w!Q4BJV(Lzoby$W@pu{p&!zm81v-|#? z7o(E7)QIN$SCIEcmCV_KD$>5E88Y!==6%(i;gpWa$*i9Vvj^P?6-+!->xOxK?2Evw z{^aSMO6AQ_PPgddvQx3n)EAGg)APT#XNsa|arACI#csby^w_GDuHRHA zE>$})%$VY*>-lGU(P}S;Ct2-ot*W4d8++5G&u;h5a56(Noy!Ua7Fuemw5M1Z>ccrZ zd2s40cil4M+dEoLt53D}(-k+p%V(~tb9*zLY^G&~#dW{)Q?Jhe!}R5Yx2Ho{EE+sV z@A~&#rMp&9t@P;YLIP*v^b>C{3mn_r<@HRpX=HTfUZkgq=yArQcXNQ%pS`;3v|n#H zVoaxkeYu(3?;Mnv?N%L4CeBF`h6y;kKULKb1^?ta>$H{bOi(LcFVpxWO~Zt|YQR@{ zcc*ex`C47@BzddlsI{0?^I0r6dW!}6Od_wyn*bL#GKs0JHRY>Q4+ zeNj6TtK$84I25`qx4N0x=>dbe+jFKeOn4%yc+c?%M|KdZahg)xshdunvYDmF-A&I` z1*48?BJ6Pji_WSStvAT3rm7a%nDuTxChFVCseAQs%jW()58Le2x>Uz~Ce?Jm_^QEi zS7qJQEF+cMoPIHXpOg`_7|z`NHjNwRvgNX^j{Ks-;Hn~9`s}Pw6^&M(iC+9-%Rot_ z+*Ja*Dx#X>{5{91s7;Tb6Onqz;SB2eWfC~qn?o$T^}vnOtB#NeE+9}FitpTFnw+@49;iecBg%IE3R;I3{` zTD#d9b?@~oirIa4-?<4mo6g>ojr>gc&cxlao#)K87<*5(_EbGQ*i2TZeyyT;a_u~$ zx3vz=&UgL+4?|Q=mDZh^+iqI1^Ql$^Z8l_NTWqK3oea@t(8>AsCq~^OK9Bsl;bbbb z@C9Q!HNc~^cN`b3N;fJl%JiUg5y^QfofwguYqhf9cP)sA_nOnKT7tQLPJ&Hw|K|Co`%yhpxU)4pV zM!in=J1<7098|s6jlDelxIIRjNO};|V46e3{mwH7RlTj`G24x4GBe4dnUUk3)7Q6J zsJW?MpT{a1dgyZUOs4yytWi-%O_bs7u1fHm+iK^cn*%LeWYh&53Y(z#MWCgkYWB<7 zcMc9uFgR7M(_rhUL-AC_Q;CzCX)e^LWNun9nSrK~>D=uHHppAcJ?FCBIFrfA^h~&) zgnKh~x4J%U&prnV+4vRa>e`jPTUfYd{`@}w4hQo6j)UqbnaW-D&nk*Aoij0?JGOMD zScXr4Upg61V4wS#j<-5yk@RGD(2Z7RF$s=>4lpg}CE2r5gndo)bZnQq;e_jK@?&gVF%D($&0=(EKk zb*HK9&Eg3QzhdCii(rNp_*N-<^3dhZZtuHQ@%(Qx z=%QCdsy=h8&Up%WYTP(5D4E3B)6t2V-=*oi%2ei1i9G8_{>25WBHOdS_iR<*tWPUd zPCQO%HjDlyjp}ZWSNa zN@rG7N!AUnOuJL-+^X%?6O>y|(yCk~a)`=Y3>#F7%AW6Pz^Q{wCg5_fN;g*Dzw;nq zi@mknk^`TnTvm4{ryfliM7ukCRdKrSaLdve+}SPaWBPSl4=}yU0h$gpPg3Un1R^_+ z0xV`AI%A*v%~|}q%dIMDO(k~Uc@eU!jyLn-ti-8GPQ6bxl)9@jDr&XUC8u>NG&q^# zdn)YabVaZGJDD4CI_X=tbE3<6+L>-u_i3m>iS2$psiW&xSxn&hT%7lx?c_KemWO83 zn&4Iq;)zWTE-G`apBNF{$*pd+PQT2neb;3@H?Yjmy=wY+2B9A4PBO1vaI4#nsSeAc zMzJXSY^kZZ8SRZME3yR9-n{p`sp$&Y}@4-^|^zs}dSutz`zAOD*gGF2h0_b>Ft$ugmwedlCaCnrJgWv5DauzOdb&w>^Rx9WJB)@Q&^rs}7L8PL$L z3Toil`&M%Gm*d>N95y8J&WSS&^*B$Q=x7!PyLfvM@m;(L-LorV@$c{aBlpYAbXK1F z(X0GSFHRkt&1Vky(NbY~&KI?Mi&a4#IjfObE>qZL;=D7NqB*O-j2Vb@;1k* zib6HJJ(Hr;nNH@QM+f(}cV0IWInmd%PA7srv)pl1O%`d+Ei>@DIVWhcS9ND~4#osU zlHlCkv+9*ky7Ek*ha2W}>K5y>h;Cm`W^h;Cx#zo6r>mVhT5s>1olf71ers=O-_!-zC!{2p^_YOQR!5d;NGq1DO6<1lo~I~pv7m6k|NQrJSygU2@oM;K(VN!O zY2BaCr8cLGoN5SDIAxpt>Vx$53L_;OFR zs?-CW)ph4A8u#zH3D0wxVI@To)Xdy=?{fsdyv~=uD75hL-dU@C9&7N$Y&tP)bI)ZS z&d%6?*eNQab<&5kT>0yXvrM#QoP3ZXz;q_oy_?N~3!8oCVopt`RoeV!loK@ii()3m zY@FzNFB=v6oK95sWG6z^ds+t&u$gwUZ1b)X8Q|`{?l%I|`UK0hEO_kLpLh21R&_Vd z)#(nkJk$BkGr3ipuzG$PJ-a*cs;LVOpCCn(tz9cU7D3&OJ-WSDC6(Ro%}q`ey>rTn z2TUqEPG?1R?yO3g*acT7H*nT(Rl?;<9n{{~Xw+l>Z2$Rx6Y%rl{|#>U?|FZ2sQhW- zqj>%_vG>l;l%3~l-m3m&?mWC)%hz8mx8T~ThXSl@<-6~!6}$GS$YK&Y5!I@?NS$-y z&fU4VdO9gWCK|g}YuTdNy`#bJI}c07t#Br(A`G;gdcxVRIP}{WMS{%&>Q1n|wT`e? z^K=T1?a83)t}Hj%@tsNPTspnuvn{50_-76kgUUs(J`>csQ~R9QePlj2o%Wqq9~IGh z;OI^TreHQ3Y$s}yBvY%ZR_UCjJ6&~SiW+)F%5YASPH&_MP3FFRQ)idUNij}U`@p{5 z97)8=6>&0{%8(=0dCzQ6q;iwlt^9oFpzr%KO~9!l>gxeVrdiB(vrUa&(RY&e)jzdB zFpEwv(wPXS&Z;LvWO{K_Aegx;>clX=x9UApgw5q{yRX$RN49)>C$C+RsWRp2JOBAR zoS(^G{p>sUCxM@mv+K`Df3p0U^2}zx_~e+#dYj3|19xWo**Ad*x98@}EhcAi*6U)< zXVTRulPN5epZdjA<3yz+Mg32YMW`ZUxv)+ZyjFpF-#Ho}&w3SCqbS_G`?NWW7mdUE zoH&!;XHirrr&jr{qtMH`Dcx6TF{f&D7Jv8b(3V-Ib2+LP?Z!N4s%$b&FwX3vm8+Pu>Q48n!$L_M=i4T_ovT)Mm~$K{b?K@Aeg9?lPtiNvcFAF!AOzXQSG@aB5>6@9U z*rusQcB>(_GZC5Wl=-QzSEkgi29w%n{u2ylWK;NhAraBee!)B*icA~q< zY~T4hmI*g~u64QVI@GP2JA0p2uY26ts9=(Fm+kVBCfA}$hI*WKi!Q%gd`?ccbwTIt_gsIlRg#;tb@N!|)bTvO#-Haq(P}z9GgObg zsp!+ovPreu4j;MN=)BbaCJQSb$+5y6VKV1%zBD+gJbSZoGOgx@3}fB z+fIe`zw7PwmPd*pM2TQSs-XQYgB_dV&M8~fPgk6nE#G<3%NH*S2fDjHpD9cx&eb}d zqNO8sb<0>zP-0-};6^>>d%u6rPbR9e$%Q74Y}}t+(azyCDTr*{e2QOg%*qR*I68ES zgsawx2D=QMzSDKC&T@B_n!Z)FQ?ZqQ_DsP)aq93)XmQ`CbXyXqHbc&cdj2kPgmyMg7AK( z5_PLIK{j%kK6k4r-V?UZPWC2L8MIrbPv-3dB5E>FMy=EGz>4Oy(=TUdsyksP!l_>A zMW~nFxu>YjtEP_6-*Yxbre_~F)xj13f>AjCfHR)wU>^X02wZq6&ef*g2MvdJ#^K_@$okDH) zqI=3?V#=Jks@C4!?)x;S-eRg{rfhqmYl13niq!jOdsCq!yIxGxz+6?ZtAqWSf43r@+kIff~x-56Pd2R;kW!AwRJaxe~mnaf~a$7CEJwazLpZe*w zS|`@-Bk{{ET<>o)-Lex4PVdgmsbaZqP=O(;v%Yh+<#~doBZZTu=%k3B>W}&f^qup+ zlkrXW^nGU1i_W{4{1p6LfAmk_|NI{l{`_yF{3QPBXW#k%{yb`bzpXOfnoq>vaQ39Bj{w)72&wju2KTGbPod5bKaKCf^hTb#UcKG<`Ie%yO-^iKT{p*Q-nE&lh;Q7wu z==<{x{=D=5_IvoB)bBg@-_PIQIa7E1EadL*yp=yCLH=BS%unF?@8`++{5@yt?&qE7 zllZe<{XO^J&+{a||IU5u{H`zO&-zLHeRBW2^S{r#_DO%$!B`5#v{`u$m zzw%lCQ8@iQ|Nh_4ebYbh{Ezb1{=FRk%sbC-H5dN{rauGzzGur+{D%Yn$oX_09bEa{avX|K4Z&M^)}S z|LuQ2&!6S|8P1dZ{Mr6TeWSmh>;Cui-)H|6G&I^k{e)_wDE)A8ljvl>)r`ICd^ zQ$PFfm3O03)tdwrHsUyo-UQaCH*WG(LmLLQ&%a$}GMBN_?y1awb9K&{s~T_4s+JX0 z|9P$kYSmgE9y-aWw;MI;rHY7~tA?jfusPsX0SsQ%Z&mkV*giMriKaDKz`o_FN;AQs z{}OspG`ZSk;qQE1H#w-fHc2Xx%cf@geCHq1uear?g=#yL?8`_6mdXyK7MaQc-95YZ zsrY6lucrz*<*kEBWT>VdyzOrGt&sicWanJ3o*&BRsq2J}T(I63rJu9rqe9!ev!c%b zzca}wnyxv+Vy0WW-DJx*)1vkXm~N78(HD`qn$+&w>4%2A~f+HqoYpxmXw~ zz;U1HKlf*Q8L8IM+LHwOHLENWh*PgQ5lEaI&l3Vw^^cYq#sRSYYuR-J@0qkG^jN>N@_C~&9q*s_guX7oi}rKXH^xdz4KJC)Kg`7 z&9)9ARDLsl}(!ITNRkCjertPU# zt2~%uQ3;YSdy=U@LhnqgBeQ!{PK~FQ8LC7|k?zrPw+UODq33rjRg1*`iQin=ng9h- zs>U7!slc1CTKIZbRqf|HUxaF&y6>~#gkHJJDB9_w!^u_c)@-=5k5(?xcjX?8C^_e6)gn<{q;Q+|+(esjd(M8YYzDV~3aGli#0oOUKu`AmY7 zSTN1CIdCygPQI#dk6Jn|RaGDXC}!T5Q+AOunTYTiWEWo?SU1kkb9HXK&nCtv!?SlC zHfigsmVa*X0hi5pzvq5p!BCfDZ)VTiN$yAB(pk>xfrS~&dBI}7cNI)v|Hfyh?yce+ zrDFRjn1NmAGBR-Mz4Kt6=}(tu=R~Gi(Xwj> zD$u0b8Z}t0N!I7K*FzT>B0a^ir)ypRW@BbweYqr8WAn&lheBC;Z8B?_x>f;%D(#v} zE*#RS``tS)M<<@cPIb>!C5s9@&F0<=^u3>q`UZiY3Z5sUKBQWdo?>8%C|(~n-aXl> zu?eYnQ_Zluv2J#dnTvEnZwI5DN~DvmhJ9Jzy>k>%`L0HVj3&6#nMYKepA6EOb@#2Q za#y((9y*xLz07rSC$?PF<(z&@7lEdCPBz=K;PSrSl)cKP8 zdOK#Q4=VO*^mLDobCc*|hUymqMkEOFPJip~aA4ys`qbF2y5FJq3D84X7eB8)H~YIk zS;dI!Ud2rKR7iZ^@8_sek<3)8s}sEXEIRg-!|D9=7L%!pI>@s(TNPljKWjRX@9$h* zeN$~t`A-Cs&YxLD)a86aeD+>%)tE$SacuS8jCH8H8thEd6Ls{hpZ;v{LR*FUs{va^ zHBGV`W-v*pUe%n`w>voIC6o8x`m_D%)g!!x-v1&5SVqd5G&vw;Gd}}$yv#Q_qZ~4)z5|s*J^b73So6u8?&s1eJSAQ`( zuNGDAxCX`L?A$PQ20Qr8d@Hd9Wvx#7d!|+x>@xA%?M`p3oM7(Xb9cBm1M_qHoMpn7 zo}03n*yf%~oz_+`+;e7Uy4FD!eIwas+Rb+79M$UCGtmjRMWMZO-Q+~6UT)REM{Kun zc8iBj@a^R3(;oNpotKNRXt2yqe{{jMeyf^T1zBwLSS~X+rZXEn@M3uGCdCUU`K!vT zN>nFHj4Eusvo(eOVCn8`-IaCn?mRq?7&A5(4xQ8AEcn?yf6slIdXTMs5uK$HM@^<8 z;>L{geD-rEqIj$IScfpU>ZpUKc=H8MUBs8jXPzxz;M6Y~FK|z0)#bxHb;{N&`zoI* zV$1-}saQ3;t>XF4@jBIHlT!p!ob;1d^=_PXB08z~c2}pmJu&ywsH2lyeNa6;(5QAQ zb>YLR)?F3##;Z5J_PUtW-aIB+brhV?6`%RC_DOE_`|ogY;YaayQcE3txQnmGb1sH+ zk$5_(?>aKYI|^P-ZdK+e$R(3^PIj$RtrlL+L>Kk8U-Tl;RlVn}k!M4rm6&Y&7URxz zoc9#g{@ISY9;l(N@;W_d+4@x^)!myWZeDWPp_UyPK%E%6#dNa#(+#~U$vIKC@2PiU z+o8Q!bE^je2Fc^^C0~Vm16BrT^RELnD(q3p{eI_ocW;$bCo$}HexmDW6{akzWptA1 ze#0}n&nQ<-@@+~GVdtu1D>l0;Qhm^N!LA1iH%495x}}n%CMQ^#K8;gdPc63W7U2`! z%E3I}`KbvfNG>Wcrs>%^p9~wasN{wz*__$g*G+f5R&80}PClJ}pjBo{Cr+<=+xqlG?C8CF*6Ce6 zI8ro=+;ajF6}(7+?x;O>nY@)N+7C)uXi|A|Bfp{9aWR(%mhN5JN#5>SH83IgLcZ<`qqSb&Z*Uo%6s$G(Wi6Axr}afKA!{ycW17u)yG**S@OGsgE-!rcCyKc{br<=e z{c>YhJRIh3!4@MoXFcBDxoRre=Zqejs(9)IN~CVfT|R1VgU*%S%N@u}nH1H2dGf^- zrG}eDqTsUxu@n1dL4#fg^u?gSeK(z$W06~*dF!GAlXR`j#j|yn`TIMUeWyv^U9&Lv ziR!b6#T1d0+oA46f6scChb~WR?X#-`T89*;Hj)#j~|2 zlKl2utmm6fcBY|D_k8Eo0RN$Vo|KI$VRvU&wrD4N%FAps@sxd5wjg@9$|;{29?YZS z*NuYrAzx3yOoipuO|Mni8Ts*MULEzTCJxMruLD)?s-x6Nm8;zuEc)Mi=ja6|!*jLV zpIPc_+9wxX_Ny4A)9+5X*@LGt4gS>uCAQnu*SDId8Z46PCV!F3XWtz5s(>}uiF3zR z%z38syKL0YJI=xW{yPV|%Bywy*oh93S?{U(#lCrDg5YVmcVbm_5@lXJx^hL=i^+PN z7?7%FhdQTDcVbcXUmaPeYcq+BO0iq7t~}LXoZVu=eS7EVdk+Jbrs)iIReOR^LxpB3 zPfjOgS%G;+qV4ApMwLjxoeeuM)$7hDbyx1`0K-|)R{F>n>HL{MU9$=op&epVRCssH|IV$ zQxywlk>Jor+lez(-kymkTOJdg%^>Fu9(mJh%5d z-#uyc+bpLp9XL^our|;0sZE0;cU702S~hC!s*#E&$F7% zC`z^|d?rq}IGW_r={#Mp1H|$t$`^$~4FRp1ZBWYBD|VcEzFbbnHC2#G8@XVo-K210J~CbLj=+ zod>^2nDD7f;m*=yKfmXI_scUJSZUbUEF5E_cPA zTzqhW;XOFMWr&IvGY~TD*q6KfU~{Pe>Yk_sPQHrt?$#|jZ|_{c+wJVpC7Crzn%4Qr z1l6Ztdn&;+wWpXmsHFy~)lTJQie&s1g3b$RZ~ z6nARUktFroJ0}%Nx$|{bVe2Nw)1A-fdC$>AM;9>X-9(G8cd^mPwSLuA1xvp@$gL5ZKT@`h#e-I~2Zl=3w4d?Ce?O}lPzK&G@^^VyodYPc} zR++|~z3ELv4=NZmi?Zk3+@d*QF50=ABF+s-dQTSo&Aw-M=Sq z;6OW3T?G-$Rk|Hi@mv)->~^E}p7@%EE=(L@+rdls{?1QFSf|2sX1?7tpHtJM_sf*; zJD=;+Y8sT$*bJzh+CG=gZ)g3ge0tXlY#DB3>W=T*U4=8PIx-g3%bYoABm)w5Y}los?C@! zj&D^JPUiBT^-ij;R!?^6NdS*JyH<4fp2YCMdhZMs?>dH=i}^VfTQ@6CdBM3+DLvQk zz4IdFl0rVy)fd-Uu%s{v8t*f9>Z4LVbEnKteN=U*S~%jx*!Q$5;zK(=L3Dz27j&m| zWUP*8IXywPw_452?9r^U_+~G9D|5ZQ^S5;Rp&=q?z3oVMcbioHs*xxY`DUcY$!$9- z-A)%f(W}@xTXmVXD-)E8`hAFB?02q6x12hFKHddZa$T>71b}hG$SO7%nE>GgCz!u{~GooWfC!-J(_3hYXok=ft20UR@D#?k)RH zw=xZ$sC(~D2bkMc8-*ZpHK+4^=Rg0wolohne}Dej&QGa7A9nQj&wYQw{VC#S>t;Iz zzn`j#`uLMcFVe1PCsnrMM8}$RO=}euG|}7IB+*a}o*U5aHxa6;$x?+aJdsZo+4ttV z%=Z%%r$WxCKHqs$ly&OS1*b~SChfMf;y%=`TadwUqD$Y|BE+e2a?6BmP8DRa`4E2fmkpX!rUPlG9&Y%$>&z!%vmKabYxU;J3{Rgx zoNlW3lx6a!&^_2(ClVhw>MzF(Vqo0PD9gh|M>_be$?^NY=km}-(+oP?)AZ<5(ZN!0 zHCh+HoZYXsXf)N&^m!Hg#ATA}?PTU1RFLPlZ06okJ)Z>LiN6u&Hs1KlRo`Cz_GqwS z?lZi-a~)J}ud^E8>+0pHhD<(<>N)Sz;?BI&R9q--M!c%Io<%ReO8SV?{YE!8mAvAr zX|_!6x|2=0Y9`4H_HvlYeX6_nM1v&Hcdm{OCbq9X$R|DsyyTjxjAlVsJY0F5I*$Sj zwZJ%cD!$uApkGY-T(GHeVdkApJ;a}xRtb;d>{Sx08&2ryvorA`?B$2kt8UC;-S3WQ-}&Y}eNm84`XW}j8m742;W-7BPE}4cor6YOUv|5> zYn^hI+YXQV%I|q%>9R$Q6aK9wLUemIJ5ev2;_s@x3V1qinoPXVjMu*N^typOyDGO@ z#@6^&g>>tW8ytO9XdechJCxDeJ2+JJRp-{wRX(SzD#^=PW!TP4STFe?&b>NMv>A4@ zN~BYblO!_FogI2+&UD{-`dsUJ>d|@kG}-w)>$3IfA&05nQErV72=LtoWe!;2m^;~% zT9#-PvlUHc$EN#MZyNgJgSw2I>_yoZ{egU*EweJ=-t66r2*!&_)cMZQFSb1JZWhPP z31<`Q>O@8K$bNE|$x~Mz=jj=&8r?8;qYl39Rdq7&DVb-kq%|HF};7&UHb_RMGDj7vSX7(y~SI(Jdf6t$qveEHgTqeb=LuxmzMX+JMD3Pe{#yTfkwC>(%6+ZBW?Rs;3ny-aC!I z9jABC_0q8%@&vo@T%S#go|7s#-%VzGTj4CG9coe1>wU-hz0j~{xcH-6$)vx<1Q0}Ic4cVyiJ)h<)sJ|QkegE=|)WJXmC zecAh&iI)ZHw|~#igedrIdaYaWsoI$X1roSz9vMC5t(t83L3oLFf=+$d%kxCxdCxwV z8~SRv*PXK*c=uEm*+d70vJ>{A*%#HyJU2oek)D~qy>swEaW%bF5vlB`ot&pn1Xi8s zi^I!jr(?GWb;?5#CAaeMVJbo&9quih)z=>ZxKTaJOn|EAjO` z9Xc2JeCIgmw#v-Z$VODpRAk+mnoTbX6|tS7V~=7wzVG`}U*syUS87#Occ(j7r)R6+ zd@`ri?$%w=pAcW4myDqJ?%fGmWkspH)*y;o-rMi_od|sNwxatCKfb5xx?6Kr-MsEq z+};_d3c9L5f2Uh+clfISraE<4+^u9U8onM*MR}qqmT9nDu%h7wvc2;YlPTQ$&W0&m z68zRXSHrA&WqxWf@o7AR@7E@i4I-UhY@DOS&W&fMxT}$U6NqN(UCilvy4k6Ys>(gj zIm+JER}24gyLZ!M>{QALW|7RA@B{k#%!AYSbbNp3;-6}$?tL-lbauKrHML1pyZ4!^ zD2DT%;)7m2%NE}=RW45F%sQ_EvnIBxr&u>-=#dRhR;RyH&a#3!6SC`^{iZ(=B010h zvs77iZN)S64tA5N*aTF)i$*1#-==yZPDk_H9xAe5j!2yJ!>5T&Qh#`|tDj0suPPHMOlWrDk3ylTu)yc5`??;Y&(?{H*Z-Sa7$CYZNxQ|PpeorzOrwcL^8ysIZK z=W^LI5i3Ha`>db5ehy61-%d=+(JWK_Wa(ocbz>bZ%bf z=G-$is*CFE*5Fxm&>8&s&Y2Zi?5RoTU6ejzn~1dBQP0j^Kl!_H_ksWVv#j1CJ3Dhl zAv;rTPtCUX4`Em`bSO&>XXfslv=5T;K^odcas=<1p4O;};-0ycT>&_?NGy8m{ zcq{gHDyGloeCMleoij-9XGMpWPMOuG^;Y^XPQGXGxpe1bCeN;C*?KJBZO?PtP6YnW z^+kIzx`|JJqLUFF(z-9xIjDL#=hPvcNSyGbcISy(y8E5WdUHWbZvD-MKPc}xbHNhH zRL_?_9p>MLW?AP4=1D zSD_4di@x7^70%3Pdq=Y#R_t}eM>pO3ysL(rJ3G_dx|wsSE)u3*psJ=m{9?bv9;)i7 zzI=AiWNPER3^w&rAt#p=J^9K4FIFA>RA~QH1M~LI!%~^bzMZLd(u`E@Oi`6il0uy4 zZZlKOIUMioRq0vuiD>dDfY(8{azUJ^?LHD86{g+6TsP}r*nW<$dY{wznOq09X65V? zENZ7Fd;hbYM63Mt&Q{!a+f7wRbYZK&Rt!5GRNpBx@ApPu6!2iyO{R7^y_i3D<%`7i zJN4=mSHEbq(_fAZ=HT4n2fG?pDxn}sH&OTRx!OKid)zh$S}NfKzTW7lf`+qBt=w?h zJw2=6N_0;2RF%I;o!uwg)d(U=Uer$BJn%7v9elM;zFjc*dGDlrJVD@6ulAzc(WiU9 z^ZLtT;{7?@=b&~%PIGg{6%8t}Ir$PtS~NhN8BX15$_EW!FF86@@pM;hc_dJR9j40=MMb7^Cl-RccxWGqtD%RCtili*;>Q!?p(eu`_9GY ztTI#iyA#8?-qvt$PBV0Wrmh=U8Mh6Y^o@diTCcwP>-i8lQ6_` zsugao;!aO@p5VZ!R4sj0P3-;7SE=f$Ov4Gk_32SO)s03Cwy8ER&j9MKw?|h6_2hZ7 zzqcd~hK+l3>>i9rH|v`nmu}Jf?h2-^@^V(24vi;%z0d8scB5___MI0&9@)(AL_1AQ z@BK!r$lmAa6Pc;|Q=xNHt;Vv0Vm&j)R!UGIcedp7Wp%QArE9-&bcnKcZ(8=r|W83i||wlW$x!Y2ifO>;l0~+*t*O< zoh(n);Q6$6^gL%6qVKw!r^0W4K5TnenFQ%>Z6?m^mr1a_!>p1OPf;xH@T}EYtUHll z&_UaKozJb=P=fz_=Wg+)Ls7n+ekj>>YZYE4!!T zpuDTyGiu`Mz{H-D1dE1Sc6w0gcVnN4I;WD@-JdlYnJv?4&S*T}`G@fJIZ%5qx06VVow(y5k;uWGP^0rte-8y)0<<};`d`t9plXE7?8blheH>)bk5-GMyeVQs*Re@)zO8ZR<-sjN+HM{zu0pDCYg6i&O z%dKOX=R1cfzS(fZhwZIZY&D8J`69|;pShepTNeS66d%&pO+*z>w`GVWhbr5FKw;5~ zr55Q1|8?ucsZWce`fTx34I~O~I86)NnfPW~kLNoNPF-rfoS!~!>sQBCpjP`#iFO@e zman>r#8^d{elZ%skG*M#X9t6r{6II``LFjLHo@(i%UQuq) z$$j5BZr)Mr9d0!D(nD`gJ^L)Js-*hcX~sQadJpS)G2Ocu@z2aoK$hEis`D!9oTtlf zxlTa3Sq1CcM4|{_fQ=f89@ibU^8GV$-3`{8TO{mD;Mh^<*y!hFH{dFS>OToLgAu z_NfF1?bTE(r}OudDGH!fyJz;@i^nbVTy&efGpEaRd;Xq-Jhkk2CX>^3rXFZBiKb82 z&DohPdsV-{$FXTxoSJ1f33~1890i=YtB9s|PtY<{kqJu0a-8QpGqe+pmUkTFk?owZ z(-Q<*#p&AlzVj+9t_jox#~h>^omASh$T0bm7hLx{EmBu-FqYFvrs{=HucN0fyWQQ* zq!+C|Dw!6~P6YmEB09J-Po=t*|I~QfnXqVmba=jVbYQ;StJ$X{ckfZJCsihVRRJ81 z?#kV5YI$3Q<#juD=LY6Fk;*#`McvBu>T-HNHF&1ZR_RRKG^T`W*GyF4)i~YHUES-E z+5OH>T@;;pcB-=*Pg1AbFSdR9WuxgtJ_`M$RnsS%lX-8-a08xBWlps^l}#?4s<1i3 z>Spy@pL?Iyy?sz1)#vO~1PtfqE*E7{Bs~8P7X*8^a#ZEq4kWy8byvr|bDp8yx!-v+ zZ8Gqt6Q6T4;G&mZxhjf4=hRU9#^A*rPwOT&-|pp|IZ0xkDxC^u=o3^;BxmlRJ=ILV zzvo3#sf~^r?wkfi+8e=!sp&k=X_=_%q4tShjnqY#?cAN4o^0&n&`Eu*+=^>2!m}In zGG~StJ!qaw#QJ|IUp!D~Sike@pv%cZ^?c_=$Y%20-L#tkChF>mbGp5sh)*M*9%a)w zJ9SZzmvi;y?x`0@(danSLtRkb+2SRF&NT8>O@Ce@bK;sk4o;Y#Gk5o?PF2dL%I5sD z9cA^S$oHxJp?xJ&$x~#RPn9NX1y42{eLV5dDO~ZH(K$n*)4Te>k6RF@&T7GLF3_jH z7xM-W-_YfsVgYd-rhM5 zpid=dry@$Ko9B6|#b&k8JNKwM%jtwVD!D}1iBf+NGVy~^4IJc&k;4|Za*8@}YMX|W zsYp%~_I~D23D4DILSFCd(5xasy}k41dryK^@1W``zn)CeizOR9bL&MduY2`*5?!3i z*JzR&J=zCL(-5r5^M zQ*&gE2VSCjx?R2Ix^vr?g%Z79r|W(OY&ub|3^YvZ>2z_Op{J_Z%v9Xzj&^1sIA!Im z(plMskxL~`woFsopE%OW%a+k|e0E+A^6hlI_#C&s861Id2D3oKIyM@uEHgziONrR1k|l403X3kMcR$#At&G zgKxR%cj}g@XcKtK_SEnFoqsI8Zurq`Ek>oBe(4fS^S(`Gi?sJS;M=(cjazD6teSJ( zKfn(braL=b$a!|oo(W9o2Gvc%#!1i9SKg`PG%PY$*_o45HmLV(Z|@v+@t(MQ*9m8x ze2Q{5iC9ysb-r3YLYdOo+``I!f=^D}F=m5h3sQw=wI zl5sPkr&9N=e4-NxL!bN9uewd*4n4EzqVCSwk;pwNZ|__s6gHVU)u758y?sWQ-H5GX zpTMfSkL1@s*_@tQdWo!to1KWdvq#%2_*~A)XWDsHGLz+5bSG5ZRDs#4LXvRE;5JyV zQyZ+RCYQHL`_5HY(-ZADN--Eq3z ze5ZGCY{_`u;rD(fb}qkMacYCWtM~9h7LTU9?BQC~6VASKxvF}qj)r_j%yajmPVcV1II)wzGa2Uz;#4tZ+4>iKJD5o&l7fO=)x~TYHQ|a^sXcs| zt9C1tv+o=xsd@)XFQPM*ZnyO2p;p1JOtC@SQ&^d+*Sd;l1yZKFD!4xIB6`El#IJS7$lko++1aUFB8Cl3czUF<4?>L$JFrci0~S5pS4%-y+hqMkb7Kv}aRgM5^op|+ah&>+1YdTwvMNZ6oLw+gDrtxxT;(5DZ^K2^V+yRGBu*7-~3qXCzlb@tXx zxh_n_h_0_2&*sR4spr`_a(p%viw3FB z^2jP)98+|i)pO_lJoX8ycPCKVm)Q7=ZN&X$3WYNm3EuJ%a2+pa1_SCoyMh z^h8Y5$G|w4p#To<)MqZD^|BV(Hv$*Tbz&^v@U{Ze3shxPg_B*Co;|v*yCUt%Ja3qT zm{Az!6g}t6*u!LM`#e!V^{QX>MSmQy%3Wue??!Q{B<8VtojVc1mhT$D;e?Do7VPyv z0ky*oHAio1YHfzUpPqLkzKF>U+cgs5uI7#OSdP9;+2(sNx#wL4>Qy~bS+v%j-u)y@a1lW`Met^;*p_fd-HSg z1H9Ll6;Nk9z|oLV@7)@XOkeDQ?#wGDy`n$DKMr^IcD@r#%kszQ1~(N@eH2t_hTFqI ztDxwnCeFIKQ$=>mHIik{OuotC>{;XO_WZR1>RKJCWHR3{bS0Xx%*9XvGuf;-kvlaf ziRoGclgtRbXR9B8Jsv5b`t`vGUCE%-9h^AV=#EwW!lju_gj16-aq&Tu<)l{zqrIOf zP_?I`)z^O2rZN$Yvl*VggLzSKnNOtCZkxM^gYd^n88*730Lr5y8mi>H+i6wLW-qlo zIf=!$*2)L;2RgB{bK2PVG#4$$-uD$i!{GH$ci^zEo5j`BGtw3KIGqC7x0_h^Iw2~U zJj{~KlkT4P6}T#j;;GgjBbBC$N7+>LIZY-`lsE5~j9rb)W$R4`M)0ug`AmT*nn#C- zt)TC$CC;N0Go$V)qx>M5gqPjzC!$tC z>AYVNb9-X`d@T4ltmNM3YYN~HXBet6nx5Kk ztbDXSy6>GlaWM5WVKn_ex0%h&#_rzxt^!dL^@x~5V;p|1sCH3Sx>a5<=~D^f8q*co zeb*@_Wu9->y&L^nfm1DWKMB zTTR0=olv6}oH6 z_P(!xT2}eY>b%|D#`f!aJrI*#Ij#|?ZV4m&Af0Vi1W`Ad@BLH(RMrdh564trKjBVh zm*_er0-o7zMNV%z&E|Vi?Q9uS+vlkQ)i%oVqsH83>FV`6T&IJ|Gx5|~u?y}4{s;Rx z+YHp6e^!CIaJo`gsh`Tz#kZbdbhEyPIHU&W{B;V(23ZS~$qa*sx8Va|ozf|f&y_<-lc*n9C6)|_n)>_}p-q(KX|Lm!$c4A$q zXI8wcm$P*0f*#3cM;r_jKj68$YbVOARbOw4xXF#~$o3$YafI)u39etGHJ=@$3zeP01J&jgAR&3Za$ zuky1yr(Rh=&beUn$Vg@dHt_B}YrbdqmSLk`E1>RI{a)+15F9@s%(}^XDzeH(O$1%p zCO(sP6ZKCS;PMSxZRJF;k6mEg-iaBx+c|rC-&X*q zIqRuW?=tGyJ8$qkk@HB_kN;4)Z-!QSw}@o#qsXMm=z~`??iYTRwjsY=CSKtHu{{M zoYjr*DuBAWq3Y)K>r{VE*>Tnz4!im!^R-?#-3g+CYQQ=Nv%_j%>)JebZq14DOb!kSwrcH=t==!8l# zgUZy@*^U$56Qv_3maH`=^t?G0SlV?{?!JvEc=vp&fU2tb%&Rg{ebs@gZ-hH}3z@|B z&FF}@V#z_vIx%$i{E7ngWcnl%HT;^&+xLD&lw-KHa;Lh_a|P-Ze!(!SGfo%9^@6T@_5AEQk*W;FNMK7Pbc~LIH&vE;AV`Q_4MTLo;jIK;#!xL%K0{%{aOLE=9`0-s@z#r7ehZ? zU9ck#M7uCu9Rlsl73~(Mikp?b<3{%tm8HaMqser}%{q6^o{ZhU(Om^}L50S};6DelzrwUZls;w8{N>!DqQ`G_YO&m2UPB)|C zJlvw3YgZe+jj0Dj^ogZS1qx~D)DPBb&MZe2z@=G@?5z(@Ob?1>Lg9{OkW(fByn=Gjlk z$yWSEzg7UnJ?jH1`#FGz?(_)dJ3T$APnmXBEH!zHDAHQrWNtp+44yroD{$4cxeC|0 z^k%gVJ5{elGV?L`<1_FshIMZ0Tsi48zvnXr)b3TydKX4?2W6b9b2>HeGKiuwPq<-} z&wVGmS#Gujx6gA0P*AnsW%%K#@~U3_L6phJcaoc2K2TzE%gD`?-0jcGoZk4?3aG3O zsij(bzw<_{TY{Z@`d8eHh=(?)_YWs_87M>KIj(7LEFx`rt$`dBnbB zpw>z8^M*kToM%mzz3(e9U8z&m{q(e|qdXI{dOFe$QO<5@bnYv+^Hxq=yQ%MUUxD{- zOm9?tdNlP;{mh+~8$?mogX5>~TU2UfqP&aV=qn1SW3{#tHsh=I)UD8RvA_%l*n)&W(Pp zKs62aovzmO2S?1(<&kOnM|W2A>;3%Mof)w^+`0EN1*$qq;?LB1Iu>pb>~Y?$I4g>* z3}-%Pg5gL0GF|60XIGBBpD7Ui)I5_@`#ONm?|ajMGj<9drgf~yGfKuEeh)L>rSC|8 z&#x#@N7R!$YV*`B5!a4R=H_RfMc2Xl>V%c_K?k$fDAi8OzrwZt3=g?M# ztNC<6uddTYH=1*eXW!jrJ-0VwpSg2;-&a5dGl2)F>1oyeS$Enh3~o==&a4ri*w%at zD=_3eoH!9O?|n}J9XZw1=TqfmuXr)_!3r*!IVrb}7A1r4aw5Pv9kvs9@AqAlsz$wP zNM=u!&BdxX>NEY>q+Msj)qUOYS>N5vk#)*^?|TYNH=MXSmwIcN@DI+JVIlERd0tVr~SHS^}O>wR*Yti?Ww>CFB4SgaauP^zRz<7P`xJ% zXg^&_U5&lZZPO9wi@4fVHf{vNoPGZuo!IDe1yoaCrhAz>-6?9$%_=kQbNb3e z-Ba{++jWZ12yU(aysvZy`Lz6 z#ywS62Tr$fr>cV@2RV0(PHo0!)N=MYvx!XHpH6J_Oo7u0W>3{cP@V4Jhi7KbNpj}x zco!`rH)!62lL_1w6Xt!su7H~A2C9FiZo5SKn*C+alcMPt)#=poyiT_+nhNN~8$D4# zPrOmn?@*OaMDHDP zbEi7lW|o*AX6IWGyBiizdp=h{9aYsEU8n9=^r@52x9-IMrUL)(W4TWEPT8#Qm&!ZO z@xQo@zMlgB{olUR&pi*y?=$gwu5!QIUC;mT$E*8|?ybXov;F-(`<~n1`*%>_=ihTa z1N}YL^J?+CMg5+y=f9hGUwz;Ao`;QZw*L*k`#sYHJm>Fq{-4g+|A+tQ z-h4NGRe`_S^ZlNG)ro&@Zax3!wEixe*7NV;#6R~Q^?d&OJp0f8hojQE`Sri&`*(Yk z`CT6Wt(N!2Nn9tNr#{DDW25yvN`3FA-}CpL^Y%FDIX?^d9u)4c=il4!yxn^K{XP1t z-*7$us}=qJd|&ZAzm6Ur{Z@k$>uvw9d&6b=`xN;6-)jB4+^7!6<9;HH|Gu|e=0C4Mzvt`upI7tu zV7TMC-`;+ojr_jnclEyqzsK+WpZu0z@q9YGf4BdBpPnb4^L_U_j@#?`zt{8p&5hgq zj{Z%)p8tD2*XjPZeZS|wpWD1~|8D>M-{<}Qy@7OUE!XqEQqA9k>(`$9f9v^wIR4}} zr|ZC`@1Tzo_|+o{=WCB=h@-6J2!uljYPe=Ed6gp19VScbiUgd&=k@XWX~Ub{-4o`08KosYkZwi~(i8DTX&h7mb1^P{LTF<81^orF_Fd}shf8-HcpTV_X1e4`s z2E0{n-*)e33RG*{MDgi`^?DA*Tpz^EI~eku6M5x;ZQ>hGj`Phrwb3&LbcHEBtJ1CO zl%JGzI^8H$JDs-Xl(#-kWVmEF`)8GzJ)bFnqM1=!)ULMVv)i6i=Y6_g|Cn={8L)ll z?vcg)+)jh*+(yq7P~EF1>Z?2UdmEJ@o0D}os*m0QJ{{9#+ka; zx|$cEdvvJl*zC>8@UazU@W$>frdYSg#>}4g6{t7Wx6#=RtBw|9ZQi1K8;PpNb+c~` zx;w;h_w2+*_Z3iG^kptJpXrs@Xr4!$IWwYU#33^oD~+0!t?Em51$A!52xi z=Q9QB93DBXE6H`{RdFkzWoVVi6BH+`Oju!;=x(;I`^^*W^Hc#8zWRE)U>ELwyRCzs zUg71nU(cMNBIE13m-8J4me;AR{9J)*IU_uqnxcNVg44}%gDr;)XWhxk0tYyFQ<+kzTFF8N$q+-p!^LyV{07X5kD2}MHYQtMJk=t4qH(63U@m5luo2XlnBh@^w9Mt!` zt3Z81+ss+h2`aNXJ6CU}Cs)7Zo^L1S$0_Rq=GPEK}*u)VIku zeX)Le`I==@cQ=Epd+6lc=cxjEG5u5ZaN)5|pPJK`!Hnt7rSBuw+nFH15n1;J-(Kqb zd|iR5WMUp&p;C;9)~{~i-IZm!b|Uy($!E`v%!SPgkz3ib=Mx29HAQ_m=%Thr`etbF zO!0HRe#ta_yYe~dl$`Ehk^J z+_N_u_k6AZ%1(Eyb=ca$6)NxI*_j-PVPeXS)ai9kvCg$;WvX)r(?uDT>zv^&t?@>(?|oMR^h3Q@ z#p@_)>(R`JnZ+wmVozsIM3KI)Z&FqrrsC)cpc-eU&cWcP0HyJ3dSIoKR^+`h zFzq?FFnPYk#KF{)4KVEaM1koM3gfTm^q|-(&o1evRoEzN>%Fk4*lWF5; z3Pe+NRrOYI3&la%bLK>_`xQflPew3)3W&=^WEZ?$r@UKd>z;QNh;pjOt>QA6+nu>J zu=ObQ{^2td3<&ZWJ3nWrIg`$OlAV>=-S}q;prwjdbD~V5t{NBL89a20lic`nJ)LFJ zu9K}=0YBft*sXitS3te>Hj~z-Gp(ME%&c4WNQU0>TY(n`Q{&HBz0MTXjT_xpK!2<9 zbg^E@NX0C-7-IYJ#U6M1dFV9K!Qjscndx-m1NgyDwC6JgPH!@+2RbF9o=g z$9bo89X|J6yKLuOijk9jGPr&3dkUbNT5{tOs-LG>HFweqF3DOZqVvp5E6!N6D}vpk zQYB{dp7#}qZl|i|-0i`s&T2oax*(?%Df}0@dv^Wnod}srz-p9RHkaH5KN)&+S&d z+4;)jyU^M5xdP~pGnvMfdXtKeJ#sx^RwpL9v+|W+4yIo-+2@4&-Q|1j{Y(KoQu*Ha zrSem4JHha?5j8H+!Z){p=h*;TP2_YWg8sB-l>iQ=OETxjFsWWSGy5WoPT2_Z9Ga zqlRaGX4AFC#SpdQTcn=H)11DW>B~_T`{xw1dp=h{J@umu^#}Foq^c_-?9e;=`UFnj&%RSEFEb?S-b))+V)N>*xt=5Iq$@GleO;klpXT+B) z5eTBjCuVXw!B*!!i1xUxfXYu5^=H;ln^Uc)HMhQ_XR{~g>lCcwxP7}!5rf+EsRHVXlB%nNS7*`MuAb>abJ>`e zr8hj{i<;=!JfX)D!SM;Slx8Ld9uVTjR4J zn_bW_)021aX9~P}{!Y)SHy-@V7to%%#CtK6=Ju!L^%sK6F9!3_={Y*__?@ zo&v85TJc8t({mh9_afOTHg(-ihy1*$GeIX6<~Z%m?in+&=RE~Z7w|`yPA6xk3*O!3 zEEO}hz;L=bC)>eM**n*|z0PlRR{`9pmdvTLSrrD~T!j0WEUUS5_}YxkRu=~n0MW5!wVUl(jlj)HzN}D&dt}&Y?JB9Z@Snj5M56VQQw-nzw-nZ z7;uoO>0|k2DzlTm0f<))`moNE{d+!Bpej#K@xlsjnw>sT1yN_r?c$=Ah(setNIQ*m_Gjr7pE6>}%d^^v-p*uu12Zgiq`(Qp=*=;Woh=UoL}UFzhk z+M;t;d8_r!$PWI&T)$=)zRZa#2RL$ZMgADr>yZL}qpBmmsP(C{{^1T7Ya(YATwjQu zIbHEqr{BCwJ4ElRSJdXO3ZR_25bmPRx(>-#@!*u&Zyaimw-d3-ZWxTR& z{zQRy4&irM^!2>cuS@BXi87xzoFdqr{`o`Z+?5rMJ-?!WimPxqruyZqN7Qfu{B)%A z&Q4@KWKsJYoYBrXDHtQ99FNUN<`?bgX-_uMYe-ggwhAF7lLx+01${zUs0=cIetF|&`gdpuA8_0%voTA#|7P$ZRRuamfIz4$~{ohP52 zzQz2M$mtxcdp=d*)EhOcX%&YTv@>S!^3*bIFY|ha>-I!~aEe)`MQ}SE{61e*VCt)) z)NmlYs82re;yTA$Ow61YcV&{Fz7wzP;96(fo=+4|>#CT_JI7A7&BW?eCR;NCo%f;a02MX6>dT1GgAE^gZWZHc_#kd!OeDoT_J@ zO7#{2cj}FdQ#t*RW%3bQnfEzsM~-f>!am+(&u0o$LnHKUhR4&B6A^zz6Q5XnPLVr> zyErJ~9gDb$dG?zwS_Sln8~5lD+qYJ)QqciX+)UOvaP84QXPvq7w_ZNyVc^a7e5ye8 z#~40q2&_R4a;K{9({XGQeh_Y}ZW-8q%iZ(IqV(d^7U?Stks zPy~D2BHBJ(xv9eN+Bs1&?EPy6RIciyarHLRr`$~S?q@-?9yNbOgMn|dX2$pFCaROy zd3NmiQ~|X`ZGD(d;F(^Ozg|ucz}YK0k-Nmuo!QAWH@5@J$-LPe1=L@!Go$)dwNV`_ z&WL@dE0aGle|$5#a56__zQOwmcFME&GX{5ik}(4qsy@bMNz1fvP)owaTr7 z;Z}F{=oB4l#el8%=WJ(!aLSE#%kcsF`1JTb%u(O-sRAgihU%`~bxmh-`w;bXN^FsO zl}S)my0NVC*b9~)Fs(bY_g56Cszl9ITPNyP_viu`5XBcaqio=rNUFYryfOygxgX;uu&B&rkh0V{Y-(Wx|)Y!)^U<^vd4|9 zFLF3P?=mnc77nuV7lZ3C6=lB@8{JbtPfq>oj&&-t4!`rKFPWm_TR1Pn?6zk&Q!sX3 z#-i=*{agW+&aKv`!jtog0@-s;`ib$Le!)Yh{F#=Ex9KUin9glY@M+tQj}aG&1avQ3~Ug8?q`ZO+w+M6(Npza z<1nc-k!bF#8xte44Die8wzC>Ee}c=?+?}lx?fFarotb)0&F#yYULP{?GZSY|=jS~! zC+E2p4$(nc>C{H|6`1NxRq>`3U7+IBnVmC!Ho)5B&CYpxeP<`EOmt%LZVpe4T-l#tPvce}~ zvJvN;5A2@d?E{xNm}Exw=ZxsRf2{z%p*dQrBnr2G)~^mYTR+5~-10F$PdaWrr}KNr z%v_v;O(q~o~(35maP@%_kNzz%Mr=N*AXPsHzx_CL6I8P^;+4HFabzSYP=mL2?=ms20PFDy`L(ezTVL_&zUE)!aXy3tv4r{?*xi1bHWPP$-vuO>yvZiy9!Lj z)i|@K=X}fL6jzKDJ|)zRnRSoc=WMa!CWkZJ?f5=>e@y|MVHyt`C(?~Xv*RSyIVlpv zkD))N&9A7F2R>?Ley)Ju9JR)KwLi5Mn=T#wVJaEVnVT`!Z1T8~uI%2e zcE;$(%DrwYpql!XJde4`TBr8``NQF&JM|f&SeTfQowsS0?nIb-vt`fc3QPqXC(1KV z9K#u7Gm+GplufP=!VgX=p5=ngx*6QbX7rKn@mK+L)F(Bry6w<&fk-^)sawn?JGnA1 zQ|~LTC_3%KTMpl6?6>hRU$po)ZH&-)6X zpXc-nRqK#CgVBdhq*AoeSq;tvl`MLt=Iz7HR@ao+a&2~Q(b!K`tF|%GYpN(#tk<-~Bj@q72 z6sUf>m1(PbL2qX6DAGAApSe{QBlmI7`EpV%BD2G{rX3UDLJJT(zC#RWRH?Jh8qM-CCo5uJo<9C~oRKTR97oc41QPb7@;+UJIYDG_sa<2wqdWtCQCoNdM@qdEF#MfYYO88cDOI|;8WWoGhqUJfQa-M;rT z1?mfqRNdDcr-JBXEDuvusTFa~H*>Z~ce@Mh#5vtJ+321EQBL({RITS{K+UPmS@8DD zC{hn`)k!zbTcqzlvDcoMy`Lz62X!V2o7uxps_lu(HjvXDy7pw6Gwrp?_I73j2Uy=C J{e7M(@IUC{g5CfC diff --git a/src/eid/test_data/bst475_bf03.amr b/src/eid/test_data/bst475_bf03.amr deleted file mode 100644 index 4c6e4c70b877661d886e677b5d16cce61716db4f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 152000 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 P1_xN*BK>`yDe!**kBNao From e85e0215aa3bd6f118e061659a67ca61111e4bf1 Mon Sep 17 00:00:00 2001 From: Stephane Ragot Date: Thu, 4 Jun 2026 01:41:42 +0200 Subject: [PATCH 10/10] accepted updates to EID --- doc/manual/eid.tex | 81 ++++++++++++- src/eid-amr/CMakeLists.txt | 9 -- src/eid-amr/README.md | 29 ----- src/eid-amr/eid-amr.c | 95 ---------------- src/eid/CMakeLists.txt | 14 +++ src/eid/README.md | 24 ++++ src/eid/eid-amr.c | 107 ++++++++++++++++++ src/{eid-amr => eid}/test_data/bf03.g192 | 0 src/{eid-amr => eid}/test_data/bf06.g192 | 0 src/{eid-amr => eid}/test_data/bst122.amr | Bin .../test_data/bst122_bf06.amr | Bin src/{eid-amr => eid}/test_data/bst475.amr | Bin .../test_data/bst475_bf03.amr | Bin 13 files changed, 220 insertions(+), 139 deletions(-) delete mode 100644 src/eid-amr/CMakeLists.txt delete mode 100644 src/eid-amr/README.md delete mode 100644 src/eid-amr/eid-amr.c create mode 100644 src/eid/eid-amr.c rename src/{eid-amr => eid}/test_data/bf03.g192 (100%) rename src/{eid-amr => eid}/test_data/bf06.g192 (100%) rename src/{eid-amr => eid}/test_data/bst122.amr (100%) rename src/{eid-amr => eid}/test_data/bst122_bf06.amr (100%) rename src/{eid-amr => eid}/test_data/bst475.amr (100%) rename src/{eid-amr => eid}/test_data/bst475_bf03.amr (100%) diff --git a/doc/manual/eid.tex b/doc/manual/eid.tex index a8d22176..3fdb77be 100644 --- a/doc/manual/eid.tex +++ b/doc/manual/eid.tex @@ -1343,13 +1343,82 @@ \subsubsection{EID-EV G.192 Output frame examples } \end{center} \end{figure} + %-------------------------------------- \section {Adaptation for 3GPP AMR codec (EID-AMR)} \label{EID-AMR} %-------------------------------------- -An extra tool called EID-AMR provides an Error Insertion Device (EID) capability for the 3GPP AMR codec operating with G.192 error patterns to simulate packet erasures. -The eid-xor tool from ITU-T STL is not directly applicable to AMR bitstreams, because -the bitstream of the 3GPP AMR codec follows a specific ETSI/3GPP format detailed in Clause 6.3 of 3GPP TS 26.073, which is not compliant with ITU-T G.192. -The EID-AMR tool loops over the input error pattern, and replaces bad (lost) frames with a frame type indicating NO\_DATA (of value 0x03) and all data bits forced to zero. -Note that this tool does not handle bit errors. -Statistics are reported as in the eid-xor tool. +\subsection{Description} + +The {\tt eid-xor} tool operates on bitstreams conforming to the ITU-T G.192 +serial bitstream format. However, the 3GPP AMR narrowband codec uses a +different serial bitstream format, defined in Clause~6.3 of 3GPP TS~26.073. +In this format, each frame is a fixed-size block of 250 16-bit words +({\tt SERIAL\_FRAMESIZE} = 1 + 244 + 5), where: +\begin{itemize} +\item Word 0: frame type indicator (e.g.\ 0x00--0x07 for AMR modes, 0x03 = NO\_DATA) +\item Words 1--244: serial speech bits ({\tt MAX\_SERIAL} = 244) +\item Words 245--249: auxiliary/padding +\end{itemize} + +Since this format is not compliant with ITU-T G.192, a dedicated tool +called {\tt eid-amr} is provided to apply frame erasure patterns to AMR +bitstreams. + +\subsection{Algorithm} + +The {\tt eid-amr} tool reads an AMR bitstream and a G.192 frame erasure +pattern file. For each AMR frame, one erasure flag is consumed from the +error pattern: +\begin{itemize} +\item If the flag is {\tt G192\_SYNC} (0x6B21, good frame): the AMR frame + is written to the output unchanged. +\item If the flag is {\tt G192\_FER} (0x6B20, erased frame): the frame type + is set to NO\_DATA (0x03), all 244 serial data bits are forced to zero, + and the modified frame is written to the output. +\end{itemize} + +If the error pattern file is shorter than the AMR bitstream, the error +pattern is rewound and reused from the beginning (same behavior as +{\tt eid-xor}). + +Note that {\tt eid-amr} handles only frame erasures; bit errors are not +supported. + +\subsection{Usage} + +{\tt\small +\begin{verbatim} +eid-amr +\end{verbatim} +} + +Where: +\begin{itemize} +\item {\tt AMR\_bitstream\_in}: input AMR serial bitstream (ETSI/3GPP format) +\item {\tt G.192\_FER\_pattern}: G.192 word-oriented frame erasure pattern + (as generated by {\tt gen-patt} with {\tt -g192 -fer}) +\item {\tt AMR\_bitstream\_out}: output AMR bitstream with erasures applied +\end{itemize} + +Statistics are reported to {\tt stderr} upon completion: number of processed +frames, distorted frames, frame erasure rate, and number of error pattern +wraps. + +\subsection{Example} + +Generate a 3\% burst frame erasure pattern and apply it to an AMR bitstream +encoded at 4.75~kbit/s: + +{\tt\small +\begin{verbatim} +gen-patt -g192 ep.g192 f 500 1 state.ser 0.03 +eid-amr input_475.amr ep.g192 output_475_fer.amr +\end{verbatim} +} + +\subsection{Origin} + +This tool is derived from the EID-3G tool (Nobuhiko Naka, NTT DOCOMO) and +was originally submitted to 3GPP in Tdoc S4-120998 (TSGS4\#70, Chicago, +13--17 Aug 2012). Authors: Balazs K\"ovesi, St\'ephane Ragot (Orange SA). diff --git a/src/eid-amr/CMakeLists.txt b/src/eid-amr/CMakeLists.txt deleted file mode 100644 index 20cdeb0c..00000000 --- a/src/eid-amr/CMakeLists.txt +++ /dev/null @@ -1,9 +0,0 @@ -add_executable(eid-amr eid-amr.c) -target_link_libraries(eid-amr ${M_LIBRARY}) - -add_test(eid-amr1 ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/eid-amr test_data/bst475.amr test_data/bf03.g192 test_data/bst475_bf03.tst) -add_test(eid-amr2 ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/eid-amr test_data/bst122.amr test_data/bf06.g192 test_data/bst122_bf06.tst) - -add_test(eid-amr-verify1 ${CMAKE_COMMAND} -E compare_files test_data/bst475_bf03.amr test_data/bst475_bf03.tst) -add_test(eid-amr-verify2 ${CMAKE_COMMAND} -E compare_files test_data/bst122_bf06.amr test_data/bst122_bf06.tst) - diff --git a/src/eid-amr/README.md b/src/eid-amr/README.md deleted file mode 100644 index 9a3ca3ab..00000000 --- a/src/eid-amr/README.md +++ /dev/null @@ -1,29 +0,0 @@ - ============================================================= - COPYRIGHT NOTE: This source code, and all of its derivations, - is subject to the "ITU-T General Public License". Please have - it read in the distribution disk, or in the ITU-T - Recommendation G.191 on "SOFTWARE TOOLS FOR SPEECH AND AUDIO - CODING STANDARDS". - ============================================================= - - -The ITU-T/amr-eid module contains the following files: - -# C code -``` - eid-amr.c: ....... demonstration program -``` - -# Description - -This module provides an Error Insertion Device (EID) tool for AMR operating with G.192 error patterns to simulate packet erasures. -The bitstream of the 3GPP AMR codec follows a specific ETSI/3GPP format detailed in Clause 6.3 of 3GPP TS 26.073, which is not compliant with ITU-T G.192. -The eid-xor tool from ITU-T STL is not directly applicable to AMR bitstreams. -This modules fixes this issue with a tool derived from the EID-3G tool (see http://www.3gpp.org/ftp/tsg_sa/WG4_CODEC/AMR-NB_3G-Characterization/EID_Error_Patterns/eid-3g.zip) -The EID-AMR tool operates in a way similar to the EID-3G tool with the following functional differences: -- No position parameter is provided (this restriction is to operate consistently with the eid-xor tool). -- Bit errors are not taken into account. -- Statistics are reported as in the eid-xor tool. -- All data bits in an erased frame are forced to zero. - -This module has been originally submitted to 3GPP in Tdoc S4-120998 (Aug. 2012) \ No newline at end of file diff --git a/src/eid-amr/eid-amr.c b/src/eid-amr/eid-amr.c deleted file mode 100644 index 55fec991..00000000 --- a/src/eid-amr/eid-amr.c +++ /dev/null @@ -1,95 +0,0 @@ -/* - eid-amr.c - - EID for AMR using G.192 error pattern of frame erasures - This tool is based on the eid-3g tool written by Nobuhiko Naka, NTT DOCOMO (see: http://www.3gpp.org/ftp/tsg_sa/WG4_CODEC/AMR-NB_3G-Characterization/EID_Error_Patterns/) - Modifications: - using G.192 error pattern for frame erasures - - only frame erasures (no bit errors) - - no position parameter to skip frames (usage similar to ITU-T STL eid-xor tool) - - all data bits in a lost frame are forced to a value of 0 (behavior similar to ITU-T STL eid-xor tool) - - statistics reported to stderr at the end of processing - - NOTES: - a lost frame in DTX on/off is signalled with a frame type code 0x03, independently from the TX or RX frame type - - Contact: - Balazs Kovesi, Stephane Ragot - ORANGE SA - firstname.lastname@orange.com -*/ - - -#include -#include - -#define MAX_SERIAL 244 -#define SERIAL_FRAMESIZE (1+MAX_SERIAL+5) - -int main(int argc, char *argv[]) -{ - - short spch[SERIAL_FRAMESIZE]; - short epat; - - FILE *fsp, *fep, *fwe; - - int frame, fercnt, wrapcnt, i; - - if(argc!=4) { - fprintf(stderr, "Usage: eid-amr [AMR bitstream (i)] [G.192 FER errpat (i)] [AMR bitstream speech with errors (o)] \n"); - exit(1); - } - - if((fsp=fopen(argv[1], "rb"))==NULL) { perror(argv[1]); exit(1);} - if((fep=fopen(argv[2], "rb"))==NULL) { perror(argv[2]); exit(1);} - if((fwe=fopen(argv[3], "wb"))==NULL) { perror(argv[3]); exit(1);} - - frame = 0; - fercnt = 0; - wrapcnt = 0; - - while(fread(spch, sizeof(short), SERIAL_FRAMESIZE, fsp)==SERIAL_FRAMESIZE){ - if(fread(&epat, sizeof(short), 1, fep)!=1){ - fseek(fep, 0L, SEEK_SET); - fprintf(stderr, "Warning: Error pattern file shorter than speech file \n--> wrap error pattern file\n"); - wrapcnt++; - if(fread(&epat, sizeof(short), 1, fep)!=1){ - fprintf(stderr, "Error: Error pattern file read failure\n"); - exit(1); - } - } - - if(epat == 0x6b20) - { - spch[0] = 0x03; - fercnt++; - for (i=0; i + +Originally submitted to 3GPP in Tdoc S4-120998 (Aug. 2012). +Authors: Balazs Kovesi, Stephane Ragot (Orange SA). + + Good luck! -- diff --git a/src/eid/eid-amr.c b/src/eid/eid-amr.c new file mode 100644 index 00000000..6b9d3094 --- /dev/null +++ b/src/eid/eid-amr.c @@ -0,0 +1,107 @@ +/* + eid-amr.c + + EID for AMR using G.192 error pattern of frame erasures. + This tool is based on the eid-3g tool written by Nobuhiko Naka, NTT DOCOMO + (see: http://www.3gpp.org/ftp/tsg_sa/WG4_CODEC/AMR-NB_3G-Characterization/EID_Error_Patterns/) + + Modifications: + - using G.192 error pattern for frame erasures + - only frame erasures (no bit errors) + - no position parameter to skip frames (usage similar to ITU-T STL eid-xor tool) + - all data bits in a lost frame are forced to a value of 0 + - statistics reported to stderr at the end of processing + - uses softbit.c read_g192() for error pattern reading + + NOTES: + A lost frame in DTX on/off is signalled with a frame type code 0x03, + independently from the TX or RX frame type. + + Contact: + Balazs Kovesi, Stephane Ragot + ORANGE SA + firstname.lastname@orange.com + + =============================================================== + COPYRIGHT NOTE: This source code, and all of its derivations, + is subject to the "ITU-T General Public License". Please have + it read in the distribution disk, or in the ITU-T Recommendation + G.191 on "SOFTWARE TOOLS FOR SPEECH AND AUDIO CODING STANDARDS". + See LICENSE.md in the top-level directory for terms. + =============================================================== +*/ + +#include +#include +#include +#include "ugstdemo.h" +#include "softbit.h" + +#define MAX_SERIAL 244 +#define SERIAL_FRAMESIZE (1 + MAX_SERIAL + 5) + +int main(int argc, char *argv[]) { + short spch[SERIAL_FRAMESIZE]; + short epat; + + FILE *fsp, *fep, *fwe; + + long frame, fercnt, wrapcnt; + int i; + + if (argc != 4) { + fprintf(stderr, "eid-amr: EID for 3GPP AMR codec using G.192 frame erasure patterns\n\n"); + fprintf(stderr, "Usage: eid-amr \n"); + exit(1); + } + + if ((fsp = fopen(argv[1], RB)) == NULL) { perror(argv[1]); exit(1); } + if ((fep = fopen(argv[2], RB)) == NULL) { perror(argv[2]); exit(1); } + if ((fwe = fopen(argv[3], WB)) == NULL) { perror(argv[3]); exit(1); } + + frame = 0; + fercnt = 0; + wrapcnt = 0; + + while (fread(spch, sizeof(short), SERIAL_FRAMESIZE, fsp) == SERIAL_FRAMESIZE) { + /* Read one erasure flag from G.192 error pattern */ + if (read_g192(&epat, 1, fep) != 1) { + fseek(fep, 0L, SEEK_SET); + fprintf(stderr, "Warning: Error pattern file shorter than speech file\n--> wrap error pattern file\n"); + wrapcnt++; + if (read_g192(&epat, 1, fep) != 1) { + fprintf(stderr, "Error: Error pattern file read failure\n"); + exit(1); + } + } + + if (epat == G192_FER) { + spch[0] = 0x03; /* NO_DATA frame type */ + fercnt++; + for (i = 0; i < MAX_SERIAL; i++) { + spch[i + 1] = 0; /* erase bits in bad frame (force value of 0) */ + } + } else if (epat != G192_SYNC) { + fprintf(stderr, "Error: invalid pattern value 0x%04X at frame %ld\n", (unsigned short)epat, frame); + exit(1); + } + + fwrite(spch, sizeof(short), SERIAL_FRAMESIZE, fwe); + frame++; + } + + fclose(fsp); + fclose(fep); + fclose(fwe); + + fprintf(stderr, "_Input bit stream file ..................: %s\n", argv[1]); + fprintf(stderr, "_Error pattern file .....................: %s\n", argv[2]); + fprintf(stderr, "_Output bit stream file .................: %s\n", argv[3]); + fprintf(stderr, "# Error pattern files wrapped ...........: %ld times\n", wrapcnt); + fprintf(stderr, "# Processed frames ..................... : %ld\n", frame); + fprintf(stderr, "# Distorted frames ..................... : %ld\n", fercnt); + if (frame > 0) + fprintf(stderr, "# Frame erasure rate ....................: %f %%\n", (100.0 * fercnt) / frame); + + return 0; +} diff --git a/src/eid-amr/test_data/bf03.g192 b/src/eid/test_data/bf03.g192 similarity index 100% rename from src/eid-amr/test_data/bf03.g192 rename to src/eid/test_data/bf03.g192 diff --git a/src/eid-amr/test_data/bf06.g192 b/src/eid/test_data/bf06.g192 similarity index 100% rename from src/eid-amr/test_data/bf06.g192 rename to src/eid/test_data/bf06.g192 diff --git a/src/eid-amr/test_data/bst122.amr b/src/eid/test_data/bst122.amr similarity index 100% rename from src/eid-amr/test_data/bst122.amr rename to src/eid/test_data/bst122.amr diff --git a/src/eid-amr/test_data/bst122_bf06.amr b/src/eid/test_data/bst122_bf06.amr similarity index 100% rename from src/eid-amr/test_data/bst122_bf06.amr rename to src/eid/test_data/bst122_bf06.amr diff --git a/src/eid-amr/test_data/bst475.amr b/src/eid/test_data/bst475.amr similarity index 100% rename from src/eid-amr/test_data/bst475.amr rename to src/eid/test_data/bst475.amr diff --git a/src/eid-amr/test_data/bst475_bf03.amr b/src/eid/test_data/bst475_bf03.amr similarity index 100% rename from src/eid-amr/test_data/bst475_bf03.amr rename to src/eid/test_data/bst475_bf03.amr