using System;
namespace ConsoleApp34
{
class Program
{
static void Main(string[] args)
{
//初始化時域資料
Complex[] WT = new Complex[8];
Complex[] IWT = new Complex[8];
Complex[] TD2FD = new Complex[8];
for (int i = 0; i < TD2FD.Length; i++)
{
Complex cpx = new Complex();
cpx.re = i;
cpx.im = 1;
TD2FD[i] = cpx;
//FFT 旋轉因子查詢表
Complex cpx_wt = new Complex();
float angle = (float)(i * Math.PI * 2 / TD2FD.Length);
cpx_wt.re = (float)Math.Cos(angle);
cpx_wt.im = -(float)Math.Sin(angle);
WT[i] = cpx_wt;
//IFFT 旋轉因子查詢表
Complex cpx_iwt = new Complex();
angle = (float)(i * Math.PI * 2 / TD2FD.Length);
cpx_iwt.re = (float)Math.Cos(angle);
cpx_iwt.im = (float)Math.Sin(angle);
IWT[i] = cpx_iwt;
}
Console.WriteLine("------原始信號-----");
Print(TD2FD);
Console.WriteLine("----- FFI -----");
FFT(TD2FD, WT);
Print(TD2FD);
IFFT(TD2FD, IWT);
Print(TD2FD);
Console.Read();
}
public static void FFT(Complex[] TD2FD, Complex[] WT)
{
int power = (int)Math.Log(TD2FD.Length, 2);
int butterfly;
int p, s;
Complex x1, x2, wt;
for (int k = 0; k < power; k++) //級數
{
Console.WriteLine("第{0}級, 共{1}組", k, 1 << k);
for (int j = 0; j < 1 << k; j++) //組數
{
butterfly = 1 << (power - k);//每組有幾個元素
//計算參與蝶形運算的兩個元素的索引
p = j * butterfly;
s = p + butterfly / 2;
Console.WriteLine("butterfly={0}, p={1}, s={2}", butterfly, p, s);
for (int i = 0; i < butterfly / 2; i++) //蝶形運算次數
{
Console.Write(" ({0}x{1} wtIdx={2})", i + p, i + s, i * (1 << k));
x1 = TD2FD[i + p];
x2 = TD2FD[i + s];
wt = WT[i * (1 << k)];
TD2FD[i + p] = x1 + x2 * wt;
TD2FD[i + s] = x1 - x2 * wt;
}
Console.WriteLine();
}
}
//重新排序
for (int i = 0; i < TD2FD.Length; i++)
{
int r = BitReverse(i);
if (r > i)
{
Complex t = TD2FD[r];
TD2FD[r] = TD2FD[i];
TD2FD[i] = t;
}
}
}
// 列印
private static void Print(Complex[] TD2FD)
{
for (int i = 0; i < TD2FD.Length; i++)
{
Console.WriteLine("(re={0}, im={1})", TD2FD[i].re, TD2FD[i].im);
}
Console.WriteLine();
}
public static void IFFT(Complex[] FD2TD, Complex[] WT)
{
Console.WriteLine("---- IFFT ----");
//做FFT變換
FFT(FD2TD, WT);
//實部除以N
for (int i = 0; i < FD2TD.Length; i++)
FD2TD[i].re /= FD2TD.Length;
}
static int BitReverse(int x)
{
//0 1 2 3 4 5 6 7 十進制
//000 001 010 011 100 101 110 111 十進制對應的二進制
//000 100 010 110 001 101 011 111 碼位反轉
//0 4 2 6 1 5 3 7 碼位反轉后對應的十進制
int[] table = new int[8] { 0, 4, 2, 6, 1, 5, 3, 7 };
return table[x];
}
}
//定義復數
public class Complex
{
public float re;//實數部
public float im;//虛數部
public static Complex operator +(Complex lhs, Complex rhs)
{
Complex result = new Complex();
result.re = lhs.re + rhs.re;
result.im = lhs.im + rhs.im;
return result;
}
public static Complex operator -(Complex lhs, Complex rhs)
{
Complex result = new Complex();
result.re = lhs.re - rhs.re;
result.im = lhs.im - rhs.im;
return result;
}
public static Complex operator *(Complex lhs, Complex rhs)
{
Complex result = new Complex();
result.re = lhs.re * rhs.re;
result.im = lhs.im * rhs.im;
return result;
}
public static Complex operator *(float lhs, Complex rhs)
{
Complex result = new Complex();
result.re = lhs * rhs.re;
result.im = lhs * rhs.im;
return result;
}
public static Complex operator *(Complex lhs, float rhs)
{
Complex result = new Complex();
result.re = lhs.re * rhs;
result.im = lhs.im * rhs;
return result;
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/268177.html
標籤:C#
上一篇:WCF啟動報錯:“行程不具有此命名空間的訪問權限”,用管理員身份也不能解決
下一篇:404攔截跳轉
