離散傅利葉變換 快速傅利葉變換C 實現

2021-08-14 22:00:57 字數 3963 閱讀 5989

傅利葉變換是將時域訊號變換為頻域訊號的一種方式,我主要用它來做兩件事情:

1 求一段資料的週期性。

2 通過傅利葉變換及其逆變換,進行低通濾波(去躁)。

首先需要做幾點說明:

1.快速傅利葉變換是離散傅利葉變換的快速演算法,當資料來源較大時(大於1000),快速傅利葉變換有明顯優勢。

2.快速傅利葉變換的訊號源長度必須是2^n(2的n次方),如果不是,則需要在末尾補0。而離散傅利葉變換沒有這個要求。因此當訊號源點數是2^n時,離散傅利葉變換和快速傅利葉變換的計算結果是一致的。如果長度不是2^n時,兩個演算法的結果是不同的,離散傅利葉變換(慢方法)更可信。

3.下面演算法中快速傅利葉變換是根據原理自創的,沒有採用現在常用的位逆序的方法。

4.下面所有方法均經過matlab驗證。

過多的理論的東西不深究,我也不是大學老師,這裡直接給出離散傅利葉變換和快速傅利葉變換的c#**:

public class ffthelp

int stagenum = relog2n(n);

int stage = new int[stagenum];

stage[0] = 0;

for (int i = 1; i < stagenum; i++)

//重排資料

complex register = new complex[n];

for (int i = 0; i < n; i++)

//蝶形運算

complex p = new complex[n];

complex q = new complex[n];

complex w = new complex[n];

int group = n;

for (int i = 0; i < stagenum; i++)

for (int n = subnum / 2; n < subnum; n++)

}for (int k = 0; k < n; k++)

}double dest = new double[n];

for (int k = 0; k < n; k++)

return dest;

}/// /// 離散傅利葉變換

///

///

///

public static double dft(double array)

for (int k = 0; k < n; k++)

dest[k] = sum;

}double dest2 = new double[n];

for (int k = 0; k < n; k++)

return dest2;

}/// /// 離散傅利葉逆變換

///

///

///

public static double idft(double array)

for (int k = 0; k < n; k++)

dest[k] = sum / n;

}double dest2 = new double[n];

for (int k = 0; k < n; k++)

return dest2;

}/// /// 離散傅利葉變換

///

///

///

public static complex dft(complex array)

for (int k = 0; k < n; k++)

dest[k] = sum;

}//double dest2 = new double[n];

//for (int k = 0; k < n; k++)

////return dest2;

return dest;

}/// /// 離散傅利葉逆變換

///

///

///

public static complex idft(complex array)

for (int k = 0; k < n; k++)

dest[k] = sum / n;

}//double dest2 = new double[n];

//for (int k = 0; k < n; k++)

////return dest2;

return dest;

}/// /// 利用傅利葉變換實現的低通濾波(消除高頻訊號)

///

/// 訊號源

/// 截止頻率

///

public static double fftfilter(double array, int n)

complex dest = dft(register);

for (int i = 0; i < dest.length; i++)

complex dest2 = idft(dest);

double result = new double[dest2.length];

for (int i = 0; i < dest2.length; i++)

return result;

}private static double fillarray(double array)

return ret;

}// 獲取擴充套件長度後的冪次

// 由於fft要求長度為2^n,所以用此函式來獲取所需長度

public static int relog2n(int count)

}return log2n;

}// 獲取按位逆序,bitlenght為資料長度

// fft函式內使用

private static int rearrange(int dat, int bitlenght)

return ret;}}

/// /// 表示乙個複數

///

public class complex

public complex(double re)

public complex(double re, double im)

public double modulus()

public override string tostring()

else

retstr += " ";

return retstr;

}//操作符過載

public static complex operator +(complex c1, complex c2)

public static complex operator +(double d, complex c)

public static complex operator -(complex c1, complex c2)

public static complex operator -(double d, complex c)

public static complex operator *(complex c1, complex c2)

public static complex operator *(complex c, double d)

public static complex operator *(double d, complex c)

public static complex operator /(complex c, double d)

public static complex operator /(double d, complex c)

public static complex operator /(complex c1, complex c2)

}

如果想求乙個陣列的週期性,呼叫dft函式後,取變換後資料(去掉第乙個數)的最大值索引,就是陣列的頻率,週期是頻率的倒數。例如,資料來源為陣列a, b=dft(a),頻率=maxindex(b),週期數t=a.length/頻率。

fftfilter函式可直接進行低通濾波。

離散傅利葉變換

傅利葉 原理表明 任何連續測量的時序或 訊號,都可以表示為不同頻率的正弦波 訊號的無限疊加。而根據該 原理創立的傅利葉變換演算法利用直接測量到的原始 訊號,以累加方式來計算該 訊號中不同正弦波 訊號的頻率 振幅和相位。岡薩雷斯版 影象處理 裡面的解釋非常形象 乙個恰當的比喻是將傅利葉變換比作乙個玻璃...

離散傅利葉變換

作用 離散傅利葉變換主要是將連續的訊號轉換為離散的訊號。如在時域上連續的有時在頻域上是離散的。然而我們知道,任何的乙個函式都可以由無數個正弦函式和余弦函式相結合的形式來表示。即 如果將乙個影象進行離散傅利葉變換,就是將影象從空間域轉換到頻域上。其中f是空間域的值,f是頻域的值。轉換後的頻域值是複數。...

離散傅利葉變換

離散時間傅利葉級數 dfs 用ws進行週期延拓 連續復指數和離散復指數的區別和聯絡 當k 1時,乙個週期t後,即 n 0 127 取完後之後只旋轉了一圈。當k 2時,乙個週期t後,即 n 0 127 取完後之後只旋轉了兩圈。當k 3時,乙個週期t後,即 n 0 127 取完後之後只旋轉了三圈。dfs...