【问题标题】:Stream loudness normalization using BASS.NET in c#在 C# 中使用 BASS.NET 进行流响度归一化
【发布时间】:2018-04-12 21:25:57
【问题描述】:

我需要使用 BASS 规范播放音频流。为此,我遵循以下步骤:

  1. 播放流
  2. 从文件中创建另一个流,并在后台工作程序中确定峰值
  3. 将具有适当增益值的DSP_Gain 应用于正在播放的流。

我意识到规范化只会在工作人员完成任务后才会发生,这看起来很丑陋,但这不是重点。

麻烦的是,在确定流的峰值时,得到的值是0到32768之间的整数(值越大声音越大),但是DSP_Gain有两个用于设置放大值的变量,没有其中是整数。第一个是Gain - 0 到 1024 之间的双精度数,第二个是 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();

【问题讨论】:

    标签: c# audio signal-processing bass


    【解决方案1】:

    仅阅读您发布的链接,似乎增益是应用于信号的乘数 - 低于 1.0 的值会降低信号电平,高于 1.0 的值会增加电平。所以你需要计算你想要降低多少水平 - 假设你想要一个最大峰值 30000 并且你计算的峰值是 32000 - 那么你的增益可能是 (30000 / 32000) = 0.9375。

    Gain_dBV 是以分贝表示的增益比 - 通常计算为 10 * log(power out / power in) 或 20 * log(p-p Volts Out / p-p Volts In)。在应用到上述信号之前,dB 会被转换回实际增益 - 在示例中,增益 dB 将为 20 * log(0.9375) = -0.56

    【讨论】:

    • 谢谢。看来我的增益系数计算搞砸了,导致削波。
    猜你喜欢
    • 2023-01-14
    • 2012-05-24
    • 2017-07-04
    • 1970-01-01
    • 1970-01-01
    • 2011-11-17
    • 1970-01-01
    • 2016-07-22
    • 2013-03-08
    相关资源
    最近更新 更多