Hanning和Hamming窗口函数在C#中

时间:2011-07-14 19:48:47

标签: c# algorithm audio

我正在尝试在C#中实现Hanning and Hamming window functions。我无法在任何地方找到任何.Net样本,我不确定我从C ++样本转换的尝试是否能很好地完成工作。

我的问题主要在于看formulas我想他们需要在等式右边的某个地方有原始数字 - 我只是不看它的公式。 (我的数学显然不是那么好。)

到目前为止我所拥有的:


public Complex[] Hamming(Complex[] iwv)
{
    Complex[] owv = new Complex[iwv.Length];
    double omega = 2.0 * Math.PI / (iwv.Length);

    // owv[i].Re = real number (raw wave data)
    // owv[i].Im = imaginary number (0 since it hasn't gone through FFT yet)
    for (int i = 1; i < owv.Length; i++)
        // Translated from c++ sample I found somewhere
        owv[i].Re = (0.54 - 0.46 * Math.Cos(omega * (i))) * iwv[i].Re; 

    return owv;

}

public Complex[] Hanning(Complex[] iwv)
{
    Complex[] owv = new Complex[iwv.Length];
    double omega = 2.0 * Math.PI / (iwv.Length);

    for (int i = 1; i < owv.Length; i++)
        owv[i].Re = (0.5  + (1 - Math.Cos((2d * Math.PI ) / (i -1)))); // Uhm... wrong

    return owv;
}

3 个答案:

答案 0 :(得分:3)

这是我在一段时间后写的开源C#应用程序中Hamming window in use的示例。它被用于autotune effect的音高检测器。

答案 1 :(得分:2)

您可以使用Math.NET库。

    double[] hannDoubles = MathNet.Numerics.Window.Hamming(dataIn.Length);
    for (int i = 0; i < dataIn.Length; i++)
    {
        dataOut[i] = hannDoubles[i] * dataIn[i];
    }

请参阅我对类似问题的回答: https://stackoverflow.com/a/42939606/246758

答案 2 :(得分:0)

“加窗”的操作意味着将信号乘以窗函数。您找到的此代码似乎生成窗口函数并缩放原始信号。方程式仅用于窗口函数本身,而不是缩放。