C# C语言中的Hanning和Hamming窗口函数#
我正在尝试用C#实现。我找不到任何.NET样本,我不确定我是否尝试从C++样本转换来完成这项工作。 我的问题主要是,看这些公式,我想他们需要在方程右边的某个地方有原始的数字——我只是看不到这些公式。(我的数学显然还没那么好。) 到目前为止,我所拥有的: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 /
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