Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/alexmarsev/libbs2b.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorboris_mikhaylov <boris_mikhaylov@bc0edfbe-c936-4687-b64d-f70bc3985e72>2009-03-23 19:07:57 +0300
committerboris_mikhaylov <boris_mikhaylov@bc0edfbe-c936-4687-b64d-f70bc3985e72>2009-03-23 19:07:57 +0300
commitfb03181bae27e555f81654bb448beeae835f1a5f (patch)
tree7e618bbadc4325cdd692b1937fb156940c05848c
parent60bbdc99097a44f88857729047a298f726732a87 (diff)
Normalization of integer samples are removed.
git-svn-id: svn://svn.code.sf.net/p/bs2b/code/trunk/libbs2b@83 bc0edfbe-c936-4687-b64d-f70bc3985e72
-rw-r--r--src/bs2b.c203
1 files changed, 152 insertions, 51 deletions
diff --git a/src/bs2b.c b/src/bs2b.c
index 47f8fe5..a5ca601 100644
--- a/src/bs2b.c
+++ b/src/bs2b.c
@@ -233,12 +233,6 @@ static void cross_feed_d( t_bs2bdp bs2bdp, double *sample )
/* Bass boost cause allpass attenuation */
sample[ 0 ] *= bs2bdp->gain;
sample[ 1 ] *= bs2bdp->gain;
-
- /* Clipping of overloaded samples */
- if( sample[ 0 ] > 1.0 ) sample[ 0 ] = 1.0;
- if( sample[ 0 ] < -1.0 ) sample[ 0 ] = -1.0;
- if( sample[ 1 ] > 1.0 ) sample[ 1 ] = 1.0;
- if( sample[ 1 ] < -1.0 ) sample[ 1 ] = -1.0;
} /* cross_feed_d() */
/* Exported functions.
@@ -337,6 +331,13 @@ void bs2b_cross_feed_d( t_bs2bdp bs2bdp, double *sample, int n )
while( n-- )
{
cross_feed_d( bs2bdp, sample );
+
+ /* Clipping of overloaded samples */
+ if( sample[ 0 ] > 1.0 ) sample[ 0 ] = 1.0;
+ if( sample[ 0 ] < -1.0 ) sample[ 0 ] = -1.0;
+ if( sample[ 1 ] > 1.0 ) sample[ 1 ] = 1.0;
+ if( sample[ 1 ] < -1.0 ) sample[ 1 ] = -1.0;
+
sample += 2;
} /* while */
} /* if */
@@ -355,6 +356,12 @@ void bs2b_cross_feed_dbe( t_bs2bdp bs2bdp, double *sample, int n )
cross_feed_d( bs2bdp, sample );
+ /* Clipping of overloaded samples */
+ if( sample[ 0 ] > 1.0 ) sample[ 0 ] = 1.0;
+ if( sample[ 0 ] < -1.0 ) sample[ 0 ] = -1.0;
+ if( sample[ 1 ] > 1.0 ) sample[ 1 ] = 1.0;
+ if( sample[ 1 ] < -1.0 ) sample[ 1 ] = -1.0;
+
#ifndef WORDS_BIGENDIAN
int64swap( ( uint32_t * )sample );
int64swap( ( uint32_t * )( sample + 1 ) );
@@ -378,6 +385,12 @@ void bs2b_cross_feed_dle( t_bs2bdp bs2bdp, double *sample, int n )
cross_feed_d( bs2bdp, sample );
+ /* Clipping of overloaded samples */
+ if( sample[ 0 ] > 1.0 ) sample[ 0 ] = 1.0;
+ if( sample[ 0 ] < -1.0 ) sample[ 0 ] = -1.0;
+ if( sample[ 1 ] > 1.0 ) sample[ 1 ] = 1.0;
+ if( sample[ 1 ] < -1.0 ) sample[ 1 ] = -1.0;
+
#ifdef WORDS_BIGENDIAN
int64swap( ( uint32_t * )sample );
int64swap( ( uint32_t * )( sample + 1 ) );
@@ -401,6 +414,12 @@ void bs2b_cross_feed_f( t_bs2bdp bs2bdp, float *sample, int n )
cross_feed_d( bs2bdp, sample_d );
+ /* Clipping of overloaded samples */
+ if( sample_d[ 0 ] > 1.0 ) sample_d[ 0 ] = 1.0;
+ if( sample_d[ 0 ] < -1.0 ) sample_d[ 0 ] = -1.0;
+ if( sample_d[ 1 ] > 1.0 ) sample_d[ 1 ] = 1.0;
+ if( sample_d[ 1 ] < -1.0 ) sample_d[ 1 ] = -1.0;
+
sample[ 0 ] = ( float )sample_d[ 0 ];
sample[ 1 ] = ( float )sample_d[ 1 ];
@@ -427,6 +446,12 @@ void bs2b_cross_feed_fbe( t_bs2bdp bs2bdp, float *sample, int n )
cross_feed_d( bs2bdp, sample_d );
+ /* Clipping of overloaded samples */
+ if( sample_d[ 0 ] > 1.0 ) sample_d[ 0 ] = 1.0;
+ if( sample_d[ 0 ] < -1.0 ) sample_d[ 0 ] = -1.0;
+ if( sample_d[ 1 ] > 1.0 ) sample_d[ 1 ] = 1.0;
+ if( sample_d[ 1 ] < -1.0 ) sample_d[ 1 ] = -1.0;
+
sample[ 0 ] = ( float )sample_d[ 0 ];
sample[ 1 ] = ( float )sample_d[ 1 ];
@@ -458,6 +483,12 @@ void bs2b_cross_feed_fle( t_bs2bdp bs2bdp, float *sample, int n )
cross_feed_d( bs2bdp, sample_d );
+ /* Clipping of overloaded samples */
+ if( sample_d[ 0 ] > 1.0 ) sample_d[ 0 ] = 1.0;
+ if( sample_d[ 0 ] < -1.0 ) sample_d[ 0 ] = -1.0;
+ if( sample_d[ 1 ] > 1.0 ) sample_d[ 1 ] = 1.0;
+ if( sample_d[ 1 ] < -1.0 ) sample_d[ 1 ] = -1.0;
+
sample[ 0 ] = ( float )sample_d[ 0 ];
sample[ 1 ] = ( float )sample_d[ 1 ];
@@ -472,9 +503,13 @@ void bs2b_cross_feed_fle( t_bs2bdp bs2bdp, float *sample, int n )
} /* bs2b_cross_feed_fle() */
#define MAX_INT32_VALUE 2147483647.0
+#define MIN_INT32_VALUE -2147483648.0
+#define MAX_INT24_VALUE 8388607.0
+#define MIN_INT24_VALUE -8388608.0
#define MAX_INT16_VALUE 32767.0
+#define MIN_INT16_VALUE -32768.0
#define MAX_INT8_VALUE 127.0
-#define MAX_INT24_VALUE 8388607.0
+#define MIN_INT8_VALUE -128.0
void bs2b_cross_feed_s32( t_bs2bdp bs2bdp, int32_t *sample, int n )
{
@@ -484,13 +519,19 @@ void bs2b_cross_feed_s32( t_bs2bdp bs2bdp, int32_t *sample, int n )
{
while( n-- )
{
- sample_d[ 0 ] = ( double )sample[ 0 ] / MAX_INT32_VALUE;
- sample_d[ 1 ] = ( double )sample[ 1 ] / MAX_INT32_VALUE;
+ sample_d[ 0 ] = ( double )sample[ 0 ];
+ sample_d[ 1 ] = ( double )sample[ 1 ];
cross_feed_d( bs2bdp, sample_d );
- sample[ 0 ] = ( int32_t )( sample_d[ 0 ] * MAX_INT32_VALUE );
- sample[ 1 ] = ( int32_t )( sample_d[ 1 ] * MAX_INT32_VALUE );
+ /* Clipping of overloaded samples */
+ if( sample_d[ 0 ] > MAX_INT32_VALUE ) sample_d[ 0 ] = MAX_INT32_VALUE;
+ if( sample_d[ 0 ] < MIN_INT32_VALUE ) sample_d[ 0 ] = MIN_INT32_VALUE;
+ if( sample_d[ 1 ] > MAX_INT32_VALUE ) sample_d[ 1 ] = MAX_INT32_VALUE;
+ if( sample_d[ 1 ] < MIN_INT32_VALUE ) sample_d[ 1 ] = MIN_INT32_VALUE;
+
+ sample[ 0 ] = ( int32_t )sample_d[ 0 ];
+ sample[ 1 ] = ( int32_t )sample_d[ 1 ];
sample += 2;
} /* while */
@@ -510,13 +551,19 @@ void bs2b_cross_feed_s32be( t_bs2bdp bs2bdp, int32_t *sample, int n )
int32swap( sample + 1 );
#endif
- sample_d[ 0 ] = ( double )sample[ 0 ] / MAX_INT32_VALUE;
- sample_d[ 1 ] = ( double )sample[ 1 ] / MAX_INT32_VALUE;
+ sample_d[ 0 ] = ( double )sample[ 0 ];
+ sample_d[ 1 ] = ( double )sample[ 1 ];
cross_feed_d( bs2bdp, sample_d );
- sample[ 0 ] = ( int32_t )( sample_d[ 0 ] * MAX_INT32_VALUE );
- sample[ 1 ] = ( int32_t )( sample_d[ 1 ] * MAX_INT32_VALUE );
+ /* Clipping of overloaded samples */
+ if( sample_d[ 0 ] > MAX_INT32_VALUE ) sample_d[ 0 ] = MAX_INT32_VALUE;
+ if( sample_d[ 0 ] < MIN_INT32_VALUE ) sample_d[ 0 ] = MIN_INT32_VALUE;
+ if( sample_d[ 1 ] > MAX_INT32_VALUE ) sample_d[ 1 ] = MAX_INT32_VALUE;
+ if( sample_d[ 1 ] < MIN_INT32_VALUE ) sample_d[ 1 ] = MIN_INT32_VALUE;
+
+ sample[ 0 ] = ( int32_t )sample_d[ 0 ];
+ sample[ 1 ] = ( int32_t )sample_d[ 1 ];
#ifndef WORDS_BIGENDIAN
int32swap( sample );
@@ -541,13 +588,19 @@ void bs2b_cross_feed_s32le( t_bs2bdp bs2bdp, int32_t *sample, int n )
int32swap( sample + 1 );
#endif
- sample_d[ 0 ] = ( double )sample[ 0 ] / MAX_INT32_VALUE;
- sample_d[ 1 ] = ( double )sample[ 1 ] / MAX_INT32_VALUE;
+ sample_d[ 0 ] = ( double )sample[ 0 ];
+ sample_d[ 1 ] = ( double )sample[ 1 ];
cross_feed_d( bs2bdp, sample_d );
- sample[ 0 ] = ( int32_t )( sample_d[ 0 ] * MAX_INT32_VALUE );
- sample[ 1 ] = ( int32_t )( sample_d[ 1 ] * MAX_INT32_VALUE );
+ /* Clipping of overloaded samples */
+ if( sample_d[ 0 ] > MAX_INT32_VALUE ) sample_d[ 0 ] = MAX_INT32_VALUE;
+ if( sample_d[ 0 ] < MIN_INT32_VALUE ) sample_d[ 0 ] = MIN_INT32_VALUE;
+ if( sample_d[ 1 ] > MAX_INT32_VALUE ) sample_d[ 1 ] = MAX_INT32_VALUE;
+ if( sample_d[ 1 ] < MIN_INT32_VALUE ) sample_d[ 1 ] = MIN_INT32_VALUE;
+
+ sample[ 0 ] = ( int32_t )sample_d[ 0 ];
+ sample[ 1 ] = ( int32_t )sample_d[ 1 ];
#ifdef WORDS_BIGENDIAN
int32swap( sample );
@@ -567,13 +620,19 @@ void bs2b_cross_feed_s16( t_bs2bdp bs2bdp, int16_t *sample, int n )
{
while( n-- )
{
- sample_d[ 0 ] = ( double )sample[ 0 ] / MAX_INT16_VALUE;
- sample_d[ 1 ] = ( double )sample[ 1 ] / MAX_INT16_VALUE;
+ sample_d[ 0 ] = ( double )sample[ 0 ];
+ sample_d[ 1 ] = ( double )sample[ 1 ];
cross_feed_d( bs2bdp, sample_d );
- sample[ 0 ] = ( int16_t )( sample_d[ 0 ] * MAX_INT16_VALUE );
- sample[ 1 ] = ( int16_t )( sample_d[ 1 ] * MAX_INT16_VALUE );
+ /* Clipping of overloaded samples */
+ if( sample_d[ 0 ] > MAX_INT16_VALUE ) sample_d[ 0 ] = MAX_INT16_VALUE;
+ if( sample_d[ 0 ] < MIN_INT16_VALUE ) sample_d[ 0 ] = MIN_INT16_VALUE;
+ if( sample_d[ 1 ] > MAX_INT16_VALUE ) sample_d[ 1 ] = MAX_INT16_VALUE;
+ if( sample_d[ 1 ] < MIN_INT16_VALUE ) sample_d[ 1 ] = MIN_INT16_VALUE;
+
+ sample[ 0 ] = ( int16_t )sample_d[ 0 ];
+ sample[ 1 ] = ( int16_t )sample_d[ 1 ];
sample += 2;
} /* while */
@@ -593,13 +652,19 @@ void bs2b_cross_feed_s16be( t_bs2bdp bs2bdp, int16_t *sample, int n )
int16swap( sample + 1 );
#endif
- sample_d[ 0 ] = ( double )sample[ 0 ] / MAX_INT16_VALUE;
- sample_d[ 1 ] = ( double )sample[ 1 ] / MAX_INT16_VALUE;
+ sample_d[ 0 ] = ( double )sample[ 0 ];
+ sample_d[ 1 ] = ( double )sample[ 1 ];
cross_feed_d( bs2bdp, sample_d );
- sample[ 0 ] = ( int16_t )( sample_d[ 0 ] * MAX_INT16_VALUE );
- sample[ 1 ] = ( int16_t )( sample_d[ 1 ] * MAX_INT16_VALUE );
+ /* Clipping of overloaded samples */
+ if( sample_d[ 0 ] > MAX_INT16_VALUE ) sample_d[ 0 ] = MAX_INT16_VALUE;
+ if( sample_d[ 0 ] < MIN_INT16_VALUE ) sample_d[ 0 ] = MIN_INT16_VALUE;
+ if( sample_d[ 1 ] > MAX_INT16_VALUE ) sample_d[ 1 ] = MAX_INT16_VALUE;
+ if( sample_d[ 1 ] < MIN_INT16_VALUE ) sample_d[ 1 ] = MIN_INT16_VALUE;
+
+ sample[ 0 ] = ( int16_t )sample_d[ 0 ];
+ sample[ 1 ] = ( int16_t )sample_d[ 1 ];
#ifndef WORDS_BIGENDIAN
int16swap( sample );
@@ -624,13 +689,19 @@ void bs2b_cross_feed_s16le( t_bs2bdp bs2bdp, int16_t *sample, int n )
int16swap( sample + 1 );
#endif
- sample_d[ 0 ] = ( double )sample[ 0 ] / MAX_INT16_VALUE;
- sample_d[ 1 ] = ( double )sample[ 1 ] / MAX_INT16_VALUE;
+ sample_d[ 0 ] = ( double )sample[ 0 ];
+ sample_d[ 1 ] = ( double )sample[ 1 ];
cross_feed_d( bs2bdp, sample_d );
- sample[ 0 ] = ( int16_t )( sample_d[ 0 ] * MAX_INT16_VALUE );
- sample[ 1 ] = ( int16_t )( sample_d[ 1 ] * MAX_INT16_VALUE );
+ /* Clipping of overloaded samples */
+ if( sample_d[ 0 ] > MAX_INT16_VALUE ) sample_d[ 0 ] = MAX_INT16_VALUE;
+ if( sample_d[ 0 ] < MIN_INT16_VALUE ) sample_d[ 0 ] = MIN_INT16_VALUE;
+ if( sample_d[ 1 ] > MAX_INT16_VALUE ) sample_d[ 1 ] = MAX_INT16_VALUE;
+ if( sample_d[ 1 ] < MIN_INT16_VALUE ) sample_d[ 1 ] = MIN_INT16_VALUE;
+
+ sample[ 0 ] = ( int16_t )sample_d[ 0 ];
+ sample[ 1 ] = ( int16_t )sample_d[ 1 ];
#ifdef WORDS_BIGENDIAN
int16swap( sample );
@@ -650,13 +721,19 @@ void bs2b_cross_feed_s8( t_bs2bdp bs2bdp, int8_t *sample, int n )
{
while( n-- )
{
- sample_d[ 0 ] = ( double )sample[ 0 ] / MAX_INT8_VALUE;
- sample_d[ 1 ] = ( double )sample[ 1 ] / MAX_INT8_VALUE;
+ sample_d[ 0 ] = ( double )sample[ 0 ];
+ sample_d[ 1 ] = ( double )sample[ 1 ];
cross_feed_d( bs2bdp, sample_d );
- sample[ 0 ] = ( int8_t )( sample_d[ 0 ] * MAX_INT8_VALUE );
- sample[ 1 ] = ( int8_t )( sample_d[ 1 ] * MAX_INT8_VALUE );
+ /* Clipping of overloaded samples */
+ if( sample_d[ 0 ] > MAX_INT8_VALUE ) sample_d[ 0 ] = MAX_INT8_VALUE;
+ if( sample_d[ 0 ] < MIN_INT8_VALUE ) sample_d[ 0 ] = MIN_INT8_VALUE;
+ if( sample_d[ 1 ] > MAX_INT8_VALUE ) sample_d[ 1 ] = MAX_INT8_VALUE;
+ if( sample_d[ 1 ] < MIN_INT8_VALUE ) sample_d[ 1 ] = MIN_INT8_VALUE;
+
+ sample[ 0 ] = ( int8_t )sample_d[ 0 ];
+ sample[ 1 ] = ( int8_t )sample_d[ 1 ];
sample += 2;
} /* while */
@@ -671,13 +748,19 @@ void bs2b_cross_feed_u8( t_bs2bdp bs2bdp, uint8_t *sample, int n )
{
while( n-- )
{
- sample_d[ 0 ] = ( ( double )( ( int8_t )( sample[ 0 ] ^ 0x80 ) ) ) / MAX_INT8_VALUE;
- sample_d[ 1 ] = ( ( double )( ( int8_t )( sample[ 1 ] ^ 0x80 ) ) ) / MAX_INT8_VALUE;
+ sample_d[ 0 ] = ( double )( ( int8_t )( sample[ 0 ] ^ 0x80 ) );
+ sample_d[ 1 ] = ( double )( ( int8_t )( sample[ 1 ] ^ 0x80 ) );
cross_feed_d( bs2bdp, sample_d );
- sample[ 0 ] = ( ( uint8_t )( sample_d[ 0 ] * MAX_INT8_VALUE ) ) ^ 0x80;
- sample[ 1 ] = ( ( uint8_t )( sample_d[ 1 ] * MAX_INT8_VALUE ) ) ^ 0x80;
+ /* Clipping of overloaded samples */
+ if( sample_d[ 0 ] > MAX_INT8_VALUE ) sample_d[ 0 ] = MAX_INT8_VALUE;
+ if( sample_d[ 0 ] < MIN_INT8_VALUE ) sample_d[ 0 ] = MIN_INT8_VALUE;
+ if( sample_d[ 1 ] > MAX_INT8_VALUE ) sample_d[ 1 ] = MAX_INT8_VALUE;
+ if( sample_d[ 1 ] < MIN_INT8_VALUE ) sample_d[ 1 ] = MIN_INT8_VALUE;
+
+ sample[ 0 ] = ( ( uint8_t )sample_d[ 0 ] ) ^ 0x80;
+ sample[ 1 ] = ( ( uint8_t )sample_d[ 1 ] ) ^ 0x80;
sample += 2;
} /* while */
@@ -692,13 +775,19 @@ void bs2b_cross_feed_s24( t_bs2bdp bs2bdp, bs2b_int24_t *sample, int n )
{
while( n-- )
{
- sample_d[ 0 ] = int242double( sample ) / MAX_INT24_VALUE;
- sample_d[ 1 ] = int242double( sample + 1 ) / MAX_INT24_VALUE;
+ sample_d[ 0 ] = int242double( sample );
+ sample_d[ 1 ] = int242double( sample + 1 );
cross_feed_d( bs2bdp, sample_d );
- double2int24( sample_d[ 0 ] * MAX_INT24_VALUE, sample );
- double2int24( sample_d[ 1 ] * MAX_INT24_VALUE, sample + 1 );
+ /* Clipping of overloaded samples */
+ if( sample_d[ 0 ] > MAX_INT24_VALUE ) sample_d[ 0 ] = MAX_INT24_VALUE;
+ if( sample_d[ 0 ] < MIN_INT24_VALUE ) sample_d[ 0 ] = MIN_INT24_VALUE;
+ if( sample_d[ 1 ] > MAX_INT24_VALUE ) sample_d[ 1 ] = MAX_INT24_VALUE;
+ if( sample_d[ 1 ] < MIN_INT24_VALUE ) sample_d[ 1 ] = MIN_INT24_VALUE;
+
+ double2int24( sample_d[ 0 ], sample );
+ double2int24( sample_d[ 1 ], sample + 1 );
sample += 2;
} /* while */
@@ -718,13 +807,19 @@ void bs2b_cross_feed_s24be( t_bs2bdp bs2bdp, bs2b_int24_t *sample, int n )
int24swap( ( bs2b_uint24_t * )( sample + 1 ) );
#endif
- sample_d[ 0 ] = int242double( sample ) / MAX_INT24_VALUE;
- sample_d[ 1 ] = int242double( sample + 1 ) / MAX_INT24_VALUE;
+ sample_d[ 0 ] = int242double( sample );
+ sample_d[ 1 ] = int242double( sample + 1 );
cross_feed_d( bs2bdp, sample_d );
- double2int24( sample_d[ 0 ] * MAX_INT24_VALUE, sample );
- double2int24( sample_d[ 1 ] * MAX_INT24_VALUE, sample + 1 );
+ /* Clipping of overloaded samples */
+ if( sample_d[ 0 ] > MAX_INT24_VALUE ) sample_d[ 0 ] = MAX_INT24_VALUE;
+ if( sample_d[ 0 ] < MIN_INT24_VALUE ) sample_d[ 0 ] = MIN_INT24_VALUE;
+ if( sample_d[ 1 ] > MAX_INT24_VALUE ) sample_d[ 1 ] = MAX_INT24_VALUE;
+ if( sample_d[ 1 ] < MIN_INT24_VALUE ) sample_d[ 1 ] = MIN_INT24_VALUE;
+
+ double2int24( sample_d[ 0 ], sample );
+ double2int24( sample_d[ 1 ], sample + 1 );
#ifndef WORDS_BIGENDIAN
int24swap( ( bs2b_uint24_t * )sample );
@@ -749,13 +844,19 @@ void bs2b_cross_feed_s24le( t_bs2bdp bs2bdp, bs2b_int24_t *sample, int n )
int24swap( ( bs2b_uint24_t * )( sample + 1 ) );
#endif
- sample_d[ 0 ] = int242double( sample ) / MAX_INT24_VALUE;
- sample_d[ 1 ] = int242double( sample + 1 ) / MAX_INT24_VALUE;
+ sample_d[ 0 ] = int242double( sample );
+ sample_d[ 1 ] = int242double( sample + 1 );
cross_feed_d( bs2bdp, sample_d );
- double2int24( sample_d[ 0 ] * MAX_INT24_VALUE, sample );
- double2int24( sample_d[ 1 ] * MAX_INT24_VALUE, sample + 1 );
+ /* Clipping of overloaded samples */
+ if( sample_d[ 0 ] > MAX_INT24_VALUE ) sample_d[ 0 ] = MAX_INT24_VALUE;
+ if( sample_d[ 0 ] < MIN_INT24_VALUE ) sample_d[ 0 ] = MIN_INT24_VALUE;
+ if( sample_d[ 1 ] > MAX_INT24_VALUE ) sample_d[ 1 ] = MAX_INT24_VALUE;
+ if( sample_d[ 1 ] < MIN_INT24_VALUE ) sample_d[ 1 ] = MIN_INT24_VALUE;
+
+ double2int24( sample_d[ 0 ], sample );
+ double2int24( sample_d[ 1 ], sample + 1 );
#ifdef WORDS_BIGENDIAN
int24swap( ( bs2b_uint24_t * )sample );