diff --git a/lib_com/options.h b/lib_com/options.h index 7ba71d0cc4663c8b6c5e744664547979c860bfcf..25c48c3c52a917b961372a39c52aa4102d60beed 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -118,6 +118,10 @@ #define FIX_INV_DIFFUSE_WEIGHT /* Orange : Fix error in energy compensation in late binaural */ #endif + +#define NONBE_FIX_947_STEREO_DMX_EVS_POC /* Orange: Fix clicks on POC */ +#define NONBE_FIX_947_STEREO_DMX_EVS_PHA /* Orange: Fix issues on PHA */ + /* #################### End BASOP porting switches ############################ */ #endif diff --git a/lib_debug/debug.c b/lib_debug/debug.c index aafc1b66332ef261ec444a0c2ca4cd269cb1a325..ee6040fafc840e9ff52aac4e3418b02a6c8935cb 100644 --- a/lib_debug/debug.c +++ b/lib_debug/debug.c @@ -788,7 +788,7 @@ char *fname( #ifdef DEBUG_FORCE_DIR size_t len; len = strlen( tmp_fname ); - if (tmp_fname[len - 1] != '/' && tmp_fname[len - 1] != '\\' ) + if ( tmp_fname[len - 1] != '/' && tmp_fname[len - 1] != '\\' ) { /* add trailing '/' slash */ strcat( tmp_fname, "/" ); diff --git a/lib_debug/wmc_auto.c b/lib_debug/wmc_auto.c index d357c03dd7d09ed3721a2fd735b48c26978e6fec..9a4b371fc5fa8cd7bb9147da17355d409ae0819b 100644 --- a/lib_debug/wmc_auto.c +++ b/lib_debug/wmc_auto.c @@ -1018,7 +1018,7 @@ int push_stack( const char *filename, const char *fctname ) } /* Check, if This is the New Worst-Case RAM (stack + heap) */ - current_stack_size = ( int32_t )( ( ( ptr_base_stack - ptr_current_stack ) * sizeof( int16_t ) ) ); + current_stack_size = (int32_t) ( ( ( ptr_base_stack - ptr_current_stack ) * sizeof( int16_t ) ) ); if ( current_stack_size < 0 ) { @@ -1226,7 +1226,7 @@ void *mem_alloc( current_heap_size += ptr_record->block_size; /* Check, if this is the new Worst-Case RAM (stack + heap) */ - current_stack_size = ( int32_t )( ( ( ptr_base_stack - ptr_current_stack ) * sizeof( int16_t ) ) ); + current_stack_size = (int32_t) ( ( ( ptr_base_stack - ptr_current_stack ) * sizeof( int16_t ) ) ); if ( current_stack_size + current_heap_size > wc_ram_size ) { wc_ram_size = current_stack_size + current_heap_size; @@ -2416,7 +2416,7 @@ int EQ_64( long long int L64_var1, long long int L64_var2 ) #endif return F_ret; } -int NE_64( long long int L64_var1, long long int L64_var2 ) +int NE_64( long long int L64_var1, long long int L64_var2 ) { int F_ret = 0; @@ -2503,7 +2503,7 @@ void Reset_BASOP_WMOPS_counter( unsigned int counterId ) /* reset the current BASOP operation counter */ ptr = (unsigned int *) &multiCounter[counterId]; - for ( i = 0; i < (int) (sizeof(BASIC_OP) / sizeof(unsigned int)); i++ ) + for ( i = 0; i < (int) ( sizeof( BASIC_OP ) / sizeof( unsigned int ) ); i++ ) { *ptr++ = 0; } diff --git a/lib_enc/ivas_rom_enc.h b/lib_enc/ivas_rom_enc.h index 0d0941cc43ce9a1d47dd0bdbe30308779e1d23f8..27fa274630d40d050ab3b5067edfb058f215a8b1 100644 --- a/lib_enc/ivas_rom_enc.h +++ b/lib_enc/ivas_rom_enc.h @@ -111,9 +111,15 @@ extern const UWord16 ECSQ_tab_vals[ECSQ_PARAM_COUNT - 1][1 + ECSQ_TAB_VALS_SIZE] /*----------------------------------------------------------------------------------* * Stereo downmix to EVS ROM tables *----------------------------------------------------------------------------------*/ +#ifdef NONBE_FIX_947_STEREO_DMX_EVS_POC +extern const Word32 Stereo_dmx_s_wnd_coef_16k_fx[L_FRAME16k >> 1]; +extern const Word32 Stereo_dmx_s_wnd_coef_32k_fx[L_FRAME32k >> 1]; +extern const Word32 Stereo_dmx_s_wnd_coef_48k_fx[L_FRAME48k >> 1]; +#else extern const Word32 Stereo_dmx_s_wnd_coef_16k_fx[L_FRAME16k >> 4]; extern const Word32 Stereo_dmx_s_wnd_coef_32k_fx[L_FRAME32k >> 4]; extern const Word32 Stereo_dmx_s_wnd_coef_48k_fx[L_FRAME48k >> 4]; +#endif extern const Word32 Stereo_dmx_wnd_coef_32k_fx[L_FRAME32k]; extern const Word32 Stereo_dmx_wnd_coef_48k_fx[L_FRAME48k]; /*----------------------------------------------------------------------------------* diff --git a/lib_enc/ivas_rom_enc_fx.c b/lib_enc/ivas_rom_enc_fx.c index b26972b8aa56df444edcd9c4cb51e05eaeeba2be..9b1b4dd23bd82887f769d2e354d30cca82f4af22 100644 --- a/lib_enc/ivas_rom_enc_fx.c +++ b/lib_enc/ivas_rom_enc_fx.c @@ -508,6 +508,114 @@ const Word32 ari_bit_estimate_s17_LC_fx[RANGE_N_CONTEXT][RANGE_N_SYMBOLS] = // Q /*----------------------------------------------------------------------------------* * Stereo downmix to EVS ROM tables *----------------------------------------------------------------------------------*/ + + #ifdef NONBE_FIX_947_STEREO_DMX_EVS_POC +// Q31 + const Word32 Stereo_dmx_s_wnd_coef_16k_fx[L_FRAME16k >> 1] = { + 204411, 817566, 1839231, 3269018, 5106382, 7350624, 10000889, 13056168, 16515298, 20376962, + 24639688, 29301856, 34361688, 39817260, 45666492, 51907160, 58536884, 65553148, 72953272, 80734440, + 88893688, 97427912, 106333872, 115608160, 125247248, 135247472, 145605040, 156315968, 167376224, 178781552, + 190527648, 202610016, 215024064, 227765072, 240828160, 254208400, 267900656, 281899744, 296200320, 310796928, + 325684032, 340855968, 356306944, 372031072, 388022368, 404274752, 420782016, 437537920, 454536032, 471769920, + 489232992, 506918624, 524820096, 542930496, 561243072, 579750720, 598446528, 617323264, 636373760, 655590784, + 674967040, 694495104, 714167552, 733976960, 753915712, 773976192, 794150848, 814431936, 834811776, 855282624, + 875836544, 896465920, 917162752, 937919168, 958727360, 979579264, 1000467072, 1021382784, 1042318400, 1063266048, + 1084217599, 1105165183, 1126100863, 1147016575, 1167904383, 1188756351, 1209564415, 1230320895, 1251017727, 1271647103, + 1292201087, 1312671871, 1333051647, 1353332735, 1373507455, 1393567999, 1413506687, 1433316095, 1452988543, 1472516607, + 1491892863, 1511109887, 1530160383, 1549037183, 1567732863, 1586240511, 1604553087, 1622663551, 1640564991, 1658250623, + 1675713663, 1692947583, 1709945727, 1726701567, 1743208959, 1759461247, 1775452543, 1791176703, 1806627711, 1821799551, + 1836686719, 1851283327, 1865583871, 1879582975, 1893275263, 1906655487, 1919718527, 1932459519, 1944873599, 1956956031, + 1968702079, 1980107391, 1991167615, 2001878655, 2012236159, 2022236415, 2031875455, 2041149823, 2050055679, 2058589951, + 2066749183, 2074530431, 2081930495, 2088946815, 2095576447, 2101817215, 2107666431, 2113121919, 2118181759, 2122843903, + 2127106687, 2130968319, 2134427519, 2137482751, 2140132991, 2142377215, 2144214655, 2145644415, 2146666111, 2147279231 + }; + // Q31 + const Word32 Stereo_dmx_s_wnd_coef_32k_fx[L_FRAME32k >> 1] = { + 51423, 205686, 462776, 822667, 1285325, 1850705, 2518754, 3289407, 4162591, 5138222, + 6216206, 7396441, 8678813, 10063200, 11549468, 13137475, 14827070, 16618091, 18510366, 20503712, + 22597942, 24792852, 27088232, 29483864, 31979518, 34574956, 37269924, 40064172, 42957428, 45949412, + 49039844, 52228420, 55514844, 58898792, 62379948, 65957972, 69632528, 73403256, 77269800, 81231792, + 85288840, 89440576, 93686584, 98026464, 102459800, 106986176, 111605144, 116316264, 121119096, 126013168, + 130998016, 136073168, 141238128, 146492400, 151835488, 157266880, 162786064, 168392496, 174085632, 179864960, + 185729888, 191679888, 197714368, 203832752, 210034448, 216318896, 222685456, 229133536, 235662512, 242271760, + 248960656, 255728544, 262574784, 269498720, 276499680, 283577024, 290730048, 297958048, 305260384, 312636288, + 320085120, 327606144, 335198624, 342861856, 350595072, 358397568, 366268576, 374207360, 382213120, 390285152, + 398422624, 406624768, 414890848, 423220000, 431611456, 440064448, 448578112, 457151680, 465784288, 474475136, + 483223360, 492028160, 500888704, 509804096, 518773504, 527796064, 536870912, 545997184, 555174016, 564400512, + 573675776, 582998976, 592369152, 601785472, 611246976, 620752768, 630301952, 639893568, 649526784, 659200640, + 668914176, 678666496, 688456704, 698283776, 708146816, 718044864, 727976960, 737942208, 747939584, 757968192, + 768027072, 778115200, 788231680, 798375424, 808545600, 818741184, 828961216, 839204672, 849470528, 859757952, + 870065856, 880393216, 890739136, 901102592, 911482560, 921878080, 932288192, 942711808, 953147968, 963595648, + 974053952, 984521728, 994998080, 1005481984, 1015972480, 1026468416, 1036968960, 1047472960, 1057979520, 1068487552, + 1078996095, 1089504127, 1100010751, 1110514687, 1121015167, 1131511167, 1142001663, 1152485503, 1162961919, 1173429759, + 1183887999, 1194335743, 1204771839, 1215195519, 1225605503, 1236001023, 1246381055, 1256744447, 1267090431, 1277417855, + 1287725695, 1298013055, 1308279039, 1318522495, 1328742399, 1338937983, 1349108223, 1359251967, 1369368447, 1379456639, + 1389515391, 1399544063, 1409541503, 1419506687, 1429438847, 1439336831, 1449199871, 1459026943, 1468817151, 1478569471, + 1488283007, 1497956863, 1507590015, 1517181695, 1526730879, 1536236671, 1545698175, 1555114495, 1564484735, 1573807871, + 1583083135, 1592309631, 1601486463, 1610612735, 1619687551, 1628710143, 1637679615, 1646594943, 1655455487, 1664260223, + 1673008511, 1681699327, 1690332031, 1698905471, 1707419135, 1715872127, 1724263679, 1732592767, 1740858879, 1749060991, + 1757198463, 1765270527, 1773276287, 1781215103, 1789086079, 1796888575, 1804621823, 1812285055, 1819877503, 1827398527, + 1834847359, 1842223231, 1849525631, 1856753663, 1863906687, 1870983935, 1877984895, 1884908927, 1891755135, 1898523007, + 1905211903, 1911821183, 1918350079, 1924798207, 1931164799, 1937449215, 1943650943, 1949769343, 1955803775, 1961753727, + 1967618687, 1973398015, 1979091199, 1984697599, 1990216703, 1995648127, 2000991231, 2006245503, 2011410431, 2016485631, + 2021470463, 2026364543, 2031167359, 2035878527, 2040497535, 2045023871, 2049457151, 2053797119, 2058043135, 2062194815, + 2066251903, 2070213887, 2074080383, 2077851135, 2081525631, 2085103743, 2088584831, 2091968767, 2095255167, 2098443775, + 2101534207, 2104526207, 2107419519, 2110213759, 2112908671, 2115504127, 2117999743, 2120395391, 2122690815, 2124885759, + 2126979967, 2128973311, 2130865535, 2132656639, 2134346111, 2135934207, 2137420415, 2138804863, 2140087167, 2141267455, + 2142345471, 2143321087, 2144194303, 2144964863, 2145632895, 2146198271, 2146660991, 2147020927, 2147277951, 2147432191 + }; + // Q31 + const Word32 Stereo_dmx_s_wnd_coef_48k_fx[L_FRAME48k >> 1] = { + 22902, 91608, 206114, 366416, 572507, 824378, 1122018, 1465415, 1854554, 2289418, + 2769989, 3296246, 3868167, 4485728, 5148901, 5857660, 6611973, 7411808, 8257132, 9147909, + 10084099, 11065664, 12092561, 13164746, 14282175, 15444799, 16652568, 17905432, 19203336, 20546226, + 21934042, 23366728, 24844222, 26366462, 27933380, 29544910, 31200986, 32901534, 34646484, 36435760, + 38269288, 40146984, 42068776, 44034576, 46044300, 48097868, 50195188, 52336168, 54520724, 56748756, + 59020172, 61334876, 63692768, 66093744, 68537712, 71024552, 73554176, 76126456, 78741304, 81398592, + 84098208, 86840048, 89623984, 92449904, 95317680, 98227200, 101178336, 104170952, 107204936, 110280144, + 113396456, 116553736, 119751848, 122990656, 126270024, 129589808, 132949864, 136350064, 139790240, 143270256, + 146789968, 150349232, 153947888, 157585760, 161262736, 164978624, 168733280, 172526544, 176358256, 180228256, + 184136368, 188082416, 192066256, 196087712, 200146592, 204242752, 208376000, 212546160, 216753072, 220996528, + 225276352, 229592384, 233944432, 238332288, 242755792, 247214752, 251708960, 256238240, 260802384, 265401216, + 270034528, 274702112, 279403808, 284139392, 288908640, 293711360, 298547360, 303416448, 308318400, 313252960, + 318220000, 323219264, 328250528, 333313632, 338408288, 343534304, 348691488, 353879616, 359098432, 364347744, + 369627296, 374936928, 380276320, 385645312, 391043680, 396471168, 401927520, 407412544, 412925984, 418467616, + 424037216, 429634528, 435259328, 440911328, 446590336, 452296128, 458028416, 463786944, 469571520, 475381856, + 481217728, 487078848, 492965024, 498875968, 504811424, 510771168, 516754912, 522762432, 528793440, 534847712, + 540924928, 547024960, 553147392, 559292032, 565458624, 571646912, 577856640, 584087488, 590339264, 596611584, + 602904320, 609217152, 615549760, 621901888, 628273344, 634663808, 641072960, 647500608, 653946432, 660410176, + 666891520, 673390208, 679906048, 686438592, 692987712, 699553088, 706134400, 712731392, 719343808, 725971328, + 732613696, 739270592, 745941760, 752626880, 759325760, 766038016, 772763456, 779501696, 786252480, 793015488, + 799790528, 806577216, 813375360, 820184576, 827004608, 833835136, 840675968, 847526656, 854387072, 861256832, + 868135616, 875023168, 881919232, 888823488, 895735616, 902655296, 909582336, 916516352, 923457088, 930404224, + 937357504, 944316544, 951281152, 958250944, 965225728, 972205056, 979188800, 986176512, 993168000, 1000162880, + 1007160960, 1014161856, 1021165248, 1028170944, 1035178560, 1042187776, 1049198400, 1056210048, 1063222464, 1070235328, + 1077248383, 1084261119, 1091273599, 1098285183, 1105295871, 1112305151, 1119312767, 1126318335, 1133321855, 1140322687, + 1147320703, 1154315647, 1161307135, 1168294911, 1175278591, 1182257919, 1189232639, 1196202495, 1203167103, 1210126207, + 1217079423, 1224026495, 1230967295, 1237901311, 1244828287, 1251748095, 1258660223, 1265564415, 1272460415, 1279348095, + 1286226815, 1293096575, 1299956991, 1306807679, 1313648511, 1320479103, 1327299071, 1334108287, 1340906367, 1347693183, + 1354468095, 1361231231, 1367981951, 1374720255, 1381445631, 1388157823, 1394856703, 1401541887, 1408213119, 1414870015, + 1421512319, 1428139903, 1434752255, 1441349247, 1447930623, 1454495871, 1461044991, 1467577599, 1474093439, 1480592127, + 1487073535, 1493537151, 1499982975, 1506410623, 1512819839, 1519210239, 1525581695, 1531933951, 1538266495, 1544579327, + 1550872063, 1557144447, 1563396095, 1569627007, 1575836671, 1582024959, 1588191615, 1594336255, 1600458751, 1606558719, + 1612635903, 1618690175, 1624721279, 1630728703, 1636712447, 1642672255, 1648607743, 1654518655, 1660404735, 1666265983, + 1672101759, 1677912191, 1683696639, 1689455231, 1695187583, 1700893311, 1706572287, 1712224383, 1717849087, 1723446399, + 1729016063, 1734557695, 1740071167, 1745556095, 1751012479, 1756439935, 1761838335, 1767207295, 1772546687, 1777856383, + 1783135871, 1788385151, 1793604095, 1798792191, 1803949311, 1809075327, 1814169983, 1819233151, 1824264319, 1829263615, + 1834230655, 1839165311, 1844067199, 1848936319, 1853772287, 1858574975, 1863344255, 1868079871, 1872781567, 1877449087, + 1882082431, 1886681215, 1891245439, 1895774719, 1900268927, 1904727807, 1909151359, 1913539199, 1917891199, 1922207231, + 1926487167, 1930730623, 1934937471, 1939107583, 1943240831, 1947337087, 1951395967, 1955417343, 1959401215, 1963347327, + 1967255423, 1971125375, 1974957055, 1978750335, 1982504959, 1986220927, 1989897855, 1993535743, 1997134463, 2000693631, + 2004213375, 2007693439, 2011133567, 2014533759, 2017893887, 2021213567, 2024493055, 2027731839, 2030929919, 2034087167, + 2037203455, 2040278655, 2043312639, 2046305279, 2049256447, 2052166015, 2055033727, 2057859711, 2060643583, 2063385471, + 2066085119, 2068742399, 2071357183, 2073929471, 2076459135, 2078945919, 2081389951, 2083790847, 2086148735, 2088463487, + 2090734847, 2092962943, 2095147519, 2097288447, 2099385727, 2101439359, 2103449087, 2105414911, 2107336703, 2109214335, + 2111047935, 2112837119, 2114582143, 2116282623, 2117938687, 2119550207, 2121117183, 2122639487, 2124116863, 2125549567, + 2126937471, 2128280319, 2129578239, 2130831103, 2132038911, 2133201535, 2134318847, 2135391103, 2136418047, 2137399551, + 2138335743, 2139226495, 2140071807, 2140871679, 2141625983, 2142334719, 2142997887, 2143615487, 2144187391, 2144713599, + 2145194239, 2145629055, 2146018175, 2146361599, 2146659327, 2146911103, 2147117183, 2147277567, 2147391999, 2147460735 + }; + #else // Q31 const Word32 Stereo_dmx_s_wnd_coef_16k_fx[L_FRAME16k >> 4] = { 3309988, 29667578, 81733728, 158226416, 257262128, 376402368, 512713184, 662838656, 823081792, 989497088, @@ -529,6 +637,8 @@ const Word32 Stereo_dmx_s_wnd_coef_48k_fx[L_FRAME48k >> 4] = { 1634770560, 1681915904, 1727394560, 1771081600, 1812856960, 1852606720, 1890221568, 1925598592, 1958640640, 1989257344, 2017364480, 2042885504, 2065750016, 2085895424, 2103266688, 2117816064, 2129503616, 2138297728, 2144173568, 2147115776 }; +#endif + // Q31 const Word32 Stereo_dmx_wnd_coef_32k_fx[L_FRAME32k] = { 5270712, 15812011, 26352928, 36893212, 47432604, 57970856, 68507712, 79042912, 89576208, 100107344, diff --git a/lib_enc/ivas_stat_enc.h b/lib_enc/ivas_stat_enc.h index a2247c7a4138f22d981ae9cfcce98e0287e65f88..85450a6975104ca621e4ff0dd7639bdc61788b5f 100644 --- a/lib_enc/ivas_stat_enc.h +++ b/lib_enc/ivas_stat_enc.h @@ -1178,7 +1178,9 @@ typedef struct stereo_dmx_evs_phase_only_correlation_structure typedef struct stereo_dmx_evs_correlation_filter_structure { +#ifndef NONBE_FIX_947_STEREO_DMX_EVS_PHA Word16 init_frmCntr; +#endif Word32 isd_rate_s_fx; // Q31 Word32 iccr_s_fx; // Q31 @@ -1202,6 +1204,18 @@ typedef struct stereo_dmx_evs_correlation_filter_structure STEREO_DMX_EVS_PHA prev_pha; Word16 pha_hys_cnt; +#ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA + STEREO_DMX_EVS_PHA proc_pha; + Word16 force_poc; + + Word16 pha_ipd_chan2rephase; + Word16 pha_ipd_previouschan2rephase; + Word16 pha_ipd_chan_cnt; + Word16 pha_ipd_chan_thresh; + Word16 pha_ipd_chanswitch; + Word16 pha_ipd_chanswitch_allowed; +#endif + Word16 prc_thres; STEREO_DMX_EVS_PRC curr_prc; STEREO_DMX_EVS_PRC prev_prc; @@ -1214,6 +1228,27 @@ typedef struct stereo_dmx_evs_correlation_filter_structure Word16 trns_aux_energy_fx_e[CPE_CHANNELS]; Word32 crst_fctr_fx; // Q0 +#ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA + Word16 n_fad_g; + Word16 n_fad_cnt; + + Word32 dmx_pha_ener_fx; + Word16 dmx_pha_ener_fx_e; + Word32 dmx_poc_ener_fx; + Word16 dmx_poc_ener_fx_e; + + Word32 dmx_pha_ener_sgc_fx; + Word16 dmx_pha_ener_sgc_fx_e; + Word32 dmx_poc_ener_sgc_fx; + Word16 dmx_poc_ener_sgc_fx_e; + + Word32 dmx_pha_gain_sgc_fx; + Word32 dmx_poc_gain_sgc_fx; + + Word32 low_egy_thres_sgc; + Word16 low_egy_thres_sgc_e; +#endif + } STEREO_DMX_EVS_PHA_DATA, *STEREO_DMX_EVS_PHA_HANDLE; typedef struct stereo_dmx_evs_enc_data_structure diff --git a/lib_enc/ivas_stereo_dmx_evs_fx.c b/lib_enc/ivas_stereo_dmx_evs_fx.c index 625ff8ee90fc1f2eeeb5dc932c1312b3b861106f..f8731bd0b760e94d2241b1d7282eb3bba2d55c97 100644 --- a/lib_enc/ivas_stereo_dmx_evs_fx.c +++ b/lib_enc/ivas_stereo_dmx_evs_fx.c @@ -88,7 +88,9 @@ #define STEREO_DMX_EVS_SWTCH_PRC_THRES_48 29 #define STEREO_DMX_EVS_SWTCH_PRC_HYS_THRES 1 -#define STEREO_DMX_EVS_FADE_LEN_PRC_Q0 20 +#ifndef NONBE_FIX_947_STEREO_DMX_EVS_PHA +#define STEREO_DMX_EVS_FADE_LEN_PRC_Q0 20 +#endif #define STEREO_DMX_EVS_NB_SBFRM 5 #define STEREO_DMX_EVS_TRNS_DTC_INST_Q0 75 @@ -98,6 +100,48 @@ #define STEREO_DMX_EVS_TRNS_EGY_FORGETTING_Q15 24576 +#ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA +#define STEREO_DMX_EVS_FAD_R 3 +#define STEREO_DMX_EVS_SGC_EGY_FORGETTING_Q15 29491 // 0.9f +#define STEREO_DMX_EVS_SGC_GR_S 32919 // 1.00461543f +#define STEREO_DMX_EVS_SGC_GIR_S 32617 // 1/1.00461543f +#define STEREO_DMX_EVS_SGC_GL 32391 // 0.9885f +#define STEREO_DMX_EVS_SGC_GH 33148 // 1.0116f +#define STEREO_DMX_EVS_SGC_LEGY_THRES_16 2.5E8 +#define STEREO_DMX_EVS_SGC_LEGY_THRES_32 3.E8 +#define STEREO_DMX_EVS_SGC_LEGY_THRES_48 5.E8 +#define STEREO_DMX_EVS_SGC_LEGY_THRES_E 22 +#define STEREO_DMX_EVS_SGC_GMAX 46340 // 1.4142f +#define STEREO_DMX_EVS_SGC_GMIN 23170 // 0.7071f +#define STEREO_DMX_EVS_IPD_ILD_THRES_Q29 1696512082 // 3.16f (5dB) +#define STEREO_DMX_EVS_IPD_SF_THRES_Q31 107374182 // 0.05f +const Word32 ipd_ff_Q31[STEREO_DMX_EVS_NB_SUBBAND_MAX] = { + 2027355520, 2027355520, 2027355520, 2027355520, 2027355520, 2027355520, 2027355520, 2027355520, 2027355520, 2027355520, + 2027355520, 2027355520, 2027355520, 2027355520, 2027355520, 2027355520, 2027355520, 2027355520, 2027355520, 2027355520, + 2027355520, 2027355520, 2027355520, 2027355520, 2027355520, 2027355520, 2027355520, 2027355520, 2027355520, 2027355520, + 2027355520, 2023718912, 2020082304, 2016445696, 2012809088, 2009172480, 2005535872, 2001899264, 1998262656, 1994625920, + 1990989312, 1987352704, 1983716096, 1980079488, 1976442880, 1972806272, 1969169664, 1965533056, 1961896448, 1958259840, + 1954623232, 1950986624, 1947350016, 1943713408, 1940076800, 1936440192, 1932803584, 1929166848, 1925530240, 1921893632, + 1918257024, 1914620416, 1910983808, 1907347200, 1903710592, 1900073984, 1896437376, 1892800768, 1889164160, 1885527552, + 1881890944, 1878254336, 1874617600, 1870981120, 1867344384, 1863707776, 1860071168, 1856434560, 1852797952, 1849161344, + 1845524736, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, + 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, + 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, + 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, + 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, + 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, + 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, + 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, + 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, + 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, + 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, + 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, + 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, + 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, + 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, + 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128 +}; +#else const Word32 ipd_ff_Q31[STEREO_DMX_EVS_NB_SUBBAND_MAX] = { 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, @@ -124,6 +168,7 @@ const Word32 ipd_ff_Q31[STEREO_DMX_EVS_NB_SUBBAND_MAX] = { 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872 }; +#endif /*-----------------------------------------------------------------------* * Local function prototypes *-----------------------------------------------------------------------*/ @@ -202,6 +247,13 @@ static Word32 find_poc_peak_fx( const Word16 input_frame, /* i : input frame length per channel */ const Word32 ratio_fixed /* i : adapting ratio */ ); +#ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA +static Word32 spectral_flatness_fx( + const Word32 *sig_fx, /* i : input signal (mantissa) */ + const Word16 *sig_fx_e, /* i : input signal (exponent) - can be NULL */ + const Word16 sig_length /* i : input signal length */ +); +#endif /*-------------------------------------------------------------------* * estimate_itd_wnd_fft() * @@ -307,7 +359,11 @@ static void calc_poc_fx( Word16 cos_step, cos_max; Word32 eps_cos, eps_sin, EPS; +#ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA + Word16 isd_cnt_h, isd_cnt_l, ild_cnt, n, freq_8k, freq_ipd_max, nsbd, input_frame_pha, pha_ipd_ild_chan2rephase; +#else Word16 isd_cnt_h, isd_cnt_l, ild_cnt, n, freq_8k, freq_ipd_max, nsbd, input_frame_pha; +#endif Word32 Nr, Ni, Dr, Di, tPr, tPi, Pn, energy; Word16 Nr_e, Ni_e, tPr_e, tPi_e, Pn_e, energy_e; Word16 isd_rate, isd_rate_e; @@ -567,7 +623,7 @@ static void calc_poc_fx( specPOr[n0] = imult3216( Mpy_32_32_r( wnd[i * step + bias], gamma ), sign_fx( Mpy_32_32_r( specLr[n0], specRr[n0] ) ) ); // Q31 move32(); - +#ifndef NONBE_FIX_947_STEREO_DMX_EVS_PHA hPHA->init_frmCntr = sub( hPHA->init_frmCntr, 1 ); move16(); if ( hPHA->init_frmCntr < 0 ) @@ -575,6 +631,7 @@ static void calc_poc_fx( hPHA->init_frmCntr = 0; move16(); } +#endif freq_8k = L_FRAME16k / 2; move16(); // freq_ipd_max = (int16_t) ( freq_8k * 5000.0f / ( 8000.0f * STEREO_DMX_EVS_SUBBAND_SIZE ) ); @@ -799,6 +856,22 @@ static void calc_poc_fx( tPr = L_shl_sat( Mpy_32_32_r( tPr, Pn ), add( tPr_e, Pn_e ) ); // Q31 tPi = L_shl_sat( Mpy_32_32_r( tPi, Pn ), add( tPi_e, Pn_e ) ); // Q31 +#ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA + Pr[n] = L_add( Mpy_32_32_r( ipd_ff[n], Pr[n] ), Mpy_32_32_r( L_sub( MAX_32, ipd_ff[n] ), tPr ) ); + move32(); + Pi[n] = L_add( Mpy_32_32_r( ipd_ff[n], Pi[n] ), Mpy_32_32_r( L_sub( MAX_32, ipd_ff[n] ), tPi ) ); + move32(); + + // Pn = (float) inv_sqrt( ( Pr[n] * Pr[n] + Pi[n] * Pi[n] ) + EPSILON ); + Pn = L_add( L_shr( Mpy_32_32_r( Pr[n], Pr[n] ), 1 ), L_shr( Mpy_32_32_r( Pi[n], Pi[n] ), 1 ) ); + Pn = BASOP_Util_Add_Mant32Exp( Pn, 1, EPSILON_FX_M, EPSILON_FX_E, &Pn_e ); + Pn = Isqrt_lc( Pn, &Pn_e ); + + Pr[n] = L_shl_sat( Mpy_32_32_r( Pr[n], Pn ), Pn_e ); // Q31 + move32(); + Pi[n] = L_shl_sat( Mpy_32_32_r( Pi[n], Pn ), Pn_e ); // Q31 + move32(); +#else IF( hPHA->init_frmCntr == 0 ) { Pr[n] = L_add( Mpy_32_32_r( ipd_ff[n], Pr[n] ), Mpy_32_32_r( L_sub( MAX_32, ipd_ff[n] ), tPr ) ); @@ -823,10 +896,26 @@ static void calc_poc_fx( Pi[n] = tPi; move32(); } - +#endif // Pr[n] = ( Pr[n] > 1.0f ) ? 1.0f : Pr[n]; // Pr[n] = ( Pr[n] < -1.0f ) ? -1.0f : Pr[n]; } + +#ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA + /* Computes Spectral flatness on one channel */ + tmp1 = spectral_flatness_fx( &tEl[1], &tEl_e[1], nsbd - 1 ); + IF( LT_32( tmp1, STEREO_DMX_EVS_IPD_SF_THRES_Q31 ) ) + { + hPHA->pha_ipd_chanswitch_allowed = 0; + move16(); + } + ELSE + { + hPHA->pha_ipd_chanswitch_allowed = 1; + move16(); + } +#endif + // ICCr = (float) sqrt( ( Nr * Nr + Ni * Ni ) / ( eneL * eneR + EPSILON ) ); L_tmp1 = BASOP_Util_Add_Mant32Exp( Mpy_32_32_r( Nr, Nr ), shl( Nr_e, 1 ), Mpy_32_32_r( Ni, Ni ), shl( Ni_e, 1 ), &L_tmp1_e ); L_tmp2 = BASOP_Util_Add_Mant32Exp( Mpy_32_32_r( eneL, eneR ), add( eneL_e, eneR_e ), EPSILON_FX_M, EPSILON_FX_E, &L_tmp2_e ); @@ -840,6 +929,316 @@ static void calc_poc_fx( hPHA->iccr_s_fx = L_add( Mpy_32_32_r( STEREO_DMX_EVS_ICCR_FORGETTING_Q31, hPHA->iccr_s_fx ), Mpy_32_32_r( MAX_32 - STEREO_DMX_EVS_ICCR_FORGETTING_Q31, ICCr ) ); // Q31 move32(); +#ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA + + IF( EQ_32( hPHA->curr_pha, STEREO_DMX_EVS_PHA_IPD ) ) + { + hPHA->force_poc = FALSE; + hPHA->proc_pha = STEREO_DMX_EVS_PHA_IPD; + move16(); + move32(); + } + ELSE + { + test(); + test(); + test(); + IF( LT_32( hPHA->iccr_s_fx, STEREO_DMX_EVS_ICCR_HYST_L_Q31 ) || ( LT_32( hPHA->iccr_s_fx, STEREO_DMX_EVS_ICCR_HYST_H_Q31 ) && EQ_32( hPHA->proc_pha, STEREO_DMX_EVS_PHA_IPD2 ) && EQ_16( hPHA->force_poc, FALSE ) ) ) + { + hPHA->force_poc = FALSE; + hPHA->proc_pha = STEREO_DMX_EVS_PHA_IPD2; + move16(); + move32(); + } + ELSE + { + hPHA->force_poc = TRUE; + move16(); + } + } + + IF( hPHA->proc_pha == STEREO_DMX_EVS_PHA_IPD ) + { + rfft_pha_buf[0] = ONE_IN_Q22; + move32(); + rfft_pha_buf[1] = ONE_IN_Q22; + move32(); + + ild_cnt = 0; + move16(); + FOR( i = 1; i < nsbd; i++ ) + { + rfft_pha_buf[i * 2] = L_shr_r( Pr[i], 9 ); // Q31->Q22 + move32(); + rfft_pha_buf[i * 2 + 1] = L_shr_r( Pi[i], 9 ); // Q31->Q22 + move32(); + // if ( ( tEr[i] > STEREO_DMX_EVS_LR_EGY * tEl[i] ) || ( tEl[i] > STEREO_DMX_EVS_LR_EGY * tEr[i] ) ) + test(); + IF( BASOP_Util_Cmp_Mant32Exp( tEr[i], tEr_e[i], Mpy_32_32_r( STEREO_DMX_EVS_LR_EGY_Q27, tEl[i] ), add( 4, tEl_e[i] ) ) > 0 || BASOP_Util_Cmp_Mant32Exp( tEl[i], tEl_e[i], Mpy_32_32_r( STEREO_DMX_EVS_LR_EGY_Q27, tEr[i] ), add( 4, tEr_e[i] ) ) > 0 ) + { + ild_cnt = add( ild_cnt, 1 ); + tEr[i] = MAX_32; + move32(); + tEr_e[i] = 0; + move16(); + } + ELSE + { + tEr[i] = MIN_32; + move32(); + tEr_e[i] = 0; + move16(); + } + } + IF( GT_16( ild_cnt, mult_r( nsbd, STEREO_DMX_EVS_ILD_PRC_Q15 ) ) ) + { + FOR( i = 1; i < nsbd; i++ ) + { + IF( tEr[i] > 0 ) + { + rfft_pha_buf[i * 2] = ONE_IN_Q22; + move32(); + rfft_pha_buf[i * 2 + 1] = 0; + move32(); + } + } + } + + rfft_fx( rfft_pha_buf, hPHA->rfft_ipd_coef_fx, input_frame_pha, +1 ); + + /* Choose best channel to phase align */ + /* Channel selection based on ILD */ + IF( BASOP_Util_Cmp_Mant32Exp( hPHA->trns_aux_energy_fx[0], hPHA->trns_aux_energy_fx_e[0], Mpy_32_32_r( STEREO_DMX_EVS_IPD_ILD_THRES_Q29, hPHA->trns_aux_energy_fx[1] ), add( 2, hPHA->trns_aux_energy_fx_e[1] ) ) > 0 ) + { + pha_ipd_ild_chan2rephase = 1; + } + ELSE IF( BASOP_Util_Cmp_Mant32Exp( hPHA->trns_aux_energy_fx[1], hPHA->trns_aux_energy_fx_e[1], Mpy_32_32_r( STEREO_DMX_EVS_IPD_ILD_THRES_Q29, hPHA->trns_aux_energy_fx[0] ), add( 2, hPHA->trns_aux_energy_fx_e[0] ) ) > 0 ) + { + pha_ipd_ild_chan2rephase = 0; + } + ELSE + { + pha_ipd_ild_chan2rephase = -1; + } + move16(); + + /* Channel selection based on spikyness of R2L/L2R impulse responses */ + tmp1 = spectral_flatness_fx( rfft_pha_buf, NULL, hPHA->pha_len ); + rfft_pha_buf[sub( input_frame_pha, hPHA->pha_len )] = rfft_pha_buf[0]; + move32(); + tmp2 = spectral_flatness_fx( &rfft_pha_buf[sub( input_frame_pha, hPHA->pha_len )], NULL, hPHA->pha_len ); + + // /* Combined ILD/SF channel selection with tempo */ + IF( ( GT_32( tmp1, tmp2 ) && ( EQ_16( pha_ipd_ild_chan2rephase, -1 ) ) ) || EQ_16( pha_ipd_ild_chan2rephase, 0 ) ) /* L => R */ + { + IF( EQ_16( hPHA->pha_ipd_previouschan2rephase, 0 ) ) + { + hPHA->pha_ipd_chan_cnt = add( hPHA->pha_ipd_chan_cnt, 1 ); + IF( GE_32( hPHA->pha_ipd_chan_cnt, hPHA->pha_ipd_chan_thresh ) ) + { + /* Avoid channel switch in case of too harmonic signals */ + IF( EQ_16( hPHA->pha_ipd_chanswitch_allowed, 1 ) ) + { + IF( NE_16( hPHA->pha_ipd_chan2rephase, 0 ) ) + { + hPHA->pha_ipd_chanswitch = 1; + move16(); + } + ELSE + { + hPHA->pha_ipd_chanswitch = 0; + move16(); + } + hPHA->pha_ipd_chan2rephase = 0; + move16(); + } + } + } + ELSE + { + hPHA->pha_ipd_previouschan2rephase = 0; + hPHA->pha_ipd_chan_cnt = 1; + hPHA->pha_ipd_chanswitch = 0; + move16(); + move16(); + move16(); + } + } + ELSE + { + IF( EQ_16( hPHA->pha_ipd_previouschan2rephase, 1 ) ) + { + hPHA->pha_ipd_chan_cnt = add( hPHA->pha_ipd_chan_cnt, 1 ); + + IF( GE_16( hPHA->pha_ipd_chan_cnt, hPHA->pha_ipd_chan_thresh ) ) + { + /* Avoid channel switch in case of too harmonic signals */ + IF( EQ_16( hPHA->pha_ipd_chanswitch_allowed, 1 ) ) + { + IF( NE_16( hPHA->pha_ipd_chan2rephase, 1 ) ) + { + hPHA->pha_ipd_chanswitch = 1; + move16(); + } + ELSE + { + hPHA->pha_ipd_chanswitch = 0; + move16(); + } + hPHA->pha_ipd_chan2rephase = 1; + move16(); + } + hPHA->pha_ipd_chan_cnt = hPHA->pha_ipd_chan_thresh; + move16(); + } + } + ELSE + { + hPHA->pha_ipd_previouschan2rephase = 1; + hPHA->pha_ipd_chan_cnt = 1; + hPHA->pha_ipd_chanswitch = 0; + move16(); + move16(); + move16(); + } + } + + IF( EQ_16( hPHA->pha_ipd_chanswitch, 0 ) ) + { + IF( EQ_16( hPHA->pha_ipd_chan2rephase, 0 ) ) + { + hPHA->p_curr_taps_fx[1] = NULL; + hPHA->p_curr_taps_fx[0] = hPHA->curr_taps_fx[0]; + p_curr_taps = hPHA->p_curr_taps_fx[0]; + + L_tmp = L_shl( 1, 8 ); + p_curr_taps[0] = W_extract_l( W_mult_32_32( L_tmp, rfft_pha_buf[0] ) ); // Q22 -> Q31 + j = sub( input_frame_pha, 1 ); + FOR( i = 1; i < hPHA->pha_len; i++ ) + { + p_curr_taps[i] = W_extract_l( W_mult_32_32( L_tmp, rfft_pha_buf[j] ) ); // Q22 -> Q31 + j = sub( j, 1 ); + } + } + ELSE + { + hPHA->p_curr_taps_fx[0] = NULL; + hPHA->p_curr_taps_fx[1] = hPHA->curr_taps_fx[1]; + Copy_Scale_sig32( rfft_pha_buf, hPHA->p_curr_taps_fx[1], hPHA->pha_len, 9 ); // Q22->Q31 + } + } + } + + IF( EQ_16( hPHA->pha_ipd_chanswitch, 1 ) ) + { + FOR( n = 0; n < CPE_CHANNELS; n++ ) + { + hPHA->p_curr_taps_fx[n] = NULL; + } + } + ELSE IF( EQ_32( hPHA->proc_pha, STEREO_DMX_EVS_PHA_IPD2 ) ) + { + /* IPDn */ + + set32_fx( &( Pr[freq_ipd_max] ), MAX_32, sub( nsbd, freq_ipd_max ) ); + set32_fx( &( Pi[freq_ipd_max] ), 0, sub( nsbd, freq_ipd_max ) ); + + FOR( n = 0; n < CPE_CHANNELS; n++ ) + { + hPHA->p_curr_taps_fx[n] = hPHA->curr_taps_fx[n]; + } + + rfft_pha_buf[0] = ONE_IN_Q22; + move32(); + rfft_pha_buf[1] = ONE_IN_Q22; + move32(); + + ild_cnt = 0; + move16(); + isd_rate = BASOP_Util_Divide1616_Scale( isd_cnt_l, freq_8k, &isd_rate_e ); + // Saturation to handle values close to 1.0f + isd_rate = shl_sat( isd_rate, isd_rate_e ); // Q15 + FOR( i = 1; i < nsbd; i++ ) + { + // rfft_pha_buf[i * 2] = (float) sqrt( ( 1.0f + Pr[i] ) / 2.0f ); + L_tmp = L_add( ONE_IN_Q30, L_shr( Pr[i], 1 ) ); + L_tmp_e = 0; + move16(); + L_tmp = Sqrt32( L_tmp, &L_tmp_e ); + rfft_pha_buf[i * 2] = L_shl_r( L_tmp, sub( L_tmp_e, 9 ) ); // Q22 + move32(); + // rfft_pha_buf[i * 2 + 1] = (float) sqrt( ( 1.0f - Pr[i] ) / 2.0f ) * sign( Pi[i] ); + L_tmp = L_sub_sat( ONE_IN_Q30, L_shr( Pr[i], 1 ) ); // saturating as Pr does not exceed 1.0f + L_tmp_e = 0; + move16(); + L_tmp = Sqrt32( L_tmp, &L_tmp_e ); + rfft_pha_buf[i * 2 + 1] = imult3216( L_shl_r( L_tmp, sub( L_tmp_e, 9 ) ), sign_fx( Pi[i] ) ); // Q22 + move32(); + IF( GT_16( isd_rate, STEREO_DMX_EVS_ISD_DIST_THRES_IPD_Q15 ) ) + { + // rfft_pha_buf[i * 2 + 1] = (float) sqrt( ( 1.0f - rfft_pha_buf[i * 2] ) / 2.0f ) * sign( rfft_pha_buf[i * 2 + 1] ); + L_tmp = L_sub( ONE_IN_Q21, L_shr( rfft_pha_buf[i * 2], 1 ) ); + L_tmp_e = 9; + move16(); + L_tmp = Sqrt32( L_tmp, &L_tmp_e ); + rfft_pha_buf[i * 2 + 1] = imult3216( L_shl_r( L_tmp, sub( L_tmp_e, 9 ) ), sign_fx( rfft_pha_buf[i * 2 + 1] ) ); // Q22 + move32(); + // rfft_pha_buf[i * 2] = (float) sqrt( ( 1.0f + rfft_pha_buf[i * 2] ) / 2.0f ); + L_tmp = L_add( ONE_IN_Q21, L_shr( rfft_pha_buf[i * 2], 1 ) ); // Q22 + L_tmp_e = 9; + move16(); + L_tmp = Sqrt32( L_tmp, &L_tmp_e ); + rfft_pha_buf[i * 2] = L_shl_r( L_tmp, sub( L_tmp_e, 9 ) ); // Q22 + move32(); + } + + // if ( ( tEr[i] > STEREO_DMX_EVS_LR_EGY * tEl[i] ) || ( tEl[i] > STEREO_DMX_EVS_LR_EGY * tEr[i] ) ) + test(); + IF( BASOP_Util_Cmp_Mant32Exp( tEr[i], tEr_e[i], Mpy_32_32_r( STEREO_DMX_EVS_LR_EGY_Q27, tEl[i] ), add( 4, tEl_e[i] ) ) > 0 || BASOP_Util_Cmp_Mant32Exp( tEl[i], tEl_e[i], Mpy_32_32_r( STEREO_DMX_EVS_LR_EGY_Q27, tEr[i] ), add( 4, tEr_e[i] ) ) > 0 ) + { + ild_cnt = add( ild_cnt, 1 ); + tEr[i] = MAX_32; + move32(); + tEr_e[i] = 0; + move16(); + } + ELSE + { + tEr[i] = MIN_32; + move32(); + tEr_e[i] = 0; + move16(); + } + } + IF( GT_16( ild_cnt, mult_r( nsbd, STEREO_DMX_EVS_ILD_PRC_Q15 ) ) ) + { + FOR( i = 1; i < nsbd; i++ ) + { + IF( tEr[i] > 0 ) + { + rfft_pha_buf[i * 2] = ONE_IN_Q22; + move32(); + rfft_pha_buf[i * 2 + 1] = 0; + move32(); + } + } + } + + rfft_fx( rfft_pha_buf, hPHA->rfft_ipd_coef_fx, input_frame_pha, +1 ); + // mvr2r( rfft_pha_buf, hPHA->p_curr_taps[1], hPHA->pha_len ); + Copy_Scale_sig32( rfft_pha_buf, hPHA->p_curr_taps_fx[1], hPHA->pha_len, 9 ); // Q22->Q31 + + /* PHA L2R */ + p_curr_taps = hPHA->p_curr_taps_fx[0]; + p_curr_taps[0] = L_shl( rfft_pha_buf[0], 9 ); // Q22->Q31 + move32(); + FOR( i = 1; i < hPHA->pha_len; i++ ) + { + p_curr_taps[i] = L_shl( rfft_pha_buf[input_frame_pha - i], 9 ); // Q22->Q31 + move32(); + } + } +#else IF( EQ_32( hPHA->curr_pha, STEREO_DMX_EVS_PHA_IPD ) ) { hPHA->p_curr_taps_fx[0] = NULL; @@ -1008,6 +1407,7 @@ static void calc_poc_fx( } } } +#endif FOR( n = 0; n < CPE_CHANNELS; n++ ) { @@ -1536,7 +1936,11 @@ static void weighted_ave_fx( Word16 i, len; Word32 gain_tmp_fx = 0, gain_sub_fx; move32(); +#ifdef NONBE_FIX_947_STEREO_DMX_EVS_POC + len = shr( input_frame, 1 ); +#else len = shr( input_frame, 4 ); +#endif gain_sub_fx = L_sub( gain_fx, old_gain_fx ); FOR( i = 0; i < len; i++ ) { @@ -1552,6 +1956,61 @@ static void weighted_ave_fx( return; } + +#ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA +/*-------------------------------------------------------------------* + * spectral_flatness_fx() + * + * computes spectral flatness SF + * SF(x) = exp(mean_i(ln(x_i))) / mean_i(x_i) + *-------------------------------------------------------------------*/ +static Word32 spectral_flatness_fx( + const Word32 *sig_fx, /* i : input signal (mantissa) */ + const Word16 *sig_fx_e, /* i : input signal (exponent) */ + const Word16 sig_length /* i : input signal length */ +) +{ + Word32 L_geoMean, L_ariMean, L_tmp; + Word16 i, geoMean, ariMean, geoMean_e, ariMean_e, L_tmp_e, sf; + + L_geoMean = 0; + geoMean_e = 0; + L_ariMean = 0; + ariMean_e = 0; + + IF( sig_fx_e == NULL ) + { + FOR( i = 0; i < sig_length; i++ ) + { + L_tmp = BASOP_Util_Add_Mant32Exp( L_abs( sig_fx[i] ), 0, EPSILON_FX_M, EPSILON_FX_E, &L_tmp_e ); + L_ariMean = BASOP_Util_Add_Mant32Exp( L_ariMean, ariMean_e, L_tmp, L_tmp_e, &ariMean_e ); + L_geoMean = BASOP_Util_Add_Mant32Exp( L_geoMean, geoMean_e, BASOP_Util_Loge( L_tmp, L_tmp_e ), 6, &geoMean_e ); // +6 : compensate result of log /64 + } + } + ELSE + { + FOR( i = 0; i < sig_length; i++ ) + { + L_tmp = BASOP_Util_Add_Mant32Exp( L_abs( sig_fx[i] ), sig_fx_e[i], EPSILON_FX_M, EPSILON_FX_E, &L_tmp_e ); + L_ariMean = BASOP_Util_Add_Mant32Exp( L_ariMean, ariMean_e, L_tmp, L_tmp_e, &ariMean_e ); + L_geoMean = BASOP_Util_Add_Mant32Exp( L_geoMean, geoMean_e, BASOP_Util_Loge( L_tmp, L_tmp_e ), 6, &geoMean_e ); // +6 : compensate result of log /64 + } + } + + ariMean = BASOP_Util_Divide3216_Scale( L_ariMean, sig_length, &L_tmp_e ); + ariMean_e = add( sub( ariMean_e, Q15 ), L_tmp_e ); // (Q16)-1 : compensate result of division + + geoMean = BASOP_Util_Divide3216_Scale( L_geoMean, sig_length, &L_tmp_e ); + geoMean_e = add( sub( geoMean_e, Q15 ), L_tmp_e ); // (Q16)-1 : compensate result of division + geoMean = extract_h( BASOP_Util_fPow( (Word32) 1459366444, (Word16) 2, L_deposit_h( geoMean ), geoMean_e, &geoMean_e ) ); /* e=2,718281828459045 */ + + sf = BASOP_Util_Divide1616_Scale( geoMean, ariMean, &L_tmp_e ); + L_tmp_e = add( sub( geoMean_e, ariMean_e ), L_tmp_e ); + + return L_shl_sat( L_deposit_h( sf ), L_tmp_e ); +} +#endif + /*-------------------------------------------------------------------* * calc_energy() * @@ -1633,28 +2092,71 @@ static void calc_energy_fx( return; } +#ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA /*-------------------------------------------------------------------* - * adapt_gain() + * calc_energy_sgc() * - * adapt gain to the signal + * calculate energy for switch gain control *-------------------------------------------------------------------*/ -static void adapt_gain_fx( - const Word32 src_fx[], /* i : input signal Q16 */ - Word32 dst_fx[], /* o : output signal Q16 */ - const Word32 gain_fx, /* i : adapting gain Q31*/ - const Word32 old_gain_fx, /* i : adapting prev gain Q31*/ - const Word16 input_frame, /* i : input frame length per channel */ - const Word32 wnd_fx[] /* i : window coef Q31 */ +static void calc_energy_sgc( + const Word32 src[], /* i : input signal */ + Word32 *energy, /* i/o : calculated energy (mantissa) */ + Word16 *energy_e, /* i/o : calculated energy (exponent) */ + const Word16 input_frame, /* i : input frame length */ + const Word16 ratio /* i : adapting ratio */ ) { - Word16 i, len; - Word32 gain_tmp_fx, gain_sub_fx; - - len = shr( input_frame, 4 ); - // gain_sub = gain - old_gain; - gain_sub_fx = L_sub( gain_fx, old_gain_fx ); // Q31 + Word16 i, l_tmp_e, l_energy_e; + Word32 l_energy; + Word64 w_tmp; - FOR( i = 0; i < len; i++ ) + l_energy = 0; + l_energy_e = 0; + FOR( i = 0; i < input_frame; i++ ) + { + w_tmp = W_mult0_32_32( src[i], src[i] ); + l_tmp_e = W_norm( w_tmp ); + IF( l_tmp_e != 0 ) + { + w_tmp = W_shl( w_tmp, l_tmp_e ); + } + l_energy = BASOP_Util_Add_Mant32Exp( l_energy, l_energy_e, W_round64_L( w_tmp ), sub( 32, l_tmp_e ), &l_energy_e ); // Q(2x26 - l_energy_e) + } + + *energy = BASOP_Util_Add_Mant32Exp( Mpy_32_16_1( *energy, ratio ), *energy_e, Mpy_32_16_1( l_energy, sub( MAX_16, ratio ) ), l_energy_e, energy_e ); + move32(); + + return; +} +#endif + +/*-------------------------------------------------------------------* + * adapt_gain() + * + * adapt gain to the signal + *-------------------------------------------------------------------*/ +static void adapt_gain_fx( + const Word32 src_fx[], /* i : input signal Q16 */ + Word32 dst_fx[], /* o : output signal Q16 */ + const Word32 gain_fx, /* i : adapting gain Q31*/ + const Word32 old_gain_fx, /* i : adapting prev gain Q31*/ + const Word16 input_frame, /* i : input frame length per channel */ + const Word32 wnd_fx[] /* i : window coef Q31 */ +) +{ + Word16 i, len; + Word32 gain_tmp_fx, gain_sub_fx; + +#ifdef NONBE_FIX_947_STEREO_DMX_EVS_POC + len = shr( input_frame, 1 ); +#else + len = shr( input_frame, 4 ); +#endif + + // gain_sub = gain - old_gain; + gain_sub_fx = L_sub( gain_fx, old_gain_fx ); // Q31 + + FOR( i = 0; i < len; i++ ) { // gain_tmp = old_gain + gain_sub * wnd[i]; gain_tmp_fx = L_add( old_gain_fx, Mpy_32_32( gain_sub_fx, wnd_fx[i] ) ); // Q31 // dst[i] = src[i] * gain_tmp; @@ -1764,6 +2266,52 @@ static void create_M_signal_fx( return; } +#ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA +/*-------------------------------------------------------------------* + * apply_gain_sgc() + * + * Apply gain for switching + *-------------------------------------------------------------------*/ + +static void apply_gain_sgc( + Word32 data[], /* i/o : input signal */ + Word32 *gain, /* i : gain */ + const Word16 input_frame /* i : input frame length */ +) +{ + Word16 n; + Word32 lr; + Word64 W_tmp; + + IF( GT_32( *gain, STEREO_DMX_EVS_SGC_GH ) ) + { + lr = STEREO_DMX_EVS_SGC_GIR_S; + move32(); + } + ELSE IF( LT_32( *gain, STEREO_DMX_EVS_SGC_GL ) ) + { + lr = STEREO_DMX_EVS_SGC_GR_S; + move32(); + } + ELSE + { + return; + } + + FOR( n = 0; n < input_frame; n++ ) + { + W_tmp = W_mult_32_32( data[n], *gain ); + W_tmp = W_shr( W_tmp, 16 ); + data[n] = W_extract_l( W_tmp ); + } + + W_tmp = W_mult_32_32( *gain, lr ); + *gain = W_shr( W_tmp, 16 ); + + return; +} +#endif + /*-------------------------------------------------------------------* * stereo_dmx_evs_enc() * @@ -1777,6 +2325,459 @@ void stereo_dmx_evs_enc_fx( const bool is_binaural /* i : indication that input is binaural audio */ ) { +#ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA + Word16 n; + Word16 dmx_weight, corr; // Q15 + Word32 data_fx[CPE_CHANNELS][L_FRAME48k]; // Q16/Q11 + + Word16 k, m, pha_len, fad_len; + Word32 mem_prev[STEREO_DMX_EVS_FAD_LEN_MAX], data_mem[STEREO_DMX_EVS_DATA_LEN_MAX]; // Q11 + Word32 *p_data_mem, *p_prev_taps, *p_curr_taps, *fad_g, *p_data; + + Word32 dmx_poc_data[L_FRAME48k] /*Q11*/, dmx_pha_data[L_FRAME48k] /*Q11*/, *p_dmx_data, fx_tmp, *p_dmx_data_fo; + Word16 n_fad_r, n_fad_g, m_fad_g, n_fad_cnt; + + STEREO_DMX_EVS_PRC prev_prc; + Word16 input_subframe, is_transient, dmx_gain_sgc; + Word32 *p_sub_frame, subframe_energy[STEREO_DMX_EVS_NB_SBFRM]; + Word16 subframe_energy_e[STEREO_DMX_EVS_NB_SBFRM]; + + Word16 input_frame; + + Word32 L_tmp1, L_tmp2; + Word16 L_tmp1_e, L_tmp2_e; + + Word64 W_tmp; + Word16 W_tmp_q; + + if ( is_binaural ) + { + /* use of is_binaural flag is to be considered */ + } + + // input_frame = (int16_t) ( input_Fs / FRAMES_PER_SEC ); + SWITCH( input_Fs ) + { + case 8000: + input_frame = 160; + BREAK; + case 16000: + input_frame = 320; + BREAK; + case 32000: + input_frame = 640; + BREAK; + case 48000: + input_frame = 960; + BREAK; + default: + input_frame = 960; + IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "invalid sample rate\n" ); + BREAK; + } + move16(); + + FOR( n = 0; n < input_frame; n++ ) + { + data_fx[0][n] = L_deposit_h( data[2 * n] ); + move32(); + data_fx[1][n] = L_deposit_h( data[2 * n + 1] ); + move32(); + } + IF( LT_16( n_samples, input_frame ) ) + { + set32_fx( data_fx[0] + n_samples, 0, sub( input_frame, n_samples ) ); + set32_fx( data_fx[1] + n_samples, 0, sub( input_frame, n_samples ) ); + } + + // input_subframe = n_samples / STEREO_DMX_EVS_NB_SBFRM; + IF( EQ_16( n_samples, L_FRAME16k ) ) + { + input_subframe = 64; + move16(); + } + ELSE IF( EQ_16( n_samples, L_FRAME32k ) ) + { + input_subframe = 128; + move16(); + } + ELSE IF( EQ_16( n_samples, L_FRAME48k ) ) + { + input_subframe = 192; + move16(); + } + ELSE + { + input_subframe = 192; + move16(); + IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "invalid frame length\n" ); + } + + is_transient = 0; + move16(); + FOR( k = 0; k < CPE_CHANNELS; k++ ) + { + fx_tmp = 0; + move32(); + FOR( m = 0; m < STEREO_DMX_EVS_NB_SBFRM; m++ ) + { + p_sub_frame = &( data_fx[k][m * input_subframe] ); + subframe_energy[m] = 0; + move32(); + subframe_energy_e[m] = 0; + move16(); + FOR( n = 0; n < input_subframe; n++ ) + { + // subframe_energy[m] += p_sub_frame[n] * p_sub_frame[n]; + W_tmp = W_mult_32_32( p_sub_frame[n], p_sub_frame[n] ); + W_tmp_q = W_norm( W_tmp ); + W_tmp = W_shl( W_tmp, W_tmp_q ); + L_tmp1 = W_extract_h( W_tmp ); // Q(31-(30-W_tmp_q)) + L_tmp1_e = sub( 15 * 2, W_tmp_q ); + subframe_energy[m] = BASOP_Util_Add_Mant32Exp( subframe_energy[m], subframe_energy_e[m], L_tmp1, L_tmp1_e, &subframe_energy_e[m] ); + move32(); + } + + L_tmp1 = BASOP_Util_Add_Mant32Exp( hStereoDmxEVS->hPHA->trns_aux_energy_fx[k], hStereoDmxEVS->hPHA->trns_aux_energy_fx_e[k], EPSILON_FX_M, EPSILON_FX_E, &L_tmp1_e ); + L_tmp2 = BASOP_Util_Divide3232_Scale_cadence( subframe_energy[m], L_tmp1, &L_tmp2_e ); + L_tmp2_e = add( L_tmp2_e, sub( subframe_energy_e[m], L_tmp1_e ) ); + // if ( subframe_energy[m] / ( hStereoDmxEVS->hPHA->trns_aux_energy[k] + EPSILON ) > hStereoDmxEVS->hPHA->crst_fctr ) + if ( BASOP_Util_Cmp_Mant32Exp( L_tmp2, L_tmp2_e, hStereoDmxEVS->hPHA->crst_fctr_fx, 31 ) > 0 ) + { + is_transient = 1; + move16(); + } + + // hStereoDmxEVS->hPHA->trns_aux_energy[k] = STEREO_DMX_EVS_TRNS_EGY_FORGETTING * hStereoDmxEVS->hPHA->trns_aux_energy[k] + ( 1.0f - STEREO_DMX_EVS_TRNS_EGY_FORGETTING ) * subframe_energy[m]; + hStereoDmxEVS->hPHA->trns_aux_energy_fx[k] = BASOP_Util_Add_Mant32Exp( Mpy_32_16_1( hStereoDmxEVS->hPHA->trns_aux_energy_fx[k], STEREO_DMX_EVS_TRNS_EGY_FORGETTING_Q15 ), hStereoDmxEVS->hPHA->trns_aux_energy_fx_e[k], Mpy_32_16_1( subframe_energy[m], sub( MAX_16, STEREO_DMX_EVS_TRNS_EGY_FORGETTING_Q15 ) ), subframe_energy_e[m], &hStereoDmxEVS->hPHA->trns_aux_energy_fx_e[k] ); + move32(); + } + + FOR( m = 1; m < STEREO_DMX_EVS_NB_SBFRM; m++ ) + { + L_tmp1 = BASOP_Util_Add_Mant32Exp( subframe_energy[m - 1], subframe_energy_e[m - 1], EPSILON_FX_M, EPSILON_FX_E, &L_tmp1_e ); + L_tmp2 = BASOP_Util_Divide3232_Scale_cadence( subframe_energy[m], L_tmp1, &L_tmp2_e ); + L_tmp2_e = add( L_tmp2_e, sub( subframe_energy_e[m], L_tmp1_e ) ); + // if ( subframe_energy[m] / ( subframe_energy[m - 1] + EPSILON ) > STEREO_DMX_EVS_TRNS_DTC_INST ) + if ( BASOP_Util_Cmp_Mant32Exp( L_tmp2, L_tmp2_e, STEREO_DMX_EVS_TRNS_DTC_INST_Q0, 31 ) > 0 ) + { + is_transient = 1; + move16(); + } + } + } + + estimate_itd_fx( &corr, hStereoDmxEVS->hPOC, hStereoDmxEVS->hPHA, data_fx[0], data_fx[1], &hStereoDmxEVS->itd_fx, input_frame ); + + /* poc */ + + IF( hStereoDmxEVS->itd_fx ) + { + // dmx_weight = ( ( hStereoDmxEVS->itd > 0 ) ? ( -1 ) : 1 ) * 0.5f * corr + 0.5f; + IF( hStereoDmxEVS->itd_fx > 0 ) + { + dmx_weight = add( negate( shr( corr, 1 ) ), ONE_IN_Q14 ); + } + ELSE + { + dmx_weight = add( shr( corr, 1 ), ONE_IN_Q14 ); + } + } + ELSE + { + dmx_weight = ONE_IN_Q14; + move16(); + } + + create_M_signal_fx( data_fx[0], data_fx[1], dmx_poc_data, L_deposit_h( dmx_weight ), input_frame, hStereoDmxEVS->s_wnd_fx, + hStereoDmxEVS->dmx_weight_fx, hStereoDmxEVS->pre_dmx_energy_fx, hStereoDmxEVS->pre_dmx_energy_fx_e, hStereoDmxEVS->aux_dmx_energy_fx, hStereoDmxEVS->aux_dmx_energy_fx_e ); + + // Downscaling signals to avoid accumulation overflows + scale_sig32( data_fx[0], input_frame, -5 ); // Q31->Q26 + scale_sig32( data_fx[1], input_frame, -5 ); // Q31->Q26 + scale_sig32( dmx_poc_data, input_frame, -5 ); // Q31->Q26 + + /* pha */ + + pha_len = hStereoDmxEVS->hPHA->pha_len; + move16(); + fad_len = hStereoDmxEVS->hPHA->fad_len; + move16(); + fad_g = hStereoDmxEVS->hPHA->fad_g_fx; + + set_zero_fx( dmx_pha_data, n_samples ); + set_zero_fx( mem_prev, fad_len ); + + FOR( k = 0; k < CPE_CHANNELS; k++ ) + { + p_data = data_fx[k]; + Copy32( hStereoDmxEVS->hPHA->data_mem_fx[k], data_mem, pha_len ); + Copy32( &( p_data[n_samples - pha_len] ), hStereoDmxEVS->hPHA->data_mem_fx[k], pha_len ); + p_data_mem = &( data_mem[pha_len] ); + Copy32( p_data, p_data_mem, n_samples ); + + p_prev_taps = hStereoDmxEVS->hPHA->p_prev_taps_fx[k]; + IF( p_prev_taps ) + { + FOR( n = 0; n < fad_len; n++ ) + { + FOR( ( fx_tmp = 0, m = 0 ); m < pha_len; m++ ) + { + // ftmp += p_data_mem[n - m] * p_prev_taps[m]; + fx_tmp = L_add( fx_tmp, Mpy_32_32( p_data_mem[n - m], p_prev_taps[m] ) ); // Q25 + } + fx_tmp = L_shl( fx_tmp, 1 ); // Q26 + mem_prev[n] = L_add( mem_prev[n], Mpy_32_32( fx_tmp, INV_SQRT_2_Q31 ) ); + move32(); + } + } + ELSE + { + FOR( n = 0; n < fad_len; n++ ) + { + // mem_prev[n] += p_data[n] * INV_SQRT_2; + mem_prev[n] = L_add( mem_prev[n], Mpy_32_32( p_data[n], INV_SQRT_2_Q31 ) ); // Q26 + move32(); + } + } + + p_curr_taps = hStereoDmxEVS->hPHA->p_curr_taps_fx[k]; + IF( p_curr_taps ) + { + FOR( n = 0; n < n_samples; n++ ) + { + FOR( ( fx_tmp = 0, m = 0 ); m < pha_len; m++ ) + { + // ftmp += p_data_mem[n - m] * p_curr_taps[m]; + fx_tmp = L_add( fx_tmp, Mpy_32_32( p_data_mem[n - m], p_curr_taps[m] ) ); // Q25 + } + fx_tmp = L_shl( fx_tmp, 1 ); // Q26 + // dmx_pha_data[n] += ftmp * INV_SQRT_2; + dmx_pha_data[n] = L_add( dmx_pha_data[n], Mpy_32_32( fx_tmp, INV_SQRT_2_Q31 ) ); // Q26 + move32(); + } + } + ELSE + { + FOR( n = 0; n < n_samples; n++ ) + { + // dmx_pha_data[n] += p_data[n] * INV_SQRT_2; + dmx_pha_data[n] = L_add( dmx_pha_data[n], Mpy_32_32( p_data[n], INV_SQRT_2_Q31 ) ); // Q26 + move32(); + } + } + } + + FOR( ( n = 0, m = ( fad_len - 1 ) ); n < fad_len; ( n++, m-- ) ) + { + dmx_pha_data[n] = Mpy_32_32( dmx_pha_data[n], fad_g[n] ); + move32(); + dmx_pha_data[n] = L_add( dmx_pha_data[n], Mpy_32_32( mem_prev[n], fad_g[m] ) ); // Q26 + move32(); + } + + /* prc switch */ + + prev_prc = hStereoDmxEVS->hPHA->curr_prc; + move32(); + // if ( abs( (int16_t) hStereoDmxEVS->itd ) > hStereoDmxEVS->hPHA->prc_thres ) + IF( GT_16( abs_s( hStereoDmxEVS->itd_fx ), hStereoDmxEVS->hPHA->prc_thres ) ) + { + IF( NE_32( hStereoDmxEVS->hPHA->curr_prc, STEREO_DMX_EVS_PRC_POC ) ) + { + IF( EQ_32( hStereoDmxEVS->hPHA->prev_prc, STEREO_DMX_EVS_PRC_POC ) ) + { + hStereoDmxEVS->hPHA->prc_hys_cnt = add( hStereoDmxEVS->hPHA->prc_hys_cnt, 1 ); + move16(); + } + ELSE + { + hStereoDmxEVS->hPHA->prc_hys_cnt = 0; + move16(); + } + + if ( GE_16( hStereoDmxEVS->hPHA->prc_hys_cnt, STEREO_DMX_EVS_SWTCH_PRC_HYS_THRES ) ) + { + hStereoDmxEVS->hPHA->curr_prc = STEREO_DMX_EVS_PRC_POC; + move32(); + } + } + hStereoDmxEVS->hPHA->prev_prc = STEREO_DMX_EVS_PRC_POC; + move32(); + } + ELSE + { + IF( NE_32( hStereoDmxEVS->hPHA->curr_prc, STEREO_DMX_EVS_PRC_PHA ) ) + { + IF( EQ_32( hStereoDmxEVS->hPHA->prev_prc, STEREO_DMX_EVS_PRC_PHA ) ) + { + hStereoDmxEVS->hPHA->prc_hys_cnt = add( hStereoDmxEVS->hPHA->prc_hys_cnt, 1 ); + move16(); + } + ELSE + { + hStereoDmxEVS->hPHA->prc_hys_cnt = 0; + move16(); + } + + if ( GE_16( hStereoDmxEVS->hPHA->prc_hys_cnt, STEREO_DMX_EVS_SWTCH_PRC_HYS_THRES ) ) + { + hStereoDmxEVS->hPHA->curr_prc = STEREO_DMX_EVS_PRC_PHA; + move32(); + } + } + hStereoDmxEVS->hPHA->prev_prc = STEREO_DMX_EVS_PRC_PHA; + move32(); + } + + // if ( ( is_transient == 1 ) || ( hStereoDmxEVS->aux_dmx_energy[0] > STEREO_DMX_EVS_ILDS_EGY * hStereoDmxEVS->aux_dmx_energy[1] ) || ( hStereoDmxEVS->aux_dmx_energy[1] > STEREO_DMX_EVS_ILDS_EGY * hStereoDmxEVS->aux_dmx_energy[0] ) || ( ( hStereoDmxEVS->hPHA->p_curr_taps[0] == NULL ) && ( hStereoDmxEVS->hPHA->p_curr_taps[1] == NULL ) ) ) + test(); + test(); + test(); + test(); + IF( EQ_16( is_transient, 1 ) || + BASOP_Util_Cmp_Mant32Exp( hStereoDmxEVS->aux_dmx_energy_fx[0], hStereoDmxEVS->aux_dmx_energy_fx_e[0], Mpy_32_32( STEREO_DMX_EVS_ILDS_EGY_Q17, hStereoDmxEVS->aux_dmx_energy_fx[1] ), add( hStereoDmxEVS->aux_dmx_energy_fx_e[1], 14 ) ) > 0 || + BASOP_Util_Cmp_Mant32Exp( hStereoDmxEVS->aux_dmx_energy_fx[1], hStereoDmxEVS->aux_dmx_energy_fx_e[1], Mpy_32_32( STEREO_DMX_EVS_ILDS_EGY_Q17, hStereoDmxEVS->aux_dmx_energy_fx[0] ), add( hStereoDmxEVS->aux_dmx_energy_fx_e[0], 14 ) ) > 0 || + EQ_16( hStereoDmxEVS->hPHA->force_poc, TRUE ) ) + { + hStereoDmxEVS->hPHA->curr_prc = STEREO_DMX_EVS_PRC_POC; + move32(); + hStereoDmxEVS->hPHA->prc_hys_cnt = 0; + move16(); + } + + calc_energy_sgc( dmx_poc_data, &( hStereoDmxEVS->hPHA->dmx_poc_ener_fx ), &( hStereoDmxEVS->hPHA->dmx_poc_ener_fx_e ), n_samples, STEREO_DMX_EVS_SGC_EGY_FORGETTING_Q15 ); + calc_energy_sgc( dmx_pha_data, &( hStereoDmxEVS->hPHA->dmx_pha_ener_fx ), &( hStereoDmxEVS->hPHA->dmx_pha_ener_fx_e ), n_samples, STEREO_DMX_EVS_SGC_EGY_FORGETTING_Q15 ); + + IF( NE_32( prev_prc, hStereoDmxEVS->hPHA->curr_prc ) && EQ_16( is_transient, 0 ) && !( ( BASOP_Util_Cmp_Mant32Exp( hStereoDmxEVS->hPHA->dmx_pha_ener_fx, hStereoDmxEVS->hPHA->dmx_pha_ener_fx_e, hStereoDmxEVS->hPHA->low_egy_thres_sgc, hStereoDmxEVS->hPHA->low_egy_thres_sgc_e ) < 0 ) && ( BASOP_Util_Cmp_Mant32Exp( hStereoDmxEVS->hPHA->dmx_poc_ener_fx, hStereoDmxEVS->hPHA->dmx_poc_ener_fx_e, hStereoDmxEVS->hPHA->low_egy_thres_sgc, hStereoDmxEVS->hPHA->low_egy_thres_sgc_e ) < 0 ) ) ) + { + IF( EQ_32( hStereoDmxEVS->hPHA->curr_prc, STEREO_DMX_EVS_PRC_POC ) ) + { + apply_gain_sgc( dmx_pha_data, &( hStereoDmxEVS->hPHA->dmx_pha_gain_sgc_fx ), n_samples ); + calc_energy_sgc( dmx_pha_data, &( hStereoDmxEVS->hPHA->dmx_pha_ener_sgc_fx ), &( hStereoDmxEVS->hPHA->dmx_pha_ener_sgc_fx_e ), n_samples, STEREO_DMX_EVS_SGC_EGY_FORGETTING_Q15 ); + + L_tmp1 = BASOP_Util_Add_Mant32Exp( hStereoDmxEVS->hPHA->dmx_poc_ener_fx, hStereoDmxEVS->hPHA->dmx_poc_ener_fx_e, EPSILON_FX_M, EPSILON_FX_E, &L_tmp1_e ); + BASOP_Util_Divide_MantExp( extract_h( hStereoDmxEVS->hPHA->dmx_pha_ener_sgc_fx ), hStereoDmxEVS->hPHA->dmx_pha_ener_sgc_fx_e, extract_h( L_tmp1 ), L_tmp1_e, &dmx_gain_sgc, &L_tmp2_e ); + dmx_gain_sgc = Sqrt16( dmx_gain_sgc, &L_tmp2_e ); + hStereoDmxEVS->hPHA->dmx_poc_gain_sgc_fx = L_shl( L_deposit_l( dmx_gain_sgc ), L_tmp2_e ); // Q15 + hStereoDmxEVS->hPHA->dmx_poc_gain_sgc_fx = L_min( hStereoDmxEVS->hPHA->dmx_poc_gain_sgc_fx, STEREO_DMX_EVS_SGC_GMAX ); + hStereoDmxEVS->hPHA->dmx_poc_gain_sgc_fx = L_max( hStereoDmxEVS->hPHA->dmx_poc_gain_sgc_fx, STEREO_DMX_EVS_SGC_GMIN ); + + apply_gain_sgc( dmx_poc_data, &( hStereoDmxEVS->hPHA->dmx_poc_gain_sgc_fx ), n_samples ); + calc_energy_sgc( dmx_poc_data, &( hStereoDmxEVS->hPHA->dmx_poc_ener_sgc_fx ), &( hStereoDmxEVS->hPHA->dmx_poc_ener_sgc_fx_e ), n_samples, STEREO_DMX_EVS_SGC_EGY_FORGETTING_Q15 ); + } + ELSE + { + apply_gain_sgc( dmx_poc_data, &( hStereoDmxEVS->hPHA->dmx_poc_gain_sgc_fx ), n_samples ); + calc_energy_sgc( dmx_poc_data, &( hStereoDmxEVS->hPHA->dmx_poc_ener_sgc_fx ), &( hStereoDmxEVS->hPHA->dmx_poc_ener_sgc_fx_e ), n_samples, STEREO_DMX_EVS_SGC_EGY_FORGETTING_Q15 ); + + L_tmp1 = BASOP_Util_Add_Mant32Exp( hStereoDmxEVS->hPHA->dmx_pha_ener_fx, hStereoDmxEVS->hPHA->dmx_pha_ener_fx_e, EPSILON_FX_M, EPSILON_FX_E, &L_tmp1_e ); + BASOP_Util_Divide_MantExp( extract_h( hStereoDmxEVS->hPHA->dmx_poc_ener_sgc_fx ), hStereoDmxEVS->hPHA->dmx_poc_ener_sgc_fx_e, extract_h( L_tmp1 ), L_tmp1_e, &dmx_gain_sgc, &L_tmp2_e ); + dmx_gain_sgc = Sqrt16( dmx_gain_sgc, &L_tmp2_e ); + hStereoDmxEVS->hPHA->dmx_pha_gain_sgc_fx = L_shl( L_deposit_l( dmx_gain_sgc ), L_tmp2_e ); // Q15 + hStereoDmxEVS->hPHA->dmx_pha_gain_sgc_fx = L_min( hStereoDmxEVS->hPHA->dmx_pha_gain_sgc_fx, STEREO_DMX_EVS_SGC_GMAX ); + hStereoDmxEVS->hPHA->dmx_pha_gain_sgc_fx = L_max( hStereoDmxEVS->hPHA->dmx_pha_gain_sgc_fx, STEREO_DMX_EVS_SGC_GMIN ); + + apply_gain_sgc( dmx_pha_data, &( hStereoDmxEVS->hPHA->dmx_pha_gain_sgc_fx ), n_samples ); + calc_energy_sgc( dmx_pha_data, &( hStereoDmxEVS->hPHA->dmx_pha_ener_sgc_fx ), &( hStereoDmxEVS->hPHA->dmx_pha_ener_sgc_fx_e ), n_samples, STEREO_DMX_EVS_SGC_EGY_FORGETTING_Q15 ); + } + } + ELSE + { + apply_gain_sgc( dmx_poc_data, &( hStereoDmxEVS->hPHA->dmx_poc_gain_sgc_fx ), n_samples ); + calc_energy_sgc( dmx_poc_data, &( hStereoDmxEVS->hPHA->dmx_poc_ener_sgc_fx ), &( hStereoDmxEVS->hPHA->dmx_poc_ener_sgc_fx_e ), n_samples, STEREO_DMX_EVS_SGC_EGY_FORGETTING_Q15 ); + + apply_gain_sgc( dmx_pha_data, &( hStereoDmxEVS->hPHA->dmx_pha_gain_sgc_fx ), n_samples ); + calc_energy_sgc( dmx_pha_data, &( hStereoDmxEVS->hPHA->dmx_pha_ener_sgc_fx ), &( hStereoDmxEVS->hPHA->dmx_pha_ener_sgc_fx_e ), n_samples, STEREO_DMX_EVS_SGC_EGY_FORGETTING_Q15 ); + } + + IF( EQ_32( hStereoDmxEVS->hPHA->curr_prc, STEREO_DMX_EVS_PRC_POC ) ) + { + p_dmx_data = dmx_poc_data; + p_dmx_data_fo = dmx_pha_data; + } + ELSE + { + p_dmx_data = dmx_pha_data; + p_dmx_data_fo = dmx_poc_data; + } + + IF( EQ_16( is_transient, 1 ) ) + { + n_fad_r = 1; + move16(); + } + ELSE + { + n_fad_r = STEREO_DMX_EVS_FAD_R; + move16(); + } + + IF( NE_32( prev_prc, hStereoDmxEVS->hPHA->curr_prc ) ) + { + IF( EQ_16( hStereoDmxEVS->hPHA->n_fad_g, input_frame ) ) + { + hStereoDmxEVS->hPHA->n_fad_g = 0; + hStereoDmxEVS->hPHA->n_fad_cnt = 0; + move16(); + move16(); + } + ELSE + { + hStereoDmxEVS->hPHA->n_fad_g = sub( input_frame, add( hStereoDmxEVS->hPHA->n_fad_g, 1 ) ); + IF( EQ_16( is_transient, 1 ) ) + { + hStereoDmxEVS->hPHA->n_fad_cnt = 0; + move16(); + } + ELSE + { + hStereoDmxEVS->hPHA->n_fad_cnt = sub( n_fad_r, hStereoDmxEVS->hPHA->n_fad_cnt ); + } + } + } + ELSE IF( is_transient ) + { + hStereoDmxEVS->hPHA->n_fad_cnt = 0; + move16(); + } + + fad_len = s_min( n_samples, sub( mult0( input_frame, n_fad_r ), add( mult0( hStereoDmxEVS->hPHA->n_fad_g, n_fad_r ), hStereoDmxEVS->hPHA->n_fad_cnt ) ) ); + + IF( NE_16( fad_len, 0 ) ) + { + fad_g = hStereoDmxEVS->hPHA->fad_g_prc_fx; + move32(); + n_fad_g = hStereoDmxEVS->hPHA->n_fad_g; + n_fad_cnt = hStereoDmxEVS->hPHA->n_fad_cnt; + move16(); + move16(); + m_fad_g = sub( input_frame, add( n_fad_g, 1 ) ); + + FOR( n = 0; n < fad_len; n++ ) + { + p_dmx_data[n] = Mpy_32_32( p_dmx_data[n], fad_g[n_fad_g] ); // Q26; + p_dmx_data[n] = L_add_sat( p_dmx_data[n], Mpy_32_32( fad_g[m_fad_g], p_dmx_data_fo[n] ) ); // Q26 + + n_fad_cnt = add( n_fad_cnt, 1 ); + IF( GE_16( n_fad_cnt, n_fad_r ) ) + { + n_fad_cnt = 0; + move16(); + n_fad_g = add( n_fad_g, 1 ); + m_fad_g = sub( m_fad_g, 1 ); + } + } + + hStereoDmxEVS->hPHA->n_fad_g = n_fad_g; + hStereoDmxEVS->hPHA->n_fad_cnt = n_fad_cnt; + move16(); + move16(); + } + + Copy_Scale_sig32_16( p_dmx_data, data, n_samples, 5 ); // Q26->Q15 + +#else Word16 n; Word16 dmx_weight, corr; // Q15 Word32 data_fx[CPE_CHANNELS][L_FRAME48k]; // Q16/Q11 @@ -2149,6 +3150,7 @@ void stereo_dmx_evs_enc_fx( } Copy_Scale_sig32_16( p_dmx_data, data, n_samples, 5 ); // Q26->Q15 +#endif return; } @@ -2359,6 +3361,12 @@ ivas_error stereo_dmx_evs_init_encoder_fx( move16(); hStereoDmxEVS->hPHA->crst_fctr_fx = STEREO_DMX_EVS_CRST_FCTR_16_Q0; move32(); +#ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA + hStereoDmxEVS->hPHA->low_egy_thres_sgc = STEREO_DMX_EVS_SGC_LEGY_THRES_16; + hStereoDmxEVS->hPHA->low_egy_thres_sgc_e = STEREO_DMX_EVS_SGC_LEGY_THRES_E; + move32(); + move16(); +#endif } ELSE IF( EQ_32( input_Fs, 32000 ) ) { @@ -2370,6 +3378,12 @@ ivas_error stereo_dmx_evs_init_encoder_fx( move16(); hStereoDmxEVS->hPHA->crst_fctr_fx = STEREO_DMX_EVS_CRST_FCTR_32_Q0; move32(); +#ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA + hStereoDmxEVS->hPHA->low_egy_thres_sgc = STEREO_DMX_EVS_SGC_LEGY_THRES_32; + hStereoDmxEVS->hPHA->low_egy_thres_sgc_e = STEREO_DMX_EVS_SGC_LEGY_THRES_E; + move32(); + move16(); +#endif } ELSE IF( EQ_32( input_Fs, 48000 ) ) { @@ -2381,6 +3395,12 @@ ivas_error stereo_dmx_evs_init_encoder_fx( move16(); hStereoDmxEVS->hPHA->crst_fctr_fx = STEREO_DMX_EVS_CRST_FCTR_48_Q0; move32(); +#ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA + hStereoDmxEVS->hPHA->low_egy_thres_sgc = STEREO_DMX_EVS_SGC_LEGY_THRES_48; + hStereoDmxEVS->hPHA->low_egy_thres_sgc_e = STEREO_DMX_EVS_SGC_LEGY_THRES_E; + move32(); + move16(); +#endif } ELSE { @@ -2389,8 +3409,10 @@ ivas_error stereo_dmx_evs_init_encoder_fx( hStereoDmxEVS->hPHA->pha_len = shr( len, 1 ); move16(); +#ifndef NONBE_FIX_947_STEREO_DMX_EVS_PHA hStereoDmxEVS->hPHA->init_frmCntr = 10; // (int16_t)(FRAMES_PER_SEC * 0.2f) move16(); +#endif hStereoDmxEVS->hPHA->isd_rate_s_fx = 0; move32(); hStereoDmxEVS->hPHA->iccr_s_fx = 0; @@ -2442,23 +3464,25 @@ ivas_error stereo_dmx_evs_init_encoder_fx( ipd_ff = hStereoDmxEVS->hPHA->ipd_ff_fx; Copy32( ipd_ff_Q31, ipd_ff, STEREO_DMX_EVS_NB_SUBBAND_MAX ); - // a_min = 0.8576958985908941f; - // a_max = 0.9440608762859234f; - // itrh = (int16_t)((3000 * input_frame) / (input_Fs * STEREO_DMX_EVS_SUBBAND_SIZE)); /* 3kHz */ - // n0 = L_FRAME16k / (2 * STEREO_DMX_EVS_SUBBAND_SIZE); - // a_step = (a_min - a_max) / (n0 + 1 - itrh); - // for (n = 0; n < itrh; n++) - //{ - // ipd_ff[n] = a_max; - // } - // for (; n < (n0 + 1); n++) /* 8kHz */ - //{ - // ipd_ff[n] = a_max + (n - itrh) * a_step; - // } - // for (; n < STEREO_DMX_EVS_NB_SUBBAND_MAX; n++) - //{ - // ipd_ff[n] = a_min; - // } +#ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA + hStereoDmxEVS->hPHA->proc_pha = STEREO_DMX_EVS_PHA_IPD; + hStereoDmxEVS->hPHA->force_poc = FALSE; + move16(); + move32(); + + hStereoDmxEVS->hPHA->pha_ipd_chan_cnt = 0; + move16(); + hStereoDmxEVS->hPHA->pha_ipd_chan_thresh = 10; + move16(); + hStereoDmxEVS->hPHA->pha_ipd_chan2rephase = 1; + move16(); + hStereoDmxEVS->hPHA->pha_ipd_previouschan2rephase = 1; + move16(); + hStereoDmxEVS->hPHA->pha_ipd_chanswitch = 0; + move16(); + hStereoDmxEVS->hPHA->pha_ipd_chanswitch_allowed = 0; + move16(); +#endif set32_fx( hStereoDmxEVS->hPHA->Pr_fx, MAX_32, STEREO_DMX_EVS_NB_SUBBAND_MAX ); set_zero_fx( hStereoDmxEVS->hPHA->Pi_fx, STEREO_DMX_EVS_NB_SUBBAND_MAX ); @@ -2510,6 +3534,7 @@ ivas_error stereo_dmx_evs_init_encoder_fx( hStereoDmxEVS->hPHA->prc_hys_cnt = 0; move16(); +#ifndef NONBE_FIX_947_STEREO_DMX_EVS_PHA // hStereoDmxEVS->hPHA->fad_len_prc = (int16_t) ( STEREO_DMX_EVS_FADE_LEN_PRC * (float) input_Fs / 1000.0f ); SWITCH( input_Fs ) { @@ -2533,9 +3558,11 @@ ivas_error stereo_dmx_evs_init_encoder_fx( IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "invalid sample rate\n" ); BREAK; } - fad_len = hStereoDmxEVS->hPHA->fad_len_prc; +#endif + fad_len = input_frame; move16(); fad_g = hStereoDmxEVS->hPHA->fad_g_prc_fx; + move32(); // fad_r = 1.0f / (float) ( fad_len + 1 ); fad_r = BASOP_Util_Divide3232_Scale_cadence( 1, add( fad_len, 1 ), &tmp_e ); fad_r = L_shl_r( fad_r, tmp_e ); @@ -2556,6 +3583,38 @@ ivas_error stereo_dmx_evs_init_encoder_fx( move16(); } +#ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA + + hStereoDmxEVS->hPHA->dmx_poc_ener_fx = 0; + move32(); + hStereoDmxEVS->hPHA->dmx_poc_ener_fx_e = 0; + move16(); + hStereoDmxEVS->hPHA->dmx_pha_ener_fx = 0; + move32(); + hStereoDmxEVS->hPHA->dmx_pha_ener_fx_e = 0; + move16(); + + hStereoDmxEVS->hPHA->dmx_poc_ener_sgc_fx = 0; + move32(); + hStereoDmxEVS->hPHA->dmx_poc_ener_sgc_fx_e = 0; + move16(); + hStereoDmxEVS->hPHA->dmx_pha_ener_sgc_fx = 0; + move32(); + hStereoDmxEVS->hPHA->dmx_pha_ener_sgc_fx_e = 0; + move16(); + + hStereoDmxEVS->hPHA->dmx_pha_gain_sgc_fx = ONE_IN_Q15; + hStereoDmxEVS->hPHA->dmx_poc_gain_sgc_fx = ONE_IN_Q15; + move32(); + move32(); + + hStereoDmxEVS->hPHA->n_fad_g = input_frame; + hStereoDmxEVS->hPHA->n_fad_cnt = 0; + move16(); + move16(); + +#endif + *hStereoDmxEVS_out = hStereoDmxEVS; return IVAS_ERR_OK;