diff options
author | boris_mikhaylov <boris_mikhaylov@bc0edfbe-c936-4687-b64d-f70bc3985e72> | 2009-03-31 16:51:10 +0400 |
---|---|---|
committer | boris_mikhaylov <boris_mikhaylov@bc0edfbe-c936-4687-b64d-f70bc3985e72> | 2009-03-31 16:51:10 +0400 |
commit | 59d0a008793c682e93f047dbbc8d44049af3c289 (patch) | |
tree | 16d2f186182ea51ef712e5a75ff5b2281dba4e12 | |
parent | ab88eeaa2ec68ec5ff54f312b0964b76e48e56a2 (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-- | ChangeLog | 3 | ||||
-rw-r--r-- | src/bs2b.c | 134 | ||||
-rw-r--r-- | src/bs2b.h | 66 | ||||
-rw-r--r-- | src/bs2bclass.cpp | 25 | ||||
-rw-r--r-- | src/bs2bclass.h | 5 |
5 files changed, 158 insertions, 75 deletions
@@ -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. @@ -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 ) @@ -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(); |