繁体   English   中英

如何使用 C# 计算音频增益?

[英]How Do I Calculate Audio Gain using C#?

我有以下低通滤波器 c# 代码,它降低了我的音频功率,使其音量非常低。 我想通过乘以增益来增加它的功率/放大它。 我想知道我应该乘以多少增益来保持过滤后的音频强度。

这是我的代码:

    public MyFilter(ISampleProvider sourceProvider,int cutOffFreq)
    {
        this.sourceProvider = sourceProvider;
        this.cutOffFreq = cutOffFreq;

        channels = sourceProvider.WaveFormat.Channels;
        filters = new BiQuadFilter[channels];
        CreateFilters();
    }

    private void CreateFilters()
    {
        for (int n = 0; n < channels; n++)
            if (filters[n] == null)
                filters[n] = BiQuadFilter.LowPassFilter(44100, cutOffFreq, 1);
            else
                filters[n].SetLowPassFilter(44100, cutOffFreq, 1);
    }

    public WaveFormat WaveFormat { get { return sourceProvider.WaveFormat; } }

    public int Read(float[] buffer, int offset, int count)
    {
        int samplesRead = sourceProvider.Read(buffer, offset, count);

        for (int i = 0; i < samplesRead; i++)
            buffer[offset + i] = filters[(i % channels)].Transform(buffer[offset + i]);

        return samplesRead;
    }

滤波后音量降低多少取决于音频信号和截止频率。 信号中的能量必须在滤波前后计算。 然后损失是已知的,并且可以相应地调整增益。

至少有两种方法可以计算音频信号的能量。 第一个(我认为更简单的方法)是计算所谓的均方根能量(RMSE):

公式为伪代码:

foreach( sample in audioSignal)
{
  sum += sqr( sample )
}
sum /= samples.Count
RMSE = sqrt( sum );

RMSE 与信号的能量非常吻合。 必须针对原始信号和滤波信号进行计算。 然后知道差异并且可以调整增益。

代替使用 RMSE 计算时间点的能量,还可以计算信号每个频率的能量。 为此,使用快速傅里叶变换 (FFT) 计算信号的频谱。
在 FFT 之后,信号中频率的幅度是已知的。 它们对应于每个频率携带的能量。 计算幅度之和以获得音频信号的完整能量。 对带有和不带有滤波的信号执行此操作。 减去结果并按给定值调整增益。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM