2011-07-14 49 views
2

我試圖在C#中實現Hanning and Hamming window functions。我無法在任何地方找到任何.Net樣本,我不確定我是否嘗試從C++樣本轉換成功。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; 
} 
+0

退房的循環 - 它簡單跳過第一個元素的數組 'owv [0]'。它必須是:for(int i = 0; i Vladislav

回答

3

下面是我在後面寫的一個開源C#應用程序中的Hamming window in use的示例。它被用於autotune effect的音高檢測器。

+0

謝謝。我已將我的結果發佈在我的博客中:http://blog.tedd.no/2011/07/15/hanning-hamming-window-functions-in-c/ –

+0

您可以使用的一項快速性能改進是,計算每個n值的窗口係數,因爲這通常在應用程序的生命週期中不會改變,並且對Math.Sin/Cos的調用相對較慢。 –

0

「窗口」的操作是指由窗函數的信號相乘。您找到的此代碼似乎會生成窗口函數並縮放原始信號。這些方程僅用於窗函數本身,而不是縮放。

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