1e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent/* 2e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. 3e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * 4e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * Use of this source code is governed by a BSD-style license 5e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * that can be found in the LICENSE file in the root of the source 6e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * tree. An additional intellectual property rights grant can be found 7e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * in the file PATENTS. All contributing project authors may 8e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * be found in the AUTHORS file in the root of the source tree. 9e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent */ 10e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 11e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 12e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent/* 13e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * This file contains the function WebRtcSpl_FilterARFastQ12(). 14e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * The description header can be found in signal_processing_library.h 15e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * 16e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent */ 17e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 18e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#include "signal_processing_library.h" 19e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 20e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentvoid WebRtcSpl_FilterARFastQ12(WebRtc_Word16 *in, WebRtc_Word16 *out, WebRtc_Word16 *A, 21e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_Word16 A_length, WebRtc_Word16 length) 22e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{ 23e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_Word32 o; 24e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent int i, j; 25e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 26e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_Word16 *x_ptr = &in[0]; 27e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_Word16 *filtered_ptr = &out[0]; 28e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 29e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent for (i = 0; i < length; i++) 30e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 31e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent // Calculate filtered[i] 32e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent G_CONST WebRtc_Word16 *a_ptr = &A[0]; 33e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_Word16 *state_ptr = &out[i - 1]; 34e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 35e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent o = WEBRTC_SPL_MUL_16_16(*x_ptr++, *a_ptr++); 36e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 37e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent for (j = 1; j < A_length; j++) 38e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 39e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent o -= WEBRTC_SPL_MUL_16_16(*a_ptr++,*state_ptr--); 40e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 41e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 42e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent // Saturate the output 43e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent o = WEBRTC_SPL_SAT((WebRtc_Word32)134215679, o, (WebRtc_Word32)-134217728); 44e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 45e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *filtered_ptr++ = (WebRtc_Word16)((o + (WebRtc_Word32)2048) >> 12); 46e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 47e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 48e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return; 49e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent} 50