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-31 16:51:10 +0400
committerboris_mikhaylov <boris_mikhaylov@bc0edfbe-c936-4687-b64d-f70bc3985e72>2009-03-31 16:51:10 +0400
commit59d0a008793c682e93f047dbbc8d44049af3c289 (patch)
tree16d2f186182ea51ef712e5a75ff5b2281dba4e12
parentab88eeaa2ec68ec5ff54f312b0964b76e48e56a2 (diff)
Changed and extended presets.
git-svn-id: svn://svn.code.sf.net/p/bs2b/code/trunk/libbs2b@88 bc0edfbe-c936-4687-b64d-f70bc3985e72
-rw-r--r--ChangeLog3
-rw-r--r--src/bs2b.c134
-rw-r--r--src/bs2b.h66
-rw-r--r--src/bs2bclass.cpp25
-rw-r--r--src/bs2bclass.h5
5 files changed, 158 insertions, 75 deletions
diff --git a/ChangeLog b/ChangeLog
index 63d3c36..2a7c49c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,6 @@
+2009-03-31 Boris Mikhaylov <http://www.tmn.ru/~bor>
+ * Changed and extended presets.
+
2009-03-24 Boris Mikhaylov <http://www.tmn.ru/~bor>
* Added unsigned 16/24/32 integer handling.
diff --git a/src/bs2b.c b/src/bs2b.c
index f0b3293..7fb7e46 100644
--- a/src/bs2b.c
+++ b/src/bs2b.c
@@ -23,6 +23,7 @@
#include <math.h>
#include <malloc.h>
+#include <memory.h>
#include "bs2b.h"
@@ -129,59 +130,37 @@ static void double2uint24( double in, bs2b_uint24_t *out )
/* Set up bs2b data. */
static void init( t_bs2bdp bs2bdp )
{
- double Fc_lo, Fc_hi;
- double G_lo, G_hi;
+ double Fc_lo; /* Lowpass filter cut frequency (Hz) */
+ double Fc_hi; /* Highboost filter cut frequency (Hz) */
+ double G_lo; /* Lowpass filter gain (multiplier) */
+ double G_hi; /* Highboost filter gain (multiplier) */
+ double GB_lo; /* Lowpass filter gain (dB) */
+ double GB_hi; /* Highboost filter gain (dB) ( 0 dB is highs ) */
+ double level; /* Feeding level (dB) ( level = GB_lo - GB_hi ) */
double x;
- if( ( bs2bdp->srate > 384000 ) || ( bs2bdp->srate < 2000 ) )
+ if( ( bs2bdp->srate > BS2B_MAXSRATE ) || ( bs2bdp->srate < BS2B_MINSRATE ) )
bs2bdp->srate = BS2B_DEFAULT_SRATE;
-
- switch( bs2bdp->level )
+
+ Fc_lo = bs2bdp->level & 0xffff;
+ level = ( bs2bdp->level & 0xffff0000 ) >> 16;
+
+ if( ( Fc_lo > BS2B_MAXFCUT ) || ( Fc_lo < BS2B_MINFCUT ) ||
+ ( level > BS2B_MAXFEED ) || ( level < BS2B_MINFEED ) )
{
- case BS2B_LOW_CLEVEL: /* Low crossfeed level */
- Fc_lo = 360.0;
- Fc_hi = 501.0;
- G_lo = 0.398107170553497;
- G_hi = 0.205671765275719;
- break;
-
- case BS2B_MIDDLE_CLEVEL: /* Middle crossfeed level */
- Fc_lo = 500.0;
- Fc_hi = 711.0;
- G_lo = 0.459726988530872;
- G_hi = 0.228208484414988;
- break;
-
- case BS2B_HIGH_CLEVEL: /* High crossfeed level */
- Fc_lo = 700.0;
- Fc_hi = 1021.0;
- G_lo = 0.530884444230988;
- G_hi = 0.250105790667544;
- break;
-
- case BS2B_LOW_ECLEVEL: /* Low easy crossfeed level */
- Fc_lo = 360.0;
- Fc_hi = 494.0;
- G_lo = 0.316227766016838;
- G_hi = 0.168236228897329;
- break;
-
- case BS2B_MIDDLE_ECLEVEL: /* Middle easy crossfeed level */
- Fc_lo = 500.0;
- Fc_hi = 689.0;
- G_lo = 0.354813389233575;
- G_hi = 0.187169483835901;
- break;
-
- default: /* High easy crossfeed level */
- bs2bdp->level = BS2B_HIGH_ECLEVEL;
-
- Fc_lo = 700.0;
- Fc_hi = 975.0;
- G_lo = 0.398107170553497;
- G_hi = 0.205671765275719;
- break;
- } /* switch */
+ bs2bdp->level = BS2B_DEFAULT_CLEVEL;
+ Fc_lo = bs2bdp->level & 0xffff;
+ level = ( bs2bdp->level & 0xffff0000 ) >> 16;
+ }
+
+ level /= 10.0;
+
+ GB_lo = level * -5.0 / 6.0 - 3.0;
+ GB_hi = level / 6.0 - 3.0;
+
+ G_lo = pow( 10, GB_lo / 20.0 );
+ G_hi = 1.0 - pow( 10, GB_hi / 20.0 );
+ Fc_hi = Fc_lo * pow( 2.0, ( GB_lo - 20.0 * log10( G_hi ) ) / 12.0 );
/* $fc = $Fc / $s;
* $d = 1 / 2 / pi / $fc;
@@ -245,7 +224,7 @@ t_bs2bdp bs2b_open( void )
if( bs2bdp = malloc( sizeof( t_bs2bd ) ) )
{
- bs2bdp->srate = 0;
+ memset( bs2bdp, 0, sizeof( t_bs2bd ) );
bs2b_set_srate( bs2bdp, BS2B_DEFAULT_SRATE );
}
@@ -272,6 +251,52 @@ uint32_t bs2b_get_level( t_bs2bdp bs2bdp )
return bs2bdp->level;
} /* bs2b_get_level() */
+void bs2b_set_level_fcut( t_bs2bdp bs2bdp, int fcut )
+{
+ uint32_t level;
+
+ if( ! bs2bdp ) return;
+
+ level = bs2bdp->level;
+ level &= 0xffff0000;
+ level |= ( uint32_t )fcut;
+ bs2b_set_level( bs2bdp, level );
+} /* bs2b_set_level_fcut() */
+
+int bs2b_get_level_fcut( t_bs2bdp bs2bdp )
+{
+ return( ( int )( bs2bdp->level & 0xffff ) );
+} /* bs2b_get_level_fcut() */
+
+void bs2b_set_level_feed( t_bs2bdp bs2bdp, int feed )
+{
+ uint32_t level;
+
+ if( ! bs2bdp ) return;
+
+ level = bs2bdp->level;
+ level &= ( uint32_t )0xffff;
+ level |= ( uint32_t )feed << 16;
+ bs2b_set_level( bs2bdp, level );
+} /* bs2b_set_level_feed() */
+
+int bs2b_get_level_feed( t_bs2bdp bs2bdp )
+{
+ return( ( int )( ( bs2bdp->level & 0xffff0000 ) >> 16 ) );
+} /* bs2b_get_level_feed() */
+
+int bs2b_get_level_delay( t_bs2bdp bs2bdp )
+{
+ int x;
+
+ x = bs2bdp->level & 0xffff; /* get cut frequency */
+
+ if( ( x > BS2B_MAXFCUT ) || ( x < BS2B_MINFCUT ) )
+ return 0;
+
+ return( ( 18700 / x ) * 10 );
+} /* bs2b_get_level_delay() */
+
void bs2b_set_srate( t_bs2bdp bs2bdp, uint32_t srate )
{
if( ! bs2bdp ) return;
@@ -290,15 +315,8 @@ uint32_t bs2b_get_srate( t_bs2bdp bs2bdp )
void bs2b_clear( t_bs2bdp bs2bdp )
{
- int loopv;
-
if( ! bs2bdp ) return;
-
- loopv = sizeof( bs2bdp->lfs );
- while( loopv )
- {
- ( ( char * )&bs2bdp->lfs )[ --loopv ] = 0;
- }
+ memset( &bs2bdp->lfs, 0, sizeof( bs2bdp->lfs ) );
} /* bs2b_clear() */
int bs2b_is_clear( t_bs2bdp bs2bdp )
diff --git a/src/bs2b.h b/src/bs2b.h
index 811351f..ccdb6db 100644
--- a/src/bs2b.h
+++ b/src/bs2b.h
@@ -27,23 +27,38 @@
#include "bs2bversion.h"
#include "bs2btypes.h"
-/* Number of crossfeed levels */
-#define BS2B_CLEVELS 3
-
-/* Normal crossfeed levels */
-#define BS2B_HIGH_CLEVEL 3
-#define BS2B_MIDDLE_CLEVEL 2
-#define BS2B_LOW_CLEVEL 1
-
-/* Easy crossfeed levels */
-#define BS2B_HIGH_ECLEVEL BS2B_HIGH_CLEVEL + BS2B_CLEVELS
-#define BS2B_MIDDLE_ECLEVEL BS2B_MIDDLE_CLEVEL + BS2B_CLEVELS
-#define BS2B_LOW_ECLEVEL BS2B_LOW_CLEVEL + BS2B_CLEVELS
+/* Minimum/maximum sample rate (Hz) */
+#define BS2B_MINSRATE 2000
+#define BS2B_MAXSRATE 384000
+
+/* Minimum/maximum cut frequency (Hz) */
+/* bs2b_set_level_fcut() */
+#define BS2B_MINFCUT 300
+#define BS2B_MAXFCUT 1000
+
+/* Minimum/maximum feed level (dB * 10 @ low frequencies) */
+/* bs2b_set_level_feed() */
+#define BS2B_MINFEED 10 /* 1 dB */
+#define BS2B_MAXFEED 150 /* 15 dB */
+
+/* Normal crossfeed levels (Obsolete) */
+#define BS2B_HIGH_CLEVEL ( ( uint32_t )700 | ( ( uint32_t )30 << 16 ) )
+#define BS2B_MIDDLE_CLEVEL ( ( uint32_t )500 | ( ( uint32_t )45 << 16 ) )
+#define BS2B_LOW_CLEVEL ( ( uint32_t )360 | ( ( uint32_t )60 << 16 ) )
+
+/* Easy crossfeed levels (Obsolete) */
+#define BS2B_HIGH_ECLEVEL ( ( uint32_t )700 | ( ( uint32_t )60 << 16 ) )
+#define BS2B_MIDDLE_ECLEVEL ( ( uint32_t )500 | ( ( uint32_t )72 << 16 ) )
+#define BS2B_LOW_ECLEVEL ( ( uint32_t )360 | ( ( uint32_t )84 << 16 ) )
/* Default crossfeed levels */
-#define BS2B_DEFAULT_CLEVEL BS2B_HIGH_ECLEVEL
+/* bs2b_set_level() */
+#define BS2B_DEFAULT_CLEVEL ( ( uint32_t )700 | ( ( uint32_t )45 << 16 ) )
+#define BS2B_CMOY_CLEVEL ( ( uint32_t )700 | ( ( uint32_t )60 << 16 ) )
+#define BS2B_JMEIER_CLEVEL ( ( uint32_t )650 | ( ( uint32_t )95 << 16 ) )
+
/* Default sample rate (Hz) */
-#define BS2B_DEFAULT_SRATE 44100
+#define BS2B_DEFAULT_SRATE 44100
typedef struct
{
@@ -71,14 +86,31 @@ t_bs2bdp bs2b_open( void );
/* Close */
void bs2b_close( t_bs2bdp bs2bdp );
-/* Sets a new coefficients with new crossfeed level value.
- * level - crossfeed level of *LEVEL values.
+/* Sets a new coefficients by new crossfeed value.
+ * level = ( ( uint32_t )fcut | ( ( uint32_t )feed << 16 ) )
+ * where 'feed' is crossfeeding level at low frequencies (dB * 10)
+ * and 'fcut' is cut frecuency (Hz)
*/
void bs2b_set_level( t_bs2bdp bs2bdp, uint32_t level );
-/* Return current crossfeed level value */
+/* Return a current crossfeed level value. */
uint32_t bs2b_get_level( t_bs2bdp bs2bdp );
+/* Sets a new coefficients by new cut frecuency value (Hz). */
+void bs2b_set_level_fcut( t_bs2bdp bs2bdp, int fcut );
+
+/* Return a current cut frecuency value (Hz). */
+int bs2b_get_level_fcut( t_bs2bdp bs2bdp );
+
+/* Sets a new coefficients by new crossfeeding level value (dB * 10). */
+void bs2b_set_level_feed( t_bs2bdp bs2bdp, int feed );
+
+/* Return a current crossfeeding level value (dB * 10). */
+int bs2b_get_level_feed( t_bs2bdp bs2bdp );
+
+/* Return a current delay value at low frequencies (micro seconds). */
+int bs2b_get_level_delay( t_bs2bdp bs2bdp );
+
/* Clear buffers and sets a new coefficients with new sample rate value.
* srate - sample rate by Hz.
*/
diff --git a/src/bs2bclass.cpp b/src/bs2bclass.cpp
index 05f4cce..02b131b 100644
--- a/src/bs2bclass.cpp
+++ b/src/bs2bclass.cpp
@@ -43,6 +43,31 @@ uint32_t bs2b_base::get_level()
return bs2b_get_level( bs2bdp );
}
+void bs2b_base::set_level_fcut( int fcut )
+{
+ bs2b_set_level_fcut( bs2bdp, fcut );
+}
+
+int bs2b_base::get_level_fcut()
+{
+ return bs2b_get_level_fcut( bs2bdp );
+}
+
+void bs2b_base::set_level_feed( int feed )
+{
+ bs2b_set_level_feed( bs2bdp, feed );
+}
+
+int bs2b_base::get_level_feed()
+{
+ return bs2b_get_level_feed( bs2bdp );
+}
+
+int bs2b_base::get_level_delay()
+{
+ return bs2b_get_level_delay( bs2bdp );
+}
+
void bs2b_base::set_srate( uint32_t srate )
{
bs2b_set_srate( bs2bdp, srate );
diff --git a/src/bs2bclass.h b/src/bs2bclass.h
index 8670c13..835177b 100644
--- a/src/bs2bclass.h
+++ b/src/bs2bclass.h
@@ -37,6 +37,11 @@ public:
void set_level( uint32_t level );
uint32_t get_level();
+ void set_level_fcut( int fcut );
+ int get_level_fcut();
+ void set_level_feed( int feed );
+ int get_level_feed();
+ int get_level_delay();
void set_srate( uint32_t srate );
uint32_t get_srate();
void clear();