c# - 在C#中使用BASS.NET进行流响度标准化

标签 c# audio signal-processing bass

我需要使用BASS规范播放音频流。为此,我正在执行以下步骤:

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

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

    问题在于,在确定流的峰值时,结果值为0到32768之间的整数(该值越大,声音越大),但是DSP_Gain具有两个用于设置放大值的变量,没有一个是整数。第一个是Gain-在0到1024之间的 double 数,第二个是Gain_dBV-在-infinity和60之间的 double 数。试图将峰值作为一个因数传递会导致播放流内部出现大量削波。我的问题是,如何将这个峰值转换为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电压输出/ p-p电压输入)来计算。在如上所述将dB应用于信号之前,先将其转换回实际增益-在本例中,增益dB为20 * log(0.9375)= -0.56

    关于c# - 在C#中使用BASS.NET进行流响度标准化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47039990/

    相关文章:

    Android 处理吉他调音器的音频

    python-3.x - 如何在Python中查找信号的相似事件

    c# - 如何防止回到上一页

    c# - 如何获取我的wav文件相对于时间的声音幅度?

    windows - 如何在默认音频设备上设置权限,以便可以以编程方式更改它?

    audio - 删除音频文件的前几段

    c# - BASS.net C# : What does spectogram image represent that outputted by CreateSpectrum3DVoicePrint Method?

    c# - 嵌入语句错误

    c# - SSLStream.AuthenticateAsServer "The client and server cannot communicate, because they do not possess a common algorithm"

    c# - 对 List<String> 进行排序时出现意外行为