0

我需要使用 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();
4

1 回答 1

1

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

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

于 2017-10-31T16:38:06.260 回答