code which is not thread-safe in the sense that the
rdft_init method can only be run in a single-threaded.
Currently, inside WebRTC multiple instances of the audio-
processing module are set up which means that the init
method may be run concurrently.
In order to avoid having to protect the init method with
a lock to ensure single-threaded behavior that, this CL
places the FFT functionality inside a class so that there
is no global component of the FFT functionality.
Note that:
1) The nonstandard header for the ooura_fft.cc was copied
from the aec_rdft.cc header, and augmented with a
description of the changes introduced in this CL.
2) The clang warnings for the ooura_fft_sse2.cc,
ooura_fft_neon.cc and ooura_fft_mips.cc were not
addressed as this code was kept as it was before this CL
3) Clang-format was run on all files apart from
ooura_fft_mips.cc (as that would change the format of
the inline assempbly code).
Adding bypass of presubmit to avoid code style and header errors caused by the fact that files with legacy code are being renamed.
NOPRESUBMIT=true
BUG=chromium:638583
Review-Url: https://codereview.webrtc.org/2348213002
Cr-Commit-Position: refs/heads/master@{#14554}
The former buffering scheme was overly complicated and
complex as.
-It buffered twice as many data points as needed.
-It used the ring_buffer C functionality directly inside the
delay adjustment functionality which makes that
functionality very hard to read.
In order to overcome these problems this CL does
-Change the buffering to buffer only the amount of samples
needed.
-Wrap the ring_buffer C functionality in a wrapper class
with methods that are more descriptive in what they do
to affect the AEC delay.
Additional notes:
-Some minor other name changes/code changes were also
introduced.
-The ringbuffer C functionality should be removed, but now
is not the time to do it as the rest of the code is very
adapted to the wrapping behavior of the ringbuffer. It is
better to simplify the surrounding code before doing that.
The changes have been tested to be bitexact.
This CL is chained to the CL https://codereview.webrtc.org/2321483002/
and will be followed by another CL.
BUG=webrtc:5298, webrtc:6018
Review-Url: https://codereview.webrtc.org/2319693003
Cr-Commit-Position: refs/heads/master@{#14188}
internal block size of the AEC differ from the frame
size in the AEC output.
Before this CL, this buffering was done using ringbuffers
as well as secondary internal AEC buffers that were stored
on the state. The internal buffers were redundant, and the
ringbuffers were so short that the benefit of using
ringbuffers were lost.
This CL addresses the above issues by replacing the
ringbuffers by linear buffers. This has the main advantage
of cleaner code but it should significantly less
computational complex.
Furthermore, as the complexity of the function where the
conversion to external and internal AEC frame sizes is done
increased significantly with the changes in this CL, the
CL also include refactoring the near-end buffer handling
to increase readability and reduce code repetition.
After the changes in this CL it is very clear that the
former buffering of the output was incorrectly done for
the first frames. This CL corrects that but in doing that
it breaks the bitexactness with the former code.
The bitexactness is, however, only broken for the first
1000 samples and it has been verified that for a test suite
the CL maintains bitexactness in the AEC output
after the first 1000 samples.
This CL is chained to the CL https://codereview.webrtc.org/2311833002/ and will be
followed by more CLs that refactor the other buffers
inside the AEC.
BUG=webrtc:5298, webrtc:6018
Review-Url: https://codereview.webrtc.org/2321483002
Cr-Commit-Position: refs/heads/master@{#14184}
the AEC. This solves the following issues:
-Even though the buffering was previously done using ringbuffers, those
were inefficiently used which caused a lot of hidden memcopys.
-The ringbuffers wasted a lot of space in the AEC state as they were too
long.
-The lowest and two upper bands were decoupled in the buffering, which
required extra code to handle.
-On top of the ringbuffers there was a second linear buffer that was
stored in the state which caused even more data to be stored on the
state.
-The incoming nearend frames were passed to the functions in the form
of buffers on the state, which made the code harder to read as it was
not immediately clear where the nearend signal was used, and when it
was modified.
The CL addresses this by replacing all the buffers by two linear buffers:
-One buffer before the AEC processing for producing nearend
blocks of size 64 that can be processed by the AEC.
-One inside the AEC processing that buffers the current
nearend block until the next block is processed.
The changes have been tested to be bitexact.
This CL will be followed by several other CLs, that refactor the other
buffers in the AEC.
BUG=webrtc:5298, webrtc:6018
Review-Url: https://codereview.webrtc.org/2311833002
Cr-Commit-Position: refs/heads/master@{#14141}
This change adds a UMA log that will be written to when a non-zero delay
correction is done in the AEC. The number of elements moved (positive or
negative) will be logged to
"WebRTC.Audio.AecDelayAdjustmentAgnosticValue" or
"WebRTC.Audio.AecDelayAdjustmentSystemValue", depending on whether
delay-agnostic AEC is used or not, respectively.
BUG=webrtc:5903
Review-Url: https://codereview.webrtc.org/1991723002
Cr-Commit-Position: refs/heads/master@{#12795}
Chrome does not detect NEON instruction set at runtime in WebRTC code starting
with M50, which is now in Stable. Remove support for runtime detection for
simplicity.
The only remaining piece of Chrome that will continue to depend on runtime
detection is /net, where devices with _broken_ neon support are also detected,
and it is not configurable via GYP/GN.
BUG=522035
NOPRESUBMIT=true
Review-Url: https://codereview.webrtc.org/1955413003
Cr-Commit-Position: refs/heads/master@{#12778}
This CL will be followed with other CLs that break apart
the application of the comfort noise from the comfort
noise generation.
The changes in the CL are very close to bitexaxt. The
bitinexactness is caused by differences in numerical
behavior when bundling the spectral band power and the
noise scaling based on the NLP gain.
BUG=webrtc:5201, webrtc:5298
Review-Url: https://codereview.webrtc.org/1958933002
Cr-Commit-Position: refs/heads/master@{#12713}
a separate method.
This CL will be followed by other CLs that simplify this method and break out the state specific to this computation
into a separate substate.
The changes are bitexact.
BUG=webrtc:5201, webrtc:5298
Review-Url: https://codereview.webrtc.org/1963493003
Cr-Commit-Position: refs/heads/master@{#12712}
files.
The purpose of this CL is to simplify upcoming AEC algorithm
changes.
The changes should be bitexact.
The presubmit was bypassed due to a presubmit complaint
about usage of short instead of int16_t which will be
addressed in upcoming CLs.
BUG=webrtc:5298, webrtc:5201
NOPRESUBMIT=true
Review-Url: https://codereview.webrtc.org/1949803004
Cr-Commit-Position: refs/heads/master@{#12662}
method in the AEC into two methods.
This CL is step towards simplifying the AEC code, making it
more modifiable and modular.
The changes should be bitexact.
BUG=webrtc:5201, webrtc:5298
Review-Url: https://codereview.webrtc.org/1943753002
Cr-Commit-Position: refs/heads/master@{#12656}
method in the AEC.
This CL is step towards simplifying the AEC code, making it
more modifiable and modular.
The changes should be bitexact.
BUG=webrtc:5201, webrtc:5298
Review-Url: https://codereview.webrtc.org/1943193002
Cr-Commit-Position: refs/heads/master@{#12655}
This CL is step towards simplifying the AEC code, making it more
modifiable and modular.
The changes should be bitexact.
BUG=webrtc:5201, webrtc:5298
Review-Url: https://codereview.webrtc.org/1936203002
Cr-Commit-Position: refs/heads/master@{#12654}
theAEC. The reason for this is that this optimized method hinders any
refactoring of the code. In particular, it is not possible to separate
the application of the echo suppressor gain from the gain computation
and the comfort noise generation as all of these are partly included
in this method.
This CL is step towards simplifying the AEC code, making it more
modifiable and modular.
The changes should be bitexact.
BUG=webrtc:5201, webrtc:5298
Review-Url: https://codereview.webrtc.org/1942853002
Cr-Commit-Position: refs/heads/master@{#12653}
This CL is step towards simplifying the AEC code, making it more modifiable and modular.
The changes should be bitexact.
BUG=webrtc:5201, webrtc:5298
Review-Url: https://codereview.webrtc.org/1936173002
Cr-Commit-Position: refs/heads/master@{#12652}
the file content to echo_cancellation.h.
The purpose of this CL is to simplify upcoming AEC algorithm
changes.
The changes should be bitexact.
BUG=webrtc:5298, webrtc:5201
Review-Url: https://codereview.webrtc.org/1947743004
Cr-Commit-Position: refs/heads/master@{#12638}
state as an input to OverdriveAndSuppress in the AEC.
This CL is step towards simplifying the AEC code, making it more
modifiable and modular.
The changes should be bitexact.
BUG=webrtc:5201, webrtc:5298
Review-Url: https://codereview.webrtc.org/1939723002
Cr-Commit-Position: refs/heads/master@{#12616}
to use for the APM. It allows simple and rapid
additions of exploratory data logpoints to use
during bug investigations and module performance
analysis.
The new data logging functionality is also in this CL
used to replace the existing data logging functionality
present in the AEC.
Additional information:
As there was an issue with that the build flag for
activating this feature was not present in all
compilation units that included the feature additional
changes were needed. A summary of the changes are
-The build files were modified to ensure that the
logging build flag always is set to either 0 or 1
for compilation units that include the feature.
-Build-time checks in the appropriate places were added
to ensure that the above is fulfilled.
-The build object was added dynamically to the AEC state
as a pointer to ensure that the size of that state is not
dependent on whether the logging build flag is set or not.
-The constructor of the AEC class needed to be modified in
order to construct the logging object. For this a destructor
was also needed.
-An unused method without any declaration was removed in
order to avoid any issues with the logging flag being set to
0 or 1.
This CL will be immediately followed with an upcoming CL
that replaces the logging in echo_cancellation.cc with the
new functionality which will ensure that the logging flag
is only used in one place within WebRTC, which in turn will
fully ensure that all compilation units that uses the feature
also have the flag properly set.
BUG=webrtc:5201, webrtc:5298
Review-Url: https://codereview.webrtc.org/1877713002
Cr-Commit-Position: refs/heads/master@{#12607}
Any file that uses the RTC_DISALLOW_* macros should #include
"webrtc/base/constructormagic.h", but a shocking number of them don't.
This causes trouble when we try to wean files off of #including
scoped_ptr.h, since a bunch of files get their constructormagic macros
only from there.
Rather than fixing these errors one by one as they turn up, this CL
simply ensures that every file in the WebRTC tree that uses the
RTC_DISALLOW_* macros #includes "webrtc/base/constructormagic.h".
BUG=webrtc:5520
Review URL: https://codereview.webrtc.org/1917043005
Cr-Commit-Position: refs/heads/master@{#12509}
Current implementation of AEC metrics does not read nicely. It messes up between a noise-removed calculation and a raw calculation.
I tried to clean it up, in which, I stick to the raw calculation since the noise-removed version can show some problem when the noise is overestimated.
BUG=
Review URL: https://codereview.webrtc.org/1581183005
Cr-Commit-Position: refs/heads/master@{#12455}
does not have to use the aec state as an input.
Furthermore, the debug dump output of e_fft was removed as
it is not really used in any analysis scripts.
BUG=webrtc:5298
Review URL: https://codereview.webrtc.org/1883293003
Cr-Commit-Position: refs/heads/master@{#12387}
The following algorithmic functionality was added:
-Add support for an exact regressor power to be computed
which avoids the issue with the updating of the filter
sometimes being unstable.
-Lowered the fixed step size of the adaptive filter to 0.05
which significantly reduces the sensitivity of the
adaptive filter to near-end noise, nonlinearities,
doubletalk and the unmodelled echo path tail. It also
reduces the tracking speed of the adaptive filter but the
chosen value proved to give a sufficient tradeoff for the
requirements on the adaptive filter.
To allow the new functionality to be selectively applied the following was done:
-A new Config was added for selectively activating the functionality.
-Functionality was added in the audioprocessing and echocancellationimpl classes
for passing the activation of the functionality down to the AEC algorithms.
To make the code for the introduction of the functionality clean,
the following refactoring was done:
-The selection of the step size was moved to a single place.
-The constant for the step size of the adaptive filter in extended filter mode was
made local.
-The state variable storing the step-size was renamed to a more describing name.
When the new functionality is not activated, the changes
have been tested for bitexactness on Linux.
TBR=minyue@webrtc.org
BUG=webrtc:5778, webrtc:5777
Review URL: https://codereview.webrtc.org/1887003002
Cr-Commit-Position: refs/heads/master@{#12384}
With the current AEC algorithm, the divergence of the echo cancelling linear filter is a strong signal of non-transparency. During double talk, it can result in a ducking artifacts.
In this CL, a metric that tells the fraction of filter divergence is added. This can measure the severity of non-transparency.
BUG=
Review URL: https://codereview.webrtc.org/1739993003
Cr-Commit-Position: refs/heads/master@{#12276}
Reason for revert:
Because of down-stream dependencies, this CL needs to be reverted.
The dependencies will be resolved and then the CL will be relanded.
Original issue's description:
> Revert "Revert of Moved ring-buffer related files from common_audio to audio_processing (patchset #8 id:150001 of https://codereview.webrtc.org/1846903004/ )"
>
> This reverts commit c54aad6ae07fe2a44a65be403386bd7d7d865e5b.
>
> BUG=webrtc:5724
> NOPRESUBMIT=true
>
> Committed: https://crrev.com/8864fe5e08f8d8711612526dee9a812adfcd3be1
> Cr-Commit-Position: refs/heads/master@{#12247}
TBR=henrik.lundin@webrtc.org,ivoc@webrtc.org
# Skipping CQ checks because original CL landed less than 1 days ago.
NOPRESUBMIT=true
NOTREECHECKS=true
NOTRY=true
BUG=webrtc:5724
Review URL: https://codereview.webrtc.org/1855393004
Cr-Commit-Position: refs/heads/master@{#12248}
Reason for revert:
This CL caused a google3 breakage due to dependencies in Google3.
I will fix that, and reland.
Original issue's description:
> Moved ring-buffer related files from common_audio to audio_processing
>
> BUG=webrtc:5724
> NOPRESUBMIT=true
>
> Committed: https://crrev.com/711ccc8d96490f58cc3d7fd9207c19d4d881d4dc
> Cr-Commit-Position: refs/heads/master@{#12227}
TBR=ivoc@webrtc.org,henrik.lundin@webrtc.org
# Skipping CQ checks because original CL landed less than 1 days ago.
NOPRESUBMIT=true
NOTREECHECKS=true
NOTRY=true
BUG=webrtc:5724
Review URL: https://codereview.webrtc.org/1856323002
Cr-Commit-Position: refs/heads/master@{#12232}
Reason for revert:
This CL is dependent on the CL https://codereview.webrtc.org/1846903004/ which caused a google3 breakage due to dependencies in Google3.
I will fix that, and reland this CL.
Original issue's description:
> Moved the ringbuffer to be built using C++
>
> BUG=webrtc:5724
>
> Committed: https://crrev.com/677e5774eaf287fa02f75fd5c8ad3f9ded9ed9c4
> Cr-Commit-Position: refs/heads/master@{#12230}
TBR=ivoc@webrtc.org,henrik.lundin@webrtc.org,kwiberg@webrtc.org
# Skipping CQ checks because original CL landed less than 1 days ago.
NOPRESUBMIT=true
NOTREECHECKS=true
NOTRY=true
BUG=webrtc:5724
Review URL: https://codereview.webrtc.org/1858873003
Cr-Commit-Position: refs/heads/master@{#12231}
From an earlier CL, we start to feed UpdateLevel() with power instead of energy. I found that UpdateLevel() is still taking the input as energy and normalize it. This CL fixes this.
The earlier CL is
https://codereview.webrtc.org/1542573002/
BUG=
Review URL: https://codereview.webrtc.org/1810773003
Cr-Commit-Position: refs/heads/master@{#12084}
(the ones that were recently moved from c)
There are many files changed but most changes just
consist of adding namespaces.
In aec_common.h an C++-specific #ifdef needed to be added as
that file is both included from C and C++. I could see no
way around that but please let me know if there is a better
way around that.
BUG=webrtc:5201
Review URL: https://codereview.webrtc.org/1766663002
Cr-Commit-Position: refs/heads/master@{#11883}
The steps involved were:
1) Change file name to .cc from .c.
2) Update the build files accordingly.
3) Remove the extern header file inclusion.
4) Change the casts in aec_resampler.cc to static_cast
and reinterpret_cast.
The changes are bitexact.
The CL will be followed with another CL where a proper (webrtc) namespace is introduced. The reason for not having it in this CL is that this was missed in the corresponding
CL that did the above for aec_core.c, ..., and if the
namespaces in all the aec_core -related files can be changed
at the same time that will simplify things.
BUG=webrtc:5201
Review URL: https://codereview.webrtc.org/1754223004
Cr-Commit-Position: refs/heads/master@{#11867}
The audio level of the AEC's output level was calculated before overlapping add, and therefore, a compensation was needed. The compensation is multiplying the level by 2 since, before overlapping add, the level is roughly halved due to windowing.
This had to be that way because the level was calculated in frequency domain and the signal after overlapping add has only its time domain representation.
The level calculation has been updated to work on time domain signal and therefore the problem is not there any longer.
This CL is to put the calculation of the AEC output level after overlapping add and remove the compensation.
BUG=
R=peah@webrtc.org
Review URL: https://codereview.webrtc.org/1644133002 .
Cr-Commit-Position: refs/heads/master@{#11810}