C# C语言中的Hanning和Hamming窗口函数#

C# C语言中的Hanning和Hamming窗口函数#,c#,algorithm,audio,C#,Algorithm,Audio,我正在尝试用C#实现。我找不到任何.NET样本,我不确定我是否尝试从C++样本转换来完成这项工作。 我的问题主要是,看这些公式,我想他们需要在方程右边的某个地方有原始的数字——我只是看不到这些公式。(我的数学显然还没那么好。) 到目前为止,我所拥有的: public Complex[] Hamming(Complex[] iwv) { Complex[] owv = new Complex[iwv.Length]; double omega = 2.0 * Math.PI /

我正在尝试用C#实现。我找不到任何.NET样本,我不确定我是否尝试从C++样本转换来完成这项工作。

我的问题主要是,看这些公式,我想他们需要在方程右边的某个地方有原始的数字——我只是看不到这些公式。(我的数学显然还没那么好。)

到目前为止,我所拥有的:


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;
}

公共综合体[]哈明(综合体[]iwv)
{
复合体[]owv=新复合体[iwv.Length];
双ω=2.0*Math.PI/(iwv.长度);
//owv[i].Re=实数(原始波数据)
//owv[i].Im=虚数(0,因为它还没有经过FFT)
对于(int i=1;i
窗口操作意味着将信号乘以窗口功能。您找到的此代码似乎用于生成窗口功能并缩放原始信号。这些公式只针对窗口函数本身,而不是缩放。

这是我不久前编写的开源C#应用程序中的一个示例。它正被用于一个音高检测器中。

您可以使用Math.NET库

    double[] hannDoubles = MathNet.Numerics.Window.Hamming(dataIn.Length);
    for (int i = 0; i < dataIn.Length; i++)
    {
        dataOut[i] = hannDoubles[i] * dataIn[i];
    }
double[]hannDoubles=MathNet.Numerics.Window.Hamming(dataIn.Length);
for(int i=0;i
请参见我对类似问题的回答:

谢谢。我已经在我的博客上发布了我的结果:一个可以快速提高性能的方法是预先计算每一个n值的窗口系数,因为这通常在应用程序的生命周期内不会改变,并且调用Math.Sin/Cos的速度相对较慢。查看您的循环-它简单地跳过数组“owv[0]”中的第一个元素。它必须是:for(int i=0;i