17e6b1e83SMilanka Ringwald /* 27e6b1e83SMilanka Ringwald * Copyright (C) 2016 BlueKitchen GmbH 37e6b1e83SMilanka Ringwald * 47e6b1e83SMilanka Ringwald * Redistribution and use in source and binary forms, with or without 57e6b1e83SMilanka Ringwald * modification, are permitted provided that the following conditions 67e6b1e83SMilanka Ringwald * are met: 77e6b1e83SMilanka Ringwald * 87e6b1e83SMilanka Ringwald * 1. Redistributions of source code must retain the above copyright 97e6b1e83SMilanka Ringwald * notice, this list of conditions and the following disclaimer. 107e6b1e83SMilanka Ringwald * 2. Redistributions in binary form must reproduce the above copyright 117e6b1e83SMilanka Ringwald * notice, this list of conditions and the following disclaimer in the 127e6b1e83SMilanka Ringwald * documentation and/or other materials provided with the distribution. 137e6b1e83SMilanka Ringwald * 3. Neither the name of the copyright holders nor the names of 147e6b1e83SMilanka Ringwald * contributors may be used to endorse or promote products derived 157e6b1e83SMilanka Ringwald * from this software without specific prior written permission. 167e6b1e83SMilanka Ringwald * 4. Any redistribution, use, or modification is done solely for 177e6b1e83SMilanka Ringwald * personal benefit and not for any commercial purpose or for 187e6b1e83SMilanka Ringwald * monetary gain. 197e6b1e83SMilanka Ringwald * 207e6b1e83SMilanka Ringwald * THIS SOFTWARE IS PROVIDED BY BLUEKITCHEN GMBH AND CONTRIBUTORS 217e6b1e83SMilanka Ringwald * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 227e6b1e83SMilanka Ringwald * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 23*2fca4dadSMilanka Ringwald * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BLUEKITCHEN 24*2fca4dadSMilanka Ringwald * GMBH OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 257e6b1e83SMilanka Ringwald * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 267e6b1e83SMilanka Ringwald * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 277e6b1e83SMilanka Ringwald * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 287e6b1e83SMilanka Ringwald * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 297e6b1e83SMilanka Ringwald * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF 307e6b1e83SMilanka Ringwald * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 317e6b1e83SMilanka Ringwald * SUCH DAMAGE. 327e6b1e83SMilanka Ringwald * 337e6b1e83SMilanka Ringwald * Please inquire about commercial licensing options at 347e6b1e83SMilanka Ringwald * [email protected] 357e6b1e83SMilanka Ringwald * 367e6b1e83SMilanka Ringwald */ 377e6b1e83SMilanka Ringwald 38fe5a6c4eSMilanka Ringwald /** 39fe5a6c4eSMilanka Ringwald * CVSD Packet Loss Concealment 407e6b1e83SMilanka Ringwald * 417e6b1e83SMilanka Ringwald */ 427e6b1e83SMilanka Ringwald 4380e33422SMatthias Ringwald #ifndef BTSTACK_CVSD_PLC_H 4480e33422SMatthias Ringwald #define BTSTACK_CVSD_PLC_H 457e6b1e83SMilanka Ringwald 467e6b1e83SMilanka Ringwald #include <stdint.h> 475f4f94c7SMatthias Ringwald #include "btstack_bool.h" 487e6b1e83SMilanka Ringwald 497e6b1e83SMilanka Ringwald #if defined __cplusplus 507e6b1e83SMilanka Ringwald extern "C" { 517e6b1e83SMilanka Ringwald #endif 527e6b1e83SMilanka Ringwald 533d45f2d5SMilanka Ringwald #define BTSTACK_CVSD_PLC_SAMPLE_FORMAT int16_t 54cf8890c4SMilanka Ringwald 55d1550f90SMilanka Ringwald #define CVSD_FS 60 /* CVSD Frame Size */ 56cf8890c4SMilanka Ringwald #define CVSD_N 256 /* Window Length for pattern matching */ 57de95d3c9SMilanka Ringwald #define CVSD_M 32 /* Template for matching */ 58d1550f90SMilanka Ringwald #define CVSD_LHIST (CVSD_N+CVSD_FS-1) /* Length of history buffer required */ 59de95d3c9SMilanka Ringwald #define CVSD_RT 18 /* Reconvergence Time (samples) */ 60de95d3c9SMilanka Ringwald #define CVSD_OLAL 8 /* OverLap-Add Length (samples) */ 617e6b1e83SMilanka Ringwald 627e6b1e83SMilanka Ringwald /* PLC State Information */ 637e6b1e83SMilanka Ringwald typedef struct cvsd_plc_state { 64d1550f90SMilanka Ringwald int16_t hist[CVSD_LHIST+CVSD_FS+CVSD_RT+CVSD_OLAL]; 657e6b1e83SMilanka Ringwald int16_t bestlag; 667e6b1e83SMilanka Ringwald int nbf; 6726463303SMilanka Ringwald 68a5eb47acSMatthias Ringwald // number processed samples 69a5eb47acSMatthias Ringwald uint32_t good_samples; 70a5eb47acSMatthias Ringwald 7126463303SMilanka Ringwald // summary of processed good and bad frames 7226463303SMilanka Ringwald int good_frames_nr; 7326463303SMilanka Ringwald int bad_frames_nr; 741db30a88SMatthias Ringwald int zero_frames_nr; 75202da317SMilanka Ringwald int frame_count; 76de854f9aSMilanka Ringwald int max_consecutive_bad_frames_nr; 777e6b1e83SMilanka Ringwald } btstack_cvsd_plc_state_t; 787e6b1e83SMilanka Ringwald 797cd567c8SMatthias Ringwald // All int16 audio samples are in host endiness 807e6b1e83SMilanka Ringwald void btstack_cvsd_plc_init(btstack_cvsd_plc_state_t *plc_state); 81a5eb47acSMatthias Ringwald void btstack_cvsd_plc_bad_frame(btstack_cvsd_plc_state_t *plc_state, uint16_t num_samples, int16_t *out); 82a5eb47acSMatthias Ringwald void btstack_cvsd_plc_good_frame(btstack_cvsd_plc_state_t *plc_state, uint16_t num_samples, int16_t *in, int16_t *out); 835f4f94c7SMatthias Ringwald void btstack_cvsd_plc_process_data(btstack_cvsd_plc_state_t * state, bool bad_frame, int16_t * in, uint16_t num_samples, int16_t * out); 84202da317SMilanka Ringwald void btstack_cvsd_dump_statistics(btstack_cvsd_plc_state_t * state); 857e6b1e83SMilanka Ringwald 863d45f2d5SMilanka Ringwald // testing only 873d45f2d5SMilanka Ringwald int btstack_cvsd_plc_pattern_match(BTSTACK_CVSD_PLC_SAMPLE_FORMAT *y); 88a5eb47acSMatthias Ringwald float btstack_cvsd_plc_amplitude_match(btstack_cvsd_plc_state_t *plc_state, uint16_t num_samples, BTSTACK_CVSD_PLC_SAMPLE_FORMAT *y, BTSTACK_CVSD_PLC_SAMPLE_FORMAT bestmatch); 893d45f2d5SMilanka Ringwald BTSTACK_CVSD_PLC_SAMPLE_FORMAT btstack_cvsd_plc_crop_sample(float val); 90fdcb66e4SMatthias Ringwald float btstack_cvsd_plc_rcos(int index); 913d45f2d5SMilanka Ringwald 92d1550f90SMilanka Ringwald #ifdef OCTAVE_OUTPUT 93d1550f90SMilanka Ringwald void btstack_cvsd_plc_octave_set_base_name(const char * name); 94d1550f90SMilanka Ringwald #endif 95d1550f90SMilanka Ringwald 967e6b1e83SMilanka Ringwald #if defined __cplusplus 977e6b1e83SMilanka Ringwald } 987e6b1e83SMilanka Ringwald #endif 997e6b1e83SMilanka Ringwald 10080e33422SMatthias Ringwald #endif // BTSTACK_CVSD_PLC_H 101