【问题标题】:Hanning and Hamming window functions in C#C#中的汉宁和汉明窗函数
【发布时间】:2011-07-14 19:48:47
【问题描述】:

我正在尝试在 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;
}

【问题讨论】:

  • 检查你的循环 - 它简单地跳过数组 'owv[0]' 中的第一个元素。它必须是: for (int i = 0; i

标签: c# algorithm audio


【解决方案1】:

这是我不久前编写的开源 C# 应用程序中的 Hamming window in use 示例。它被用于autotune effect 的音高检测器。

【讨论】:

  • 谢谢。我已经在我的博客中发布了我的结果:blog.tedd.no/2011/07/15/hanning-hamming-window-functions-in-c
  • 您可以使用的一个快速性能改进是预先计算每个 n 值的窗口系数,因为这通常在应用程序的生命周期内不会改变,并调用 Math.Sin/ cos比较慢。
【解决方案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

【讨论】:

    【解决方案3】:

    “加窗”操作是指将一个信号乘以一个窗函数。您找到的这段代码似乎可以生成窗口函数并缩放原始信号。这些方程仅适用于窗口函数本身,而不适用于缩放。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-22
      • 1970-01-01
      • 2011-07-22
      相关资源
      最近更新 更多