Add a more correct absolute difference function to dsp-util.
Differences between signed samples cover the entire unsigned 32-bit range. "abs" will think any difference exceeding INT32_MAX is negative which is not corrent. Test which argument is greater and subtract the lesser from it, outputting unsigned difference. Change-Id: I73a8e5e418d49ff73d1a7c98eeb4731946dcfe84
This commit is contained in:
parent
2866063c3c
commit
e5c3327cef
2 changed files with 13 additions and 7 deletions
|
@ -18,8 +18,8 @@
|
||||||
* KIND, either express or implied.
|
* KIND, either express or implied.
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
#ifndef DSP_HELPER_H
|
#ifndef DSP_UTIL_H
|
||||||
#define DSP_HELPER_H
|
#define DSP_UTIL_H
|
||||||
|
|
||||||
/** Clip sample to signed 16 bit range **/
|
/** Clip sample to signed 16 bit range **/
|
||||||
|
|
||||||
|
@ -48,4 +48,11 @@ static FORCE_INLINE int32_t clip_sample_16(int32_t sample)
|
||||||
|
|
||||||
#undef CLIP_SAMPLE_16_DEFINED
|
#undef CLIP_SAMPLE_16_DEFINED
|
||||||
|
|
||||||
#endif /* DSP_HELPER_H */
|
/* Absolute difference of signed 32-bit numbers which must be dealt with
|
||||||
|
* in the unsigned 32-bit range */
|
||||||
|
static FORCE_INLINE uint32_t ad_s32(int32_t a, int32_t b)
|
||||||
|
{
|
||||||
|
return (a >= b) ? (a - b) : (b - a);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* DSP_UTIL_H */
|
||||||
|
|
|
@ -29,6 +29,7 @@
|
||||||
#include "system.h"
|
#include "system.h"
|
||||||
#include "tdspeed.h"
|
#include "tdspeed.h"
|
||||||
#include "settings.h"
|
#include "settings.h"
|
||||||
|
#include "dsp-util.h"
|
||||||
|
|
||||||
#define assert(cond)
|
#define assert(cond)
|
||||||
|
|
||||||
|
@ -308,8 +309,7 @@ static int tdspeed_apply(int32_t *buf_out[2], int32_t *buf_in[2],
|
||||||
|
|
||||||
for (int j = 0; j < st->dst_step; j += INC2, curr += INC2, prev += INC2)
|
for (int j = 0; j < st->dst_step; j += INC2, curr += INC2, prev += INC2)
|
||||||
{
|
{
|
||||||
int32_t diff = *curr - *prev;
|
delta += ad_s32(*curr, *prev);
|
||||||
delta += abs(diff);
|
|
||||||
|
|
||||||
if (delta >= min_delta)
|
if (delta >= min_delta)
|
||||||
goto skip;
|
goto skip;
|
||||||
|
@ -322,8 +322,7 @@ static int tdspeed_apply(int32_t *buf_out[2], int32_t *buf_in[2],
|
||||||
|
|
||||||
for (int j = 0; j < st->dst_step; j += INC2, curr += INC2, prev += INC2)
|
for (int j = 0; j < st->dst_step; j += INC2, curr += INC2, prev += INC2)
|
||||||
{
|
{
|
||||||
int32_t diff = *curr - *prev;
|
delta += ad_s32(*curr, *prev);
|
||||||
delta += abs(diff);
|
|
||||||
|
|
||||||
if (delta >= min_delta)
|
if (delta >= min_delta)
|
||||||
goto skip;
|
goto skip;
|
||||||
|
|
Loading…
Reference in a new issue