在 C# 中使用 BASS.NET 流响度归一化
Stream loudness normalization using BASS.NET in c#
我需要使用 BASS 规范化正在播放的音频流。为此,我将执行以下步骤:
- 播放流
- 从文件创建另一个流,并在后台工作程序中确定峰值
- 将具有适当增益值的 DSP_Gain 应用于正在播放的流。
我意识到标准化只会在工作人员完成任务后发生,这看起来很难看,但这不是重点。
麻烦的是,在确定流的峰值时,结果值为0到32768之间的整数(值越大声音越大),但是DSP_Gain有两个变量用于设置放大值,none为整数。第一个是 Gain - a double between 0 and 1024, and the second is Gain_dBV - 介于 -infinity 和 60 之间的双倍数。尝试将峰值作为一个因素传递会导致播放流中出现大量削波。我的问题是,如何将此峰值转换为 DSP_Gain 的正确参数?下面是获取峰值的代码:
int strm = Bass.BASS_StreamCreateFile(filename, 0, 0, BASSFlag.BASS_STREAM_DECODE);
//initialized stream for getting peak value
int peak=0; //This value will be between 0 and 32768
while (System.Convert.ToBoolean(Bass.BASS_ChannelIsActive(strm)))
{
//calculates peak from a 20ms frame and advances, loops till stream over
int level = Bass.BASS_ChannelGetLevel(strm);
int left = Utils.LowWord32(level); // the left level
int right = Utils.HighWord32(level); // the right level
if (peak < left) peak = left;
if (peak < right) peak = right;
}
应用DSP_Gain:
DSPGain = new DSP_Gain();
DSPGain.ChannelHandle = stream; //this stream is the already playing one
DSPGain.Gain = *SOME VALUE*
DSPGain.Start();
仅阅读您发布的链接,增益似乎是应用于信号的乘数 - 低于 1.0 的值会降低信号电平,高于 1.0 的值会增加信号电平。因此,您需要计算要将电平降低多少 - 假设您希望最大峰值为 30000 并且计算出的峰值为 32000 - 那么您的增益可能是 (30000 / 32000) = 0.9375.
Gain_dBV 是以分贝表示的增益比 - 这通常计算为 10 * log(电源输出/电源输入)或 20 * log(p-p Volts Out / p-p Volts In)。在如上所述应用于信号之前,dB 被转换回实际增益 - 在示例中,增益 dB 为 20 * log(0.9375) = -0.56
我需要使用 BASS 规范化正在播放的音频流。为此,我将执行以下步骤:
- 播放流
- 从文件创建另一个流,并在后台工作程序中确定峰值
- 将具有适当增益值的 DSP_Gain 应用于正在播放的流。
我意识到标准化只会在工作人员完成任务后发生,这看起来很难看,但这不是重点。
麻烦的是,在确定流的峰值时,结果值为0到32768之间的整数(值越大声音越大),但是DSP_Gain有两个变量用于设置放大值,none为整数。第一个是 Gain - a double between 0 and 1024, and the second is Gain_dBV - 介于 -infinity 和 60 之间的双倍数。尝试将峰值作为一个因素传递会导致播放流中出现大量削波。我的问题是,如何将此峰值转换为 DSP_Gain 的正确参数?下面是获取峰值的代码:
int strm = Bass.BASS_StreamCreateFile(filename, 0, 0, BASSFlag.BASS_STREAM_DECODE);
//initialized stream for getting peak value
int peak=0; //This value will be between 0 and 32768
while (System.Convert.ToBoolean(Bass.BASS_ChannelIsActive(strm)))
{
//calculates peak from a 20ms frame and advances, loops till stream over
int level = Bass.BASS_ChannelGetLevel(strm);
int left = Utils.LowWord32(level); // the left level
int right = Utils.HighWord32(level); // the right level
if (peak < left) peak = left;
if (peak < right) peak = right;
}
应用DSP_Gain:
DSPGain = new DSP_Gain();
DSPGain.ChannelHandle = stream; //this stream is the already playing one
DSPGain.Gain = *SOME VALUE*
DSPGain.Start();
仅阅读您发布的链接,增益似乎是应用于信号的乘数 - 低于 1.0 的值会降低信号电平,高于 1.0 的值会增加信号电平。因此,您需要计算要将电平降低多少 - 假设您希望最大峰值为 30000 并且计算出的峰值为 32000 - 那么您的增益可能是 (30000 / 32000) = 0.9375.
Gain_dBV 是以分贝表示的增益比 - 这通常计算为 10 * log(电源输出/电源输入)或 20 * log(p-p Volts Out / p-p Volts In)。在如上所述应用于信号之前,dB 被转换回实际增益 - 在示例中,增益 dB 为 20 * log(0.9375) = -0.56