Line data Source code
1 : /****************************************************************************************************** 2 : 3 : (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, 4 : Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., 5 : Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, 6 : Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other 7 : contributors to this repository. All Rights Reserved. 8 : 9 : This software is protected by copyright law and by international treaties. 10 : The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, 11 : Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., 12 : Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, 13 : Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other 14 : contributors to this repository retain full ownership rights in their respective contributions in 15 : the software. This notice grants no license of any kind, including but not limited to patent 16 : license, nor is any license granted by implication, estoppel or otherwise. 17 : 18 : Contributors are required to enter into the IVAS codec Public Collaboration agreement before making 19 : contributions. 20 : 21 : This software is provided "AS IS", without any express or implied warranties. The software is in the 22 : development stage. It is intended exclusively for experts who have experience with such software and 23 : solely for the purpose of inspection. All implied warranties of non-infringement, merchantability 24 : and fitness for a particular purpose are hereby disclaimed and excluded. 25 : 26 : Any dispute, controversy or claim arising under or in relation to providing this software shall be 27 : submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in 28 : accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and 29 : the United Nations Convention on Contracts on the International Sales of Goods. 30 : 31 : *******************************************************************************************************/ 32 : 33 : #include <stdint.h> 34 : #include "options.h" 35 : #include "prot.h" 36 : #include "ivas_prot_rend.h" 37 : #ifdef DEBUGGING 38 : #include "debug.h" 39 : #endif 40 : #include "wmc_auto.h" 41 : 42 : 43 : /*-----------------------------------------------------------------------------------------* 44 : * Function ivas_reverb_iir_filt_init() 45 : * 46 : * Initialize the IIR filter 47 : *-----------------------------------------------------------------------------------------*/ 48 : 49 31840 : void ivas_reverb_iir_filt_init( 50 : ivas_rev_iir_filter_t *iirFilter, /* o : IIR filter */ 51 : const uint16_t maxTaps /* i : maximum number of filter taps */ 52 : ) 53 : { 54 31840 : iirFilter->MaxTaps = maxTaps; 55 31840 : iirFilter->isFIR = 0; 56 31840 : iirFilter->nr_taps = 0; /* filter is set to PASS i.e. input copy to output */ 57 31840 : iirFilter->Output = 0.0f; 58 : 59 159200 : for ( uint16_t i = 0; i < maxTaps; i++ ) 60 : { 61 127360 : iirFilter->CoefA[i] = 0; 62 127360 : iirFilter->CoefB[i] = 0; 63 : } 64 : 65 31840 : set_f( iirFilter->pBuffer, 0, iirFilter->MaxTaps ); 66 : 67 31840 : return; 68 : } 69 : 70 : 71 : /*-----------------------------------------------------------------------------------------* 72 : * Function ivas_reverb_iir_filt_set() 73 : * 74 : * Set the IIR filter 75 : *-----------------------------------------------------------------------------------------*/ 76 : 77 38264 : void ivas_reverb_iir_filt_set( 78 : ivas_rev_iir_filter_t *iirFilter, /* i/o: IIR filter */ 79 : uint16_t nr_taps, /* i : number of IIR filter taps */ 80 : const float *coefA, /* i : A filter coefficients to set */ 81 : const float *coefB /* i : the B filter coefficients to set */ 82 : ) 83 : { 84 : uint16_t i; 85 : 86 38264 : if ( nr_taps > iirFilter->MaxTaps ) 87 : { 88 0 : nr_taps = (uint16_t) iirFilter->MaxTaps; 89 : } 90 : 91 38264 : iirFilter->nr_taps = nr_taps; 92 38264 : iirFilter->isFIR = ( coefA == NULL ); 93 : 94 38264 : if ( iirFilter->isFIR != 0 ) 95 : { 96 0 : for ( i = 0; i < iirFilter->nr_taps; i++ ) 97 : { 98 0 : iirFilter->CoefB[i] = coefB[i]; 99 : } 100 : } 101 : else 102 : { 103 114792 : for ( i = 0; i < iirFilter->nr_taps; i++ ) 104 : { 105 76528 : iirFilter->CoefA[i] = coefA[i]; 106 76528 : iirFilter->CoefB[i] = coefB[i]; 107 : } 108 : } 109 : 110 38264 : return; 111 : } 112 : 113 : 114 : /*-----------------------------------------------------------------------------------------* 115 : * Function ivas_reverb_iir_filt_2taps_feed_blk() 116 : * 117 : * Feed samples into 2-taps IIR filter and return resulting output samples 118 : *-----------------------------------------------------------------------------------------*/ 119 : 120 42022048 : void ivas_reverb_iir_filt_2taps_feed_blk( 121 : ivas_rev_iir_filter_t *iirFilter, /* i/o: IIR filter */ 122 : const uint16_t blk_size, /* i : size */ 123 : const float *input, /* i : input buffer */ 124 : float *output /* i : output buffer */ 125 : ) 126 : { 127 : uint16_t i; 128 42022048 : float flt_output = 0.0f; 129 42022048 : float flt_CoefB_0 = iirFilter->CoefB[0]; 130 42022048 : float flt_CoefB_1 = iirFilter->CoefB[1]; 131 42022048 : float flt_CoefA_1 = iirFilter->CoefA[1]; 132 42022048 : float flt_pBuffer_0 = iirFilter->pBuffer[0]; 133 42022048 : float flt_pBuffer_1 = iirFilter->pBuffer[1]; 134 : 135 3403785888 : for ( i = 0; i < blk_size; i++ ) 136 : { 137 3361763840 : flt_output = input[i] * flt_CoefB_0 + flt_pBuffer_0; 138 3361763840 : flt_pBuffer_0 = flt_pBuffer_1 + input[i] * flt_CoefB_1 - flt_output * flt_CoefA_1; 139 3361763840 : output[i] = flt_output; 140 : } 141 : 142 42022048 : iirFilter->pBuffer[0] = flt_pBuffer_0; 143 42022048 : iirFilter->pBuffer[1] = flt_pBuffer_1; 144 42022048 : iirFilter->Output = flt_output; 145 : 146 42022048 : return; 147 : }