Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
Arun Raghavan
webrtc-audio-processing
Commits
35f5c9ce
Commit
35f5c9ce
authored
Sep 15, 2011
by
Arun Raghavan
Browse files
Initial commit of source files
parent
87ca4f70
Changes
181
Expand all
Hide whitespace changes
Inline
Side-by-side
AUTHORS
0 → 100644
View file @
35f5c9ce
# Names should be added to this file like so:
# Name or Organization <email address>
Google Inc.
# autofoo-based build system
Arun Raghavan <arun.raghavan@collabora.co.uk>
COPYING
0 → 100644
View file @
35f5c9ce
Copyright (c) 2011, Google Inc. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in
the documentation and/or other materials provided with the
distribution.
* Neither the name of Google nor the names of its contributors may
be used to endorse or promote products derived from this software
without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
ChangeLog
0 → 100644
View file @
35f5c9ce
NEWS
0 → 100644
View file @
35f5c9ce
PATENTS
0 → 100644
View file @
35f5c9ce
Additional IP Rights Grant (Patents)
"This implementation" means the copyrightable works distributed by
Google as part of the WebRTC code package.
Google hereby grants to you a perpetual, worldwide, non-exclusive,
no-charge, irrevocable (except as stated in this section) patent
license to make, have made, use, offer to sell, sell, import,
transfer, and otherwise run, modify and propagate the contents of this
implementation of the WebRTC code package, where such license applies
only to those patent claims, both currently owned by Google and
acquired in the future, licensable by Google that are necessarily
infringed by this implementation of the WebRTC code package. This
grant does not include claims that would be infringed only as a
consequence of further modification of this implementation. If you or
your agent or exclusive licensee institute or order or agree to the
institution of patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that this
implementation of the WebRTC code package or any code incorporated
within this implementation of the WebRTC code package constitutes
direct or contributory patent infringement, or inducement of patent
infringement, then any patent rights granted to you under this License
for this implementation of the WebRTC code package shall terminate as
of the date such litigation is filed.
src/common_audio/signal_processing_library/OWNERS
0 → 100644
View file @
35f5c9ce
bjornv@webrtc.org
tina.legrand@webrtc.org
jan.skoglund@webrtc.org
src/common_audio/signal_processing_library/main/interface/signal_processing_library.h
0 → 100644
View file @
35f5c9ce
This diff is collapsed.
Click to expand it.
src/common_audio/signal_processing_library/main/interface/spl_inl.h
0 → 100644
View file @
35f5c9ce
/*
* Copyright (c) 2011 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.
*/
// This header file includes the inline functions in
// the fix point signal processing library.
#ifndef WEBRTC_SPL_SPL_INL_H_
#define WEBRTC_SPL_SPL_INL_H_
#ifdef WEBRTC_ARCH_ARM_V7A
#include
"spl_inl_armv7.h"
#else
static
__inline
WebRtc_Word16
WebRtcSpl_AddSatW16
(
WebRtc_Word16
a
,
WebRtc_Word16
b
)
{
WebRtc_Word32
s_sum
=
(
WebRtc_Word32
)
a
+
(
WebRtc_Word32
)
b
;
if
(
s_sum
>
WEBRTC_SPL_WORD16_MAX
)
s_sum
=
WEBRTC_SPL_WORD16_MAX
;
else
if
(
s_sum
<
WEBRTC_SPL_WORD16_MIN
)
s_sum
=
WEBRTC_SPL_WORD16_MIN
;
return
(
WebRtc_Word16
)
s_sum
;
}
static
__inline
WebRtc_Word32
WebRtcSpl_AddSatW32
(
WebRtc_Word32
l_var1
,
WebRtc_Word32
l_var2
)
{
WebRtc_Word32
l_sum
;
// perform long addition
l_sum
=
l_var1
+
l_var2
;
// check for under or overflow
if
(
WEBRTC_SPL_IS_NEG
(
l_var1
))
{
if
(
WEBRTC_SPL_IS_NEG
(
l_var2
)
&&
!
WEBRTC_SPL_IS_NEG
(
l_sum
))
{
l_sum
=
(
WebRtc_Word32
)
0x80000000
;
}
}
else
{
if
(
!
WEBRTC_SPL_IS_NEG
(
l_var2
)
&&
WEBRTC_SPL_IS_NEG
(
l_sum
))
{
l_sum
=
(
WebRtc_Word32
)
0x7FFFFFFF
;
}
}
return
l_sum
;
}
static
__inline
WebRtc_Word16
WebRtcSpl_SubSatW16
(
WebRtc_Word16
var1
,
WebRtc_Word16
var2
)
{
WebRtc_Word32
l_diff
;
WebRtc_Word16
s_diff
;
// perform subtraction
l_diff
=
(
WebRtc_Word32
)
var1
-
(
WebRtc_Word32
)
var2
;
// default setting
s_diff
=
(
WebRtc_Word16
)
l_diff
;
// check for overflow
if
(
l_diff
>
(
WebRtc_Word32
)
32767
)
s_diff
=
(
WebRtc_Word16
)
32767
;
// check for underflow
if
(
l_diff
<
(
WebRtc_Word32
)
-
32768
)
s_diff
=
(
WebRtc_Word16
)
-
32768
;
return
s_diff
;
}
static
__inline
WebRtc_Word32
WebRtcSpl_SubSatW32
(
WebRtc_Word32
l_var1
,
WebRtc_Word32
l_var2
)
{
WebRtc_Word32
l_diff
;
// perform subtraction
l_diff
=
l_var1
-
l_var2
;
// check for underflow
if
((
l_var1
<
0
)
&&
(
l_var2
>
0
)
&&
(
l_diff
>
0
))
l_diff
=
(
WebRtc_Word32
)
0x80000000
;
// check for overflow
if
((
l_var1
>
0
)
&&
(
l_var2
<
0
)
&&
(
l_diff
<
0
))
l_diff
=
(
WebRtc_Word32
)
0x7FFFFFFF
;
return
l_diff
;
}
static
__inline
WebRtc_Word16
WebRtcSpl_GetSizeInBits
(
WebRtc_UWord32
n
)
{
int
bits
;
if
(
0xFFFF0000
&
n
)
{
bits
=
16
;
}
else
{
bits
=
0
;
}
if
(
0x0000FF00
&
(
n
>>
bits
))
bits
+=
8
;
if
(
0x000000F0
&
(
n
>>
bits
))
bits
+=
4
;
if
(
0x0000000C
&
(
n
>>
bits
))
bits
+=
2
;
if
(
0x00000002
&
(
n
>>
bits
))
bits
+=
1
;
if
(
0x00000001
&
(
n
>>
bits
))
bits
+=
1
;
return
bits
;
}
static
__inline
int
WebRtcSpl_NormW32
(
WebRtc_Word32
a
)
{
int
zeros
;
if
(
a
<=
0
)
a
^=
0xFFFFFFFF
;
if
(
!
(
0xFFFF8000
&
a
))
{
zeros
=
16
;
}
else
{
zeros
=
0
;
}
if
(
!
(
0xFF800000
&
(
a
<<
zeros
)))
zeros
+=
8
;
if
(
!
(
0xF8000000
&
(
a
<<
zeros
)))
zeros
+=
4
;
if
(
!
(
0xE0000000
&
(
a
<<
zeros
)))
zeros
+=
2
;
if
(
!
(
0xC0000000
&
(
a
<<
zeros
)))
zeros
+=
1
;
return
zeros
;
}
static
__inline
int
WebRtcSpl_NormU32
(
WebRtc_UWord32
a
)
{
int
zeros
;
if
(
a
==
0
)
return
0
;
if
(
!
(
0xFFFF0000
&
a
))
{
zeros
=
16
;
}
else
{
zeros
=
0
;
}
if
(
!
(
0xFF000000
&
(
a
<<
zeros
)))
zeros
+=
8
;
if
(
!
(
0xF0000000
&
(
a
<<
zeros
)))
zeros
+=
4
;
if
(
!
(
0xC0000000
&
(
a
<<
zeros
)))
zeros
+=
2
;
if
(
!
(
0x80000000
&
(
a
<<
zeros
)))
zeros
+=
1
;
return
zeros
;
}
static
__inline
int
WebRtcSpl_NormW16
(
WebRtc_Word16
a
)
{
int
zeros
;
if
(
a
<=
0
)
a
^=
0xFFFF
;
if
(
!
(
0xFF80
&
a
))
{
zeros
=
8
;
}
else
{
zeros
=
0
;
}
if
(
!
(
0xF800
&
(
a
<<
zeros
)))
zeros
+=
4
;
if
(
!
(
0xE000
&
(
a
<<
zeros
)))
zeros
+=
2
;
if
(
!
(
0xC000
&
(
a
<<
zeros
)))
zeros
+=
1
;
return
zeros
;
}
#endif // WEBRTC_ARCH_ARM_V7A
#endif // WEBRTC_SPL_SPL_INL_H_
src/common_audio/signal_processing_library/main/interface/spl_inl_armv7.h
0 → 100644
View file @
35f5c9ce
/*
* Copyright (c) 2011 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.
*/
// This header file includes the inline functions for ARM processors in
// the fix point signal processing library.
#ifndef WEBRTC_SPL_SPL_INL_ARMV7_H_
#define WEBRTC_SPL_SPL_INL_ARMV7_H_
static
__inline
WebRtc_Word32
WEBRTC_SPL_MUL_16_32_RSFT16
(
WebRtc_Word16
a
,
WebRtc_Word32
b
)
{
WebRtc_Word32
tmp
;
__asm__
(
"smulwb %0, %1, %2"
:
"=r"
(
tmp
)
:
"r"
(
b
),
"r"
(
a
));
return
tmp
;
}
static
__inline
WebRtc_Word32
WEBRTC_SPL_MUL_32_32_RSFT32
(
WebRtc_Word16
a
,
WebRtc_Word16
b
,
WebRtc_Word32
c
)
{
WebRtc_Word32
tmp
;
__asm__
(
"pkhbt %0, %1, %2, lsl #16"
:
"=r"
(
tmp
)
:
"r"
(
b
),
"r"
(
a
));
__asm__
(
"smmul %0, %1, %2"
:
"=r"
(
tmp
)
:
"r"
(
tmp
),
"r"
(
c
));
return
tmp
;
}
static
__inline
WebRtc_Word32
WEBRTC_SPL_MUL_32_32_RSFT32BI
(
WebRtc_Word32
a
,
WebRtc_Word32
b
)
{
WebRtc_Word32
tmp
;
__asm__
(
"smmul %0, %1, %2"
:
"=r"
(
tmp
)
:
"r"
(
a
),
"r"
(
b
));
return
tmp
;
}
static
__inline
WebRtc_Word32
WEBRTC_SPL_MUL_16_16
(
WebRtc_Word16
a
,
WebRtc_Word16
b
)
{
WebRtc_Word32
tmp
;
__asm__
(
"smulbb %0, %1, %2"
:
"=r"
(
tmp
)
:
"r"
(
a
),
"r"
(
b
));
return
tmp
;
}
static
__inline
WebRtc_Word16
WebRtcSpl_AddSatW16
(
WebRtc_Word16
a
,
WebRtc_Word16
b
)
{
WebRtc_Word32
s_sum
;
__asm__
(
"qadd16 %0, %1, %2"
:
"=r"
(
s_sum
)
:
"r"
(
a
),
"r"
(
b
));
return
(
WebRtc_Word16
)
s_sum
;
}
static
__inline
WebRtc_Word32
WebRtcSpl_AddSatW32
(
WebRtc_Word32
l_var1
,
WebRtc_Word32
l_var2
)
{
WebRtc_Word32
l_sum
;
__asm__
(
"qadd %0, %1, %2"
:
"=r"
(
l_sum
)
:
"r"
(
l_var1
),
"r"
(
l_var2
));
return
l_sum
;
}
static
__inline
WebRtc_Word16
WebRtcSpl_SubSatW16
(
WebRtc_Word16
var1
,
WebRtc_Word16
var2
)
{
WebRtc_Word32
s_sub
;
__asm__
(
"qsub16 %0, %1, %2"
:
"=r"
(
s_sub
)
:
"r"
(
var1
),
"r"
(
var2
));
return
(
WebRtc_Word16
)
s_sub
;
}
static
__inline
WebRtc_Word32
WebRtcSpl_SubSatW32
(
WebRtc_Word32
l_var1
,
WebRtc_Word32
l_var2
)
{
WebRtc_Word32
l_sub
;
__asm__
(
"qsub %0, %1, %2"
:
"=r"
(
l_sub
)
:
"r"
(
l_var1
),
"r"
(
l_var2
));
return
l_sub
;
}
static
__inline
WebRtc_Word16
WebRtcSpl_GetSizeInBits
(
WebRtc_UWord32
n
)
{
WebRtc_Word32
tmp
;
__asm__
(
"clz %0, %1"
:
"=r"
(
tmp
)
:
"r"
(
n
));
return
(
WebRtc_Word16
)(
32
-
tmp
);
}
static
__inline
int
WebRtcSpl_NormW32
(
WebRtc_Word32
a
)
{
WebRtc_Word32
tmp
;
if
(
a
<=
0
)
a
^=
0xFFFFFFFF
;
__asm__
(
"clz %0, %1"
:
"=r"
(
tmp
)
:
"r"
(
a
));
return
tmp
-
1
;
}
static
__inline
int
WebRtcSpl_NormU32
(
WebRtc_UWord32
a
)
{
int
tmp
;
if
(
a
==
0
)
return
0
;
__asm__
(
"clz %0, %1"
:
"=r"
(
tmp
)
:
"r"
(
a
));
return
tmp
;
}
static
__inline
int
WebRtcSpl_NormW16
(
WebRtc_Word16
a
)
{
WebRtc_Word32
tmp
;
if
(
a
<=
0
)
a
^=
0xFFFFFFFF
;
__asm__
(
"clz %0, %1"
:
"=r"
(
tmp
)
:
"r"
(
a
));
return
tmp
-
17
;
}
#endif // WEBRTC_SPL_SPL_INL_ARMV7_H_
src/common_audio/signal_processing_library/main/source/auto_corr_to_refl_coef.c
0 → 100644
View file @
35f5c9ce
/*
* Copyright (c) 2011 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.
*/
/*
* This file contains the function WebRtcSpl_AutoCorrToReflCoef().
* The description header can be found in signal_processing_library.h
*
*/
#include
"signal_processing_library.h"
void
WebRtcSpl_AutoCorrToReflCoef
(
G_CONST
WebRtc_Word32
*
R
,
int
use_order
,
WebRtc_Word16
*
K
)
{
int
i
,
n
;
WebRtc_Word16
tmp
;
G_CONST
WebRtc_Word32
*
rptr
;
WebRtc_Word32
L_num
,
L_den
;
WebRtc_Word16
*
acfptr
,
*
pptr
,
*
wptr
,
*
p1ptr
,
*
w1ptr
,
ACF
[
WEBRTC_SPL_MAX_LPC_ORDER
],
P
[
WEBRTC_SPL_MAX_LPC_ORDER
],
W
[
WEBRTC_SPL_MAX_LPC_ORDER
];
// Initialize loop and pointers.
acfptr
=
ACF
;
rptr
=
R
;
pptr
=
P
;
p1ptr
=
&
P
[
1
];
w1ptr
=
&
W
[
1
];
wptr
=
w1ptr
;
// First loop; n=0. Determine shifting.
tmp
=
WebRtcSpl_NormW32
(
*
R
);
*
acfptr
=
(
WebRtc_Word16
)((
*
rptr
++
<<
tmp
)
>>
16
);
*
pptr
++
=
*
acfptr
++
;
// Initialize ACF, P and W.
for
(
i
=
1
;
i
<=
use_order
;
i
++
)
{
*
acfptr
=
(
WebRtc_Word16
)((
*
rptr
++
<<
tmp
)
>>
16
);
*
wptr
++
=
*
acfptr
;
*
pptr
++
=
*
acfptr
++
;
}
// Compute reflection coefficients.
for
(
n
=
1
;
n
<=
use_order
;
n
++
,
K
++
)
{
tmp
=
WEBRTC_SPL_ABS_W16
(
*
p1ptr
);
if
(
*
P
<
tmp
)
{
for
(
i
=
n
;
i
<=
use_order
;
i
++
)
*
K
++
=
0
;
return
;
}
// Division: WebRtcSpl_div(tmp, *P)
*
K
=
0
;
if
(
tmp
!=
0
)
{
L_num
=
tmp
;
L_den
=
*
P
;
i
=
15
;
while
(
i
--
)
{
(
*
K
)
<<=
1
;
L_num
<<=
1
;
if
(
L_num
>=
L_den
)
{
L_num
-=
L_den
;
(
*
K
)
++
;
}
}
if
(
*
p1ptr
>
0
)
*
K
=
-*
K
;
}
// Last iteration; don't do Schur recursion.
if
(
n
==
use_order
)
return
;
// Schur recursion.
pptr
=
P
;
wptr
=
w1ptr
;
tmp
=
(
WebRtc_Word16
)(((
WebRtc_Word32
)
*
p1ptr
*
(
WebRtc_Word32
)
*
K
+
16384
)
>>
15
);
*
pptr
=
WEBRTC_SPL_ADD_SAT_W16
(
*
pptr
,
tmp
);
pptr
++
;
for
(
i
=
1
;
i
<=
use_order
-
n
;
i
++
)
{
tmp
=
(
WebRtc_Word16
)(((
WebRtc_Word32
)
*
wptr
*
(
WebRtc_Word32
)
*
K
+
16384
)
>>
15
);
*
pptr
=
WEBRTC_SPL_ADD_SAT_W16
(
*
(
pptr
+
1
),
tmp
);
pptr
++
;
tmp
=
(
WebRtc_Word16
)(((
WebRtc_Word32
)
*
pptr
*
(
WebRtc_Word32
)
*
K
+
16384
)
>>
15
);
*
wptr
=
WEBRTC_SPL_ADD_SAT_W16
(
*
wptr
,
tmp
);
wptr
++
;
}
}
}
src/common_audio/signal_processing_library/main/source/auto_correlation.c
0 → 100644
View file @
35f5c9ce
/*
* Copyright (c) 2011 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.
*/
/*
* This file contains the function WebRtcSpl_AutoCorrelation().
* The description header can be found in signal_processing_library.h
*
*/
#include
"signal_processing_library.h"
int
WebRtcSpl_AutoCorrelation
(
G_CONST
WebRtc_Word16
*
in_vector
,
int
in_vector_length
,
int
order
,
WebRtc_Word32
*
result
,
int
*
scale
)
{
WebRtc_Word32
sum
;
int
i
,
j
;
WebRtc_Word16
smax
;
// Sample max
G_CONST
WebRtc_Word16
*
xptr1
;
G_CONST
WebRtc_Word16
*
xptr2
;
WebRtc_Word32
*
resultptr
;
int
scaling
=
0
;
#ifdef _ARM_OPT_
#pragma message("NOTE: _ARM_OPT_ optimizations are used")
WebRtc_Word16
loops4
;
#endif
if
(
order
<
0
)
order
=
in_vector_length
;
// Find the max. sample
smax
=
WebRtcSpl_MaxAbsValueW16
(
in_vector
,
in_vector_length
);
// In order to avoid overflow when computing the sum we should scale the samples so that
// (in_vector_length * smax * smax) will not overflow.
if
(
smax
==
0
)
{
scaling
=
0
;
}
else
{
int
nbits
=
WebRtcSpl_GetSizeInBits
(
in_vector_length
);
// # of bits in the sum loop
int
t
=
WebRtcSpl_NormW32
(
WEBRTC_SPL_MUL
(
smax
,
smax
));
// # of bits to normalize smax
if
(
t
>
nbits
)
{
scaling
=
0
;
}
else
{
scaling
=
nbits
-
t
;
}
}
resultptr
=
result
;
// Perform the actual correlation calculation
for
(
i
=
0
;
i
<
order
+
1
;
i
++
)
{
int
loops
=
(
in_vector_length
-
i
);
sum
=
0
;
xptr1
=
in_vector
;
xptr2
=
&
in_vector
[
i
];
#ifndef _ARM_OPT_
for
(
j
=
loops
;
j
>
0
;
j
--
)
{
sum
+=
WEBRTC_SPL_MUL_16_16_RSFT
(
*
xptr1
++
,
*
xptr2
++
,
scaling
);
}
#else
loops4
=
(
loops
>>
2
)
<<
2
;
if
(
scaling
==
0
)
{
for
(
j
=
0
;
j
<
loops4
;
j
=
j
+
4
)
{
sum
+=
WEBRTC_SPL_MUL_16_16
(
*
xptr1
,
*
xptr2
);
xptr1
++
;
xptr2
++
;
sum
+=
WEBRTC_SPL_MUL_16_16
(
*
xptr1
,
*
xptr2
);
xptr1
++
;
xptr2
++
;
sum
+=
WEBRTC_SPL_MUL_16_16
(
*
xptr1
,
*
xptr2
);
xptr1
++
;
xptr2
++
;
sum
+=
WEBRTC_SPL_MUL_16_16
(
*
xptr1
,
*
xptr2
);
xptr1
++
;
xptr2
++
;
}
for
(
j
=
loops4
;
j
<
loops
;
j
++
)
{
sum
+=
WEBRTC_SPL_MUL_16_16
(
*
xptr1
,
*
xptr2
);
xptr1
++
;
xptr2
++
;
}
}
else
{
for
(
j
=
0
;
j
<
loops4
;
j
=
j
+
4
)
{
sum
+=
WEBRTC_SPL_MUL_16_16_RSFT
(
*
xptr1
,
*
xptr2
,
scaling
);
xptr1
++
;
xptr2
++
;
sum
+=
WEBRTC_SPL_MUL_16_16_RSFT
(
*
xptr1
,
*
xptr2
,
scaling
);
xptr1
++
;
xptr2
++
;