123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257 |
- /*
- * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
- // Performs delay estimation on binary converted spectra.
- // The return value is 0 - OK and -1 - Error, unless otherwise stated.
- #ifndef MODULES_AUDIO_PROCESSING_UTILITY_DELAY_ESTIMATOR_H_
- #define MODULES_AUDIO_PROCESSING_UTILITY_DELAY_ESTIMATOR_H_
- #include <stdint.h>
- namespace webrtc {
- static const int32_t kMaxBitCountsQ9 = (32 << 9); // 32 matching bits in Q9.
- typedef struct {
- // Pointer to bit counts.
- int* far_bit_counts;
- // Binary history variables.
- uint32_t* binary_far_history;
- int history_size;
- } BinaryDelayEstimatorFarend;
- typedef struct {
- // Pointer to bit counts.
- int32_t* mean_bit_counts;
- // Array only used locally in ProcessBinarySpectrum() but whose size is
- // determined at run-time.
- int32_t* bit_counts;
- // Binary history variables.
- uint32_t* binary_near_history;
- int near_history_size;
- int history_size;
- // Delay estimation variables.
- int32_t minimum_probability;
- int last_delay_probability;
- // Delay memory.
- int last_delay;
- // Robust validation
- int robust_validation_enabled;
- int allowed_offset;
- int last_candidate_delay;
- int compare_delay;
- int candidate_hits;
- float* histogram;
- float last_delay_histogram;
- // For dynamically changing the lookahead when using SoftReset...().
- int lookahead;
- // Far-end binary spectrum history buffer etc.
- BinaryDelayEstimatorFarend* farend;
- } BinaryDelayEstimator;
- // Releases the memory allocated by
- // WebRtc_CreateBinaryDelayEstimatorFarend(...).
- // Input:
- // - self : Pointer to the binary delay estimation far-end
- // instance which is the return value of
- // WebRtc_CreateBinaryDelayEstimatorFarend().
- //
- void WebRtc_FreeBinaryDelayEstimatorFarend(BinaryDelayEstimatorFarend* self);
- // Allocates the memory needed by the far-end part of the binary delay
- // estimation. The memory needs to be initialized separately through
- // WebRtc_InitBinaryDelayEstimatorFarend(...).
- //
- // Inputs:
- // - history_size : Size of the far-end binary spectrum history.
- //
- // Return value:
- // - BinaryDelayEstimatorFarend*
- // : Created |handle|. If the memory can't be allocated
- // or if any of the input parameters are invalid NULL
- // is returned.
- //
- BinaryDelayEstimatorFarend* WebRtc_CreateBinaryDelayEstimatorFarend(
- int history_size);
- // Re-allocates the buffers.
- //
- // Inputs:
- // - self : Pointer to the binary estimation far-end instance
- // which is the return value of
- // WebRtc_CreateBinaryDelayEstimatorFarend().
- // - history_size : Size of the far-end binary spectrum history.
- //
- // Return value:
- // - history_size : The history size allocated.
- int WebRtc_AllocateFarendBufferMemory(BinaryDelayEstimatorFarend* self,
- int history_size);
- // Initializes the delay estimation far-end instance created with
- // WebRtc_CreateBinaryDelayEstimatorFarend(...).
- //
- // Input:
- // - self : Pointer to the delay estimation far-end instance.
- //
- // Output:
- // - self : Initialized far-end instance.
- //
- void WebRtc_InitBinaryDelayEstimatorFarend(BinaryDelayEstimatorFarend* self);
- // Soft resets the delay estimation far-end instance created with
- // WebRtc_CreateBinaryDelayEstimatorFarend(...).
- //
- // Input:
- // - delay_shift : The amount of blocks to shift history buffers.
- //
- void WebRtc_SoftResetBinaryDelayEstimatorFarend(
- BinaryDelayEstimatorFarend* self,
- int delay_shift);
- // Adds the binary far-end spectrum to the internal far-end history buffer. This
- // spectrum is used as reference when calculating the delay using
- // WebRtc_ProcessBinarySpectrum().
- //
- // Inputs:
- // - self : Pointer to the delay estimation far-end
- // instance.
- // - binary_far_spectrum : Far-end binary spectrum.
- //
- // Output:
- // - self : Updated far-end instance.
- //
- void WebRtc_AddBinaryFarSpectrum(BinaryDelayEstimatorFarend* self,
- uint32_t binary_far_spectrum);
- // Releases the memory allocated by WebRtc_CreateBinaryDelayEstimator(...).
- //
- // Note that BinaryDelayEstimator utilizes BinaryDelayEstimatorFarend, but does
- // not take ownership of it, hence the BinaryDelayEstimator has to be torn down
- // before the far-end.
- //
- // Input:
- // - self : Pointer to the binary delay estimation instance
- // which is the return value of
- // WebRtc_CreateBinaryDelayEstimator().
- //
- void WebRtc_FreeBinaryDelayEstimator(BinaryDelayEstimator* self);
- // Allocates the memory needed by the binary delay estimation. The memory needs
- // to be initialized separately through WebRtc_InitBinaryDelayEstimator(...).
- //
- // See WebRtc_CreateDelayEstimator(..) in delay_estimator_wrapper.c for detailed
- // description.
- BinaryDelayEstimator* WebRtc_CreateBinaryDelayEstimator(
- BinaryDelayEstimatorFarend* farend,
- int max_lookahead);
- // Re-allocates |history_size| dependent buffers. The far-end buffers will be
- // updated at the same time if needed.
- //
- // Input:
- // - self : Pointer to the binary estimation instance which is
- // the return value of
- // WebRtc_CreateBinaryDelayEstimator().
- // - history_size : Size of the history buffers.
- //
- // Return value:
- // - history_size : The history size allocated.
- int WebRtc_AllocateHistoryBufferMemory(BinaryDelayEstimator* self,
- int history_size);
- // Initializes the delay estimation instance created with
- // WebRtc_CreateBinaryDelayEstimator(...).
- //
- // Input:
- // - self : Pointer to the delay estimation instance.
- //
- // Output:
- // - self : Initialized instance.
- //
- void WebRtc_InitBinaryDelayEstimator(BinaryDelayEstimator* self);
- // Soft resets the delay estimation instance created with
- // WebRtc_CreateBinaryDelayEstimator(...).
- //
- // Input:
- // - delay_shift : The amount of blocks to shift history buffers.
- //
- // Return value:
- // - actual_shifts : The actual number of shifts performed.
- //
- int WebRtc_SoftResetBinaryDelayEstimator(BinaryDelayEstimator* self,
- int delay_shift);
- // Estimates and returns the delay between the binary far-end and binary near-
- // end spectra. It is assumed the binary far-end spectrum has been added using
- // WebRtc_AddBinaryFarSpectrum() prior to this call. The value will be offset by
- // the lookahead (i.e. the lookahead should be subtracted from the returned
- // value).
- //
- // Inputs:
- // - self : Pointer to the delay estimation instance.
- // - binary_near_spectrum : Near-end binary spectrum of the current block.
- //
- // Output:
- // - self : Updated instance.
- //
- // Return value:
- // - delay : >= 0 - Calculated delay value.
- // -2 - Insufficient data for estimation.
- //
- int WebRtc_ProcessBinarySpectrum(BinaryDelayEstimator* self,
- uint32_t binary_near_spectrum);
- // Returns the last calculated delay updated by the function
- // WebRtc_ProcessBinarySpectrum(...).
- //
- // Input:
- // - self : Pointer to the delay estimation instance.
- //
- // Return value:
- // - delay : >= 0 - Last calculated delay value
- // -2 - Insufficient data for estimation.
- //
- int WebRtc_binary_last_delay(BinaryDelayEstimator* self);
- // Returns the estimation quality of the last calculated delay updated by the
- // function WebRtc_ProcessBinarySpectrum(...). The estimation quality is a value
- // in the interval [0, 1]. The higher the value, the better the quality.
- //
- // Return value:
- // - delay_quality : >= 0 - Estimation quality of last calculated
- // delay value.
- float WebRtc_binary_last_delay_quality(BinaryDelayEstimator* self);
- // Updates the |mean_value| recursively with a step size of 2^-|factor|. This
- // function is used internally in the Binary Delay Estimator as well as the
- // Fixed point wrapper.
- //
- // Inputs:
- // - new_value : The new value the mean should be updated with.
- // - factor : The step size, in number of right shifts.
- //
- // Input/Output:
- // - mean_value : Pointer to the mean value.
- //
- void WebRtc_MeanEstimatorFix(int32_t new_value,
- int factor,
- int32_t* mean_value);
- } // namespace webrtc
- #endif // MODULES_AUDIO_PROCESSING_UTILITY_DELAY_ESTIMATOR_H_
|