bs2b¶
The base of bs2b
filter is
Bauer stereophonic-to-binaural DSP.
bs2b is available on ffmpeg 3.x if --enable-bs2b
, and the official
Windows version build of ffmpeg 3.x contains it,
but for some reason, it doesn’t seem to be included in 4.x of Windows version build.
Since the fact that it can be used by building with --enable-bs2b
does
not change in 4.x, the author’s thinking of the Windows version build
may have changed.
(Bauer stereophonic-to-binaural DSP itself has
own Windows version build, so if really want to try this and you don’t have
ffmpeg 3.x, you can use that.)
BTW, I think the ffmpeg’s documentation tells multiple lies. According to the description of Bauer stereophonic-to-binaural DSP itself and its library’s header file:
700 Hz, 4.5 dB - default.
This setting is closest to the virtual speaker placement with azimuth 30 degrees and the removal of about 3 meters, while listening by headphones.
700 Hz, 6 dB - most popular.
This setting is close to the parameters of a Chu Moy’s [3] crossfeeder.
650 Hz, 9.5 dB - making the smallest changes in the original signal only for relaxing listening by headphones.
This setting is close to the parameters of a crossfeeder implemented in Jan Meier’s CORDA amplifiers.
/* ... */ /* Default crossfeed levels */ /* 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 ) ) /* ... */ /* Sets a new coefficients by new cut frecuency value (Hz). */ void bs2b_set_level_fcut( t_bs2bdp bs2bdp, int fcut ); /* ... */ /* Sets a new coefficients by new crossfeeding level value (dB * 10). */ void bs2b_set_level_feed( t_bs2bdp bs2bdp, int feed );
So, the documentation of ffmpeg should be:
profile
Pre-defined crossfeed level.
default
Default level (fcut=700, feed= 45).
cmoy
Chu Moy circuit (fcut=700, feed=60).
jmeier
Jan Meier circuit (fcut=650, feed=95).
fcut
Cut frequency (in Hz).
feed
Feed level (in 10*dB).
Anyway, the purpose of this filter is to “improve headphone listening of stereo audio records”. For the rationales and implementation methods, see the documentation of Bauer stereophonic-to-binaural DSP. Usage is easy:
[me@host: ~]$ # omit params -> fcut=7000, feed=45
[me@host: ~]$ ffplay snd.wav -af bs2b
[me@host: ~]$ # use profile=cmoy -> fcut=7000, feed=60
[me@host: ~]$ ffplay snd.wav -af bs2b=profile=cmoy
[me@host: ~]$ # use profile=cmoy and set fcut explicitly
[me@host: ~]$ # -> fcut=6000, feed=60
[me@host: ~]$ ffplay snd.wav -af bs2b=profile=cmoy:fcut=6000
However, it is quite difficult to determine the effect of this with your own ears. Probably the most effective if you want to target something like a product disc that is supposed to be played on loudspeakers, but in the case of free audio that is readily available, the effect is not apparent too much (because they do not care about such serious mixing for professional-use).
The way to know “sure, this is doing something” is visualizing, after all:
[me@host: ~]$ # show differences between unmodified and
[me@host: ~]$ # bs2b (pixel-wise diff of two showfreqs)
[me@host: ~]$ ffplay -f lavfi "
> amovie=wolframtones_02.wav
> ,asplit[a1][a2];
> [a1]aformat=channel_layouts=stereo[unmo];
> [a2]bs2b,aformat=channel_layouts=stereo[fapp];
> [unmo]showfreqs=s=960x540:fscale=log,format=yuv420p[v1];
> [fapp]asplit[out1],showfreqs=s=960x540:fscale=log,format=yuv420p[v2];
> [v1][v2]
> lut2='
> abs(x-y):
> 128+(x-y):
> 128+(x-y)'
> [out0]"
- see also
- see also